From 282a1885e7bdfbb1a1f25fb05401dfbdeeaed08b Mon Sep 17 00:00:00 2001 From: Giovanni Maruzzelli Date: Mon, 2 Apr 2012 11:07:47 +0200 Subject: [PATCH] gsmopen: adding libctb-0.16 --- .../mod_gsmopen/libctb-0.16/build/COPYRIGHT | 18 + .../mod_gsmopen/libctb-0.16/build/GNUmakefile | 293 + .../mod_gsmopen/libctb-0.16/build/README | 169 + .../mod_gsmopen/libctb-0.16/build/libctb.bkl | 281 + .../libctb-0.16/build/makefile.bcc | 269 + .../libctb-0.16/build/makefile.gcc | 238 + .../mod_gsmopen/libctb-0.16/build/makefile.vc | 260 + .../libctb-0.16/build/makefile.wat | 283 + .../libctb-0.16/include/ctb-0.16/ctb.h | 139 + .../libctb-0.16/include/ctb-0.16/fifo.h | 96 + .../libctb-0.16/include/ctb-0.16/getopt.h | 19 + .../libctb-0.16/include/ctb-0.16/gpib.h | 378 + .../libctb-0.16/include/ctb-0.16/iobase.h | 294 + .../libctb-0.16/include/ctb-0.16/kbhit.h | 10 + .../include/ctb-0.16/linux/serport.h | 94 + .../include/ctb-0.16/linux/timer.h | 139 + .../libctb-0.16/include/ctb-0.16/portscan.h | 25 + .../libctb-0.16/include/ctb-0.16/serport.h | 20 + .../libctb-0.16/include/ctb-0.16/serportx.h | 451 ++ .../libctb-0.16/include/ctb-0.16/timer.h | 19 + .../include/ctb-0.16/win32/getopt.h | 17 + .../include/ctb-0.16/win32/gpib-32.h | 414 ++ .../include/ctb-0.16/win32/serport.h | 74 + .../include/ctb-0.16/win32/timer.h | 140 + .../mod_gsmopen/libctb-0.16/manual/refman.pdf | Bin 0 -> 727923 bytes .../libctb-0.16/python/module/linux/ctb.py | 455 ++ .../libctb-0.16/python/module/linux/wxctb.py | 264 + .../libctb-0.16/python/samples/parity.py | 70 + .../libctb-0.16/python/samples/protocol.py | 88 + .../libctb-0.16/python/samples/rtsdtr.py | 53 + .../libctb-0.16/python/src/ctb.html | 353 + .../mod_gsmopen/libctb-0.16/python/src/ctb.py | 455 ++ .../mod_gsmopen/libctb-0.16/python/src/gpib.i | 96 + .../libctb-0.16/python/src/iobase.i | 59 + .../libctb-0.16/python/src/kbhit.i | 9 + .../libctb-0.16/python/src/linux/makepy.sh | 63 + .../libctb-0.16/python/src/linux/serport.i | 50 + .../libctb-0.16/python/src/linux/timer.i | 37 + .../libctb-0.16/python/src/linux/wxctb.i | 6 + .../libctb-0.16/python/src/linux/wxctb.py | 264 + .../python/src/linux/wxctb_wrap.cxx | 6469 +++++++++++++++++ .../libctb-0.16/python/src/serportx.i | 84 + .../libctb-0.16/python/src/win32/makepy.bat | 65 + .../libctb-0.16/python/src/win32/serport.i | 57 + .../libctb-0.16/python/src/win32/timer.i | 39 + .../libctb-0.16/python/src/win32/wxctb.i | 6 + .../libctb-0.16/samples/ctbtest.cpp | 181 + .../mod_gsmopen/libctb-0.16/src/fifo.cpp | 130 + .../mod_gsmopen/libctb-0.16/src/getopt.cpp | 14 + .../mod_gsmopen/libctb-0.16/src/gpib.cpp | 338 + .../mod_gsmopen/libctb-0.16/src/iobase.cpp | 211 + .../mod_gsmopen/libctb-0.16/src/kbhit.cpp | 37 + .../libctb-0.16/src/linux/serport.cpp | 443 ++ .../libctb-0.16/src/linux/timer.cpp | 97 + .../mod_gsmopen/libctb-0.16/src/portscan.cpp | 109 + .../mod_gsmopen/libctb-0.16/src/serportx.cpp | 104 + .../libctb-0.16/src/win32/getopt.cpp | 66 + .../libctb-0.16/src/win32/serport.cpp | 452 ++ .../libctb-0.16/src/win32/timer.cpp | 85 + 59 files changed, 15449 insertions(+) create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/build/COPYRIGHT create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/build/GNUmakefile create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/build/README create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/build/libctb.bkl create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.bcc create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.gcc create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.vc create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.wat create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/ctb.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/fifo.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/getopt.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/gpib.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/iobase.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/kbhit.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/linux/serport.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/linux/timer.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/portscan.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/serport.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/serportx.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/timer.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/getopt.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/gpib-32.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/serport.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/timer.h create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/manual/refman.pdf create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/module/linux/ctb.py create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/module/linux/wxctb.py create mode 100755 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/samples/parity.py create mode 100755 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/samples/protocol.py create mode 100755 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/samples/rtsdtr.py create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/ctb.html create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/ctb.py create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/gpib.i create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/iobase.i create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/kbhit.i create mode 100755 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/makepy.sh create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/serport.i create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/timer.i create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/wxctb.i create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/wxctb.py create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/wxctb_wrap.cxx create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/serportx.i create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/makepy.bat create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/serport.i create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/timer.i create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/wxctb.i create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/samples/ctbtest.cpp create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/src/fifo.cpp create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/src/getopt.cpp create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/src/gpib.cpp create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/src/iobase.cpp create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/src/kbhit.cpp create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/src/linux/serport.cpp create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/src/linux/timer.cpp create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/src/portscan.cpp create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/src/serportx.cpp create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/src/win32/getopt.cpp create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/src/win32/serport.cpp create mode 100644 src/mod/endpoints/mod_gsmopen/libctb-0.16/src/win32/timer.cpp diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/COPYRIGHT b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/COPYRIGHT new file mode 100644 index 0000000000..9d0d9da185 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/COPYRIGHT @@ -0,0 +1,18 @@ +Copyright + +Copyright (C) 1999-2010 Joachim Buermann (jbuermann@iftools.com) + +ctb is free software; you can redistribute it and/or modify it under +the term of the GNU Library General Public Licence as published by the +Free Software Foundation. + +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 Licence for more details + + +EXCEPTION NOTICE +As a special exception, you may use, copy, link, modify and distribute +under the user's own terms, binary object code versions of works based +on the library. diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/GNUmakefile b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/GNUmakefile new file mode 100644 index 0000000000..e39a687d4c --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/GNUmakefile @@ -0,0 +1,293 @@ +# ========================================================================= +# This makefile was generated by +# Bakefile 0.2.5 (http://www.bakefile.org) +# Do not modify, all changes will be overwritten! +# ========================================================================= + + + +# ------------------------------------------------------------------------- +# These are configurable options: +# ------------------------------------------------------------------------- + +# 'install' program location +INSTALL ?= install + +# Location where the package is installed by 'make install' +prefix ?= /usr/local + +# Destination root (/ is used if empty) +DESTDIR ?= + +# +AR ?= ar + +# +RANLIB ?= ranlib + +# Compiler flags to link shared library +LINK_DLL_FLAGS ?= -shared + +# C++ compiler +CXX = g++ + +# Standard flags for C++ +CXXFLAGS ?= + +# Standard preprocessor flags (common for CC and CXX) +CPPFLAGS ?= + +# Standard linker flags +LDFLAGS ?= + +# Set to 1 to build debug version [0,1] +DEBUG ?= 0 + +# +GPIB ?= 0 + + + +# ------------------------------------------------------------------------- +# Do not modify the rest of this file! +# ------------------------------------------------------------------------- + +### Variables: ### + +CPPDEPS = -MT$@ -MF`echo $@ | sed -e 's,\.o$$,.d,'` -MD -MP +CTB_LIB_CXXFLAGS = $(____DEBUG) $(____DEBUG_1) -D_THREAD_SAFE -pthread \ + $(__OPTIMIZE_FLAG) -I../include $(CPPFLAGS) $(CXXFLAGS) +CTB_LIB_OBJECTS = \ + $(OUTPUT)/ctb_lib_fifo.o \ + $(OUTPUT)/ctb_lib_getopt.o \ + $(OUTPUT)/ctb_lib_iobase.o \ + $(OUTPUT)/ctb_lib_portscan.o \ + $(OUTPUT)/ctb_lib_serportx.o \ + $(OUTPUT)/ctb_lib_serport.o \ + $(OUTPUT)/ctb_lib_timer.o \ + $(__GPIBSRC_OBJECTS) +CTB_DLL_CXXFLAGS = $(____DEBUG) $(____DEBUG_1) -D_THREAD_SAFE -pthread \ + $(__OPTIMIZE_FLAG) -I../include -fPIC -DPIC $(CPPFLAGS) $(CXXFLAGS) +CTB_DLL_OBJECTS = \ + $(OUTPUT)/ctb_dll_fifo.o \ + $(OUTPUT)/ctb_dll_getopt.o \ + $(OUTPUT)/ctb_dll_iobase.o \ + $(OUTPUT)/ctb_dll_portscan.o \ + $(OUTPUT)/ctb_dll_serportx.o \ + $(OUTPUT)/ctb_dll_serport.o \ + $(OUTPUT)/ctb_dll_timer.o \ + $(__GPIBSRC_OBJECTS_1) +CTBTEST_CXXFLAGS = $(____DEBUG) $(____DEBUG_1) -DGPIB=$(GPIB) -D_THREAD_SAFE \ + -pthread $(__OPTIMIZE_FLAG) -I../include $(CPPFLAGS) $(CXXFLAGS) +CTBTEST_OBJECTS = \ + $(OUTPUT)/ctbtest_ctbtest.o + +### Conditionally set variables: ### + +ifeq ($(DEBUG),0) +OUTPUT = release +endif +ifeq ($(DEBUG),1) +OUTPUT = debug +endif +ifeq ($(DEBUG),1) +LIBFLAG = d +endif +ifeq ($(GPIB),1) +GPIBFLAG = _gpib +endif +ifeq ($(GPIB),1) +GPIBINC = gpib.h +endif +ifeq ($(GPIB),1) +__GPIBSRC_OBJECTS = \ + $(OUTPUT)/ctb_lib_gpib.o +endif +ifeq ($(GPIB),1) +__GPIBSRC_OBJECTS_1 = \ + $(OUTPUT)/ctb_dll_gpib.o +endif +ifeq ($(DEBUG),0) +____DEBUG = -DNDEBUG +endif +ifeq ($(DEBUG),1) +____DEBUG = +endif +ifeq ($(DEBUG),0) +__OPTIMIZE_FLAG = -O0 +endif +ifeq ($(DEBUG),1) +__OPTIMIZE_FLAG = -O2 +endif +ifeq ($(GPIB),1) +__SYSLIB2_p = -lgpib +endif +ifeq ($(DEBUG),0) +____DEBUG_1 = +endif +ifeq ($(DEBUG),1) +____DEBUG_1 = -g +endif + + +all: $(OUTPUT) +$(OUTPUT): + @mkdir -p $(OUTPUT) + +### Targets: ### + +all: ../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a ../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.so $(OUTPUT)/ctbtest tip-linux + +install: install_ctb_lib install_ctb_dll + $(INSTALL) -d $(DESTDIR)$(prefix)/include/ctb-0.16 + for f in ctb.h fifo.h getopt.h $(GPIBINC) iobase.h linux/serport.h linux/timer.h portscan.h serport.h serportx.h timer.h; do \ + if test ! -d $(DESTDIR)$(prefix)/include/ctb-0.16/`dirname $$f` ; then \ + $(INSTALL) -d $(DESTDIR)$(prefix)/include/ctb-0.16/`dirname $$f`; \ + fi; \ + $(INSTALL) -m 644 ../include/ctb-0.16/$$f $(DESTDIR)$(prefix)/include/ctb-0.16/$$f; \ + done + +uninstall: uninstall_ctb_lib uninstall_ctb_dll + for f in ctb.h fifo.h getopt.h $(GPIBINC) iobase.h linux/serport.h linux/timer.h portscan.h serport.h serportx.h timer.h; do \ + rm -f $(DESTDIR)$(prefix)/include/ctb-0.16/$$f; \ + done + +clean: + rm -f $(OUTPUT)/*.o + rm -f $(OUTPUT)/*.d + rm -f ../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a + rm -f ../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.so + rm -f ../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.so + rm -f $(OUTPUT)/ctbtest + +htmldoc: + (cd ..; tar -cvzf manual/libctb-0.16-htmldoc.tar.gz docs/html/ ) + +tarball: + (cd ../..; tar -cvzf libctb-0.16.tar.gz \ + libctb-0.16/build/ \ + libctb-0.16/manual/refman.pdf \ + libctb-0.16/include \ + libctb-0.16/python \ + libctb-0.16/samples \ + libctb-0.16/src \ + libctb-0.16/lib/gpib32.lib \ + --exclude=release \ + --exclude=debug \ + --exclude=install \ + --exclude=output \ + --exclude=website \ + --exclude=*~ \ + --exclude=buildall.sh \ + --exclude=buildall.bat \ + --exclude=version-update.sh \ + --exclude=libctb-0.16.tar.gz \ + --exclude=*.ilk \ + --exclude=*.log \ + --exclude=*.o* \ + --exclude=*.pdb \ + --exclude=*.pyc \ + --exclude=.svn; mv libctb-0.16.tar.gz libctb-0.16/build ) + +../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a: $(CTB_LIB_OBJECTS) + rm -f $@ + $(AR) rcu $@ $(CTB_LIB_OBJECTS) + $(RANLIB) $@ + +install_ctb_lib: ../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a + $(INSTALL) -d $(DESTDIR)$(prefix)/lib + $(INSTALL) -m 644 ../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a $(DESTDIR)$(prefix)/lib + +uninstall_ctb_lib: + rm -f $(DESTDIR)$(prefix)/lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a + +../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.so: $(CTB_DLL_OBJECTS) + $(CXX) $(LINK_DLL_FLAGS) -fPIC -o $@ $(CTB_DLL_OBJECTS) $(____DEBUG_1) -pthread -L../lib $(LDFLAGS) -lpthread $(__SYSLIB2_p) + +install_ctb_dll: ../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.so + $(INSTALL) -d $(DESTDIR)$(prefix)/lib + $(INSTALL) -m 644 ../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.so $(DESTDIR)$(prefix)/lib + install -c ../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.so $(DESTDIR)$(prefix)/lib + +uninstall_ctb_dll: + rm -f $(DESTDIR)$(prefix)/lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.so + rm -f $(DESTDIR)$(prefix)/lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.so + +$(OUTPUT)/ctbtest: $(CTBTEST_OBJECTS) ../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a + $(CXX) -o $@ $(CTBTEST_OBJECTS) $(____DEBUG_1) -pthread -L../lib $(LDFLAGS) ../lib/libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a -lpthread $(__SYSLIB2_p) + +tip-linux: + @echo " " + @echo "================================================================" + @echo " The building of ctb is finished. On Linux you'll now" + @echo " have to run (as root):" + @echo " " + @echo " make DEBUG=$(DEBUG) GPIB=$(GPIB) install" + @echo " " + @echo " to install the libraries in $(prefix)/lib" + @echo " and the header files in $(prefix)/include/ctb-0.16" + @echo " " + @echo " Don't forget to run ldconfig (also as root)" + @echo " " + @echo " ctb comes with no guarantees and doesn't claim" + @echo " to be suitable for any purpose." + @echo "================================================================" + @echo " " + +$(OUTPUT)/ctb_lib_fifo.o: ./../src/fifo.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_lib_getopt.o: ./../src/getopt.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_lib_iobase.o: ./../src/iobase.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_lib_portscan.o: ./../src/portscan.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_lib_serportx.o: ./../src/serportx.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_lib_serport.o: ./../src/linux/serport.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_lib_timer.o: ./../src/linux/timer.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_lib_gpib.o: ./../src/gpib.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_dll_fifo.o: ./../src/fifo.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_dll_getopt.o: ./../src/getopt.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_dll_iobase.o: ./../src/iobase.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_dll_portscan.o: ./../src/portscan.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_dll_serportx.o: ./../src/serportx.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_dll_serport.o: ./../src/linux/serport.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_dll_timer.o: ./../src/linux/timer.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctb_dll_gpib.o: ./../src/gpib.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)/ctbtest_ctbtest.o: ./../samples/ctbtest.cpp + $(CXX) -c -o $@ $(CTBTEST_CXXFLAGS) $(CPPDEPS) $< + +.PHONY: all install uninstall clean install_ctb_lib uninstall_ctb_lib \ + install_ctb_dll uninstall_ctb_dll + + +# Dependencies tracking: +-include $(OUTPUT)/*.d diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/README b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/README new file mode 100644 index 0000000000..fdcdb1d37b --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/README @@ -0,0 +1,169 @@ + +CTB (Communication toolbox library) 08.02.2010 +====================================================================== + +Website: http://www.iftools.com/opensource/ctb.en.php +Version: 0.16 + + +Linux GCC compiliation +---------------------------------------------------------------- + +Type 'make DEBUG=x GPIB=x' or 'make -f GNUmakefile DEBUG=x GPIB=x' + +Type the same command with an additional install as root to copy the +headers and libs to there according system places +(i.e. /usr/local/include/ctb-0.16 and /usr/local/lib/libctb-0.16.a) +like: + +sudo make DEBUG=x GPIB=x install + + +Microsoft MingW32 compilation +---------------------------------------------------------------- + +Type mingw32-make -f makefile.gcc DEBUG=x GPIB=x + +Please note! Currently only a shared ctb library will be created. +You have to copy the ctb-VERSION.dll in the application path of +your application linked with ctb or in a global dll folder (but +not recommented!) + + +Microsoft Visual C++ compilation +---------------------------------------------------------------- + +Type 'nmake -f makefile.vc DEBUG=x GPIB=x' + +To create all libs (debug/release with and without gpib support) +just input: ./buildall.bat in the build folder. + + +Borland C++ 5.0/5.5 compilation +---------------------------------------------------------------- + +Type 'make -f makefile.bcc DEBUG=x GPIB=x' + + +Watcom C++ 10.6/11 and OpenWatcom compilation +---------------------------------------------------------------- + +Type 'wmake -f makefile.wat' + + +Python support +-------------- + +Since version 0.9 ctb also includes a python module ctb.py. +To build the python module by yourself, your system has to satisfy +the following requirements: + +- the SWIG program, you get it at http://www.swig.org/ (for linux, + take a look in your favorite distribution package manager). + The current ctb module was build with SWIG version 1.3.29 (linux) + and version 1.3.40 (Windows) +- the develop files for python (means the header and the library + files). I tested it with Python 2.4. You will get it at: + http://www.python.org/ftp/python/2.4.4/python-2.4.4.msi +- if you want to communicate via GPIB, a GPIB installation (GPIB + controller and software, for instance a Nation Instruments or + Keithley card). On Linux the libgpib. + +Like the building of the wxctb C++ library, you also can choose +between GPIB and non GPIB (default) support. + +Compile the python module + +Linux +cd in the python/src/linux folder and type: +./makepy.sh USE_GPIB +or +./makepy.sh +if you don't need any GPIB support + +Windows +cd in the python/src/windows folder. Open the makepy.bat with your +favorite editor and set the commented enviroment variables. See the +makepy.bat file for more information, how you can do that. +After that, just type: + +./makepy.sh USE_GPIB +(for GPIB support) or +./makepy.sh +if you don't need any GPIB support + +At last set the python modul path to the ctb-0.15/python/module +path. +On linux: + +export PYTHONPATH=somepath/ctb-0.15/python/module/linux + +On Windows: + +set PYTHONPATH=drive:\somepath\ctb-0.15\python\module\win32 + + +ChangeLog +--------- + +0.16 + - added port scan function. + - bug fixes for MingW build. + +0.15 + - added ctb namespace and removed all wx prefix (also in the header + path). + - Linux: A serial port cannot opened twice or more any longer. + - 9 bit data transmission support using the parity bit as ninth bit. + - improved documentation + - Some more documentation + +0.14 + - Support for non-standard baudrates (depends on the used UART + or USB to RS232 converter. + +0.13 + - remove the expect and match mechanism. They didn't work very + well, and a future implementation should be done as a + independent library. If someone missed this functions, please + let me know. + +0.12 + - more documentation for doxygen + - replace the ugly GetSettingsAsString methods by a more intuitive + one. + - wxGPIB::Read now checks the MAV bit before reading. This resolves + some stderr stuff on linux. + +0.11 + - the gpib sources are no longer depending on the OS. They are + identical for linux and windows. + - add the current version to the ctb include path, so you can + handle a parallel installation of different versions. + For instance: The header path wx/ctb is replaced by wx/ctb-0.11 + +0.10 + - replace the former gpib async io access with the standard + NI-488 functions (ibrd,ibwrt). To avoid blocking, the internal + gpib timeout was set to the lowest value, whereas the wxIOBase + methods handles the timeout in a global and transparent manner. + - add a FindListener method in the wxGPIB class to look for all + connected gpib devices (listeners). + - The Read and Readv method of the python wxIOBase class returns + additional zero bytes, fixed. + +0.9 + - added python support for both, serial and gpib + +0.8 + - added bakefile support + +0.7 + - added GPIB (Nation Instruments GPIB cards) support + + +Authors' info +------------- + +Joachim Buermann jbuermann@iftools.com + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/libctb.bkl b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/libctb.bkl new file mode 100644 index 0000000000..eb5670bd4a --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/libctb.bkl @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + 0.16 + libctb + + + + % + + + + + + + + + + debug + release + + $(OUTPUT) + + + ..$(DIRSEP)lib + + + + + d + + + + pthread + winmm + + + + gpib + gpib32 + + + + linux + win32 + + + + _gpib + + + + + ../src/gpib.cpp + + + + + + gpib.h + + + + + off + speed + + + + ../src/fifo.cpp + ../src/getopt.cpp + ../src/iobase.cpp + ../src/portscan.cpp + ../src/serportx.cpp + ../src/$(OS)/serport.cpp + ../src/$(OS)/timer.cpp + + + + + (cd ..; tar -cvzf manual/$(value) docs/html/ ) + + + + + + $(NAME)-$(VERSION)-htmldoc.tar.gz + + + + + + (cd ../..; tar -cvzf $(value) \ + $(NAME)-$(VERSION)/build/ \ + $(NAME)-$(VERSION)/manual/refman.pdf \ + $(NAME)-$(VERSION)/include \ + $(NAME)-$(VERSION)/python \ + $(NAME)-$(VERSION)/samples \ + $(NAME)-$(VERSION)/src \ + $(NAME)-$(VERSION)/lib/gpib32.lib \ + --exclude=release \ + --exclude=debug \ + --exclude=install \ + --exclude=output \ + --exclude=website \ + --exclude=*~ \ + --exclude=buildall.sh \ + --exclude=buildall.bat \ + --exclude=g++.sh \ + --exclude=version-update.sh \ + --exclude=$(value) \ + --exclude=*.ilk \ + --exclude=*.log \ + --exclude=*.o* \ + --exclude=*.pdb \ + --exclude=*.pyc \ + --exclude=.svn; mv $(value) $(NAME)-$(VERSION)/build ) + + + + + + $(NAME)-$(VERSION).tar.gz + + + + + + ..$(DIRSEP)include$(DIRSEP)ctb-$(VERSION) + + ctb.h + fifo.h + getopt.h + $(GPIBINC) + iobase.h + linux/serport.h + linux/timer.h + portscan.h + serport.h + serportx.h + timer.h + + $(INCLUDEDIR)$(DIRSEP)ctb-$(VERSION) + + + + ../lib + ctb$(LIBFLAG)$(GPIBFLAG)-$(VERSION) + + multi + static + $(OPTIMIZE_FLAG) + + $(FILES) + $(GPIBSRC) + + ../lib + $(SYSLIB1) + $(SYSLIB2) + ../include + $(LIBDIR) + + + ../lib + multi + ctb$(LIBFLAG)$(GPIBFLAG)-$(VERSION) + static + $(OPTIMIZE_FLAG) + ctb$(LIBFLAG)$(GPIBFLAG)-$(VERSION) + + $(FILES) + $(GPIBSRC) + + ../lib + $(SYSLIB1) + $(SYSLIB2) + ../include + $(LIBDIR) + + + + + + GPIB=$(GPIB) + multi + static + $(OPTIMIZE_FLAG) + + ../samples/ctbtest.cpp + + ../include + ../lib + ctb_lib + $(SYSLIB1) + $(SYSLIB2) + + + + vc + $(FORMAT) + + + + + + @if not exist $(INSTALLDIR)\lib\$(LIBNAME)_lib mkdir $(INSTALLDIR)\lib\$(LIBNAME)_lib + + @copy ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-$(VERSION).lib $(INSTALLDIR)\lib\$(LIBNAME)_lib + @copy ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-$(VERSION).dll $(INSTALLDIR)\lib\$(LIBNAME)_lib + + @if not exist $(INSTALLDIR)\include\ctb-$(VERSION)\win32 mkdir $(INSTALLDIR)\include\ctb-$(VERSION)\win32 + @copy ..\include\ctb-$(VERSION)\*.h $(INSTALLDIR)\include\ctb-$(VERSION) + @copy ..\include\ctb-$(VERSION)\win32\*.h $(INSTALLDIR)\include\ctb-$(VERSION)\win32 + + + + + all + + @echo " " + @echo "================================================================" + @echo " The building of ctb is finished. On Linux you'll now" + @echo " have to run (as root):" + @echo " " + @echo " make DEBUG=$(DEBUG) GPIB=$(GPIB) install" + @echo " " + @echo " to install the libraries in $(LIBDIR)" + @echo " and the header files in $(INCLUDEDIR)/ctb-$(VERSION)" + @echo " " + @echo " Don't forget to run ldconfig (also as root)" + @echo " " + @echo " ctb comes with no guarantees and doesn't claim" + @echo " to be suitable for any purpose." + @echo "================================================================" + @echo " " + + + + + all + + @echo " " + @echo "================================================================" + @echo " The building of ctb is finished. If you have an installed " + @echo " wxWidget package (WXWIN must be defined in the enviroment), " + @echo " you'll now have to run: " + @echo " " + @echo " make DEBUG=$(DEBUG) GPIB=$(GPIB) wxinstall " + @echo " " + @echo " to install the libraries in: " + @echo " $(INSTALLDIR)$(DIRSEP)lib$(DIRSEP)$(LIBNAME)_lib " + @echo " and the header files in" + @echo " $(INSTALLDIR)$(DIRSEP)ctb-$(VERSION)" + @echo " " + @echo " If you are using another compiler (Borland, Watcom, mingw,...) " + @echo " take a look in the README in this directory! " + @echo " " + @echo " ctb comes with no guarantees and doesn't claim " + @echo " to be suitable for any purpose. " + @echo "================================================================" + @echo " " + + + + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.bcc b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.bcc new file mode 100644 index 0000000000..6afadafb3f --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.bcc @@ -0,0 +1,269 @@ +# ========================================================================= +# This makefile was generated by +# Bakefile 0.2.5 (http://www.bakefile.org) +# Do not modify, all changes will be overwritten! +# ========================================================================= + +.autodepend + +!ifndef BCCDIR +!ifndef MAKEDIR +!error Your Borland compiler does not define MAKEDIR. Please define the BCCDIR variable, e.g. BCCDIR=d:\bc4 +!endif +BCCDIR = $(MAKEDIR)\.. +!endif + + + +# ------------------------------------------------------------------------- +# These are configurable options: +# ------------------------------------------------------------------------- + +# C++ compiler +!ifndef CXX +CXX = bcc32 +!endif + +# Standard flags for C++ +!ifndef CXXFLAGS +CXXFLAGS = +!endif + +# Standard preprocessor flags (common for CC and CXX) +!ifndef CPPFLAGS +CPPFLAGS = -a8 -g0 +!endif + +# Standard linker flags +!ifndef LDFLAGS +LDFLAGS = +!endif + +# Set to 1 to build debug version [0,1] +!ifndef DEBUG +DEBUG = 0 +!endif + +# +!ifndef GPIB +GPIB = 0 +!endif + +# +!ifndef WXDIR +WXDIR = $(WXWIN) +!endif + +# +!ifndef INSTALLDIR +INSTALLDIR = $(WXWIN) +!endif + + + +# ------------------------------------------------------------------------- +# Do not modify the rest of this file! +# ------------------------------------------------------------------------- + +### Variables: ### + +CTB_LIB_CXXFLAGS = -I$(BCCDIR)\include $(____DEBUG) $(____DEBUG_2) -tWM \ + $(__OPTIMIZE_FLAG) -I..\include $(CPPFLAGS) $(CXXFLAGS) +CTB_LIB_OBJECTS = \ + $(OUTPUT)\ctb_lib_fifo.obj \ + $(OUTPUT)\ctb_lib_getopt.obj \ + $(OUTPUT)\ctb_lib_iobase.obj \ + $(OUTPUT)\ctb_lib_portscan.obj \ + $(OUTPUT)\ctb_lib_serportx.obj \ + $(OUTPUT)\ctb_lib_serport.obj \ + $(OUTPUT)\ctb_lib_timer.obj \ + $(____GPIBSRC_FILENAMES_OBJECTS) +CTB_DLL_CXXFLAGS = -I$(BCCDIR)\include $(____DEBUG) $(____DEBUG_2) -tWM \ + $(__OPTIMIZE_FLAG) -I..\include $(CPPFLAGS) $(CXXFLAGS) +CTB_DLL_OBJECTS = \ + $(OUTPUT)\ctb_dll_fifo.obj \ + $(OUTPUT)\ctb_dll_getopt.obj \ + $(OUTPUT)\ctb_dll_iobase.obj \ + $(OUTPUT)\ctb_dll_portscan.obj \ + $(OUTPUT)\ctb_dll_serportx.obj \ + $(OUTPUT)\ctb_dll_serport.obj \ + $(OUTPUT)\ctb_dll_timer.obj \ + $(____GPIBSRC_FILENAMES_1_OBJECTS) +CTBTEST_CXXFLAGS = -I$(BCCDIR)\include $(____DEBUG) $(____DEBUG_2) \ + -DGPIB=$(GPIB) -tWM $(__OPTIMIZE_FLAG) -I..\include $(CPPFLAGS) $(CXXFLAGS) +CTBTEST_OBJECTS = \ + $(OUTPUT)\ctbtest_ctbtest.obj + +### Conditionally set variables: ### + +!if "$(DEBUG)" == "0" +OUTPUT = release +!endif +!if "$(DEBUG)" == "1" +OUTPUT = debug +!endif +!if "$(WXDIR)" == "" +INSTALLDIR = ..\lib +!endif +!if "$(DEBUG)" == "1" +LIBFLAG = d +!endif +!if "$(GPIB)" == "1" +GPIBFLAG = _gpib +!endif +!if "$(GPIB)" == "1" +____GPIBSRC_FILENAMES_OBJECTS = \ + $(OUTPUT)\ctb_lib_gpib.obj +!endif +!if "$(GPIB)" == "1" +____GPIBSRC_FILENAMES_1_OBJECTS = \ + $(OUTPUT)\ctb_dll_gpib.obj +!endif +!if "$(DEBUG)" == "0" +____DEBUG = -DNDEBUG +!endif +!if "$(DEBUG)" == "1" +____DEBUG = +!endif +!if "$(DEBUG)" == "0" +__OPTIMIZE_FLAG = -Od +!endif +!if "$(DEBUG)" == "1" +__OPTIMIZE_FLAG = -O2 +!endif +!if "$(GPIB)" == "1" +__SYSLIB2_p = gpib32.lib +!endif +!if "$(DEBUG)" == "0" +____DEBUG_2 = -v- +!endif +!if "$(DEBUG)" == "1" +____DEBUG_2 = -v +!endif + + +all: $(OUTPUT) +$(OUTPUT): + -if not exist $(OUTPUT) mkdir $(OUTPUT) + +### Targets: ### + +all: ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll $(OUTPUT)\ctbtest.exe tip-win32 + +clean: + -if exist $(OUTPUT)\*.obj del $(OUTPUT)\*.obj + -if exist $(OUTPUT)\*.res del $(OUTPUT)\*.res + -if exist $(OUTPUT)\*.csm del $(OUTPUT)\*.csm + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.tds del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.tds + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.ilc del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.ilc + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.ild del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.ild + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.ilf del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.ilf + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.ils del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.ils + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib + -if exist $(OUTPUT)\ctbtest.exe del $(OUTPUT)\ctbtest.exe + -if exist $(OUTPUT)\ctbtest.tds del $(OUTPUT)\ctbtest.tds + -if exist $(OUTPUT)\ctbtest.ilc del $(OUTPUT)\ctbtest.ilc + -if exist $(OUTPUT)\ctbtest.ild del $(OUTPUT)\ctbtest.ild + -if exist $(OUTPUT)\ctbtest.ilf del $(OUTPUT)\ctbtest.ilf + -if exist $(OUTPUT)\ctbtest.ils del $(OUTPUT)\ctbtest.ils + +..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib: $(CTB_LIB_OBJECTS) + if exist $@ del $@ + tlib /a /p4096 $@ @&&| + $(CTB_LIB_OBJECTS) +| + +..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll: $(CTB_DLL_OBJECTS) + ilink32 -Tpd -q -L$(BCCDIR)\lib -L$(BCCDIR)\lib\psdk $(____DEBUG_2) -L..\lib $(LDFLAGS) @&&| + c0d32.obj $(CTB_DLL_OBJECTS),$@,, winmm.lib $(__SYSLIB2_p) import32.lib cw32mt.lib,, +| + implib -f ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16 $@ + +$(OUTPUT)\ctbtest.exe: $(CTBTEST_OBJECTS) ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib + ilink32 -Tpe -q -L$(BCCDIR)\lib -L$(BCCDIR)\lib\psdk $(____DEBUG_2) -L..\lib $(LDFLAGS) @&&| + c0x32.obj $(CTBTEST_OBJECTS),$@,, ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib winmm.lib $(__SYSLIB2_p) import32.lib cw32mt.lib,, +| + +wxinstall: + @copy ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib $(INSTALLDIR)\lib\borland_lib + @copy ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll $(INSTALLDIR)\lib\borland_lib + + @if not exist $(INSTALLDIR)\include\ctb-0.16\win32 mkdir $(INSTALLDIR)\include\ctb-0.16\win32 + @copy ..\include\ctb-0.16\*.h $(INSTALLDIR)\include\ctb-0.16 + @copy ..\include\ctb-0.16\win32\*.h $(INSTALLDIR)\include\ctb-0.16\win32 + +tip-win32: + @echo " " + @echo "================================================================" + @echo " The building of ctb is finished. If you have an installed " + @echo " wxWidget package (WXWIN must be defined in the enviroment), " + @echo " you'll now have to run: " + @echo " " + @echo " make DEBUG=$(DEBUG) GPIB=$(GPIB) wxinstall " + @echo " " + @echo " to install the libraries in: " + @echo " $(INSTALLDIR)\lib\borland_lib " + @echo " and the header files in" + @echo " $(INSTALLDIR)\ctb-0.16" + @echo " " + @echo " If you are using another compiler (Borland, Watcom, mingw,...) " + @echo " take a look in the README in this directory! " + @echo " " + @echo " ctb comes with no guarantees and doesn't claim " + @echo " to be suitable for any purpose. " + @echo "================================================================" + @echo " " + +$(OUTPUT)\ctb_lib_fifo.obj: .\..\src\fifo.cpp + $(CXX) -q -c -P -o$@ $(CTB_LIB_CXXFLAGS) .\..\src\fifo.cpp + +$(OUTPUT)\ctb_lib_getopt.obj: .\..\src\getopt.cpp + $(CXX) -q -c -P -o$@ $(CTB_LIB_CXXFLAGS) .\..\src\getopt.cpp + +$(OUTPUT)\ctb_lib_iobase.obj: .\..\src\iobase.cpp + $(CXX) -q -c -P -o$@ $(CTB_LIB_CXXFLAGS) .\..\src\iobase.cpp + +$(OUTPUT)\ctb_lib_portscan.obj: .\..\src\portscan.cpp + $(CXX) -q -c -P -o$@ $(CTB_LIB_CXXFLAGS) .\..\src\portscan.cpp + +$(OUTPUT)\ctb_lib_serportx.obj: .\..\src\serportx.cpp + $(CXX) -q -c -P -o$@ $(CTB_LIB_CXXFLAGS) .\..\src\serportx.cpp + +$(OUTPUT)\ctb_lib_serport.obj: .\..\src\win32\serport.cpp + $(CXX) -q -c -P -o$@ $(CTB_LIB_CXXFLAGS) .\..\src\win32\serport.cpp + +$(OUTPUT)\ctb_lib_timer.obj: .\..\src\win32\timer.cpp + $(CXX) -q -c -P -o$@ $(CTB_LIB_CXXFLAGS) .\..\src\win32\timer.cpp + +$(OUTPUT)\ctb_lib_gpib.obj: .\..\src\gpib.cpp + $(CXX) -q -c -P -o$@ $(CTB_LIB_CXXFLAGS) .\..\src\gpib.cpp + +$(OUTPUT)\ctb_dll_fifo.obj: .\..\src\fifo.cpp + $(CXX) -q -c -P -o$@ $(CTB_DLL_CXXFLAGS) .\..\src\fifo.cpp + +$(OUTPUT)\ctb_dll_getopt.obj: .\..\src\getopt.cpp + $(CXX) -q -c -P -o$@ $(CTB_DLL_CXXFLAGS) .\..\src\getopt.cpp + +$(OUTPUT)\ctb_dll_iobase.obj: .\..\src\iobase.cpp + $(CXX) -q -c -P -o$@ $(CTB_DLL_CXXFLAGS) .\..\src\iobase.cpp + +$(OUTPUT)\ctb_dll_portscan.obj: .\..\src\portscan.cpp + $(CXX) -q -c -P -o$@ $(CTB_DLL_CXXFLAGS) .\..\src\portscan.cpp + +$(OUTPUT)\ctb_dll_serportx.obj: .\..\src\serportx.cpp + $(CXX) -q -c -P -o$@ $(CTB_DLL_CXXFLAGS) .\..\src\serportx.cpp + +$(OUTPUT)\ctb_dll_serport.obj: .\..\src\win32\serport.cpp + $(CXX) -q -c -P -o$@ $(CTB_DLL_CXXFLAGS) .\..\src\win32\serport.cpp + +$(OUTPUT)\ctb_dll_timer.obj: .\..\src\win32\timer.cpp + $(CXX) -q -c -P -o$@ $(CTB_DLL_CXXFLAGS) .\..\src\win32\timer.cpp + +$(OUTPUT)\ctb_dll_gpib.obj: .\..\src\gpib.cpp + $(CXX) -q -c -P -o$@ $(CTB_DLL_CXXFLAGS) .\..\src\gpib.cpp + +$(OUTPUT)\ctbtest_ctbtest.obj: .\..\samples\ctbtest.cpp + $(CXX) -q -c -P -o$@ $(CTBTEST_CXXFLAGS) .\..\samples\ctbtest.cpp + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.gcc b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.gcc new file mode 100644 index 0000000000..febca07dc8 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.gcc @@ -0,0 +1,238 @@ +# ========================================================================= +# This makefile was generated by +# Bakefile 0.2.5 (http://www.bakefile.org) +# Do not modify, all changes will be overwritten! +# ========================================================================= + + + +# ------------------------------------------------------------------------- +# These are configurable options: +# ------------------------------------------------------------------------- + +# Compiler flags to link shared library +LINK_DLL_FLAGS ?= -shared + +# C++ compiler +CXX = g++ + +# Standard flags for C++ +CXXFLAGS ?= + +# Standard preprocessor flags (common for CC and CXX) +CPPFLAGS ?= + +# Standard linker flags +LDFLAGS ?= + +# Set to 1 to build debug version [0,1] +DEBUG ?= 0 + +# +GPIB ?= 0 + +# +WXDIR ?= $(WXWIN) + +# +INSTALLDIR ?= $(WXWIN) + + + +# ------------------------------------------------------------------------- +# Do not modify the rest of this file! +# ------------------------------------------------------------------------- + +### Variables: ### + +CPPDEPS = -MT$@ -MF$@.d -MD -MP +CTB_LIB_CXXFLAGS = $(____DEBUG) $(____DEBUG_1) -mthreads $(__OPTIMIZE_FLAG) \ + -I..\include $(CPPFLAGS) $(CXXFLAGS) +CTB_LIB_OBJECTS = \ + $(OUTPUT)\ctb_lib_fifo.o \ + $(OUTPUT)\ctb_lib_getopt.o \ + $(OUTPUT)\ctb_lib_iobase.o \ + $(OUTPUT)\ctb_lib_portscan.o \ + $(OUTPUT)\ctb_lib_serportx.o \ + $(OUTPUT)\ctb_lib_serport.o \ + $(OUTPUT)\ctb_lib_timer.o \ + $(____GPIBSRC_FILENAMES_OBJECTS) +CTB_DLL_CXXFLAGS = $(____DEBUG) $(____DEBUG_1) -mthreads $(__OPTIMIZE_FLAG) \ + -I..\include $(CPPFLAGS) $(CXXFLAGS) +CTB_DLL_OBJECTS = \ + $(OUTPUT)\ctb_dll_fifo.o \ + $(OUTPUT)\ctb_dll_getopt.o \ + $(OUTPUT)\ctb_dll_iobase.o \ + $(OUTPUT)\ctb_dll_portscan.o \ + $(OUTPUT)\ctb_dll_serportx.o \ + $(OUTPUT)\ctb_dll_serport.o \ + $(OUTPUT)\ctb_dll_timer.o \ + $(____GPIBSRC_FILENAMES_1_OBJECTS) +CTBTEST_CXXFLAGS = $(____DEBUG) $(____DEBUG_1) -DGPIB=$(GPIB) -mthreads \ + $(__OPTIMIZE_FLAG) -I..\include $(CPPFLAGS) $(CXXFLAGS) +CTBTEST_OBJECTS = \ + $(OUTPUT)\ctbtest_ctbtest.o + +### Conditionally set variables: ### + +ifeq ($(DEBUG),0) +OUTPUT = release +endif +ifeq ($(DEBUG),1) +OUTPUT = debug +endif +ifeq ($(WXDIR),) +INSTALLDIR = ..\lib +endif +ifeq ($(DEBUG),1) +LIBFLAG = d +endif +ifeq ($(GPIB),1) +GPIBFLAG = _gpib +endif +ifeq ($(GPIB),1) +____GPIBSRC_FILENAMES_OBJECTS = \ + $(OUTPUT)\ctb_lib_gpib.o +endif +ifeq ($(GPIB),1) +____GPIBSRC_FILENAMES_1_OBJECTS = \ + $(OUTPUT)\ctb_dll_gpib.o +endif +ifeq ($(DEBUG),0) +____DEBUG = -DNDEBUG +endif +ifeq ($(DEBUG),1) +____DEBUG = +endif +ifeq ($(DEBUG),0) +__OPTIMIZE_FLAG = -O0 +endif +ifeq ($(DEBUG),1) +__OPTIMIZE_FLAG = -O2 +endif +ifeq ($(GPIB),1) +__SYSLIB2_p = -lgpib32 +endif +ifeq ($(DEBUG),0) +____DEBUG_1 = +endif +ifeq ($(DEBUG),1) +____DEBUG_1 = -g +endif + + +all: $(OUTPUT) +$(OUTPUT): + -if not exist $(OUTPUT) mkdir $(OUTPUT) + +### Targets: ### + +all: ..\lib\libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll $(OUTPUT)\ctbtest.exe tip-win32 + +clean: + -if exist $(OUTPUT)\*.o del $(OUTPUT)\*.o + -if exist $(OUTPUT)\*.d del $(OUTPUT)\*.d + -if exist ..\lib\libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a del ..\lib\libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll + -if exist ..\lib\libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a del ..\lib\libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a + -if exist $(OUTPUT)\ctbtest.exe del $(OUTPUT)\ctbtest.exe + +..\lib\libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a: $(CTB_LIB_OBJECTS) + if exist $@ del $@ + ar rcu $@ $(CTB_LIB_OBJECTS) + ranlib $@ + +..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll: $(CTB_DLL_OBJECTS) + $(CXX) $(LINK_DLL_FLAGS) -fPIC -o $@ $(CTB_DLL_OBJECTS) $(____DEBUG_1) -mthreads -Wl,--out-implib=..\lib\libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a -L..\lib $(LDFLAGS) -lwinmm $(__SYSLIB2_p) + +$(OUTPUT)\ctbtest.exe: $(CTBTEST_OBJECTS) ..\lib\libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a + $(CXX) -o $@ $(CTBTEST_OBJECTS) $(____DEBUG_1) -mthreads -L..\lib $(LDFLAGS) ..\lib\libctb$(LIBFLAG)$(GPIBFLAG)-0.16.a -lwinmm $(__SYSLIB2_p) + +wxinstall: + @copy ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib $(INSTALLDIR)\lib\mingw_lib + @copy ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll $(INSTALLDIR)\lib\mingw_lib + + @if not exist $(INSTALLDIR)\include\ctb-0.16\win32 mkdir $(INSTALLDIR)\include\ctb-0.16\win32 + @copy ..\include\ctb-0.16\*.h $(INSTALLDIR)\include\ctb-0.16 + @copy ..\include\ctb-0.16\win32\*.h $(INSTALLDIR)\include\ctb-0.16\win32 + +tip-win32: + @echo " " + @echo "================================================================" + @echo " The building of ctb is finished. If you have an installed " + @echo " wxWidget package (WXWIN must be defined in the enviroment), " + @echo " you'll now have to run: " + @echo " " + @echo " make DEBUG=$(DEBUG) GPIB=$(GPIB) wxinstall " + @echo " " + @echo " to install the libraries in: " + @echo " $(INSTALLDIR)\lib\mingw_lib " + @echo " and the header files in" + @echo " $(INSTALLDIR)\ctb-0.16" + @echo " " + @echo " If you are using another compiler (Borland, Watcom, mingw,...) " + @echo " take a look in the README in this directory! " + @echo " " + @echo " ctb comes with no guarantees and doesn't claim " + @echo " to be suitable for any purpose. " + @echo "================================================================" + @echo " " + +$(OUTPUT)\ctb_lib_fifo.o: ./../src/fifo.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_lib_getopt.o: ./../src/getopt.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_lib_iobase.o: ./../src/iobase.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_lib_portscan.o: ./../src/portscan.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_lib_serportx.o: ./../src/serportx.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_lib_serport.o: ./../src/win32/serport.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_lib_timer.o: ./../src/win32/timer.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_lib_gpib.o: ./../src/gpib.cpp + $(CXX) -c -o $@ $(CTB_LIB_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_dll_fifo.o: ./../src/fifo.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_dll_getopt.o: ./../src/getopt.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_dll_iobase.o: ./../src/iobase.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_dll_portscan.o: ./../src/portscan.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_dll_serportx.o: ./../src/serportx.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_dll_serport.o: ./../src/win32/serport.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_dll_timer.o: ./../src/win32/timer.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctb_dll_gpib.o: ./../src/gpib.cpp + $(CXX) -c -o $@ $(CTB_DLL_CXXFLAGS) $(CPPDEPS) $< + +$(OUTPUT)\ctbtest_ctbtest.o: ./../samples/ctbtest.cpp + $(CXX) -c -o $@ $(CTBTEST_CXXFLAGS) $(CPPDEPS) $< + +.PHONY: all clean + + +SHELL := $(COMSPEC) + +# Dependencies tracking: +-include $(OUTPUT)/*.d diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.vc b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.vc new file mode 100644 index 0000000000..62e7b56371 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.vc @@ -0,0 +1,260 @@ +# ========================================================================= +# This makefile was generated by +# Bakefile 0.2.5 (http://www.bakefile.org) +# Do not modify, all changes will be overwritten! +# ========================================================================= + + + +# ------------------------------------------------------------------------- +# These are configurable options: +# ------------------------------------------------------------------------- + +# C++ compiler +CXX = cl + +# Standard flags for C++ +CXXFLAGS = + +# Standard preprocessor flags (common for CC and CXX) +CPPFLAGS = + +# Standard linker flags +LDFLAGS = + +# Set to 1 to build debug version [0,1] +# 0 - Release +# 1 - Debug +DEBUG = 0 + +# +GPIB = 0 + +# +WXDIR = $(WXWIN) + +# +INSTALLDIR = $(WXWIN) + + + +# ------------------------------------------------------------------------- +# Do not modify the rest of this file! +# ------------------------------------------------------------------------- + +### Variables: ### + +CTB_LIB_CXXFLAGS = /MT$(____DEBUG_4) /DWIN32 $(____DEBUG) $(____DEBUG_2) \ + $(______DEBUG) /Fd..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.pdb \ + $(__OPTIMIZE_FLAG) /I..\include /GR /EHsc $(CPPFLAGS) $(CXXFLAGS) +CTB_LIB_OBJECTS = \ + $(OUTPUT)\ctb_lib_fifo.obj \ + $(OUTPUT)\ctb_lib_getopt.obj \ + $(OUTPUT)\ctb_lib_iobase.obj \ + $(OUTPUT)\ctb_lib_portscan.obj \ + $(OUTPUT)\ctb_lib_serportx.obj \ + $(OUTPUT)\ctb_lib_serport.obj \ + $(OUTPUT)\ctb_lib_timer.obj \ + $(____GPIBSRC_FILENAMES_OBJECTS) +CTB_DLL_CXXFLAGS = /MT$(____DEBUG_4) /DWIN32 $(____DEBUG) $(____DEBUG_2) \ + $(______DEBUG) /Fd..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.pdb \ + $(__OPTIMIZE_FLAG) /I..\include /GR /EHsc $(CPPFLAGS) $(CXXFLAGS) +CTB_DLL_OBJECTS = \ + $(OUTPUT)\ctb_dll_fifo.obj \ + $(OUTPUT)\ctb_dll_getopt.obj \ + $(OUTPUT)\ctb_dll_iobase.obj \ + $(OUTPUT)\ctb_dll_portscan.obj \ + $(OUTPUT)\ctb_dll_serportx.obj \ + $(OUTPUT)\ctb_dll_serport.obj \ + $(OUTPUT)\ctb_dll_timer.obj \ + $(____GPIBSRC_FILENAMES_1_OBJECTS) +CTBTEST_CXXFLAGS = /MT$(____DEBUG_4) /DWIN32 $(____DEBUG) $(____DEBUG_2) \ + $(______DEBUG) /Fd$(OUTPUT)\ctbtest.pdb /DGPIB=$(GPIB) $(__OPTIMIZE_FLAG) \ + /I..\include /GR /EHsc $(CPPFLAGS) $(CXXFLAGS) +CTBTEST_OBJECTS = \ + $(OUTPUT)\ctbtest_ctbtest.obj + +### Conditionally set variables: ### + +!if "$(DEBUG)" == "0" +OUTPUT = release +!endif +!if "$(DEBUG)" == "1" +OUTPUT = debug +!endif +!if "$(WXDIR)" == "" +INSTALLDIR = ..\lib +!endif +!if "$(DEBUG)" == "1" +LIBFLAG = d +!endif +!if "$(GPIB)" == "1" +GPIBFLAG = _gpib +!endif +!if "$(GPIB)" == "1" +____GPIBSRC_FILENAMES_OBJECTS = \ + $(OUTPUT)\ctb_lib_gpib.obj +!endif +!if "$(GPIB)" == "1" +____GPIBSRC_FILENAMES_1_OBJECTS = \ + $(OUTPUT)\ctb_dll_gpib.obj +!endif +!if "$(DEBUG)" == "0" +____DEBUG = /DNDEBUG +!endif +!if "$(DEBUG)" == "1" +____DEBUG = +!endif +!if "$(DEBUG)" == "0" +____DEBUG_2 = +!endif +!if "$(DEBUG)" == "1" +____DEBUG_2 = /Zi +!endif +!if "$(DEBUG)" == "0" +____DEBUG_3 = +!endif +!if "$(DEBUG)" == "1" +____DEBUG_3 = /DEBUG +!endif +!if "$(DEBUG)" == "0" +______DEBUG = +!endif +!if "$(DEBUG)" == "1" +______DEBUG = /D_DEBUG +!endif +!if "$(DEBUG)" == "0" +____DEBUG_4 = +!endif +!if "$(DEBUG)" == "1" +____DEBUG_4 = d +!endif +!if "$(DEBUG)" == "0" +__OPTIMIZE_FLAG = /Od +!endif +!if "$(DEBUG)" == "1" +__OPTIMIZE_FLAG = /O2 +!endif +!if "$(GPIB)" == "1" +__SYSLIB2_p = gpib32.lib +!endif + + +all: $(OUTPUT) +$(OUTPUT): + -if not exist $(OUTPUT) mkdir $(OUTPUT) + +### Targets: ### + +all: ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll $(OUTPUT)\ctbtest.exe tip-win32 + +clean: + -if exist $(OUTPUT)\*.obj del $(OUTPUT)\*.obj + -if exist $(OUTPUT)\*.res del $(OUTPUT)\*.res + -if exist $(OUTPUT)\*.pch del $(OUTPUT)\*.pch + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.ilk del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.ilk + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.pdb del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.pdb + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib + -if exist $(OUTPUT)\ctbtest.exe del $(OUTPUT)\ctbtest.exe + -if exist $(OUTPUT)\ctbtest.ilk del $(OUTPUT)\ctbtest.ilk + -if exist $(OUTPUT)\ctbtest.pdb del $(OUTPUT)\ctbtest.pdb + +..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib: $(CTB_LIB_OBJECTS) + if exist $@ del $@ + link /LIB /NOLOGO /OUT:$@ @<< + $(CTB_LIB_OBJECTS) +<< + +..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll: $(CTB_DLL_OBJECTS) + link /DLL /NOLOGO /OUT:$@ $(____DEBUG_3) /pdb:"..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.pdb" /LIBPATH:..\lib $(LDFLAGS) @<< + $(CTB_DLL_OBJECTS) winmm.lib $(__SYSLIB2_p) /IMPLIB:..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib +<< + +$(OUTPUT)\ctbtest.exe: $(CTBTEST_OBJECTS) ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib + link /NOLOGO /OUT:$@ $(____DEBUG_3) /pdb:"$(OUTPUT)\ctbtest.pdb" /LIBPATH:..\lib $(LDFLAGS) @<< + $(CTBTEST_OBJECTS) ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib winmm.lib $(__SYSLIB2_p) +<< + +wxinstall: + @copy ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib $(INSTALLDIR)\lib\vc_lib + @copy ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll $(INSTALLDIR)\lib\vc_lib + + @if not exist $(INSTALLDIR)\include\ctb-0.16\win32 mkdir $(INSTALLDIR)\include\ctb-0.16\win32 + @copy ..\include\ctb-0.16\*.h $(INSTALLDIR)\include\ctb-0.16 + @copy ..\include\ctb-0.16\win32\*.h $(INSTALLDIR)\include\ctb-0.16\win32 + +tip-win32: + @echo " " + @echo "================================================================" + @echo " The building of ctb is finished. If you have an installed " + @echo " wxWidget package (WXWIN must be defined in the enviroment), " + @echo " you'll now have to run: " + @echo " " + @echo " make DEBUG=$(DEBUG) GPIB=$(GPIB) wxinstall " + @echo " " + @echo " to install the libraries in: " + @echo " $(INSTALLDIR)\lib\vc_lib " + @echo " and the header files in" + @echo " $(INSTALLDIR)\ctb-0.16" + @echo " " + @echo " If you are using another compiler (Borland, Watcom, mingw,...) " + @echo " take a look in the README in this directory! " + @echo " " + @echo " ctb comes with no guarantees and doesn't claim " + @echo " to be suitable for any purpose. " + @echo "================================================================" + @echo " " + +$(OUTPUT)\ctb_lib_fifo.obj: .\..\src\fifo.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_LIB_CXXFLAGS) .\..\src\fifo.cpp + +$(OUTPUT)\ctb_lib_getopt.obj: .\..\src\getopt.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_LIB_CXXFLAGS) .\..\src\getopt.cpp + +$(OUTPUT)\ctb_lib_iobase.obj: .\..\src\iobase.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_LIB_CXXFLAGS) .\..\src\iobase.cpp + +$(OUTPUT)\ctb_lib_portscan.obj: .\..\src\portscan.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_LIB_CXXFLAGS) .\..\src\portscan.cpp + +$(OUTPUT)\ctb_lib_serportx.obj: .\..\src\serportx.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_LIB_CXXFLAGS) .\..\src\serportx.cpp + +$(OUTPUT)\ctb_lib_serport.obj: .\..\src\win32\serport.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_LIB_CXXFLAGS) .\..\src\win32\serport.cpp + +$(OUTPUT)\ctb_lib_timer.obj: .\..\src\win32\timer.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_LIB_CXXFLAGS) .\..\src\win32\timer.cpp + +$(OUTPUT)\ctb_lib_gpib.obj: .\..\src\gpib.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_LIB_CXXFLAGS) .\..\src\gpib.cpp + +$(OUTPUT)\ctb_dll_fifo.obj: .\..\src\fifo.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_DLL_CXXFLAGS) .\..\src\fifo.cpp + +$(OUTPUT)\ctb_dll_getopt.obj: .\..\src\getopt.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_DLL_CXXFLAGS) .\..\src\getopt.cpp + +$(OUTPUT)\ctb_dll_iobase.obj: .\..\src\iobase.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_DLL_CXXFLAGS) .\..\src\iobase.cpp + +$(OUTPUT)\ctb_dll_portscan.obj: .\..\src\portscan.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_DLL_CXXFLAGS) .\..\src\portscan.cpp + +$(OUTPUT)\ctb_dll_serportx.obj: .\..\src\serportx.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_DLL_CXXFLAGS) .\..\src\serportx.cpp + +$(OUTPUT)\ctb_dll_serport.obj: .\..\src\win32\serport.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_DLL_CXXFLAGS) .\..\src\win32\serport.cpp + +$(OUTPUT)\ctb_dll_timer.obj: .\..\src\win32\timer.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_DLL_CXXFLAGS) .\..\src\win32\timer.cpp + +$(OUTPUT)\ctb_dll_gpib.obj: .\..\src\gpib.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTB_DLL_CXXFLAGS) .\..\src\gpib.cpp + +$(OUTPUT)\ctbtest_ctbtest.obj: .\..\samples\ctbtest.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CTBTEST_CXXFLAGS) .\..\samples\ctbtest.cpp + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.wat b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.wat new file mode 100644 index 0000000000..5041ddac36 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/build/makefile.wat @@ -0,0 +1,283 @@ +# ========================================================================= +# This makefile was generated by +# Bakefile 0.2.5 (http://www.bakefile.org) +# Do not modify, all changes will be overwritten! +# ========================================================================= + + + +# ------------------------------------------------------------------------- +# These are configurable options: +# ------------------------------------------------------------------------- + +# C++ compiler +CXX = wpp386 + +# Standard flags for C++ +CXXFLAGS = + +# Standard preprocessor flags (common for CC and CXX) +CPPFLAGS = + +# Standard linker flags +LDFLAGS = + +# Set to 1 to build debug version [0,1] +# 0 - Release +# 1 - Debug +DEBUG = 0 + +# +GPIB = 0 + +# +WXDIR = $(%WXWIN) + +# +INSTALLDIR = $(%WXWIN) + + + +# ------------------------------------------------------------------------- +# Do not modify the rest of this file! +# ------------------------------------------------------------------------- + +# Speed up compilation a bit: +!ifdef __LOADDLL__ +! loaddll wcc wccd +! loaddll wccaxp wccdaxp +! loaddll wcc386 wccd386 +! loaddll wpp wppdi86 +! loaddll wppaxp wppdaxp +! loaddll wpp386 wppd386 +! loaddll wlink wlink +! loaddll wlib wlibd +!endif + +# We need these variables in some bakefile-made rules: +WATCOM_CWD = $+ $(%cdrive):$(%cwd) $- + +### Conditionally set variables: ### + +OUTPUT = +!ifeq DEBUG 0 +OUTPUT = release +!endif +!ifeq DEBUG 1 +OUTPUT = debug +!endif +INSTALLDIR = +!ifeq WXDIR +INSTALLDIR = ..\lib +!endif +LIBFLAG = +!ifeq DEBUG 1 +LIBFLAG = d +!endif +GPIBFLAG = +!ifeq GPIB 1 +GPIBFLAG = _gpib +!endif +____GPIBSRC_FILENAMES_OBJECTS = +!ifeq GPIB 1 +____GPIBSRC_FILENAMES_OBJECTS = & + $(OUTPUT)\ctb_lib_gpib.obj +!endif +____GPIBSRC_FILENAMES_1_OBJECTS = +!ifeq GPIB 1 +____GPIBSRC_FILENAMES_1_OBJECTS = & + $(OUTPUT)\ctb_dll_gpib.obj +!endif +____DEBUG = +!ifeq DEBUG 0 +____DEBUG = -dNDEBUG +!endif +!ifeq DEBUG 1 +____DEBUG = +!endif +____DEBUG_0 = +!ifeq DEBUG 0 +____DEBUG_0 = -d0 +!endif +!ifeq DEBUG 1 +____DEBUG_0 = -d2 +!endif +____DEBUG_2 = +!ifeq DEBUG 0 +____DEBUG_2 = +!endif +!ifeq DEBUG 1 +____DEBUG_2 = debug all +!endif +__OPTIMIZE_FLAG = +!ifeq DEBUG 0 +__OPTIMIZE_FLAG = -od +!endif +!ifeq DEBUG 1 +__OPTIMIZE_FLAG = -ot -ox +!endif +__SYSLIB2_p = +!ifeq GPIB 1 +__SYSLIB2_p = gpib32.lib +!endif + +### Variables: ### + +CTB_LIB_CXXFLAGS = $(____DEBUG) $(____DEBUG_0) -bm $(__OPTIMIZE_FLAG) & + -i=..\include $(CPPFLAGS) $(CXXFLAGS) +CTB_LIB_OBJECTS = & + $(OUTPUT)\ctb_lib_fifo.obj & + $(OUTPUT)\ctb_lib_getopt.obj & + $(OUTPUT)\ctb_lib_iobase.obj & + $(OUTPUT)\ctb_lib_portscan.obj & + $(OUTPUT)\ctb_lib_serportx.obj & + $(OUTPUT)\ctb_lib_serport.obj & + $(OUTPUT)\ctb_lib_timer.obj & + $(____GPIBSRC_FILENAMES_OBJECTS) +CTB_DLL_CXXFLAGS = -bd $(____DEBUG) $(____DEBUG_0) -bm $(__OPTIMIZE_FLAG) & + -i=..\include $(CPPFLAGS) $(CXXFLAGS) +CTB_DLL_OBJECTS = & + $(OUTPUT)\ctb_dll_fifo.obj & + $(OUTPUT)\ctb_dll_getopt.obj & + $(OUTPUT)\ctb_dll_iobase.obj & + $(OUTPUT)\ctb_dll_portscan.obj & + $(OUTPUT)\ctb_dll_serportx.obj & + $(OUTPUT)\ctb_dll_serport.obj & + $(OUTPUT)\ctb_dll_timer.obj & + $(____GPIBSRC_FILENAMES_1_OBJECTS) +CTBTEST_CXXFLAGS = $(____DEBUG) $(____DEBUG_0) -dGPIB=$(GPIB) -bm & + $(__OPTIMIZE_FLAG) -i=..\include $(CPPFLAGS) $(CXXFLAGS) +CTBTEST_OBJECTS = & + $(OUTPUT)\ctbtest_ctbtest.obj + + +all : $(OUTPUT) +$(OUTPUT) : + -if not exist $(OUTPUT) mkdir $(OUTPUT) + +### Targets: ### + +all : .SYMBOLIC ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll $(OUTPUT)\ctbtest.exe tip-win32 + +clean : .SYMBOLIC + -if exist $(OUTPUT)\*.obj del $(OUTPUT)\*.obj + -if exist $(OUTPUT)\*.res del $(OUTPUT)\*.res + -if exist $(OUTPUT)\*.lbc del $(OUTPUT)\*.lbc + -if exist $(OUTPUT)\*.ilk del $(OUTPUT)\*.ilk + -if exist $(OUTPUT)\*.pch del $(OUTPUT)\*.pch + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll + -if exist ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib del ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib + -if exist $(OUTPUT)\ctbtest.exe del $(OUTPUT)\ctbtest.exe + +..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib : $(CTB_LIB_OBJECTS) + @%create $(OUTPUT)\ctb_lib.lbc + @for %i in ($(CTB_LIB_OBJECTS)) do @%append $(OUTPUT)\ctb_lib.lbc +%i + wlib -q -p4096 -n -b $^@ @$(OUTPUT)\ctb_lib.lbc + +..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll : $(CTB_DLL_OBJECTS) + @%create $(OUTPUT)\ctb_dll.lbc + @%append $(OUTPUT)\ctb_dll.lbc option quiet + @%append $(OUTPUT)\ctb_dll.lbc name $^@ + @%append $(OUTPUT)\ctb_dll.lbc option caseexact + @%append $(OUTPUT)\ctb_dll.lbc $(____DEBUG_2) libpath ..\lib $(LDFLAGS) + @for %i in ($(CTB_DLL_OBJECTS)) do @%append $(OUTPUT)\ctb_dll.lbc file %i + @for %i in ( winmm.lib $(__SYSLIB2_p)) do @%append $(OUTPUT)\ctb_dll.lbc library %i + @%append $(OUTPUT)\ctb_dll.lbc + @%append $(OUTPUT)\ctb_dll.lbc system nt_dll + wlink @$(OUTPUT)\ctb_dll.lbc + wlib -q -n -b ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib +$^@ + +$(OUTPUT)\ctbtest.exe : $(CTBTEST_OBJECTS) ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib + @%create $(OUTPUT)\ctbtest.lbc + @%append $(OUTPUT)\ctbtest.lbc option quiet + @%append $(OUTPUT)\ctbtest.lbc name $^@ + @%append $(OUTPUT)\ctbtest.lbc option caseexact + @%append $(OUTPUT)\ctbtest.lbc $(____DEBUG_2) libpath ..\lib $(LDFLAGS) + @for %i in ($(CTBTEST_OBJECTS)) do @%append $(OUTPUT)\ctbtest.lbc file %i + @for %i in ( ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib winmm.lib $(__SYSLIB2_p)) do @%append $(OUTPUT)\ctbtest.lbc library %i + @%append $(OUTPUT)\ctbtest.lbc + @for %i in () do @%append $(OUTPUT)\ctbtest.lbc option stack=%i + wlink @$(OUTPUT)\ctbtest.lbc + +wxinstall : + @copy ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.lib $(INSTALLDIR)\lib\watcom_lib + @copy ..\lib\ctb$(LIBFLAG)$(GPIBFLAG)-0.16.dll $(INSTALLDIR)\lib\watcom_lib + + @if not exist $(INSTALLDIR)\include\ctb-0.16\win32 mkdir $(INSTALLDIR)\include\ctb-0.16\win32 + @copy ..\include\ctb-0.16\*.h $(INSTALLDIR)\include\ctb-0.16 + @copy ..\include\ctb-0.16\win32\*.h $(INSTALLDIR)\include\ctb-0.16\win32 + +tip-win32 : + @echo " " + @echo "================================================================" + @echo " The building of ctb is finished. If you have an installed " + @echo " wxWidget package (WXWIN must be defined in the enviroment), " + @echo " you'll now have to run: " + @echo " " + @echo " make DEBUG=$(DEBUG) GPIB=$(GPIB) wxinstall " + @echo " " + @echo " to install the libraries in: " + @echo " $(INSTALLDIR)\lib\watcom_lib " + @echo " and the header files in" + @echo " $(INSTALLDIR)\ctb-0.16" + @echo " " + @echo " If you are using another compiler (Borland, Watcom, mingw,...) " + @echo " take a look in the README in this directory! " + @echo " " + @echo " ctb comes with no guarantees and doesn't claim " + @echo " to be suitable for any purpose. " + @echo "================================================================" + @echo " " + +$(OUTPUT)\ctb_lib_fifo.obj : .AUTODEPEND .\..\src\fifo.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_LIB_CXXFLAGS) $< + +$(OUTPUT)\ctb_lib_getopt.obj : .AUTODEPEND .\..\src\getopt.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_LIB_CXXFLAGS) $< + +$(OUTPUT)\ctb_lib_iobase.obj : .AUTODEPEND .\..\src\iobase.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_LIB_CXXFLAGS) $< + +$(OUTPUT)\ctb_lib_portscan.obj : .AUTODEPEND .\..\src\portscan.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_LIB_CXXFLAGS) $< + +$(OUTPUT)\ctb_lib_serportx.obj : .AUTODEPEND .\..\src\serportx.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_LIB_CXXFLAGS) $< + +$(OUTPUT)\ctb_lib_serport.obj : .AUTODEPEND .\..\src\win32\serport.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_LIB_CXXFLAGS) $< + +$(OUTPUT)\ctb_lib_timer.obj : .AUTODEPEND .\..\src\win32\timer.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_LIB_CXXFLAGS) $< + +$(OUTPUT)\ctb_lib_gpib.obj : .AUTODEPEND .\..\src\gpib.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_LIB_CXXFLAGS) $< + +$(OUTPUT)\ctb_dll_fifo.obj : .AUTODEPEND .\..\src\fifo.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_DLL_CXXFLAGS) $< + +$(OUTPUT)\ctb_dll_getopt.obj : .AUTODEPEND .\..\src\getopt.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_DLL_CXXFLAGS) $< + +$(OUTPUT)\ctb_dll_iobase.obj : .AUTODEPEND .\..\src\iobase.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_DLL_CXXFLAGS) $< + +$(OUTPUT)\ctb_dll_portscan.obj : .AUTODEPEND .\..\src\portscan.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_DLL_CXXFLAGS) $< + +$(OUTPUT)\ctb_dll_serportx.obj : .AUTODEPEND .\..\src\serportx.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_DLL_CXXFLAGS) $< + +$(OUTPUT)\ctb_dll_serport.obj : .AUTODEPEND .\..\src\win32\serport.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_DLL_CXXFLAGS) $< + +$(OUTPUT)\ctb_dll_timer.obj : .AUTODEPEND .\..\src\win32\timer.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_DLL_CXXFLAGS) $< + +$(OUTPUT)\ctb_dll_gpib.obj : .AUTODEPEND .\..\src\gpib.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTB_DLL_CXXFLAGS) $< + +$(OUTPUT)\ctbtest_ctbtest.obj : .AUTODEPEND .\..\samples\ctbtest.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CTBTEST_CXXFLAGS) $< + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/ctb.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/ctb.h new file mode 100644 index 0000000000..767067d6a0 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/ctb.h @@ -0,0 +1,139 @@ +#ifndef LIBCTB_CTB_H_INCLUDED_ +#define LIBCTB_CTB_H_INCLUDED_ + +#include "ctb-0.16/fifo.h" +#if ( GPIB ) +# include "ctb-0.16/gpib.h" +#endif +#include "ctb-0.16/getopt.h" +#include "ctb-0.16/iobase.h" +#include "ctb-0.16/kbhit.h" +#include "ctb-0.16/portscan.h" +#include "ctb-0.16/serport.h" +#include "ctb-0.16/serportx.h" +#include "ctb-0.16/timer.h" + +/*! + \mainpage ctb overview + + The ctb (communication toolbox) library was realized, to simplify the + communication with other instruments throughout the serial com ports + (at first). To make my life easier, it should works with Linux and + all win32 plattforms (excepted windows 3.1, which is a only 16bit OS) + because I develope my applications for both plattforms).\n + Some times later GPIB support was added to make ctb an integrated part + for the extensive test and calibration system of a company I worked + these days.\n + The main goal of the library was a non-blocked communication to avoid + frozen GUIs waiting for data which in some conditions never arrives. + + On the base ctb defines an abstract class IOBase, which must be + derivate for several interfaces (at now this was done for the + RS232 comports and GPIB IEEE488 interface). + + This leads to another feature: Because all classes depends on one + super class, you have just open your wanted interface and don't + worry about it's special typ later. This is like the 'Virtual + Instrument' featured by Nation Instruments LabView. + + Last not least: ctb provides one written code for Linux and Windows + (compiles well with GNU G++ and VC++). Without any dependences (execept + for a standard C++ compilier) ctb runs also in small enviroments like + embedded systems and doesn't need any graphic stuff for use. + + ctb is composed of five parts: + + - ctb::IOBase class + - ctb::SerialPort class + - ctb::GpibDevice class + - ctb::Timer class + - ctb::Fifo class + + \section IOBase IOBase class + + An abstract class for different interfaces. The idea behind this: + Similar to the virtual file system this class defines a lot of + preset member functions, which the derivate classes must be + overload.\n + In the main thing these are: open a interface (such as RS232), + reading and writing non blocked through the interface and at + last, close it.\n + For special interface settings the method ioctl was defined. + (control interface). ioctl covers some interface dependent + settings like switch on/off the RS232 status lines and must also + be defined from each derivated class. + + + \section SerialPort SerialPort class + + The class for the serial ports is named as + ctb::SerialPort. SerialPort is a wrapper for non blocked reading and + writing. This is easy under linux, but with windows a lot more + tricky. SerialPort is as simple as possible. It doesn't create any + gui events or signals, so it works also standalone. It's also not a + device driver, means, you must call the read method, if you look for + receiving data. + + You can write any desired data with any length (length type is + size_t, I think, on win32 and linux this is a 32Bit integer) and + SerialPort returns the really writen data length, also you can read + a lot of data and SerialPort returns the really received data count. + + Both, read and write returns immediatelly. Using these, the program + never blocks. Also IOBase implements a blocked read and write. You can + use these functions, if you want a definitiv count of data and never + accept less than this. Because there is a difficulty, when the + communication is interrupted or death, both blocked functions get a + timeout flag to returns after a given time interval. The timeouts + will be handled with the second timer class. + + As an additional benefit ctb features also 9 Bit transmission (with + take advantage of the parity bit), non-standard baudrates (depending + on your hardware but not on ctb) and all parity eventualities + including static parity settings like Mark and Space. + + \section GpibDevice GpibDevice class + + Named as ctb::GpibDevice. In the philosophy of the SerialPort class + GpibDevice also supports non-blocking communication. You can instant + as many GpibDevice objects as you need for instance to communicate + with a lot of different bus participants in a typical GPIB enviroment. + GPIB support was tested with PCI cards and USB adapter from Nation + Instrument and Keithley. + + \section Timer Timer class + + The idea of the ctb::Timer class is to base on the Unix C alarm + function. You create a Timer with a given alarm time and a adress of + flag, which the timer must set after the time is over. + + Because the alarm function cannot used more than once in the same + process (under windows I don't know a similar function), every timer + instance will be a separate thread after starting it. So you can start + a timer and continue in your program, make a lot of things and test + the flag whenever you want this. (For example, you read/write a + given count of data). + + \note + I think, it's a better style, to request a given count of data in + 100ms (for example) and trap the situation, if there are not enough + data after this time. And not do this for every byte! + + \section Fifo Fifo cass + Provides a simple thread safe fifo to realize a fast and simple + communication pipe between two threads (and was used also as a put + back mechanism for the wxIOBase and it's derivated classes).\n + ctb::Fifo tackles the concurrently access from different threads with an + internal temporary pointer asignment which was atomic. From there no + mutex or semaphore is involved and lead to a fast access. + + Please note:\n + The thread safeness is limited to the put/get write/read methods but + which should be sufficent for a fifo. + + + \latexonly \newpage \endlatexonly + + */ + +#endif diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/fifo.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/fifo.h new file mode 100644 index 0000000000..d17079d4a2 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/fifo.h @@ -0,0 +1,96 @@ +#ifndef __LIBCTB_FIFO_H_INCLUDED_ +#define __LIBCTB_FIFO_H_INCLUDED_ + +///////////////////////////////////////////////////////////////////////////// +// Name: fifo.h +// Purpose: +// Author: Joachim Buermann, Michael Hungershausen +// Copyright: (c) 2010 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include + +/** + \file fifo.h +*/ + +namespace ctb { + +/*! + \class Fifo + A simple thread safe fifo to realize a put back mechanism for the + wxIOBase and it's derivated classes. +*/ + class Fifo + { + protected: + /*! the size of the fifo */ + size_t m_size; + /*! the start of the internal fifo buffer */ + char* m_begin; + /*! + the end of the internal fifo buffer (m_end marks the first + invalid byte AFTER the internal buffer) + */ + char* m_end; + /*! the current read position */ + char* m_rdptr; + /*! the current write position */ + char* m_wrptr; + public: + /*! + \brief the constructor initialize a fifo with the given size. + \param size size of the fifo + */ + Fifo(size_t size); + /*! + \brief the destructor destroys all internal memory. + */ + virtual ~Fifo(); + /*! + \brief clear all internal memory and set the read and write + pointers to the start of the internal memory. + \Note This function is not thread safe! Don't use it, if another + thread takes access to the fifo instance. Use a looping get() or + read() call instead of this. + */ + virtual void clear(); + /*! + \brief fetch the next available byte from the fifo. + \param ch points to a charater to store the result + \return 1 if successful, 0 otherwise + */ + virtual int get(char* ch); + /*! + \brief query the fifo for it's available bytes. + \return count of readable bytes, storing in the fifo + */ + size_t items(); + /*! + \brief put a character into the fifo. + \param ch the character to put in + \return 1 if successful, 0 otherwise + */ + virtual int put(char ch); + /*! + \brief read a given count of bytes out of the fifo. + \param data memory to store the readed data + \param count number of bytes to read + \return On success, the number of bytes read are returned, + 0 otherwise + */ + virtual int read(char* data,int count); + /*! + \brief write a given count of bytes into the fifo. + \param data start of the data to write + \param count number of bytes to write + \return On success, the number of bytes written are returned, + 0 otherwise + */ + virtual int write(char* data,int count); + }; + +} // namespace ctb + +#endif diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/getopt.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/getopt.h new file mode 100644 index 0000000000..2efd341889 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/getopt.h @@ -0,0 +1,19 @@ +#ifndef LIBCTB_GETOPT_H_INCLUDED_ +#define LIBCTB_GETOPT_H_INCLUDED_ + +///////////////////////////////////////////////////////////////////////////// +// Name: getopt.h +// Purpose: Simple wrapper file +// Author: Joachim Buermann +// Copyright: (c) 2010 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#if defined (WIN32) +# include "win32/getopt.h" +#else +# include +#endif + +#endif +// __WX_GETOPT_H diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/gpib.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/gpib.h new file mode 100644 index 0000000000..1d360a8c49 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/gpib.h @@ -0,0 +1,378 @@ +#ifndef LIBCTB_GPIB_H_INCLUDED_ +#define LIBCTB_GPIB_H_INCLUDED_ + +///////////////////////////////////////////////////////////////////////////// +// Name: gpibx.h +// Purpose: base class for gpib devices +// Author: Joachim Buermann +// Copyright: (c) 2010 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "ctb-0.16/iobase.h" + +namespace ctb { + +/*! + \file gpib.h +*/ + + /*! defines the os specific name for the first gpib controller */ + extern const char* GPIB1; + + /*! defines the os specific name for the second gpib controller */ + extern const char* GPIB2; + + /*! + \enum GpibTimeout + NI488.2 API defines the following valid timeouts. + */ + enum GpibTimeout + { + /// no timeout (infinity) + GpibTimeoutNone = 0, + /// 10 micro seconds + GpibTimeout10us, + /// 30 micro seconds + GpibTimeout30us, + /// 100 micro seconds + GpibTimeout100us, + /// 300 micro seconds + GpibTimeout300us, + /// 1 milli second + GpibTimeout1ms, + /// 3 milli seconds + GpibTimeout3ms, + /// 10 milli seconds + GpibTimeout10ms, + /// 30 milli seconds + GpibTimeout30ms, + /// 0.1 seconds + GpibTimeout100ms, + /// 0.3 seconds + GpibTimeout300ms, + /// 1 second + GpibTimeout1s, + /// 3 seconds + GpibTimeout3s, + /// 10 seconds + GpibTimeout10s, + /// 30 seconds + GpibTimeout30s, + /// 100 seconds + GpibTimeout100s, + /// 300 seconds (5 minutes) + GpibTimeout300s, + /// 1000 seconds + GpibTimeout1000s + }; + + /*! + \struct Gpib_DCS + + The device control struct for the gpib communication class. + This struct should be used, if you refer advanced parameter. + */ + struct Gpib_DCS + { + /*! primary address of GPIB device */ + int m_address1; + /*! secondary address of GPIB device */ + int m_address2; + /*! I/O timeout */ + GpibTimeout m_timeout; + /*! EOT enable */ + bool m_eot; + /*! + Defines the EOS character. + Note! Defining an EOS byte does not cause the driver to + automatically send that byte at the end of write I/O + operations. The application is responsible for placing the + EOS byte at the end of the data strings that it defines. + (National Instruments NI-488.2M Function Reference Manual) + */ + unsigned char m_eosChar; + /*! + Set the EOS mode (handling).m_eosMode may be a combination + of bits ORed together. The following bits can be used: + 0x04: Terminate read when EOS is detected. + 0x08: Set EOI (End or identify line) with EOS on write function + 0x10: Compare all 8 bits of EOS byte rather than low 7 bits + (all read and write functions). + */ + unsigned char m_eosMode; + /*! buffer for internal use */ + char m_buf[32]; + /*! to avoid memory leak warnings generated by swig */ + ~Gpib_DCS() {}; + /*! + \brief the constructor initiate the device control struct with + the common useful values and set the internal timeout for the + GPIB controller to 1ms to avoid (or better reduce) blocking + */ + Gpib_DCS() { + /*! set default device address to 1 */ + m_address1 = 1; + m_address2 = 0; + /*! + set the timeout to a short value to avoid blocking + (default are 1msec) + */ + m_timeout = GpibTimeout1ms; + m_eot = true; + /*! EOS character, see above! */ + m_eosChar = 0;//'\n'; + /*! EOS mode, see above! */ + m_eosMode = 0; + }; + /*! + \brief returns the internal parameters in a more human readable + string format like 'Adr: (1,0) to:1ms'. + \return the settings as a null terminated string + */ + char* GetSettings(); + }; + +/*! + \enum GpibIoctls + + The following Ioctl calls are only valid for the GpibDevice class. +*/ + enum GpibIoctls { + /*! + Set the adress of the via gpib connected device. + */ + CTB_GPIB_SETADR = CTB_GPIB, + /*! + Get the serial poll byte + */ + CTB_GPIB_GETRSP, + /*! + Get the GPIB status + */ + CTB_GPIB_GETSTA, + /*! + Get the last GPIB error number + */ + CTB_GPIB_GETERR, + /*! + Get the GPIB line status (hardware control lines) as an + integer. The lowest 8 bits correspond to the current state + of the lines. + */ + CTB_GPIB_GETLINES, + /*! + Set the GPIB specific timeout + */ + CTB_GPIB_SETTIMEOUT, + /*! + Forces the specified device to go to local program mode + */ + CTB_GPIB_GTL, + /*! + This routine can only be used if the specified GPIB + Interface Board is the System Controller. + Remember that even though the REN line is asserted, + the device(s) will not be put into remote state until is + addressed to listen by the Active Controller + */ + CTB_GPIB_REN, + /*! + The command asserts the GPIB interface clear (IFC) line for + ast least 100us if the GPIB board is the system controller. + This initializes the GPIB and makes the interface CIC and + active controller with ATN asserted. + Note! The IFC signal resets only the GPIB interface functions + of the bus devices and not the internal device functions. + For a device reset you should use the CTB_RESET command above. + */ + CTB_GPIB_RESET_BUS, + /*! + Configure the end-of-string (EOS) termination character. + Note! Defining an EOS byte does not cause the driver to + automatically send that byte at the end of write I/O + operations. The application is responsible for placing the + EOS byte at the end of the data strings that it defines. + (National Instruments NI-488.2M Function Reference Manual) + */ + CTB_GPIB_SET_EOS_CHAR, + /*! + Get the internal EOS termination character (see above). + */ + CTB_GPIB_GET_EOS_CHAR, + /*! + Set the EOS mode (handling).m_eosMode may be a combination + of bits ORed together. The following bits can be used: + 0x04: Terminate read when EOS is detected. + 0x08: Set EOI (End or identify line) with EOS on write function + 0x10: Compare all 8 bits of EOS byte rather than low 7 bits + (all read and write functions). + */ + CTB_GPIB_SET_EOS_MODE, + /*! + Get the internal EOS mode (see above). + */ + CTB_GPIB_GET_EOS_MODE, + }; + +/*! + \class GpibDevice + GpibDevice is the basic class for communication via the GPIB bus. +*/ + class GpibDevice : public IOBase + { + protected: + /*! + \brief + the internal board identifier, 0 for the first gpib controller, + 1 for the second one + */ + int m_board; + /*! + \brief + the file descriptor of the connected gpib device + */ + int m_hd; + /*! + \brief + contains the internal conditions of the GPIB communication like + GPIB error, timeout and so on... + */ + int m_state; + /*! the internal GPIB error number */ + int m_error; + /*! the count of data read or written */ + int m_count; + /*! + \brief contains the internal settings of the GPIB connection like + address, timeout, end of string character and so one... + */ + Gpib_DCS m_dcs; + int CloseDevice(); + /*! + \brief returns a short notation or more detail description of + the given GPIB error number. + \param error the occured GPIB error + \param detailed true for a more detailed description, false + otherwise + \return a null terminated string with the short or detailed + error message. + */ + virtual const char* GetErrorString(int error,bool detailed); + /*! + Open the interface (internally to request a file descriptor for the + given interface). The second parameter is a undefined pointer of a + Gpib_DCS data struct. + \param devname the name of the GPIB device, GPIB1 means the first + GPIB controller, GPIB2 the second (if available). + \param dcs untyped pointer of advanced device parameters, + \sa struct Gpib_DCS (data struct for the gpib device) + \return zero on success, otherwise -1 + */ + int OpenDevice(const char* devname, void* dcs); + public: + GpibDevice() { + m_board = -1; + m_hd = -1; + m_state = m_count = m_error = 0; + }; + virtual ~GpibDevice() {Close();}; + /*! + \brief returns the name of the class instance. You find this useful, + if you handle different devices like a serial port or a gpib device + via a IOBase pointer. + \return name of the class. + */ + const char* ClassName() {return "ctb::GpibDevice";}; + /*! + \brief returns a more detail description of the given error + number. + \param error the occured error number + \return null terminated string with the error description + */ + virtual const char* GetErrorDescription(int error) { + return GetErrorString(error,true); + }; + /*! + \brief returns a short notation like 'EABO' of the given error + number. + \param error the occured error number + \return null terminated string with the short error notation + */ + virtual const char* GetErrorNotation(int error) { + return GetErrorString(error,false); + }; + /*! + \brief request the current settings of the connected gpib device + as a null terminated string. + \return the settings as a string like 'Adr: (1,0) to:1ms' + */ + virtual char* GetSettingsAsString() { + return m_dcs.GetSettings(); + }; + /// This is only for internal usage + int Ibrd(char* buf,size_t len); + /// This is only for internal usage + int Ibwrt(char* buf,size_t len); + /*! + \brief Many operating characteristics are only possible for + special devices. To avoid the need of a lot of different functions + and to give the user a uniform interface, all this special + operating instructions will covered by one Ioctl methode (like + the linux ioctl call). + The Ioctl command (cmd) has encoded in it whether the argument + is an in parameter or out parameter, and the size of the + argument args in bytes. Macros and defines used in specifying an + ioctl request are located in iobase.h and the header file for + the derivated device (for example in gpib.h). + \param cmd one of GpibIoctls specify the ioctl request. + \param args is a typeless pointer to a memory location, where + Ioctl reads the request arguments or write the results. + Please note, that an invalid memory location or size involving + a buffer overflow or segmention fault! + */ + virtual int Ioctl(int cmd,void* args); + /*! + Returns the current state of the device. + \return 1 if device is valid and open, otherwise 0 + */ + int IsOpen() { + return m_hd >= 0; + }; + + /*! + \brief Opens a GPIB device in a user likely way. Insteed of + using the Device Control Struct just input your parameter in a + more intuitive manner. + \param devname the name of the GPIB controler like GPIB1 or GPIB2 + \param address the address of the connected device (1...31) + \return the new file descriptor, or -1 if an error occurred + */ + int Open( const char* devname, int address ); + + // Open overrides and hides the IOBase::Open( const char* + // devname, void* dcs ) of the base class! So bring it into scope + // again! + using IOBase::Open; + + int Read(char* buf,size_t len); + + int Write(char* buf,size_t len); + + /*! + \brief FindListener returns all listening devices connected to + the GPIB bus of the given board. + This function is not member of the GPIB class, becauce it + should do it's job before you open any GPIB connection. + \param board the board nummber. Default is the first board (=0). + Valid board numbers are 0 and 1. + \return -1 if an error occurred, otherwise a setting bit for + each listener address. Bit0 is always 0 (address 0 isn't valid, + Bit1 means address 1, Bit2 address 2 and so on... + */ + static int FindListeners(int board = 0); + }; + +} // namespace ctb + +#endif diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/iobase.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/iobase.h new file mode 100644 index 0000000000..eda03b314f --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/iobase.h @@ -0,0 +1,294 @@ +#ifndef LIBCTB_IOBASE_H_INCLUDED_ +#define LIBCTB_IOBASE_H_INCLUDED_ + +///////////////////////////////////////////////////////////////////////////// +// Name: iobase.h +// Purpose: io basic class +// Author: Joachim Buermann +// Copyright: (c) 2010 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "ctb-0.16/fifo.h" +#include + +/** + \file iobase.h +*/ + +namespace ctb { + + enum { + + CTB_COMMON = 0x0000, + CTB_SERIAL = 0x0100, + CTB_GPIB = 0x0200, + CTB_TIMEOUT_INFINITY = 0xFFFFFFFF + }; + +// const unsigned int wxTIMEOUT_INFINITY = 0xFFFFFFFF; + +/*! + \enum IOBaseIoctls + + Defines the ioctl calls for derivated classes. The following Ioctl + calls are valid for all from wxIOBase derivated classes. +*/ + enum IOBaseIoctls { + /*! + Reset the connected device. For a serial (RS232) connection, + a break is send. For GPIB the IFC (Interface Clear) line is + set. + */ + CTB_RESET = CTB_COMMON + }; + +/*! + \class IOBase + An abstract class for different interfaces. The idea behind this: + Similar to the virtual file system this class defines a lot of + preset member functions, which the derivate classes must be + overload. + In the main thing these are: open a interface (such as RS232), + reading and writing non blocked through the interface and at + last, close it. + For special interface settings the method ioctl was defined. + (control interface). ioctl covers some interface dependent + settings like switch on/off the RS232 status lines and must also + be defined from each derivated class. +*/ + + class IOBase + { + protected: + /*! + \brief internal fifo (first in, first out queue) to put back + already readed bytes into the reading stream. After put back a single + byte or sequence of characters, you can read them again with the + next Read call. + */ + Fifo* m_fifo; + enum { + /// fifosize of the putback fifo + fifoSize = 256 + }; + /*! + Close the interface (internally the file descriptor, which was + connected with the interface). + \return zero on success, otherwise -1. + */ + virtual int CloseDevice() = 0; + /*! + Open the interface (internally to request a file descriptor for the + given interface). The second parameter is a undefined pointer of a + device dependent data struct. It must be undefined, because different + devices have different settings. A serial device like the com ports + points here to a data struct, includes information like baudrate, + parity, count of stopbits and wordlen and so on. Another devices + (for example a IEEE) needs a adress and EOS (end of string character) + and don't use baudrate or parity. + \param devname the name of the device, presents the given interface. + Under windows for example COM1, under Linux /dev/cua0. Use wxCOMn to + avoid plattform depended code (n is the serial port number, beginning + with 1). + \param dcs untyped pointer of advanced device parameters, + \sa struct dcs_devCUA (data struct for the serail com ports) + \return zero on success, otherwise -1 + */ + virtual int OpenDevice(const char* devname, void* dcs = 0L) = 0; + public: + /*! + Default constructor + */ + IOBase() { + m_fifo = new Fifo(fifoSize); + }; + + /*! + Default destructor + */ + virtual ~IOBase() { + delete m_fifo; + }; + /*! + \brief A little helper function to detect the class name + \return the name of the class + */ + virtual const char* ClassName() {return "ctb::IOBase";}; + /*! + Closed the interface. Internally it calls the CloseDevice() + method, which must be defined in the derivated class. + \return zero on success, or -1 if an error occurred. + */ + int Close() {return CloseDevice();}; + + /*! + In this method we can do all things, which are different + between the discrete interfaces. The method is similar to the + C ioctl function. We take a command number and a integer + pointer as command parameter. + An example for this is the reset of a connection between a PC + and one ore more other instruments. On serial (RS232) connections + mostly a break will be send, GPIB on the other hand defines a + special line on the GPIB bus, to reset all connected devices. + If you only want to reset your connection, you should use the + Ioctl methode for doing this, independent of the real type of + the connection. + \param cmd a command identifier, (under Posix such as TIOCMBIS + for RS232 interfaces), IOBaseIoctls + \param args typeless parameter pointer for the command above. + \return zero on success, or -1 if an error occurred. + */ + virtual int Ioctl(int cmd,void* args) {return -1;}; + + /*! + Returns the current state of the device. + \return 1 if device is valid and open, otherwise 0 + */ + virtual int IsOpen() = 0; + + /*! + \param devname name of the interface, we want to open + \param dcs a untyped pointer to a device control struct. If + he is NULL, the default device parameter will be used. + \return the new file descriptor, or -1 if an error occurred + + The pointer dcs will be used for special device dependent + settings. Because this is very specific, the struct or + destination of the pointer will be defined by every device + itself. (For example: a serial device class should refer + things like parity, word length and count of stop bits, + a IEEE class adress and EOS character). + */ + int Open(const char* devname,void* dcs=0L) { + return OpenDevice(devname,dcs); + }; + + /*! + \brief In some circumstances you want to put back a already + readed byte (for instance, you have overreaded it and like to + parse the recieving bytes again). + The internal fifo stores fifoSize characters until you + have to read again. + \param ch the character to put back in the input stream + \return 1, if successful, otherwise 0 + */ + int PutBack(char ch) { + return m_fifo->put(ch); + }; + + /*! + Read attempt to read len bytes from the interface into the buffer + starting with buf. Read never blocks. If there are no bytes for + reading, Read returns zero otherwise the count of bytes been readed. + \param buf starting adress of the buffer + \param len count of bytes, we want to read + \return -1 on fails, otherwise the count of readed bytes + */ + virtual int Read(char* buf,size_t len) = 0; + + /*! + \brief + ReadUntilEos read bytes from the interface until the EOS string + was received or a timeout occurs. + ReadUntilEos returns the count of bytes been readed. The received + bytes are stored on the heap point by the readbuf pointer and + must delete by the caller. + \param readbuf points to the start of the readed bytes. You must + delete them, also if you received no byte. + \param readedBytes A pointer to the variable that receives the number + of bytes read. + \param eosString is the null terminated end of string sequence. + Default is the linefeed character. + \param timeout_in_ms the function returns after this time, also + if no eos occured (default is 1s). + \param quota defines a character between those an EOS doesn't + terminate the string + \return 1 on sucess (the operation ends successfull without a timeout), + 0 if a timeout occurred and -1 otherwise + */ + virtual int ReadUntilEOS(char*& readbuf, + size_t* readedBytes, + char* eosString = "\n", + long timeout_in_ms = 1000L, + char quota = 0); + + /*! + \brief + readv() attempts to read up to len bytes from the interface + into the buffer starting at buf. + readv() is blocked till len bytes are readed or the given + timeout in milliseconds was reached. + \param buf starting address of the buffer + \param len count bytes, we want to read + \param timeout_in_ms in milliseconds. If you don't want any timeout, + you give the wxTIMEOUT_INFINITY here. + But think of it: In this case, this function never returns + if there a not enough bytes to read. + \return the number of data bytes successfully read + */ + int Readv(char* buf,size_t len,unsigned int timeout_in_ms); + + /*! + \brief + readv() attempts to read up to len bytes from the interface + into the buffer starting at buf. + readv() is blocked till len bytes are readed or the timeout_flag + points on a int greater then zero. + \param buf starting adress of the buffer + \param len count bytes, we want to read + \param timeout_flag a pointer to an integer. If you don't want + any timeout, you given a null pointer here. + But think of it: In this case, this function comes never + back, if there a not enough bytes to read. + \param nice if true go to sleep for one ms (reduce CPU last), + if there is no byte available (default is false) + */ + int Readv(char* buf,size_t len,int* timeout_flag,bool nice=false); + + /*! + Write writes up to len bytes from the buffer starting with buf + into the interface. + \param buf start adress of the buffer + \param len count of bytes, we want to write + \return on success, the number of bytes written are returned + (zero indicates nothing was written). On error, -1 is returned. + */ + virtual int Write(char* buf,size_t len) = 0; + + /*! + Writev() writes up to len bytes to the interface from the buffer, + starting at buf. + Also Writev() blocks till all bytes are written or the given + timeout in milliseconds was reached. + \param buf starting address of the buffer + \param len count bytes, we want to write + \param timeout_in_ms timeout in milliseconds. If you give + wxTIMEOUT_INFINITY here, the function blocks, till all data was + written. + \return the number of data bytes successfully written. + */ + int Writev(char* buf,size_t len,unsigned int timeout_in_ms); + + /*! + Writev() writes up to len bytes to the interface from the buffer, + starting at buf. + Also Writev() blocks till all bytes are written or the timeout_flag + points to an integer greater then zero. + \param buf starting adress of the buffer + \param len count bytes, we want to write + \param timeout_flag a pointer to an integer. You also can give a null + pointer here. This blocks, til all data is writen. + \param nice if true go to sleep for one ms (reduce CPU last), + if there is no byte available (default is false) + */ + int Writev(char* buf,size_t len,int* timeout_flag,bool nice = false); + + }; + +} // namespace ctb + +#endif + + + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/kbhit.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/kbhit.h new file mode 100644 index 0000000000..2a0545439c --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/kbhit.h @@ -0,0 +1,10 @@ +#ifndef LIBCTB_KBHIT_H_INCLUDED_ +#define LIBCTB_KBHIT_H_INCLUDED_ + +namespace ctb { + + char GetKey(); + +} // namespace ctb + +#endif diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/linux/serport.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/linux/serport.h new file mode 100644 index 0000000000..d88528bd25 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/linux/serport.h @@ -0,0 +1,94 @@ +#ifndef LIBCTB_LINUX_SERPORT_H_INCLUDED_ +#define LIBCTB_LINUX_SERPORT_H_INCLUDED_ + +///////////////////////////////////////////////////////////////////////////// +// Name: linux/serport.h +// Purpose: +// Author: Joachim Buermann +// Copyright: (c) 2010 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "ctb-0.16/serportx.h" +#include +#include + +namespace ctb { + +/*! + \class SerialPort + + \brief the linux version +*/ + class SerialPort : public SerialPort_x + { + protected: + /*! + \brief under Linux, the serial ports are normal file descriptor + */ + int fd; + /*! + \brief Linux defines this struct termios for controling asynchronous + communication. t covered the active settings, save_t the original + settings. + */ + struct termios t, save_t; + + /*! + \brief The Linux serial driver summing all breaks, framings, overruns + and parity errors for each port during system runtime. Because we only + need the errors during a active connection, we must save the actual + error numbers in this separate structurs. + */ + struct serial_icounter_struct save_info, last_info; + + /*! + \brief adaptor member function, to convert the plattform independent + type wxBaud into a linux conform value. + \param baud the baudrate as wxBaud type + \return speed_t linux specific data type, defined in termios.h + */ + speed_t AdaptBaudrate( int baud ); + + int CloseDevice(); + int OpenDevice(const char* devname, void* dcs); + + /*! + \brief internal member function to set an unusal (non-standard) + baudrate. Called by SetBaudrate. + */ + int SetBaudrateAny( int baudrate ); + + /*! + \brief internal member function to set a standard baudrate. + Called by SetBaudrate. + */ + int SetBaudrateStandard( int baudrate ); + + public: + SerialPort(); + + ~SerialPort(); + + int ChangeLineState( SerialLineState flags ); + + int ClrLineState( SerialLineState flags ); + + int GetLineState(); + int Ioctl(int cmd,void* args); + int IsOpen(); + int Read(char* buf,size_t len); + int SendBreak(int duration); + + int SetBaudrate( int baudrate ); + + int SetParityBit( bool parity ); + + int SetLineState( SerialLineState flags ); + + int Write(char* buf,size_t len); + }; + +} // namespace ctb + +#endif diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/linux/timer.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/linux/timer.h new file mode 100644 index 0000000000..7cc1a51e01 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/linux/timer.h @@ -0,0 +1,139 @@ +#ifndef LIBCTB_LINUX_TIMER_H_INCLUDED_ +#define LIBCTB_LINUX_TIMER_H_INCLUDED_ + +///////////////////////////////////////////////////////////////////////////// +// Name: linux/timer.h +// Purpose: +// Author: Joachim Buermann +// Id: $Id: timer.h,v 1.1.1.1 2004/11/24 10:30:11 jb Exp $ +// Copyright: (c) 2001 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/** + \file timer.h +*/ + +#include + +namespace ctb { + +/*! + \brief A data struct, using from class timer. +*/ + struct timer_control + { + /*! + under linux, we used usec internally + */ + unsigned int usecs; + /*! + covers the adress of the exitflag + */ + int *exitflag; + /*! + covers the adress of the exit function. NULL, if + there was no exit function. + */ + void* (*exitfnc)(void*); + }; + +/*! + \class Timer + \brief A thread based timer class for handling timeouts in + an easier way. + + On starting every timer instance will create it's own thread. + The thread makes simply nothing, until it's given time is over. + After that, he set a variable, refer by it's adress to one + and exit. + + There are a lot of situations, which the timer class must handle. + The timer instance leaves his valid range (for example, the + timer instance is local inside a function, and the function fished) + BEFORE the thread was ending. In this case, the destructor must + terminate the thread in a correct way. (This is very different + between the OS. threads are a system resource like file descriptors + and must be deallocated after using it). + + The thread should be asynchronously stopped. Means, under all + circumstance, it must be possible, to finish the timer and start + it again. + + Several timer instance can be used simultanously. +*/ + class Timer + { + protected: + /*! + control covers the time interval, the adress + of the exitflag, and if not null, a function, which will + be called on the end. + */ + timer_control control; + /*! + stopped will be set by calling the stop() method. + Internaly the timer thread steadily tests the state of + this variable. If stopped not zero, the thread will be + finished. + */ + int stopped; + /*! + under linux we use the pthread library. tid covers the + identifier for a separate threads. + */ + pthread_t tid; + /*! + here we store the time interval, whilst the timer run. + This is waste!!! + */ + unsigned int timer_secs; + + public: + /*! + The constructor creates an timer object with the given + properties. The timer at this moment is not started. This + will be done with the start() member function. + \param msec time interval after that the the variable + pointed by exitflag is setting to one. + \param exitflag the adress of an integer, which was set + to one after the given time interval. + \warning The integer variable shouldn't leave it's valid + range, before the timer was finished. So never take a + local variable. + \param exitfnc A function, which was called after msec. + If you don't want this, refer a NULL pointer. + */ + Timer(unsigned int msec,int* exitflag,void*(*exitfnc)(void*)); + /*! + the destructor. If his was called (for example by leaving the + valid range of the timer object), the timer thread automaticaly + will finished. The exitflag wouldn't be set, also the exitfnc + wouldn't be called. + */ + ~Timer(); + /*! + starts the timer. But now a thread will created and started. + After this, the timer thread will be running until he was stopped + by calling stop() or reached his given time interval. + */ + int start(); + /*! + stops the timer and canceled the timer thread. After timer::stop() a new + start() will started the timer from beginning. + */ + int stop(); + }; + +/*! + \brief sleepms + A plattform independent function, to go to sleep for the given + time interval. + \param ms time interval in milli seconds +*/ + void sleepms(unsigned int ms); + +} // namespace ctb + +#endif + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/portscan.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/portscan.h new file mode 100644 index 0000000000..92c4ba11d6 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/portscan.h @@ -0,0 +1,25 @@ +#ifndef LIBCTB_PORTSCAN_H_INCLUDED_ +#define LIBCTB_PORTSCAN_H_INCLUDED_ + +#include +#include + +/** + \file portscan.h +*/ + +namespace ctb { + + /*! + \brief returns all available COM ports as an array of strings. + \param result stores the available COM ports + \param checkInUse return only ports which are available AND + unused (default) + \return true if successful, false otherwise + */ + bool GetAvailablePorts( std::vector& result, + bool checkInUse = true ); + +} // namespace ctb + +#endif diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/serport.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/serport.h new file mode 100644 index 0000000000..9488753d4b --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/serport.h @@ -0,0 +1,20 @@ +#ifndef LIBCTB_SERPORT_H_INCLUDED_ +#define LIBCTB_SERPORT_H_INCLUDED_ + +///////////////////////////////////////////////////////////////////////////// +// Name: serport.h +// Purpose: simple wrapper file +// Author: Joachim Buermann +// Copyright: (c) 2010 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#if defined (WIN32) +# include "ctb-0.16/win32/serport.h" +#else +# include "ctb-0.16/linux/serport.h" +#endif + +#endif +// __SERPORT_BASE_H + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/serportx.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/serportx.h new file mode 100644 index 0000000000..aa55c4ec59 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/serportx.h @@ -0,0 +1,451 @@ +#ifndef LIBCTB_SERPORTX_H_INCLUDED_ +#define LIBCTB_SERPORTX_H_INCLUDED_ + +///////////////////////////////////////////////////////////////////////////// +// Name: serportx.h +// Purpose: +// Author: Joachim Buermann +// Copyright: (c) 2010 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include +#include +#include "ctb-0.16/iobase.h" + +#if defined (WIN32) +# define snprintf _snprintf +#endif + +/** + \file serportx.h +*/ + +/*! + \def SERIALPORT_NAME_LEN + defines the maximum length of the os depending serial port names +*/ +#define SERIALPORT_NAME_LEN 32 + +namespace ctb { + + /*! specifices the first serial port */ + extern const char* COM1; + /*! specifies the second serial port */ + extern const char* COM2; + /*! specifies the third serial port */ + extern const char* COM3; + /*! specifies the fourth serial port */ + extern const char* COM4; + /*! specifies the fifth serial port */ + extern const char* COM5; + /*! specifies the sixth serial port */ + extern const char* COM6; + /*! specifies the seventh serial port */ + extern const char* COM7; + /*! specifies the eighth serial port */ + extern const char* COM8; + /*! specifies the ninth serial port */ + extern const char* COM9; + /*! specifies the tenth serial port */ + extern const char* COM10; + /*! specifies the eleventh serial port */ + extern const char* COM11; + /*! specifies the twelfth serial port */ + extern const char* COM12; + /*! specifies the thriteenth serial port */ + extern const char* COM13; + /*! specifies the fourteenth serial port */ + extern const char* COM14; + /*! specifies the fiveteenth serial port */ + extern const char* COM15; + /*! specifies the sixteenth serial port */ + extern const char* COM16; + /*! specifies the seventeenth serial port */ + extern const char* COM17; + /*! specifies the eighteenth serial port */ + extern const char* COM18; + /*! specifies the nineteenth serial port */ + extern const char* COM19; + /*! specifies the twentieth serial port */ + extern const char* COM20; + + /*! + \enum Parity + + \brief Defines the different modes of parity checking. Under + Linux, the struct termios will be set to provide the wanted + behaviour. + */ + enum Parity + { + /*! no parity check */ + ParityNone, + /*! odd parity check */ + ParityOdd, + /*! even parity check */ + ParityEven, + /*! mark (not implemented yet) */ + ParityMark, + /*! space (not implemented yet) */ + ParitySpace + }; + + /*! + \enum SerialLineState + + Defines the different modem control lines. The value for + each item are defined in /usr/include/bits/ioctl-types.h. + This is the linux definition. The window version translate + each item in it's own value. + modem lines defined in ioctl-types.h + \code + #define TIOCM_LE 0x001 + #define TIOCM_DTR 0x002 + #define TIOCM_RTS 0x004 + #define TIOCM_ST 0x008 + #define TIOCM_SR 0x010 + #define TIOCM_CTS 0x020 + #define TIOCM_CAR 0x040 + #define TIOCM_RNG 0x080 + #define TIOCM_DSR 0x100 + #define TIOCM_CD TIOCM_CAR + #define TIOCM_RI TIOCM_RNG + \endcode + */ + enum SerialLineState + { + /*! Data Carrier Detect (read only) */ + LinestateDcd = 0x040, + /*! Clear To Send (read only) */ + LinestateCts = 0x020, + /*! Data Set Ready (read only) */ + LinestateDsr = 0x100, + /*! Data Terminal Ready (write only) */ + LinestateDtr = 0x002, + /*! Ring Detect (read only) */ + LinestateRing = 0x080, + /*! Request To Send (write only) */ + LinestateRts = 0x004, + /*! no active line state, use this for clear */ + LinestateNull = 0x000 + }; + + /*! + \struct SerialPort_DCS + + The device control struct for the serial communication class. + This struct should be used, if you refer advanced parameter. + */ + struct SerialPort_DCS + { + /*! the baudrate */ + int baud; + /*! the parity */ + Parity parity; + /*! the wordlen */ + unsigned char wordlen; + /*! count of stopbits */ + unsigned char stopbits; + /*! rtscts flow control */ + bool rtscts; + /*! XON/XOFF flow control */ + bool xonxoff; + /*! buffer for internal use */ + char buf[16]; + SerialPort_DCS() { + baud = 38400; + parity = ParityNone; + wordlen = 8; + stopbits = 1; + rtscts = false; + xonxoff = false; + }; + // to avoid memory leak warnings generated by swig + ~SerialPort_DCS() {}; + /*! + \brief returns the internal settings of the DCS as a human + readable string like '8N1 115200'. + \return the internal settings as null terminated string + */ + char* GetSettings() { + const char ac[5] = {'N','O','E','M','S'}; + memset(buf,0,sizeof(buf)); + snprintf(buf,sizeof(buf)-1,"%i%c%i %i", + wordlen, + ac[parity], + stopbits, + baud); + return buf; + }; + }; + +/*! + \struct SerialPort_EINFO + + The internal communication error struct. It contains the number + of each error (break, framing, overrun and parity) since opening + the serial port. Each error number will be cleared if the open + methode was called. +*/ + struct SerialPort_EINFO + { + /*! number of breaks */ + int brk; + /*! number of framing errors */ + int frame; + /*! number of overrun errors */ + int overrun; + /*! number of parity errors */ + int parity; + SerialPort_EINFO() { + brk = frame = overrun = parity = 0; + }; + ~SerialPort_EINFO() {}; + }; + + /*! + \enum SerialPortIoctls + + The following Ioctl calls are only valid for the SerialPort + class. + */ + enum SerialPortIoctls { + /*! + Get all numbers of occured communication errors (breaks + framing, overrun and parity), so the args parameter of + the Ioctl call must pointed to a SerialPort_EINFO + struct. + */ + CTB_SER_GETEINFO = CTB_SERIAL, + /*! + Get integer 1, if a break occured since the last call + so the args parameter of the Ioctl methode must pointed + to an integer value. If there was no break, the result + is integer 0. + */ + CTB_SER_GETBRK, + /*! + Get integer 1, if a framing occured since the last call + so the args parameter of the Ioctl methode must pointed + to an integer value. If there was no break, the result + is integer 0. + */ + CTB_SER_GETFRM, + /*! + Get integer 1, if a overrun occured since the last call + so the args parameter of the Ioctl methode must pointed + to an integer value. If there was no break, the result + is integer 0. + */ + CTB_SER_GETOVR, + /*! + Get integer 1, if a parity occured since the last call + so the args parameter of the Ioctl methode must pointed + to an integer value. If there was no break, the result + is integer 0. + */ + CTB_SER_GETPAR, + /*! + Get the number of bytes received by the serial port driver + but not yet read by a Read or Readv Operation. + */ + CTB_SER_GETINQUE, + /*! + Set the parity bit on or off to use it as a ninth bit. + */ + CTB_SER_SETPAR + }; + +/*! + \class SerialPort_x + SerialPort_x is the basic class for serial communication via + the serial comports. It is also an abstract class and defines + all necessary methods, which the derivated plattform depended + classes must be invoke. +*/ + class SerialPort_x : public IOBase + { + protected: + /*! + \brief contains the internal settings of the serial port like + baudrate, protocol, wordlen and so on. + */ + SerialPort_DCS m_dcs; + /*! + \brief contains the internal (os specific) name of the serial + device. + */ + char m_devname[SERIALPORT_NAME_LEN]; + public: + + /*! + \enum FlowControl + \brief Specifies the flow control. + + + */ + enum FlowControl + { + NoFlowControl, /*!< No flow control at all */ + + RtsCtsFlowControl, /*!< Enable RTS/CTS hardware flow control */ + + XonXoffFlowControl /*!< Enable XON/XOFF protocol */ + }; + + SerialPort_x() {m_devname[0] = '\0';}; + virtual ~SerialPort_x() {}; + /*! + \brief returns the name of the class instance. You find this useful, + if you handle different devices like a serial port or a gpib device + via a IOBase pointer. + \return name of the class. + */ + const char* ClassName() {return "ctb::SerialPort";}; + + /*! + \brief change the linestates according to which bits + are set/unset in flags. + \param flags valid line flags are SERIAL_LINESTATE_DSR and/or + SERIAL_LINESTATE_RTS + \return zero on success, -1 if an error occurs + */ + virtual int ChangeLineState( SerialLineState flags ) = 0; + + /*! + \brief turn off status lines depending upon which bits (DSR and/or RTS) + are set in flags. + \param flags valid line flags are SERIAL_LINESTATE_DSR and/or + SERIAL_LINESTATE_RTS + \return zero on success, -1 if an error occurs + */ + virtual int ClrLineState( SerialLineState flags ) = 0; + + /*! + \brief Read the line states of DCD, CTS, DSR and RING + \return returns the appropriate bits on sucess, otherwise -1 + */ + virtual int GetLineState() = 0; + + /*! + \brief request the current settings of the connected serial port + as a null terminated string. + \return the settings as a string like '8N1 115200' + */ + virtual char* GetSettingsAsString() { + return m_dcs.GetSettings(); + }; + + /*! + \brief Many operating characteristics are only possible for + special devices. To avoid the need of a lot of different functions + and to give the user a uniform interface, all this special + operating instructions will covered by one Ioctl methode (like + the linux ioctl call). + The Ioctl command (cmd) has encoded in it whether the argument + is an in parameter or out parameter, and the size of the + argument args in bytes. Macros and defines used in specifying an + ioctl request are located in iobase.h and the header file for + the derivated device (for example in serportx.h). + \param cmd one of SerialPortIoctls specify the ioctl request. + \param args is a typeless pointer to a memory location, where + Ioctl reads the request arguments or write the results. + Please note, that an invalid memory location or size involving + a buffer overflow or segmention fault! + */ + virtual int Ioctl(int cmd,void* args) {return -1;}; + + /*! + \brief Opens a serial port in a user likely way. Insteed of + using the Device Control Struct just input your parameter in a + more intuitive manner. + \param portname the name of the serial port + \param baudrate any baudrate, also an unusual one, if your + serial device support them + \param protocol a string with the number of databits (5...8), + the parity setting (N=None,O=Odd,E=Even,M=Mark,S=Space), also + in lower case, and the count of stopbits (1...2) + \param flowControl one of NoFlowControl, RtsCtsFlowControl or + XonXoffFlowControl. + \return the new file descriptor, or -1 if an error occurred + */ + int Open( const char* portname, int baudrate, + const char* protocol = "8N1", + FlowControl flowControl = NoFlowControl ); + + /*! + \brief Opens the serial port with the given number. + \note The port numbering starts with 1 (COM1 for windows and + /dev/ttyS0 for Linux. Please note, that USB to RS232 converter + in Linux are named as /dev/ttyUSBx and from there have to + opened with their device name! + \param number of the serial port count from 1 + \param baudrate any baudrate, also an unusual one, if your + serial device support them + \param protocol a string with the number of databits (5...8), + the parity setting (N=None,O=Odd,E=Even,M=Mark,S=Space), also + in lower case, and the count of stopbits (1...2) + \param flowControl one of NoFlowControl, RtsCtsFlowControl or + XonXoffFlowControl. + \return the new file descriptor, or -1 if an error occurred + */ + int Open( const int portnumber, int baudrate, + const char* protocol = "8N1", + FlowControl flowControl = NoFlowControl ); + + // Open overrides and hides the IOBase::Open( const char* + // devname, void* dcs ) of the base class! So bring it into scope + // again! + using IOBase::Open; + + /*! + \brief Sendbreak transmits a continuous stream of zero-valued + bits for a specific duration. + \param duration If duration is zero, it transmits + zero-valued bits for at least 0.25 seconds, and not more that + 0.5 seconds. If duration is not zero, it sends zero-valued bits + for duration*N seconds, where N is at least 0.25, and not more + than 0.5. + \return zero on success, -1 if an error occurs. + */ + virtual int SendBreak(int duration) = 0; + + /*! + \brief Set the baudrate (also non-standard) + Please note: Non-standard baudrates like 70000 are not supported + by each UART and depends on the RS232 chipset you apply. + \param baudrate the new baudrate + \return zero on success, -1 if an error occurs + */ + virtual int SetBaudrate( int baudrate ) = 0; + + /*! + \brief turn on status lines depending upon which bits (DSR and/or RTS) + are set in flags. + \param flags valid line flags are SERIAL_LINESTATE_DSR and/or + SERIAL_LINESTATE_RTS + \return zero on success, -1 if an error occurs + */ + virtual int SetLineState( SerialLineState flags ) = 0; + + /*! + \brief Set the parity bit to a firm state, for instance to use + the parity bit as the ninth bit in a 9 bit dataword + communication. + \return zero on succes, a negative value if an error occurs + */ + virtual int SetParityBit( bool parity ) = 0; + + /*! + \brief check the given baudrate against a list of standard rates. + \ return true, if the baudrate is a standard value, false + otherwise + */ + static bool IsStandardRate( int rate ); + + }; + +} // namespace ctb + +#endif diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/timer.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/timer.h new file mode 100644 index 0000000000..b1313ebfef --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/timer.h @@ -0,0 +1,19 @@ +#ifndef LIBCTB_TIMER_H_INCLUDED_ +#define LIBCTB_TIMER_H_INCLUDED_ + +///////////////////////////////////////////////////////////////////////////// +// Name: timer.h +// Purpose: simple wrapper file +// Author: Joachim Buermann +// Copyright: (c) 2010 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#if defined (WIN32) +# include "win32/timer.h" +#else +# include "linux/timer.h" +#endif + +#endif + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/getopt.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/getopt.h new file mode 100644 index 0000000000..afa50d4567 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/getopt.h @@ -0,0 +1,17 @@ +#ifndef LIBCTB_WIN32_GETOPT_H_INCLUDED_ +#define LIBCTB_WIN32_GETOPT_H_INCLUDED_ + +///////////////////////////////////////////////////////////////////////////// +// Name: win32/getopt.h +// Purpose: +// Author: Joachim Buermann +// Copyright: (c) 2010 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +extern char* optarg; +extern int optind; + +int getopt(int argc, char* argv[], char* optstring); + +#endif diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/gpib-32.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/gpib-32.h new file mode 100644 index 0000000000..627b30acfa --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/gpib-32.h @@ -0,0 +1,414 @@ +/* + * + * + * Win32 include file + * for accessing the 32-bit GPIB DLL (gpib-32.dll) + * + * + * Contains user variables (ibsta, iberr, ibcnt, ibcntl), + * function prototypes and useful defined constants for + * calling NI-488 and NI-488.2 routines from a Microsoft + * C/C++ Win32 application. + * + * + * Copyright 1998 National Instruments Corporation + * + */ + +#ifndef DECL_32_H // ensure we are only included once +#define DECL_32_H + +#include "windows.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/***************************************************************************/ +/* HANDY CONSTANTS FOR USE BY APPLICATION PROGRAMS ... */ +/***************************************************************************/ +#define UNL 0x3f /* GPIB unlisten command */ +#define UNT 0x5f /* GPIB untalk command */ +#define GTL 0x01 /* GPIB go to local */ +#define SDC 0x04 /* GPIB selected device clear */ +#define PPC 0x05 /* GPIB parallel poll configure */ +#define GET 0x08 /* GPIB group execute trigger */ +#define TCT 0x09 /* GPIB take control */ +#define LLO 0x11 /* GPIB local lock out */ +#define DCL 0x14 /* GPIB device clear */ +#define PPU 0.16 /* GPIB parallel poll unconfigure */ +#define SPE 0x18 /* GPIB serial poll enable */ +#define SPD 0x19 /* GPIB serial poll disable */ +#define PPE 0x60 /* GPIB parallel poll enable */ +#define PPD 0x70 /* GPIB parallel poll disable */ + +/* GPIB status bit vector : */ +/* global variable ibsta and wait mask */ + +#define ERR (1<<15) /* Error detected */ +#define TIMO (1<<14) /* Timeout */ +#define END (1<<13) /* EOI or EOS detected */ +#define SRQI (1<<12) /* SRQ detected by CIC */ +#define RQS (1<<11) /* Device needs service */ +#define CMPL (1<<8) /* I/O completed */ +#define LOK (1<<7) /* Local lockout state */ +#define REM (1<<6) /* Remote state */ +#define CIC (1<<5) /* Controller-in-Charge */ +#define ATN (1<<4) /* Attention asserted */ +#define TACS (1<<3) /* Talker active */ +#define LACS (1<<2) /* Listener active */ +#define DTAS (1<<1) /* Device trigger state */ +#define DCAS (1<<0) /* Device clear state */ + +/* Error messages returned in global variable iberr */ + +#define EDVR 0 /* System error */ +#define ECIC 1 /* Function requires GPIB board to be CIC */ +#define ENOL 2 /* Write function detected no Listeners */ +#define EADR 3 /* Interface board not addressed correctly*/ +#define EARG 4 /* Invalid argument to function call */ +#define ESAC 5 /* Function requires GPIB board to be SAC */ +#define EABO 6 /* I/O operation aborted */ +#define ENEB 7 /* Non-existent interface board */ +#define EDMA 8 /* Error performing DMA */ +#define EOIP 10 /* I/O operation started before previous */ + /* operation completed */ +#define ECAP 11 /* No capability for intended operation */ +#define EFSO 12 /* File system operation error */ +#define EBUS 14 /* Command error during device call */ +#define ESTB 15 /* Serial poll status byte lost */ +#define ESRQ 16 /* SRQ remains asserted */ +#define ETAB 20 /* The return buffer is full. */ +#define ELCK 21 /* Address or board is locked. */ + +/* EOS mode bits */ + +#define BIN (1<<12) /* Eight bit compare */ +#define XEOS (1<<11) /* Send END with EOS byte */ +#define REOS (1<<10) /* Terminate read on EOS */ + +/* Timeout values and meanings */ + +#define TNONE 0 /* Infinite timeout (disabled) */ +#define T10us 1 /* Timeout of 10 us (ideal) */ +#define T30us 2 /* Timeout of 30 us (ideal) */ +#define T100us 3 /* Timeout of 100 us (ideal) */ +#define T300us 4 /* Timeout of 300 us (ideal) */ +#define T1ms 5 /* Timeout of 1 ms (ideal) */ +#define T3ms 6 /* Timeout of 3 ms (ideal) */ +#define T10ms 7 /* Timeout of 10 ms (ideal) */ +#define T30ms 8 /* Timeout of 30 ms (ideal) */ +#define T100ms 9 /* Timeout of 100 ms (ideal) */ +#define T300ms 10 /* Timeout of 300 ms (ideal) */ +#define T1s 11 /* Timeout of 1 s (ideal) */ +#define T3s 12 /* Timeout of 3 s (ideal) */ +#define T10s 13 /* Timeout of 10 s (ideal) */ +#define T30s 14 /* Timeout of 30 s (ideal) */ +#define T100s 15 /* Timeout of 100 s (ideal) */ +#define T300s 16 /* Timeout of 300 s (ideal) */ +#define T1000s 17 /* Timeout of 1000 s (ideal) */ + + +/* IBLN Constants */ +#define NO_SAD 0 +#define ALL_SAD -1 + + +/* The following constants are used for the second parameter of the + * ibconfig function. They are the "option" selection codes. + */ +#define IbcPAD 0x0001 /* Primary Address */ +#define IbcSAD 0x0002 /* Secondary Address */ +#define IbcTMO 0x0003 /* Timeout Value */ +#define IbcEOT 0x0004 /* Send EOI with last data byte? */ +#define IbcPPC 0x0005 /* Parallel Poll Configure */ +#define IbcREADDR 0x0006 /* Repeat Addressing */ +#define IbcAUTOPOLL 0x0007 /* Disable Auto Serial Polling */ +#define IbcCICPROT 0x0008 /* Use the CIC Protocol? */ +#define IbcIRQ 0x0009 /* Use PIO for I/O */ +#define IbcSC 0x000A /* Board is System Controller? */ +#define IbcSRE 0x000B /* Assert SRE on device calls? */ +#define IbcEOSrd 0x000C /* Terminate reads on EOS */ +#define IbcEOSwrt 0x000D /* Send EOI with EOS character */ +#define IbcEOScmp 0x000E /* Use 7 or 8-bit EOS compare */ +#define IbcEOSchar 0x000F /* The EOS character. */ +#define IbcPP2 0x0010 /* Use Parallel Poll Mode 2. */ +#define IbcTIMING 0x0011 /* NORMAL, HIGH, or VERY_HIGH timing. */ +#define IbcDMA 0x0012 /* Use DMA for I/O */ +#define IbcReadAdjust 0x0013 /* Swap bytes during an ibrd. */ +#define IbcWriteAdjust 0x014 /* Swap bytes during an ibwrt. */ +#define IbcSendLLO 0x0017 /* Enable/disable the sending of LLO. */ +#define IbcSPollTime 0x0018 /* Set the timeout value for serial polls. */ +#define IbcPPollTime 0x0019 /* Set the parallel poll length period. */ +#define IbcEndBitIsNormal 0x001A /* Remove EOS from END bit of IBSTA. */ +#define IbcUnAddr 0x001B /* Enable/disable device unaddressing. */ +#define IbcSignalNumber 0x001C /* Set UNIX signal number - unsupported */ +#define IbcBlockIfLocked 0x001D /* Enable/disable blocking for locked boards/devices */ +#define IbcHSCableLength 0x001F /* Length of cable specified for high speed timing.*/ +#define IbcIst 0x0020 /* Set the IST bit. */ +#define IbcRsv 0x0021 /* Set the RSV byte. */ + +/* + * Constants that can be used (in addition to the ibconfig constants) + * when calling the ibask() function. + */ + +#define IbaPAD IbcPAD +#define IbaSAD IbcSAD +#define IbaTMO IbcTMO +#define IbaEOT IbcEOT +#define IbaPPC IbcPPC +#define IbaREADDR IbcREADDR +#define IbaAUTOPOLL IbcAUTOPOLL +#define IbaCICPROT IbcCICPROT +#define IbaIRQ IbcIRQ +#define IbaSC IbcSC +#define IbaSRE IbcSRE +#define IbaEOSrd IbcEOSrd +#define IbaEOSwrt IbcEOSwrt +#define IbaEOScmp IbcEOScmp +#define IbaEOSchar IbcEOSchar +#define IbaPP2 IbcPP2 +#define IbaTIMING IbcTIMING +#define IbaDMA IbcDMA +#define IbaReadAdjust IbcReadAdjust +#define IbaWriteAdjust IbcWriteAdjust +#define IbaSendLLO IbcSendLLO +#define IbaSPollTime IbcSPollTime +#define IbaPPollTime IbcPPollTime +#define IbaEndBitIsNormal IbcEndBitIsNormal +#define IbaUnAddr IbcUnAddr +#define IbaSignalNumber IbcSignalNumber +#define IbaBlockIfLocked IbcBlockIfLocked +#define IbaHSCableLength IbcHSCableLength +#define IbaIst IbcIst +#define IbaRsv IbcRsv + +#define IbaBNA 0x0200 /* A device's access board. */ + + +/* Values used by the Send 488.2 command. */ +#define NULLend 0x00 /* Do nothing at the end of a transfer.*/ +#define NLend 0x01 /* Send NL with EOI after a transfer. */ +#define DABend 0x02 /* Send EOI with the last DAB. */ + +/* Value used by the 488.2 Receive command. + */ +#define STOPend 0x0100 + + +/* Address type (for 488.2 calls) */ + +typedef short Addr4882_t; /* System dependent: must be 16 bits */ + +/* + * This macro can be used to easily create an entry in address list + * that is required by many of the 488.2 functions. The primary address goes in the + * lower 8-bits and the secondary address goes in the upper 8-bits. + */ +#define MakeAddr(pad, sad) ((Addr4882_t)(((pad)&0xFF) | ((sad)<<8))) + +/* + * This value is used to terminate an address list. It should be + * assigned to the last entry. + */ +#ifndef NOADDR +#define NOADDR (Addr4882_t)((unsigned short)0xFFFF) +#endif + +/* + * The following two macros are used to "break apart" an address list + * entry. They take an unsigned integer and return either the primary + * or secondary address stored in the integer. + */ +#define GetPAD(val) ((val) & 0xFF) +#define GetSAD(val) (((val) >> 8) & 0xFF) + +/* iblines constants */ + +#define ValidEOI (short)0x0080 +#define ValidATN (short)0x0040 +#define ValidSRQ (short)0x0020 +#define ValidREN (short)0x0010 +#define ValidIFC (short)0x0008 +#define ValidNRFD (short)0x0004 +#define ValidNDAC (short)0x0002 +#define ValidDAV (short)0x0001 +#define BusEOI (short)0x8000 +#define BusATN (short)0x4000 +#define BusSRQ (short)0x2000 +#define BusREN (short)0x1000 +#define BusIFC (short)0x0800 +#define BusNRFD (short)0x0400 +#define BusNDAC (short)0x0200 +#define BusDAV (short)0x0100 + +/**** + **** typedef for ibnotify callback **** + ****/ +typedef int (__stdcall * GpibNotifyCallback_t)(int, int, int, long, PVOID); + +#define IBNOTIFY_REARM_FAILED 0xE00A003F + + +/*************************************************************************/ +/* */ +/* iblockx and ibunlockx definitions --- for use with GPIB-ENET only !! */ +/* */ +/*************************************************************************/ +#define TIMMEDIATE -1 +#define TINFINITE -2 +#define MAX_LOCKSHARENAME_LENGTH 64 + +#if defined(UNICODE) + #define iblockx iblockxW +#else + #define iblockx iblockxA +#endif + +extern int __stdcall iblockxA (int ud, int LockWaitTime, PCHAR LockShareName); +extern int __stdcall iblockxW (int ud, int LockWaitTime, PWCHAR LockShareName); +extern int __stdcall ibunlockx (int ud); + + +/***************************************************************************/ +/* IBSTA, IBERR, IBCNT, IBCNTL and FUNCTION PROTOTYPES */ +/* ( only included if not accessing the 32-bit DLL directly ) */ +/***************************************************************************/ +#if !defined(GPIB_DIRECT_ACCESS) + +/* + * Set up access to the user variables (ibsta, iberr, ibcnt, ibcntl). + * These are declared and exported by the 32-bit DLL. Separate copies + * exist for each process that accesses the DLL. They are shared by + * multiple threads of a single process. + */ + +extern int ibsta; +extern int iberr; +extern int ibcnt; +extern long ibcntl; + + +#if defined(UNICODE) + #define ibbna ibbnaW + #define ibfind ibfindW + #define ibrdf ibrdfW + #define ibwrtf ibwrtfW +#else + #define ibbna ibbnaA + #define ibfind ibfindA + #define ibrdf ibrdfA + #define ibwrtf ibwrtfA +#endif + +/* + * Extern 32-bit GPIB DLL functions + */ + +/* NI-488 Function Prototypes */ +extern int __stdcall ibfindA (LPCSTR udname); +extern int __stdcall ibbnaA (int ud, LPCSTR udname); +extern int __stdcall ibrdfA (int ud, LPCSTR filename); +extern int __stdcall ibwrtfA (int ud, LPCSTR filename); + +extern int __stdcall ibfindW (LPCWSTR udname); +extern int __stdcall ibbnaW (int ud, LPCWSTR udname); +extern int __stdcall ibrdfW (int ud, LPCWSTR filename); +extern int __stdcall ibwrtfW (int ud, LPCWSTR filename); + +extern int __stdcall ibask (int ud, int option, PINT v); +extern int __stdcall ibcac (int ud, int v); +extern int __stdcall ibclr (int ud); +extern int __stdcall ibcmd (int ud, PVOID buf, long cnt); +extern int __stdcall ibcmda (int ud, PVOID buf, long cnt); +extern int __stdcall ibconfig (int ud, int option, int v); +extern int __stdcall ibdev (int boardID, int pad, int sad, int tmo, int eot, int eos); +extern int __stdcall ibdiag (int ud, PVOID buf, long cnt); +extern int __stdcall ibdma (int ud, int v); +extern int __stdcall ibeos (int ud, int v); +extern int __stdcall ibeot (int ud, int v); +extern int __stdcall ibgts (int ud, int v); +extern int __stdcall ibist (int ud, int v); +extern int __stdcall iblines (int ud, PSHORT result); +extern int __stdcall ibln (int ud, int pad, int sad, PSHORT listen); +extern int __stdcall ibloc (int ud); +extern int __stdcall ibnotify (int ud, int mask, GpibNotifyCallback_t Callback, PVOID RefData); +extern int __stdcall ibonl (int ud, int v); +extern int __stdcall ibpad (int ud, int v); +extern int __stdcall ibpct (int ud); +extern int __stdcall ibpoke (int ud, long option, long v); +extern int __stdcall ibppc (int ud, int v); +extern int __stdcall ibrd (int ud, PVOID buf, long cnt); +extern int __stdcall ibrda (int ud, PVOID buf, long cnt); +extern int __stdcall ibrpp (int ud, PCHAR ppr); +extern int __stdcall ibrsc (int ud, int v); +extern int __stdcall ibrsp (int ud, PCHAR spr); +extern int __stdcall ibrsv (int ud, int v); +extern int __stdcall ibsad (int ud, int v); +extern int __stdcall ibsic (int ud); +extern int __stdcall ibsre (int ud, int v); +extern int __stdcall ibstop (int ud); +extern int __stdcall ibtmo (int ud, int v); +extern int __stdcall ibtrg (int ud); +extern int __stdcall ibwait (int ud, int mask); +extern int __stdcall ibwrt (int ud, PVOID buf, long cnt); +extern int __stdcall ibwrta (int ud, PVOID buf, long cnt); + +// GPIB-ENET only functions to support locking across machines +extern int __stdcall iblock (int ud); +extern int __stdcall ibunlock (int ud); + +/**************************************************************************/ +/* Functions to access Thread-Specific copies of the GPIB global vars */ + +extern int __stdcall ThreadIbsta (void); +extern int __stdcall ThreadIberr (void); +extern int __stdcall ThreadIbcnt (void); +extern long __stdcall ThreadIbcntl (void); + + +/**************************************************************************/ +/* NI-488.2 Function Prototypes */ + +extern void __stdcall AllSpoll (int boardID, Addr4882_t * addrlist, PSHORT results); +extern void __stdcall DevClear (int boardID, Addr4882_t addr); +extern void __stdcall DevClearList (int boardID, Addr4882_t * addrlist); +extern void __stdcall EnableLocal (int boardID, Addr4882_t * addrlist); +extern void __stdcall EnableRemote (int boardID, Addr4882_t * addrlist); +extern void __stdcall FindLstn (int boardID, Addr4882_t * addrlist, Addr4882_t * results, int limit); +extern void __stdcall FindRQS (int boardID, Addr4882_t * addrlist, PSHORT dev_stat); +extern void __stdcall PPoll (int boardID, PSHORT result); +extern void __stdcall PPollConfig (int boardID, Addr4882_t addr, int dataLine, int lineSense); +extern void __stdcall PPollUnconfig (int boardID, Addr4882_t * addrlist); +extern void __stdcall PassControl (int boardID, Addr4882_t addr); +extern void __stdcall RcvRespMsg (int boardID, PVOID buffer, long cnt, int Termination); +extern void __stdcall ReadStatusByte(int boardID, Addr4882_t addr, PSHORT result); +extern void __stdcall Receive (int boardID, Addr4882_t addr, PVOID buffer, long cnt, int Termination); +extern void __stdcall ReceiveSetup (int boardID, Addr4882_t addr); +extern void __stdcall ResetSys (int boardID, Addr4882_t * addrlist); +extern void __stdcall Send (int boardID, Addr4882_t addr, PVOID databuf, long datacnt, int eotMode); +extern void __stdcall SendCmds (int boardID, PVOID buffer, long cnt); +extern void __stdcall SendDataBytes (int boardID, PVOID buffer, long cnt, int eot_mode); +extern void __stdcall SendIFC (int boardID); +extern void __stdcall SendLLO (int boardID); +extern void __stdcall SendList (int boardID, Addr4882_t * addrlist, PVOID databuf, long datacnt, int eotMode); +extern void __stdcall SendSetup (int boardID, Addr4882_t * addrlist); +extern void __stdcall SetRWLS (int boardID, Addr4882_t * addrlist); +extern void __stdcall TestSRQ (int boardID, PSHORT result); +extern void __stdcall TestSys (int boardID, Addr4882_t * addrlist, PSHORT results); +extern void __stdcall Trigger (int boardID, Addr4882_t addr); +extern void __stdcall TriggerList (int boardID, Addr4882_t * addrlist); +extern void __stdcall WaitSRQ (int boardID, PSHORT result); + +#endif + + +#ifdef __cplusplus +} +#endif + + +#endif // DECL_32_H + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/serport.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/serport.h new file mode 100644 index 0000000000..503f25cffb --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/serport.h @@ -0,0 +1,74 @@ +#ifndef LIBCTB_WIN32_TIMER_H_INCLUDED_ +#define LIBCTB_WIN32_TIMER_H_INCLUDED_ + +///////////////////////////////////////////////////////////////////////////// +// Name: win32/serport.h +// Purpose: +// Author: Joachim Buermann +// Copyright: (c) 2010 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "../serportx.h" +#include + +namespace ctb { + + /*! + \class SerialPort + + \brief the win32 version + */ + class SerialPort : public SerialPort_x + { + protected: + /*! + \brief the win32 api equivalent for the Linux + file descriptor + */ + HANDLE fd; + /*! + \brief a very special struct in the win32 api for controling + an asynchronous serial communication through the com ports. + */ + OVERLAPPED m_ov; + + /*! + \brief The win32 API only allows to test for an existing + break, framing, overrun or parity, not for the occured numbers. + So every error event decrement this internal error struct and + can request by an Ioctl call. + */ + SerialPort_EINFO einfo; + + /*! + \brief The win32 API doesn't have any function to detect the + current state of the output lines RST and DTR (if someone knows + some function, please contact me). + So we save the state always after changing one or both lines + (for example, on Open, SetLineState and ChangeLineState) + */ + int m_rtsdtr_state; + + int CloseDevice(); + int OpenDevice(const char* devname, void* dcs); + public: + SerialPort(); + ~SerialPort(); + + int ChangeLineState( SerialLineState flags ); + int ClrLineState( SerialLineState flags ); + int GetLineState(); + int Ioctl(int cmd,void* args); + int IsOpen(); + int Read(char* buf,size_t len); + int SendBreak(int duration); + int SetBaudrate( int baudrate ); + int SetLineState( SerialLineState flags ); + int SetParityBit( bool parity ); + int Write(char* buf,size_t len); + }; + +} // namespace ctb + +#endif diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/timer.h b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/timer.h new file mode 100644 index 0000000000..e750baead3 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/include/ctb-0.16/win32/timer.h @@ -0,0 +1,140 @@ +#ifndef LIBCTB_WINDOWS_TIMER_H_INCLUDED_ +#define LIBCTB_WINDOWS_TIMER_H_INCLUDED_ + +///////////////////////////////////////////////////////////////////////////// +// Name: win32/timer.h +// Purpose: +// Author: Joachim Buermann +// Copyright: (c) 2010 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include + +namespace ctb { + +/*! + \brief A data struct, using from class timer. +*/ + struct timer_control + { + /*! + under win32, we used msec internally + */ + unsigned int msecs; + /*! + covers the adress of the exitflag + */ + int *exitflag; + /*! + the running thread steadily polls this variable (only under win32). + If it's not zero, the thread terminate. + */ + MMRESULT stop; + /*! + covers the adress of the exit function. NULL, if + there was no exit function. + */ + void* (*exitfnc)(void*); + }; + +/*! + \class Timer + \brief A thread based timer class for handling timeouts in + an easier way. + + On starting every timer instance will create it's own thread. + The thread makes simply nothing, until it's given time is over. + After that, he set a variable, refer by it's adress to one + and exit. + + There are a lot of situations, which the timer class must handle. + The timer instance leaves his valid range (for example, the + timer instance is local inside a function, and the function fished) + BEFORE the thread was ending. In this case, the destructor must + terminate the thread in a correct way. (This is very different + between the OS. threads are a system resource like file descriptors + and must be deallocated after using it). + + The thread should be asynchronously stopped. Means, under all + circumstance, it must be possible, to finish the timer and start + it again. + + Several timer instance can be used simultanously. +*/ + class Timer + { + protected: + /*! + \brief win32 needs this + */ + DWORD id; + /*! + \brief in win32 internal handle for the timer thread + */ + MMRESULT h; + /*! + control covers the time interval, the adress + of the exitflag, and if not null, a function, which will + be called on the end. + */ + timer_control control; + /*! + here we store the time interval, whilst the timer run. + This is waste!!! + */ + unsigned int timer_secs; + public: + /*! + The constructor creates an timer object with the given + properties. The timer at this moment is not started. This + will be done with the start() member function. + \param msec time interval after that the the variable + pointed by exitflag is setting to one. + \param exitflag the adress of an integer, which was set + to one after the given time interval. + \warning The integer variable shouldn't leave it's valid + range, before the timer was finished. So never take a + local variable. + \param exitfnc A function, which was called after msec. + If you don't want this, refer a NULL pointer. + */ + Timer(unsigned int msec,int* exitflag,void*(*exitfnc)(void*)); + /*! + the destructor. If his was called (for example by leaving the + valid range of the timer object), the timer thread automaticaly + will finished. The exitflag wouldn't be set, also the exitfnc + wouldn't be called. + */ + ~Timer(); + /*! + starts the timer. But now a thread will created and started. + After this, the timer thread will be running until he was stopped + by calling stop() or reached his given time interval. + */ + int start(); + /*! + stops the timer and canceled the timer thread. After timer::stop() a new + start() will started the timer from beginning. + */ + int stop(); + }; + +/*! + \fn kill_all_timer() + \warning This function don't works under win32 and will be removed next + time. So don't use that! +*/ + void kill_all_timer(); + +/*! + \fn + A plattform independent function, to go to sleep for the given + time interval. + \param ms time interval in milli seconds +*/ + void sleepms(unsigned int ms); + +} // namespace ctb + +#endif diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/manual/refman.pdf b/src/mod/endpoints/mod_gsmopen/libctb-0.16/manual/refman.pdf new file mode 100644 index 0000000000000000000000000000000000000000..285e523de38e3d61bf48df51eef0e6bcaf4e408e GIT binary patch literal 727923 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 tSJ8#Y2Ht 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

mp6|9a)V=yUwS2LW3JF|c6>T$EDzej%OIqeHw zK3?4X+Q=kKyZA+P+xzR*Ei`_((L`Wgxc=R%Js9q#p8sG@&2s!y+0RIg91PIG?PY4fos(yvRJvV%IA>q^ybdc{s@Zy3+h zlB;^y&m8uM8njzW&$wJ{kQlJ&K7KPzO3sUBPqTmWMLf~h z+BkXl>_=8-9hYtB(RBXx)ERGjW#q+eD41v^Y?nTH+wiXM(sJj9-w6*p+kgCzc+HrG z8gl0W307gBFkQb{2&2t`QV-0#|jV(1(dmNT^8_kOgA+~`kUqXJZ>OL5>V<0d8D7T4VIz&t@pixdsf`&s z{fjSN{;+BeP>clVTxVyjpDj^an6n66E41;dMC(6I7}>9<-4kr zdEPsiBgovV3onk>2X>e#Xi8_x<`tBw77{=(Nx|DOH5A|^6SPbJx` zSG}>W82he2M&Ezl`I&DUH{O^zWc4o9D;G3IElKeYQh9c9xyt-Dyj}K;TVzpqC$3L( zZW16nGxN=gMGJRFj|pmaUf$&9!6U@3e|8=^td*afw{o8&WmRwJD z+3=ksMFTyxZn|EKNq%E@;@H6KKIyN;Gre28yxHpdNNudgfZ2L0joJo0?r9m^IPBO? zi^O1TmdCADrybH=xL7tQTsNj!f=Mr(^H~kYTOVl`QGB@0)|DR{r8L++CGqv_$MODs zeBCG9?P1=0M{2}(_5!8-<>wciS#bDO?#K6K#bnn~x+=nna8Yuh5T=#9PA@#(8J`acrnd5Z?t&)1%iKW(aW z*OHz4?3t=PjwY+Mf3cilH!;p-fX~;N{nzXmgmpe?^}aM-8|!w@KWXX}?6xw#)N1F6 zqb?Wg-VScMGkgzP1T~vEcBXE_gM%Con`}B@7rigs#o!&U_ok%b{IPM(&X~NNK2XPL zM4yPJDw}+!JfF|8Tjtf}mCXZZ0b|uhmt!vNy?s;eFXBAdXl$vo!|d0{g)zG|`d(@! ziaYA^bfGN9qt%>uce@TvUdVa6Q7bPqJ?k*5Q8#z{hsjZp^&VsuYU*qEd1L;e1v$$0 z2;=5h?SEqRk&6yXDSzla(cV*&TCFJ@rfQe$qeJ^;>+} z&n)kFUqM^pgqb~X8@r~BblX#lWUDh+Gb^iXH{Cg#@Z#c^uJ&)NLE8;AG^y(8H zIKSb?jPLzo!IENaO!#6>gA+Lm{0=@_;F@}=gKtT5uP(ai;hPC=m#rH$w`%=%*MfBo z?DBJG{79Un;&dm`QRl_-K--CNI~~riH*_`)U0V7}jC&=SNkzVw7oKlot$lNUAGa<& zZLFQY`MD&#S(e(ueAccX9POn!MjtzzJ3I5X>Ed3;J@s<3FJC|1RK-!$_{z6I(*t)A zMRh)*b9ZZT!;913ea%?4a)am3)CK&=jhmkJFfW>B`F`B5)`_=LA9cIABEG2OUezm1 z(J9@PhdPI;t={1Iu5X>y_4hBiJLXX5pf2W(Qvz(|iQhBXn(;{~L4`*wM9bV~1or46 zl|7yBx==W7K*7iC2QAQj&1n|BV_y{gdbMDD!rjNshNQI^v*#+rGU7CT_HEsa#(}#A z_ehDbeLXneV@E%yM0KH#{h)qpx?+}$T=?C@#O1@%H1e9J(`P4bnpN;d}z8Af|arpE&|52N?o5pkwySjFRr|t+<5A8#f zP0tfu`VLJMhsHlzy!GeF>GoH~$Nso`UdLsK%FMtXDG>f(^G~xD25#TC)p1a3^B|Kw zr;c1&b}Q+_B&Vql!|OM9dYWjd`(nAz#EEg4YBPhnZ3~It$s267=grV9-Mr6cd^kIy z!_Hp1TFWlaoh%S?=baA-l78?nBR78JkT@9@#D@3^}f z!&Nx%XI~jNv+=f}>ovzW?`V?x>cK7cfvBAQ4_l01+h|I{mub@X9VfT<48zi~1h?-S?+1Z2D<%SX5Mci;l59-EI{%(cRVaf%z{z z_BYSC=r_EZsGgMv1?+&I(fY)896tuF_iPCfbXsow;<`i?f9pW3c(V(|cj zn{@qj!&e)+cAFY>E@jWwiKN~2)J+dB=4U@mi+{XkO;RXJ#EF7-_%;vvPmOj7+56&P zxD9FcIMoZyJ|3B^zp(46*Ji;M_wYJ0gt!3(%igC<+lD@-+cCzP$M;*sEPIz7U($c^6t`Duj+(9KxNz3tH#=bEU0XFP zR>1sfHZ2ebq@PY*?~}#t=M=?UxSwkpW!@z)xi?6ks4X%&b?ar2BrY%1CeyD- zFHg0{dDlD9C9&Tk8t?0IayV0`AGU_N2JcRMOb9vcVLFct_5J-;(Tjf+WVp=z5N4_+ zwDa~eEgJt|Wm@NXvDtIkPBZTGu(k5t@;NA{;J&@X59YgX#N<3$CnsFOXoOJmHG6v^6d_ul<%$4|im?l~$u_WHeUh?&>*PBBP#Bpq)lWqh!))A~RR7 zPId$UMG{*OU;@4#&R8(25*MDOXg1yh$1(L&0Bli^1NTmL!En<$D%Ps?@s+e{Wf_*gr}aA`r`0}L<*=U^qc9bR(!gu6`!tZ1+JB{#$fy}{T4-> zK)#Nw*0Lw`o9XgaAbl+Rh%RqMGK)$Z)8(y*Gqdao{boen%AU|~rpsG_c$NN$eluO( zicqqaehZoUWq;6brpsHwJx_l`zZqWfvc~kA%bcGGfzU8D%0WtcN(10Pu~YUf8URNK z2}|EYAzG-$^qY~pRQ6Gs%pj{SeIlT8|IwJZzNt0>8UQDt(#WZg%HAxXN*q&9%HAvh ze534J^qXk_oPY+vkvyQ%HdLY{`8pi3Wl!igQ%QH!NA#PilrriG{bm{fC!hgvzyOuK zhX%kAV$ISw(*QV94Xf-4{bm{f2Ohh!k7xj#fCj*Uk%a!JOwT|W(NAcZX#gBDPUw$l zZO{NX0S$n|3M*?vSC%7j)KbCd%5sR<&`)TY>B@2fy0RRCtz~WKH7KChpnzV3Bv-Ta z&GZ@+(3Ry7VWvMSmH9W+UFia+UES4;^)Qk1LV#?@6+)glh8m?gK-&wyI|A*bWQ+2- z5()tVKGoUU3dSUyT?7qSE*KIN*qmx4K2{+Z8P=K#hUl0841*{`M@vRhnt-AN>tOW+ zt0Eq zP(GkomCnc-udQT+R*dYF<&yD`(#_#3pZi#qU}R^gtzZbfA^{m;VtO#a0trB+Q2B^r zRg#enrM8lh;&lY-RUsKk*hgBE(m~iNvT>-|nKhP-qDn>KG!CMjOl+~`n+EFE0Pt3w zOg_cTuiDhap!ZoGiSd&qS)nw9{~=v9GG3~Xj2thuRvKZT10{SVr6K+gXl6AQr=n=J zDkOnn1obV(lO(SqVX2a6NB{r^y*4wAvQ=xUH2M&zkgV(w;8j;J#iWv2)m@-fMs5kD zuvaCOAvFQ?qt)0qst}FXC^gktxoChKA!iR82YsXy7=5*nMpY!FQTK~li-u7|_038f z2f_TKHdHmvfhx3Ct8<`i4N%2nfc&VWH2?{a1z(LtP=#o-%P3SvrPSgsOp!j4OjZ!cBd3X_ z{IRa6v)VBD6FE>H3~~VVhvYNDZ%+s$2!jLo8kp5F(yEZG7FPk#n&NzdYXOBUk+q7- z*(^{H0AmMI1Z2e{i(2`$S%qZeGF#Kpqz+8zjPOQqNQpt@i^80R&NxW^CE)d1tN_aM zQbWlIK$6tgB1KUk3IR5gd~;klF^H2+&o#p0D^2CtRUD<*w{{LBUvpD0N7?gr4YIjh{yvy z33fBw0NC)Ops*)F6DxmgRx$r;x&QM>5j)605Fc2XIFT@-7)?@mmZw~;O)4Q-ai67} zi8Y-6DDDlGbuz0+)l(*p0>W0pKz1!;g+qa%T(M(HvMO{|i;DoN(m*oMX2CQA-UFKl z3l3%sFC-%#g=!!t6$Psu-#N}7><&oX2HJuEdI%vCiXH)}1&0DGUFEY_6$g`Y|JHag zK@$ODDkMmQU;q_;F__ra2!jusI21Sx<(H-cDGu4JYkmNbv}06PW@AAL;D<&%3am$5 z?no*(3b`o1FsqQO7MB1r{XxnPjR8L_L@7e*U;=3mLEXWh08>cm%}g=3obuP#bS!an z<8}l&0OAx1a3GN)GoT$q<}q$AC{nBZ(Nu+GwK)KAm?OU(P!!-zLE1xz#^KH25d;Wv zC)7%=+HC&>P)#_5P-Tcg=xYc`6ixt4GPn{1JdX0qvI>ROX7?w#?Susf<>pX606tY9 z>%j0uhLRXYjQ>a5o5xetz3<~`P{v9s(qI-U&fste86s398JdJhQc6l?iZY~;6pbjQ znW9t@nHnXHk_aWK3>lKC@4fap`{@0g^LqWxwm-k;pU3Oac3FF^b+2{b*LB?l>^68H zL*;@&PBLU12X_FtkAM;p{SS_`AVC4c0d!s0B48xP0~d+Cp8_*n2P%8A&~FCR`%tbx zcXJ)2X+}*Zm`nnCehT+h?tkpO30Ej^XhcHu zK#8s>P|ku|FcM;+gAl9$Edpj6yr7ZT|DoT^EU3o9#6sdt%+>{xvs9=*BCHhX)yMas zaR+m(iaFR704{)F{sA)$A`&2k3jjn)*wtVZ0V+7E@EnvJ~B3f+Y|afIH~ZzHhBOe5dtXq%S5g>&<+Jg3V)dhD%7C(p8q_6k%|Cd z$t9HL0Y4kqH5i7k~!AC@Tx^l!i)S5R)JoifR>bc!U<5 zgC8;$b78Ps24|9?`v{__;FApYUevOR#JXfLDFzLUoikvm4^b%$&lw=!AZY$fVqLPR z9fL&%S!?W~1czEUZ9_g=2V5F3Z7E#UA*ap1P?Br@d$=XTErO| zJdlyt`{^iA4F6&50*C>S(!h@W0E{RRf(I}Xdq2voKt>&K0J#7)y#!#8CSbtzTpKP< zU;@H_T9yYg5}QB7A;{ptUXO?nP=%lXGFYIRz^y=72@xT9AS1E+1D^)c|G;vBv7SP{Am!!G3#g!34#XIRmhQP0aSt{2p-5t`&d7JLe} z^Ke>Y@Y&)SOZ@XdMq=;B*CmHxz*(2bst|g0@PCQp21d#<5pqy)_kdRiMSG|}fKL#V z;uz?fi3kSZ3&Z!j2bg1!XJqQYMy7>&HiPjK-y_BY8JWEwjulMAR7NFxs6T*n3%YM2XKSdI z0K^>W{4CYTU`GujiJ+y4 z^9zsz6cCItdI5|c{~?nXGBP0mLM3n=2IvJeC{oZ6Z;&v(fEO|{Apk1AV2zH7_E>TX z6{n%(irz0ufdb8o@7Tl(8JQ3O_acZ*C|a@!2B=D|gH$kR$E6W+4COv)V7<2nJJA@x zBg5QPVd{gi7#5s>{{~f8h^TN0<^MQK;oi_NE!3cqK_N#I6iztB00mOmV_6gfx)y`~ z+$S$&WMTlz^9&{$%s8k)Ak#BQ`NLpg90QO!5m=o(28~n{fSj2YR=8)A3{V_^j2>Ww z5-c1a`CkJ(kde6rz>Ei~54=w3$^vBwbf`tGfgo9hNCu!MBCtHUp^-95JB9d` z_{M>F2B0V6KXy{MS0_2AMA$EoB#=WiKo=Ayl!7s$0SJl+EKeTL$ixANP*9eDY9@7dye*hLui z=|Y`spcDc71-hbZqbdbqssRsZr0xQ6N<^JTI8*~Hub~YYTLe~) z5+EuNVjRGQfdA#m3mU0N0QEUw?_!3>807$^-YHO`2CxJ<2fUz>i3D)MprE2AA|1f~ z52qn`kI;$-MvW-xfV(vu%W7b-Qw=RpNE~3zicsf9v_3($33_jWwS8W|$OHmNB-5c; zsVpiuVJ^sUt%4?#&|8vdb)OrVHsSa6qdJ*&zSp ziOio5GE^M?`31NSGICSF{u9>gCELi^eP{DcnP!+SWw|0eo2{TK$8!tFZ$?JabjUA7#U7IN) zY&c4JVg0vf*Ob&RkAAEn)qBu++g6vGQ*!L;Ydhm7{-{;xZB2A;`SNa9Z*Y`AT2*dW zTJ!Flmb2RV%kSkT&XzLpdQeo7=QFf4>%0|9w2G>62Xludw|u^@3VudZ#gbn~RDxG~y0@|NE!Cwy`MWY~r7Z zhmBMPOWajQO&jq*x_3tAz4W2M>6;bP3{RaF_Ysee&FSr^>1;`DZ@u$HA!BKBnd#Kv zHZY~?mDCr^j~wN^E$;QYZIa1UUlp@!=RO=(iBX73Dr~qTBdxumwzsKf+wXUgsckje zwgsvUPcu)>sqntgFtK-xOkBQo-`iU4vvF^gdYy(&0KX~eRUWG&PVDI@jcohy@Zqbv z69un+)_uwAcp6#yHS!h3Dq@u{-L|3R-YL<-(btXo9q&~8QinU7{qjty*Md4`Zn`UV zpM%00v*y^=Ccpc$ltTj;ONTX;?UNd-9vmemeDLs}Q?W^H@p#9*2{^{ohy2A;9@x5X2^R_J)tCzNjUmEK(u75^1SVX&a**>t(uUG2odG+(p zVmaSO7hdluu#M5^l4DGtd%F9Sy!Q6bUVf8r_2`F8_!D-V?7Cao5$`YUys!8GB$ zxna7`EpCSHdEo#rL~^Qp+cKdk#p#qvrQWp-=+Aw@lo|gcf82MCX&V;4JNN#Yi}TI& z7}?`dK}9e;HLBFy8db&8uKiO_+0Ux6c5?yINspHgYO3ivP(~hH{&&2{)B~lmnP=)qJbPL z``1kMrs5~(@S6)C$oRUfyk?`;GQzM>@LV4Ja9+)+M$KyfUZ+nYFf4gW-lEUbzW0us zyh*%hQM2@Gi>UMFeY*k5uM5>Zr(7qVThx3tUMR%nwKcesxlI(jB%+m;{-tC^#Nm+% za&ec|O+fR%@%U?>^_vr)s~Oaku0*J5KA|^TZk1e!`~A@Auu3wR#*s%>QCDm1~e#XyF zJU!_AJnfo~#)yDF&G};KLE$kuJ;lqs(*PY7r= zVOvLWP@{iEjnnDiX|q)Q@)M_gnh5`(Mx9A@50dE5Z2EigwO-hh2j2Ft$2elMX(-Gl z@lUVU-Cod;F%~SL7naV7+x_vu-tBvG^s58gN`4#OyBn+=y~?v)wgrY7A9V`EseN_Rh3BnQhdb(F_&6?Zz?-i?`l6d-;p<>lx{3Nx27X zr_&Q$1J6lB=PbOlsK|H}-Vxf zlP@V2@3Zd8U|t6w`F)iZ7mS97RE^hI+ELY7EV$pQ>f@_N-7}j{=k6%6N_Q3azA$;8 z^V{&7C7U{0LgLf4;@+9ntzJD(>=j9&^8@K8hiR&R%du--rai8W=EUVX0KA` z^;^bXS@$VFKx$j}_7&6UjX%2!1@~VoZE{JuxHSlV`?b*zqE$DhznkaLlWpKx_Mu~s z*rXMS9}i2`I`=RG`n}#ot}5!f8d0#T>07sKX4dy{GW5F!+2)7NS9H8@bI3Lrt}ZBk z>_(V=>i1pBIV%#&lgc{Y>qlqayjFVp{@V^Yn8qc^^cQE~+vQc)ti4|}bpJS=Jmz;r zDeGUatG`-Vt?lh+f2k?SVfNg_Kc~XBo;w@VG|7OI^hovoY#qleRYj4Jmy0ClqXVrjP1sdRj`q1F;S%)XHd+ZKI=@3X3dL7*Z=Kp@9s7A$j=@-qte4FC@%-wg$4W@vrY;L zlwKSDRVbuW;5YgQ)x)={l~BOk6(!OIoC;EqPJGi&l@%*qLtjA6w;g(D}3#f z676)$M1zJzo8js+jwHW(?lSsZ{1c121@V<)v*V^&iM9Rw*s(^35p*Zu-sd0gts>G= zZ42|ZPEj-5ru=~tuZ(t`uP>{7f@WUNe4*R@F^ry*ak^`}=mbsW>{(W0J_I;P$k1n5Z7oe|j8_WiZ*&)WaM!F!>`Ga@=mCnoFxsM(@00^N+!bs?RFjtJFtK`z|tc z@^CYmrky>j!$$e6>!hYF-f$!MOuLOqC^43mtT7sX6r&vbbxKl@VHA@NR+wRUNWV_J9XX#8GQC9EXsT0CA( z2!7&jz3h?UjEJ1b#%B-F#y(r_+0(wG=J&(yJezrP>IvUD;2xW>(^R}%W!J8-EtyqM zRxXgO722}0DJxdAyncn}5r$T1l)Pis>cZ~qUo+3V)?8Ci*=RRJ{Bz`O>C~?MZR~JU)7FO z6jm5(Jx_9T?qcEPTZ*;AV?OLtaiom6KIwYLPt)=vC#m-xChpm0oSe{ewa_QEINbBQ z{8%{b^j@ESz3b=h*OLy^*)X;?%8#|4j-K(!!1`XO!tCC=7x$t+JM>|6VSU!P8pX9E znkSgcpFX5oAN*8kRJFcd@u*FT;8!|-&WxApA^LJ+!=jet7#kIii_NL@`SNC&f$p{S z%ce(7kJf6lclz#PHA=+X=Y{&|6zjf)dU{VME-k<4UjF`sQ5qbMoc(9a3%o17w=yl> zICplS&cy2MU5g!4b$r9esTDn2ckYHzb@-3=lQ-iHs_Vw2NQKOpcTab6^Gf}x*F>J) z6Y+1K&l!OuSL8WhZIs+n3hz(W^fCj(s{I?f433$4xnrXV<2N zNwn@hO8LFaVu+gp&8C7eJ`PQDf$JV)C0gpvg@vXEuk7r(9GTzw>9eQGMW4h2@bl*> zzxCXWKYuqFW0n_PEoqD9{QN@W;^N=ozTLvK8E!#4EDOhlJ%L{xDD__R%Zg=-_P{U} z9K0F*`ggdC#+ow@T6dC!`dk|`B!X`1bR2jwUp~6_*}WxR#%Ff}P=e?e)dX zs@(-e@jdxp?o7SuaK>RB{A353j@MjnIT?A*MAPxd^=Fj3+B2I@7-X*29T6X;l5+4) zwPmkn`myk!bk*BvF19{&eOS8en~nDr^_lKzKVYPWP=7Cz=}BfjTCi*@8iKlm;}1T4 z(&85otX5n){>r*j6;_4g)E-s(=m*OUPtIXIBiUO(-e7cXRSBA^7j*pgHH0^ zXZMaCmM}=C)C@auUTPe)9yuE4DD*xiuG{>*cE@2k|eXg+Cl_z3cEba+~oc*l-kwiu>qhjz6wzh_>)3N3XX_7H+Yuy5)Om zrs31Rw}Sb$)3xUMEMv}1uO0ewW>8Pd&HLN@q6+hy9_**)$Wsc(`ChFA-`xVs>{uI@ zJ8Sn8f_d__y06FNuWxkQVBB_Zv0}tF<7-EHPTjEaTo;j+lmE4EW{ebCb@^>`U866{ z7S(VbqcqNVWa|O1z3`0m4ad5M$y1c_tDRB9>ipH-DGfk|j( zm23B-;9dT=DNhPE(&uQr{)Qb`Vv45#^*N-4$_{$DE`gcagFSFF0 zP_Nu;U32=^)yrms@AQ`az0$SUU&OtuC^vwg|6qBw zaLv!FdOGQAtHvA@i=8Po{gwHHC+5zrDQr zw{mLaxZ5lK?zvG{Gxlw4w$(Og{a3cU*Lha%qE4COw}xMyTK{$t z5P>__?a&b$z-#&UpIo1X&LMxd>72hKGBl>c<;=cb!?>8`vD|*ksF&VAQjNFYGAl0z zM#=y9E$aYn2GVRq{Fa$4TjGEHmUVy_%JOl=t&c$okAH%)eYPOR!mW?NNEH7B``zeU z2t4{3-1=Atw?5VZ?hN}|tb8E+4E|)0ZnM9IN_p5n$DfQ_AM1cW5$jvH^|20aeT=-6 z*x$mRj9VY;;MT`FAU$IL4E|)Si5vP|z%F8a3%5Q-mJ{qx@F(Ne$2z$6F|@PCe+GXt zh`ZVU3Lgz9y<(p*aqD9yZhg$et&f?w^)WE_@gHVCnF&=6_CIGo8E6dnC-{?b>tiNv zeTI&%vLJTOWf| zmi;Z<`WT6VSU-$gA0t;m_9r-ImhCwF3f%gbiCZ5-k(K?!xb-nO7vZ1aPX=l$>w&oS zF;FP*Pw;WZj6u;~!CIy03;fBr{Wv0qvz~*mK_~G;u zX0O5j@mppsa6I2n)Xe}G^_s}JX25V6{1sqU5w=^Va+58wKX%Z-Fhjb3ZHwu`Dj~6nufeaEE*oy!w54L(F zlw%^#cI27|rC%0SLe|E-prJ)PNNAwQgsBE|9*O!`-o}V~rU_dh0!sr%GT(#|UeM6C zGH7T}!UPS>Ki!U+G zpZ`JQCc$B+pTQ0qklUeuF+c;NAb1NRUsqrZLIgp&K0?;UR36As_!=xSpgd?JiT{9s zFibG$3IKyfRNF`6a$N>F4H;;#-)cj!=ZO0da|9~Y2rNNyA1`PmLIGw|qzMOFj=B%C zDFV+J;_5zL(8z=WSdBCq9Ns||$+i$?z~pCvB`ELX1q~fm20PclHUkK%pjQK?AW)Hz zxf5&|aN0roK0*${ypWLy1r(5RKxje&KOjl59E4%e5Pz1az>gO)GLZmYC#D4EI0#eV zb%K8+*w7Ny_|dp*mswY_!M;vt%%KB3;{lN$NDl!ldcnYIB;+B?V^<^P)Cggd4z?%% zKm*wVcpby25r)Q1A}3?j2$U(-VS^(;qySq<6HaP`?Tx8CkdX=nNMZulV~)Qu%Wnrs zg~4E$Ng?3wMCB&X0#j`8I|u3kgPI?4435!M1FAL%*?`{&w<`jnod+~Bp#bDBR61-O z9EW4LZ^O9~whqD)L|&stDik1-Kadj*cpL-&j0V<&m{TBis*=5Rn4sNWPDeyr7W^ z25{_QLYjc%bBrA$8G{ib@(2c4_H3}DhIU+JCcqIQqKytL;y@!w)aaPTolziV+z6*e zNEN}T!G#ZVI>wy-;H?suBJzSpg079u9gs0Yf@-$aF=l$EiRKzXt7Bfs$OHpCKg5wD z!uF5yLr7FX$my6DFfyS4PCX1nxrgb6IUS=V0BS#^4{!FV!EPJ)#Tc0#gQQ~MVoccUm=`iK zR|5R9!ZAC>FDnGSj%nPH6GAenqY!rLrr{z)&Z(QQ+cB>pBa<4!kG52>x&b>xAmFo) zwuIe|XW}}!29Gf# z6#>`>TPnxz7(dt&79rBOZYr!|*fnS9wy5y~6*V!yIyj-zBYcbwmi()nctIl* z1kmrtdSh^)K^_KGp@<{nx~QP02qZQR_K_Q!uD~S#u1;V?&N^~K?--P1;9r16;{lCS zVu*d@=IA3iM{dIUNM6v$gaLS;aKeCzg-bUn@II-?mX}47WMm=%7zWYkP!#4UH&It7u;oNuMu-_j^Fl@<5TH^b>^y)B7jB}u zCll(8#I2%vK_hb+Kt3rDC8ks-<_ar(<`!IQ=CfEnT z45Pz^crfxvI@g7m#s3)W#(`gmq3aJ6f1o!x=Ryowd19{2yr7YZ1o(xRBi-a&h>1!! zc_AYc2=EIrF5P6`hY1TedEp{)A7CrK2Y4JT!8cqx2{Sq9Tz5NU3OVQ~0A~!$0gBU~ z8pPi$2Pne6%v#)0fRvvjY9#{RGC+=Ccc_M@dEkRQ2qFiMU4xXNBg7>Na!271IRGY9 zq<{%Vn8?B7bz-!yLGBvRfe1Cd8sKrzp-&fZ0*N~_^8!X92tXMCPCIZkM%K(&i)tY0 zz_kFla)@(6g^Cp4cPL)aNCW}o!UK*K$nltM&Wtqjko7}8(vZs~(xaNreZ2!^`=D1R z*!Lp&{y#mcL70x@`@n}GYR}9I8i^o)@@3knNfL+1fh8e&(8FwgJ?)hG%;sS}m}Q5FX;Xk?-Q+)}hr>5jwVpg|;s zZXN&)SR8~JL2GfJgUI?if>Ap1Xa?^a3UHxOQW>0^5m%H zHCX+EKPKEniMFWbg^WxXK!qJ>?g7LIc8_Z477TnoL@y!eAnDrfh0Tlu#QY~VGY3R#M@`1L4!3g2!Cr{+bx+$fP5TLgK^Z63$@Qi z_U_uk005MXV4y0BzR?uh@&K$4->p%^UxXrZ|7oQLP&4a!X zz-bYg)565UyJ({r1s?!301F~7{*!6Eppgs(nozeGV3(j>O_K@3hu9^Ae6D#xBNYpP z90V(z!+SxUKY(Qdi-0gP?kvauSb7nZ_@EmeG&Mt15;pGzyWwf06$=SmI4JR7TjUW6 zFg?{^PinwAr$9=SLoNYpYshi{YniamwH9~Mij=n_=q%7VjYBU%7QYO1PbN$+;f0Ju zfdG0lvYb~Dzk~vj3dRaL${^=e!UPju&`3lA#3DgG{RVul5%-IVI5|Z5CA^T4i3C{Q z1=awknKpW{R8#^&1QT#pC$I*1%rr8Q0J88@q`Vj~x`u2Om~s>Mxz^%N4Pm;)!LCj~ zrcDKUC#Rt{@+}AVVX*8ZYIMyD8ks=AN~l3G1roMcM{RaO4X&X?J8JWSMj{ZPo_f%# z3(B!@Lx$rv)*cZ_T?x0;<^_z*l>oLhzyZK;A_v@EU@O78Y(p<70@nRn+_?lE8h4`& z8+`nPHH>|HSG)TzLpol~6&mw2EHq4(q5V%2vaz=AZho@M&`t(5S17*XWC*eXG%q zhHbWl2?@NAkqHC1BP^%xj}|B92urx`&)~k{kx><6ee|?}Xv-=5qvZ_nT;h(_+8Ho!4)<_cdMd1|wVZ2bFA54#E9?;0d z0qCj+t>qE%i(}c0`bHpD6VWEoyjB6JH~^PV2u}lre>xQ|pOCyI?u*Rpg_4N`aQVc1 zk@33!fG;x9x<4;uWO73g2{2=1PTe0x0+ur}LCa>g3~#pjkygA;-=5tqxfXGuEmj`wu?Snz89XW_PP6Lnzfr?-l~l&uC8C= zB>CHKTD!F0+0bK7H}YE|uZXTxO+MtZ{MxnL$u)1*bah--s5O}SsZCDss^_P4InGpKz<3oS@Tcde=O)*KQ;Sxl!%eX z<%R82!T&bAY;~~th0dM1}Z`{O^cL{tczx_h4qj|%%sT*cRkI$<=daE(u?1ACfU;O}_ znI)t`<5CoBtd&|WOkHG8hOsuW}G=8m%bKO2G=XMQU zyI^~M;)=k?#_JJ}q|Nuad{d}CsTtV&^y8cO{G0Jx=V}Gs`ZhBJ8>%lF9m^ICdAoH+ zlC|TniMl(-0w!Ub=md#M)fR=~_QT_A?rV;ien!y#?W&h2hGPFj6&qc_X&-u>Th=Vj zOWtwCXh_)D)NN|FzvMp@eJT2EXr@Ek6y&t5W!SMyJy1$o$|pZ@M3asF+h-@-OLk3= z*tFqUl~F)oJa`KWmbCfpS`zB@R;c3ajw}6MBEw3~ODZn^IdSn5pEMciY5O`$y2_Jc zTK7JXRBX9(?{k_*V5HW(BqfRR`RktbB>Ja1yi<{!_BT~?gluTap^Ujc!aB%R^ZcAf z|9#G%yJ-n(&lG##OKyari*nwiI6Tq*_}-E?3n(=ghnnu}92bl{yqPue!RnzV(bNa? z@}1{(p&#xFH~5>-|~n%<@h#U&gl%CN=~HDjj;lvTX(FEje=Ya{x@DP7whJ2&{6*&Wm}eV(N9 z)0Jt!9!{dm zZX6NESh?%1(8!zP?Vc&?3rt3@WoSz9x}loo!WH9v9wZ8Vg7+dj3jZKC* zL&NtBd4DeX+H=92@h{NNXAV6dtX{L(t#tidutwgj1Aq1I(L1E`w@LJu3rv_WEWtxG zQ1Eh<>nCKWx>VFQcf8ne^Vkc!4VH;0+Z?2IENS|qWcDJlc}n`O-?ta19r<}mK8pHW zw{?eIL zQl>v*nIl5}-WU1ulO6cj_b5xv;%hoE@!Wo+n|=G5Kp@? zF6$vo6PMw~sx2$$%gt~yPK@|DNB{X4t@g(|sy895TC*=!Kbh;09`L|ax!37o zoy`>chHX+;!k*pQo?LhA448j^da==ST9}JZ_E+@2E1J#)s}IfVC@fsrKO)2>Tl>t8 zD>dDl!*z}>4w`bJr}|d*v}D!W-MuN9#naU~ykA=li3D47TbQ`!Lc(i$gxAiPm!Ig4 zcJ^Jv(+hper)Vg4`T4J?{4ACH$h)li^F9R1$Ml2HkLCc4KO!nC(Tb=|72VYJ z^HKL^W)IV7`L0-j4|^-oY?a*Jm^Fbp*Vy-P%bFNHyT~^lhH~>ZQjb)8jZdAnGABgr zuU>ZV#;y1JTYA$To#UqD$zK@g6Y;R59RIvQr8YAa- zsTN)xq3%|Tp3#Dy&k{e)O!rk+ZRmeuDmc@9_7&RZ3GG|lkEhs6XCGG4DZQedR(uB~&KvL1eBJ^YM}{GnSPoi3FWb@wGdS>>pw^EVGOp<>_9bJ73${ z1ge5h>bEVmJ1Mj;E~x8F$B-a6OHhVi*%P#L<@@yuojQ%JEL>E+AFaP-;FwqYQvbl7 z;V=Ti+a0f;JE^qv#XBvp!#iS9LXX6%#a^V(+@&!~T++hp(I(^HiF2xRn6<2U-W;CYj_JDQ(`5k1RT`(jl2O}iPM z^tXRaj<|^GerOW%Pno~^g>7*`h3c)8H1$`?Voz+s=!@m2XBcFsU#``JIv%RWLm1;8EQZbDL9@8*H}RW{k2g?2{=f zPfE7ld2__lmk#3_5AE1<+jgGtf(etZ{=IExEBp9;e~_#9it&sL~bKlWASkbb0Y^pN7wi^iNIrvE|h96eE=Y=M}>KYd*hPuVFuFX7V{zbwfJl*5f%yoOReU=D9bdeN1@#m(S+#iDlYfXR1)LQjtnr(+5 zF|TmAL~%}$Ztfz_0D<=A<-^U4w9j~C92kWiE9&3J2+=elSw@?SrU1MsjmP~K;iZl^f^2op=>Pzfw zbz||@=S9sU>wYeq^?1gE?`^LxKb-Bi?8?5N4=Rp+=l5cpyy7uuJ&EGB8_HwsZ8VSe ze)DU^&Oaa0Oyxcwl&tvVR&6XJLl^$(>V0peXMFD);}0%k(bFH%G>z(ZF89|lnn;4@H zhS=&~|DAv5sCRQ1n2f7g?%b~w?qKyKHh1abiYpn*MRn!A+@G)TC-}sHRU=nVTM{Mm z_;>03M@dJ5roMf8e?*9WPsJ6vo~St|v%lUFFEwa(Z~n1Ybm{wv2WS1gl*H_r(A)82 z-Hqq3glHcetxtVS{ic<#ablRt%gEMtO1$_jMtVkaUEQ#gez~isBWHKn74`lcB_oy2~X^$9^6OVJ6phc?AS?l-*AZ$#$Bb_;A>0lOLzHdR%zlqp8U7oE$OS zu}5>Yg|oisw?l&Or<={cv)KI5&mT24{WV4Ptrh1g-+k=tZ?ax0{ZOx^I$hJOtN3oi zqEqghj8?7~eh{9|<1hl85a&L6zgI^uX-SmGvT9J(rcr=pqXax}sdJ6g#DC2~Ef$}@p7bu;AzQA2l znYc?T6L(1k(>nZT&{ZA#VU+K~zQCW1d0}9m;7`U~Qkl3*D$>ia{uQWG*k9mJhKw5f z6a2}T-Wxp-a$M|h;ZJ6}q(VxS<=zQju$~NGu$~NGu$~NGu$~NGu$~NGurR|HtS7@4 ztS7@4tkHnXGX7+?ODcSVKbh^43ZLLl2Ie0^2%q3jX1k=qC-{>wi39o>wo58}fn#R7 zq{1gSX0}Tze1boj?UD+g;FzHk8ta#`T~euHT| zrFf=^U?qhDc|58P4EsMuqe$ux<3?DZ!r&&nVC!bk&`{q$SPdM73X%tEq1-KDg$j3W zkBRvm4;C8GTaYS|BT#|FAlP2O`XX#K%4^U_WNKm3uw65uTdoe`D05sh2`f~1KqKY) zh5KAEkQ0aw>?Rza3uHA4?qB>D?RY^$i+8Z^6Zg458WoBrY!R4q4>Ev+(mEllQ3f|l z2#W`UMFzAI@Ka$)R9IG{Kr7J(V?*K+6<*NL&N*0Uz|hb^#)S;@1)|7tTows?jWW1d z)0ngPV4*?H6|;=xNK|mE3&K{TypW;bGFW7|ZwW`Cg8P;bwi@My48^3uBE$Uxkw}FG z;gVxqf;1{XisW0R#cQ6SNH$ntSVbM8EC(1?QActbqQJNXDwsF@V1ePY3~6UT5(2vh z+faqDbcVqL8Hp%>ULDIT5DKxHSkG6i>{P=oRX73_j-?7wfeJ5VWTF7D zO0_S+e!r-PaVb`0%ju{+nwLu^-AOk_m6G-|X^C9Xo$_pBqD1dsU zBg;aL41@v;6@og2xXmapXk@|wP<_Fe0aI3JgZu+CAE43TZi5_A3CTbh-1;%>PCD54 z30yChDJ3%8U;=%W$1H%zZjA%K;j0N(o{IxF_?!r|}pxQjvgd zkTc+a3U?RGAP4!M5<>RhGa6j`(fxL?V}{NfzP6tWN3L2no|AXFkVjmPUG69zy!$<%>6*nssZtXEJt zBfSdf0;vRuRlH^znfm~eW&yo+K%RokgqWzc5n*`>ulGqN4#3-E!0ykHr%+%kW1vul zNv@;}uA=Q{pp8V_h>0s-jiAU`!A0inQQ8%#N1&>*n@c|ZQw zz<;lI?9#zt!vGEpEI}Ym3dctr7-28Z|6c9@7?~)51H)w&1Hdr3I03s%9wSC72(Vuz z$6S#!V(d6h^k0QPPC zFH0W4$n5_(Fr1J-01Pri5Y5TFN-}0&6dV{8-PTd&9iL+qIv5dX>X3PrWW2sOz%)Ss zPJ@Et05CX4!u^xXt0d#}g#sn0c4z}7J5VJ;Gy;1xbVOq?NWDrDJO2PMI3d!Z5(W{R z4UB@)kPQCsP23wSR@xop&d&jcDo-F1gTn?J7%DtLU7OUaB(d`k07E%$uuvQThD;zq zaZO?$!%E+zM+{CAG*lnvj2IL!pnWIbxOlut5*z=(fT1FV7Np!cxIi?+1SdYef&Dkx z2owPl8$SmavV?*|8PZm>=Drqkq=e>jWPp*__y>T&S%M1JHx4dHkLqXzTYGdU?k4` z9AH@EB29DwW&@*x+FBdh%#Z>0f3feQ^ceVW4{Wb+HiH`+fk???#7HE5psgO-Bp|&4 z`Z+L!MPIxcac@&PdIVS@l^Ddc;=NQj1fEFgM9H)a0kKbKb_Y#C%We<)38qTVvFLBL@Qb_@VS z!FtO;_ykcW{|kV^eYz%P>jhDgNrkK(6iVQf4=G->SedA;G|Cj96d$RXMq>X*HZx4* zorwC8Fo2ImXPw0$K!I5VWcc_$`%t+j8aZ1pwqpu1ivYU=*v~kQDX?&%!#)4dxLWeS z1)od|z}EmWi_nB}`M@GTb`d&S1a=NC3u1sqA_^e4AWa>Ztf(ak)bUZK7&RJzBr-~4 z=zujE-&2iC#ShR(!~uM&QK3sGx}R`n8rEBb{|$|+`!>KL5e1Ns9k!t%O9sfTqij2S zM?;nj&|a5+XuMt~iSz%!%Y?KA6MB{Z^D?OrIvE5qj9e5)7&Q{PAFxXVLk&b}0V)-^ zF+j-)aUOv$1I%Iw>RSA#Ww{jmfb9Pu3?Od-rWQIl;$Z-J3ur@=2EG>nk1&8yZ3i1V z@tZjX1`kRU1BY#t%Yb7W|H!xxLSziR@Rf<=`&6h$3@lB|wjWF+_#QH@#R=s2e^&rf z$+KAd{HWwvJbiq)|L;}u;5+{BUdvX=LxUs+-zxc&3w$PPOGGqxkKdfRbIPp8wW&Uv zK1&I2J$2=r$xc~K#dTN4Cyh??xM$HH6ir(o{{G_(+n;$Ov*=3#AFsJ|>9O)M*P_-$ z$L;rTR8U7hxniJyvgOUp{_c-^qzqQpef?hfspQLJ!;nK;zZ}zkd1aPi^D@n_wW^;R zf7QQp_}W}r)$iN=;mbjFrJbA7g_j9W(-|8a@T-%0(;#Y{rhH~!?qTPUy2~;@3Ju4!pB1cw%`kJu)V+ zVnuFnU(?f%9q;QUyDtB&4yx#Nn?1aSzW6}T=iAM5x<3Ees`=;87Nuipw4P&4`<97) zjM*XIB=)MpMAcwY5cP~wfxq13y8PQY71Z$JBF@^t&MD!j81;hb2W#URi55-Ypk3O=}7< zc+>l4T>pix%OB$sikb^_9i>%{japPGJK^WMI|ZWGEwYn+yeyw>?=4S==}&OX^txCq zNnR<3dtnbxfyI5nI z`t{7C-3n@tFC|aPH?tJ9zr3kDFl)V}ck8dP^~2X#`ZmlezcXx6`eCQDtKz%ggnhKx zAG6!(d0biTGGSk@vstoV#Z8T7b(=|kw#{97NaoU>D3jflJwED>E*_~0JE=Ej#GQsI ziw;@!c^REwLdnQnB4yKPQ@w#Qcj2bbKXPA%x(QnDy_h(8(y)V_-z!}_J{{g_Vm@Pj zyMUDEj0xxZw|y!DSb`fAC4NUrbT)l$(+)fN=-H4>qUsXGhwB|Bk9ZB0{sDtM`Ov29 z9=%f0F{P7}tS=f0P+{zbjoJ82XS7h%a$(a+9!7hDWseOTp?Lh}PRZ^qvMF9e=MpJZLN2+=}Pc-=1G;wj+@lE1=$Kv#C?9RLo z?q-CaNod!3WE(uxJ>4rxaJsORLubOgc>mESQq!`}+0D^xI`=&_mWh72|Lw9=+ehy% z9y${$d|>%bEjP8W&G&Uy-FDA^JTYZa{hZ`I9%A(Hz$s#?(Vlthl)tpdUNCK&qcQ%w zXP&@9`s$EbU&MzWUu||)^~+^X&$6Ax!h-o-(sZj`f|+Yp?f$89m}#^6jMJ|9a?UCy z(Sp<`)S{B*20<(K32tnSXxkY~KQ=5}`MA~#$zNOODV}o_LREXWM|*77O+IH|JK|g1 zzyDZXdXKu&&-VGcGsUF8&7kG=WT^Vf<|)!9%~y3EVX{|H)4oo^wsiHY+SRdw2}kZ3 z9`hX;J)gerkm~2}tLK%?F%$9Fe_Huf?ebWcVAX91wq%0m+aZe|y?b!zjKIFkXKS@e z&J_tL&^K4*${wMPjJBe$+X(-5`Mk2c@L_G13v7kFGLDJU^Ut1Z>$?-DH^wtodjI*j zv@^+b$L`;Fa+8g(V2LYLdG?C-zQ^zy{{5pXG(%OjO*}RUOt7R#HkGDUh8mA6ndB+_ zM|YAfJxSnk$`Jjz8MlXuJU;fi=|6w8AhnY6N%QbRE0baw!Al|Mg6JwqqGt5i<+q2+ z?{lXH%NO5ktHUmInn zt2{ekyzeA!s~V}3E;p^;tlmf+DZG%rE)T|Lqi5N0^E&Sr7E%S<|F+*g_TX&b$Z7XB z78@HTJ`1gdzcCR0#%W9GtuYc5asTUW-@nR8SZ?lF>T<_qe?jNeME1}l~|`;OD;OQ z&%Hd=$*E{^o>50{s$g}2}K8NN^39C_^Y!U{2c0j;v% zlT;qQJ=p$Gdg9fkm-dW4f1$1bqS31@pA_0FJ+!Bn(ifT>m~}OpRu2E@PBd+Uf9`wz z5vz1)mB(ZHrRKm^syt*TlxV#@r{3>*|MTMW4{w5py$Nfc^$@nI1Bazo9I*Q1#oQ33 z%y7x@-zI)L@|XV+saeOCl$5kwDO@dXw`Y$>kAz#J()kx@@lv+q57qRS?I>?AdVHfn zL+sRZ=sxAqmL>g^F zVwH9+G0}P>ac(?q;gtHrUq2+?_nvxD_=EHOxLDED>K7~K`;I)5pqODsQSG=~wA)@k zLi|&o)##BYyQ3}I8)hjV8@6QruhTX~DKF9{j$5j=-&yCGR$A`GghIyMy%zOz#vi`t z^W^nji)3dF$mjQ1p6kD@Y<~Hu*HA?Prug@rJ(qtr)qSiB zoiprpn77E9amRhyS3lmGnd-Yfy(00)t{s=Y)OO5QP*TX~lNQ$UjChxStLA2Uv%g6E zks8l1!Lq+mI{vapk39Cyt-m%)-Re){jT>^u%N3Vk#wLH3G*e07` zvz3v|yrsU6QQbaKwlgF(KY8zvV}Fkc7u*v&A)MH@aPrDyL6x)JlB!Q$b5A&FFtz`$ z|GnGgfz0Leg1ema*10=xo*JSaakx6P<9J_fjL5AUm)<<7wGVgeSy*v*cbSdAu-AR1b;GEXtF=S zpA3e@tWPk9G4#)&NXq^Me=;U8#=eC=8N1G4pWshstAF92<4*=g7wb7}^)Hah@h7v@ zzwil;8B;Q$2ZA9U`(NQtW~+bUTlkaN>R+lRTm1`P;7?|&f8i7S$!zs6e1bojt^S2i z@X^4!8Kd8htAC+^6$=IhSO0?I4gZAwWH3*|KVd%^`9WjgDY*KVf~$WixcZlZtA8oD z`j^61|NbjjWls z9B7bqg;sF<*R*&+LoZ;k(7+xQd5sT9FQM=aw8{U2?qKXCJy>8sLT4bkHm5rn(2#+B z4fO}&(o1g2B=FD%KW3;q4a{*QZ-l;(KmdV6BG5iy%!qd2qHt5^$r$rO83kH9KzfNI zZ-fRS;0X<5hLUvPgUfe1hs)5Ly$uigb+T6{N2`ag0HRtw9t+@q+!%>&8|($ZX> zEC8ZyuDF`e!I1r%WFm?TUjZQhVQKX^D}Zn_DK1$wKtntFVBaPbys0`c&rmZd=sf|s zUtsy;y`%_9^?1}z$++_3EVGBOc>%}wO= zso_un2@8R^Pa4?aln}XI0EtqsrN`?$LG*qkqsDK2T|(Sv{&Q; z28m8mz)0-)9AKy!JRO>a4*-Mw57^Z4&-vrABuVV~1He#&Kq_2k@DT(4AM9ZSq`N$T zk=XPHfWa98$bSFG9T1lXERo2}eG;2K&W}M^3uuN78fTm&iENsH&&mIy~ZT`EVNEA-5bF9kyx?eG{b%D0C|SY$qP{O)Tp@ z$Uy@%&{q_?{URbF=wX4%3^4#?fmn6`diU@@XxjfZW`aCAiQ_(J1)%%@NSg;3VpwNl z1_2o!_tM150)refe4e4~00T8B9++n!gV2OrEZ<9$$^#jh{U2sNI8(sP2PPsF8Q*c{ z83GFgFaCE88uv9EtDFpS&^XLel(_)&i+{NCSmpwViF}V5kE|kA%NZmz4zm<>|E0pE z1YRhcCXCsu5ZKXpBo(pZ(x8#C2?*Wr=Lyy`pBs9CkHoKn+c%`9E$`c+501fdFnMEMXGL{UGxT z&LSWzW#LvP0X2H?*$hrt=jcW76E{l#FsNGmUj?{isjR~LV3z>SNJse}&}$A{1*ph^ zj;Y0eSmy!k|KciuI(UMQ*uYhQa05>sz{o@a&WPcX49=^B1dtYi>CXcfnGk^E;s`Qu zTu6@r-NN~go7}+282E7JK2l#Wf%w6}1>Q$+Fyepv=Yfkv%6|YCswV0D3k>oHbT}9B zeKz9(jKtm#))Bx3fy4SgY79_^01HBvuo{CGvEbj$AJiDY&tMUVG#s6l%EFCL8(O9_ zX`l_-u*KW^Kg67W1>OH&Y77GdVGSE!AGgKs&?{J0!^YH1R>RJHo1g6eJQF;x{@GXY zHiZ=E*?|2gtYNm++t1xsR>REO#n0W;-OXpUyD&U@v!AcK%X;B$6*rfE*dW7{2>R{N zP$p=yHv+>fh@%uCKhGy)VbNxu6)Wcs-EUE9)s$DNz#FTi%T)+3oWcB4s;@j=E zIIdpoAtL;@Jijb_QG||MM{VtQp%sA<&bc}+bswy@g&dnSJ2>Rm@2{0JCT}|ay{O09 zWOzwb?LLhv=l)=?KkuhChb$ZQJ!;cSW2wI%;?oihdg4RsKELmg3L5TUOqBtQ9s!^P(Nn*?rGPopIi5jt@}|eHMzb%DIwv+ZY$*n)9=+= z&Jc~9=wWzx@5hJc2Uk|E4C-xZfBdKV{H`@e$C`h6;J&l7+1v1-a&xSaX`8#NA??sw zJHs*c!W$p%$@ml-YF$5N|HgTLRW)VJ^|X?L`dT*i{b}^*l6*h!Y3wFr)%cMsPdf+c zj%)W@{Oip0vN#RVC1YNtPtZ8~hk7%y#(mP3PeqcS4(+M1r5GhjjJq-^DR1A_p}}#= zni)>(HDsQ3?c090^K)SCUB}YT`{iHSX1(Y?`}WY?tA)}(<1ZF0ub*GnJyyv6`~hW4 zCgp*K@0v`nq#e=p-U}ziBu{PH(fxDrNQ-SwYn{`dJZidYIpt7(w8#D@Pg*aZ3qQMK zhhj>C@VPD5|7^_&xG-Ge(23~p{lhIMrwt)N$w~ z_tA@%I#Da&=kLroR@`y+70tLVijm&_xohsxefDB@(-qv4o-2x3ZoZ>&=){|MTh5+r ziZM&ysq5ktGD%6?angtk`$_Iy9rXM~Zj&sw$;BB^_Z!DG(c$l+Tbf6nTNL4Jtswa( zHKt|%jZt3r?%$bxYneI0t*;l$I9vi7_iqn_{E^6Idz zY`ZDVaKggN0DQ@gjds=tBidcxn(o;8aPe7LxnmRhUMq@AX+5|ycR_@6s^Hv?*Yk#W z$p4u3_QOw)o;hMk?L8}tSNji3(3KTiMPEnX$qc?JP`F5cZg9xLkB?sDhVIMxY#_NH zc;fsmf6e5#NKr__Jpev6cJEK72YSK5tk2{soV{cE#5@$lMe3T5YQ5 zdTQK5t!)%bpIz|)XC*^7<-ya|%VJXx2)oM12@IR^`twthQ)`4S%3ibks1~a$t0qx0 zNiDX{Vaagwj^0rMg2{hBuB>Xh^>Axm7|k`btx8`K|luU&5pq|7_o^NM9Ise6wN&Wjy>v2{pefy=seVqZRvI9jeSV#1ZBBaSA&6A>NJ z(QacTMGLqYkh48Fr?s)I?s2_G*2m?BU1KM17X2jI+_cknWXiB;k6`Z`!G%Za9Q2X| zy&85V2#hTLxoL{czLy^aU`$8G?O&MTH8KvqEjxLbL6mTv^=Dq}m+^upQqNv3zzUNeK2T#&gimws^R{NsyPJ$5S7`{r4_Q=?A&@T~T5+M!`} zA|p=tWqK{poe=$L)lq}hYu8UbYu;Q>*)oT5@cq2qmo`k@+}l`xJ#^C7Qq_cx*|tV0 zw8Dm?&kF?(Klk&teRqylkY=TFV5#YenZxQ8%NBlXvKZMjA#kjJf}fM1-B`EX1u9dn zF1A-RgSVA50oATc7_48Z$`rTg9-1{p(U6`90Jyk6~`P8>lewjXb@tYzo zp4yJqs#$0m__FL$sPJCJ8N*yF4gM(oO7C9~Gs4|;MBDJpA=NUoMjutW_UZV%kV5T% z(IQT}l&1JxZ2wpsUElTQf_!7|Qbm^|$(r8n410RM+-OnFa`BDlj;qI{hv|Hk7#-MD z7JN+i*}jx0y(^~SO~R>j68E3@WNp~H>W%UKw#dSF#n%I_m<}x*w=_Y~Y*);x-1$>H zitP)hn7%*yc$AMw>AVQT1yS&`V*9$XJuO>$^iw-MU)yetdU@#(_TVFr=uP(wENrHp zzjE@^#JSX^S~ep_Ec}10eFr?%Z~H$PNkxMYiX`kSEV`Lm#$VjDZAv4(| zB3lv4&dN$wWoJkB{NJC$k?)V+|4;tU^Sqvp&%8eOxUT!YuIv52E_G;WpH!LPcZZA5 zuXrUl&DhA+ah#Z~ z?))KB{X6jzZZhuh1JR*0AFs%+4tAem-`rQV;yW{QG^<1r-$aV_m7 z)C_NC=pjgo|J*$ANU{3Dd{Z;N%F$+e4ScJ!*SH<-SCvV8parv-HrV^v#dj1%8Wucv zZ(PJlX4F@zdES}%!L7Sp8ODbojn>E;Z@fD8l*6KS(0A6Poh}wnXhc+1&R;fJ5wgE6Ap@;UOK!C zl%3$ml#g<_T8VfEy(w6~&Es?BmwtFxP(UZzsQ$_LPvE?O{IH80QLUMW#XN)P(June zvclw8zsrZoSvlpuSNoAk?5B4xieXVwih{-8RsCVykwTdh1g9k%zpzSVYcZLYv|HPz zzo*uc!Y{aY2u^VOD8B0on{^18^l{s$D7B`?(T~{bF3c+uxGEp!w4kDtuNxcbwHY{m z`#Y}kS-C?dcP6N)qF6+72OS8kLZo(5G_P;FIvo4VU>8^iawZdWBF6J*z_;H zP6EsV~i+MFTdd%myO|Qcjzh+GN zX9i!tJfkRjeV%8S+A@#&MqFr9qyMjlWZERG7}_?8V@y?($r_CU-hcG{c^DVuHBM+- z8AE7z9E>pV6;boGmt9S<>|Jtw!d00%d@I}3m^O(utR z067OsY`^pT{tYJSo|#H{H7wSD*l)&5gYyl&19+KqmzP+*lxYX^^P*Nbg>|2hZg zPZRUzhhg^!X66GwC0ETI^glju)-!$9GLfDp3F{n9gR$Rn)#sp%7-+y8pmc6kA^o_7 zIB!4wSz_3wQiAJ*h?vFlYcCEtPlHTVsq>F%!wp+Eb?{5|D&;OPbPyQO$`(!*) za_S|WkoBY&t9=W*wLl*`IeAPZ5JAAanXUc)X^f9G2B@1|VLb$d#Rdy^{DrUoY{H1J zdV5!%vPodU$=9Pd$eT3Ywhast1PwW5hH>9~3j#~ryV|WNZn$**5z`r_iSbofedvm} zoKCp&ox$HPc&!CqvWsVyTMkeZExsTV=aZ`tZ0?(PmG^gz4EB ztbq1hAkUq1L^T6N=gj=Pj}$Qr@!Wk?(O3B6Lo(|J>~Hd(-=vETYZlUQOYs@g&Yqbc zOt(|?Q?%mhrWauUu$D~Q4G7Hpx zq~s=dElwQ~!xQ;2y5>xL`$ZaZ4#v~9R$oeEct-xTQ+2s&+`u3at&j0Tl(+0j5C0p-K z2>-&v1?KW!L=03lgokzaQK%idb6;ewn{CDpoPB_DaZ8&4NDSLv+>kpp+CJQUP-Pbs zU=1n?1t4Hxq-}O5s9y#A@O#LU*r7k6dHt{bxdjx%0f=*eWN1_vkQETc?B1umLqKIe zjIE$t#5ybt%6sA91{Ur=pcpoQ7TdM=c3Yh^U??Hgx8Ftse42nz4eHK~MuUn(fjGnF0|_15whB3{`yp@LY%`Fu0q|jvh1zH{4q!$1l9RTBT#%vu=NYh}YoV+N9#*gl z+SIiW;U}Pb+r5R_!3?05!}}HuB!}`qE9<|aK?{z()VbJ6wEdU?V7wtTDFlV#UZ&kX|we}8k}|A!TT z@-+aQ6zC1~qMIG8+rVCO_XcVQE3h91*UkL^l&}F((zX~Vc4#dGxEppo)^-wYUuIxK zsj-3e1t2`w!gv6{xj;1b-CHR3Z4h~YPu^t(6@i>07%pXp!q$NyV$`( z?T5kjZ-0UX2jD~n=za81V*?8g);%nRcIeLi5V%66K_DsyD361S12{W2l^T@D0kR@@ zJX>{j1ZU-@5 zNJ0jgI2)n?1_e-C1?u2Ei?%~|?#m3Irzcd9h8rN-Hn+s6v>{MDXV4Dr#H{Y`dl5Kl`{)b$4 zkGvn7>E;lw4Xn&SDHAmPIV3DFV7t$pW8XdtP~PuTDiyP$HAxB4#b4Gz@z{^k6jD4oyTZBr1Ot60Ns~h7Yr;E zRHPWqehy${dn{tOgWA}K8QAPhPJkQ$j_xf8GGN}pNAG@^Z5Ip`^ZLgo`zsj8RAz^2 z38NE%IZ@#P&fSMCb`WeIPNBbof#Jr&0z9^xf`LsZC-)vk*$#s3BQmfl7$~F&O1^-t zz@}i(mJ^g3+V$|?L9l%|g#HQ!KmuSR@HaUhz&t?-g+0*4?;zMdv_Cs4bs2<2Il%T3 zFra}J0}_HF<^T%{*QLv^wpmO!Y;`#(0?<`Re|vk2L#yq>0&FgU*g;$X#3!~a zfdIuMRN#E~lYndcB-juA6MCqzvx5aJRHSBewapGfQe0r7?s|IeFw{`#693wtXcRF! z0A6!(f=1gMYG45Z=o|LXXgdrwR07ApiU#(a>$o<6IO2rd(tmMnkn;+l@OIs59NYcx zsFad_6z%U&0~|BJ)x8C#2vFf5GiLXTjh#l?ek=i4WJ54T5ZMPXMc^siRJXtx4`og4 zezmcKy8TZ@lRfV1&~tzdpp3wBYzx2{R5=98jXhuicbWtH*$1HK0D!_m72UR|TQ(5L z18d&hZ`0Yg8+H^+@;?r=O?3;RO~52U_8csMP*vyHpuinqP~6uX*askRa}I#L4n%^v zMcslzf?)r$2ZS5f_I)}kck3Tp4L#H#_Zf(If<}XO=b&yMa1DXIFj$K0y3yFSD~|oJ zLTy@hRur5WTBxC&8xVmNC_%Jq$#xiN`=Nybu>b(bg*;Pe$vA-81>OYUh~KMZ+wJ;( zh@m#;0OYvk=7ct#=sAEYC(g;Tdu_Xe9oP>y6tr{%F@Ml#o1y{B1T-9IG|0KJ7tuJk zhx}0~iT^wYHuwjCTM4W%0B6P~lpd_-nZfMcy_4{2`{8!P??hTM@!OYGInNPHP z1Bw;^lJwo{+a3HHz_k4PZUw#O0O)c+RRyioHpd$9*n&{r?wyZ2grQK0r2pD#=mLj8 zL=+L(-~I$=xVZO_U$sLN3hZV7HX4MET~GAhMXfS$<<>3r|0i_pe;An1<;ei;#jeq@ z8XXoLIj0<3Re#Bc@s@sE@z2dOXB&z$Jnb-`o6s~_$rTZsMDy-M2aofQqyABt2e8!` zrO%{Pw>w~Z9wz@rRCS`nIfLU~(jy@^^LGUc8O7E0zbC_ShKf>uE`2`u;uiDjQrPQw zK`{jYo-tyVaK)yzva?$n86I0w9gO^1bZa%Q?-6wk(UTjqhigX@J^xfwJIFGJoadT5 z>#5~jQmsi^>U-ELq(OUu`1>6Zujp#nVVO_|%c4BBWwySdLIW%X%VUq?FTlkDqJFDb zTk@EGB}!Y>P)vWF7G}eST^N7h#BmRn<4mIo@0=!kVy>kyo>S?lU3rpSoXl6yf3Ia( z|EgvT$0w=G_;V~o(eKmSkpz(rmEy=|tb(cEla;Y4Hg{ab``W3_#T}^<7djesHJ+PwZ7ccPS1u==bJFosVyW#t0BosWXO*S zUjscBzE2&n_-^smHTS@xArc`eNCz*zuU6%Jhu8=HkbCN4R+J0$l|m2bk;yJk=Wzs2 zFtYcYz5Y{yM<5Lo343?gk8eQ3V(vMNUjQOK+Wd1YZQ*q)!X&CuulQKQ~QvOD5 z0b;c`ltjY#t25OJydBGS4r(V0q)560Y^*TpL}`bXGkwqcwKW`6%a0AHqU7s~>})uk z^3XX?(1X#j-RGKaXnyPxW+){e=`B5R!Ua0p>8r^z$4S*#Un^d-f2aA7;YWtUV&<~Q z$4=~^Wn+FjOkRFowJKT6wXDdD6qPFm&x!Od4*g`w%I~5uEm~42m1D|&nbvvo8r@A_ zhM|D~+3KKJ?3TQo0o~NYh8Fr20a-m#)EB3h#Yzb)UvU=WTRdJ4uqRf#)z+gxRn_M1 zUFnA~ZJWYkLokxwN-zc|5sdYBrO%W4E9HyDExdILMcVU)A@w^3@>QAYKDIsrAZO6R zHWqKc%2>6_0I4FTQXWRUN>}xXG@uJcyogwCkmNH-ba8H%QCBgdJ5a$>d%3XJ z@fQDm-fNl9`_-tZXO?YB2rIM5u~I%Ta<`d2nhqEfdr3qDccZ3O6SpFlv{!8bZ`z zr1Q{5CTPDI@a)0q6ET15N{_h`N3Sl!h)?pAJONieHMe#$lyiQ#g^vCkH+mz1u5k+w=q)^i9uuVns(G@#9Y9+ONGSM9dHpOcjT z)x_r_3SVwmJ&CX>Pjo-W(sQI~A?6+?uRO&iEi<7-N%@QyDntp#>0D>7Js{Jf90~6= z{4DqTOu2C(+id|EvV)A@Xrm&PE>s&n|0rkoYBXVG@DaTe<#=;`+eBE&>NS;$V{!3H zV~1rV%;#*tu$6dqvfrcyZr+_(X~r6Jwzcbw(obybr`SK{4?Zj1ULqO8$4M{pxQFD5QwSC!|*Dv(>EyGr0*nMpUyuurIaFCdgPF zH`D#{t+@O7IXwgOUJK}L*2jAbY(y@tmVJ@n={e2SwJTJS#+iQtWe)!)=%xE^IBr=p_BQfo=xRH;YC`^Os4z9&h1pgHEMx(a z<{fFVh?B$-;h}~{II`CZd#xX9xhFkoIiwm{{ppeK zN!e+lqy){6E>yUgzdB(QSetQy`Lfv03+%RyScL*-2TkZqdOT(PIK~vYLL~`bHO4*h zOdZA2_rI!hSo;p+x3LctIOII{`wzx3SMnh3Niyd8&u5Y_|2)gsBZu>qN3$K5ibcM$ zCSuwJ)*x=zAt_FGpU3_jL(0*N0Gn6-%@2=05)0J%lQPyS^@Nk7UpT0-@fXw&h3Dbl zr!UmFV<#J3>+uZ|^JPdEYiksXvWdTV&7qM%E5>&!C%|U}^TpfeCtkA{K4ExEke{Gy zh7r92^YLBk>RlaY&ertT&vCG^e{`CZtKW>inO(`K`}q@D&r`b6bM`7nJva|lo%GL+ zy4oM0{iWKxaV|J=HeWXC+sM)fM~a^#gk6rVpUiv7h)Fu=zIe!9v?FdkT&aBXV5Uy5 z@%tX!x8f!@$_&f&E7@}A=P^TjPI}4sSM{8n@+G8cCO#`jr0q%<%!uoB z?(x+j^~qUxo1@gFYtp1axLHST}&yJ9)2>8 zQ`V*R>9*O-0iC&vLt0&J)w)`p$h2-Yo3ykdYiF&ovqg^Mrj!d)Z6`g*y%H;bJhNb0 z+W}d(10CizWZio4qyLnqf=UkqNYs9jb?72WAkzbS9Kc+mizu<8izu<8iztB%UGz0* z5Er_L63D$+KLvK$=pP$UE0BXHP-mJSs20Y#2>-DKR`b?tuGGyjSP z)0TKJ|yL0>G{EwS|uT}s((ja_K+?en1Oi~+b7FUU#*+7`$N^ck=Sd*$8TR%#L~6#ji0Y)(+Xx(+%N!fS0zP>6{a z&^hdW7VI=Z_p={BQ(i#OBQ{>BKhcyI5cCMFA9p_s*tdm?p+)>ZYqd>K6trVvffkU! zB%rX)5WWXM2=*Y^b|Zyyu>7OGMK9A(7#d#SkJ(&tpfEIhNxI!(#j!tfl?~((IwHHd z-~eU9_ZX4gq0RPT3D8NmkWUCuNNmXhgM32lAf~-*L$Dp?2|(QcKF-joIVhM4M5wiy zngg(8087cT`xVCyGhjc|Dx0Y}o3+3k=*@kYfz8yMP02P>bM`FR zwsa+C=sX2c|L#O8KU9{~6YCp^>o0)Tvj}L{R z+)U+wFj4@jwR>f|!%hX|eEvse3n7nyvS$UQ+|i0A^q*p6sH`DW5NlUiL#VJ7y2by$WDT(b zEaAE?!`Ivh-~bkVt6TURpgeGXW1sN9ok!O?`CraMU{ur!>wi7Jp|Jj!^DO_#vRcn- zVg+>vSn*-&e?Wd=ZuB3(ZOqPw{sRDp0aAUJr2!O`kKlc^zELGBWnEp**udG$o~2+m zd(?`&~HdV74X{OINWNH+DgPSF4al)Rx2#G!RBJxG3hC))}&yaxFW7v)I zDaQgeUT7!Aq;TFpI_)FG-T8)tt^&qNqI;Fzk0tJ;CA%dIx32{hcSj@(<4A=Gz+yYZG50@e2u6J)xlP_xg^D z+>rtDbMwV444+fvo^pKw*gb3pY#~y{Q?<;k1%1nbH3e2UG>YtxOJib6rI@jzF*E5$fm~-PEes{DtdaDD9OzY7k^RGy{fH@*S(C4ikJCD z5f5*_s?x}5a{6ByVHz0OAt4t-!oyo*=x;DHF-X-iVkVxt^R#&0Ftk|ihV&Z=>4Eol zO#E%{X^j?ha-LhKdcsn)TLzcyw8yH$M-QH}X|Aoik#v+Rg5*`m?To&bPvV+O1fKd@ zfxo44UNYRw63u8$qZ_Y2*UhP!f9jHF$d^0swI;;g-a}Zna(s7gA5ObUNa9u-(zGbi ze%HC7S3TnMW$q&SR*)_cJoV|~-O0j`qTbIpMi>dGYLb59} zCS%GhwQ@-AgF1W9)!7B>0`-t3(HPyY2iNl3?|(WPeA+fSaLi@}$wI3cKZ|tC6I}Lq z@1j`l?NNak{}HLgnYdh3X$WiU#BEyk?y(4Vs5u;nbv60c%U@T6x~35p!ea~#lw%e6 zwEB-JcwY@UDs>x~`5G9^9uHrTywEPh_D?|Ya=WxCxyWMY9DKIec1@9m#k;W$o$& zWS7`JbHh5-@-+qo%3z0z>LV5#xD$u#Ul!Oj4ADG$gE?D)Oh}vNw!L_GRVgaHYVy}4 zc3m-};H4I_h)DS>Qmn=fV&P-9zQQc|DCp+A(fh zQUfScwtWc)>3V#aqP4b_of!g@Mgjj16riXnsBmIvst!i9+1r!TQD`5k;1yFu0 zKoP>X{-tWDYh_>wU5yIN18!5eB?4teVB&JpilWyUg{2kMdBIb_>qHQiIu?dzR!HzD zmi5$tEnw}9LugwhXsLrRwE}7xyi*u%CV?>2H?X4O;$g>!LC=BCF@fZW^(V`~O~5z& z_l=TPaAQLqK~sHW1h^7H9&m#1wL+MvQ1JlmuD0<+K-{(d3?U)pJt|EmusUJ_g{Rgv zJvTSBoB_38^ew5ttDshZ>dDZPgNy4ogEBD)=%b)jyuy}`+GrT?QTUpW zi+9rsZnQ7@Yu6ol=++0HXsD-$ut1pVAS^-k8Wt)TGhmL@Md(3&@b~55FIM!K|D-a2 z(D}NFq`G<)AJw;1n_c^VdpJxNX$9AT8W*N#2-7o$=~=*atPGK+Fav8-eYl0Si80*T z3U&ka=`iEBgGi0548lCujr9(fzUUE zUWL$wnZR|RX|D^q2@G*)QlOLrH0&*{Q8U6~efV$w1=q2*0xHBBnqP3xxn>3%GY9$t z)H8Juy5RkAX!>m41qilH;Fdbp;Oh{uP5CxNH-);#0^AJUVgNVRTYu%oLCei~gK8+j zb#)=QE{EWj!6CTbKZ2XBBM50gn4l<37%h_M`pu&2H;Zn$S#a*gEX zHKJAqFq!q&$*x~6yMDRsmdj-~F4(-w#M;=((9GBlCcCa=l-F-nUcXg&%dN_r_o%O* zR5CzXn8LukFacUl+t?BYH9b&8@b%O1E%yTb3MM2BjQ{mf2ZN)U0S;6Yx*4EJ32sKL z-;CIDGw8aFyA0Q_F#swuUyfYA9J%F@$c+m&@6t82F$4l4 z*Bill{YLBc8?Cq8XuWxd-TFx|^+6-pp$~60u#hwNuah6Wg#;XaV2Od=Ljp=yuw+>O z>%W^wz-G$3+fC${lD?8+M^3`^XE91i11>z}7u(en2$`emgs-0}GBV&9!AC|9l!+#o@Rbrt*2F-%bnYHE{96t3b?@|TZYy-AEw z5`jUvXTDXkK0qraa@}w;_)n^+o#Y5MvB49TdtcrM@ZW!ZJB{ zio(78Ua|bWb7juP_l^=A{GDo6O!nXrR=eH+7jD9$%d5g9;wVD#kLji7Yd%CtU>{)- zEB;AOar20om=0#&1Qv#H?2BU+N!@YoH#K-L4*X;>BXu>voqO<+wZiYb%L5(0V>}d- zX9a#@kX*ukO!pPT7xx%FX=C*e4@OKUnd6CLxSkj8-aE#6E|mB5lZuaT@s6CKvgd4V zSfZr+PVCA*>n(f?jxlzl*-EISz(?`&$EO@3M1+D-W*BG2AM(%QJjRm2qrg2hNxOK# zAO7}f084=xUSM_Paft(Jd55t_9zE(c6FGfu&fI#n=Hz_vC^hMk#<|kdjxjU!q{r@2 zPz+s?KI~7k_^8{x@YXSUjnG~=s{n5-rr#*?T>!}d;piy}2L-Bz-q7PTxR~Zbv3`Xv zCp$w`%89(`-eZfbWinr1bCg~s*I3Twm`55;IJb5d&HmD2o^*DIT$6e;_*f)N=;~9f z-wst6rA!a8ydL!OVNt+NV~;wA3S2!V@xxhXT2+)~**2=;rgNE-qEYnCr{T;!(oe4_KRI=JDQOA*np zPdEZnw^eX39_Yd_7(AvPtd$QQI{vFZ^ANVL=sbo^Mq@?>mCO7}@5&$DHImb}h>na| zUFB%~eJt>#dEM$o9yj=HwM*$A=u{&^X3q`=xIZaz{K?W@#maGGET^L+OX)tDgPv-U z&n?ZvPYW0+0@gmU4N6v8PFMeY^6ad#2l7my+jUif*Q>ApP_DS~E*sNd`_c8ujmR$a zh*s?Y0TGdrqlKPEUbk!MRl#!V$ZOVzD8|+tOXsm3zwu9*Sx#I{K1E=6Q0eN!qf=_b z6Z~aD*hs!ZaNZ(sIG$^~QfUSko3j54CWl26Ngnv*V2*@%eR67D@JQgB$am-2v<)9M zo63JV{NwOs&CkZHY=&9i)O06xq;~#tY#Uqvmd$9qS}i{RGmCU_)%Fa6R)6x!puegk zK@*OTk}v)A;kyK6i3pKfLS$+tM3f5IO+_RpB>Z3+X@VNw<} z{11P%AS9>ns$7bG&zLF`b9wdTPws=WY?w73p^{4zt?#>wLa>UJ(&AxixwYEy{IoY( z+Mf0xa;koe-gtigk$sGormWV2zvnXQ4`U$Kg$qgFKI9Q)Da-R z!EUP;PNPyF%mZ^Zc77#qQYY6$d9{aSgdS#lUOh>?<)d-lqbMX~T`i5x-?aAV zGV|+}cWJ7gLo;=}S`EaF*n-2OFVA*;ko?1F0?U=Gk4NM#zWxI6nvOIeT`C&(1eIGOX?n|9NrA z)3*o_(ZC~k?|O;b%&dK2zE0+@2YTYj@SjdrHj`@IkY+!I5U#YYstQZ zNv6pkh$loQ8xOsI%TV5D&G^odQdc?Ro{c+E^lez}9RvINn%5j3CEroBgb4@Ocl~@f zMAh;9)N*Zqbkk996{879=IHZ-mMvxe@)y(9pB*MUnIc6RJY8L3-4@a%6L&A6{jLDwBFyM_Q ztA^^y5NloG;cVC9`xjHrUHM_}QZbi@PS_=qW59MLpU+m3%@?*H4ya-8ylYM zayI`HcviDjGi*LWhWak1Wh|e~Ov|%2vi#!vPwGM>TGiL^39FaAA}Q{qubk(ScchPv zS&`?6zgE?81uHz5491}{*u-c5o9x~62NISaX&fDfC1>8APa#Pt3LaSMKUl`nl`SZu zu9@@Y^5=nZzrt4OXGLbFx9^OO#d$vb+4$PkH^%CC{|)_@x!8Zs_X_pR=9vXW^C_!) zV)eLx4)T(An#jX_B`K3)N!NYTpw=|JUL)_a=slItu3(#yYYP{gyP0vr&&ZZ{50=d_ zpMPE{{xH)tq+N6HhHajOA>X@!42F&pDl-D=zIf?@oW^rix6a6&F3H6qlzQ2y*G)rH z)pzY+nEFhz>8XYznm(%T6^69P1 z?EJBB=f89D?yWw5JgG{@{aWy1Jx}?>Y<5NPd{x%n>SIF5fr%d15Ii22Ql2buIG^#L zq%hUzkFPH_a4zQlIY*^uBCxP(l#TI&M*3OBDSkvHf3lJ|gNAO}Et%;GzQ+tN{|xZI zJuvyo%52cmn9}_#pE6s)0md^0I#JW9gWr=>G&D>rQvH_*Fc0TsKEoN+RgNWj_-DaI z9iuPu)koS;#w0D%Ji*&H8}E(4wYZ+UrYX(pdaoM?_t_|0!d}e+y!a&Hhm@?xGIUSm~>N{T#kcc#`o_P>fUz-15^k4wFiPRYHnc;)-+3LO_ z1{NlY#9U$rS}ayxk&e8VvA%GW?&4DED@s$3FlCPHa;NFmr0({-i{pVGNPft2UXP3s z>$W$ragZ-7D31upu)r4=daAv;djHliR!C-&M$N2?pqE=DcXMSzZ-2lC2b-qi1_9&8 z`WkcR$n?9CU615r3iTgR{OnZcwN}aXu%`22+xca z1Jl9kGcyFv#sbtb8sw*>-zYn;GI6?Q(^sp;sqLxr>rC-~*ZN{DG2=RcapD-f)``B-rCsc3;DMyL)U zvWxJO#n6L$r-_xmtGrGPj~<9We3B%Rw^t!ppCs>Uwo6>JS!dI#3%{Ju^NA6Y6%WIz z!;-F8rC*IrrsT#3xhw5%rhU`HIHJ#y^&@YepD( zJ*+blDv|5KrDl@9*3rxcwjZ{xqH^u%R-Nq$7`)>Q+TXxdXoD$ysADMeH)i^>gIMf zXMEqL1aPywz0aR9q4cM|tT5<++4qvNXEEvx$J>gLBZ;2(afd>p4Xf%SJ*RckoWeb| zMQ%kJNQ+lIFFaKhFV;LJf7j&FuUeD-G-A@j3|U8=8@#JEyyw4Z-=t8Y4d$g$p!%NQ ziif`}d0pDv{#~nHJ?)_NwXxc{eu6=NofmDT;dJ?o5BamyyC3_vOc7x=y^3fmd#!@s zneR5p89T|;moqVXy82XIu%3x|S1?OJ*XTP2L}9RPydPEOUH$0;CDWW145IqC7rfkV zsp|ZQIz%Hq-n?+U&@d?G?NmhJ@A%(ST30buSh*?%`~&&?q{MEOh6dd}k(x#`4tteq z7|`=Wt!51K`>5t;?!NRR?|Hf_Rs-Cy&* zT*d=OgQ*cyq7hMKEJx`tPuK-FGWSUuiXlOMZL;*mut9Dty*k|y7Phkd^y_8}$wgK6 zg(ocRdp($!?hVe2Pw-u9q7t;7s%KvcVL#Covf}zItzdM5=o)YPO+IqNjvI^bd+P%1 zuIaNUmvj6n>pNufkgVG}N;+bwL z`eh=;6L0?txJcht5_tBRrd9TU`A{>xp^+&+rLIm&yDI`u-Bq@rDQEia>nA$iyvod< zm=ZLT;(Pty4=PUI)p{%zg|}MU_2P__eSFr>`32-u(#;n{xMbtv#+_A~_dkBN6o2o7 zf90agfv^V=Hg-=nv}zeYG!zRw`EsJqepPYkYw<_H$0BPV662*kxkgW(cr7&%lRVIC zL#`Jik;fo0?qGfEYJaX0Rc_!g)zqnMkNg1VL3VhXjaUI&(AT?+@&(C`k6lzx`O#T8>yqEaz@X zb4fc3=i>Z< zYyGXQs-8hMPuaO`ch`xI{Nbip@ZhR%qq+hzfIo1)4Z&cCss#U+Cn^g zQ>XA4+~#X{|JiXYKL_^*)aEb!h!EmwG1r;Hb*{!O<5KbWR`Jl3&(h457`+j<)wx`I zre4kY2m8^xW1e5h>ziLSdh{nUUi3(?@xddMI9stGb-V^A8++>hL~fN~ed_2)k-Wy5 zSs90Jk9iNjF^gf1eMoM#c~y;1`C&iE+@;m@mw>;(u2=UoSvzTPmJH+JEeKzC?Vr)+C%Q|s=cP(Pk7&baZ*c~GAbU- zF8G|zP>@`GPJxJ`{jv&&!kyyljLkLgekQ8CowP|m>X27>v4tZDo_GJ23vFxL#B(h! zKJiYL$}ulX2Swt*JL)s)uNnqL(;g-oDOuOyJ1Kng`y(DAnPlzqD_dAF#dYb^l#SyHFqel@YMI2(DxQ|5Gn;$p(}<8;@mpUkcuT9rLk>}Q5|%6Hb~PM6^t=I^tI zakj;cLA9(cUe5Ip<^MZu3`HIR4*qZ0n3Lx}QDZKA*x#t}dc1T?)L2mcx}2Caql}@6 zwzZ`q-1G*M5Yku|ish~cTDQcIL7_I(tN!wRuOC6jRM8P+HjuvaH-ZeR^=*kDgB17m z=dMSP|8H;qZ#)@1L=hEB2E@pJgUP5=A*hKqg2^CjnhHde0iuT$fU0;oA=;`PqRHza zJQ)xr1JS>&5#@D1^Zy7aZ)A$%YeJY-s0sex|Ak5v{=cvKdj%(o(Eab<>%X{AkpK1H z(7QK-*$_ASPVR74&`M}`IN*rq0bRe7KO8Wjf%*>6f1qJw3?egBP%Bv>L=Yew0Rh74 z_?A{6#%qFquYD{_$Eshel{U=7B-TP(**He?TxxsKis zjzv~Qk>h##UhL&acs*xpm=TigoE>d@q!<@&c?{QApDZt{BR4VBqnq_*VW1AP`VA!dUo0sIPOKT$549sG{iDTE)TVUf!5KdgT}= zqvBZwBxG(23#l9txOgG?z%lk5uAJ6f?8+--Y6p&DHVO#q7#-AMaB=tME1vp+Tl}TG z9dBONh``D@-RUyMG$uh#xm$5jh1ad4-X?2@RxrMu?$E@fq*!&rav{J_bZ`XkV>ipf z#CUU*DZ*=&`gbc*`wvVgXO_#EJ!Q3g)wQaFhvzbBJC+G0rgQS=!=9_*iLs%Dz5Lmf zF3u$w%U+Mn*%kX-!;fpBE!3Tzm-1 zgDzOT^}69~bo%n@8x#C2xA--E`SU5##u#2l)@I3h+g5!;GSgRza77mC>*Q8wqmjBg zCPTOY()A!dINN+#^Mt^Ha{^nJb42AD&WW{Pyk)I(6KfH9YwEFU{U_Fbd>>pp!ZfUF zcrh6{V~e@EQjD=$$ijtTSj>;~iZ5JQqq+41-(YCAi1&Bo$ri6Q>8Ujw@lWz=6D&>| z;j6@t9{6f*4tJ6>6A4BGEMRo{V8YBMG|X!K|ym?xO~{!a>6R(_0_alpUFMqv*Ae6>4nwep7J&MzQs+EzXZ$YKaYANoKv1QQ62i1d(oHxuJbKWz( zY50nSi@ZNyvhWNkG|dHy@^tT<>$6WCw0vcjw&su`cyxO z2dc!17~D5Qv?tb&6u+T<;r-O*5GVWXb5dD1td`#1$M=tD(`v47y;R!NG9rUD_IPfV z{EA!_n*vP^f7NBpQfpp1h4RP)$7Dt>^seB|rnQxY+8&&(YdBci@WHZyHsF~GsW)C( z^4;OjMv)QkPw-|HQMFm6&fp8tA{rl?mEpq2EEC`w;E5?TxR=(D^HYh zy3OWgkLSmy+SxRP^Ot3YbX0DVxsI3A^-5fb%(+6@Xv;1j+16tow(S3&&MHFceoksz zDv99HL);N35>F8v(mYESQzYHp?JVkb{NllWtT|>9whJWouOF&NSm#qk7qb_|AGssZ z;-p0W9Cvy0R)qskk6zvNxnnjs%_2^ty5En|4Gk;AJ{ZHEl*%Kn(O9y-MlLFU)|@wwu`pxSeBPO^di{sH+E+loLJfA?&x1u|}4&#>s0j_7lshoE}KgtkTga zx0@9D)6h{6kr0#XjC`fEpff-{_K*QHuaz*&ZvOohvr9>5jrsLYO3Y!$_^0csB51^# z)BA)npJ#@cMV};!_hkO*s+HxA%>DVTu5+1VHSZI*poXL?+a;}ZttEG+re5IOVy)pM)?bVo!>%Gg} zUh)yeZ(Te&JdOYSK66{ycR=?RVbTym7XFaOb3MSK*SvD_^g~?H%8Ow=8b(KB9~#l# zZuIG=BJX+FOn+KA*hnMSzbK1KbhUT(9?j7?9Di4nbv z9vjMWpsJnxCDYce%-vtZQ1F(_l%58;+^$1|JY^C+0spy-jXy(v=}(&MEr&YT(%HiV z%da2tr>nWwk24HR|&stdGqF@6t*_ISc&P~ zislh|_N5?UoS!Cw)vw1T1R}46i?}){u1eUYm&Mmn2#gS^v3)xCFe0X9u5ixLr zkr^k_d`M_(%``J^jO}tVN$+B9{svr{Ner2Q(sb?|J?&OVGB?VV|nvVF5o-&!0UkA zNATDzDHVxR^~akp>%R3QxI(Y#_{83i$@}r4Yt?^*5qwjF?w6Tpd2so)Dd1V+pJU|& zAN5`dgMCUxzPwX3HuSRV#Di+rNScN_S4poc2ekb;A$14&X^#Jl!~2Ff_h+eR@Qg{q z&!q{AO<6vv8GhkD9)xU;jME=}$`IjIJGtc7UNP$4+ISCd#PEr{&Sj6+Zed+Z*hy3d z#C$Oh7447mPW^cLcAPOb1_H@myV`#4+?ZntLv* zRh;i7-s5hM)*8PcFIQ7#bCsB>!!^1uKl(b5A984?WTE-iiQi9kin;vR7_aBypto;V z%vK5viho9xN~*L{;=QX{ix=#B#ZAs&;VkaHM2x`@Q#W`jV3ek_zKtxk^!}~%-Uw#j zyCXE(1Q*EpuO8B^p~{qfofPQtNdBw+YuW2C--53ve5?7%Xw=M%5f*07{QJ1NQ_C8jH*efq2q_Y$co5oLOKK2z-AzVp0PFa~ z8v>4BxA4_T4O#Pat(7lgDTdze9TvXP=h!Cx%t<0z=W*OsOdAjn3W5oUbGzDD&m>PaW1{w_bfk`V2um%~fXs6{?`S#^^maAGP#Mj^$~ zu3^G4mG*+WDQnM@%n6E916qPn=`hu)3~Xm&HTrsX1CMh!qA9P~wZ@fy#|dRSgs>JL zsSZ(7F=V;_%VzPQD7-PIOnuTeI$|}QjUsS`&xfOoe1y7rIlWQpLn`HbkKS|3v-ag- z*A2~98i=o4?T9NC6IQ6cs~?2%Ips{Sn6%Wz@3ATaCZ9AZTWIPLrLtc!>^o`8MMhPr zOHNG5Cj@aY`W@n_tBUz!M?Ga{=;Gyq{H2_0Cc}E~qb!Tn;)&tG(zK8=eVusG$Kov> zHp52YSKUj$U1QCcZ~u~ZmjaIq#wmU~9=3QZd#(0qfNwydVK`H`@Z&?4ciMe9#!T4{ zD!)${PbH9QaT-eH^_IV%IleR@jdA?@k$RJC?j-`kU;V{m2iRgMaLTV0vN)S?ejeBD z`jsked%G!B95 zsR`sPFOCbIts5!}L_Ef}BCd zRiE@+VhYzV+ozAYAy*tz4w&CG$nH^YrDQqtsk7uNaUEfpNwsCb+ne~-D}4zRI7uC4 zrVspyjB8JwJo~x&CuzmhJg$bKwZOq5mp4-GFHJngDI1V4LdL%q(!DBvgR9TPui7*f zta?y0Kqax_N5z$*ZdS09q8(1h8;`$-u3^mc8^iE1#7yX)3$Bfwrz8#ZQFM4 zw9TEiZQHhO^*(iO-8$8`sz!H@{C7zZYv%JG3Y$hFG-)AY?QS<4C!_!NT~p{h<1T7II3$TujX-B zHhlMhY9K%Xfj%bGaS{3%D57y#Tx91_V_MVQ%zy#fKO2Fy*awJAYQCApORJRC!gaa% z2e4skQFdacs1WrOLa5(Ba9}-D^BgyaEX6sHwVjSiqq9fM(hAm_9}V!|isi5KH^G?V zQ)8xrRYQ8qxn1bLwBfI7rFUkzHLM%+cZ_=4b$#Lx2A#=~Gl067Yb5UKl|{am2JAjG z5B2|GZZou*?_iE1d=(0+xHAgOc&2G(!Y**PzG4G%&^z0uG*n4{tZ!3Xb*GqI*AOR4 zGR|SFr15c8eg6Im9t>5^pn)ueaW^JI!@Tq7X-20AO{P07_BAZ(hTR6#yxPw+xO@O7Z{4}zeHNO|D=5n!Acmb$Sz+xZX zY@O6>(g%@D8;h|Ky;JE?qRRVjgo|J=50HG>$Mg(NZBCwa@3ttFTnFu(Q?06T2b)IA zMoWk$#r??hm>?k*>!a8U!I&I;vlz-<0f_-$BeEx9ZVlEX$MFTr`?7|HG3g4Lsody4R_VC-4`vc5#Gu)|t ze41eTi_5n|lzYq7pvP$mJUyqr>GHqicP5*J0UbB4Pu74vl)F5Tx*x zr1c|)&ur}P*UPp%_x6ZQf7ixMC=3LE_){-CI^?ru&=xO%gdzgHcKrGw(IM05?(Rvv z;9(usIEFfqg)BP5hcN}fqDogA+e(OIp^pP2Wft~)FBj!!N|XWtK)MQ`b2-=|;8sX; zA-?^4m*en?oh)$KCAO(cy~Z(dWUGZxA$DW?qafeU)A>#;Di_SdJkw}@FgPk4_|>#p z;z=S|%heCgsRcJxX4^g!%|unYU2IC8KD)CBPG-TP+f`IQlDdaVAzy4d;sremEI*in zXu^0|U*Fm|AfXh~R95bhoY+^-;y`EzTj9mB7Js{hrZCU|JsCfQi1h?lltDk8vy45`GTcolt2$kk@-H?G zR_+5X&MVS&lri4vmKdVOTR{lLvRw*#mv~qKd4n_IOg4bkR&@yb3oL}AQk@CaLW-YB z)CBIpoE8M%)|nAltl@ovH8nRJy0G4Ml}WQl5M38gv+gb8_Hi6DbBJx~*GZ?Y z0Kc5y7M@Rra6MthS~Wl9RerY<~dQvlZ& zQnwsfb-WT_&Y|CKcMT4`Y+A~8K_A$R(g96p>T2!a!PjoD=Ft_DT z(>L+o-@d-zAW^2ec*9J3fe;92Lt9Ciku}F87E<2hq}+VSx7AL{X2W&!dUYX+-3y4_vT1 z_(p=9-{qr}tJ?$SwsY&Ctn|u~oNrqt?^yGiCwm_?Mr;#aip#y`@dG^Iy^Vn>;;Ya= zhc^e-2-vV&EJN?fkvDT)I}tWrV`H!O(7db^uqKlxgRCM@qVvlKa&$|xl1)qpTgv^f zD6J~JQhAYH5=|l2bq=O|Ur5s<<6`r&yOl?4kkNsySqrK-LA0nySaEhUy?ks z9^km`X#tyPf!yn-dFxVwCKgfQMFGg594pAG=R#i9HLr52P-{ zyr^(zt>~&@jpo8D3g8|1N`oQodzc_>7s*v8f% zutOuOsEeF<4bi=}Gi=S*dRZwA`)nb#x&$Ge-|TLg8>iNBff;j%!{F$j z7VbamM6aPfHvcW3qx$j=DfPJYvXI;ZcQS5D)=Wvq7>G5b4|N!_o#1p5yi7;pNnDeu zBNWmoUDjMN>BIwZ{KQ%I$yY5cz!q8o*Uiqmk+o1b>@lkmPkAufj&4*ayFo_4i`aX; zJwxB|H$~5JS3i~ZX?%5-f*z&V9^1#U=qzT_Y~Zf6V3$n({=WB(!sG)l2MC2MX?Wiv zA1$c2Kqf+n96#CGk3IA^)$WE7iSHrFK4s+zE()t2o6TSQovl%|UX3t19BP~@A3i$kyb(C<(gMhcf1{FJmQviXGZedWLSThbK^YTT4lgMZwvw=4)A3w6)o9!2Z*wm?8 z&H85XeEwM=&Y}ZYvf|axxl|NE&DR9rYNg&@+0}hS38uQ^CR^yzL?+fyeufy*26Fbu zd?l~2OhzuvKO$&LWChg%t=ywj7o+>=a7i{o=W*&SRasCI6wR%J>zq+@t=h1l;_GM+~G7uCH;IFyx~0gp2mA-m>Sn}4E^=x>uJnj z9f_Z)MQ}BTBq}SPD?Q}VP*fThH{+5V8;1RkS~l+A{4PG{vQZI*R*d{Q(FDH|SaeY< zTNYTahA}-a`6V2Pw>%fieJDz86LM}K9v?U@X5ZH(>UfVm2`;NSVv0Oy-ZS<6kCIHE z>K-(HGoifyS)$X}nH){EUsnq52akBEHs=E~i)v?`3HNC+I3l->N6>HMum= zrRnB_KZ(>-!kJ&|HI$>0_S0T5=uEQ7E^P1Y?Aj3?x^UMMyg~_Zut-+=G8u+3rU(F(`-xXyYhEwqQfeca*V)=RLx1 zNE`&M>NFELHXs6_yQ^pu)p6{=>v1*0-h(rLg3f}t!pP!qNmL9ACjMYiX~nT_tYF^E zp^2pauuy2n(xf~+Zc1Xyg)qc+UP1A7Pq z3;vdvxzai6_M(t#hq)*3RL%%hRPiWEx1u_dw5Y>|IDoj8C8|!tjLCYMSZC)HapQTk zu=XE_i!3jJtyUW_Q)32zRJK;w)W!u7&0+8Xw^HkTfl1G>06-jh-yYazYN(-MUGS8( zl^*d&M(u}wGiJaFWnJAQuC}8OzDe|bqv)vL`>4Pv@xpe zv94ijl@FQywi7$qA)tj93B-}OC6bi>FgltMa(*lVpC&uzwsnp-!i2yCTV|5z1i*tg z{3(DE$t8%dIv2QtNW3!GJ+$p9pZHXC;N>TJ+l5&AJh({*gCkDAy)26L0wo--=+DN8_lfHR^Y9Q> z=-Ij+@mJwGNc8+vw?5*)I@D|}ldoG4TOhoFkK75F=&Aq331R7!EU=!h{#Bs(x=jic zK6p4hrH1wxs>tqUA)e(aYqcG3gZo};_2u%|Yjf_hikhPna}Wt{Bc_D#hdXGEVhM}6 zZv7Dub+tf?hyvprV44seu_rtAsn;a{xNCy`0(&Ic^>?K;GY1eVe`F-aQRLmZIR4aJoC2PQ@9t#ke9JC2%k~a<)xM`^OpvvifbVvObB2Q)*Ozp9Zw#> z&?3fox4B0D=eR@(_8)lJ#pn@}8^&BS)SjN2Ubtl$x(<82ykGN)5^ajGms(PuBSHs> zz;|ccI(f6HSU+#ZuW(lHo1vB>q_GvxhnW@9#C*J$3dVt~m0#C{Ej!vQ-bYt{_sC*T z2u3r(j6pKhLsZ06AnUlE*(u3L6ngS+5MleZk59|LM!&1<<#j7ry|^uWN|0OPSILv3 ziFn{~@GS`-n=QhSjd2bKT`hOe`P(rJ1eX(MeVpmJ!{5|ex8s($9Yc1!A&QfR@DT~- zYxE_tQ7k?SV}8Z{-Y!}8X2;t> zc__>Bq8Bqm zCOIoQ>w(W14e@}Oke#_m!e`sOfXvhL^NeMno8JnC1!)i`zhfi!ZC1R9OV9{s!O85H z)Z#Bh+Ll*f)^}c#nIm8Kl4ns8e`>lVbknCD_J zK^6jR#jhc5(INAK3F&~K`+^&TH<;?VR!PQ;0;f7%kvP966fa^e-g`aP0 z6viE|9_)eYO)kf7Cp-bnbhM*ZJpcRnix-{O?EC4ZOQdVLFreA3p1#xUod=Y!tvozN zq z_>(-JBx65jwFvAaH~CLw+m? zE@$H?41M%P_AJ#?Au|OopBx^24Ee2{cC}Ma6aGNTvtt0|gT&Q}o+Ke3^RuM9ZW_`W zlV|tc-Sz$#RZFRY=39~RNi2x1hEgA$+tQ2HzvS)+X9+q9dhs+KsmD@wa8%%{Cr+~o~e_>6qWY61&PkJYvJ z*~MZp(8dXXa=gZAC}O-Gj{RoF|7nZec_czdS>m})RZ-IT5LxU8u{B=9?zO3Z@P_&t zJdHA%5s29K`5P@>u<6ZlP@^07Q}i~~+fNOcFw3BfcDx0RiJ zBTH!aWRK#p`WSvxiQabl#7~-9>2DPeBfWLp;s#o)Tmp4Q6StMM`I>(slEfqYCgoUGq|!&Ei_6p?{W2v-24Pc(H=Rt51Ua zNd5JnevF-_Bo0!~v_>G!;>TS`)@3Ir8p1Pr$-|NRvpO=s)hGvG<^>hTaCx$`hBB~*# z39>2)DCjOGFey7~%Zz8%T0k;|?UZ566A5MCq%cM1gv#5A&odDKU#z({A}w=-P>1fR zo8>IedaFQHI*JcF#@Qup!eJv`&!46f1JbmY|2aCn-aG&bDZtss>X{D~gALR#D57Ms zLF^^U8td9@mj2I{P~k|2CM>6-vGgVLnfJ>YNP2#;dpD-N|rn z7_VAAaOW7}!jTBqA(M!E)S!ogUnHbw3fi6P#ix%$2T77X`p2(m`%kF;3ro8>Np(CC zozZgsZ9~8_vB_xTGqb2jn)zTr*%(P*DnoWl_OL8?rQ_LQb^sWz5IQwQbj) zx6bW3d{KWd@Az#eMI;yrtr=)<7V_CfBEj*2*bRHun%~eeU|8OcPUQkFp>A=lFOY$D z<)eiCX#@d5`yZ6tp*`B6v#|C{DVvC$u*;*H+(cN{jRKkcN|Y7z;1OL^vRdF#3bJ@c zU;8-+Bex-o89p7qeJ{Vuv3|~{brZx2ibvp(jsy7ua8~f1KfdtUW-x6hTFFlJR+cT8 z@tHT?_lu$&&5Rcqju#I-ig%y37-wW%+(-9gM3*#MGkn)-jbt)TL(@5)`Q)5r<4}eB zLj@1_1vpH6e=~SDd+Oe1w1}6WzyC568ViY19N?huOhiMf#!GX8mBX_8)?~e6!n%-r zo`Nb6WU!-qG2_L@X>(zea47oK=@tJGa3jx6_U0>|p$W&~pC!3k%UB}D?KkvAnLu#u z#IqIdNNPVhpumj5-)$Kw$`U~v-&Mo)vyOd(-8Xax>`sksCDzRsZr6W=fDKu*b|*`3 z+*X#=mdHCHETcwn(~*rNSGeQy8O62it~G{!TiT=*Jx@g$EB9g8TRRywbcDQbBEoswDqI@C_a1HZ{JQB9l{!ct3i@CV`>|DYDW4!B z#!*M{7qVFt`qkoV#36>Us%i;K2hfJ4k_kEaZadML(B`dhEbHVlri}zd5LOgF5X0ei znOD+EkiCCP&-o-}_Sp>UxQ6?zGw4B-l6+of))dbz=2G^%M^)`(p-@d^bT5BH!9i@> zgE9>TXoBK~R6g*7KsE;SXmLGwJ!6N*wtyV^wvR;0QB7aZ%a`vkrdKE~H$OH$I}v_8 z_TW_p5J?Q#K!wN*t)M!yX&GV?rI*}f-XZ|@&YiZqEvt^sM~+ed`uoNwLz z!s2{vHvlBvVq1|dJX!k@{?MhgO}?z07vie=KA#32cRf(t;k9G#ZTVn-))96r47&(9 zMTtQ;+c41sP`=_P>tMk@`jwuM@9vS%@bo?rk=kkA$Dz><_N>ucaODj8+O0(F-z)RY z6GXJH*S;rT*C?cPt|r>*a8ZNVeT=Pj52g}NEWdFAk$7shz15zt=?Gl`)f4?pNmv#+ zSE(LkGg=K(A|=`q!(y3-Y?d|GWqpFm?#C{WV>NAP%IDRr%6tLgse1?!wmBR|B2C3E z%fbUWa9`7Ovy9u0GO_}u(fBcOdA zP$8rh4J|0VUiPVt{E5B1zr-38#PEw!#k((@hs&ol^6>xFx@2E9N*i2~TaJlx&Zn?J zw#N1nT{M|30iLfEfB+X8-><9Ln?Oq3BtKB9mOTkU7VJ$Ji=prsk=+Rs@(oJ{6-^@F4ZM2~?eB<>svS6G!Y5n3v zBOQnk$SU;~zF5E9Sfmv}iurhFwn*AhX81-+Csa>FhxZGrvlBkNda}0rkHO(e3TQ*VAs~Mwc z7B4UFnPuUsr%Ez$-tWndP=e7|2c9^M*Zed4gM~aSHAT{zk9tg-uLnIS6DS?K>Og|Q z2ckm5aKM&Ehork0O<(J?s|_^65)F3vLk)oiMz;;U3iwd?h~Bx~P*tNz1>>+kzjuoL z@qYTpzb3~C-Tw@;CnkpHQqZVw^~Cq)xh8d)`K=PuJP3%YW{V8h4xN56Lj$PK?2Ls~U4+7~9N3#~>!eW&?jEI>y ze-uk!_ed?w_1ba_LPa#P( z>I2)hIWFdJ-=+{E&a|>DJ<`7P6{5MM4F^`gc?JcSLH7b`++R$GT};AEC&zsdVuIn) zEA!&r*P{8GOtT9Mt(%S`?um_JfPTK~BbKbt6Rq#t$pcCovpK+4+}m9_gwV*Gf*PZ$ zMj+JkN7REi=czo;A%r~EoNPFa2<3S3ojmAU>ST&4-%z?V11znjkuN8lDKQ7nvO3Eca~81w^m zxkyaA;0Q2|qAe1np<{uUTD$fTVggH0>#7%)NbSUqgN$*MZIzKV&v6?OfBZMFh@}7$ zj;tK-Zq@TwM-<(44Ew}vE+z&6CX^73WibAPmolG zJWt1bPTc-ha1qc^aoTjSkIYWnIYRnc{$j$$MCkXpT{NO=+VC9aoUuU6K;t%qoi3ZH zhpy>Pfh6;@;m~sLYdq&g7FanIV_vRP!?^hUkgGK}L|Z9`Cg3LVhFpq_IH4`zE{Yr7 z(z_hg2X4=pS7{J9_RhD5{Z>F96-EJI-m#0mp<2RsS#(?yiY8ANaEConZ94?>NIJ#$ z=N$z2_i1@?a|Wqa`+z-juA@fB*s&&&z(x!jbw~4I`>F3k*&~sySDlz0rhW4V{}ODr z77_=;P%M2?eC116vJ^GZiF~#qRvCr4mh}}j)=FWB?vn?ya<*?vYpG*U9O{t*BnNmd zk`#o5*_nKGn{%3@j$nXz+xi0-8e9`2h`4gA!44X9?(o>JM$+B`w1p{ydi5UtgcaA9 z=!v!|IUZ8nE)SUrb69MaC=JRihz)4v>V>=0L>ieBm4?Gz1-+T+^^Fu1$jUVsYwc87 z$d9G#+G|jYL`%$)mM=A6b=U$2PwO#E6h@>0^mX#H3)t8AZaYAxFsK+7pQ%h%P$6Qn>YNEY(TM=Z2Xwq zhdTj|4yg50j}gRh6-+n%<1f3#C5eo~{+qv-Y$xd|XdSxK+@WE-w0!}oMjxjcL4!7jRu6`woszt@%u+zDMW+hxK*iPjc@ZE9 z$?F=N6c1`GqLcU%O%~!7sk3UVb>v%aurz8BMLyWgtl4R7yMJU ze%ka11ey$7I9+!lXR7j&L#Gbhvc~n{p=+p=k*B1&3TAZ`kb4`UMzO;!t*q)yGobY) z3z4HRrOakCT?z*~LdFUr(U;M;i(z~6w{~j!-(}tU!=Wrytn_6f#I2xMmZB2Bh-3GN{snsG4fMpTa;mSml++)i2hn ze|`t)4oDks-3fI5QGPX|XeO~WIt81Nzf3gwqs^;n#8EE!Yx@}>I6u>Ph327s`3GIR zUL{?Ml_EWO*9p;GkS974_)kJ{{n?^j(_sRd1Q&!IvbWHu*MnNP@Td*nZZeb_0`?ZMl`T zM3HA0zurwJ_+g;Q7Us>Y&AP|!fe3g%pqf-Z@I0-iJcP;uF>>)0*Oj82=`F0HL(x#Q z|L)+YMFq)VnN7L9AUx})-ANq5Rs$Sittem-T zRhId&drB70wI#Dus}ReVl}pbAObY)$+V8; zG5>?8M{`_+*!4VcFt@z`h4oR~Pg{J`B;I_9G$VJUCs;l1@=!OpTZBz9fpCppIzu6P z>*`exA92Og2{tgFS&Ve@J0S;IYEEs>0+0Cd%FJrb3x(ZBCdQMocyF@G4YJ3!??Y&- z8Y<~}-jn{=PIeqff9G=j=PjOjm_Sc;{%>Kbgz~O0#y8~ttNh<~`0vNhZ_6h-%+iJG zoA%rCIC@@X;N8tLXLywWD3hrQ*}4XQ%R7pXO!tgk5=O6yh|Bo#Jy8vN2z%kmMe?@7 zvn7v7Yn+xS%`zny@&;gUXylgn=lJaWwJT;OfopbPW-3IhiNp&zTB>*-2XfxEyeEB4 z`z$lQL6{Wzl`}kY_8~5GgkT=ry=7Li&}S}-BC_b+ynYHWY3$OmBurE3xtt+v&V7kH zf2KW)hlQ+AM@}@+@a4sf_1L%!?f~^zA7In zLhWh{UK7?#npQRo*O99g8z1bqk((InIxT3M8sM%@gbifMkFp$-20UGW-(EmrQ||Y= zWPz9Rak!zlBc>X zOa;ym(3KgpmuKqA94*gx^co5S(b@{>D%M-VX2-k@7<$cgXph10xdI(}(SM~hg`bj(U_Z#aUsAR+*edHIFa?%hp^V>|7udnzeFnid1_W!Et)i4>IR!PV+t>g3TEIY zF~nV8s$^NnZ6OpIATsJre!!Fzl0L>_H-mQ_RB#`MwpieTEVa zVnaYG+bKWsv$CITx56J0uQNv``K!Y;(af1Rl-&mI(X^lHued|-%0bZx{uNL$`dy}em0)}a++f4vx?t;eshpN}UFs5imJ(k(r$H&}_qIn~!Z~$s&tr^`lblVZ z#!o!TYtpyohU)qlL5cn83dTOL)RJmJ8B*G8VzU>LlsG;$$c1V-o^Zfl@VO!+W)3P$ zA|+g9nT4~yuDSejC2ZOKN3ais+r4#AYTugh35TM$)L{Hf`v*MDexUZPzxyv!B z)XD*A@-pZ!PD8F53SJR4^6balHBrLQoz3-dpkAV0R=;(Vpv+kKexM`qcChuW!a?mN zVqp_f^I?l_Iex()`JJ`?EY;C=Hg@4Uxuas;702>g$Yt`6Y+=cM*X2O`9 zGoGd*v<$!ny6Sio7byyhsa%xu6|1LI|IrjrZNv_eAB}?>mD}YJaHURjHN!4ZbeE<^ z$c~~ZkR3RtQmM+E0+51Yi4YsIp<=9tg=)P4T=w?EDedL1-pJn%tP-8 ztEZ%SX=X`HvkO%7J?P=n0~EI6R}5p>E(m}umq0meG+aduX+7v>Z)A+#>bUn^I(`{z zSa#2nN^TF$mAWVjh)>yh2;p&WXA2>|H8yBrJ`d#{P+<5TbKP77^0^oeE7hc3M-@-c z2*U1<$!EX5HhrhNSKr;QZW6E*ra>qV{;p=nDGjr zE!f$cE7ty2%IKFdN)?pY(`NV|1lbJOt|_l_L6Ve^U5s5g@rqPlKEyc)VlJd;s?CXK z&MT4WHZbcgi5&O^ab~`$nzfGE60?lUBNo(G5TXSi`25*RSnn|DcIZEg{VXjaLOv(6 z0X0yp!A*gC_YS3-yK$&q1W?lA(s7lTBp7N`p?DR&MYVdrPXyaJ{+z&--hP0pEE1y? zx^RMRP|G7a0KUr>*p4OMK&FZ}@}s>l$~jS0_GNMbthRsQuuyXh8{z91_?pg|K*A4v zZ`}8*^QlE5Q+5Zb!eLhF#F#bj_&5->&n%!xvEUXdA(jeC(Ut!B9me>{+QV5T4TqF@ zjy{;K;f4)60|nK~V0Xby^2zazwo;(#m$f10g>IB;+@c-HH_0d{fV7JBm;!u^kb1Bd z!(M2D#sf~BhR&rbjrvh++W6FJv}y90RjEwg&(OT#nxKntX45MnhQwXFCY+4}zJYik z=sf(KVg_4wyFHO^&Nx2pFI-7;hA8aX_lAeq+U@n-D_O&mpiIYa9}%7zi7tTBBR!E< z@Ojsb-y7$w@!`?FoNAPuKXs{Yc4(UZTELa{b`m zFMn;k7|F^i8ZCtIVq&12tt;(I+99uj}iIhG|v!Y!!C#z%5*9r$<1f+Fj;k zOD%yO!tS9#NWoJ!X=Ei9b4UqT7@RR{+!|#iAlX_tvJBP2jbq;aXjQD+blDDx24Yu- zn;Num!?;qKKMMqxpH{vh%LiP0zKGlYnKkaFA|%z=qxR6sa-NGRRy}lINQe`cb(@2m z|6)k3L(kq7?ZYWoEY$<_lCZ%+R#uh`8oCaykX4K$^ifKjjbngH4C-jl13OoWDMnuO zHiy~GsdW8|E4 zheoNUU#jSmeTVL=T_W3HQfR6O0g1#$o42A&kQd8zE)hp-F>T8TVDK+M7(f>|$WZ*& z6{AfEq?Mcjw2bGh+*`z*!2`6E&sXR*!TuP~93yR{7FK$ew4U)~>ds%SHmioJ?L~4C zUpJ$BM6!^wD>N(uIFUGS3{-Q|Iu{b}{9`XLR|TD?DE7vmU`pIS4BE8pnpV3r4OdoS znTZq!UP?nPo`Wg%;YHf1()m}W__yg^ zHqk)suE(+R3D8rtVZhMoKgXM4f!vBt9VEPM0{Hvb9L_o{L%>Fk8i-CZH@gKRt|An3L?~wYx zdj0>U#sB}OzW<*&eaZiU(*IA0{y#zee=_9%!sY*;NdCVP`Tuty{~t5{FCPCNt$&;C zU(JwzVjTZ^MgL|^{Nv^E_mV$3-T*FDD1v1mVu zd;7))R?qrS=76yR%))<*pYnb${5@^+$N8k^9ORRJ3447*+v}5h{aRn|r@XI!4bt33 z3VvenlfAU=VQ146t+^KF=TB5oRXMJI#NCc7GWy3)uTDVhk0rtpKezCcdT@S3c2yI2 zFNitR1cBMfCp)SC{g3td8`0$4x`{obdU-N|YyT>Q@hr1~)s;Ma} zANE#X(Eq2^41mesj}EJspFJkz?uUMOcDR52zz_Xthj%I9C*>V}&2Qv;iq_of*^SIu z=TYaUS&Jh=vlUntg(fRz3a}(}*{|b?zN4ZFa&~ULAMMqx;>VK0KQR#n1cu zqUdACT*M~kO6GeF+r&&*`*%;}b8e{LFC%pEksjplm5ra4+aHb}tFr(Bw>-wn@x*LK z`8*R#u?#0#)9Ksba92Ni84AITsogKoPf-IsQ~^UJxK5MbkCxdrNBwFRy6Ly^}gxgf<(PL zZjx^m@F?QPCFErK2&-;-tg}Miz&Hmf9~e(^r33b)^}q$@`{098@yNcpodIE9b_Ab~ zR+cqJ24kM;-P=RNZn(A9Ppyihg5)Ph0tb(mX$4>f*Zkc5YXg15r`=kGn)S$ojUyKR zv>HgH^g=+f2qR_b*e)8N(tUl^E53>BR{mu_EQ>iu+KDjiIl4atP%sJ$y9jUQ&YkiM z??CQ}LgHoOEj=5YjizjpgB@hTaqu}RW^&kNl8X3JA_)z)7r6WAxdRyl4+3hj^2$+@ zoxLZaGGZs>j{KYmX;tlve?C15@I73;LhDlMK>E94;Q70I$>tIc-53M(vXq@*!)}I- z=R?Pj5YH2P@sVQc3nf6YWyn^ip~*{Nw;H)SxL4*1i&UBAzFYm(g3Q$#ey4A7eCaTC zf~~9ur%pL-H&@z0Qa`pAn0_E6ehIH%w!|Ce$&pybzFcaN52Cp`FM)c+`XD#&m(nsB zfFw=u?yzPP|4Op|^_z^5Q^7Ar?YSP&-HBeB;t5P^*luc>0tI(4k0>@z?h$p%WDTm0 z&1ynMX2$C&BRZ-S0Ix$eE7G2r^$o4OSy-6PCHMXFpkCOk-2vIGrbss=P6FE%Y@n>O}DO%x$byPHTUmIK*~YApuX zCmJOBr9ya=>&xuBUT3_BM0KQNQc-}V!`ear{pz$D=U|qxX($K$CBRn*68;qHYpR6{ z3LhA@=GvJfk}C?lg{YVM8?0?uf=T%n5jQ6Z2%|0hLBEW8PGCj9u1E6M;PP>^F%>!G zKx$2eZrwA#_8k{u!S<;liqpv+U1amVPQHUrw7_^6Dwuo8Eu3)N!#P)~jCyj^T{Zhg z#3qgKQ%l`kh+PdZO1rqn{F4?TS8NPZTB{N~=tXEFc<=0*-qKjr>c~n{>SeD!Y12eH zG1Lwazs~TQonJ2~7>_XZTo(01W;E+Zy#gA|y#B2o2DIJERT$HKm5W&k$Jy;vUw?d} z0sVB>@_UJUf@gIVid%YxriI@{NAQJu;inxtnVcUTsV@7Y#X2JcZd#me zr*Wfuz5@RB5iSVv*~Xa+5URUh-+w{G>yNDH&b#V~_ccBLBA+)`^m2YlYX)F_$sQCC zii6NkSpxjl)ibU3UA4VTT2+Pu2lSSp7zpmOl*33`rQ4|l-JL%jJ*Pzw+`x$a14gx* z3%~ppwar;x4iRNS7=K_e;REPpCqSAx;4YX}Cfe}C`I9v+6uPPXU)7b1&kp1F zv~0rGTa*hgx0>dT%o!f^JCjSJ&UCNw13Oq(71AFz_Bfo-bOQm|6*0C%Gg&<31uGMu zpX`nz-;cc-HrYqwdtxhZanD$(`?l;x1}JJ}gR<_cG!>Fu%`-#XbK_mhby(GMHvrJT0~BQc^@)#gRi;BlEyddgYGbIm(7 zE*@dqGN3uVZt;YobNm|T+)rP2_N!G$H@8e!+)<2TZR20V4e{ecgWJ&k$O+6Ra1z z8!KA92tRX-t!k|qZxV3$%jyZ)dKmE6l^g4nF)gTER#Xll}z%Jg-)b~V7d z6Kj~}s>N?;qO+@PwPM~{2ipj>qs(LErS2yE8GMK66u!S(3q`hh=yfY0N}$tvIZ86} ziqtW>JtNrBbpC+B7i;ZHh?t1H=BQZ@|%3uESS%M;Gtg!71 z{G$>gBA?l_+sQq7A@b%OO+d{Po@1_u!C7~De&9O4a-=sLxX7na>T72pg(WTy+$mY1 zneSW9QW5;^*;Gb;Q6TjvudnpGN@=tB4a`Zwzfrlw4OM^gT6Yckr6qYaA}Mo12xwYl ze*_I6%Kutw>(Amp7}1>>yG{?J+MbE8X47zmw;4qWJ;?|kpQ6c^L$Eh&BVE*VoGrJb zZSH1dmVK!lbYd5O+V6CBZO&LD>;<$pd(QVW^{j7NMU&<m2j=QdM=j8Vf|ycloM^`Ba~xv3=u>0X7({N%m1ht>s1m}1^or(`4BhqEPn z;d!+dWRaldrx=+lOxH0`vSq5KtJh{GFEMDkWJmFR5I9MkQY&ALWtwa>x|3C?N%Z<& zcQ!=J2%}|HX(oDL^9@vIo!V9FwI;Zc%W$aJiLajeJuU|KmK9YVamflIIiQshrL;RK z%6h3DPI5Wc1X=bqtHtUN`UFih_ymc=pqkRO4Fv=5%YZun(a)4;arA-)6BX5sio5k1 zpHp7BCEhP*6g_p=tiaTd?C=mw!c@LRb~_je(4H3w{DI;5hE0JpBw_qxvbi@%bZeCB-lD(DSWv};wi z?)WM{kWJ^pbh88;ZqW%i4keV_c7#2J8SeH6Ry^zQnD5TR@v=sKqsb3`+y$LU+A0r4G9qtcxl?lfCj?UdOtFd*$2qHnFX#^z-(kM}f; zHxA&JJ4ue`a2)fyf0ZTWC)8Jy;Ba;9Sn!nfb3NI$8q8dQNaE``gYnT&zksjtcxQ3Y zW|B$s9uFP(lU%kR7JgR0vm1HB`n}ecq0BLc@UgT4)o<2O?v1y>89bGe)?k?@{HU`Y z6EtDe?JBEBvDVA%Xhi-2_S#!3Rlc!p=_LGcB%H_HdGXyQShOR_jwRSrjOcBemYREIN~}$=7411v)IJ)@s_IdO_nH{1 z30gLG(@1L*%YIZ(0-A?6ddw95CB}9^%5U=N{r(Lo7)Gmr5?+{` zII_Qq(2BHomRlX=fU!>%rHeUY0`dwQZpbxofp5Q@l4VqLGJ_K$MRHHHF?GRR*OXT4 zja+5e{QZT{9Lq`5&%8No2SwzuIdrrPRl_DR1)`+b8a9g??ygF;D^-fv^!nQ=CK7}* zMMx0#)#IBEgkQ+yH<-K7aYVM$B_;s+yi}(X3j*{pWVoTDdYw`aZkJiVt395(rQ22* zHK>GNy3C;?wZX^uq-Jd)Dh;>Mle{=0M>4XGQ6JzxK}OBZWBFyQr4NsO6+R>kHSU&+ ztjL1_LXV-PE1x08$fQSs7tHAI5orpdR(09sMgN*|)b%(md=2p{=r%1nSxwjxj%yZ0 z``aY{rEG=~n9NjhXL8swrBtJV%j)d=)s8d)dk}hiTL4yT{Yjw(Qg*DmVR$S_f$N&+UNJYAx zv-aV*{dcUj^^XkN%MVVFK(d+FCQGF4U3dMQ3y989+kFwaay}>2*u&O!H<=(N6eA-3{_bj(GG*%EN?c7pvPumaV4DwVE8 zB3-8}X;mO;jmrgob2RUL>69}V;G&yu5pfmF+6eh#uf=H1bpW)Ao}eO)8lOpG?}Z}f z;=)9@vD@LyL6UVvOO`{yD76bVQ4$xSzkM`G*-UZ2LIO0Gtxlg=8M#V@YSE%_+=pth z$p{EnbVg&~gutsI+PJ&Truv1>ojJp5#hr8dx-X#bKrv*2j{K1LXncuV@G2~*3I=Mc zGNKC6h3a_7Ku*2%3|$Zcta^YC(%j~T^Q`VE%c-8|yi6wYqW$YlPrmZ!OZ=x9JfLv0 zIKr{*Yg6u+N{nb)4rWmB^6y927CCkoHC6f{I(4AXpiRc8zqA4bR4|c%$uE>U5;msH zkYm_Xp2{;A-BNE^<|eGKdfIQ4U!NWnaX$5w+jb|qE-Xuo z(TN)N)I4x4V?59WTHHIf=N<)aPydM52R7o*gOEJqGWosOHHdqUm0?Pw)Zg_;w*%yZ zs_x2Sr-#%M$I4~oE@(o2m;mcU!eu`zOgu*woIi9Gz|hB?KX`xc5c_zoSXmFv+>P&S z-YrGT9X_h+{|z3D)Ip%uWtSl4F98CdrxUAV@R*I-Y%U`QzYh({@UP7v34%{qV{{q8 z|0=U1S1i;MEH#%_0~^v@6f;*DR5I9I(%h3Y=rZ4`$ZD{!s(U$`QuoT{5;6ZbfKz6P{pRHV)1)ER>m}$-Ax3Q zZW}_rS?eGooJ&_k5zCua;3O&X*izOb&--lau|oJmCfJc&3aDr|lW?eIpbhUJ?UB7g z8W3ktCR7rYn?NVWk|`YyaZn~_x730gbg=c2koXvnNZ0Trh|i>hQ6%dHP3mnh75}^5 zDjEDIv-DOqi$%g(Gj&kg`_n-_-yge$09Gas9yn~KfZ||i@6hjxH1ZM5&p56*gR(8w ziqx$SFQi6~79=WEmHyaMrZJm}t};WM4~xSoS!-1|Bi?A`rQPamVh99itKqRPas5rp z7m0hQkW3fwZ4-QKTe=uy+CV(2*W~Gw2Xo?R$NXgY{d3vGcAzk!C8urSP|tqaDEj!h z#I03Bld`d#Wm~G_(?*x{^4vnjj4cKoS$zVS#qvE(I8BcBwyEdvI*=|{_(wG$XY}f` zy-Mfwa%GV+3atFu0zw!2-HmGi`mPYq0km z>!Yh4o+fj)qc8sCC^y}J-MXclizmZ(&zts214G8yx>VQ7Nx~1c5^(L=362FTB}sZM zn`h4lS%GolFkQBj7q4!eGevd_=Ma_`t0BBQ8n0!vaZeL{KXmS!s)c=j!0RcvWFP1B zj;8K}cJxCRJG8hejn#=IVC%u^26P*KQ7sY{QDhFa3{-QmHOvUPYx@oqKblf@V?sQY zcB={~Mjs-@-{lBAV;wv8nVz%gr~>W`x6O5mYvN4H!C<_l6jrqF+GC+EBbSWNb{lZ^ zv!ib_px1}RTW*JO!KBe3R4Y|=odSa|nbZ0P0s*Iw`B$s~9U39A6e9psL^pV3W=PH;?ieE}o&*WfFq1j{b!&+0b^=QC21g)?tvyG2fMx$Qgtfxw6HT|+* z1Ypr)ckuzF*(eDGUnimmTC0pHc`5nELkT1Wk z^t>d;ygs<}STLI!V#7wqZ7oWNuPXV3jK%kOhVdDe0@Phl}1fdH-65$JRTaPdWL-b(S@oJeyy* za{V?G)e(yeE2aYK5{voGR-#^gs_bSb0c3f)iBh;%niyL0xFsPYzi4ghQ!iX<_UuZT z?1QsvA~=pTSxEX&L&&!>I%c!y7w|yoLQ3Bu1&P}GfuOAF=fg`p`X_u4@TD7juuA|9 zU!S`4$UJi;>q;ZCJ>IiJcmfVmeGK<)2A2ciMo3M?qi>dqFXIKtKx1Z)Uyg)Ey^rCW zX0Qq}V2gnEw)7Z7T8pf1S1@f)g{DJmJ~5Y zOD|ajpt+kE3S9@l01BdpXlWFE_{PPgX*-vsJ9S|osW5K8U}uXoRBgNe z(4HlQ`9(`1PB1yG?Zg+b#T=a&he#_K{d7>Au+DeSZq(p1um#k0$5Cfr)M*@-c($p-VpB1&*J5q$A#q~6Mj?nj{cPMjnCn+O`YF~PBD8Q%MhA}1@ z?ARRDUZ3B!PRPMA?qW{i;Oc#(%(nh}b0f7v3r}AZ+2g%+l2f+LS%xqqqXo!h(DU#* z&{oN4ZeB+h;qL^Y$@qPqhAYfL6IIN%EiREo`X2+LV`fPYk@+eoo6v)?O;~i>M3x?V z>6CX%uS!G(ewot3Q8*3Z4@@R{gnFkATfMw_Sj>b!i1B7fmH|dI+R@Pk>TKTQShP1f zSPsTYXZAnPM@dAc&2dG-TYsNRrqc^qT6z%Ih4_Xve0)5xdH55NFR(FwWYK$zl=xNY zBa{|Aocz%IIVYn5-Y-<>tHt+7?Vy?Y!uVn(lkm}A7k!FV7J?+hQRnZOkQ~dZ=L!H2 z*2ruQl4~&k^dRlGKDa18|GldxSm1nKXFINojNr`OKE~gOIqr zZ6UIT_PlYSnb67}1w$xNZhvW-Ex2D=L$f>YurL^mE%T%pCK^qp)bhaojRq#MRgOgM zK6ceO0MFe#nXHE}U;?D{7((-6kbQV(?;~e|`oG~sCbA(p0-W87*V+-;mO-lMSVc^( zyICoEaB)|{!>dJca9d!|cyj0b4V(_7x`>>7f_@*BbL3CEhV4z>S#^xp*8zeNUCugt zswirMV?`jy!2Z?6)Nw-ETC7{$+CO`pSktG#WqIIY#h>T>Yttg*9N$jt9FKCt39zLL zMq-Da%`w~a=o+y@T0Q}tj(Mr1?={#EYrim?(POMiwAVVuWEk$XT$pZiOkjDqyLQ)$ z<0qt(vhHlTa2w99$Km_T%^u9Ic(%vAtKuK`98IFz(B`{Fvbhcqtk$42_CV^g(my8U zm0a+_M|cq?93r4J^LEucarz61yU#HI%$t1=B;Vk3GG(;1gy^y-_YsPMolHXd#CXnV zZo#mJa-OLXWImP}2j6+v14q9NN7>J0xqNp~mN( zMxLf@S9pL>`ym5;$%GIdEa|S!S?2B3%Sq|uf|_ANH(9cnBD^nyf@9+wSEQ%$MevIZ z5rq!qOU9ykzQz%g?^-Ba=L=19tPCPgx|&o^fA=qIN!9ELvoCvBR6Y}bskb-)!xYjL ze&gr%+k3Ke3i~6};pHcjQ5pwh_jN8dl`(hiW0)MW3G7GziRKN6q(qQC%|TlsZAXa1 z-KL!ncIqU83>n}(;NOEbhaG1RV>{`d*c39TsB#ut7vYh~2^*ETo@Ur!uB_4Jcr&-p zkD^0V9*Bf8YoxeLPIyE6q=g4g@s7?eV$iYbFj8?m76}_*ve*KT2~s`P?xs<=g3Buu zBg8ABU&QCMX>sIBY$cR(QPAWf+z@omPM=mcNl-eCic1cCmcAttLtxZP;j7;69*BQ6mk2@hx36RH3v#$qK88m*^rKOLQc+%x6nq?JHWwJmYw8Uuw0EH?xPFps&><`3@`~`rTBTc_9yzQph8@ zN6x?@#$mzyxQ@#TuMM;Mjf<%Ueiw(4 zxicG++DEU@RLA(uZNcHaQt5@;ZW66*R-j{~XnJBK$boSWE_1&0qNzXNfp}J>pyI1v z*>JNK$kt(!=C>P)bBz}rt>>lfj+*t=oDa6%K~WGP6WluV4X51xsv+N(L}QCfZQSC0 z06Qs*em}>v{umT4yjKgU6{l%ceAJUq4OvgmDLb~h(JsaxSd8MiQs3+Eb=UxTlS0g^ z$*HPwT~^y5M5-diXkDdRbL7+ZFm)A!Mg;Y5Jsfk$1~r@?R7f4J#(rlWD}8`)CJDCk z68eK?r13W4b<9Y-*scy;SR5u|f>!DNY$*(fL<;Y5oarK|Uh0bEw5XUJ20i~((B1y1 zqrG?eS270EHdC5s$ z8%DmcM-AzHPP+RKQLa*IP?mQFge^oMr7FA!tgrDcGUUk?O85N`5`PkYR;5=v}Z%9q|M~ zlV-VIrU$nW_STf1{c-CkL)*Sk#xM=YM#&wIO||xOG47Kf>IIME+Y^vMh)rK7|ChCP zXK3Gqr!|tE82>oTIb~W<-^HIcfdmN|WU<(AaP%_Z; zy3Dx1eW&N`B=Hv5_asiYE;*(y9Gs~V3AsnXIhL4gmyccnCCMMDoOV8E}IF7dmG?4h27o}QAK&@#RBra69V}uAm{>6g9jH&2%PkOM!{{j-rae2n47i$Fp=3Up!O2U>DPAYv~Af;o1ZxhbUhw8)gX06hb`4i#v*{ERk zk|ZkHtt9m?gWOa?RiA{`;l<#`0z_@Ez1@ARg*t!2o!;l%-kIr0sJAiJQiUmRbp|{d z+Z5tEI8aS96aPQqzX% ziSGs|CSK*x(r9>k?Sq`xghmaQauX+8L)q7`YUSh8f^E^vP;>C&RUzm@C(4l#xEXs& zjby*YU-V_u+DoCKWsLL_uk(yhsN{Y2wGW3kV(0p0dsVV7UBNgcmKNRu2bgVzd_Me4 zbkQHU7_o z%u%8tP3HP4(;icVZ^vfa>r%w0hp6} zI7^yoF%P#6AK~v!t9S911SjA9P-y_>gZ7C;?2;_YIPn&MT-G0j>7Z|-efA>D0a;Y4 zr8dfb)NWCTSC5hwy5tE77oWn8BJA-EK0zz3ffIryS6>GD{=W(=`7L?f zsWdRW9M-E%(r+CRGwK!jw=%Fy>AR8tM)|9hM&wI^rd9)JMEA3;md7TA8{Oj<=)43r zdX8z#d@3 z1E;Z$HoC*<^MCrYYCntx?2Ye0^dYFFPyXr4mRQT-o+DoKasi6Sg zKX$!ez?%Oq^2^`^?#6IadTHSOrB#k6C@Iv>R7jMy`|gDvrbLTa3&S3R?9j|k@`T)Plu!N5zo?W@VF~5WS4|G@ zo++=)c};dA&uK8$;ZG}!r4yd+hBpq?AcinXnJM8|t2@?|@ppP4Z0|JwJSm@NXcgcX zMj1ju>U`kkA-?lG)TtVCJ*2-{;EGvjS_Plg3RlXpgVV*buthH6$MfM@&4%iu!d6Hjim@30>&inmRf7*l$ zMnqF;k=TsXWe=8i&aH4lIlMh7!(VJ8nh-qt&U84Zy*--EWQ)6kI#teo=Do_MPY&~d z-q$_iF7sXG=`c{0=`xB;<7+IooANkj@L+*A?ARk4?aw02r|6<-&oLiU^K5`KcNQHE zv&sSQT!A1SBBLv2dPQi$`-yD(f`|;<&2jk?Wb;{8-@vd)eyWX&Ch8Ti-eqDAP}emE z1*`Bai6|2Ih80KpK)v^p9CmiAQoVE1I20uu@ci8*evVi8)s@ZVOnzd?LQ@}9kt(Pa-}U}=QTG<|HAK(|E+002${|W#jaxb zZGW@N&jdZZ6VEbLxI&tE+k{1-vsv%S`fv%ju{8SWZj$2tNjb@~ed93z%ey1dbv}lV z6=HGjyMlBM1BA;`kCj1Ra?)YI&n~v!U`&4UIG~eSUMDF()t2C6`!q-8U!ub<&a=bg z?krAwSg_xs&a%_JT%X%P2pw&_4~bC(&4taz!?4uXrR-~^5>w1R4v&Pf?CRHIm<;(H z)gkc4z9RRX5a=zUVeEX9R36f_&E_G3QW4DcUM;ntL!%$G^0CrN)s4r%%0GCG5$rLC zS}V_mx_<*JEYXPoTzB-i8!FmO-nFlT?FDUr0IF_-!huH(S9`A*V@2IAZ5zdG;iWvU)6Qow3Z)fRJj1LoLV#Gwb~inpSNs>M#d+MTGj z$a?FCB+WgJ>%lwL}67Db&@y z<&q$Znt##()T}nnPr8*-s8AwMj9 zSk>_zG0mg{@Zy#;vi)Vtec8`D0AriwSUTDD2rTzLcYwyi21))HN&*+(ld@EJJgB>M zxKhHE8to)$SyIcI2euip+{iTfg%8eF`QjpaO&yGQ+nJ9A@Gn`qu-~$WZFc;8MlGE} zXL6bn`kRj8*zrx;>hw4hwc<%;*`#E{YDNKfmV^}(WFr=P=@o_cGHOf4Hx)W1ylMwx zMp+R-3xCeIpvGgKgKnn9^&KBhk?tfcPeu~V%8Yf>AAhi;tYsc~^dk-@1{;z)0Vu!^uxC4J`3^r7Is3NV{T&Iza-9mH?fJn9(wjM3Cga zST5+$0$?BBi!FuZ9aAwmwg4&l-$J{o$3N_Rki*Bsd=T@ow*P2o=aT>$9|ET9)aiEI zecp<$gZ%7Qn~NIBW~5mn7Yh`lk$kKW&^YizbKB5jHyN0Wv`4QlUk{CxPV|rs^T(hRoaP096V7 zu=R=aa6pflu;fX8p(@ZcQ5rc}La&?5*h+;In!2^MMe}3+4s${k;+m z1+L>wDso3jl=5j0qeG;2DzArCC}ZlWE<=h3(b<>81)f7~Luh5=m8wWkNb}G48ppm{ zZs`EPZT|xx3`_jwkh+#X3BL1)S9{s(=pUR1d~1sJCafI|8}rak(qDNT&O(QZH;LD-iUU&Em{vI&M#U#@h{`!Tzf(3XO$+ zki-c(S9DFRi_v#j*#ksTH7S?PnT5t@@nu4}tJGmX88JQe;)cT-imC2ZO-<0<#aiYW zffeg3wYVKv0ZV-$$aT(>vl)_oOrmp{8IkL9X)+6zC91`yvocNUb~PV+yOuA^!#e=;D*9$HirGT2vNW_)J~1Cu~G4 zc1R5iQn(TmeQCiHMy0G0#vq%4raSv=&f%F{DXlZv@=jz97ksR`ff;9JlA3(ZC#2zmFm zHP`3>=`|@NOclK`e0r1$-Mem>dUn>x>D|r1ils1CFQiAUFBG$zrMVe!F<6? zw4)P&K(M#`7VZ*Z!GXhH@po$WQ}xXW1iL#_HNGLR{&jME>1x|B^W7Xfs|Tfsu9=^N zjssTVMVkfJv4$Zxndc9uRxdcAAQ&0WfiUW@G)Aw&oAAB?Q9_3}<>e;>4Y-w$`=Hzl z%r-d|8^jLiXz~}tbP(h6quw-Ye16hV3uyRGSWIs#zkUnvI`%|7zM&yY zPe+86sv#~W>bPoPW*~|#Bcv@NJ4pcs!RxgfYY=z>U_nPhI%aqU947ApA!!ZOaHH#I zVvxn#i?(agQe7PK`RB9Q+-;W9__0@v1Kq{ZlxzK53U`hZ%NtVUVX}+z9Gg4EZ`Fz? z#SL7yTiR2vuWQY#WPe?&mUP$JR736YIK}y|`@F1=O8vqk|g-T%4)0Z7s%oNo(g`~>*@wxjMZILCTOg}Btt=Y&3bYQvtkBgyN zCVGMEDurOH+<}P2;h0%bQrI~gf7O$>bpWH}hwC@C-|S-oNN*-VoD%dnQo8z~spm39 zvMBr-%a!SYe&gU{b$DUCpOf-oVfeBxrZL=d%`-Ep*l2GQ0^}+v$^>N7&pGdf;8hMU zX?eGdah`wh;9iuyxj%&ym~LQ4$%pmQ-Z$7BaU}l4b`r#!>&)`rRVbLscw*e*wlo~1 zhBfL-X&jw%p0SY#ICmJ3d|n+%Yq?<#OO1v^Z{IOkWqwt?b)i2n8K?w>(YO=&^HjGo z+7zNu*2q3FeESrJGS{tF{*qx}QJY)ZLI+R3w{-kiZUDJPtLe=jiExNTL7%~#Hl<(7 z|7NmO{7J^Gf6vMLIxD}t>_>smBqY|MM8ZqoN|L}128cp;7=~BJO2%C1%GBVp-FfG3 zRD4FjY`c374(f=LhoYqFh|~qf@;lwW&t1EX7vW0rgZz?CjmEoeb|#k=Se(0o)OS0w zxMl-kK0`#v#+99GLH)&gs$hD*r1zTG$lof(C~d+Mw(mghU^NhL<7xv%h3_;fd?X*O zK$_#0J&ywVHwB;HoxHdjQUv?M{vzL{U#)Ha2dN=c*8VWL%&9vx%~UH@ydydGyw-Ac zY`YmA40%iEeVlFQIguydH*5R`JPtCb+D!oePh$1_je=~=>-s0Bi6DNKXrp`a#X`nd zm)r$s!luEzTaD6?b)ee`6txE{pM9jdn2HDF*Hs+FjoYO}fz0m6yt6xgnM6FabZMIK zq<-QUx8!8-df)*|b$(bZgf^pVr5#Hm+h9X9#uRHh5g#5D%_5<~`60|0D9qMNxxNAa zsjhm^bU0U)S{+vIQu@}fau|@iY##icqYr=8UxkrQESfqNY&w}VdPmY}Yi4~UD55=o zd`qzQjCf6n^Ye6{1+gr4ARhx*cQ0Hw%p0j8!WSf=IJYRkx(HS{k8V0y$6*ZUh-3K? zKOS1PWQKtZVw^Vkyomll%h&jA1*nsq$Tc;e?QT;egrbG3>XJ`a=p1mST?PNP`3rcO z`!d(f-SN&e0MBq;F)-{2E*7q#Ia${5;ofJtQ71`GE|(+}RijTTo6xTr`Nu#B1nx_T zNOCk2j}~Vv?Qg{}<0lAIoUB6J#CUM!U!)jtJv@`ZsKJSx%7xuPa@P9Qxg;agq^4+df!BHHJvRZ3EJ|#($WAhwyeVg9S%wyNkvdnB!?V|J zR7F!t`+~U0$UNxk08*4~9)v)3eOE1U3L;MTQ}une&&AoHyu*_t!WAY1kLZaZt`%(;=&z1-N~9HA%~QUN#MPE zuu@0OG73YoB;wFXS6&)}oR4B{jd33u){pPQJrkWAzHW8_R;7!!@WYjo?jn7b(}w67 zi0)-$Tr>JZaWSuD@cc;!u2Wy-bZ2EQRc>AFOzXqnbp=*O{P8(J0wJlbfOePD8&+RH}pdy9qldJ16cc(b_b(S~u@;M6@L>hO_&;=aE?$ z09@dEFnn&-VxEe@-It0ZqgEyDY^BR9bn4ER?C?zFkWk^UWC2-I6+N;7%hG`(s`e<) zw>JCHx=xBH9dr6bEx){M?u$_%+Hp3Pd;K`s%Vy&YY6lXMN_K&qV{>w zrHtY~iIZQhD#dQ{1y71@g0%bC#wn|r4}ynPjKE@_swElsm$*hVWJ`kCy7a{PxWA2w zluJAmK6dts$<*p_37ORJ@LH;wB`!Yt`7+c+tLZf6_g|2Vp7biNCrSbat6VTf=x zML7^0@N3w)a$g5|3#@f6P37x?^BwQ>1j4zlyYS?W?*WW%KrV|^=L|0Fn3m^;3i&8w z3M6rBtN(~fsov_&4w4xMNk<~4nEABnEK87}1+|9rB@_0?ZP(*LHi*8>xfGOI^AtDE z8|Ll|1sRSZxNQ7&e6yP9rlRAz?j6I{IGpTa)O6-nkCemYyxG`R4MSA-ZB?xD!1ejCkZsx$$?*vTxt-3?_NF2H#nLP3eiS z%-s!aMdRSWCZ!8BGu#5 zA(_)=`Ci=?Zb)R7Y=0YR&SjrJ1pRk&%`sAc%VK}v3M@-sdA2k4)<+0eFt_cd~Z z1-nppr{7Ro-8%Dkip~6Z8~deKo~!th7{}q1y8D~Aw<5imE!4lI{|X6*H#XqC9IuZ3 zQ?K_r*GqKKjm}0Vmz)6vOnq=8jttyo^CK2)4;PPxb5I=c6Z8whNnT&}&dnl=BXgR= zU$u+zaX`8xl2JT{^D>Td2VEVgC9xz|HfsHPb#jbyb@J#+c_2*U?)b9oFC)aalcAEG zasnb86~xbOTy|^*epMGACXO}>nPOIaa-|7*8n7wqi`nBL6C9iF{%%mbc7YIv^|38p zJRjJ&7zZp5l$=On{E68c6Xe_TQUNtE&s!)n|1%@xxVC!ENFHcf1684B`Py^bLkB+> z$@1e5t7-W)PEjOg<1&2UqV(eV64M;pwt#!0!Zss1t5{=KRNebto>p}5?)w}{GDdBx zbC|+V_Q4AHc#3;7HV^${B^S_rs_$WfT?W}Ll!7d6-|UYd_hP3okt2WEN@Ib%j~Mhz zyd+uR_uiL23rSVcVuQ}3=?|K+lcw$9NBWy$u9y21$nygIQ2gSK=2r})G+0iyf-V;e zCXwnbwI&1Q=GtlQyC`{8O0c0@uv5h0(5~Pc9?x=}fxF;w1Zw1n@_|;1gsO`;Ym*j6 zL{6yG)+anetu(M^Z`LhBlFDC==mP~z0FBRsP#)fMvw;*dO5a}L-Pg;ojIEcqk7=Dv zL8W0tXTSR4h3)NM?VIig%u)!eKa^T0@+%Y;9LsUHxc0HGVM#_{zOQbR{TQYtkrJ!1 ze-m{HJXyDb2k9!SKwv!zyc18PHPVMmihWyj*Q*jF5+={jUTH0}e75VHyK@EBFc+#{S6;i!nLR6+mXP&DcqU7+OuwR*R=M8N99JeO z=_O9fC1Y1=Z*J|$Vhj3SDD0zG6cXXm-~y0zMvw2;BhwgB(M*PZ3^-wRP;IV^cxVg- z3gc5n(+gG+Kgh+?&1$B@bY0+t4p%zDKYRIFD09qzvZ z(@BJsnp*f4JDC3^0e}|*dXO`Jo%FmrUAU{52N-fO zmk3`c9r+Ee!U3mLfT71%^LzKz$uN()3xS;+QtLJ^**7#tDkqF!3_ZkX-VgtkOeu%a zhZ1D1A1u}&a5|nmy^(FZ1iX^jG&QRXZacIH%F5AtsCC~|>Q`%3!c3UkXaMVA6|>rF zw~0;GW~P?amR`ZVprAG4LE30ujP2eT%RZwC)~ z`%b>>{UuPl)|pHrTTG7F!b_;%$iiAh?fI>u7j>{G8GC9&c|*k|AH9O!=Xopu^(Xz6 zqC#bNgUOWhQ;;RE!yuq#QcpD8QMUAMYO$F8^Jb+SoFbtpYJ^M0j@+=VUy)@&Zq8w% zxke)2;4p}q-m>#t!gLDuc(U8m=BiF$651u@uQM7*saL9LZXLQU*I}{{`hhks@jZjy znH9MhPnMxEER62?;@C_O4h+D``1KzvXC#+-p41${w6XmlyceCckuiBqCbL9meM*FQ z=DogjEAb~ zl0&>CFXGQUUM*dsf_Vt~siPCW81Ay&f`%<3m4^K1t#jcEfOLKDX`9nJU$~EXwo1z} zkL36XXaq@HM%??Yo7jXe55ZtLr6)QgeP?&aK$}o7Z z7pdg|>$U;;IvZmdPtr4BW;_z3w2eV~q{F60n~;^BWORB)`2!(dWt>ZF2t;!tx&9pc z_r1Y%|NS&cFD-&<)^hfSB9(52hWYph3pLT)3}wS4*706budsQ#ExFyO$#cGvf5lZz z587pooR33{zf2IZwSr3g{ldCZ0$r6OS@~2%U}D&77JepbB4&fXDQU=0UdN49OEo4k z7y1|O+eoev>R~(p&q>3>=l9u3{ zy|$D5_ERP4$W|h!kg@puq_0nbnPYej<7KYjvhPo8Ga&^4dRozgWzLfYE|+s0)yhp4 z#U|nFo_L+vFlzd-XV^3Is{RDaGj&c3M8HXY(jUXO3>0>OEN?FpFa)Ifq$AI%jiHhIi$!(3JCL>fZd zi-nRDKkB}7xFFuu*m${TjSPTYXMRo=HL4VQxoImsLxwE6X*r($8Fr2RbzH*7iNXX3 zxk2m3f&`2qihbF6P*s(lR@V`Y;R8)DQ5LE!s23zBiPrQA)hnW0BW!=isR zQli3`lF!9X!-MVyo~-b)*$uJ7cvUH5TMnB@_B!WOgu1w8^NEx9-Ahy3wk>S(%pttd z&LdcVdsoh&3&TJih+Cnjvtq+H&Eq4KXo%IA!fE9c!pv+3%@<}Nkl33@^B9~YViXx=wPPWVoJH{ zAGl%fR){S>ipHx7N!FMkzkvyIOVOWy`Yu|ri%<_O9u3Q_QGwJpk)codWn48H@X(ee z14C_+c|Isi9!_)fMba)x{!QaYo56ecn18nrb68)&0_Tu*3-u`K)YU4QY93 ze2}wCfY#^zQS0L_re>5jwrtoNA#A1h>~F9(4!@BvE>6@lPtVU_h`Y~X)Y9d@x+6n^ zhmMW!B#YtpYx&d^m#k)$%l-9- zRGRaKI4LXerg67f>Ua(aU^(q6zbDisbr;Q?MOyg9ws)b7X9Umd`Pjds^GWb$)shig zUYlG#CY%Tim~wY4adIU^3c(MVg!0Hf!R0?-DhlZ*3@*zt;s{FW=xhLS%b#JU5*fd7YHx+6=w-_L8zl z?h%Q3>tKp6d+A$ED4;e7W;%g%W}UZO|31F(8JGbRJ%A5=tYC@>ERlsaU5#9rT(ICQ zC<{}ECXzW`fOWak8US&RBq$KN7d`fJKNlokw~^GyPYf`>EDD;5dQ2p>!>Do@@0}EzAmKT3&0=Tg<$;e(9zDw2C?$B&$ry&KUR5rEr+`pE zE$Q0WggotNeNOmAGnVmYx2t_|HUH(l3|MDx*;rTvBEv%go3ESJQ& zQZg`MtC}NAgLvyL8_QQF(t9+(ucFLu)~lY5f#*MfVjLuGS#{|@QpVX5ROYVM@kfgd z_J(!jCb!T8AyE_S()JUn=}~sK>bExXXDJ>AE?)E8)++Yz;CJf_K3r+P04R7M&$@0c zH>^sxwW3(}4vNM_qSQL3j*sJQA;VSZ=jkyGZ@_KZWMDg05g%U7{~j0@x8i`&oA3o~ z9^GJddiXN)KXR>`Sh|Jn!+jn!qT}N-act%z`*<@9QzX06y zJE&G|bf+E?$_3@D4{at|NAR9D)~DQg+@++j`opN53K%KR^6FLq*pn(-#$=R$@j0k? zYS3fGhx(o4TL{M5cby9(2Ms$`Sy{-j@E-riVqhI?y8W3>Yi?JE(8Z=GxPswG5u;(Y zURd-_MfXV$(vcyar@;C3FTo608|t6Pda)|My(K)o3r){1TANYVoX%aRW-AC#z30-k z5TRcgo~2WOi4HX+08XzlkPoF0nes^(!B?}!r}`%2pYMtxwiN(c64Q6tp2kFXrj3Zd zbz?^ef2VCMF_V1LRhnHcP&N`O*)ADx;+5JnP0b{iQlj_9J#iOn%U#_{yY$F26%ni2 zb{T&|GZE~p*oCJ`_Ncx_+Rl_*<_qmW>f5Z`te0Xf53z^yY33}j-pp=bObwW2+}C?X z%tSQd6%gK5{9fJUue?dV6Lx@nJWMR*cd)s$JI11XX~*smK=F}vc6>ADnoXL71a1Hepo7!FcN@WpI$m1D zseRA%q3l(NQ%|JO63&-N7$=(H1HtQqQrat8O z#(q=*Qa&rFaAmV`Wl40>S_SibXOcgQc4DAcj+Wpt(iyv0h`JM zl1@$599ikRBgJ{Szlj?kC<6MH35~_Uu+G~c3V=a!f=yI@C~{iHM(fxcWOhf5;h-&c zxUHf1=#U)+wPBY~^rRQs^+Plo`Yg08N~aZYF`8C}u}&l_#w7w;`EAe(y|+uzss zUhEI9@^4TFl`#4L4XVe${vS{?d@e31S|xWoWBh-?<9^6;&IV5Z694J^;mZlz7}^?{ z+nD12fY6wKuw6f#JP~sTM<+oueFuDo|B0#hBmEDi9^1cl1@s+_|Dn?1(<+K83yUaI zDl4eU>04Rp8=2cmQ482w8T~`H``^fV4DA0Ni-!mQC-#5fYya-~U&wl_3~W%e|AVZ@ z!ovPv$a)OS|3So)(YOAY-v9Ub|CO&t%}(><=ii7udio!3;D2ZA{p0_?GWJ;M@TnPp zplbAVtc>{VjLiRM%AScit%((_hp~e#t*wnQt&^F9u`%ucOu-YQ{l9bY)M)>oad-B# z|10p$dHC`6 zZ;Ssr=6}TUqsRP%_+$F<^N-CxHRF$ue?|Kv|I_}7_&-|zc>kyU-^-8XKk@v_>ZktC z{(tHHGv9x7f9n6izN7m;vF}*ff7bDTqVImz(SHg*gE9W|8~Ya&51*d-$N2vde0QZ_ zDTkzrPOT!Os)_Q)Z`>}PA3-1iRDeY7iVp--s=u(aLM8Q(q>8xXPsg0lA^l&FK{Y&x zfQWzsI3;1wMJS3gvh@ItIXa|@U9949zgUWO(5CGDnP=5f&+p5ZY{wby7q68icCK+s zK7Nv3y#&2ZIhu3$!GtomBzQR*JbPypMFc~;gtTD#S-d>LUr<1e6n;)&ayJfSBU?kI(^$(GwwFy0 zp-aO|1xKJ@2GJ>_O}!yh;{6U)?j6?%ki{2X%iHR-CUvr1ETTGK)=0s zNt25_Vat@|l8ey!T7`z6>6P{@4iL`pvFkF#TpmziSe0tF@^BT@?0S({%@pSi1(Fs| z|EN9q*6@Yqdj(OKN^cz3((Dg&cV7+JV)p{KM|AAN0)ce9)w|Ya3(APyxa08UD2jsp zwXmw`@`1s(t=C*U&N=axxFRJNm=yG!7%QuDlP2=_$^O%vRjr8C1sh;&k%{6eFg)J2y4U1;Pxopc;#jnoRYB)DP{u~w}yovDM zAEAMx0@$6yCRHEd>`Pi6UW>YMRSwD}TNQ8BKfx9^DIHC;+)G|>`uYy z5Th(xJZ3w(sEWIcWz-a0-p&2dT?Dh`N%eJ+Zpq08#Pn*^K6c^Ubf5fS7m0lh`J{6H zp*Hxa*~!5%<6e`cZiMz|WX6r9Pv_|}2#i@I9Tvvp>zA{U)!P-@!QWN*!vab+kNIsO z^-8z#sG?MiOG1jTf=^(Y1sC_Jl6ADZ7Ouo-Q!)N9EXL*Fv+Fk56080Ir8HX?mr=JT zY5lb+6e?=yCO9x{IgP?eL$xH6rHlI%4EJ=&6Vuyq$|F(4$ORAGh0D}sqSm`#+82{5 z5cKtiv$hZkuT%YY3kMnfKPb!WkOQt|9uKKSUH0H)j(2vu2Pqjf=z*7-u(3RU(eW@EwUKV8KWIn|r0*AE?-nuA8QQ*~Ef}PmauOCsfpgj)oJ6Ws(TNcm zHi$$T#P?4oob-S`S~^Gfd~S5n&MJpjBSASUZ#`4PQH__?Dybz8a*ld3dpa6~X|<)H z-LnbtRB;oSQ$)&G5HHe*K&{=g&Ej&^ZH8eiD9bZm@C<6pu@-4%nI6yc(V%|Snz4!jFLrL1;MHQyi)jZB)d0#VQEkSwcIS<5^_)0DG$}K6l1l=B&*H&s`y_Jmdogt z;m;za<5e#i}aG{RV_XoXZ0~x(iid%mo#F($2gB}zI7u!Xl?Ki5-16T z>59M!kq~+U*}Ahn{AZ%0`+p(2k0M4Ya*C!u#;R zwq_POcE$i(6AKe_9UFkIj-HvVxsI*zzfsj6kMw`1sy`a*532f;GXBmT|NZ(0tNiy{ z|Npk--?@f?@#9|l>*D_TM)B9X!}}FAF*G!=F|gD#uq9A?&j+Bjw6fDTFeG3E{Jo(G znEttef$6VSCtzUyXDU5C-M=ov#})i*iw5++UKQxs|G~6>yxjZ=Pah!oejEJ7SoHMF z|NQnJAd8ir?*9g|5Eah zmAh-Hm8a{ZdRML;p`V49FI`+_^=ETn$S9E>b991nYIJ`gm=2xK-rB~QVP0Tfqx-Ht zvq_X4D!|H|z>fZ2!`TzOKtIcRqvc6}S3p+CL^%oMyV<@Z{NnvW6jza4LYPqKg&Ipl z_san2*LScviM0WsqYYThaUVi(|50$nFJv9yY-oHGBcc+z^4`E}*qB4&o+(2<7qGIZ z)+sRu@FLNO0Yx=HK4_?WSYgNDv8u1wRe2Z)L-K`l12eI^`Kgaent4LCpgPZMQ;|xObGtr?&Ali^f56FK$ zM}^Oxup`Owl;cQ5GVAusa*AwkbD;c8D20;)|nrvL6vvREKVbvU!Zi zX?=c<$*5ofjxQn;nsq}uZ@@MKjX%y8hAj|WYyxsnGoTVeG{(>5LQzUU2jaBS+H3}w zT3jk#g+7c7q?4>b5Oi{6Mv-<_$WM3E&oA`h5p6!7e&f(ChSW~MoHvxLcp~m5vB78e z%-lzTw}zuZ9#FuVX|wm*eTsFpdT=@`w5WB?IxNecJN*m;7g%qXy6iHwF^YM5<$p_!Jqf=a5VEON*WmtUkl#d!pWqXp)-iNqC*)Y5Y@8HQqoVO01DOrInSd zl)Ltm#XSQ^$fQ+%4u zyt^ps0=0hFOIvEQZNL5bZ3P6q1yltv`t$wL)@lOlXbql8P9jOZ8gh%eytbSznsL?M zc&qR0Zo0V%g$2%gv{SQ2>fFJj&psX+2_>*4U4}OMO#pJn4ddH1UVPViC5ID1doIiO zzpk=fCKU$@G?HN|ot558BcEN^SO0L#64C37Y!32ZlD;{w4=sIsN!`ix@@tD@jArGc zon=lhhqo)CN=?!?hleiGoZ`ej!oAKo+d68Pa4k!to5X>N`znFq!qj^gZ)A(pfU+GL z0mX@M-ExliSjjZBz+|&vE0caRu?J@I_46H3!cmJyJqLzrLe|M;(N~>kkF}~+X?=Ju zU8|+arHLgA(-WfCR4(BMID|z-GD|+lnwx|pJS2zS&GBMc zOsCZKq&XH;;nDtndzDm1vw7QA6gjP%dpu3Y3ZZ(lZC_zlCEBI7^e+{kf8*}RO@GVy zx!1bJu!Nmzq6aWN6`}j(7>Q-+xgL2A!TPQuXB-@&Jk83kE1JGMX!R+6n_#~U5y2Hh z+n3R2r{nWgEt;{HWEvQB8`S!FXlTRo9j6_Q=Z8=@&B3DuALz-%Fv@K1A)kJWxC>T81o5ec}(-y@hRAqboVLY42jfmcEd*sP)pJ^ZUsmsEn_xC`k_y3Bn;9 zp4_ecSy3&LQKzCwd;}<;Mrv~a6{sOaeQXj)wj`wqh6>r_3I?Y`= zNp6a(zQSOx3pd5X#-)Z@O!dK_<&0gEPw{$@z_NWk)k*^cg9?hA{jNv4vS5$*P(#K_ zWQ?)>Y|VGA5*|n6l5H>SSHXFs%A(^^ah4#bTcem$wFPTwncA$noMM9-L;al2%hyha zKn_}%vZaUPL-KG`ENT?g&RR~>6JWfng?%U%$R`DuMzGot0Nv zb2-JW8IeNA8?AIC^sBKU2MoFj2#)C{-Lc2#0${TJqG9Lpr??MA7 ztX-)d-LTaE1dR0T|M`LaK}r8(7a-F|_t3uqBg;F!{gW73-a9M)1&j=T=KU8i%1DXx zeN%l0MhVgX0vPH4=#%_ANBx=d7gO-r>KVLuB(i)k;r|jC|HA?Q6EMD)^d~Q}zE}Le z<3+}gnKa&K(V(YeVk2N>ru(lu`OFP$Z2?9$20HK9_;)(|6Gr}iRtyYGA1(6-9sWst zAAkSVL&We$BmZ^Q|7((Bp#yx>;l0!AFD4>jVfd>?1T2hyrT(3iSpR+t`~^z%?{~(( zNQwQu)9|lv@1(@^-eiAuN72zUF#d15qg)h})t9GePGdGCx1;)2SGgM0rg^ug8k(B} z{D8bSPVorX_9p_z?ZRZNu4QC6A0$qbuyH zfQC8P`Bm7I7r}sw5Fub3StV?R4bb5#YMVi3R`AY2&J(jICr$V=Z#O*coPl%IJNKl6 zVzX=5uX}}u`*1ULPoX#TA*?H4s;*#cs@qEz8($slY|uapn)z{3-GC0Y$ronvw(dbh zzk09Wc0@=^I2swbLN3UDI^Nqkg$8Mc0x8k_^1Pn{EGs#-R)%PXP3|S5CXfIHss9@3 zFTl$Sq`mpV3K9k0%vXX7d<}p>sA!G7!mn?Y9`MHPECYC}y>1p;8qn%NdA~-pcuj&s z+oS92+14>Yv@a;HmMG(PO0(o8XdB?rBQ>-Z}XF z6d8rq^X_|GQ?I5i*5DG-o@#>~c;Y(I|9a^+gbM(1T3}xUTX+E0#sFG?(eJ+PpH*EO z+u-4g;2GJA`1#s4COHN~W$VgX!P5i%e93oZ&v*y)DYNWU+jIR5_deq*6Fj^Z2`DI- zvRA3r_e=a+4911S^41Xc8MG}hI(;JpqkW)?w~JR-gJ)TFF*0G-v$uxgqj5Ki^C(MKz;*SRgJ;wJVTt;(vmK-tds zX9~f&(szLBYuZnUh1ru_CEzg6Iu?`-&&y&CK0*RIuL~Xv{hqPz*C{>#euSra`J4Bf zUhK;qZq@1SttVyoeFCu;hQtcckQa}9rRV2Vo;Yu>*GRcNctqDTPqw@Dh^CG9_aV&f z-r(MPX*Z265Wp*}tzQlN8V31WI({A^k`L^auRW+)4)Z{umYnW@Kj`&nMVwndW8@ip z0$ybISzXZ#xg-O1sCh0IGr-}K{D~-R=0$p)`)yQ%=FQ^%6L@2DQ`_%rqg>6g*VcNU z7C%UES8qP!P+LiYUv$e&6%i>|P_j}#Pkxk@w=5}*pT?~iU))yksBF3@1RsAFZM*_J zOxxzn3R?&k!)_{U=n%z-7;HUoo`4d6Rf+y#-Th-@CtEZ^`N&@ZjDAcSlWcskJ%+d+ z$zbnP%o$-ILpEOPU^@7F_@=QC+a^TJI_B|dV*z2bY#fGsR?*2QJrv@Ke`>+tGDHiS zVDjhF7{hwF;1NNk=P4%p;Y?$%H9Na-wZ&jPmap?$5>BY z&PH-`mi9`F$Lbx~0|v(}Bb+kj!{C0;PZ9sUqBO{S)+mVrzI+I-#7lsb9*VAOCEQ7+Z_^D zQ}yd#+^!^sjYv(m3I&o@_ZL3D=$24SkV{Teh+x;^u6uZ8d<fsbRUN)Ae%eVkH;nR;TE4H3`Hj&ci!Ew& zlXwlXw&D^DlVPYPs}qu8n`TH?4FL*qb5%o;?3`8%V=&0i*YM~vAX0`U!B3)UJ8q^i zzE2ICO5$9Pwem{o-3F1^(PzX?dB1X~l;EaH=EBmRdnnySa#=5YOw?Rp!P`HTOxk4_ zv6p>zmO^D~W?vYh8(^_NE04uG)MVXo$vQcM9;##CdVa;xlMfPLQBoJrts?F(hZo8+ zSxz~#M&8FWj%nBCP*#PP#jI&~)!e@oWIzcTF@@35uW{+xb481i`^n~c`E`c12M7jS ztp0(S8H+gKO+TM8Zqb3c%&m)TS-;WGSKA4R)z=B8G5P3IusZU6hsmpLSV=3`Qvsi@ zlW`N2YFcQXiei-h4)Wp5ZyAVe#O>k(%#dAI%2sli2pSqr;qll_bE=9{RDOcu2SIup>G<{yT z-C&gyeyi(GubO1Utp@C+W)5;t((zje9B2qqJxbyewe0($6zJ19rIb@VQZ&U#vfq@> zWXbsZY z+DLdQQ+kXCOu;{P1zKYSmG=VNvBlJu*w@BIv{Iqle=9+o#ZQ`{NhvDgMcVUaJ+~;i z^SQBxQy3TTmsUO$pvM4pk0wSf66GG9@403klaiG19MLkon&gHb=A!}%n}+M0Lq(#W z5v^~j^V(_eLPVzXrYim}fez2LCP%ismxw4J0 zzR42Es;n=sq_~17`6&hwNo}#s?s93a!yMtb$c&+FX{sX_-Q1{2+FL?-1pSTB4aIH@ z;o$}XJ@|!xM=LRg3Kpws#=}WpR3_kV17N0-^+U2Edl5fh3d{+pKhh=CZA+kpI&?@k|0-sU@H=h!ZAwh_%bV*wItqTFes#J{y^47~LalJG$**eR zs!QR`v(2H4@^OCmu|QI9MR2fS6aZ{_?zY;iK%n+n%Vj!ZiME$bR*x|3_>)i{?#1m! zj&}K%_F>qxjWNzT1PAf${bsF)mClH7)JE-F2AK8p>Vg}G=-VhEbCY%MjDkY^agu&? zuEhC=^>S(2aice`R0qp&ko;g&2ae+a0ca+I?yQhTdC9U@3&Ouy2v31iOUt=zCk|XSpK>VdP155jZGzM z6w7!i9+MQ4+Ej_BbSclf-R;pIe%L;7urjJzZF$ z((8=nCA|n<)j5W2jl6tpNxKJR-)9$H2jj-q_v3500>!4=*JN}obV*8jf2uc1OK4H! z!yN>Pu2DO`=K3=fn zd(hKP=Pl)s=NCETIHoje{>DSmB^6ZCOLpzP08gYgPC2}9>Y(OE`u(esy#4p_7?rP! z$LH2ge9_I)#3zGgX*;6ur|ahId@FwVHVgWqbUSf?gETX(M6q6 z4OM+Jr7q}=b3*8{UWnZr5XW`6Gy4-~?($ZA2#Tglncy{irVJ932oh_y8-r{n*hVWT zEq(%zQrn}pIld{-#8T`F)1&3bVlz0EfKU~$2RFkmt{R#zKn%*TR!-XG%Wya47w47P zIW&G>sp!f~KO(w0373BIQBPe4v}j>4Q}gx8EkEA(f}x(0?*_S{yP3OMBleC#+xi2m z^6Af(rkRQquMMqn9$r>uS;0>rJC%1{5K?QE?PzFNP_)teVdRW0MqkE0FNUFpbEY(!V6m6QS0%aP0jfFuC04`o z7%}FAXpBsl)RnQAmR+Akr0xYO-KbKN zv3M=>QzsI;0>!Iqri(M!kJ*0tqW1_7GyK-LdTc$L(KR!wZf}`sQ{-SSql5Nb+?qbV zz1#vJ&cT&!_XtuImV8ccueO1k#mo4bO6JQ(MT+i=)ktan=tb1P4AY)ctlEn`kSnJVZ?Gjgbgaoh*>4;3FgBu z3%q>AvX@*2g5N?_;LX?_*Lp(O8az;15r9Wy?2QVNy?e$vCVCYtlr&F1RUE_ntU5n-}5MG)iZ6l1(L%0m0EBImY!QSvZs0##z8kEROQ#DTBwz0 zxqRpsfSIh!#PWuH@#v(Gk^kzneDWyaY*Ax|Zj~`KQ4fDJNvEb$f?;ON2i!s5kA9i>v4h{WX7xT`E5=(FF}Hm?l$|wc zg|y$uT5_)@^^cU;*aS4a(3zwZla@E*xx`a~w21AcJfUT%FxKz=*ji22Jt8lx5jpRZ z-z+laNv3!s31tv5=PT1~G2}wu$6WE~Di3I3Lp^g~vx}en_Le(arP`m_`z8!xR!R?2 zsX3D$?^RDXE!Qf-R>$muMZqA$;O9|qMs7{X^w~V9l806NnzJ-4G-ld~Ml$Q5h&WXEOe=?L zVH{fg%VrGEmz&1Y9M4aVW7E!t4J9@3Ya|eK#rnDd1%B~Kb`F#;cv%jhD;}5Pb z`!kvpVm6A=;I4Ow8KpH)Y=KTK^-(A^P8{JGMhm59jldHTG;icN8tgk_kb&63c2_>9 z@u<7{Ykso{oqOt2b^$$F>{06MMZ4+*&M=sS3Z}&t;KvIuO?XN1nk}C1o`nb>A*~ZK zj#wY%<}AT(kU6CHGNGM6zL}ivV-%b8HP&T7J}c4v?0wzhy}CPy?fYoD%}&uJc6#X5 zJcjBES*3>`Enz)Y+g6vUqZ(73Fw6V<@mR9p7+cZ`#!31BPuvK5j41wKp_e0JzxyP3 z2m{MDq=vjtXG4|r;?TE1;$`7mEH-nR#TPZ>P(OSdpj9*vC+dT>Hk6q!s$R`{4Ye9T z#f_HBg6UrIgO!O`SIn#Nk#w{&j&Gn?f%?^M?Ta(Z8U6=kg)*3IDhrG&u!3Hf&Nl6trIM}pdyI-J6^DrKKOn?;PEgU5_LALxq_A1`O?Db!`7o=wIdp%~wbe4lZ%Bf6Mn4V#hPz|kYVSE1&$uCFL5;O95H zHepOK;t7sb&IZk-t+O$i$`dOuhf8r}!fqD8Tnmq;N^+Cj_I_O?ch@2n!Kom7pBP9ZcJ15^ zXRe+o4JbP+YOAe`Qdo*_ZH#X&ql9dEUTuCkK;HcdQ~QE;!yz7(7Ho}M1+)9J?9gD4 zQAt&&ogV)M9eZRLBj=j9*$8*%$!s?Sc{0w3Ju{M@uTc??*g-@Ep$|+h&1eny;9hy0 zeHXYHS1bIEq$A^ruJkz1`-`=uH_*%@0}Hr+igerF>iASz`|FS6S?)%~IT3<*uTtd! zm!G>oE8gT-Hd%|iU&nVY%kcr=LCt-RF0q`d_t?U)h0I;1O{_JYn`DBrthaGXxjn6{+)%`icvq08 ztd5a-+1&`jTU=Z$;kW08#&{wb89I>=?y}i-%OJY-M^~$FIFs35!=F_820df2qM0gW zyGY{no}WDTtAb-dGOC!hVQG)Jcs|MONA538F2((EB zQ;r7e3Z{^fn$e1q_)Y3AxMJqhLV{Q$cSwy4#>|4Ekjf-&vu1mGUy1n@mTb~=?g{3Y z2-#hz@f3{JA)I}fa+~K=>TU12RYsvpYhfHUxz${<^+m} z#mx)!rP$~v9l`yy?$nCw+;Q;okk*^`xnu&-*BHN{?Wd^D1+M(o{Y2grV6F8P5k*^A z#+O2*r9uc>X3PEx&MbdFEX8o%W;h~k_H0I%R7%0E(`E0D{+3-ie;>olvhG2;bCVN( z@bTho1O2lmB4nhRUp%b$j0r?_VP=WwUDS7|60JyZ#R!fu2c0aSZANa6HX4znfIR-j zHDrAp_&pEFf|=j9=|84s=)IvmM2VBlIiDo^bQ7fbBR%R(UriN%HgsQ!Z{jwmm>L0^ zQ^Y{lBNKy=TO@o&>SLyKF69Wkj}O?{9>h#)>PU~f;|?JE^A5*DIhfMhDDGZ3C_};_ z@=oCC%vsNV>Q*+L4bzuy^sKLMa^1NgVR0s)*uk2Zhscl@x)XCsEC{ci6oZqZiUob2 zT|&18p3t-l#57ZNn}$_5ZyJt@cVCB1$i(Lv_+s zN~U6654oi`V&;ybUyaTvA?I!J`zNThMgBVCiV>BcsTl=PebZ#11Sv+c{X}_FV~SH2 z`P(UO*#@#Zv0ZI)y$vG*&DkY_p_mz4&2R@i?PvGx8Sr_SVscq@rlh>vI*9sB(uYR5 z%BxwLbyiskU%V6|DZq8ny>#n?Ji}cInL{%p!zUveaeoa$jn^TSEX`ex%8fM_si8e- zF`#%Rlh)bOo!Mt!=RunkQW=Ffp1B`DMUzTe9)oy&+$UCs3wrN!0{(ig*`fi3c-jGy ze3TtIu6IkaN6X$15!p`_5t(a1R#(pJp+vM-px} zDIPat)-YN$3z^3=4;UbA=Es;g05fDzz!(wn9GS!*O<**u2ob_f;0bUVaOIil#VzQDjtR_q--?pDgEH6~OFw;)bZ`ZyK*W4kK&h?C1O~*Y~!9#uTB8gXg{A}l$s-<+> zoy$s@qo@*bi@B8SFNyRE3BB!Nf7z?muIxpB;YaSLxMM`lbv4(DGT7j4NYpi*!ktdj z3;f*TNrx3=5Zylgc}j^89PRn(N>+nX>2mz~(!^3smw{zV&v+9fg^4kHeKpF!1IwK9 zKqw>I)rT((PjkgK8kZ8HG}T8!V2j9}!C(a|ONhyi%#SJ3g1WtnL`i#m3Z@k71w_Jf->JS0e zkOH8Tqt)=Y2%#{U<|D1Fm(fvw5cV=$WX3ZIIE>i{(x_(?6w&7l8fcDibZ@_s0By2n zHTQ23hCTely{aPP5q-`h*io$VvvFp1mWpb5u!Y)09A6}x zyK9NPn%d27KVxoS)IB^b1ojjCINWF{1AMEGGm(p7wOj;|8H%X9{WLNc^+T^b9(&?JwApD7^j3T z-{Az5GtUD>Z^Q<_*X0bYca_dZ$4#iMh0j=+<4;<`$0;=thNp-Uo#67QB`51L@4UoD zokW;Lt={E?bmI|0;H=z6fF$m+-xTh*`RUx%@FA81XW#`%UR}z67fvHnCM{pxHl!Br zV?06yAC`A`nQ9Ctm*Ss&st9R-adv7iF6&$x6Sdla@#1k8crm?vuT2J?P{+Y8{DIaN24yd#o7R#oE%pdP|Y- z;+VXOcJ*}U)5FR06R=Ze>I)uok?l3{zi2s1seOY*Q_|IC1rpEX(UXd$?;OoMYzqp4mk`-g}6 zfc@&0}A_Vj(|FYIsFMmypZOB(ty*^+KTi0JUpaV2()a zxkP9TIp-uR`+Yw4F2VeX!$Q?JqP!DV+_3$ViJOJ*T(?$JC-f8?z94>nsHKEQmaA+H z6#~CHF@f)DRF5oxTQ};aJVpewb?+%T=y6e-4ZEhyhKzCc2wvY9RgN7qVed} z#@C$uv{P{ba#FTG@D58TjORCrjP19F2dNpU>!f8Qx5Epl&ws>HThJR|?Ni#e&W^+A z<<)6z$Xn#k{>nacqrnQAHxN3Jr#_(-@VbmR{pF?*M>$(GrL9$x_+-LyFQJUW_cd61 z%kZG@QO6UIr_jdl*Cz|sX1SwM*ybT;6&d}8lTMEwjBxXn9z2lcaghw!7^S5TLU=feZPboz&Y;}fvZ%rk-$=a$m2aJDLOz}EhuH^hjMO?9W6N^EvI)fsUx_wiwv1A2_s7Oo<#r$OWNa=#S~i7-O7C3;wLMb&(`; zm)G8~k^`i}LcA7dnX{&$nC61_v6FH59epvWzZ7K zuTJy7Pim(&Rh9A`I2~HC#mpM#9_RM@@ll66+G2Z83yF~BUZ2q@;+AmtV1A|Z11B|i z*G1n>kMYUB^Fnb=f9@=}k(_NChRG$*0yg1++C*VaDsW_N{1!?j4!q}>gjR;xGx}7A zO6{~y$!xp%(_|%n+D_@W_6UJ@i8=oo!Y_aTZOSkjlNHdEWY?0oHRVt>S`6KB7Y#nMxw@R;qpf#6}i8q=grV2_d)trQSU(m?H5Px2_5 z8p89#dL`ZK?#y~8j2W{O%?Rv8+}_r5h57NfO+E6ey*(?k*~<{upD(S0`%c&>+48o_ zddravpqDw4J<#wGLrLpqVMgr9i#?$;;CA_SD9{a(S^c*gSfuIqDW6rAMdv=JRjCsf z+MhNPUXQJQ24weXsq0$6q-N4F#L|=fL>M^uLS&}!(@&tr`KeWur|VlXHMRC=snem` za(Q%ixM4x>-E@K+MXqml&iZs&(u10Yoh?jzOS|fc4cIITK7_(}Sd47DL;5Rd_6`+) z2vfz5owvSjXQW^H3DzAE$wcQAiP+KOX=nAPe(GeN_~Jbyb#MhsPi@1+Ht;UtmEDr< zSJdOEb0Yh$C)!>&nj<=FOAg!vMGb+caElQtJG^h*#ZiN(kS8@H`98m{uY*G3Hw!d5 zR%;wrwL27=gupEMWlc3k+Z7sozBU}#ns-P9AxQc8u0!K&ksW{s7Ocs}*XgM=kEGH= z*vq+Nes>ouXS18j1eH`(22Al2xEaK+-@V?pU} z!O_9TEmse9Cca}jz%**~Y|g#rd&+EV&H&qd z)wco~ib%X z2v9P4-z=o$b+zzFxcYCx{$h(8Y&ad|Wk&doy)z#5PtnzC;HwmbYAaXyzS!oo-S;F` z4;_^B>T*}}c^g{LhhKQy+?%RSPfK@p&QuM`{TwV)X^df#x!cyCx$J0@P4FXQN1pVyVt^e`C=IS1|+XgjDs=-r`enb%2Ff`REr3dGT# zRtPdYgXa*W;7qQ4?Gt&9$wFAqXUR0<%fl*nh$ivD4@!T&zJ%kFo}|}L6`V-_jL~=U zBfd81S!RgIEqtmW@Cr(9Kx)S$*wSqvfeJR|98Sbi`Ew0!u>*NQ7&!f|K~3p{imah& z$tpL!(T_Xoc^hID8$0guY~D5@NQgo=632N?KGK1Krlfrh_?#d#I72nGz((?Aq2e-_ z0_r<>7SiY7v%aEqRiBw_AZgR~mZ+CxRrf_L>7>m$?XwguDYI5KSbFQpVCqf+C$+H= z7*sO;?Q#G(2j0~nQQO;tG+z??uWN&2>*En zkG@hi$?(^WDDE0)G>U$ttl!mm&1+oeTn&^A}Ue#WizBdlzNw>UuC zrRKCt$B6L6kx(HNs$qsK|K;~eShKl!9+4@!=kZmnBIOEpB3eC1qGYtXnm7jL19-&C z+a=%A8|a%9qStZfUYRr*gssw7CM~53?3uxv$aaCO7eJxg0>gg_17-WrO8!0A@c$SE z`hO#WGkxf@|E3Lz$Vy6o6Q`0ivCy@*mD8~lr;#-b-{}B+% zO8*|b`LBS`KfeCcAY!0@_lZ7E=ud;_e>(QRM~A+b`45%oUCsR~G?ba)AEoj0TR9P^ z(a^uwhlYWT>D@%3VZ+e z6ZNbtEOY?I&ep~TmH_MboL2gPKb)h#8RU*u|FFmnO&kmWwgwLGSq=Uu($eJJFxRs( zx3c^XhPfy}93TOZ1V{m-0kQx&fIL6}pz=SP<)#2LfH}YdU$ z{SO`cANuycmq_=ga{exgf5_t>pFb4ze+cA%9^vEYA0_^!n16)re&qUxjQ*jlf8>AP z_s@F%x$Unyf9(0U8vG@Pzo-7a#vf<)@%d=6kL7<7&foKYoarCi|2ot6ydOvXtCc^N z{|qN)`H0y5>lgFS5MLI$zX|88%&Z?l+s|1LwZF}*8t|Jx8>JA3(=lQ|ZeOc7|2 zfr(WD0*$HFT-a_Pfl)ffIJD3PH+?lbm%jd90Um-Vap`Zg7_ zxyO@+a`zMWlPANR*_q9_IzLq}Eq>hhjuCZE0MOxkn6Hr^{De%r9Jr|!RD&b*76Zdj zS0^tq=pi|TppO<1Y{yR^b~?z8euxb;B&1FQ&;fp(Q|q8wIOLA3e2b2uv9Sxl_!+8~ z{}a!bJ2E6hGhv|Vmq3^WJZM{>cT<<}wI9O1LmOxc9Jaz|!56p+D_Q9KAv6#=m_3&l z$N~~9#L_3GG@4^V0xwEXPzOOT6<|eawvJc8CmxA$?u&|C^1c-O*K#(BXa1b0{&WybLKnNlTT#bg;K~G;4CwTm{t$(`*bh{tp ziKB$@e&Mx-goSD-FQT}+1f+{#6I?o4fbMX^da14&sq*uUwW~d%GzT_De(^>W1_gq0 z5O^&!00vj)N2GJjd~!c=rNhLz3=Cid*)o0sfa3tMEnq>`*FX><-qGDHwC7)ya|6GX zx)Q(|p1tlfT}#dJu=7SiRX>_w5}xj|$k|o-fLk~{A868a-hvvv zHa)?6E?te3&qRS}ens4#0*O_i(bjXII%^?!T=K{z9r2J|dh%|)1$De3Ilnn>y=r8? zIRwAe-#wg70MbrQX1(F>V9w`1eQNO3K?G9hIAh&=8v^6tJzjm2xLrqq>+qz1b|m;N zvhjkMgIju*yRo_TFbu`l;@99!!%Qd=1=j&>?8%eOfNC^6wz>8;HrE(6o4~* zklJPq2!ox0+vpsm>Ot7p*+*(>H|Kl?LIOrA_mn$BKs;+VXC^>~|M4ktg>|(1DgWl} z@okvl2|KKX2-5VyRmv`kS9tho_A!6k5pxGNaGmOLziz$$8R2O>#<$Z_8}W1m6_psv zI3+GQtb};@822aR!%S!B8a60Z$>iwp1x;Yx6R|&SXk6mDJm?R19QTXj$(JMeV+V~S zi|lsane;|3V7DlV-EZSdNdgTWGt@n8o8vDBF0k#WzR?@mR&15v7_%cD1wvG--TXi1kjE)G`H@7wTdJbiB zRYon{I;i%Y9eN?>_CuL*OmkEhPG&M4*z+2A>qskw{ax*J?&7M=JqUEK5pq|+Oh=V! zU}e5f53b~z?a9l+!((UG)4wl}A(KWu5sZ^_)te>Vtl~#Hglj!anUP5jaBoCKA37ZE zH^X)L=z3MQC(j`aPG`S+=cIKaH8Vx8WyRLQmh64sz*I`GqMd&quJgBG{F2TEbgD8K z@(ZY+|527#2C?m+1J08FYX3!pdIm3*75;_Rk>0WvwEE>{^lq))ijhudKpW&cYG~JEfzbu;S#e# zY@r)F5(s#JiX@GQw@H+#EfnoTP1CrBB2B-h9$fuCD!;*p2NOYm$YM3M<1bq)qSEwK zNXnWl*Ly>xh;IoTdBmivI1 zz^)!n=M&Md4BhyUia{qN$+Pmq;bi;hEIIA2d{c<9oHIFFyv(vO0)5P96azcGF$mOj zI8P}t|zd@1G&WL#2S4cT`YA#5U!xx2fz54v`ak zP6>lAW+>SUFTHK1fE|YoEX|{(>4sAVd1pv=^3yTNvqNzS@dz zN8G}t4C$3(dVahpI)y$e^FnKAVs=6>DB8;B5jq8ePt8NqUeDtSATNoqXMx-~)rpaT z%YI>am~0{_W2+Gs^8@XAhEtGJZgUe>8T^ZndIlRqz>K=RM*bRD!bRE#)$vO8D{(-$ zd3mMn7@3_4+Rvj3=9BK>`O@~f8qdFYp+XA#+b$u_C3vigLw zz)1EceEdD^;$pg1*rq(s!OZLu(CiT1&>@ld#@KIZ2#f5e(p^TVK&PlP?-%-M>AdoA zX*X;@ht||L%3e55-zMlH2{j3jT`!yBRHXjYqr=w9mIPhLtqK#kJ73o0oc;BT0<28P zZ(V4}%PpGBHTkTGo`a>y>O%TGQZh463*4T z(Ao#Z<~JhID}8{r}Gy2b-`sXsAg zo{uf)=$p^b8|Oz5LxF~8MP0};GYz`Q&6AJC;5rMsM!RsO3V|Z1@ln^t0P zQa#VaFJC_ir!FP>_xJLJ(oR}b#y)8%Y9X@8wC+pX@J%A=jThul5B^l)?m*URbpp+> zo-#tRE-_BAxR9UFQSwHMwk~Hp)1iytc~gkly-X_jF6Z3-q*w1rNaC=6PpyA%uU~Bb z%R>1XxM>OH#x0}!&}1vybdxON3vSEkjS#)?OoQ>Kn^Is6w_%b531>s$^;6V)GOWVo z05#jtppg;O5RLvl60w=@Slp~C!t8NJ$%Lqk_!*NDV6ixlLTDLtq-A)Mmoyll%un)cj|GBxI%I+fX$zmXcjaXP~hASqn#{ae$S zUQ?msmoi7EX;q=oLTTYMzQtD+*PNtFe!HQlg6hRaq0I58^%nkg7WX6 zSb3%epJ9O)1<3#-^26$YT~dan&mLEV{{~>!=WG>k(LcdzJ5l(YD*tPZF6s)o%rT z-AvT*`b$O6j&m);a@o3BN=w1|+X;Go-#e|e(l2D%+fqWcZy%pm10L_HR6joP=N7)rxti2da@ zV4=7y0jX>?58@HR_e^kwq=Hh#2_b;s@~(hiww@J<7Nl0X>94n_=%n7$ z>*rIFb)FUOK}X+-kAvs_3}$PvmNQRfCYFawtZKDNCW%6rYD?pf^a+bb$lmI4d=|yb zab*VKq>9rrB4WSR?+>pMLF4Wc=2d_XgXi9D=#iu}3 zU14C1)IFtJXE1G}5q8gVdm@j|jA*(@aDab)|Ex(4PC z|Ji`vzIg3eYwgb?nX~cZBh6jUPEe*-8!F>DL5eL| zBf1CP)`xohvHTPaN*R`*%wP+G0%B7W-vAGe)r9}u)0JG>&{oVueS9wQ8)!0lV7+-=hzK&&rOFi^P8%-0eBJzhr zoYz01nY<3Y19yhEUF5i;F!qHPT+S2Stj6kh$kC(f3HaL)n*WfZ>`;t&d|%i^g50R+ zsD3*_$1zz0U&?Y_(_lYt+qFyjND9}Q(es_=^`VsveCKA5i$mS%lszLYIlV61ttk<6w*oTy zNJ+V6+zqp$are45^a<=55>LP>{vKZ?aPI*}#8MbgcD>8!EX4LCIatT3G!0Tqt{ zvS$L$uu81K@w81be>Jt33J^|n_8$hGF=R>(00+9t5qeKrI-W4E5b(_R_l(Io(XH{!DtoD%7HMGz_^(?t!B_-Ym-}$u7)@9pgi8qO@ zuS)XaC`#(}pX=8!yk&6ZPKpq9T-}rXddyx64|0CzALGF6yg3vg2x$=g-Qj|B-%-A3 z98*C_p-l6wT-o)nrQm3S4l_Cr;?vMmrW3&6wHcyW~%QK$v_!!eqbZ|24TK}FrTo-I~Jj~w; z;V)4=`q=H=P{z=-@>{Jmr7&?dCI-L9)%I}1xrioVAoqu*tOCVL%d{G`?8?~SSttE3 zT>oj2D2pHEY=%^TD^Rjm8d&-hwmp|XthL=zN^wgOPs^~33H@oR`Fdi47MuL-9S{C~ z{@MOIc+YF`S@6TU#TXyngW{h^$1|ID`d)r_J{~0S^(h&*ENw9IIm@(rzjrdkN#d3u zHU4yZ4#Xd(ybUvw3Pu-geH2zF{0U3yNGGuk%+*Y3!A1?ER!-x4*-C$phWmu1 z*&vYs%7{LZ9NbQ9*$P!Yv$Q)=Nz7|>zTtXu*MO=}Ppb`V%1{}~mXtl}a1MV{k8t4) z(aG6J0K(m}$eNN+AmmNbT>mS+`tEG~V^SmN+9fiO`oikY8p8zExObI5$lHEn<&Vqr zDnL`_OAu`#HmhkuLAG?kcq$ZjXqL(AJiS2A)*%-s@k<=#S>2`2PUWj7Ugg1=t4bay zSqg+gGUbE;lBu@NFZLKiQf{2nC+csa9vMgD^2a-ToBRNl6;u7GQy4tX#Yf=}X-Z@g zZ+PeIpqWvuMHx2UgJ*mm+tNQ9E>dqb?8&8i$hR6}^KGpDwZTnFu>mXmkwA(yP{2W8{vTWg=lL!OOfQLkUT12VXaUVH~J_ze6Vz zQtLZ;BP%62hRBpQqHkCl!wj-dFuW{)mE1#B8w!3Mp&iTo2>m(q7)KC$TGaj?h^T<$ zKm-&($QudonKO=LG{P1OCoDlY9%h^uAG`AEz+PiKmtfl~^}2SULX6h-oR}uFZxl`h ztO`SeDd|OMy+ghA;qY6-)!qB7xq1!e(Tz#U+|EpNQ*nfODW&4-dP2s6G17H&&gpC@ zCunT5V6rg#fQY^8yxCv!XZr>!+n}}P2!qmKb%c@Ycp*z@3XOcYoBK60uKs80NAL8M z-MXAo?V2W{{VvCP^B0d(mtGVeSdUI$01)aEI+f>kW7;Bz0v2<~PZHXKVj>qLpDa*Q zvXtYfU0AeR@`7ULmOMU&2Kg#Wvpfz0pQWIigtrBf2f!}Wsk}I(NwQT`97`;Ic@;|o zdH`~k1 z%7W%&D@wibBYntO4Z14_Mh*=W@x`5B7Kp8`3R~y-=g;ojeCujgu zmFEe3Ei8MW-7+`xTe!?hM2wl=84aRZ;{1gDN!2#u92dKAt?A?3`j<#F$y|WOkRY#U zg;i<1&^A^n(5NNxV@@EKndDc6FO{i%qVA!o_3Uwd%e=0IS3v0PuB>;T1^fB)!{8wd z54C62ufqlyw^%BHj8>IPD{XX$fsEsjxYl}}4)`ddxhoA|B7)cyc0>CF2n{=-VI!BB zn0acrwlT5l=;AXs?Oz3@p>eN_i({uUYmW0blV`S1nhv^cxr0<*^}o=RgPcc)G@mB* ziXCCpGK~;D*I=^xmmOhhFQ7_lSaTjUh)}KXdkpQ3Por&cj;OKbS?CVnW*6PDTdC}O z2EzCyx2xH+q#MQY(Ezv_DOmST8suvn5SQp&3S1trg1us^GDsvd;Oo7k+}Wai=@91o z;WWoX;(CgQSQzdMY}hJouP`LR;JXgbTWXoFDp6}6zigFii~{SD>DEdPDy6Il39q2f zx}131Y5J=hpnfc_i8HKxU>Y=-{FX@%Jm2m|wR$OULeWmQfmFaRuA-|$# zAvcS(Cj|rT4!FaVv2|i9U)c}&U8*tnMls@a=Qnr8v?%Yr@U5WPmniGJQG>dcT-qq)abbb^<%Fp{IDP41GPD)n zxbwuKsD=MP%5M4-LnT`iD`!v&JfE5nvvFw2&$5H;O|rPAE|t!l4j6U9suGKdCSRG( z_IT034+D#5rxKoxbDTL(d?UjBhgW%8A7z!^;0i3W(KVe|X+O6NQ;JVRXm(Q1Oel?mCYk1OH>>2P;;%rgphi5hz^KWF^;8{W~_I(iQ ztVFh3e3A?_IGXwHsJpATy!|_YwkRX7Su?l81o}~Ac+*)W`A6nyAG{DxcV-1(ncD0D zsjXFgF4tq6>BuVgJ)MX<1vBE+4DFr=eOUOM(YCEn^S)QzC^uHJM7MiX^R&TW(|?Yv zLlV%mwMA9rhUZBHObTkuawI)Nt)ir`w=`KZk61dUi6=*0zDCJf$BK(EZhsvb z_hT5GVvNo>dob9cfPVQowq?BXvkJ(RZs?x(8_#-pDy{}G?TzcJ$dP7$fqhuw^;Do+ z@P4%AO7;9UD}{b)nBE(A3jQ`cZ?oeEn6a#gMS(WO2iXB8mk;wK;wvAaiv;BM{S|qH?^c zr5b7SrO^6PxZYpYl&8H~gK<3sSPWA({D*bGR-Thaj&)O0nMH~n-_$&#ifX`c?m6f8 zUjv4xiR}yT*;%5VANWYe%rc!cRniKI?ZXT6GYmsS`E1Cnm#UbB=5wmb+YYoQhb>Nu zyJ|t60VI9Bh%!y;kUls_54s%4A!~=8Ijh;j4P3b^pIHJO(c$&Itp!J2mUZsX<#L7l zYD?cUQq}mlXlyq>{0FS~_oa$q%Rv~VRHKPR&)Xz#MoKz`7vxA?p95h`S1T!+cWVDk zcuTiir!-e7CjA}56B#11B8{^w>rRO&LS7achZz?-?^U3LXk@;<$DlS=Qqqc2lCwoYbhO~icpPTVW?-BEsV zh*sN_1?>P&gPiV!--4^9!Jyw;@*=q$2N|7X#?C}^k)uCqS-8fjhg79wI`CUJgGLoY z(veBER57>*7R$0=-}FyTg5%J0cN_(2*biTARW02}&l{F4$rU|;#J0Dad1%|V|Q7xr(H!>lqt>@-R8JV@PNY|{SR&Sd6`6<}}!mK5xvsVWT zwrqfUZ&w_#jY_C5MeQ>KSzrrSkTAuCU#&4S3^ZYsF*gHZ3Hv_njU5uTQ9_*A+7V2L zhLYQj1u>u!To#q}KeK6wixqwJT!)*Ie7weO1dVF9L>|;3(ICdnHhk&@j|(sNrYKOW zSm_QV=-uXNar<6T7Id6B2B}qMTBD_?+-SH{P~SEH9r%mke$z6aKjE!kdv&I@@$XYV z$FZ5^7vNfD66K!dWfG&mL?S~7gljbw8~>JWKj@CGHtS1q`VyZ8oTx)Pi4T=3^ZYgL%6tk4@#{*9Y43e#Wi|<8&-BwSsX{HCX8csK_q6m~9yN9#%^=>&k^sRph4GbUTj_=7;oyZ-3c%>s zRoX3Y4zcz`G0Xs_%ikXsHtOT;chnm;zQcq|y63vISgI$Lmcyg1;5 zcvZpC>{!%4J8S5b->B1?ymo|#A3@0LBC!TBzMpyipNLTmR{?^|(xZ@f;XX$Pu zW{;#2C!*43(>FU83xy(;p)IX)>B{-147gToSkMwFD&dIFnoBq5XRa1HV^paFZ4e%J z(+Dlbx-6BHi=gWobrt9QzWqbE^}0{BlgvY^N`oeLZSNGh11}en=2NWxr!x6yu9l?X)h4bQv9;G zT}vlfl$}v}z#_X=fX!hF&doBM3^p`ABsM|@IS~a@FD)|ngB#6$foVrxjb5)XP?jWm z5Blw>wOa>9R!FcvA;|Spgm`OWa~PlDQKVm_6$a#m|5I4FXh13Mx6HZ&9xLS#1k(Of zqbsh9aYy7x4LjQ;Ouv;bRNHc(U=m()-uV6Yl=jvU1Q03G9Q(FKV|856$)C-iLGd|* zrxQTfIw3StcX7$6S5@gAJlk9kVhvh{Zl5W98(;7@U!XuExUj#8@_zES;9PwHudYf^ z{U2_M^*=M*{{IzdF#i+v|37)l-zejM;`5ll;l}?8rzGWsqy+yRPW{uL@h{%=4|w{| z;N|aVEC?C$@-O8`|ba}?!U0mztGSBoeceh zg8sjdp?{hz{>6~~XN&)XhW<77ujPMU@qb9tKYWP&yL;lF(SNO>|Bp_Je;)hK`~7F^ zpZot!g1!R{|1Ttnf%U(0{usZH4-4aeC;fe!pns43V_;(b7Yh15v;eDb%l2IzWAz<- zC~WfG6l3!Jxr26e`p!YLhIU)K^e|D@)@h=_-Ov%-{Tb9QWETML3QevJ4S$6Md4%1A{ybFvX8)w?nAQ4}?s=uaGR4k}LU~5Lcl5I;7yjoH z0-B3zE)YM4mD$yF(11$V123^VfGF`HM^@3SzQ83oQd`&jF9^=6 zqNAJiV_Pvt274D*VGjs_YTUF|eO1B4IoUlp18FMpfjnebXuwHHk9zwUA%IC0xU`KEdKAOz$yB)r-Yz33OvE6H6Gg<=p(Lb!LqR~im zn}3x@fR*z=_6^-M$pbtcB_P_nA+=+_=A@x7U>Q9v#}Y2Lo$G5|?V6uIV`{)wwmxiW z(%L!e0BeC++5!%WUr8Tmf}d&=NT9%WARK-l{6B$4pn&e^>kZ$_3xbP@PHget^$d_b z9r0|%AjJHF!YW}#Agq8r+VMTxQ(OFj5X{tKW1hc$emr9^a&h%wTY&?o22gJ|?do0F z8pIB6A4`%VnAJe=!;e6N)`9r>dVg^+x~V4b*1mT!_`;)k+`jpmRsYi64=k^| z+*Z!}YRC3t+dGB@c+E}`~r!=9vDEgBDJvvyvwEa z(Bk#r;ya?!4@{h0yS#>s9r<#F;G;sI-{_HH^z=Mr&K7Sh70Q+d+LmmJ#3h8D#(j&t* zRYBRbmm`tco2}v;UmVVMxI2>^3w|2HbWTFg=S!R4XZ=23XVFtkP8=&q5)Z$qb5K)S5BuCW)aF)$_yjnS|SN(7UiMm#0^0`d&o{{yAu@ROJa!g!i|%*M%F zn0UBmQ3&VeW8})|`6-K+Ft&qkoKEbmg>Seg<_p2?O<`$CO$Ernv_%No9OqYZ0O9s3 zy|Wxyb;O*VSA^15v^Dp4+@Jr@B^xqjAZ#fI8_DeJ6x9sF(&(+e%9_QkJj+GuG|e<% zr)6Rz2R_sywRx>PM%T)y?sia6{Dkh+Flg_?86$(-z1_Y}rd{8#x z-kdb2Xt7kcxJfi-IOj5l@vTVvov@p|5RmV(8oP3C+Cn$5dX8uHB1`;js# z+3$K+$s=fLRw4Pv3;fe(WMkG;hh<#OFsjm!e*heF})>I zG0&aQ%p+fy1oI0BD;d|*%5*e-{tXN!J&sRmG|-%dq6pC=DGttjb%H;;tC=?)C4-1g{E4`h$Qvu(CDb5mJ+dYJpV2x}4sw z8!rMBb)CG1j%0g+kesy9eM8A6<-IgH@tiU3aaLSfBH00plvhlR0CBqL;wmBxf%R1M zFKACj@2Mx4Zq=ppB~5%*3rEo6A8!)iCr3Jup$`gUAb@aMcsA$={P!eQb!!j}WKkIn z1uU(0x-RD3=Ra$NV^&Y~b6t8F24ySCW~dJG&?I|4Av&nX1kt~u@{b@%B}QuMX`xE% zA!B%Ad^|Q04m6%-N8OImrt%r39Iqap@Z+WN=Y(;4xI zBkC~%Zk@f<>Z+)W?)}vE=o-h zz#K2-lA{f>4d50kqk7nX3S?tNO&lgJz2B3BO_Y7$KJ z3W6|~(??hK?#bXQvUa%=rdp|`Kn9_9|KV+C$V-{L3n9O{XKAHhkM~B9oZsGHXSc_aO8;YSTU|9&isscH~=h+dmpRA>b8NnurwGVscst`%c7iNfW8z znDmtSect56vl>R(iFkyXxd|V#JUEL0TV!Y?Xa}3SMb{F2_)~q?ACP0t#vHYv0Q$UX zIj>E@r3*qg(E>Urrt2GDC9|RJWe#|<@p1cX&A-$?(K=oE=<*;O<5oZJ%uuVHZAdem zkIsDzM3g<`inRu(_kNQQw`ynxlB_>#aqNT!{lH1TC9<{(U?Dx@9j#TIcfvgF6|AD- zLuBf0FQ@?Cf|J&kEU$yy)7E6+5<0OKvBWkU(Ow9-pJid})sr2$F85u|OfE;fTT>@B z2#;BV4kx{tCx~1+Z)kWs`7NKTxCSG}P?m7}`7pLm<`}X?4tf{!9oyE%(y<-BRM&~} z+zV!^x^q=n*2EsU6~ys}jSr zP@WSXw8MRrCLQKg01nHZROhCVnfKeS@)}-awMICK2{!#&4l?6Ty3aj7~Cw zmt{Ho`V@FNjMpe764S+#$Aa%ohOoDaBGyDN;DXA@6|LWJ<7GN=3F!5ljG3h3LE3Mb z^Aut=6E9-I+wOM_Qr12`I{;v|94@9aPS79)eHpAEd33UHai3J&1TeJ!N`Erb7@8ze zyC;yzH5P=7G#}1ugDk3|MT}5%oHZu-MSPJaInLsYuzjDJH*M_m`w?f?XV}rpEDBH8iu{x*j$YM9afGN40y5`Rc-=%NY`>c%|4 zndbNIt=Zw|+ev)$Bae7(fZz6y&UhYx21y$Y=8j^=Oz0ea%(~|gOMuZl0@>l5+ON42 zaSl)@Ql)!^7G|%dp3zWm`a(^}4cwe&pCk6$f~nKlL!E2TF&Pv zaaSR?;ryPZDs7j*=%RqwfL79}LdUi#B7B9Zni*??J@Od|uS#Z2>U3_U&rF}Ao*7XZ#p-!dZi%D;b38s)Y~iz_Z*s%CmNM6-x*sRt(%N#{9Z5-0 zcBuefc$Hu`oo2rM!AT%KCkwmate2qBG6xxrWqi}pW)ZmS||HZX^LY%rHQiC2H3vbb+2H^Acy=rHMQ*{L_rR>Gg)KJ7 z4i+3HTX!4Gcw^Pw%$pdG|E}X0P4>Jm9v?1JXClEDpv4x;j+|FCWgzfdFsOFLZ;{Bc zDiTBI#OPPn0|GVrY`cT9K@wHq-Vk1IIl==GmPUgcs&Bk}NvUTagc!9{(lZ@z=~it0 zs!f`0v4DRB3YZHp@Uc!{%*b}lkz!4|6ehBA#()IK!N>A%8V^rnTq$31=tJKkQMONE zEjbi(OLxqtj-!;f(y|nn>PVrFHo_!^^AQJ=;e$qgDAFo!Lgw7e+`BG`#Xv2w{PeZf zI#W-I4l!XGEqq7(B=S09)!EeWEvsHG%ax!kvk!&SHG`k(8~eAGN5Y~BaTQa?Ke;-% zA@!6)F6NJ8M>_@4xmNN{i*rr{v}Wu#gAqZP+ku;59@=Md4-ie@`^9#%L>eTXTX11P~cP$vv8f={2sVWO01*zUsE$-1hH$WOOr zJRASP8sX0e=V{hu%FVOYXk@wa0O-+1`(`TgFfX6nitF+DY*b24Btm8vL=I##?O%NT zC>1c9VB#qb$d!f`jwZiyV3&}4Zwwp#>y2i}W3=t;FAokuzj6td$xl0Vcxc!e3G zt?j5z)QF|1kQN$!O8q-;D4`6HCulSa^1JSp-9Tluk)C>tg|8u4e=vYVVr%v~`zsx< zNwf|W7>>CL5(%2MxsLgy712TN+9{0JMzm%hQ;7U2aKhorAE`FhY9ZZjm2{a^Vh;@~ z)m=CkAEM`4X9-ds_j;!V!nGPEcj=g1P!k{C@aJ#|L1-`sq2;Csk_A}wT8jxcA#moz z6ipz0Y=l`hJ1=I|^~GcCo=jah*!$l;i-3vPlhHbG0e*JfsULYg-n~E>3M|0PP$>05 z|C#lZJV>V!bwqYjSJ$o$oi9<#d!lJT}5B`q@jC|o_O2t7?oz|fWd)H9xWeX_2D z++8lXf&q{8(OFLPql#-s;IxMe=J~8m6E2b`TmSX_#g&6)tQv!JrpKnpg_pFhNg1rb z1f}x1K{tG5S#kmqlK%^gxDqkoN{$s@<<`^=sH=tzwqpWQ^vsHPEKD%tXFt#sm;;1& z49;o+t<&Wi`lR+MJ&(@ymV8`J(M*`NI0HKtF*Y2RCAqwk(uRzGdt)=EWnDJ{>%JN! zd0Truu9wd0rH441OetL>!&Ui1_u9nkFt}>^1;NhSByp!_MMVqgR&{Z$Dr&A-pDy(; zG#YC7Yng|t(5JZQWBi((Y9%9VH|G$0(C}8Z&qzWeD?mg#15S;NTS>rVYg00oc^wf) z2wG6AtiHcznwkb>QN2uQNOG@17b6&fO3~dSVe4=S)$oPf=|#cDxycY7sHu*^x>Wu1 z(iiiQ_>e~L(~i+}zIYyaiz54>M=W<9HejNH5v_;j zW0YE|DBQnR3x*g8K*s-MpxB(5=iqqd9()8U&6t2tCbmz!{oWZkH7`Dg7kK;4S)x^g zM8Jn_AG(a#gdj>8;(_f-xiIfj#F9TeL2%%{9wh2+YKE{vjI}j>E~*?yZ(W9J$%sGH zs);EzinsV3u4t4YF=u|kk}JU!^ttaB?el}A(_e|G$9iwT&RT@TkOMb2qs)=Ufy!xb zWuD}s)LdLtcteji;>kma6Cp3iWORStJ}-eSQS#tCZa+3S9TUDgMBcF6P{?&U+eB&S z*NH1PB|(_9AQqT$IY9Sm zzqt6!r1_=)VMZcR6zuSO?L55&U9Y%o&vJiyAAnJ{6{O zPEt^bis(`n6?!=4jF~=USJt5Bsyg{2J-jQ}UCfri7u-it;$?;vMR^Eb`e@`KA!b%v zxdstcI8?FbWo&YvMX8*99L-E^6D0p*R%|)GsE51Qi93qUvA6t(MI67R>}z9UY@f48 zJZ0P#AGoyCVZy$>~yLVPHL+2T5<6BCCv81@2h$`8jIr*t|L-8 z4#eG} zK=ID>*<#Jd!9HmkBvyx!j3;|@TqJO_Xc`PcuJ;tK_AwPJth1R$&(+(FMTX;2>sP$BoiN#N z&f)z2v6sW=>qHl3lV9O)7lFRU%{(T7DHe0@2Lo9eBx5B^!A8u9cn5}^h*qJ6AB8AO z_=CG+WY-%T+gOk2vHzi?U4ssbsgSRkDc!fbVSnEJk@>w6+Ha}}4mEh(l<05$iHb7o zXQMNQJ=RLhNRY?la704p!dVtw9~waV90K?k#Gv&L?-0E{qK?{#I~Wyt5f3f7LbZ=> zO3$<>YL_BCy<2uLc5vt^YoIL8v*Z;yNbOyTN%B?rWu=~JJB_5!wik+#Sn!NlIXnq> z;7imOMxoJngBl|s)&?kSG{qbXD6CpASti88cA{D0*#O)@Q@DX{>jaRY9ML<~%ziaIo}9!%NNgb))PP@ybC z$Sxb_NrtX8D+R+r%RaHS!ysr_y)9n`UtTw1{02ULd5K6SnQFU?oL`1%>y5M~O#qlGKCO zdw-!czOj6rV9(L!V_p!}Fdvh??0j^EqloNhmwS6dKZgIEv6x=z!I@Y;L1Hp;J2JX_ zakkm&7Jx_i&uS!_;VQbUV_r-St$e}4z7CxPh z*GdQD76~nt>5-y!pA3c`oeYPzBWw7;wsqn1r4uqnDLduA>NsLGR*E&oKk@*CZA6^L zf4@0Iib~n92$*;Y*7Vw#ga*q9x)o7%-=rb&}Srt{O+qKpM#oRs zYCrn{AJ_45?J%{xH1y}z<)UQKgDSe-1o_$kLMynks6$6)m2;ZP5b4MOd&%_q%?-4n z=V1VRdJ_WoqWSM=0cHQG>Kj1}5@i7eyauj>qQv)9hZoV=@9^?|8N4&i;CT$(4~_bM z$B;p5H&hLROvigTU?HxAN1XP14)L2-%<>VBbf?vauPuia`k{EFqBOM`4+n4w-9pp+Q7gH>nv2rx(2_qzo~w4qTytl=0UR*Rc9(U;CTA?95P+qm0nn?U-kZ8It0XbA0;u5) zZUDEjh#pn@iKBjd4n9*SaXO}*x(w8^TS7qdewn3hzj42Elu^R%=mQ4Stjp%dd2WCb zKx#)lyCz#x3G*$pNoo<2AANH{svs7~guCujX;wEo5LV{zpJv0f1x0%95l`*b42QjW zC>tZD1CxwLlDZakcJAxf51@$lbc@KV)XvW;uwNxN0Z^QAno}*qv1hS^?2u#lc3G^F zaZ_QW(|uOeQjcTr^KN6Z49R@=Tl#b#vc6tMNt9uP`II^Mo)e*#e-{A!fZ+?)jt_=# zw$mmnW7T=1Oc=f=m~`|?0ZsOazSe7#)(*r0h#qJpZ?t@}jy{=#=$fb1r| z4Rd0kXVzwMp<>FNQ_4ulLj&^`8z4AN6;|L4Q-0sY)Zctiu)N2aV)h4S&VS#q*(J2) z7P>P_;ZSA^!jpeix65ae!vKWYIoPNre(VrLd|=b^tdzhR{R;h9(UU_@3S56+ zX7Y=H0*ss*WLPf%ZcnU2am9|@<*ke&!-CA7HD6O^)ZmB9n%XE-V#s}3D(^*|l4&Lg zAYXJec1e?#ge9S^(t!%sYH$hTLPa6??&D?zqx>?x|4_9WBIdnKZvq39Y1zh%l;AX| zD)SO0RgY;R((D9q)8yr)%P_t0hT1lVD^axvg7-b&!l=^eUFF`Te5a7Ga0q*A<-^@I5334y@0dX#X+VUzwZRAAsOyXcx zK?^D2Z(#4oGl&lMbfdDgO71m=6 zGB+rYPm*x$ejVa%`>E=jE{LGVRK`?6=rc-eR2I4AOst<5dYa*36vp#4c$_H|SPu+} z4Y(pqwHa(x)VHQPoN6!7GCHAXZVs8+xzXd-QKDlfqOE3g;etwYksvkfa`zpUFh9<0 zBS#Leg5E}AYjKo0fj&RoMSbyYeD`o6Hgr}Gp9dLkMa&kh&5PHSsvW2GGz%iXGG|rC z=HWO@kFBM$o5M3xzQYwr$KwRLXV8DEac$|C=2W_HO-6=VpySjL=N0gd1hlVk0=tBS zo6F;$feVnBqdH>EoxO&8fxt7PfP;{+Z9%HyW7E(~oNZ2MJY7K&o*QFUa1j8!>&7I} z_K?+Drp2uYp10; zb85~l&z&z*0VPeLjWS_^LUk>%v{O~lXl<_j18#cYq0CCuwv`a!hD(3B6@A0qABl5} zC?EJYpR-1N<(RvvlOVNQdbktO4aIBc+Ig{7wmYTZBCrrO3Y#*J=O-gE(j_X#xgX{8 zW(Qh-J}JC6#2EL8gI_Z%TmD1kN;?le&oC(+_SxT=yLSy?T0^`Sv zMA#pf`v!v;FeQ+R!yk+Mt>_n!X+~>fzRQrWM;A^;|aMJ(^S6ewv{+ zp*A%P7n=LGH0*%NL?E2s#N6RxQ=k(_bLG0|;IE^d@ihI&;T9YYot6CMU%eHnW1#9EJj9;yd+&%Eku!xe%G9MQ zXBMGBo%xOkrGMJjY+O9Sf@v(aAoct_AfU|B2a2v6;z%NubNLZ9ucY890F)bX2cn}F zDpAT+>gE$<@N%Gm-;02uh*Y<#Mozf3m;Xit;>tsT!U{@^s-k=+CTDxaT&hToIDdS` z`d*AGAN4w~(A};`hhW{hOA)b}wAR3oYF^!-0R~Ka z@WMn25Tbu|bOn(Ep%&%o<0X!9NrnZvmB zlAj_#br(i1Ygzb(5|~jL6SA|!>|5O-g%x{t(<9{H7)g-~D)bk)+ny}~<_7DFxn-N} zs5VS<hw*Smc?l4+#I#@j4*#y4s@gA6_vB#!DR8V~hP-1C1P2 zieLp^$@9jBpg+TyZ?160qQIp0A72?YJI#FU^8uOM{!`9Rxh0j*C>!5$h-b4d9{}`xBe?Jy;HAQud7U7Yh*D|3;-Rhb zXbnzJ#r(2IA{%T2fKM);Hj7H9Pl#mXUaKY?4l5m;wBmqs&VG91Fok{(_&z;enr5wr zG6~HiOsxwiM+OlXc-&Zjmu2RN@cyFN5RWH+N?ROYod4{2sbY~KV>3&SdswBrjlQBi zaoPnqWv}h?<8S)>#*V9_mX@1S_A&S1I^S`qJh6|m4#~^3%2=FHrzRpg$?7B?f%OK_ z+2i*~BD@NOr+!j4UdL$u0|((RW90|*UZ4G3*Vyw5SdHo`8DDoY{}{<)1vGr7K0gZT zDaGV6lX6ah|uNW%z`~xXX9B~B-mBm%k&uQGZ|#R_3z|eE2zc8 z@k*UiRRUcoipUyUvhhY^lzXa|iIU2=cPfvT5S@6RN%6Fdu5*SoKx8!!D%sF_g*ppDls@bdh*`W?QB} zUxvvzi28^A%;fObA)T^oyexA&S%db*r!;4Y_s-VkAKS1&daQr6D?y0d4I1Y;Jky21 zr*dtqUs88ZJZK@zv_*N7R2R%4;SfDHq#Rl5 znGZmzKJs2Gtmzx6dlW9XOif7aMLG2x_Eht_;&TT@ZRL9K-UF9>V01EBJ7zaK0wJ0I z%1z}Me?IF*A3Y*R5$~jHA6J`aaL`P5pS;VEL}Kb zFM%@#kqAe>mZl4#d=UzqxAJihdbra3L5|5o)V=YfO_59|P{K^#YQ_n_5sDIH3>1&5 z>7}UjayabwSGK0&x&X)KOMXuOPyYDIOErAed}*#z8(i04^tr3a#v1Ce9L=qIhYWC4 zsmEcZ0&@V~NYbsx>2e13?ErYQ%JsgUyC>*R6VKE{n?Dw#=_IUAnNvgFa-}iThl2>G zMI7T{rQUpw2-?aV;KY8iAx;`A7ob{?Nqq}#a z?Nq&pl;ARL$t&kcW1T3@{PS>eE_0#b%={Kl@x*fymeRiK_?rgBjR4*hz$!*V@B#O{&8TWZ=8sZ*s4t#r~fDF zZv-gr?l&8D;OCQOPEF{V*6gNm|DDEbF-lRlVhzMk__M!Z7{B^a^ZA&LNhHqE)ynQC zvc=X9tw9KYO7PGJ@Q_DmJeC&~rE$<646NtQZ65O1kI}lRsq+o46HhfYUePF;L^BHH z&x^XHHyZ~Eko&bZ1>4c=I`Qr(RDVkBD$$?oHbr4eos{Y&>U>VliIC?_R!^vz3{=a} z&sc2}nG;`s7r=qaoib^MFaSqDJPEHR%+sbg_@E+(C zy#^ax*e-;SB97jG7UZhdRpHWJ9q${?8iS$dRjRg9>MSZ3LiN=q_E zdR-@HiJ{9+n>=Ev(tz-sJyuL&*Gzy~5TqU zRdJc@Qnb5GfDgucT46!%y%e+QuH4i;2k=y=S_$jfl^qXGz9c8-w3va536=T-w60;1Q4>kmun6|nLrBz}t&8w~s z$F#o`kypI%GT{i3U6~z`Uo?}o>ZSwGkfBO;L+~sM&ugg|^E|KWGumZ;6lYKw&7L{X z6wpQzMEIl!iv^c3#73q>uOOjxod6JTNZ1mL*bI9?3@}hh*ER5OI_7?q>;tqT%_I75 zWS+{kUSv5n4UX9oz!fQF_iyX}+_s+S4GK7k|FoBBbu(D$Oj3xC(+n&{e)He}ptxq7 z6Bhi1N)hpw*yiXif#j(^l{B5b$C$b~BDAu=j?qel>$tuyujAw~pIA^c2u_Imo0(km ztij2jI6`z=%uLzIX5=Z}Z5kc53=MQf!p~Oj5y&xcW`^_PBKM+FO`+QhrQ{c#ZF$-8 z@z=t{6DR4+1(|xmQBTxMd=3GE%fhCY@aK&28s&2zuxjX)x1_jiPxI?#4N!}>dPJ|~ z|HIom2U!lbd%MkBG5 zGvZ%7G9rEj@r`=icq2x(5&>Q2+9C0%VshSL9GB9q1x>~Qy(i#(d^*MxBTYEdIo$5D z{G!g2_f_LM(ItG(v*WLYiGFa4I7w{Aav+5a;E*IFkPsU1WTE%K#v=YTnKYDVh@q6apLa64A&NiJi3882xL zs2b@kL8{3JYwXtx5hrQY?`(lTR_6Liw@Vk|r}ji`;`=9tF*F<==D3!zFKWEd9MPqG z7!+KPqrk;isLXwAcIKV;cXV{x3K7U*ji5cJ0o1t5h+o1@Klw}-WiG^aA6%XdzO)s) z&H#vL@0W8_>A*DEpR%PIMcD8p1BmqrQ7F~9RX*J>3KWsAl0rn+gB6u@(Yq}$^AI;= zP9%X6j{ea57599N!`^<8K70H1OrRL-LD|+Y*f#M!I{j$n#me|{OUHci2D}sD?EEh& z{O@@4zekz>*(&}2tG$%*yZQOQhwz!c>;FGO_=;k(ioaF+M4H(FC`M?0E-x=l@8{yV>^p{=8?#ecG#ihd&k z68`}bkoz~+sS=GcjmkGFpl7G6Z*J)D59{i`tpC%y>S$%~eLVWsc7`;%GUwL;8oAj!otwuKavOk$lm|Q>*AX{_Pn{r~R!mq_@l5&g>n{F7Z^`nJ{nW7PMSzn_2SzjVO=oB8k9zg7R% z_~$SC2l4RVNK^kZ5&zud@2J1^|1$;gSD^ZL)W2~P|FZse~FHP^&6D=zZqD+Pu{no`S0{U z(-sx&ioXpc8i>Q%+v8i@cP}rccQ4aekuLvE-%F%RE#6(2>Zw-Gx5t)E?T=T&;gwp0 zs@A25kd2pEBqH%LsJ z7gi_0Ob&Huj6fLo0Zr0Ufd(cd0V*m0P^_%1SRs5${PTbM2gmwwcwe4+CnuJAXQw7`o>BL{*yR={pa2>efm761(*OmL6B`PVi2xVk zAWi|q7~C0*3Dte#%4;hV!Fi{~1}3%!BYx;y?m*RiM1%GW^lmMjW-n==ed&R>14IB& zM;VbQdCyO9N={&X+0FuEO=etFXlQ(L16ODOpiBur_H;7g1i?ug)eHe^z^=47nJ&kp7Bt9 zoV`KbEkiQa)j0zKOmg~sEzmOqr>M2Eu3@--R(_yP%&wklV^mQqJ)(RK`rzzX80j8Z zn3*5#-J%}RJo3!H{ME2ZJPChOCRtxb9PgM9JZvg}niCe2=({Q^UrUUDpOu!nhOoo; z(@L>TEY1Kmv|quS3yU{Ao>oRvUoauB*<1p5$pNvY{+*SiJqr_9QDVJ-&&@xDpz>%LY{3}~~)o2qD6JNRwcCj_LvF64R($>(`zjN7mzu45* zzJ217e?ku2YMZ+f=F}(t+

`ZD^QfB$-ZUlzaW?hRQ_XHEI6SN`oQ{8;4Oy!^%Z zzRzsy==52B+D-atJ^$7E>71XQ>Y9?;Q(4KHa{WWS*w_%@toBa0XrK%BzSbu?fHjG! z6dCn(nf?B?F!;(&8NF*ckd}G++QZ3(I-A1_YitH5@R0)3a+d)7ltV3BzXs3jb9^iEt9}d*JHZF7 zn0ZA1xv=REzH%D&?i@*WPqzXL3|wsV%TC{Oo`K@=NdLkeM}OXeh+F5eLDU7gYNTqb zBL9xlk#PD$juva=aZPIdc_oL8w8t$U6k0w}a=`e8PBOqfZEWJfNw5}Um3ecGg)&BV z1g(fOdoY9J2@NkePVFdp)uNpM2N0fkc}B;S%iGcl!Q!3i^4owfwOZS0_}gj%sxsjwPSF)KIL-3MWf+ z5hXqH<)zhy269r2ID6PXR#uyART&R1JA8f_-MzT=iEoI7B?LW9{Y0j17ei%pp*&ncswf=&69n=pljVY0;CDzyd zVN8K0>vx|smD3<}$^RuRf0V$`{lldV7HR_Ro!u9>%2*{zZnfo$nRO{o+q;4q8-Bkrci^)q0bU@oa%2P!S-?cy!Ss9yS5vI0xj@9EIAB*D8x%zf zy`@lsa6cuOk+F|<~DQqh2zBZ9HU5cV{lA(JNPUUO$i&(@SFR&=N;r zN_76INRq0Va7v|EbtOARu&#=&%*p|}X5DR%v1MJig&XZqW!My~$Vz{Zg==BhdY!xi_b zg_~aRkj{v%;^CvOyC$LJ8u5%#eDlR#Ni~r2`645apibR19p|T%9sBK1#7#`2FqL-J zwjD<6tbupg8e6u7Rl1>DP~-C6X+od!LQqIlvC{z^s_@xC`=AwjBCFB+Z{W+OcKXnX z!_d>9`&$Yj1JQzQye1u07*lC%3%M0l+Ww>$oAUb|c1p3*%XoIg|h1R*^4|XrJIO z0LqY=(#AHleV4$zt^_a&C{TcRj*c}ZyDuDTW1nLe8*|CH{*H_miixuoU!mfpM2(&M@=cue39BEedNBfVRxkS=yy=2xMY zl^{VOUsSGtgcy4(0VUq{ge*0COcwt!egFl^VVEWZhA3YktED5d*BGydyYoo3Z6V~C zz<93S{83jEeqJBW4)WV@L)oY0lf<9IDH?6Y1l z@OJ&1Zh?c!XF`za&q?muvEEmY#Gn;txe1voFp-ic4L7h}cJOw#atX^~?dqKU^uA*Q zT)mk%y@FANsuNKWOwtD(JJtIEDbq7Th`XU+I@57uBeIv$RdUgcEdmq&-%Ui>0Yrn%zW13y$QO%mTs1@)Hds z!ePsd>Wb2XD!r{baWzDSg(35MdOwA%8Uo zyo;c&T^X<9SJ}+EE07AvJ&64TBgufIg`e#mz&;6MutZ2y(nI4HSq$z+=I4WLOGHv7 zY1xc3$wARmWGc9ZeC%ID<_6taQ3|dvZWZaCztUXr2jatwvWXq*O zqop&k6WTWy4;?RFnKEB`@o%NINeczl*-3)d z^q@B7Y~u2fUj(+8irOpGj(l1VqMLq{(Cg{{N} zJT?oVUrj3Pf^ZO5Xangh7Reh5Z|qFXz^b{wAKEH`Ag{NEEMgB^y1+PeWJ8VDysD#K zXV5eJa$#wml#+)&xm+fW&y{iK<}+hpfd{$AvlKop!2`XXf!pFWyBzrufrkjM9{5<>w(ELi1G!GO(@olDg37#vb% z`3YaQ&$4*yP%U$cT9VT8bHj;JmVb)-;UI`iTl5uOTENye6sOC2(Uh=>=*dF@h8vLE z)L;2Qc7Kj;it|y4+_nhtfZ|9>^UADlq2Z2FBRibaFTkqQnoaX?p2gL|baTC4at>lfYNOx1>6!I$j!VVH3=>GfBR z{Kbqy^I%uRC5k-$XE_)Z9zvOois4iK{|2yrtYzqaM6w_3Ck> zcR&MSqBwbh=p$>;3k7pe1wWFo2e3W$k!c9iM@5KC03S}UFvKZ`4Ns0xpZYU zwRWhi;q%Xlif0o0i`vVJH9f`_Icvu-E(mw{OOL_WZ5+IH3dFD?gxGmobf)kZG`e7ho-Zo0olMXD>d=YTN?jzxZJwItkW zEpeO-qYsfsqDT>tl1nNXag-{ERT6o~p5Ks)J8%Ps7!Rr+O(HVy@cmYVjoX}`55lL4#mn!1XvRfTL`*b1Gv|3MDI51L+)M?jFh zKB~o)Qvprb+1PNWl)OkqDhcNuj6Fk2%w>j74_Wj>*9SX#a9==mp0%5ng@+xa!A6cy zqe7zDgkThtk$W$_TI4#lBo(4FpPQy&6wou8PW{@#Fwk86!_`CPs31E5l*(J4wa-V4 z)r*jsS88k@$oVC=RCR76lJAMuzftP`KOZWCp!nG zegQT=Wcf&N0y){n3OX@xXKQM^c-u$>NTTMWvj+0A{%GlM8GmT393U*+YK75s%Szi5 zH1VAe!c}0-NF&B|YiuC>twDOhpik%m5_be>g_ZRkVq@YpT#GWSTuBv+0`dJ@yn6dG z^W*UTCTBIsd?iv zhAcE5eI^B^TMAQ_^bn2)H?kvEZOh^}>8N85<&GMjpyJOl>H&~BK*M03W2|DTKN71! z3Wa1Z_1TSlY`k_FfcAWkcvx@(62oU6&I40)($}p$k zc55@jP`GG@EiLu7r8$wlQ6k-8%*WFaw9aq7IS&M0(`dYg_uFx#p*C3EPe@%5MB{5E zTLxRFul_DNo2}@e=!tUPj(w0MQ<{OSj$F+u&5(v9l)_8D;q3TIPYf2!*_>y{>833j zKFgrgX1$3wA6%v|1i@Nefs)ad1h<7)jGxZUCj}*ywK;2lKIfe#5o|dw>-|{kPi&-G zVcl`GkurmW;h9aSy&cLYZS_NiD&`XPTsadpq@_k@OWx~gpz0bB3dseuvWA%MEs8Zp zHY62PSPwW$$P+ zad>f}vm4VN_m|g03%B__J;t>@we}$)n1~=AmZ^)_S*2(dV?V}nnh_pC1K!B)C+J0) zDT7h;EleD914O8_k;$$?pw@jxXs8ySF@E^l7 z$o+a%S}_!Nej`bx#JJs2vg@($T|FATwVu+Jjwa0@JOL z%y5tb&RPn81o~OEf>5;cWF!{E2qpj;E;V7KV6ofy;s)uX{p1j+6(Uk(MvwJuz{CeS z!Psh``w@@x+Tw|6NQ;pyWLl8aa3m<`>bA2CH;l5?x%UWp~XowS2FUe*`Oa>_$akM__l*8y$MM~B+} zD$b>#wb)g=ztAWUiS$^l&jllA_WD>ackqeN0laOCy%e#{-@|+sC5(ZR9LTWIY)N); za)M(E_*u5JEcVBDQR%gJI7_^DgJDTtpb}!V`j1>LQk7?8AC-`5C4Bmg!`ohx8q3sS zI$5Q+Z2X=HC(>-3P#?M?bs;;9D@Ra_GMB5T&1?xJQ%^<`RAl*O9Z0?MXrAS5J&?A1 zx|V)y^5`cR_o?GbVrDAaHryI{eRq8|CwQQq5b3HgYr)U*c?z$FN-E$ZH*>FbyTECtxO6#gs|Uj;~@AjyA~{n)`n1eoog_JNmQK_X#Z2XmeVJN|eQ#nxy8* z_cMk|vsgkwXjf2%kp3r22Zx+5^lmdRyXVsoDB2u<$^^y0*3$E;d234_XrZ5&Q`2}# z`?OxCcAw$H7?o-mK{`lVA97rL#O4Jpa-&Z$Xg3j#NC*D28de>XuO~{gkYUlgpuOaA zsy8|MqjElzIbc5k6%}x?kyZd?yh4trYJ%d7Cy7mx`)tSJE@LCKWWf-s+m6~g*wF}h z^3+nLWkJoZ>dCxoA!?fHFajoz=s`h+-*;=&lfg&Zwzhlr;JUz}1H&xBqh~h7N0t&6 zB%u!fG!02M{gGLha6RlMUUUgnKqL^pPE4k=euf*mW5QlXp`XrAs;`4DLpGsn*}D%- znSu*Gzvjek!v#||teCJGwKIGUIgs_-7%_1hm@?9B5w6|Ucvwbs;ZUYK8b7s}h4h^U zlIeD&NUaxckd>YN`pHo_^re``Ml=XE4DQY{FSP*y&0fwOG(k#g&NHx<%4Z{Ei5hL# z$f(ECD;28uLY0rCqUdZFauG0yo~TgBlLcywOB_RDi_&_39XOXPdB|)d)Nqz~DwK#8;xFFQ=Fv=qKF}?R4 zSu~7gdzLOm#WYisO}3!EE7JWO&}zyi3g~tI;9SkKnyCl?vLlOGB?I^E*hz0HvliNZ zKC74!!RexlKia5?Kw9WDCV1tVg61Zv*)PBwc8!VAPTLf%+Nfj1TnvpV z&EJ78H2auHqS&etL2KOOmat2GIdKo?3MQZRIm4oYf+9u47v3Ky%D&@s=UI8a;d7&8 zC6vh5qD%8TAZt5?FpSk`fl17`C>e+E_&_#EjHH}v2vD}qG?YdFP|h5EMZpnaKAtwt z6R`oJtD%y^cwqC|gnQTEL$;B|m<&*jU#+=>;JJUSEw9TCOS^T!3P$@aUY_9u2qiy@ zA~casH$EElq%D8^0zP^Xoy7=r15SVI&Nw{qreg)|HKZdIL?lqaILe77pXa=D{8@2$ za7pR9c&*vk%;r>bra~h1#muz zF2hV+IaMx11RCI`p0S;o@ZhrNq79leub;!Zu?m?y_yuB&+oGP#W;O!s=W^;c z;P~R_SGRck8Gd4?-Sev$hae@L=8|`5;L!bE``aF0RzifX8+Pj5BG|{(7~NK061ZJe z6xGpjFI4Oi8;Nd~C(HfP5wO<;j#PZb8M$36h8(`8=nsk(id_VnqhnaVZ7QarO4Ce@ ziFGeM_uIAi(IiHnEFFY@I11hSUMQ=>_9rG#yE?0k_q^}J5a2ebWYb-qZ8hsx_AuPF zxlgxow>~<-L&A~0FU@+#44LQ8Y&oKE;Z#)81A%fS@T1qZ z6EDqVr+3B^mYmFnyVjyS z@BtMu_|O6%h>L`S>D0bB4d#&uH?Tc8XZB?EmAN)FVt1`+E_GYl|A6K$WM2HCP0Z=k zFo9XBxTTI^LkGcVS>1>}907$dCMV>rqSgum#y)! zL*2@y2e`O$0O)qu_w-SDN))e{F}+DRBouEPhPX4 z0TEoJ?n($PGvatYu;wZ&{SQBId;=&m9>|%MQo1dyGK4O+YL;@>U(om2NOn4?*Zo2D zFvCv2$~r@;7&gh{e#|L&J8CaoS@S4n7umdZZKXPcFlQV@n$cxUtNOZImAWID)Qm(4 zC;iIYU0%d+T9AcT&8tH$tc{`{ox}%Sn@R51)JLBm`vP}$_i;}%WNp&v)KKsL9PGsM zO-({8(goJCIwP~rb~}P-$!k#7(}1!lP^Aq7iAHGav5UxE&j!%Nj)W|?g-*2wpG^iN zM4oqx)bhH{7bv4^mY#|CJp6K$Eg->6IYRon>Ew>zWU3mhu(4`&rLpBUf=u)vrh~%S zoVrGT=y)8|M?2iC=)C! zFsY6yiy*$Dh^ZZY3C@HnguIFFwY}uK*XxAOX~drE)`}3-bES60)(7qLnZ=L@W<1jj zRMT#1VNV2*k@sjV0fV2UVuQ6_JDaso)aJ~UuOX>QfMAonTG79TX#Q>|^+NIlBAsKv z?5BoLVPVgQMf?NvzWtpnS$@gN`REZ|fKaGOP^y*h(0@B@t{RUyElgl@V#Uf0vhKCN zl+QZW*!-Zq5KNz^W^s>1<&fV}!Dic-lqb6|9m1Msy^liTW1I!tMXu+PH)?5puXlUl z&l;qVtHUK^UpMLg*7gCNo?H2^53bpcczu|C)sj2x737J^vp0W|pja!CjnS29W@DST zqzjS6JVNj;Gt=eLw4ejVdqK^~s{Sj}7?|@w8G|$;~8JFyC%~^2_Y1l9m$` zABFN1gE@RVUev?h%xMc<*2S0L3t(hfw0`dSQ&NCyZc|Q4xMSlttJXNjrbs$kZx7Y6h(Kcomi?$ zH^`@}!`EQm(x`*#OQ>|9A4y2n>P}7fePSUQ4-Rkbo&(kGCo1J&cGcg^=RH%&4`@6a zMOvQ@(+)AM%+fI76F3O?rdy4&TXp?QQO5})JX86v;C;U|M%0#yF6z5_jnLKCy$B(0 z5owPOw$egfaS~k4{Gp$EhdZJXceHas*GCwFsOx-!WhVjdbr_7O@rpoXY;}-?pHg9$ zm)4>Bco0Dm5Ox`6TOx+b;)dv(NAaR}*8PV>BNWZWZ(VYzIO^aWr0uQ)YV`u{srD0) z7THgaflZJ`T|84~xuSx}rtOZoW<{)|DKVBFDu4c9ZNH{Cx0alL`8b(5P2ndTT}cdc zaUr9hzr`O5`UD91u!zUS^z??Gj)!0TiXmfYRs?-7(1=LuI84-!j}UlHw#2$%nhoHvho^D3 zx5^X1fkA}v-4s!$?DbRc+~bjJpAFEUY*|8E=o;0`Ak)7vvG#eF#&W>eyJa|j?;7vd zuw+(K3zd~<^M{Yd84#C)Eg(M9J~08Gm2b`!5cenI^Ra_xpOISfg6XuKWF4evZ62G-OmCL5$5@DTMvW;E+ApM` zlujFFHrE;GwE-&?w{ESv3p(a*_?lEwR6JNL_0>3$2KxkUNEt`>yf%Zv> zQ3DL`*Ts+M){zvmoT=NNsYznZubegSAlhH6-X+OnU8|tt@%@?+RO?0}wc9gvK9g$< zsN-54M_i^qEBAHc)tNc7{l}Pfl=~y&gReeGI@rj@_HXaUFSZ@7-0rRkSY!uwP!l`l zQ|)_?mXLF2T6>s;mCGz(iZiAYz;9%x_doA`$SqWWuNrQzaC5733Gw+2p%&yj%Qsp2;b0l7Ks`$UoW-j6A zYj{?)8+*(OFNF@4Jv&hx8CM+8Z-=E=Qy5KL+C*(@8v!zAd&lvP_nQ{}iFln)QUD?4 zZ&nrA4mYI8rp-0DLVXl79IJI~=CYmZJjhfr7i3BNl)A)xf7H8D1$cFm87^^wriWxa z;2~V7Js^+9X1~b)XCbUx@sDw`B#513>vAp>iPB8;bTSMrI_Es?m_>3KP)L}RRuqvM z-_^Spp&lESveM?TyEPbJFPw8xC8{fW3m-IAuhEirE@(uw|NIbi5KTttS_h^~?=(Q$ zpd!ZpR1KVb8}`fHsgh{Jm5%kPZ_c4irit5WjD*AL{*_-d_O!Y?~ z2EaBWN7??~XqwDJ2P7=0Ov0jKb-ig63Csv%hc^9{vWN^%#LaB%+M`X5I27zi*^h&; zI}wLSOMRem+=a8?D;!Hg*d5dSESn2Do|x$U=qBmy?B*(c3ixyAEoYZU0@{HZg_=8K zpZ>_~Y>1|hQ{b3#1V$^$aHICH z5ez4hIz?z_a>lvMO+Ms}6W6Z?%KL5RBcXN;B7{KPOXy%?556`fOltWDC8?Q>q}q|+ zD?|-qDZ!2Y?Ra+Yyz1~)7_eON3K1edF5qRvXH4H*$a3BXOxZj4&B5+iqbWWAoPi7W zUBvrVB`8B>_HtgyILR^RMKa%d`sS!l-}M@YpCu|v&hj3R#F)mYBDo(k74ahUQqp}v0 z4y12iCSPq2E95{Ck2m`Ik#_lC75P!vKDOIzyn&YDP-NtnLI#LB9NyAnem#&x?)ssi zCUbQv>CfSxIa86lMkZ^M1J@2fo%Ei0B3?gAQ(P@6s=Q;89#%Z8a;C;|)wvdp2sn^- zc;7#O`7tMR_jN@^9M~@UhFPhIg!8eg<_(!Dx4DL4YFtn`0VVVv$ITC+ekCYC=1s%Z zXps0>G;w_qTI*qR#7v}=xXqs&yU7Kc!v}kp=cMSwSz2z8O(GQdHki=}J#p2vMkL1x zS7Jfvht!!Pz|(oETV6czA!kP-OD1hSeZ%=$YP43tnYU1zS)m=Zgk9=Jzxps- z6vT|qG->-kFDZVv>3$rD%aiF7teZ=6JHEa6hX6>3p|Nf9x_=1YEQ!akOf8}HF3U6t z`aZb<8q!}kWpf9LUyjxnpa^TI{wg&EwOA+}hxdP~w@&^9@0638`h&p8J;Y3>CECa= zY$`ie*BvwPQju;n6CxCT4ze>yr56cPs{DbWihgpoh;Tt~( z^@|Zi@5MH*lWkI63+C*rm$>5^d%>#*XO#zOTs8!Op|-9VW&jw^+bufRUNck;}IIuJ7id@xWU#Go!yV7GesTlD^GM zG$J|9Bz<8aNQ(THZaCx~0KFvtpz9v}ld<30N`m(DT}&h?m#OFCNyAf+uuRfPN@ zS7g-oBbRNHvGoj@XhB7u1KSj5-)j%fhCzGZLc+`=tuf8|Ed1u!$rEL+?H2v)qYK<% z!0s8_cKWcsZS2R*wjSz~}AzI}TjIa+cP+x5knPNe$4Ud_$>zVfXGX&x~)-eZq{BW~1 zaJSHe+$>NvYU5-6w%4@V9Q#IuKu7V=xW^xrLokd4R%dnoey1+vmoffsDA+$;QR07V z?2A|lPDd@dQKaYno-w;klY4-88SGDvCST;^jRn@|%|@ZQh?0Z^=d!yqkcK=a8)>*g zKpOW*CY}~7qN6WGt8#7%Fk>es7`)kzqATm)DKYL*x!%Y3|KYuxJinAqvCeiF77nM; zvMk_7k(0GbQ?yNHkMfk+1gs&lQ>McqZkF?ik2Xr!j|4On);{9nwM(|@luIbyZdpF< z!vRqtJaa?li}CZ27bRCk*ysjjI1M}1ZlRV6ErzlUNVce9kX4EJS}S-k4MqwdG>dhi zgG|0J({W4%H3wSzpDb>m$L_)l1BfeMF$jV9kNfPecz#V~;O;wepj zos#}BzM1<%ET<#nG4W$9Ekc=jMF-0^HXLBvephiX-uX&M-8B7J2%}Df4y$9foz7fk z@yqO0DkQg1)F6@rZcySbOdqm0`U~+Ha%4Rok%m*ThChozYpXYA881MXz>e-+sZH87e0z6|l8`IvQH{VbDb=XH`U2=N zsAaLSyIa@FY#I}sP?(K!&8XDnbDrLt_BX;WDRN~yeGy7vm+9hJq4nMUWyTz3G0e7S z_e`q65lp9}|1Bn53G~_$jHarDG5LG-V`}`+77}A`OWV_m|89F#>4BeVp z3C{#%HX+G$cwZqq(Zma2rC!H3Q0MN7xM?xVwcd53-4D z>|WCi;e7M%%xyQ*qZz;4*|p&NdY#p;@4>`h@bfo`WzezH!;EEYV8)Q%M9+P9sDMI5;tRlbmFDEBgdg51AbPr|D(}C zy*W-)rct^_j^XrUMu=cOW8v7+-X1k%!qklu=zN+<{|5Kfq9v7a3-L*Kpo9rD#4d1_ zod9P%dY+t@ABcMhKY2@|M-YW8s$L<7V4E2V+8T2-U5IYBzZ3G-*1j~(v}#f4*Fu!K z@yw`oxR15+FTQP&y+(Y0C}gOj51NY@8^(}RP(W(;!t$U5*_t{q@O01u@3v>;aPr+N zT~yC*f=7mfu4&P+PLqBrqb<0Xf!W93_3?SH9hneblC9yQZ_lJ^;b=> zrV2z&59WLODMK9IUB#jv(=Y^+N;2Eazb%Ai1JV)#W7V4DIXzF9Z^V?tBQDbW0P+#s z>DjkR^wKWlpBYAa5)1GK#IolI^H$0!E`}q?Js>G|Sk@>45B8#)gcCX;5)TifkMu`Z zXI#i#8qlZD3q3P?LZ*enPPUwys88%i!M9Hms373`(Gprgv0Q6_yEj}sDW0exa9Qu>beP#o@h;xIc#OC8e z;nu~mgDs3_XDjErF$Oc(P(FHN%-@$`Ub`S|;N3@$&S#pY0$Wzzn1R^O+9O?Iz6AFO z@JQ~UZJJC{8)amTcH^q~wfsS`-%q)IZ^7)RVzwer7AL|lB2{)tbqv~J-b1k{=r6_{ zxoR{On`T{L@o2v;*KSmar`4K~{yG1QePU;sPTX%I=8B`%pheujGN#t{0^y;ZhMZ_tU>TrePRHL}l_QR=b{q|8#mzp|n!_ zQA?i}^FCr{Jdx_x)6JF1(4Tzwx!wq1fjD#jUukUz(7hO6{-A2aJ2WWuH!6d*81}fe zxh$$-NbM@j)&L?7uR7JrT%hZ%8K1q5?+d+wKfw|^DOT1n??y^mcGU;$1{EDI4dD*w z3d8s!RU+Aa$C$2PV^4h!`^vkfTp(7G@bLAvA|Eh0xG)Xzd3+}mX_UN0n>3GpHFJ-j ztpK#zv-qf6Y<$*KAElMzY_H+j0sCPB(BCL5n&)b&hszm;I~9N7H7x2AQLyY6zf1(( zIBJQ5>lo*vQ`pa~M-Pvzi4BbrP-D=XI7uZ^<>cA0=hb5pxTKs9`t9l?)`*mCEUC;bMk4bcA!C{5&+9G*wuK?uS)?muHqV`eMsRC zW>j7_KKCyqcn28<1AC{69$H^Ft{I+W1S6T_!#Nj-R)qywBAwlxrl-tMG|8Gh^wDjuu5w-IVpgJS^Xi`Ft&8 z+IkY8C2j%oGPvIK#WfZvx+^?e4=m^=g7Wx0FuD}yLa*Acz4z&jW%X$|W#+m639{*Q;^gdfM)+&#`dpFj~T)0h`a zFH?8qROQmkcsJQ;XtdP_C;@=h#Z@{Gpve3ZfPOE&6w zfTyG#(MJ%Iiztn-RWqU;M#Nt;I;hs!1^t3ZAqY3y7S;2vgf(X~wdzZI6galgko@#2l z%Xw>+eSYC}MWuw8Rarn_qbN-T(;y&kAzhrfp8Jh3EU{|+sb6Gj-|>Dg&23WDGi81| zd4UsA;I&a)%`A$hUecxK9jds6=I`VjtgXjLrCD?GF~J`UGcLVDHaj;gEvDG(PkoGD z068oZTE7U_CW?$@k;yT@zH8yI5*ars{nfPJzZ!oj&m5SE!0_li0(j)?`7><4bluB@ z=G|?AGPpO$P>>gWn2tbSfSuI)b7bEr3*~8VMUxNZ=(L?SsZBZWif%4qjYt`Nk?V?B z8G$@%3cOxWHU@Enu)g_Djx7uTr1=mcFTB=vTOrDgPx-9$qu`K%y71(ceTJ0VQ}j0O z5?)KanyZ_tO3gJ32Q(h}{YT6`gpqp)GoQQ8$quH_`TRCMw`m(WTh12+>qzp+xHhW7 zLxuRnCDhZ8dC1N?t%hUe$!mFrvf!7zi?k0~C#<};!QEXc(KA(2;$iG+Y{HeWthGm5 zq^t+&I`EGeKVb0Z@8=Q=AE2HPMeCuYDxvloM-Mr*dToFg9Pbv=S_OtwaAX}mv&kVB ziCyXNn`89F3@6oBQA8Ct*f&Qt0a5E4+qDQmWfQe9ihE?}epJJhMlMlc*+n9#Z-nA% zeoAf1r<(>Oj7ACc_fJ#8$vWQUZ0KRi27xgs{^aA2aG0^x#w$NxxORmhJ!lgqL92yW z%=|vaH)k*$fuzJJl3}~Qg3WLb3(ZO;7KD7CX#xRy4%7srYsEkb$4t6inSL!Re3G4V zEGQ!$@||8wM~WiprC=kbvTGyH@SUtW#(tfqiW1HX59NojHz=U>$6Lk4xW-wlE%c z7K+%B*}DdxB1UM!uDmjAEtmeSD~?e?M0Abc3_nZPB0Pkk*!XCIH5%BdEOG~zVxdz5 zWO$krxDZyR|1NuuazWw2T!BYXJHFrsp~cmJlhFiBs8MIEtcV`L(XWU$Q3iNfqY`v& zT9eo+N5Kgd-qB4a5N*oBvwBCQfvopInwksBo7{6k*n6_Vg%OHNK(@)O$W$jO$&BQG zjCna9sR;#VEf&j>+=3=_Ii&YfZ3GG%NJ429BoPUMe9mfB57tk?;v9i%T(h6&*LrC&D; z6T>+H?*^B?m^EKssU*u-m+WC$J z$)UY{?Y1he_~@AuiEv(T@`1VD%y6-hDvzHFu?%X4<7M#-Vhk>$@^B8Er!dd?Tx^Fg z{B17ms-dr@ixB(9=OE}ZTtk|SWTS#RTq(X*A;_E~Qnk1Vd+FnUHhMK(EWE$Fa4mQJ zF`#(9?hsFSm39N=!lz6SOJ>kFUMJ}&;7dDql{EWE2yEn_g6gI)IfS$ma{47iqxCo# z!beQT@+@Xk(gDhYU@NpHm2E7#z1m`GhD<2W4Uc(K|HP@%u6hPDs<}<$GZwQ&ea_qh z^K-K4q)Kd|!vj^NzNl39_>^zbe4$DR+J=8!%jNizTU3jx6Jx1hSMi3>I9dLTvOdn8 zWUNYQP+CxNW61i$%aZ%dA6nv%*X%*1irA0gP4n3Hj?Btx!cPOF-_)*K!fK<+h7 zX(;YE;crdC#!hQexmTnO)a4j3H}DLqgp@YAinLQuO4QWK*b2fzW`TA?#T)6Um_^G+ z75%%Awgfy^NQ(8i87~cWpX^Rcd+gDh%Z%_YWtygZ!v+V-o)u*Pp19b0veK+NU}Dap$1M}r1+z%+-BDmQ9dh8hKA>jzI%g0bWUS29@o)E(c zxEDH#1pPuF%Co+hs@$aaO|w@uO5vLe7J*7jRIv{=Y$7Ja3t7q2qRISB>O@K>Y!-jmgLC%li*N4vW z$SPEG?YE0soHBsQi;?K+_`4XGw%HU->ToQZ=8AFbI$XebDs0;=f1)#p1Zo)HE(2nv8LlQ zFEkl^UW`5OPYxZ3BdzkS?uc<>G1 z6>3-4{POi5@13%9Va9 zI<9v;S8nq2?*uk%-g~s+^e2~X8K2*F^T#jWzG2aVXD^Kn8AUi;*={`xnJ{%!74 zwHt2izwSlbok#C%_4?A)PtSU{=FOf`V|&+YbN9G!vKE}}{lnypXRn{%@WA;CCkt#Z zcl}2-XRQ4^(5LIH$NhQNoGLxq?`WHw z#ytAi$n-w7ullU^gerkk17BbD+b?gwR<&J+JQr_jvSCwZ)hDk#viZcYzs9y5x$N4e zqh1+4CI3Am%WQggONqzUlo?VjazmA`JLfkVj##~Le!jCkb{GAA!|%Zkb4O-)9{+ym z_#Ue}3}{??z_dW5-9k^vFZY#R`}1{2O1%E)y>GPYw!G~~Gvnv>XV&Z7sqJioR0e-tRtsYguSw-#Qpl7z0 zd|+$aQ6+CJf97=Aw|$*EOrE`A$)*FVmj?>X3-125#1GTx_q59&ir2`02{xBMbI?bI^l7ZfHGt?^|uVw5yP|ZSl!T zwSHJ!_s`G%o^!6#NAG0a+M&dxjh*sb*JIE07xy&Ge{9d@`44~7d)G6^H(b%|lk`eG zGJmOkc=BC0wElL>^iK27P4QL^&HJ?Fqy6Tr+1lZrtA4XTy7BM+(<^LUa{l2`N9H+3 zjox-=p8fX)UcGVngdu;PZ+6Z6A7`%YJ^S&(wGRE2{_u!V$1-ofc3kBWd!5_ADDz06 z=epg{<%2ShKK_0e-)&EN#<-C%X$&6CeA8Tif2rA21Xukpl*l|vdX8*|00m1|V~X3gN~ zpAF30y;7T3?B+dJcq;WB|LY4^^*K9YeE+r$wjY|-?4?%KGxn_R^2xph_b*Iq``+nx z#fPq)vTI-8Bl%}|A1ogpf4srgm-DRt^6T$+7FucU-!=Z-A1gL{W5&m4ZW?&y=21<{ z9xv4L-Lm=X9{haZmu+j!vfXs@#v6M4-ekh(Q_{|@Irl@0FJ37*?VbgnENj-Jb&;zJ z4fy?o-$Tz$o!9m6Dft#0TAk0#Xf*nYvQytI=dJKj-YZ6I@6|Efch;`Hs~Xh)w8Qh| z#@%w&q%W4#yyB6<4^Q)6yYZ`Cd~{^8CCYk%s+J z#QC54obPs`^t5A}E6?BlPKQeSrxiW+t^dpA`Rq+Ro|~RrwdmHDkJ;DVxTWvP`|5ts zuaRW?dwAOPy&G#BDY9(0dCynx6#HP_s-q8FQ|98F&H z-wr0orkt;vEj|5 zqa739b1&$6W?H*vE3|J^=D|?SgC)o8+jRZzqYpnYdBKI*?_HVyk2$}(w;o;gG5o3*erewMf$J-M zQ+idwrJvN?_vGaAN9$yHj}1?Mqh!k-e~gLPwXe*x^y}@Do_gYg zH%CtB*fXPY%V&m-9+K~L=bz`$ZHLLzO=hfY_yDja1{?77O6&cs) z!5_x{@%Jl(3v?Ly^J<&-#lO3>829|{LXSK#o=2s+J-2CY_a+@GH2TKbGxMQ=H&_33 z*)}2aQ`zBzejC((}w&!wsMBv25}mTd(;#-**Q-xPATk zQu&VMuk(v{TGk7PrZm21(dYhmy1GVGzu|q`lS^Nye{$6R;qP@XeQ%-S1IP3*e*M1a z$TnqG++6>s{2eN++tQ@pCq=e5Z$9=y-CpV2>Ye$l`AZMoTyAvUy|;dF-z$&rE!_C7 z-YpjNc{%j*?Y&0qx~b*f`|9o5^~MWk@xLon`?bk)lc&C(@m~3RL$5fBhKo0A`P~n* z@-$!bZlC9WE3z?T;f7*Qk8QfkeP@|YPxyoFeeLd#tgC;f_1^K$sm+>ZL(9VzM32NX7JFKmFO| z#Ndn-vsQhwYS>F>&a6MUvRAo*{h#~2R@IlPfA`g+?)&@O>e{MKxWA6EzEA7hZ+w6D zkF_RltCRn%(emLQ&mHf#{=Odhx-7b7Oy>tH-<-!^%J<#5J68Yo{givQWVHOX?6?Q~ zO@2Jx{LhK~i@RPs{lemxJ}Nk9W1!X_v(x?ODjz$!v%oh+tK?aCXVdgeJ2Sj59&nAn zr^%A?H+XN|y69BP689aN6`Xm0qj!fEsquxGtb<+3`%NKBkT-S!5-?Zb|y+aS( zV{5Rr`kI5cy)z(x@rNG2>C7iT-hS}a9p2OCuCp0sKU&)HZaQ+R%Ug9z zy-_@Gi3{I%Kk-b1;KSd%x3%uXO^^SuxWxD_HP#nQJ2rC2{bT;Fa(kzB=RWJ&qOted zum29GEv)@W!xt7j@89&;)B^Y4_05@WCC+&6^k!YxzS~pB2dx?3YSrov1u71$ZtHvM zr{24k-`~Ajmz}nG$6q@8Zl3W)KYV1=>E&fN2No}TYhY%(2XDz!a_9No)n=CqJ9kaK zrF^&3+k2h=I_sr3cW1s{tZ~PVO)`6L-!<&{tkYYsJhN@sZ+|{>)8;DI%`Mqw`5*VU z$(HKEa}7q0x^yBp?s(w=j+KKO2-kA`2n zc+RqK+tpfh;rAQb4i2o@aj|OuznAM=zRZZ z$o}v%7n+qSaBRcO8twP?tks}f_lJD9zfro*ar54cR#SiJ{MR?C{7NJD*$f*q{#nXO3NUY|Izirv7S7IoIb{zY2N(u0Jn*@hF{-1_>*C~3vF)mP7(91@9)|9^@@7m-Zk*sKf;5b`}COuCx+No za?M;b?$Py6-rQ`-@%zU{`p$gh=7&GN@ImEY+m@MqyzQsn@ek##IJRWx)-S(2a_7KB zwH6M4s=$%V2MQM3d*dB%|LR(?e|z%+{m+Dcch!8Y*y0+mt=dyz!gX^p4lVs<(9^4r z{xHB>z=^f13qas^T9$zx^{FH z*c1Arq0!UbB+nPlvF`hyc++@g@w7#uU8i<+C|alFl5Jb7&%b--i$HD^!(Q~8@u(1 z;qNsvoYRi{bj^`B4iv69;o_*#6IU!7GP}dor5_*i`6maL&VA$ae4VPVYCC?$(|gG^EjT|)2UTBbmz5an%DTO zV)^SwOg5$ssduPbL-#kIJon9z4-WlS{=hZs8|Q7*~8?mK}?W#QuhkdbO zPt{^QdmjG1afe$+?!Ir|>4!hvUAXulx7!D(MTp+o4ae;pR|}pIR=O zwf?%}Z94jTe>ZRQ9g7Fmyshf!m36nfzRqipJZ|sx`*kB*)jKgGZSBq$O$-0gF3+iF z3;ka2@BPQVYch9T-hy2Qy|{Z^kA90^pOaN*#qJ?97Y`hLa((4Oj=Gm3XSaZ=Pk ztQ+2bO!s^L?&*7B_qjbEg-hQ&b>!VG>h)jHq2}&gPr0tjT>9iEO=k@6{MLo6@Fb$Y z9&NsE*=sLs8PR&o#z)$&KKJm$3rqhRDA~WBuj=LBAf6z0kwoX2|cZ9`}4WxmDBsv!?`}zAkU^nzMKz=KP9c^?tlE^Yn&` zoz9rQojF?KjdN!&ytL-zhAwr^`FY!5-hGb_nRClSWh&-de){HZWsj98b70-n!{01h z^l7~V!AjGs4Xo1grsvvwO1BTKeX?6K=j|;{{kUY$O>f`r**mHHkJr6)tod!H)^DhO z>g}l=`gcBlp^nxp zF1o>U&bfHg&ENV@?Actd(#xkG-Zc8>5~u6^*zVB!iQkm?xc1N~8=LQ{c)#PNJ*A1!{e<=wmA?%849)Xa4L3ljGS8P%9-QtDm|yk>WM4Omn!x;-+tlAhr{#M{8izH7#T0Ux*e`sPQwwB7XD zG2=x3n{PO5Kj3wg9s9?VEgu}aXYA;W4~1Ut6Ri7UhNsQ%L)skv`N$nFtS)|Y>F=_x z`*z5cncH4C`s?`ZzjpsVv~%e_fe5OCDMA=G~#RJiq&!q5CZ=lXlTAO8Mtw>`9PbM24MpU&gY zxT)N?`PNjMRP)uZ&n~aB?ziGS%4}}DywoFK_+}RQ%y^>P>MxGAez8=(!sVJC^0nLa z)yt25@Zyg9y(ixL@Qz0FudVz*&)%7bS8U3^<>N7>2R9y@|F3&SJWV9S1GV;cd+}G} zW#64g&UQZ6so}#PzC3Tx?0)+P-1F|#n#G1Mx%jAW+_Z0>KJj+rIZf}svB{~XyG*4rEEgzp*~JYKock!ELBZ+X2{hU=%dCRMIq zc%{8d`&Bb;7?81k(cp8>ZV%oNJZV30s9BwR^R2LdSGfC6E$f#ZzIocrJB#!@llP1A zS9M!|Y~JAKZfte_%>ox**_pq@&jSkt!|s`Ht=clU`WIi$dFZyW*B@>3eR$(jb&ihz zd1m!H?N2oMd)bm{VfUkhdsjVD-?wmO%Wsc9c4v=Y>eQL= z>VS58_l~*Fnf6=YuYMyk>dbvK^yypEN9S#QuGaI7{k_XLx6Hcu)qQslID5`Da`)^R zvXNt{R?k+x5le2mR`Mc-=s%R4F7z? z#hZS(_q9@eS2wAD{e?0gS6bw3_W0Gy%N^^}wc(b%xBR^|;6K}BUxj&1p1$wfiUn)z z{q^d$dG@?Ce^B9XS4?j@`TgMs_fJ@`xI)#&ZNL8TlX_joG;dyd`s8E$LJUHP((MJ)vKo&=vI(Fsj|urRkS!( zfcM|25$>Q`@1+{ysw8njjqoN9*J@d-cEy&>9%&lL$OwcxXEv-{GczMBs)ReDpH{1u z7MrVTh|RS|R>W(Hh{Ftq|TL(9`U0700&z6fL+Ntq4vL@y?my^sJ0PR;Tp-X3xy@%3!4tr9YA0Kfc7bRq$CW@twV_1=|{Sdz$+9|EHX^4(qZx(p0H%^?$0QwklB_ zEALIYY>H1u|JUK8tT%A~mw%&QQ83)5rmFr=73Wq(xK)8}HHw;btcW)wdVLm@YPI%< z0*Qg~v8v>)P*okMD&PETfvE=7d$bsNc1dyz7d1=uiAxp#R%7vZHHsQj{XGgB`;(Vn zEU4^Xqp<2*1sD58O~}F?DD~g=F`fY2rE?bL2~7hX%`7%{W^c|MhpMUCv%RRE?ou=6 zd^hME&PraT&$fi|WayuqVop z(>$)|EIig(YL@14N7vP32wXiJvj1@_sY9VC=*`B_>xfd;n@w?V_HOb<*EgQRK3n#q z0crQ$S1>)*ZnB1nZD6l2N?D&RI=ashT}K$aH5;F`c+J#twMZU6tlef!?f<%;62`UL zoY4X4B=!eSbW!a#o}*Bdu-mdHX9q~NBn)o1tMC4|!R_|!q3n+6($bK9cJ0}VZMVDC z24WWWDB%+Zci8`DiZk!%_OUx+gFBqD79)F1hcBBbPP^b8cBgeJ{x{5>t|*tFlWY<= zv-h3d>5DEsf5;x(C6ATeWwE^fZE%-88$FkGIH9d8hPex#Y*E`4qmDbthI3o9|Gy4y zQ7*R8kzcY$aAzN5yJ5>-b0fAFjo9FxD47!0+~-mB$z^b!S-EsgBo6M)W*PR_d2-mY z?+k}Mn<$R#eGxxq_H~oXn9lgSDT-JOo~g(z{ni=k7{+sMEP;781MK*u3Wv;Lp+19Fr?taT0;` zOU~4Ih}cYvvWJ4{HPWINQaskyTGG(d?2~5kqIeNAkvUm?*)6hIeOcGaW&6tRxUtzU zXSSEb7VDBvoMe=fs*baF{H2wNpJO%=qTO1|JPvpDV`8rs$yKLO(75GJm|yfSm*&TM zD6SUkOKCv}Y2_Zw3{`I4E6}r7`80<$%d~PKG>oiJub|)Vx7X<$$t<51U0wN$-{!Cz zE^pB7arjI}*vTd~&0r)PafBV=P{<6V1SoGwn~J-MVf}Wm8FJYI4%0B5hTRcx_&lCS zAmH+ZLJ_AoWTXU86Tb{jen-S*hCOb((-RKbos8kNg`E+H+vno$G0aFx06MprUb30H ze34MV7v_R8y$+iz;4nPS2y_Y=rp+*2ZhtBOI?onqBw5@+kH_Znc%8^vL7yjNGi_nJ z!xy%@!ePS}iTG0iD6&Mkdy>vWc2^*57lK#?UX zoXO6OkYNwn?LlwYW}3{_Z3N6n#Aev+u29hHG5o0j)XbwCM|SQpe72zBvwH)saKIOE zgdFyu&uv3wG&~_Q9Q3CGP@P8^WRlLI2{UzhO-INZ@w&nxBjEFyLAN7p4|v^Szb6HN z+UM4ZOtQ~|PMh1|vN@d*pXmwMgF&y$iF_UMnJ%B*2nPMB02IxmvYMQE$mw?ZZ1%9t za2q}!ix}`YP1U=@=?Zv!A%7|W)p=ALO42#=GwjYlnECp`hG_=E4n-Z8!xrMM^Y}w4 z02IwHH*?c#bHGiY0&8e;j3S5wP&*KGagZVoe<}bq^QcgjF!P6cbPhgf_URll6@a>c z64&I??}~ec3>yn>4||ch!XdXe5DwU!VV5gp3;5hA0m`Qt$u?}<5O!O@Y53S$9#<&h z^(i*wahOhatv3|#njU{D0ETcT*|rHo1U+F!Fausk#0WZq2=u1Y7YarqNCGenyDfJB zhR9Y5E<;Ga;-Bt7&;c%{&1X1#K356bwFrexe<}cm zNOmX0Vc`mSJpqr0+sA2h1z8iW<)Ayj2C&;B0jJHM3ZOhz&Lk%$ZU}V+yP>)(01ITl z+D(%~8RC-g1bmKQ*q;gjERtQD@k2zsa1oyyJ4?W03z_k7IrKCYleMc2OPi*`cna@waE4K!?Po10J?a%P$Mpv+ZONy zZ6OD%;lyNPI#U8DEK&>+vKwZ=>99q7wm{HuMLdzPE69I9joUil_oM(&YmqyT^1=qg zfuK9$ak|{zpvz-=ygs`#67+>V5vSYqrvhMzY;ELn=fdYSoMDg6$>kTcVIA~EBEhiN zVMa_&Uc?#krvgxfN+J}*?I<7Jc->we@$&>-HlNcL40u8=BVhNsO!bdH6@VHd$psrX z1l-icUC71_+d@tw5<*OM*d1ZmyT=|5dHksW)X~cwi$KWDq@5vW2!>?$!A+b&(;aen z9B#uM^oIPY0KmdXBH+Yf5e&M+4rEq`FX#$H5d08eO(Sf&5qemRus;=mB2UgS4jyk;dhD)< ziQtes07E2GSK@~VAqPTw!xk_DHa1qst@f8K6buE~&0&8i1pq^2+q*7zE==smLDR#{ z?KKU!c-VwQ$OeH3g1_B{gpvY45h`~!2;+A696Wky_+aCK2rM>ei`co&(Ib%f{iy)d zrcH9O)@xETkfj8mB*RC4^V^&Vi%MK{dN5ZYD;TER=RihvN9-ISbh{J)3>{U!6PbK= z_eeb+ug&B#G=fIR12ge@!x1wa_IUzcuQTjV1px7~Eo2Gn6YHKG3JVNCCGWWMnI{iLBtTaM`?g-Xej&{iOgo0sb$Q$x`xmZ&HDB>hh+_Puz3)&;@ zfE}sEbUMQ!)4Di3ks#Iw5OUIe3INsp<@dcW$k7Ui?O|?FU(gwFV3FeiXu}9c&~n@k zy3ZY;e401gfSGJ*gQ0-oa(jYdv|PsA4r z1zbU=Ka>JM@uMU%Q>^=-!vnwO3UHt~`dl^)I9|KQ$7bbp1(T0lVKM|(g;WR2X6(M5qCxa6()$2EQHkQ2>Vk3sGXHWmCT-f7!HIu z!=c6@fm_C5x)9H7L1fM_@_Epo3V_+WFTb4(6$3WtJ9XABl7oP{s4YkJ?M4)m(KD)>3av`vzA~^i1 z0LtU~NM@~w8^htlfETp8)Mj>KAjE_ej08dvBweIwABNc!0BVe6Dsuc7NHyMw;c&qa zF(lhPC{0kz<2GH0b6DIQDF7@ylCZJ(F@hMxJcg16O)lFI+!(`)%@+&@-M)~+;YStE z6~G!J*Dc|9`XVSaY~uh-7zxzj2)ev(k2eA*#?a$R3BZykQ}yG}fH8%ASl}bX6QEy) zT>&pv+K?Nwh|-&E{!{=8jbx&F{1}mlCurE*2x=iSgo(%I3}GraL&0DK*%whT1%N^$ z_tkJCHJhkq4jYjQ4m)8C*bm@eJ{KyD&*{Qwo;!fG8cBqPI5Z4SAGTFD8wz`F1cO4z z6+|ubA!RX!!=DNO9^g%Kv&RjAT#Ug2LMfU$>}oSPB6cSxb!Gf^di<#Xpp+FGpxHd* zhVb_T)nvA~1Qxj=t1stV}W*ps4bKd zK<&UJT6H2aP8*!Sj*SUbH{kXnN8-)0!yZ^l7Siyi0#Ku*BpI$DBa9Ocp6o>X@fk+M zu!YftU4%mgB0hgA07gkB1|;H=s*{wXIDPmDOpZ*1Pzo#>zK91=$Q_Ot0b2n5R?XtS z$JM9ov0=vbdE8zu1Z3KX)9%Ll&eRZ|)hv=|BL6ZiB8+GcqDXq|X2{D{3}Bv$IGqOT zg_+)>MatdfCSV`}PlFXAqy+;wmAFE~*v1Vc0I%Jj3P2qdZxUNUBC;MQ@{AMx4x)K* z=OJcBxEI381IcQlJEj0o2j6l<=f;ElI5y27x+uaQ5&*Oaazp!Y5@M}YX2O&J4CAx{ znsXl}$fe^&ok5I6ByivjLy7bRG1eNsK){Exmpgzuk}25>%4)zF3A>SOB5uTf{tdvy zecVA|KKJ@l0dO;zPb2Zaep^kJfipf3g^sD7yctPPO+1q81Q;zYE2 zF$Tf10yqFnyBn3xXK)3;V?6GZ0BV?I)`P@-77ThY`Maz^zSxDgZ^aWR{pXZ17nUso@RcX2#Uxv*ASv311>}o@F zw5S_i0&=j@B3#;(Sqx`K*g%p-KlY~rut=5r6&A*P?hCpN6UiKpKAvzRs1A%`XiA0m zrvgx8WJhFPj#LQ3xR_L!f{CpV1GioI%g|;BXtIaxZhtBO#Z;15V&XP#7-qsk5Uqsq z&}&DxbP+3sHQmd}3YeHnQUI`Vqam!9)%I~CV=lqg$3b^;l7c~}2ZIkHzQ;ss_W4r* zC@gY6DT z4`Brk!|6{2V0E8l2SmGfqUVRO^AHh(p$V=P!XJbj#$oY9442)X3c%_<$vKI3kH^RZ zF9{Ppg{_y3?DY8{RKSPN8mqn?_dxCdR`*FR#c1~kS3Z<)9PJ_OQ_ACupljkZWgrYN zSin;NSluVtSkdm$DttzOT}2#?gL4t~z*Iu`Ba9%bv%|(+n>&Ej{pB{5KkOysiDTf! zY=pA!;6B1+ffaF5pqdLvf<9fgJlb2JaFPaA>snta>$GyUb_$+2y%xgwkl>d zUSftE^z7xbey|8h57{&6t|DD~1h6di!ag6ntm9ib>;{1{1os7%Bg2dN+3-3YF5GQO zwBd?Q1wim@cFsV#gpLWB#A8HU96?a{V{G`>Ff-#ffZ+r%2l-P0&~bKnd}7Bic?WLB zkkjGDegF@}UQRq}NCm55KE-5~0zj=^Hi;8vjM2lTWCqO0YDYV8X$QeU^=$-|T_+WQ z>NtBf5<501CEX(Ejo|Oi9YA%Qy@3)sR%Q*G>BXpz=K!ag zfmsz5&P`+ix&l#KsQ^^R*{n9PV|DTnq;Om+PZZWjSJ>tWz}J=U9Y-MMqFe!3yqJIe z-|g5N#yWsi2h*hyf$2DiiG+FLR^$q`g$y-tlHH$j!YKiKE;nI)rrUrL0b3+Y*dnqT zav&xYVq7?1(WrlP?td3!6(HwU{td4i8A{n_@HrA+h+;sHWW=p7{!i8rKPNd?c%(cI zn~4hLMph@Z9k+_pfm;n08jY*}*D=PbikZNUogjoog(wUJ6kKlM0Ln8aD+}XncKGj- z8qX1i9poYGEe^tMiI?Dz64>OnLKZQJMN?q^b&QDx4`Lj3s;kwBK@M%fZZi;`y~^`o zcd0ebzJL-jHbVsSyNSAiO|eo$t*}C<^GdFF5lMnfkt=}0C>bww+X%gJ8bm$049sw@ zkjF(#xzB@0iZUJ{7(NAn>NwdsG6iZmhIU6?bbAT7dFzV2pPW zfrQF$*mDO^q)5iSv3+wFMnZJsA~I4rE4@w*x#@75gh~4RsQ~EMNOs@gIOg1h;S-od z5%};{6O_(Ux}4Vi=1&Dc$1yiz0x1v=3=Hbn)=(pD0W2#-sRnSc68wkiV)v&4P>Yu> zdna}bcQdd?657YTi{?(o0#Oz&^q>ggmkz%-1%RS)GA8Kd>hjnfgc)FNBp?818)`c- zq6n0D@@@W90E))RwwpJM3nOI57K5se-;uw=CeRbm7KqC6`BMR?j+4&VGzl_MR_3tD zxg)~D%l1*W8bi790|d3^4xlQw^g5!=NGx<7AxS zA8#(g5WIxDlA8x{9k{(YL%3^=AZIm12&=;QKRGT4q(QtMD6@FB2(`h06m*2Sks@SJ zxjg}eaWV$*k1_THhLN2u@@Up*lovq<;Czr z=#q;de7yhURM29ofwQyv6Gh~IjIl3dBfJEg5Uvb3oR?f2E{~8KgEl6vpjQq2pI{s? zaG!Du;GM&4XZin$Kyfn(97XsA6{(Zm(Ek|Y02_&*Rs1K)LWTLxV{i>)Si)gMq(9n7 zj`{!JJ;#LJhY3eAaN$_-{shOnaIhh{p_7?5>o_Ho`~ES;Dq0W|vO$&-5^ex>6iqZ7 zBxI7oEp3F=|1WkmCpd&Lm`q=+wHT$a$YZ{6VLFe5ltQma{hyp;^h{!*Nw_pI4P$@g zb|fknM+BjJB$rvd`aiiO5WvC_%Lq7zGmTk+W(I{GS{bVl~PBB-+Tv0VZyS+;tTIP5LI`)yVh? z<76!BAFnauC07wCqDYi@*A3Js0-sQt9Wc>wKwV2o&4T}UU_xIwH;5Z#@M3kR!~hu! z2zyFdL)@}9SF+pT9}lczZw+FhDF21j0h33#CQiZ=_7WXW-h{$9nXvWG2PUY4w0kN+ z1PRi&;g>~CB)*vpY?5YO>LN~R?Ec3Che@v>nUbt~%1tT19+o1^z;F`^U<86n%8NzD z{JX~~%;n_rg%EX!3&MfxRmmO%S9)RFC~ZohjwLZC3><{LV!R=~fW%zV8f`WV)a1uU zUDGU7lcK*(h}?P}m;2l$^4tWw>*Uh=4@FhX4sQsu}OCvVtvP%6Nw?D|QW^gkY$ zi#|YL0vah4CrQXgj1{5dF69lib8RS$lgXX`cwpRAE=s}>8G)P%bH;y!DUBovl7dl| zIKX5V{1vfQRt#@0X6_qf;?ev2Tt*SF)$JbLKTS_Uc?PJbXY}Y zas{Fc;}5l4yE@smM6fv9fSVKH$Vb>1F?(*#s^CphJ5m8C-65IGLXv?^xxOPXShOA$8)!ovK?L#;DdzRiaqa+c z@1(jzs_#;Ej2Sb4Jr()h%iR}p1zg?;HUUBAbQ~eQ%U0ZXAui14uy~#iQs_?QYONm3P7zvGPy9-cPTqY3=MEU;*KHZI2^L8 zc@fP-Ts*`ifrNo$6$%nb^-nP(dBM%1J8@%ilyJJ?AcGO8DlbThb|tJNjX?Rw7_)OI zGlEkC-!w@cP9zq~P7*6k^Y3EpGl-|Md58>9vN$3RsRt3FfhqB2@jvzcrUDi&8!H*2a`W1Qy`7!Y@n0?)`=#?l8+8C~$co^;@ zQa|EbxRXh>jcZ{#F#*o%#Q_f365=7if!im(g^#!h<6FQ1*KK?YIB-G7w}1mt0P!v0 zfPNF-0uG+oMHZb8I1m#T4+9RKnEBU&QG>_#tCS_uI^w=jLJ+kf;#)WnPbQ0cMUAn{Ggk6?=hphiDb`n@dy6&I*r?}(?Z zN@+qXkME1#iG_{p+zm2B5X6()4K_5z)5-Fa9Q#W$(dArLjb zNufhTReX~|hh)z9CWVeGX5frYL80SHI8TN`2g`l@hYB6)gv2)~bO_v!YvMZ$@9_-^ z9o#GNO$r?&7;t9C!Ao5JtG;$f2hzQ`ZT^tp_5Y#$HLIEV&#-th&Cy7 za_SRAn-n@k^ThQ95GJDd28B-ILGgkPMS$ap>;)Z6cL^VY4ti63=L{Ds;#{r=IrCYe zKzA!F6$e!8BwlKci%g9%^elozJ7;#Upe~Ep<#DNvnPSR}&ONS`X7q8v5G}t&} z%F-oZyTU!@28nA{xW}&6xMqcWO#F#!R=CH+vAAZ1dn_L@u36z8%eabbR=CGA%f&S-++$lOu36z8%OtKI>6l}$D%^aMHB~bQ9ZF7?Co$=T4cQd1&Yjz`6w!o-6Yx-6?*R@DWn<25yVkY{D!D#Z8*hk$TiYi72_8Ar{Xj@cE6m7 zDL&(rqp6K97GCifoS*t=5CTuQ-U`B!St}pCO9)s@0XK-&fnqI`u+dvVn7kjo6@a7al zm{~q&)f5Mby{>ji{89WP$Mkv$Rv|1baEf=3CaI665Ecdl#W$#sslzIS1=CPGgO@Ed zShaBkmsJXA>_NCoNGNuZV+hVcLNN>c&w95YEV;d66lB`!upo>BRc~cx@?KCZ!X5K4 zT$%$2yJH62ORXR*c|RQxHmVJ#cmqlAdMgN1Lqcx_;T%hM&R|N*Bv?R)RS1hc;!y|- z1yJdiRQAw&PzVdbQ|XozMbcpv!a^Vd6z{DDs?gPKw)DQ~aCDujit zRH>7MKkKj{oKvCUQokT<2n|Ikk`y-4djJd4^Ym5_CfZhOrO_!?O=*y%d+MMdO#F=A z3c_T?>8&74(5c=E!UW>ztsqPZ7`+vQN%huSL732Cy%mJj`@Pl^LOCS!fg5=O39VIZ z%A=4-a@xQ_fYf;KA}!QhgF)KmF3`dN+*U+l@MEHkGy-mj6vqH=!q6BSKTp(?KI zpfrAv^8Vy0Aw5!_iqdqHyh{bZRC1mi%Iej#cc@qPV{xi}hu{BTt>!@FaP6c36x1Nu zn?ge5D^p;N(zrxgQdw3#?c*WX)0Gl{Eu6zslMg|CS}Md*mLHc8*%UnaK)Fd$Iw%T3 zV1Q}kg}2-R7$V0#l6(kW#`2Nk%Ih1v#(@_y%&R+IN|ixWQiI(=ieTmrpoWMoQSu?k zZVEvxGRP=lL$UygxYWj_0ylw_DpZI!({cw;L&P?D@*!~8lYtrL;R4c`iC5>f8p=8# ziw3D3N4_^3B6k2aMC@uvJ_I4cJQ2i-MX1ALqw+F!d6*XQ8dS)j)D_vWxdSjn&c&L1 z2=&TGm|~68>G$yr0O9_;^+DbY)Kb-{NhV1Fps`TeE}0gHW5#x3nMY%{RvRd z#A6b;iQkQf+EM_hA!3Xn`4GID$a_6h6QaBXn+Tc_%A#JbqmDRX{8Sf80icG6airu! zn5-;?Xo-pnkg%>Q2fIVK$neBaw2x|K{!{>Jh#2pWAL3F$o){CzQQmR^qk=CfI;s#R z#S48DKVlhqkIYn2wuY&3`x)(1q*qAhC;$Y4;+ZhJ*!A+?f{Hr&(T+M8;QrTU=3a# zWpTlBDEElRkMK&8PpC-{p#*p;01KyNr&n7}Qtrcqal@VMZ2vIt+i+)4^nvmiq^pt5 zoD#so>Hn~C{FG+rX&d6&Nf(CoP??XH-^eK8O(hDFneLPT)=0_ts*V#bII26N&Qd}z zMaA$yY~x)cCv zq#QF{Zaad?B0*lIq*Q`BK$JG13J9-)*~s|fJ%X@}l9ssxSR?&ka0>ItV~8AF7Kw0f z53#tUXF5pU4^eoMlo)Cd<_=&{FWKc3zfQI5HLlYH$Q zOpSDGo{M31sqaoGE|vXK0H{eNy)nh4`~)Am2=e5CS88k$u1*3Dmm6M~X=S zpvKBkGIGa@LVPM%p9Bi^I!#1ToYWsm7!ovWz`^~g04%&xEo+p9gjKs3fN*_-YMjLD zQvi}@{y2mYirO<)DgZTBjxwG*UJ+FTm7rnj0jS#Fa4p_WqZ9`v^m($>Ms#ut01K~V z7k4jJ1k&#hWp?k?GcyCQ9Mvy=Mu||!I#f#VdU)WKn_VRhfIn=GqA^s^LI28um*~q(%!*rMMtSLN~wtjFJ>kFf@+gvPEY(r>7+5h-?g7mG%;MqZt}z*l_s6TYZ8A_Q;$WDCgAH-3Ys^^ za-R4VlP5Ym30}@BD4Y1&V_IzDXQ-SUqU7J9c;X05jyLKj&V!f+8{el((S+MA8Qv~S z8Ks6nl6kr;os^XOq`xWE6x|`|Z=jA5Ij+z6>9BZeLcH{J>0AAG76S$K^1rhp&iEY| z|2q!^WphlY@^?$^XQy3$22mpbN=0%UomH$Y z?vCFFiF0%)94L`+`R~=PjXyp5_X>wt5f(*&#NVxhbjdN1@WX2 z<9l+<_@aMn({hVn?t5$FQf~M1zcW5+)a8F?{G1q7iNC9gI=?xlX)!;y+GFS~m+Rjh zwesX>uSq&!f&@ri<`g)qxGn2XPAw!kMZ-GR)TF)K91Lp?#2Z{5K+Pd1hf@yWv4%h; zy<88T=n$7j(;Mv}#~>=`;I(?71jOZr@LFu>QY==I9#~4;xN)}&Fwu}+Wmv1?v*zH6 zXPi0!o0&-JIIgP$C_?2t6fX(ovlc5S*Fy(jH(PVKWN_B7U^_6PEfOR6-4wqR? zSCuHAr<`DNO0uJ^A&?0!51{B^M2*Dl3#K>h+^uu3thBb}9?T3?Zr&@Po+B$KaZ`J} zeZgwg(#-DR%wU&-MC+*4Xg=rDfjGYM$)KA+?Dy3PjA{YGu%65_AJ+f=TCvF%&kPGW_knj ziN2XV!&&9Z7mRj9VETiBUS?Xk2k+%5lV8XGlEdIKD%u=nZML$&HEmJ5b(K23GctmK z?%mCvY2{jU>YSCv|7Z7|);p_n_l{{9or66xd-TXKdsa$oW%kUX=QMT|CM};MI(%iW zm9%n?m_bLaG*6TRb?p)8)hWvir1i=9LUE=z!t?{Lf;L56PeGnwi~eI*{sVM@NZO?~ z)?fXT(8fj)Z7h;#V{Jtnm#5X%JvIhBfPE6*W}y11%^2UN{;Vzzy-oR_6WStPLTe)kTDfQ9zXgt}U5Raw#ky7E;b^mbm|B~md~8~q^>AZio62q1 z;jr0j>joZ%K0no_QU|sEJW9yb+CVt5%~0KGYtH*jRFO|$bFaidgc0(hb-{*VoA~a<9ulNQdq-!7AbLD-a8d@ zAv;3Dm-=Bih7!k6HTRXHF}^=lXiVn^z*%t(@o?$^M&*#w+9=c_+Q@d&+PEfF1Wv-Y z*tB(?qo$(sH5<`ZN?b|!Ruz@d@UYRQpAXs?MEe%KQu&+{`m>WPuG3Ft-RXN08=c@K zSY4Fz65pSCPg%LZE{Crnq7Iwv6%RXEk^70`^7Mij!{B8- zeJ+$v7h~WZ7h`y==+eY7C@d%FLP0<=2K7b67?gF^&pCbrC9EfofkR5$2R5?&1dmWJ z#)xm>SMpn*QmzxmKyXrFUs{_L{G+w;M3aCcrC)E0#<3@UixEbAi{n{-ODS5tKf-&( z{5a_P`f`UV#XoUe&ZU4O) zuO)4Qx8p}r#yD*Z%P6L|DRoP0qil%Q25V9}bOIcqPGXPKCiV+vCb4&kuod?zH>fgb zB#uFVlD_8Z+R|x2fR*4mv?&9T)*n)#XtRv68k|+&Kx;FUaan7VcP(1BID@J>uEfL2 zEY$kL0jQ6`{UPum&s*Su_@b{RuWzbwrNl9)QzGUR;m01+z68pcbNmZN#9r2TRR$V9DZ?!QomE|XC9;w zbY?q?`@@M~r;kfSrI688tx5?eX+T20xCdde%Ko1~1GFu14{|!h9-;uJkc*+IoHIco z+Ik>2Syg}H$EEy{^`cE;o2pl+&5sacafebMRP1}A8HCKwwrJ`%HUbST z<8Wdd3|c$Cz*)sl;^Ej=E^$7{MiyX_I#VdFFy=Q&&b`59;p}T;UakcuoQPoe- zlop|D5Kbgy0re<~e#i5Kv5!o*s#`&1S~!kl>kSK!NaF4l+_&&6EeVB$_8BTeip zOq&8FAG zPIQFqkD4eF&WcD+#DjX5`hIconw8EY(1gUk;);@VrtX7&wy*;W8!|z_`nZT;LVm$3 zE9{BDN!ua8rQ(iKfhzi3tS7THno{OO;6})h3X)Ht72HqA=)AzAa(xouAeFGkB8mzf zmO_leZo$hNf>xNIgbad7OYA>olF{b^S%m#r1q|wRLG~813h_lkX241)=ST8_zSpSf zC&%D!6!Y_1)oT;zNAibQH|{85zjCwhwf;Dj!hVX-j!{2xjewIf2zQFEi`(3sBS9Dr5nS^(s3yfqvXkD(69KgOiIk z-X)i9LWf{}g1?YIDePfbmgJpGK`${E&WxCg!9$JuTrho!`H`z8zjX_lhEE0kxK|~< z@3C~14 z*jRdhm^O7=GlGE7k1#el1wT+CwLWLsguR{O-eS!?YFAXoPb)Gj-}=Yyi2N#^fa2BPzZ{W)*GNpT+zT&SZa9{#W9-$gDbFQ|=l440H-OPAaV&C1-HJixlzen*e%#q!dA*{nPh&3?ys=n zQ%^EKkFbwZ2QbO}5DIlX94HKlZOBs6KJG<{5Hvs;*ZCwmgpgU;X+l;Z=S$c-X%n)F zI)Y-qFhgxz7&amMiFi<8!^#DXUpMujmynf}olwvPQ-OZ>P|#P{eYjS|IU*!M@Li}Z z?q5}wUEkv>qe7=M-T<*TRMBmnui;@4{vN8|3%!ms=Hcn2*Hg!ha*$R<$ao&hTtpmzYSZ@%ZC16%#BT}V)aJ|p!ahWsN0ASTkDHle>UXDiVru|J&UVvRUk z8ZYKsthtF}5RWP3b`1X*r4!+3Lje(O!UqJLhy~PI&K=AOXrF7 zCv14&Ydwn)|1DCERf8qI4XN0AGy)#FFK!O3`~HcKjDu8&Psnuq=B?;s#>)AokyF{ z5mlSSgU}Rx|EX*iK~wmezW<<~Zr|YiN*chz#QIXHQsyclq3a(iyi=TWOzSFHByrBLcKvKAHm=hY=|$X8xCeD# zCG|;>g7q)3NlO;}u}FFw0;<4`3?4BT)Kx)K4xuJn5Ku03 zE7d0FOes!%uPM{DJ}%*>x<5r#z|?INy!asE1$a1B_@ijEYMmymr3(k9J{R1af_GxY z)aQ)j7$=KHQy#7nbRk+^*W=lw)|&=c?U9aU^0wlz@!f#4ahp@TP<`R4o(}OsdDyBo=kwmWJ=@DK3Ak-Nyrq2)4roM-i z3M<-@oPE4oy1$Gu2$&aR2)ixit$E#DgHx|z>h!}CD9$vRxR^7$K=2$a=3;%hK6LvF zSBmiQaX#cepnjp?8~DYAJcN%~$RM~^#r?*))b$hsB}FU~r^9+WDPi9e5-8|G1hW{I z(vxyuDJ52;JuxxjPR6_|V&9_;iZeqLkFM7eE-&I#X-h&EgaMs*D%Y6KpIHyF zpH=w1etyyHb-j@=easXZ4e)A+HNuLd`!x`AgzcI(tGr*r8u3=7?kiFvlI}C4&3XVL z;ahBng2(zGs+coAG(jtfAZUQPFTTZWCflT}N5M+DzPRM%x5D0}&XG8)yrQk^zl7h5 zxD4(dkuQXBZ@pZRKr1|-y8VT3g?&=pZ}Q9#x~20(?l&O|V2#juv9eeS*^!82-L8l6 zD%rSJ5_$q2sLtZ7(x%(`Fjxw^H)BY-9raxBCfq_o?t~=@y_={Yu{RJI1kXmo6g(S_ zE$KoqlTK%0aDha5ceqIc>U6iP;JJE^XFp6^V2venaPf#FFT`xRS!ed2{1C z5#O?h^fO5DH`zw`xV+ym5NUjfJ5T7f#8&9Ga8)r*w_h=5>lwfVe38s_yF9xTuZTV_ zYKnfQxogFG5CJLf5AI*VbMRIO-GEY$x~&gMS;Q%zsrke{h9z+v&G8S`jX1JsD z_&>(LFr}?8tW(@622M?V?{aSmnHo!muoV!>By=HV0uXx$XPbU^<4P4WCT0e~OH?SQ z#6!g8DlJ~e7yc}HERvMqr>K`gK2YTg_4C2?A@D%e6?kxW3pgzB`u)LyA=_SCBTQ9- zH*qY59Krm=K2;$_y8es0C2&($p1$ThA}8zuw26JC)ImWP;%G%1MY!~RKop~p;Rpp2 z{15F-(2q8uS1A9!ey2cFafjl!688t54#EGhmN2e;z4{ zBEO6_f(Z0|fICk=Gngm@Pvm_xaenbj3K}SrpuR@=&#Xg1Fu#PWc zr@$9QRJ3u0YImqgNf-Kux-NBoMNvF)E|K_!OpT9Emwn*uBBmE(o$y)HCj9JtEAse& z0@MYFG(HoRJ-0r7ru>Kn>kQy3oeP(%YyZCE=|1iM6?i`YM=}+4y>Y#A9l7R`0s% z=YzS3eE^)$8%eMewpZZL{`7Hiv1of-eXIK*Y2%lc=eGOFol!Uor;8b_JY}>+lHM^cW?^5Ox9DM1Hd3B)Z^&bI_FXmkc&{hlEaUieP11c`f#h!_ND(Vxga=UX9j(I)9fn=T`f`5@$R+N?)v z6X?f=*7+nH!l~y}D?D`F4>;jBpv`)$HgOC@d7U2+Vk6Ea{vJ6O?gf2)RgnPwe4wo9 zIs|2aM2;eDIR13n69%uJEg~0motSSiXlvhcXvE%NBj~&Y3!cdTP;I)7O%qH)AA`jd z^iv7hIvg$s9XHG>y6#N$hTP+-hJj84Rl`81J@o)|+YR@Y>`#Ru>vKkv)a}pgE343G z!hRu}SnyNAzQnoY6>44fCZLTd5sfbFX5ChxG9&doQrbwl65n$1>uuyn=(HzdDx&{#`hXQ0h`Gd+HdFt=Op z+{d>eJqx=$ZM>GK%^53$ZevueMEA!#&}zk<$MT9jPH6{muR;OYh7UvE8(5!(tiqRK z{}EE8$K0uRA9SAsZSp>6E)owViD`7T#h038s1BB zE~%y<*Mn8k_atv}$#02;6}U-z1O`jV+aZ-)H{4PBd1HBn980LZSYK{DJvJ1XTG-7L z1>`=J@zhX2?t3f>x}5>WPLP*Qd+ckXO&Mx*IKn~1x}k6BXCJ?YZucS4L-^HbL$K4w zAP`=RL2S2#BO6}-7MGWp3+k$D6S-AnT8cb0XrJU9VN=j(h1nKiRGW*J%S^Q4DAD&R z_6=QMMK2S!DpkE-$kez$guKQ{74jcie?q^+`X_SJl#VUvOjNFJ%jH|V?-~sV zTN3+#>qzWB^iW+6Q)N2Do###>Ct~6jvJd6Mg`ABnpvOQGKq`C$>YfpD4%yQ})?;S~ z-Gv9%bbA>6iJU2QZ|Qz3RSHDE2Wb;|9V#kZ|CW#)5vRo%QWgaZAs?W}3wf6iAhFj_ z4FtbJJkZaA;$dRn6OF0k2At&C;3i}XC?M_%Mi4R_H?3~tQTM)X*P~6;X+yG==N$P! zj}-z=)EC93AbFiCAEEOwg9}9C8_FIb@gT8HKSx+G#XXHlMx0CB)8d}SR3&s`{4=_( z4|U6WW;8)=LUj>$p7KrTd<{5#e(*#>5Hx;(C0zGkqSA@_3`+GA{0h&Q*r&8583SQn zj4Se(xi6*eq8<^`?+Q#t;>@VD9i5MpYyHbPT-s1*|b@&swS*2=~i;TAj9c<7jL|*vTSXQb^7vZzG9DWRMqWH;%*Rog!$Nl^KTp^X2zwRh4VR7XLu2zv zeVWQjV!yD}qE{Ep zys!^p`j>ly@B{HJkD-Y<`$V20uYXDV71zGlS1J@+#}}`pkj>OUgjm0$*-Hfg9FNAzxu8)a5_SdZNY*Z6fD~Hn}&{6J`=OyieNRz>FmEm37oH1>x+~ zzr`3N+6dIr*AkD7&^eXAOstW5v{4@eML_f?>zWd#|NjcRcUHZwBaGwy`4nngJBc01 z0wa)Y3sMD~GNf=JgTX|gs0jJ=`HiZa=l?>wbB49wy)Lun^2}wY$Kb(NYY)-MhVDBq zP#l_|dT1h(OM8IVi3Y?sIQV|$8l*XLT>LF}P+TqgNKCH#0$W;)@mM@_Zobs@aqamw zH^p~S(>vO;$`!INiOm|9{9UvM_oFp?1_|swf5$~l*C)9yFJRuA2@qv?=gqQ zK0U44y<*#DZ4B+qMTj8p01oFJoVq+K5ic~YHCIkDY5HFNV4vlz?Ro(X*;7tQo|TZ9 z_fo&h_tG*tXCiFuNj7zQd;lz~r-g+&Xa42RSy{~bx_+-`>8;W6LYk4CaOIqv>ea<* zuuyU)yf-;Y#>Ef4aqEYoC02wMtPd@DbFOM?poyIHND(Se4Ipt)`%0-tWQmx~+WaRX zA}6ozZh6g_M{amFI!_gT&4|NY0+QrdZ3*5dFnGi2LNB5C@g_-W!=C zd!uvtruG43Bs{JLCN`lOo%O{fvMZ;UJMG!nIp(r)2ppc8VCf90xAKk$`wRqKTYzL* zT)^)o|Ji#}`+BsE&%hm1zx9o{OLUZ*8rj5(josv?M((P2iLH0>Xt4)#A@HB? zJ-KH0pVLIuf{)W$sVleM#FK$xsm(a-HTJW(OLPFu7`dk9d}Q_&XJow>7}|BTrpsJ_ zWIN8m<=JE29S7528Nu^gtVM=(YPs!cFrLdkSbXwm4}P!rNIK2tWq3AqhG>-~7cyLZ zqy}|kf%j~Dp=)Ef`(h6stRwMhzZZ;$L+8rPKC8Bmj8%8C@gBcd+w9z^oDmtZ{34dH z_~d25M`p{o3r})g7BeR$HPG30To5C)#%!!N_Pv^wjiqYFQ=c8|U7o}nIU{GDeR&{@ zd8QkWm)esWEVSg%A8qk*wEFwp-<*-ukLV-N`sS-xMEdNYb$)RE@b2{!Tv-Qh-&pj0 z9%6H1yd!xTGU!tqc^QG5SLIoZI((pFAZK)tV8&5-du|s$T7N;W$;bnH8hwsSb62e` z_VbnZWG>D7Vw9xMll3NF1ttBP&{F4$mY#r&SRd)z{gW=W`ut)sp-BW-*{+T%It3p@ zr--`rJRaap`at%KT6<`1ZtJeYi$fz6bLRZ0@Ge|nXHXl9 z#TOUfifs!~h`mOeM;6m$@jou5ZT5=2798$!FE=J~w3V?os3QFPR`t(be{*~AEr z7Q0DXrU%a^Ur!VIVw)E>?R%5g=h^h2LsJ+%cT0G+XMT;lcN}PG?;yy0V^4%`VwLwr zmDnmwhS=?5S)Gf^6<)hbxbtg%qE;%2-EqKDOM#X;8?^LaLyIf{Ag6BPz6jDYVv3GF zGA?zlJc!`H=T)qpK~v!Kd=Joqy;6+%j@V^_?Y%^ct%8=A!&Uh&R*IJ1N@)288Cr6L zea4PZ+;zBbbEl1qzls(c*nJD{UR#{yHMHb2cs9BbEw+zmgO%R6)wRYkoSv_Z%mHLR zrvXLt?G+g(wtvQfC^pVc@z5YM4y|(mJI?*}-uNF^A-4KbU@>^2XDk2E*0wM%@kYOw zoR}MzIlBofJB>@+!0$;e+dUAP?RtZkc(!-&YU1)N*Llv;ToV6q9*G^JC4U?({e18D zR>m5a8pY$GJ9^k(LT51N+9{e7^XJrmiyf(isPY{G%heW8X%`5VI5{R;12^`@epIKSGpzLIA zc|s`o-*t3ae-JIPB2akz1+;vh7%llt_{G7^9=OptOV@m{fyO*MI{Zj|D+eywpX$o?MFJL^5r za>u=tG!YuZGqmK7UpagDPqb|D2)mM)oM%(#dSykiX)Xa~*Kvs+yIzSI>!%2bB>xYs zG7MCZ^I(o=ufSo8`zUAtL(N`+8P=aMF1@7C()$iAwWYxJ#GWp+lRG1_7=3xc^5r#< z$HtWWUN9{PRQj+SD%G{A?HfP9I8le)7X^vSYaU&!kKl|?j20gjE#K-!tB$8Fy9ejg z?fhWZ%l8+^$^OY@-+LrNu)fB9fp+7jXvsglFk)mj%Q5!aC0Va*2iL{t6gcSl3NYjz ziQV=0(y!%0mA#jZ-5HnoD%ziWzDhi^r@+_TBfj6B$AujB*}Ld{)=ir8y>zZTds=zM zUH`;=RvKvJE>>I2(y;WoyGQ%p=Dh+G(q{}Uxu$5z??iJTyN>&)?b3wHmJeKy?m_D& zZn+!tLaU#L`(khCs}b9q8Vv7>3Fj=ugkz73p)K}xrNg4vL+eLAgXMF7SxxZ+a9U&&^B}evwpy$ds|Axms~-=|iG6i_FIPV6QyCxe zQeD>W6hGhG!K>ETxD{IZfK%M*(TK(wn!Q)y6g%faiz_2UaU$zPIyO(ib<6h%uGMMy zMVfi{K%!gT3){?`ukrb=1Max@@_H;}PcI{GpQQ-%UP`6UD)i5@scE=Ytg+#UoZKxP z8-jU=V#ik##fje|Hz4{$@6W|Dh_&G8Xvr5vV<7C>l!vbTJ2AQXO*LZoN(z1UnMs{@ z=s%wGy=eZJ2g%>S%33sAzPk)Pp&P^R|*7hBwM&zG-mH45ajZ9S2+Bvu9<3)})Hinkm6tv<<5X+6RoZ8QQ zgW7f-0W=rmUH(gduecBMDn5ith1ej_h}dDYM|=pdS#*V)75OLo zK6aRN{_rH0j9w+`a&9b|=vCQ18;`#dtc~w$E+si{c;jlDS8jknqc7D|M+Ydmh@I^k z#m*+4qX&ftbKk&@UE5i4JLl$pFpFzr3afQ(46N*da9Q@ihtfN)*frBTw&SJsfxO~Hd)s+4bXvMf$SMd!@r7}l7UDhTrp0x>!cO0#}JgE&|)^^P>XB@SVbK@E0 z+_+`2OK^BF8Qx_u8C9u~r>YVnPjO4uCe<{$ThuCRqsqEArtd>-R^7XQ|emjKA-nfgBi|BaQZRhOSlOzOSUpojQEujQHV{z1p1E3QrD?jK7u{-7MC=s_rJ^q_pH zuB|<48QHoL4gbjjijF7Nq6e?;J#)6)DYWM(P5?&L+SQ`_H84QKH644Otc$T%7XEjI)O~&ZbF6$|@ug4;=0DEu*kUJe+Qo~{^!#_$8`VCFfi&+O2+WZI(tXXHAa^KK``*=37MYP~P zXo)QfWhK6f#&O*D`kq|oLi{b?^Hw*mapAJXePl-@5A?eKt-XuZyut4YZDa7c}O!4uQ3@q&ZKuP@;k$m z(*H7NCUAHI{uds4mAX5-lJ6hgPOblemfje0W@EQ&87#wT*8vmU_3F#Mc%5gfr)i$Z zKMjo{|5)uCixFb3j^h5tRuP?vjJU=<%e$J)#7?}=2Ccoplid6g-eu}y(2{S9mfR?< zkCPjPR(tK5hAa=UfIr|pz z^1ZyY-2Ll2vv*Zq+G16jbLE>G*A1_0&I&e9Xtn3=IgGFAHR1H;v2if_mj)J zf`K^?fwjF`!lB($xOevSir8j;yxRCP4|*ia*25n2EblV1=}Lz)4v4b*!hBgjF3i9EXWAV$ksp69o=9$IpbNayVR(e^CSQm2mg z?E5pHKmGFC?;k!regFN_*MIx%KObJO6<$4k{qx6 c|N8vPr_cZX^x@YhljGn#ef8B(e|`V-UrDn)=>Px# literal 0 HcmV?d00001 diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/module/linux/ctb.py b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/module/linux/ctb.py new file mode 100644 index 0000000000..6b541ffe39 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/module/linux/ctb.py @@ -0,0 +1,455 @@ +import wxctb, sys, re + +DCD = wxctb.LinestateDcd +CTS = wxctb.LinestateCts +DSR = wxctb.LinestateDsr +DTR = wxctb.LinestateDtr +RING = wxctb.LinestateRing +RTS = wxctb.LinestateRts +NULL = wxctb.LinestateNull + +def abstract(): + import inspect + caller = inspect.getouterframes(inspect.currentframe())[1][3] + raise NotImplementedError(caller + ' must be implemented in subclass') + +class IOBase: + def __init__(self): + self.device = None + # set timeout to 1000ms (the default) + self.timeout = 1000 + + def __del__(self): + pass + + def Close(self): + if self.device: + self.device.Close() + + def GetTimeout(self): + """ + Returns the internal timeout value in milliseconds + """ + return self.timeout + + def Ioctl(self,cmd,arg): + if self.device: + self.device.Ioctl(cmd,arg) + + def Open(self): + abstract() + + def PutBack(self,char): + return self.device.PutBack(char) + + def Read(self,length): + """ + Try to read the given count of data (length) and returns the + successfully readed number of data. The function never blocks. + For example: + readed = dev.Read(100) + """ + buf = "\x00"*(length+1) + rd = self.device.Read(buf,length) + return buf[0:rd] + + def ReadBinary(self,eos="\n"): + """ + Special SCPI command. Read the next data coded as a SCPI + binary format. + A binary data transfer will be startet by '#'. The next byte + tells the count of bytes for the binary length header, + following by the length bytes. After these the data begins. + For example: + #500004xxxx + The header length covers 5 Byte, the length of the binary + data is 4 (x means the binary data bytes) + """ + try: + eoslen = len(eos) + b=self.Readv(2) + if len(b) == 2: + hl = int(b[1]) + b = self.Readv(hl) + if len(b) == hl: + dl = int(b) + # don't left over the eos string or character in the + # device input buffer + data = self.Readv(dl+eoslen) + # check, if the binary data block is complete + if data[dl] == '#': + # not complete, another block is following + for c in data[dl:dl+eoslen]: + self.PutBack(c) + + data = data[:dl] + self.ReadBinary() + return data + except: + pass + return '' + + def ReadUntilEOS(self,eos="\n",quota=0): + """ + ReadUntilEOS(eosString=\"\\n\",timeout=1000) + Reads data until the given eos string was received (default is + the linefeed character (0x0a) or the internal timeout + (default 1000ms) was reached. + ReadUntilEOS returns the result as the following tuple: + ['received string',state,readedBytes] + If a timeout occurred, state is 0, otherwise 1 + """ + return self.device.ReadUntilEOS("",0,eos,self.timeout,quota) + + def Readv(self,length): + """ + Try to read the given count of data. Readv blocks until all data + was readed successfully or the internal timeout, set with the + class member function SetTimeout(timeout), was reached. + Returns the readed data. + """ + buf = "\x00"*length + rd = self.device.Readv(buf,length,self.timeout) + return buf[0:rd] + + def ResetBus(self): + """ + If the underlaying interface needs some special reset operations + (for instance the GPIB distinguish between a normal device reset + and a special bus reset), you can put some code here) + """ + pass + + def SetTimeout(self,timeout): + """ + Set the internal timeout value in milliseconds for all blocked + operations like ReadUntilEOS, Readv and Writev. + """ + self.timeout = timeout + + def Write(self,string): + """ + Writes the given string to the device and returns immediately. + Write returns the number of data bytes successfully written or a + negativ number if an error occured. For some circumstances, not + the complete string was written. + So you have to verify the return value to check this out. + """ + return self.device.Write(string,len(string)) + + def Writev(self,string): + """ + Writes the given string to the device. The function blocks until + the complete string was written or the internal timeout, set with + SetTimeout(timeout), was reached. + Writev returns the number of data successfully written or a + negativ value, if an errors occurred. + """ + return self.device.Writev(string,len(string),self.timeout) + +class SerialPort(IOBase): + def __init__(self): + IOBase.__init__(self) + + def __del__(self): + self.Close() + + def ChangeLineState(self,lineState): + """ + Change (toggle) the state of each the lines given in the + linestate parameter. Possible values are DTR and/or RTS. + For example to toggle the RTS line only: + dev.ChangeLineState(RTS) + """ + self.device.ChangeLineState(lineState) + + def ClrLineState(self,lineState): + """ + Clear the lines given in the linestate parameter. Possible + values are DTR and/or RTS. For example to clear only + the RTS line: + dev.ClrLineState(RTS) + """ + self.device.ClrLineState(lineState) + + def GetAvailableBytes(self): + """ + Returns the available bytes in the input queue of the serial + driver. + """ + n = wxctb.new_intp() + wxctb.intp_assign(n, 0) + self.device.Ioctl(wxctb.CTB_SER_GETINQUE,n) + return wxctb.intp_value(n) + + def GetCommErrors(self): + """ + Get the internal communication errors like breaks, framing, + parity or overrun errors. + Returns the count of each error as a tuple like this: + (b,f,o,p) = dev.GetCommErrors() + b: breaks, f: framing errors, o: overruns, p: parity errors + """ + einfo = wxctb.SerialPort_EINFO() + self.device.Ioctl(wxctb.CTB_SER_GETEINFO,einfo) + return einfo.brk,einfo.frame,einfo.overrun,einfo.parity + + def GetLineState(self): + """ + Returns the current linestates of the CTS, DCD, DSR and RING + signal line as an integer value with the appropriate bits or + -1 on error. + For example: + lines = dev.GetLineState() + if lines & CTS: + print \"CTS is on\" + """ + return self.device.GetLineState() + + def Open(self,devname,baudrate,protocol='8N1',handshake='no_handshake'): + """ + Open the device devname with the given baudrate, the protocol + like '8N1' (default) and the use of the handshake [no_handshake + (default), rtscts or xonxoff] + For example: + At Linux: + dev = SerialPort() + dev.Open(\"/dev/ttyS0\",115200) + or with a datalen of 7 bits, even parity, 2 stopbits and rts/cts + handshake: + dev.Open(\"/dev/ttyS0\",115200,'7E2',True) + At Windows: + dev = SerialPort() + dev.Open(\"COM1\",115200) + dev.Open(\"COM1\",115200,'7E2',True) + Returns the handle on success or a negativ value on failure. + """ + # the following parity values are valid: + # N:None, O:Odd, E:Even, M:Mark, S:Space + parity = {'N':0,'O':1,'E':2,'M':3,'S':4} + # the regular expression ensures a valid value for the datalen + # (5...8 bit) and the count of stopbits (1,2) + reg=re.compile(r"(?P[8765])"r"(?P

[NOEMS])"r"(?P[12])") + self.device = wxctb.SerialPort() + dcs = wxctb.SerialPort_DCS() + dcs.baud = baudrate + res = reg.search(protocol) + # handle the given protocol + if res: + dcs.wordlen = int(res.group('w')) + dcs.stopbits = int(res.group('s')) + dcs.parity = parity[res.group('p')] + # valid handshake are no one, rts/cts or xon/xoff + if handshake == 'rtscts': + dcs.rtscts = True + elif handshake == 'xonxoff': + dcs.xonxoff = True + + return self.device.Open(devname,dcs) + + def Reset(self): + """ + Send a break for 0.25s. + """ + self.device.SendBreak(0) + + def SetBaudrate(self,baudrate): + """ + Set the baudrate for the device. + """ + self.device.SetBaudrate(baudrate) + + def SetLineState(self,lineState): + """ + Set the lines given in the linestate parameter. Possible + values are DTR and/or RTS. For example to set both: + dev.SetLineState( DTR | RTS) + """ + self.device.SetLineState(lineState) + + def SetParityBit(self,parity): + """ + Set the parity bit explicitly to 0 or 1. Use this function, if + you would like to simulate a 9 bit wordlen at what the ninth bit + was represented by the parity bit value. For example: + dev.SetParityBit( 0 ) + dev.Write('some data sent with parity 0') + dev.SetParityBit( 1 ) + dev.Write('another sequence with parity 1') + """ + return self.device.SetParityBit( parity ) + +class GpibDevice(IOBase): + """ + GPIB class + """ + def __init__(self): + IOBase.__init__(self) + + def __del__(self): + self.Close() + + def FindListeners(self,board = 0): + """ + Returns the address of the connected devices as a list. + If no device is listening, the list is empty. If an error + occurs an IOError exception raised. For example: + g = GPIB() + listeners = g.FindListeners() + """ + listeners = wxctb.GPIB_x_FindListeners(board) + if listeners < 0: + raise IOError("GPIB board error") + result = [] + for i in range(1,31): + if listeners & (1 << i): + result.append(i) + return result + + def GetEosChar(self): + """ + Get the internal EOS termination character (see SetEosChar). + For example: + g = GPIB() + g.Open(\"gpib1\",1) + eos = g.GetEosChar() + """ + eos = wxctb.new_intp() + wxctb.intp_assign(eos, 0) + self.device.Ioctl(wxctb.CTB_GPIB_GET_EOS_CHAR,eos) + return wxctb.intp_value(eos) + + def GetEosMode(self): + """ + Get the internal EOS mode (see SetEosMode). + For example: + g = GPIB() + g.Open(\"gpib1\",1) + eos = g.GetEosMode() + """ + mode = wxctb.new_intp() + wxctb.intp_assign(mode, 0) + self.device.Ioctl(wxctb.CTB_GPIB_GET_EOS_MODE,mode) + return wxctb.intp_value(mode) + + def GetError(self): + errorString = " "*256 + self.device.GetError(errorString,256) + return errorString + + def GetSTB(self): + """ + Returns the value of the internal GPIB status byte register. + """ + stb = wxctb.new_intp() + wxctb.intp_assign(stb, 0) + self.device.Ioctl(wxctb.CTB_GPIB_GETRSP,stb) + return wxctb.intp_value(stb) + + # This is only for internal usage!!! + def Ibrd(self,length): + buf = "\x00"*length + state = self.device.Ibrd(buf,length) + return state,buf + + # This is only for internal usage!!! + def Ibwrt(self,string): + return self.device.Ibwrt(string,len(string)) + + def Open(self,devname,adr,eosChar=10,eosMode=0x08|0x04): + """ + Open(gpibdevice,address,eosChar,eosMode) + Opens a connected device at the GPIB bus. gpibdevice means the + controller, (mostly \"gpib1\"), address the address of the desired + device in the range 1...31. The eosChar defines the EOS character + (default is linefeed), eosMode may be a combination of bits ORed + together. The following bits can be used: + 0x04: Terminate read when EOS is detected. + 0x08: Set EOI (End or identify line) with EOS on write function + 0x10: Compare all 8 bits of EOS byte rather than low 7 bits + (all read and write functions). Default is 0x12 + For example: + dev = GPIB() + dev.Open(\"gpib1\",17) + Opens the device with the address 17, linefeed as EOS (default) + and eos mode with 0x04 and 0x08. + Open returns >= 0 or a negativ value, if something going wrong. + """ + self.device = wxctb.GpibDevice() + dcs = wxctb.Gpib_DCS() + dcs.m_address1 = adr + dcs.m_eosChar = eosChar + dcs.m_eosMode = eosMode + result = self.device.Open(devname,dcs) + return result + + def Reset(self): + """ + Resets the connected device. In the GPIB definition, the device + should be reset to it's initial state, so you can restart a + formely lost communication. + """ + self.device.Ioctl(wxctb.CTB_RESET,None) + + def ResetBus(self): + """ + The command asserts the GPIB interface clear (IFC) line for + ast least 100us if the GPIB board is the system controller. + This initializes the GPIB and makes the interface CIC and + active controller with ATN asserted. + Note! The IFC signal resets only the GPIB interface functions + of the bus devices and not the internal device functions. + For a device reset you should use the Reset() command above. + """ + self.device.Ioctl(wxctb.CTB_GPIB_RESET_BUS,None) + + def SetEosChar(self,eos): + """ + Configure the end-of-string (EOS) termination character. + Note! Defining an EOS byte does not cause the driver to + automatically send that byte at the end of write I/O + operations. The application is responsible for placing the + EOS byte at the end of the data strings that it defines. + (National Instruments NI-488.2M Function Reference Manual) + For example: + g = GPIB() + g.Open(\"gpib1\",1) + eos = g.GetEosChar(0x10) + """ + intp = wxctb.new_intp() + wxctb.intp_assign(intp, eos) + return self.device.Ioctl(wxctb.CTB_GPIB_SET_EOS_CHAR,intp) + + def SetEosMode(self,mode): + """ + Set the EOS mode (handling).m_eosMode may be a combination + of bits ORed together. The following bits can be used: + 0x04: Terminate read when EOS is detected. + 0x08: Set EOI (End or identify line) with EOS on write function + 0x10: Compare all 8 bits of EOS byte rather than low 7 bits + (all read and write functions). For example: + g = GPIB() + g.Open(\"gpib1\",1) + eos = g.GetEosMode(0x04 | 0x08) + """ + intp = wxctb.new_intp() + wxctb.intp_assign(intp, mode) + return self.device.Ioctl(wxctb.CTB_GPIB_SET_EOS_MODE,intp) + +def GetKey(): + """ + Returns the current pressed key or '\0', if no key is pressed. + You can simply create a query loop with: + while GetKey() == '\0': + ... make some stuff ... + + """ + return wxctb.GetKey() + +def GetVersion(): + """ + Returns the version of the ctb python module. The numbering + has the following format: x.y.z + x.y means the version of the underlaying ctb lib, z the version + of the python port. + """ + return "0.16" diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/module/linux/wxctb.py b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/module/linux/wxctb.py new file mode 100644 index 0000000000..f9e0d2ee6e --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/module/linux/wxctb.py @@ -0,0 +1,264 @@ +# This file was automatically generated by SWIG (http://www.swig.org). +# Version 1.3.40 +# +# Do not make changes to this file unless you know what you are doing--modify +# the SWIG interface file instead. + +from sys import version_info +if version_info >= (2,6,0): + def swig_import_helper(): + from os.path import dirname + import imp + fp = None + try: + fp, pathname, description = imp.find_module('_wxctb', [dirname(__file__)]) + except ImportError: + import _wxctb + return _wxctb + if fp is not None: + try: + _mod = imp.load_module('_wxctb', fp, pathname, description) + finally: + fp.close() + return _mod + _wxctb = swig_import_helper() + del swig_import_helper +else: + import _wxctb +del version_info +try: + _swig_property = property +except NameError: + pass # Python < 2.2 doesn't have 'property'. +def _swig_setattr_nondynamic(self,class_type,name,value,static=1): + if (name == "thisown"): return self.this.own(value) + if (name == "this"): + if type(value).__name__ == 'SwigPyObject': + self.__dict__[name] = value + return + method = class_type.__swig_setmethods__.get(name,None) + if method: return method(self,value) + if (not static) or hasattr(self,name): + self.__dict__[name] = value + else: + raise AttributeError("You cannot add attributes to %s" % self) + +def _swig_setattr(self,class_type,name,value): + return _swig_setattr_nondynamic(self,class_type,name,value,0) + +def _swig_getattr(self,class_type,name): + if (name == "thisown"): return self.this.own() + method = class_type.__swig_getmethods__.get(name,None) + if method: return method(self) + raise AttributeError(name) + +def _swig_repr(self): + try: strthis = "proxy of " + self.this.__repr__() + except: strthis = "" + return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) + +try: + _object = object + _newclass = 1 +except AttributeError: + class _object : pass + _newclass = 0 + + +def _swig_setattr_nondynamic_method(set): + def set_attr(self,name,value): + if (name == "thisown"): return self.this.own(value) + if hasattr(self,name) or (name == "this"): + set(self,name,value) + else: + raise AttributeError("You cannot add attributes to %s" % self) + return set_attr + + + +def new_intp(): + return _wxctb.new_intp() +new_intp = _wxctb.new_intp + +def copy_intp(*args, **kwargs): + return _wxctb.copy_intp(*args, **kwargs) +copy_intp = _wxctb.copy_intp + +def delete_intp(*args, **kwargs): + return _wxctb.delete_intp(*args, **kwargs) +delete_intp = _wxctb.delete_intp + +def intp_assign(*args, **kwargs): + return _wxctb.intp_assign(*args, **kwargs) +intp_assign = _wxctb.intp_assign + +def intp_value(*args, **kwargs): + return _wxctb.intp_value(*args, **kwargs) +intp_value = _wxctb.intp_value +class timer_control(object): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + usecs = _swig_property(_wxctb.timer_control_usecs_get, _wxctb.timer_control_usecs_set) + exitflag = _swig_property(_wxctb.timer_control_exitflag_get, _wxctb.timer_control_exitflag_set) + exitfnc = _swig_property(_wxctb.timer_control_exitfnc_get, _wxctb.timer_control_exitfnc_set) +timer_control_swigregister = _wxctb.timer_control_swigregister +timer_control_swigregister(timer_control) + +class Timer(object): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + __repr__ = _swig_repr + def __init__(self, *args, **kwargs): + this = _wxctb.new_Timer(*args, **kwargs) + try: self.this.append(this) + except: self.this = this + __swig_destroy__ = _wxctb.delete_Timer + __del__ = lambda self : None; + def start(self): return _wxctb.Timer_start(self) + def stop(self): return _wxctb.Timer_stop(self) +Timer_swigregister = _wxctb.Timer_swigregister +Timer_swigregister(Timer) + + +def sleepms(*args, **kwargs): + return _wxctb.sleepms(*args, **kwargs) +sleepms = _wxctb.sleepms +CTB_RESET = _wxctb.CTB_RESET +class IOBase(object): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _wxctb.delete_IOBase + __del__ = lambda self : None; + def ClassName(self): return _wxctb.IOBase_ClassName(self) + def Close(self): return _wxctb.IOBase_Close(self) + def Ioctl(self, *args, **kwargs): return _wxctb.IOBase_Ioctl(self, *args, **kwargs) + def IsOpen(self): return _wxctb.IOBase_IsOpen(self) + def Open(self, *args, **kwargs): return _wxctb.IOBase_Open(self, *args, **kwargs) + def PutBack(self, *args, **kwargs): return _wxctb.IOBase_PutBack(self, *args, **kwargs) + def Read(self, *args, **kwargs): return _wxctb.IOBase_Read(self, *args, **kwargs) + def ReadUntilEOS(self, *args, **kwargs): return _wxctb.IOBase_ReadUntilEOS(self, *args, **kwargs) + def Readv(self, *args, **kwargs): return _wxctb.IOBase_Readv(self, *args, **kwargs) + def Write(self, *args, **kwargs): return _wxctb.IOBase_Write(self, *args, **kwargs) + def Writev(self, *args, **kwargs): return _wxctb.IOBase_Writev(self, *args, **kwargs) +IOBase_swigregister = _wxctb.IOBase_swigregister +IOBase_swigregister(IOBase) + +ParityNone = _wxctb.ParityNone +ParityOdd = _wxctb.ParityOdd +ParityEven = _wxctb.ParityEven +ParityMark = _wxctb.ParityMark +ParitySpace = _wxctb.ParitySpace +LinestateDcd = _wxctb.LinestateDcd +LinestateCts = _wxctb.LinestateCts +LinestateDsr = _wxctb.LinestateDsr +LinestateDtr = _wxctb.LinestateDtr +LinestateRing = _wxctb.LinestateRing +LinestateRts = _wxctb.LinestateRts +LinestateNull = _wxctb.LinestateNull +class SerialPort_DCS(object): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + __repr__ = _swig_repr + baud = _swig_property(_wxctb.SerialPort_DCS_baud_get, _wxctb.SerialPort_DCS_baud_set) + parity = _swig_property(_wxctb.SerialPort_DCS_parity_get, _wxctb.SerialPort_DCS_parity_set) + wordlen = _swig_property(_wxctb.SerialPort_DCS_wordlen_get, _wxctb.SerialPort_DCS_wordlen_set) + stopbits = _swig_property(_wxctb.SerialPort_DCS_stopbits_get, _wxctb.SerialPort_DCS_stopbits_set) + rtscts = _swig_property(_wxctb.SerialPort_DCS_rtscts_get, _wxctb.SerialPort_DCS_rtscts_set) + xonxoff = _swig_property(_wxctb.SerialPort_DCS_xonxoff_get, _wxctb.SerialPort_DCS_xonxoff_set) + buf = _swig_property(_wxctb.SerialPort_DCS_buf_get, _wxctb.SerialPort_DCS_buf_set) + def __init__(self): + this = _wxctb.new_SerialPort_DCS() + try: self.this.append(this) + except: self.this = this + __swig_destroy__ = _wxctb.delete_SerialPort_DCS + __del__ = lambda self : None; + def GetSettings(self): return _wxctb.SerialPort_DCS_GetSettings(self) +SerialPort_DCS_swigregister = _wxctb.SerialPort_DCS_swigregister +SerialPort_DCS_swigregister(SerialPort_DCS) + +class SerialPort_EINFO(object): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + __repr__ = _swig_repr + brk = _swig_property(_wxctb.SerialPort_EINFO_brk_get, _wxctb.SerialPort_EINFO_brk_set) + frame = _swig_property(_wxctb.SerialPort_EINFO_frame_get, _wxctb.SerialPort_EINFO_frame_set) + overrun = _swig_property(_wxctb.SerialPort_EINFO_overrun_get, _wxctb.SerialPort_EINFO_overrun_set) + parity = _swig_property(_wxctb.SerialPort_EINFO_parity_get, _wxctb.SerialPort_EINFO_parity_set) + def __init__(self): + this = _wxctb.new_SerialPort_EINFO() + try: self.this.append(this) + except: self.this = this + __swig_destroy__ = _wxctb.delete_SerialPort_EINFO + __del__ = lambda self : None; +SerialPort_EINFO_swigregister = _wxctb.SerialPort_EINFO_swigregister +SerialPort_EINFO_swigregister(SerialPort_EINFO) + +CTB_SER_GETEINFO = _wxctb.CTB_SER_GETEINFO +CTB_SER_GETBRK = _wxctb.CTB_SER_GETBRK +CTB_SER_GETFRM = _wxctb.CTB_SER_GETFRM +CTB_SER_GETOVR = _wxctb.CTB_SER_GETOVR +CTB_SER_GETPAR = _wxctb.CTB_SER_GETPAR +CTB_SER_GETINQUE = _wxctb.CTB_SER_GETINQUE +CTB_SER_SETPAR = _wxctb.CTB_SER_SETPAR +class SerialPort_x(IOBase): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _wxctb.delete_SerialPort_x + __del__ = lambda self : None; + def ClassName(self): return _wxctb.SerialPort_x_ClassName(self) + def ChangeLineState(self, *args, **kwargs): return _wxctb.SerialPort_x_ChangeLineState(self, *args, **kwargs) + def ClrLineState(self, *args, **kwargs): return _wxctb.SerialPort_x_ClrLineState(self, *args, **kwargs) + def GetLineState(self): return _wxctb.SerialPort_x_GetLineState(self) + def GetSettingsAsString(self): return _wxctb.SerialPort_x_GetSettingsAsString(self) + def Ioctl(self, *args, **kwargs): return _wxctb.SerialPort_x_Ioctl(self, *args, **kwargs) + def SendBreak(self, *args, **kwargs): return _wxctb.SerialPort_x_SendBreak(self, *args, **kwargs) + def SetBaudrate(self, *args, **kwargs): return _wxctb.SerialPort_x_SetBaudrate(self, *args, **kwargs) + def SetLineState(self, *args, **kwargs): return _wxctb.SerialPort_x_SetLineState(self, *args, **kwargs) + def SetParityBit(self, *args, **kwargs): return _wxctb.SerialPort_x_SetParityBit(self, *args, **kwargs) + IsStandardRate = staticmethod(_wxctb.SerialPort_x_IsStandardRate) +SerialPort_x_swigregister = _wxctb.SerialPort_x_swigregister +SerialPort_x_swigregister(SerialPort_x) + +def SerialPort_x_IsStandardRate(*args, **kwargs): + return _wxctb.SerialPort_x_IsStandardRate(*args, **kwargs) +SerialPort_x_IsStandardRate = _wxctb.SerialPort_x_IsStandardRate + +COM1 = "/dev/ttyS0" +COM2 = "/dev/ttyS1" +COM3 = "/dev/ttyS2" +COM4 = "/dev/ttyS3" +COM5 = "/dev/ttyS4" +COM6 = "/dev/ttyS5" +COM7 = "/dev/ttyS6" +COM8 = "/dev/ttyS7" +COM9 = "/dev/ttyS8" + +class SerialPort(SerialPort_x): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + __repr__ = _swig_repr + def __init__(self): + this = _wxctb.new_SerialPort() + try: self.this.append(this) + except: self.this = this + __swig_destroy__ = _wxctb.delete_SerialPort + __del__ = lambda self : None; + def ChangeLineState(self, *args, **kwargs): return _wxctb.SerialPort_ChangeLineState(self, *args, **kwargs) + def ClrLineState(self, *args, **kwargs): return _wxctb.SerialPort_ClrLineState(self, *args, **kwargs) + def GetLineState(self): return _wxctb.SerialPort_GetLineState(self) + def Ioctl(self, *args, **kwargs): return _wxctb.SerialPort_Ioctl(self, *args, **kwargs) + def IsOpen(self): return _wxctb.SerialPort_IsOpen(self) + def Read(self, *args, **kwargs): return _wxctb.SerialPort_Read(self, *args, **kwargs) + def SendBreak(self, *args, **kwargs): return _wxctb.SerialPort_SendBreak(self, *args, **kwargs) + def SetBaudrate(self, *args, **kwargs): return _wxctb.SerialPort_SetBaudrate(self, *args, **kwargs) + def SetLineState(self, *args, **kwargs): return _wxctb.SerialPort_SetLineState(self, *args, **kwargs) + def SetParityBit(self, *args, **kwargs): return _wxctb.SerialPort_SetParityBit(self, *args, **kwargs) + def Write(self, *args, **kwargs): return _wxctb.SerialPort_Write(self, *args, **kwargs) +SerialPort_swigregister = _wxctb.SerialPort_swigregister +SerialPort_swigregister(SerialPort) + + +def GetKey(): + return _wxctb.GetKey() +GetKey = _wxctb.GetKey + + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/samples/parity.py b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/samples/parity.py new file mode 100755 index 0000000000..910361b8e0 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/samples/parity.py @@ -0,0 +1,70 @@ +#!/usr/bin/python + +import getopt, time, sys + +sys.path.insert( 0, r'/home/jb/project/libctb-0.16/python/module/linux') + +import ctb + +def main(): + + baudrate = 19200 + + devname = "" + + protocol = '8N1' + + try: + opt,arg = getopt.getopt(sys.argv[1:], + 'b:d:p:', + ['baudrate=', + 'device=', + 'protocol=' + ]) + + except getopt.GetoptError: + print "usage: parity.py [options]\n"\ + "\t-b baudrate\n"\ + "\t--baudrate=baudrate"\ + "\t-d device\n"\ + "\t--device=serial device name like /dev/ttyS0 or COM1\n"\ + "\t-h\n"\ + "\t--help print this\n"\ + "\n" + sys.exit(0) + + for o,a in opt: + + if o in ("-b","--baudrate"): + + baudrate = int(a) + + if o in ("-d","--device"): + + devname = a + + if o in ("-p","--protocol"): + + protocol = a + + + print "Using ctb version " + ctb.GetVersion() + + dev = ctb.SerialPort() + + if dev.Open( devname, baudrate, protocol ) < 0: + + print "Cannot open " + devname + "\n" + + # send the following string with a always set parity bit + dev.SetParityBit( 1 ) + + dev.Writev( "Hello World" ) + + # send the following string with a always cleared parity bit + dev.SetParityBit( 0 ) + + dev.Writev( "Hello World" ) + +main() + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/samples/protocol.py b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/samples/protocol.py new file mode 100755 index 0000000000..ff1731b895 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/samples/protocol.py @@ -0,0 +1,88 @@ +#!/usr/bin/python + +import getopt, time, sys + +sys.path.insert( 0, r'/home/jb/project/libctb-0.16/python/module/linux') + +import ctb + +def DataBlock(): + data = '' + for c in range( 0, 256): + data += '%c' % c + + return data + +def main(): + + baudrate = 19200 + + devname = "" + + try: + opt,arg = getopt.getopt(sys.argv[1:], + 'b:d:', + ['baudrate=', + 'device=' + ]) + + except getopt.GetoptError: + print "usage: protocol.py [options]\n"\ + "\t-b baudrate\n"\ + "\t--baudrate=baudrate"\ + "\t-d device\n"\ + "\t--device=serial device name like /dev/ttyS0 or COM1\n"\ + "\t-h\n"\ + "\t--help print this\n"\ + "\n" + sys.exit(0) + + for o,a in opt: + + if o in ("-b","--baudrate"): + + baudrate = int(a) + + if o in ("-d","--device"): + + devname = a + + print "Using ctb version " + ctb.GetVersion() + + dev = ctb.SerialPort() + + protocols = [ + '8N1','8O1','8E1','8S1','8M1' + ] + + dev.SetTimeout( 1000 ) + + for protocol in protocols: + + if dev.Open( devname, baudrate, protocol ) < 0: + + print "Cannot open " + devname + "\n" + + sys.exit( 1 ) + + else: + + print( "%i %s" % ( baudrate, protocol ) ) + + for i in range(0, 4 ): + + dev.Writev( "\x33" ) + + time.sleep( 0.0006 ) + + dev.Writev( "\x31" ) + + time.sleep( 0.0006 ) + + time.sleep( 0.5 ) + + dev.Close() + + +main() + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/samples/rtsdtr.py b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/samples/rtsdtr.py new file mode 100755 index 0000000000..e67a9ffd3b --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/samples/rtsdtr.py @@ -0,0 +1,53 @@ +#!/usr/bin/python + +import getopt, time, sys + +sys.path.insert( 0, r'/home/jb/project/libctb-0.16/python/module/linux') + +import ctb + +def main(): + + devname = "" + + try: + opt,arg = getopt.getopt(sys.argv[1:], + 'd:', + ['device=' + ]) + + except getopt.GetoptError: + print "usage: parity.py [options]\n"\ + "\t-d device\n"\ + "\t--device=serial device name like /dev/ttyS0 or COM1\n"\ + "\t-h\n"\ + "\t--help print this\n"\ + "\n" + sys.exit(0) + + for o,a in opt: + + if o in ("-d","--device"): + + devname = a + + print "Using ctb version " + ctb.GetVersion() + + dev = ctb.SerialPort() + + if dev.Open( devname, 38400 ) < 0: + + print "Cannot open " + devname + "\n" + + dev.SetLineState( ctb.DTR ) + + dev.ClrLineState( ctb.RTS ) + + for i in range( 0, 100 ) : + + time.sleep( 0.01 ) + + dev.ChangeLineState( ctb.DTR | ctb.RTS ) + +main() + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/ctb.html b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/ctb.html new file mode 100644 index 0000000000..7a5732fa9b --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/ctb.html @@ -0,0 +1,353 @@ + + +Python: module ctb + + + + +
 
+ 
ctb
index
/mnt/s/wxaddons/wxctb-0.9/SWIG/ctb.py
+

+

+ + + + + +
 
+Modules
       
re
+
sys
+
wxctb
+

+ + + + + +
 
+Classes
       
+
wxIOBase +
+
+
wxGPIB +
wxSerialPort +
+
+
+

+ + + + + + + +
 
+class wxGPIB(wxIOBase)
   wxGPIB class
 
 Methods defined here:
+
GetError(self)
+ +
GetSTB(self)
Returns the value of the internal GPIB status byte register.
+ +
Ibrd(self, length)
# This is only for internal usage!!!
+ +
Ibwrt(self, string)
# This is only for internal usage!!!
+ +
Open(self, devname, adr)
Open(gpibdevice,address)
+Opens a connected device at the GPIB bus. gpibdevice means the
+controller, (mostly "gpib1"), address the address of the desired
+device in the range 1...31. For example:
+dev = wxGPIB()
+dev.Open("gpib1",17)
+Opens the device with the address 17.
+Open returns >= 0 or a negativ value, if something going wrong.
+ +
Reset(self)
Resets the connected device. In the GPIB definition, the device
+should be reset to it's initial state, so you can restart a
+formely lost communication.
+ +
ResetBus(self)
The command asserts the GPIB interface clear (IFC) line for
+ast least 100us if the GPIB board is the system controller.
+This initializes the GPIB and makes the interface CIC and
+active controller with ATN asserted.
+Note! The IFC signal resets only the GPIB interface functions
+of the bus devices and not the internal device functions.
+For a device reset you should use the Reset() command above.
+ +
__del__(self)
+ +
__init__(self)
+ +
+Methods inherited from wxIOBase:
+
Close(self)
+ +
GetTimeout(self)
Returns the internal timeout value in milliseconds
+ +
Ioctl(self, cmd, arg)
+ +
PutBack(self, char)
+ +
Read(self, length)
Try to read the given count of data (length) and returns the
+successfully readed number of data. The function never blocks.
+For example:
+readed = dev.Read(100)
+ +
ReadBinary(self, eos='\n')
Special SCPI command. Read the next data coded as a SCPI
+binary format.
+A binary data transfer will be startet by '#'. The next byte
+tells the count of bytes for the binary length header,
+following by the length bytes. After these the data begins.
+For example:
+#500004xxxx
+The header length covers 5 Byte, the length of the binary
+data is 4 (x means the binary data bytes)
+ +
ReadUntilEOS(self, eos='\n', quota=0)
ReadUntilEOS(eosString="\n",timeout=1000)
+Reads data until the given eos string was received (default is
+the linefeed character (0x0a) or the internal timeout
+(default 1000ms) was reached.
+ReadUntilEOS returns the result as the following tuple:
+['received string',state,readedBytes]
+If a timeout occurred, state is 0, otherwise 1
+ +
Readv(self, length)
Try to read the given count of data. Readv blocks until all data
+was readed successfully or the internal timeout, set with the
+class member function SetTimeout(timeout), was reached.
+Returns the readed data.
+ +
SetTimeout(self, timeout)
Set the internal timeout value in milliseconds for all blocked
+operations like ReadUntilEOS, Readv and Writev.
+ +
Write(self, string)
Writes the given string to the device and returns immediately.
+Write returns the number of data bytes successfully written or a
+negativ number if an error occured. For some circumstances, not
+the complete string was written.
+So you have to verify the return value to check this out.
+ +
Writev(self, string)
Writes the given string to the device. The function blocks until
+the complete string was written or the internal timeout, set with
+SetTimeout(timeout), was reached.
+Writev returns the number of data successfully written or a
+negativ value, if an errors occurred.
+ +

+ + + + + +
 
+class wxIOBase
    Methods defined here:
+
Close(self)
+ +
GetTimeout(self)
Returns the internal timeout value in milliseconds
+ +
Ioctl(self, cmd, arg)
+ +
Open(self)
+ +
PutBack(self, char)
+ +
Read(self, length)
Try to read the given count of data (length) and returns the
+successfully readed number of data. The function never blocks.
+For example:
+readed = dev.Read(100)
+ +
ReadBinary(self, eos='\n')
Special SCPI command. Read the next data coded as a SCPI
+binary format.
+A binary data transfer will be startet by '#'. The next byte
+tells the count of bytes for the binary length header,
+following by the length bytes. After these the data begins.
+For example:
+#500004xxxx
+The header length covers 5 Byte, the length of the binary
+data is 4 (x means the binary data bytes)
+ +
ReadUntilEOS(self, eos='\n', quota=0)
ReadUntilEOS(eosString="\n",timeout=1000)
+Reads data until the given eos string was received (default is
+the linefeed character (0x0a) or the internal timeout
+(default 1000ms) was reached.
+ReadUntilEOS returns the result as the following tuple:
+['received string',state,readedBytes]
+If a timeout occurred, state is 0, otherwise 1
+ +
Readv(self, length)
Try to read the given count of data. Readv blocks until all data
+was readed successfully or the internal timeout, set with the
+class member function SetTimeout(timeout), was reached.
+Returns the readed data.
+ +
ResetBus(self)
If the underlaying interface needs some special reset operations
+(for instance the GPIB distinguish between a normal device reset
+and a special bus reset), you can put some code here)
+ +
SetTimeout(self, timeout)
Set the internal timeout value in milliseconds for all blocked
+operations like ReadUntilEOS, Readv and Writev.
+ +
Write(self, string)
Writes the given string to the device and returns immediately.
+Write returns the number of data bytes successfully written or a
+negativ number if an error occured. For some circumstances, not
+the complete string was written.
+So you have to verify the return value to check this out.
+ +
Writev(self, string)
Writes the given string to the device. The function blocks until
+the complete string was written or the internal timeout, set with
+SetTimeout(timeout), was reached.
+Writev returns the number of data successfully written or a
+negativ value, if an errors occurred.
+ +
__del__(self)
+ +
__init__(self)
+ +

+ + + + + +
 
+class wxSerialPort(wxIOBase)
    Methods defined here:
+
ChangeLineState(self, lineState)
Change (toggle) the state of each the lines given in the
+linestate parameter. Possible values are wxSERIAL_LINESTATE_DTR
+(means the DTR signal) and/or wxSERIAL_LINESTATE_RTS (RTS signal).
+For example to toggle the RTS line only:
+dev.ChangeLineState(wxSERIAL_LINESTATE_RTS)
+ +
ClrLineState(self, lineState)
Clear the lines given in the linestate parameter. Possible
+values are wxSERIAL_LINESTATE_DTR (means the DTR signal) and/or
+wxSERIAL_LINESTATE_RTS (RTS signal). For example to clear only
+the RTS line:
+dev.ClrLineState(wxSERIAL_LINESTATE_RTS)
+ +
GetAvailableBytes(self)
Returns the available bytes in the input queue of the serial
+driver.
+ +
GetCommErrors(self)
Get the internal communication errors like breaks, framing,
+parity or overrun errors.
+Returns the count of each error as a tuple like this:
+(b,f,o,p) = dev.GetCommErrors()
+b: breaks, f: framing errors,  o: overruns, p: parity errors
+ +
GetLineState(self)
Returns the current linestates of the CTS, DCD, DSR and RING
+signal line as an integer value with the appropriate bits or
+-1 on error.
+For example:
+lines = dev.GetLineState()
+if lines & wxSERIAL_LINESTATE_CTS:
+    print "CTS is on"
+ +
Open(self, devname, baudrate, protocol='8N1', handshake='no_handshake')
Open the device devname with the given baudrate, the protocol
+like '8N1' (default) and the use of the handshake [no_handshake
+(default), rtscts or xonxoff]
+For example:
+At Linux:
+dev = wxSerialPort()
+dev.Open("/dev/ttyS0",115200)
+or with a datalen of 7 bits, even parity, 2 stopbits and rts/cts
+handshake:
+dev.Open("/dev/ttyS0",115200,'7E2',True)
+At Windows:
+dev = wxSerialPort()
+dev.Open("COM1",115200)
+dev.Open("COM1",115200,'7E2',True)
+Returns the handle on success or a negativ value on failure.
+ +
Reset(self)
Send a break for 0.25s.
+ +
SetBaudRate(self, baudrate)
Set the baudrate for the device.
+ +
SetLineState(self, lineState)
Set the lines given in the linestate parameter. Possible
+values are wxSERIAL_LINESTATE_DTR (means the DTR signal) and/or
+wxSERIAL_LINESTATE_RTS (RTS signal). For example to set both:
+dev.SetLineState(wxSERIAL_LINESTATE_DTR | wxSERIAL_LINESTATE_RTS)
+ +
__del__(self)
+ +
__init__(self)
+ +
+Methods inherited from wxIOBase:
+
Close(self)
+ +
GetTimeout(self)
Returns the internal timeout value in milliseconds
+ +
Ioctl(self, cmd, arg)
+ +
PutBack(self, char)
+ +
Read(self, length)
Try to read the given count of data (length) and returns the
+successfully readed number of data. The function never blocks.
+For example:
+readed = dev.Read(100)
+ +
ReadBinary(self, eos='\n')
Special SCPI command. Read the next data coded as a SCPI
+binary format.
+A binary data transfer will be startet by '#'. The next byte
+tells the count of bytes for the binary length header,
+following by the length bytes. After these the data begins.
+For example:
+#500004xxxx
+The header length covers 5 Byte, the length of the binary
+data is 4 (x means the binary data bytes)
+ +
ReadUntilEOS(self, eos='\n', quota=0)
ReadUntilEOS(eosString="\n",timeout=1000)
+Reads data until the given eos string was received (default is
+the linefeed character (0x0a) or the internal timeout
+(default 1000ms) was reached.
+ReadUntilEOS returns the result as the following tuple:
+['received string',state,readedBytes]
+If a timeout occurred, state is 0, otherwise 1
+ +
Readv(self, length)
Try to read the given count of data. Readv blocks until all data
+was readed successfully or the internal timeout, set with the
+class member function SetTimeout(timeout), was reached.
+Returns the readed data.
+ +
ResetBus(self)
If the underlaying interface needs some special reset operations
+(for instance the GPIB distinguish between a normal device reset
+and a special bus reset), you can put some code here)
+ +
SetTimeout(self, timeout)
Set the internal timeout value in milliseconds for all blocked
+operations like ReadUntilEOS, Readv and Writev.
+ +
Write(self, string)
Writes the given string to the device and returns immediately.
+Write returns the number of data bytes successfully written or a
+negativ number if an error occured. For some circumstances, not
+the complete string was written.
+So you have to verify the return value to check this out.
+ +
Writev(self, string)
Writes the given string to the device. The function blocks until
+the complete string was written or the internal timeout, set with
+SetTimeout(timeout), was reached.
+Writev returns the number of data successfully written or a
+negativ value, if an errors occurred.
+ +

+ + + + + +
 
+Functions
       
GetKey()
Returns the current pressed key or '', if no key is pressed.
+You can simply create a query loop with:
+while GetKey() == '':
+    ... make some stuff ...
+
abstract()
+

+ + + + + +
 
+Data
       wxSERIAL_LINESTATE_CTS = 32
+wxSERIAL_LINESTATE_DCD = 64
+wxSERIAL_LINESTATE_DSR = 256
+wxSERIAL_LINESTATE_DTR = 2
+wxSERIAL_LINESTATE_NULL = 0
+wxSERIAL_LINESTATE_RING = 128
+wxSERIAL_LINESTATE_RTS = 4
+ \ No newline at end of file diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/ctb.py b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/ctb.py new file mode 100644 index 0000000000..6b541ffe39 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/ctb.py @@ -0,0 +1,455 @@ +import wxctb, sys, re + +DCD = wxctb.LinestateDcd +CTS = wxctb.LinestateCts +DSR = wxctb.LinestateDsr +DTR = wxctb.LinestateDtr +RING = wxctb.LinestateRing +RTS = wxctb.LinestateRts +NULL = wxctb.LinestateNull + +def abstract(): + import inspect + caller = inspect.getouterframes(inspect.currentframe())[1][3] + raise NotImplementedError(caller + ' must be implemented in subclass') + +class IOBase: + def __init__(self): + self.device = None + # set timeout to 1000ms (the default) + self.timeout = 1000 + + def __del__(self): + pass + + def Close(self): + if self.device: + self.device.Close() + + def GetTimeout(self): + """ + Returns the internal timeout value in milliseconds + """ + return self.timeout + + def Ioctl(self,cmd,arg): + if self.device: + self.device.Ioctl(cmd,arg) + + def Open(self): + abstract() + + def PutBack(self,char): + return self.device.PutBack(char) + + def Read(self,length): + """ + Try to read the given count of data (length) and returns the + successfully readed number of data. The function never blocks. + For example: + readed = dev.Read(100) + """ + buf = "\x00"*(length+1) + rd = self.device.Read(buf,length) + return buf[0:rd] + + def ReadBinary(self,eos="\n"): + """ + Special SCPI command. Read the next data coded as a SCPI + binary format. + A binary data transfer will be startet by '#'. The next byte + tells the count of bytes for the binary length header, + following by the length bytes. After these the data begins. + For example: + #500004xxxx + The header length covers 5 Byte, the length of the binary + data is 4 (x means the binary data bytes) + """ + try: + eoslen = len(eos) + b=self.Readv(2) + if len(b) == 2: + hl = int(b[1]) + b = self.Readv(hl) + if len(b) == hl: + dl = int(b) + # don't left over the eos string or character in the + # device input buffer + data = self.Readv(dl+eoslen) + # check, if the binary data block is complete + if data[dl] == '#': + # not complete, another block is following + for c in data[dl:dl+eoslen]: + self.PutBack(c) + + data = data[:dl] + self.ReadBinary() + return data + except: + pass + return '' + + def ReadUntilEOS(self,eos="\n",quota=0): + """ + ReadUntilEOS(eosString=\"\\n\",timeout=1000) + Reads data until the given eos string was received (default is + the linefeed character (0x0a) or the internal timeout + (default 1000ms) was reached. + ReadUntilEOS returns the result as the following tuple: + ['received string',state,readedBytes] + If a timeout occurred, state is 0, otherwise 1 + """ + return self.device.ReadUntilEOS("",0,eos,self.timeout,quota) + + def Readv(self,length): + """ + Try to read the given count of data. Readv blocks until all data + was readed successfully or the internal timeout, set with the + class member function SetTimeout(timeout), was reached. + Returns the readed data. + """ + buf = "\x00"*length + rd = self.device.Readv(buf,length,self.timeout) + return buf[0:rd] + + def ResetBus(self): + """ + If the underlaying interface needs some special reset operations + (for instance the GPIB distinguish between a normal device reset + and a special bus reset), you can put some code here) + """ + pass + + def SetTimeout(self,timeout): + """ + Set the internal timeout value in milliseconds for all blocked + operations like ReadUntilEOS, Readv and Writev. + """ + self.timeout = timeout + + def Write(self,string): + """ + Writes the given string to the device and returns immediately. + Write returns the number of data bytes successfully written or a + negativ number if an error occured. For some circumstances, not + the complete string was written. + So you have to verify the return value to check this out. + """ + return self.device.Write(string,len(string)) + + def Writev(self,string): + """ + Writes the given string to the device. The function blocks until + the complete string was written or the internal timeout, set with + SetTimeout(timeout), was reached. + Writev returns the number of data successfully written or a + negativ value, if an errors occurred. + """ + return self.device.Writev(string,len(string),self.timeout) + +class SerialPort(IOBase): + def __init__(self): + IOBase.__init__(self) + + def __del__(self): + self.Close() + + def ChangeLineState(self,lineState): + """ + Change (toggle) the state of each the lines given in the + linestate parameter. Possible values are DTR and/or RTS. + For example to toggle the RTS line only: + dev.ChangeLineState(RTS) + """ + self.device.ChangeLineState(lineState) + + def ClrLineState(self,lineState): + """ + Clear the lines given in the linestate parameter. Possible + values are DTR and/or RTS. For example to clear only + the RTS line: + dev.ClrLineState(RTS) + """ + self.device.ClrLineState(lineState) + + def GetAvailableBytes(self): + """ + Returns the available bytes in the input queue of the serial + driver. + """ + n = wxctb.new_intp() + wxctb.intp_assign(n, 0) + self.device.Ioctl(wxctb.CTB_SER_GETINQUE,n) + return wxctb.intp_value(n) + + def GetCommErrors(self): + """ + Get the internal communication errors like breaks, framing, + parity or overrun errors. + Returns the count of each error as a tuple like this: + (b,f,o,p) = dev.GetCommErrors() + b: breaks, f: framing errors, o: overruns, p: parity errors + """ + einfo = wxctb.SerialPort_EINFO() + self.device.Ioctl(wxctb.CTB_SER_GETEINFO,einfo) + return einfo.brk,einfo.frame,einfo.overrun,einfo.parity + + def GetLineState(self): + """ + Returns the current linestates of the CTS, DCD, DSR and RING + signal line as an integer value with the appropriate bits or + -1 on error. + For example: + lines = dev.GetLineState() + if lines & CTS: + print \"CTS is on\" + """ + return self.device.GetLineState() + + def Open(self,devname,baudrate,protocol='8N1',handshake='no_handshake'): + """ + Open the device devname with the given baudrate, the protocol + like '8N1' (default) and the use of the handshake [no_handshake + (default), rtscts or xonxoff] + For example: + At Linux: + dev = SerialPort() + dev.Open(\"/dev/ttyS0\",115200) + or with a datalen of 7 bits, even parity, 2 stopbits and rts/cts + handshake: + dev.Open(\"/dev/ttyS0\",115200,'7E2',True) + At Windows: + dev = SerialPort() + dev.Open(\"COM1\",115200) + dev.Open(\"COM1\",115200,'7E2',True) + Returns the handle on success or a negativ value on failure. + """ + # the following parity values are valid: + # N:None, O:Odd, E:Even, M:Mark, S:Space + parity = {'N':0,'O':1,'E':2,'M':3,'S':4} + # the regular expression ensures a valid value for the datalen + # (5...8 bit) and the count of stopbits (1,2) + reg=re.compile(r"(?P[8765])"r"(?P

[NOEMS])"r"(?P[12])") + self.device = wxctb.SerialPort() + dcs = wxctb.SerialPort_DCS() + dcs.baud = baudrate + res = reg.search(protocol) + # handle the given protocol + if res: + dcs.wordlen = int(res.group('w')) + dcs.stopbits = int(res.group('s')) + dcs.parity = parity[res.group('p')] + # valid handshake are no one, rts/cts or xon/xoff + if handshake == 'rtscts': + dcs.rtscts = True + elif handshake == 'xonxoff': + dcs.xonxoff = True + + return self.device.Open(devname,dcs) + + def Reset(self): + """ + Send a break for 0.25s. + """ + self.device.SendBreak(0) + + def SetBaudrate(self,baudrate): + """ + Set the baudrate for the device. + """ + self.device.SetBaudrate(baudrate) + + def SetLineState(self,lineState): + """ + Set the lines given in the linestate parameter. Possible + values are DTR and/or RTS. For example to set both: + dev.SetLineState( DTR | RTS) + """ + self.device.SetLineState(lineState) + + def SetParityBit(self,parity): + """ + Set the parity bit explicitly to 0 or 1. Use this function, if + you would like to simulate a 9 bit wordlen at what the ninth bit + was represented by the parity bit value. For example: + dev.SetParityBit( 0 ) + dev.Write('some data sent with parity 0') + dev.SetParityBit( 1 ) + dev.Write('another sequence with parity 1') + """ + return self.device.SetParityBit( parity ) + +class GpibDevice(IOBase): + """ + GPIB class + """ + def __init__(self): + IOBase.__init__(self) + + def __del__(self): + self.Close() + + def FindListeners(self,board = 0): + """ + Returns the address of the connected devices as a list. + If no device is listening, the list is empty. If an error + occurs an IOError exception raised. For example: + g = GPIB() + listeners = g.FindListeners() + """ + listeners = wxctb.GPIB_x_FindListeners(board) + if listeners < 0: + raise IOError("GPIB board error") + result = [] + for i in range(1,31): + if listeners & (1 << i): + result.append(i) + return result + + def GetEosChar(self): + """ + Get the internal EOS termination character (see SetEosChar). + For example: + g = GPIB() + g.Open(\"gpib1\",1) + eos = g.GetEosChar() + """ + eos = wxctb.new_intp() + wxctb.intp_assign(eos, 0) + self.device.Ioctl(wxctb.CTB_GPIB_GET_EOS_CHAR,eos) + return wxctb.intp_value(eos) + + def GetEosMode(self): + """ + Get the internal EOS mode (see SetEosMode). + For example: + g = GPIB() + g.Open(\"gpib1\",1) + eos = g.GetEosMode() + """ + mode = wxctb.new_intp() + wxctb.intp_assign(mode, 0) + self.device.Ioctl(wxctb.CTB_GPIB_GET_EOS_MODE,mode) + return wxctb.intp_value(mode) + + def GetError(self): + errorString = " "*256 + self.device.GetError(errorString,256) + return errorString + + def GetSTB(self): + """ + Returns the value of the internal GPIB status byte register. + """ + stb = wxctb.new_intp() + wxctb.intp_assign(stb, 0) + self.device.Ioctl(wxctb.CTB_GPIB_GETRSP,stb) + return wxctb.intp_value(stb) + + # This is only for internal usage!!! + def Ibrd(self,length): + buf = "\x00"*length + state = self.device.Ibrd(buf,length) + return state,buf + + # This is only for internal usage!!! + def Ibwrt(self,string): + return self.device.Ibwrt(string,len(string)) + + def Open(self,devname,adr,eosChar=10,eosMode=0x08|0x04): + """ + Open(gpibdevice,address,eosChar,eosMode) + Opens a connected device at the GPIB bus. gpibdevice means the + controller, (mostly \"gpib1\"), address the address of the desired + device in the range 1...31. The eosChar defines the EOS character + (default is linefeed), eosMode may be a combination of bits ORed + together. The following bits can be used: + 0x04: Terminate read when EOS is detected. + 0x08: Set EOI (End or identify line) with EOS on write function + 0x10: Compare all 8 bits of EOS byte rather than low 7 bits + (all read and write functions). Default is 0x12 + For example: + dev = GPIB() + dev.Open(\"gpib1\",17) + Opens the device with the address 17, linefeed as EOS (default) + and eos mode with 0x04 and 0x08. + Open returns >= 0 or a negativ value, if something going wrong. + """ + self.device = wxctb.GpibDevice() + dcs = wxctb.Gpib_DCS() + dcs.m_address1 = adr + dcs.m_eosChar = eosChar + dcs.m_eosMode = eosMode + result = self.device.Open(devname,dcs) + return result + + def Reset(self): + """ + Resets the connected device. In the GPIB definition, the device + should be reset to it's initial state, so you can restart a + formely lost communication. + """ + self.device.Ioctl(wxctb.CTB_RESET,None) + + def ResetBus(self): + """ + The command asserts the GPIB interface clear (IFC) line for + ast least 100us if the GPIB board is the system controller. + This initializes the GPIB and makes the interface CIC and + active controller with ATN asserted. + Note! The IFC signal resets only the GPIB interface functions + of the bus devices and not the internal device functions. + For a device reset you should use the Reset() command above. + """ + self.device.Ioctl(wxctb.CTB_GPIB_RESET_BUS,None) + + def SetEosChar(self,eos): + """ + Configure the end-of-string (EOS) termination character. + Note! Defining an EOS byte does not cause the driver to + automatically send that byte at the end of write I/O + operations. The application is responsible for placing the + EOS byte at the end of the data strings that it defines. + (National Instruments NI-488.2M Function Reference Manual) + For example: + g = GPIB() + g.Open(\"gpib1\",1) + eos = g.GetEosChar(0x10) + """ + intp = wxctb.new_intp() + wxctb.intp_assign(intp, eos) + return self.device.Ioctl(wxctb.CTB_GPIB_SET_EOS_CHAR,intp) + + def SetEosMode(self,mode): + """ + Set the EOS mode (handling).m_eosMode may be a combination + of bits ORed together. The following bits can be used: + 0x04: Terminate read when EOS is detected. + 0x08: Set EOI (End or identify line) with EOS on write function + 0x10: Compare all 8 bits of EOS byte rather than low 7 bits + (all read and write functions). For example: + g = GPIB() + g.Open(\"gpib1\",1) + eos = g.GetEosMode(0x04 | 0x08) + """ + intp = wxctb.new_intp() + wxctb.intp_assign(intp, mode) + return self.device.Ioctl(wxctb.CTB_GPIB_SET_EOS_MODE,intp) + +def GetKey(): + """ + Returns the current pressed key or '\0', if no key is pressed. + You can simply create a query loop with: + while GetKey() == '\0': + ... make some stuff ... + + """ + return wxctb.GetKey() + +def GetVersion(): + """ + Returns the version of the ctb python module. The numbering + has the following format: x.y.z + x.y means the version of the underlaying ctb lib, z the version + of the python port. + """ + return "0.16" diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/gpib.i b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/gpib.i new file mode 100644 index 0000000000..752ecd3a18 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/gpib.i @@ -0,0 +1,96 @@ +%{ +#include "ctb-0.16/gpib.h" +%} + +%include iobase.i + +namespace ctb { + +%typemap(in) void * dcs (Gpib_DCS tmp) { + /* dont check for list */ + $1 = &tmp; +} + +enum GpibTimeout +{ + GpibTimeoutNONE = 0, + GpibTimeout10us, + GpibTimeout30us, + GpibTimeout100us, + GpibTimeout300us, + GpibTimeout1ms, + GpibTimeout3ms, + GpibTimeout10ms, + GpibTimeout30ms, + GpibTimeout100ms, + GpibTimeout300ms, + GpibTimeout1s, + GpibTimeout3s, + GpibTimeout10s, + GpibTimeout30s, + GpibTimeout100s, + GpibTimeout300s, + GpibTimeout1000s +}; + +struct Gpib_DCS +{ + int m_address1; + int m_address2; + GpibTimeout m_timeout; + bool m_eot; + unsigned char m_eosChar; + unsigned char m_eosMode; + Gpib_DCS(); + ~Gpib_DCS(); + char* GetSettings(); +}; + +enum { + CTB_GPIB_SETADR = CTB_GPIB, + CTB_GPIB_GETRSP, + CTB_GPIB_GETSTA, + CTB_GPIB_GETERR, + CTB_GPIB_GETLINES, + CTB_GPIB_SETTIMEOUT, + CTB_GPIB_GTL, + CTB_GPIB_REN, + CTB_GPIB_RESET_BUS, + CTB_GPIB_SET_EOS_CHAR, + CTB_GPIB_GET_EOS_CHAR, + CTB_GPIB_SET_EOS_MODE, + CTB_GPIB_GET_EOS_MODE +}; + +class GpibDevice : public IOBase +{ +protected: + int m_board; + int m_hd; + int m_state; + int m_error; + int m_count; + int m_asyncio; + Gpib_DCS m_dcs; + int CloseDevice(); + int OpenDevice(const char* devname, void* dcs); + virtual const char* GetErrorString(int error,bool detailed); +public: + GpibDevice(); + virtual ~GpibDevice(); + const char* ClassName(); + virtual const char* GetErrorDescription(int error); + virtual const char* GetErrorNotation(int error); + virtual char* GetSettingsAsString(); + int Ibrd(char* buf,size_t len); + int Ibwrt(char* buf,size_t len); + virtual int Ioctl(int cmd,void* args); + int IsOpen(); + int Read(char* buf,size_t len); + int Write(char* buf,size_t len); + + static int FindListeners(int board = 0); + +}; + +}; diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/iobase.i b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/iobase.i new file mode 100644 index 0000000000..c6bc452adb --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/iobase.i @@ -0,0 +1,59 @@ +%{ +#include "ctb-0.16/iobase.h" +%} + +namespace ctb { + +enum { + CTB_RESET = CTB_COMMON +}; + +%typemap(in) char *& readbuf (char * tmp) { + /* dont check for list */ + $1 = &tmp; +} + +%typemap(argout) char *& readbuf { + PyObject * plist = PyList_New(2); + PyList_SetItem(plist, 0, PyString_FromString(*$1)); + PyList_SetItem(plist, 1, $result); + $result = plist; + delete *$1; +} + +%typemap(in) size_t * readedBytes (size_t tmp) { + /* dont check for list */ + $1 = &tmp; +} + +%typemap(argout) size_t * readedBytes { + PyList_Append($result, PyInt_FromLong(*$1)); +} + +class IOBase +{ +protected: + virtual int CloseDevice() = 0; + virtual int OpenDevice(const char* devname, void* dcs = 0L) = 0; +public: + IOBase(); + virtual ~IOBase(); + + virtual const char* ClassName(); + int Close(); + virtual int Ioctl(int cmd,void* args); + virtual int IsOpen() = 0; + int Open(const char* devname,void* dcs=0L); + int PutBack(char ch); + virtual int Read(char* buf,size_t len) = 0; + virtual int ReadUntilEOS(char*& readbuf, + size_t* readedBytes, + char* eosString = "\n", + long timeout_in_ms = 1000L, + char quota = 0); + int Readv(char* buf,size_t len,unsigned int timeout_in_ms); + virtual int Write(char* buf,size_t len) = 0; + int Writev(char* buf,size_t len,unsigned int timeout_in_ms); +}; + +}; diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/kbhit.i b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/kbhit.i new file mode 100644 index 0000000000..7e5b6cddd3 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/kbhit.i @@ -0,0 +1,9 @@ +%{ +#include "ctb-0.16/kbhit.h" +%} + +namespace ctb { + +char GetKey(); + +}; diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/makepy.sh b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/makepy.sh new file mode 100755 index 0000000000..40b49dfb2e --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/makepy.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +CFLAG='' +GPIB_SOURCES='' +GPIB_LIB='' +GPIB_SUPPORT='' + +# the python develop version. Please check the right version of your +# python developent enviroment +PYTHON_VERSION='2.6' + +for arg in $*; do + if [ "$arg" = "USE_GPIB" ]; then + GPIB_SOURCES='../../../src/gpib.cpp' + GPIB_LIB='-lgpib' + GPIB_SUPPORT='Yes' + else + echo '============================================================' + echo 'You run makepy.sh without GPIB support.' + echo 'If you want to create the python wxctb library with' + echo 'GPIB support, rerun the command with:' + echo 'makepy.sh USE_GPIB=1' + echo '============================================================' + GPIB_SUPPORT='No' + fi + if [ "$arg" = "USE_DEBUG" ]; then + CFLAG='-g' + fi +done + +echo "// This file is created automatically, don't change it!" > wxctb.i +echo "%module wxctb" >> wxctb.i +echo "typedef int size_t;" >> wxctb.i +echo "%include timer.i" >> wxctb.i +echo "%include serport.i" >> wxctb.i +echo "%include ../kbhit.i" >> wxctb.i +if [ "$arg" = "USE_GPIB" ]; then + echo "%include ../gpib.i" >> wxctb.i +fi + +echo "swig generates python wrapper files..." +swig -c++ -Wall -nodefault -python -keyword -new_repr -modern wxctb.i + +echo "create shared library wxctb with GPIB=$GPIB_SUPPORT for python"\ + "$PYTHON_VERSION ..." +g++ -Wall $CFLAG -shared -I /usr/include/python$PYTHON_VERSION/ \ + -I ../../../include \ + wxctb_wrap.cxx \ + ../../../src/linux/timer.cpp \ + ../../../src/linux/serport.cpp \ + ../../../src/serportx.cpp \ + ../../../src/kbhit.cpp \ + ../../../src/iobase.cpp \ + ../../../src/fifo.cpp \ + $GPIB_SOURCES \ + $GPIB_LIB \ + -o _wxctb.so + +echo "copy ctb.py, wxctb.py and _wxctb.so to the module/linux folder..." +mkdir -p ../../module/linux +cp ../ctb.py ../../module/linux/ +cp wxctb.py ../../module/linux/ +cp _wxctb.so ../../module/linux/ diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/serport.i b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/serport.i new file mode 100644 index 0000000000..3150fe9117 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/serport.i @@ -0,0 +1,50 @@ +%module serport + +%{ +#include "ctb-0.16/linux/serport.h" +%} + +%include ../serportx.i + +namespace ctb { + +%pythoncode { +COM1 = "/dev/ttyS0" +COM2 = "/dev/ttyS1" +COM3 = "/dev/ttyS2" +COM4 = "/dev/ttyS3" +COM5 = "/dev/ttyS4" +COM6 = "/dev/ttyS5" +COM7 = "/dev/ttyS6" +COM8 = "/dev/ttyS7" +COM9 = "/dev/ttyS8" +}; + +class SerialPort : public SerialPort_x +{ +protected: + int fd; + struct termios t, save_t; + struct serial_icounter_struct save_info, last_info; + speed_t AdaptBaudrate(int baud); + + int CloseDevice(); + int OpenDevice(const char* devname, void* dcs); +public: + SerialPort(); + ~SerialPort(); + + int ChangeLineState(SerialLineState flags); + int ClrLineState(SerialLineState flags); + int GetLineState(); + int Ioctl(int cmd,void* args); + int IsOpen(); + int Read(char* buf,size_t len); + int SendBreak(int duration); + int SetBaudrate(int baudrate); + int SetLineState(SerialLineState flags); + int SetParityBit( bool parity ); + int Write(char* buf,size_t len); +}; + +}; diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/timer.i b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/timer.i new file mode 100644 index 0000000000..5709224113 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/timer.i @@ -0,0 +1,37 @@ +%{ +#include "ctb-0.16/linux/timer.h" +%} + +%include cpointer.i + +// lets create new fuctions for pointer handling in python (for int *exitflag) +%pointer_functions(int, intp); + +namespace ctb { + +// perhaps we doesn''t need timer_control to export +// but we need if we want to inherit from timer in python +struct timer_control +{ + unsigned int usecs; + int *exitflag; + void* (*exitfnc)(void*); +}; + +class Timer +{ +protected: + timer_control control; + int stopped; + pthread_t tid; + unsigned int timer_secs; +public: + Timer(unsigned int msec,int* exitflag,void*(*exitfnc)(void*)=NULL); + ~Timer(); + int start(); + int stop(); +}; + +void sleepms(unsigned int ms); + +}; diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/wxctb.i b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/wxctb.i new file mode 100644 index 0000000000..7f84b5fb33 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/wxctb.i @@ -0,0 +1,6 @@ +// This file is created automatically, don't change it! +%module wxctb +typedef int size_t; +%include timer.i +%include serport.i +%include ../kbhit.i diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/wxctb.py b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/wxctb.py new file mode 100644 index 0000000000..f9e0d2ee6e --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/wxctb.py @@ -0,0 +1,264 @@ +# This file was automatically generated by SWIG (http://www.swig.org). +# Version 1.3.40 +# +# Do not make changes to this file unless you know what you are doing--modify +# the SWIG interface file instead. + +from sys import version_info +if version_info >= (2,6,0): + def swig_import_helper(): + from os.path import dirname + import imp + fp = None + try: + fp, pathname, description = imp.find_module('_wxctb', [dirname(__file__)]) + except ImportError: + import _wxctb + return _wxctb + if fp is not None: + try: + _mod = imp.load_module('_wxctb', fp, pathname, description) + finally: + fp.close() + return _mod + _wxctb = swig_import_helper() + del swig_import_helper +else: + import _wxctb +del version_info +try: + _swig_property = property +except NameError: + pass # Python < 2.2 doesn't have 'property'. +def _swig_setattr_nondynamic(self,class_type,name,value,static=1): + if (name == "thisown"): return self.this.own(value) + if (name == "this"): + if type(value).__name__ == 'SwigPyObject': + self.__dict__[name] = value + return + method = class_type.__swig_setmethods__.get(name,None) + if method: return method(self,value) + if (not static) or hasattr(self,name): + self.__dict__[name] = value + else: + raise AttributeError("You cannot add attributes to %s" % self) + +def _swig_setattr(self,class_type,name,value): + return _swig_setattr_nondynamic(self,class_type,name,value,0) + +def _swig_getattr(self,class_type,name): + if (name == "thisown"): return self.this.own() + method = class_type.__swig_getmethods__.get(name,None) + if method: return method(self) + raise AttributeError(name) + +def _swig_repr(self): + try: strthis = "proxy of " + self.this.__repr__() + except: strthis = "" + return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) + +try: + _object = object + _newclass = 1 +except AttributeError: + class _object : pass + _newclass = 0 + + +def _swig_setattr_nondynamic_method(set): + def set_attr(self,name,value): + if (name == "thisown"): return self.this.own(value) + if hasattr(self,name) or (name == "this"): + set(self,name,value) + else: + raise AttributeError("You cannot add attributes to %s" % self) + return set_attr + + + +def new_intp(): + return _wxctb.new_intp() +new_intp = _wxctb.new_intp + +def copy_intp(*args, **kwargs): + return _wxctb.copy_intp(*args, **kwargs) +copy_intp = _wxctb.copy_intp + +def delete_intp(*args, **kwargs): + return _wxctb.delete_intp(*args, **kwargs) +delete_intp = _wxctb.delete_intp + +def intp_assign(*args, **kwargs): + return _wxctb.intp_assign(*args, **kwargs) +intp_assign = _wxctb.intp_assign + +def intp_value(*args, **kwargs): + return _wxctb.intp_value(*args, **kwargs) +intp_value = _wxctb.intp_value +class timer_control(object): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + usecs = _swig_property(_wxctb.timer_control_usecs_get, _wxctb.timer_control_usecs_set) + exitflag = _swig_property(_wxctb.timer_control_exitflag_get, _wxctb.timer_control_exitflag_set) + exitfnc = _swig_property(_wxctb.timer_control_exitfnc_get, _wxctb.timer_control_exitfnc_set) +timer_control_swigregister = _wxctb.timer_control_swigregister +timer_control_swigregister(timer_control) + +class Timer(object): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + __repr__ = _swig_repr + def __init__(self, *args, **kwargs): + this = _wxctb.new_Timer(*args, **kwargs) + try: self.this.append(this) + except: self.this = this + __swig_destroy__ = _wxctb.delete_Timer + __del__ = lambda self : None; + def start(self): return _wxctb.Timer_start(self) + def stop(self): return _wxctb.Timer_stop(self) +Timer_swigregister = _wxctb.Timer_swigregister +Timer_swigregister(Timer) + + +def sleepms(*args, **kwargs): + return _wxctb.sleepms(*args, **kwargs) +sleepms = _wxctb.sleepms +CTB_RESET = _wxctb.CTB_RESET +class IOBase(object): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _wxctb.delete_IOBase + __del__ = lambda self : None; + def ClassName(self): return _wxctb.IOBase_ClassName(self) + def Close(self): return _wxctb.IOBase_Close(self) + def Ioctl(self, *args, **kwargs): return _wxctb.IOBase_Ioctl(self, *args, **kwargs) + def IsOpen(self): return _wxctb.IOBase_IsOpen(self) + def Open(self, *args, **kwargs): return _wxctb.IOBase_Open(self, *args, **kwargs) + def PutBack(self, *args, **kwargs): return _wxctb.IOBase_PutBack(self, *args, **kwargs) + def Read(self, *args, **kwargs): return _wxctb.IOBase_Read(self, *args, **kwargs) + def ReadUntilEOS(self, *args, **kwargs): return _wxctb.IOBase_ReadUntilEOS(self, *args, **kwargs) + def Readv(self, *args, **kwargs): return _wxctb.IOBase_Readv(self, *args, **kwargs) + def Write(self, *args, **kwargs): return _wxctb.IOBase_Write(self, *args, **kwargs) + def Writev(self, *args, **kwargs): return _wxctb.IOBase_Writev(self, *args, **kwargs) +IOBase_swigregister = _wxctb.IOBase_swigregister +IOBase_swigregister(IOBase) + +ParityNone = _wxctb.ParityNone +ParityOdd = _wxctb.ParityOdd +ParityEven = _wxctb.ParityEven +ParityMark = _wxctb.ParityMark +ParitySpace = _wxctb.ParitySpace +LinestateDcd = _wxctb.LinestateDcd +LinestateCts = _wxctb.LinestateCts +LinestateDsr = _wxctb.LinestateDsr +LinestateDtr = _wxctb.LinestateDtr +LinestateRing = _wxctb.LinestateRing +LinestateRts = _wxctb.LinestateRts +LinestateNull = _wxctb.LinestateNull +class SerialPort_DCS(object): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + __repr__ = _swig_repr + baud = _swig_property(_wxctb.SerialPort_DCS_baud_get, _wxctb.SerialPort_DCS_baud_set) + parity = _swig_property(_wxctb.SerialPort_DCS_parity_get, _wxctb.SerialPort_DCS_parity_set) + wordlen = _swig_property(_wxctb.SerialPort_DCS_wordlen_get, _wxctb.SerialPort_DCS_wordlen_set) + stopbits = _swig_property(_wxctb.SerialPort_DCS_stopbits_get, _wxctb.SerialPort_DCS_stopbits_set) + rtscts = _swig_property(_wxctb.SerialPort_DCS_rtscts_get, _wxctb.SerialPort_DCS_rtscts_set) + xonxoff = _swig_property(_wxctb.SerialPort_DCS_xonxoff_get, _wxctb.SerialPort_DCS_xonxoff_set) + buf = _swig_property(_wxctb.SerialPort_DCS_buf_get, _wxctb.SerialPort_DCS_buf_set) + def __init__(self): + this = _wxctb.new_SerialPort_DCS() + try: self.this.append(this) + except: self.this = this + __swig_destroy__ = _wxctb.delete_SerialPort_DCS + __del__ = lambda self : None; + def GetSettings(self): return _wxctb.SerialPort_DCS_GetSettings(self) +SerialPort_DCS_swigregister = _wxctb.SerialPort_DCS_swigregister +SerialPort_DCS_swigregister(SerialPort_DCS) + +class SerialPort_EINFO(object): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + __repr__ = _swig_repr + brk = _swig_property(_wxctb.SerialPort_EINFO_brk_get, _wxctb.SerialPort_EINFO_brk_set) + frame = _swig_property(_wxctb.SerialPort_EINFO_frame_get, _wxctb.SerialPort_EINFO_frame_set) + overrun = _swig_property(_wxctb.SerialPort_EINFO_overrun_get, _wxctb.SerialPort_EINFO_overrun_set) + parity = _swig_property(_wxctb.SerialPort_EINFO_parity_get, _wxctb.SerialPort_EINFO_parity_set) + def __init__(self): + this = _wxctb.new_SerialPort_EINFO() + try: self.this.append(this) + except: self.this = this + __swig_destroy__ = _wxctb.delete_SerialPort_EINFO + __del__ = lambda self : None; +SerialPort_EINFO_swigregister = _wxctb.SerialPort_EINFO_swigregister +SerialPort_EINFO_swigregister(SerialPort_EINFO) + +CTB_SER_GETEINFO = _wxctb.CTB_SER_GETEINFO +CTB_SER_GETBRK = _wxctb.CTB_SER_GETBRK +CTB_SER_GETFRM = _wxctb.CTB_SER_GETFRM +CTB_SER_GETOVR = _wxctb.CTB_SER_GETOVR +CTB_SER_GETPAR = _wxctb.CTB_SER_GETPAR +CTB_SER_GETINQUE = _wxctb.CTB_SER_GETINQUE +CTB_SER_SETPAR = _wxctb.CTB_SER_SETPAR +class SerialPort_x(IOBase): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _wxctb.delete_SerialPort_x + __del__ = lambda self : None; + def ClassName(self): return _wxctb.SerialPort_x_ClassName(self) + def ChangeLineState(self, *args, **kwargs): return _wxctb.SerialPort_x_ChangeLineState(self, *args, **kwargs) + def ClrLineState(self, *args, **kwargs): return _wxctb.SerialPort_x_ClrLineState(self, *args, **kwargs) + def GetLineState(self): return _wxctb.SerialPort_x_GetLineState(self) + def GetSettingsAsString(self): return _wxctb.SerialPort_x_GetSettingsAsString(self) + def Ioctl(self, *args, **kwargs): return _wxctb.SerialPort_x_Ioctl(self, *args, **kwargs) + def SendBreak(self, *args, **kwargs): return _wxctb.SerialPort_x_SendBreak(self, *args, **kwargs) + def SetBaudrate(self, *args, **kwargs): return _wxctb.SerialPort_x_SetBaudrate(self, *args, **kwargs) + def SetLineState(self, *args, **kwargs): return _wxctb.SerialPort_x_SetLineState(self, *args, **kwargs) + def SetParityBit(self, *args, **kwargs): return _wxctb.SerialPort_x_SetParityBit(self, *args, **kwargs) + IsStandardRate = staticmethod(_wxctb.SerialPort_x_IsStandardRate) +SerialPort_x_swigregister = _wxctb.SerialPort_x_swigregister +SerialPort_x_swigregister(SerialPort_x) + +def SerialPort_x_IsStandardRate(*args, **kwargs): + return _wxctb.SerialPort_x_IsStandardRate(*args, **kwargs) +SerialPort_x_IsStandardRate = _wxctb.SerialPort_x_IsStandardRate + +COM1 = "/dev/ttyS0" +COM2 = "/dev/ttyS1" +COM3 = "/dev/ttyS2" +COM4 = "/dev/ttyS3" +COM5 = "/dev/ttyS4" +COM6 = "/dev/ttyS5" +COM7 = "/dev/ttyS6" +COM8 = "/dev/ttyS7" +COM9 = "/dev/ttyS8" + +class SerialPort(SerialPort_x): + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + __repr__ = _swig_repr + def __init__(self): + this = _wxctb.new_SerialPort() + try: self.this.append(this) + except: self.this = this + __swig_destroy__ = _wxctb.delete_SerialPort + __del__ = lambda self : None; + def ChangeLineState(self, *args, **kwargs): return _wxctb.SerialPort_ChangeLineState(self, *args, **kwargs) + def ClrLineState(self, *args, **kwargs): return _wxctb.SerialPort_ClrLineState(self, *args, **kwargs) + def GetLineState(self): return _wxctb.SerialPort_GetLineState(self) + def Ioctl(self, *args, **kwargs): return _wxctb.SerialPort_Ioctl(self, *args, **kwargs) + def IsOpen(self): return _wxctb.SerialPort_IsOpen(self) + def Read(self, *args, **kwargs): return _wxctb.SerialPort_Read(self, *args, **kwargs) + def SendBreak(self, *args, **kwargs): return _wxctb.SerialPort_SendBreak(self, *args, **kwargs) + def SetBaudrate(self, *args, **kwargs): return _wxctb.SerialPort_SetBaudrate(self, *args, **kwargs) + def SetLineState(self, *args, **kwargs): return _wxctb.SerialPort_SetLineState(self, *args, **kwargs) + def SetParityBit(self, *args, **kwargs): return _wxctb.SerialPort_SetParityBit(self, *args, **kwargs) + def Write(self, *args, **kwargs): return _wxctb.SerialPort_Write(self, *args, **kwargs) +SerialPort_swigregister = _wxctb.SerialPort_swigregister +SerialPort_swigregister(SerialPort) + + +def GetKey(): + return _wxctb.GetKey() +GetKey = _wxctb.GetKey + + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/wxctb_wrap.cxx b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/wxctb_wrap.cxx new file mode 100644 index 0000000000..c72f220ded --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/linux/wxctb_wrap.cxx @@ -0,0 +1,6469 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.40 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#define SWIGPYTHON +#define SWIG_PYTHON_DIRECTOR_NO_VTABLE + + +#ifdef __cplusplus +/* SwigValueWrapper is described in swig.swg */ +template class SwigValueWrapper { + struct SwigMovePointer { + T *ptr; + SwigMovePointer(T *p) : ptr(p) { } + ~SwigMovePointer() { delete ptr; } + SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } + } pointer; + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); + SwigValueWrapper(const SwigValueWrapper& rhs); +public: + SwigValueWrapper() : pointer(0) { } + SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } + operator T&() const { return *pointer.ptr; } + T *operator&() { return pointer.ptr; } +}; + +template T SwigValueInit() { + return T(); +} +#endif + +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + + + +/* Python.h has to appear first */ +#include + +/* ----------------------------------------------------------------------------- + * swigrun.swg + * + * This file contains generic C API SWIG runtime support for pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +/* This should only be incremented when either the layout of swig_type_info changes, + or for whatever reason, the runtime changes incompatibly */ +#define SWIG_RUNTIME_VERSION "4" + +/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ +#ifdef SWIG_TYPE_TABLE +# define SWIG_QUOTE_STRING(x) #x +# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) +# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) +#else +# define SWIG_TYPE_TABLE_NAME +#endif + +/* + You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for + creating a static or dynamic library from the SWIG runtime code. + In 99.9% of the cases, SWIG just needs to declare them as 'static'. + + But only do this if strictly necessary, ie, if you have problems + with your compiler or suchlike. +*/ + +#ifndef SWIGRUNTIME +# define SWIGRUNTIME SWIGINTERN +#endif + +#ifndef SWIGRUNTIMEINLINE +# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE +#endif + +/* Generic buffer size */ +#ifndef SWIG_BUFFER_SIZE +# define SWIG_BUFFER_SIZE 1024 +#endif + +/* Flags for pointer conversions */ +#define SWIG_POINTER_DISOWN 0x1 +#define SWIG_CAST_NEW_MEMORY 0x2 + +/* Flags for new pointer objects */ +#define SWIG_POINTER_OWN 0x1 + + +/* + Flags/methods for returning states. + + The SWIG conversion methods, as ConvertPtr, return and integer + that tells if the conversion was successful or not. And if not, + an error code can be returned (see swigerrors.swg for the codes). + + Use the following macros/flags to set or process the returning + states. + + In old versions of SWIG, code such as the following was usually written: + + if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { + // success code + } else { + //fail code + } + + Now you can be more explicit: + + int res = SWIG_ConvertPtr(obj,vptr,ty.flags); + if (SWIG_IsOK(res)) { + // success code + } else { + // fail code + } + + which is the same really, but now you can also do + + Type *ptr; + int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); + if (SWIG_IsOK(res)) { + // success code + if (SWIG_IsNewObj(res) { + ... + delete *ptr; + } else { + ... + } + } else { + // fail code + } + + I.e., now SWIG_ConvertPtr can return new objects and you can + identify the case and take care of the deallocation. Of course that + also requires SWIG_ConvertPtr to return new result values, such as + + int SWIG_ConvertPtr(obj, ptr,...) { + if () { + if () { + *ptr = ; + return SWIG_NEWOBJ; + } else { + *ptr = ; + return SWIG_OLDOBJ; + } + } else { + return SWIG_BADOBJ; + } + } + + Of course, returning the plain '0(success)/-1(fail)' still works, but you can be + more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the + SWIG errors code. + + Finally, if the SWIG_CASTRANK_MODE is enabled, the result code + allows to return the 'cast rank', for example, if you have this + + int food(double) + int fooi(int); + + and you call + + food(1) // cast rank '1' (1 -> 1.0) + fooi(1) // cast rank '0' + + just use the SWIG_AddCast()/SWIG_CheckState() +*/ + +#define SWIG_OK (0) +#define SWIG_ERROR (-1) +#define SWIG_IsOK(r) (r >= 0) +#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) + +/* The CastRankLimit says how many bits are used for the cast rank */ +#define SWIG_CASTRANKLIMIT (1 << 8) +/* The NewMask denotes the object was created (using new/malloc) */ +#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) +/* The TmpMask is for in/out typemaps that use temporal objects */ +#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) +/* Simple returning values */ +#define SWIG_BADOBJ (SWIG_ERROR) +#define SWIG_OLDOBJ (SWIG_OK) +#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) +#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) +/* Check, add and del mask methods */ +#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) +#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) +#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) +#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) +#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) +#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) + +/* Cast-Rank Mode */ +#if defined(SWIG_CASTRANK_MODE) +# ifndef SWIG_TypeRank +# define SWIG_TypeRank unsigned long +# endif +# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ +# define SWIG_MAXCASTRANK (2) +# endif +# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) +# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) +SWIGINTERNINLINE int SWIG_AddCast(int r) { + return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; +} +SWIGINTERNINLINE int SWIG_CheckState(int r) { + return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; +} +#else /* no cast-rank mode */ +# define SWIG_AddCast +# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) +#endif + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *(*swig_converter_func)(void *, int *); +typedef struct swig_type_info *(*swig_dycast_func)(void **); + +/* Structure to store information on one type */ +typedef struct swig_type_info { + const char *name; /* mangled name of this type */ + const char *str; /* human readable name of this type */ + swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ + struct swig_cast_info *cast; /* linked list of types that can cast into this type */ + void *clientdata; /* language specific type data */ + int owndata; /* flag if the structure owns the clientdata */ +} swig_type_info; + +/* Structure to store a type and conversion function used for casting */ +typedef struct swig_cast_info { + swig_type_info *type; /* pointer to type that is equivalent to this type */ + swig_converter_func converter; /* function to cast the void pointers */ + struct swig_cast_info *next; /* pointer to next cast in linked list */ + struct swig_cast_info *prev; /* pointer to the previous cast */ +} swig_cast_info; + +/* Structure used to store module information + * Each module generates one structure like this, and the runtime collects + * all of these structures and stores them in a circularly linked list.*/ +typedef struct swig_module_info { + swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ + size_t size; /* Number of types in this module */ + struct swig_module_info *next; /* Pointer to next element in circularly linked list */ + swig_type_info **type_initial; /* Array of initially generated type structures */ + swig_cast_info **cast_initial; /* Array of initially generated casting structures */ + void *clientdata; /* Language specific module data */ +} swig_module_info; + +/* + Compare two type names skipping the space characters, therefore + "char*" == "char *" and "Class" == "Class", etc. + + Return 0 when the two name types are equivalent, as in + strncmp, but skipping ' '. +*/ +SWIGRUNTIME int +SWIG_TypeNameComp(const char *f1, const char *l1, + const char *f2, const char *l2) { + for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { + while ((*f1 == ' ') && (f1 != l1)) ++f1; + while ((*f2 == ' ') && (f2 != l2)) ++f2; + if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; + } + return (int)((l1 - f1) - (l2 - f2)); +} + +/* + Check type equivalence in a name list like ||... + Return 0 if not equal, 1 if equal +*/ +SWIGRUNTIME int +SWIG_TypeEquiv(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + +/* + Check type equivalence in a name list like ||... + Return 0 if equal, -1 if nb < tb, 1 if nb > tb +*/ +SWIGRUNTIME int +SWIG_TypeCompare(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + + +/* + Check the typename +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheck(const char *c, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (strcmp(iter->type->name, c) == 0) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (iter->type == from) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Cast a pointer up an inheritance hierarchy +*/ +SWIGRUNTIMEINLINE void * +SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { + return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); +} + +/* + Dynamic pointer casting. Down an inheritance hierarchy +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { + swig_type_info *lastty = ty; + if (!ty || !ty->dcast) return ty; + while (ty && (ty->dcast)) { + ty = (*ty->dcast)(ptr); + if (ty) lastty = ty; + } + return lastty; +} + +/* + Return the name associated with this type +*/ +SWIGRUNTIMEINLINE const char * +SWIG_TypeName(const swig_type_info *ty) { + return ty->name; +} + +/* + Return the pretty name associated with this type, + that is an unmangled type name in a form presentable to the user. +*/ +SWIGRUNTIME const char * +SWIG_TypePrettyName(const swig_type_info *type) { + /* The "str" field contains the equivalent pretty names of the + type, separated by vertical-bar characters. We choose + to print the last name, as it is often (?) the most + specific. */ + if (!type) return NULL; + if (type->str != NULL) { + const char *last_name = type->str; + const char *s; + for (s = type->str; *s; s++) + if (*s == '|') last_name = s+1; + return last_name; + } + else + return type->name; +} + +/* + Set the clientdata field for a type +*/ +SWIGRUNTIME void +SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { + swig_cast_info *cast = ti->cast; + /* if (ti->clientdata == clientdata) return; */ + ti->clientdata = clientdata; + + while (cast) { + if (!cast->converter) { + swig_type_info *tc = cast->type; + if (!tc->clientdata) { + SWIG_TypeClientData(tc, clientdata); + } + } + cast = cast->next; + } +} +SWIGRUNTIME void +SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { + SWIG_TypeClientData(ti, clientdata); + ti->owndata = 1; +} + +/* + Search for a swig_type_info structure only by mangled name + Search is a O(log #types) + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_MangledTypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + swig_module_info *iter = start; + do { + if (iter->size) { + register size_t l = 0; + register size_t r = iter->size - 1; + do { + /* since l+r >= 0, we can (>> 1) instead (/ 2) */ + register size_t i = (l + r) >> 1; + const char *iname = iter->types[i]->name; + if (iname) { + register int compare = strcmp(name, iname); + if (compare == 0) { + return iter->types[i]; + } else if (compare < 0) { + if (i) { + r = i - 1; + } else { + break; + } + } else if (compare > 0) { + l = i + 1; + } + } else { + break; /* should never happen */ + } + } while (l <= r); + } + iter = iter->next; + } while (iter != end); + return 0; +} + +/* + Search for a swig_type_info structure for either a mangled name or a human readable name. + It first searches the mangled names of the types, which is a O(log #types) + If a type is not found it then searches the human readable names, which is O(#types). + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + /* STEP 1: Search the name field using binary search */ + swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); + if (ret) { + return ret; + } else { + /* STEP 2: If the type hasn't been found, do a complete search + of the str field (the human readable name) */ + swig_module_info *iter = start; + do { + register size_t i = 0; + for (; i < iter->size; ++i) { + if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) + return iter->types[i]; + } + iter = iter->next; + } while (iter != end); + } + + /* neither found a match */ + return 0; +} + +/* + Pack binary data into a string +*/ +SWIGRUNTIME char * +SWIG_PackData(char *c, void *ptr, size_t sz) { + static const char hex[17] = "0123456789abcdef"; + register const unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register unsigned char uu = *u; + *(c++) = hex[(uu & 0xf0) >> 4]; + *(c++) = hex[uu & 0xf]; + } + return c; +} + +/* + Unpack binary data from a string +*/ +SWIGRUNTIME const char * +SWIG_UnpackData(const char *c, void *ptr, size_t sz) { + register unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register char d = *(c++); + register unsigned char uu; + if ((d >= '0') && (d <= '9')) + uu = ((d - '0') << 4); + else if ((d >= 'a') && (d <= 'f')) + uu = ((d - ('a'-10)) << 4); + else + return (char *) 0; + d = *(c++); + if ((d >= '0') && (d <= '9')) + uu |= (d - '0'); + else if ((d >= 'a') && (d <= 'f')) + uu |= (d - ('a'-10)); + else + return (char *) 0; + *u = uu; + } + return c; +} + +/* + Pack 'void *' into a string buffer. +*/ +SWIGRUNTIME char * +SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { + char *r = buff; + if ((2*sizeof(void *) + 2) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,&ptr,sizeof(void *)); + if (strlen(name) + 1 > (bsz - (r - buff))) return 0; + strcpy(r,name); + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + *ptr = (void *) 0; + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sizeof(void *)); +} + +SWIGRUNTIME char * +SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { + char *r = buff; + size_t lname = (name ? strlen(name) : 0); + if ((2*sz + 2 + lname) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + if (lname) { + strncpy(r,name,lname+1); + } else { + *r = 0; + } + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + memset(ptr,0,sz); + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sz); +} + +#ifdef __cplusplus +} +#endif + +/* Errors in SWIG */ +#define SWIG_UnknownError -1 +#define SWIG_IOError -2 +#define SWIG_RuntimeError -3 +#define SWIG_IndexError -4 +#define SWIG_TypeError -5 +#define SWIG_DivisionByZero -6 +#define SWIG_OverflowError -7 +#define SWIG_SyntaxError -8 +#define SWIG_ValueError -9 +#define SWIG_SystemError -10 +#define SWIG_AttributeError -11 +#define SWIG_MemoryError -12 +#define SWIG_NullReferenceError -13 + + + +/* Compatibility macros for Python 3 */ +#if PY_VERSION_HEX >= 0x03000000 + +#define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) +#define PyInt_Check(x) PyLong_Check(x) +#define PyInt_AsLong(x) PyLong_AsLong(x) +#define PyInt_FromLong(x) PyLong_FromLong(x) +#define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) + +#endif + +#ifndef Py_TYPE +# define Py_TYPE(op) ((op)->ob_type) +#endif + +/* SWIG APIs for compatibility of both Python 2 & 3 */ + +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_Python_str_FromFormat PyUnicode_FromFormat +#else +# define SWIG_Python_str_FromFormat PyString_FromFormat +#endif + + +/* Warning: This function will allocate a new string in Python 3, + * so please call SWIG_Python_str_DelForPy3(x) to free the space. + */ +SWIGINTERN char* +SWIG_Python_str_AsChar(PyObject *str) +{ +#if PY_VERSION_HEX >= 0x03000000 + char *cstr; + char *newstr; + Py_ssize_t len; + str = PyUnicode_AsUTF8String(str); + PyBytes_AsStringAndSize(str, &cstr, &len); + newstr = (char *) malloc(len+1); + memcpy(newstr, cstr, len+1); + Py_XDECREF(str); + return newstr; +#else + return PyString_AsString(str); +#endif +} + +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) +#else +# define SWIG_Python_str_DelForPy3(x) +#endif + + +SWIGINTERN PyObject* +SWIG_Python_str_FromChar(const char *c) +{ +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_FromString(c); +#else + return PyString_FromString(c); +#endif +} + +/* Add PyOS_snprintf for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 +# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) +# define PyOS_snprintf _snprintf +# else +# define PyOS_snprintf snprintf +# endif +#endif + +/* A crude PyString_FromFormat implementation for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 + +#ifndef SWIG_PYBUFFER_SIZE +# define SWIG_PYBUFFER_SIZE 1024 +#endif + +static PyObject * +PyString_FromFormat(const char *fmt, ...) { + va_list ap; + char buf[SWIG_PYBUFFER_SIZE * 2]; + int res; + va_start(ap, fmt); + res = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf); +} +#endif + +/* Add PyObject_Del for old Pythons */ +#if PY_VERSION_HEX < 0x01060000 +# define PyObject_Del(op) PyMem_DEL((op)) +#endif +#ifndef PyObject_DEL +# define PyObject_DEL PyObject_Del +#endif + +/* A crude PyExc_StopIteration exception for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 +# ifndef PyExc_StopIteration +# define PyExc_StopIteration PyExc_RuntimeError +# endif +# ifndef PyObject_GenericGetAttr +# define PyObject_GenericGetAttr 0 +# endif +#endif + +/* Py_NotImplemented is defined in 2.1 and up. */ +#if PY_VERSION_HEX < 0x02010000 +# ifndef Py_NotImplemented +# define Py_NotImplemented PyExc_RuntimeError +# endif +#endif + +/* A crude PyString_AsStringAndSize implementation for old Pythons */ +#if PY_VERSION_HEX < 0x02010000 +# ifndef PyString_AsStringAndSize +# define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;} +# endif +#endif + +/* PySequence_Size for old Pythons */ +#if PY_VERSION_HEX < 0x02000000 +# ifndef PySequence_Size +# define PySequence_Size PySequence_Length +# endif +#endif + +/* PyBool_FromLong for old Pythons */ +#if PY_VERSION_HEX < 0x02030000 +static +PyObject *PyBool_FromLong(long ok) +{ + PyObject *result = ok ? Py_True : Py_False; + Py_INCREF(result); + return result; +} +#endif + +/* Py_ssize_t for old Pythons */ +/* This code is as recommended by: */ +/* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */ +#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) +typedef int Py_ssize_t; +# define PY_SSIZE_T_MAX INT_MAX +# define PY_SSIZE_T_MIN INT_MIN +#endif + +/* ----------------------------------------------------------------------------- + * error manipulation + * ----------------------------------------------------------------------------- */ + +SWIGRUNTIME PyObject* +SWIG_Python_ErrorType(int code) { + PyObject* type = 0; + switch(code) { + case SWIG_MemoryError: + type = PyExc_MemoryError; + break; + case SWIG_IOError: + type = PyExc_IOError; + break; + case SWIG_RuntimeError: + type = PyExc_RuntimeError; + break; + case SWIG_IndexError: + type = PyExc_IndexError; + break; + case SWIG_TypeError: + type = PyExc_TypeError; + break; + case SWIG_DivisionByZero: + type = PyExc_ZeroDivisionError; + break; + case SWIG_OverflowError: + type = PyExc_OverflowError; + break; + case SWIG_SyntaxError: + type = PyExc_SyntaxError; + break; + case SWIG_ValueError: + type = PyExc_ValueError; + break; + case SWIG_SystemError: + type = PyExc_SystemError; + break; + case SWIG_AttributeError: + type = PyExc_AttributeError; + break; + default: + type = PyExc_RuntimeError; + } + return type; +} + + +SWIGRUNTIME void +SWIG_Python_AddErrorMsg(const char* mesg) +{ + PyObject *type = 0; + PyObject *value = 0; + PyObject *traceback = 0; + + if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); + if (value) { + char *tmp; + PyObject *old_str = PyObject_Str(value); + PyErr_Clear(); + Py_XINCREF(type); + + PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(old_str); + Py_DECREF(value); + } else { + PyErr_SetString(PyExc_RuntimeError, mesg); + } +} + +#if defined(SWIG_PYTHON_NO_THREADS) +# if defined(SWIG_PYTHON_THREADS) +# undef SWIG_PYTHON_THREADS +# endif +#endif +#if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ +# if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) +# if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */ +# define SWIG_PYTHON_USE_GIL +# endif +# endif +# if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ +# ifndef SWIG_PYTHON_INITIALIZE_THREADS +# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() +# endif +# ifdef __cplusplus /* C++ code */ + class SWIG_Python_Thread_Block { + bool status; + PyGILState_STATE state; + public: + void end() { if (status) { PyGILState_Release(state); status = false;} } + SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} + ~SWIG_Python_Thread_Block() { end(); } + }; + class SWIG_Python_Thread_Allow { + bool status; + PyThreadState *save; + public: + void end() { if (status) { PyEval_RestoreThread(save); status = false; }} + SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} + ~SWIG_Python_Thread_Allow() { end(); } + }; +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block +# define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow +# define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() +# else /* C code */ +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() +# define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() +# define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) +# endif +# else /* Old thread way, not implemented, user must provide it */ +# if !defined(SWIG_PYTHON_INITIALIZE_THREADS) +# define SWIG_PYTHON_INITIALIZE_THREADS +# endif +# if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK +# endif +# if !defined(SWIG_PYTHON_THREAD_END_BLOCK) +# define SWIG_PYTHON_THREAD_END_BLOCK +# endif +# if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW +# endif +# if !defined(SWIG_PYTHON_THREAD_END_ALLOW) +# define SWIG_PYTHON_THREAD_END_ALLOW +# endif +# endif +#else /* No thread support */ +# define SWIG_PYTHON_INITIALIZE_THREADS +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK +# define SWIG_PYTHON_THREAD_END_BLOCK +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW +# define SWIG_PYTHON_THREAD_END_ALLOW +#endif + +/* ----------------------------------------------------------------------------- + * Python API portion that goes into the runtime + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* cc-mode */ +#endif +#endif + +/* ----------------------------------------------------------------------------- + * Constant declarations + * ----------------------------------------------------------------------------- */ + +/* Constant Types */ +#define SWIG_PY_POINTER 4 +#define SWIG_PY_BINARY 5 + +/* Constant information structure */ +typedef struct swig_const_info { + int type; + char *name; + long lvalue; + double dvalue; + void *pvalue; + swig_type_info **ptype; +} swig_const_info; + + +/* ----------------------------------------------------------------------------- + * Wrapper of PyInstanceMethod_New() used in Python 3 + * It is exported to the generated module, used for -fastproxy + * ----------------------------------------------------------------------------- */ +SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *self, PyObject *func) +{ +#if PY_VERSION_HEX >= 0x03000000 + return PyInstanceMethod_New(func); +#else + return NULL; +#endif +} + +#ifdef __cplusplus +#if 0 +{ /* cc-mode */ +#endif +} +#endif + + +/* ----------------------------------------------------------------------------- + * See the LICENSE file for information on copyright, usage and redistribution + * of SWIG, and the README file for authors - http://www.swig.org/release.html. + * + * pyrun.swg + * + * This file contains the runtime support for Python modules + * and includes code for managing global variables and pointer + * type checking. + * + * ----------------------------------------------------------------------------- */ + +/* Common SWIG API */ + +/* for raw pointers */ +#define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) +#define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) +#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) +#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(ptr, type, flags) +#define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) +#define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) +#define swig_owntype int + +/* for raw packed data */ +#define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) + +/* for class or struct pointers */ +#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) +#define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) + +/* for C or C++ function pointers */ +#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) +#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(ptr, type, 0) + +/* for C++ member pointers, ie, member methods */ +#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) + + +/* Runtime API */ + +#define SWIG_GetModule(clientdata) SWIG_Python_GetModule() +#define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) +#define SWIG_NewClientData(obj) SwigPyClientData_New(obj) + +#define SWIG_SetErrorObj SWIG_Python_SetErrorObj +#define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg +#define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) +#define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) +#define SWIG_fail goto fail + + +/* Runtime API implementation */ + +/* Error manipulation */ + +SWIGINTERN void +SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + PyErr_SetObject(errtype, obj); + Py_DECREF(obj); + SWIG_PYTHON_THREAD_END_BLOCK; +} + +SWIGINTERN void +SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + PyErr_SetString(errtype, (char *) msg); + SWIG_PYTHON_THREAD_END_BLOCK; +} + +#define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) + +/* Set a constant value */ + +SWIGINTERN void +SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { + PyDict_SetItemString(d, (char*) name, obj); + Py_DECREF(obj); +} + +/* Append a value to the result obj */ + +SWIGINTERN PyObject* +SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { +#if !defined(SWIG_PYTHON_OUTPUT_TUPLE) + if (!result) { + result = obj; + } else if (result == Py_None) { + Py_DECREF(result); + result = obj; + } else { + if (!PyList_Check(result)) { + PyObject *o2 = result; + result = PyList_New(1); + PyList_SetItem(result, 0, o2); + } + PyList_Append(result,obj); + Py_DECREF(obj); + } + return result; +#else + PyObject* o2; + PyObject* o3; + if (!result) { + result = obj; + } else if (result == Py_None) { + Py_DECREF(result); + result = obj; + } else { + if (!PyTuple_Check(result)) { + o2 = result; + result = PyTuple_New(1); + PyTuple_SET_ITEM(result, 0, o2); + } + o3 = PyTuple_New(1); + PyTuple_SET_ITEM(o3, 0, obj); + o2 = result; + result = PySequence_Concat(o2, o3); + Py_DECREF(o2); + Py_DECREF(o3); + } + return result; +#endif +} + +/* Unpack the argument tuple */ + +SWIGINTERN int +SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) +{ + if (!args) { + if (!min && !max) { + return 1; + } else { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", + name, (min == max ? "" : "at least "), (int)min); + return 0; + } + } + if (!PyTuple_Check(args)) { + PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); + return 0; + } else { + register Py_ssize_t l = PyTuple_GET_SIZE(args); + if (l < min) { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at least "), (int)min, (int)l); + return 0; + } else if (l > max) { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at most "), (int)max, (int)l); + return 0; + } else { + register int i; + for (i = 0; i < l; ++i) { + objs[i] = PyTuple_GET_ITEM(args, i); + } + for (; l < max; ++l) { + objs[l] = 0; + } + return i + 1; + } + } +} + +/* A functor is a function object with one single object argument */ +#if PY_VERSION_HEX >= 0x02020000 +#define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); +#else +#define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj); +#endif + +/* + Helper for static pointer initialization for both C and C++ code, for example + static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); +*/ +#ifdef __cplusplus +#define SWIG_STATIC_POINTER(var) var +#else +#define SWIG_STATIC_POINTER(var) var = 0; if (!var) var +#endif + +/* ----------------------------------------------------------------------------- + * Pointer declarations + * ----------------------------------------------------------------------------- */ + +/* Flags for new pointer objects */ +#define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) +#define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) + +#define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* cc-mode */ +#endif +#endif + +/* How to access Py_None */ +#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# ifndef SWIG_PYTHON_NO_BUILD_NONE +# ifndef SWIG_PYTHON_BUILD_NONE +# define SWIG_PYTHON_BUILD_NONE +# endif +# endif +#endif + +#ifdef SWIG_PYTHON_BUILD_NONE +# ifdef Py_None +# undef Py_None +# define Py_None SWIG_Py_None() +# endif +SWIGRUNTIMEINLINE PyObject * +_SWIG_Py_None(void) +{ + PyObject *none = Py_BuildValue((char*)""); + Py_DECREF(none); + return none; +} +SWIGRUNTIME PyObject * +SWIG_Py_None(void) +{ + static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None(); + return none; +} +#endif + +/* The python void return value */ + +SWIGRUNTIMEINLINE PyObject * +SWIG_Py_Void(void) +{ + PyObject *none = Py_None; + Py_INCREF(none); + return none; +} + +/* SwigPyClientData */ + +typedef struct { + PyObject *klass; + PyObject *newraw; + PyObject *newargs; + PyObject *destroy; + int delargs; + int implicitconv; +} SwigPyClientData; + +SWIGRUNTIMEINLINE int +SWIG_Python_CheckImplicit(swig_type_info *ty) +{ + SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; + return data ? data->implicitconv : 0; +} + +SWIGRUNTIMEINLINE PyObject * +SWIG_Python_ExceptionType(swig_type_info *desc) { + SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; + PyObject *klass = data ? data->klass : 0; + return (klass ? klass : PyExc_RuntimeError); +} + + +SWIGRUNTIME SwigPyClientData * +SwigPyClientData_New(PyObject* obj) +{ + if (!obj) { + return 0; + } else { + SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); + /* the klass element */ + data->klass = obj; + Py_INCREF(data->klass); + /* the newraw method and newargs arguments used to create a new raw instance */ + if (PyClass_Check(obj)) { + data->newraw = 0; + data->newargs = obj; + Py_INCREF(obj); + } else { +#if (PY_VERSION_HEX < 0x02020000) + data->newraw = 0; +#else + data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__"); +#endif + if (data->newraw) { + Py_INCREF(data->newraw); + data->newargs = PyTuple_New(1); + PyTuple_SetItem(data->newargs, 0, obj); + } else { + data->newargs = obj; + } + Py_INCREF(data->newargs); + } + /* the destroy method, aka as the C++ delete method */ + data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__"); + if (PyErr_Occurred()) { + PyErr_Clear(); + data->destroy = 0; + } + if (data->destroy) { + int flags; + Py_INCREF(data->destroy); + flags = PyCFunction_GET_FLAGS(data->destroy); +#ifdef METH_O + data->delargs = !(flags & (METH_O)); +#else + data->delargs = 0; +#endif + } else { + data->delargs = 0; + } + data->implicitconv = 0; + return data; + } +} + +SWIGRUNTIME void +SwigPyClientData_Del(SwigPyClientData* data) +{ + Py_XDECREF(data->newraw); + Py_XDECREF(data->newargs); + Py_XDECREF(data->destroy); +} + +/* =============== SwigPyObject =====================*/ + +typedef struct { + PyObject_HEAD + void *ptr; + swig_type_info *ty; + int own; + PyObject *next; +} SwigPyObject; + +SWIGRUNTIME PyObject * +SwigPyObject_long(SwigPyObject *v) +{ + return PyLong_FromVoidPtr(v->ptr); +} + +SWIGRUNTIME PyObject * +SwigPyObject_format(const char* fmt, SwigPyObject *v) +{ + PyObject *res = NULL; + PyObject *args = PyTuple_New(1); + if (args) { + if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { + PyObject *ofmt = SWIG_Python_str_FromChar(fmt); + if (ofmt) { +#if PY_VERSION_HEX >= 0x03000000 + res = PyUnicode_Format(ofmt,args); +#else + res = PyString_Format(ofmt,args); +#endif + Py_DECREF(ofmt); + } + Py_DECREF(args); + } + } + return res; +} + +SWIGRUNTIME PyObject * +SwigPyObject_oct(SwigPyObject *v) +{ + return SwigPyObject_format("%o",v); +} + +SWIGRUNTIME PyObject * +SwigPyObject_hex(SwigPyObject *v) +{ + return SwigPyObject_format("%x",v); +} + +SWIGRUNTIME PyObject * +#ifdef METH_NOARGS +SwigPyObject_repr(SwigPyObject *v) +#else +SwigPyObject_repr(SwigPyObject *v, PyObject *args) +#endif +{ + const char *name = SWIG_TypePrettyName(v->ty); + PyObject *repr = SWIG_Python_str_FromFormat("", name, v); + if (v->next) { +#ifdef METH_NOARGS + PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); +#else + PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args); +#endif +#if PY_VERSION_HEX >= 0x03000000 + PyObject *joined = PyUnicode_Concat(repr, nrep); + Py_DecRef(repr); + Py_DecRef(nrep); + repr = joined; +#else + PyString_ConcatAndDel(&repr,nrep); +#endif + } + return repr; +} + +SWIGRUNTIME int +SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) +{ + char *str; +#ifdef METH_NOARGS + PyObject *repr = SwigPyObject_repr(v); +#else + PyObject *repr = SwigPyObject_repr(v, NULL); +#endif + if (repr) { + str = SWIG_Python_str_AsChar(repr); + fputs(str, fp); + SWIG_Python_str_DelForPy3(str); + Py_DECREF(repr); + return 0; + } else { + return 1; + } +} + +SWIGRUNTIME PyObject * +SwigPyObject_str(SwigPyObject *v) +{ + char result[SWIG_BUFFER_SIZE]; + return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ? + SWIG_Python_str_FromChar(result) : 0; +} + +SWIGRUNTIME int +SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) +{ + void *i = v->ptr; + void *j = w->ptr; + return (i < j) ? -1 : ((i > j) ? 1 : 0); +} + +/* Added for Python 3.x, would it also be useful for Python 2.x? */ +SWIGRUNTIME PyObject* +SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) +{ + PyObject* res; + if( op != Py_EQ && op != Py_NE ) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + if( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ) + res = Py_True; + else + res = Py_False; + Py_INCREF(res); + return res; +} + + +SWIGRUNTIME PyTypeObject* _PySwigObject_type(void); + +SWIGRUNTIME PyTypeObject* +SwigPyObject_type(void) { + static PyTypeObject *SWIG_STATIC_POINTER(type) = _PySwigObject_type(); + return type; +} + +SWIGRUNTIMEINLINE int +SwigPyObject_Check(PyObject *op) { + return (Py_TYPE(op) == SwigPyObject_type()) + || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); +} + +SWIGRUNTIME PyObject * +SwigPyObject_New(void *ptr, swig_type_info *ty, int own); + +SWIGRUNTIME void +SwigPyObject_dealloc(PyObject *v) +{ + SwigPyObject *sobj = (SwigPyObject *) v; + PyObject *next = sobj->next; + if (sobj->own == SWIG_POINTER_OWN) { + swig_type_info *ty = sobj->ty; + SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; + PyObject *destroy = data ? data->destroy : 0; + if (destroy) { + /* destroy is always a VARARGS method */ + PyObject *res; + if (data->delargs) { + /* we need to create a temporary object to carry the destroy operation */ + PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); + res = SWIG_Python_CallFunctor(destroy, tmp); + Py_DECREF(tmp); + } else { + PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); + PyObject *mself = PyCFunction_GET_SELF(destroy); + res = ((*meth)(mself, v)); + } + Py_XDECREF(res); + } +#if !defined(SWIG_PYTHON_SILENT_MEMLEAK) + else { + const char *name = SWIG_TypePrettyName(ty); + printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); + } +#endif + } + Py_XDECREF(next); + PyObject_DEL(v); +} + +SWIGRUNTIME PyObject* +SwigPyObject_append(PyObject* v, PyObject* next) +{ + SwigPyObject *sobj = (SwigPyObject *) v; +#ifndef METH_O + PyObject *tmp = 0; + if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; + next = tmp; +#endif + if (!SwigPyObject_Check(next)) { + return NULL; + } + sobj->next = next; + Py_INCREF(next); + return SWIG_Py_Void(); +} + +SWIGRUNTIME PyObject* +#ifdef METH_NOARGS +SwigPyObject_next(PyObject* v) +#else +SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *) v; + if (sobj->next) { + Py_INCREF(sobj->next); + return sobj->next; + } else { + return SWIG_Py_Void(); + } +} + +SWIGINTERN PyObject* +#ifdef METH_NOARGS +SwigPyObject_disown(PyObject *v) +#else +SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *)v; + sobj->own = 0; + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject* +#ifdef METH_NOARGS +SwigPyObject_acquire(PyObject *v) +#else +SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *)v; + sobj->own = SWIG_POINTER_OWN; + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject* +SwigPyObject_own(PyObject *v, PyObject *args) +{ + PyObject *val = 0; +#if (PY_VERSION_HEX < 0x02020000) + if (!PyArg_ParseTuple(args,(char *)"|O:own",&val)) +#else + if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) +#endif + { + return NULL; + } + else + { + SwigPyObject *sobj = (SwigPyObject *)v; + PyObject *obj = PyBool_FromLong(sobj->own); + if (val) { +#ifdef METH_NOARGS + if (PyObject_IsTrue(val)) { + SwigPyObject_acquire(v); + } else { + SwigPyObject_disown(v); + } +#else + if (PyObject_IsTrue(val)) { + SwigPyObject_acquire(v,args); + } else { + SwigPyObject_disown(v,args); + } +#endif + } + return obj; + } +} + +#ifdef METH_O +static PyMethodDef +swigobject_methods[] = { + {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, + {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"}, + {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, + {(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"}, + {(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, + {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_NOARGS, (char *)"returns object representation"}, + {0, 0, 0, 0} +}; +#else +static PyMethodDef +swigobject_methods[] = { + {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, + {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS, (char *)"aquires ownership of the pointer"}, + {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, + {(char *)"append", (PyCFunction)SwigPyObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, + {(char *)"next", (PyCFunction)SwigPyObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, + {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_VARARGS, (char *)"returns object representation"}, + {0, 0, 0, 0} +}; +#endif + +#if PY_VERSION_HEX < 0x02020000 +SWIGINTERN PyObject * +SwigPyObject_getattr(SwigPyObject *sobj,char *name) +{ + return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name); +} +#endif + +SWIGRUNTIME PyTypeObject* +_PySwigObject_type(void) { + static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; + + static PyNumberMethods SwigPyObject_as_number = { + (binaryfunc)0, /*nb_add*/ + (binaryfunc)0, /*nb_subtract*/ + (binaryfunc)0, /*nb_multiply*/ + /* nb_divide removed in Python 3 */ +#if PY_VERSION_HEX < 0x03000000 + (binaryfunc)0, /*nb_divide*/ +#endif + (binaryfunc)0, /*nb_remainder*/ + (binaryfunc)0, /*nb_divmod*/ + (ternaryfunc)0,/*nb_power*/ + (unaryfunc)0, /*nb_negative*/ + (unaryfunc)0, /*nb_positive*/ + (unaryfunc)0, /*nb_absolute*/ + (inquiry)0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ +#if PY_VERSION_HEX < 0x03000000 + 0, /*nb_coerce*/ +#endif + (unaryfunc)SwigPyObject_long, /*nb_int*/ +#if PY_VERSION_HEX < 0x03000000 + (unaryfunc)SwigPyObject_long, /*nb_long*/ +#else + 0, /*nb_reserved*/ +#endif + (unaryfunc)0, /*nb_float*/ +#if PY_VERSION_HEX < 0x03000000 + (unaryfunc)SwigPyObject_oct, /*nb_oct*/ + (unaryfunc)SwigPyObject_hex, /*nb_hex*/ +#endif +#if PY_VERSION_HEX >= 0x03000000 /* 3.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ +#elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ +#elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ +#elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */ + 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */ +#endif + }; + + static PyTypeObject swigpyobject_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp + = { + /* PyObject header changed in Python 3 */ +#if PY_VERSION_HEX >= 0x03000000 + PyVarObject_HEAD_INIT(&PyType_Type, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + (char *)"SwigPyObject", /* tp_name */ + sizeof(SwigPyObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)SwigPyObject_dealloc, /* tp_dealloc */ + (printfunc)SwigPyObject_print, /* tp_print */ +#if PY_VERSION_HEX < 0x02020000 + (getattrfunc)SwigPyObject_getattr, /* tp_getattr */ +#else + (getattrfunc)0, /* tp_getattr */ +#endif + (setattrfunc)0, /* tp_setattr */ +#if PY_VERSION_HEX >= 0x03000000 + 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */ +#else + (cmpfunc)SwigPyObject_compare, /* tp_compare */ +#endif + (reprfunc)SwigPyObject_repr, /* tp_repr */ + &SwigPyObject_as_number, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)0, /* tp_hash */ + (ternaryfunc)0, /* tp_call */ + (reprfunc)SwigPyObject_str, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + swigobject_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + (richcmpfunc)SwigPyObject_richcompare, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0, /* tp_iter */ + 0, /* tp_iternext */ + swigobject_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ + 0, /* tp_bases */ + 0, /* tp_mro */ + 0, /* tp_cache */ + 0, /* tp_subclasses */ + 0, /* tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#ifdef COUNT_ALLOCS + 0,0,0,0 /* tp_alloc -> tp_next */ +#endif + }; + swigpyobject_type = tmp; + /* for Python 3 we already assigned ob_type in PyVarObject_HEAD_INIT() */ +#if PY_VERSION_HEX < 0x03000000 + swigpyobject_type.ob_type = &PyType_Type; +#endif + type_init = 1; + } + return &swigpyobject_type; +} + +SWIGRUNTIME PyObject * +SwigPyObject_New(void *ptr, swig_type_info *ty, int own) +{ + SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); + if (sobj) { + sobj->ptr = ptr; + sobj->ty = ty; + sobj->own = own; + sobj->next = 0; + } + return (PyObject *)sobj; +} + +/* ----------------------------------------------------------------------------- + * Implements a simple Swig Packed type, and use it instead of string + * ----------------------------------------------------------------------------- */ + +typedef struct { + PyObject_HEAD + void *pack; + swig_type_info *ty; + size_t size; +} SwigPyPacked; + +SWIGRUNTIME int +SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags)) +{ + char result[SWIG_BUFFER_SIZE]; + fputs("pack, v->size, 0, sizeof(result))) { + fputs("at ", fp); + fputs(result, fp); + } + fputs(v->ty->name,fp); + fputs(">", fp); + return 0; +} + +SWIGRUNTIME PyObject * +SwigPyPacked_repr(SwigPyPacked *v) +{ + char result[SWIG_BUFFER_SIZE]; + if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { + return SWIG_Python_str_FromFormat("", result, v->ty->name); + } else { + return SWIG_Python_str_FromFormat("", v->ty->name); + } +} + +SWIGRUNTIME PyObject * +SwigPyPacked_str(SwigPyPacked *v) +{ + char result[SWIG_BUFFER_SIZE]; + if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ + return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); + } else { + return SWIG_Python_str_FromChar(v->ty->name); + } +} + +SWIGRUNTIME int +SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) +{ + size_t i = v->size; + size_t j = w->size; + int s = (i < j) ? -1 : ((i > j) ? 1 : 0); + return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); +} + +SWIGRUNTIME PyTypeObject* _PySwigPacked_type(void); + +SWIGRUNTIME PyTypeObject* +SwigPyPacked_type(void) { + static PyTypeObject *SWIG_STATIC_POINTER(type) = _PySwigPacked_type(); + return type; +} + +SWIGRUNTIMEINLINE int +SwigPyPacked_Check(PyObject *op) { + return ((op)->ob_type == _PySwigPacked_type()) + || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); +} + +SWIGRUNTIME void +SwigPyPacked_dealloc(PyObject *v) +{ + if (SwigPyPacked_Check(v)) { + SwigPyPacked *sobj = (SwigPyPacked *) v; + free(sobj->pack); + } + PyObject_DEL(v); +} + +SWIGRUNTIME PyTypeObject* +_PySwigPacked_type(void) { + static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; + static PyTypeObject swigpypacked_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp + = { + /* PyObject header changed in Python 3 */ +#if PY_VERSION_HEX>=0x03000000 + PyVarObject_HEAD_INIT(&PyType_Type, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + (char *)"SwigPyPacked", /* tp_name */ + sizeof(SwigPyPacked), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ + (printfunc)SwigPyPacked_print, /* tp_print */ + (getattrfunc)0, /* tp_getattr */ + (setattrfunc)0, /* tp_setattr */ +#if PY_VERSION_HEX>=0x03000000 + 0, /* tp_reserved in 3.0.1 */ +#else + (cmpfunc)SwigPyPacked_compare, /* tp_compare */ +#endif + (reprfunc)SwigPyPacked_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)0, /* tp_hash */ + (ternaryfunc)0, /* tp_call */ + (reprfunc)SwigPyPacked_str, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + swigpacked_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ + 0, /* tp_bases */ + 0, /* tp_mro */ + 0, /* tp_cache */ + 0, /* tp_subclasses */ + 0, /* tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#ifdef COUNT_ALLOCS + 0,0,0,0 /* tp_alloc -> tp_next */ +#endif + }; + swigpypacked_type = tmp; + /* for Python 3 the ob_type already assigned in PyVarObject_HEAD_INIT() */ +#if PY_VERSION_HEX < 0x03000000 + swigpypacked_type.ob_type = &PyType_Type; +#endif + type_init = 1; + } + return &swigpypacked_type; +} + +SWIGRUNTIME PyObject * +SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) +{ + SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); + if (sobj) { + void *pack = malloc(size); + if (pack) { + memcpy(pack, ptr, size); + sobj->pack = pack; + sobj->ty = ty; + sobj->size = size; + } else { + PyObject_DEL((PyObject *) sobj); + sobj = 0; + } + } + return (PyObject *) sobj; +} + +SWIGRUNTIME swig_type_info * +SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) +{ + if (SwigPyPacked_Check(obj)) { + SwigPyPacked *sobj = (SwigPyPacked *)obj; + if (sobj->size != size) return 0; + memcpy(ptr, sobj->pack, size); + return sobj->ty; + } else { + return 0; + } +} + +/* ----------------------------------------------------------------------------- + * pointers/data manipulation + * ----------------------------------------------------------------------------- */ + +SWIGRUNTIMEINLINE PyObject * +_SWIG_This(void) +{ + return SWIG_Python_str_FromChar("this"); +} + +SWIGRUNTIME PyObject * +SWIG_This(void) +{ + static PyObject *SWIG_STATIC_POINTER(swig_this) = _SWIG_This(); + return swig_this; +} + +/* #define SWIG_PYTHON_SLOW_GETSET_THIS */ + +/* TODO: I don't know how to implement the fast getset in Python 3 right now */ +#if PY_VERSION_HEX>=0x03000000 +#define SWIG_PYTHON_SLOW_GETSET_THIS +#endif + +SWIGRUNTIME SwigPyObject * +SWIG_Python_GetSwigThis(PyObject *pyobj) +{ + if (SwigPyObject_Check(pyobj)) { + return (SwigPyObject *) pyobj; + } else { + PyObject *obj = 0; +#if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000)) + if (PyInstance_Check(pyobj)) { + obj = _PyInstance_Lookup(pyobj, SWIG_This()); + } else { + PyObject **dictptr = _PyObject_GetDictPtr(pyobj); + if (dictptr != NULL) { + PyObject *dict = *dictptr; + obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; + } else { +#ifdef PyWeakref_CheckProxy + if (PyWeakref_CheckProxy(pyobj)) { + PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); + return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; + } +#endif + obj = PyObject_GetAttr(pyobj,SWIG_This()); + if (obj) { + Py_DECREF(obj); + } else { + if (PyErr_Occurred()) PyErr_Clear(); + return 0; + } + } + } +#else + obj = PyObject_GetAttr(pyobj,SWIG_This()); + if (obj) { + Py_DECREF(obj); + } else { + if (PyErr_Occurred()) PyErr_Clear(); + return 0; + } +#endif + if (obj && !SwigPyObject_Check(obj)) { + /* a PyObject is called 'this', try to get the 'real this' + SwigPyObject from it */ + return SWIG_Python_GetSwigThis(obj); + } + return (SwigPyObject *)obj; + } +} + +/* Acquire a pointer value */ + +SWIGRUNTIME int +SWIG_Python_AcquirePtr(PyObject *obj, int own) { + if (own == SWIG_POINTER_OWN) { + SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); + if (sobj) { + int oldown = sobj->own; + sobj->own = own; + return oldown; + } + } + return 0; +} + +/* Convert a pointer value */ + +SWIGRUNTIME int +SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { + if (!obj) return SWIG_ERROR; + if (obj == Py_None) { + if (ptr) *ptr = 0; + return SWIG_OK; + } else { + SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); + if (own) + *own = 0; + while (sobj) { + void *vptr = sobj->ptr; + if (ty) { + swig_type_info *to = sobj->ty; + if (to == ty) { + /* no type cast needed */ + if (ptr) *ptr = vptr; + break; + } else { + swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); + if (!tc) { + sobj = (SwigPyObject *)sobj->next; + } else { + if (ptr) { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,vptr,&newmemory); + if (newmemory == SWIG_CAST_NEW_MEMORY) { + assert(own); + if (own) + *own = *own | SWIG_CAST_NEW_MEMORY; + } + } + break; + } + } + } else { + if (ptr) *ptr = vptr; + break; + } + } + if (sobj) { + if (own) + *own = *own | sobj->own; + if (flags & SWIG_POINTER_DISOWN) { + sobj->own = 0; + } + return SWIG_OK; + } else { + int res = SWIG_ERROR; + if (flags & SWIG_POINTER_IMPLICIT_CONV) { + SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; + if (data && !data->implicitconv) { + PyObject *klass = data->klass; + if (klass) { + PyObject *impconv; + data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ + impconv = SWIG_Python_CallFunctor(klass, obj); + data->implicitconv = 0; + if (PyErr_Occurred()) { + PyErr_Clear(); + impconv = 0; + } + if (impconv) { + SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); + if (iobj) { + void *vptr; + res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); + if (SWIG_IsOK(res)) { + if (ptr) { + *ptr = vptr; + /* transfer the ownership to 'ptr' */ + iobj->own = 0; + res = SWIG_AddCast(res); + res = SWIG_AddNewMask(res); + } else { + res = SWIG_AddCast(res); + } + } + } + Py_DECREF(impconv); + } + } + } + } + return res; + } + } +} + +/* Convert a function ptr value */ + +SWIGRUNTIME int +SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { + if (!PyCFunction_Check(obj)) { + return SWIG_ConvertPtr(obj, ptr, ty, 0); + } else { + void *vptr = 0; + + /* here we get the method pointer for callbacks */ + const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); + const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; + if (desc) + desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; + if (!desc) + return SWIG_ERROR; + if (ty) { + swig_cast_info *tc = SWIG_TypeCheck(desc,ty); + if (tc) { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,vptr,&newmemory); + assert(!newmemory); /* newmemory handling not yet implemented */ + } else { + return SWIG_ERROR; + } + } else { + *ptr = vptr; + } + return SWIG_OK; + } +} + +/* Convert a packed value value */ + +SWIGRUNTIME int +SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { + swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); + if (!to) return SWIG_ERROR; + if (ty) { + if (to != ty) { + /* check type cast? */ + swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); + if (!tc) return SWIG_ERROR; + } + } + return SWIG_OK; +} + +/* ----------------------------------------------------------------------------- + * Create a new pointer object + * ----------------------------------------------------------------------------- */ + +/* + Create a new instance object, without calling __init__, and set the + 'this' attribute. +*/ + +SWIGRUNTIME PyObject* +SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) +{ +#if (PY_VERSION_HEX >= 0x02020000) + PyObject *inst = 0; + PyObject *newraw = data->newraw; + if (newraw) { + inst = PyObject_Call(newraw, data->newargs, NULL); + if (inst) { +#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) + PyObject **dictptr = _PyObject_GetDictPtr(inst); + if (dictptr != NULL) { + PyObject *dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + PyDict_SetItem(dict, SWIG_This(), swig_this); + } + } +#else + PyObject *key = SWIG_This(); + PyObject_SetAttr(inst, key, swig_this); +#endif + } + } else { +#if PY_VERSION_HEX >= 0x03000000 + inst = PyBaseObject_Type.tp_new((PyTypeObject*) data->newargs, Py_None, Py_None); + PyObject_SetAttr(inst, SWIG_This(), swig_this); + Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; +#else + PyObject *dict = PyDict_New(); + PyDict_SetItem(dict, SWIG_This(), swig_this); + inst = PyInstance_NewRaw(data->newargs, dict); + Py_DECREF(dict); +#endif + } + return inst; +#else +#if (PY_VERSION_HEX >= 0x02010000) + PyObject *inst; + PyObject *dict = PyDict_New(); + PyDict_SetItem(dict, SWIG_This(), swig_this); + inst = PyInstance_NewRaw(data->newargs, dict); + Py_DECREF(dict); + return (PyObject *) inst; +#else + PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); + if (inst == NULL) { + return NULL; + } + inst->in_class = (PyClassObject *)data->newargs; + Py_INCREF(inst->in_class); + inst->in_dict = PyDict_New(); + if (inst->in_dict == NULL) { + Py_DECREF(inst); + return NULL; + } +#ifdef Py_TPFLAGS_HAVE_WEAKREFS + inst->in_weakreflist = NULL; +#endif +#ifdef Py_TPFLAGS_GC + PyObject_GC_Init(inst); +#endif + PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this); + return (PyObject *) inst; +#endif +#endif +} + +SWIGRUNTIME void +SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) +{ + PyObject *dict; +#if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS) + PyObject **dictptr = _PyObject_GetDictPtr(inst); + if (dictptr != NULL) { + dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + } + PyDict_SetItem(dict, SWIG_This(), swig_this); + return; + } +#endif + dict = PyObject_GetAttrString(inst, (char*)"__dict__"); + PyDict_SetItem(dict, SWIG_This(), swig_this); + Py_DECREF(dict); +} + + +SWIGINTERN PyObject * +SWIG_Python_InitShadowInstance(PyObject *args) { + PyObject *obj[2]; + if (!SWIG_Python_UnpackTuple(args,(char*)"swiginit", 2, 2, obj)) { + return NULL; + } else { + SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); + if (sthis) { + SwigPyObject_append((PyObject*) sthis, obj[1]); + } else { + SWIG_Python_SetSwigThis(obj[0], obj[1]); + } + return SWIG_Py_Void(); + } +} + +/* Create a new pointer object */ + +SWIGRUNTIME PyObject * +SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int flags) { + if (!ptr) { + return SWIG_Py_Void(); + } else { + int own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; + PyObject *robj = SwigPyObject_New(ptr, type, own); + SwigPyClientData *clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; + if (clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { + PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); + if (inst) { + Py_DECREF(robj); + robj = inst; + } + } + return robj; + } +} + +/* Create a new packed object */ + +SWIGRUNTIMEINLINE PyObject * +SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { + return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); +} + +/* -----------------------------------------------------------------------------* + * Get type list + * -----------------------------------------------------------------------------*/ + +#ifdef SWIG_LINK_RUNTIME +void *SWIG_ReturnGlobalTypeList(void *); +#endif + +SWIGRUNTIME swig_module_info * +SWIG_Python_GetModule(void) { + static void *type_pointer = (void *)0; + /* first check if module already created */ + if (!type_pointer) { +#ifdef SWIG_LINK_RUNTIME + type_pointer = SWIG_ReturnGlobalTypeList((void *)0); +#else + type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, + (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); + if (PyErr_Occurred()) { + PyErr_Clear(); + type_pointer = (void *)0; + } +#endif + } + return (swig_module_info *) type_pointer; +} + +#if PY_MAJOR_VERSION < 2 +/* PyModule_AddObject function was introduced in Python 2.0. The following function + is copied out of Python/modsupport.c in python version 2.3.4 */ +SWIGINTERN int +PyModule_AddObject(PyObject *m, char *name, PyObject *o) +{ + PyObject *dict; + if (!PyModule_Check(m)) { + PyErr_SetString(PyExc_TypeError, + "PyModule_AddObject() needs module as first arg"); + return SWIG_ERROR; + } + if (!o) { + PyErr_SetString(PyExc_TypeError, + "PyModule_AddObject() needs non-NULL value"); + return SWIG_ERROR; + } + + dict = PyModule_GetDict(m); + if (dict == NULL) { + /* Internal error -- modules must have a dict! */ + PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", + PyModule_GetName(m)); + return SWIG_ERROR; + } + if (PyDict_SetItemString(dict, name, o)) + return SWIG_ERROR; + Py_DECREF(o); + return SWIG_OK; +} +#endif + +SWIGRUNTIME void +SWIG_Python_DestroyModule(void *vptr) +{ + swig_module_info *swig_module = (swig_module_info *) vptr; + swig_type_info **types = swig_module->types; + size_t i; + for (i =0; i < swig_module->size; ++i) { + swig_type_info *ty = types[i]; + if (ty->owndata) { + SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; + if (data) SwigPyClientData_Del(data); + } + } + Py_DECREF(SWIG_This()); +} + +SWIGRUNTIME void +SWIG_Python_SetModule(swig_module_info *swig_module) { + static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} };/* Sentinel */ + +#if PY_VERSION_HEX >= 0x03000000 + /* Add a dummy module object into sys.modules */ + PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION); +#else + PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, + swig_empty_runtime_method_table); +#endif + PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule); + if (pointer && module) { + PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); + } else { + Py_XDECREF(pointer); + } +} + +/* The python cached type query */ +SWIGRUNTIME PyObject * +SWIG_Python_TypeCache(void) { + static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); + return cache; +} + +SWIGRUNTIME swig_type_info * +SWIG_Python_TypeQuery(const char *type) +{ + PyObject *cache = SWIG_Python_TypeCache(); + PyObject *key = SWIG_Python_str_FromChar(type); + PyObject *obj = PyDict_GetItem(cache, key); + swig_type_info *descriptor; + if (obj) { + descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj); + } else { + swig_module_info *swig_module = SWIG_Python_GetModule(); + descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); + if (descriptor) { + obj = PyCObject_FromVoidPtr(descriptor, NULL); + PyDict_SetItem(cache, key, obj); + Py_DECREF(obj); + } + } + Py_DECREF(key); + return descriptor; +} + +/* + For backward compatibility only +*/ +#define SWIG_POINTER_EXCEPTION 0 +#define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) +#define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) + +SWIGRUNTIME int +SWIG_Python_AddErrMesg(const char* mesg, int infront) +{ + if (PyErr_Occurred()) { + PyObject *type = 0; + PyObject *value = 0; + PyObject *traceback = 0; + PyErr_Fetch(&type, &value, &traceback); + if (value) { + char *tmp; + PyObject *old_str = PyObject_Str(value); + Py_XINCREF(type); + PyErr_Clear(); + if (infront) { + PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str)); + } else { + PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); + } + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(old_str); + } + return 1; + } else { + return 0; + } +} + +SWIGRUNTIME int +SWIG_Python_ArgFail(int argnum) +{ + if (PyErr_Occurred()) { + /* add information about failing argument */ + char mesg[256]; + PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); + return SWIG_Python_AddErrMesg(mesg, 1); + } else { + return 0; + } +} + +SWIGRUNTIMEINLINE const char * +SwigPyObject_GetDesc(PyObject *self) +{ + SwigPyObject *v = (SwigPyObject *)self; + swig_type_info *ty = v ? v->ty : 0; + return ty ? ty->str : (char*)""; +} + +SWIGRUNTIME void +SWIG_Python_TypeError(const char *type, PyObject *obj) +{ + if (type) { +#if defined(SWIG_COBJECT_TYPES) + if (obj && SwigPyObject_Check(obj)) { + const char *otype = (const char *) SwigPyObject_GetDesc(obj); + if (otype) { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", + type, otype); + return; + } + } else +#endif + { + const char *otype = (obj ? obj->ob_type->tp_name : 0); + if (otype) { + PyObject *str = PyObject_Str(obj); + const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; + if (cstr) { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", + type, otype, cstr); + SWIG_Python_str_DelForPy3(cstr); + } else { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", + type, otype); + } + Py_XDECREF(str); + return; + } + } + PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); + } else { + PyErr_Format(PyExc_TypeError, "unexpected type is received"); + } +} + + +/* Convert a pointer value, signal an exception on a type mismatch */ +SWIGRUNTIME void * +SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) { + void *result; + if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { + PyErr_Clear(); +#if SWIG_POINTER_EXCEPTION + if (flags) { + SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); + SWIG_Python_ArgFail(argnum); + } +#endif + } + return result; +} + + +#ifdef __cplusplus +#if 0 +{ /* cc-mode */ +#endif +} +#endif + + + +#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) + +#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else + + + +/* -------- TYPES TABLE (BEGIN) -------- */ + +#define SWIGTYPE_p_char swig_types[0] +#define SWIGTYPE_p_ctb__IOBase swig_types[1] +#define SWIGTYPE_p_ctb__SerialPort swig_types[2] +#define SWIGTYPE_p_ctb__SerialPort_DCS swig_types[3] +#define SWIGTYPE_p_ctb__SerialPort_EINFO swig_types[4] +#define SWIGTYPE_p_ctb__SerialPort_x swig_types[5] +#define SWIGTYPE_p_ctb__Timer swig_types[6] +#define SWIGTYPE_p_ctb__timer_control swig_types[7] +#define SWIGTYPE_p_f_p_void__p_void swig_types[8] +#define SWIGTYPE_p_int swig_types[9] +#define SWIGTYPE_p_p_char swig_types[10] +static swig_type_info *swig_types[12]; +static swig_module_info swig_module = {swig_types, 11, 0, 0, 0, 0}; +#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) +#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) + +/* -------- TYPES TABLE (END) -------- */ + +#if (PY_VERSION_HEX <= 0x02000000) +# if !defined(SWIG_PYTHON_CLASSIC) +# error "This python version requires swig to be run with the '-classic' option" +# endif +#endif +#if (PY_VERSION_HEX <= 0x02020000) +# error "This python version requires swig to be run with the '-nomodern' option" +#endif +#if (PY_VERSION_HEX <= 0x02020000) +# error "This python version requires swig to be run with the '-nomodernargs' option" +#endif + +/*----------------------------------------------- + @(target):= _wxctb.so + ------------------------------------------------*/ +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_init PyInit__wxctb + +#else +# define SWIG_init init_wxctb + +#endif +#define SWIG_name "_wxctb" + +#define SWIGVERSION 0x010340 +#define SWIG_VERSION SWIGVERSION + + +#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) +#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) + + +#include + + +namespace swig { + class SwigPtr_PyObject { + protected: + PyObject *_obj; + + public: + SwigPtr_PyObject() :_obj(0) + { + } + + SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj) + { + Py_XINCREF(_obj); + } + + SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj) + { + if (initial_ref) { + Py_XINCREF(_obj); + } + } + + SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) + { + Py_XINCREF(item._obj); + Py_XDECREF(_obj); + _obj = item._obj; + return *this; + } + + ~SwigPtr_PyObject() + { + Py_XDECREF(_obj); + } + + operator PyObject *() const + { + return _obj; + } + + PyObject *operator->() const + { + return _obj; + } + }; +} + + +namespace swig { + struct SwigVar_PyObject : SwigPtr_PyObject { + SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { } + + SwigVar_PyObject & operator = (PyObject* obj) + { + Py_XDECREF(_obj); + _obj = obj; + return *this; + } + }; +} + + +#include "ctb-0.16/linux/timer.h" + + + static int *new_intp() { + return (new int); + } + + static int *copy_intp(int value) { + return (new int(static_cast< const int& >(value))); + } + + static void delete_intp(int *self) { + if (self) delete self; + } + + static void intp_assign(int *self, int value) { + *self = value; + } + + static int intp_value(int *self) { + return *self; + } + + +#include +#if !defined(SWIG_NO_LLONG_MAX) +# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) +# define LLONG_MAX __LONG_LONG_MAX__ +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +# endif +#endif + + +SWIGINTERN int +SWIG_AsVal_double (PyObject *obj, double *val) +{ + int res = SWIG_TypeError; + if (PyFloat_Check(obj)) { + if (val) *val = PyFloat_AsDouble(obj); + return SWIG_OK; + } else if (PyInt_Check(obj)) { + if (val) *val = PyInt_AsLong(obj); + return SWIG_OK; + } else if (PyLong_Check(obj)) { + double v = PyLong_AsDouble(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + } + } +#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + double d = PyFloat_AsDouble(obj); + if (!PyErr_Occurred()) { + if (val) *val = d; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + long v = PyLong_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); + } else { + PyErr_Clear(); + } + } + } +#endif + return res; +} + + +#include + + +#include + + +SWIGINTERNINLINE int +SWIG_CanCastAsInteger(double *d, double min, double max) { + double x = *d; + if ((min <= x && x <= max)) { + double fx = floor(x); + double cx = ceil(x); + double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ + if ((errno == EDOM) || (errno == ERANGE)) { + errno = 0; + } else { + double summ, reps, diff; + if (rd < x) { + diff = x - rd; + } else if (rd > x) { + diff = rd - x; + } else { + return 1; + } + summ = rd + x; + reps = diff/summ; + if (reps < 8*DBL_EPSILON) { + *d = rd; + return 1; + } + } + } + return 0; +} + + +SWIGINTERN int +SWIG_AsVal_long (PyObject *obj, long* val) +{ + if (PyInt_Check(obj)) { + if (val) *val = PyInt_AsLong(obj); + return SWIG_OK; + } else if (PyLong_Check(obj)) { + long v = PyLong_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + } + } +#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + long v = PyInt_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { + if (val) *val = (long)(d); + return res; + } + } + } +#endif + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsVal_int (PyObject * obj, int *val) +{ + long v; + int res = SWIG_AsVal_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v < INT_MIN || v > INT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< int >(v); + } + } + return res; +} + + + #define SWIG_From_long PyInt_FromLong + + +SWIGINTERNINLINE PyObject * +SWIG_From_int (int value) +{ + return SWIG_From_long (value); +} + + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) +{ + if (PyInt_Check(obj)) { + long v = PyInt_AsLong(obj); + if (v >= 0) { + if (val) *val = v; + return SWIG_OK; + } else { + return SWIG_OverflowError; + } + } else if (PyLong_Check(obj)) { + unsigned long v = PyLong_AsUnsignedLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + } + } +#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + unsigned long v = PyLong_AsUnsignedLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { + if (val) *val = (unsigned long)(d); + return res; + } + } + } +#endif + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_int (PyObject * obj, unsigned int *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v > UINT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< unsigned int >(v); + } + } + return res; +} + + +SWIGINTERNINLINE PyObject* +SWIG_From_unsigned_SS_long (unsigned long value) +{ + return (value > LONG_MAX) ? + PyLong_FromUnsignedLong(value) : PyInt_FromLong(static_cast< long >(value)); +} + + +SWIGINTERNINLINE PyObject * +SWIG_From_unsigned_SS_int (unsigned int value) +{ + return SWIG_From_unsigned_SS_long (value); +} + + +#include "ctb-0.16/linux/serport.h" + + +#include "ctb-0.16/serportx.h" + + +#include "ctb-0.16/iobase.h" + + +SWIGINTERN swig_type_info* +SWIG_pchar_descriptor(void) +{ + static int init = 0; + static swig_type_info* info = 0; + if (!init) { + info = SWIG_TypeQuery("_p_char"); + init = 1; + } + return info; +} + + +SWIGINTERNINLINE PyObject * +SWIG_FromCharPtrAndSize(const char* carray, size_t size) +{ + if (carray) { + if (size > INT_MAX) { + swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); + return pchar_descriptor ? + SWIG_NewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void(); + } else { +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_FromStringAndSize(carray, static_cast< int >(size)); +#else + return PyString_FromStringAndSize(carray, static_cast< int >(size)); +#endif + } + } else { + return SWIG_Py_Void(); + } +} + + +SWIGINTERNINLINE PyObject * +SWIG_FromCharPtr(const char *cptr) +{ + return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); +} + + +SWIGINTERN int +SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) +{ +#if PY_VERSION_HEX>=0x03000000 + if (PyUnicode_Check(obj)) +#else + if (PyString_Check(obj)) +#endif + { + char *cstr; Py_ssize_t len; +#if PY_VERSION_HEX>=0x03000000 + if (!alloc && cptr) { + /* We can't allow converting without allocation, since the internal + representation of string in Python 3 is UCS-2/UCS-4 but we require + a UTF-8 representation. + TODO(bhy) More detailed explanation */ + return SWIG_RuntimeError; + } + obj = PyUnicode_AsUTF8String(obj); + PyBytes_AsStringAndSize(obj, &cstr, &len); + if(alloc) *alloc = SWIG_NEWOBJ; +#else + PyString_AsStringAndSize(obj, &cstr, &len); +#endif + if (cptr) { + if (alloc) { + /* + In python the user should not be able to modify the inner + string representation. To warranty that, if you define + SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string + buffer is always returned. + + The default behavior is just to return the pointer value, + so, be careful. + */ +#if defined(SWIG_PYTHON_SAFE_CSTRINGS) + if (*alloc != SWIG_OLDOBJ) +#else + if (*alloc == SWIG_NEWOBJ) +#endif + { + *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1))); + *alloc = SWIG_NEWOBJ; + } + else { + *cptr = cstr; + *alloc = SWIG_OLDOBJ; + } + } else { + #if PY_VERSION_HEX>=0x03000000 + assert(0); /* Should never reach here in Python 3 */ + #endif + *cptr = SWIG_Python_str_AsChar(obj); + } + } + if (psize) *psize = len + 1; +#if PY_VERSION_HEX>=0x03000000 + Py_XDECREF(obj); +#endif + return SWIG_OK; + } else { + swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); + if (pchar_descriptor) { + void* vptr = 0; + if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { + if (cptr) *cptr = (char *) vptr; + if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; + if (alloc) *alloc = SWIG_OLDOBJ; + return SWIG_OK; + } + } + } + return SWIG_TypeError; +} + + + + + +SWIGINTERN int +SWIG_AsCharArray(PyObject * obj, char *val, size_t size) +{ + char* cptr = 0; size_t csize = 0; int alloc = SWIG_OLDOBJ; + int res = SWIG_AsCharPtrAndSize(obj, &cptr, &csize, &alloc); + if (SWIG_IsOK(res)) { + if ((csize == size + 1) && cptr && !(cptr[csize-1])) --csize; + if (csize <= size) { + if (val) { + if (csize) memcpy(val, cptr, csize*sizeof(char)); + if (csize < size) memset(val + csize, 0, (size - csize)*sizeof(char)); + } + if (alloc == SWIG_NEWOBJ) { + delete[] cptr; + res = SWIG_DelNewMask(res); + } + return res; + } + if (alloc == SWIG_NEWOBJ) delete[] cptr; + } + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsVal_char (PyObject * obj, char *val) +{ + int res = SWIG_AsCharArray(obj, val, 1); + if (!SWIG_IsOK(res)) { + long v; + res = SWIG_AddCast(SWIG_AsVal_long (obj, &v)); + if (SWIG_IsOK(res)) { + if ((CHAR_MIN <= v) && (v <= CHAR_MAX)) { + if (val) *val = static_cast< char >(v); + } else { + res = SWIG_OverflowError; + } + } + } + return res; +} + + +SWIGINTERNINLINE int +SWIG_AsVal_size_t (PyObject * obj, size_t *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0); + if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v); + return res; +} + + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_char (PyObject * obj, unsigned char *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v > UCHAR_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< unsigned char >(v); + } + } + return res; +} + + +SWIGINTERNINLINE PyObject * +SWIG_From_unsigned_SS_char (unsigned char value) +{ + return SWIG_From_unsigned_SS_long (value); +} + + +SWIGINTERN int +SWIG_AsVal_bool (PyObject *obj, bool *val) +{ + int r = PyObject_IsTrue(obj); + if (r == -1) + return SWIG_ERROR; + if (val) *val = r ? true : false; + return SWIG_OK; +} + + +SWIGINTERNINLINE PyObject* + SWIG_From_bool (bool value) +{ + return PyBool_FromLong(value ? 1 : 0); +} + + +#include "ctb-0.16/kbhit.h" + + +SWIGINTERNINLINE PyObject * +SWIG_From_char (char c) +{ + return SWIG_FromCharPtrAndSize(&c,1); +} + +#ifdef __cplusplus +extern "C" { +#endif +SWIGINTERN PyObject *_wrap_new_intp(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int *result = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"new_intp",0,0)) SWIG_fail; + result = (int *)new_intp(); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_int, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_copy_intp(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + int arg1 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + char * kwnames[] = { + (char *) "value", NULL + }; + int *result = 0 ; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"O:copy_intp",kwnames,&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "copy_intp" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (int *)copy_intp(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_int, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_intp(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + int *arg1 = (int *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char * kwnames[] = { + (char *) "self", NULL + }; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"O:delete_intp",kwnames,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_int, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_intp" "', argument " "1"" of type '" "int *""'"); + } + arg1 = reinterpret_cast< int * >(argp1); + delete_intp(arg1); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_intp_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + int *arg1 = (int *) 0 ; + int arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "value", NULL + }; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:intp_assign",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_int, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "intp_assign" "', argument " "1"" of type '" "int *""'"); + } + arg1 = reinterpret_cast< int * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "intp_assign" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + intp_assign(arg1,arg2); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_intp_value(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + int *arg1 = (int *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char * kwnames[] = { + (char *) "self", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"O:intp_value",kwnames,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_int, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "intp_value" "', argument " "1"" of type '" "int *""'"); + } + arg1 = reinterpret_cast< int * >(argp1); + result = (int)intp_value(arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_timer_control_usecs_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::timer_control *arg1 = (ctb::timer_control *) 0 ; + unsigned int arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + unsigned int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"timer_control_usecs_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__timer_control, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "timer_control_usecs_set" "', argument " "1"" of type '" "ctb::timer_control *""'"); + } + arg1 = reinterpret_cast< ctb::timer_control * >(argp1); + ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "timer_control_usecs_set" "', argument " "2"" of type '" "unsigned int""'"); + } + arg2 = static_cast< unsigned int >(val2); + if (arg1) (arg1)->usecs = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_timer_control_usecs_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::timer_control *arg1 = (ctb::timer_control *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + unsigned int result; + + if(!PyArg_UnpackTuple(args,(char *)"timer_control_usecs_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__timer_control, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "timer_control_usecs_get" "', argument " "1"" of type '" "ctb::timer_control *""'"); + } + arg1 = reinterpret_cast< ctb::timer_control * >(argp1); + result = (unsigned int) ((arg1)->usecs); + resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_timer_control_exitflag_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::timer_control *arg1 = (ctb::timer_control *) 0 ; + int *arg2 = (int *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"timer_control_exitflag_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__timer_control, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "timer_control_exitflag_set" "', argument " "1"" of type '" "ctb::timer_control *""'"); + } + arg1 = reinterpret_cast< ctb::timer_control * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "timer_control_exitflag_set" "', argument " "2"" of type '" "int *""'"); + } + arg2 = reinterpret_cast< int * >(argp2); + if (arg1) (arg1)->exitflag = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_timer_control_exitflag_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::timer_control *arg1 = (ctb::timer_control *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int *result = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"timer_control_exitflag_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__timer_control, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "timer_control_exitflag_get" "', argument " "1"" of type '" "ctb::timer_control *""'"); + } + arg1 = reinterpret_cast< ctb::timer_control * >(argp1); + result = (int *) ((arg1)->exitflag); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_int, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_timer_control_exitfnc_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::timer_control *arg1 = (ctb::timer_control *) 0 ; + void *(*arg2)(void *) = (void *(*)(void *)) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"timer_control_exitfnc_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__timer_control, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "timer_control_exitfnc_set" "', argument " "1"" of type '" "ctb::timer_control *""'"); + } + arg1 = reinterpret_cast< ctb::timer_control * >(argp1); + { + int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_void__p_void); + if (!SWIG_IsOK(res)) { + SWIG_exception_fail(SWIG_ArgError(res), "in method '" "timer_control_exitfnc_set" "', argument " "2"" of type '" "void *(*)(void *)""'"); + } + } + if (arg1) (arg1)->exitfnc = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_timer_control_exitfnc_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::timer_control *arg1 = (ctb::timer_control *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + void *(*result)(void *) = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"timer_control_exitfnc_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__timer_control, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "timer_control_exitfnc_get" "', argument " "1"" of type '" "ctb::timer_control *""'"); + } + arg1 = reinterpret_cast< ctb::timer_control * >(argp1); + result = (void *(*)(void *)) ((arg1)->exitfnc); + resultobj = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_void__p_void); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *timer_control_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_UnpackTuple(args,(char*)"swigregister", 1, 1,&obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_ctb__timer_control, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_new_Timer(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + unsigned int arg1 ; + int *arg2 = (int *) 0 ; + void *(*arg3)(void *) = (void *(*)(void *)) NULL ; + unsigned int val1 ; + int ecode1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char * kwnames[] = { + (char *) "msec",(char *) "exitflag",(char *) "exitfnc", NULL + }; + ctb::Timer *result = 0 ; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO|O:new_Timer",kwnames,&obj0,&obj1,&obj2)) SWIG_fail; + ecode1 = SWIG_AsVal_unsigned_SS_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Timer" "', argument " "1"" of type '" "unsigned int""'"); + } + arg1 = static_cast< unsigned int >(val1); + res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Timer" "', argument " "2"" of type '" "int *""'"); + } + arg2 = reinterpret_cast< int * >(argp2); + if (obj2) { + { + int res = SWIG_ConvertFunctionPtr(obj2, (void**)(&arg3), SWIGTYPE_p_f_p_void__p_void); + if (!SWIG_IsOK(res)) { + SWIG_exception_fail(SWIG_ArgError(res), "in method '" "new_Timer" "', argument " "3"" of type '" "void *(*)(void *)""'"); + } + } + } + result = (ctb::Timer *)new ctb::Timer(arg1,arg2,arg3); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ctb__Timer, SWIG_POINTER_NEW | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_Timer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::Timer *arg1 = (ctb::Timer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"delete_Timer",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__Timer, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Timer" "', argument " "1"" of type '" "ctb::Timer *""'"); + } + arg1 = reinterpret_cast< ctb::Timer * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Timer_start(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::Timer *arg1 = (ctb::Timer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if(!PyArg_UnpackTuple(args,(char *)"Timer_start",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__Timer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Timer_start" "', argument " "1"" of type '" "ctb::Timer *""'"); + } + arg1 = reinterpret_cast< ctb::Timer * >(argp1); + result = (int)(arg1)->start(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Timer_stop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::Timer *arg1 = (ctb::Timer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if(!PyArg_UnpackTuple(args,(char *)"Timer_stop",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__Timer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Timer_stop" "', argument " "1"" of type '" "ctb::Timer *""'"); + } + arg1 = reinterpret_cast< ctb::Timer * >(argp1); + result = (int)(arg1)->stop(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *Timer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_UnpackTuple(args,(char*)"swigregister", 1, 1,&obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_ctb__Timer, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_sleepms(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + unsigned int arg1 ; + unsigned int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + char * kwnames[] = { + (char *) "ms", NULL + }; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"O:sleepms",kwnames,&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_unsigned_SS_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "sleepms" "', argument " "1"" of type '" "unsigned int""'"); + } + arg1 = static_cast< unsigned int >(val1); + ctb::sleepms(arg1); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_IOBase(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::IOBase *arg1 = (ctb::IOBase *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"delete_IOBase",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__IOBase, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IOBase" "', argument " "1"" of type '" "ctb::IOBase *""'"); + } + arg1 = reinterpret_cast< ctb::IOBase * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_IOBase_ClassName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::IOBase *arg1 = (ctb::IOBase *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"IOBase_ClassName",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__IOBase, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IOBase_ClassName" "', argument " "1"" of type '" "ctb::IOBase *""'"); + } + arg1 = reinterpret_cast< ctb::IOBase * >(argp1); + result = (char *)(arg1)->ClassName(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_IOBase_Close(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::IOBase *arg1 = (ctb::IOBase *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if(!PyArg_UnpackTuple(args,(char *)"IOBase_Close",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__IOBase, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IOBase_Close" "', argument " "1"" of type '" "ctb::IOBase *""'"); + } + arg1 = reinterpret_cast< ctb::IOBase * >(argp1); + result = (int)(arg1)->Close(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_IOBase_Ioctl(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::IOBase *arg1 = (ctb::IOBase *) 0 ; + int arg2 ; + void *arg3 = (void *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int res3 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "cmd",(char *) "args", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OOO:IOBase_Ioctl",kwnames,&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__IOBase, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IOBase_Ioctl" "', argument " "1"" of type '" "ctb::IOBase *""'"); + } + arg1 = reinterpret_cast< ctb::IOBase * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IOBase_Ioctl" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3), 0, 0); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IOBase_Ioctl" "', argument " "3"" of type '" "void *""'"); + } + result = (int)(arg1)->Ioctl(arg2,arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_IOBase_IsOpen(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::IOBase *arg1 = (ctb::IOBase *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if(!PyArg_UnpackTuple(args,(char *)"IOBase_IsOpen",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__IOBase, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IOBase_IsOpen" "', argument " "1"" of type '" "ctb::IOBase *""'"); + } + arg1 = reinterpret_cast< ctb::IOBase * >(argp1); + result = (int)(arg1)->IsOpen(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_IOBase_Open(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::IOBase *arg1 = (ctb::IOBase *) 0 ; + char *arg2 = (char *) 0 ; + void *arg3 = (void *) 0L ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "devname",(char *) "dcs", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO|O:IOBase_Open",kwnames,&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__IOBase, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IOBase_Open" "', argument " "1"" of type '" "ctb::IOBase *""'"); + } + arg1 = reinterpret_cast< ctb::IOBase * >(argp1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IOBase_Open" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + if (obj2) { + res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3), 0, 0); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IOBase_Open" "', argument " "3"" of type '" "void *""'"); + } + } + result = (int)(arg1)->Open((char const *)arg2,arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_IOBase_PutBack(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::IOBase *arg1 = (ctb::IOBase *) 0 ; + char arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + char val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "ch", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:IOBase_PutBack",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__IOBase, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IOBase_PutBack" "', argument " "1"" of type '" "ctb::IOBase *""'"); + } + arg1 = reinterpret_cast< ctb::IOBase * >(argp1); + ecode2 = SWIG_AsVal_char(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IOBase_PutBack" "', argument " "2"" of type '" "char""'"); + } + arg2 = static_cast< char >(val2); + result = (int)(arg1)->PutBack(arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_IOBase_Read(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::IOBase *arg1 = (ctb::IOBase *) 0 ; + char *arg2 = (char *) 0 ; + size_t arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + size_t val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "buf",(char *) "len", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OOO:IOBase_Read",kwnames,&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__IOBase, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IOBase_Read" "', argument " "1"" of type '" "ctb::IOBase *""'"); + } + arg1 = reinterpret_cast< ctb::IOBase * >(argp1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IOBase_Read" "', argument " "2"" of type '" "char *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + ecode3 = SWIG_AsVal_size_t(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IOBase_Read" "', argument " "3"" of type '" "size_t""'"); + } + arg3 = static_cast< size_t >(val3); + result = (int)(arg1)->Read(arg2,arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_IOBase_ReadUntilEOS(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::IOBase *arg1 = (ctb::IOBase *) 0 ; + char **arg2 = 0 ; + size_t *arg3 = (size_t *) 0 ; + char *arg4 = (char *) "\n" ; + long arg5 = (long) 1000L ; + char arg6 = (char) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + char *tmp2 ; + size_t tmp3 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + long val5 ; + int ecode5 = 0 ; + char val6 ; + int ecode6 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "readbuf",(char *) "readedBytes",(char *) "eosString",(char *) "timeout_in_ms",(char *) "quota", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OOO|OOO:IOBase_ReadUntilEOS",kwnames,&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__IOBase, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IOBase_ReadUntilEOS" "', argument " "1"" of type '" "ctb::IOBase *""'"); + } + arg1 = reinterpret_cast< ctb::IOBase * >(argp1); + { + /* dont check for list */ + arg2 = &tmp2; + } + { + /* dont check for list */ + arg3 = &tmp3; + } + if (obj3) { + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "IOBase_ReadUntilEOS" "', argument " "4"" of type '" "char *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + } + if (obj4) { + ecode5 = SWIG_AsVal_long(obj4, &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "IOBase_ReadUntilEOS" "', argument " "5"" of type '" "long""'"); + } + arg5 = static_cast< long >(val5); + } + if (obj5) { + ecode6 = SWIG_AsVal_char(obj5, &val6); + if (!SWIG_IsOK(ecode6)) { + SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "IOBase_ReadUntilEOS" "', argument " "6"" of type '" "char""'"); + } + arg6 = static_cast< char >(val6); + } + result = (int)(arg1)->ReadUntilEOS(*arg2,arg3,arg4,arg5,arg6); + resultobj = SWIG_From_int(static_cast< int >(result)); + { + PyObject * plist = PyList_New(2); + PyList_SetItem(plist, 0, PyString_FromString(*arg2)); + PyList_SetItem(plist, 1, resultobj); + resultobj = plist; + delete *arg2; + } + { + PyList_Append(resultobj, PyInt_FromLong(*arg3)); + } + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_IOBase_Readv(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::IOBase *arg1 = (ctb::IOBase *) 0 ; + char *arg2 = (char *) 0 ; + size_t arg3 ; + unsigned int arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + size_t val3 ; + int ecode3 = 0 ; + unsigned int val4 ; + int ecode4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "buf",(char *) "len",(char *) "timeout_in_ms", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OOOO:IOBase_Readv",kwnames,&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__IOBase, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IOBase_Readv" "', argument " "1"" of type '" "ctb::IOBase *""'"); + } + arg1 = reinterpret_cast< ctb::IOBase * >(argp1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IOBase_Readv" "', argument " "2"" of type '" "char *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + ecode3 = SWIG_AsVal_size_t(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IOBase_Readv" "', argument " "3"" of type '" "size_t""'"); + } + arg3 = static_cast< size_t >(val3); + ecode4 = SWIG_AsVal_unsigned_SS_int(obj3, &val4); + if (!SWIG_IsOK(ecode4)) { + SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IOBase_Readv" "', argument " "4"" of type '" "unsigned int""'"); + } + arg4 = static_cast< unsigned int >(val4); + result = (int)(arg1)->Readv(arg2,arg3,arg4); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_IOBase_Write(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::IOBase *arg1 = (ctb::IOBase *) 0 ; + char *arg2 = (char *) 0 ; + size_t arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + size_t val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "buf",(char *) "len", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OOO:IOBase_Write",kwnames,&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__IOBase, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IOBase_Write" "', argument " "1"" of type '" "ctb::IOBase *""'"); + } + arg1 = reinterpret_cast< ctb::IOBase * >(argp1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IOBase_Write" "', argument " "2"" of type '" "char *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + ecode3 = SWIG_AsVal_size_t(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IOBase_Write" "', argument " "3"" of type '" "size_t""'"); + } + arg3 = static_cast< size_t >(val3); + result = (int)(arg1)->Write(arg2,arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_IOBase_Writev(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::IOBase *arg1 = (ctb::IOBase *) 0 ; + char *arg2 = (char *) 0 ; + size_t arg3 ; + unsigned int arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + size_t val3 ; + int ecode3 = 0 ; + unsigned int val4 ; + int ecode4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "buf",(char *) "len",(char *) "timeout_in_ms", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OOOO:IOBase_Writev",kwnames,&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__IOBase, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IOBase_Writev" "', argument " "1"" of type '" "ctb::IOBase *""'"); + } + arg1 = reinterpret_cast< ctb::IOBase * >(argp1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IOBase_Writev" "', argument " "2"" of type '" "char *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + ecode3 = SWIG_AsVal_size_t(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IOBase_Writev" "', argument " "3"" of type '" "size_t""'"); + } + arg3 = static_cast< size_t >(val3); + ecode4 = SWIG_AsVal_unsigned_SS_int(obj3, &val4); + if (!SWIG_IsOK(ecode4)) { + SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IOBase_Writev" "', argument " "4"" of type '" "unsigned int""'"); + } + arg4 = static_cast< unsigned int >(val4); + result = (int)(arg1)->Writev(arg2,arg3,arg4); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *IOBase_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_UnpackTuple(args,(char*)"swigregister", 1, 1,&obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_ctb__IOBase, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_baud_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + int arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_baud_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_baud_set" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_DCS_baud_set" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + if (arg1) (arg1)->baud = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_baud_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_baud_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_baud_get" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + result = (int) ((arg1)->baud); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_parity_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + ctb::Parity arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_parity_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_parity_set" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_DCS_parity_set" "', argument " "2"" of type '" "ctb::Parity""'"); + } + arg2 = static_cast< ctb::Parity >(val2); + if (arg1) (arg1)->parity = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_parity_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + ctb::Parity result; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_parity_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_parity_get" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + result = (ctb::Parity) ((arg1)->parity); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_wordlen_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + unsigned char arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + unsigned char val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_wordlen_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_wordlen_set" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_DCS_wordlen_set" "', argument " "2"" of type '" "unsigned char""'"); + } + arg2 = static_cast< unsigned char >(val2); + if (arg1) (arg1)->wordlen = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_wordlen_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + unsigned char result; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_wordlen_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_wordlen_get" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + result = (unsigned char) ((arg1)->wordlen); + resultobj = SWIG_From_unsigned_SS_char(static_cast< unsigned char >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_stopbits_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + unsigned char arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + unsigned char val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_stopbits_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_stopbits_set" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_DCS_stopbits_set" "', argument " "2"" of type '" "unsigned char""'"); + } + arg2 = static_cast< unsigned char >(val2); + if (arg1) (arg1)->stopbits = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_stopbits_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + unsigned char result; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_stopbits_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_stopbits_get" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + result = (unsigned char) ((arg1)->stopbits); + resultobj = SWIG_From_unsigned_SS_char(static_cast< unsigned char >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_rtscts_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + bool arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_rtscts_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_rtscts_set" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + ecode2 = SWIG_AsVal_bool(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_DCS_rtscts_set" "', argument " "2"" of type '" "bool""'"); + } + arg2 = static_cast< bool >(val2); + if (arg1) (arg1)->rtscts = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_rtscts_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + bool result; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_rtscts_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_rtscts_get" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + result = (bool) ((arg1)->rtscts); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_xonxoff_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + bool arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_xonxoff_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_xonxoff_set" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + ecode2 = SWIG_AsVal_bool(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_DCS_xonxoff_set" "', argument " "2"" of type '" "bool""'"); + } + arg2 = static_cast< bool >(val2); + if (arg1) (arg1)->xonxoff = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_xonxoff_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + bool result; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_xonxoff_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_xonxoff_get" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + result = (bool) ((arg1)->xonxoff); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_buf_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + char *arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + char temp2[16] ; + int res2 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_buf_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_buf_set" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + res2 = SWIG_AsCharArray(obj1, temp2, 16); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SerialPort_DCS_buf_set" "', argument " "2"" of type '" "char [16]""'"); + } + arg2 = reinterpret_cast< char * >(temp2); + if (arg2) memcpy(arg1->buf,arg2,16*sizeof(char)); + else memset(arg1->buf,0,16*sizeof(char)); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_buf_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_buf_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_buf_get" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + result = (char *)(char *) ((arg1)->buf); + { + size_t size = 16; + + while (size && (result[size - 1] == '\0')) --size; + + resultobj = SWIG_FromCharPtrAndSize(result, size); + } + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_new_SerialPort_DCS(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *result = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"new_SerialPort_DCS",0,0)) SWIG_fail; + result = (ctb::SerialPort_DCS *)new ctb::SerialPort_DCS(); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ctb__SerialPort_DCS, SWIG_POINTER_NEW | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_SerialPort_DCS(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"delete_SerialPort_DCS",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SerialPort_DCS" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_DCS_GetSettings(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_DCS *arg1 = (ctb::SerialPort_DCS *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_DCS_GetSettings",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_DCS, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_DCS_GetSettings" "', argument " "1"" of type '" "ctb::SerialPort_DCS *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_DCS * >(argp1); + result = (char *)(arg1)->GetSettings(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *SerialPort_DCS_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_UnpackTuple(args,(char*)"swigregister", 1, 1,&obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_ctb__SerialPort_DCS, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_SerialPort_EINFO_brk_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_EINFO *arg1 = (ctb::SerialPort_EINFO *) 0 ; + int arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_EINFO_brk_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_EINFO, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_EINFO_brk_set" "', argument " "1"" of type '" "ctb::SerialPort_EINFO *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_EINFO * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_EINFO_brk_set" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + if (arg1) (arg1)->brk = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_EINFO_brk_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_EINFO *arg1 = (ctb::SerialPort_EINFO *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_EINFO_brk_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_EINFO, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_EINFO_brk_get" "', argument " "1"" of type '" "ctb::SerialPort_EINFO *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_EINFO * >(argp1); + result = (int) ((arg1)->brk); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_EINFO_frame_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_EINFO *arg1 = (ctb::SerialPort_EINFO *) 0 ; + int arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_EINFO_frame_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_EINFO, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_EINFO_frame_set" "', argument " "1"" of type '" "ctb::SerialPort_EINFO *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_EINFO * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_EINFO_frame_set" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + if (arg1) (arg1)->frame = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_EINFO_frame_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_EINFO *arg1 = (ctb::SerialPort_EINFO *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_EINFO_frame_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_EINFO, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_EINFO_frame_get" "', argument " "1"" of type '" "ctb::SerialPort_EINFO *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_EINFO * >(argp1); + result = (int) ((arg1)->frame); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_EINFO_overrun_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_EINFO *arg1 = (ctb::SerialPort_EINFO *) 0 ; + int arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_EINFO_overrun_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_EINFO, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_EINFO_overrun_set" "', argument " "1"" of type '" "ctb::SerialPort_EINFO *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_EINFO * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_EINFO_overrun_set" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + if (arg1) (arg1)->overrun = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_EINFO_overrun_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_EINFO *arg1 = (ctb::SerialPort_EINFO *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_EINFO_overrun_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_EINFO, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_EINFO_overrun_get" "', argument " "1"" of type '" "ctb::SerialPort_EINFO *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_EINFO * >(argp1); + result = (int) ((arg1)->overrun); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_EINFO_parity_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_EINFO *arg1 = (ctb::SerialPort_EINFO *) 0 ; + int arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_EINFO_parity_set",2,2,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_EINFO, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_EINFO_parity_set" "', argument " "1"" of type '" "ctb::SerialPort_EINFO *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_EINFO * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_EINFO_parity_set" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + if (arg1) (arg1)->parity = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_EINFO_parity_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_EINFO *arg1 = (ctb::SerialPort_EINFO *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_EINFO_parity_get",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_EINFO, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_EINFO_parity_get" "', argument " "1"" of type '" "ctb::SerialPort_EINFO *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_EINFO * >(argp1); + result = (int) ((arg1)->parity); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_new_SerialPort_EINFO(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_EINFO *result = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"new_SerialPort_EINFO",0,0)) SWIG_fail; + result = (ctb::SerialPort_EINFO *)new ctb::SerialPort_EINFO(); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ctb__SerialPort_EINFO, SWIG_POINTER_NEW | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_SerialPort_EINFO(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_EINFO *arg1 = (ctb::SerialPort_EINFO *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"delete_SerialPort_EINFO",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_EINFO, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SerialPort_EINFO" "', argument " "1"" of type '" "ctb::SerialPort_EINFO *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_EINFO * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *SerialPort_EINFO_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_UnpackTuple(args,(char*)"swigregister", 1, 1,&obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_ctb__SerialPort_EINFO, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_SerialPort_x(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_x *arg1 = (ctb::SerialPort_x *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"delete_SerialPort_x",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_x, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SerialPort_x" "', argument " "1"" of type '" "ctb::SerialPort_x *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_x * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_x_ClassName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_x *arg1 = (ctb::SerialPort_x *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_x_ClassName",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_x, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_x_ClassName" "', argument " "1"" of type '" "ctb::SerialPort_x *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_x * >(argp1); + result = (char *)(arg1)->ClassName(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_x_ChangeLineState(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort_x *arg1 = (ctb::SerialPort_x *) 0 ; + ctb::SerialLineState arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "flags", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:SerialPort_x_ChangeLineState",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_x, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_x_ChangeLineState" "', argument " "1"" of type '" "ctb::SerialPort_x *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_x * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_x_ChangeLineState" "', argument " "2"" of type '" "ctb::SerialLineState""'"); + } + arg2 = static_cast< ctb::SerialLineState >(val2); + result = (int)(arg1)->ChangeLineState(arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_x_ClrLineState(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort_x *arg1 = (ctb::SerialPort_x *) 0 ; + ctb::SerialLineState arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "flags", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:SerialPort_x_ClrLineState",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_x, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_x_ClrLineState" "', argument " "1"" of type '" "ctb::SerialPort_x *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_x * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_x_ClrLineState" "', argument " "2"" of type '" "ctb::SerialLineState""'"); + } + arg2 = static_cast< ctb::SerialLineState >(val2); + result = (int)(arg1)->ClrLineState(arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_x_GetLineState(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_x *arg1 = (ctb::SerialPort_x *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_x_GetLineState",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_x, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_x_GetLineState" "', argument " "1"" of type '" "ctb::SerialPort_x *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_x * >(argp1); + result = (int)(arg1)->GetLineState(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_x_GetSettingsAsString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort_x *arg1 = (ctb::SerialPort_x *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_x_GetSettingsAsString",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_x, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_x_GetSettingsAsString" "', argument " "1"" of type '" "ctb::SerialPort_x *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_x * >(argp1); + result = (char *)(arg1)->GetSettingsAsString(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_x_Ioctl(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort_x *arg1 = (ctb::SerialPort_x *) 0 ; + int arg2 ; + void *arg3 = (void *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int res3 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "cmd",(char *) "args", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OOO:SerialPort_x_Ioctl",kwnames,&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_x, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_x_Ioctl" "', argument " "1"" of type '" "ctb::SerialPort_x *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_x * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_x_Ioctl" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3), 0, 0); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SerialPort_x_Ioctl" "', argument " "3"" of type '" "void *""'"); + } + result = (int)(arg1)->Ioctl(arg2,arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_x_SendBreak(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort_x *arg1 = (ctb::SerialPort_x *) 0 ; + int arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "duration", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:SerialPort_x_SendBreak",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_x, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_x_SendBreak" "', argument " "1"" of type '" "ctb::SerialPort_x *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_x * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_x_SendBreak" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)(arg1)->SendBreak(arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_x_SetBaudrate(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort_x *arg1 = (ctb::SerialPort_x *) 0 ; + int arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "baudrate", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:SerialPort_x_SetBaudrate",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_x, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_x_SetBaudrate" "', argument " "1"" of type '" "ctb::SerialPort_x *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_x * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_x_SetBaudrate" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)(arg1)->SetBaudrate(arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_x_SetLineState(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort_x *arg1 = (ctb::SerialPort_x *) 0 ; + ctb::SerialLineState arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "flags", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:SerialPort_x_SetLineState",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_x, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_x_SetLineState" "', argument " "1"" of type '" "ctb::SerialPort_x *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_x * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_x_SetLineState" "', argument " "2"" of type '" "ctb::SerialLineState""'"); + } + arg2 = static_cast< ctb::SerialLineState >(val2); + result = (int)(arg1)->SetLineState(arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_x_SetParityBit(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort_x *arg1 = (ctb::SerialPort_x *) 0 ; + bool arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "parity", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:SerialPort_x_SetParityBit",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort_x, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_x_SetParityBit" "', argument " "1"" of type '" "ctb::SerialPort_x *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort_x * >(argp1); + ecode2 = SWIG_AsVal_bool(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_x_SetParityBit" "', argument " "2"" of type '" "bool""'"); + } + arg2 = static_cast< bool >(val2); + result = (int)(arg1)->SetParityBit(arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_x_IsStandardRate(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + long arg1 ; + long val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + char * kwnames[] = { + (char *) "rate", NULL + }; + bool result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"O:SerialPort_x_IsStandardRate",kwnames,&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_long(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SerialPort_x_IsStandardRate" "', argument " "1"" of type '" "long""'"); + } + arg1 = static_cast< long >(val1); + result = (bool)ctb::SerialPort_x::IsStandardRate(arg1); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *SerialPort_x_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_UnpackTuple(args,(char*)"swigregister", 1, 1,&obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_ctb__SerialPort_x, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_new_SerialPort(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort *result = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"new_SerialPort",0,0)) SWIG_fail; + result = (ctb::SerialPort *)new ctb::SerialPort(); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ctb__SerialPort, SWIG_POINTER_NEW | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_SerialPort(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort *arg1 = (ctb::SerialPort *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if(!PyArg_UnpackTuple(args,(char *)"delete_SerialPort",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SerialPort" "', argument " "1"" of type '" "ctb::SerialPort *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_ChangeLineState(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort *arg1 = (ctb::SerialPort *) 0 ; + ctb::SerialLineState arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "flags", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:SerialPort_ChangeLineState",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_ChangeLineState" "', argument " "1"" of type '" "ctb::SerialPort *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_ChangeLineState" "', argument " "2"" of type '" "ctb::SerialLineState""'"); + } + arg2 = static_cast< ctb::SerialLineState >(val2); + result = (int)(arg1)->ChangeLineState(arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_ClrLineState(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort *arg1 = (ctb::SerialPort *) 0 ; + ctb::SerialLineState arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "flags", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:SerialPort_ClrLineState",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_ClrLineState" "', argument " "1"" of type '" "ctb::SerialPort *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_ClrLineState" "', argument " "2"" of type '" "ctb::SerialLineState""'"); + } + arg2 = static_cast< ctb::SerialLineState >(val2); + result = (int)(arg1)->ClrLineState(arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_GetLineState(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort *arg1 = (ctb::SerialPort *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_GetLineState",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_GetLineState" "', argument " "1"" of type '" "ctb::SerialPort *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort * >(argp1); + result = (int)(arg1)->GetLineState(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_Ioctl(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort *arg1 = (ctb::SerialPort *) 0 ; + int arg2 ; + void *arg3 = (void *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int res3 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "cmd",(char *) "args", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OOO:SerialPort_Ioctl",kwnames,&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_Ioctl" "', argument " "1"" of type '" "ctb::SerialPort *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_Ioctl" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3), 0, 0); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SerialPort_Ioctl" "', argument " "3"" of type '" "void *""'"); + } + result = (int)(arg1)->Ioctl(arg2,arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_IsOpen(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + ctb::SerialPort *arg1 = (ctb::SerialPort *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if(!PyArg_UnpackTuple(args,(char *)"SerialPort_IsOpen",1,1,&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_IsOpen" "', argument " "1"" of type '" "ctb::SerialPort *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort * >(argp1); + result = (int)(arg1)->IsOpen(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_Read(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort *arg1 = (ctb::SerialPort *) 0 ; + char *arg2 = (char *) 0 ; + size_t arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + size_t val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "buf",(char *) "len", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OOO:SerialPort_Read",kwnames,&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_Read" "', argument " "1"" of type '" "ctb::SerialPort *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort * >(argp1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SerialPort_Read" "', argument " "2"" of type '" "char *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + ecode3 = SWIG_AsVal_size_t(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SerialPort_Read" "', argument " "3"" of type '" "size_t""'"); + } + arg3 = static_cast< size_t >(val3); + result = (int)(arg1)->Read(arg2,arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_SendBreak(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort *arg1 = (ctb::SerialPort *) 0 ; + int arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "duration", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:SerialPort_SendBreak",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_SendBreak" "', argument " "1"" of type '" "ctb::SerialPort *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_SendBreak" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)(arg1)->SendBreak(arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_SetBaudrate(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort *arg1 = (ctb::SerialPort *) 0 ; + int arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "baudrate", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:SerialPort_SetBaudrate",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_SetBaudrate" "', argument " "1"" of type '" "ctb::SerialPort *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_SetBaudrate" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)(arg1)->SetBaudrate(arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_SetLineState(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort *arg1 = (ctb::SerialPort *) 0 ; + ctb::SerialLineState arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "flags", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:SerialPort_SetLineState",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_SetLineState" "', argument " "1"" of type '" "ctb::SerialPort *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_SetLineState" "', argument " "2"" of type '" "ctb::SerialLineState""'"); + } + arg2 = static_cast< ctb::SerialLineState >(val2); + result = (int)(arg1)->SetLineState(arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_SetParityBit(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort *arg1 = (ctb::SerialPort *) 0 ; + bool arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "parity", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OO:SerialPort_SetParityBit",kwnames,&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_SetParityBit" "', argument " "1"" of type '" "ctb::SerialPort *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort * >(argp1); + ecode2 = SWIG_AsVal_bool(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPort_SetParityBit" "', argument " "2"" of type '" "bool""'"); + } + arg2 = static_cast< bool >(val2); + result = (int)(arg1)->SetParityBit(arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SerialPort_Write(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + ctb::SerialPort *arg1 = (ctb::SerialPort *) 0 ; + char *arg2 = (char *) 0 ; + size_t arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + size_t val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "buf",(char *) "len", NULL + }; + int result; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"OOO:SerialPort_Write",kwnames,&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ctb__SerialPort, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPort_Write" "', argument " "1"" of type '" "ctb::SerialPort *""'"); + } + arg1 = reinterpret_cast< ctb::SerialPort * >(argp1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SerialPort_Write" "', argument " "2"" of type '" "char *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + ecode3 = SWIG_AsVal_size_t(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SerialPort_Write" "', argument " "3"" of type '" "size_t""'"); + } + arg3 = static_cast< size_t >(val3); + result = (int)(arg1)->Write(arg2,arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *SerialPort_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_UnpackTuple(args,(char*)"swigregister", 1, 1,&obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_ctb__SerialPort, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_GetKey(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char result; + + if(!PyArg_UnpackTuple(args,(char *)"GetKey",0,0)) SWIG_fail; + result = (char)ctb::GetKey(); + resultobj = SWIG_From_char(static_cast< char >(result)); + return resultobj; +fail: + return NULL; +} + + +static PyMethodDef SwigMethods[] = { + { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL}, + { (char *)"new_intp", _wrap_new_intp, METH_VARARGS, NULL}, + { (char *)"copy_intp", (PyCFunction) _wrap_copy_intp, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"delete_intp", (PyCFunction) _wrap_delete_intp, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"intp_assign", (PyCFunction) _wrap_intp_assign, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"intp_value", (PyCFunction) _wrap_intp_value, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"timer_control_usecs_set", _wrap_timer_control_usecs_set, METH_VARARGS, NULL}, + { (char *)"timer_control_usecs_get", _wrap_timer_control_usecs_get, METH_VARARGS, NULL}, + { (char *)"timer_control_exitflag_set", _wrap_timer_control_exitflag_set, METH_VARARGS, NULL}, + { (char *)"timer_control_exitflag_get", _wrap_timer_control_exitflag_get, METH_VARARGS, NULL}, + { (char *)"timer_control_exitfnc_set", _wrap_timer_control_exitfnc_set, METH_VARARGS, NULL}, + { (char *)"timer_control_exitfnc_get", _wrap_timer_control_exitfnc_get, METH_VARARGS, NULL}, + { (char *)"timer_control_swigregister", timer_control_swigregister, METH_VARARGS, NULL}, + { (char *)"new_Timer", (PyCFunction) _wrap_new_Timer, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"delete_Timer", _wrap_delete_Timer, METH_VARARGS, NULL}, + { (char *)"Timer_start", _wrap_Timer_start, METH_VARARGS, NULL}, + { (char *)"Timer_stop", _wrap_Timer_stop, METH_VARARGS, NULL}, + { (char *)"Timer_swigregister", Timer_swigregister, METH_VARARGS, NULL}, + { (char *)"sleepms", (PyCFunction) _wrap_sleepms, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"delete_IOBase", _wrap_delete_IOBase, METH_VARARGS, NULL}, + { (char *)"IOBase_ClassName", _wrap_IOBase_ClassName, METH_VARARGS, NULL}, + { (char *)"IOBase_Close", _wrap_IOBase_Close, METH_VARARGS, NULL}, + { (char *)"IOBase_Ioctl", (PyCFunction) _wrap_IOBase_Ioctl, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"IOBase_IsOpen", _wrap_IOBase_IsOpen, METH_VARARGS, NULL}, + { (char *)"IOBase_Open", (PyCFunction) _wrap_IOBase_Open, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"IOBase_PutBack", (PyCFunction) _wrap_IOBase_PutBack, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"IOBase_Read", (PyCFunction) _wrap_IOBase_Read, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"IOBase_ReadUntilEOS", (PyCFunction) _wrap_IOBase_ReadUntilEOS, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"IOBase_Readv", (PyCFunction) _wrap_IOBase_Readv, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"IOBase_Write", (PyCFunction) _wrap_IOBase_Write, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"IOBase_Writev", (PyCFunction) _wrap_IOBase_Writev, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"IOBase_swigregister", IOBase_swigregister, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_baud_set", _wrap_SerialPort_DCS_baud_set, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_baud_get", _wrap_SerialPort_DCS_baud_get, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_parity_set", _wrap_SerialPort_DCS_parity_set, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_parity_get", _wrap_SerialPort_DCS_parity_get, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_wordlen_set", _wrap_SerialPort_DCS_wordlen_set, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_wordlen_get", _wrap_SerialPort_DCS_wordlen_get, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_stopbits_set", _wrap_SerialPort_DCS_stopbits_set, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_stopbits_get", _wrap_SerialPort_DCS_stopbits_get, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_rtscts_set", _wrap_SerialPort_DCS_rtscts_set, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_rtscts_get", _wrap_SerialPort_DCS_rtscts_get, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_xonxoff_set", _wrap_SerialPort_DCS_xonxoff_set, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_xonxoff_get", _wrap_SerialPort_DCS_xonxoff_get, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_buf_set", _wrap_SerialPort_DCS_buf_set, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_buf_get", _wrap_SerialPort_DCS_buf_get, METH_VARARGS, NULL}, + { (char *)"new_SerialPort_DCS", _wrap_new_SerialPort_DCS, METH_VARARGS, NULL}, + { (char *)"delete_SerialPort_DCS", _wrap_delete_SerialPort_DCS, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_GetSettings", _wrap_SerialPort_DCS_GetSettings, METH_VARARGS, NULL}, + { (char *)"SerialPort_DCS_swigregister", SerialPort_DCS_swigregister, METH_VARARGS, NULL}, + { (char *)"SerialPort_EINFO_brk_set", _wrap_SerialPort_EINFO_brk_set, METH_VARARGS, NULL}, + { (char *)"SerialPort_EINFO_brk_get", _wrap_SerialPort_EINFO_brk_get, METH_VARARGS, NULL}, + { (char *)"SerialPort_EINFO_frame_set", _wrap_SerialPort_EINFO_frame_set, METH_VARARGS, NULL}, + { (char *)"SerialPort_EINFO_frame_get", _wrap_SerialPort_EINFO_frame_get, METH_VARARGS, NULL}, + { (char *)"SerialPort_EINFO_overrun_set", _wrap_SerialPort_EINFO_overrun_set, METH_VARARGS, NULL}, + { (char *)"SerialPort_EINFO_overrun_get", _wrap_SerialPort_EINFO_overrun_get, METH_VARARGS, NULL}, + { (char *)"SerialPort_EINFO_parity_set", _wrap_SerialPort_EINFO_parity_set, METH_VARARGS, NULL}, + { (char *)"SerialPort_EINFO_parity_get", _wrap_SerialPort_EINFO_parity_get, METH_VARARGS, NULL}, + { (char *)"new_SerialPort_EINFO", _wrap_new_SerialPort_EINFO, METH_VARARGS, NULL}, + { (char *)"delete_SerialPort_EINFO", _wrap_delete_SerialPort_EINFO, METH_VARARGS, NULL}, + { (char *)"SerialPort_EINFO_swigregister", SerialPort_EINFO_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_SerialPort_x", _wrap_delete_SerialPort_x, METH_VARARGS, NULL}, + { (char *)"SerialPort_x_ClassName", _wrap_SerialPort_x_ClassName, METH_VARARGS, NULL}, + { (char *)"SerialPort_x_ChangeLineState", (PyCFunction) _wrap_SerialPort_x_ChangeLineState, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_x_ClrLineState", (PyCFunction) _wrap_SerialPort_x_ClrLineState, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_x_GetLineState", _wrap_SerialPort_x_GetLineState, METH_VARARGS, NULL}, + { (char *)"SerialPort_x_GetSettingsAsString", _wrap_SerialPort_x_GetSettingsAsString, METH_VARARGS, NULL}, + { (char *)"SerialPort_x_Ioctl", (PyCFunction) _wrap_SerialPort_x_Ioctl, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_x_SendBreak", (PyCFunction) _wrap_SerialPort_x_SendBreak, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_x_SetBaudrate", (PyCFunction) _wrap_SerialPort_x_SetBaudrate, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_x_SetLineState", (PyCFunction) _wrap_SerialPort_x_SetLineState, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_x_SetParityBit", (PyCFunction) _wrap_SerialPort_x_SetParityBit, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_x_IsStandardRate", (PyCFunction) _wrap_SerialPort_x_IsStandardRate, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_x_swigregister", SerialPort_x_swigregister, METH_VARARGS, NULL}, + { (char *)"new_SerialPort", _wrap_new_SerialPort, METH_VARARGS, NULL}, + { (char *)"delete_SerialPort", _wrap_delete_SerialPort, METH_VARARGS, NULL}, + { (char *)"SerialPort_ChangeLineState", (PyCFunction) _wrap_SerialPort_ChangeLineState, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_ClrLineState", (PyCFunction) _wrap_SerialPort_ClrLineState, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_GetLineState", _wrap_SerialPort_GetLineState, METH_VARARGS, NULL}, + { (char *)"SerialPort_Ioctl", (PyCFunction) _wrap_SerialPort_Ioctl, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_IsOpen", _wrap_SerialPort_IsOpen, METH_VARARGS, NULL}, + { (char *)"SerialPort_Read", (PyCFunction) _wrap_SerialPort_Read, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_SendBreak", (PyCFunction) _wrap_SerialPort_SendBreak, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_SetBaudrate", (PyCFunction) _wrap_SerialPort_SetBaudrate, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_SetLineState", (PyCFunction) _wrap_SerialPort_SetLineState, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_SetParityBit", (PyCFunction) _wrap_SerialPort_SetParityBit, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_Write", (PyCFunction) _wrap_SerialPort_Write, METH_VARARGS | METH_KEYWORDS, NULL}, + { (char *)"SerialPort_swigregister", SerialPort_swigregister, METH_VARARGS, NULL}, + { (char *)"GetKey", _wrap_GetKey, METH_VARARGS, NULL}, + { NULL, NULL, 0, NULL } +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ + +static void *_p_ctb__SerialPort_xTo_p_ctb__IOBase(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((ctb::IOBase *) ((ctb::SerialPort_x *) x)); +} +static void *_p_ctb__SerialPortTo_p_ctb__IOBase(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((ctb::IOBase *) (ctb::SerialPort_x *) ((ctb::SerialPort *) x)); +} +static void *_p_ctb__SerialPortTo_p_ctb__SerialPort_x(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((ctb::SerialPort_x *) ((ctb::SerialPort *) x)); +} +static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_ctb__IOBase = {"_p_ctb__IOBase", "ctb::IOBase *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_ctb__SerialPort = {"_p_ctb__SerialPort", "ctb::SerialPort *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_ctb__SerialPort_DCS = {"_p_ctb__SerialPort_DCS", "ctb::SerialPort_DCS *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_ctb__SerialPort_EINFO = {"_p_ctb__SerialPort_EINFO", "ctb::SerialPort_EINFO *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_ctb__SerialPort_x = {"_p_ctb__SerialPort_x", "ctb::SerialPort_x *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_ctb__Timer = {"_p_ctb__Timer", "ctb::Timer *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_ctb__timer_control = {"_p_ctb__timer_control", "ctb::timer_control *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_f_p_void__p_void = {"_p_f_p_void__p_void", "void *(*)(void *)", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_int = {"_p_int", "int *|size_t *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_p_char = {"_p_p_char", "char **", 0, 0, (void*)0, 0}; + +static swig_type_info *swig_type_initial[] = { + &_swigt__p_char, + &_swigt__p_ctb__IOBase, + &_swigt__p_ctb__SerialPort, + &_swigt__p_ctb__SerialPort_DCS, + &_swigt__p_ctb__SerialPort_EINFO, + &_swigt__p_ctb__SerialPort_x, + &_swigt__p_ctb__Timer, + &_swigt__p_ctb__timer_control, + &_swigt__p_f_p_void__p_void, + &_swigt__p_int, + &_swigt__p_p_char, +}; + +static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_ctb__IOBase[] = { {&_swigt__p_ctb__IOBase, 0, 0, 0}, {&_swigt__p_ctb__SerialPort_x, _p_ctb__SerialPort_xTo_p_ctb__IOBase, 0, 0}, {&_swigt__p_ctb__SerialPort, _p_ctb__SerialPortTo_p_ctb__IOBase, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_ctb__SerialPort[] = { {&_swigt__p_ctb__SerialPort, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_ctb__SerialPort_DCS[] = { {&_swigt__p_ctb__SerialPort_DCS, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_ctb__SerialPort_EINFO[] = { {&_swigt__p_ctb__SerialPort_EINFO, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_ctb__SerialPort_x[] = { {&_swigt__p_ctb__SerialPort_x, 0, 0, 0}, {&_swigt__p_ctb__SerialPort, _p_ctb__SerialPortTo_p_ctb__SerialPort_x, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_ctb__Timer[] = { {&_swigt__p_ctb__Timer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_ctb__timer_control[] = { {&_swigt__p_ctb__timer_control, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_f_p_void__p_void[] = { {&_swigt__p_f_p_void__p_void, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_p_char[] = { {&_swigt__p_p_char, 0, 0, 0},{0, 0, 0, 0}}; + +static swig_cast_info *swig_cast_initial[] = { + _swigc__p_char, + _swigc__p_ctb__IOBase, + _swigc__p_ctb__SerialPort, + _swigc__p_ctb__SerialPort_DCS, + _swigc__p_ctb__SerialPort_EINFO, + _swigc__p_ctb__SerialPort_x, + _swigc__p_ctb__Timer, + _swigc__p_ctb__timer_control, + _swigc__p_f_p_void__p_void, + _swigc__p_int, + _swigc__p_p_char, +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ + +static swig_const_info swig_const_table[] = { +{0, 0, 0, 0.0, 0, 0}}; + +#ifdef __cplusplus +} +#endif +/* ----------------------------------------------------------------------------- + * Type initialization: + * This problem is tough by the requirement that no dynamic + * memory is used. Also, since swig_type_info structures store pointers to + * swig_cast_info structures and swig_cast_info structures store pointers back + * to swig_type_info structures, we need some lookup code at initialization. + * The idea is that swig generates all the structures that are needed. + * The runtime then collects these partially filled structures. + * The SWIG_InitializeModule function takes these initial arrays out of + * swig_module, and does all the lookup, filling in the swig_module.types + * array with the correct data and linking the correct swig_cast_info + * structures together. + * + * The generated swig_type_info structures are assigned staticly to an initial + * array. We just loop through that array, and handle each type individually. + * First we lookup if this type has been already loaded, and if so, use the + * loaded structure instead of the generated one. Then we have to fill in the + * cast linked list. The cast data is initially stored in something like a + * two-dimensional array. Each row corresponds to a type (there are the same + * number of rows as there are in the swig_type_initial array). Each entry in + * a column is one of the swig_cast_info structures for that type. + * The cast_initial array is actually an array of arrays, because each row has + * a variable number of columns. So to actually build the cast linked list, + * we find the array of casts associated with the type, and loop through it + * adding the casts to the list. The one last trick we need to do is making + * sure the type pointer in the swig_cast_info struct is correct. + * + * First off, we lookup the cast->type name to see if it is already loaded. + * There are three cases to handle: + * 1) If the cast->type has already been loaded AND the type we are adding + * casting info to has not been loaded (it is in this module), THEN we + * replace the cast->type pointer with the type pointer that has already + * been loaded. + * 2) If BOTH types (the one we are adding casting info to, and the + * cast->type) are loaded, THEN the cast info has already been loaded by + * the previous module so we just ignore it. + * 3) Finally, if cast->type has not already been loaded, then we add that + * swig_cast_info to the linked list (because the cast->type) pointer will + * be correct. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* c-mode */ +#endif +#endif + +#if 0 +#define SWIGRUNTIME_DEBUG +#endif + + +SWIGRUNTIME void +SWIG_InitializeModule(void *clientdata) { + size_t i; + swig_module_info *module_head, *iter; + int found, init; + + clientdata = clientdata; + + /* check to see if the circular list has been setup, if not, set it up */ + if (swig_module.next==0) { + /* Initialize the swig_module */ + swig_module.type_initial = swig_type_initial; + swig_module.cast_initial = swig_cast_initial; + swig_module.next = &swig_module; + init = 1; + } else { + init = 0; + } + + /* Try and load any already created modules */ + module_head = SWIG_GetModule(clientdata); + if (!module_head) { + /* This is the first module loaded for this interpreter */ + /* so set the swig module into the interpreter */ + SWIG_SetModule(clientdata, &swig_module); + module_head = &swig_module; + } else { + /* the interpreter has loaded a SWIG module, but has it loaded this one? */ + found=0; + iter=module_head; + do { + if (iter==&swig_module) { + found=1; + break; + } + iter=iter->next; + } while (iter!= module_head); + + /* if the is found in the list, then all is done and we may leave */ + if (found) return; + /* otherwise we must add out module into the list */ + swig_module.next = module_head->next; + module_head->next = &swig_module; + } + + /* When multiple interpeters are used, a module could have already been initialized in + a different interpreter, but not yet have a pointer in this interpreter. + In this case, we do not want to continue adding types... everything should be + set up already */ + if (init == 0) return; + + /* Now work on filling in swig_module.types */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: size %d\n", swig_module.size); +#endif + for (i = 0; i < swig_module.size; ++i) { + swig_type_info *type = 0; + swig_type_info *ret; + swig_cast_info *cast; + +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); +#endif + + /* if there is another module already loaded */ + if (swig_module.next != &swig_module) { + type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); + } + if (type) { + /* Overwrite clientdata field */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found type %s\n", type->name); +#endif + if (swig_module.type_initial[i]->clientdata) { + type->clientdata = swig_module.type_initial[i]->clientdata; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); +#endif + } + } else { + type = swig_module.type_initial[i]; + } + + /* Insert casting types */ + cast = swig_module.cast_initial[i]; + while (cast->type) { + /* Don't need to add information already in the list */ + ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); +#endif + if (swig_module.next != &swig_module) { + ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); +#ifdef SWIGRUNTIME_DEBUG + if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); +#endif + } + if (ret) { + if (type == swig_module.type_initial[i]) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: skip old type %s\n", ret->name); +#endif + cast->type = ret; + ret = 0; + } else { + /* Check for casting already in the list */ + swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); +#ifdef SWIGRUNTIME_DEBUG + if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); +#endif + if (!ocast) ret = 0; + } + } + + if (!ret) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); +#endif + if (type->cast) { + type->cast->prev = cast; + cast->next = type->cast; + } + type->cast = cast; + } + cast++; + } + /* Set entry in modules->types array equal to the type */ + swig_module.types[i] = type; + } + swig_module.types[i] = 0; + +#ifdef SWIGRUNTIME_DEBUG + printf("**** SWIG_InitializeModule: Cast List ******\n"); + for (i = 0; i < swig_module.size; ++i) { + int j = 0; + swig_cast_info *cast = swig_module.cast_initial[i]; + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); + while (cast->type) { + printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); + cast++; + ++j; + } + printf("---- Total casts: %d\n",j); + } + printf("**** SWIG_InitializeModule: Cast List ******\n"); +#endif +} + +/* This function will propagate the clientdata field of type to +* any new swig_type_info structures that have been added into the list +* of equivalent types. It is like calling +* SWIG_TypeClientData(type, clientdata) a second time. +*/ +SWIGRUNTIME void +SWIG_PropagateClientData(void) { + size_t i; + swig_cast_info *equiv; + static int init_run = 0; + + if (init_run) return; + init_run = 1; + + for (i = 0; i < swig_module.size; i++) { + if (swig_module.types[i]->clientdata) { + equiv = swig_module.types[i]->cast; + while (equiv) { + if (!equiv->converter) { + if (equiv->type && !equiv->type->clientdata) + SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); + } + equiv = equiv->next; + } + } + } +} + +#ifdef __cplusplus +#if 0 +{ + /* c-mode */ +#endif +} +#endif + + + +#ifdef __cplusplus +extern "C" { +#endif + + /* Python-specific SWIG API */ +#define SWIG_newvarlink() SWIG_Python_newvarlink() +#define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) +#define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) + + /* ----------------------------------------------------------------------------- + * global variable support code. + * ----------------------------------------------------------------------------- */ + + typedef struct swig_globalvar { + char *name; /* Name of global variable */ + PyObject *(*get_attr)(void); /* Return the current value */ + int (*set_attr)(PyObject *); /* Set the value */ + struct swig_globalvar *next; + } swig_globalvar; + + typedef struct swig_varlinkobject { + PyObject_HEAD + swig_globalvar *vars; + } swig_varlinkobject; + + SWIGINTERN PyObject * + swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_InternFromString(""); +#else + return PyString_FromString(""); +#endif + } + + SWIGINTERN PyObject * + swig_varlink_str(swig_varlinkobject *v) { +#if PY_VERSION_HEX >= 0x03000000 + PyObject *str = PyUnicode_InternFromString("("); + PyObject *tail; + PyObject *joined; + swig_globalvar *var; + for (var = v->vars; var; var=var->next) { + tail = PyUnicode_FromString(var->name); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; + if (var->next) { + tail = PyUnicode_InternFromString(", "); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; + } + } + tail = PyUnicode_InternFromString(")"); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; +#else + PyObject *str = PyString_FromString("("); + swig_globalvar *var; + for (var = v->vars; var; var=var->next) { + PyString_ConcatAndDel(&str,PyString_FromString(var->name)); + if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); + } + PyString_ConcatAndDel(&str,PyString_FromString(")")); +#endif + return str; + } + + SWIGINTERN int + swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { + char *tmp; + PyObject *str = swig_varlink_str(v); + fprintf(fp,"Swig global variables "); + fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str)); + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(str); + return 0; + } + + SWIGINTERN void + swig_varlink_dealloc(swig_varlinkobject *v) { + swig_globalvar *var = v->vars; + while (var) { + swig_globalvar *n = var->next; + free(var->name); + free(var); + var = n; + } + } + + SWIGINTERN PyObject * + swig_varlink_getattr(swig_varlinkobject *v, char *n) { + PyObject *res = NULL; + swig_globalvar *var = v->vars; + while (var) { + if (strcmp(var->name,n) == 0) { + res = (*var->get_attr)(); + break; + } + var = var->next; + } + if (res == NULL && !PyErr_Occurred()) { + PyErr_SetString(PyExc_NameError,"Unknown C global variable"); + } + return res; + } + + SWIGINTERN int + swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { + int res = 1; + swig_globalvar *var = v->vars; + while (var) { + if (strcmp(var->name,n) == 0) { + res = (*var->set_attr)(p); + break; + } + var = var->next; + } + if (res == 1 && !PyErr_Occurred()) { + PyErr_SetString(PyExc_NameError,"Unknown C global variable"); + } + return res; + } + + SWIGINTERN PyTypeObject* + swig_varlink_type(void) { + static char varlink__doc__[] = "Swig var link object"; + static PyTypeObject varlink_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp + = { + /* PyObject header changed in Python 3 */ +#if PY_VERSION_HEX >= 0x03000000 + PyVarObject_HEAD_INIT(&PyType_Type, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* Number of items in variable part (ob_size) */ +#endif + (char *)"swigvarlink", /* Type name (tp_name) */ + sizeof(swig_varlinkobject), /* Basic size (tp_basicsize) */ + 0, /* Itemsize (tp_itemsize) */ + (destructor) swig_varlink_dealloc, /* Deallocator (tp_dealloc) */ + (printfunc) swig_varlink_print, /* Print (tp_print) */ + (getattrfunc) swig_varlink_getattr, /* get attr (tp_getattr) */ + (setattrfunc) swig_varlink_setattr, /* Set attr (tp_setattr) */ + 0, /* tp_compare */ + (reprfunc) swig_varlink_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + (reprfunc) swig_varlink_str, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + 0, /* tp_flags */ + varlink__doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#ifdef COUNT_ALLOCS + 0,0,0,0 /* tp_alloc -> tp_next */ +#endif + }; + varlink_type = tmp; + /* for Python 3 we already assigned ob_type in PyVarObject_HEAD_INIT() */ +#if PY_VERSION_HEX < 0x03000000 + varlink_type.ob_type = &PyType_Type; +#endif + type_init = 1; + } + return &varlink_type; + } + + /* Create a variable linking object for use later */ + SWIGINTERN PyObject * + SWIG_Python_newvarlink(void) { + swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); + if (result) { + result->vars = 0; + } + return ((PyObject*) result); + } + + SWIGINTERN void + SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { + swig_varlinkobject *v = (swig_varlinkobject *) p; + swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); + if (gv) { + size_t size = strlen(name)+1; + gv->name = (char *)malloc(size); + if (gv->name) { + strncpy(gv->name,name,size); + gv->get_attr = get_attr; + gv->set_attr = set_attr; + gv->next = v->vars; + } + } + v->vars = gv; + } + + SWIGINTERN PyObject * + SWIG_globals(void) { + static PyObject *_SWIG_globals = 0; + if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink(); + return _SWIG_globals; + } + + /* ----------------------------------------------------------------------------- + * constants/methods manipulation + * ----------------------------------------------------------------------------- */ + + /* Install Constants */ + SWIGINTERN void + SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { + PyObject *obj = 0; + size_t i; + for (i = 0; constants[i].type; ++i) { + switch(constants[i].type) { + case SWIG_PY_POINTER: + obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); + break; + case SWIG_PY_BINARY: + obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); + break; + default: + obj = 0; + break; + } + if (obj) { + PyDict_SetItemString(d, constants[i].name, obj); + Py_DECREF(obj); + } + } + } + + /* -----------------------------------------------------------------------------*/ + /* Fix SwigMethods to carry the callback ptrs when needed */ + /* -----------------------------------------------------------------------------*/ + + SWIGINTERN void + SWIG_Python_FixMethods(PyMethodDef *methods, + swig_const_info *const_table, + swig_type_info **types, + swig_type_info **types_initial) { + size_t i; + for (i = 0; methods[i].ml_name; ++i) { + const char *c = methods[i].ml_doc; + if (c && (c = strstr(c, "swig_ptr: "))) { + int j; + swig_const_info *ci = 0; + const char *name = c + 10; + for (j = 0; const_table[j].type; ++j) { + if (strncmp(const_table[j].name, name, + strlen(const_table[j].name)) == 0) { + ci = &(const_table[j]); + break; + } + } + if (ci) { + size_t shift = (ci->ptype) - types; + swig_type_info *ty = types_initial[shift]; + size_t ldoc = (c - methods[i].ml_doc); + size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; + char *ndoc = (char*)malloc(ldoc + lptr + 10); + if (ndoc) { + char *buff = ndoc; + void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; + if (ptr) { + strncpy(buff, methods[i].ml_doc, ldoc); + buff += ldoc; + strncpy(buff, "swig_ptr: ", 10); + buff += 10; + SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); + methods[i].ml_doc = ndoc; + } + } + } + } + } + } + +#ifdef __cplusplus +} +#endif + +/* -----------------------------------------------------------------------------* + * Partial Init method + * -----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +extern "C" +#endif + +SWIGEXPORT +#if PY_VERSION_HEX >= 0x03000000 +PyObject* +#else +void +#endif +SWIG_init(void) { + PyObject *m, *d; +#if PY_VERSION_HEX >= 0x03000000 + static struct PyModuleDef SWIG_module = { + PyModuleDef_HEAD_INIT, + (char *) SWIG_name, + NULL, + -1, + SwigMethods, + NULL, + NULL, + NULL, + NULL + }; +#endif + + /* Fix SwigMethods to carry the callback ptrs when needed */ + SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); + +#if PY_VERSION_HEX >= 0x03000000 + m = PyModule_Create(&SWIG_module); +#else + m = Py_InitModule((char *) SWIG_name, SwigMethods); +#endif + d = PyModule_GetDict(m); + + SWIG_InitializeModule(0); + SWIG_InstallConstants(d,swig_const_table); + + + SWIG_Python_SetConstant(d, "CTB_RESET",SWIG_From_int(static_cast< int >(ctb::CTB_RESET))); + SWIG_Python_SetConstant(d, "ParityNone",SWIG_From_int(static_cast< int >(ctb::ParityNone))); + SWIG_Python_SetConstant(d, "ParityOdd",SWIG_From_int(static_cast< int >(ctb::ParityOdd))); + SWIG_Python_SetConstant(d, "ParityEven",SWIG_From_int(static_cast< int >(ctb::ParityEven))); + SWIG_Python_SetConstant(d, "ParityMark",SWIG_From_int(static_cast< int >(ctb::ParityMark))); + SWIG_Python_SetConstant(d, "ParitySpace",SWIG_From_int(static_cast< int >(ctb::ParitySpace))); + SWIG_Python_SetConstant(d, "LinestateDcd",SWIG_From_int(static_cast< int >(ctb::LinestateDcd))); + SWIG_Python_SetConstant(d, "LinestateCts",SWIG_From_int(static_cast< int >(ctb::LinestateCts))); + SWIG_Python_SetConstant(d, "LinestateDsr",SWIG_From_int(static_cast< int >(ctb::LinestateDsr))); + SWIG_Python_SetConstant(d, "LinestateDtr",SWIG_From_int(static_cast< int >(ctb::LinestateDtr))); + SWIG_Python_SetConstant(d, "LinestateRing",SWIG_From_int(static_cast< int >(ctb::LinestateRing))); + SWIG_Python_SetConstant(d, "LinestateRts",SWIG_From_int(static_cast< int >(ctb::LinestateRts))); + SWIG_Python_SetConstant(d, "LinestateNull",SWIG_From_int(static_cast< int >(ctb::LinestateNull))); + SWIG_Python_SetConstant(d, "CTB_SER_GETEINFO",SWIG_From_int(static_cast< int >(ctb::CTB_SER_GETEINFO))); + SWIG_Python_SetConstant(d, "CTB_SER_GETBRK",SWIG_From_int(static_cast< int >(ctb::CTB_SER_GETBRK))); + SWIG_Python_SetConstant(d, "CTB_SER_GETFRM",SWIG_From_int(static_cast< int >(ctb::CTB_SER_GETFRM))); + SWIG_Python_SetConstant(d, "CTB_SER_GETOVR",SWIG_From_int(static_cast< int >(ctb::CTB_SER_GETOVR))); + SWIG_Python_SetConstant(d, "CTB_SER_GETPAR",SWIG_From_int(static_cast< int >(ctb::CTB_SER_GETPAR))); + SWIG_Python_SetConstant(d, "CTB_SER_GETINQUE",SWIG_From_int(static_cast< int >(ctb::CTB_SER_GETINQUE))); + SWIG_Python_SetConstant(d, "CTB_SER_SETPAR",SWIG_From_int(static_cast< int >(ctb::CTB_SER_SETPAR))); +#if PY_VERSION_HEX >= 0x03000000 + return m; +#else + return; +#endif +} + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/serportx.i b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/serportx.i new file mode 100644 index 0000000000..083daddab4 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/serportx.i @@ -0,0 +1,84 @@ +%{ +#include "ctb-0.16/serportx.h" +%} + +%include iobase.i + +namespace ctb { + +enum Parity +{ + ParityNone, + ParityOdd, + ParityEven, + ParityMark, + ParitySpace +}; + +enum SerialLineState +{ + LinestateDcd = 0x040, + LinestateCts = 0x020, + LinestateDsr = 0x100, + LinestateDtr = 0x002, + LinestateRing = 0x080, + LinestateRts = 0x004, + LinestateNull = 0x000 +}; + +struct SerialPort_DCS +{ + int baud; + Parity parity; + unsigned char wordlen; + unsigned char stopbits; + bool rtscts; + bool xonxoff; + char buf[16]; + SerialPort_DCS(); + ~SerialPort_DCS(); + char* GetSettings(); +}; + +struct SerialPort_EINFO +{ + int brk; + int frame; + int overrun; + int parity; + SerialPort_EINFO(); + ~SerialPort_EINFO(); +}; + +enum { + CTB_SER_GETEINFO = CTB_SERIAL, + CTB_SER_GETBRK, + CTB_SER_GETFRM, + CTB_SER_GETOVR, + CTB_SER_GETPAR, + CTB_SER_GETINQUE, + CTB_SER_SETPAR, +}; + +class SerialPort_x : public IOBase +{ +protected: + SerialPort_DCS m_dcs; + char m_devname[SERIALPORT_NAME_LEN]; +public: + SerialPort_x(); + virtual ~SerialPort_x(); + const char* ClassName(); + virtual int ChangeLineState(SerialLineState flags) = 0; + virtual int ClrLineState(SerialLineState flags) = 0; + virtual int GetLineState() = 0; + virtual char* GetSettingsAsString(); + virtual int Ioctl(int cmd,void* args); + virtual int SendBreak(int duration) = 0; + virtual int SetBaudrate(int baudrate) = 0; + virtual int SetLineState(SerialLineState flags) = 0; + virtual int SetParityBit( bool parity ) = 0; + static bool IsStandardRate( long rate ); +}; + +}; diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/makepy.bat b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/makepy.bat new file mode 100644 index 0000000000..8320cb9e57 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/makepy.bat @@ -0,0 +1,65 @@ +@ECHO OFF + +REM ################################################################## +REM # set the path/settings of your compiler enviroment and remove the +REM # comment command (REM) +REM # (you don't need this, if you set it always in your system +REM # enviroment) +REM ################################################################## +REM CALL "c:\Programme\Microsoft Visual C++ Toolkit 2003\vcvars32.bat" + +REM ################################################################## +REM # set the path to your python24 (or python23) library, for example +REM # works for me with C:\Program Files\Python2.4\libs\python24.lib +REM ################################################################## +SET PYTHON_LIB="C:\Program Files\Python2.4\libs\python24.lib" + +REM ################################################################## +REM # set the include path of your python24 (python23) deleveloper +REM # header files. For me, it's on C:\Program Files +REM ################################################################## +SET PYTHON_INCLUDE="C:\Program Files\Python2.4\include" + +REM ################################################################## +REM # after installing swig, set the path, so the script can find it +REM ################################################################## +SET SWIG="C:\Program Files\swigwin-1.3.40\swig" + +REM ################################################################## +REM # DON'T CHANGE ANYMORE AT THE FOLLOWING LINES!!! +REM ################################################################## + +SET GPIB_LIB= +SET GPIB_SRC= + +ECHO // This file is created automatically, don't change it! > wxctb.i +ECHO %%module wxctb >> wxctb.i +ECHO typedef int size_t; >> wxctb.i +ECHO %%include timer.i >> wxctb.i +ECHO %%include serport.i >> wxctb.i +ECHO %%include ../kbhit.i >> wxctb.i + +IF NOT [%1]==[USE_GPIB] GOTO nogpib +SET GPIB_LIB=../../../lib/gpib32.lib +SET GPIB_SRC=../../../src/gpib.cpp +ECHO %%include ../gpib.i >> wxctb.i + +:nogpib + + +DEL *.obj wxctb_wrap.cxx *.lib *.dll *.exp + +ECHO "swig generates python wrapper files..." +%SWIG% -c++ -Wall -nodefault -python -keyword -new_repr -modern wxctb.i + +ECHO "create shared library wxctb for python 2.4..." +cl /LD /D WIN32 /I %PYTHON_INCLUDE% /I ../../../include wxctb_wrap.cxx ../../../src/win32/serport.cpp ../../../src/serportx.cpp ../../../src/win32/timer.cpp ../../../src/kbhit.cpp ../../../src/iobase.cpp %GPIB_SRC% ../../../src/fifo.cpp /link %PYTHON_LIB% winmm.lib %GPIB_LIB% + +MOVE wxctb_wrap.dll _wxctb.dll + +ECHO "copy ctb.py, wxctb.py and _wxctb.so to the module/win32 folder..." +MKDIR ..\..\module\win32 +COPY ..\ctb.py ..\..\module\win32 +COPY wxctb.py ..\..\module\win32 +COPY _wxctb.dll ..\..\module\win32 + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/serport.i b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/serport.i new file mode 100644 index 0000000000..84cb69887c --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/serport.i @@ -0,0 +1,57 @@ +%{ +#include "ctb-0.16/win32/serport.h" +%} + +%include ../serportx.i + +namespace ctb { + +%pythoncode { +COM1 = "com1" +COM2 = "com2" +COM3 = "com3" +COM4 = "com4" +COM5 = "com5" +COM6 = "com6" +COM7 = "com7" +COM8 = "com8" +COM9 = "com9" +COM10 = "\\\\.\\com10" +COM11 = "\\\\.\\com11" +COM12 = "\\\\.\\com12" +COM13 = "\\\\.\\com13" +COM14 = "\\\\.\\com14" +COM15 = "\\\\.\\com15" +COM16 = "\\\\.\\com16" +COM17 = "\\\\.\\com17" +COM18 = "\\\\.\\com18" +COM19 = "\\\\.\\com19" +}; + +class SerialPort : public SerialPort_x +{ +protected: + HANDLE fd; + OVERLAPPED ov; + SerialPort_EINFO einfo; + + int CloseDevice(); + int OpenDevice(const char* devname, void* dcs); +public: + SerialPort(); + ~SerialPort(); + + int ChangeLineState(SerialLineState flags); + int ClrLineState(SerialLineState flags); + int GetLineState(); + int Ioctl(int cmd,void* args); + int IsOpen(); + int Read(char* buf,size_t len); + int SendBreak(int duration); + int SetBaudrate(int baudrate); + int SetLineState(SerialLineState flags); + int SetParityBit( bool parity ); + int Write(char* buf,size_t len); +}; + +}; diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/timer.i b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/timer.i new file mode 100644 index 0000000000..b95f26a0d4 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/timer.i @@ -0,0 +1,39 @@ +%{ +#include "ctb-0.16/win32/timer.h" +%} + +%include cpointer.i + +// lets create new fuctions for pointer handling in python (for int *exitflag) +%pointer_functions(int, intp); + +namespace ctb { + +// perhaps we doesn''t need timer_control to export +// but we need if we want to inherit from timer in python +struct timer_control +{ + unsigned int msecs; + int *exitflag; + MMRESULT stop; + void* (*exitfnc)(void*); +}; + +class Timer +{ +protected: + + DWORD id; + MMRESULT h; + timer_control control; + unsigned int timer_secs; +public: + Timer(unsigned int msec,int* exitflag,void*(*exitfnc)(void*)=NULL); + ~Timer(); + int start(); + int stop(); +}; + +void sleepms(unsigned int ms); + +}; diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/wxctb.i b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/wxctb.i new file mode 100644 index 0000000000..d00350fb03 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/python/src/win32/wxctb.i @@ -0,0 +1,6 @@ +// This file is created automatically, don't change it! +%module wxctb +typedef int size_t; +%include timer.i +%include serport.i +%include ../kbhit.i diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/samples/ctbtest.cpp b/src/mod/endpoints/mod_gsmopen/libctb-0.16/samples/ctbtest.cpp new file mode 100644 index 0000000000..bf84e20ed7 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/samples/ctbtest.cpp @@ -0,0 +1,181 @@ +#include "ctb-0.16/ctb.h" + +#include +#include +#include + +#include +#include + +using namespace std; + +// ----------------- options ------------------------------- +const char* options="a:b:d:e:hlp:t:"; + +const char* helpMessage = +{ + "A simple serial port class test\n" + "ctbtest [options]\n" + "available options are:\n" + "-a : address (only GPIB)\n" + "-b : baudrate [any value], default is 38400\n" + "-d : connected device, default is COM1\n" + "-e : eos\n" + "-h : print this\n" + "-l : list all available serial ports\n" + "-p : protocol like 8N1\n" + "-t : communication timeout in ms (default is 100ms)\n" +}; + +int main(int argc,char* argv[]) +{ + int address = 15; + + int baudrate = 19200; + + string devname = ctb::COM1; + + string eos = "\r\n"; + + string protocol = "8N1"; + + int timeout = 100; + + bool showAvailablePorts = false; + + int quit = 0; + + int val; + + while ( ( val=getopt( argc, argv, (char*)options ) ) != EOF ) { + switch ( val ) { + case 'a' : address = strtol( optarg, NULL, 10 ); break; + case 'b' : baudrate = strtol( optarg, NULL, 10 ); break; + case 'd' : devname = optarg; break; + case 'h' : cerr << helpMessage << endl; exit( 0 ); + case 'l' : showAvailablePorts = true; break; + case 'p' : protocol = optarg; break; + case 't' : timeout = strtol( optarg, NULL, 10 ); break; + } + } + + ctb::IOBase* device = NULL; + + std::vector ports; + + if( ctb::GetAvailablePorts( ports ) && showAvailablePorts ) { + + for( int i = 0; i < ports.size(); + std::cout << ports[ i++ ] << endl ) {}; + + return 0; + + } + + +#if ( GPIB ) + if( ( devname == ctb::GPIB1 ) || ( devname == ctb::GPIB2 ) ) { + + ctb::GpibDevice* gpibDevice = new ctb::GpibDevice(); + + if( gpibDevice->Open( devname.c_str(), address ) >= 0 ) { + + device = gpibDevice; + + } + + } + else { +#endif + + ctb::SerialPort* serialPort = new ctb::SerialPort(); + + if( serialPort->Open( devname.c_str(), baudrate, + protocol.c_str(), + ctb::SerialPort::NoFlowControl ) >= 0 ) { + + device = serialPort; + + } + +#if ( GPIB ) + } +#endif + + if( ! device ) { + + cout << "Cannot open " << devname.c_str() << endl; + + return -1; + + } + + // up to know you don't have to worry any longer about the kind of + // the connected device. As long as you do nothing something device + // specific (like toggle some modem control lines), the access is + // the same for each device. + + string line; + + char receiveBuf[ 128 ]; + + cout << "Enter your command or just press Enter without any\n" + "input for exit!"; + + while( true ) { + + cout << endl << "Your input >"; + + // read the string to send + getline( cin, line ); + + // add some defined EOS (end of string sequence or character) + if( line.empty() ) { + + break; + + } + + line += eos; + + // send data throughout the connected device independent of the typ + if( device->Writev( (char*)line.c_str(), + line.size(), + timeout ) != line.size() ) { + + cerr << "Incomplete data transmission" << endl; + + } + + int readed = 0; + + do { + + // in case of an event driven GUI you better use a non blocking + // Read(...) in your idle function. Here we have to wait for the + // response before we send another user command... + readed = device->Readv( receiveBuf, + sizeof( receiveBuf ) - 1, + timeout); + + // something received? + if( readed > 0 ) { + + receiveBuf[ readed ] = 0; + + cout << receiveBuf; + + } + + } while( readed > 0 ); + + cout << endl; + + } // while( true ) + + device->Close(); + + delete device; + + return 0; +} diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/fifo.cpp b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/fifo.cpp new file mode 100644 index 0000000000..c03e320846 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/fifo.cpp @@ -0,0 +1,130 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: fifo.cpp +// Purpose: +// Author: Joachim Buermann, Michael Hungershausen +// Id: $Id$ +// Copyright: (c) 2006,2007 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "ctb-0.16/fifo.h" + +namespace ctb { + + Fifo::Fifo(size_t size) : + m_size(size) + { + m_begin = new char[size]; + m_end = m_begin + m_size; + m_rdptr = m_wrptr = m_begin; + }; + + Fifo::~Fifo() + { + delete m_begin; + }; + + void Fifo::clear() + { + m_rdptr = m_wrptr = m_begin; + }; + + int Fifo::get(char* ch) + { + if(m_rdptr != m_wrptr) { + *ch = *m_rdptr++; + if(m_rdptr >= m_end) { + m_rdptr = m_begin; + } + return 1; + } + return 0; + }; + + size_t Fifo::items() + { + char* tmp_wrptr = m_wrptr; + // the rdptr will only changed by the reader. If we suppose, that + // the caller of the items() method is identical with the reader, + // this should be thread save. + char* tmp_rdptr = m_rdptr; + + // if the write pointer is identical with the read, there are no + // more data in the Fifo + if(tmp_wrptr == tmp_rdptr) { + return 0; + } + // the write pointer is greater as the read pointer, so we just + // can calculate the difference for the remaining data + if(tmp_wrptr > tmp_rdptr) { + return (tmp_wrptr - tmp_rdptr); + } + // the write pointer has circulate and stands against the read + // pointer + else { + return (m_size - (tmp_rdptr - tmp_wrptr)); + } + }; + + int Fifo::put(char ch) + { + // for a thread safe operation, the write of a data byte must be + // atomic. So we first assign the current position of the write + // pointer to a temporary pointer. + // Increment it for the comparison with the end of the internal + // buffer and the read pointer + char* tmp_wrptr = m_wrptr + 1; + if(tmp_wrptr >= m_end) { + tmp_wrptr = m_begin; + } + if(tmp_wrptr == m_rdptr) { + return 0; + } + // this don't changes the write pointer! + *m_wrptr = ch; + // that's the trick! The following assignment is atomic and cannot + // interrupted within a read access by the read thread + m_wrptr = tmp_wrptr; + return 1; + }; + + int Fifo::read(char* data,int n) + { + int nresult = 0; + while(n--) { + // the same as get() + if(m_rdptr != m_wrptr) { + *data = *m_rdptr++; + if(m_rdptr >= m_end) { + m_rdptr = m_begin; + } + } + else { + break; + } + nresult++; + data++; + } + return nresult; + }; + + int Fifo::write(char* data,int n) + { + int nresult = 0; + while(n--) { + // the same as put() + char* tmp_wrptr = m_wrptr + 1; + if(tmp_wrptr >= m_end) { + tmp_wrptr = m_begin; + } + if(tmp_wrptr == m_rdptr) { + break; + } + *m_wrptr = *data++; + m_wrptr = tmp_wrptr; + nresult++; + } + return nresult; + }; + +} // namespace ctb diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/getopt.cpp b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/getopt.cpp new file mode 100644 index 0000000000..69afb2e7b7 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/getopt.cpp @@ -0,0 +1,14 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: getopt.cpp +// Purpose: simple wrapper file +// Author: Joachim Buermann +// Id: $Id: timer.h,v 1.1.1.1 2004/11/24 10:30:11 jb Exp $ +// Copyright: (c) 2001 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#if defined (WIN32) +# include "win32/getopt.cpp" +#endif + + diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/gpib.cpp b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/gpib.cpp new file mode 100644 index 0000000000..f6ee5b3d7d --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/gpib.cpp @@ -0,0 +1,338 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: gpibx.cpp +// Purpose: +// Author: Joachim Buermann +// Id: $Id: gpibx.cpp,v 1.1.1.1 2004/11/24 10:30:11 jb Exp $ +// Copyright: (c) 2001,2004 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "ctb-0.16/gpib.h" +#include "ctb-0.16/timer.h" +#include +#include +#ifdef WIN32 +# include "ctb-0.16/win32/gpib-32.h" +# define snprintf _snprintf +#elif __GNUG__ +# include +#endif + +namespace ctb { + + const char* GPIB1 = "gpib1"; + const char* GPIB2 = "gpib2"; + + struct gpibErr_t { + int m_errno; + const char* m_notation; + const char* m_description; + }; + + static gpibErr_t gpibErrors[] = { + {0,"EDVR","DOS Error"}, + {1,"ECIC","Specified GPIB Interface Board is Not Active Controller"}, + {2,"ENOL","No present listing device"}, + {3,"EADR","GPIB Board has not been addressed properly"}, + {4,"EARG","Invalid argument"}, + {5,"ESAC","Specified GPIB Interface Board is not System Controller"}, + {6,"EABO","I/O operation aborted (time-out)"}, + {7,"ENEB","Non-existent GPIB board"}, + {10,"EOIP","Routine not allowed during asynchronous I/O operation"}, + {11,"ECAP","No capability for operation"}, + {12,"EFSO","File System Error"}, + {14,"EBUS","Command byte transfer error"}, + {15,"ESTB","Serial poll status byte lost"}, + {16,"ESQR","SRQ stuck in ON position"}, + {20,"ETAB","Table problem"}, + {247,"EINT","No interrupt configured on board"}, + {248,"EWMD","Windows is not in Enhanced mode"}, + {249,"EVDD","GPIB driver is not installed"}, + {250,"EOVR","Buffer Overflow"}, + {251,"ESML","Two library calls running simultaneously"}, + {252,"ECFG","Board type does not match GPIB.CFG"}, + {253,"ETMR","No Windows timers available"}, + {254,"ESLC","No Windows selectors available"}, + {255,"EBRK","Control-Break pressed"} + }; + + char* Gpib_DCS::GetSettings() + { + const char* to[] = { + "None","10us","30us","100us","300us","1ms","3ms","10ms","30ms", + "100ms","300ms","1s","3s","10s","30s","100s","300s","1000s" + }; + memset(m_buf,0,sizeof(m_buf)); + snprintf(m_buf,sizeof(m_buf)-1,"Adr: (%i,%i) to:%s", + m_address1, + m_address2, + to[m_timeout]); + return m_buf; + }; + + int GpibDevice::CloseDevice() + { + if(m_hd != -1) { + // goto local... + ibloc(m_hd); + // ...and switch device offline + ibonl(m_hd,0); + m_hd = -1; + m_board = -1; + } + return 0; + }; + + const char* GpibDevice::GetErrorString(int error,bool detailed) + { + for(size_t i=0;i<(sizeof(gpibErrors)/sizeof(gpibErr_t));i++) { + if(gpibErrors[i].m_errno == error) { + if(detailed) { + return gpibErrors[i].m_description; + } + else { + return gpibErrors[i].m_notation; + } + } + } + return 0; + }; + +// This is only for internal usage + int GpibDevice::Ibrd(char* buf,size_t len) + { + return ibrd(m_hd,buf,len); + }; + +// This is only for internal usage + int GpibDevice::Ibwrt(char* buf,size_t len) + { + return ibwrt(m_hd,buf,len); + }; + + int GpibDevice::Ioctl(int cmd,void* args) + { + switch(cmd) { + case CTB_RESET: + if(m_hd >= 0) { + ibclr(m_hd); + return 0; + } + return -1; + case CTB_GPIB_GETRSP: { + char spr = 0; + if(m_hd >= 0) { + ibrsp(m_hd,&spr); + *(int*)args = (int)spr; + return 0; + } + return 1; } + case CTB_GPIB_GETSTA: + *(int*)args = m_state; + return 0; + case CTB_GPIB_GETERR: + *(int*)args = m_error; + return 0; + case CTB_GPIB_GETLINES: { + short state = 0; + if(m_hd >= 0) { + iblines(m_board,&state); + *(int*)args = (int)state; + return 0; + } + return -1; } + case CTB_GPIB_SETTIMEOUT: { + if(m_hd >= 0) { + GpibTimeout timeout; + unsigned long to = *(unsigned long*)args; + // convert the timeout in ms (given by args) into the + // traditional NI-488.2 timeout period + if(to > 1000000) timeout = GpibTimeout1000s; + else if(to >= 300000) timeout = GpibTimeout300s; + else if(to >= 100000) timeout = GpibTimeout100s; + else if(to >= 30000) timeout = GpibTimeout30s; + else if(to >= 10000) timeout = GpibTimeout10s; + else if(to >= 3000) timeout = GpibTimeout3s; + else if(to >= 1000) timeout = GpibTimeout1s; + else if(to >= 300) timeout = GpibTimeout300ms; + else if(to >= 100) timeout = GpibTimeout100ms; + else if(to >= 30) timeout = GpibTimeout30ms; + else if(to >= 10) timeout = GpibTimeout10ms; + else if(to >= 3) timeout = GpibTimeout3ms; + else if(to >= 1) timeout = GpibTimeout1ms; + else timeout = GpibTimeoutNone; + ibtmo(m_hd,timeout); + return 0; + } + return -1; } + case CTB_GPIB_GTL: + // Forces the specified device to go to local program mode + if(m_hd >= 0) { + ibloc(m_hd); + return 0; + } + return -1; + case CTB_GPIB_REN: + // This routine can only be used if the specified GPIB + // Interface Board is the System Controller. + // Remember that even though the REN line is asserted, + // the device(s) will not be put into remote state until is + // addressed to listen by the Active Controller + if(m_hd) { + char adr = (char)m_dcs.m_address1; + ibsre(m_board,1); + ibcmd(m_board,&adr,1); + return 0; + } + return -1; + case CTB_GPIB_RESET_BUS: + ibsic(m_board); + return 0; + case CTB_GPIB_GET_EOS_CHAR: + if( m_hd ) { + *(int*)args = (int)m_dcs.m_eosChar; + return 0; + } + return -1; + case CTB_GPIB_SET_EOS_CHAR: +#ifdef __GNUG__ + // FIXME! + // Doesn't work with linux-gpib-3.2.08. All EOS beside 0x00 + // are blocking during sending data to the device. (Look at + // function my_ibwrt in linux-gpib-3.2.08/lib/ibWrt.c + if( m_hd ) { + m_dcs.m_eosChar = (char)*(int*)args; + ibeos(m_hd,(m_dcs.m_eosMode << 8) | m_dcs.m_eosChar); + return 0; + } +#endif + return -1; + case CTB_GPIB_GET_EOS_MODE: + if( m_hd ) { + *(int*)args = (int)m_dcs.m_eosMode; + return 0; + } + return -1; + case CTB_GPIB_SET_EOS_MODE: + if( m_hd ) { + m_dcs.m_eosMode = (char)*(int*)args; + ibeos(m_hd,(m_dcs.m_eosMode << 8) | m_dcs.m_eosChar); + return 0; + } + return -1; + } + // error or unknown command + return -1; + }; + + int GpibDevice::FindListeners(int board) + { + int listeners = 0; + if((unsigned int)board > 1) { + return -1; + } + // reset the GPIB, otherwise no connected device is found (linux) + SendIFC(board); + // list of primary addresses to searching for. Must be terminated + // with NOADDR. + Addr4882_t addrlist[31]; + // The range of valid addresses is 1...30, 0 is reservated by the + // controller, 31 is not valid + for(int i = 0;i < 30; i++) addrlist[i] = (Addr4882_t) i + 1; + addrlist[30] = NOADDR; + // place to store the results + Addr4882_t results[31]; + memset(results,0,sizeof(results)); + FindLstn(board, addrlist, results, 31); + if(ibsta & ERR) { + return -1; + } + for(int i=0;i<=30;i++) { + if(results[i]) { + listeners |= 1 << results[i]; + } + } + return listeners; + }; + + int GpibDevice::Open( const char* devname, int address ) + { + m_dcs.m_address1 = address; + + return OpenDevice( devname, &m_dcs ); + } + + + int GpibDevice::OpenDevice(const char* devname, void* dcs) + { + // if dcs isn't NULL, type cast + if(dcs) m_dcs = *(Gpib_DCS*)dcs; + + if(strncmp(devname,"gpib1",5) == 0) m_board = 0; + else if(strncmp(devname,"gpib2",5) == 0) m_board = 1; + if(m_board < 0) { + return -1; + } + // check for a valid timeout + if((unsigned int)m_dcs.m_timeout > GpibTimeout1000s) { + m_dcs.m_timeout = GpibTimeout10us; + } + + m_hd = ibdev(m_board, + m_dcs.m_address1, + m_dcs.m_address2, + m_dcs.m_timeout, + m_dcs.m_eot, +#ifdef __GNUG__ + // FIXME! + // linux-gpib-3.2.08 doesn't work with any EOS (blocks). + // Because we always has to add an EOS on the message + // (independent of the m_eosChar setting), we can ignore it! + 0 +#else + (m_dcs.m_eosMode << 8) | m_dcs.m_eosChar +#endif + ); + if(m_hd < 0) { + // no gpib controller installed (not found) + return -2; + } + // test for a connected listener (device with given address) + short int listen = 0; + ibln(m_board,m_dcs.m_address1,NO_SAD,&listen); + if(!listen) { + // no listener at the given address + CloseDevice(); + return -3; + } + // reset device + ibclr(m_hd); + // save state, error and count + m_state = ThreadIbsta(); + m_count = ThreadIbcnt(); + m_error = ThreadIberr(); + // no error + return 0; + }; + + int GpibDevice::Read(char* buf,size_t len) + { + // if something is in the fifo, first read that + if(m_fifo->items() > 0) { + return m_fifo->read(buf,len); + } + m_state = ibrd(m_hd,buf,len); + m_error = ThreadIberr(); + m_count = ThreadIbcnt(); + return m_count; + }; + + int GpibDevice::Write(char* buf,size_t len) + { + m_state = ibwrt(m_hd,buf,len); + m_error = ThreadIberr(); + m_count = ThreadIbcnt(); + return m_count; + }; + +} // namespace ctb diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/iobase.cpp b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/iobase.cpp new file mode 100644 index 0000000000..b92ba4f2d6 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/iobase.cpp @@ -0,0 +1,211 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: iobase.cpp +// Purpose: +// Author: Joachim Buermann +// Id: $Id: iobase.cpp,v 1.1.1.1 2004/11/24 10:30:11 jb Exp $ +// Copyright: (c) 2001 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include +#include +#include "ctb-0.16/iobase.h" +#include "ctb-0.16/timer.h" + +namespace ctb { + +#define DELTA_BUFSIZE 512 + + int IOBase::Readv(char* buf,size_t len,unsigned int timeout_in_ms) + { + char *cp = buf; + int n = 0; + int timeout = 0; + size_t toread = len; + + Timer t(timeout_in_ms,&timeout,NULL); + if(timeout_in_ms != 0xFFFFFFFF) { + t.start(); + } + + while(!timeout && (toread > 0)) { + if((n = Read(cp,toread)) < 0) { + break; + } + if(!n) { + sleepms(1); + } + toread -= n; + cp += n; + } + // ok, all bytes received + return(len - toread); + }; + +/* + Readv() calls the member function Read() repeatedly, til all + demand bytes were received. To avoid an endless loop, you + can refer an integer, which was set unequal zero after a + specific time. (See the timer class) +*/ + int IOBase::Readv(char* buf,size_t len,int* timeout_flag,bool nice) + { + size_t toread = len; + int n = 0; + char *cp = buf; + + while(toread > 0) { + if(timeout_flag && (*timeout_flag > 0)) { + return (len - toread); + } + if((n = Read(cp,toread)) < 0) { + return (len - toread); + } + if(!n && nice) { + sleepms(1); + } + if (n > 0) + { + toread -= n; + cp += n; + } + } + // ok, all bytes received + return(len - toread); + }; + + int IOBase::ReadUntilEOS(char*& readbuf, + size_t* readedBytes, + char* eosString, + long timeout_in_ms, + char quota) + { + int n = 0; + int timeout = 0; + int bufsize = DELTA_BUFSIZE; + int result = 0; + int quoted = 0; + char* buf = new char[bufsize]; + char* des = buf; + char* eos = eosString; + char ch; + + Timer t(timeout_in_ms,&timeout,NULL); + t.start(); + + while(!timeout) { + if(des >= &buf[bufsize]) { + // buffer full, realloc more memory + char* tmp = new char[bufsize + DELTA_BUFSIZE + 1]; + memcpy(tmp,buf,bufsize); + delete[] buf; + buf = tmp; + des = &buf[bufsize]; + bufsize += DELTA_BUFSIZE; + } + // read next byte + n = Read(&ch,1); + if(n < 0) { + // an error occured + result = -1; + break; + } + else if(n == 0) { + // no data available, give up the processor for some time + // to reduce the cpu last + sleepms(10); + continue; + } + // if eos is composed of more than one char, and the current + // byte doesn't match the next eos character, we handle the + // readed byte as a normal char (and not an eos) + if((eos != eosString) && (ch != *eos)) { + // FIXME! + // write all characters, which was matched the eos string + // until now (with the first wrong character all received + // eos characters are invalid and must handled as normal + // characters). + + // This doesn't work right and is only a little workaround + // because the received eos chars are lost + PutBack(ch); + // because we doesn't match the eos string, we must 'reset' + // the eos match + eos = eosString; + continue; + } + else { + if((ch == *eos) && !quoted) { + if(*++eos == 0) { + // the eos string is complete + result = 1; + break; + } + continue; + } + } + if(ch == quota) { + quoted ^= 1; + } + *des++ = ch; + } + *des = 0; + readbuf = buf; + *readedBytes = des - buf; + return result; + }; + + int IOBase::Writev(char* buf,size_t len,unsigned int timeout_in_ms) + { + char *cp = buf; + int n = 0; + int timeout = 0; + size_t towrite = len; + + Timer t(timeout_in_ms,&timeout,NULL); + if(timeout_in_ms != 0xFFFFFFFF) { + t.start(); + } + + while(!timeout && (towrite > 0)) { + if((n = Write(cp,towrite)) < 0) { + // an error occurs + break; + } + if(!n) { + sleepms(1); + } + towrite -= n; + cp += n; + } + return (len - towrite); + }; + +/* + Similar to Readv(). Writev() calls Write() repeatedly till + all bytes are written. +*/ + int IOBase::Writev(char* buf,size_t len,int* timeout_flag,bool nice) + { + size_t towrite = len; + int n = 0; + char *cp = buf; + + while(towrite > 0) { + if(timeout_flag && (*timeout_flag > 0)) { + return (len - towrite); + } + if((n = Write(cp,towrite)) < 0) { + // an error occurs + return (len - towrite); + } + if(!n && nice) { + sleepms(1); + } + towrite -= n; + cp += n; + } + return(len); + }; + +} // namespace ctb diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/kbhit.cpp b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/kbhit.cpp new file mode 100644 index 0000000000..4a244ea251 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/kbhit.cpp @@ -0,0 +1,37 @@ +#if defined ( WIN32 ) +# include +#else +# include +# include +#endif + +namespace ctb { + + char GetKey() + { +#if defined ( WIN32 ) + if(_kbhit()) { + return _getch(); + } + return '\0'; +#else + int ch; + static struct termios t, save_t; + tcgetattr(0,&t); + save_t = t; + t.c_lflag &= ~(ICANON); + t.c_cc[VMIN] = 0; + t.c_cc[VTIME] = 0; + tcsetattr(0,TCSANOW,&t); + + ch = fgetc(stdin); + + tcsetattr(0,TCSANOW,&save_t); + if(ch != EOF) { + return ch; + } + return '\0'; +#endif + } + +} // namespace ctb diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/linux/serport.cpp b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/linux/serport.cpp new file mode 100644 index 0000000000..a369abc5e7 --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/linux/serport.cpp @@ -0,0 +1,443 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: linux/serport.cpp +// Purpose: +// Author: Joachim Buermann +// Id: $Id: serport.cpp,v 1.1.1.1 2004/11/24 10:30:11 jb Exp $ +// Copyright: (c) 2001 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "ctb-0.16/linux/serport.h" + +#include +#include +#include +#include +#include +#include +#include + +#define CMSPAR 010000000000 /* mark or space (stick) parity */ + +namespace ctb { + + const char* COM1 = "/dev/ttyS0"; + const char* COM2 = "/dev/ttyS1"; + const char* COM3 = "/dev/ttyS2"; + const char* COM4 = "/dev/ttyS3"; + const char* COM5 = "/dev/ttyS4"; + const char* COM6 = "/dev/ttyS5"; + const char* COM7 = "/dev/ttyS6"; + const char* COM8 = "/dev/ttyS7"; + const char* COM9 = "/dev/ttyS8"; + const char* COM10 = "/dev/ttyS9"; + const char* COM11= "/dev/ttyS10"; + const char* COM12= "/dev/ttyS11"; + const char* COM13 = "/dev/ttyS12"; + const char* COM14 = "/dev/ttyS13"; + const char* COM15 = "/dev/ttyS14"; + const char* COM16 = "/dev/ttyS15"; + const char* COM17 = "/dev/ttyS16"; + const char* COM18 = "/dev/ttyS17"; + const char* COM19 = "/dev/ttyS18"; + const char* COM20 = "/dev/ttyS19"; + + SerialPort::SerialPort() : + SerialPort_x() + { + fd = -1; + }; + + SerialPort::~SerialPort() + { + Close(); + }; + + speed_t SerialPort::AdaptBaudrate( int baud ) + { + switch(baud) { + case 150: return B150; + case 300: return B300; + case 600: return B600; + case 1200: return B1200; + case 2400: return B2400; + case 4800: return B4800; + case 9600: return B9600; + case 19200: return B19200; + case 57600: return B57600; + case 115200: return B115200; + case 230400: return B230400; + case 460800: return B460800; + case 921600: return B921600; + + // NOTE! The speed of 38400 is required, if you want to set + // an non-standard baudrate. See below! + default: return B38400; + } + }; + + int SerialPort::CloseDevice() + { + int err = 0; + // only close an open file handle + if(fd < 0) return EBADF; + // With some systems, it is recommended to flush the serial port's + // Output before closing it, in order to avoid a possible hang of + // the process... + // Thanks to Germain (I couldn't answer you, because your email + // address was invalid) + tcflush(fd, TCOFLUSH); + + // Don't recover the orgin settings while the device is open. This + // implicate a mismatched data output! + // Just close device + err = close( fd ); + + fd = -1; + + return err; + }; + + int SerialPort::ChangeLineState( SerialLineState flags ) + { + int state; + ioctl(fd,TIOCMGET,&state); + state ^= flags; + return ioctl(fd,TIOCMSET,&state); + }; + + int SerialPort::ClrLineState( SerialLineState flags ) + { + return ioctl(fd,TIOCMBIC,&flags); + }; + + int SerialPort::GetLineState() + { + SerialLineState flags = LinestateNull; + + if( ioctl( fd, TIOCMGET, &flags ) < 0 ) { + + return -1; + + } + return (int)( flags & 0x1FF ); + }; + +// +// included from /usr/include/linux/serial.h +// +// struct serial_icounter_struct { +// int cts, dsr, rng, dcd; +// int rx, tx; +// int frame, overrun, parity, brk; +// int buf_overrun; +// int reserved[9]; +// }; +// + int SerialPort::Ioctl(int cmd, void* args) + { + int count = 0; + int err = 0; + struct serial_icounter_struct info; + SerialPort_EINFO einfo; + + switch(cmd) { + case CTB_RESET: + return SendBreak(0); + case CTB_SER_GETEINFO: + err = ioctl(fd,TIOCGICOUNT,&info); + if(err) return err; + einfo.brk = info.brk - save_info.brk; + einfo.frame = info.frame - save_info.frame; + einfo.overrun = info.overrun - save_info.overrun; + einfo.parity = info.parity - save_info.parity; + *(SerialPort_EINFO*)args = einfo; + break; + case CTB_SER_GETBRK: + err = ioctl(fd,TIOCGICOUNT,&info); + if(err) return err; + if(last_info.brk != info.brk) count = 1; + break; + case CTB_SER_GETFRM: + err = ioctl(fd,TIOCGICOUNT,&info); + if(err) return err; + if(last_info.frame != info.frame) count = 1; + break; + case CTB_SER_GETOVR: + err = ioctl(fd,TIOCGICOUNT,&info); + if(err) return err; + if(last_info.overrun != info.overrun) count = 1; + break; + case CTB_SER_GETPAR: + err = ioctl(fd,TIOCGICOUNT,&info); + if(err) return err; + if(last_info.parity != info.parity) count = 1; + break; + case CTB_SER_GETINQUE: + err = ioctl(fd,TIOCINQ,&count); + if(err) return err; + *(int*)args = count; + return 0; + case CTB_SER_SETPAR: + return SetParityBit( *(int*)args == 1 ); + default: + return -1; + } + last_info = info; + return 0; + }; + + int SerialPort::IsOpen() + { + return (fd != -1); + }; + + int SerialPort::OpenDevice(const char* devname, void* dcs) + { + // if dcs isn't NULL, type cast + if(dcs) m_dcs = *(SerialPort_DCS*)dcs; + // open serial comport device for reading and writing, + // don't wait (O_NONBLOCK) + fd = open(devname, O_RDWR | O_NOCTTY | O_NONBLOCK); + if(fd >= 0) { + + // exclusive use + int dummy; + + ioctl( fd, TIOCEXCL, &dummy ); + + tcgetattr(fd,&t); + save_t = t; + + // save the device name + strncpy(m_devname,(char*)devname,sizeof(m_devname)); + // we write an eos to avoid a buffer overflow + m_devname[sizeof(m_devname)-1] = '\0'; + + // Fill the internal terios struct. + // If the given baudrate is an non-standard one, the AdaptBaudrate + // call returns the linux specific value B38400 which is a + // condition for the later switch to an unusual baudrate! + cfsetspeed(&t, AdaptBaudrate( m_dcs.baud ) ); + + //cfsetospeed(&t, AdaptBaudrate( m_dcs.baud ) ); + + // parity settings + switch( m_dcs.parity ) { + + case ParityNone: + t.c_cflag &= ~PARENB; break; + + case ParityOdd: + t.c_cflag |= PARENB; + t.c_cflag |= PARODD; + break; + + case ParityEven: + t.c_cflag |= PARENB; + t.c_cflag &= ~PARODD; + break; + + case ParityMark: + t.c_cflag |= PARENB | CMSPAR | PARODD; + break; + + case ParitySpace: + t.c_cflag |= PARENB | CMSPAR; + t.c_cflag &= ~PARODD; + break; + } + + // stopbits + if(m_dcs.stopbits == 2) + t.c_cflag |= CSTOPB; + else + t.c_cflag &= ~CSTOPB; + // wordlen + t.c_cflag &= ~CSIZE; + if(m_dcs.wordlen == 7) t.c_cflag |= CS7; + else if(m_dcs.wordlen == 6) t.c_cflag |= CS6; + else if(m_dcs.wordlen == 5) t.c_cflag |= CS5; + // this is the default + else t.c_cflag |= CS8; + // rts/cts + if(m_dcs.rtscts == false) + t.c_cflag &= ~CRTSCTS; + else + t.c_cflag |= CRTSCTS; + + t.c_lflag &= ~(ICANON | ECHO | ISIG | IEXTEN); + t.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON | IXOFF | IXANY); + t.c_iflag |= IGNPAR; + t.c_oflag &= ~OPOST; + + if(m_dcs.xonxoff == true) { + t.c_iflag |= (IXON | IXOFF); + } + + // look out! + // MIN = 1 means, in TIME (1/10 secs) defined timeout + // will be started AFTER receiving the first byte + // so we must set MIN = 0. (timeout starts immediately, abort + // also without readed byte) + t.c_cc[VMIN] = 0; + // timeout in 1/10 secs + // no timeout for non blocked transfer + t.c_cc[VTIME] = 0; + // write the settings + tcsetattr(fd,TCSANOW,&t); + // it's careless, but in the moment we don't test + // the return of tcsetattr (normally there is no error) + + // request the actual numbers of breaks, framing, overrun + // and parity errors (because Linux summing all of them during + // system lifetime, not only while serial port is open. + ioctl(fd,TIOCGICOUNT,&save_info); + // it's also careless, but we assume, that there was no error + last_info = save_info; + + // in case of a non-standard rate, the termios struct have to set + // with the B38400 rate, see above! + if( ! IsStandardRate( m_dcs.baud ) ) { + + SetBaudrateAny( m_dcs.baud ); + + } + } + return fd; + }; + + int SerialPort::Read(char* buf,size_t len) + { + if(m_fifo->items() > 0) { + return m_fifo->read(buf,len); + } + // Read() (using read() ) will return an 'error' EAGAIN as it is + // set to non-blocking. This is not a true error within the + // functionality of Read, and thus should be handled by the caller. + int n = read(fd,buf,len); + if((n < 0) && (errno == EAGAIN)) return 0; + return n; + }; + + int SerialPort::SendBreak(int duration) + { + // the parameter is equal with linux + return tcsendbreak(fd,duration); + }; + + /* + Note: The following hints are copied from the ftdi_sio.c sources of + the kernel modul for the USB to RS232 converter using an FTDI + chipset (FT232BM or similar). Thanks to all those people + contribute code and above all helpful comments to this modul. + */ + + /* + * The logic involved in setting the baudrate can be cleanly split in 3 steps. + * Obtaining the actual baud rate is a little tricky since unix traditionally + * somehow ignored the possibility to set non-standard baud rates. + * 1. Standard baud rates are set in tty->termios->c_cflag + * 2. If these are not enough, you can set any speed using alt_speed as + * follows: + * - set tty->termios->c_cflag speed to B38400 + * - set your real speed in tty->alt_speed; it gets ignored when + * alt_speed==0, (or) + * - call TIOCSSERIAL ioctl with (struct serial_struct) set as follows: + * flags & ASYNC_SPD_MASK == ASYNC_SPD_[HI, VHI, SHI, WARP], this just + * sets alt_speed to (HI: 57600, VHI: 115200, SHI: 230400, WARP: 460800) + * ** Steps 1, 2 are done courtesy of tty_get_baud_rate + * 3. You can also set baud rate by setting custom divisor as follows + * - set tty->termios->c_cflag speed to B38400 + * - call TIOCSSERIAL ioctl with (struct serial_struct) set as follows: + * o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST + * o custom_divisor set to baud_base / your_new_baudrate + * ** Step 3 is done courtesy of code borrowed from serial.c - I should really + * spend some time and separate+move this common code to serial.c, it is + * replicated in nearly every serial driver you see. + */ + + int SerialPort::SetBaudrateAny( int baudrate ) + { + struct serial_struct ser_info; + + int result = ioctl( fd, TIOCGSERIAL, &ser_info ); + + ser_info.flags = ASYNC_SPD_CUST | ASYNC_LOW_LATENCY; + + ser_info.custom_divisor = ser_info.baud_base / baudrate; + + result = ioctl( fd, TIOCSSERIAL, &ser_info ); + + return result; + } + + int SerialPort::SetBaudrateStandard( int baudrate ) + { + speed_t baud = AdaptBaudrate( baudrate ); + // setting the input baudrate + if(cfsetspeed(&t,baud) < 0) { + return -1; + } + // take over + m_dcs.baud = baudrate; + + tcsetattr(fd,TCSANOW,&t); + + return tcgetattr( fd, &t ); + + }; + + int SerialPort::SetBaudrate( int baudrate ) + { + return IsStandardRate( baudrate ) ? + SetBaudrateStandard( baudrate ) : + SetBaudrateAny( baudrate ); + + } + + int SerialPort::SetLineState( SerialLineState flags ) + { + return ioctl(fd,TIOCMBIS,&flags); + }; + + int SerialPort::SetParityBit( bool parity ) + { + // waits until all output has been transmitted + tcdrain( fd ); + + // now read the current termios settings and manipulate + // the parity + tcgetattr( fd, &t ); + + if( parity ) { + + t.c_cflag |= PARENB | CMSPAR | PARODD; + + } + else { + + t.c_cflag |= PARENB | CMSPAR; + + t.c_cflag &= ~PARODD; + + } + + tcsetattr( fd,TCSANOW, &t ); + + tcgetattr( fd, &t ); + + return 0; + } + + int SerialPort::Write(char* buf,size_t len) + { + // Write() (using write() ) will return an 'error' EAGAIN as it is + // set to non-blocking. This is not a true error within the + // functionality of Write, and thus should be handled by the caller. + int n = write(fd,buf,len); + if((n < 0) && (errno == EAGAIN)) return 0; + return n; + }; + +} // namespace ctb diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/linux/timer.cpp b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/linux/timer.cpp new file mode 100644 index 0000000000..f1c50f613b --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/linux/timer.cpp @@ -0,0 +1,97 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: linux/timer.cpp +// Purpose: +// Author: Joachim Buermann +// Id: $Id: timer.cpp,v 1.1.1.1 2004/11/24 10:30:11 jb Exp $ +// Copyright: (c) 2001 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +#include "ctb-0.16/timer.h" +#include + +namespace ctb { + +// a dummy function, see below + static void timer_exit(void* arg) + { + }; + + static void* timer_fnc(void* arg) + { + // the timer thread should be canceled every time + // (asyncronously) + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); + // this is tricky, but absolutly necessarily to avoid segfaults + // if the destructor finished a running thread + pthread_cleanup_push(timer_exit,NULL); + timer_control *tc = (timer_control*)arg; + // linux allows a real sleep, means the timer thread will + // be sleeping (no reduce of the system performance) + usleep(tc->usecs); + // time is over, system reawake the thread. + // if there is an exit function, calling it + if(tc->exitfnc) tc->exitfnc(NULL); + // set the exit flag + if(tc->exitflag) *tc->exitflag = 1; + // deallocate the system resources (thread) + pthread_cleanup_pop(1); + return NULL; + }; + + // the constructor initiate the internal control struct + Timer::Timer( unsigned int msecs, int* exitflag, void*( *exitfnc )(void*) ) + { + control.usecs = msecs * 1000; + control.exitflag = exitflag; + control.exitfnc = exitfnc; + stopped = 1; + }; + + // if a timer instance leave it's valid range, it automaticaly will + // be finished + Timer::~Timer() + { + if(!stopped) { + // only a running thread may be canceled + stop(); + } + }; + + // starts the timer thread + int Timer::start() + { + stopped = 0; + if(pthread_create(&tid, // result parameter, covers the id + // of the new threads + NULL, // thread attribute object, NULL means + // the defaults + timer_fnc, // start function of the thread + &control // start function parameter, must refer + // as void* + ) == -1) { + return -1; // there was something going wrong + } + pthread_detach(tid); // thread status must be "detach". In the other + // case, the destructor call of a running + // thread throws a segfault + return 0; + }; + + // stop the timer thread + int Timer::stop() + { + if(control.exitflag && (*control.exitflag == 0)) { + pthread_cancel(tid); + } + stopped = 1; + return 0; + }; + + void sleepms(unsigned int ms) + { + usleep(ms * 1000); + }; + +} // namespace ctb diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/portscan.cpp b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/portscan.cpp new file mode 100644 index 0000000000..f13766e9fa --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/portscan.cpp @@ -0,0 +1,109 @@ +#include "ctb-0.16/ctb.h" +#include "ctb-0.16/portscan.h" + +#include + +#ifndef _WIN32 +# include +#endif + +namespace ctb { + + bool GetAvailablePorts( std::vector& result, + bool checkInUse ) + { +#ifdef _WIN32 + + std::stringstream devname; + + for( int i = 1; i < 100; i++ ) { + + devname.clear(); devname.str( "" ); + + // some systems like WinCE doesn't like the extended port numbering... + i < 10 ? devname << "com" << i : devname << "\\\\.\\com" << i; + + COMMCONFIG cc; + + DWORD dwSize = sizeof( cc ); + + if ( ::GetDefaultCommConfig( devname.str().c_str(), &cc, &dwSize ) ) { + + if( cc.dwProviderSubType == PST_RS232 ) { + + ctb::SerialPort com; + + if( com.Open( devname.str().c_str() ) < 0 ) { + + continue; + + } + + result.push_back( devname.str().c_str() ); + + } + } + } + +#else + glob_t globbuf; + + // search for standard serial ports + int res = glob( "/dev/ttyS*", GLOB_ERR, NULL, &globbuf ); + + if( res == 0 ) { + + // no error, glob was successful + for( int i = 0; i < globbuf.gl_pathc; i++ ) { + + if( checkInUse ) { + + ctb::SerialPort com; + + if( com.Open( globbuf.gl_pathv[ i ] ) < 0 ) { + + continue; + + } + + result.push_back( std::string( globbuf.gl_pathv[ i ] ) ); + + } + } + + } + globfree( &globbuf ); + + // search for USB to RS232 converters + res = glob( "/dev/ttyUSB*", GLOB_ERR, NULL, &globbuf ); + + if( res == 0 ) { + + // no error, glob was successful + for( int i = 0; i < globbuf.gl_pathc; i++ ) { + + if( checkInUse ) { + + ctb::SerialPort com; + + if( com.Open( globbuf.gl_pathv[ i ] ) < 0 ) { + + continue; + + } + + result.push_back( std::string( globbuf.gl_pathv[ i ] ) ); + + } + } + + } + + globfree( &globbuf ); +#endif + + return result.size(); + + } + +} // namespace ctb diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/serportx.cpp b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/serportx.cpp new file mode 100644 index 0000000000..c59bcc002f --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/serportx.cpp @@ -0,0 +1,104 @@ +#include "ctb-0.16/serportx.h" + +#include + +namespace ctb { + + int SerialPort_x::Open( const char* portname, int baudrate, + const char* protocol, + FlowControl flowControl ) + { + SerialPort_DCS dcs; + + dcs.baud = baudrate; + + // default wordlen is 8 + if( ( protocol[ 0 ] >= '5' ) && ( protocol[ 0 ] <= '8' )) { + + dcs.wordlen = protocol[ 0 ] - '0'; + + } + else { + + return -1; + + } + + // protocol is given as a string like "8N1", the first + // character specifies the data bits (5...8), the second + // the parity (None,Odd,Even,Mark,Space). + // The third character defines the stopbit (1...2). + switch( protocol[ 1 ] ) { + case 'N': case 'n': dcs.parity = ParityNone; break; + case 'O': case 'o': dcs.parity = ParityOdd; break; + case 'E': case 'e': dcs.parity = ParityEven; break; + case 'M': case 'm': dcs.parity = ParityMark; break; + case 'S': case 's': dcs.parity = ParitySpace; break; + // all other parameters cause an error! + default: return -1; + } + // default stopbits is 1 + if( ( protocol[ 2 ] >= '1' ) && ( protocol[ 2 ] <= '2' )) { + + dcs.stopbits = protocol[ 2 ] - '0'; + + } + else { + + return -1; + + } + // default flow control is disabled + dcs.rtscts = ( flowControl == RtsCtsFlowControl ); + + dcs.xonxoff = ( flowControl == XonXoffFlowControl ); + + // save the settings in the internal dcs for later use + m_dcs = dcs; + + return OpenDevice( portname, &m_dcs ); + + } + + int SerialPort_x::Open( const int portnumber, int baudrate, + const char* protocol, + FlowControl flowControl ) + { + // portnumbers start with 1 + if( portnumber < 1 ) { + + return -1; + + } + std::stringstream devname; + +#if defined ( WIN32 ) + // some systems like WinCE doesn't like the extended port numbering... + portnumber < 10 ? devname << "com" << portnumber : + devname << "\\\\.\\com" << portnumber; +#else + devname << "/dev/ttyS" << ( portnumber - 1 ); +#endif + + return Open( devname.str().c_str(), baudrate, protocol, flowControl ); + } + + bool SerialPort_x::IsStandardRate( int rate ) + { + const int rates[] = { + 150, 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, + 115200, 230400, 460800, 921600 + }; + + for( unsigned int i = 0; i < ( sizeof( rates ) / sizeof( int ) ); i++ ) { + + if( rate == rates[ i ] ) { + + return true; + + } + } + return false; + } + +} // namespace ctb diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/win32/getopt.cpp b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/win32/getopt.cpp new file mode 100644 index 0000000000..c8454b9bde --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/win32/getopt.cpp @@ -0,0 +1,66 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: win32/getopt.cpp +// Purpose: +// Author: unknown, I found it in the internet +// Id: $Id: getopt.cpp,v 1.1.1.1 2004/11/24 10:30:11 jb Exp $ +// Copyright: (c) 2001 ? +// Licence: (I think Open Source) +///////////////////////////////////////////////////////////////////////////// + +#include +#include + +char *optarg; /* Global argument pointer. */ +int optind = 0; /* Global argv index. */ + +static char *scan = NULL; /* Private scan pointer. */ + +/* found char, or NULL if none */ +static char *index(const char* s,char charwanted) +{ + return(strchr((char*)s, charwanted)); +} + +int getopt(int argc, char* argv[], char* optstring) +{ + register char c; + register char *place; + + optarg = NULL; + + if (scan == NULL || *scan == '\0') { + if (optind == 0) + optind++; + + if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0') + return(EOF); + if (strcmp(argv[optind], "--")==0) { + optind++; + return(EOF); + } + + scan = argv[optind]+1; + optind++; + } + + c = *scan++; + place = index(optstring, c); + + if (place == NULL || c == ':') { + fprintf(stderr, "%s: unknown option -%c\n", argv[0], c); + return('?'); + } + + place++; + if (*place == ':') { + if (*scan != '\0') { + optarg = scan; + scan = NULL; + } else { + optarg = argv[optind]; + optind++; + } + } + + return(c); +} diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/win32/serport.cpp b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/win32/serport.cpp new file mode 100644 index 0000000000..23b50ab32b --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/win32/serport.cpp @@ -0,0 +1,452 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: serport.cpp +// Purpose: +// Author: Joachim Buermann +// Id: $Id: serport.cpp,v 1.1.1.1 2004/11/24 10:30:11 jb Exp $ +// Copyright: (c) 2001 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include +#include "ctb-0.16/serport.h" + +#define SERIALPORT_BUFSIZE 4096 + +namespace ctb { + + const char* COM1 = "com1"; + const char* COM2 = "com2"; + const char* COM3 = "com3"; + const char* COM4 = "com4"; + const char* COM5 = "com5"; + const char* COM6 = "com6"; + const char* COM7 = "com7"; + const char* COM8 = "com8"; + const char* COM9 = "com9"; + const char* COM10 = "\\\\.\\com10"; + const char* COM11 = "\\\\.\\com11"; + const char* COM12 = "\\\\.\\com12"; + const char* COM13 = "\\\\.\\com13"; + const char* COM14 = "\\\\.\\com14"; + const char* COM15 = "\\\\.\\com15"; + const char* COM16 = "\\\\.\\com16"; + const char* COM17 = "\\\\.\\com17"; + const char* COM18 = "\\\\.\\com18"; + const char* COM19 = "\\\\.\\com19"; + const char* COM20 = "\\\\.\\com20"; + + SerialPort::SerialPort() + { + memset( &m_ov, 0, sizeof( OVERLAPPED ) ); + fd = INVALID_HANDLE_VALUE; + m_rtsdtr_state = LinestateNull; + }; + + SerialPort::~SerialPort() + { + Close(); + }; + + int SerialPort::CloseDevice() + { + if(fd != INVALID_HANDLE_VALUE) { + CloseHandle(m_ov.hEvent); + CloseHandle(fd); + fd = INVALID_HANDLE_VALUE; + } + return 0; + }; + + int SerialPort::ChangeLineState( SerialLineState flags ) + { + bool ok = false; + if(flags & LinestateDtr) { + if(m_rtsdtr_state & LinestateDtr) { + ok = EscapeCommFunction(fd,CLRDTR); + } + else { + ok = EscapeCommFunction(fd,SETDTR); + } + m_rtsdtr_state ^= LinestateDtr; + } + if(flags & LinestateRts) { + if(m_rtsdtr_state & LinestateRts) { + ok = EscapeCommFunction(fd,CLRRTS); + } + else { + ok = EscapeCommFunction(fd,SETRTS); + } + m_rtsdtr_state ^= LinestateRts; + } + if(!ok) return -1; + return 0; + }; + + int SerialPort::ClrLineState( SerialLineState flags ) + { + BOOL ok = false; + if(flags & LinestateDtr) { + ok = EscapeCommFunction(fd,CLRDTR); + m_rtsdtr_state &= ~LinestateDtr; + } + if(flags & LinestateRts) { + ok = EscapeCommFunction(fd,CLRRTS); + m_rtsdtr_state &= ~LinestateRts; + } + if(!ok) return -1; + return 0; + }; + + int SerialPort::GetLineState() + { + BOOL ok = false; + DWORD stat; + int flags = 0; + if(GetCommModemStatus(fd,&stat)) { + if(stat & MS_CTS_ON) + flags |= LinestateCts; + if(stat & MS_DSR_ON) + flags |= LinestateDsr; + if(stat & MS_RING_ON) + flags |= LinestateRing; + if(stat & MS_RLSD_ON) + flags |= LinestateDcd; + ok = true; + } + if(!ok) return -1; + return flags; + }; + + int SerialPort::Ioctl(int cmd,void* args) + { + COMSTAT comstat; + DWORD errors; + int result = 0; + bool brk; + switch(cmd) { + case CTB_RESET: + return SendBreak(0); + case CTB_SER_GETEINFO: + if(ClearCommError(fd,&errors,&comstat)) { + // actualize the last events + if(errors & CE_BREAK) einfo.brk++; + if(errors & CE_FRAME) einfo.frame++; + if(errors & CE_OVERRUN) einfo.overrun++; + if(errors & CE_RXPARITY) einfo.parity++; + *(SerialPort_EINFO*)args = einfo; + return 0; + } + case CTB_SER_GETBRK: + if(ClearCommError(fd,&errors,&comstat)) { + if(errors & CE_BREAK) result = 1; + einfo.brk += result; + *(int*)args = result; + return 0; + } + break; + case CTB_SER_GETFRM: + if(ClearCommError(fd,&errors,&comstat)) { + if(errors & CE_FRAME) result = 1; + einfo.frame += result; + *(int*)args = result; + return 0; + } + case CTB_SER_GETOVR: + if(ClearCommError(fd,&errors,&comstat)) { + if(errors & CE_OVERRUN) result = 1; + einfo.overrun += result; + *(int*)args = result; + return 0; + } + break; + case CTB_SER_GETPAR: + if(ClearCommError(fd,&errors,&comstat)) { + if(errors & CE_RXPARITY) result = 1; + einfo.parity += result; + *(int*)args = result; + return 0; + } + break; + case CTB_SER_GETINQUE: + if(ClearCommError(fd,&errors,&comstat)) { + *(int*)args = (int)comstat.cbInQue; + return 0; + } + break; + case CTB_SER_SETPAR: + return SetParityBit( *(int*)args == 1 ); + } + // error or unknown command + return -1; + }; + + int SerialPort::IsOpen() + { + return (fd != INVALID_HANDLE_VALUE); + }; + + int SerialPort::OpenDevice(const char* devname, void* dcs) + { + // if dcs isn't NULL, type cast + if(dcs) m_dcs = *(SerialPort_DCS*)dcs; + + fd = CreateFile(devname, // device name + GENERIC_READ | GENERIC_WRITE, // O_RDWR + 0, // not shared + NULL, // default value for object security ?!? + OPEN_EXISTING, // file (device) exists + FILE_FLAG_OVERLAPPED, // asynchron handling + NULL); // no more handle flags + + if(fd == INVALID_HANDLE_VALUE) { + return -1; + } + // save the device name + strncpy(m_devname,(char*)devname,sizeof(m_devname)); + // we write an eos to avoid a buffer overflow + m_devname[sizeof(m_devname)-1] = '\0'; + + // device control block + DCB dcb; + memset(&dcb,0,sizeof(dcb)); + dcb.DCBlength = sizeof(dcb); + dcb.BaudRate = m_dcs.baud; + dcb.fBinary = 1; + + m_rtsdtr_state = LinestateNull; + + // Specifies whether the CTS (clear-to-send) signal is monitored + // for output flow control. If this member is TRUE and CTS is turned + // off, output is suspended until CTS is sent again. + dcb.fOutxCtsFlow = m_dcs.rtscts; + + // Specifies the DTR (data-terminal-ready) flow control. + // This member can be one of the following values: + // DTR_CONTROL_DISABLE Disables the DTR line when the device is + // opened and leaves it disabled. + // DTR_CONTROL_ENABLE Enables the DTR line when the device is + // opened and leaves it on. + // DTR_CONTROL_HANDSHAKE Enables DTR handshaking. If handshaking is + // enabled, it is an error for the application + // to adjust the line by using the + // EscapeCommFunction function. + dcb.fDtrControl = DTR_CONTROL_DISABLE; + m_rtsdtr_state |= LinestateDtr; + // Specifies the RTS flow control. If this value is zero, the + // default is RTS_CONTROL_HANDSHAKE. This member can be one of + // the following values: + // RTS_CONTROL_DISABLE Disables the RTS line when device is + // opened and leaves it disabled. + // RTS_CONTROL_ENABLED Enables the RTS line when device is + // opened and leaves it on. + // RTS_CONTROL_HANDSHAKE Enables RTS handshaking. The driver + // raises the RTS line when the + // "type-ahead" (input)buffer is less than + // one-half full and lowers the RTS line + // when the buffer is more than three-quarters + // full. If handshaking is enabled, it is an + // error for the application to adjust the + // line by using the EscapeCommFunction function. + // RTS_CONTROL_TOGGLE Specifies that the RTS line will be high if + // bytes are available for transmission. After + // all buffered bytes have been send, the RTS + // line will be low. + if(m_dcs.rtscts) dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; + else { + dcb.fRtsControl = RTS_CONTROL_DISABLE; + m_rtsdtr_state |= LinestateRts; + } + // Specifies the XON/XOFF flow control. + // If fOutX is true (the default is false), transmission stops when the + // XOFF character is received and starts again, when the XON character + // is received. + dcb.fOutX = m_dcs.xonxoff; + // If fInX is true (default is false), the XOFF character is sent when + // the input buffer comes within XoffLim bytes of being full, and the + // XON character is sent, when the input buffer comes within XonLim + // bytes of being empty. + dcb.fInX = m_dcs.xonxoff; + // default character for XOFF is 0x13 (hex 13) + dcb.XoffChar = 0x13; + // default character for XON is 0x11 (hex 11) + dcb.XonChar = 0x11; + // set the minimum number of bytes allowed in the input buffer before + // the XON character is sent (3/4 of full size) + dcb.XonLim = (SERIALPORT_BUFSIZE >> 2) * 3; + // set the maximum number of free bytes in the input buffer, before the + // XOFF character is sent (3/4 of full size) + dcb.XoffLim = (SERIALPORT_BUFSIZE >> 2) * 3; + + // parity + switch( m_dcs.parity ) { + + case ParityOdd: dcb.Parity = ODDPARITY; break; + case ParityEven: dcb.Parity = EVENPARITY; break; + case ParityMark: dcb.Parity = MARKPARITY; break; + case ParitySpace: dcb.Parity = SPACEPARITY; break; + default: dcb.Parity = NOPARITY; + + } + // stopbits + if(m_dcs.stopbits == 2) dcb.StopBits = TWOSTOPBITS; + else dcb.StopBits = ONESTOPBIT; + // wordlen, valid values are 5,6,7,8 + dcb.ByteSize = m_dcs.wordlen; + + if(!SetCommState(fd,&dcb)) + return -2; + + // create event for overlapped I/O + // we need a event object, which inform us about the + // end of an operation (here reading device) + m_ov.hEvent = CreateEvent(NULL,// LPSECURITY_ATTRIBUTES lpsa + TRUE, // BOOL fManualReset + TRUE, // BOOL fInitialState + NULL); // LPTSTR lpszEventName + if(m_ov.hEvent == INVALID_HANDLE_VALUE) { + return -3; + } + + /* THIS IS OBSOLETE!!! + // event should be triggered, if there are some received data + if(!SetCommMask(fd,EV_RXCHAR)) + return -4; + */ + + COMMTIMEOUTS cto = {MAXDWORD,0,0,0,0}; + if(!SetCommTimeouts(fd,&cto)) + return -5; + + // for a better performance with win95/98 I increased the internal + // buffer to SERIALPORT_BUFSIZE (normal size is 1024, but this can + // be a little bit to small, if you use a higher baudrate like 115200) + if(!SetupComm(fd,SERIALPORT_BUFSIZE,SERIALPORT_BUFSIZE)) + return -6; + + // clear the internal error struct + memset(&einfo,0,sizeof(einfo)); + return 0; + }; + + int SerialPort::Read(char* buf,size_t len) + { + DWORD read; + int m = m_fifo->items(); + while(len) { + if(m_fifo->get(buf) == 1) { + len--; + buf++; + } + else { + break; + } + } + if(!ReadFile(fd,buf,len,&read,&m_ov)) { + // if we use a asynchrone reading, ReadFile gives always + // FALSE + // ERROR_IO_PENDING means ok, other values show an error + if(GetLastError() != ERROR_IO_PENDING) { + // oops..., error in communication + return -1; + } + } + else { + // ok, we have read all wanted bytes + return (int)read + m; + } + return 0; + }; + + int SerialPort::SendBreak(int duration) + { + if(duration <= 0) duration = 1; + if(!SetCommBreak(fd)) return -1; + // win32 Sleep parameter is ms + Sleep(duration * 250); + if(!ClearCommBreak(fd)) return -1; + // no error + return 0; + }; + +/* + FIXME! : We need some additional code to check the success of the + baudrate modulation (non-standard rates depend on the used + UART chipset). +*/ + int SerialPort::SetBaudrate( int baudrate ) + { + DCB dcb; + + // get the current dcb... + if(!GetCommState(fd,&dcb)) { + return -1; + } + dcb.BaudRate = baudrate; + // and write it back + if(!SetCommState(fd,&dcb)) { + return -1; + } + m_dcs.baud = baudrate; + return 0; + } + + int SerialPort::SetLineState( SerialLineState flags ) + { + BOOL ok = false; + if(flags & LinestateDtr) { + ok = EscapeCommFunction(fd,SETDTR); + // save the new state + m_rtsdtr_state |= LinestateDtr; + } + if(flags & LinestateRts) { + ok = EscapeCommFunction(fd,SETRTS); + // save the new state + m_rtsdtr_state |= LinestateRts; + } + if(!ok) return -1; + return 0; + }; + + int SerialPort::SetParityBit( bool parity ) + { + DCB dcb; + + if( ! GetCommState( fd, &dcb ) ) { + + return -1; + + } + + parity ? dcb.Parity = MARKPARITY : dcb.Parity = SPACEPARITY; + + if( ! SetCommState( fd, &dcb ) ) { + + return -2; + + } + return 0; + } + + int SerialPort::Write(char* buf,size_t len) + { + DWORD write; + if(!WriteFile(fd,buf,len,&write,&m_ov)) { + if(GetLastError() != ERROR_IO_PENDING) { + return -1; + } + else { + // VERY IMPORTANT to flush the data out of the internal + // buffer + FlushFileBuffers(fd); + // first you must call GetOverlappedResult, then you + // get the REALLY transmitted count of bytes + if(!GetOverlappedResult(fd,&m_ov,&write,TRUE)) { + // ooops... something is going wrong + return (int)write; + } + } + } + return write; + }; + +} // namespace ctb diff --git a/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/win32/timer.cpp b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/win32/timer.cpp new file mode 100644 index 0000000000..617aa5b5ad --- /dev/null +++ b/src/mod/endpoints/mod_gsmopen/libctb-0.16/src/win32/timer.cpp @@ -0,0 +1,85 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: win32/timer.cpp +// Purpose: +// Author: Joachim Buermann +// Id: $Id: timer.cpp,v 1.2 2004/11/30 12:39:17 jb Exp $ +// Copyright: (c) 2001 Joachim Buermann +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include +#include + +#ifdef WIN32 +#include +# ifndef DWORD_PTR +# define DWORD_PTR DWORD* +# endif +#endif + +#include "ctb-0.16/timer.h" + +namespace ctb { + + static void WINAPI timer_fnc(UINT uTimerID, + UINT uMsg, + DWORD_PTR dwUser, + DWORD_PTR dw1, + DWORD_PTR dw2) + { + timer_control *tc = (timer_control*)dwUser; + + if(tc->exitfnc) tc->exitfnc(NULL); + if(tc->exitflag) *tc->exitflag = 1; + tc->stop = 0; + }; + + Timer::Timer(unsigned int msecs,int* exitflag,void*(*exitfnc)(void*)) + { + control.msecs = msecs; + if(!control.msecs) control.msecs = 1; + control.exitflag = exitflag; + control.exitfnc = exitfnc; + control.stop = 0; + }; + + Timer::~Timer() + { + stop(); // stop the thread + }; + + int Timer::start() + { + stop(); + control.stop = timeSetEvent(control.msecs, + (control.msecs > 10) ? 5 : 1, + (LPTIMECALLBACK) timer_fnc, + (DWORD) &control, + TIME_ONESHOT | TIME_CALLBACK_FUNCTION); + return 0; + }; + + int Timer::stop() + { + if (control.stop) + timeKillEvent(control.stop); + control.stop = 0; + return 0; + }; + + void kill_all_timer() + { + }; + + void sleepms(unsigned int ms) + { + // set the granularity of Sleep() for the application, that + // calls it so Sleep(1) will truly sleep for just a millisecond, + // rather than the default 10! + // See: http://www.geisswerks.com/ryan/FAQS/timing.html + timeBeginPeriod(1); + SleepEx(ms,false); + timeEndPeriod(1); + }; + +} // namespace ctb