pax_global_header00006660000000000000000000000064123430472770014523gustar00rootroot0000000000000052 comment=b5e628f0495b91eda19dc092ff7a70b7209255ac olsrd-0.6.6.2/000077500000000000000000000000001234304727700130175ustar00rootroot00000000000000olsrd-0.6.6.2/.gitignore000066400000000000000000000003471234304727700150130ustar00rootroot00000000000000*~ *.a *.aps *.d *.diff *.dll *.lib *.ncb *.o *.obj *.opt *.orig *.out.* *.plg *.rej *.sbr *.so.*.* *.swp /.cproject /.project /.settings /build-stamp /configure-stamp /olsrd /olsrd.exe /olsr_switch /olsr_switch.exe /olsr-setup.exeolsrd-0.6.6.2/CHANGELOG000066400000000000000000002764521234304727700142510ustar00rootroot000000000000000.6.6.2 ------------------------------------------------------------------- Alessio Caiazza (2): Hotfix for very long http headers also for jsoninfo jsoninfo: HTTP headers with CORS (if requested) Ferry Huberts (8): pud: fix java detection in the wireformat java bindings (again) pud: do the same fix as in the previous commit, now for i386 Make sure to save/restore errno in signal handlers main: olsr_create_lock_file: fix return value check on 'open' call pud: fix readIPAddress function tok: improve the nmea_calc_crc function a bit neighbor table: fix crash in olsr_print_neighbor_table on MinGW Fix strange coding in the 'long headers' fix Henning Rogge (5): Update version after release of v0.6.6.1 Fix processing error for fragmented hellos Fix some spelling mistakes Hotfix for much too long http headers Release v0.6.6.2 0.6.6.1 ------------------------------------------------------------------- Henning Rogge (2): Update version after release of v0.6.6 Release v0.6.6.1 Manuel Munz (1): Fix jsoninfo again after a regression which was introduced with 0.6.6 ------------------------------------------------------------------- Bastian Bittorf (3): [hotfix] plugin: httpinfo: in case of an unrecoverable error ("could not initialize HTTP socket") exit for returnvalue != 0 plugin: dot_draw: readme: make it clear, that it only opens an IPv4-socket, so a 'telnet ::1 2004' is not possible plugin: dot_draw: readme: replaced a b0rken link Ferry Huberts (146): Update version after branch of v0.6.5 gateway: store current gateway(s) in a struct gateway: lazily allocate the current gateway structs gateway: add path_cost to 'set gateway' interface gateway: add interface to get the gateway costs gateway: simplify by using the new costs interface gateway: add gateway_list.{c,h} gateway: keep track of the active gateways in a list Merge branch 'release-0.6.5' pud: java make target is dependent on library make target Merge branch 'release-0.6.5' Merge branch 'release-0.6.5' json_info: only output smart gateway info on Linux kernel_route: olsr_os_inetgw_tunnel_route can now take the table gateway: let the gateway code determine the tunnel name gateway: remove the worst gateway before adding new one gateway: add SmartGatewayUseCount configuration parameter gateway: use SmartGatewayUseCount setting the the gateway lists gateway: add SmartGatewayEgressInterfaces configuration parameter gateway: add SmartGatewayMarkOffset{Egress,Tunnels} configuration parameters gateway: add SmartGatewayPolicyRoutingScript configuration parameter gateway: initialise a set of fixed tunnel names in/for multi-gateway mode gateway: initialise the egress interface names in/for multi-gateway mode gateway: use fixed tunnel names in/for multi-gateway mode gateway: setup and clear table specific default routes in/for multi-gateway mode gateway: setup/cleanup multi-gateway mode during startup/shutdown of olsrd gateway: introduce and use MULTI_GW_MODE define gateway: enable multi-gateway mode gateway: convert some defines into inline functions kernel_route: olsr_os_inetgw_tunnel_route now needs the table explicitly Merge branch 'multigw' gateway: remove 2 superfluous asserts gateway: add an assert to prevent an 'unused' warning gateway: also adjust the IPv6 gateway list in olsr_update_gateway_entry gateway: fix policy script permissions checking gateway: the gateway policy script really is a bash script gateway: minor indentation fixes in the gateway script gateway: fix copy/paste mistake in setting up the egress rules gateway: remove policy rules before adding them gateway: ignore errors in remove-before-add rule removals Revert "linux: name is required to be non-null in olsr_os_cleanup_iptunnel" gateway: do not show (bogus) errors gateway: cleanup the server tunnel later cfgparser: add SmartGatewayAlwaysRemoveServerTunnel configuration parameter gateway: use SmartGatewayAlwaysRemoveServerTunnel configuration parameter gateway: fix a revert problem gateway: use tnl_(4|6) tunnel names instead of tnl(4|6)_ gateway: properly set the egress interface names json_info: do not loop forever on smart gateway egress interfaces pud: the best uplink gateway is the same as the current (smart) gateway pud: there is no hard dependency on smart gateway pud: only forward downlinked messages when the smart gateway system is enabled pud: update documentation about smart gateway changes gateway: fix 2 small typos in a comment Revert "pud: the best uplink gateway is the same as the current (smart) gateway" pud: minor update resulting from the previous revert pud: minor update to getBestUplinkGateway gateway: minor improvement to get_unused_iptunnel_name gateway: update some comments gateway: remove 2 unneeded asserts gateway: use standard macro to loop over the gateway tree in olsr_cleanup_gateways gateway: fix 'eligible' conditions in gw_default_choose_gateway gateway: minor speed improvement in gw_default_choose_gateway android: fix the path of the tunnel node in the /dev tree pud: use the proper __ANDROID__ define gateway: allow advertisement of zero bandwidth gateway: add some comments gateway: also set (update) the gateway when costs have changed gateway: find_interfaceName only works in multi-gateway mode gateway: simplify gw_default_calc_threshold gateway: improve comments of gw_default_weigh_costs a bit gateway: rename some variables to make it more readable gateway: fix stable count dampening in gw_default_timer gateway: do not use bitwise operators for logic conditions gateway: reverse semantics of two variables gateway: always select a new gateway when threshold != 0 main: add -pidfile command line option main: fix pidfile compilation on windows Merge branch 'release-0.6.5' make: enable 32/64 bit cross compilation pud: pull in nmealib v1.0.4 gateway: remove some 'unused' code from sgw script make: fix typos in 'enable 32/64 bit cross compilation' commit pud: enable 32/64 bit cross compilation for the java build make: ifdef fixups Merge branch 'release-0.6.5' Merge branch 'release-0.6.5' Merge branch 'release-0.6.5' pud: detect the java include directory dyn_gw: remove bogus include make: fix a type in the Linux SUBDIRS assignment make: add dyn_gw, mdns and p2pd to the Android SUBDIRS pud: update nmealib 32/64 cross compilation Revert "pud: update nmealib 32/64 cross compilation" main: fix 2 minor warnings for win64 build on debian squeeze make: only install sgw related files when sgw is supported mdns: fix container_of pointer arith mdns: don't use non-standard ushot type mdns: fix three alignment warnings mdns: supported on Android p2pd: supported on Android make: ensure win32 install respects DESTDIR Merge branch 'release-0.6.5' gateway: work around kernel IPIP module initialisation bug gateway: fix overlap in success/fail IPIP tunnel init doc: make the documentation generation commands a bit more verbose pud: detect the java include directory pud: better detection of java jdk pud: better detection of java jdk gateway: work around kernel IPIP module initialisation bug Merge branch 'release-0.6.5' PUD: nmealib: fix parsing of date in GPRMC pud: nmealib: fixup the previous commit main: use /dev/urandom by default main: use /dev/urandom by default pud: set local loopback for multicast tx pud: set local loopback for multicast tx Merge branch 'release-0.6.5' arprefresh: fix some spelling arprefresh: document the BPF program to make it readable arprefresh: use the ARRAYSIZE macro arprefresh: remove a comment arprefresh: do not process IPv6 packets when in IPv4 mode arprefresh: add a note about VLANs and IPv6 remove pthread usage as much as possible Branch v0.6.6 Remove mercurial ignore file; we use git build: ignore builddata.c when hashing sources build: move build data into its own include file gateway: always deal with 64bit scaled path costs gateway: introduce and use removeGatewayFromList function gateway: add SmartGatewayTakeDownPercentage configuration parameter gateway: proactively take down 'expensive' gateways release: fix the list of generated files release: update some comments release: refactor the checkVersionIncrementing function release: do not update the version on master when it's already higher release: only report that master changed when it was actually changed release: checkVersionIncrementing: optionally allow equal versions release: also check against the Makefile version when branching txtinfo: prevent buffer overflow pud: nmealib: _nmea_parse_time not parsing hsec when given "hhmmss" format build: really _ignore_ builddata.c when hashing sources build: only print the md5 hash in hash_source.sh Makefile: fix builddata when building from tarball pud: fix readIPAddress function Hans-Christoph Steiner (3): GNU/Linux: add service profile for 'ufw' firewall package update Commotion example olsrd.conf to represent current project state dyn_gw/dyn_gw_plain require /proc, remove from default build on non-Linux Henning Rogge (7): Fixed debug output of Scheduler polling interval Fix multicast join for IPv6 Merge branch 'master' of http://olsr.org/git/olsrd Update version after release of v0.6.5.2 Update version after release of v0.6.5.2 Fix build break for MinGW compilation on Fedora 19. Release v0.6.6 Ronald in 't Velt (1): Fix setsockopt for setting Traffic Class in IPv6 Saverio Proto (3): main: fix the check on inet_pton return value because it returns 1 on success. mDNS: remove from Makefile PTHREAD useless dependency txtinfo: update README file Scott Kidder (1): jsoninfo: ensure output is wrapped in curly braces. Vasilis Tsiligiannis (1): olsrd-quagga: Fix memory leak when adding and deleting routes equinox (1): quagga plugin routes additional 0.6.5.2 ------------------------------------------------------------------- Henning Rogge (2): Update version after release of v0.6.5.1 Release v0.6.5.2 Saverio Proto (1): main: fix the check on inet_pton return value because it returns 1 on success. Vasilis Tsiligiannis (1): olsrd-quagga: Fix memory leak when adding and deleting routes 0.6.5.1 ------------------------------------------------------------------- Ferry Huberts (1): release: use olsrd-version prefix for files in the tarballs Henning Rogge (2): Update version after release of v0.6.5 Release v0.6.5.1 0.6.5 ------------------------------------------------------------------- Aaron Kaplan (1): chose the proper #define in order to take the right #include Alessandro (4): mDNS: Implemented Host Filtering for ipv4 and ipv6, writing in the config file which hosts to ignore. The mDNS packets from the ignored hosts will be ignored and not propagated in the network mDNS: Updated README file for mDNS plugin mDNS: Reworked logic of router Election. The election is now handled on interface basis, because the router could have one interface where it needs to be master and another interface where it needs to be disabled. There was a logical bug in the earlier implementation. mDNS: BUGFIX, mDNS plugin, hello message of router election not sent if debug = 0 Alessandro Gnagni (3): mDNS: Fixing loops for mDNS packets when mDNS plugin is misconfigured mDNS: review of Alessandro Gnagni patch, inserted a config value to enable or disable TTL check and change, default is enabled. mDNS: Implemented router election mechansim to have only 1 active mDNS OLSR router in 1 LAN Andreas Tonnesen (1): x86_64 patch from Bernd Bernd Petrovitsch (1): * added -Wbad-function-cast Ferry Huberts (219): gateway: clarify header with extra comments and ordering gateway: reorder functions to reflect order in header gateway: formatting gateway: remove 'unused' v{4,6}gw_choosen_external gateway: add asserts to validate gw_handler gateway: clear gw_handler during cleanup gateway: add init and cleanup hooks for gateway plugins gateway: rename hooks gateway: add comments to struct olsr_gw_handler function prototypes gateway: inline olsr_find_gateway_entry function gateway: inline olsr_trigger_inetgw_selection function gateway: rename a function gateway: simplify a condition gateway: push an if condition into its nested if's gateway: merge 2 code blocks gateway: the gateway to set must be in the gateway tree gateway: the gateway to set must either be an IPv4 or IPv6 gateway or both gateway: prevent 2 NULL dereferences gateway: merge 2 code blocks pud: force pending buffer out if not enough space for our message pud: include nmealib v1.0.3 http_info: pud satellites in use are now green, not in use are red ifdef: fix some include ifdefs update comments on all ifdefs olsrd_plugin: remove #if 1 gateway: rename 2 variables remove most '#if 0' blocks gateway: merge the olsr_get_ipv{4,6}_inet_gateway functions mdns: fix compilation warnings mdns: fix a compilation warning / copy-paste error bsd: fixup comment improve VERBOSE handling common: fix varargs cleanup pud: fix resource leak pud: fix socket error pud: fix socket error pud: fix position file stat/use race pud: fix getBestUplinkGateway pud: nmealib: fix copy/paste error pud: nmealib: fix buffer overrun pud: nmealib: fix buffer overrun pud: nmealib: fix invalid format string conversion add a COVERITY instructions text file pud: nmealib: fix invalid format string conversion pud: nmealib: fix invalid format string conversion pud: fix closing fd pud: fix checking of downlink message IP version sgwdynspeed: fix resource leak and file stat/use race bmf: explicitly cast fgetc result into a char bmf: do not close an 'error' socket return value bmf: do not dereference NULL pointer httpinfo: do not close an 'error' socket return value httpdinfo: fix resource leak secure: can only work for IPv4, so assert on it secure: do not hard-code a sizeof() secure: decrease a (stack allocated) buffer size secure: use sizeof() of the fields being copied secure: decrease a (stack allocated) buffer size secure: initialise rrmsg correctly secure: can only work for IPv4, so assert on it secure: do not hard-code a sizeof() secure: decrease a (stack allocated) buffer size secure: use sizeof() of the fields being copied secure: decrease a (stack allocated) buffer size secure: initialise crmsg correctly secure: can only work for IPv4, so assert on it secure: do not hard-code a sizeof() secure: decrease a (stack allocated) buffer size secure: initialise cmsg correctly nameservice: fix a resource leak nameservice: fix wrong size argument nameservice: check return value of fcntl nameservice: do not close an fd that is not open nameservice: remove some dead code jsoninfo: fix a resource leak jsoninfo: make sure that uuid is null-terminated jsoninfo: remove some dead code jsoninfo: remove pointless compare mdns: suppress a Coverity warning mdns: remove some dead code mdns: do not close an fd that is not open mdns: do not close an fd that is not open mdns: check return value of inet_pton mdns: check return value of sendto p2pd: do not close an fd that is not open p2pd: do not close an fd that is not open p2pd: remove some dead code bmf: do not close an fd that is not open pud: remove some dead code quagga: explicitly ignore return value of fcntl tas: fix a memory leak txtinfo: remove some dead code main: fix an Out-of-bounds access cfgparser: fix some memory leaks cfgparser: fix a copy/paste error and resulting memory leak cfgparser: fix dereference before assert linux: apm: fix retry opening of apm proc file olsr_switch: fix a memory leak lq: make sure that info_head != NULL lq: make sure last_ip != NULL android: fix type punning warning pud: fix alignment warning gateway: initialise the handler before setting up the tunnel gateway: cleanup: free the allocated memory cookie gateway: ensure cleanup uses the reverse order of init gateway: minor simplification in olsr_delete_gateway_entry gateway: allow immediate removal of a gateway entry gateway: split olsr_delete_gateway_entry gateway: walk the gateway tree to properly cleanup linux: sanitise ACPI battery data defs: fix strscpy null pointer dereference tas: lua: official source code for 5.0.2 tas: lua: run gnu-indent.sh script cleanup, 1. step (to get some local changes away): * added -Wcast-qual: this killed lots of unnecessary type-casts Fix sytax errs and line break quirks for gnu-indent ARM alignment warnings fixed Patch ALIGN_NOWARN_ARM macro for better priority handling. use the POSIX standard '__linux__' macro instead of 'linux' tas: lua: run gnu-indent.sh script tas: lua: sync up to official source code with fixes Merge branch 'lua-official-502' cookie: an array already is a pointer cookie: add an assert Revert "httpdinfo: fix resource leak" httpinfo: add a comment about why the client socket is not closed gateway: minor optimisation gateway: improve cleanup gateway: rename gw_mem_cookie to gateway_entry_mem_cookie gateway: add a define for the tunnel name gateway: stub out olsr_print_gateway_entries on #ifdef NODEBUG duplicate_set: stub out olsr_print_duplicate_table on #ifdef NODEBUG link_set: stub out olsr_print_link_set on #ifdef NODEBUG mpr_set: stub out olsr_print_mpr_set on #ifdef NODEBUG routing_table: stub out olsr_print_routing_table on #ifdef NODEBUG tc_set: stub out olsr_print_tc_table on #ifdef NODEBUG two_hop_neighbor_table: stub out olsr_print_two_hop_neighbor_table on #ifdef NODEBUG hna_set: stub out olsr_print_hna_set on #ifndef NODEBUG hna_set: stub out olsr_print_hna_set on #ifdef NODEBUG and fix neighbor_table: stub out olsr_print_neighbor_table on #ifndef NODEBUG neighbor_table: stub out olsr_print_neighbor_table on #ifdef NODEBUG and fix use INET_ADDRSTRLEN and INET6_ADDRSTRLEN instead of magic constants gateway: only remove a tunnel when there is one gateway: rename a variable gateway: minor improvement in NULL comparisons hna_set: olsr_ip_prefix_to_string outputs a wider string gateway: refactor olsr_set_inet_gateway Merge tag 'v0.6.4' win32: use #ifdef _WIN32 Makefile: fixup some forgotten make command prefixes Makefile: add gui target Makefile: always pass VERBOSE to the make command gui: linux: minor Makefile fixup gui: linux: clean and install are phony targets gui: linux: add VERBOSE handling gui: linux: fix some 'may be used uninitialized' compiler warnings gui: linux: use toplevel make options gui: linux: fix some 'noreturn' compiler warnings gui: linux: fix some 'discards const qualifier' compiler warnings gui: linux: fix some 'old-style function definition' compiler warnings gui: linux: fix 'too few arguments to function ipc_connect' compiler warning gui: linux: fix a 'mixed declarations and code' compiler warning gui: linux: fix some 'unused parameter' compiler warnings Revert "gui: linux: fix some 'may be used uninitialized' compiler warnings" gui: linux: fix some 'may be used uninitialized' compiler warnings gui: linux: fix some 'shadow' compiler warnings gui: linux: fix inccorrect sizeof() gui: linux: fix string buffer overflow gui: linux: fix string buffer overflow gui: linux: fix the string buffer overflow better gateway: simplify stopping the cleanup timer tas: remove plugin main: do not seed the random number generator with the process id win32: remove unused getpid() function hna_set: explicitly cast to (time_t *) in calls to localtime() neighbor_table: explicitly cast to (time_t *) in calls to localtime() main: improve random number generator seed bmf: do the minimum length check earlier changelog: update to current state print_packet: fix wrong use of sizeof() main: remove -dispin and -dispout command line options main: add release script Update version after release of v0.6.4 Changelog: remove 0.6.5 preliminary changelog Merge branch 'release-0.6.4' bmf: check minimumLength against buffer size sgwdynspeed: put plugin config in olsrd.conf.sample pud: put plugin config in olsrd.conf.sample cookie: raise the number of cookies pud: enable dynamic polling of the position file gateway: only check smart gateway configuration on linux linux: put #ifdef __linux__ around code doc: add doxygen documentation generation doc: fix common documentation tags doc: fix linux specific documentation tags doc: fix unix specific documentation tags doc: fix bsd specific documentation tags doc: fix win32 specific documentation tags doc: do not generate documentation for gui code release: move the stringTrim function up a bit release: make gitIsGitDirectory do the correct thing release: fix usage of literal dot in regular expressions release: move into the base directory earlier release: convert some code into checkIsOlsrdGitCheckout function release: convert some code into checkGitSigningKeyIsConfigured function release: convert some code into getPrevRelTag function release: the script can now also create a release branch Merge branch 'release-0.6.4' into mmmm Branch v0.6.5 pud: change java include path to generic java include path pud: java make target is dependent on library make target doc: clean up the latex directory if empty Revert "linux: name is required to be non-null in olsr_os_cleanup_iptunnel" gateway: fix a revert problem android: fix the path of the tunnel node in the /dev tree gateway: fix stable count dampening in gw_default_timer gateway: always select a new gateway when threshold != 0 main: add -pidfile command line option main: fix pidfile compilation on windows Frank de Brabander (4): New feature: support for Linux NL802.11 wireless link information in cost calculation. Merge branch with new lq plugin for NL80211 support Incorporate fix by Ferry Hubert for float to double promotion Fix optional compilation of the nl80211 lq plugin Hans-Christoph Steiner (9): use the POSIX standard '__linux__' macro instead of 'linux' use the Microsoft standard '_WIN32' macro instead of the self-defined 'WIN32' olsrd-adhoc-setup: use static BSSID by default to assoc. with the right mesh olsrd-adhoc-setup: configure NetworkManager to be nice when adhoc is manually setup fix misspelling: 'adress' --> 'address' fixed misspelling: usefull -> useful add gcc hardening flags to linux-gtk GUI android: update to use gcc 4.6, available starting with NDK r8 android: gcc 4.6 comes with NDK r8b and is not in NDK r8 Henning Rogge (29): Pud: Do not use the variable name strlen. Fix buffer overflow in mdns plugin Add -Werror=format-security Add VERBOSE flag to makefile to display full gcc commands Fix slightly insulting error message. Moved regex library to a makefile of its own to solve the issues with compiler warnings. fix control flow if kill() command fails to end program fix wrong sizeof() parameter Convert allocated memory into temporary variable Protect against stupid data from ACPI Close socket if bind() fails. Merge branch 'master' of http://olsr.org/git/olsrd Use strscpy instead of strncpy. Check inet_pton return value Close file descriptor if error happens Fix scanf() format vulnerabilities Fix command line parsing macro Fail in IPC initializationis always fatal. fail of non-blocking netlink socket is not fatal Declare olsr_exit() as noreturn Interface will always be found. no hostroute possible in this if() branch reset link timer if not set Remove dead codepath Cleanup error handling in ipc_init() Remove unnecessary asserts Make sure calculated header length does not skip over buffer Fix multicast join for IPv6 Release v0.6.5 Saverio Proto (12): mDNS: Skeleton code for new host filter feature in mDNS plugin mDNS: Upgrading the container_of.h that was backported from src/common in master mDNS: Fix most of the warnings from the compiler mDNS: Update checksum field of the IPv4 Header after altering TTL mDNS: trivial debug print fix and code readibility improvement mDNS: Change version of mdns plugin to 1.0.1 after GSoC 2012 work by Alessandro Gnagni mDNS: init ListOfFilteredHosts in the proper place and not at every received packet mDNS: trivial, removed TODO from code for something that was implemented mDNS: better debug support for filtered hosts feature mDNS: Fixed typo in README Revert "mDNS: init ListOfFilteredHosts in the proper place and not at every received packet" Merge remote-tracking branch 'origin/mDNS-plugin-GSoC-2012' 0.6.4 -------------------------------------------------------------------- Bugfix and plugin release 0.6.4 - Update of Smartgateway system - small updates to several plugins - lots of updates for PUD plugin 0.6.3 -------------------------------------------------------------------- Bugfix and plugin release 0.6.3 - PUD plugin (position update plugin) - JSONinfo plugin - sgwdynspeed plugin (select dynamic smart gateway based on gw speed) - Update on Quagga plugin (for new Quagga) - Fixes for Androids - Some fixes for GTK and Win32 gui - Lots of core fixes to support new compiler warnings 0.6.2 -------------------------------------------------------------------- Bugfix release for 0.6.1 - Compatibility for Linux kernel 3.x - Lots of small fixes - reworked makefile output - updates for some plugins - repair for Smartgateway feature Read GIT changelog at http://olsr.org/git to see a complete history. 0.6.1 -------------------------------------------------------------------- Bugfix release for 0.6.0 Markus Kittenberger - Major bugfix for the neighbor table when a neighbor gets a new main IP. - add /interface command to txtinfo, allow multiple commands per request Henning Rogge - wait up to four seconds for aquiring the OLSRd lock. This helps to shutdown OLSRd with a script and restart it at once (kill is asynchrone, and kill -w is not available in busybox) - add md5 has of all source/headers into version string Mitar - lot's of small changes for Android. Slowly Android gets a fully supported platform for OLSRd. and a lot more small bugfixes. Read GIT changelog at http://olsr.org/git to see a complete history. 0.6.0 -------------------------------------------------------------------- Change in version number system. No more -rcX for release candidates and -rX for bugfix releases. In future bugfix releases or updates of plugins will increase the third digit of the version string while feature releases will increase the first and/or the second one. Markus Kittenberger Henning Rogge - added NIIT kernel module support for sending IPv4 traffic over IPv6 mesh networks. See README-Olsr-Extensions for more information. - added SmartGateway support. OLSRd can now automatically build IPIP tunnels towards the gateway to prevent gateway flapping. See README-Olsr-Extensions for more information. - complete rewrite of linux netlink routing code. New code should be more understandable and easier to debug/improve. Teco Boots - new dyngw plugin. More flexible and more features. - new p2pd plugin (generalized mdns plugin) Vasilis Tsiligiannis - new version of quagga plugin (with IPv6 support !) Sven-Ola Tuecke - fixes for improved uClibc support - fixes for better linux kernel 2.4 support Saverio Proto - new mdns plugin. (backport from master branch) Eric Tromps - new version of bmf plugin. NO pthreads are necessary anymore and a lot more small bugfixes. Read GIT changelog at http://olsr.org/git to see a complete history. 0.5.6-r8 --------------------------------------------------------------------- Alina Friedrichsen - patch for using deticated output socket for OLSR packages. This allows to set the src-ip of OLSR packages, which is useful for interfaces with multiple IPs Bruce Ford - fixes for compiling olsrd for win32 Henning Rogge - fix for memoryleak during MID processing - patch series for "network logoff" of OLSRd, other nodes now get notified if an OLSR node switch down to remove it from their database. - cleanup of naming conventions for settings src/dst-ips of OLSR-packets for ipv4/6. See example config files. - patch to ignore HNA4 for IPv6 and HNA6 for IPv4 Markus Kittenberger - patch series for MID handling cleanup - compiletime switch for txtinfo to always allow localhost access - add "InterfaceDefaults" section to config files to allow setting values which are shared by all interfaces but can be overwritten in specific config file settings - patch series to allow OLSRd handle multiple config files (multiple "-f " options) 0.5.6 --------------------------------------------------------------------- PATCHES and BUGFIXES from Henning Rogge - Bugfix for fragmented TC sequence numbers - eliminate second timer for edge garbage collection (aka border code). - fix SPF bug - fix for jitter calculation - refactor linkset code - add netsimpcap, a network simulation device - parser refactoring - fix for possible overflow in fpm plugin - prevent Originator-IP from changing during runtime - fix several compiler warnings - fix hanging TC entry from lost onehop neighbor - fix drop package with same seqno in etx_ff - fix segfault in parsing HNA package with bad netmask - fix avl_comparator for route_paths - fix alignment problem in packet buffers - fix: segfault in neighbor/neighbor-2 table - fix: lqmult default parsing - HACK: MinTCVTime parameter hack for Berlin FF network... feel free to ask on the mailing list. - add Watchdog plugin - add explicit runtime lock for OLSR. - remove lq-hysteresis for tc on the receiver side. - enhance protection against malformed packages to prevent OLSR parsing uninitialized data. Thank you Markus and Keks for the LONG debugging session - block tc-redundancy 0/1, it doesn't work with the current dijkstra code - convert httpinfo/txtinfo/dotdraw to nonblocking and autobuf to prevent blocking outgoing connections - fix some bugs with lq-mult - fix bug in duplicate set sequencenumber handling - add Debian/KFreeBSD support (Thanks to Holger Levsen and friends for help) - fix segfault in 'interface lost' monitor - add LQ hysteresis to etx-ff metric PATCH from Markus Kittenberger : - txtinfo plugin: add more http options - allow configuration of OLSR UDP port - allow configuration of proto Tag for Routes (RtProto) - add fallback policy rule (priority 65536) if RtTable is used, to ensure that routes can be added to this table - resolve many error conditions while adding routes to the linux kernel (Warning this will also delete any conflicting routes made by other routing daemons or admins) - interface modes mesh (default) and ether (no retransmit of olsr-messages back into a broadcastdomain) - fix olsr_times() to handle different OS implementations (Linux, BSD, OS X) - fix several compiler warnings - fix olsr_times() to handle different OS implementations (Linux, BSD, OS X) - create policy rule later during startup - send MID also with one interface, if its ip different from originator-id - linux rtnetlink code cleanup - workaround: generate routes to single hop neighbours on the fly when inserting routes via them (active only with fib_metric=flat) - testing: insert routes with source-ip set to originator ip - testing: syslog numbering (e.g. useful to detect lost syslog messages when using remote-syslog) - testing: custom library path (default /usr/testlib) Testing features must be activated in olsr_cfg.h before compiling olsrd. This features are used to run a test network in Vienna parallel to the existing OLSR network. - more RT-Netlink cleanups and fixes - backport of timejump patch from TIP - Add detection for vanishing interfaces to Linux netlink code - fix incorret route sorting on new neighbours. use only delete and add/change avl tree, instead of 3 trees - learn neighbours interface alias address from received hellos PATCHES from Hannes Gredler : - add small valgrind howto - remove the per tc_edge timer - add some basic infrastructure for cookies cookies are used to track usage of timer and memory resources - add a lightweight memory manager to reduce malloc() churn. - eliminate data field from avl_node and list_node and replace this via inline recasts - add indentation dotfile for future code cleanup - refactor the timer implementation, get rid of timeout functions all manipulations done in constant time. - use calloc rather than malloc for lazy callers - log RIB add/del transactions only if there is an actual route change - fix to to always insert a HNA Net when receiving a HNA refresh - fix delete all routes if the last IP address is gone - reduce TC vtime jitter from 25% down to 5% PATCHES and BUGFIXES from Sven-Ola Tuecke : - add a fixed-point math implementation, which saves a great deal of CPU on embedded devices - fix for Link quality dijkstra limit - nameservice plugin supports mac addresses - fix fork/restart code - fix olsr_times() to handle different OS implementations (Linux, BSD, OS X) - fix several compiler warnings - fix olsr_times() to handle different OS implementations (Linux, BSD, OS X) - add makefile support for google android - fix default olsrd.conf examples PATCHES and BUGFIXES from Aaron Kaplan : - fix openbsd warnings / compile errors about sprintf strcpy - fix string overflow in dyn_gw plugin - fix string overflow in pgraph plugin - fix openbsd/osx coompile errors BUGFIX by Peter Tarjan : - Do not remember LQ information UNSPEC_LINK neighbors in Hellos. - ignore UNSPEC link for linktype if there is an ASYM/LOST/SYM Link in the same Hello message - ignore UNSPEC_LINKS during MPR lookup - broken MID route handling: we also check the data structures for routing, even if a MID entry exists. BUGFIX by John Hay : - FIX: IPv6 MTU in BSD - Another BSD ipv6 Patch by John Hay - fixes for 64 Bit FreeBSD - fixes for NetBSD BUGFIX from Erik Tromp : - update in bmf due to new flags field in tc_edge_entry PATCH from Clemens Hopfer : - dot_draw plugin: close the connection after graph output. PATCH from Joe Gio : - track if AC power is connected/disconnected PATCH from Hagen Paul Pfeifer : - import jenkins hash for good hash calculations PATCH from Andres Ambrois : - nameservice plugin: add parameters for SIGHUPing other daemons, or calling scripts BUGFIX by Benny Tops : - fix wrong order of drop_tc checkt in olsr_input_tc Felix (OpenWRT NBD): - fix bison problem for OpenWRT Sebastian Harl: - add LISTEN parameter for httpinfo/txtinfo/dotdraw 0.5.5 --------------------------------------------------------------------- BUGFIX from Andreas Jacobs : - calculate correct sleeptime BUGFIX from Dario Borriello : - do not update LQ if not configured BUGFIX from Jo-Philipp Wich : - compile clean on FreeBSD - bugfix: do not account for IP headers when building MID6 messages PATCHES from Henning Rogge : - join LQ and non-LQ Hello execution paths PATCHES from otti : - rttable-default: configures a new policy routing table for the default route BUGFIXES and PATCHES by Sven-Ola Tuecke : - Windows Vista: add interface metric to SPF computed metric - lqtc-seqno: Optimize check for old seqno numbers in LQTC messages - lqnatthresh: maintain an advantage for the current (NAT) inet gw - fisheye-startup: Changed to MAX_TTL for the first 32 LQTCs - Added and removed files necessary for win32 compile - Fix for hg: do not remove anything in .hg with 'make uberclean' - 104-olsrd-verysmallfix - 105-fix-lq-buffer-quirks - 106-fix-seqnocheck - 110-bmf-v152 - 121-olsrd-fib-metric-approx - 133-fix-lqneigh - 136-optimize-invalidip-check - 138-optimize-message-generation BUGFIX from Lorenz Shori : - Mac OSX compile fixes BUGFIXES and PATCHES by Hannes Gredler - fix not deleted tc entry. - avoid setting routes with an invalid/impossible netmask. - refactoring of TC parsing to kill another pile of malloc()/free()s saving (again) code and especially run.time performance. - RIB Refactoring, Part 2: - avoid the periodical rib-tree insertion - add a FOR_ALL_HNA_RT_ENTRIES() macro for the snmp folks (or any parties who want to walk HNA entries). - add an olsr_cnf option 'flat_fib_metrics' which defaults to TRUE. - fix broken prefix insertion (regression of the RIB refactoring) - squelsh compiler warnings on Mac OSX PATCH by John Hay : - also printout our own HNAs in the dotdraw plugin. PATCH by Patrick McCarty : - fixed compile errors in the BSD port PATCHES by Sven-Ola Tuecke : - 102-olsrd-cvs-fixes.patch: use different buffers in the same printf() - 103-olsrd-rt-exportroute-cleanup.patch: avoid a malloc()ed list of functions - 132-save-the-fish.patch: really save the fish and avoid to forward invalid messages from older olsrd versions - 135-georss-map-for-nameservice.patch: fixes and extensions for the namesaervice plugin - 138-olsrd-fixdotdraw.patch: fix the dot_draw plugin (all to be found on http://download-master.berlin.freifunk.net/sven-ola/nylon/packages/olsrd/files/) - Replaced "which" with a /bin/sh script snippet PATCHES and CLEANUPS by Bernd Petrovitsch - Jens Nachtigall suggested (and reminded) to use olsrd.conf.default.lq as the default installed one. It makes much more sense as - to the best of my(bernd's) knowledge - all larger networks uses the LQ extensions. And new customers should better be pushed in that direction. - with the help of Patrick McCarty , we got olsr to build on OpenBSD again: * OpenBSD'd `sed` is pretty conservative and doesn't understand 's|re|sub|'. So we fall back to the old 's/re/sub/' and quote all '/' and '.' correctly (which was the main reason to use '|'). And while I'm at it: Remove the useless $(CCACHE) from the $(CC) for dependency generation and beautify (read: "$(strip)") $(CPPFLAGS). * OpenBSD needs an explicit "#include " before "#include ". - fixed lib/secure/src/md5.h: This was broken as it had "typedef unsigned long int UINT4;". "unsigned long int" is 8 bytes on x86_64. We are using now the standardized types from . - fixed warnings and improved lib/secure/src/md5.c: * we are using memcpy() and memset() instead of the open-coded loops as suggested * const'ified * added function prototypes for static functions * moved static functions to the top so that their declaration is before their use to allow gcc to inline if only used once. It remains ugly - God knows why there are that so many useless type-casts. - Some minor and trivial cleanup: Added two functions to calculate the ETX value from a struct tc_edge_entry and a struct link_entry, respectively. And use them everywhere. - added http://meshcube.org/nylon/utils/olsr-topology-view.pl into lib/httpinfo/misc as suggested by Jens Nachtigall - Killed "struct olsrd_config *cnf" in src/cfgparser/olsrd_conf.h and replaced it's usage with "olsr_cnf" from src/defs.h. Serious cleanup: olsrd_get_default_cnf() does no longer initialize the global "cnf" variable" but uses a local one which is returned as before. And olsrd_parse_cnf() does no longer return the global variable it is working on. - Merged "struct hna4_entry" and "struct hna6_entry" into "struct local_hna_entry" (as "struct hna_entry" is a different thing) Both have almost the same data (IP address + netmask/prefix) so we use the quite new "struct olsr_ip_prefix" to store it. Also merged the "hna4" and "hna6" pointer in "struct olsr_config" - look at the global "olsr_cnf->ip_version". - added a olsr_ip_prefix_to_string() function - .h file cleanup: def.h does not longer include net_olsr.h because it doesn't needs it. - more type safety: the macros COPY_IP() and COMP_IP are gone and replaced with "=" or similar "normal" C operations. There are also now the inline functions ip4cmp() and ip4equal() to work on "struct in_addr", ip6cmp() and ip6equal() to work on "struct in6_addr" and ipcmp() and ip6equal() to work on "union olsr_ip_addr". Most (or even more precise: almost all) uses of COPY_IP() and COMP_IP() are in "if (olsr_cnf->ip_version) { ... } else { ... }" anyway to there is no reson to copy an IPv4 address effectively with "memcpy(&dst, &src, 4)" or compare with memcmp(&a, &b, 4)" wher the always "4" is stored in a variable inhibiting compiler optimization. There is also the deprecated function genipcopy() mimicking the old typeless COPY_IP() macro for the last few places where a cleanup is needed anyways. There also lots of old macros left over (commented out of course) until we are confident that everything works. And then I will kill them too. - Fixed the misleading definition of "v4" in "struct olsr_ip_addr" fom "olsr_u32_t" (in network-byteorder!) to "struct in_addr". Lots of temporary variables to call inet_ntoa()/inet_ptoa() vanished ..... - We have now ip4_to_string(), ip6_to_string() and olsr_ip_to_string() to print a "struct in_addr", "struct in6_addr" and "union olsr_ip_addr" into a string buffer. - cleanup: olsr_ip_to_string() and similar non-reentrant functions now must get a target buffer. To ease that, there is the "struct ipaddr_str" which is large enough for all of them (read: for an IPv6 address). This also removes the cyclic buffer there. All of these function return a "const char *" which can be directly used for printf(3) and friends. - const'ified more functions - converted the source to UTF-8. - "struct sig_msg" uses an olsr_u8_t for a byte array (and not "char") - force the few inline function to always be inlined. - #ifdef the body of the olsr_print_hna_set() and olsr_print_neighbor_table() if nothing is done - declare "int_addr", "int_netmask" and "int_broadaddr" in "struct interface" as "struct sockaddr_in" since it is that what we actually want there (and it is similar to the IPv6 code). - updated the olsrd.conf.default.lq-fisheye to the Debian-deliverd version after recent discussions olsr-dev@olsr.org - use "inline_avl_comp_ipv4()" in "avl_comp_ipv4()" - clean up the routes on more signals. Basically we want to do this on all signals which terminate the program. - killed a superflous global buffer in src/main.c - made inline functions from avl_walk_{first,last,next,prev} and created "const" versions of it. inline_avl_comp_ipv4() is now also an inline function (and not a macro) - created a typedef's for various function pointers - much easier to read. - cleanup: compare tree->comp (adn other pointers)) to NULL (and not 0) - killed superflous "return"s at the end of void functions - const'ified more parameters in many more functions in the .h and .c files - init-functions with constant or ignored return values are "void" - created a typedef fro the callback in "struct export_route_entry" and using it! - moved the initialization of the {add,chg,del}_kernel_list variables into process_routes.c. So they are now "static" there. - olsr_export_{add,del}_route{,6} are now static in process_routes.c since they are not used elsewhere. - olsr_addroute_add_function() and olsr_deldroute_add_function() were almost identical - made one function out of it. Same for olsr_addroute_del_function() and olsr_deldroute_del_function(). - fixed the sort order in avl_comp_ipv4_prefix(): We compare now the IPv4 values in host byte order (and not network byte order). So the route list in the e.g. httpinfo plugin is now nicely sorted. - fixed and improved the `gcc-warnings` script: * support older gcc's (as on Debian/Sarge) as they have slightly different error messages * removed superflous lines * replaced the call of `sed` with shell built-in features fixing syntax errors on Debian/Sarge * set all locale-relevant variables to "C" (just to be sure) - consolidated ip{4,6,}{cmp,equal}: all are nwo inline functions using only the minimal necessary operations. Thanks to Hannes Gredler and Sven-Ola Tuecke for pointing that out and suggesting the `inline`, respectively. use ip{4,}cmp in lq_avl.[ch] to resue the code. inline_avl_comp_ipv4 is superflous now (and replaced by ip4cmp) and use the global MIN and MAX macro instead of AVLMIN and AVLMAX - killed netmasks from the IPv4 part of the code and use the prefixlen there (similar to thte IPv6 part). Manymore details on http://lists.olsr.org/pipermail/olsr-dev/2007-November/001464.html - removed the superflous "open_ipc" field from the "struct olsrd_config" as it contains only the equivalent of "olsr_cnf->debug_level > 1". - inspired by Sven-Ola Tuecke: avoid a bash'ism (i.e. "OPTS="${OPTS//$opt}") in gcc-warnings and ld-warnings. But we do not replace it with `sed` (since it costs a fork(2) and an exec(3)) but also with shell code which doesn't use any external program. - added configuration file support for "flat fib metrics". 0.5.4 --------------------------------------------------------------------- QUAGGA by Immo 'FaUl' Wehrenberg - updated to svn version 33 BMF PLUGIN by Erik Tromp - updated to 1.5.1 - updated to latest plugin interfaces changes and killed warnings (by Bernd Petrovitsch ) PATCH by Hannes Gredler which rewrites the route handling. To quote him: ---- snip ---- change list: - get rid of separate routing tables for HNA and per-node routes, everything is now unified in an AVL routing tree (&routingtree) - introduce walking macros (OLSR_FOR_ALL_RT_ENTRIES()) that hide the internal structure of the RIB for making life of the plugin authors easier. - get rid of different SPF implementations for LQ and non-LQ code paths. a non-LQ edge is simply substituted with a cost of 1.0 - get rid of host masks - a new data type olsr_prefix is introduced which is basically an ip address plus a prefix length. do not install the metric in the kernel FIB - for the kernel its pointless if the route gets installed with a metric of N or M. we do not need to update the kernel FIB if we have hop count only changes (for example if there is a reroute action further downstream) the only things which triggers a kernel FIB route update is a next hop change (a next hop is neighboring gateway router plus an interface). all OLSR routes are installed with a metric of 2 - separate between rt_entry and rt_path - the former is a route installed in the kernel with an next hop. the latter is a candidate for best path selection after SPF calculation has been done. in the rt_entry we keep a pointer to the best_path and also to the next hop that was installed in the kernel FIB. we always keep all originator of a route, if a route originator goes away we can easy recompute the best path for the route. the next hop in the rt_entry gets only updated upon a successful route_add call - that way we always remember what next hop to delete. stray routes should be history now. - tweak the linked list toolkit to operate on circular lists. - get rid of malloc calls for building the kernel update list. the list node is now embedded in the rt_entry. - introduce three queues (add/chg/del) for kernel updates. - for neighbor route dependency tracking the neighbor routes are queued first or last (depending on which queue you work on) - rework all the plugins which directly manipulate rt entries. - rework the plugins that read from the routing table (most notably nameserver, httpinfo and quagga plugin) - lots of comments that explains the intentions and purpose of this code-piece. non RT related stuff: - use a list rather than a tree for storing the post-SPF results, which further improves the raw-SPF runtime. - add display of SPF runtime (masked behind #ifdef SPF_PROFILING) - http://gredler.at/download/olsrd/neighbor_routes3.diff: This updates the own IP address (read: the main address) after changes (e.g. on `ifup wlan0; sleep 1; ifdown wlan0`) and kills the olsr_fill_routing_table_with_neighbors() function. ---- snip ---- And Sven-Ola Tuecke fixed an instability issue on interface up/down operations (see 102-olsrd-rt-refactoring-fixes.patch below) and a missing initialization. PATCH by Hannes Gredler which "consolidates the link-state database and the spf-calculation in order to calculate routes more efficiently". To quote him (more): ---- snip ---- - use the link-state (tc) database for SPF calculations rather than replicating the notion of vertices and edges for a SPF run. this heavily reduces malloc() calls and shrinks the total CPU load of the route calculation path between 60%-80%. ---- snip ---- PATCHES by Sven-Ola Tuecke to be found on from http://download-master.berlin.freifunk.net/sven-ola/nylon/packages/olsrd/files/ - 102-olsrd-rt-refactoring-fixes.patch Because you changed a lot of basics: It's time to handle a general flaw in the routing system. Plase take a look at chk_if_changed(). This will free() any "struct interface" pointer without warning at any time. This is why it's possile to SEGV olsrd with a simple "ifdown xxx". The patch replaces the (maybe) invalid pointer with an index reference "iif_index". You can always ask the OS for a name. Please note, that I do not have a working BSD toolchain, so I've placed an #error in the IPv6 BSD-part where the author/porter has started to hack something funny. - 110-olsrd-double-wlancard-neigh-hack.patch: This is a hack for Nodes having to wifi cards with the same channel, bssid, IP-Range etc. If two nodes can see each other by means of two possible links (here: two wifi cards with equal config), a bug is triggered with the Neigh-is-SYM detections. This small little hack prevents this. - 112-olsrd-nameservice-fixemptyname.patch: This is an addon to my lat/lon stuff which will prevent olsrd from running (oops?) if no hostname is given and the nameservice plugin is loaded. - 113-olsrd-dyngwplain-pluginvers5.patch: This updates the dyngwplain plugin to the new Plugin Iface - 140-olsrd-arprefreshed.patch: This is a new one. Opens a packet socket and listen to UDP(698), extract the sender MAC and refreshes the ARP cache whith that. Should speedup especially in cases, if you initially try to use a longer routing path which normally triggers a "ARP-Lookup-Chain". - 106-olsrd-nameserviceparams.patch: This patch converts more plugins to the new interface version. - 104-olsrd-policy-routing.patch Reworked this one to discard GPL helper functions. Also checked IPv6 and re-included the IPC hookup. The patch adds a "RtTable [number]" for /etc/olsrd.conf which is simply the Linux policy routing table to use. Defaults to 254 (== main). This patch was modified/clenaed up by to use "#if" instead of "#ifdef" as it's more robust against typos. - 110-olsrd-fixpacketprint.patch, 112-olsrd-nameservice-fixemptyname.patch, 113-olsrd-txtinfo-fixhttpget.patch, 114-olsrd-timeoutlimit.patch, 115-olsrd-nameserviceparamfix.patch and 116-olsrd-fix-pluginparam-addons.patch fixing the compilation warning on 64bit and lots of other improvements. - "Save the fish" patch: Avoid forwarding of packets with too low TTL. This kills lots of packet forwarding storms. NB: The oneliner was applied by hand by BP and formatted to look (in BPs O) more readable. PATCH by Arnd Hannemann olsr_makefile_make_use_of_exename.patch - This patch makes sure that the EXENAME variable of Makefile.inc is used in Makefile. PATCHES by John Hay - update to new FreeBSD WLAN API - do not require /bin/bash, use /bin/sh - Fixed alignment so that olsrd runs on FreeBSD/arm - allow more interface in an IPv6 subnet on FreeBSD - use PREFIX and DESTDIR as all the other Makefile.$OS also for FreeBSD - make txtinfo plugin work with IPv6 PATCH by Andreas Jacobs - fix the loss link quality calculation for "windows size % 4 != 0" PATCH by Acinonyx - Bug fix: include $(TOPDIR)/Makefile.inc at the begin in the Quagga plugin PATCH by David Cornejo - fixed an "+=" of an uninitialized variable (detected with/by the scan.coverty.com). BUG reported by Aaron Kaplan - BSD-xargs doesn't know "-r". PATCHES and CLEANUPS by Bernd Petrovitsch - Made a function from the ME_TO_DOUBLE() macro (in src/mantissa.h). This saves code throughout the code even on i386 and will even more on architectures without floating point units and "-msoft-float". - And the mathemathics in src/mantissa.h is reformulated to minimize floating point operations to save CPU power - especially on embedded devices. - I rewrote the half of src/lq_packet.[ch] which deals with incoming packets. This was triggered with performance output of gcc produced by Sven-Ola Tuecke at CCCamp07. This kills *lots* of (more than) superflous malloc()s and the same number of (free()s). And it also kills some code and copying around of data. - Make it compile without warning with flex-2.5.33 (to be found on Fedora 7 and Gentoo in Sep-2007) again. - converted the dyn_gw plugin to plugin interface version 5 (which leaves the quagga plugion as the last with the old one). - paving the way to activate -Wshadow, much more to do - const-ify parameters here and there - use NULL for pointers (and not "0") - Killed "extern" declarations in (not generated) .c files - Based on a patch by Gianni Costanzi (so credits and thanks have to go there): added OS_CFLAG_PTHREAD Makefile variable since gcc (on Linux) requests this in the manual page. Changes/additions: - I added definitions to all OS-specific Makefile.$OS with the value similar to the value in OS_LIB_PTHREAD (either empty or "-pthread"). - The variable is added to CPPFLAGS (and not CFLAGS) since CPPFLAGS is used for all cpp and gcc calls (and gcc's man page indicates that it sets variables for both of them). 0.5.3 --------------------------------------------------------------------- URGENT BUG FIX Ignacio García Pérez found a serious bug in the dot-draw plugin and identified it's source. BUG FIX The bmf plugin wanted to kill a not-started thread and this causes a segmentation violation. This happens if the old plugin interface support is not compiled in and one uses - or more asccurate: wants to use - the bmf plugin which uses that ATM. Thanks to Cedric Krier for reporting this. DEPENDENCIES FIXED The dependencies (*.d files) are now properly generated and used. And they also dependen on the Makefile in the current directory and the Makefile.inc so that changes there also lead to new compilation. Remember: We support "ccache" so install it to save lot of meaningless recompiles if nothing (as seen by the real C compiler, i.e. after the C preprocessor) has changed. BUILD FIX Linux/IA64 and Linux/HPPA also need "-fPIC". CLEANUPS - olsr_switch does no longer generate warnings - olsr_switch is also built with "build_all" and cleaned with "uberclean" - More "const" all over the place. - More "static" for local functions and variables. - Killed an unnecessary "static" variable. 0.5.2 --------------------------------------------------------------------- URGENT BUG FIX Sven-Ola Tuecke found a serious bug of the class "show stopper" and sent a patch. PLUGIN CLEANUP Plugins handle parameters quite individually (case-sensitive vs case-insensitive, different parsing functions for the same values, etc.). Plugin Interface version 5 now exports a table of { parameter-name, parsing-function, addr-of-storage } and it's size. Common functions should be shared. 0.5.1 --------------------------------------------------------------------- MISC Upgrade to olsr-bmf 1.5 from Erik Tromp latitude/longitude support is now in the nameservice plugin done by Sven-Ola Tuecke added the spf refactoring patch from Hannes Gredler which saves a noteworthy amount of CPU time. To quote him: ---- snip ---- 1. use of an AVL tree as a min-heap implementation as a means for efficient sorting. (the etx metric is used as the key in the candidate tree) 2. next-hop propagation rather than tracking the previous node in olsr_relax() i have changed that model and pre-populate all one-hop neighbors with their own IP address as 'next-hop' and pull that pointer up once new paths are explored. as a result no walker for counting hops and extracting next-hops is required - it turns out at this is slighly more efficient than the existing behaviour (even with the cache applied). ---- snip ---- CLEANUPS * moved a only locally needed hack from "union olsr_ip_addr" into the only place where it is needed in hashing.c 0.5.0 --------------------------------------------------------------------- APPLIED PATCHES FROM FREIFUNK-FIRMWARE libsmake, dyngwplain, nameservices+services, tzxtinfo, quagga, quagga-routehandler, optimize, fixes from Eric Tromp and Sven-Ola Tuecke, CPU-optimize, secure key, HNA-IP CLEANUPS removed hardcoded limit on the number of interfaces (at least in the Unix part) made Makefile targets much more consistent MISC put Bmf-1.3 plugin into it FreeBSD IPv6 SUPPORT Patch from John Hay applied. BUGFIXES 0.4.10 -------------------------------------------------------------------- OLSR NETWORK SIMULATOR An application called olsr_switch(sorry for the nameclash with the win32 GUI) has been added. If olsrd is ran using the -hint option it can now connect to olsr_switch and be part of a virtual network. This means that multiple instances can be ran at the same host! The olsr_switch application allows the user to define link variables on all viritual links in the network, creating all possible topologies. Read more in the readme file. EXPERIMENTAL FISH EYE ALGORITHM An experimental algorithm for TTL settings on TC messages has been added. Read more in the corresponding README file. OPENBSD SUPPORT olsrd now also compiles on OpenBSD systems. Thanks a lot to Holger Mauermann for the patches! BUILDSYSTEM REWRITE Bruno has rewritten the make system. OS detection is now done automagically and the general design is much improved. IP ADDRESS VALIDATION Olsrd now maintains a set of IP addresses that is considered invalid. Checks against this set is done on all received OLSR packets announced originator addresses. The dataset can be updated dynamically. PLUGIN INTERFACE Updated interface version to 3 and added more noticeable warning for version missmatch. MATH LIB DEPENDENCY The dependency on the math lib came from the use of pow(3) in the mantissa/exponent calculation. The calls to pow in this long forgotten code, was very unnessecarry. The pow calls are replaced with bitwise shifts and -lm is no longer needed. ICMP REDIRECTS ON LINUX On Linux systems "0" is now also written to the all/send_redirects procfile and not only the pr. interface ones. Hopefully this resolves problems reported with systems still sending ICMP redirects. BUGFIXES - Fixed init of IPv6 addrtype variable. It used to be uninitialized, causing it to default to site-local and have some weird side-effects. - Fixed crash when changing IPv6 address at run-time - Fixed a bug that prevented setting willingness 0 in the configfile - Fixed bad handling of missing command line arguments - Did various updates to prevent assertion when a neighbor has changed IP and sends HELLO before its olsrd precess has detected the change. - Fixed return value check on times(2) calls in the scheduler - Fixed bug(s) that could cause crash when an interface was brought down while olsrd was running. - Removed the silent (read: unchecked) hard limit of 16 interfaces. - Compiles now cleanly on 64bit (e.g. x86_64). 0.4.9 --------------------------------------------------------------------- OPTIMIZATIONS The MID database is now also indexed by alias addresses. this makes look-ups of main addresses based on alias addresses _much_ faster. The mid_lookup_main_addr function alone has gone from >30% of the total CPU time used by olsrd to <1%. PLUGIN DEVELOPERS: datatypes for MID entries has been changed. Routing table calculation in the LQ case now uses balanced binary trees instead of linked lists, which makes look-ups much faster. The debug output function olsr_printf() is not used by olsrd internals any more. Instead the macro OLSR_PRINTF is to be used. This macro does debug level testing _before_ doing any function calls(both printf itself and parameters to printf). This is a much more optimized way of doing debug output. In addition olsrd can be built without any debug output code if doing 'make NODEBUG=1'. TIMEOUT OF DATASETS Validity times for dataset entries are now set using the clock_t type (used to be struct timeval). This data is now fetched from the times(2) function instead of gettimeofday(2). This prevents possible problems if the system time is changed. PLUGIN DEVELOPERS: Note that datatypes for close to all dataset entries (link, neighbor, mid, hna, tc etc.) has been changed!! CONFIGURATION FILE Multiple interfaces can now use the same interface configuration block. Example: Interface "if0" "if1" "if2" { ..... } Interface configurations now also support the "Weight" directive. When olsrd finds multiple links to a neighbor it will choose the link going via the interface with the lowest weight. Olsrd normally sets this weight dynamically based on interface characteristics, but if the user wishes to set a fixed weight in a interface(or a group of interfaces), this directive is now available. Moreover, interface configurations now support the "LinkQualityMult" directive. It takes an IP address and a multiplier as arguments. Example: Interface "if0" { [...] LinkQualityMult 192.168.0.1 0.7 LinkQualityMult default 0.5 [...] } The idea is to make certain links via the configured interface artificially worse or better than they really are. The first parameter specifies the IP address of a neighbour interface. The second parameter is the multiplier to be applied to the link to the specified neighbour interface. After we have derived the link quality from the packet loss among the packets received from the specified neighbour interface, we multiply the link quality by the given multiplier. So, the multiplier changes the LQ value that we use when determining the ETX, which is 1 / (LQ * NLQ). If "default" is given as the IP address then the multiplier applies to all links via the configured interface. Note, however, that olsrd only assigns one multiplier to each link. It does so in the following way. * If there is a "LinkQualityMult" line that matches the IP address of the link's neighbour interface, then use the multiplier in this line. * If there isn't any matching line, then look for a "default" line. If there is a "default" line, then use the multiplier in this "default" line. * Otherwise use 1.0, i.e. do not modify the LQ value at all. Hence, a line with an IP address has priority over a "default" line. In the above example, the LQ value of the link between the local interface if0 and the neighbour interface 192.168.0.1 would be multiplied by 0.7. All other links between the local interface if0 and a neighbour interface would be multiplied by 0.5. IPV6 SOCKETS The socket option IPV6_V6ONLY is now set on IPv6 sockets in linux. This means that olsrd will no longer receive IPv4 traffic when running in IPv6 mode. This should enable users to actually run one olsrd instance using IPv6 and one using IPv4 at the same time :) PLUGINS The httpinfo, dyn_gw and dot_draw plugins now all include olsrd headerfiles directly. A plugin should define OLSR_PLUGIN before including olsrd headers. Doing things this way removed the redundant datatype definitions that has so often caused trouble when things has been updated in olsrd. NETBSD SUPPORT olsrd now also compiles on NetBSD systems. Use 'make OS=nbsd' to build. This port is not very well tested and feedback is greatly appreciated. EXPERIMENTAL MULTI-INTERFACE CODE FOR FREEBSD Experimental code using libnet can be compiled in allowing multiple interfaces to be used in FreeBSD. You enable this by compiling using OS=fbsd-ll. You must have libnet-devel installed for this to work (/usr/ports/net/libnet-devel). OTHER UPDATES - WLAN devices are now detected in FreeBSD - First specified interfaces IP is used as main address. - Broadcastflag is not checked on interface if fixed broadcast is set in config. - Removed Linux link layer code as this was not really in use. - Added -nofork command line option BUGFIXES - Link sensing now works according to announced vtime from neighbors. Previously links going symmetric->asymmetric were not necessarily detected until the holding time expired. - A bug in route addition/removal that could lead to routes using GWs being added before the actual route to the GW was set up, has been fixed. - A bug in the interface selection in route calculation has been fixed. New routes are no longer added prior to deleting old ones, since this caused trouble. - A bug in the IPv6 multicast address configuration has been fixed. This caused olsrd not to work with global IPv6 addresses. - A bug in the IPv6 prefix-from IPaddr function has been fixed. This bug caused HNA prefixes to always be calculated to 0. - If a 2-hop neighbor is also a 1-hop neighbor, a bug made olsrd prefer a bad direct link to a better link via an MPR. - If a link or interface lookup failed, olsrd crashed. - Fixed a crash in the LQ packet generation code based on a signed/unsigned integer comparison. 0.4.8 --------------------------------------------------------------------- LICENSE CHANGE Olsrd is now distributed under a BSD style license. We believe olsrd will be better off using this license as it opens up for commercial players to use olsrd freely in their products. In the end this will lead to this kind of users doing serious testing and bug fixing of olsrd. ETX-LIKE LINK QUALITY DETECTION We can now determine the packet loss on a link by looking at the serial numbers of the OLSR messages received from a neighbor. This tells us how many packets get through from our neighbor to us. We use a new extended kind of HELLO messages (LQ_HELLO messages, LQ = link quality) to broadcast the link quality that we have determined on our end of the link to our neighbors. So do our neighbors, and we as well as they end up with an idea of how good the link is in both directions. From the LQ_HELLOs we also learn the link quality between our neighbors and our two-hop neigh- bors. In this way we can select those neighbors as MPRs that have the best links to our two-hop neighbors. To distribute the link quality throughout the network, we use a new extended version of TC messages (LQ_TC messages). They contain the qualities at both ends of each of our links. Nodes can then run Dijkstra's algorithm to find a path between themselves and other nodes that minimizes the packet loss. If the newly introduced "LinkQualityLevel" is set to zero in the configuration file, link quality is not used and the daemon behaves as before, i.e. as specified by the OLSR RFC. If this parameter is set to 1, LQ_HELLOs and LQ_TCs are used instead of HELLOs and TCs, link quality is measured and MPRs are selected based on the link qualities. If this parameter is set to 2, the routing table is additionally calculated based on the link qualities. Setting "LinkQualityLevel" to a non-zero value BREAKS COMPATIBILITY. You will then not be able to participate in RFC-conformant OLSR networks any longer. This is because we use LQ_HELLOs and LQ_TCs instead of HELLOs and TCs in this case. It's best practice to set "LinkQualityLevel" to the same value on all nodes in a network. When determining the quality of a link olsrd only considers a given number of most recent OLSR packets received from its neighbors. By default, olsrd looks at the 10 most recent OLSR packets. This can be changed via the "LinkQualityWinSize" configuration option. Values between 3 and 128 are legal. NEW CONFIGFILE PARSER/FORMAT/SCHEME A whole new config file syntax and parser is introduced with this release. The parser is generated using flex and bison and it is designed to be very modular. The parser can be compiled as either a standalone binary, a shared library or as part of olsrd. This way other applications can parse and generate olsrd configuration files only by linking to the dynamic library. In the new configfile options can be set pr. interface, plugin parameters can be set, more IPC options can be set...and more. The syntax is documented in the olsrd.conf(5) manual page found in the files/ directory. Olsrd internals now uses a single struct, as returned by the config parser, for all configuration in runtime. this means that updating values in this struct will dynamically update olsrd operation. It also means that all configuration is now kept in one place instead of spread all across the place. FREEBSD AND MAC OSX PORT This version offers an initial port of olsrd to FreeBSD and Mac OS X. Like the Windows port it currently does not support IPv6. As this is a very first try at supporting FreeBSD and Mac OS X, this port is probably not as reliable as the Linux version. We'd greatly appreciate feedback and bug reports. To compile you need GNU make. Then simply run "gmake OS=fbsd" to build the executable. NEW MAKEFILE(S) The makefiles used to build olsrd have been rewritten and now includes dependency file generation using makedep. DEBUG OUTPUT Tables are now only printed if changes occur, so there are no longer any periodical output when using a debuglevel >0. A "heartbeat" is now printed to STDOUT(if it is a terminal) in the form of a rotating line to show that olsrd is actually operating. Adding "ClearScreen yes" to the configuration file clears the screen each time before the debug output shows updated information. This makes the debug output easier to read in many cases. "ClearScreen no" is the default, if no "ClearScreen" directive is given in the configuration file. PLUGIN INTERFACE There are some changes in the plugin interface. It is now at version 2. Plugin specific parameters from the configfile using the PlParam option, will now be passed on to plugins. To receive such parameters a plugin must implement a function: int register_olsr_param(char *key, char *value) to which parameter pairs will be passed. NO MORE THREADS Olsrd no longer uses any thread library on its operation. Everything now happens in the main thread allowing for use of olsrd on platforms with no thread library. ACPI SUPPORT IN WILLINGNESS CALCULATION(LINUX) The willingness calculation for Linux, now also supports the more modern ACPI proc interface in addition to APM. This is not well tested and feedback is appreciated! IPC OPTIONS Various options regarding IPC connections can now be set in the configfile. The options are max connections, allowed unicast hosts and allowed net-ranges. CODE REWRITES Much of the message generation and net output code is rewritten. Sending of partial messages should now work 100%. Also TC, MID and HNA messages are now cached for a random amount of time before transmitted - this often leads to the situation where these messages are sent together with an HELLO message, which is highly desirable since it saves network resources. PLUGIN DEVELOPERS must note that the buffers and size variables used in net output is no longer directly accessible! NET OUTPUT CODE REWRITTEN Every interface now has one outputbuffer registered. This allows messages to be "cached" as explained above, so that multiple messages are stacked together. Also the outputbuffer and size are no longer accessible directly, an API is available to plugins(and olsr code). OS DEPENDENT NETWORK INTERFACE The OS dependent network functions are now defined in net_os.h instead of being mixed up with internal network functions in net.h. BUGFIXES A bug that caused the announced ANSN sequence number to never stop being increased when a change in the MPR selector set was detected has been fixed. Another TC related bug that caused timed out TC entries not to be deleted from the routing table in certain cases has also been fixed. These bugs could cause unstable routes. A bug that in many cases caused the wrong routes to be deleted when using IPv6 has been fixed. 0.4.7 --------------------------------------------------------------------- NATIVE WINDOWS GUI AND INSTALLER We now have a native Windows GUI. The GTK+ version is no longer supported on Windows. The new native GUI is pretty compact as it does not require the GTK+ runtime DLLs. In addition to monitoring olsrds state the GUI offers an easy way for novice users to configure olsrd. It's pretty self-explanatory. Have a look at README-WIN32.txt for details. The Windows version now also comes with an installer based on the freely available Nullsoft Scriptable Install System (NSIS). Looks like the Windows port is becoming more and more Windows-ish. :-) WIRELESS INTERFACE DETECTION ON WINDOWS Like the Linux version the Windows port is now able to tell WLAN interfaces from wired interfaces. We can now, for example, set different HELLO intervals for WLAN interfaces and wired interfaces, respectively. ROUTE UPDATES The order of updates of calculated routes is swapped. Now new routes are added prior to deleting old ones. This could fix issues where in some very very few cases one could experiment loss of routes. BUGFIXES There were quite some bugs in IPv6 operation in 0.4.6. These are the bugs that were fixed: - HNA message parsing did not work. - Some IPv6 addresses were printed as IPv4 addresses in the debug output. - The '-dispin' option now works again. - A filedescriptor leak in the IPv6 interface detection caused olsrd to crash. 0.4.6 --------------------------------------------------------------------- WINDOWS PORT! Read the README-WIN32.txt file! DYNAMIC NETWORK INTERFACE UPDATES Network interfaces can now be updated and removed/added at runtime. Olsrd will check all interfaces specified in the config file or on the command-line, every 5 seconds. If updates occur, olsrd will register this and update the necessary data. If interfaces are removed or added, olsrd will detect this and configure the interfaces. If an interface is removed olsrd will continue to check the interface, so if say, a PCMCIA card is removed and later on reinserted(and given the same name), olsrd will detect this and start running on it again. Note that olsrd will now run even if no interfaces are detected. ROUTE CALCULATION UPDATE All 1 hop neighbor addresses that are not directly reachable trough a symmetric link in the link set will now be added with a GW in the routing table. this GW will be an interface address from a registered symmetric link to the neighbor. MID UPDATE Alias addresses are now registered in the link set processing if available. This is not to pretty(since the vtime has to be a mere guess) but it gives faster initial route updates. If a HELLO is received(at initial registration) from an IP that is not the same as the one set as main address in the received HELLO header, then the IP from which the HELLO was received will be registered as an alias of the main address set in the HELLO header. The default vtime is set to 15 secs. CODE RESTRUCTURING All OS dependent interface configuration code is now located in OS/ifnet.c(that would be linux/ifnet.c if using GNU/Linux). The functions are available trough the headerfile src/ifnet.h CODE CLEANUPS - Some timer issues fixed - Got rid of the global socket descriptors - Updated indexing of network interfaces - Introduced a global socket to use for ioctl calls(ioctl_s) - Removed upper limit for interfaces to use - Point-to-point interfaces are now allowed - The main select(2) loop now uses a timeout - A small bugfix in the select fd-set update code - Some bugfixes in the configuration file parsing - stdout/stderr are now set to not be buffered - A bugfix in the MID generation regarding seq. numbering PLUGIN INTERFCAE A new set of functions that are called whenever a change in the interface configuration(update, addition, removal) is made is introduced. These functions are added and removed very much like the ptf functions. Available trough the functions add_ifchgf and del_ifchgf. OBS OBS OBS!!! PLUGIN DEVELOPERS READ THIS!!!! The interface struct(declared in interfaces.h) has changed. Plugin developers must update plugins that uses the interface struct! The headerfile olsr_plugin_io.h which contains the plugin interface commands now contains a revision list where all changes are stated. 0.4.5 --------------------------------------------------------------------- PLUGIN: SECURE OLSR A plugin that generates and checks message signatures is added. Check lib/secure PLUGIN: TOPOLOGY GRAPH A plugin that generates output of the topology in the dot format is added. See lib/dot_draw OPTIMIZATIONS Some optimizations done that should cause fewer route recalculations. BUGFIXES Some bugs reported by Takafumi Tanaka fixed. RESTORATION OF NETWORK SETTINGS Network settings like disabling of ICMP redirects and spoof filter, are now restored at exit by olsrd. RFC COMPLIANCE FIX Nodes would in certain scenarios retransmit messages originating for themselves. This was a RFC incompliance. Reported by Ingmar Baumgart. NON-WLAN TIMERS No longer setting the HELLO interval of non-wlan interfaces as a multiplier of the wlan interval. The interval is set seperatly now. Due to this there are some updates in the configfile imperatives. CODE CLEANUPS Some new macros introduced for table insertion and removal and IP copying and comparison. FRONT END BUGFIXES IPv6 bugfixes in the GUI. 0.4.4 --------------------------------------------------------------------- ROUTE CALCULATION Routes are no longer added via neighbors declaring a willingness of WILL_NEVER. LINK SENSING AND ROUTE CALCULATION Link sensing and route calculation has been updated to handle multiple links between hosts in a sane way. IP SPOOF FILTERING IP spoof filtering is disabled on the interfaces which olsrd runs. These settings are not restored! ICMP REDIRECTS ICMP redirect message generation is disabled on the interfaces which olsrd runs. These settings are not restored! CONFIGFILE OPTIONS FOR MID AND HNA ADDED Options to set the MID and HNA emission intervals and validity time in the configfile added. IPv6 ADDRESS SCOPE Option to set what IPv6 address type(scope) to use in the configfile added. It can be set to either global or site-local. IPv6 MULTICAST Options to set site-local and global multicast addresses in the configfile added. EMISSION INTERVAL FUNCTION Functions to set emission intervals at runtime added. LINK LAYER NOTIFICATIONS If started with the -llinfo switch olsrd will collect and display link-layer information on neighbors. This is no longer limited to one interface. But no action is taken based on this info - and there is a upper limit of 8 neighbors from which this info can be collected pr. interface. This limitation is inherited from the WLAN drivers and is not something imposed by the olsrd code! IPv6 HNA MESSAGE FORMAT IPv6 HNA messages now contains 128-bit netmask instead of prefix. PLUGIN FUNCTIONS Added "packet transform functions" which allow plugins to alter all outgoing OLSR traffic. RESTRUCTURING Moved most headers out of OS dependent directories. The tunneling and link-layer notification interface is not yet separated from the /linux directory. MANUALPAGE A manpage(olsrd(8)) describing olsrd has been created. It is installed when using 'make install'. 0.4.3 --------------------------------------------------------------------- PLUGIN SUPPORT Olsrd now supports runtime-loadable plugins! A couple of example plugins are located in the lib/ directory. Read the README files in the various plugin directories for more info. A directive to load plugins have been added to the configfile as well. Documentation of the plugin interface can be fount at http://www.olsr.org. The plugin interface is designed to be extendable. But it should _always_ be backwards compatible with the interface used in this release! LINK-LAYER NOTIFICATION Some preliminary link-layer notification code has been added. Link quality can be written to stdout if olsrd is started with the -llinfo switch. No action is currently taken based on this info. And info will only be retrieved from the interface named "eth1". This code is not usable for users as of yet! MPR UPDATES Neighbors with willingness set to WILL_ALWAYS is now always added. The MPR selection is optimized as described in RFC3626 section 8.3.1 point 5. MPR BUGS There was a couple of bugs in the MPR selection code. All fixed. LINUX 2.6 BUG Users could not run olsrd on multiple interfaces using the Linux 2.6 kernel series. This is now fixed. MINOR BUGS One small bug in link hysteresis initialization and one in HNA route deletion. MESSAGE-SEQUENCENUMBER INCOMPLIANCE Message-seqnos was implemented on a pr. messagetype and pr. interface basis. This is not RFC3626 compliant and has been updates. All messages and interfaces now uses a global seuencenumber. RANDOM SEQUENCENUMBERS Sequencenumbers are now initialized using a random value. DAEMON MODE Fixes for running olsrd in daemon mode(debug 0). OPTIMIZATIONS Optimizations based on profiling implemented. SANITATION Message size is checked for every message before passing it to the appropriate message parsing function. If the size is bigger than the remaining size of the olsr packet then the message is discarded. GUI FRONT-END Some minor modifications done to the gui. INTERNAL CHANGES Lots of changes in handling of registration and unregistration of scheduler, socketparser, parser and local hna set. Some restructuring and movement of functions. 0.4.2 --------------------------------------------------------------------- No public release 0.4.1 --------------------------------------------------------------------- No public release 0.4.0 --------------------------------------------------------------------- LINK HYSTERESIS Link hysteresis as described in the RFC added. TC REDUNDANCY TC redundancy as described in the RFC added MPR REDUNDANCY MPR redundancy as described in the RFC added SCHEDULER REWRITE The scheduler has been rewritten to register scheduled events(function pointers) dynamically. PARSER REWRITE The parser has been rewritten to register parse functions on a pr. messagetype dynamically MALLOC WRAPPER A wrapper for the malloc(3) syscal has been introduced. olsr_malloc(size_t, const char *) should ALWAYS be used. CODE RESTRUCTURING Lots of restructuring in headerfiles. Linux spesific code moved to subdirectory linux/ FreeBSD code to be put in freebsd/ LOTS of code restructured due to the rexrite of the scheduler and parser. MPR CALCULATION Optimizing the MPR set as suggested in the RFC section 8.3.1 point 5 added. BUGFIXES Some bugs in MPR selection fixed. 0.3.8 --------------------------------------------------------------------- CODE REWRITES HNA code completely rewritten! The old code was really bad! Now it is much cleaner implemented and should work fine. One- and two-hop neighbor list structures rewritten. They now use the same hashed double-linked lists as the rest of the information sets use. CODE RESTRUCTURING Some code restructuring which resulted in the new files: timer.h, mantissa.c, mantissa.h, hashing.c, hashing.h, linux/net.c linux/net.h, linux/kernel_routes.c, linux/kernel_routes.h and some renamed files BUG FIXES The bug causing errormessages on exit is fixed. The bug that caused initial HNA routes in the GUI to display a hopcount of 0 fixed. IPv6 HNA netmasks were all added as /128. It's fixed now. IPv6 Turns out sitelocal address had to be preferred to avoid IPv6 header messing up link-sensing. Bug fixed 0.3.7 --------------------------------------------------------------------- CODE REWRITES The entire TC set and MPR selector set code rewritten. Hashing and double linked lists added to the MID code. Lots of HNA code has been rewritten as well. HNA bugfix When a node lost connectivity to a HNA GW all HNA entries to that gw was deleted. This has been fixed - and HNA entries only gets deleted on timeout now. Other HNA bugs have been fixed as well. But the whole HNA implementation needs a rewrite! Holdingtime BUGfix There was a bug that caused holdingtime not to be properly recalculated when using non-default emission intervals. Forwarding and symmetric neighbors Seems I had misread the RFC on what a 1-hop symmetric neighbor is. Now the link-set is checked when a check for a symmetric neighbor is done. Not the 1 hop neighbor set as it used to be. This way the hack when receiving MID messages could be removed. IPv6 Global addresses are now preferred. Sitelocal addresses are only used if no global addresses are found. There have been problems where the address set in the IP header of IPv6 packets do not match the address chosen by OLSR. GUI - 0.2.5 The GUI is finally updated! It can now handle piggybacked messages and link sensing HELLO message format. 0.3.6 --------------------------------------------------------------------- HNA support using IPv6 HNA now works using IPv6 as well! Just add the network address and prefix in the HNA6 section in the configfile. The IPv6 HNA packets differ some from the IPv4 as they don't send the netmask but the prefix. NEW FILENAME FOR THE BINARY AND CONFIG FILE They are now called olsrd and olsrd.conf. I figured I'd use the olsrd name before somebody else started using it ;-) Config file New options: DEBUG, HNA6 and IPC-CONNECT added to config file. Output A printf-wrapper has been introduced - debug level output handling is much more uniform now. The daemon should run fine in detached mode now(DEBUG 0) GUI front-end The GUI front-end can now connect and disconnect at any time while the daemon is running, if started using the -ipc switch or with IPC set to 'yes' in the configfile. BUGS A small HNA bug fixed. 0.3.5 --------------------------------------------------------------------- Forwarding jitter Forwarding jitter added. Messages are piggybacked if they arrive(and are to be forwarded) while there is data to be forwarded buffered. Added some bugfixes to support parsing of piggybacked messages as well. Route calculation Fixed route calculation so that 2 hop neighbors are added. This smooths changes from 1 hop to 2 hop neighbor out. The old way one had to wait for a TC before the 2 hop neighbors were added. 2 hop neighbor set All neighbors received in HELLO messages are added to the two hop neighborhood. This helps smoothing out the 1-to-2 hop transition as well. MID calculation MID calculation had to be updated due to the registering of two hop neighbors that are already one hop neighbors. They should not be considered when calculating two hop coverage. Optimizations Deletion of possible one hop neighbors registered on non main-addresses when first registering MID info from a node removed. This can not occur due to the fact that registering of neighbor nodes are done on main addresses from link-sensing Option to not forward messages on wired links on which they arrived removed. This is no longer usable to any degree when adding support for piggybacking of forwarded messages is to be implemented. Cleanups Some unused parameters and commandline options were removed. 0.3.3 --------------------------------------------------------------------- TC MESSAGEING Added sending of empty TC messages if all MPR selectors are removed. Empty TC messages are sent for a TC_HOLD_TIME period as described in section 9.3 in the RFC. HNA Fixed HNA route calculations for IPv6. I forgot to upgrade this in 0.3.2 OPTIONS -hnaint and -midint command line optionas added to set the interval of HNA and MID generation. FORWARDING As an optimization messages have not been forwarded on the received interface if this is registered as a non-WLAN interface. This causes problems for people using Ethernet-to-WLAN adapters. This optimization is now turned off by default. It can be activated using the -nofwlan option. BUGS THERE ARE SOME NASTY BUGS IN 0.3.2! Fixed a bug that caused 2 hop neighbors not to time out. Fixed a bug that caused a 1 hop neighbor timeout not to recalculate the routing table. Fixed a small memleak in the MID set Fixed some smaller bugs. IPv6 functioning is not well tested in this release. 0.3.2 --------------------------------------------------------------------- HNA Updated HNA to be RFC compliant. This means that all received HNA tuples are registered and only the subset of unique entries(net/netmask) with the smallest hopcount is inserted into the routing table. Config file User can specify configfile name using the -f switch. Bugs Fixed a link-sensing bug that caused problems when using MID nodes. 0.3.1 --------------------------------------------------------------------- MPR calculation MPR calculation is now based on the willingness announced by nodes. Neighbor set The neighbor set does not have timeouts on entries any more. Creation and deletion of neighbor entries is done from the link-set as suggested in the RFC. Cleanups Gotten rid of a lot of code that became more or less obsolete due to all the changes introduced in 0.3.0. Bugs Fixed a nasty bug concerning the sequence numbering of TC packets. Fixed some bugs regarding MPR calculation - and probably introduced a whole new species when implementing the willingness-based calculation ;-) 0.3.0 --------------------------------------------------------------------- Due to the extensive amount of updates this release is versioned 0.3.0 Duplicate table and forwarding The duplicate table functionality is totally rewritten in 100% RFC compliance. The forward algorithm specified in the RFC is implemented this meant rewriting much of the packet processing code. The daemon also forwards unknown packettypes now. Link sensing and neighbor processing Link sensing and neighbor processing was done in the same operation in the old code. Link sensing is now a mechanism of its own which is 100% RFC compliant. Neighbor processing and HELLO generation has been partly rewritten to be RFC compliant. Neighbors are now registered as either SYN or NOT_SYM. The NOT_NEIGH, SYM_NEIGH and MPR_NEIGH values are only used when building HELLO messages. Links are in one of the following states: UNSPEC_LINK, ASYM_LINK or SYM_LINK. HELLO messages now advertise link status of neighbors on the interface the message is transmitted. Willingness A node now dynamically calculates willingness based on powersource and possibly battery power. If the node is AC powered it announces a willingness of 6. If batterypowered the willingness is calculated as: P / 26 Where P is percentage of power left. Configuration file The daemon now tries to read its configuration from the file /etc/uolsrd.conf A "standard" configuration file is installed when doing 'make install'. This file should be edited to fit your needs. Command-line options can still be used to override the configuration form the file(ore if no config file is present). The -f switch can also be used to specify a configuration file. Willingness If AdvancedPowerManagemant(APM) is supported on your system the willingness of the node is dynamically calculated based upon the powerstatus of the node. MPR calculation based upon willingness is not done as of yet. TC ANSN A bugs in the TC processing fixed. HNA Some serious HNA bugs fixed. These bugs caused a node to always choos the gateway with the larges hopcout :) More seriously - a bug caused looping of HNA messages in certain scenarios. Package sequence numbers These were added. Not much use as of now - but they're there(as specified in the RFC). Broadcast address Users can now specify the broadcast address to use. Useful if one wishes to use the 255.255.255.255 broadcast. 0.2.5 --------------------------------------------------------------------- Htime and Vtime Htime and Vtime processing and handling added. Holding times used to be a static value for all nodes. Now every node can signal its vlidity time to others. To achieve this mantissa/exponent calculation functionality was added. Messages now include Vtime(and Htime in HELLO) values in mantissa/exponent format instead of just zero. These values are as stated above, used as holding time for nodes. the GUI should be upgraded as well... Jitter The use of jitter in message generation intervals vere fixed. 0.2.4 --------------------------------------------------------------------- Seqno bugs Some bugs concerning sequence numbers in HELLO and MID message handling was fixed. Newly registered nodes in the neighbor and MID sets were initialized with a seqno of 0. When using a "wraparound" sequencenumber check(as defined in olsr_protocol.h) this can produce errors if a new node joins a network where existing nodes has seqnos >0x00FF. IPv6 related bugs Some checks and copying of node addresses where done using sizeof(u_olsr32_t) which is 32 bits. This caused only the 32 firs bits of IPv6 addresses to be copied and checked. olsrd-0.6.6.2/COVERITY000066400000000000000000000021271234304727700142100ustar00rootroot00000000000000Building for a Coverity scan: Setting up you build tooling: ============================= 1. Go to http://scan.coverity.com/self-build/ and follow the 'Do once' instructions. 1. Download and extract the tarball relevant to your system. 2. Add the (extracted) bin directory to your path Building: ========= Make sure to be in the directory of the source tree (we assume a git checkout in this description), and run the following commands: ccache -C git clean -fdx git reset --hard cov-build --dir cov-int make DESTDIR="$(pwd)/dist" build_all install_all tar czf "$(pwd)/dist/olsr.tgz" cov-int Lookup the following data: 1. the (Coverity) project USERNAME 2. the (Coverity) project PASSWORD 3. your EMAIL address on which you want to receive an analysis confirmation Now upload the build (you will need the project USERNAME and PASSWORD for this): curl --form file="@$(pwd)/dist/olsr.tgz" \ --form project=USERNAME \ --form password=PASSWORD \ --form email=EMAIL \ http://scan5.coverity.com/cgi-bin/upload.py olsrd-0.6.6.2/Makefile000066400000000000000000000335021234304727700144620ustar00rootroot00000000000000# The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # # Please also write a new version to: # gui/win32/Main/Frontend.rc (line 71, around "CAPTION [...]") # gui/win32/Inst/installer.nsi (line 57, around "MessageBox MB_YESNO [...]") VERS = 0.6.6.2 TOPDIR = . INSTALLOVERWRITE ?= include Makefile.inc # pass generated variables to save time MAKECMD = $(MAKE) OS="$(OS)" WARNINGS="$(WARNINGS)" VERBOSE="$(VERBOSE)" LIBS += $(OS_LIB_DYNLOAD) ifeq ($(OS), win32) LDFLAGS += -Wl,--out-implib=libolsrd.a LDFLAGS += -Wl,--export-all-symbols endif SWITCHDIR = src/olsr_switch CFGDIR = src/cfgparser include $(CFGDIR)/local.mk TAG_SRCS = $(SRCS) $(HDRS) $(wildcard $(CFGDIR)/*.[ch] $(SWITCHDIR)/*.[ch]) SGW_SUPPORT = 0 ifeq ($(OS),linux) SGW_SUPPORT = 1 endif ifeq ($(OS),android) SGW_SUPPORT = 1 endif .PHONY: default_target switch default_target: $(EXENAME) $(EXENAME): $(OBJS) src/builddata.o ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $@ $^ $(LIBS) cfgparser: $(CFGDEPS) src/builddata.o $(MAKECMDPREFIX)$(MAKECMD) -C $(CFGDIR) switch: $(MAKECMDPREFIX)$(MAKECMD) -C $(SWITCHDIR) # generate it always .PHONY: src/builddata.c src/builddata.c: $(MAKECMDPREFIX)$(RM) "$@" $(MAKECMDPREFIX)echo "#include \"defs.h\"" >> "$@" $(MAKECMDPREFIX)echo "const char olsrd_version[] = \"olsr.org - $(VERS)`./make/hash_source.sh`\";" >> "$@" $(MAKECMDPREFIX)date +"const char build_date[] = \"%Y-%m-%d %H:%M:%S\";" >> "$@" $(MAKECMDPREFIX)echo "const char build_host[] = \"$(shell hostname)\";" >> "$@" .PHONY: help libs clean_libs libs_clean clean distclean uberclean install_libs uninstall_libs libs_install libs_uninstall install_bin uninstall_bin install_olsrd uninstall_olsrd install uninstall build_all install_all uninstall_all clean_all gui clean_gui clean: -rm -f $(OBJS) $(SRCS:%.c=%.d) $(EXENAME) $(EXENAME).exe src/builddata.c $(TMPFILES) -rm -f libolsrd.a -rm -f olsr_switch.exe -rm -f gui/win32/Main/olsrd_cfgparser.lib -rm -f olsr-setup.exe -rm -fr gui/win32/Main/Release -rm -fr gui/win32/Shim/Release gui: ifeq ($(OS),linux) $(MAKECMDPREFIX)$(MAKECMD) -C gui/linux-gtk all else @echo "target gui not supported on $(OS)" @exit 1 endif clean_gui: $(MAKECMDPREFIX)$(MAKECMD) -C gui/linux-gtk clean distclean: uberclean uberclean: clean clean_libs clean_gui -rm -f $(TAGFILE) # BSD-xargs has no "--no-run-if-empty" aka "-r" find . \( -name '*.[od]' -o -name '*~' \) -not -path "*/.hg*" -type f -print0 | xargs -0 rm -f $(MAKECMDPREFIX)$(MAKECMD) -C $(SWITCHDIR) clean $(MAKECMDPREFIX)$(MAKECMD) -C $(CFGDIR) clean install: install_olsrd uninstall: uninstall_olsrd install_bin: mkdir -p $(SBINDIR) install -m 755 $(EXENAME) $(SBINDIR) $(STRIP) $(SBINDIR)/$(EXENAME) ifeq ($(SGW_SUPPORT),1) $(MAKECMDPREFIX)if [ -e $(SBINDIR)/$(SGW_POLICY_SCRIPT) ]; then \ cp -f files/$(SGW_POLICY_SCRIPT) $(SBINDIR)/$(SGW_POLICY_SCRIPT).new; \ echo "Policy routing script was saved as $(SBINDIR)/$(SGW_POLICY_SCRIPT).new"; \ else \ cp -f files/$(SGW_POLICY_SCRIPT) $(SBINDIR)/$(SGW_POLICY_SCRIPT); \ fi endif uninstall_bin: rm -f $(SBINDIR)/$(EXENAME) rmdir -p --ignore-fail-on-non-empty $(SBINDIR) install_olsrd: install_bin @echo ========= C O N F I G U R A T I O N - F I L E ============ @echo $(EXENAME) uses the configfile $(CFGFILE) @echo a default configfile. A sample RFC-compliance aimed @echo configfile can be found in olsrd.conf.default.rfc. @echo However none of the larger OLSRD using networks use that @echo so install a configfile with activated link quality exstensions @echo per default. @echo can be found at files/olsrd.conf.default.lq @echo ========================================================== mkdir -p $(ETCDIR) $(MAKECMDPREFIX)if [ -e $(CFGFILE) ]; then \ cp -f files/olsrd.conf.default.lq $(CFGFILE).new; \ echo "Configuration file was saved as $(CFGFILE).new"; \ else \ cp -f files/olsrd.conf.default.lq $(CFGFILE); \ fi @echo ------------------------------------------- @echo Edit $(CFGFILE) before running olsrd!! @echo ------------------------------------------- @echo Installing manpages $(EXENAME)\(8\) and $(CFGNAME)\(5\) ifneq ($(MANDIR),) mkdir -p $(MANDIR)/man8/ cp files/olsrd.8.gz $(MANDIR)/man8/$(EXENAME).8.gz mkdir -p $(MANDIR)/man5/ cp files/olsrd.conf.5.gz $(MANDIR)/man5/$(CFGNAME).5.gz endif uninstall_olsrd: uninstall_bin ifneq ($(MANDIR),) rm -f $(MANDIR)/man5/$(CFGNAME).5.gz rmdir -p --ignore-fail-on-non-empty $(MANDIR)/man5/ rm -f $(MANDIR)/man8/$(EXENAME).8.gz rmdir -p --ignore-fail-on-non-empty $(MANDIR)/man8/ endif rm -f $(CFGFILE) $(CFGFILE).new rmdir -p --ignore-fail-on-non-empty $(ETCDIR) tags: $(TAGCMD) -o $(TAGFILE) $(TAG_SRCS) rpm: $(MAKECMDPREFIX)$(RM) olsrd-current.tar.bz2 $(MAKECMDPREFIX)echo "Creating olsrd-current.tar.bz2 ..." $(MAKECMDPREFIX)./list-excludes.sh | tar --exclude-from=- --exclude="olsrd-current.tar.bz2" -C .. -cjf olsrd-current.tar.bz2 olsrd-current $(MAKECMDPREFIX)echo "Building RPMs..." $(MAKECMDPREFIX)rpmbuild -ta olsrd-current.tar.bz2 # # PLUGINS # # This is quite ugly but at least it works ifeq ($(OS),linux) SUBDIRS := arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo jsoninfo mdns mini nameservice p2pd pgraph pud quagga secure sgwdynspeed txtinfo watchdog else ifeq ($(OS),win32) SUBDIRS := dot_draw httpinfo jsoninfo mini pgraph secure txtinfo else ifeq ($(OS),android) SUBDIRS := arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo jsoninfo mdns mini nameservice p2pd pgraph pud secure sgwdynspeed txtinfo watchdog else SUBDIRS := dot_draw httpinfo jsoninfo mini nameservice pgraph secure txtinfo watchdog endif endif endif libs: $(MAKECMDPREFIX)set -e;for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR);done libs_clean clean_libs: -for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR) clean;rm -f lib/$$dir/*.so lib/$$dir/*.dll;done libs_install install_libs: $(MAKECMDPREFIX)set -e;for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR) install;done libs_uninstall uninstall_libs: $(MAKECMDPREFIX)set -e;for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR) uninstall;done rmdir -p --ignore-fail-on-non-empty $(LIBDIR) # # DOCUMENTATION # .PHONY: doc doc_clean doc: $(MAKECMDPREFIX)$(MAKECMD) -C doc OS=$(OS) doc_clean: $(MAKECMDPREFIX)$(MAKECMD) -C doc OS=$(OS) clean # # PLUGINS # arprefresh: $(MAKECMDPREFIX)$(MAKECMD) -C lib/arprefresh arprefresh_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/arprefresh DESTDIR=$(DESTDIR) clean arprefresh_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/arprefresh DESTDIR=$(DESTDIR) install arprefresh_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/arprefresh DESTDIR=$(DESTDIR) uninstall bmf: $(MAKECMDPREFIX)$(MAKECMD) -C lib/bmf bmf_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/bmf DESTDIR=$(DESTDIR) clean bmf_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/bmf DESTDIR=$(DESTDIR) install bmf_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/bmf DESTDIR=$(DESTDIR) uninstall dot_draw: $(MAKECMDPREFIX)$(MAKECMD) -C lib/dot_draw dot_draw_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/dot_draw DESTDIR=$(DESTDIR) clean dot_draw_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/dot_draw DESTDIR=$(DESTDIR) install dot_draw_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/dot_draw DESTDIR=$(DESTDIR) uninstall dyn_gw: $(MAKECMDPREFIX)$(MAKECMD) -C lib/dyn_gw dyn_gw_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/dyn_gw DESTDIR=$(DESTDIR) clean dyn_gw_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/dyn_gw DESTDIR=$(DESTDIR) install dyn_gw_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/dyn_gw DESTDIR=$(DESTDIR) uninstall dyn_gw_plain: $(MAKECMDPREFIX)$(MAKECMD) -C lib/dyn_gw_plain dyn_gw_plain_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/dyn_gw_plain DESTDIR=$(DESTDIR) clean dyn_gw_plain_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/dyn_gw_plain DESTDIR=$(DESTDIR) install dyn_gw_plain_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/dyn_gw_plain DESTDIR=$(DESTDIR) uninstall httpinfo: $(MAKECMDPREFIX)$(MAKECMD) -C lib/httpinfo httpinfo_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/httpinfo DESTDIR=$(DESTDIR) clean httpinfo_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/httpinfo DESTDIR=$(DESTDIR) install httpinfo_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/httpinfo DESTDIR=$(DESTDIR) uninstall jsoninfo: $(MAKECMDPREFIX)$(MAKECMD) -C lib/jsoninfo jsoninfo_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/jsoninfo DESTDIR=$(DESTDIR) clean jsoninfo_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/jsoninfo DESTDIR=$(DESTDIR) install jsoninfo_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/jsoninfo DESTDIR=$(DESTDIR) uninstall mdns: $(MAKECMDPREFIX)$(MAKECMD) -C lib/mdns mdns_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/mdns DESTDIR=$(DESTDIR) clean mdns_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/mdns DESTDIR=$(DESTDIR) install mdns_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/mdns DESTDIR=$(DESTDIR) uninstall # # no targets for mini: it's an example plugin # # nameserver uses regex, which was only recently added to Android. On # Android, $(REGEX_OBJS) will have all of the files needed, on all # other platforms, it'll be empty and therefore ignored. nameservice: $(MAKECMDPREFIX)$(MAKECMD) -C lib/nameservice clean $(MAKECMDPREFIX)$(MAKECMD) -C lib/nameservice nameservice_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/nameservice DESTDIR=$(DESTDIR) clean nameservice_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/nameservice DESTDIR=$(DESTDIR) install nameservice_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/nameservice DESTDIR=$(DESTDIR) uninstall p2pd: $(MAKECMDPREFIX)$(MAKECMD) -C lib/p2pd p2pd_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/p2pd DESTDIR=$(DESTDIR) clean p2pd_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/p2pd DESTDIR=$(DESTDIR) install p2pd_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/p2pd DESTDIR=$(DESTDIR) uninstall pgraph: $(MAKECMDPREFIX)$(MAKECMD) -C lib/pgraph pgraph_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/pgraph DESTDIR=$(DESTDIR) clean pgraph_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/pgraph DESTDIR=$(DESTDIR) install pgraph_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/pgraph DESTDIR=$(DESTDIR) uninstall pud: $(MAKECMDPREFIX)$(MAKECMD) -C lib/pud pud_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/pud DESTDIR=$(DESTDIR) clean pud_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/pud DESTDIR=$(DESTDIR) install pud_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/pud DESTDIR=$(DESTDIR) uninstall quagga: $(MAKECMDPREFIX)$(MAKECMD) -C lib/quagga quagga_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/quagga DESTDIR=$(DESTDIR) clean quagga_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/quagga DESTDIR=$(DESTDIR) install quagga_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/quagga DESTDIR=$(DESTDIR) uninstall secure: $(MAKECMDPREFIX)$(MAKECMD) -C lib/secure secure_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/secure DESTDIR=$(DESTDIR) clean secure_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/secure DESTDIR=$(DESTDIR) install secure_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/secure DESTDIR=$(DESTDIR) uninstall sgwdynspeed: $(MAKECMDPREFIX)$(MAKECMD) -C lib/sgwdynspeed sgwdynspeed_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/sgwdynspeed DESTDIR=$(DESTDIR) clean sgwdynspeed_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/sgwdynspeed DESTDIR=$(DESTDIR) install sgwdynspeed_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/sgwdynspeed DESTDIR=$(DESTDIR) uninstall txtinfo: $(MAKECMDPREFIX)$(MAKECMD) -C lib/txtinfo txtinfo_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/txtinfo DESTDIR=$(DESTDIR) clean txtinfo_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/txtinfo DESTDIR=$(DESTDIR) install txtinfo_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/txtinfo DESTDIR=$(DESTDIR) uninstall watchdog: $(MAKECMDPREFIX)$(MAKECMD) -C lib/watchdog watchdog_clean: $(MAKECMDPREFIX)$(MAKECMD) -C lib/watchdog DESTDIR=$(DESTDIR) clean watchdog_install: $(MAKECMDPREFIX)$(MAKECMD) -C lib/watchdog DESTDIR=$(DESTDIR) install watchdog_uninstall: $(MAKECMDPREFIX)$(MAKECMD) -C lib/watchdog DESTDIR=$(DESTDIR) uninstall build_all: all switch libs install_all: install install_libs uninstall_all: uninstall uninstall_libs clean_all: uberclean clean_libs olsrd-0.6.6.2/Makefile.inc000066400000000000000000000170641234304727700152370ustar00rootroot00000000000000###################### # # Highlevel configuration options for all # # # activate debugging with 1 or deactivate with 0 DEBUG ?= 1 # compile OLSR_PRINTF out NO_DEBUG_MESSAGES ?= 0 # the optimize option to be set for gcc OPTIMIZE ?= # enable mudflap with 1 or deactivate with 0 # you need a recent enough gcc and the libmudflap installed MUDFLAP ?= 0 # shows full compiler/linker calls if activated VERBOSE ?= 0 ifeq ($(VERBOSE),0) MAKECMDPREFIX = @ else MAKECMDPREFIX = endif # OS detection ifeq ($(OS),Windows_NT) OS := win32 endif ifeq ($(OS),) OS := $(shell sh $(TOPDIR)/make/guess_os.sh) endif ###################### # # Lowlevel options and rules # # programs CCACHE ?= $(shell IFS=:; for i in $$PATH;do test -x "$$i/ccache" && echo "$$i/ccache" && break; done) ifeq ($(origin CC),default) CC = $(CCACHE) gcc else CC ?= $(CCACHE) gcc endif ifeq ($(DEBUG),0) STRIP ?= strip else STRIP ?= : endif BISON ?= bison FLEX ?= flex TAGCMD ?= etags # target directories and names DESTDIR ?= ETCDIR ?= $(DESTDIR)/etc USRDIR ?= $(DESTDIR)/usr INCLUDEDIR ?= $(DESTDIR)/usr/include LIBDIR ?= $(USRDIR)/lib SBINDIR ?= $(USRDIR)/sbin SHAREDIR ?= $(USRDIR)/share DOCDIR ?= $(SHAREDIR)/doc MANDIR ?= $(SHAREDIR)/man EXENAME ?= olsrd CFGNAME ?= $(EXENAME).conf CFGFILE ?= $(ETCDIR)/$(CFGNAME) SGW_POLICY_SCRIPT ?= sgw_policy_routing_setup.sh DOCDIR_OLSRD ?= $(DOCDIR)/$(EXENAME) CPPFLAGS = -Isrc ifneq ($(TOPDIR),.) CPPFLAGS += -I$(TOPDIR)/src endif # add gcc warnings and optimizations if CFLAGS not set ifndef CFLAGS ifndef WARNINGS WARNINGS += -Wall WARNINGS += -Wextra WARNINGS += -Wold-style-definition WARNINGS += -Wdeclaration-after-statement WARNINGS += -Wmissing-prototypes WARNINGS += -Wstrict-prototypes WARNINGS += -Wmissing-declarations WARNINGS += -Wsign-compare WARNINGS += -Waggregate-return WARNINGS += -Wmissing-noreturn WARNINGS += -Wmissing-format-attribute WARNINGS += -Wno-multichar WARNINGS += -Wno-deprecated-declarations WARNINGS += -Wendif-labels WARNINGS += -Wwrite-strings WARNINGS += -Wbad-function-cast WARNINGS += -Wpointer-arith WARNINGS += -Wcast-qual WARNINGS += -Wshadow WARNINGS += -Wformat WARNINGS += -Wsequence-point WARNINGS += -Wcast-align WARNINGS += -Wformat-security WARNINGS += -Wformat-y2k WARNINGS += -Werror=format-security WARNINGS += -Winit-self WARNINGS += -Wswitch-default WARNINGS += -Wsync-nand WARNINGS += -Wundef WARNINGS += -Wlogical-op ifneq ($(OS),android) WARNINGS += -Wdouble-promotion WARNINGS += -Wjump-misses-init WARNINGS += -Wtrampolines endif WARNINGS += -Wunused-parameter # the following 2 do not work yet and need more work on it #WARNINGS += -Wconversion #WARNINGS += -Wredundant-decls ifeq ($(MUDFLAP),0) # work around a bug in gcc-4.* WARNINGS += -Wnested-externs endif # Alas, htons() triggers this so we can't seriously activate it. #WARNINGS += -Wunreachable-code WARNINGS += -Winline WARNINGS += -Wdisabled-optimization # WARNINGS += -Werror WARNINGS += -finline-functions-called-once WARNINGS += -funit-at-a-time WARNINGS += -fearly-inlining ifeq ($(DEBUG),0) WARNINGS += -fomit-frame-pointer endif # we have small inline functions in src/lq_route.h which should always be inlined WARNINGS += -finline-limit=350 # These tell gcc to put each function and global variable in a separate section. # The linker can than remove all unreferenced section. But in the olsrd binary # unused doesn't imply unused at all since the function may be used by plugins, # e.g. the ones in src/plugin_utils.c. # So we can use that featuer at most to identify unused functions and remove them # from the source by hand. #WARNINGS += -ffunction-sections #WARNINGS += -fdata-sections WARNINGS := $(shell CC="$(CC)" "$(TOPDIR)/gcc-warnings" $(WARNINGS)) endif CFLAGS += $(WARNINGS) CFLAGS += $(OPTIMIZE) CFLAGS += $(EXTRA_CFLAGS) endif ifneq ($(MUDFLAP),0) CFLAGS += -fmudflapth endif ifdef OLSRD_PLUGIN # c and ld flags for libraries (plugins) CPPFLAGS += -DOLSR_PLUGIN ifeq ($(OS),win32) LDFLAGS += -Wl,-export-all-symbols,--enable-auto-import endif LDFLAGS += -shared LDFLAGS += -Wl,-soname,$(PLUGIN_SONAME) LDFLAGS += -Wl,--version-script=version-script.txt else # c and ld flags for main ifeq ($(OS),win32) LDFLAGS += -Wl,-export-all-symbols else LDFLAGS += -Wl,-export-dynamic endif LDFLAGS += -Wl,-rpath,$(LIBDIR) endif # LDFLAGS for all LDFLAGS += -Wl,--warn-common # See above at "-ffunction-sections" for an explanation (and why it is disabled). #LDOPTS += -Wl,--gc-sections #LDOPTS += -Wl,--print-gc-sections #LDFLAGS += $(shell CC="$(CC)" $(TOPDIR)/ld-warnings $(LDOPTS)) ifneq ($(MUDFLAP),0) LIBS += -lmudflapth endif # extra options from the outside CPPFLAGS += $(EXTRA_CPPFLAGS) # 32/64 cross compilation ifdef M32 CFLAGS += -m32 LDFLAGS += -m32 endif ifdef M64 CFLAGS += -m64 LDFLAGS += -m64 endif ################################### # # options to save space on small systems # we have plugins with the old interface #CPPFLAGS += -DSUPPORT_OLD_PLUGIN_VERSIONS=1 # use the new fixed point math stuff CPPFLAGS += -DUSE_FPM # search sources and headers in current dir and in src/ SRCS += $(wildcard src/common/*.c src/*.c *.c) HDRS += $(wildcard src/common/*.h src/*.h *.h) ifeq ($(OS),UNKNOWN) all: help else # include OS specifics all: default_target include $(TOPDIR)/make/Makefile.$(OS) endif # one object for each source file OBJS += $(SRCS:%.c=%.o) # debugging or non-debugging flags ifeq ($(DEBUG),1) CPPFLAGS += -DDEBUG CFLAGS += -ggdb else CPPFLAGS += -DNDEBUG ifeq ($(OPTIMIZE),) OPTIMIZE += -O2 -D_FORTIFY_SOURCE=2 endif endif ifeq ($(NO_DEBUG_MESSAGES),1) CPPFLAGS += -DNODEBUG endif ifeq ($(OS),linux) CPPFLAGS+=-DHTTPINFO_PUD -I$(TOPDIR)/lib -I$(TOPDIR)/lib/pud/nmealib/include -I$(TOPDIR)/lib/pud/wireformat/include endif # a make function to quote "/" and "." quote = $(subst .,\.,$(subst /,\/,$1)) # fully automatic and working dependency generation %.d: %.c $(MAKECMDPREFIX)$(filter-out $(CCACHE),$(CC)) -M $(strip $(CPPFLAGS)) "$<" | sed -e '1s/\($(call quote,$(*F))\.o\)[ :]*/$(call quote,$(*D)/\1 $@: Makefile $(TOPDIR)$(if $(TOPDIR),/)Makefile.inc) /g' >"$@" %.o: %.c ifeq ($(VERBOSE),0) @echo "[CC] $<" endif $(MAKECMDPREFIX)$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< # we always need the includes and defines # for legacy since now CPPFLAGS += $(INCLUDES) $(DEFINES) ifneq ($(INCLUDES),) $(warning Use CPPFLAGS instead of INCLUDES for -I) endif ifneq ($(DEFINES),) $(warning Use CPPFLAGS instead of DEFINES for -D) endif TAGFILE ?= src/TAGS help: @echo @echo '***** olsr.org olsr daemon Make ****' @echo ' Automatic detection of your OS ' @echo ' failed! ' @echo ' You can provide a valid target OS ' @echo ' by setting the OS variable! Valid ' @echo ' target OSes are: ' @echo ' --------------------------------- ' @echo ' linux - GNU/Linux ' @echo ' win32 - MS Windows ' @echo ' fbsd - FreeBSD ' @echo ' nbsd - NetBSD ' @echo ' obsd - OpenBSD ' @echo ' osx - Mac OS X ' @echo ' android - Android ' @echo ' --------------------------------- ' @echo ' Example - build for windows: ' @echo ' make OS=win32 ' @echo ' If you are developing olsrd code, ' @echo ' exporting the OS variable might ' @echo ' be a good idea :-) Have fun! ' @echo '************************************' @echo ifeq ($(filter clean% %clean, $(MAKECMDGOALS)),) # include dependencies - we don't need any dependency for a everytime generated files -include $(filter-out src/builddata.%,$(SRCS:%.c=%.d)) endif # Local Variables: # mode: makefile # End: olsrd-0.6.6.2/README-Olsr-Extensions000066400000000000000000000500771234304727700167620ustar00rootroot00000000000000===================================================== OLSRd (version 0.6.0) protocol extensions ===================================================== 1.) Credits 2.) Link quality algorithms 3.) Fisheye 4.) NIIT (ipv4 over ipv6 traffic) 5.) Smart gateways (asymmetric gateway tunnels) 6.) NatThreshold NIIT and Smart gateways are only supported for Linux at the moment. 1.) Credits: ******************** The concept of ETX (Expected Transmission Count) has been developed by Douglas S. J. De Couto at the Massachusetts Institute of Technology (see http://en.wikipedia.org/wiki/Expected_Transmission_Count). The original ETX design has been done by the Berlin Freifunk Network (see www.freifunk.net and www.c-base.org), the code and message format was coded by Thomas Lopatic. Fisheye was implemented by Thomas Lopatic in 2005. The LQ-Plugin rewrite was done by Henning Rogge in 2008. The NIIT kernel module was written by lynxis in 2009. The asymmetric gateway tunnel functionality was written by Markus Kittenberger and Henning Rogge, but the concept was used by B.A.T.M.A.N before OLSRd. 2.) Link quality algorithm ********************************** Concept: -------- OLSRd (since version 0.5.6) uses a dimension-less integer value as a representation of the 'cost' of each link. This is often called Link Quality (LQ for short). There are multiple LQ plugins, each of them calculating a cost for the links of the router. At the moment (version 0.6.0) all LQ plugins are using an ETX-metric (Expected Transmission Count) but other metrics would be possible and imaginable, such as MIC [0], etc. Each link is described by an LQ/NLQ (Link Quality/Neighbor Link Quality) value pair, which describe the quality towards the router (LQ) and towards the neighbor (NLQ). Both LQ and NLQ can be values between 0 and 1. The total cost of the link is calculated as ETX = 1.0/(LQ * NLQ). The ETX value of a link can be seen as the number of retransmissions necessary to deliver the packet to the target. ETX 1.0 mean a perfect link without packet loss. A B +---+ +---+ | | <--- LQ --- | | | | ---- NLQ -->| | +---+ +---+ Note that the LQ and NLQ are always as seen from one nodes' perspective: the LQ of node B towards A is the percentage of packets that B can transmit to A. Hence, in the OLSR ETX implementation, B has to tell A it's LQ. OLSRd chooses the path towards a target by selecting the path segments with the smallest sum of link costs. In other words: best_path(A,B) = minimum_sum({set of all paths between A and B}) Configuration: -------------- The link quality system is activated by setting the configuration variable "LinkQualityLevel" to 2. You can use the "LinkQualityAlgorithm" parameter to choose the current link quality algorithm in the configuration file. Some embedded OLSRd versions are only compiled with one plugin (mostly etx_ff), so don't use the configuration option with these agents. There are four different link quality algorithms in OLSRd 0.6.0, two current Funkfeuer/Freifunk ETX implementations and two legacy implementations. LinkQuality-Algorithm "etx_ff": ------------------------------- "Etx_ff" (ETX Funkfeuer/Freifunk) is the current default LQ algorithm for OLSRd. It uses the sequence number of the OLSR packets (which are link specific) to determine the current packet loss rate. Etx_ff includes a hysteresis mechanism to suppress small fluctuations of the LQ and NLQ values. If no packets are received from a certain neighbor at all, a timer begins to lower the calculated LQ value until the next packet is received or the link is dropped. Etx_ff uses only integer arithmetic, so it performs well on embedded hardware having no FPU. The message format of etx_ff is compatible with etx_fpm and etx_float. LinkQuality-Algorithm "etx_ffeth" -------------------------------- "Etx_ffeth" is an experimental and INCOMPATIBLE extension of etx_ff (meaning it is not interoperable with etx_ff nodes). The problem with etx_ff, etx_float and etx_fpm is that they calculate Ethernet links with the same cost as a wireless link without packet loss (ETX=1.0) because the encoding of etx_ff cannot encode link costs lower than 1.0. This means OLSRd prefers a single wireless link with some loss (e.g. ETX=1.5) over a two hop route with one Ethernet link (ETX=1.0) and one perfect wireless link (ETX=1.0) *even though* the 2 hop path would be better! "Etx_ffeth" tries to work around this problem by introducing a special LQ encoding value ETX=0.1, which is only used for Ethernet links without packet loss. Because of the different encoding, etx_ffeth is not compatible with etx_ff, etx_fpm or etx_float. These three implementations detect etx_ffeth nodes with LQ 0 (ETX infinite). etx_ffeth uses only integer arithmetic, so it performs well on embedded hardware. All Ethernet interfaces must be marked with "mode ether" (see olsrd.conf.default.full) in their interface configuration to get any useful advantage of etxff_eth. At the time of this writing, etx_ffeth is the preferred metric for building new mesh networks which include links over LAN cables (such as daisy chained Linksys routers). Legacy LinkQuality-Algorithm "etx_float" ---------------------------------------- "Etx_float" calculates the ETX value by using exponential aging (with a configurable aging parameter) on the incoming (or lost) Hellos. It is easier to understand than etx_ff, but the results are not as good as with etx_ff, since it cannot use the TC messages for link quality calculation. Etx_float uses floating point math, so it might use more CPU on embedded hardware. The message format of etx_float is compatible with etx_fpm and etx_ff. Legacy LinkQuality-Algorithm "etx_fpm" -------------------------------------- "Etx_fpm" is a fixed point math implementation of etx_float. It calculates the same link qualities as etx_float, but is much faster on embedded hardware. The message format of etx_fpm is compatible with etx_float and etx_ff. Building your own LinkQuality Algorithm ---------------------------------------- With the supplied samples OLSRd can be easily extended to support different metrics. Please take a look at src/lq_plugin*.[ch] for inspiration and get in contact with us on the OLSR development mailing list in case you plan to implement a new metric. 3.) Fisheye ******************* Normally OLSR floods all topology control (TC) messages to all routes in the mesh, which can create a lot of overhead for large meshes with hundreds of routers. Reducing the rate of TCs can reduce this overhead, but delay route changes and correction of errors in the routing tables. The Fisheye (sometimes called Hazy Sighted Link State Routing [1]) mechanism implements a strategy to reach a compromise between these two problems. When activated only every 8th TC is send to all mesh nodes. Most TCs are given a reduced TTL (time to live) and are only transmitted to the neighborhood of the router. The current sequence of TTLs with active Fisheye mechanism is 2, 8, 2, 16, 2, 8, 2 and 255 (maximum TTL). The problem with Fisheye is that it introduces artificial borders for flooding TCs, which can theoretically lead to inconsistent routes and routing loops at the border of the Fisheye circles. In practice Fisheye seems to work well enough that it is a mandatory feature for most larger Funkfeuer/Freifunk meshes. 4.) NIIT (ipv4 over ipv6 traffic) ***************************************** (see https://dev.dd19.de/cgi-bin/gitweb.cgi?p=niit.git;a=summary) NIIT is a special Linux kernel device that allows easy transmission of IPv4 unicast traffic through an IPv6 network. Since version 0.6.0 OLSRd has integrated support for NIIT in the routing daemon. So setting up IPv4 traffic over IPv6 OLSR meshes is very easy. Instead of creating routes and tunnels by hand all the administrator of a router needs to do is to, is to set up his own IPv4 targets as "IPv4-mapped" IPv6 HNAs. Example configurations: - connect a local 192.168.1.0/8 net to the mesh HNA6 { 0::ffff:C0A8:01:00 120 } - announce an IPv4 Internet gateway HNA6 { 0::ffff:0:0 96 } More information on NIIT can be found at: http://wiki.freifunk.net/Niit (German) 5.) Smart gateways (asymmetric gateway tunnels) ******************************************************* 5.1) Introduction The smart gateway mechanism was written by Markus Kittenberger and Henning Rogge to allow an OLSR user to directly choose their default Internet gateway instead of relying on the hop by hop decisions on the way to the gateway. OLSRd 0.6.0 can create an IPIP tunnel to the gateway's OLSRd address to side-step the same nasty effects described in the NAT-Threshold section. The smart gateway code can be split into two sections, one is responsible for announcing the existence of a smart gateway uplink and one (on the client nodes) to choose an uplink and create the tunnel to the gateway. The announcing code uses a modified (but backward compatible) special HNA to signal the gateways to the clients. The clients can use a plugin (or the integrated default code) to choose one of the available gateways and change it if necessary. The smart gateway system is setup by several configuration parameters, most of them with a sane default setting. The whole system can be switched on/off by the following parameter: SmartGateway All other parameters will be ignored if SmartGateway is set to "no" (the default is "no"). 5.2) Client Side 1- SmartGatewayUseCount controls the maximum number of gateways that can be in use at any given time. This setting is used to mitigate the effects of breaking connections (due to the selection of a new gateway) on a dynamic network. The default setting is 1. 2- SmartGatewayTakeDownPercentage determines the take-down percentage for a non-current smart gateway tunnel. If the cost of the current smart gateway tunnel is less than this percentage of the cost of the non-current smart gateway tunnel, then the non-current smart gateway tunnel is taken down because it is then presumed to be 'too expensive'. This setting is only relevant when SmartGatewayUseCount is larger than 1; a value of 0 will result in the tunnels not being taken down proactively. The default setting is 0. 3- SmartGatewayPolicyRoutingScript controles the policy routing script that is executed during startup and shutdown of olsrd. The script is only executed when SmartGatewayUseCount is set to a value larger than 1. The script must setup policy routing rules such that multi-gateway mode works. A sample script is included. The default setting is 'not set'. 4- SmartGatewayEgressInterfaces determines the egress interfaces that are part of the multi-gateway setup and therefore only relevant when SmartGatewayUseCount is larger than 1 (in which case it must be explicitly set). The default setting is 'not set'. 5- SmartGatewayMarkOffsetEgress and SmartGatewayMarkOffsetTunnels determine the ranges of policy routing rule markings that are used in a multi-gateway setup. The ranges are not allowed to overlap. Both settings are only relevant when a multi-gateway setup is used. The default settings are 91 and 101 respectively. 6- SmartGatewayAllowNAT controls whether you want to allow the selection of an outgoing ipv4 gateway with NAT (Network Address Translation). The default setting is "yes". 7- SmartGatewayPeriod determines the period (in milliseconds) on which a new smart gateway selection is performed. The default setting is 10000 milliseconds. 8- SmartGatewayStableCount determines the number of times the link state database must be stable before a new smart gateway is selected. The default setting is 6. 9- SmartGatewayThreshold controls whether you want to allow re-selection of a new outgoing gateway if its routing cost is lower or equal to the configured percentage of the routing cost of the current gateway. The default setting is 0, which disables it. 10-SmartGatewayWeightExitLinkUp, SmartGatewayWeightExitLinkDown, SmartGatewayWeightEtx and SmartGatewayDividerEtx control the weighing of gateway bandwidth and ETX costs. If SmartGatewayDividerEtx is zero then no weighing is performed (classical behaviour). Classical behaviour only takes ETX costs into account when choosing a gateway (select the 'nearest' gateway). The weighing also takes the gateway bandwidths into account (select the 'nearest fat pipe' gateway). Gateways that have zero bandwidth for either their uplink or downlink are ignored. * The Weighing Process ====================== ** Configuration Parameters =========================== SmartGatewayWeightExitLinkUp = gateway exit link uplink weight SmartGatewayWeightExitLinkDown = gateway exit link downlink weight SmartGatewayWeightEtx = ETX path cost weight SmartGatewayDividerEtx = ETX path cost divider ** Gateway Parameters =========================== gw->uplink (Mbps) = gateway exit link uplink , in Mbps gw->downlink (Mbps) = gateway exit link downlink, in Mbps ** Weighing Formula =================== SmartGatewayWeightExitLinkUp path_cost_weighed = ---------------------------- + gw->uplink (Mbps) SmartGatewayWeightExitLinkDown ------------------------------ + gw->downlink (Mbps) SmartGatewayWeightEtx ---------------------- * path_cost SmartGatewayDividerEtx ** Recommended Configuration Parameter Settings =============================================== SmartGatewayWeightExitLinkUp = 1 (default is 1) SmartGatewayWeightExitLinkDown = 1 (default is 1) SmartGatewayWeightEtx = 1 (default is 1) SmartGatewayDividerEtx = 4 (default is 0) 5.3) Uplink Side 1- SmartGatewayUplink defines which kind of uplink is exported to the other mesh nodes. The existence of the uplink is detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. The default setting is "both". 2- SmartGatewayUplinkNAT defines if the ipv4 part of the uplink uses NAT. The default of this setting is "yes". 3- SmartGatewaySpeed sets the uplink and downlink speed of the gateway, which could be used by a plugin to choose the right gateway for a client. The default is 128/1024 kbit/s. 4- SmartGatewayPrefix can be used to signal the external IPv6 prefix of the uplink to the clients. This might allow a client to change it's local IPv6 address to use the IPv6 gateway without any kind of address translation. The maximum prefix length is 64 bits, the default is ::/0 (no prefix). 5- SmartGatewayAlwaysRemoveServerTunnel can be used to signal that the server tunnel must always be removed on shutdown, irrespective of the interface up/down state during startup. 5.4) Architecture & Notes On the smart gateway server (the OLSR instance announcing 'Internet here!' via HNA 0/0 or similar) the implicit tunl0 interface is used to forward incoming packets originating on smart gateway clients to the Internet route. This may be protected by the sysctl rp_filter setting. Note, that at least with RedHat kernel 2.6.18, the net.ipv4.conf.tunl0.rp_filter sysctl file is not present after loading the "ipip" kernel module, which prevents OLSRd from switching off the filter. As a workaround, add an "ip addr add 0.0.0.0/32 dev tunl0" after the "modprobe ipip" line in your OLSRd startup script. While the smart gateway function does a fine job on stand-alone PCs, system builders should keep in mind the following facts when setting up routing, firewalls and gateways: a) The smart gateway tunnel communicates asymmetrically. An IP packet destined for an Internet server is sent via the IPIP tunnel but returned via the standard OLSRd host route. b) On the smart gateway server, you should double check your firewall rules and rp_filter defaults. While it's normally not possible to simply encapsulate (for example) a "telnet 127.0.0.1" into IPIP and sent that to the smart gateway server, your specific configuration may open up such attack vectors for an intruder. c) Do not forget to open up the firewall for tunl0->Internet traffic and (if required to NAT/MASQUERADE) this communication path. d) While the smart gateway server does not use special routing, the smart gateway client inserts policy routing rules for it's function. By using the default configuration, the OLSRd standard default route is maintained in table 223 and the OLSRd smart gateway default route in table 224. Both tables are examined only, if you do not have a default route in the main table (visible with "ip route ls"). Use "ip route ls table 223" or "ip route ls table 224" for debugging/monitoring. You may also activate the txtinfo plugin and do a "wget -O - http://localhost:2006/gateway". e) For a standalone client (a notebook user running OLSRd in order to browse) the lowered IPIP tunnel MTU is no problem. If you do proxy routing, e.g. for attached LAN clients without OLSRd, you may want MSS-clamping for the tunnel interface created by OLSRd. Because OLSRd uses an arbitrary name for the tunnel interface (e.g. tnl_7c41c668) you may want to include a wildcard iptables rule. Example: iptables -A FORWARD -o tnl_+ -p tcp --tcp-flags SYN,RST SYN \ -j TCPMSS --clamp-mss-to-pmtu Furthermore (or alternatively) you might consider (on your gateway nodes) clamping all traffic leaving your mesh to your ipip mtu (regardless if the traffic comes out of the smart gateway tunnel or not!). Example: iptables -A FORWARD -o [your_gateway_interface] -p tcp \ --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1480 Especially as during OLSRd startup, before an smart gateway is chosen (which is delayed), new connections would use a larger MSS than the smart gateway tunnel can handle. So the approach to clamp on the gateways should give better results. But if you don't NAT on your gateways (but want to use smart gateway for some special reason), you would have to do this on ALL gateways (even on gateways that do not provide the smart gateway functionality!). 6.) NatThreshold ************************ The NatThreshold option was introduced by Sven Ola to suppress a very annoying problem with OLSRd, switching default gateways. If a router is located between two Internet gateways with similar path costs the default route (0.0.0.0/0) will constantly switch between the two gateways due to normal fluctuations of the link metrics. Whenever OLSRd decides that the other NAT gateway is "better", then switching to this new gateway will result in termination of all connected sessions (TCP and HTTP). The user experience will be rather painful and users will experience hanging SSH and HTTP sessions (or anything using TCP). NatThreshold tries to help by introducing a hysteresis factor for choosing the route to the default gateway. Only if the new gateway has a lower cost than the current gateways path cost multiplied by NatThreshold the node will switch the gateway. In short: if (cost(new_gateway) < cost(current_gw)*NatThreshold)) { switch_gateway(); } Practical experience shows that this leads to much better quality of default gateway selection, even if (in theory) a small NatThreshold together with Fisheye can lead to persistent routing loops. Please note that even with NatThreshold enabled, some users will still experience gateway switching. However, most users will not. Smart Gateways can replace NatThreshold all together because they allow sending traffic directly to a gateway circumventing the problems described above which stem from a hop-by-hop routing approach 7.) References ************************ [0] MIC Metric: "Designing Routing Metrics for Mesh Networks", Yaling Yang, Jun Wang, Robin Kravets http://www.cs.ucdavis.edu/~prasant/WIMESH/p6.pdf [1] "Making link-state routing scale for ad hoc networks", Cesar A. Santivanez, Ram Ramanathan, Ioannis Stavrakakis http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.16.5940 olsrd-0.6.6.2/android/000077500000000000000000000000001234304727700144375ustar00rootroot00000000000000olsrd-0.6.6.2/android/README000066400000000000000000000024451234304727700153240ustar00rootroot00000000000000 This directory contains some Android specific code. (Mostly dealing with providing missing filesfrom Android NDK.) * regex support was not added until NDK platform android-8 (v2.2) Building olsrd for Android -------------------------- In order to build olsrd and the plugins for Android, you will need to download the free (as in beer, and mostly as in speech) Android NDK. NDK r8b or later is the best to have. Almost everything can be built with NDK r6 or maybe earlier. The pud plugin requires NDK r8. http://developer.android.com/sdk/ndk/index.html Once you have that installed, run this in your terminal: make OS=android NDK_BASE=/path/to/your/android-ndk-r8b build_all Then you can find olsrd in the root, and the plugin files in lib/*/*.so* If using NDK older than r8, you will need to set the NDK_COMPILER_VERSION to 4.4.3 since the default compilter version, 4.6, was not included until NDK r8b. Here's how: make OS=android NDK_BASE=/path/to/your/android-ndk-r7 \ NDK_COMPILER_VERSION=4.4.3 build_all Android App ----------- As part of the Commotion project, there is an Android app being developed to make it easy to install and run OLSR mesh networking on Android devices. This app is called Commotion Mesh Tether: https://code.commotionwireless.net/projects/commotion-android olsrd-0.6.6.2/android/arch/000077500000000000000000000000001234304727700153545ustar00rootroot00000000000000olsrd-0.6.6.2/android/arch/syslimits.h000066400000000000000000000001071234304727700175630ustar00rootroot00000000000000// A dummy file so that compiling for Android does not throw an error. olsrd-0.6.6.2/android/linux/000077500000000000000000000000001234304727700155765ustar00rootroot00000000000000olsrd-0.6.6.2/android/linux/if_tunnel.h000066400000000000000000000034731234304727700177410ustar00rootroot00000000000000#ifndef _IF_TUNNEL_H_ #define _IF_TUNNEL_H_ #include #include #ifdef __KERNEL__ #include #include #endif /* __KERNEL__ */ #define SIOCGETTUNNEL (SIOCDEVPRIVATE + 0) #define SIOCADDTUNNEL (SIOCDEVPRIVATE + 1) #define SIOCDELTUNNEL (SIOCDEVPRIVATE + 2) #define SIOCCHGTUNNEL (SIOCDEVPRIVATE + 3) #define SIOCGETPRL (SIOCDEVPRIVATE + 4) #define SIOCADDPRL (SIOCDEVPRIVATE + 5) #define SIOCDELPRL (SIOCDEVPRIVATE + 6) #define SIOCCHGPRL (SIOCDEVPRIVATE + 7) #define SIOCGET6RD (SIOCDEVPRIVATE + 8) #define SIOCADD6RD (SIOCDEVPRIVATE + 9) #define SIOCDEL6RD (SIOCDEVPRIVATE + 10) #define SIOCCHG6RD (SIOCDEVPRIVATE + 11) #define GRE_CSUM __cpu_to_be16(0x8000) #define GRE_ROUTING __cpu_to_be16(0x4000) #define GRE_KEY __cpu_to_be16(0x2000) #define GRE_SEQ __cpu_to_be16(0x1000) #define GRE_STRICT __cpu_to_be16(0x0800) #define GRE_REC __cpu_to_be16(0x0700) #define GRE_FLAGS __cpu_to_be16(0x00F8) #define GRE_VERSION __cpu_to_be16(0x0007) struct ip_tunnel_parm { char name[IFNAMSIZ]; int link; __be16 i_flags; __be16 o_flags; __be32 i_key; __be32 o_key; struct iphdr iph; }; /* SIT-mode i_flags */ #define SIT_ISATAP 0x0001 struct ip_tunnel_prl { __be32 addr; __u16 flags; __u16 __reserved; __u32 datalen; __u32 __reserved2; /* data follows */ }; /* PRL flags */ #define PRL_DEFAULT 0x0001 struct ip_tunnel_6rd { struct in6_addr prefix; __be32 relay_prefix; __u16 prefixlen; __u16 relay_prefixlen; }; enum { IFLA_GRE_UNSPEC, IFLA_GRE_LINK, IFLA_GRE_IFLAGS, IFLA_GRE_OFLAGS, IFLA_GRE_IKEY, IFLA_GRE_OKEY, IFLA_GRE_LOCAL, IFLA_GRE_REMOTE, IFLA_GRE_TTL, IFLA_GRE_TOS, IFLA_GRE_PMTUDISC, __IFLA_GRE_MAX, }; #define IFLA_GRE_MAX (__IFLA_GRE_MAX - 1) #endif /* _IF_TUNNEL_H_ */ olsrd-0.6.6.2/android/linux/ip6_tunnel.h000066400000000000000000000021051234304727700200300ustar00rootroot00000000000000#ifndef _IP6_TUNNEL_H #define _IP6_TUNNEL_H #include #define IPV6_TLV_TNL_ENCAP_LIMIT 4 #define IPV6_DEFAULT_TNL_ENCAP_LIMIT 4 /* don't add encapsulation limit if one isn't present in inner packet */ #define IP6_TNL_F_IGN_ENCAP_LIMIT 0x1 /* copy the traffic class field from the inner packet */ #define IP6_TNL_F_USE_ORIG_TCLASS 0x2 /* copy the flowlabel from the inner packet */ #define IP6_TNL_F_USE_ORIG_FLOWLABEL 0x4 /* being used for Mobile IPv6 */ #define IP6_TNL_F_MIP6_DEV 0x8 /* copy DSCP from the outer packet */ #define IP6_TNL_F_RCV_DSCP_COPY 0x10 struct ip6_tnl_parm { char name[IFNAMSIZ]; /* name of tunnel device */ int link; /* ifindex of underlying L2 interface */ __u8 proto; /* tunnel protocol */ __u8 encap_limit; /* encapsulation limit for tunnel */ __u8 hop_limit; /* hop limit for tunnel */ __be32 flowinfo; /* traffic class and flowlabel for tunnel */ __u32 flags; /* tunnel flags */ struct in6_addr laddr; /* local tunnel end-point address */ struct in6_addr raddr; /* remote tunnel end-point address */ }; #endif /* _IP6_TUNNEL_H */ olsrd-0.6.6.2/android/regex.h000066400000000000000000000067661234304727700157410ustar00rootroot00000000000000/* $OpenBSD: regex.h,v 1.6 2003/06/02 19:34:12 millert Exp $ */ /* $NetBSD: regex.h,v 1.4.6.1 1996/06/10 18:57:07 explorer Exp $ */ /*- * Copyright (c) 1992 Henry Spencer. * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Henry Spencer of the University of Toronto. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)regex.h 8.1 (Berkeley) 6/2/93 */ #ifndef _REGEX_H_ #define _REGEX_H_ #include #include /* types */ typedef off_t regoff_t; typedef struct { int re_magic; size_t re_nsub; /* number of parenthesized subexpressions */ const char *re_endp; /* end pointer for REG_PEND */ struct re_guts *re_g; /* none of your business :-) */ } regex_t; typedef struct { regoff_t rm_so; /* start of match */ regoff_t rm_eo; /* end of match */ } regmatch_t; /* regcomp() flags */ #define REG_BASIC 0000 #define REG_EXTENDED 0001 #define REG_ICASE 0002 #define REG_NOSUB 0004 #define REG_NEWLINE 0010 #define REG_NOSPEC 0020 #define REG_PEND 0040 #define REG_DUMP 0200 /* regerror() flags */ #define REG_NOMATCH 1 #define REG_BADPAT 2 #define REG_ECOLLATE 3 #define REG_ECTYPE 4 #define REG_EESCAPE 5 #define REG_ESUBREG 6 #define REG_EBRACK 7 #define REG_EPAREN 8 #define REG_EBRACE 9 #define REG_BADBR 10 #define REG_ERANGE 11 #define REG_ESPACE 12 #define REG_BADRPT 13 #define REG_EMPTY 14 #define REG_ASSERT 15 #define REG_INVARG 16 #define REG_ATOI 255 /* convert name to number (!) */ #define REG_ITOA 0400 /* convert number to name (!) */ /* regexec() flags */ #define REG_NOTBOL 00001 #define REG_NOTEOL 00002 #define REG_STARTEND 00004 #define REG_TRACE 00400 /* tracing of execution */ #define REG_LARGE 01000 /* force large representation */ #define REG_BACKR 02000 /* force use of backref code */ __BEGIN_DECLS int regcomp(regex_t *, const char *, int); size_t regerror(int, const regex_t *, char *, size_t); int regexec(const regex_t *, const char *, size_t, regmatch_t [], int); void regfree(regex_t *); __END_DECLS #endif /* !_REGEX_H_ */ olsrd-0.6.6.2/android/regex/000077500000000000000000000000001234304727700155515ustar00rootroot00000000000000olsrd-0.6.6.2/android/regex/COPYRIGHT000066400000000000000000000052361234304727700170520ustar00rootroot00000000000000$OpenBSD: COPYRIGHT,v 1.3 2003/06/02 20:18:36 millert Exp $ Copyright 1992, 1993, 1994 Henry Spencer. All rights reserved. This software is not subject to any license of the American Telephone and Telegraph Company or of the Regents of the University of California. Permission is granted to anyone to use this software for any purpose on any computer system, and to alter it and redistribute it, subject to the following restrictions: 1. The author is not responsible for the consequences of use of this software, no matter how awful, even if they arise from flaws in it. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. Since few users ever read sources, credits must appear in the documentation. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. Since few users ever read sources, credits must appear in the documentation. 4. This notice may not be removed or altered. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= /*- * Copyright (c) 1994 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)COPYRIGHT 8.1 (Berkeley) 3/16/94 */ olsrd-0.6.6.2/android/regex/Makefile000066400000000000000000000006471234304727700172200ustar00rootroot00000000000000SRC = regcomp.c regerror.c regexec.c regfree.c OBJ = $(SRC:.c=.o) INCLUDES = -I. -I.. CFLAGS := -O2 -D_FORTIFY_SOURCE=2 CFLAGS += -fPIC all: $(REGEX_LIB) .c.o: ifeq ($(VERBOSE),0) @echo "[CC] $<" endif $(MAKECMDPREFIX)$(CC) $(INCLUDES) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ $(REGEX_LIB): $(OBJ) ifeq ($(VERBOSE),0) @echo "[AR] $<" endif $(MAKECMDPREFIX)$(AR) rcs $(REGEX_LIB) $(OBJ) clean: rm -f $(OBJ) $(REGEX_LIB) olsrd-0.6.6.2/android/regex/NOTICE000066400000000000000000000442051234304727700164620ustar00rootroot00000000000000 Copyright (c) 2005-2010, The Android Open Source Project All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of The Android Open Source Project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") Copyright (c) 1995,1996,1999 by Internet Software Consortium. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Portions Copyright (c) 1995 by International Business Machines, Inc. International Business Machines, Inc. (hereinafter called IBM) grants permission under its copyrights to use, copy, modify, and distribute this Software with or without fee, provided that the above copyright notice and all paragraphs of this notice appear in all copies, and that the name of IBM not be used in connection with the marketing of any product incorporating the Software or modifications thereof, without specific, written prior permission. To the extent it has a right to do so, IBM grants an immunity from suit under its patents, if any, for the use, sale or manufacture of products to the extent that such products are used for performing Domain Name System dynamic updates in TCP/IP networks by means of the Software. No immunity is granted for any product per se or for any other function of any product. THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. Copyright (c) 1997, 1998, 1999, 2004 The NetBSD Foundation, Inc. All rights reserved. This code is derived from software contributed to The NetBSD Foundation by Luke Mewburn; and by Jason R. Thorpe. This code is derived from software contributed to The NetBSD Foundation by Christos Zoulas. Copyright (c) 1993 Christopher G. Demetriou Copyright (c) 1983, 1985, 1993 The Regents of the University of California. All rights reserved. Copyright (c) 2000 Ben Harris. Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Copyright (c) 2003 Networks Associates Technology, Inc. All rights reserved. Portions of this software were developed for the FreeBSD Project by Jacques A. Vidrine, Safeport Network Services, and Network Associates Laboratories, the Security Research Division of Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS research program. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Portions Copyright (c) 1993 by Digital Equipment Corporation. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies, and that the name of Digital Equipment Corporation not be used in advertising or publicity pertaining to distribution of the document or software without specific, written prior permission. THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Copyright (c) 1997 Mark Brinicombe All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by Mark Brinicombe 4. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Copyright (c) 1993 Martin Birgmeier All rights reserved. You may redistribute unmodified or modified versions of this source code provided that the above copyright notice and this and the following conditions are retained. This software is provided ``as is'', and comes with no warranties of any kind. I shall in no event be liable for anything that happens to anyone/anything when using this software. Arc4 random number generator for OpenBSD. Copyright 1996 David Mazieres . Modification and redistribution in source and binary forms is permitted provided that due credit is given to the author and the OpenBSD project by leaving this copyright notice intact. Copyright (c) 1999 Kungliga Tekniska Högskolan (Royal Institute of Technology, Stockholm, Sweden). All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of KTH nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ ==================================================== Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. Developed at SunPro, a Sun Microsystems, Inc. business. Permission to use, copy, modify, and distribute this software is freely granted, provided that this notice is preserved. ==================================================== Copyright (c) 1997, 2005 Todd C. Miller Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Copyright (c) 1989, 1993 The Regents of the University of California. All rights reserved. (c) UNIX System Laboratories, Inc. All or some portions of this file are derived from material licensed to the University of California by American Telephone and Telegraph Co. or Unix System Laboratories, Inc. and are reproduced herein with the permission of UNIX System Laboratories, Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Copyright (c) 1995, 1996 Carnegie-Mellon University. All rights reserved. Author: Chris G. Demetriou Permission to use, copy, modify and distribute this software and its documentation is hereby granted, provided that both the copyright notice and this permission notice appear in all copies of the software, derivative works or modified versions, and any portions thereof, and that both notices appear in supporting documentation. CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. Carnegie Mellon requests users of this software to return to Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU School of Computer Science Carnegie Mellon University Pittsburgh PA 15213-3890 any improvements or extensions that they make and grant Carnegie the rights to redistribute these changes. Copyright (c) 1995, 1996 Carnegie-Mellon University. All rights reserved. Author: Chris G. Demetriou Permission to use, copy, modify and distribute this software and its documentation is hereby granted, provided that both the copyright notice and this permission notice appear in all copies of the software, derivative works or modified versions, and any portions thereof, and that both notices appear in supporting documentation. CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. Carnegie Mellon requests users of this software to return to Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU School of Computer Science Carnegie Mellon University Pittsburgh PA 15213-3890 any improvements or extensions that they make and grant Carnegie the rights to redistribute these changes. Copyright (c) 2003 Networks Associates Technology, Inc. All rights reserved. Portions of this software were developed for the FreeBSD Project by Jacques A. Vidrine, Safeport Network Services, and Network Associates Laboratories, the Security Research Division of Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS research program. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. olsrd-0.6.6.2/android/regex/WHATSNEW000066400000000000000000000124241234304727700167370ustar00rootroot00000000000000# $OpenBSD: WHATSNEW,v 1.3 1997/04/28 20:44:56 millert Exp $ # @(#)WHATSNEW 8.3 (Berkeley) 3/18/94 New in alpha3.4: The complex bug alluded to below has been fixed (in a slightly kludgey temporary way that may hurt efficiency a bit; this is another "get it out the door for 4.4" release). The tests at the end of the tests file have accordingly been uncommented. The primary sign of the bug was that something like a?b matching ab matched b rather than ab. (The bug was essentially specific to this exact situation, else it would have shown up earlier.) New in alpha3.3: The definition of word boundaries has been altered slightly, to more closely match the usual programming notion that "_" is an alphabetic. Stuff used for pre-ANSI systems is now in a subdir, and the makefile no longer alludes to it in mysterious ways. The makefile has generally been cleaned up some. Fixes have been made (again!) so that the regression test will run without -DREDEBUG, at the cost of weaker checking. A workaround for a bug in some folks' has been added. And some more things have been added to tests, including a couple right at the end which are commented out because the code currently flunks them (complex bug; fix coming). Plus the usual minor cleanup. New in alpha3.2: Assorted bits of cleanup and portability improvement (the development base is now a BSDI system using GCC instead of an ancient Sun system, and the newer compiler exposed some glitches). Fix for a serious bug that affected REs using many [] (including REG_ICASE REs because of the way they are implemented), *sometimes*, depending on memory-allocation patterns. The header-file prototypes no longer name the parameters, avoiding possible name conflicts. The possibility that some clot has defined CHAR_MIN as (say) `-128' instead of `(-128)' is now handled gracefully. "uchar" is no longer used as an internal type name (too many people have the same idea). Still the same old lousy performance, alas. New in alpha3.1: Basically nothing, this release is just a bookkeeping convenience. Stay tuned. New in alpha3.0: Performance is no better, alas, but some fixes have been made and some functionality has been added. (This is basically the "get it out the door in time for 4.4" release.) One bug fix: regfree() didn't free the main internal structure (how embarrassing). It is now possible to put NULs in either the RE or the target string, using (resp.) a new REG_PEND flag and the old REG_STARTEND flag. The REG_NOSPEC flag to regcomp() makes all characters ordinary, so you can match a literal string easily (this will become more useful when performance improves!). There are now primitives to match beginnings and ends of words, although the syntax is disgusting and so is the implementation. The REG_ATOI debugging interface has changed a bit. And there has been considerable internal cleanup of various kinds. New in alpha2.3: Split change list out of README, and moved flags notes into Makefile. Macro-ized the name of regex(7) in regex(3), since it has to change for 4.4BSD. Cleanup work in engine.c, and some new regression tests to catch tricky cases thereof. New in alpha2.2: Out-of-date manpages updated. Regerror() acquires two small extensions -- REG_ITOA and REG_ATOI -- which avoid debugging kludges in my own test program and might be useful to others for similar purposes. The regression test will now compile (and run) without REDEBUG. The BRE \$ bug is fixed. Most uses of "uchar" are gone; it's all chars now. Char/uchar parameters are now written int/unsigned, to avoid possible portability problems with unpromoted parameters. Some unsigned casts have been introduced to minimize portability problems with shifting into sign bits. New in alpha2.1: Lots of little stuff, cleanup and fixes. The one big thing is that regex.h is now generated, using mkh, rather than being supplied in the distribution; due to circularities in dependencies, you have to build regex.h explicitly by "make h". The two known bugs have been fixed (and the regression test now checks for them), as has a problem with assertions not being suppressed in the absence of REDEBUG. No performance work yet. New in alpha2: Backslash-anything is an ordinary character, not an error (except, of course, for the handful of backslashed metacharacters in BREs), which should reduce script breakage. The regression test checks *where* null strings are supposed to match, and has generally been tightened up somewhat. Small bug fixes in parameter passing (not harmful, but technically errors) and some other areas. Debugging invoked by defining REDEBUG rather than not defining NDEBUG. New in alpha+3: full prototyping for internal routines, using a little helper program, mkh, which extracts prototypes given in stylized comments. More minor cleanup. Buglet fix: it's CHAR_BIT, not CHAR_BITS. Simple pre-screening of input when a literal string is known to be part of the RE; this does wonders for performance. New in alpha+2: minor bits of cleanup. Notably, the number "32" for the word width isn't hardwired into regexec.c any more, the public header file prototypes the functions if __STDC__ is defined, and some small typos in the manpages have been fixed. New in alpha+1: improvements to the manual pages, and an important extension, the REG_STARTEND option to regexec(). olsrd-0.6.6.2/android/regex/cclass.h000066400000000000000000000054041234304727700171750ustar00rootroot00000000000000/* $OpenBSD: cclass.h,v 1.5 2003/06/02 20:18:36 millert Exp $ */ /*- * Copyright (c) 1992, 1993, 1994 Henry Spencer. * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Henry Spencer. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)cclass.h 8.3 (Berkeley) 3/20/94 */ /* character-class table */ static const struct cclass { char *name; char *chars; char *multis; } cclasses[] = { { "alnum", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ 0123456789", ""} , { "alpha", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", ""} , { "blank", " \t", ""} , { "cntrl", "\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\ \25\26\27\30\31\32\33\34\35\36\37\177", ""} , { "digit", "0123456789", ""} , { "graph", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ 0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", ""} , { "lower", "abcdefghijklmnopqrstuvwxyz", ""} , { "print", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ 0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ", ""} , { "punct", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", ""} , { "space", "\t\n\v\f\r ", ""} , { "upper", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", ""} , { "xdigit", "0123456789ABCDEFabcdef", ""} , { NULL, 0, "" } }; olsrd-0.6.6.2/android/regex/cname.h000066400000000000000000000102301234304727700170010ustar00rootroot00000000000000/* $OpenBSD: cname.h,v 1.5 2003/06/02 20:18:36 millert Exp $ */ /*- * Copyright (c) 1992, 1993, 1994 Henry Spencer. * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Henry Spencer. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)cname.h 8.3 (Berkeley) 3/20/94 */ /* character-name table */ static const struct cname { char *name; char code; } cnames[] = { { "NUL", '\0' }, { "SOH", '\001' }, { "STX", '\002' }, { "ETX", '\003' }, { "EOT", '\004' }, { "ENQ", '\005' }, { "ACK", '\006' }, { "BEL", '\007' }, { "alert", '\007' }, { "BS", '\010' }, { "backspace", '\b' }, { "HT", '\011' }, { "tab", '\t' }, { "LF", '\012' }, { "newline", '\n' }, { "VT", '\013' }, { "vertical-tab", '\v' }, { "FF", '\014' }, { "form-feed", '\f' }, { "CR", '\015' }, { "carriage-return", '\r' }, { "SO", '\016' }, { "SI", '\017' }, { "DLE", '\020' }, { "DC1", '\021' }, { "DC2", '\022' }, { "DC3", '\023' }, { "DC4", '\024' }, { "NAK", '\025' }, { "SYN", '\026' }, { "ETB", '\027' }, { "CAN", '\030' }, { "EM", '\031' }, { "SUB", '\032' }, { "ESC", '\033' }, { "IS4", '\034' }, { "FS", '\034' }, { "IS3", '\035' }, { "GS", '\035' }, { "IS2", '\036' }, { "RS", '\036' }, { "IS1", '\037' }, { "US", '\037' }, { "space", ' ' }, { "exclamation-mark", '!' }, { "quotation-mark", '"' }, { "number-sign", '#' }, { "dollar-sign", '$' }, { "percent-sign", '%' }, { "ampersand", '&' }, { "apostrophe", '\'' }, { "left-parenthesis", '(' }, { "right-parenthesis", ')' }, { "asterisk", '*' }, { "plus-sign", '+' }, { "comma", ',' }, { "hyphen", '-' }, { "hyphen-minus", '-' }, { "period", '.' }, { "full-stop", '.' }, { "slash", '/' }, { "solidus", '/' }, { "zero", '0' }, { "one", '1' }, { "two", '2' }, { "three", '3' }, { "four", '4' }, { "five", '5' }, { "six", '6' }, { "seven", '7' }, { "eight", '8' }, { "nine", '9' }, { "colon", ':' }, { "semicolon", ';' }, { "less-than-sign", '<' }, { "equals-sign", '=' }, { "greater-than-sign", '>' }, { "question-mark", '?' }, { "commercial-at", '@' }, { "left-square-bracket", '[' }, { "backslash", '\\' }, { "reverse-solidus", '\\' }, { "right-square-bracket", ']' }, { "circumflex", '^' }, { "circumflex-accent", '^' }, { "underscore", '_' }, { "low-line", '_' }, { "grave-accent", '`' }, { "left-brace", '{' }, { "left-curly-bracket", '{' }, { "vertical-line", '|' }, { "right-brace", '}' }, { "right-curly-bracket", '}' }, { "tilde", '~' }, { "DEL", '\177' }, { NULL, 0 } }; olsrd-0.6.6.2/android/regex/engine.c000066400000000000000000000635521234304727700171750ustar00rootroot00000000000000/* $OpenBSD: engine.c,v 1.15 2005/08/05 13:03:00 espie Exp $ */ /*- * Copyright (c) 1992, 1993, 1994 Henry Spencer. * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Henry Spencer. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)engine.c 8.5 (Berkeley) 3/20/94 */ /* * The matching engine and friends. This file is #included by regexec.c * after suitable #defines of a variety of macros used herein, so that * different state representations can be used without duplicating masses * of code. */ #ifdef SNAMES #define matcher smatcher #define fast sfast #define slow sslow #define dissect sdissect #define backref sbackref #define step sstep #define print sprint #define at sat #define match smat #define nope snope #endif #ifdef LNAMES #define matcher lmatcher #define fast lfast #define slow lslow #define dissect ldissect #define backref lbackref #define step lstep #define print lprint #define at lat #define match lmat #define nope lnope #endif /* another structure passed up and down to avoid zillions of parameters */ struct match { struct re_guts *g; int eflags; regmatch_t *pmatch; /* [nsub+1] (0 element unused) */ char *offp; /* offsets work from here */ char *beginp; /* start of string -- virtual NUL precedes */ char *endp; /* end of string -- virtual NUL here */ char *coldp; /* can be no match starting before here */ char **lastpos; /* [nplus+1] */ STATEVARS; states st; /* current states */ states fresh; /* states for a fresh start */ states tmp; /* temporary */ states empty; /* empty set of states */ }; static int matcher(struct re_guts *, char *, size_t, regmatch_t[], int); static char *dissect(struct match *, char *, char *, sopno, sopno); static char *backref(struct match *, char *, char *, sopno, sopno, sopno, int); static char *fast(struct match *, char *, char *, sopno, sopno); static char *slow(struct match *, char *, char *, sopno, sopno); static states step(struct re_guts *, sopno, sopno, states, int, states); #define MAX_RECURSION 100 #define BOL (OUT+1) #define EOL (BOL+1) #define BOLEOL (BOL+2) #define NOTHING (BOL+3) #define BOW (BOL+4) #define EOW (BOL+5) #define CODEMAX (BOL+5) /* highest code used */ #define NONCHAR(c) ((c) > CHAR_MAX) #define NNONCHAR (CODEMAX-CHAR_MAX) #ifdef REDEBUG static void print(struct match *, char *, states, int, FILE *); #endif #ifdef REDEBUG static void at(struct match *, char *, char *, char *, sopno, sopno); #endif #ifdef REDEBUG static char *pchar(int); #endif #ifdef REDEBUG #define SP(t, s, c) print(m, t, s, c, stdout) #define AT(t, p1, p2, s1, s2) at(m, t, p1, p2, s1, s2) #define NOTE(str) { if (m->eflags®_TRACE) (void)printf("=%s\n", (str)); } static int nope = 0; #else #define SP(t, s, c) /* nothing */ #define AT(t, p1, p2, s1, s2) /* nothing */ #define NOTE(s) /* nothing */ #endif /* - matcher - the actual matching engine */ static int /* 0 success, REG_NOMATCH failure */ matcher(struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[], int eflags) { char *endp; int i; struct match mv; struct match *m = &mv; char *dp; const sopno gf = g->firststate+1; /* +1 for OEND */ const sopno gl = g->laststate; char *start; char *stop; /* simplify the situation where possible */ if (g->cflags®_NOSUB) nmatch = 0; if (eflags®_STARTEND) { start = string + pmatch[0].rm_so; stop = string + pmatch[0].rm_eo; } else { start = string; stop = start + strlen(start); } if (stop < start) return(REG_INVARG); /* prescreening; this does wonders for this rather slow code */ if (g->must != NULL) { for (dp = start; dp < stop; dp++) if (*dp == g->must[0] && stop - dp >= g->mlen && memcmp(dp, g->must, (size_t)g->mlen) == 0) break; if (dp == stop) /* we didn't find g->must */ return(REG_NOMATCH); } /* match struct setup */ m->g = g; m->eflags = eflags; m->pmatch = NULL; m->lastpos = NULL; m->offp = string; m->beginp = start; m->endp = stop; STATESETUP(m, 4); SETUP(m->st); SETUP(m->fresh); SETUP(m->tmp); SETUP(m->empty); CLEAR(m->empty); /* this loop does only one repetition except for backrefs */ for (;;) { endp = fast(m, start, stop, gf, gl); if (endp == NULL) { /* a miss */ free(m->pmatch); free(m->lastpos); STATETEARDOWN(m); return(REG_NOMATCH); } if (nmatch == 0 && !g->backrefs) break; /* no further info needed */ /* where? */ assert(m->coldp != NULL); for (;;) { NOTE("finding start"); endp = slow(m, m->coldp, stop, gf, gl); if (endp != NULL) break; assert(m->coldp < m->endp); m->coldp++; } if (nmatch == 1 && !g->backrefs) break; /* no further info needed */ /* oh my, he wants the subexpressions... */ if (m->pmatch == NULL) m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) * sizeof(regmatch_t)); if (m->pmatch == NULL) { STATETEARDOWN(m); return(REG_ESPACE); } for (i = 1; i <= (int)m->g->nsub; i++) m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1; if (!g->backrefs && !(m->eflags®_BACKR)) { NOTE("dissecting"); dp = dissect(m, m->coldp, endp, gf, gl); } else { if (g->nplus > 0 && m->lastpos == NULL) m->lastpos = (char **)malloc((g->nplus+1) * sizeof(char *)); if (g->nplus > 0 && m->lastpos == NULL) { free(m->pmatch); STATETEARDOWN(m); return(REG_ESPACE); } NOTE("backref dissect"); dp = backref(m, m->coldp, endp, gf, gl, (sopno)0, 0); } if (dp != NULL) break; /* uh-oh... we couldn't find a subexpression-level match */ assert(g->backrefs); /* must be back references doing it */ assert(g->nplus == 0 || m->lastpos != NULL); for (;;) { if (dp != NULL || endp <= m->coldp) break; /* defeat */ NOTE("backoff"); endp = slow(m, m->coldp, endp-1, gf, gl); if (endp == NULL) break; /* defeat */ /* try it on a shorter possibility */ #ifndef NDEBUG for (i = 1; i <= m->g->nsub; i++) { assert(m->pmatch[i].rm_so == -1); assert(m->pmatch[i].rm_eo == -1); } #endif NOTE("backoff dissect"); dp = backref(m, m->coldp, endp, gf, gl, (sopno)0, 0); } assert(dp == NULL || dp == endp); if (dp != NULL) /* found a shorter one */ break; /* despite initial appearances, there is no match here */ NOTE("false alarm"); if (m->coldp == stop) break; start = m->coldp + 1; /* recycle starting later */ } /* fill in the details if requested */ if (nmatch > 0) { pmatch[0].rm_so = m->coldp - m->offp; pmatch[0].rm_eo = endp - m->offp; } if (nmatch > 1) { assert(m->pmatch != NULL); for (i = 1; i < (ssize_t)nmatch; i++) if (i <= (int)m->g->nsub) pmatch[i] = m->pmatch[i]; else { pmatch[i].rm_so = -1; pmatch[i].rm_eo = -1; } } if (m->pmatch != NULL) free((char *)m->pmatch); if (m->lastpos != NULL) free((char *)m->lastpos); STATETEARDOWN(m); return(0); } /* - dissect - figure out what matched what, no back references */ static char * /* == stop (success) always */ dissect(struct match *m, char *start, char *stop, sopno startst, sopno stopst) { int i; sopno ss; /* start sop of current subRE */ sopno es; /* end sop of current subRE */ char *sp; /* start of string matched by it */ char *stp; /* string matched by it cannot pass here */ char *rest; /* start of rest of string */ char *tail; /* string unmatched by rest of RE */ sopno ssub; /* start sop of subsubRE */ sopno esub; /* end sop of subsubRE */ char *ssp; /* start of string matched by subsubRE */ char *sep; /* end of string matched by subsubRE */ char *oldssp; /* previous ssp */ char *dp; AT("diss", start, stop, startst, stopst); sp = start; for (ss = startst; ss < stopst; ss = es) { /* identify end of subRE */ es = ss; switch (OP(m->g->strip[es])) { case OPLUS_: case OQUEST_: es += OPND(m->g->strip[es]); break; case OCH_: while (OP(m->g->strip[es]) != O_CH) es += OPND(m->g->strip[es]); break; } es++; /* figure out what it matched */ switch (OP(m->g->strip[ss])) { case OEND: assert(nope); break; case OCHAR: sp++; break; case OBOL: case OEOL: case OBOW: case OEOW: break; case OANY: case OANYOF: sp++; break; case OBACK_: case O_BACK: assert(nope); break; /* cases where length of match is hard to find */ case OQUEST_: stp = stop; for (;;) { /* how long could this one be? */ rest = slow(m, sp, stp, ss, es); assert(rest != NULL); /* it did match */ /* could the rest match the rest? */ tail = slow(m, rest, stop, es, stopst); if (tail == stop) break; /* yes! */ /* no -- try a shorter match for this one */ stp = rest - 1; assert(stp >= sp); /* it did work */ } ssub = ss + 1; esub = es - 1; /* did innards match? */ if (slow(m, sp, rest, ssub, esub) != NULL) { dp = dissect(m, sp, rest, ssub, esub); assert(dp == rest); } else /* no */ assert(sp == rest); sp = rest; break; case OPLUS_: stp = stop; for (;;) { /* how long could this one be? */ rest = slow(m, sp, stp, ss, es); assert(rest != NULL); /* it did match */ /* could the rest match the rest? */ tail = slow(m, rest, stop, es, stopst); if (tail == stop) break; /* yes! */ /* no -- try a shorter match for this one */ stp = rest - 1; assert(stp >= sp); /* it did work */ } ssub = ss + 1; esub = es - 1; ssp = sp; oldssp = ssp; for (;;) { /* find last match of innards */ sep = slow(m, ssp, rest, ssub, esub); if (sep == NULL || sep == ssp) break; /* failed or matched null */ oldssp = ssp; /* on to next try */ ssp = sep; } if (sep == NULL) { /* last successful match */ sep = ssp; ssp = oldssp; } assert(sep == rest); /* must exhaust substring */ assert(slow(m, ssp, sep, ssub, esub) == rest); dp = dissect(m, ssp, sep, ssub, esub); assert(dp == sep); sp = rest; break; case OCH_: stp = stop; for (;;) { /* how long could this one be? */ rest = slow(m, sp, stp, ss, es); assert(rest != NULL); /* it did match */ /* could the rest match the rest? */ tail = slow(m, rest, stop, es, stopst); if (tail == stop) break; /* yes! */ /* no -- try a shorter match for this one */ stp = rest - 1; assert(stp >= sp); /* it did work */ } ssub = ss + 1; esub = ss + OPND(m->g->strip[ss]) - 1; assert(OP(m->g->strip[esub]) == OOR1); for (;;) { /* find first matching branch */ if (slow(m, sp, rest, ssub, esub) == rest) break; /* it matched all of it */ /* that one missed, try next one */ assert(OP(m->g->strip[esub]) == OOR1); esub++; assert(OP(m->g->strip[esub]) == OOR2); ssub = esub + 1; esub += OPND(m->g->strip[esub]); if (OP(m->g->strip[esub]) == OOR2) esub--; else assert(OP(m->g->strip[esub]) == O_CH); } dp = dissect(m, sp, rest, ssub, esub); assert(dp == rest); sp = rest; break; case O_PLUS: case O_QUEST: case OOR1: case OOR2: case O_CH: assert(nope); break; case OLPAREN: i = OPND(m->g->strip[ss]); assert(0 < i && i <= m->g->nsub); m->pmatch[i].rm_so = sp - m->offp; break; case ORPAREN: i = OPND(m->g->strip[ss]); assert(0 < i && i <= m->g->nsub); m->pmatch[i].rm_eo = sp - m->offp; break; default: /* uh oh */ assert(nope); break; } } assert(sp == stop); return(sp); } /* - backref - figure out what matched what, figuring in back references */ static char * /* == stop (success) or NULL (failure) */ backref(struct match *m, char *start, char *stop, sopno startst, sopno stopst, sopno lev, int rec) /* PLUS nesting level */ { int i; sopno ss; /* start sop of current subRE */ char *sp; /* start of string matched by it */ sopno ssub; /* start sop of subsubRE */ sopno esub; /* end sop of subsubRE */ char *ssp; /* start of string matched by subsubRE */ char *dp; size_t len; int hard; sop s; regoff_t offsave; cset *cs; AT("back", start, stop, startst, stopst); sp = start; /* get as far as we can with easy stuff */ hard = 0; for (ss = startst; !hard && ss < stopst; ss++) switch (OP(s = m->g->strip[ss])) { case OCHAR: if (sp == stop || *sp++ != (char)OPND(s)) return(NULL); break; case OANY: if (sp == stop) return(NULL); sp++; break; case OANYOF: cs = &m->g->sets[OPND(s)]; if (sp == stop || !CHIN(cs, *sp++)) return(NULL); break; case OBOL: if ( (sp == m->beginp && !(m->eflags®_NOTBOL)) || (sp < m->endp && *(sp-1) == '\n' && (m->g->cflags®_NEWLINE)) ) { /* yes */ } else return(NULL); break; case OEOL: if ( (sp == m->endp && !(m->eflags®_NOTEOL)) || (sp < m->endp && *sp == '\n' && (m->g->cflags®_NEWLINE)) ) { /* yes */ } else return(NULL); break; case OBOW: if (( (sp == m->beginp && !(m->eflags®_NOTBOL)) || (sp < m->endp && *(sp-1) == '\n' && (m->g->cflags®_NEWLINE)) || (sp > m->beginp && !ISWORD(*(sp-1))) ) && (sp < m->endp && ISWORD(*sp)) ) { /* yes */ } else return(NULL); break; case OEOW: if (( (sp == m->endp && !(m->eflags®_NOTEOL)) || (sp < m->endp && *sp == '\n' && (m->g->cflags®_NEWLINE)) || (sp < m->endp && !ISWORD(*sp)) ) && (sp > m->beginp && ISWORD(*(sp-1))) ) { /* yes */ } else return(NULL); break; case O_QUEST: break; case OOR1: /* matches null but needs to skip */ ss++; s = m->g->strip[ss]; do { assert(OP(s) == OOR2); ss += OPND(s); } while (OP(s = m->g->strip[ss]) != O_CH); /* note that the ss++ gets us past the O_CH */ break; default: /* have to make a choice */ hard = 1; break; } if (!hard) { /* that was it! */ if (sp != stop) return(NULL); return(sp); } ss--; /* adjust for the for's final increment */ /* the hard stuff */ AT("hard", sp, stop, ss, stopst); s = m->g->strip[ss]; switch (OP(s)) { case OBACK_: /* the vilest depths */ i = OPND(s); assert(0 < i && i <= m->g->nsub); if (m->pmatch[i].rm_eo == -1) return(NULL); assert(m->pmatch[i].rm_so != -1); len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so; if (len == 0 && rec++ > MAX_RECURSION) return(NULL); assert(stop - m->beginp >= len); if (sp > stop - len) return(NULL); /* not enough left to match */ ssp = m->offp + m->pmatch[i].rm_so; if (memcmp(sp, ssp, len) != 0) return(NULL); while (m->g->strip[ss] != SOP(O_BACK, i)) ss++; return(backref(m, sp+len, stop, ss+1, stopst, lev, rec)); break; case OQUEST_: /* to null or not */ dp = backref(m, sp, stop, ss+1, stopst, lev, rec); if (dp != NULL) return(dp); /* not */ return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev, rec)); break; case OPLUS_: assert(m->lastpos != NULL); assert(lev+1 <= m->g->nplus); m->lastpos[lev+1] = sp; return(backref(m, sp, stop, ss+1, stopst, lev+1, rec)); break; case O_PLUS: if (sp == m->lastpos[lev]) /* last pass matched null */ return(backref(m, sp, stop, ss+1, stopst, lev-1, rec)); /* try another pass */ m->lastpos[lev] = sp; dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev, rec); if (dp == NULL) return(backref(m, sp, stop, ss+1, stopst, lev-1, rec)); else return(dp); break; case OCH_: /* find the right one, if any */ ssub = ss + 1; esub = ss + OPND(s) - 1; assert(OP(m->g->strip[esub]) == OOR1); for (;;) { /* find first matching branch */ dp = backref(m, sp, stop, ssub, esub, lev, rec); if (dp != NULL) return(dp); /* that one missed, try next one */ if (OP(m->g->strip[esub]) == O_CH) return(NULL); /* there is none */ esub++; assert(OP(m->g->strip[esub]) == OOR2); ssub = esub + 1; esub += OPND(m->g->strip[esub]); if (OP(m->g->strip[esub]) == OOR2) esub--; else assert(OP(m->g->strip[esub]) == O_CH); } break; case OLPAREN: /* must undo assignment if rest fails */ i = OPND(s); assert(0 < i && i <= m->g->nsub); offsave = m->pmatch[i].rm_so; m->pmatch[i].rm_so = sp - m->offp; dp = backref(m, sp, stop, ss+1, stopst, lev, rec); if (dp != NULL) return(dp); m->pmatch[i].rm_so = offsave; return(NULL); break; case ORPAREN: /* must undo assignment if rest fails */ i = OPND(s); assert(0 < i && i <= m->g->nsub); offsave = m->pmatch[i].rm_eo; m->pmatch[i].rm_eo = sp - m->offp; dp = backref(m, sp, stop, ss+1, stopst, lev, rec); if (dp != NULL) return(dp); m->pmatch[i].rm_eo = offsave; return(NULL); break; default: /* uh oh */ assert(nope); break; } /* "can't happen" */ assert(nope); /* NOTREACHED */ return 0; } /* - fast - step through the string at top speed */ static char * /* where tentative match ended, or NULL */ fast(struct match *m, char *start, char *stop, sopno startst, sopno stopst) { states st = m->st; states fresh = m->fresh; states tmp = m->tmp; char *p = start; int c = (start == m->beginp) ? OUT : *(start-1); int lastc; /* previous c */ int flagch; int i; char *coldp; /* last p after which no match was underway */ CLEAR(st); SET1(st, startst); st = step(m->g, startst, stopst, st, NOTHING, st); ASSIGN(fresh, st); SP("start", st, *p); coldp = NULL; for (;;) { /* next character */ lastc = c; c = (p == m->endp) ? OUT : *p; if (EQ(st, fresh)) coldp = p; /* is there an EOL and/or BOL between lastc and c? */ flagch = '\0'; i = 0; if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || (lastc == OUT && !(m->eflags®_NOTBOL)) ) { flagch = BOL; i = m->g->nbol; } if ( (c == '\n' && m->g->cflags®_NEWLINE) || (c == OUT && !(m->eflags®_NOTEOL)) ) { flagch = (flagch == BOL) ? BOLEOL : EOL; i += m->g->neol; } if (i != 0) { for (; i > 0; i--) st = step(m->g, startst, stopst, st, flagch, st); SP("boleol", st, c); } /* how about a word boundary? */ if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && (c != OUT && ISWORD(c)) ) { flagch = BOW; } if ( (lastc != OUT && ISWORD(lastc)) && (flagch == EOL || (c != OUT && !ISWORD(c))) ) { flagch = EOW; } if (flagch == BOW || flagch == EOW) { st = step(m->g, startst, stopst, st, flagch, st); SP("boweow", st, c); } /* are we done? */ if (ISSET(st, stopst) || p == stop) break; /* NOTE BREAK OUT */ /* no, we must deal with this character */ ASSIGN(tmp, st); ASSIGN(st, fresh); assert(c != OUT); st = step(m->g, startst, stopst, tmp, c, st); SP("aft", st, c); assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); p++; } assert(coldp != NULL); m->coldp = coldp; if (ISSET(st, stopst)) return(p+1); else return(NULL); } /* - slow - step through the string more deliberately */ static char * /* where it ended */ slow(struct match *m, char *start, char *stop, sopno startst, sopno stopst) { states st = m->st; states empty = m->empty; states tmp = m->tmp; char *p = start; int c = (start == m->beginp) ? OUT : *(start-1); int lastc; /* previous c */ int flagch; int i; char *matchp; /* last p at which a match ended */ AT("slow", start, stop, startst, stopst); CLEAR(st); SET1(st, startst); SP("sstart", st, *p); st = step(m->g, startst, stopst, st, NOTHING, st); matchp = NULL; for (;;) { /* next character */ lastc = c; c = (p == m->endp) ? OUT : *p; /* is there an EOL and/or BOL between lastc and c? */ flagch = '\0'; i = 0; if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || (lastc == OUT && !(m->eflags®_NOTBOL)) ) { flagch = BOL; i = m->g->nbol; } if ( (c == '\n' && m->g->cflags®_NEWLINE) || (c == OUT && !(m->eflags®_NOTEOL)) ) { flagch = (flagch == BOL) ? BOLEOL : EOL; i += m->g->neol; } if (i != 0) { for (; i > 0; i--) st = step(m->g, startst, stopst, st, flagch, st); SP("sboleol", st, c); } /* how about a word boundary? */ if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && (c != OUT && ISWORD(c)) ) { flagch = BOW; } if ( (lastc != OUT && ISWORD(lastc)) && (flagch == EOL || (c != OUT && !ISWORD(c))) ) { flagch = EOW; } if (flagch == BOW || flagch == EOW) { st = step(m->g, startst, stopst, st, flagch, st); SP("sboweow", st, c); } /* are we done? */ if (ISSET(st, stopst)) matchp = p; if (EQ(st, empty) || p == stop) break; /* NOTE BREAK OUT */ /* no, we must deal with this character */ ASSIGN(tmp, st); ASSIGN(st, empty); assert(c != OUT); st = step(m->g, startst, stopst, tmp, c, st); SP("saft", st, c); assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); p++; } return(matchp); } /* - step - map set of states reachable before char to set reachable after */ static states step(struct re_guts *g, sopno start, /* start state within strip */ sopno stop, /* state after stop state within strip */ states bef, /* states reachable before */ int ch, /* character or NONCHAR code */ states aft) /* states already known reachable after */ { cset *cs; sop s; sopno pc; onestate here; /* note, macros know this name */ sopno look; int i; for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) { s = g->strip[pc]; switch (OP(s)) { case OEND: assert(pc == stop-1); break; case OCHAR: /* only characters can match */ assert(!NONCHAR(ch) || ch != (char)OPND(s)); if (ch == (char)OPND(s)) FWD(aft, bef, 1); break; case OBOL: if (ch == BOL || ch == BOLEOL) FWD(aft, bef, 1); break; case OEOL: if (ch == EOL || ch == BOLEOL) FWD(aft, bef, 1); break; case OBOW: if (ch == BOW) FWD(aft, bef, 1); break; case OEOW: if (ch == EOW) FWD(aft, bef, 1); break; case OANY: if (!NONCHAR(ch)) FWD(aft, bef, 1); break; case OANYOF: cs = &g->sets[OPND(s)]; if (!NONCHAR(ch) && CHIN(cs, ch)) FWD(aft, bef, 1); break; case OBACK_: /* ignored here */ case O_BACK: FWD(aft, aft, 1); break; case OPLUS_: /* forward, this is just an empty */ FWD(aft, aft, 1); break; case O_PLUS: /* both forward and back */ FWD(aft, aft, 1); i = ISSETBACK(aft, OPND(s)); BACK(aft, aft, OPND(s)); if (!i && ISSETBACK(aft, OPND(s))) { /* oho, must reconsider loop body */ pc -= OPND(s) + 1; INIT(here, pc); } break; case OQUEST_: /* two branches, both forward */ FWD(aft, aft, 1); FWD(aft, aft, OPND(s)); break; case O_QUEST: /* just an empty */ FWD(aft, aft, 1); break; case OLPAREN: /* not significant here */ case ORPAREN: FWD(aft, aft, 1); break; case OCH_: /* mark the first two branches */ FWD(aft, aft, 1); assert(OP(g->strip[pc+OPND(s)]) == OOR2); FWD(aft, aft, OPND(s)); break; case OOR1: /* done a branch, find the O_CH */ if (ISSTATEIN(aft, here)) { for (look = 1; OP(s = g->strip[pc+look]) != O_CH; look += OPND(s)) assert(OP(s) == OOR2); FWD(aft, aft, look); } break; case OOR2: /* propagate OCH_'s marking */ FWD(aft, aft, 1); if (OP(g->strip[pc+OPND(s)]) != O_CH) { assert(OP(g->strip[pc+OPND(s)]) == OOR2); FWD(aft, aft, OPND(s)); } break; case O_CH: /* just empty */ FWD(aft, aft, 1); break; default: /* ooooops... */ assert(nope); break; } } return(aft); } #ifdef REDEBUG /* - print - print a set of states */ static void print(struct match *m, char *caption, states st, int ch, FILE *d) { struct re_guts *g = m->g; int i; int first = 1; if (!(m->eflags®_TRACE)) return; (void)fprintf(d, "%s", caption); if (ch != '\0') (void)fprintf(d, " %s", pchar(ch)); for (i = 0; i < g->nstates; i++) if (ISSET(st, i)) { (void)fprintf(d, "%s%d", (first) ? "\t" : ", ", i); first = 0; } (void)fprintf(d, "\n"); } /* - at - print current situation */ static void at(struct match *m, char *title, char *start, char *stop, sopno startst, sopno stopst) { if (!(m->eflags®_TRACE)) return; (void)printf("%s %s-", title, pchar(*start)); (void)printf("%s ", pchar(*stop)); (void)printf("%ld-%ld\n", (long)startst, (long)stopst); } #ifndef PCHARDONE #define PCHARDONE /* never again */ /* - pchar - make a character printable * * Is this identical to regchar() over in debug.c? Well, yes. But a * duplicate here avoids having a debugging-capable regexec.o tied to * a matching debug.o, and this is convenient. It all disappears in * the non-debug compilation anyway, so it doesn't matter much. */ static char * /* -> representation */ pchar(int ch) { static char pbuf[10]; if (isprint(ch) || ch == ' ') (void)snprintf(pbuf, sizeof pbuf, "%c", ch); else (void)snprintf(pbuf, sizeof pbuf, "\\%o", ch); return(pbuf); } #endif #endif #undef matcher #undef fast #undef slow #undef dissect #undef backref #undef step #undef print #undef at #undef match #undef nope olsrd-0.6.6.2/android/regex/regcomp.c000066400000000000000000001052211234304727700173520ustar00rootroot00000000000000/* $OpenBSD: regcomp.c,v 1.19 2008/02/23 08:13:07 otto Exp $ */ /*- * Copyright (c) 1992, 1993, 1994 Henry Spencer. * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Henry Spencer. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)regcomp.c 8.5 (Berkeley) 3/20/94 */ #include #include #include #include #include #include #include #include "utils.h" #include "regex2.h" #include "cclass.h" #include "cname.h" /* * parse structure, passed up and down to avoid global variables and * other clumsinesses */ struct parse { char *next; /* next character in RE */ char *end; /* end of string (-> NUL normally) */ int error; /* has an error been seen? */ sop *strip; /* malloced strip */ sopno ssize; /* malloced strip size (allocated) */ sopno slen; /* malloced strip length (used) */ int ncsalloc; /* number of csets allocated */ struct re_guts *g; # define NPAREN 10 /* we need to remember () 1-9 for back refs */ sopno pbegin[NPAREN]; /* -> ( ([0] unused) */ sopno pend[NPAREN]; /* -> ) ([0] unused) */ }; static void p_ere(struct parse *, int); static void p_ere_exp(struct parse *); static void p_str(struct parse *); static void p_bre(struct parse *, int, int); static int p_simp_re(struct parse *, int); static int p_count(struct parse *); static void p_bracket(struct parse *); static void p_b_term(struct parse *, cset *); static void p_b_cclass(struct parse *, cset *); static void p_b_eclass(struct parse *, cset *); static char p_b_symbol(struct parse *); static char p_b_coll_elem(struct parse *, int); static char othercase(int); static void bothcases(struct parse *, int); static void ordinary(struct parse *, int); static void nonnewline(struct parse *); static void repeat(struct parse *, sopno, int, int); static int seterr(struct parse *, int); static cset *allocset(struct parse *); static void freeset(struct parse *, cset *); static int freezeset(struct parse *, cset *); static int firstch(struct parse *, cset *); static int nch(struct parse *, cset *); static void mcadd(struct parse *, cset *, char *); static void mcinvert(struct parse *, cset *); static void mccase(struct parse *, cset *); static int isinsets(struct re_guts *, int); static int samesets(struct re_guts *, int, int); static void categorize(struct parse *, struct re_guts *); static sopno dupl(struct parse *, sopno, sopno); static void doemit(struct parse *, sop, size_t); static void doinsert(struct parse *, sop, size_t, sopno); static void dofwd(struct parse *, sopno, sop); static void enlarge(struct parse *, sopno); static void stripsnug(struct parse *, struct re_guts *); static void findmust(struct parse *, struct re_guts *); static sopno pluscount(struct parse *, struct re_guts *); static char nuls[10]; /* place to point scanner in event of error */ /* * macros for use with parse structure * BEWARE: these know that the parse structure is named `p' !!! */ #define PEEK() (*p->next) #define PEEK2() (*(p->next+1)) #define MORE() (p->next < p->end) #define MORE2() (p->next+1 < p->end) #define SEE(c) (MORE() && PEEK() == (c)) #define SEETWO(a, b) (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b)) #define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0) #define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0) #define NEXT() (p->next++) #define NEXT2() (p->next += 2) #define NEXTn(n) (p->next += (n)) #define GETNEXT() (*p->next++) #define SETERROR(e) seterr(p, (e)) #define REQUIRE(co, e) ((co) || SETERROR(e)) #define MUSTSEE(c, e) (REQUIRE(MORE() && PEEK() == (c), e)) #define MUSTEAT(c, e) (REQUIRE(MORE() && GETNEXT() == (c), e)) #define MUSTNOTSEE(c, e) (REQUIRE(!MORE() || PEEK() != (c), e)) #define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd)) #define INSERT(op, pos) doinsert(p, (sop)(op), HERE()-(pos)+1, pos) #define AHEAD(pos) dofwd(p, pos, HERE()-(pos)) #define ASTERN(sop, pos) EMIT(sop, HERE()-pos) #define HERE() (p->slen) #define THERE() (p->slen - 1) #define THERETHERE() (p->slen - 2) #define DROP(n) (p->slen -= (n)) #ifndef NDEBUG static int never = 0; /* for use in asserts; shuts lint up */ #else #define never 0 /* some s have bugs too */ #endif /* - regcomp - interface for parser and compilation */ int /* 0 success, otherwise REG_something */ regcomp(regex_t *preg, const char *pattern, int cflags) { struct parse pa; struct re_guts *g; struct parse *p = &pa; int i; size_t len; #ifdef REDEBUG # define GOODFLAGS(f) (f) #else # define GOODFLAGS(f) ((f)&~REG_DUMP) #endif cflags = GOODFLAGS(cflags); if ((cflags®_EXTENDED) && (cflags®_NOSPEC)) return(REG_INVARG); if (cflags®_PEND) { if (preg->re_endp < pattern) return(REG_INVARG); len = preg->re_endp - pattern; } else len = strlen((char *)pattern); /* do the mallocs early so failure handling is easy */ g = (struct re_guts *)malloc(sizeof(struct re_guts) + (NC-1)*sizeof(cat_t)); if (g == NULL) return(REG_ESPACE); p->ssize = len/(size_t)2*(size_t)3 + (size_t)1; /* ugh */ p->strip = (sop *)calloc(p->ssize, sizeof(sop)); p->slen = 0; if (p->strip == NULL) { free((char *)g); return(REG_ESPACE); } /* set things up */ p->g = g; p->next = (char *)pattern; /* convenience; we do not modify it */ p->end = p->next + len; p->error = 0; p->ncsalloc = 0; for (i = 0; i < NPAREN; i++) { p->pbegin[i] = 0; p->pend[i] = 0; } g->csetsize = NC; g->sets = NULL; g->setbits = NULL; g->ncsets = 0; g->cflags = cflags; g->iflags = 0; g->nbol = 0; g->neol = 0; g->must = NULL; g->mlen = 0; g->nsub = 0; g->ncategories = 1; /* category 0 is "everything else" */ g->categories = &g->catspace[-(CHAR_MIN)]; (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t)); g->backrefs = 0; /* do it */ EMIT(OEND, 0); g->firststate = THERE(); if (cflags®_EXTENDED) p_ere(p, OUT); else if (cflags®_NOSPEC) p_str(p); else p_bre(p, OUT, OUT); EMIT(OEND, 0); g->laststate = THERE(); /* tidy up loose ends and fill things in */ categorize(p, g); stripsnug(p, g); findmust(p, g); g->nplus = pluscount(p, g); g->magic = MAGIC2; preg->re_nsub = g->nsub; preg->re_g = g; preg->re_magic = MAGIC1; #ifndef REDEBUG /* not debugging, so can't rely on the assert() in regexec() */ if (g->iflags&BAD) SETERROR(REG_ASSERT); #endif /* win or lose, we're done */ if (p->error != 0) /* lose */ regfree(preg); return(p->error); } /* - p_ere - ERE parser top level, concatenation and alternation */ static void p_ere(struct parse *p, int stop) /* character this ERE should end at */ { char c; sopno prevback = 0; sopno prevfwd = 0; sopno conc; int first = 1; /* is this the first alternative? */ for (;;) { /* do a bunch of concatenated expressions */ conc = HERE(); while (MORE() && (c = PEEK()) != '|' && c != stop) p_ere_exp(p); REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */ if (!EAT('|')) break; /* NOTE BREAK OUT */ if (first) { INSERT(OCH_, conc); /* offset is wrong */ prevfwd = conc; prevback = conc; first = 0; } ASTERN(OOR1, prevback); prevback = THERE(); AHEAD(prevfwd); /* fix previous offset */ prevfwd = HERE(); EMIT(OOR2, 0); /* offset is very wrong */ } if (!first) { /* tail-end fixups */ AHEAD(prevfwd); ASTERN(O_CH, prevback); } assert(!MORE() || SEE(stop)); } /* - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op */ static void p_ere_exp(struct parse *p) { char c; sopno pos; int count; int count2; sopno subno; int wascaret = 0; assert(MORE()); /* caller should have ensured this */ c = GETNEXT(); pos = HERE(); switch (c) { case '(': REQUIRE(MORE(), REG_EPAREN); p->g->nsub++; subno = p->g->nsub; if (subno < NPAREN) p->pbegin[subno] = HERE(); EMIT(OLPAREN, subno); if (!SEE(')')) p_ere(p, ')'); if (subno < NPAREN) { p->pend[subno] = HERE(); assert(p->pend[subno] != 0); } EMIT(ORPAREN, subno); MUSTEAT(')', REG_EPAREN); break; #ifndef POSIX_MISTAKE case ')': /* happens only if no current unmatched ( */ /* * You may ask, why the ifndef? Because I didn't notice * this until slightly too late for 1003.2, and none of the * other 1003.2 regular-expression reviewers noticed it at * all. So an unmatched ) is legal POSIX, at least until * we can get it fixed. */ SETERROR(REG_EPAREN); break; #endif case '^': EMIT(OBOL, 0); p->g->iflags |= USEBOL; p->g->nbol++; wascaret = 1; break; case '$': EMIT(OEOL, 0); p->g->iflags |= USEEOL; p->g->neol++; break; case '|': SETERROR(REG_EMPTY); break; case '*': case '+': case '?': SETERROR(REG_BADRPT); break; case '.': if (p->g->cflags®_NEWLINE) nonnewline(p); else EMIT(OANY, 0); break; case '[': p_bracket(p); break; case '\\': REQUIRE(MORE(), REG_EESCAPE); c = GETNEXT(); ordinary(p, c); break; case '{': /* okay as ordinary except if digit follows */ REQUIRE(!MORE() || !isdigit((uch)PEEK()), REG_BADRPT); /* FALLTHROUGH */ default: ordinary(p, c); break; } if (!MORE()) return; c = PEEK(); /* we call { a repetition if followed by a digit */ if (!( c == '*' || c == '+' || c == '?' || (c == '{' && MORE2() && isdigit((uch)PEEK2())) )) return; /* no repetition, we're done */ NEXT(); REQUIRE(!wascaret, REG_BADRPT); switch (c) { case '*': /* implemented as +? */ /* this case does not require the (y|) trick, noKLUDGE */ INSERT(OPLUS_, pos); ASTERN(O_PLUS, pos); INSERT(OQUEST_, pos); ASTERN(O_QUEST, pos); break; case '+': INSERT(OPLUS_, pos); ASTERN(O_PLUS, pos); break; case '?': /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ INSERT(OCH_, pos); /* offset slightly wrong */ ASTERN(OOR1, pos); /* this one's right */ AHEAD(pos); /* fix the OCH_ */ EMIT(OOR2, 0); /* offset very wrong... */ AHEAD(THERE()); /* ...so fix it */ ASTERN(O_CH, THERETHERE()); break; case '{': count = p_count(p); if (EAT(',')) { if (isdigit((uch)PEEK())) { count2 = p_count(p); REQUIRE(count <= count2, REG_BADBR); } else /* single number with comma */ count2 = INFINITY; } else /* just a single number */ count2 = count; repeat(p, pos, count, count2); if (!EAT('}')) { /* error heuristics */ while (MORE() && PEEK() != '}') NEXT(); REQUIRE(MORE(), REG_EBRACE); SETERROR(REG_BADBR); } break; } if (!MORE()) return; c = PEEK(); if (!( c == '*' || c == '+' || c == '?' || (c == '{' && MORE2() && isdigit((uch)PEEK2())) ) ) return; SETERROR(REG_BADRPT); } /* - p_str - string (no metacharacters) "parser" */ static void p_str(struct parse *p) { REQUIRE(MORE(), REG_EMPTY); while (MORE()) ordinary(p, GETNEXT()); } /* - p_bre - BRE parser top level, anchoring and concatenation * Giving end1 as OUT essentially eliminates the end1/end2 check. * * This implementation is a bit of a kludge, in that a trailing $ is first * taken as an ordinary character and then revised to be an anchor. The * only undesirable side effect is that '$' gets included as a character * category in such cases. This is fairly harmless; not worth fixing. * The amount of lookahead needed to avoid this kludge is excessive. */ static void p_bre(struct parse *p, int end1, /* first terminating character */ int end2) /* second terminating character */ { sopno start = HERE(); int first = 1; /* first subexpression? */ int wasdollar = 0; if (EAT('^')) { EMIT(OBOL, 0); p->g->iflags |= USEBOL; p->g->nbol++; } while (MORE() && !SEETWO(end1, end2)) { wasdollar = p_simp_re(p, first); first = 0; } if (wasdollar) { /* oops, that was a trailing anchor */ DROP(1); EMIT(OEOL, 0); p->g->iflags |= USEEOL; p->g->neol++; } REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */ } /* - p_simp_re - parse a simple RE, an atom possibly followed by a repetition */ static int /* was the simple RE an unbackslashed $? */ p_simp_re(struct parse *p, int starordinary) /* is a leading * an ordinary character? */ { int c; int count; int count2; sopno pos; int i; sopno subno; # define BACKSL (1<g->cflags®_NEWLINE) nonnewline(p); else EMIT(OANY, 0); break; case '[': p_bracket(p); break; case BACKSL|'{': SETERROR(REG_BADRPT); break; case BACKSL|'(': p->g->nsub++; subno = p->g->nsub; if (subno < NPAREN) p->pbegin[subno] = HERE(); EMIT(OLPAREN, subno); /* the MORE here is an error heuristic */ if (MORE() && !SEETWO('\\', ')')) p_bre(p, '\\', ')'); if (subno < NPAREN) { p->pend[subno] = HERE(); assert(p->pend[subno] != 0); } EMIT(ORPAREN, subno); REQUIRE(EATTWO('\\', ')'), REG_EPAREN); break; case BACKSL|')': /* should not get here -- must be user */ case BACKSL|'}': SETERROR(REG_EPAREN); break; case BACKSL|'1': case BACKSL|'2': case BACKSL|'3': case BACKSL|'4': case BACKSL|'5': case BACKSL|'6': case BACKSL|'7': case BACKSL|'8': case BACKSL|'9': i = (c&~BACKSL) - '0'; assert(i < NPAREN); if (p->pend[i] != 0) { assert(i <= p->g->nsub); EMIT(OBACK_, i); assert(p->pbegin[i] != 0); assert(OP(p->strip[p->pbegin[i]]) == OLPAREN); assert(OP(p->strip[p->pend[i]]) == ORPAREN); (void) dupl(p, p->pbegin[i]+1, p->pend[i]); EMIT(O_BACK, i); } else SETERROR(REG_ESUBREG); p->g->backrefs = 1; break; case '*': REQUIRE(starordinary, REG_BADRPT); /* FALLTHROUGH */ default: ordinary(p, (char)c); break; } if (EAT('*')) { /* implemented as +? */ /* this case does not require the (y|) trick, noKLUDGE */ INSERT(OPLUS_, pos); ASTERN(O_PLUS, pos); INSERT(OQUEST_, pos); ASTERN(O_QUEST, pos); } else if (EATTWO('\\', '{')) { count = p_count(p); if (EAT(',')) { if (MORE() && isdigit((uch)PEEK())) { count2 = p_count(p); REQUIRE(count <= count2, REG_BADBR); } else /* single number with comma */ count2 = INFINITY; } else /* just a single number */ count2 = count; repeat(p, pos, count, count2); if (!EATTWO('\\', '}')) { /* error heuristics */ while (MORE() && !SEETWO('\\', '}')) NEXT(); REQUIRE(MORE(), REG_EBRACE); SETERROR(REG_BADBR); } } else if (c == '$') /* $ (but not \$) ends it */ return(1); return(0); } /* - p_count - parse a repetition count */ static int /* the value */ p_count(struct parse *p) { int count = 0; int ndigits = 0; while (MORE() && isdigit((uch)PEEK()) && count <= DUPMAX) { count = count*10 + (GETNEXT() - '0'); ndigits++; } REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR); return(count); } /* - p_bracket - parse a bracketed character list * * Note a significant property of this code: if the allocset() did SETERROR, * no set operations are done. */ static void p_bracket(struct parse *p) { cset *cs; int invert = 0; /* Dept of Truly Sickening Special-Case Kludges */ if (p->next + 5 < p->end && strncmp(p->next, "[:<:]]", 6) == 0) { EMIT(OBOW, 0); NEXTn(6); return; } if (p->next + 5 < p->end && strncmp(p->next, "[:>:]]", 6) == 0) { EMIT(OEOW, 0); NEXTn(6); return; } if ((cs = allocset(p)) == NULL) { /* allocset did set error status in p */ return; } if (EAT('^')) invert++; /* make note to invert set at end */ if (EAT(']')) CHadd(cs, ']'); else if (EAT('-')) CHadd(cs, '-'); while (MORE() && PEEK() != ']' && !SEETWO('-', ']')) p_b_term(p, cs); if (EAT('-')) CHadd(cs, '-'); MUSTEAT(']', REG_EBRACK); if (p->error != 0) { /* don't mess things up further */ freeset(p, cs); return; } if (p->g->cflags®_ICASE) { int i; int ci; for (i = p->g->csetsize - 1; i >= 0; i--) if (CHIN(cs, i) && isalpha(i)) { ci = othercase(i); if (ci != i) CHadd(cs, ci); } if (cs->multis != NULL) mccase(p, cs); } if (invert) { int i; for (i = p->g->csetsize - 1; i >= 0; i--) if (CHIN(cs, i)) CHsub(cs, i); else CHadd(cs, i); if (p->g->cflags®_NEWLINE) CHsub(cs, '\n'); if (cs->multis != NULL) mcinvert(p, cs); } assert(cs->multis == NULL); /* xxx */ if (nch(p, cs) == 1) { /* optimize singleton sets */ ordinary(p, firstch(p, cs)); freeset(p, cs); } else EMIT(OANYOF, freezeset(p, cs)); } /* - p_b_term - parse one term of a bracketed character list */ static void p_b_term(struct parse *p, cset *cs) { char c; char start, finish; int i; /* classify what we've got */ switch ((MORE()) ? PEEK() : '\0') { case '[': c = (MORE2()) ? PEEK2() : '\0'; break; case '-': SETERROR(REG_ERANGE); return; /* NOTE RETURN */ break; default: c = '\0'; break; } switch (c) { case ':': /* character class */ NEXT2(); REQUIRE(MORE(), REG_EBRACK); c = PEEK(); REQUIRE(c != '-' && c != ']', REG_ECTYPE); p_b_cclass(p, cs); REQUIRE(MORE(), REG_EBRACK); REQUIRE(EATTWO(':', ']'), REG_ECTYPE); break; case '=': /* equivalence class */ NEXT2(); REQUIRE(MORE(), REG_EBRACK); c = PEEK(); REQUIRE(c != '-' && c != ']', REG_ECOLLATE); p_b_eclass(p, cs); REQUIRE(MORE(), REG_EBRACK); REQUIRE(EATTWO('=', ']'), REG_ECOLLATE); break; default: /* symbol, ordinary character, or range */ /* xxx revision needed for multichar stuff */ start = p_b_symbol(p); if (SEE('-') && MORE2() && PEEK2() != ']') { /* range */ NEXT(); if (EAT('-')) finish = '-'; else finish = p_b_symbol(p); } else finish = start; /* xxx what about signed chars here... */ REQUIRE(start <= finish, REG_ERANGE); for (i = start; i <= finish; i++) CHadd(cs, i); break; } } /* - p_b_cclass - parse a character-class name and deal with it */ static void p_b_cclass(struct parse *p, cset *cs) { char *sp = p->next; const struct cclass *cp; size_t len; char *u; char c; while (MORE() && isalpha(PEEK())) NEXT(); len = p->next - sp; for (cp = cclasses; cp->name != NULL; cp++) if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') break; if (cp->name == NULL) { /* oops, didn't find it */ SETERROR(REG_ECTYPE); return; } u = cp->chars; while ((c = *u++) != '\0') CHadd(cs, c); for (u = cp->multis; *u != '\0'; u += strlen(u) + 1) MCadd(p, cs, u); } /* - p_b_eclass - parse an equivalence-class name and deal with it * * This implementation is incomplete. xxx */ static void p_b_eclass(struct parse *p, cset *cs) { char c; c = p_b_coll_elem(p, '='); CHadd(cs, c); } /* - p_b_symbol - parse a character or [..]ed multicharacter collating symbol */ static char /* value of symbol */ p_b_symbol(struct parse *p) { char value; REQUIRE(MORE(), REG_EBRACK); if (!EATTWO('[', '.')) return(GETNEXT()); /* collating symbol */ value = p_b_coll_elem(p, '.'); REQUIRE(EATTWO('.', ']'), REG_ECOLLATE); return(value); } /* - p_b_coll_elem - parse a collating-element name and look it up */ static char /* value of collating element */ p_b_coll_elem(struct parse *p, int endc) /* name ended by endc,']' */ { char *sp = p->next; const struct cname *cp; int len; while (MORE() && !SEETWO(endc, ']')) NEXT(); if (!MORE()) { SETERROR(REG_EBRACK); return(0); } len = p->next - sp; for (cp = cnames; cp->name != NULL; cp++) if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') return(cp->code); /* known name */ if (len == 1) return(*sp); /* single character */ SETERROR(REG_ECOLLATE); /* neither */ return(0); } /* - othercase - return the case counterpart of an alphabetic */ static char /* if no counterpart, return ch */ othercase(int ch) { ch = (uch)ch; assert(isalpha(ch)); if (isupper(ch)) return ((uch)tolower(ch)); else if (islower(ch)) return ((uch)toupper(ch)); else /* peculiar, but could happen */ return(ch); } /* - bothcases - emit a dualcase version of a two-case character * * Boy, is this implementation ever a kludge... */ static void bothcases(struct parse *p, int ch) { char *oldnext = p->next; char *oldend = p->end; char bracket[3]; ch = (uch)ch; assert(othercase(ch) != ch); /* p_bracket() would recurse */ p->next = bracket; p->end = bracket+2; bracket[0] = ch; bracket[1] = ']'; bracket[2] = '\0'; p_bracket(p); assert(p->next == bracket+2); p->next = oldnext; p->end = oldend; } /* - ordinary - emit an ordinary character */ static void ordinary(struct parse *p, int ch) { cat_t *cap = p->g->categories; if ((p->g->cflags®_ICASE) && isalpha((uch)ch) && othercase(ch) != ch) bothcases(p, ch); else { EMIT(OCHAR, (uch)ch); if (cap[ch] == 0) cap[ch] = p->g->ncategories++; } } /* - nonnewline - emit REG_NEWLINE version of OANY * * Boy, is this implementation ever a kludge... */ static void nonnewline(struct parse *p) { char *oldnext = p->next; char *oldend = p->end; char bracket[4]; p->next = bracket; p->end = bracket+3; bracket[0] = '^'; bracket[1] = '\n'; bracket[2] = ']'; bracket[3] = '\0'; p_bracket(p); assert(p->next == bracket+3); p->next = oldnext; p->end = oldend; } /* - repeat - generate code for a bounded repetition, recursively if needed */ static void repeat(struct parse *p, sopno start, /* operand from here to end of strip */ int from, /* repeated from this number */ int to) /* to this number of times (maybe INFINITY) */ { sopno finish = HERE(); # define N 2 # define INF 3 # define REP(f, t) ((f)*8 + (t)) # define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N) sopno copy; if (p->error != 0) /* head off possible runaway recursion */ return; assert(from <= to); switch (REP(MAP(from), MAP(to))) { case REP(0, 0): /* must be user doing this */ DROP(finish-start); /* drop the operand */ break; case REP(0, 1): /* as x{1,1}? */ case REP(0, N): /* as x{1,n}? */ case REP(0, INF): /* as x{1,}? */ /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ INSERT(OCH_, start); /* offset is wrong... */ repeat(p, start+1, 1, to); ASTERN(OOR1, start); AHEAD(start); /* ... fix it */ EMIT(OOR2, 0); AHEAD(THERE()); ASTERN(O_CH, THERETHERE()); break; case REP(1, 1): /* trivial case */ /* done */ break; case REP(1, N): /* as x?x{1,n-1} */ /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ INSERT(OCH_, start); ASTERN(OOR1, start); AHEAD(start); EMIT(OOR2, 0); /* offset very wrong... */ AHEAD(THERE()); /* ...so fix it */ ASTERN(O_CH, THERETHERE()); copy = dupl(p, start+1, finish+1); assert(copy == finish+4); repeat(p, copy, 1, to-1); break; case REP(1, INF): /* as x+ */ INSERT(OPLUS_, start); ASTERN(O_PLUS, start); break; case REP(N, N): /* as xx{m-1,n-1} */ copy = dupl(p, start, finish); repeat(p, copy, from-1, to-1); break; case REP(N, INF): /* as xx{n-1,INF} */ copy = dupl(p, start, finish); repeat(p, copy, from-1, to); break; default: /* "can't happen" */ SETERROR(REG_ASSERT); /* just in case */ break; } } /* - seterr - set an error condition */ static int /* useless but makes type checking happy */ seterr(struct parse *p, int e) { if (p->error == 0) /* keep earliest error condition */ p->error = e; p->next = nuls; /* try to bring things to a halt */ p->end = nuls; return(0); /* make the return value well-defined */ } /* - allocset - allocate a set of characters for [] */ static cset * allocset(struct parse *p) { int no = p->g->ncsets++; size_t nc; size_t nbytes; cset *cs; size_t css = (size_t)p->g->csetsize; int i; if (no >= p->ncsalloc) { /* need another column of space */ void *ptr; p->ncsalloc += CHAR_BIT; nc = p->ncsalloc; assert(nc % CHAR_BIT == 0); nbytes = nc / CHAR_BIT * css; ptr = (cset *)realloc((char *)p->g->sets, nc * sizeof(cset)); if (ptr == NULL) goto nomem; p->g->sets = ptr; ptr = (uch *)realloc((char *)p->g->setbits, nbytes); if (ptr == NULL) goto nomem; p->g->setbits = ptr; for (i = 0; i < no; i++) p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT); (void) memset((char *)p->g->setbits + (nbytes - css), 0, css); } /* XXX should not happen */ if (p->g->sets == NULL || p->g->setbits == NULL) goto nomem; cs = &p->g->sets[no]; cs->ptr = p->g->setbits + css*((no)/CHAR_BIT); cs->mask = 1 << ((no) % CHAR_BIT); cs->hash = 0; cs->smultis = 0; cs->multis = NULL; return(cs); nomem: free(p->g->sets); p->g->sets = NULL; free(p->g->setbits); p->g->setbits = NULL; SETERROR(REG_ESPACE); /* caller's responsibility not to do set ops */ return(NULL); } /* - freeset - free a now-unused set */ static void freeset(struct parse *p, cset *cs) { int i; cset *top = &p->g->sets[p->g->ncsets]; size_t css = (size_t)p->g->csetsize; for (i = 0; i < (ssize_t)css; i++) CHsub(cs, i); if (cs == top-1) /* recover only the easy case */ p->g->ncsets--; } /* - freezeset - final processing on a set of characters * * The main task here is merging identical sets. This is usually a waste * of time (although the hash code minimizes the overhead), but can win * big if REG_ICASE is being used. REG_ICASE, by the way, is why the hash * is done using addition rather than xor -- all ASCII [aA] sets xor to * the same value! */ static int /* set number */ freezeset(struct parse *p, cset *cs) { uch h = cs->hash; int i; cset *top = &p->g->sets[p->g->ncsets]; cset *cs2; size_t css = (size_t)p->g->csetsize; /* look for an earlier one which is the same */ for (cs2 = &p->g->sets[0]; cs2 < top; cs2++) if (cs2->hash == h && cs2 != cs) { /* maybe */ for (i = 0; i < (ssize_t)css; i++) if (!!CHIN(cs2, i) != !!CHIN(cs, i)) break; /* no */ if (i == (ssize_t)css) break; /* yes */ } if (cs2 < top) { /* found one */ freeset(p, cs); cs = cs2; } return((int)(cs - p->g->sets)); } /* - firstch - return first character in a set (which must have at least one) */ static int /* character; there is no "none" value */ firstch(struct parse *p, cset *cs) { int i; size_t css = (size_t)p->g->csetsize; for (i = 0; i < (ssize_t)css; i++) if (CHIN(cs, i)) return((char)i); assert(never); return(0); /* arbitrary */ } /* - nch - number of characters in a set */ static int nch(struct parse *p, cset *cs) { int i; size_t css = (size_t)p->g->csetsize; int n = 0; for (i = 0; i < (ssize_t)css; i++) if (CHIN(cs, i)) n++; return(n); } /* - mcadd - add a collating element to a cset */ static void mcadd( struct parse *p, cset *cs, char *cp) { size_t oldend = cs->smultis; void *np; cs->smultis += strlen(cp) + 1; np = realloc(cs->multis, cs->smultis); if (np == NULL) { if (cs->multis) free(cs->multis); cs->multis = NULL; SETERROR(REG_ESPACE); return; } cs->multis = np; strlcpy(cs->multis + oldend - 1, cp, cs->smultis - oldend + 1); } /* - mcinvert - invert the list of collating elements in a cset * * This would have to know the set of possibilities. Implementation * is deferred. */ /* ARGSUSED */ static void mcinvert(struct parse *p, cset *cs) { assert(cs->multis == NULL); /* xxx */ } /* - mccase - add case counterparts of the list of collating elements in a cset * * This would have to know the set of possibilities. Implementation * is deferred. */ /* ARGSUSED */ static void mccase(struct parse *p, cset *cs) { assert(cs->multis == NULL); /* xxx */ } /* - isinsets - is this character in any sets? */ static int /* predicate */ isinsets(struct re_guts *g, int c) { uch *col; int i; int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; unsigned uc = (uch)c; for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) if (col[uc] != 0) return(1); return(0); } /* - samesets - are these two characters in exactly the same sets? */ static int /* predicate */ samesets(struct re_guts *g, int c1, int c2) { uch *col; int i; int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; unsigned uc1 = (uch)c1; unsigned uc2 = (uch)c2; for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) if (col[uc1] != col[uc2]) return(0); return(1); } /* - categorize - sort out character categories */ static void categorize(struct parse *p, struct re_guts *g) { cat_t *cats = g->categories; int c; int c2; cat_t cat; /* avoid making error situations worse */ if (p->error != 0) return; for (c = CHAR_MIN; c <= CHAR_MAX; c++) if (cats[c] == 0 && isinsets(g, c)) { cat = g->ncategories++; cats[c] = cat; for (c2 = c+1; c2 <= CHAR_MAX; c2++) if (cats[c2] == 0 && samesets(g, c, c2)) cats[c2] = cat; } } /* - dupl - emit a duplicate of a bunch of sops */ static sopno /* start of duplicate */ dupl(struct parse *p, sopno start, /* from here */ sopno finish) /* to this less one */ { sopno ret = HERE(); sopno len = finish - start; assert(finish >= start); if (len == 0) return(ret); enlarge(p, p->ssize + len); /* this many unexpected additions */ assert(p->ssize >= p->slen + len); (void) memcpy((char *)(p->strip + p->slen), (char *)(p->strip + start), (size_t)len*sizeof(sop)); p->slen += len; return(ret); } /* - doemit - emit a strip operator * * It might seem better to implement this as a macro with a function as * hard-case backup, but it's just too big and messy unless there are * some changes to the data structures. Maybe later. */ static void doemit(struct parse *p, sop op, size_t opnd) { /* avoid making error situations worse */ if (p->error != 0) return; /* deal with oversize operands ("can't happen", more or less) */ assert(opnd < 1<slen >= p->ssize) enlarge(p, (p->ssize+1) / 2 * 3); /* +50% */ assert(p->slen < p->ssize); /* finally, it's all reduced to the easy case */ p->strip[p->slen++] = SOP(op, opnd); } /* - doinsert - insert a sop into the strip */ static void doinsert(struct parse *p, sop op, size_t opnd, sopno pos) { sopno sn; sop s; int i; /* avoid making error situations worse */ if (p->error != 0) return; sn = HERE(); EMIT(op, opnd); /* do checks, ensure space */ assert(HERE() == sn+1); s = p->strip[sn]; /* adjust paren pointers */ assert(pos > 0); for (i = 1; i < NPAREN; i++) { if (p->pbegin[i] >= pos) { p->pbegin[i]++; } if (p->pend[i] >= pos) { p->pend[i]++; } } memmove((char *)&p->strip[pos+1], (char *)&p->strip[pos], (HERE()-pos-1)*sizeof(sop)); p->strip[pos] = s; } /* - dofwd - complete a forward reference */ static void dofwd(struct parse *p, sopno pos, sop value) { /* avoid making error situations worse */ if (p->error != 0) return; assert(value < 1<strip[pos] = OP(p->strip[pos]) | value; } /* - enlarge - enlarge the strip */ static void enlarge(struct parse *p, sopno size) { sop *sp; if (p->ssize >= size) return; sp = (sop *)realloc(p->strip, size*sizeof(sop)); if (sp == NULL) { SETERROR(REG_ESPACE); return; } p->strip = sp; p->ssize = size; } /* - stripsnug - compact the strip */ static void stripsnug(struct parse *p, struct re_guts *g) { g->nstates = p->slen; g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop)); if (g->strip == NULL) { SETERROR(REG_ESPACE); g->strip = p->strip; } } /* - findmust - fill in must and mlen with longest mandatory literal string * * This algorithm could do fancy things like analyzing the operands of | * for common subsequences. Someday. This code is simple and finds most * of the interesting cases. * * Note that must and mlen got initialized during setup. */ static void findmust(struct parse *p, struct re_guts *g) { sop *scan; sop *start = NULL; /* start initialized in the default case, after that */ sop *newstart; /* newstart was initialized in the OCHAR case */ sopno newlen; sop s; char *cp; sopno i; /* avoid making error situations worse */ if (p->error != 0) return; /* find the longest OCHAR sequence in strip */ newlen = 0; scan = g->strip + 1; do { s = *scan++; switch (OP(s)) { case OCHAR: /* sequence member */ if (newlen == 0) /* new sequence */ newstart = scan - 1; newlen++; break; case OPLUS_: /* things that don't break one */ case OLPAREN: case ORPAREN: break; case OQUEST_: /* things that must be skipped */ case OCH_: scan--; do { scan += OPND(s); s = *scan; /* assert() interferes w debug printouts */ if (OP(s) != O_QUEST && OP(s) != O_CH && OP(s) != OOR2) { g->iflags |= BAD; return; } } while (OP(s) != O_QUEST && OP(s) != O_CH); /* fallthrough */ default: /* things that break a sequence */ if (newlen > g->mlen) { /* ends one */ start = newstart; g->mlen = newlen; } newlen = 0; break; } } while (OP(s) != OEND); if (g->mlen == 0) /* there isn't one */ return; /* turn it into a character string */ g->must = malloc((size_t)g->mlen + 1); if (g->must == NULL) { /* argh; just forget it */ g->mlen = 0; return; } cp = g->must; scan = start; for (i = g->mlen; i > 0; i--) { while (OP(s = *scan++) != OCHAR) continue; assert(cp < g->must + g->mlen); *cp++ = (char)OPND(s); } assert(cp == g->must + g->mlen); *cp++ = '\0'; /* just on general principles */ } /* - pluscount - count + nesting */ static sopno /* nesting depth */ pluscount(struct parse *p, struct re_guts *g) { sop *scan; sop s; sopno plusnest = 0; sopno maxnest = 0; if (p->error != 0) return(0); /* there may not be an OEND */ scan = g->strip + 1; do { s = *scan++; switch (OP(s)) { case OPLUS_: plusnest++; break; case O_PLUS: if (plusnest > maxnest) maxnest = plusnest; plusnest--; break; } } while (OP(s) != OEND); if (plusnest != 0) g->iflags |= BAD; return(maxnest); } olsrd-0.6.6.2/android/regex/regerror.c000066400000000000000000000104451234304727700175500ustar00rootroot00000000000000/* $OpenBSD: regerror.c,v 1.13 2005/08/05 13:03:00 espie Exp $ */ /*- * Copyright (c) 1992, 1993, 1994 Henry Spencer. * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Henry Spencer. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)regerror.c 8.4 (Berkeley) 3/20/94 */ #include #include #include #include #include #include #include #include "utils.h" static char *regatoi(const regex_t *, char *, int); static const struct rerr { int code; char *name; char *explain; } rerrs[] = { { REG_NOMATCH, "REG_NOMATCH", "regexec() failed to match" }, { REG_BADPAT, "REG_BADPAT", "invalid regular expression" }, { REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element" }, { REG_ECTYPE, "REG_ECTYPE", "invalid character class" }, { REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\\)" }, { REG_ESUBREG, "REG_ESUBREG", "invalid backreference number" }, { REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced" }, { REG_EPAREN, "REG_EPAREN", "parentheses not balanced" }, { REG_EBRACE, "REG_EBRACE", "braces not balanced" }, { REG_BADBR, "REG_BADBR", "invalid repetition count(s)" }, { REG_ERANGE, "REG_ERANGE", "invalid character range" }, { REG_ESPACE, "REG_ESPACE", "out of memory" }, { REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid" }, { REG_EMPTY, "REG_EMPTY", "empty (sub)expression" }, { REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug" }, { REG_INVARG, "REG_INVARG", "invalid argument to regex routine" }, { 0, "", "*** unknown regexp error code ***" } }; /* - regerror - the interface to error numbers = extern size_t regerror(int, const regex_t *, char *, size_t); */ /* ARGSUSED */ size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) { const struct rerr *r; size_t len; int target = errcode &~ REG_ITOA; char *s; char convbuf[50]; if (errcode == REG_ATOI) s = regatoi(preg, convbuf, sizeof convbuf); else { for (r = rerrs; r->code != 0; r++) if (r->code == target) break; if (errcode®_ITOA) { if (r->code != 0) { assert(strlen(r->name) < sizeof(convbuf)); (void) strlcpy(convbuf, r->name, sizeof convbuf); } else (void)snprintf(convbuf, sizeof convbuf, "REG_0x%x", target); s = convbuf; } else s = r->explain; } len = strlen(s) + 1; if (errbuf_size > 0) { strlcpy(errbuf, s, errbuf_size); } return(len); } /* - regatoi - internal routine to implement REG_ATOI */ static char * regatoi(const regex_t *preg, char *localbuf, int localbufsize) { const struct rerr *r; for (r = rerrs; r->code != 0; r++) if (strcmp(r->name, preg->re_endp) == 0) break; if (r->code == 0) return("0"); (void)snprintf(localbuf, localbufsize, "%d", r->code); return(localbuf); } olsrd-0.6.6.2/android/regex/regex2.h000066400000000000000000000152601234304727700171220ustar00rootroot00000000000000/* $OpenBSD: regex2.h,v 1.7 2004/11/30 17:04:23 otto Exp $ */ /*- * Copyright (c) 1992, 1993, 1994 Henry Spencer. * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Henry Spencer. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)regex2.h 8.4 (Berkeley) 3/20/94 */ /* * internals of regex_t */ #define MAGIC1 ((('r'^0200)<<8) | 'e') /* * The internal representation is a *strip*, a sequence of * operators ending with an endmarker. (Some terminology etc. is a * historical relic of earlier versions which used multiple strips.) * Certain oddities in the representation are there to permit running * the machinery backwards; in particular, any deviation from sequential * flow must be marked at both its source and its destination. Some * fine points: * * - OPLUS_ and O_PLUS are *inside* the loop they create. * - OQUEST_ and O_QUEST are *outside* the bypass they create. * - OCH_ and O_CH are *outside* the multi-way branch they create, while * OOR1 and OOR2 are respectively the end and the beginning of one of * the branches. Note that there is an implicit OOR2 following OCH_ * and an implicit OOR1 preceding O_CH. * * In state representations, an operator's bit is on to signify a state * immediately *preceding* "execution" of that operator. */ typedef unsigned long sop; /* strip operator */ typedef long sopno; #define OPRMASK 0xf8000000LU #define OPDMASK 0x07ffffffLU #define OPSHIFT ((unsigned)27) #define OP(n) ((n)&OPRMASK) #define OPND(n) ((n)&OPDMASK) #define SOP(op, opnd) ((op)|(opnd)) /* operators meaning operand */ /* (back, fwd are offsets) */ #define OEND (1LU< uch [csetsize] */ uch mask; /* bit within array */ uch hash; /* hash code */ size_t smultis; char *multis; /* -> char[smulti] ab\0cd\0ef\0\0 */ } cset; /* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */ #define CHadd(cs, c) ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (c)) #define CHsub(cs, c) ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (c)) #define CHIN(cs, c) ((cs)->ptr[(uch)(c)] & (cs)->mask) #define MCadd(p, cs, cp) mcadd(p, cs, cp) /* regcomp() internal fns */ #define MCsub(p, cs, cp) mcsub(p, cs, cp) #define MCin(p, cs, cp) mcin(p, cs, cp) /* stuff for character categories */ typedef unsigned char cat_t; /* * main compiled-expression structure */ struct re_guts { int magic; # define MAGIC2 ((('R'^0200)<<8)|'E') sop *strip; /* malloced area for strip */ int csetsize; /* number of bits in a cset vector */ int ncsets; /* number of csets in use */ cset *sets; /* -> cset [ncsets] */ uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */ int cflags; /* copy of regcomp() cflags argument */ sopno nstates; /* = number of sops */ sopno firststate; /* the initial OEND (normally 0) */ sopno laststate; /* the final OEND */ int iflags; /* internal flags */ # define USEBOL 01 /* used ^ */ # define USEEOL 02 /* used $ */ # define BAD 04 /* something wrong */ int nbol; /* number of ^ used */ int neol; /* number of $ used */ int ncategories; /* how many character categories */ cat_t *categories; /* ->catspace[-CHAR_MIN] */ char *must; /* match must contain this string */ int mlen; /* length of must */ size_t nsub; /* copy of re_nsub */ int backrefs; /* does it use back references? */ sopno nplus; /* how deep does it nest +s? */ /* catspace must be last */ cat_t catspace[1]; /* actually [NC] */ }; /* misc utilities */ #define OUT (CHAR_MAX+1) /* a non-character value */ #define ISWORD(c) (isalnum(c) || (c) == '_') olsrd-0.6.6.2/android/regex/regexec.c000066400000000000000000000130771234304727700173470ustar00rootroot00000000000000/* $OpenBSD: regexec.c,v 1.11 2005/08/05 13:03:00 espie Exp $ */ /*- * Copyright (c) 1992, 1993, 1994 Henry Spencer. * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Henry Spencer. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)regexec.c 8.3 (Berkeley) 3/20/94 */ /* * the outer shell of regexec() * * This file includes engine.c *twice*, after muchos fiddling with the * macros that code uses. This lets the same code operate on two different * representations for state sets. */ #include #include #include #include #include #include #include #include "utils.h" #include "regex2.h" /* macros for manipulating states, small version */ #define states long #define states1 states /* for later use in regexec() decision */ #define CLEAR(v) ((v) = 0) #define SET0(v, n) ((v) &= ~((unsigned long)1 << (n))) #define SET1(v, n) ((v) |= (unsigned long)1 << (n)) #define ISSET(v, n) (((v) & ((unsigned long)1 << (n))) != 0) #define ASSIGN(d, s) ((d) = (s)) #define EQ(a, b) ((a) == (b)) #define STATEVARS long dummy /* dummy version */ #define STATESETUP(m, n) /* nothing */ #define STATETEARDOWN(m) /* nothing */ #define SETUP(v) ((v) = 0) #define onestate long #define INIT(o, n) ((o) = (unsigned long)1 << (n)) #define INC(o) ((o) <<= 1) #define ISSTATEIN(v, o) (((v) & (o)) != 0) /* some abbreviations; note that some of these know variable names! */ /* do "if I'm here, I can also be there" etc without branches */ #define FWD(dst, src, n) ((dst) |= ((unsigned long)(src)&(here)) << (n)) #define BACK(dst, src, n) ((dst) |= ((unsigned long)(src)&(here)) >> (n)) #define ISSETBACK(v, n) (((v) & ((unsigned long)here >> (n))) != 0) /* function names */ #define SNAMES /* engine.c looks after details */ #include "engine.c" /* now undo things */ #undef states #undef CLEAR #undef SET0 #undef SET1 #undef ISSET #undef ASSIGN #undef EQ #undef STATEVARS #undef STATESETUP #undef STATETEARDOWN #undef SETUP #undef onestate #undef INIT #undef INC #undef ISSTATEIN #undef FWD #undef BACK #undef ISSETBACK #undef SNAMES /* macros for manipulating states, large version */ #define states char * #define CLEAR(v) memset(v, 0, m->g->nstates) #define SET0(v, n) ((v)[n] = 0) #define SET1(v, n) ((v)[n] = 1) #define ISSET(v, n) ((v)[n]) #define ASSIGN(d, s) memcpy(d, s, m->g->nstates) #define EQ(a, b) (memcmp(a, b, m->g->nstates) == 0) #define STATEVARS long vn; char *space #define STATESETUP(m, nv) { (m)->space = malloc((nv)*(m)->g->nstates); \ if ((m)->space == NULL) return(REG_ESPACE); \ (m)->vn = 0; } #define STATETEARDOWN(m) { free((m)->space); } #define SETUP(v) ((v) = &m->space[m->vn++ * m->g->nstates]) #define onestate long #define INIT(o, n) ((o) = (n)) #define INC(o) ((o)++) #define ISSTATEIN(v, o) ((v)[o]) /* some abbreviations; note that some of these know variable names! */ /* do "if I'm here, I can also be there" etc without branches */ #define FWD(dst, src, n) ((dst)[here+(n)] |= (src)[here]) #define BACK(dst, src, n) ((dst)[here-(n)] |= (src)[here]) #define ISSETBACK(v, n) ((v)[here - (n)]) /* function names */ #define LNAMES /* flag */ #include "engine.c" /* - regexec - interface for matching * * We put this here so we can exploit knowledge of the state representation * when choosing which matcher to call. Also, by this point the matchers * have been prototyped. */ int /* 0 success, REG_NOMATCH failure */ regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags) { struct re_guts *g = preg->re_g; #ifdef REDEBUG # define GOODFLAGS(f) (f) #else # define GOODFLAGS(f) ((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND)) #endif if (preg->re_magic != MAGIC1 || g->magic != MAGIC2) return(REG_BADPAT); assert(!(g->iflags&BAD)); if (g->iflags&BAD) /* backstop for no-debug case */ return(REG_BADPAT); eflags = GOODFLAGS(eflags); if (g->nstates <= (int)(CHAR_BIT*sizeof(states1)) && !(eflags®_LARGE)) return(smatcher(g, (char *)string, nmatch, pmatch, eflags)); else return(lmatcher(g, (char *)string, nmatch, pmatch, eflags)); } olsrd-0.6.6.2/android/regex/regfree.c000066400000000000000000000047231234304727700173420ustar00rootroot00000000000000/* $OpenBSD: regfree.c,v 1.7 2005/08/05 13:03:00 espie Exp $ */ /*- * Copyright (c) 1992, 1993, 1994 Henry Spencer. * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Henry Spencer. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)regfree.c 8.3 (Berkeley) 3/20/94 */ #include #include #include #include #include "utils.h" #include "regex2.h" /* - regfree - free everything */ void regfree(regex_t *preg) { struct re_guts *g; if (preg->re_magic != MAGIC1) /* oops */ return; /* nice to complain, but hard */ g = preg->re_g; if (g == NULL || g->magic != MAGIC2) /* oops again */ return; preg->re_magic = 0; /* mark it invalid */ g->magic = 0; /* mark it invalid */ if (g->strip != NULL) free((char *)g->strip); if (g->sets != NULL) free((char *)g->sets); if (g->setbits != NULL) free((char *)g->setbits); if (g->must != NULL) free(g->must); free((char *)g); } olsrd-0.6.6.2/android/regex/utils.h000066400000000000000000000043371234304727700170710ustar00rootroot00000000000000/* $OpenBSD: utils.h,v 1.4 2003/06/02 20:18:36 millert Exp $ */ /*- * Copyright (c) 1992, 1993, 1994 Henry Spencer. * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Henry Spencer. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)utils.h 8.3 (Berkeley) 3/20/94 */ /* utility definitions */ #define DUPMAX 255 #define INFINITY (DUPMAX + 1) #define NC (CHAR_MAX - CHAR_MIN + 1) typedef unsigned char uch; /* switch off assertions (if not already off) if no REDEBUG */ #ifndef REDEBUG #ifndef NDEBUG #define NDEBUG /* no assertions please */ #endif #endif #include /* for old systems with bcopy() but no memmove() */ #ifdef USEBCOPY #define memmove(d, s, c) bcopy(s, d, c) #endif olsrd-0.6.6.2/contrib/000077500000000000000000000000001234304727700144575ustar00rootroot00000000000000olsrd-0.6.6.2/contrib/README000066400000000000000000000000531234304727700153350ustar00rootroot00000000000000This folder contains contributed projects. olsrd-0.6.6.2/contrib/netsimpcap/000077500000000000000000000000001234304727700166225ustar00rootroot00000000000000olsrd-0.6.6.2/contrib/netsimpcap/LICENCE000066400000000000000000001045131234304727700176130ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . olsrd-0.6.6.2/contrib/netsimpcap/Makefile000066400000000000000000000004541234304727700202650ustar00rootroot00000000000000SRC += $(wildcard ./src/*.c) OBJS = $(SRC:.c=.o) CC = gcc CFLAGS = -c -g -Wall -Werror -I./src LFLAGS = -g -Wall BUILDLIBS = -lpcap -Wl .c.o: ${CC} ${CFLAGS} -o $@ $^ netsimpcap: ${OBJS} ${CC} -o ./bin/$@ ${LFLAGS} ${BUILDLIBS} ${OBJS} clean: rm -f ${OBJS} ./bin/netsimpcap all: netsimpcap olsrd-0.6.6.2/contrib/netsimpcap/bin/000077500000000000000000000000001234304727700173725ustar00rootroot00000000000000olsrd-0.6.6.2/contrib/netsimpcap/bin/.gitignore000066400000000000000000000000021234304727700213520ustar00rootroot00000000000000/*olsrd-0.6.6.2/contrib/netsimpcap/sampleconf.txt000066400000000000000000000000661234304727700215140ustar00rootroot000000000000000 1 0.8 1 2 0.9 2 3 0.8 3 4 0.7 4 5 0.9 5 0 0.95 olsrd-0.6.6.2/contrib/netsimpcap/src/000077500000000000000000000000001234304727700174115ustar00rootroot00000000000000olsrd-0.6.6.2/contrib/netsimpcap/src/config.c000066400000000000000000000050361234304727700210260ustar00rootroot00000000000000 /* * NetsimPcap - a userspace network bridge with simulated packet loss * Copyright 2008 H. Rogge (rogge@fgan.de) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "config.h" #include "debug.h" /* * stripString * * this function strips leading and trailing whitespaces from a string * * @param string to strip * @return stripped string */ char * stripString(char *str) { /* strip left whitespaces */ while (*str == ' ' || *str == '\t') { str++; } /* strip right whitespaces */ int i = strlen(str); while (--i >= 0) { if (str[i] == ' ' || str[i] == '\r' || str[i] == '\n' || str[i] == '\t') { str[i] = 0; break; } } return str; } /* * readConnectionMatrix * * This function reads the network settings and place them in the * connection matrix (float array with size "len" x "len". * * @param pointer to begin of connection matrix * @param pointer to filename * @param number of elements in each connection matrix line * @return 0 if function was successfull, 1 if an error happened */ int readConnectionMatrix(float *connectionMatrix, char *filename, int len) { FILE *file = fopen(filename, "r"); if (!file) { return 1; } char buffer[1024]; while (fgets(buffer, 1024, file)) { int from, to; float propability; char *line = stripString(buffer); DPRINT("%s\n", line); if (line[0] == '#' || line[0] == 0) { continue; } if (sscanf(line, "%d %d %f", &from, &to, &propability) != 3) { continue; } if (from < 0 || from >= len || to < 0 || to >= len || from == to) { continue; } connectionMatrix[GRID(from, to, len)] = propability; if (connectionMatrix[GRID(to, from, len)] == 0) { connectionMatrix[GRID(to, from, len)] = propability; } } fclose(file); return 0; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/contrib/netsimpcap/src/config.h000066400000000000000000000020311234304727700210230ustar00rootroot00000000000000 /* * NetsimPcap - a userspace network bridge with simulated packet loss * Copyright 2008 H. Rogge (rogge@fgan.de) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef CONFIG_H_ #define CONFIG_H_ #define GRID(x,y,width) ((x) + (y) * (width)) int readConnectionMatrix(float *connectionMatrix, char *filename, int len); #endif /* CONFIG_H_ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/contrib/netsimpcap/src/debug.h000066400000000000000000000025531234304727700206550ustar00rootroot00000000000000 /* * NetsimPcap - a userspace network bridge with simulated packet loss * Copyright 2008 H. Rogge (rogge@fgan.de) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef WLAN_DEBUG_H #define WLAN_DEBUG_H #define DPRINT(...) if(debugMode) { printf(__VA_ARGS__); } #define DHEXDUMP(purpose, data,length) if (debugMode) { \ int i; \ printf("Hexdump: %s\n", purpose); \ for (i=0; i. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "network_tap.h" int debugMode = 0; int running; pcap_t *devices[128]; int deviceFD[128]; int deviceCount; int tapFD; u_int32_t *connBC; u_int32_t *connUni; u_int8_t buffer[65536]; u_int8_t mac_bc[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; /* * signalHandler * * This handler stops the mainloop when the programm is send a signal * to stop */ static void signalHandler(int signo __attribute__ ((unused))) { /* * Normally errno must be saved here and restored before returning but since * we do a simple assignment we don't need to do that in this signal handler. */ running = 0; } /* * calculateConnections * * @param pointer to user defined connection matrix * @param number of elements in a matrix line * @param 1 if matrix contains drop-propabilities */ void calculateConnections(float *connMatrix, int socketcount, int drop) { /* calculating unicast/broadcast matrix */ connUni = malloc(sizeof(u_int32_t) * socketcount * socketcount); memset(connUni, 0, sizeof(u_int32_t) * socketcount * socketcount); connBC = malloc(sizeof(u_int32_t) * socketcount * socketcount); memset(connBC, 0, sizeof(u_int32_t) * socketcount * socketcount); float broadcast, unicast; int i, j; for (j = 0; j < socketcount; j++) { for (i = 0; i < socketcount; i++) { float prop = connMatrix[GRID(i, j, socketcount)]; if (drop) { prop = 1.0 - prop; } broadcast = prop; /* IEEE 802.11 do (normally) up to 4 retransmissions for unicast. * A unicast package is only lost if all of this 5 transmissions * are lost. */ prop = 1 - prop; unicast = (1 - prop) * (1 + prop + prop * prop + prop * prop * prop + prop * prop * prop * prop); connBC[GRID(i, j, socketcount)] = (1 << 24) * broadcast; connUni[GRID(i, j, socketcount)] = (1 << 24) * unicast; } } if (debugMode) { printf("Connection matrix for unicast:\n"); for (j = 0; j < socketcount; j++) { for (i = 0; i < socketcount; i++) { if (i > 0) { printf(" "); } printf("%1.2f", (float)connBC[GRID(i, j, socketcount)] / (float)(1 << 24)); } printf("\n"); } printf("\nConnectionmatrix for broadcast:\n"); for (j = 0; j < socketcount; j++) { for (i = 0; i < socketcount; i++) { if (i > 0) { printf(" "); } printf("%1.2f", (float)connUni[GRID(i, j, socketcount)] / (float)(1 << 24)); } printf("\n"); } } } /* * tap_callback * * This function is called every times a package is received through the * (optional) tap device. It retransmits the package to all connected devices. */ void tap_callback(void) { int len, i; len = read(tapFD, buffer, sizeof(buffer)); if (len > 0) { for (i = 0; i < deviceCount; i++) { pcap_inject(devices[i], buffer, len); } } } /* * capture_callback * * This function is called for every package received through libpcap on * one of the connected devices. It retransmit the package to the other * devices (loss propability is defined in connection matrix) and always * to the tap device (if active) * * See libpcap documentation for parameters */ void capture_callback(u_char * args, const struct pcap_pkthdr *hdr, const u_char * packet) { int *index = (int *)args; int unicast = memcmp(packet, mac_bc, 6) != 0; int i, len; len = hdr->len; memcpy(buffer, packet, len); if (tapFD != -1) { int send = 0; while (send < len) { int t = write(tapFD, &buffer[send], len - send); if (t == -1) { printf("Error while sending to tap device!\n"); break; } send += t; } } for (i = 0; i < deviceCount; i++) { u_int32_t prop; if (unicast) { prop = connUni[GRID(*index, i, deviceCount)]; } else { prop = connBC[GRID(*index, i, deviceCount)]; } if (prop == 0 || prop < (rand() % (1 << 24))) { continue; } pcap_inject(devices[i], buffer, len); } } int main(int argc, char **argv) { int i; int dropPropability = 0; char *connectionFile = NULL; int deviceIndex = -1; int hubMode = 0; MacAddress mac; char *tapname = NULL; if (argc == 1 || (argc == 2 && strcmp(argv[1], "--help") == 0)) { printf("%s: [-con ] [-hub] [-debug]" " [-tap ] [-drop] -dev ...\n", argv[0]); return 0; } deviceCount = 0; tapFD = -1; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-con") == 0 && i < argc - 1) { connectionFile = argv[i + 1]; i++; } if (strcmp(argv[i], "-drop") == 0) { dropPropability = 1; } if (strcmp(argv[i], "-dev") == 0) { deviceIndex = ++i; while (i < argc && argv[i][0] != '-') { i++; deviceCount++; } i--; /* to cancel the i++ in the for loop */ } if (strcmp(argv[i], "-hub") == 0) { hubMode = 1; } if (strcmp(argv[i], "-tap") == 0 && i < argc - 2) { tapname = argv[++i]; readMac(argv[++i], &mac); } if (strcmp(argv[i], "-debug") == 0) { debugMode = 1; } } if (hubMode == 1 && connectionFile != NULL) { printf("Error, you cannot set matrix file in hub mode.\n"); return 1; } if (connectionFile == NULL && hubMode == 0) { printf("Error, netsim needs a matrix file for connections if not running in hub mode.\n"); return 1; } if (deviceIndex < 0) { printf("Error, you must specify the devices the programm connects to.\n"); return 1; } if (deviceCount < 2) { printf("Error, you need to bind at least two devices to the bridge.\n"); return 1; } if (tapname) { tapFD = createTap(tapname, &mac); if (tapFD == -1) { printf("Error, cannot open tap device '%s'\n", tapname); return 1; } } running = 1; float *connMatrix = malloc(sizeof(float) * deviceCount * deviceCount); if (!connMatrix) { printf("Error, not enough memory for mac buffer!"); if (tapFD != -1) closeTap(tapFD); return 1; } if (hubMode) { int x, y; /* * In hub mode the any-to-any loss factor is 1.0, which * means we can skip reading a matrix file. */ for (y = 0; y < deviceCount; y++) { for (x = 0; x < deviceCount; x++) { if (x != y) { connMatrix[GRID(x, y, deviceCount)] = 1.0; } } } } else { if (readConnectionMatrix(connMatrix, connectionFile, deviceCount)) { printf("Error while reading matrix file\n"); free(connMatrix); if (tapFD != -1) closeTap(tapFD); return 1; } } calculateConnections(connMatrix, deviceCount, dropPropability); free(connMatrix); char errbuf[PCAP_ERRBUF_SIZE]; int maxDeviceFD = 0; if (tapFD != -1) { maxDeviceFD = tapFD; } for (i = 0; i < deviceCount; i++) { devices[i] = pcap_open_live(argv[i + deviceIndex], BUFSIZ, 0, -1, errbuf); deviceFD[i] = -1; if (devices[i] == NULL) { printf("Error, cannot open pcap for device '%s'.\n", argv[i + deviceIndex]); running = 0; } else { deviceFD[i] = pcap_fileno(devices[i]); if (deviceFD[i] > maxDeviceFD) { maxDeviceFD = deviceFD[i]; } } } /* activate signal handling */ signal(SIGABRT, &signalHandler); signal(SIGTERM, &signalHandler); signal(SIGQUIT, &signalHandler); signal(SIGINT, &signalHandler); while (running) { fd_set socketSet; int socketsReady; struct timeval timeout; timeout.tv_sec = 1; timeout.tv_usec = 0; FD_ZERO(&socketSet); for (i = 0; i < deviceCount; i++) { FD_SET(deviceFD[i], &socketSet); } if (tapFD != -1) { FD_SET(tapFD, &socketSet); } socketsReady = select(maxDeviceFD + 1, &socketSet, (fd_set *) 0, (fd_set *) 0, &timeout); if (socketsReady <= 0) { break; } for (i = 0; i < deviceCount; i++) { if (FD_ISSET(deviceFD[i], &socketSet)) { int error = pcap_dispatch(devices[i], -1, capture_callback, (u_char *) & i); if (error == -1) { printf("Error during pcap_dispatch for device %s\n", argv[i + deviceIndex]); running = 0; break; } } } if (tapFD != -1 && FD_ISSET(tapFD, &socketSet)) { tap_callback(); } } for (i = 0; i < deviceCount; i++) { if (devices[i] != NULL) { pcap_close(devices[i]); } } free(connUni); free(connBC); if (tapFD != -1) closeTap(tapFD); return 0; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/contrib/netsimpcap/src/network_tap.c000066400000000000000000000123531234304727700221160ustar00rootroot00000000000000 /* * NetsimPcap - a userspace network bridge with simulated packet loss * Copyright 2008 H. Rogge (rogge@fgan.de) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "debug.h" #include "network_tap.h" #include "kernel_tunnel.h" char macBroadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; /* * This function translates a mac address from string * to binary format. * * @param pointer to source string * @param pointer to target mac adresee * @return 0 if successful, 1 for an error */ int readMac(char *value, MacAddress * target) { char buffer[13]; int index = 0; memset(buffer, 0, sizeof(buffer)); char c; while ((c = *value++)) { switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'a': case 'A': case 'b': case 'B': case 'c': case 'C': case 'd': case 'D': case 'e': case 'E': case 'f': case 'F': if (index > 11) { return 1; } buffer[index++] = c; break; default: break; } } if (index < 12) { return 1; } for (index = 5; index >= 0; index--) { buffer[index * 2 + 2] = 0; int value; sscanf(&buffer[index], "%x", &value); target->mac[index] = (char)value; } return 0; } /* * closeTap * * This function close a tap device * * @param file destriptor of the tap device */ void closeTap(int fd) { close(fd); } /* * createTap * * This function creates a tap device, sets a mac address * and the broadcast address and activates the device * * @param pointer to device name * @param pointer to mac address * @return file descriptor of tap device, -1 if an error * happened */ int createTap(char *name, MacAddress * mac) { static const char * deviceName = OS_TUNNEL_PATH; int etfd; struct ifreq ifreq; int ioctlSkfd; int ioctlres; etfd = open(deviceName, O_RDWR); if (etfd < 0) { printf("Cannot open tap device!\n"); return -1; } memset(&ifreq, 0, sizeof(ifreq)); strncpy(ifreq.ifr_name, name, IFNAMSIZ - 1); ifreq.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ /* * Specify the IFF_TAP flag for Ethernet packets. * Specify IFF_NO_PI for not receiving extra meta packet information. */ ifreq.ifr_flags = IFF_TAP; ifreq.ifr_flags |= IFF_NO_PI; if (ioctl(etfd, TUNSETIFF, (void *)&ifreq) < 0) { close(etfd); printf("Cannot set tun device type!\n"); return -1; } memset(&ifreq, 0, sizeof(ifreq)); strncpy(ifreq.ifr_name, name, IFNAMSIZ - 1); ifreq.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ ifreq.ifr_addr.sa_family = AF_INET; ioctlSkfd = socket(PF_INET, SOCK_DGRAM, 0); if (ioctlSkfd < 0) { close(etfd); printf("Cannot open configuration socket!\n"); return -1; } /* Set hardware address */ ifreq.ifr_addr.sa_family = ARPHRD_ETHER; memcpy(ifreq.ifr_addr.sa_data, mac, 6); ioctlres = ioctl(ioctlSkfd, SIOCSIFHWADDR, &ifreq); if (ioctlres >= 0) { /* Set hardware broadcast */ memcpy(ifreq.ifr_addr.sa_data, macBroadcast, 6); ioctlres = ioctl(ioctlSkfd, SIOCSIFHWBROADCAST, &ifreq); if (ioctlres >= 0) { /* Bring EtherTunTap interface up (if not already) */ ifreq.ifr_addr.sa_family = AF_INET; ioctlres = ioctl(ioctlSkfd, SIOCGIFFLAGS, &ifreq); if (ioctlres >= 0) { ifreq.ifr_flags |= (IFF_UP | IFF_RUNNING | IFF_BROADCAST); ioctlres = ioctl(ioctlSkfd, SIOCSIFFLAGS, &ifreq); } } } if (ioctlres < 0) { printf("Configuration of tun device failed! (%d %s)\n", errno, strerror(errno)); close(etfd); close(ioctlSkfd); return -1; } /* Set the multicast flag on the interface */ memset(&ifreq, 0, sizeof(ifreq)); strncpy(ifreq.ifr_name, name, IFNAMSIZ - 1); ifreq.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ ioctlres = ioctl(ioctlSkfd, SIOCGIFFLAGS, &ifreq); if (ioctlres >= 0) { ifreq.ifr_flags |= IFF_MULTICAST; ioctlres = ioctl(ioctlSkfd, SIOCSIFFLAGS, &ifreq); } close(ioctlSkfd); return etfd; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/contrib/netsimpcap/src/network_tap.h000066400000000000000000000021501234304727700221150ustar00rootroot00000000000000 /* * NetsimPcap - a userspace network bridge with simulated packet loss * Copyright 2008 H. Rogge (rogge@fgan.de) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef NETWORK_H_ #define NETWORK_H_ #include typedef struct MacAddress { char mac[6]; } MacAddress; int readMac(char *value, MacAddress * target); void closeTap(int fd); int createTap(char *name, MacAddress * mac); #endif /* NETWORK_H_ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/debian/000077500000000000000000000000001234304727700142415ustar00rootroot00000000000000olsrd-0.6.6.2/debian/.gitignore000066400000000000000000000003031234304727700162250ustar00rootroot00000000000000/olsrd/ /olsrd-plugins/ /olsrd-plugins.debhelper.log /olsrd.debhelper.log /files /olsrd-plugins.substvars /olsrd.postinst.debhelper /olsrd.postrm.debhelper /olsrd.prerm.debhelper /olsrd.substvarsolsrd-0.6.6.2/debian/README.Debian000066400000000000000000000055121234304727700163050ustar00rootroot00000000000000olsrd for Debian ---------------- Configuration ------------- Before running olsrd you must edit the default configuration file /etc/olsrd/olsrd.conf (the location differs in the debian package from the upstream default /etc/olsrd.conf). The one change you must make is to define on which interfaces olsrd is supposed to act on. If you want, you can run olsrd via init.d by editing /etc/default/olsrd - the default configuration is to not start olsrd on boot. It needs root privileges to run olsrd. To debug olsrd you can start it with "/etc/init.d/olsrd start debug". You also need to configure your network interface. For example, for freifunk.hamburg.net the following settings are used: ifconfig eth1 $YOUR_IP broadcast 10.127.255.255 iwconfig eth1 essid hamburg.freifunk.net channel 10 mode ad-hoc enc off Options in the olsrd config file can also be overridden by command line options or in /etc/default/olsrd. See the manual pages olsrd(8) and olsrd.conf(5) for details. If debug level is set to 0 olsrd will detach and run in the background (this is the default in the debian package), if not it will keep running in your shell. Plugins ------- The following plugins are included in the olsrd-plugins package and are explained in detail in /usr/share/doc/olsrd-plugins: - httpinfo - tiny webserver for information purposes - dyn_gw - dynamically announce uplinks - dot_draw - generates output (over a TCP socket) in the dot format - secure - secure OLSR routing with a shared key - nameservice - announce hostnames and dns servers - bmf - basic multicast forwarding plugin for olsrd - txtinfo The following plugins are not included in the olsrd-plugins binary package: - quagga - quagga plugin - powerinfo - displays /proc/apm on 127.0.0.1:8888 - pgraph - obsoleted by httpinfo and dot-draw - mini - minimal example plugin, useful as a howto for writing plugins If you need them, you can easily build them from the debian source package yourself: define which (additional) plugins you want in debian/rules, and rebuild the package. And if you tell me a good reason why they should be included in the binary package, I'll be glad to add them :) About this package ------------------ This is actually the unik-olsrd implementation, but because it's the only commonly used one (the other two, nrl- and inria-olsrd are mostly used where they were written) and the one found on www.olsr.org, so I decided to call the package olsrd. The config file shipped in /etc/olsrd/olsrd.conf is based on the one from http://olsrexperiment.de/sven-ola/nylon/packages/olsrd/files/olsrd.conf-sven-ola and has been successfully used in the freifunk networks in Berlin and Hamburg (Germany). The plugins are installed in /usr/lib/olsrd/ which differs from the upstream default /usr/lib/. -- Holger Levsen Tue, 8 Jul 2008 18:09:15 +0200 olsrd-0.6.6.2/debian/changelog000066400000000000000000000214301234304727700161130ustar00rootroot00000000000000olsrd (0.6.1-1) UNRELEASED; urgency=low * New upstream version with quite some fixes and new features, see upstream changelog for details. Quoting from there: Change in version number system. No more -rcX for release candidates and -rX for bugfix releases. In future bugfix releases or updates of plugins will increase the third digit of the version string while feature releases will increase the first and/or the second one. Removed the following patches from series trying to make it build again: - 100-debug_level.patch - 240-plugin-install-targets.patch - 260-quagga-plugin-detect-protocol-version.patch - 270-make-kfbsd.patch THIS IS WORK IN PROGRESS and needs checking whether those patches are still needed. Also 0.6.1 is out. * Update package description, OLSR is no experimental protocol anymore. -- Holger Levsen Fri, 21 May 2010 23:47:52 +0200 olsrd (0.5.6-r8-1) unstable; urgency=low * New upstream version, the eighth maintenance release of 0.5.6, introducing options to set the source and destination IP of the OLSR packets and a more flexible handling config handling as well as some bug fixes including memory leaks. -- Holger Levsen Wed, 20 Jan 2010 01:13:43 +0000 olsrd (0.5.6-r7-1) unstable; urgency=low * New upstream version, the seventh maintenance release of 0.5.6, with some improvements in the ETX-FFmetric and new stabilization patches for the route generation. -- Holger Levsen Wed, 11 Nov 2009 17:53:26 +0100 olsrd (0.5.6-r6-3) unstable; urgency=low * Brown paper bag release: add 270-make-kfbsd.patch to debian/patches/series so it actually gets applied. (Closes: #544758) -- Holger Levsen Mon, 19 Oct 2009 11:31:38 +0200 olsrd (0.5.6-r6-2) unstable; urgency=low * Do not override the general setting in Makefile.kfbsd to "honor DESTDIR in make install". Thanks to Petr Salinger for the patch. (Closes: #544758) -- Holger Levsen Sat, 17 Oct 2009 13:00:41 +0000 olsrd (0.5.6-r6-1) unstable; urgency=low * New upstream version, the sixth maintenance release of 0.5.6, adding support for Debian kfreebsd (Closes: #544758) and including fixes for httpinfo, txtinfo and dotdraw plugin to prevent them blocking in case of timed out outgoing connections. Drop 250-dot-draw-plugin-honor-accept-parameter.patch as it has been included in the new upstream release. * Fix incorrect runlevels and dependencies in init.d LSB header, thanks to Petter Reinholdtsen for spotting the issues and providing the patch. (Closes: #548607) * Bump standards version to 3.8.3, no changes necessary. -- Holger Levsen Sat, 10 Oct 2009 14:55:37 +0200 olsrd (0.5.6-r5-1) unstable; urgency=low * New upstream version, the fifth maintenance release of 0.5.6. * Add patch by Sebastian Harl to add a listen parameter to the dot_draw plugin. (Closes: #532573) - Thanks, Sebastian! * Re-enable quagga plugin. Since olsrd is licenced under the 3 clause BSD licence and quagga is GPL-2 code, the resuling binary is GPL-2 licenced too, and thats fine. (Closes: #532761) Add patch by Florian Forster to determine quagga protocol version - thanks Florian! * Add descriptions of quagga, bmf and txtinfo plugins to package description. (Closes: #532765) * Bump standards version to 3.8.2. * Update years in debian/copyright. -- Holger Levsen Tue, 04 Aug 2009 12:10:35 +0000 olsrd (0.5.6-r4-1) unstable; urgency=low * New upstream version, the fourth maintenance release of 0.5.6. * olsrd.init: - do not write the pidfile until olsrd has actually been started (Closes: #519842) - thanks to Sebastian Reichel for the bug report! - only start olsrd if it is not already running. * Bump standards-version to 3.8.1. -- Holger Levsen Sat, 30 May 2009 09:14:27 +0000 olsrd (0.5.6-r3-1) unstable; urgency=low * New upstream release, the third maintenance release of 0.5.6. * Adopt debian/patches/200-etc-olsrd.patch to cope with the whitespace changes in the new release. -- Holger Levsen Sat, 14 Mar 2009 18:31:55 +0100 olsrd (0.5.6~rc7-1) unstable; urgency=low * New upstream release candidate. * Use a PID file. (Closes: #484128) * Bump standards-version to 3.8.0, no changes needed. * Install the plugins into /usr/lib/olsrd/, to get rid off all the lintian overrides. Adapted README.Debian to reflect that. * Compile the source without DESTDIR, just install it to DESTDIR. * Modify the plugin targets in the upstream Makefile to provide distinct $pluginname_install targets, otherwise DESTDIR shows up in rpath. * Drop debian/patches/210-txtinfo-Makefile.patch as it has been adapted by upstream. -- Holger Levsen Sat, 12 Jul 2008 16:38:15 +0000 olsrd (0.5.5-3) unstable; urgency=low * No longer work around a bug in debhelper (#470913) in debian/rules, which was introduced in 0.5.5-2 to fix #471627. Due to this, it's also not necessary to manually uncompress and compress some manpages, as debhelper now handles this as well. -- Holger Levsen Wed, 2 Apr 2008 13:06:27 +0200 olsrd (0.5.5-2) unstable; urgency=low * update debian/copyright to clarify that src/cfgparser/oparse.(c|h) has a special exception which allows distributing it under other conditions than the GPL in special cases * fix handling of zipped manpages (Closes: #471627) * remove the quagga plugin from the binary package, as it is GPL licenced and cannot be distributed together with the BSD licenced olsrd * remove linda overwrites as linda is deprecated * updated lintian overwrites -- Holger Levsen Mon, 31 Mar 2008 08:50:25 +0000 olsrd (0.5.5-1) unstable; urgency=low * new upstream version * removed unused lintian overwrites * upgraded to policy 3.7.3, no changes requiered * made debian/copyright machine readable following http://wiki.debian.org/Proposals/CopyrightFormat and converted it to utf8 * patch upstream Makefile to use /usr/lib on amd64 (Closes: #461604) -- Holger Levsen Sat, 09 Feb 2008 09:39:28 +0000 olsrd (0.5.4-2) unstable; urgency=low * clean up olsrd makefile, fix a very annoying dependency bug in the olsrd build system (Closes: #452100) - taken from OpenWRT, thanks to Felix Fietkau -- Holger Levsen Tue, 20 Nov 2007 14:26:34 +0100 olsrd (0.5.4-1) unstable; urgency=low * new upstream version * add Homepage and Vcs-* headers to debian/control * olsrd.conf: small improvements as suggested by Jens Nachtigall - Thanks! -- Holger Levsen Fri, 16 Nov 2007 12:02:21 +0000 olsrd (0.5.3-3) unstable; urgency=low * Undefine STRIP when running make install and instead use dh_strip so that DEB_BUILD_OPTIONS=nostrip can be used (Closes: #437676) -- Holger Levsen Sat, 18 Aug 2007 23:06:02 +0200 olsrd (0.5.3-2) unstable; urgency=low * improved olsrd.conf settings (Thanks elektra!) and made olsrd quiet on default -- Holger Levsen Sun, 12 Aug 2007 19:38:19 +0200 olsrd (0.5.3-1) unstable; urgency=low * new upstream version (Closes: #404899, #405331) * include bmf, quagga and txtinfo plugins in binary package -- Holger Levsen Sun, 5 Aug 2007 01:49:19 +0200 olsrd (0.5.2-1) unstable; urgency=low * new upstream release (Closes: #426580) * added build-dependency on bison and flex * removed dependency on libpthread2 (Closes: #412752) * maintainer address updated * updated README.Debian * cleaned up debian/patches/ (from openwrt) as they are included upstream by now * added debian/todo in source * make init-script exit gracefully if stopping olsrd fails (Closes: #412936) -- Holger Levsen Wed, 1 Aug 2007 00:58:23 +0200 olsrd (0.4.10-3) unstable; urgency=low * improved Makefile clean target to allow rebuilds * fixed and improved broken /etc/default/olsrd and /etc/init.d/olsrd * improved README.Debian and olsrd.conf -- Holger Levsen Wed, 20 Dec 2006 22:57:21 +0000 olsrd (0.4.10-2) unstable; urgency=low * fix debian/copyright (gui/linux-gtk is GPL licenced, not BSD like the rest) * upgraded debian/compat debhelper source-depends version to 5 (as it's enough if 0.4.10-1 builds on sarge without changes) * use ${binary:Version} format for olsrd-plugins depends on olsrd, for the same reason -- Holger Levsen Sun, 17 Dec 2006 18:51:00 +0000 olsrd (0.4.10-1) unstable; urgency=low * Initial release (Closes: #401307, #243527) -- Holger Levsen Sat, 9 Dec 2006 17:04:26 +0000 olsrd-0.6.6.2/debian/compat000066400000000000000000000000021234304727700154370ustar00rootroot000000000000005 olsrd-0.6.6.2/debian/control000066400000000000000000000032761234304727700156540ustar00rootroot00000000000000Source: olsrd Section: net Priority: extra Maintainer: Holger Levsen Build-Depends: debhelper (>= 5), quilt, bison, flex Standards-Version: 3.8.3 Homepage: http://olsr.org/ Vcs-Svn: svn://svn.debian.org/svn/collab-maint/deb-maint/olsrd/ Vcs-Browser: http://svn.debian.org/wsvn/collab-maint/deb-maint/olsrd/ Package: olsrd Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: optimized link-state routing daemon (unik-olsrd) unik-olsrd is an implementation of the Optimized Link State Routing protocol for Mobile Ad-Hoc networks(MANET). The protocol is described in RFC3626. It is designed to be run as a standalone server process. . OLSR operates as a table driven, proactive protocol, i.e., it exchanges topology information with other nodes of the network regularly. It is developed to work independently from other protocols. Likewise, OLSR makes no assumptions about the underlying link-layer. Package: olsrd-plugins Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, olsrd (= ${binary:Version}) Description: various plugins to enhance olsrd olsrd is an implementation of the Optimized Link State Routing protocol for Mobile Ad-Hoc networks(MANET) . The following plugins are available: . * httpinfo - tiny webserver for information purposes * dyn_gw - dynamically announce uplinks * dot_draw - generates output (over a TCP socket) in the dot format * secure - secure OLSR routing with a shared key * nameservice - announce hostnames and dns servers * bmf - basic multicast forwarding * quagga - import external routes from quagga * txtinfo - display information about the OSLR node olsrd-0.6.6.2/debian/copyright000066400000000000000000000171361234304727700162040ustar00rootroot00000000000000This package was downloaded from http://www.olsr.org/releases/ Files: debian/* Copyright: © 2006-2009 Holger Levsen Licence: GPL-2+ The Debian packaging is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. On Debian systems, the full text of the GPL-2+ is available at /usr/share/common-licenses/GPL-2 Files: * Copyright: © 2003-2005 Andreas Tønnesen , 2004 Thomas Lopatic , 2006, 2007 Sven-Ola , 2005, Bruno Randolf , 2007 Bernd Petrovitsch and 2006 Jens Nachtigall Licence: BSD-3 | All rights reserved. | | Redistribution and use in source and binary forms, with or without | modification, are permitted provided that the following conditions | are met: | | * Redistributions of source code must retain the above copyright | notice, this list of conditions and the following disclaimer. | * Redistributions in binary form must reproduce the above copyright | notice, this list of conditions and the following disclaimer in | the documentation and/or other materials provided with the | distribution. | * Neither the name of olsr.org, olsrd nor the names of its | contributors may be used to endorse or promote products derived | from this software without specific prior written permission. | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | POSSIBILITY OF SUCH DAMAGE. Files: gui/linux-gtk/* Copyright: © 2003 Andreas Tønnesen (andreto@ifi.uio.no) Licence: GPL-2+ olsrd/gui/linux-gtk is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. On Debian systems, the full text of the GPL-2+ is available at /usr/share/common-licenses/GPL-2 Files: lib/bmf* Copyright: © 2005 - 2007, Thales Communications, Huizen, The Netherlands. Written by Erik Tromp. Licence: BSD-3 | All rights reserved. | | Redistribution and use in source and binary forms, with or without | modification, are permitted provided that the following conditions | are met: | | * Redistributions of source code must retain the above copyright | notice, this list of conditions and the following disclaimer. | * Redistributions in binary form must reproduce the above copyright | notice, this list of conditions and the following disclaimer in | the documentation and/or other materials provided with the | distribution. | * Neither the name of Thales, BMF nor the names of its | contributors may be used to endorse or promote products derived | from this software without specific prior written permission. | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | OF THE POSSIBILITY OF SUCH DAMAGE. Files: src/cfgparser/oparse.c src/cfgparser/oparse.h Copyright: © 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Licence: GPL-2+ | src/cfgparser/oparse.(c|h) is free software; you can redistribute it and/or | modify it under the terms of the GNU General Public License as published | by the Free Software Foundation; either version 2, or (at your option) | any later version. | On Debian systems, the full text of the GPL-2+ is available at | /usr/share/common-licenses/GPL-2 | | As a special exception, you may create a larger work that contains | part or all of the Bison parser skeleton and distribute that work | under terms of your choice, so long as that work isn't itself a | parser generator using the skeleton or a modified version thereof | as a parser skeleton. Alternatively, if you modify or redistribute | the parser skeleton itself, you may (at your option) remove this | special exception, which will cause the skeleton and the resulting | Bison output files to be licensed under the GNU General Public | License without this special exception. | | This special exception was added by the Free Software Foundation in | version 2.2 of Bison. Files: lib/quagga/src/quagga.h lib/quagga/src/olsrd_plugin.c lib/quagga.c Copyright: © 2006 Immo 'FaUl' Wehrenberg Licence: GPL-2+ lib/quagga/src/quagga.h is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. On Debian systems, the full text of the GPL is available at /usr/share/common-licenses/GPL-2 Files: lib/quagga/src/quagga/zebra.h Copyright: © 1997, 1998, 1999, 2000, 2001, 2002 Kunihiro Ishiguro Licence: GPL-2+ lib/quagga/zebra.h is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. On Debian systems, the full text of the GPL-2+ is available at /usr/share/common-licenses/GPL-2 Files: lib/secure/src/md5.(c|h) Copyright: © 1991, 1992 RSA Data Security, Inc. Created 1991. Licence: other | All rights reserved. | License to copy and use this software is granted provided that it | is identified as the "RSA Data Security, Inc. MD5 Message-Digest | Algorithm" in all material mentioning or referencing this software | or this function. | | License is also granted to make and use derivative works provided | that such works are identified as "derived from the RSA Data | Security, Inc. MD5 Message-Digest Algorithm" in all material | mentioning or referencing the derived work. | | RSA Data Security, Inc. makes no representations concerning either | the merchantability of this software or the suitability of this | software for any particular purpose. It is provided "as is" | without express or implied warranty of any kind. | | These notices must be retained in any copies of any part of this | documentation and/or software. olsrd-0.6.6.2/debian/olsrd-default000066400000000000000000000006671234304727700167420ustar00rootroot00000000000000# Defaults for olsrd initscript # sourced by /etc/init.d/olsrd # installed at /etc/default/olsrd by the maintainer scripts # # This is a POSIX shell fragment # # # uncomment the next line run olsrd automatically at startup # #START_OLSRD="YES" # # debuglevel from 1 (=quiet) to 9 (=max debug) # for running from init.d 0 is recommended # DEBUGLEVEL=0 # # "command-line options" # DAEMON_OPTS="-f /etc/olsrd/olsrd.conf -d $DEBUGLEVEL" olsrd-0.6.6.2/debian/olsrd-plugins.dirs000066400000000000000000000000161234304727700177230ustar00rootroot00000000000000usr/lib/olsrd olsrd-0.6.6.2/debian/olsrd-plugins.docs000066400000000000000000000003271234304727700177170ustar00rootroot00000000000000lib/dyn_gw/README_DYN_GW lib/httpinfo/README_HTTPINFO lib/dot_draw/README_DOT_DRAW lib/nameservice/README_NAMESERVICE lib/secure/README_SECURE lib/bmf/README_BMF lib/quagga/README_QUAGGA lib/txtinfo/README_TXTINFO olsrd-0.6.6.2/debian/olsrd.conf000066400000000000000000000006071234304727700162360ustar00rootroot00000000000000# # olsr.org OLSR daemon config file # # Lines starting with a # are discarded # # This file was shipped with the debian olsrd package # # Interfaces and their rules # Omitted options will be set to the # default values. Multiple interfaces # can be specified in the same block # and multiple blocks can be set. #Interface "eth1" "eth0" "wlan0" "wlan1" "ath0" "ath1" Interface "eth1" { } olsrd-0.6.6.2/debian/olsrd.dirs000066400000000000000000000000401234304727700162410ustar00rootroot00000000000000usr/sbin etc/default/ etc/olsrd olsrd-0.6.6.2/debian/olsrd.docs000066400000000000000000000000301234304727700162270ustar00rootroot00000000000000README-Olsr-Extensions olsrd-0.6.6.2/debian/olsrd.init000066400000000000000000000036141234304727700162550ustar00rootroot00000000000000#! /bin/sh ### BEGIN INIT INFO # Provides: olsrd # Required-Start: $network $remote_fs $syslog # Required-Stop: $network $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: /etc/init.d/olsrd: start olsrd ### END INIT INFO # Based on skeleton script written by Miquel van Smoorenburg . # Modified for Debian # by Ian Murdock . # Modified for olsrd # by Holger Levsen # # Version: 21-Dec-2006 # modified: 01-Aug-2007 # 31-Jun-2008 # 30-May-2009 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/sbin/olsrd NAME=olsrd DESC=olsrd PID_FILE=/var/run/$NAME.pid test -x $DAEMON || exit 0 # Include olsrd defaults if available if [ -f /etc/default/olsrd ] ; then . /etc/default/olsrd fi set -e case "$1" in debug) echo -n "Starting $DESC: " start-stop-daemon --start --quiet --exec $DAEMON --pidfile $PID_FILE -- $DAEMON_OPTS & # sleep til olsrd has been started while ! pidof $NAME > /dev/null ; do sleep 1 done echo "$NAME." echo $(pidof $NAME) > $PID_FILE ;; start) if [ "$START_OLSRD" != "YES" ] ; then exit 0 ; fi if [ $(pidof $NAME) -eq 0 ] ; then echo "$NAME already running, doing nothing." exit 0 fi echo -n "Starting $DESC: " start-stop-daemon --start --quiet --exec $DAEMON --pidfile $PID_FILE -- $DAEMON_OPTS & # sleep til olsrd has been started while ! pidof $NAME > /dev/null ; do sleep 1 done echo "$NAME." echo $(pidof $NAME) > $PID_FILE ;; stop) pidof $NAME || exit 0 echo -n "Stopping $DESC: " start-stop-daemon --stop --quiet --exec $DAEMON --pidfile $PID_FILE rm -f $PID_FILE echo "$NAME." ;; restart|force-reload) echo -n "Restarting $DESC: " $0 stop sleep 1 $0 start ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart}" >&2 exit 1 ;; esac exit 0 olsrd-0.6.6.2/debian/olsrd.postinst000066400000000000000000000004751234304727700171770ustar00rootroot00000000000000#!/bin/sh set -e # Recover from incorrect init.d script headers in version 0.5.6-r5-1 and earlier if [ "$1" = "configure" ] && dpkg --compare-versions "$2" le "0.5.6-r5-1" \ && [ -f /etc/rcS.d/S[0-9][0-9]olsrd ] \ && ! [ -f /etc/rc2.d/S[0-9][0-9]olsrd ] ; then update-rc.d -f olsrd remove fi #DEBHELPER# olsrd-0.6.6.2/debian/rules000066400000000000000000000057141234304727700153250ustar00rootroot00000000000000#!/usr/bin/make -f # Holger Levsen, 2006-12, based on # -*- makefile -*- # Sample debian/rules that uses debhelper. # This file was originally written by Joey Hess and Craig Small. # As a special exception, when this file is copied by dh-make into a # dh-make output file, you may use that output file without restriction. # This special exception was added by Craig Small in version 0.37 of dh-make. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # plugins to be build (not build per default are: powerinfo pgraph mini quagga) # (fixme?: if you add them here, they are build but their README is not # copied to /usr/share/doc/olsrd-plugins/) # # you dont need to edit this file. export PLUGIS=foo ; fakeroot ./debian/rules binary # is enough for a rebuild :) PLUGINS ?= dyn_gw httpinfo dot_draw nameservice secure txtinfo bmf quagga #hack: - also needs debian/patches/240-plugin-install-targets.patch - this has been reported to upstream... PLUGINS_INSTALL ?= dyn_gw_install httpinfo_install dot_draw_install nameservice_install secure_install txtinfo_install bmf_install quagga_install CFLAGS = -Wall -g ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif configure: configure-stamp configure-stamp: dh_testdir # Add here commands to configure the package. QUILT_PATCHES=debian/patches quilt push -a || test $$? = 2 touch configure-stamp build: build-stamp build-stamp: configure-stamp dh_testdir # Add here commands to compile the package. $(MAKE) $(MAKE) $(PLUGINS) touch $@ clean: dh_testdir dh_testroot rm -f build-stamp configure-stamp # Add here commands to clean up after the build process. -$(MAKE) clean_all rm -f $(CURDIR)/lib/*/src/*.o $(CURDIR)/lib/*/*.so.?.? QUILT_PATCHES=debian/patches quilt pop -a -R || test $$? = 2 dh_clean install: build dh_testdir dh_testroot dh_clean -k dh_installdirs # Add here commands to install the package into debian/olsrd. $(MAKE) DESTDIR=$(CURDIR)/debian/olsrd install STRIP=: $(MAKE) DESTDIR=$(CURDIR)/debian/olsrd-plugins LIBDIR=$(CURDIR)/debian/olsrd-plugins/usr/lib/olsrd $(PLUGINS_INSTALL) STRIP=: # Build architecture-independent files here. binary-indep: build install # We have nothing to do by default. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot dh_installchangelogs -polsrd CHANGELOG -polsrd-plugins dh_installdocs dh_installinit dh_installman dh_link dh_strip # compress, but don't compress README_NAMESERVICE, for consistency reasons dh_compress -XREADME_NAMESERVICE -XREADME_BMF # provide better default config rm $(CURDIR)/debian/olsrd/etc/olsrd.conf cp $(CURDIR)/debian/olsrd.conf $(CURDIR)/debian/olsrd/etc/olsrd/olsrd.conf cp $(CURDIR)/debian/olsrd-default $(CURDIR)/debian/olsrd/etc/default/olsrd dh_fixperms dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install configure olsrd-0.6.6.2/debian/todo000066400000000000000000000000711234304727700151270ustar00rootroot00000000000000- remove debian/patches/240-plugin-install-targets.patch olsrd-0.6.6.2/doc/000077500000000000000000000000001234304727700135645ustar00rootroot00000000000000olsrd-0.6.6.2/doc/.gitignore000066400000000000000000000000501234304727700155470ustar00rootroot00000000000000/html/ /latex/ /pdf/ /doxygen.conf.temp olsrd-0.6.6.2/doc/Makefile000066400000000000000000000037541234304727700152350ustar00rootroot00000000000000TOPDIR = .. include $(TOPDIR)/Makefile.inc HTML_DIR = html HTML_OUTPUT = $(HTML_DIR)/$(OS) LATEX_DIR = latex LATEX_OUTPUT = $(LATEX_DIR)/$(OS) PDF_DIR = pdf PDF_OUTPUT = $(PDF_DIR)/olsrd_$(OS).pdf DOX_FILE = doxygen.conf TMP_DOX_FILE = $(DOX_FILE).temp OLSRD_VER = $(shell git describe --dirty --always) DOC_DEFINES = $(shell ./getdefines.bash $(CPPFLAGS) $(CFLAGS)) # All excludes # DOC_INPUT = ../src ../android # DOC_EXCLUDE = ../src/linux ../src/unix ../android ../src/win32 ../src/bsd DOC_INPUT = ../src ../android ifeq ($(OS), linux) DOC_DEFINES += __linux__ DOC_EXCLUDE = ../android ../src/win32 ../src/bsd else ifeq ($(OS), android) DOC_DEFINES += __linux__ _ANDROID DOC_EXCLUDE = ../src/win32 ../src/bsd else ifeq ($(OS), win32) DOC_DEFINES += _WIN32 DOC_EXCLUDE = ../src/linux ../src/unix ../android ../src/bsd else $(error $(OS) not known to the doc makefile) endif endif endif all: default_target default_target: doc .PHONY: .gitignore doc clean clean: @echo "[$@] doc" @rm -fr "$(HTML_DIR)" "$(LATEX_DIR)" "$(PDF_DIR)" "$(TMP_DOX_FILE)" doc: $(DOX_FILE) @echo "[$@] doc" @echo " Cleaning up $(OS) outputs..." @rm -frv "$(HTML_OUTPUT)" "$(LATEX_OUTPUT)" "$(PDF_OUTPUT)" @mkdir -pv "$(HTML_OUTPUT)" @mkdir -pv "$(LATEX_OUTPUT)" @mkdir -pv "$(PDF_DIR)" @echo " Generating doxygen configuration..." @sed \ -e "s/__OLSRD_VER__/$(OLSRD_VER)/" \ -e "s#__OLSRD_NAME__#olsrd ($(OS))#" \ -e "s#__DEFINES__#$(DOC_DEFINES)#" \ -e "s#__INPUT__#$(DOC_INPUT)#" \ -e "s#__EXCLUDE__#$(DOC_EXCLUDE)#" \ -e "s#__HTML_OUTPUT__#$(HTML_OUTPUT)#" \ -e "s#__LATEX_OUTPUT__#$(LATEX_OUTPUT)#" \ "$(DOX_FILE)" > "$(TMP_DOX_FILE)" @echo " Running doxygen to create HTML..." @doxygen "$(TMP_DOX_FILE)" @rm -fv "$(TMP_DOX_FILE)" @echo " Running latex to create a PDF..." @$(MAKE) -s -C $(LATEX_OUTPUT) all @mkdir -pv "$(PDF_DIR)" @mv -v "$(LATEX_OUTPUT)/refman.pdf" "$(PDF_OUTPUT)" @rm -frv "$(LATEX_OUTPUT)" @rmdir -v --ignore-fail-on-non-empty "$(LATEX_DIR)" @echo " Done" olsrd-0.6.6.2/doc/doxygen.conf000066400000000000000000002253071234304727700161210ustar00rootroot00000000000000# Doxyfile 1.8.1.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = "__OLSRD_NAME__" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = "__OLSRD_VER__" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 2 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all # comments according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you # can mix doxygen, HTML, and XML commands with Markdown formatting. # Disable only in case of backward compatibilities issues. MARKDOWN_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields will be shown inline in the documentation # of the scope in which they are defined (i.e. file, namespace, or group # documentation), provided this scope is documented. If set to NO (the default), # structs, classes, and unions are shown on a separate page (for HTML and Man # pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. SYMBOL_CACHE_SIZE = 0 # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # their name and scope. Since this can be an expensive process and often the # same symbol appear multiple times in the code, doxygen keeps a cache of # pre-resolved symbols. If the cache is too small doxygen will become slower. # If the cache is too large, memory is wasted. The cache size is given by this # formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = YES # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. CITE_BIB_FILES = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = __INPUT__ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.c \ *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = __EXCLUDE__ # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C, C++ and Fortran comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 2 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = __HTML_OUTPUT__ # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # style sheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of # entries shown in the various tree structured indices initially; the user # can expand and collapse entries dynamically later on. Doxygen will expand # the tree to such a level that at most the specified number of entries are # visible (unless a fully collapsed tree already exceeds this amount). # So setting the number of entries 1 will produce a full collapsed tree by # default. 0 is a special value representing an infinite number of entries # and will result in a full expanded tree by default. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = __LIBNAME__.chm # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = YES # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = YES # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you may also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to # the MathJax Content Delivery Network so you can quickly see the result without # installing MathJax. # However, it is strongly recommended to install a local # copy of MathJax from http://www.mathjax.org before deployment. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = __LATEX_OUTPUT__ # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = YES # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # http://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = YES # Load style sheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = YES #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = __attribute__(x)= __DEFINES__ # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. For each # tag file the location of the external documentation should be added. The # format of a tag file without this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths # or URLs. Note that each tag file must have a unique name (where the name does # NOT include the path). If a tag file is not located in the directory in which # doxygen is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You need to make sure dot is able to find # the font, which can be done by putting it in a standard location or by setting # the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the # directory containing the font. DOT_FONTNAME = FreeSans.ttf # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If the UML_LOOK tag is enabled, the fields and methods are shown inside # the class node. If there are many fields or methods and many nodes the # graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS # threshold limits the number of items for each type to make the size more # managable. Set this to 0 for no limit. Note that the threshold may be # exceeded by 50% before the limit is enforced. UML_LIMIT_NUM_FIELDS = 10 # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = YES # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = YES # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES olsrd-0.6.6.2/doc/getdefines.bash000077500000000000000000000006011234304727700165400ustar00rootroot00000000000000#!/bin/bash set -e set -u declare -a flags=( ${@} ) declare -i flagscount=${#flags[*]} declare -i i=0 declare regex='^[[:space:]]*-D(.+)[[:space:]]*$' declare result="" while [[ ${i} -lt ${flagscount} ]]; do if [[ -n "$(echo "${flags[i]}" | grep -E "${regex}")" ]]; then result="${result}$(echo "${flags[i]}" | sed -r "s/${regex}/ \1/g")" fi i+=1 done echo "${result}" olsrd-0.6.6.2/files/000077500000000000000000000000001234304727700141215ustar00rootroot00000000000000olsrd-0.6.6.2/files/olsr_switch.8.gz000066400000000000000000000013211234304727700171660ustar00rootroot00000000000000ޞBolsr_switch.8TMo@q$JE&DJaP5U*]kw\;k;͛7DXwWUp Or$թ"g$,LPzH~MW?BDOKqPlG!YW7-?9SgL 9``aR2 nlswVRXLj%}![ ߜE}},)v'Ql5r#|l\۾ _=.YO.$vra|=T \olsrd-0.6.6.2/files/olsrd-adhoc-setup000077500000000000000000000062201234304727700174040ustar00rootroot00000000000000#!/bin/sh #- globals --------------------------------------------------------------------# nmcli="/usr/bin/nmcli --mode tabular" #- functions ------------------------------------------------------------------# get_wlan_if() { if [ -x /sbin/iwconfig ]; then echo `/sbin/iwconfig 2>&1 | grep 'IEEE 802.11' | head -1 | awk '{print $1}'` elif [ -x /usr/bin/nmcli ]; then echo `$nmcli dev list | grep -B6 WIFI-PROPERTIES| head -1 | awk '{print $2}'` else # wild guess, why not... echo "wlan0" fi } get_current_bssid() { if [ -x /sbin/iwgetid ]; then iwgetid --ap --raw fi } #- main -----------------------------------------------------------------------# if [ ! -x /sbin/iwconfig ]; then echo "/sbin/iwconfig required! sudo apt-get install wireless-tools" exit fi if [ -z "$1" ]; then wlan=$(get_wlan_if) else wlan=$1 fi if [ "$wlan" = "" ]; then echo "No wifi network interface found! Perhaps you need to modprobe?" exit fi if [ -z "$2" ]; then channel=5 else channel=$2 fi if [ -z "$3" ]; then essid=commotionwireless.net else essid="$3" fi if [ -z "$4" ]; then bssid=02:ca:ff:ee:ba:be else bssid="$4" fi echo "Setting mesh on '$wlan' to channel $channel:" echo "Attaching to '$essid' with BSSID '$bssid'" # set NetworkManager to play nice if [ -x /usr/bin/nmcli ]; then echo -n "Turning off NetworkManager wifi control: " $nmcli nm sleep false 2> /dev/null $nmcli nm wifi on 2> /dev/null $nmcli dev disconnect iface $wlan 2> /dev/null fi echo -n "Setting up ad-hoc networking: " # ifconfig down before setting ad-hoc mode because some chips require that /sbin/ifconfig $wlan down # disassociate from current BSSID in case an ad-hoc BSSID already stuck there /sbin/iwconfig $wlan ap $bssid sleep 1 /sbin/iwconfig $wlan mode ad-hoc /sbin/iwconfig $wlan channel $channel /sbin/iwconfig $wlan essid $essid /sbin/iwconfig $wlan key off /sbin/iwconfig $wlan rate auto /sbin/iwconfig $wlan txpower auto # many devices don't support the follow options so hide the errors /sbin/iwconfig $wlan modu auto > /dev/null 2>&1 /sbin/iwconfig $wlan commit > /dev/null 2>&1 /sbin/ifconfig $wlan up # some cards want to be configured after the interface is up sleep 5 mode=`iwgetid --mode --raw` if [ "$mode" != "1" ]; then /sbin/iwconfig $wlan mode ad-hoc /sbin/iwconfig $wlan channel $channel /sbin/iwconfig $wlan essid $essid /sbin/iwconfig $wlan commit > /dev/null 2>&1 fi # Wait for things to settle before trying the next step sleep 2 echo "done" echo -n "Setting up IP address: " # get MAC to generate hopefully unique IP address with, by using the last two # hex pairs as the last two hex pairs for the IP address, converting the hex # to decimal first. MAC=`/sbin/ifconfig | grep $wlan | sed 's|.*HWaddr ||'` MAC5=`echo $MAC | cut -d : -f 5` MAC6=`echo $MAC | cut -d : -f 6` ip3=`printf %d 0x$MAC5` ip4=`printf %d 0x$MAC6` net=172.29 ip=$net.$ip3.$ip4 /sbin/ifconfig $wlan inet $ip broadcast $net.255.255 echo "done" echo "OLSR ad-hoc setup on $wlan using $essid on channel $channel with IP $ip" echo " ad-hoc Cell BSSID: `get_current_bssid`" olsrd-0.6.6.2/files/olsrd.8.gz000066400000000000000000000032321234304727700157540ustar00rootroot00000000000000'dColsrd.8X[o6~8S ʥmPC6b-Q6D*n8X2y߹2lJ́H>Ѕk\y:L__ҹj%2F9eO_OdvE󛡈j? hRy]?UFK6^%U6eRot6}kߟH\>nO)I39(Skruz.2hzPEw1bٓiW]|~iJmQ[̀s}*- jx}=>ȢgO#bmx}3w2?>w?ǕKW*k USejĪ/A FS"b/t>7qڑ4˪P2lN~2- ĐγM(|* NB 0Lr3އg'd,JoS3Tb!SPdp }+_{ ,G6Lk 4d%e0o~=x86ShQ61oGE+N 6G8<+wGG:KҜD;OkoO[) #BR5 ďux-kmq+@C=DXޥk(3WNvuZkv.Sl /+ƙ@Ȣ=-vtȰnY W6-tΣ r[ztНSyē”A6QlW.Wm>p?~ܴ *Vc`S?6br=fIg_ $] k[_FoSXF+ՖN/nc\YetNn-qXabGF-J>ITFE,^[)/e)) ,Fv-ny)|x[ #7ϕ9f_Wٝ kh=6Ohvw=ѕP닰(:l>\;h##M a.chJ\π~ UtKwЅm˦UU4|'t{c^{x+/Oj١:anhV`4V044,"EqTأ?آtwo\|1l[[olsrd-0.6.6.2/files/olsrd.conf.5.gz000066400000000000000000000112031234304727700166720ustar00rootroot00000000000000hPolsrd.conf.5[oFh뀃t"+qp,`Z$B6g+ͰIɳn>fI|Dvw4(6\;תG{iTZY95E.vD~GrUe-w=jc5/Rޜ^_[$?]4SSyi97;ws{/&gFLhܓR[RVf&VNdZЊl%=WMVZUSi׹0A:Wi('5b!sp[IƪKt%gZZ]Hh/xZWH=m&T-m)ecXa*sBwm03g'ټ㠠gFV;SV u^;^Nɀ7f %=U:tL ה :Sw7sFcօʬa=֢JxCpz–:N)-[&K8M9^2O PTO*(nZ15'2s VsdgD>K( tNDMҕ۫}8B֕x+u';|VPloed:Ӓs|-T|(C1綴gT*TL\Qi_hP>OS%H Kt$)r4`[J"zk2fH Kl~f2ذk8"Hmu/ֺo/S]\b+jFՊ:%`NŁ aWc5qJ3߅qЃ. ].g+;D|h4bwɞģlg[& pE;2_Zǧ7PMAүҺ6z[Z+7i|\XM+`@qp@{XaQ{HAW\S>*!Ñ3j1\̌\"e, 7yZtotwX!:2ek'*Ӗ= Ljy֮}:xTΓO.q9X\ !hQN?NSW`a];8P 4j`k^吏jf+玤oхjyڍA^YšAK429hd`7on< k6C q13ɊgI Lu@TySEv}{am;.3KB^Cf1ߗ>Vv(Py30Ih?TryQ>Y!ML+4EIz| q T;(9r*9~>XPuaMzCe(ڦ MP yTyO]Ί%'w$Okf[[= s2]P7Np nl_a޴hJm|i62~CPNڜ>s(߅VDbe+ Aw]q_X 0v,`OT46sqɛ%xgw?xhƸ<~S!hb2[C. W vga^Xۻ좑(L@0Z+C45*lSk!\2ےеZ,zv}>@a گTS4 wz'D CWXn޻"18/h.+pOM 7|"|G~cla*gz\'g"c`4.}?wz~~1}$ˑ;1?mjr+?4,33olsrd-0.6.6.2/files/olsrd.conf.commotion000066400000000000000000000020561234304727700201210ustar00rootroot00000000000000 # http://commotionwireless.net/ DebugLevel 0 AllowNoInt yes IpVersion 4 LinkQualityLevel 2 LinkQualityAlgorithm "etx_ffeth" SmartGateway yes Hna4 { # 101.149.21.0 255.255.255.0 # 102.149.21.0 255.255.255.0 # 103.149.21.0 255.255.255.0 } LoadPlugin "olsrd_arprefresh.so.0.1" { } LoadPlugin "olsrd_dyn_gw.so.0.5" { } LoadPlugin "olsrd_nameservice.so.0.3" { # you should set this to your own node name PlParam "name" "commotion-7814921" PlParam "sighup-pid-file" "/var/run/dnsmasq.pid" PlParam "suffix" ".mesh" } LoadPlugin "olsrd_p2pd.so.0.1.0" { PlParam "NonOlsrIf" "eth0" PlParam "P2pdTtl" "5" PlParam "UdpDestPort" "224.0.0.251 5353" } LoadPlugin "olsrd_jsoninfo.so.0.0" { # PlParam "accept" "0.0.0.0" } LoadPlugin "olsrd_txtinfo.so.0.1" { # PlParam "accept" "0.0.0.0" } InterfaceDefaults { # if you using this on Mac OS X, then comment this out because Mac OS X # does weird things with 255.255.255.255. By commenting this out, olsrd # will use the broadcast that's assigned to the network interface Ip4Broadcast 255.255.255.255 } olsrd-0.6.6.2/files/olsrd.conf.default.full000066400000000000000000000526141234304727700205070ustar00rootroot00000000000000# # OLSR.org routing daemon config file # This file contains ALL available options and explanations about them # # Lines starting with a # are discarded # #### ATTENTION for IPv6 users #### # Because of limitations in the parser IPv6 addresses must NOT # begin with a ":", so please add a "0" as a prefix. ########################### ### Basic configuration ### ########################### # keep this settings at the beginning of your first configuration file # Debug level (0-9) # If set to 0 the daemon runs in the background, unless "NoFork" is set to true # (Default is 1) # DebugLevel 1 # IP version to use (4 or 6) # (Default is 4) # IpVersion 4 ################################# ### OLSRd agent configuration ### ################################# # this parameters control the settings of the routing agent which are not # related to the OLSR protocol and it's extensions # Clear the screen each time the internal state changes # (Default is yes) # ClearScreen yes # Should olsrd keep on running even if there are # no interfaces available? This is a good idea # for a PCMCIA/USB hotswap environment. # (Default is yes) # AllowNoInt yes # LockFile # The lockfile is used to prevent multiple OLSR instances running at the same # time. # (Linux/BSD default is "/var/run/olsrd-ipv(4/6).lock") # (Win32 default is "-ipv(4/6).lock") # LockFile "olsrd.lock" # Polling rate for OLSR sockets in seconds (float). # (Default is 0.05) # Pollrate 0.05 # Interval to poll network interfaces for configuration changes (in seconds). # Linux systems can detect interface statechange via netlink sockets. # (Defaults is 2.5) # NicChgsPollInt 2.5 # TOS(type of service) byte value for the IP header of control traffic. # Must be multiple of 4, because OLSR doesn't use ECN # (Default is 192, CS6 - Network Control) # TosValue 192 # FIBMetric controls the metric value of the host-routes OLSRd sets. # - "flat" means that the metric value is always 2. This is the preferred value # because it helps the linux kernel routing to clean up older routes # - "correct" use the hopcount as the metric value. # - "approx" use the hopcount as the metric value too, but does only update the # hopcount if the nexthop changes too # (Default is "flat") # FIBMetric "flat" ####################################### ### Linux specific OLSRd extensions ### ####################################### # these parameters are only working on linux at the moment, but might become # useful on BSD in the future # SrcIpRoutes tells OLSRd to set the Src flag of host routes to the originator-ip # of the node. In addition to this an additional localhost device is created # to make sure the returning traffic can be received. # (Default is "no") # SrcIpRoutes no # Specify the proto tag to be used for routes olsr inserts into kernel # currently only implemented for linux # valid values under linux are 1 .. 254 # 1 gets remapped by olsrd to 0 UNSPECIFIED (1 is reserved for ICMP redirects) # 2 KERNEL routes (not very wise to use) # 3 BOOT (should in fact not be used by routing daemons) # 4 STATIC # 8 .. 15 various routing daemons (gated, zebra, bird, & co) # (defaults to 0 which gets replaced by an OS-specific default value # under linux 3 (BOOT) (for backward compatibility) # RtProto 0 # Specifies the routing Table olsr uses # RtTable is for host routes, RtTableDefault for the route to the default # internet gateway (2 in case of IPv6+NIIT) and RtTableTunnel is for # routes to the ipip tunnels, valid values are 1 to 254 # There is a special parameter "auto" (choose default below) # (with smartgw: default is 254/223/224) # (without smartgw: default is 254/254/254, linux main table) # RtTable auto # RtTableDefault auto # RtTableTunnel auto # Specifies the policy rule priorities for the three routing tables and # a special rule for smartgateway routing (see README-Olsr-Extensions) # Priorities can only be set if three different routing tables are set. # if set the values must obey to condition # RtTablePriority < RtTableDefaultOlsrPriority # < RtTableTunnelPriority < RtTableDefaultPriority. # There are two special parameters, "auto" (choose fitting to SmartGW # mode) and "none" (do not set policy rule) # (with smartgw: default is none/32776/32776/32796) # (without smartgw: default is none/none/none/none) # RtTablePriority auto # RtTableDefaultOlsrPriority auto # RtTableTunnelPriority auto # RtTableDefaultPriority auto # Activates (in IPv6 mode) the automatic use of NIIT # (see README-Olsr-Extensions) # (default is "yes") # UseNiit yes # Activates the smartgateway ipip tunnel feature. # See README-Olsr-Extensions for a description of smartgateways. # (default is "no") # SmartGateway no # Signals that the server tunnel must always be removed on shutdown, # irrespective of the interface up/down state during startup. # (default is "no") # SmartGatewayAlwaysRemoveServerTunnel no # Determines the maximum number of gateways that can be in use at any given # time. This setting is used to mitigate the effects of breaking connections # (due to the selection of a new gateway) on a dynamic network. # (default is 1) # SmartGatewayUseCount 1 # Determines the take-down percentage for a non-current smart gateway tunnel. # If the cost of the current smart gateway tunnel is less than this percentage # of the cost of the non-current smart gateway tunnel, then the non-current smart # gateway tunnel is taken down because it is then presumed to be 'too expensive'. # This setting is only relevant when SmartGatewayUseCount is larger than 1; # a value of 0 will result in the tunnels not being taken down proactively. # (default is 0) # SmartGatewayTakeDownPercentage 0 # Determines the policy routing script that is executed during startup and # shutdown of olsrd. The script is only executed when SmartGatewayUseCount # is set to a value larger than 1. The script must setup policy routing # rules such that multi-gateway mode works. A sample script is included. # (default is not set) # SmartGatewayPolicyRoutingScript "" # Determines the egress interfaces that are part of the multi-gateway setup and # therefore only relevant when SmartGatewayUseCount is larger than 1 (in which # case it must be explicitly set). # (default is not set) # SmartGatewayEgressInterfaces "" # Determines the offset of the smart gateway egress interfaces mark that are # used in the policy routing rules in a multi-gateway setup. Only relevant # when a multi-gateway setup is used. # (default is 91) # SmartGatewayMarkOffsetEgress 91 # Determines the offset of the smart gateway tunnel interfaces mark that are # used in the policy routing rules in a multi-gateway setup. Only relevant # when a multi-gateway setup is used. # The ranges [egress offset, egress offset + egress count] and # [tunnel offset, tunnel offset + use count] are not allowed to overlap. # (default is 101) # SmartGatewayMarkOffsetTunnels 101 # Allows the selection of a smartgateway with NAT (only for IPv4) # (default is "yes") # SmartGatewayAllowNAT yes # Determines the period (in milliseconds) on which a new smart gateway # selection is performed. # (default is 10000 milliseconds) # SmartGatewayPeriod 10000 # Determines the number of times the link state database must be stable # before a new smart gateway is selected. # (default is 6) # SmartGatewayStableCount 6 # When another gateway than the current one has a cost of less than the cost # of the current gateway multiplied by SmartGatewayThreshold then the smart # gateway is switched to the other gateway. The unit is percentage. # (defaults to 0) # SmartGatewayThreshold 0 # The weighing factor for the gateway uplink bandwidth (exit link, uplink). # See README-Olsr-Extensions for a description of smart gateways. # (default is 1) # SmartGatewayWeightExitLinkUp 1 # The weighing factor for the gateway downlink bandwidth (exit link, downlink). # See README-Olsr-Extensions for a description of smart gateways. # (default is 1) # SmartGatewayWeightExitLinkDown 1 # The weighing factor for the ETX costs. # See README-Olsr-Extensions for a description of smart gateways. # (default is 1) # SmartGatewayWeightEtx 1 # The divider for the ETX costs. # See README-Olsr-Extensions for a description of smart gateways. # (default is 0) # SmartGatewayDividerEtx 0 # Defines what kind of Uplink this node will publish as a # smartgateway. The existence of the uplink is detected by # a route to 0.0.0.0/0, ::ffff:0:0/96 and/or 2000::/3. # possible values are "none", "ipv4", "ipv6", "both" # (default is "both") # SmartGatewayUplink "both" # Specifies if the local ipv4 uplink use NAT # (default is "yes") # SmartGatewayUplinkNAT yes # Specifies the speed of the uplink in kilobit/s. # First parameter is upstream, second parameter is downstream # (default is 128/1024) # SmartGatewaySpeed 128 1024 # Specifies the EXTERNAL ipv6 prefix of the uplink. A prefix # length of more than 64 is not allowed. # (default is 0::/0) # SmartGatewayPrefix 0::/0 # Set to yes will make OLSRd to set the file # /proc/sys/net/ipv4/ip_forward to 1 during startup. It will be # restored to the original value during shutdown # Set this to no makes OLSRd check the value, if its not 1 # OLSRd will exit with an error. # (default is yes) # SetIpForward yes ############################## ### OLSR protocol settings ### ############################## # For testing purposes it may be nice to use another port for olsrd # for using another port than the IANA assigned one # for a production network, there should be a good reason!! # valid values are integers >1, please be careful with using reserved # port numbers # (default is 698, the IANA assigned olsr-port) # OlsrPort 698 # Sets the main IP (originator ip) of the router. This IP will NEVER # change during the uptime of olsrd. # (default is 0.0.0.0, which triggers usage of the IP of the first interface) # MainIp 10.0.0.1 # The fixed willingness to use (0-7) # If not set willingness will be calculated # dynamically based on battery/power status # (default is 3) # Willingness 3 # HNA (Host network association) allows the OLSR to announce # additional IPs or IP subnets to the net that are reachable # through this node. # Syntax for HNA4 is "network-address network-mask" # Syntax for HNA6 is "network-address prefix-length" # (default is no HNA) Hna4 { # Internet gateway # 0.0.0.0 0.0.0.0 # specific small networks reachable through this node # 15.15.0.0 255.255.255.0 } Hna6 { # Internet gateway # 0:: 0 # specific small networks reachable through this node # fec0:2200:106:0:0:0:0:0 48 } # Hysteresis for link sensing (only for hopcount metric) # Hysteresis adds more robustness to the link sensing # but delays neighbor registration. # (defaults to yes) # UseHysteresis yes # Hysteresis parameters (only for hopcount metric) # Do not alter these unless you know what you are doing! # Set to auto by default. Allowed values are floating point # values in the interval 0,1 # THR_LOW must always be lower than THR_HIGH!! # (default is 0.5/0.8/0.3) # HystScaling 0.50 # HystThrHigh 0.80 # HystThrLow 0.30 # TC redundancy # Specifies how much neighbor info should be sent in # TC messages. Because of a design problem in the 0.5.x # dijkstra implementation this value must be set to 2. # 2 - send all neighbors # (default is 2) # TcRedundancy 2 # MPR coverage specifies how many MPRs a node should # try select to reach every 2 hop neighbor. Because of # a design problem in the 0.5.x lq mpr selection algorithm # this value should be set to 7. # (default is 7) # MprCoverage 7 ################################ ### OLSR protocol extensions ### ################################ # Link quality level switch between hopcount and # cost-based (mostly ETX) routing. Because of # a design problem in the 0.5.x dijkstra algorithm this # value should not be set to 1. # 0 = do not use link quality # 2 = use link quality for MPR selection and routing # (default is 2) # LinkQualityLevel 2 # Link quality algorithm (only for lq level 2) # (see README-Olsr-Extensions) # - "etx_float", a floating point ETX with exponential aging # - "etx_fpm", same as ext_float, but with integer arithmetic # - "etx_ff" (ETX freifunk), an etx variant which use all OLSR # traffic (instead of only hellos) for ETX calculation # - "etx_ffeth", an incompatible variant of etx_ff that allows # ethernet links with ETX 0.1. # (defaults to "etx_ff") # LinkQualityAlgorithm "etx_ff" # Link quality aging factor (only for lq level 2) # Tuning parameter for etx_float and etx_fpm, smaller values # mean slower changes of ETX value. (allowed values are # between 0.01 and 1.0) # (default is 0.05) # LinkQualityAging 0.05 # Fisheye mechanism for TCs (0 meansoff, 1 means on) # (default is 1) # LinkQualityFishEye 1 # # NatThreshold # # (currently this is only in the freifunk firmware) # If the NAT-Endpoint (the preferred 0/0 HNA emitting node) # is to be changed, the ETX value of the current 0/0 is # multiplied with the NatThreshold value before being # compared to the new one. # The parameter can be a value between 0.1 and 1.0, but # should be close to 1.0 if changed. # WARNING: This parameter should not be used together with # the etx_ffeth metric !! # (defaults to 1.0) # NatThreshold 1.0 ############################################################# ### Configuration of the IPC to the windows GUI interface ### ############################################################# IpcConnect { # Determines how many simultaneously # IPC connections that will be allowed # Setting this to 0 disables IPC # MaxConnections 0 # By default only 127.0.0.1 is allowed # to connect. Here allowed hosts and networks can # be added # Host 127.0.0.1 # Host 10.0.0.5 # Net 192.168.1.0 255.255.255.0 } ##################################### ### Example plugin configurations ### ##################################### # Olsrd plugins to load # This must be the absolute path to the file # or the loader will use the following scheme: # - Try the paths in the LD_LIBRARY_PATH # environment variable. # - The list of libraries cached in /etc/ld.so.cache # - /lib, followed by /usr/lib # # the examples in this list are for linux, so check if the plugin is # available if you use windows/BSD. # each plugin should have a README file in it's lib subfolder # LoadPlugin "olsrd_httpinfo.dll" LoadPlugin "olsrd_httpinfo.so.0.1" { # port number the httpinfo plugin will be listening, default 1978 # PlParam "port" "8000" # ip address that can access the plugin, use "0.0.0.0" # to allow everyone PlParam "Host" "127.0.0.1" # PlParam "Host" "80.23.53.22" # networks that can access the plugin (ip/netmask) # careful with 0.0.0.0/0, makes (ddos) attacks poss. # PlParam "Net" "0.0.0.0 0.0.0.0" PlParam "Net" "104.0.0.0 255.255.0.0" PlParam "Net" "192.168.0.0 255.255.0.0" } # LoadPlugin "olsrd_txtinfo.dll" LoadPlugin "olsrd_txtinfo.so.0.1" { # the default port is 2006 but you can change it like this: #PlParam "port" "8080" # You can set a "accept" single address to allow to connect to # txtinfo. If no address is specified, then localhost (127.0.0.1) # is allowed by default. txtinfo will only use the first "accept" # parameter specified and will ignore the rest. # to allow a specific host: #PlParam "accept" "172.29.44.23" # if you set it to 0.0.0.0, it will accept all connections #PlParam "accept" "0.0.0.0" } # LoadPlugin "olsrd_jsoninfo.dll" LoadPlugin "olsrd_jsoninfo.so.0.0" { # the default port is 2006 but you can change it like this: #PlParam "port" "8080" # You can set a "accept" single address to allow to connect to # jsoninfo. If no address is specified, then localhost (127.0.0.1) # is allowed by default. jsoninfo will only use the first "accept" # parameter specified and will ignore the rest. # to allow a specific host: #PlParam "accept" "172.29.44.23" # if you set it to 0.0.0.0, it will accept all connections #PlParam "accept" "0.0.0.0" # specify a UUID for this node to track it for debugging #PlParam "UUIDFile" "/etc/olsrd/olsrd.uuid" } #LoadPlugin "olsrd_secure.so.0.3" #{ # define source of keyfile for secure plugin # see lib/secure/README_SECURE for more information # PlParam "Keyfile" "/etc/olsr-keyfile.txt" #} #LoadPlugin "olsrd_dyn_gw.so.0.5" #{ # The plugin check interval can be set here in milliseconds. # The default is 1000 ms (1 second). # PlParam "CheckInterval" "5000" # The ping check interval in case there is any pinged host specified. # The default is 5 seconds. # PlParam "PingInterval" "40" # If one or more IPv4 addresses are given, do a ping on these in # descending order to validate that there is not only an entry in # routing table, but also a real network connection. If any of # these addresses could be pinged successfully, the test was # succesful, i.e. if the ping on the 1st address was successful,the # 2nd won't be pinged. # # The Ping list applies to the group of HNAs specified above or to the # default internet gateway when no HNA is specified. # # Running the plugin without parameters acts as the 'old' dyn_gw_plain. # The following ping entries for the internet gateway # PlParam "Ping" "141.1.1.1" # PlParam "Ping" "194.25.2.129" # First group of HNAs with related ping host # PlParam "HNA" "192.168.80.0 255.255.255.0" # PlParam "HNA" "192.168.81.0 255.255.255.0" # PlParam "Ping" "192.168.81.12" # Second HNA group with multiple related ping hosts. # Specifying multiple ping hosts provides redundancy. # PlParam "HNA" "192.168.100.0 255.255.255.0" # PlParam "HNA" "192.168.101.0 255.255.255.0" # PlParam "HNA" "192.168.102.0 255.255.255.0" # PlParam "Ping" "192.168.100.10" # PlParam "Ping" "192.168.101.10" # Third HNA group without ping check # PlParam "HNA" "192.168.200.0 255.255.255.0" # PlParam "HNA" "192.168.201.0 255.255.255.0" # PlParam "HNA" "192.168.202.0 255.255.255.0" #} #LoadPlugin "olsrd_dyn_gw_plain.so.0.4" #{ #} ############################################# ### OLSRD default interface configuration ### ############################################# # the default interface section can have the same values as the following # interface configuration. It will allow you so set common options for all # interfaces. InterfaceDefaults { # Ip4Broadcast 255.255.255.255 } ###################################### ### OLSRd Interfaces configuration ### ###################################### # multiple interfaces can be specified for a single configuration block # multiple configuration blocks can be specified # WARNING, don't forget to insert your interface names here ! Interface "" "" { # Interface Mode is used to prevent unnecessary # packet forwarding on switched ethernet interfaces # valid Modes are "mesh" and "ether" # (default is "mesh") # Mode "mesh" # IPv4 broadcast address for outgoing OLSR packets. # One useful example would be 255.255.255.255 # The second useful value would be to # specify the peer address of an ptp-tunnel. # another name of this parameter is "IPv4Multicast" # (default is 0.0.0.0, which triggers the usage of the # interface broadcast IP) # Ip4Broadcast 0.0.0.0 # IPv6 multicast address # (default is FF02::6D, the manet-router linklocal multicast) # IPv6Multicast FF02::6D # IPv4 src address for outgoing OLSR packages # (default is 0.0.0.0, which triggers usage of the interface IP) # IPv4Src 0.0.0.0 # IPv6 src prefix. OLSRd will choose one of the interface IPs # which matches the prefix of this parameter. # (default is 0::/0, which triggers the usage # of a not-linklocal interface IP) # IPv6Src 0::/0 # Emission intervals in seconds. # If not defined, Freifunk network defaults are used # (default is 2.0/20.0 for Hello and 5.0/300.0 for Tc/Mid/Hna) # HelloInterval 2.0 # HelloValidityTime 20.0 # TcInterval 5.0 # TcValidityTime 300.0 # MidInterval 5.0 # MidValidityTime 300.0 # HnaInterval 5.0 # HnaValidityTime 300.0 # When multiple links exist between hosts # the weight of interface is used to determine # the link to use. Normally the weight is # automatically calculated by olsrd based # on the characteristics of the interface, # but here you can specify a fixed value. # Olsrd will choose links with the lowest value. # Note: # Interface weight is used only when LinkQualityLevel is set to 0. # For any other value of LinkQualityLevel, the interface ETX # value is used instead. # Weight 0 # If a certain route should be preferred # or ignored by the mesh, the Link Quality # value of a node can be multiplied with a factor # entered here. In the example the route # using 192.168.0.1 would rather be ignored. # A multiplier of 0.5 will result in a small # (bad) LinkQuality value and a high (bad) # ETX value. # Note: # Link quality multiplier is used only when # LinkQualityLevel is > 0. # example 1: reduce LQ to 192.168.0.1 by half # LinkQualityMult 192.168.0.1 0.5 # example 2: reduce LQ to all nodes on this interface by 20% # LinkQualityMult default 0.8 } olsrd-0.6.6.2/files/olsrd.conf.default.lq000066400000000000000000000242161234304727700201560ustar00rootroot00000000000000# # OLSR.org routing daemon config file # This file contains the usual options for an ETX based # stationary network without fisheye # (for other options see olsrd.conf.default.full) # # Lines starting with a # are discarded # #### ATTENTION for IPv6 users #### # Because of limitations in the parser IPv6 addresses must NOT # begin with a ":", so please add a "0" as a prefix. ########################### ### Basic configuration ### ########################### # keep this settings at the beginning of your first configuration file # Debug level (0-9) # If set to 0 the daemon runs in the background, unless "NoFork" is set to true # (Default is 1) # DebugLevel 1 # IP version to use (4 or 6) # (Default is 4) # IpVersion 4 ################################# ### OLSRd agent configuration ### ################################# # this parameters control the settings of the routing agent which are not # related to the OLSR protocol and it's extensions # FIBMetric controls the metric value of the host-routes OLSRd sets. # - "flat" means that the metric value is always 2. This is the preferred value # because it helps the linux kernel routing to clean up older routes # - "correct" use the hopcount as the metric value. # - "approx" use the hopcount as the metric value too, but does only update the # hopcount if the nexthop changes too # (Default is "flat") # FIBMetric "flat" ####################################### ### Linux specific OLSRd extensions ### ####################################### # these parameters are only working on linux at the moment, but might become # useful on BSD in the future # SrcIpRoutes tells OLSRd to set the Src flag of host routes to the originator-ip # of the node. In addition to this an additional localhost device is created # to make sure the returning traffic can be received. # (Default is "no") # SrcIpRoutes no # Specify the proto tag to be used for routes olsr inserts into kernel # currently only implemented for linux # valid values under linux are 1 .. 254 # 1 gets remapped by olsrd to 0 UNSPECIFIED (1 is reserved for ICMP redirects) # 2 KERNEL routes (not very wise to use) # 3 BOOT (should in fact not be used by routing daemons) # 4 STATIC # 8 .. 15 various routing daemons (gated, zebra, bird, & co) # (defaults to 0 which gets replaced by an OS-specific default value # under linux 3 (BOOT) (for backward compatibility) # RtProto 0 # Activates (in IPv6 mode) the automatic use of NIIT # (see README-Olsr-Extensions) # (default is "yes") # UseNiit yes # Activates the smartgateway ipip tunnel feature. # See README-Olsr-Extensions for a description of smartgateways. # (default is "no") # SmartGateway no # Signals that the server tunnel must always be removed on shutdown, # irrespective of the interface up/down state during startup. # (default is "no") # SmartGatewayAlwaysRemoveServerTunnel no # Determines the maximum number of gateways that can be in use at any given # time. This setting is used to mitigate the effects of breaking connections # (due to the selection of a new gateway) on a dynamic network. # (default is 1) # SmartGatewayUseCount 1 # Determines the take-down percentage for a non-current smart gateway tunnel. # If the cost of the current smart gateway tunnel is less than this percentage # of the cost of the non-current smart gateway tunnel, then the non-current smart # gateway tunnel is taken down because it is then presumed to be 'too expensive'. # This setting is only relevant when SmartGatewayUseCount is larger than 1; # a value of 0 will result in the tunnels not being taken down proactively. # (default is 0) # SmartGatewayTakeDownPercentage 0 # Determines the policy routing script that is executed during startup and # shutdown of olsrd. The script is only executed when SmartGatewayUseCount # is set to a value larger than 1. The script must setup policy routing # rules such that multi-gateway mode works. A sample script is included. # (default is not set) # SmartGatewayPolicyRoutingScript "" # Determines the egress interfaces that are part of the multi-gateway setup and # therefore only relevant when SmartGatewayUseCount is larger than 1 (in which # case it must be explicitly set). # (default is not set) # SmartGatewayEgressInterfaces "" # Determines the offset of the smart gateway egress interfaces mark that are # used in the policy routing rules in a multi-gateway setup. Only relevant # when a multi-gateway setup is used. # (default is 91) # SmartGatewayMarkOffsetEgress 91 # Determines the offset of the smart gateway tunnel interfaces mark that are # used in the policy routing rules in a multi-gateway setup. Only relevant # when a multi-gateway setup is used. # The ranges [egress offset, egress offset + egress count] and # [tunnel offset, tunnel offset + use count] are not allowed to overlap. # (default is 101) # SmartGatewayMarkOffsetTunnels 101 # Allows the selection of a smartgateway with NAT (only for IPv4) # (default is "yes") # SmartGatewayAllowNAT yes # Determines the period (in milliseconds) on which a new smart gateway # selection is performed. # (default is 10000 milliseconds) # SmartGatewayPeriod 10000 # Determines the number of times the link state database must be stable # before a new smart gateway is selected. # (default is 6) # SmartGatewayStableCount 6 # When another gateway than the current one has a cost of less than the cost # of the current gateway multiplied by SmartGatewayThreshold then the smart # gateway is switched to the other gateway. The unit is percentage. # (defaults to 0) # SmartGatewayThreshold 0 # The weighing factor for the gateway uplink bandwidth (exit link, uplink). # See README-Olsr-Extensions for a description of smart gateways. # (default is 1) # SmartGatewayWeightExitLinkUp 1 # The weighing factor for the gateway downlink bandwidth (exit link, downlink). # See README-Olsr-Extensions for a description of smart gateways. # (default is 1) # SmartGatewayWeightExitLinkDown 1 # The weighing factor for the ETX costs. # See README-Olsr-Extensions for a description of smart gateways. # (default is 1) # SmartGatewayWeightEtx 1 # The divider for the ETX costs. # See README-Olsr-Extensions for a description of smart gateways. # (default is 0) # SmartGatewayDividerEtx 0 # Defines what kind of Uplink this node will publish as a # smartgateway. The existence of the uplink is detected by # a route to 0.0.0.0/0, ::ffff:0:0/96 and/or 2000::/3. # possible values are "none", "ipv4", "ipv6", "both" # (default is "both") # SmartGatewayUplink "both" # Specifies if the local ipv4 uplink use NAT # (default is "yes") # SmartGatewayUplinkNAT yes # Specifies the speed of the uplink in kilobit/s. # First parameter is upstream, second parameter is downstream # (default is 128/1024) # SmartGatewaySpeed 128 1024 # Specifies the EXTERNAL ipv6 prefix of the uplink. A prefix # length of more than 64 is not allowed. # (default is 0::/0 # SmartGatewayPrefix 0::/0 ############################## ### OLSR protocol settings ### ############################## # HNA (Host network association) allows the OLSR to announce # additional IPs or IP subnets to the net that are reachable # through this node. # Syntax for HNA4 is "network-address network-mask" # Syntax for HNA6 is "network-address prefix-length" # (default is no HNA) Hna4 { # Internet gateway # 0.0.0.0 0.0.0.0 # specific small networks reachable through this node # 15.15.0.0 255.255.255.0 } Hna6 { # Internet gateway # 0:: 0 # specific small networks reachable through this node # fec0:2200:106:0:0:0:0:0 48 } ################################ ### OLSR protocol extensions ### ################################ # Link quality algorithm (only for lq level 2) # (see README-Olsr-Extensions) # - "etx_float", a floating point ETX with exponential aging # - "etx_fpm", same as ext_float, but with integer arithmetic # - "etx_ff" (ETX freifunk), an etx variant which use all OLSR # traffic (instead of only hellos) for ETX calculation # - "etx_ffeth", an incompatible variant of etx_ff that allows # ethernet links with ETX 0.1. # (defaults to "etx_ff") # LinkQualityAlgorithm "etx_ff" # Fisheye mechanism for TCs (0 meansoff, 1 means on) # (default is 1) LinkQualityFishEye 0 ##################################### ### Example plugin configurations ### ##################################### # Olsrd plugins to load # This must be the absolute path to the file # or the loader will use the following scheme: # - Try the paths in the LD_LIBRARY_PATH # environment variable. # - The list of libraries cached in /etc/ld.so.cache # - /lib, followed by /usr/lib # # the examples in this list are for linux, so check if the plugin is # available if you use windows/BSD. # each plugin should have a README file in it's lib subfolder # LoadPlugin "olsrd_txtinfo.dll" LoadPlugin "olsrd_txtinfo.so.0.1" { # the default port is 2006 but you can change it like this: #PlParam "port" "8080" # You can set a "accept" single address to allow to connect to # txtinfo. If no address is specified, then localhost (127.0.0.1) # is allowed by default. txtinfo will only use the first "accept" # parameter specified and will ignore the rest. # to allow a specific host: #PlParam "accept" "172.29.44.23" # if you set it to 0.0.0.0, it will accept all connections #PlParam "accept" "0.0.0.0" } ############################################# ### OLSRD default interface configuration ### ############################################# # the default interface section can have the same values as the following # interface configuration. It will allow you so set common options for all # interfaces. InterfaceDefaults { # Ip4Broadcast 255.255.255.255 } ###################################### ### OLSRd Interfaces configuration ### ###################################### # multiple interfaces can be specified for a single configuration block # multiple configuration blocks can be specified # WARNING, don't forget to insert your interface names here ! Interface "" "" { # Interface Mode is used to prevent unnecessary # packet forwarding on switched ethernet interfaces # valid Modes are "mesh" and "ether" # (default is "mesh") # Mode "mesh" } olsrd-0.6.6.2/files/olsrd.conf.default.lq-fisheye000066400000000000000000000242151234304727700216070ustar00rootroot00000000000000# # OLSR.org routing daemon config file # This file contains the usual options for an ETX based # stationary network with fisheye # (for other options see olsrd.conf.default.full) # # Lines starting with a # are discarded # #### ATTENTION for IPv6 users #### # Because of limitations in the parser IPv6 addresses must NOT # begin with a ":", so please add a "0" as a prefix. ########################### ### Basic configuration ### ########################### # keep this settings at the beginning of your first configuration file # Debug level (0-9) # If set to 0 the daemon runs in the background, unless "NoFork" is set to true # (Default is 1) # DebugLevel 1 # IP version to use (4 or 6) # (Default is 4) # IpVersion 4 ################################# ### OLSRd agent configuration ### ################################# # this parameters control the settings of the routing agent which are not # related to the OLSR protocol and it's extensions # FIBMetric controls the metric value of the host-routes OLSRd sets. # - "flat" means that the metric value is always 2. This is the preferred value # because it helps the linux kernel routing to clean up older routes # - "correct" use the hopcount as the metric value. # - "approx" use the hopcount as the metric value too, but does only update the # hopcount if the nexthop changes too # (Default is "flat") # FIBMetric "flat" ####################################### ### Linux specific OLSRd extensions ### ####################################### # these parameters are only working on linux at the moment, but might become # useful on BSD in the future # SrcIpRoutes tells OLSRd to set the Src flag of host routes to the originator-ip # of the node. In addition to this an additional localhost device is created # to make sure the returning traffic can be received. # (Default is "no") # SrcIpRoutes no # Specify the proto tag to be used for routes olsr inserts into kernel # currently only implemented for linux # valid values under linux are 1 .. 254 # 1 gets remapped by olsrd to 0 UNSPECIFIED (1 is reserved for ICMP redirects) # 2 KERNEL routes (not very wise to use) # 3 BOOT (should in fact not be used by routing daemons) # 4 STATIC # 8 .. 15 various routing daemons (gated, zebra, bird, & co) # (defaults to 0 which gets replaced by an OS-specific default value # under linux 3 (BOOT) (for backward compatibility) # RtProto 0 # Activates (in IPv6 mode) the automatic use of NIIT # (see README-Olsr-Extensions) # (default is "yes") # UseNiit yes # Activates the smartgateway ipip tunnel feature. # See README-Olsr-Extensions for a description of smartgateways. # (default is "no") # SmartGateway no # Signals that the server tunnel must always be removed on shutdown, # irrespective of the interface up/down state during startup. # (default is "no") # SmartGatewayAlwaysRemoveServerTunnel no # Determines the maximum number of gateways that can be in use at any given # time. This setting is used to mitigate the effects of breaking connections # (due to the selection of a new gateway) on a dynamic network. # (default is 1) # SmartGatewayUseCount 1 # Determines the take-down percentage for a non-current smart gateway tunnel. # If the cost of the current smart gateway tunnel is less than this percentage # of the cost of the non-current smart gateway tunnel, then the non-current smart # gateway tunnel is taken down because it is then presumed to be 'too expensive'. # This setting is only relevant when SmartGatewayUseCount is larger than 1; # a value of 0 will result in the tunnels not being taken down proactively. # (default is 0) # SmartGatewayTakeDownPercentage 0 # Determines the policy routing script that is executed during startup and # shutdown of olsrd. The script is only executed when SmartGatewayUseCount # is set to a value larger than 1. The script must setup policy routing # rules such that multi-gateway mode works. A sample script is included. # (default is not set) # SmartGatewayPolicyRoutingScript "" # Determines the egress interfaces that are part of the multi-gateway setup and # therefore only relevant when SmartGatewayUseCount is larger than 1 (in which # case it must be explicitly set). # (default is not set) # SmartGatewayEgressInterfaces "" # Determines the offset of the smart gateway egress interfaces mark that are # used in the policy routing rules in a multi-gateway setup. Only relevant # when a multi-gateway setup is used. # (default is 91) # SmartGatewayMarkOffsetEgress 91 # Determines the offset of the smart gateway tunnel interfaces mark that are # used in the policy routing rules in a multi-gateway setup. Only relevant # when a multi-gateway setup is used. # The ranges [egress offset, egress offset + egress count] and # [tunnel offset, tunnel offset + use count] are not allowed to overlap. # (default is 101) # SmartGatewayMarkOffsetTunnels 101 # Allows the selection of a smartgateway with NAT (only for IPv4) # (default is "yes") # SmartGatewayAllowNAT yes # Determines the period (in milliseconds) on which a new smart gateway # selection is performed. # (default is 10000 milliseconds) # SmartGatewayPeriod 10000 # Determines the number of times the link state database must be stable # before a new smart gateway is selected. # (default is 6) # SmartGatewayStableCount 6 # When another gateway than the current one has a cost of less than the cost # of the current gateway multiplied by SmartGatewayThreshold then the smart # gateway is switched to the other gateway. The unit is percentage. # (defaults to 0) # SmartGatewayThreshold 0 # The weighing factor for the gateway uplink bandwidth (exit link, uplink). # See README-Olsr-Extensions for a description of smart gateways. # (default is 1) # SmartGatewayWeightExitLinkUp 1 # The weighing factor for the gateway downlink bandwidth (exit link, downlink). # See README-Olsr-Extensions for a description of smart gateways. # (default is 1) # SmartGatewayWeightExitLinkDown 1 # The weighing factor for the ETX costs. # See README-Olsr-Extensions for a description of smart gateways. # (default is 1) # SmartGatewayWeightEtx 1 # The divider for the ETX costs. # See README-Olsr-Extensions for a description of smart gateways. # (default is 0) # SmartGatewayDividerEtx 0 # Defines what kind of Uplink this node will publish as a # smartgateway. The existence of the uplink is detected by # a route to 0.0.0.0/0, ::ffff:0:0/96 and/or 2000::/3. # possible values are "none", "ipv4", "ipv6", "both" # (default is "both") # SmartGatewayUplink "both" # Specifies if the local ipv4 uplink use NAT # (default is "yes") # SmartGatewayUplinkNAT yes # Specifies the speed of the uplink in kilobit/s. # First parameter is upstream, second parameter is downstream # (default is 128/1024) # SmartGatewaySpeed 128 1024 # Specifies the EXTERNAL ipv6 prefix of the uplink. A prefix # length of more than 64 is not allowed. # (default is 0::/0 # SmartGatewayPrefix 0::/0 ############################## ### OLSR protocol settings ### ############################## # HNA (Host network association) allows the OLSR to announce # additional IPs or IP subnets to the net that are reachable # through this node. # Syntax for HNA4 is "network-address network-mask" # Syntax for HNA6 is "network-address prefix-length" # (default is no HNA) Hna4 { # Internet gateway # 0.0.0.0 0.0.0.0 # specific small networks reachable through this node # 15.15.0.0 255.255.255.0 } Hna6 { # Internet gateway # 0:: 0 # specific small networks reachable through this node # fec0:2200:106:0:0:0:0:0 48 } ################################ ### OLSR protocol extensions ### ################################ # Link quality algorithm (only for lq level 2) # (see README-Olsr-Extensions) # - "etx_float", a floating point ETX with exponential aging # - "etx_fpm", same as ext_float, but with integer arithmetic # - "etx_ff" (ETX freifunk), an etx variant which use all OLSR # traffic (instead of only hellos) for ETX calculation # - "etx_ffeth", an incompatible variant of etx_ff that allows # ethernet links with ETX 0.1. # (defaults to "etx_ff") # LinkQualityAlgorithm "etx_ff" # Fisheye mechanism for TCs (0 meansoff, 1 means on) # (default is 1) # LinkQualityFishEye 1 ##################################### ### Example plugin configurations ### ##################################### # Olsrd plugins to load # This must be the absolute path to the file # or the loader will use the following scheme: # - Try the paths in the LD_LIBRARY_PATH # environment variable. # - The list of libraries cached in /etc/ld.so.cache # - /lib, followed by /usr/lib # # the examples in this list are for linux, so check if the plugin is # available if you use windows/BSD. # each plugin should have a README file in it's lib subfolder # LoadPlugin "olsrd_txtinfo.dll" LoadPlugin "olsrd_txtinfo.so.0.1" { # the default port is 2006 but you can change it like this: #PlParam "port" "8080" # You can set a "accept" single address to allow to connect to # txtinfo. If no address is specified, then localhost (127.0.0.1) # is allowed by default. txtinfo will only use the first "accept" # parameter specified and will ignore the rest. # to allow a specific host: #PlParam "accept" "172.29.44.23" # if you set it to 0.0.0.0, it will accept all connections #PlParam "accept" "0.0.0.0" } ############################################# ### OLSRD default interface configuration ### ############################################# # the default interface section can have the same values as the following # interface configuration. It will allow you so set common options for all # interfaces. InterfaceDefaults { # Ip4Broadcast 255.255.255.255 } ###################################### ### OLSRd Interfaces configuration ### ###################################### # multiple interfaces can be specified for a single configuration block # multiple configuration blocks can be specified # WARNING, don't forget to insert your interface names here ! Interface "" "" { # Interface Mode is used to prevent unnecessary # packet forwarding on switched ethernet interfaces # valid Modes are "mesh" and "ether" # (default is "mesh") # Mode "mesh" } olsrd-0.6.6.2/files/olsrd.conf.default.rfc000066400000000000000000000144271234304727700203170ustar00rootroot00000000000000# # OLSR.org routing daemon config file # This file contains the necessary config options # for an RFC compatible mesh # (for other options see olsrd.conf.default.full) # # Lines starting with a # are discarded # #### ATTENTION for IPv6 users #### # Because of limitations in the parser IPv6 addresses must NOT # begin with a ":", so please add a "0" as a prefix. ########################### ### Basic configuration ### ########################### # keep this settings at the beginning of your first configuration file # Debug level (0-9) # If set to 0 the daemon runs in the background, unless "NoFork" is set to true # (Default is 1) # DebugLevel 1 # IP version to use (4 or 6) # (Default is 4) # IpVersion 4 ################################# ### OLSRd agent configuration ### ################################# # this parameters control the settings of the routing agent which are not # related to the OLSR protocol and it's extensions # FIBMetric controls the metric value of the host-routes OLSRd sets. # - "flat" means that the metric value is always 2. This is the preferred value # because it helps the linux kernel routing to clean up older routes # - "correct" use the hopcount as the metric value. # - "approx" use the hopcount as the metric value too, but does only update the # hopcount if the nexthop changes too # (Default is "flat") # FIBMetric "flat" ####################################### ### Linux specific OLSRd extensions ### ####################################### # these parameters are only working on linux at the moment, but might become # useful on BSD in the future # Activates (in IPv6 mode) the automatic use of NIIT # (see README-Olsr-Extensions) # (default is "yes") UseNiit no # Activates the smartgateway ipip tunnel feature. # See README-Olsr-Extensions for a description of smartgateways. # (default is "yes") SmartGateway no ############################## ### OLSR protocol settings ### ############################## # For testing purposes it may be nice to use another port for olsrd # for using another port than the IANA assigned one # for a production network, there should be a good reason!! # valid values are integers >1, please be careful with using reserved # port numbers # (default is 698, the IANA assigned olsr-port) # OlsrPort 698 # The fixed willingness to use (0-7) # If not set willingness will be calculated # dynamically based on battery/power status # (default is 3) # Willingness 3 # HNA (Host network association) allows the OLSR to announce # additional IPs or IP subnets to the net that are reachable # through this node. # Syntax for HNA4 is "network-address network-mask" # Syntax for HNA6 is "network-address prefix-length" # (default is no HNA) Hna4 { # Internet gateway # 0.0.0.0 0.0.0.0 # specific small networks reachable through this node # 15.15.0.0 255.255.255.0 } Hna6 { # Internet gateway # 0:: 0 # specific small networks reachable through this node # fec0:2200:106:0:0:0:0:0 48 } # Hysteresis for link sensing (only for hopcount metric) # Hysteresis adds more robustness to the link sensing # but delays neighbor registration. # (defaults to yes) # UseHysteresis yes # Hysteresis parameters (only for hopcount metric) # Do not alter these unless you know what you are doing! # Set to auto by default. Allowed values are floating point # values in the interval 0,1 # THR_LOW must always be lower than THR_HIGH!! # (default is 0.5/0.8/0.3) # HystScaling 0.50 # HystThrHigh 0.80 # HystThrLow 0.30 # TC redundancy # Specifies how much neighbor info should be sent in # TC messages. Because of a design problem in the 0.5.x # dijkstra implementation this value must be set to 2. # 2 - send all neighbors # (default is 2) # TcRedundancy 2 # MPR coverage specifies how many MPRs a node should # try select to reach every 2 hop neighbor. Because of # a design problem in the 0.5.x dijkstra algorithm this # value should be set to 7. # (default is 7) # MprCoverage 7 ################################ ### OLSR protocol extensions ### ################################ # Link quality level switch between hopcount and # cost-based (mostly ETX) routing. Because of # a design problem in the 0.5.x dijkstra algorithm this # value should not be set to 1. # 0 = do not use link quality # 2 = use link quality for MPR selection and routing # (default is 2) LinkQualityLevel 0 # Fisheye mechanism for TCs (0 meansoff, 1 means on) # (default is 1) LinkQualityFishEye 0 ##################################### ### Example plugin configurations ### ##################################### # Olsrd plugins to load # This must be the absolute path to the file # or the loader will use the following scheme: # - Try the paths in the LD_LIBRARY_PATH # environment variable. # - The list of libraries cached in /etc/ld.so.cache # - /lib, followed by /usr/lib # # the examples in this list are for linux, so check if the plugin is # available if you use windows/BSD. # each plugin should have a README file in it's lib subfolder # LoadPlugin "olsrd_txtinfo.dll" LoadPlugin "olsrd_txtinfo.so.0.1" { # the default port is 2006 but you can change it like this: #PlParam "port" "8080" # You can set a "accept" single address to allow to connect to # txtinfo. If no address is specified, then localhost (127.0.0.1) # is allowed by default. txtinfo will only use the first "accept" # parameter specified and will ignore the rest. # to allow a specific host: #PlParam "accept" "172.29.44.23" # if you set it to 0.0.0.0, it will accept all connections #PlParam "accept" "0.0.0.0" } ###################################### ### OLSRd Interfaces configuration ### ###################################### # multiple interfaces can be specified for a single configuration block # multiple configuration blocks can be specified # WARNING, don't forget to insert your interface names here ! Interface "" "" { # Emission intervals in seconds. # If not defined, Freifunk network defaults are used # (default is 2.0/20.0 for Hello and 5.0/300.0 for Tc/Mid/Hna) # HelloInterval 2.0 # HelloValidityTime 6.0 # TcInterval 5.0 # TcValidityTime 30.0 # MidInterval 5.0 # MidValidityTime 30.0 # HnaInterval 5.0 # HnaValidityTime 30.0 } olsrd-0.6.6.2/files/olsrd.conf.funkfeuer000066400000000000000000000015451234304727700201110ustar00rootroot00000000000000# # sourced from: http://wiki.funkfeuer.at/index.php/OLSR-Konfiguration # DebugLevel 0 IpVersion 4 AllowNoInt yes FIBMetric "flat" TcRedundancy 2 MprCoverage 5 LinkQualityFishEye 1 LinkQualityAlgorithm "etx_ff" LinkQualityLevel 2 UseHysteresis no LoadPlugin "olsrd_httpinfo.so.0.1" { PlParam "port" "80" PlParam "Net" "0.0.0.0 0.0.0.0" } #Trage hier deine OLSR-Interfaces (funk, lan, tunnel, etc,..) ein InterfaceDefaults { Ip4Broadcast 255.255.255.255 HelloInterval 5.0 HelloValidityTime 100.0 TcInterval 3.0 TcValidityTime 500.0 MidInterval 30.0 MidValidityTime 500.0 HnaInterval 30.0 HnaValidityTime 500.0 } olsrd-0.6.6.2/files/olsrd.conf.minimal_freifunk000066400000000000000000000001541234304727700214310ustar00rootroot00000000000000# # OLSR.org routing daemon config file # # Lines starting with a # are discarded # Interface "wlan0" { } olsrd-0.6.6.2/files/olsrd.ufw.profile000066400000000000000000000001471234304727700174300ustar00rootroot00000000000000[olsrd] title=olsrd description=optimized link-state routing daemon for OLSR mesh networking ports=698 olsrd-0.6.6.2/files/sgw_policy_routing_setup.sh000077500000000000000000000113361234304727700216320ustar00rootroot00000000000000#!/bin/bash set -e set -u ############################################################################### # # SETTINGS # ############################################################################### declare IPVERSION_4="ipv4" declare IPVERSION_6="ipv6" declare MODE_GENERIC="generic" declare MODE_OLSRIF="olsrif" declare MODE_SGWSRVTUN="sgwsrvtun" declare MODE_EGRESSIF="egressif" declare MODE_SGWTUN="sgwtun" declare ADDMODE_ADD="add" declare ADDMODE_DEL="del" ############################################################################### # # HELPER FUNCTIONS # ############################################################################### function usage() { echo "" echo "The script was called as:" echo " ${script} ${arguments[@]:-}" echo "" echo "Usage:" echo " ${script} ipVersion mode addMode [ifname [ifmark]]" echo " - ipVersion: ${IPVERSION_4} or ${IPVERSION_6}" echo " - mode : ${MODE_GENERIC}, ${MODE_OLSRIF}, ${MODE_SGWSRVTUN}, ${MODE_EGRESSIF} or ${MODE_SGWTUN}" echo " - addMode : ${ADDMODE_ADD} or ${ADDMODE_DEL}" echo " - ifname : an interface name, not relevant for generic mode" echo " - ifmark : an interface marking (number), only relevant for ${MODE_EGRESSIF} and ${MODE_SGWTUN} modes" } function error() { local -i firstLine=1 while [ ${#} -gt 0 ]; do if [ ${firstLine} -eq 1 ]; then echo "Error: ${1}" else echo " ${1}" fi firstLine=0 shift 1 done } ############################################################################### # # MODE FUNCTIONS # ############################################################################### function generic() { "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" OUTPUT -j CONNMARK --restore-mark } function olsrif() { "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" PREROUTING -i "${1}" -j CONNMARK --restore-mark } function sgwsrvtun() { "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" PREROUTING -i "${1}" -j CONNMARK --restore-mark } function egressif() { "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" POSTROUTING -m conntrack --ctstate NEW -o "${1}" -j CONNMARK --set-mark "${2}" "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" INPUT -m conntrack --ctstate NEW -i "${1}" -j CONNMARK --set-mark "${2}" "${IP}" ${IP_ARGS} rule "${ADDMODE_IP}" fwmark "${2}" table "${2}" pref "${2}" } function sgwtun() { "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" POSTROUTING -m conntrack --ctstate NEW -o "${1}" -j CONNMARK --set-mark "${2}" "${IP}" ${IP_ARGS} rule "${ADDMODE_IP}" fwmark "${2}" table "${2}" pref "${2}" } ############################################################################### # # MAIN # ############################################################################### declare script="${0}" declare -a arguments=( ${@} ) declare -i argc=${#} # we always need 3 arguments, check it if [ ${argc} -lt 3 ]; then error "Need at least 3 arguments" usage exit 1 fi # get first 3 arguments declare ipVersion=${1} declare mode="${2}" declare addMode="${3}" shift 3 argc=${#} # check IP version argument if [ ! "${ipVersion}" == "${IPVERSION_4}" ] && \ [ ! "${ipVersion}" == "${IPVERSION_6}" ]; then error "Illegal IP version" usage exit 1 fi # check mode argument if [ ! "${mode}" == "${MODE_GENERIC}" ] && \ [ ! "${mode}" == "${MODE_OLSRIF}" ] && \ [ ! "${mode}" == "${MODE_SGWSRVTUN}" ] && \ [ ! "${mode}" == "${MODE_EGRESSIF}" ] && \ [ ! "${mode}" == "${MODE_SGWTUN}" ]; then error "Illegal mode" usage exit 1 fi # check addMode argument if [ ! "${addMode}" == "${ADDMODE_ADD}" ] && \ [ ! "${addMode}" == "${ADDMODE_DEL}" ]; then error "Illegal addMode" usage exit 1 fi # check argument count for all modes if ([ "${mode}" == "${MODE_GENERIC}" ] && [ ${argc} -ne 0 ]) || \ ([ "${mode}" == "${MODE_OLSRIF}" ] && [ ${argc} -ne 1 ]) || \ ([ "${mode}" == "${MODE_SGWSRVTUN}" ] && [ ${argc} -ne 1 ]) || \ ([ "${mode}" == "${MODE_EGRESSIF}" ] && [ ${argc} -ne 2 ]) || \ ([ "${mode}" == "${MODE_SGWTUN}" ] && [ ${argc} -ne 2 ]); then error "Not enough arguments or too many arguments" usage exit 1 fi # process ipVersion argument declare IPTABLES="iptables" declare IPTABLES_ARGS="" declare IP="ip" declare IP_ARGS="-4" if [ "${ipVersion}" == "${IPVERSION_6}" ]; then IPTABLES="ip6tables" IPTABLES_ARGS="" IP="ip" IP_ARGS="-6" fi # process addMode argument declare ADDMODE_IPTABLES="-D" declare ADDMODE_IP="del" if [ "${addMode}" == "${ADDMODE_ADD}" ]; then # first call the delete mode to remove any left-over rules set +e "${mode}" "${@}" 2> /dev/null set -e ADDMODE_IPTABLES="-I" ADDMODE_IP="add" fi # call the mode "${mode}" "${@}" olsrd-0.6.6.2/gcc-warnings000077500000000000000000000023641234304727700153340ustar00rootroot00000000000000#!/bin/sh # # We expect warning options for gcc as arguments and return the ones which are # accepted by the given gcc. # set -ue #set -vx # make sure we do not use some locale .... export LANG=C LC_ALL=C LC_COLLATE=C LC_CTYPE=C LC_MESSAGES=C LC_NUMERIC=C OPTS="" for param; do case "$param" in -[fWm]?*) OPTS="$OPTS $param";; *) echo "Ignoring $param" >&2 esac done testcompile() { $CC $OPTS -x c -o /dev/null - 2>&1 <<- EOF int main(void) { return 0; } EOF } parsetest() { while read error; do case "$error" in *:\ unrecognized\ *option\ \"*) opt="${error#*\"}" opt="${opt%\"*}" ;; *:\ unrecognized\ *option\ \`*) opt="${error#*\`}" opt="${opt%\'*}" ;; *) continue ;; esac # if we come here, we have in $opt the option to remove. and # we remove all instances. And we save agoinst leading "-" NEW_OPTS="" for o in $OPTS; do case "$o" in $opt) : echo "Removed $o" >&2;; *) NEW_OPTS="$NEW_OPTS $o";; esac done OPTS="$NEW_OPTS" done echo $OPTS } testcompile | parsetest exit 0 olsrd-0.6.6.2/gnu-indent.sh000077500000000000000000000021551234304727700154310ustar00rootroot00000000000000#!/bin/sh test -f ${0%/*}/src/cfgparser/oparse.c && { cat>&2 <&2 <>README ii gtk2-engines-pixbuf 2.12.9-3ubuntu5 Pixbuf-based theme for GTK+ 2.x ii libgtk2.0-0 2.12.9-3ubuntu5 The GTK+ graphical user interface library ii libgtk2.0-common 2.12.9-3ubuntu5 Common files for the GTK+ graphical user int ii libgtk2.0-dev 2.12.9-3ubuntu5 Development files for the GTK+ library ii libwxgtk2.6-0 2.6.3.2.2-2ubuntu4 wxWidgets Cross-platform C++ GUI toolkit (GT ii python-gtk2 2.12.1-0ubuntu1 Python bindings for the GTK+ widget set ii python-gtk2-dev 2.12.1-0ubuntu1 GTK+ bindings: devel files olsrd-0.6.6.2/gui/linux-gtk/src/000077500000000000000000000000001234304727700163145ustar00rootroot00000000000000olsrd-0.6.6.2/gui/linux-gtk/src/callbacks.c000066400000000000000000000141611234304727700204020ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "common.h" #include "interface.h" void selection_made(GtkWidget * clist, gint row, gint column __attribute__((unused)), GdkEventButton * event __attribute__((unused)), gpointer data __attribute__((unused))) { gchar *ip, *hops, *gw, *dev; const gchar text[100]; /* Get the text that is stored in the selected row and column * which was clicked in. We will receive it as a pointer in the * argument text. */ gtk_clist_get_text(GTK_CLIST(clist), row, 0, &ip); gtk_clist_get_text(GTK_CLIST(clist), row, 1, &gw); gtk_clist_get_text(GTK_CLIST(clist), row, 2, &hops); gtk_clist_get_text(GTK_CLIST(clist), row, 3, &dev); /* Just prints some information about the selected row */ sprintf((char *)&text[0], "IP:%s\nGATEWAY:%s\nHOPCOUNT:%s\nINTERFACE:%s\n", ip, gw, hops, dev); //gtk_text_buffer_set_text (textBuffer, text, -1); //gtk_text_view_set_buffer((GtkTextView *)text1, textBuffer); //gtk_widget_show (text1); return; } void node_selection(GtkWidget * clist __attribute__((unused)), gint row, gint column __attribute__((unused)), GdkEventButton * event __attribute__((unused)), gpointer data __attribute__((unused))) { gchar *text; struct node *host; struct mid *mids; struct mpr *mprs; struct hna *hnas; int i; gchar *tmpshit[1] = { (gchar *)"" }; /* *Clear the lists */ gtk_clist_clear(GTK_CLIST(mid_list)); gtk_clist_clear(GTK_CLIST(mpr_list)); gtk_clist_clear(GTK_CLIST(hna_list)); i = 0; /* *Get th IP address */ gtk_clist_get_text(GTK_CLIST(node_list), row, 0, &text); /* Get the node */ if (strncmp(text, "local", sizeof("local")) == 0) host = find_node_t(&main_addr); else host = find_node(text); if (host) { /* Timeout the registered MPRs for this node */ time_out_mprs(&host->addr); /* Get mpr pointer AFTER timeout....(another waisted hour...) */ mprs = host->mpr.next; mids = host->mid.next; hnas = host->hna.next; while (mids != &host->mid) { gtk_clist_append(GTK_CLIST(mid_list), tmpshit); gtk_clist_set_text(GTK_CLIST(mid_list), i, 0, ip_to_string(&mids->alias)); i++; mids = mids->next; } i = 0; while (mprs != &host->mpr) { //printf("ADDING MPR : %s\n", ip_to_string(&mprs->addr));fflush(stdout); gtk_clist_append(GTK_CLIST(mpr_list), tmpshit); gtk_clist_set_text(GTK_CLIST(mpr_list), i, 0, ip_to_string(&mprs->addr)); i++; mprs = mprs->next; } i = 0; while (hnas != &host->hna) { gtk_clist_append(GTK_CLIST(hna_list), tmpshit); gtk_clist_set_text(GTK_CLIST(hna_list), i, 0, ip_to_string(&hnas->net)); i++; hnas = hnas->next; } } else { printf("Could not find info about %s!\n", text); } } void packet_selection(GtkWidget * clist __attribute__((unused)), gint row, gint column __attribute__((unused)), GdkEventButton * event __attribute__((unused)), gpointer data __attribute__((unused))) { /* Fetch the packet from the cache */ union olsr_message *pack; char *packet; int y, x; short size; char *content[4]; int mem_size = 10; content[0] = (char *)malloc(mem_size); content[1] = (char *)malloc(mem_size); content[2] = (char *)malloc(mem_size); content[3] = (char *)malloc(mem_size); pack = get_packet(row); packet = (char *)pack; //printf("Got the packet at row %d...\n", row); gtk_clist_clear(GTK_CLIST(packet_content_list)); size = ntohs(pack->v4.olsr_msgsize); for (y = 0; y < size; y += 4) { for (x = 0; x < 4; x++) { if (display_dec) sprintf(content[x], "%03i", (u_char) packet[y + x]); /* Decimal format */ else sprintf(content[x], "%02x", (u_char) packet[y + x]); /* Hex format */ } gtk_clist_append(GTK_CLIST(packet_content_list), content); } free(content[0]); free(content[1]); free(content[2]); free(content[3]); } void column_clicked_callback(GtkWidget * list __attribute__((unused)), gint column __attribute__((unused))) { //printf("You pressed %d\n",column); } extern struct sockaddr_in pin; /* *Connect button callback */ void connect_callback(GtkWidget * widget __attribute__((unused)), gpointer data __attribute__((unused))) { ipc_connect(&pin); } /* *Packet button callback */ void packet_callback(GtkWidget * widget __attribute__((unused)), gpointer data __attribute__((unused))) { if (freeze_packets) { freeze_packets = 0; gtk_button_set_label(GTK_BUTTON(packet_button), "Freeze packets"); } else { freeze_packets = 1; gtk_button_set_label(GTK_BUTTON(packet_button), "Grab packets"); } } /* *Packet display button callback */ void packet_disp_callback(GtkWidget * widget __attribute__((unused)), gpointer data __attribute__((unused))) { if (display_dec) { display_dec = 0; gtk_button_set_label(GTK_BUTTON(packet_disp_button), "Display decimal"); } else { display_dec = 1; gtk_button_set_label(GTK_BUTTON(packet_disp_button), "Display hex"); } } __attribute__((noreturn)) void gui_shutdown(GtkObject * object __attribute__((unused)), gpointer user_data __attribute__((unused))) { printf("Shutting down...\n"); if (ipc_close() < 0) printf("Could not close socket!\n"); printf("BYE-BYE!\n"); exit(0); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/common.h000066400000000000000000000071661234304727700177670ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* *Andreas Tonnesen */ #ifndef _OLSRD_FORNTEND_COMMON #define _OLSRD_FORNTEND_COMMON #include #include #include #include #include #include #include "olsr_protocol.h" #define olsrd_version "olsr.org GUI 0.2.7" #define IPC_INTERVAL 500 //interval for IPC read timeout #define MAXPACKS 20 #define BUFFSIZE 512 extern int connected; extern struct timeval hold_time_nodes; /* Timeout for all nodes */ extern struct timeval now; /* Our address */ union olsr_ip_addr main_addr; union olsr_ip_addr null_addr; int ipversion; int ipsize; char ipv6_buf[100]; /* buffer for IPv6 inet_htop */ int nodes_timeout; int freeze_packets; int display_dec; extern int timeouts; /* *Node info */ struct mid { union olsr_ip_addr alias; struct mid *next; struct mid *prev; }; struct hna { union olsr_ip_addr net; union olsr_ip_addr mask; struct hna *next; struct hna *prev; }; struct mpr { union olsr_ip_addr addr; struct timeval timer; struct mpr *next; struct mpr *prev; }; struct node { union olsr_ip_addr addr; union olsr_ip_addr gw_addr; int hopcount; int display; char dev[5]; struct mid mid; struct hna hna; struct mpr mpr; struct timeval timer; struct node *next; struct node *prev; }; /* *Interface public */ GtkWidget *create_main_window(void); void packet_list_add(char *, char *, char *); void route_list_add(char *, char *, char *, char *); int route_list_del(char *); void route_list_update(char *); void set_net_info(gchar *, int); void set_net_info_offline(void); void update_nodes_list(struct node *); int remove_nodes_list(union olsr_ip_addr *); /* *IPC public */ int ipc_connect(struct sockaddr_in *pin); int ipc_close(void); int ipc_read(void); int ipc_send(void); char *ip_to_string(union olsr_ip_addr *); int gui_itoa(int, char *); /* *Packet.c public */ int add_packet_to_buffer(union olsr_message *, int); union olsr_message *get_packet(int); /* *Nodes.c public */ void init_nodes(void); struct node *find_node(char *); struct node *find_node_t(union olsr_ip_addr *); int update_timer_node(union olsr_ip_addr *, olsr_u8_t); int add_hna_node(union olsr_ip_addr *, union olsr_ip_addr *, union olsr_ip_addr *, olsr_u8_t); int add_mid_node(union olsr_ip_addr *, union olsr_ip_addr *, olsr_u8_t); void init_timer(olsr_u32_t, struct timeval *); gint time_out_nodes(gpointer); int add_node(union olsr_ip_addr *, olsr_u8_t); int add_mpr(union olsr_ip_addr *, union olsr_ip_addr *, struct timeval *); int update_timer_mpr(union olsr_ip_addr *, union olsr_ip_addr *, olsr_u8_t); int time_out_mprs(union olsr_ip_addr *); #endif /* _OLSRD_FORNTEND_COMMON */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/interface.c000066400000000000000000001127251234304727700204300ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "common.h" #include "interface.h" #include "pixmaps.h" #include /* Global widgets */ /* GtkWidget *text1; */ GdkBitmap *mask; int packet_list_size = 0; int route_list_size = 0; int node_list_size = 0; GtkWidget *main_window; GtkWidget * create_main_window(void) { GtkWidget *notebook1; GtkWidget *frame3; GtkWidget *frame4; GtkWidget *hbox1; GtkWidget *vbox1; GtkWidget *scrolledwindow1; GtkWidget *node_label1; GtkWidget *node_label2; GtkWidget *node_label3; GtkWidget *node_label4; GtkWidget *node_label7; GtkWidget *node_label8; GtkWidget *node_label9; GtkWidget *mid_frame; GtkWidget *mpr_frame; GtkWidget *hna_frame; GtkWidget *mid_scrolledwindow; GtkWidget *mpr_scrolledwindow; GtkWidget *hna_scrolledwindow; GtkWidget *Main; GtkWidget *label_routes; GtkWidget *hbox2; GtkWidget *frame2; GtkWidget *scrolledwindow4; GtkWidget *label17; GtkWidget *label18; GtkWidget *label19; GtkWidget *scrolledwindow3; GtkWidget *label13; GtkWidget *label14; GtkWidget *label15; GtkWidget *label16; GtkWidget *label_packets; //GtkWidget *empty_notebook_page2; GtkWidget *label3; GtkWidget *net_vbox; GtkWidget *pack_vbox; GtkWidget *pack_disp_vbox; GtkWidget *disp_frame; GtkWidget *route_frame; GtkWidget *route_stats_frame; GtkWidget *route_scrolledwindow; GtkWidget *route_label1; GtkWidget *route_label2; GtkWidget *route_label3; GtkWidget *route_label4; GtkWidget *route_hbox1; GtkWidget *traffic_label; GtkWidget *settings_label; GtkWidget *settings_hbox1; GtkWidget *about_hbox1; GtkWidget *about_label; GtkWidget *empty1; GdkPixmap *unik_logo_gdk; GtkWidget *unik_logo; /* *The main window */ main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_object_set_data(GTK_OBJECT(main_window), "main_window", main_window); gtk_window_set_title(GTK_WINDOW(main_window), (olsrd_version)); gtk_window_set_default_size(GTK_WINDOW(main_window), 600, 550); gtk_signal_connect(GTK_OBJECT(main_window), "destroy", GTK_SIGNAL_FUNC(gui_shutdown), //GTK_SIGNAL_FUNC(gtk_main_quit), NULL); gtk_window_set_position(GTK_WINDOW(main_window), GTK_WIN_POS_CENTER); /* Position window in center */ gtk_window_set_policy(GTK_WINDOW(main_window), FALSE, TRUE, TRUE); /* No user-resizing */ /* *Initialize the pixmaps */ unik_logo_gdk = gdk_pixmap_colormap_create_from_xpm_d(NULL, gtk_widget_get_colormap(main_window), &mask, NULL, (gchar **) logo_xpm); unik_logo = gtk_pixmap_new(unik_logo_gdk, mask); /* *The notebook */ notebook1 = gtk_notebook_new(); gtk_widget_ref(notebook1); gtk_object_set_data_full(GTK_OBJECT(main_window), "notebook1", notebook1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(notebook1); gtk_container_add(GTK_CONTAINER(main_window), notebook1); /* *The first vbox */ vbox1 = gtk_vbox_new(FALSE, 0); gtk_widget_ref(vbox1); gtk_object_set_data_full(GTK_OBJECT(main_window), "vbox1", vbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(vbox1); //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1); gtk_container_add(GTK_CONTAINER(notebook1), vbox1); /* *The nodes frame */ frame3 = gtk_frame_new("Registered nodes:"); gtk_widget_ref(frame3); gtk_object_set_data_full(GTK_OBJECT(main_window), "frame3", frame3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(frame3); gtk_box_pack_start(GTK_BOX(vbox1), frame3, TRUE, TRUE, 0); gtk_widget_set_size_request(frame3, -1, 300); gtk_container_set_border_width(GTK_CONTAINER(frame3), 1); /* *The scrolled window to contain the node list */ scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL); gtk_widget_ref(scrolledwindow1); gtk_object_set_data_full(GTK_OBJECT(main_window), "scrolledwindow1", scrolledwindow1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(scrolledwindow1); gtk_container_add(GTK_CONTAINER(frame3), scrolledwindow1); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); //gtk_box_pack_start (GTK_BOX (frame3), scrolledwindow1, TRUE, TRUE, 0); //gtk_widget_set_usize (scrolledwindow1, -2, 332); /* *The node list */ node_list = gtk_clist_new(7); gtk_widget_ref(node_list); gtk_object_set_data_full(GTK_OBJECT(main_window), "node_list", node_list, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(node_list); gtk_container_add(GTK_CONTAINER(scrolledwindow1), node_list); gtk_clist_set_column_width(GTK_CLIST(node_list), 0, 150); /* IP */ //gtk_clist_set_column_justification(GTK_CLIST(node_list), 0, GTK_JUSTIFY_CENTER); gtk_clist_set_column_width(GTK_CLIST(node_list), 1, 150); /* gateway */ //gtk_clist_set_column_justification(GTK_CLIST(node_list), 1, GTK_JUSTIFY_CENTER); gtk_clist_set_column_width(GTK_CLIST(node_list), 2, 50); /* hopcount */ gtk_clist_set_column_justification(GTK_CLIST(node_list), 2, GTK_JUSTIFY_CENTER); gtk_clist_set_column_width(GTK_CLIST(node_list), 3, 80); /* dev */ gtk_clist_set_column_justification(GTK_CLIST(node_list), 3, GTK_JUSTIFY_CENTER); gtk_clist_set_column_width(GTK_CLIST(node_list), 4, 70); /* timer */ gtk_clist_set_column_justification(GTK_CLIST(node_list), 4, GTK_JUSTIFY_CENTER); //gtk_clist_set_column_width (GTK_CLIST (node_list), 7, 100); /* last about */ //gtk_clist_set_column_justification(GTK_CLIST(node_list), 7, GTK_JUSTIFY_CENTER); gtk_clist_set_column_width(GTK_CLIST(node_list), 5, 40); /* MID */ gtk_clist_set_column_justification(GTK_CLIST(node_list), 5, GTK_JUSTIFY_CENTER); gtk_clist_set_column_width(GTK_CLIST(node_list), 6, 40); /* HNA */ gtk_clist_set_column_justification(GTK_CLIST(node_list), 6, GTK_JUSTIFY_CENTER); gtk_clist_column_titles_show(GTK_CLIST(node_list)); /* *Row selection callback */ gtk_signal_connect(GTK_OBJECT(node_list), "select_row", GTK_SIGNAL_FUNC(selection_made), NULL); /* *Column selection callback */ gtk_signal_connect(GTK_OBJECT(node_list), "click_column", GTK_SIGNAL_FUNC(column_clicked_callback), NULL); node_label1 = gtk_label_new("Dest"); gtk_widget_ref(node_label1); gtk_object_set_data_full(GTK_OBJECT(main_window), "IP", node_label1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(node_label1); gtk_clist_set_column_widget(GTK_CLIST(node_list), 0, node_label1); node_label2 = gtk_label_new("Gateway"); gtk_widget_ref(node_label2); gtk_object_set_data_full(GTK_OBJECT(main_window), "hops", node_label2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(node_label2); gtk_clist_set_column_widget(GTK_CLIST(node_list), 1, node_label2); node_label3 = gtk_label_new("Metric"); gtk_widget_ref(node_label3); gtk_object_set_data_full(GTK_OBJECT(main_window), "info", node_label3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(node_label3); gtk_clist_set_column_widget(GTK_CLIST(node_list), 2, node_label3); node_label4 = gtk_label_new("Device"); gtk_widget_ref(node_label4); gtk_object_set_data_full(GTK_OBJECT(main_window), "Device", node_label4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(node_label4); gtk_clist_set_column_widget(GTK_CLIST(node_list), 3, node_label4); node_label7 = gtk_label_new("Timer"); gtk_widget_ref(node_label7); gtk_object_set_data_full(GTK_OBJECT(main_window), "LMF", node_label7, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(node_label7); gtk_clist_set_column_widget(GTK_CLIST(node_list), 4, node_label7); /* node_label8 = gtk_label_new ("LMA"); gtk_widget_ref (node_label8); gtk_object_set_data_full (GTK_OBJECT (main_window), "LMA", node_label8, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (node_label8); gtk_clist_set_column_widget (GTK_CLIST (node_list), 7, node_label8); */ node_label8 = gtk_label_new("MID"); gtk_widget_ref(node_label8); gtk_object_set_data_full(GTK_OBJECT(main_window), "MID", node_label8, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(node_label8); gtk_clist_set_column_widget(GTK_CLIST(node_list), 5, node_label8); node_label9 = gtk_label_new("HNA"); gtk_widget_ref(node_label9); gtk_object_set_data_full(GTK_OBJECT(main_window), "HNA", node_label9, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(node_label9); gtk_clist_set_column_widget(GTK_CLIST(node_list), 6, node_label9); gtk_clist_column_titles_active(GTK_CLIST(node_list)); gtk_widget_show_now(node_list); /* *Row selection callback */ gtk_signal_connect(GTK_OBJECT(node_list), "select_row", GTK_SIGNAL_FUNC(node_selection), NULL); /* *The first hbox */ hbox1 = gtk_hbox_new(FALSE, 0); gtk_widget_ref(hbox1); gtk_object_set_data_full(GTK_OBJECT(main_window), "hbox1", hbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(hbox1); gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, FALSE, 0); //gtk_container_add (GTK_CONTAINER (notebook1), hbox1); gtk_container_set_border_width(GTK_CONTAINER(hbox1), 4); gtk_widget_set_size_request(hbox1, -1, 200); /* *The net-info frame */ frame4 = gtk_frame_new("Info:"); gtk_widget_ref(frame4); gtk_object_set_data_full(GTK_OBJECT(main_window), "frame4", frame4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(frame4); gtk_box_pack_start(GTK_BOX(hbox1), frame4, TRUE, TRUE, 0); //gtk_widget_set_size_request(frame4, 200, -1); gtk_container_set_border_width(GTK_CONTAINER(frame4), 1); /* *The net-info hbox */ net_vbox = gtk_vbox_new(FALSE, 0); gtk_widget_ref(net_vbox); gtk_object_set_data_full(GTK_OBJECT(main_window), "net_vbox", net_vbox, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(net_vbox); gtk_container_add(GTK_CONTAINER(frame4), net_vbox); /* *The net-info label field */ net_label = gtk_label_new(NULL); gtk_widget_ref(net_label); gtk_misc_set_alignment((GtkMisc *) net_label, 0, 0); //gtk_label_set_justify((GtkLabel *)net_label,GTK_JUSTIFY_LEFT); gtk_object_set_data_full(GTK_OBJECT(main_window), "net_label", net_label, (GtkDestroyNotify) gtk_widget_unref); //set_net_info("Not connected..."); gtk_widget_show(net_label); gtk_box_pack_start(GTK_BOX(net_vbox), net_label, TRUE, TRUE, 0); //gtk_container_add (GTK_CONTAINER (frame4), net_label); /* *The connect button */ connect_button = gtk_button_new_with_label("Connect to host"); gtk_widget_ref(connect_button); gtk_object_set_data_full(GTK_OBJECT(main_window), "connect_button", connect_button, (GtkDestroyNotify) gtk_widget_unref); /* Connect the "clicked" signal of the button to our callback */ gtk_signal_connect(GTK_OBJECT(connect_button), "clicked", GTK_SIGNAL_FUNC(connect_callback), NULL); gtk_widget_show(connect_button); gtk_box_pack_start(GTK_BOX(net_vbox), connect_button, FALSE, FALSE, 1); gtk_container_set_border_width(GTK_CONTAINER(connect_button), 5); /* *The node MPR info frame */ mpr_frame = gtk_frame_new("MPR:"); gtk_widget_ref(mpr_frame); gtk_object_set_data_full(GTK_OBJECT(main_window), "mpr_frame", mpr_frame, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(mpr_frame); gtk_box_pack_start(GTK_BOX(hbox1), mpr_frame, FALSE, FALSE, 0); //gtk_widget_set_size_request(mid_frame, 125, -1); gtk_container_set_border_width(GTK_CONTAINER(mpr_frame), 1); /* *The scrolledwindow to contain the MPR node info */ mpr_scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_ref(mpr_scrolledwindow); gtk_object_set_data_full(GTK_OBJECT(main_window), "mpr_scrolledwindow", mpr_scrolledwindow, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(mpr_scrolledwindow); gtk_container_add(GTK_CONTAINER(mpr_frame), mpr_scrolledwindow); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(mpr_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_set_border_width(GTK_CONTAINER(mpr_scrolledwindow), 3); /* *The node MID info frame */ mid_frame = gtk_frame_new("MID:"); gtk_widget_ref(mid_frame); gtk_object_set_data_full(GTK_OBJECT(main_window), "mid_frame", mid_frame, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(mid_frame); gtk_box_pack_start(GTK_BOX(hbox1), mid_frame, FALSE, FALSE, 0); //gtk_widget_set_size_request(mid_frame, 125, -1); gtk_container_set_border_width(GTK_CONTAINER(mid_frame), 1); /* *The scrolledwindow to contain the MID node info */ mid_scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_ref(mid_scrolledwindow); gtk_object_set_data_full(GTK_OBJECT(main_window), "mid_scrolledwindow", mid_scrolledwindow, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(mid_scrolledwindow); gtk_container_add(GTK_CONTAINER(mid_frame), mid_scrolledwindow); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(mid_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_set_border_width(GTK_CONTAINER(mid_scrolledwindow), 3); /* *The MPR list */ mpr_list = gtk_clist_new(1); gtk_widget_ref(mpr_list); gtk_object_set_data_full(GTK_OBJECT(main_window), "mpr_list", mpr_list, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(mpr_list); gtk_container_add(GTK_CONTAINER(mpr_scrolledwindow), mpr_list); gtk_clist_set_column_width(GTK_CLIST(mpr_list), 0, 120); /* IP */ gtk_clist_column_titles_hide(GTK_CLIST(mpr_list)); /* *The MID list */ mid_list = gtk_clist_new(1); gtk_widget_ref(mid_list); gtk_object_set_data_full(GTK_OBJECT(main_window), "mid_list", mid_list, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(mid_list); gtk_container_add(GTK_CONTAINER(mid_scrolledwindow), mid_list); gtk_clist_set_column_width(GTK_CLIST(mid_list), 0, 120); /* IP */ gtk_clist_column_titles_hide(GTK_CLIST(mid_list)); /* *The node HNA info frame */ hna_frame = gtk_frame_new("HNA:"); gtk_widget_ref(hna_frame); gtk_object_set_data_full(GTK_OBJECT(main_window), "hna_frame", hna_frame, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(hna_frame); gtk_box_pack_start(GTK_BOX(hbox1), hna_frame, FALSE, FALSE, 0); //gtk_widget_set_size_request(mid_frame, 125, -1); gtk_container_set_border_width(GTK_CONTAINER(hna_frame), 1); /* *The HNA scrolled window */ hna_scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_ref(hna_scrolledwindow); gtk_object_set_data_full(GTK_OBJECT(main_window), "hna_scrolledwindow", hna_scrolledwindow, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(hna_scrolledwindow); gtk_container_add(GTK_CONTAINER(hna_frame), hna_scrolledwindow); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(hna_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_set_border_width(GTK_CONTAINER(hna_scrolledwindow), 3); /* *The HNA list */ hna_list = gtk_clist_new(1); gtk_widget_ref(hna_list); gtk_object_set_data_full(GTK_OBJECT(main_window), "hna_list", hna_list, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(hna_list); gtk_container_add(GTK_CONTAINER(hna_scrolledwindow), hna_list); gtk_clist_set_column_width(GTK_CLIST(hna_list), 0, 120); /* IP */ gtk_clist_column_titles_hide(GTK_CLIST(hna_list)); /* *The "main" notebook page */ Main = gtk_label_new("Main"); gtk_widget_ref(Main); gtk_object_set_data_full(GTK_OBJECT(main_window), "Main", Main, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(Main); gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook1), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook1), 0), Main); /* *The main hbox of the Packet page */ hbox2 = gtk_hbox_new(FALSE, 0); gtk_widget_ref(hbox2); gtk_object_set_data_full(GTK_OBJECT(main_window), "hbox2", hbox2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(hbox2); gtk_container_add(GTK_CONTAINER(notebook1), hbox2); /* *The packet hbox */ pack_vbox = gtk_vbox_new(FALSE, 0); gtk_widget_ref(pack_vbox); gtk_object_set_data_full(GTK_OBJECT(main_window), "pack_vbox", pack_vbox, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pack_vbox); gtk_box_pack_start(GTK_BOX(hbox2), pack_vbox, TRUE, TRUE, 0); /* *The packet frame */ frame2 = gtk_frame_new("Packet"); gtk_widget_ref(frame2); gtk_object_set_data_full(GTK_OBJECT(main_window), "frame2", frame2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(frame2); gtk_box_pack_start(GTK_BOX(pack_vbox), frame2, TRUE, TRUE, 0); /* Do not expand */ /* *Packet list scrolled window */ scrolledwindow4 = gtk_scrolled_window_new(NULL, NULL); gtk_widget_ref(scrolledwindow4); gtk_object_set_data_full(GTK_OBJECT(main_window), "scrolledwindow4", scrolledwindow4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(scrolledwindow4); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow4), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(frame2), scrolledwindow4); /* *The packet list */ packet_list = gtk_clist_new(3); gtk_widget_ref(packet_list); gtk_object_set_data_full(GTK_OBJECT(main_window), "packet_list", packet_list, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(packet_list); gtk_container_add(GTK_CONTAINER(scrolledwindow4), packet_list); gtk_clist_set_column_width(GTK_CLIST(packet_list), 0, 80); /* Type */ gtk_clist_set_column_width(GTK_CLIST(packet_list), 1, 150); /* Origin IP */ gtk_clist_set_column_width(GTK_CLIST(packet_list), 2, 20); /* size */ gtk_clist_column_titles_show(GTK_CLIST(packet_list)); label17 = gtk_label_new("Type"); gtk_widget_ref(label17); gtk_object_set_data_full(GTK_OBJECT(main_window), "label17", label17, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(label17); gtk_clist_set_column_widget(GTK_CLIST(packet_list), 0, label17); label18 = gtk_label_new("Origin"); gtk_widget_ref(label18); gtk_object_set_data_full(GTK_OBJECT(main_window), "label18", label18, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(label18); gtk_clist_set_column_widget(GTK_CLIST(packet_list), 1, label18); label19 = gtk_label_new("Size"); gtk_widget_ref(label19); gtk_object_set_data_full(GTK_OBJECT(main_window), "label19", label19, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(label19); gtk_clist_set_column_widget(GTK_CLIST(packet_list), 2, label19); /* *Row selection callback */ gtk_signal_connect(GTK_OBJECT(packet_list), "select_row", GTK_SIGNAL_FUNC(packet_selection), NULL); /* *The packet button */ packet_button = gtk_button_new_with_label("Grab packets"); gtk_widget_ref(packet_button); gtk_object_set_data_full(GTK_OBJECT(main_window), "packet_button", packet_button, (GtkDestroyNotify) gtk_widget_unref); /* Connect the "clicked" signal of the button to our callback */ gtk_signal_connect(GTK_OBJECT(packet_button), "clicked", GTK_SIGNAL_FUNC(packet_callback), NULL); gtk_widget_show(packet_button); gtk_box_pack_start(GTK_BOX(pack_vbox), packet_button, FALSE, FALSE, 5); /* *The packet disp hbox */ pack_disp_vbox = gtk_vbox_new(FALSE, 0); gtk_widget_ref(pack_disp_vbox); gtk_object_set_data_full(GTK_OBJECT(main_window), "pack_disp_vbox", pack_disp_vbox, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pack_disp_vbox); gtk_box_pack_start(GTK_BOX(hbox2), pack_disp_vbox, TRUE, TRUE, 0); /* *The packet disp frame */ disp_frame = gtk_frame_new("Packet content"); gtk_widget_ref(disp_frame); gtk_object_set_data_full(GTK_OBJECT(main_window), "disp_frame", disp_frame, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(disp_frame); gtk_box_pack_start(GTK_BOX(pack_disp_vbox), disp_frame, TRUE, TRUE, 0); /* Do not expand */ /* *Scrolled window for the packet display *list */ scrolledwindow3 = gtk_scrolled_window_new(NULL, NULL); gtk_widget_ref(scrolledwindow3); gtk_object_set_data_full(GTK_OBJECT(main_window), "scrolledwindow3", scrolledwindow3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(scrolledwindow3); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow3), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(disp_frame), scrolledwindow3); //gtk_box_pack_start (GTK_BOX (disp_frame), scrolledwindow3, TRUE, TRUE, 0); /* *The packet display list */ packet_content_list = gtk_clist_new(4); gtk_widget_ref(packet_content_list); gtk_object_set_data_full(GTK_OBJECT(main_window), "packet_content_list", packet_content_list, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(packet_content_list); gtk_container_add(GTK_CONTAINER(scrolledwindow3), packet_content_list); gtk_clist_set_column_width(GTK_CLIST(packet_content_list), 0, 70); /* 0-7 */ gtk_clist_set_column_justification(GTK_CLIST(packet_content_list), 0, GTK_JUSTIFY_CENTER); gtk_clist_set_column_width(GTK_CLIST(packet_content_list), 1, 70); /* 8-15 */ gtk_clist_set_column_justification(GTK_CLIST(packet_content_list), 1, GTK_JUSTIFY_CENTER); gtk_clist_set_column_width(GTK_CLIST(packet_content_list), 2, 70); /* 16-23 */ gtk_clist_set_column_justification(GTK_CLIST(packet_content_list), 2, GTK_JUSTIFY_CENTER); gtk_clist_set_column_width(GTK_CLIST(packet_content_list), 3, 70); /* 24-31 */ gtk_clist_set_column_justification(GTK_CLIST(packet_content_list), 3, GTK_JUSTIFY_CENTER); gtk_clist_column_titles_show(GTK_CLIST(packet_content_list)); label13 = gtk_label_new("0 - 7"); gtk_widget_ref(label13); gtk_object_set_data_full(GTK_OBJECT(main_window), "label13", label13, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(label13); gtk_clist_set_column_widget(GTK_CLIST(packet_content_list), 0, label13); label14 = gtk_label_new("8 - 15"); gtk_widget_ref(label14); gtk_object_set_data_full(GTK_OBJECT(main_window), "label14", label14, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(label14); gtk_clist_set_column_widget(GTK_CLIST(packet_content_list), 1, label14); label15 = gtk_label_new("16 - 23"); gtk_widget_ref(label15); gtk_object_set_data_full(GTK_OBJECT(main_window), "label15", label15, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(label15); gtk_clist_set_column_widget(GTK_CLIST(packet_content_list), 2, label15); label16 = gtk_label_new("24 - 31"); gtk_widget_ref(label16); gtk_object_set_data_full(GTK_OBJECT(main_window), "label16", label16, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(label16); gtk_clist_set_column_widget(GTK_CLIST(packet_content_list), 3, label16); //gtk_clist_set_selection_mode(GTK_CLIST (packet_content_list), GTK_SELECTION_NONE); /* no selections */ /* *The packet button */ packet_disp_button = gtk_button_new_with_label("Display hex"); gtk_widget_ref(packet_disp_button); gtk_object_set_data_full(GTK_OBJECT(main_window), "packet_disp_button", packet_disp_button, (GtkDestroyNotify) gtk_widget_unref); /* Connect the "clicked" signal of the button to our callback */ gtk_signal_connect(GTK_OBJECT(packet_disp_button), "clicked", GTK_SIGNAL_FUNC(packet_disp_callback), NULL); gtk_widget_show(packet_disp_button); gtk_box_pack_start(GTK_BOX(pack_disp_vbox), packet_disp_button, FALSE, FALSE, 5); /* *The "packets" notebook */ label_packets = gtk_label_new("Packets"); gtk_widget_ref(label_packets); gtk_object_set_data_full(GTK_OBJECT(main_window), "label_packets", label_packets, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(label_packets); gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook1), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook1), 1), label_packets); /* *The route hbox */ route_hbox1 = gtk_hbox_new(FALSE, 0); gtk_widget_ref(route_hbox1); gtk_object_set_data_full(GTK_OBJECT(main_window), "route_hbox1", route_hbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(route_hbox1); //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1); gtk_container_add(GTK_CONTAINER(notebook1), route_hbox1); /* *The routes frame */ route_frame = gtk_frame_new("OLSR routes in kernel:"); gtk_widget_ref(route_frame); gtk_object_set_data_full(GTK_OBJECT(main_window), "route_frame", route_frame, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(route_frame); //gtk_container_add (GTK_CONTAINER (notebook1), route_frame); gtk_widget_set_size_request(route_frame, 200, -1); gtk_box_pack_start(GTK_BOX(route_hbox1), route_frame, TRUE, TRUE, 0); /* Do not expand */ /* *Scrolled window for the packet display *list */ route_scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_ref(route_scrolledwindow); gtk_object_set_data_full(GTK_OBJECT(main_window), "route_scrolledwindow", route_scrolledwindow, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(route_scrolledwindow); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(route_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(route_frame), route_scrolledwindow); //gtk_box_pack_start (GTK_BOX (route_frame), scrolledwindow3, TRUE, TRUE, 0); /* *The routes display list */ route_list = gtk_clist_new(4); gtk_widget_ref(route_list); gtk_object_set_data_full(GTK_OBJECT(main_window), "route_list", route_list, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(route_list); gtk_container_add(GTK_CONTAINER(route_scrolledwindow), route_list); gtk_clist_set_column_width(GTK_CLIST(route_list), 0, 120); /* dest */ //gtk_clist_set_column_justification(GTK_CLIST (route_list), 0, GTK_JUSTIFY_CENTER); gtk_clist_set_column_width(GTK_CLIST(route_list), 1, 120); /* gw */ //gtk_clist_set_column_justification(GTK_CLIST (route_list), 1, GTK_JUSTIFY_CENTER); gtk_clist_set_column_width(GTK_CLIST(route_list), 2, 50); /* weight */ gtk_clist_set_column_justification(GTK_CLIST(route_list), 2, GTK_JUSTIFY_CENTER); gtk_clist_set_column_width(GTK_CLIST(route_list), 3, 70); /* interface */ gtk_clist_set_column_justification(GTK_CLIST(route_list), 3, GTK_JUSTIFY_CENTER); gtk_clist_column_titles_show(GTK_CLIST(route_list)); route_label1 = gtk_label_new("Destination"); gtk_widget_ref(route_label1); gtk_object_set_data_full(GTK_OBJECT(main_window), "route_label1", route_label1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(route_label1); gtk_clist_set_column_widget(GTK_CLIST(route_list), 0, route_label1); route_label2 = gtk_label_new("Gateway"); gtk_widget_ref(route_label2); gtk_object_set_data_full(GTK_OBJECT(main_window), "route_label2", route_label2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(route_label2); gtk_clist_set_column_widget(GTK_CLIST(route_list), 1, route_label2); route_label3 = gtk_label_new("Weight"); gtk_widget_ref(route_label3); gtk_object_set_data_full(GTK_OBJECT(main_window), "route_label3", route_label3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(route_label3); gtk_clist_set_column_widget(GTK_CLIST(route_list), 2, route_label3); route_label4 = gtk_label_new("Interface"); gtk_widget_ref(route_label4); gtk_object_set_data_full(GTK_OBJECT(main_window), "route_label4", route_label4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(route_label4); gtk_clist_set_column_widget(GTK_CLIST(route_list), 3, route_label4); //gtk_clist_set_selection_mode(GTK_CLIST (route_list), GTK_SELECTION_NONE); /* no selections */ /* *The routes stats frame */ route_stats_frame = gtk_frame_new("Stats:"); gtk_widget_ref(route_stats_frame); gtk_object_set_data_full(GTK_OBJECT(main_window), "route_stats_frame", route_stats_frame, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(route_stats_frame); //gtk_container_add (GTK_CONTAINER (notebook1), route_frame); gtk_box_pack_start(GTK_BOX(route_hbox1), route_stats_frame, TRUE, TRUE, 1); /* *The "routes" notebook */ label_routes = gtk_label_new("Routes"); gtk_widget_ref(label_routes); gtk_object_set_data_full(GTK_OBJECT(main_window), "label_routes", label_routes, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(label_routes); gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook1), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook1), 2), label_routes); empty1 = gtk_vbox_new(FALSE, 0); gtk_widget_show(empty1); gtk_container_add(GTK_CONTAINER(notebook1), empty1); /* *The "traffic" notebook */ traffic_label = gtk_label_new("Traffic"); gtk_widget_ref(traffic_label); gtk_object_set_data_full(GTK_OBJECT(main_window), "traffic_label", traffic_label, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(traffic_label); gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook1), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook1), 3), traffic_label); /* *The settings hbox */ settings_hbox1 = gtk_hbox_new(FALSE, 0); gtk_widget_ref(settings_hbox1); gtk_object_set_data_full(GTK_OBJECT(main_window), "settings_hbox1", settings_hbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(settings_hbox1); //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1); gtk_container_add(GTK_CONTAINER(notebook1), settings_hbox1); /* *The settings-info label field */ info_label = gtk_label_new(NULL); gtk_widget_ref(info_label); gtk_misc_set_alignment((GtkMisc *) info_label, 0, 0); //gtk_label_set_justify((GtkLabel *)net_label,GTK_JUSTIFY_LEFT); gtk_object_set_data_full(GTK_OBJECT(main_window), "info_label", info_label, (GtkDestroyNotify) gtk_widget_unref); //set_net_info("Not connected..."); gtk_widget_show(info_label); gtk_box_pack_start(GTK_BOX(settings_hbox1), info_label, TRUE, TRUE, 0); /* *The "settings" notebook */ settings_label = gtk_label_new("Settings"); gtk_widget_ref(settings_label); gtk_object_set_data_full(GTK_OBJECT(main_window), "settings_label", settings_label, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(settings_label); gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook1), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook1), 4), settings_label); /* *The "about" hbox */ about_hbox1 = gtk_hbox_new(FALSE, 0); gtk_widget_ref(about_hbox1); gtk_object_set_data_full(GTK_OBJECT(main_window), "about_hbox1", about_hbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(about_hbox1); //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1); gtk_container_add(GTK_CONTAINER(notebook1), about_hbox1); gtk_container_set_border_width(GTK_CONTAINER(about_hbox1), 10); /* *The about label field */ about_label = gtk_label_new(NULL); gtk_widget_ref(about_label); gtk_misc_set_alignment((GtkMisc *) about_label, 0, 0); gtk_label_set_justify((GtkLabel *) about_label, GTK_JUSTIFY_CENTER); gtk_object_set_data_full(GTK_OBJECT(main_window), "about_label", about_label, (GtkDestroyNotify) gtk_widget_unref); //set_net_info("Not connected..."); gtk_widget_show(about_label); gtk_box_pack_start(GTK_BOX(about_hbox1), unik_logo, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(about_hbox1), about_label, TRUE, TRUE, 0); gtk_widget_show(unik_logo); gtk_label_set_text((GtkLabel *) about_label, "OLSRD-GUI by Andreas Tonnesen (andreto@ifi.uio.no)"); /* *The "about" notebook */ label3 = gtk_label_new("About"); gtk_widget_ref(label3); gtk_object_set_data_full(GTK_OBJECT(main_window), "About", label3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(label3); gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook1), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook1), 5), label3); return main_window; } /* *Add a node to the node list */ void route_list_add(char *dest, char *gw, char *metric, char *dev) { gchar *tmp[4] = { dest, gw, dev, metric }; route_list_size++; gtk_clist_freeze(GTK_CLIST(route_list)); gtk_clist_append(GTK_CLIST(route_list), tmp); gtk_clist_thaw(GTK_CLIST(route_list)); } /* *Update the entyr with IP 'addr' */ void route_list_update(char *addr __attribute__((unused))) { } /* *Delete a node from the node list */ int route_list_del(char *dest) { int i = 0; char *ip; gtk_clist_freeze(GTK_CLIST(route_list)); for (i = 0; i < route_list_size; i++) { gtk_clist_get_text(GTK_CLIST(route_list), i, 0, (gchar **) & ip); if (strcmp(dest, ip) == 0) { //printf("Found %d\n", i); gtk_clist_remove(GTK_CLIST(route_list), i); route_list_size--; gtk_clist_thaw(GTK_CLIST(route_list)); return 1; } } gtk_clist_thaw(GTK_CLIST(route_list)); return 0; } /* *Remove a node from the list */ int remove_nodes_list(union olsr_ip_addr *node) { char *ip; char *in_ip = ip_to_string(node); int i; for (i = 0; i < node_list_size; i++) { gtk_clist_get_text(GTK_CLIST(node_list), i, 0, (gchar **) & ip); if (strcmp(in_ip, ip) == 0) { //printf("Found entry!\n"); gtk_clist_remove(GTK_CLIST(node_list), i); node_list_size--; return 1; } } return 0; } /* *If the node passed as a parameter exists then *update it. If not add it to the list */ void update_nodes_list(struct node *node) { int i = 0; char *ip; int found = 0; char *dest; char *tmp[9] = { (char *)"", (char *)"", (char *)"", (char *)"", (char *)"", (char *)"", (char *)"", (char *)"", (char *)"" }; char timer[20]; struct tm *time_st; char itoa_buf[10]; if (memcmp(&node->addr, &main_addr, ipsize) == 0) dest = (char *)"local"; else dest = ip_to_string(&node->addr); gtk_clist_freeze(GTK_CLIST(node_list)); while ((i < node_list_size) && !found) { gtk_clist_get_text(GTK_CLIST(node_list), i, 0, (gchar **) & ip); if (strcmp(dest, ip) == 0) found = 1; i++; } /* Update node */ if (found) { i--; /* Go backt to the right row */ //printf("Updating %s\n\n", ip_to_string(&node->addr)); /* don't update main addr */ /* Gateway */ if (memcmp(&node->addr, &main_addr, ipsize) != 0) { if (memcmp(&node->gw_addr, &null_addr, ipsize) != 0) gtk_clist_set_text(GTK_CLIST(node_list), i, 1, ip_to_string(&node->gw_addr)); /* Weigth */ if (node->hopcount != 0) { gui_itoa(node->hopcount, itoa_buf); gtk_clist_set_text(GTK_CLIST(node_list), i, 2, itoa_buf); } /* Device */ gtk_clist_set_text(GTK_CLIST(node_list), i, 3, &node->dev[0]); } /* Timer */ if (node->timer.tv_usec) { memset(&timer[0], 0, 20); time_st = localtime((time_t *) & node->timer.tv_sec); sprintf(&timer[0], "%02d:%02d:%02d", time_st->tm_hour, time_st->tm_min, time_st->tm_sec); gtk_clist_set_text(GTK_CLIST(node_list), i, 4, &timer[0]); } /* MID */ if (node->mid.next != &node->mid) gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "yes"); else gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "no"); /* HNA */ if (node->hna.next != &node->hna) gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "yes"); else gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "no"); } /* Add new node */ else { i = node_list_size; /* Create entry */ gtk_clist_insert(GTK_CLIST(node_list), i, tmp); /* Main address */ gtk_clist_set_text(GTK_CLIST(node_list), i, 0, dest); if (memcmp(&node->addr, &main_addr, ipsize) == 0) { if (memcmp(&node->gw_addr, &null_addr, ipsize) != 0) gtk_clist_set_text(GTK_CLIST(node_list), i, 1, ip_to_string(&node->gw_addr)); /* Weigth */ if (node->hopcount != 0) { gui_itoa(node->hopcount, itoa_buf); gtk_clist_set_text(GTK_CLIST(node_list), i, 2, itoa_buf); } /* Device */ gtk_clist_set_text(GTK_CLIST(node_list), i, 3, &node->dev[0]); } /* MID */ if (node->mid.next != &node->mid) gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "yes"); else gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "no"); /* HNA */ if (node->hna.next != &node->hna) gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "yes"); else gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "no"); node_list_size++; } gtk_clist_thaw(GTK_CLIST(node_list)); } /* *Add a packet to the packet list */ void packet_list_add(char *type, char *from, char *length) { gchar *nfo[3] = { type, from, length }; //if(!freeze_packets) //{ if (packet_list_size >= MAXPACKS) gtk_clist_remove(GTK_CLIST(packet_list), MAXPACKS - 1); else packet_list_size++; gtk_clist_prepend(GTK_CLIST(packet_list), nfo); //} } void set_net_info(gchar * info, int disp_button) { gchar title[255]; memset(&title[0], 0, sizeof(title)); gtk_label_set_text((GtkLabel *) info_label, info); gtk_label_set_text((GtkLabel *) net_label, "Connected"); snprintf(&title[0], sizeof(title), "%s - %s", olsrd_version, ip_to_string(&main_addr)); gtk_window_set_title(GTK_WINDOW(main_window), title); if (disp_button) gtk_widget_show(connect_button); else gtk_widget_hide(connect_button); } void set_net_info_offline(void) { gtk_label_set_text((GtkLabel *) net_label, "Connection refused..."); gtk_widget_show(connect_button); } void set_net_info_connecting(void) { gtk_label_set_text((GtkLabel *) net_label, "Connecting..."); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/interface.h000066400000000000000000000041521234304727700204270ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif /* HAVE_CONFIG_H */ #include #include #include #include #include #include #include GtkWidget *net_label; GtkWidget *info_label; GtkTextBuffer *textBuffer; GtkWidget *connect_button; GtkWidget *packet_list; GtkWidget *packet_content_list; GtkWidget *packet_button; GtkWidget *packet_disp_button; GtkWidget *node_list; GtkWidget *mid_list; GtkWidget *mpr_list; GtkWidget *hna_list; GtkWidget *route_list; void fill_clist(GtkCList *); void selection_made(GtkWidget * clist, gint row, gint column, GdkEventButton * event, gpointer data); void set_net_info_connecting(void); void column_clicked_callback(GtkWidget *, gint); void connect_callback(GtkWidget * widget, gpointer data); void packet_callback(GtkWidget * widget, gpointer data); void packet_disp_callback(GtkWidget * widget, gpointer data); void packet_selection(GtkWidget * clist, gint row, gint column, GdkEventButton * event, gpointer data); void node_selection(GtkWidget * clist, gint row, gint column, GdkEventButton * event, gpointer data); void gui_shutdown(GtkObject *, gpointer); /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/ipc.c000066400000000000000000000415361234304727700172440ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "common.h" #include "ipc.h" #include "packet.h" #include "routes.h" #ifdef _WIN32 #define close(x) closesocket(x) #undef errno #define errno WSAGetLastError() #undef strerror #define strerror(x) StrError(x) #define perror(x) WinSockPError(x) #endif /* _WIN32 */ int ipc_socket = 0; int ipc_close(void) { if (close(ipc_socket)) return 1; return 0; } int ipc_connect(struct sockaddr_in *pin) { #ifdef _WIN32 int On = 1; unsigned long Len; #else /* _WIN32 */ int flags; #endif /* _WIN32 */ connected = 0; if (!ipc_socket) if ((ipc_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } printf("Attempting connect..."); /* connect to PORT on HOST */ if (connect(ipc_socket, (struct sockaddr *)pin, sizeof(*pin)) < 0) { fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno)); set_net_info_offline(); printf("connection refused\n"); } else { set_net_info((gchar *)"Connected!", FALSE); printf("Connected!!\n"); /* Setting socket non-blocking */ #ifdef _WIN32 if (WSAIoctl(ipc_socket, FIONBIO, &On, sizeof(On), NULL, 0, &Len, NULL, NULL) < 0) { fprintf(stderr, "Error while making socket non-blocking!\n"); exit(1); } #else /* _WIN32 */ if ((flags = fcntl(ipc_socket, F_GETFL, 0)) < 0) { fprintf(stderr, "Error getting socket flags!\n"); exit(1); } if (fcntl(ipc_socket, F_SETFL, flags | O_NONBLOCK) < 0) { fprintf(stderr, "Error setting socket flags!\n"); exit(1); } #endif /* _WIN32 */ connected = 1; return 1; } return 0; } int ipc_read(void) { //int x, i; int bytes, tmp_len; char *tmp; union olsr_message *msg; union { char buf[BUFFSIZE + 1]; union olsr_message olsr_msg; } inbuf; //char buf[BUFFSIZE+1]; //printf(".");fflush(stdout); memset(&inbuf, 0, sizeof(inbuf)); //buf[0] = '\0'; if (connected) { bytes = recv(ipc_socket, (char *)&inbuf, BUFFSIZE, 0); if (bytes == 0) { shutdown(ipc_socket, SHUT_RDWR); set_net_info((gchar *)"Disconnected from server...", TRUE); connected = 0; close(ipc_socket); } if (bytes > 0) { tmp = (char *)&inbuf.olsr_msg; /* x = 0; printf("\n\t"); for(i = 0; i < bytes;i++) { if(x == 4) { x = 0; printf("\n\t"); } x++; printf(" %03i", (u_char) tmp[i]); } printf("\n\nBytes read: %d - msg_size: %d\n", bytes, ntohs(inbuf.olsr.v4.olsr_packlen)); */ msg = &inbuf.olsr_msg; /* There can be(there probably are!) several packets in the buffer */ /* Should be the same for v4 and v6 */ if (ntohs(inbuf.olsr_msg.v4.olsr_msgsize) < bytes) { //printf("chomping...\n"); while (ntohs(msg->v4.olsr_msgsize) < bytes) { ipc_evaluate_message(msg); tmp_len = ntohs(msg->v4.olsr_msgsize); msg = (union olsr_message *)&tmp[tmp_len]; tmp = &tmp[tmp_len]; if (tmp_len == 0) break; bytes = bytes - tmp_len; tmp_len = ntohs(msg->v4.olsr_msgsize); //printf("%d/%d ", tmp_len, bytes); /* Copy to start of buffer */ if (tmp_len > bytes) { /* Copy the buffer */ //printf("READING END OF MESSAGE. %d bytes\n", tmp_len-bytes); //printf("\tCopying %d bytes\n", bytes); memcpy(&inbuf, tmp, bytes); //printf("\tReceiving %d bytes to buffer[%d]\n", tmp_len-bytes, bytes); bytes = recv(ipc_socket, (char *)&inbuf.buf[bytes], tmp_len - bytes, 0); //printf("\tBytes: %d Size: %d\n", bytes, ntohs(msgs->v4.olsr_packlen)); tmp = (char *)&inbuf.olsr_msg; msg = (union olsr_message *)tmp; } } //printf("\n"); } /* Only one (or the last) message */ ipc_evaluate_message(msg); } } return 1; } int ipc_send(void) { return 1; } int ipc_evaluate_message(union olsr_message *olsr_in) { int ipc_pack = 0; olsr_u8_t type; int msgsize; char itoa_buf[10]; olsr_u8_t vtime; union olsr_ip_addr *originator; /* Find size, vtime, originator and type - same for IPv4 and 6 */ type = olsr_in->v4.olsr_msgtype; msgsize = ntohs(olsr_in->v4.olsr_msgsize); vtime = olsr_in->v4.olsr_vtime; originator = (union olsr_ip_addr *)&olsr_in->v4.originator; gui_itoa(msgsize, itoa_buf); switch (type) { case HELLO_MESSAGE: //printf("Received HELLO packet\n"); if (!freeze_packets) packet_list_add((char *)"HELLO", ip_to_string(originator), itoa_buf); if (ipversion == AF_INET) { process_hello(msgsize, vtime, originator, (union hello_message *)&olsr_in->v4.message.hello); } else { process_hello(msgsize, vtime, originator, (union hello_message *)&olsr_in->v6.message.hello); } break; case TC_MESSAGE: if (!freeze_packets) packet_list_add((char *)"TC", ip_to_string(originator), itoa_buf); if (ipversion == AF_INET) { process_tc(msgsize, vtime, originator, (union tc_message *)&olsr_in->v4.message.tc); //printf("Received TC packet from %s\n", ip_to_string(&m->olsr_tc->tc_origaddr)); } else { process_tc(msgsize, vtime, originator, (union tc_message *)&olsr_in->v6.message.tc); //printf("Received TC packet from %s\n", ip_to_string(&m->olsr_tc->tc_origaddr)); } break; case MID_MESSAGE: if (!freeze_packets) packet_list_add((char *)"MID", ip_to_string(originator), itoa_buf); if (ipversion == AF_INET) { process_mid(msgsize, vtime, originator, (union mid_message *)&olsr_in->v4.message.mid); //printf("Received MID packet from %s\n", ip_to_string(&m->olsr_mid->mid_origaddr)); } else { process_mid(msgsize, vtime, originator, (union mid_message *)&olsr_in->v6.message.mid); //printf("Received MID packet from %s\n", ip_to_string(&m->olsr_mid->mid_origaddr)); } break; case HNA_MESSAGE: if (!freeze_packets) packet_list_add((char *)"HNA", ip_to_string(originator), itoa_buf); if (ipversion == AF_INET) { process_hna(msgsize, vtime, originator, (union hna_message *)&olsr_in->v4.message.hna); //printf("Received HNA packet\n"); } else { process_hna(msgsize, vtime, originator, (union hna_message *)&olsr_in->v6.message.hna); //printf("Received HNA packet\n"); } break; case IPC_MESSAGE: //printf("Received IPC packet\n"); ipc_pack = 1; /* Don't add to buffer */ ipc_eval_route_packet((struct routemsg *)olsr_in); break; case IPC_NET: //printf("Received IPC packet\n"); ipc_pack = 1; /* Don't add to buffer */ ipc_eval_net_info((struct netmsg *)olsr_in); break; default: if (!freeze_packets) { char unk_label[8]; sprintf(unk_label, "%d", type); packet_list_add(unk_label, ip_to_string(originator), itoa_buf); } printf("Unknown packet type %d\n", type); break; } if (!freeze_packets && !ipc_pack) { add_packet_to_buffer(olsr_in, msgsize); } return 1; } int ipc_eval_net_info(struct netmsg *msg) { char info[256]; printf("Evaluating NET info...\n"); /* printf("\tMain address: %s\n", ip_to_string(&msg->main_addr)); printf("\tMid addresses: %d\n", msg->mids); printf("\tHna addresses: %d\n", msg->hnas); printf("\tHELLO interval: %f\n", (float)(ntohs(msg->hello_int))); printf("\tHELLO LAN interval: %f\n", (float)(ntohs(msg->hello_lan_int))); printf("\tTC interval: %d\n", ntohs(msg->tc_int)); printf("\tNeighbor hold time: %d\n", ntohs(msg->neigh_hold)); printf("\tTopology hold: %d\n", ntohs(msg->topology_hold)); */ if (msg->ipv6 == 0) { ipversion = AF_INET; ipsize = sizeof(struct in_addr); sprintf(&info[0], "IP version 4\nMain address: %s\nMid addresses: %d\nHna addresses: %d\nHELLO interval: %d\nHELLO LAN interval: %d\nTC interval: %d\nNeighbor hold time: %d\nTopology hold: %d\n", ip_to_string(&msg->main_addr), msg->mids, msg->hnas, ntohs(msg->hello_int), ntohs(msg->hello_lan_int), ntohs(msg->tc_int), ntohs(msg->neigh_hold), ntohs(msg->topology_hold)); } else { ipversion = AF_INET6; ipsize = sizeof(struct in6_addr); sprintf(&info[0], "IP version 6\nMain address: %s\nMid addresses: %d\nHna addresses: %d\nHELLO interval: %d\nHELLO LAN interval: %d\nTC interval: %d\nNeighbor hold time: %d\nTopology hold: %d\n", ip_to_string(&msg->main_addr), msg->mids, msg->hnas, ntohs(msg->hello_int), ntohs(msg->hello_lan_int), ntohs(msg->tc_int), ntohs(msg->neigh_hold), ntohs(msg->topology_hold)); } memcpy(&main_addr, &msg->main_addr, ipsize); set_net_info(&info[0], 0); return 0; } int ipc_eval_route_packet(struct routemsg *msg) { struct route_entry rt_ent; char dev[5]; char gw[16]; char itoa_buf[10]; dev[4] = '\0'; memset(&gw[0], 0, 16); printf("Processing route packet\n"); memset(rt_ent.if_name, 0, MAX_IF_NAMESIZ); /* Fill struct */ memcpy(&rt_ent.gw, &msg->gateway_addr, ipsize); memcpy(&rt_ent.dst, &msg->target_addr, ipsize); memcpy(rt_ent.if_name, msg->device, 4); rt_ent.hopcnt = msg->metric; if (msg->add) { memcpy(&dev[0], &msg->device[0], 4); /*Add node to node list */ memcpy(&gw[0], ip_to_string(&msg->gateway_addr), 16); gui_itoa(msg->metric, itoa_buf); route_list_add(ip_to_string(&msg->target_addr), gw, dev, itoa_buf); printf("\tRoute to %s(hc %d) added\n", ip_to_string(&msg->target_addr), rt_ent.hopcnt); /* printf("\tRoute to %s added\n", ip_to_string(&msg->target_addr)); printf("\tGateway %s\n", gw); printf("\tInterface %s\n", msg->device); printf("\tMetric %d\n", msg->metric); */ } else { if (route_list_del(ip_to_string(&msg->target_addr)) < 1) printf("COULD NOT FIND ROUTE TO DELETE!\n\n"); printf("\tRoute to %s deleted\n", ip_to_string(&msg->target_addr)); } return 1; } int process_hello(int size, olsr_u8_t vtime, union olsr_ip_addr *originator, union hello_message *m) { struct hellinfo *neigh; struct hellinfo6 *neigh6; int i; int nsize; int type; //int link; printf("Processing HELLO from %s size = %d\n", ip_to_string(originator), size); if (!update_timer_node(originator, vtime)) add_node(originator, vtime); /* Add neighbors if any */ size = size - 4 - 8 - ipsize; /* size of neighbors(size - olsrheder- helloheader) */ if (!size) return 0; /* Get the neighbortype-blocks start */ neigh = m->v4.hell_info; neigh6 = m->v6.hell_info; //printf("HELLO Size: %d\n", size); while (size > 0) { //printf("\tNEIGH: 0x%x\n", (int)neigh); if (ipversion == AF_INET) { nsize = ntohs(neigh->size); type = EXTRACT_STATUS(ntohs(neigh->link_code)); //link = EXTRACT_LINK(ntohs(neigh->link_code)); //printf("TYPE: %d\n", neigh->link_code); } else { nsize = ntohs(neigh6->size); type = EXTRACT_STATUS(ntohs(neigh6->link_code)); //link = EXTRACT_LINK(ntohs(neigh6->link_code)); } size -= nsize; nsize = nsize - 4; /* - hellinfo header */ //printf("Size left: %d Current hellinfo: %d\n", size, nsize); i = 0; while (nsize > 0) { //printf("Adding neighbor %s...\n", ip_to_string((union olsr_ip_addr *)&neigh->neigh_addr[i])); /* if(MPR) update_timer_mpr((union olsr_ip_addr *)&mprsinfo->addr, originator); */ if (ipversion == AF_INET) { /* Update MPRs */ if (type == MPR_NEIGH) { //printf("MPR from HELLO\n"); update_timer_mpr((union olsr_ip_addr *)&neigh->neigh_addr[i], originator, vtime); } add_node((union olsr_ip_addr *)&neigh->neigh_addr[i++], vtime); } else { if (type == MPR_NEIGH) { /* Update MPRs */ //printf("MPR from HELLO\n"); update_timer_mpr((union olsr_ip_addr *)&neigh6->neigh_addr[i], originator, vtime); } add_node((union olsr_ip_addr *)&neigh6->neigh_addr[i++], vtime); } nsize = nsize - ipsize; //printf("Nsize: %d\n", nsize); } neigh = (struct hellinfo *)&neigh->neigh_addr[i]; neigh6 = (struct hellinfo6 *)&neigh6->neigh_addr[i]; } //printf("DONE\n"); return 0; } int process_tc(int size, olsr_u8_t vtime, union olsr_ip_addr *originator, union tc_message *m) { struct neigh_info *mprsinfo = NULL; struct neigh_info6 *mprsinfo6 = NULL; printf("Processing TC from %s size = %d\n", ip_to_string(originator), size); /* Updating timer */ if (!update_timer_node(originator, vtime)) add_node(originator, vtime); /* Calculate size of the mprsinfo */ size = size - 4 - 8 - ipsize; //printf("TC Size: %d\n", size); if (ipversion == AF_INET) mprsinfo = &m->v4.neigh[0]; else mprsinfo6 = &m->v6.neigh[0]; while (size > 0) { if (ipversion == AF_INET) { //printf("\tprocessing TC: %s\n", ip_to_string((union olsr_ip_addr *)&mprsinfo->addr)); add_node((union olsr_ip_addr *)&mprsinfo->addr, vtime); update_timer_mpr((union olsr_ip_addr *)&mprsinfo->addr, originator, vtime); mprsinfo++; } else { //printf("\tprocessing TC: %s\n", ip_to_string((union olsr_ip_addr *)&mprsinfo6->addr)); //printf("TC: add node %s\n", ip_to_string((union olsr_ip_addr *)&mprsinfo6->addr)); add_node((union olsr_ip_addr *)&mprsinfo6->addr, vtime); update_timer_mpr((union olsr_ip_addr *)&mprsinfo6->addr, originator, vtime); mprsinfo6++; } size = size - ipsize; //printf("\tsize: %d\n", size); } //printf("DONE\n"); return 0; } int process_mid(int size, olsr_u8_t vtime, union olsr_ip_addr *originator, union mid_message *m) { struct midaddr *midaddr = NULL; struct midaddr6 *midaddr6 = NULL; printf("Processing MID from %s size = %d\n", ip_to_string(originator), size); /* Calculate size of the midinfo */ size = size - 4 - 4 - ipsize; if (ipversion == AF_INET) midaddr = &m->v4.mid_addr[0]; else midaddr6 = &m->v6.mid_addr[0]; //printf("MID size: %d\n", size); while (size > 0) { if (ipversion == AF_INET) { //printf("MID: add node %s\n", ip_to_string((union olsr_ip_addr *)&midaddr->addr)); add_mid_node(originator, (union olsr_ip_addr *)&midaddr->addr, vtime); midaddr++; } else { add_mid_node(originator, (union olsr_ip_addr *)&midaddr6->addr, vtime); //printf("MID: add node %s\n", ip_to_string((union olsr_ip_addr *)&midaddr6->addr)); midaddr6++; } size = size - ipsize; } //printf("DONE\n"); return 0; } int process_hna(int size, olsr_u8_t vtime, union olsr_ip_addr *originator, union hna_message *m) { struct hnapair *hnapairs = NULL; struct hnapair6 *hnapairs6 = NULL; printf("Processing HNA size = %d\n", size); /* Calculate size of the hnainfo */ size = size - 4 - 4 - ipsize; if (ipversion == AF_INET) hnapairs = &m->v4.hna_net[0]; else hnapairs6 = &m->v6.hna_net[0]; while (size > 0) { if (ipversion == AF_INET) { //printf("\tHNA:%s\n", ip_to_string((union olsr_ip_addr *)&hnapairs->addr)); add_hna_node(originator, (union olsr_ip_addr *)&hnapairs->addr, (union olsr_ip_addr *)&hnapairs->netmask, vtime); hnapairs++; } else { add_hna_node(originator, (union olsr_ip_addr *)&hnapairs6->addr, (union olsr_ip_addr *)&hnapairs6->netmask, vtime); hnapairs6++; } size = size - ipsize - ipsize; } return 0; } char * ip_to_string(union olsr_ip_addr *addr) { char *ret; struct in_addr in; if (ipversion == AF_INET) { in = addr->v4; ret = inet_ntoa(in); } else { /* IPv6 */ ret = (char *)inet_ntop(AF_INET6, &addr->v6, ipv6_buf, sizeof(ipv6_buf)); } return ret; } int gui_itoa(int i, char *buf) { char tmp[10]; if (snprintf(buf, sizeof(tmp), "%hd", i)) { /* This shitty string needs to be converted to UTF-8 */ snprintf(tmp, sizeof(tmp), "%s", g_locale_to_utf8(buf, -1, NULL, NULL, NULL)); strcpy(buf, tmp); return 1; //return ret; } return 0; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/ipc.h000066400000000000000000000050051234304727700172400ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include #include #include #include #include #include #include "olsr_protocol.h" #include "packet.h" #define IPC_PORT 1212 #define IPC_MESSAGE 11 /* IPC to front-end telling of route changes */ #define IPC_NET 12 /* IPC to front end net-info */ //int ipc_socket; int connected; /* *AND: *IPC message sent to the front-end *at every route update. Both delete *and add */ struct routemsg { olsr_u8_t msgtype; olsr_u16_t size; olsr_u8_t metric; olsr_u8_t add; union olsr_ip_addr target_addr; union olsr_ip_addr gateway_addr; char device[4]; }; struct netmsg { olsr_u8_t msgtype; olsr_u16_t size; olsr_u8_t mids; /* No. of extra interfaces */ olsr_u8_t hnas; /* No. of HNA nets */ olsr_u8_t unused1; olsr_u16_t hello_int; olsr_u16_t hello_lan_int; olsr_u16_t tc_int; olsr_u16_t neigh_hold; olsr_u16_t topology_hold; olsr_u8_t ipv6; union olsr_ip_addr main_addr; }; /* *Private functions */ int ipc_get_socket(void); int ipc_evaluate_message(union olsr_message *); int ipc_eval_route_packet(struct routemsg *); int ipc_eval_net_info(struct netmsg *); int process_hello(int, olsr_u8_t, union olsr_ip_addr *, union hello_message *); int process_tc(int, olsr_u8_t, union olsr_ip_addr *, union tc_message *); int process_mid(int, olsr_u8_t, union olsr_ip_addr *, union mid_message *); int process_hna(int, olsr_u8_t, union olsr_ip_addr *, union hna_message *); /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/main.c000066400000000000000000000061041234304727700174050ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "common.h" #include "main.h" #include "ipc.h" struct sockaddr_in pin; int main(int argc, char *argv[]) { struct hostent *hp; struct in_addr in; #ifdef _WIN32 WSADATA WsaData; #endif /* _WIN32 */ GtkWidget *main_window; #ifdef _WIN32 if (WSAStartup(0x0202, &WsaData)) { fprintf(stderr, "Could not initialize WinSock.\n"); exit(1); } #endif /* _WIN32 */ /* Get IP */ if ((hp = gethostbyname(argc > 1 ? argv[1] : "localhost")) == 0) { fprintf(stderr, "Not a valid host \"%s\"\n", argv[1]); exit(1); } in.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr; printf("Address: %s\n", inet_ntoa(in)); /* fill in the socket structure with host information */ memset(&pin, 0, sizeof(pin)); pin.sin_family = AF_INET; pin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr; pin.sin_port = htons(IPC_PORT); gtk_init(&argc, &argv); init_nodes(); freeze_packets = 1; display_dec = 1; /* "Failsafe" values */ ipversion = AF_INET; ipsize = sizeof(struct in_addr); main_window = create_main_window(); gtk_widget_show(main_window); printf("Done building GUI\n"); memset(&main_addr, 0, sizeof(union olsr_ip_addr)); memset(&null_addr, 0, sizeof(union olsr_ip_addr)); /* Terminate signal */ signal(SIGINT, shutdown_); /* Init node timeout */ nodes_timeout = NEIGHB_HOLD_TIME_NW; init_timer((olsr_u32_t) (nodes_timeout * 1000), &hold_time_nodes); ipc_connect(&pin); add_timeouts(); gtk_main(); return 0; } /* *Timeouts */ int add_timeouts(void) { /* *Check socket for messages every IPC_INTERVAL *milliseconds */ gtk_timeout_add(IPC_INTERVAL, ipc_timeout, NULL); /* *Time out nodes */ timeouts = 5; /* Wait 5 times befor starting timing out nodes */ gtk_timeout_add(TOP_HOLD_TIME, time_out_nodes, NULL); return 1; } gint ipc_timeout(gpointer data __attribute__((unused))) { ipc_read(); return 1; } __attribute__((noreturn)) void shutdown_(int sig) { int errNr = errno; printf("Cleaning up...\n"); if (ipc_close() < 0) printf("Could not close socket!\n"); printf("BYE-BYE!\n"); errno = errNr; exit(sig); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/main.h000066400000000000000000000020551234304727700174130ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include int timeouts; int add_timeouts(void); gint ipc_timeout(gpointer); void shutdown_(int); /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/nodes.c000066400000000000000000000406761234304727700176050ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "common.h" #include "nodes.h" #include void init_nodes(void) { nodes.next = &nodes; nodes.prev = &nodes; } /* *Insert a new node in the list *NB! The list is NOT checked for duplicates!! */ struct node * insert_node(struct node *n, olsr_u8_t vtime) { struct node *new_node; printf("Inserting node %s\n", ip_to_string((union olsr_ip_addr *)&n->addr)); if ((new_node = malloc(sizeof(struct node))) == 0) { fprintf(stderr, "OUT OF MEMORY!\n"); exit(1); } memcpy(new_node, n, sizeof(struct node)); /* queue */ nodes.next->prev = new_node; new_node->next = nodes.next; nodes.next = new_node; new_node->prev = &nodes; new_node->hna.next = &new_node->hna; new_node->hna.prev = &new_node->hna; new_node->mid.next = &new_node->mid; new_node->mid.prev = &new_node->mid; new_node->mpr.next = &new_node->mpr; new_node->mpr.prev = &new_node->mpr; update_timer_node(&n->addr, vtime); return new_node; } /** *Add a new node to the set */ int add_node(union olsr_ip_addr *node, olsr_u8_t vtime) { struct node new; struct node *tmp_nodes; struct timeval tmp_timer; double dbl_time; olsr_u32_t time_value; struct mid *tmp_mid; dbl_time = me_to_double(vtime); time_value = (olsr_u32_t) dbl_time *1000; tmp_timer.tv_sec = time_value / 1000; tmp_timer.tv_usec = (time_value - (tmp_timer.tv_sec * 1000)) * 1000; /* Check if node exists */ for (tmp_nodes = nodes.next; tmp_nodes != &nodes; tmp_nodes = tmp_nodes->next) { if (memcmp(&tmp_nodes->addr, node, ipsize) == 0) { //printf("updating timer for node %s\n", ip_to_string(node)); //printf("Updatimng timer for: %s\n", ip_to_string(node)); //printf("Secs: %d, usecs: %d\n", (int)tmp_timer.tv_sec, (int)tmp_timer.tv_usec); gettimeofday(&now, (struct timezone *)NULL); timeradd(&now, &tmp_timer, &tmp_nodes->timer); return 0; } /* Check MID */ for (tmp_mid = tmp_nodes->mid.next; tmp_mid != &tmp_nodes->mid; tmp_mid = tmp_mid->next) { if (memcmp(&tmp_mid->alias, node, ipsize) == 0) { //printf("updating timer for node %s\n", ip_to_string(node)); //printf("Updatimng timer for (MID): %s\n", ip_to_string(&tmp_nodes->addr)); //printf("Secs: %d, usecs: %d\n", (int)tmp_timer.tv_sec, (int)tmp_timer.tv_usec); gettimeofday(&now, (struct timezone *)NULL); timeradd(&now, &tmp_timer, &tmp_nodes->timer); return 0; } } } /* New node */ memset(&new, 0, sizeof(struct node)); memcpy(&new.addr, node, ipsize); new.display = 1; printf("1:"); insert_node(&new, vtime); update_nodes_list(&new); return 1; } int update_timer_node(union olsr_ip_addr *node, olsr_u8_t vtime) { struct node *tmp_nodes; struct timeval tmp_timer; double dbl_time; olsr_u32_t time_value; dbl_time = me_to_double(vtime); time_value = (olsr_u32_t) dbl_time *1000; tmp_timer.tv_sec = time_value / 1000; tmp_timer.tv_usec = (time_value - (tmp_timer.tv_sec * 1000)) * 1000; //printf("Updatimng timer for: %s\n", ip_to_string(node)); //printf("Secs: %d, usecs: %d\n", (int)tmp_timer.tv_sec, (int)tmp_timer.tv_usec); for (tmp_nodes = nodes.next; tmp_nodes != &nodes; tmp_nodes = tmp_nodes->next) { if (memcmp(&tmp_nodes->addr, node, ipsize) == 0) { //printf("updating timer for node %s\n", ip_to_string(node)); gettimeofday(&now, (struct timezone *)NULL); timeradd(&now, &tmp_timer, &tmp_nodes->timer); if (tmp_nodes->display) update_nodes_list(tmp_nodes); return 1; } } return 0; } /** *Updates the hold time for the mpr 'mpr' registered on *the node 'node'. Adds the mpr to the node if not already *registered. *@param node the node that has chosen the MPR *@param mpr the MPR chosen by the node *@param vtime the expiration time *@return 0 if node was added, 1 if not */ int update_timer_mpr(union olsr_ip_addr *node, union olsr_ip_addr *mpr, olsr_u8_t vtime) { struct node *tmp_nodes; struct mpr *tmp_mpr; struct timeval tmp_timer; double dbl_time; olsr_u32_t time_value; dbl_time = me_to_double(vtime); time_value = (olsr_u32_t) dbl_time *1000; tmp_timer.tv_sec = time_value / 1000; tmp_timer.tv_usec = (time_value - (tmp_timer.tv_sec * 1000)) * 1000; //printf("Updatimng MPR timer for: %s\n", ip_to_string(node)); //printf("Secs: %d, usecs: %d\n", (int)tmp_timer.tv_sec, (int)tmp_timer.tv_usec); //printf("Updatimng timer for: %s\n", ip_to_string(node)); for (tmp_nodes = nodes.next; tmp_nodes != &nodes; tmp_nodes = tmp_nodes->next) { if (memcmp(&tmp_nodes->addr, node, ipsize) == 0) { for (tmp_mpr = tmp_nodes->mpr.next; tmp_mpr != &tmp_nodes->mpr; tmp_mpr = tmp_mpr->next) { if (memcmp(&tmp_mpr->addr, mpr, ipsize) == 0) { //printf("updating timer for MPR %s ", ip_to_string(mpr)); //printf("node %s\n", ip_to_string(node)); gettimeofday(&now, (struct timezone *)NULL); timeradd(&now, &tmp_timer, &tmp_mpr->timer); return 1; } } /* Only add if parent is added */ add_mpr(node, mpr, &tmp_timer); return 0; } } return 0; } int add_mid_node(union olsr_ip_addr *node, union olsr_ip_addr *alias, olsr_u8_t vtime) { struct node *tmp_nodes; struct mid *tmp_mid; struct node new, *inserted; //printf("MID_add: %s\n", ip_to_string(alias)); //update_timer_node(node, vtime); for (tmp_nodes = nodes.next; tmp_nodes != &nodes; tmp_nodes = tmp_nodes->next) { if (memcmp(&tmp_nodes->addr, node, ipsize) == 0) { for (tmp_mid = tmp_nodes->mid.next; tmp_mid != &tmp_nodes->mid; tmp_mid = tmp_mid->next) { if (memcmp(&tmp_mid->alias, alias, ipsize) == 0) return 0; } /* we didn't find the address */ printf("(1)NEW MID %s ", ip_to_string(alias)); printf("ADDED FOR %s\n", ip_to_string(node)); if ((tmp_mid = malloc(sizeof(struct mid))) == 0) { fprintf(stderr, "OUT OF MEMORY\n"); exit(1); } memcpy(&tmp_mid->alias, alias, ipsize); tmp_nodes->mid.next->prev = tmp_mid; tmp_mid->next = tmp_nodes->mid.next; tmp_nodes->mid.next = tmp_mid; tmp_mid->prev = &tmp_nodes->mid; remove_node_addr(alias); // Remove if already registered as a node update_nodes_list(tmp_nodes); return 1; } } /*New node */ printf("ADDING NEW NODE %s FROM MID...\n", ip_to_string(node)); /* We don't know wery much... */ memset(&new, 0, sizeof(struct node)); memcpy(&new.addr, node, ipsize); inserted = insert_node(&new, vtime); if ((tmp_mid = malloc(sizeof(struct mid))) == 0) { fprintf(stderr, "OUT OF MEMORY!\n"); exit(1); } memcpy(&tmp_mid->alias, alias, ipsize); tmp_mid->next = &inserted->mid; tmp_mid->prev = &inserted->mid; inserted->mid.next = tmp_mid; inserted->mid.prev = tmp_mid; update_nodes_list(inserted); return 2; } int add_hna_node(union olsr_ip_addr *node, union olsr_ip_addr *net, union olsr_ip_addr *mask, olsr_u8_t vtime) { struct node *tmp_nodes; struct hna *tmp_hna; struct node new, *inserted; //printf("HNA: %s\n", ip_to_string(&net)); update_timer_node(node, vtime); for (tmp_nodes = nodes.next; tmp_nodes != &nodes; tmp_nodes = tmp_nodes->next) { if (memcmp(&tmp_nodes->addr, node, ipsize) == 0) { for (tmp_hna = tmp_nodes->hna.next; tmp_hna != &tmp_nodes->hna; tmp_hna = tmp_hna->next) { if ((memcmp(&tmp_hna->net, net, ipsize) == 0) && (memcmp(&tmp_hna->mask, mask, ipsize) == 0)) return 0; } //printf("NEW HNA ADDED FOR %s ", ip_to_string(node)); //printf("net: %s \n", ip_to_string(&net)); /* we didn't find the address */ if ((tmp_hna = malloc(sizeof(struct hna))) == 0) { fprintf(stderr, "OUT OF MEMORY\n"); exit(1); } memcpy(&tmp_hna->net, net, ipsize); memcpy(&tmp_hna->mask, mask, ipsize); /* queue */ tmp_nodes->hna.next->prev = tmp_hna; tmp_hna->next = tmp_nodes->hna.next; tmp_nodes->hna.next = tmp_hna; tmp_hna->prev = &tmp_nodes->hna; update_nodes_list(tmp_nodes); return 1; } } printf("ADDING NEW NODE %s FROM HNA...\n", ip_to_string(node)); /* We don't know wery much... */ memset(&new, 0, sizeof(struct node)); memcpy(&new.addr, node, ipsize); inserted = insert_node(&new, vtime); if ((tmp_hna = malloc(sizeof(struct hna))) == 0) { fprintf(stderr, "OUT OF MEMORY!\n"); exit(1); } memcpy(&tmp_hna->net, net, ipsize); memcpy(&tmp_hna->mask, mask, ipsize); tmp_hna->next = &inserted->hna; tmp_hna->prev = &inserted->hna; inserted->hna.next = tmp_hna; inserted->hna.prev = tmp_hna; update_nodes_list(inserted); return 2; } /** *Add the MPR mpr to the node nodes selected MPRs. *Nodes are NOT added if they are not yet registered! * *@param node the node that has chosen an MPR *@param mpr the MPR choosen by node *@param tmp_timer the expiration time *@return negative if node already registered or node not found */ int add_mpr(union olsr_ip_addr *node, union olsr_ip_addr *mpr, struct timeval *tmp_timer) { struct node *tmp_nodes; struct mpr *mprs; struct mpr *tmp_mpr; for (tmp_nodes = nodes.next; tmp_nodes != &nodes; tmp_nodes = tmp_nodes->next) { if (memcmp(&tmp_nodes->addr, node, ipsize) == 0) { for (mprs = tmp_nodes->mpr.next; mprs != &tmp_nodes->mpr; mprs = mprs->next) { if (memcmp(&mprs->addr, mpr, ipsize) == 0) return 0; } //printf("Adding MPR %s to ", ip_to_string(mpr)); //printf("%s\n", ip_to_string(node)); /* Add mpr */ if ((tmp_mpr = malloc(sizeof(struct mpr))) == 0) { fprintf(stderr, "OUT OF MEMORY\n"); exit(1); } memcpy(&tmp_mpr->addr, mpr, ipsize); gettimeofday(&now, (struct timezone *)NULL); timeradd(&now, tmp_timer, &tmp_mpr->timer); /* queue */ tmp_nodes->mpr.next->prev = tmp_mpr; tmp_mpr->next = tmp_nodes->mpr.next; tmp_nodes->mpr.next = tmp_mpr; tmp_mpr->prev = &tmp_nodes->mpr; update_nodes_list(tmp_nodes); return 1; } } return 1; } int remove_node(struct node *node) { struct hna *tmp_hna, *tmp_hna2; struct mid *tmp_mid, *tmp_mid2; struct mpr *tmp_mpr, *tmp_mpr2; printf("Remove node %s\n", ip_to_string(&node->addr)); tmp_hna = node->hna.next; while (tmp_hna != &node->hna) { tmp_hna2 = tmp_hna; tmp_hna = tmp_hna->next; free(tmp_hna2); } tmp_mpr = node->mpr.next; while (tmp_mpr != &node->mpr) { tmp_mpr2 = tmp_mpr; tmp_mpr = tmp_mpr->next; free(tmp_mpr2); } tmp_mid = node->mid.next; while (tmp_mid != &node->mid) { tmp_mid2 = tmp_mid; tmp_mid = tmp_mid->next; free(tmp_mid2); } /* Gemove form GUI */ remove_nodes_list(&node->addr); /* Dequeue */ node->prev->next = node->next; node->next->prev = node->prev; free(node); return 1; } /* * Remove based on address */ int remove_node_addr(union olsr_ip_addr *node) { struct node *tmp_nodes; struct hna *tmp_hna, *tmp_hna2; struct mid *tmp_mid, *tmp_mid2; struct mpr *tmp_mpr, *tmp_mpr2; printf("Remove node %s\n", ip_to_string(node)); tmp_nodes = nodes.next; while (tmp_nodes != &nodes) { if (memcmp(&tmp_nodes->addr, node, ipsize) == 0) { printf("(2)Deleting node %s\n", ip_to_string((union olsr_ip_addr *)&tmp_nodes->addr)); tmp_hna = tmp_nodes->hna.next; while (tmp_hna != &tmp_nodes->hna) { tmp_hna2 = tmp_hna; tmp_hna = tmp_hna->next; free(tmp_hna2); } tmp_mpr = tmp_nodes->mpr.next; while (tmp_mpr != &tmp_nodes->mpr) { tmp_mpr2 = tmp_mpr; tmp_mpr = tmp_mpr->next; free(tmp_mpr2); } tmp_mid = tmp_nodes->mid.next; while (tmp_mid != &tmp_nodes->mid) { tmp_mid2 = tmp_mid; tmp_mid = tmp_mid->next; free(tmp_mid2); } /* Gemove form GUI */ remove_nodes_list(&tmp_nodes->addr); /* Dequeue */ tmp_nodes->prev->next = tmp_nodes->next; tmp_nodes->next->prev = tmp_nodes->prev; free(tmp_nodes); return 1; } tmp_nodes = tmp_nodes->next; } return 0; } struct node * find_node(char *ip) { struct node *tmp_nodes; for (tmp_nodes = nodes.next; tmp_nodes != &nodes; tmp_nodes = tmp_nodes->next) { if (strcmp(ip_to_string((union olsr_ip_addr *)&tmp_nodes->addr), ip) == 0) return tmp_nodes; } return NULL; } struct node * find_node_t(union olsr_ip_addr *ip) { struct node *tmp_nodes; for (tmp_nodes = nodes.next; tmp_nodes != &nodes; tmp_nodes = tmp_nodes->next) { if (memcmp(&tmp_nodes->addr, ip, ipsize) == 0) return tmp_nodes; } return 0; } /* *Remove timed out nodes */ gint time_out_nodes(gpointer data __attribute__((unused))) { struct node *tmp_nodes; struct node *node_to_delete; /* Wait before starting timing out */ if (timeouts) { timeouts--; //printf("Waiting...\n"); return 1; } //printf("Timing out nodes...\n"); gettimeofday(&now, (struct timezone *)NULL); tmp_nodes = nodes.next; while (tmp_nodes != &nodes) { //printf("%s: %6d < %6d\n", ip_to_string(&tmp_nodes->addr), tmp_nodes->timer.tv_sec, now.tv_sec); if (timercmp(&tmp_nodes->timer, &now, <)) { printf("Node %s timed out...\n", ip_to_string((union olsr_ip_addr *)&tmp_nodes->addr)); node_to_delete = tmp_nodes; tmp_nodes = tmp_nodes->next; remove_nodes_list(&node_to_delete->addr); remove_node(node_to_delete); } else tmp_nodes = tmp_nodes->next; } return 1; } /** *Timeout MPRs for a given node. Only called when user *is to see the registered MPRs of the node. *@param node the node whom MPRs should be timed out *@return negative if node not found */ int time_out_mprs(union olsr_ip_addr *node) { struct node *tmp_nodes; struct mpr *mpr_to_delete; struct mpr *tmp_mpr; gettimeofday(&now, (struct timezone *)NULL); /* W A R N I N G ! * * THIS ALGORITHM HAS NOT BEEN TESTED PROPERLY!!!!!! * -Andreas */ for (tmp_nodes = nodes.next; tmp_nodes != &nodes; tmp_nodes = tmp_nodes->next) { if (memcmp(&tmp_nodes->addr, node, ipsize) == 0) { tmp_mpr = tmp_nodes->mpr.next; while (tmp_mpr != &tmp_nodes->mpr) { if (timercmp(&tmp_mpr->timer, &now, <)) { printf("MPR %s OF NODE ", ip_to_string((union olsr_ip_addr *)&tmp_mpr->addr)); printf("%s TIMIED OUT ", ip_to_string((union olsr_ip_addr *)&tmp_nodes->addr)); fflush(stdout); mpr_to_delete = tmp_mpr; tmp_mpr = tmp_mpr->next; /* Dequeue */ mpr_to_delete->next->prev = mpr_to_delete->prev; mpr_to_delete->prev->next = mpr_to_delete->next; /* Delete */ free(mpr_to_delete); } else tmp_mpr = tmp_mpr->next; } return 1; } } return 0; } void init_timer(olsr_u32_t time_value, struct timeval *hold_timer) { olsr_u16_t time_value_sec = 0; olsr_u16_t time_value_msec = 0; time_value_sec = time_value / 1000; time_value_msec = time_value - (time_value_sec * 1000); hold_timer->tv_sec = time_value_sec; hold_timer->tv_usec = time_value_msec * 1000; } /** *Function that converts a mantissa/exponent 8bit value back *to double as described in RFC3626: * * value = C*(1+a/16)*2^b [in seconds] * * where a is the integer represented by the four highest bits of the * field and b the integer represented by the four lowest bits of the * field. * *@param me the 8 bit mantissa/exponen value * *@return a double value */ double me_to_double(olsr_u8_t me) { int a = me >> 4; int b = me - a * 16; return (double)(VTIME_SCALE_FACTOR * (1 + (double)a / 16) * (double)pow(2, b)); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/nodes.h000066400000000000000000000025221234304727700175760ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* *Andreas Tonnesen (andreto@ifi.uio.no) * *Node information */ #include //#include struct timeval now; struct timeval hold_time_nodes; /* Timeout for all nodes */ /* The node list */ struct node nodes; struct node *insert_node(struct node *, olsr_u8_t); int remove_node(struct node *); int remove_node_addr(union olsr_ip_addr *); double me_to_double(olsr_u8_t); /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/olsr.c000066400000000000000000000017221234304727700174410ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "common.h" /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/olsr_protocol.h000066400000000000000000000161751234304727700213770ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of the UniK OLSR daemon. * * The UniK OLSR daemon is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * The UniK OLSR daemon is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with the UniK OLSR daemon; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* *Values and packet formats as proposed in RFC3626 and misc. values and *data structures used by the UniK olsr daemon. */ #ifndef _PROTOCOLS_OLSR_H #define _PROTOCOLS_OLSR_H /* Port for OLSR to use */ #define OLSRPORT 698 /* Default IPv6 multicast address */ #define OLSR_IPV6_MULTICAST_ADDR "ff05::15" /* types */ #include #ifdef _WIN32 typedef unsigned char olsr_u8_t; typedef unsigned short olsr_u16_t; typedef unsigned int olsr_u32_t; typedef char olsr_8_t; typedef short olsr_16_t; typedef int olsr_32_t; #else /* _WIN32 */ typedef u_int8_t olsr_u8_t; typedef u_int16_t olsr_u16_t; typedef u_int32_t olsr_u32_t; typedef int8_t olsr_8_t; typedef int16_t olsr_16_t; typedef int32_t olsr_32_t; #endif /* _WIN32 */ /* IPv6 address format in6_addr */ #include union olsr_ip_addr { struct in_addr v4; struct in6_addr v6; }; /* *Emission Intervals */ #define HELLO_INTERVAL 2 #define HELLO_INTERVAL_NW HELLO_INTERVAL * 2 #define REFRESH_INTERVAL 2 #define TC_INTERVAL 5 #define MID_INTERVAL TC_INTERVAL #define HNA_INTERVAL TC_INTERVAL /* *Holding Time */ #define NEIGHB_HOLD_TIME 3 * REFRESH_INTERVAL /*extra: time to delete for non-wireless interfaces */ #define NEIGHB_HOLD_TIME_NW NEIGHB_HOLD_TIME * 2 #define TOP_HOLD_TIME 3 * TC_INTERVAL #define DUP_HOLD_TIME 30 #define MID_HOLD_TIME 3 * MID_INTERVAL #define HNA_HOLD_TIME 3 * HNA_INTERVAL /* * Scaling factor */ #define VTIME_SCALE_FACTOR 0.0625 /* *Message Types */ #define HELLO_MESSAGE 1 #define TC_MESSAGE 2 #define MID_MESSAGE 3 #define HNA_MESSAGE 4 #define MAX_MESSAGE 4 /* *Link Types */ #define UNSPEC_LINK 0 #define ASYM_LINK 1 #define SYM_LINK 2 #define LOST_LINK 3 #define MAX_LINK 3 /* *Neighbor Types */ #define NOT_NEIGH 0 #define SYM_NEIGH 1 #define MPR_NEIGH 2 #define MAX_NEIGH 2 /* *Neighbor status */ #define NOT_SYM 0 #define SYM 1 /* *Link Hysteresis */ #define HYST_THRESHOLD_HIGH 0.8 #define HYST_THRESHOLD_LOW 0.3 #define HYST_SCALING 0.5 /* *Willingness */ #define WILL_NEVER 0 #define WILL_LOW 1 #define WILL_DEFAULT 3 #define WILL_HIGH 6 #define WILL_ALWAYS 7 /* *Misc. Constants */ #define TC_REDUNDANCY 0 #define MPR_COVERAGE 1 #define MAXJITTER HELLO_INTERVAL / 4 #define MAX_TTL 0xff /* *Sequence numbering */ /* Seqnos are 16 bit values */ #define MAXVALUE 0xFFFF /* Macro for checking seqnos "wraparound" */ #define SEQNO_GREATER_THAN(s1, s2) \ (((s1 > s2) && (s1 - s2 <= (MAXVALUE/2))) \ || ((s2 > s1) && (s2 - s1 > (MAXVALUE/2)))) /* * Macros for creating and extracting the neighbor * and link type information from 8bit link_code * data as passed in HELLO messages */ #define CREATE_LINK_CODE(status, link) (link | (status<<2)) #define EXTRACT_STATUS(link_code) ((link_code & 0xC)>>2) #define EXTRACT_LINK(link_code) (link_code & 0x3) /*********************************************** * OLSR packet definitions * ***********************************************/ /* *The HELLO message */ /* *Hello info */ struct hellinfo { olsr_u8_t link_code; olsr_u8_t reserved; olsr_u16_t size; olsr_u32_t neigh_addr[1]; /* neighbor IP address(es) */ }; struct hellomsg { olsr_u16_t reserved; olsr_u8_t htime; olsr_u8_t willingness; struct hellinfo hell_info[1]; }; /* *IPv6 */ struct hellinfo6 { olsr_u8_t link_code; olsr_u8_t reserved; olsr_u16_t size; struct in6_addr neigh_addr[1]; /* neighbor IP address(es) */ }; struct hellomsg6 { olsr_u16_t reserved; olsr_u8_t htime; olsr_u8_t willingness; struct hellinfo6 hell_info[1]; }; /* * Topology Control packet */ struct neigh_info { olsr_u32_t addr; }; struct olsr_tcmsg { olsr_u16_t ansn; olsr_u16_t reserved; struct neigh_info neigh[1]; }; /* *IPv6 */ struct neigh_info6 { struct in6_addr addr; }; struct olsr_tcmsg6 { olsr_u16_t ansn; olsr_u16_t reserved; struct neigh_info6 neigh[1]; }; /* *Multiple Interface Declaration message */ /* * Defined as s struct for further expansion * For example: do we want to tell what type of interface * is associated whit each address? */ struct midaddr { olsr_u32_t addr; }; struct midmsg { struct midaddr mid_addr[1]; }; /* *IPv6 */ struct midaddr6 { struct in6_addr addr; }; struct midmsg6 { struct midaddr6 mid_addr[1]; }; /* * Host and Network Association message */ struct hnapair { olsr_u32_t addr; olsr_u32_t netmask; }; struct hnamsg { struct hnapair hna_net[1]; }; /* *IPv6 */ struct hnapair6 { struct in6_addr addr; struct in6_addr netmask; }; struct hnamsg6 { struct hnapair6 hna_net[1]; }; /* * OLSR message (several can exist in one OLSR packet) */ struct olsrmsg { olsr_u8_t olsr_msgtype; olsr_u8_t olsr_vtime; olsr_u16_t olsr_msgsize; olsr_u32_t originator; olsr_u8_t ttl; olsr_u8_t hopcnt; olsr_u16_t seqno; union { struct hellomsg hello; struct olsr_tcmsg tc; struct hnamsg hna; struct midmsg mid; } message; }; /* *IPv6 */ struct olsrmsg6 { olsr_u8_t olsr_msgtype; olsr_u8_t olsr_vtime; olsr_u16_t olsr_msgsize; struct in6_addr originator; olsr_u8_t ttl; olsr_u8_t hopcnt; olsr_u16_t seqno; union { struct hellomsg6 hello; struct olsr_tcmsg6 tc; struct hnamsg6 hna; struct midmsg6 mid; } message; }; /* * Generic OLSR packet */ struct olsr { olsr_u16_t olsr_packlen; /* packet length */ olsr_u16_t olsr_seqno; struct olsrmsg olsr_msg[1]; /* variable messages */ }; struct olsr6 { olsr_u16_t olsr_packlen; /* packet length */ olsr_u16_t olsr_seqno; struct olsrmsg6 olsr_msg[1]; /* variable messages */ }; /* IPv4 <-> IPv6 compability */ union olsr_message { struct olsrmsg v4; struct olsrmsg6 v6; }; union olsr_packet { struct olsr v4; struct olsr6 v6; }; #endif /* _PROTOCOLS_OLSR_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/packet.c000066400000000000000000000053661234304727700177410ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* *Andreas Tonnesen (andreto@ifi.uio.no) * *The list of cached packets * */ #include "common.h" #include "packet.h" struct packnode *packets = NULL; int no_packets = 0; /* *Add the contets of a packet to *the cached packets */ int add_packet_to_buffer(union olsr_message *p, int size) { struct packnode *tmp; /* Should be the same for v4 and v6 */ /* If this is the first packet */ if (!packets) { //printf("Adding first packet\n"); packets = malloc(sizeof(struct packnode)); packets->packet = malloc(size); memcpy(packets->packet, p, size); packets->next = NULL; no_packets++; return 1; } else { /* If the buffer is not full */ if (no_packets < MAXPACKS) { //printf("Buffer not filled yet..\n"); tmp = packets; packets = malloc(sizeof(struct packnode)); packets->packet = malloc(size); memcpy(packets->packet, p, size); packets->next = tmp; no_packets++; return 1; } /* If buffer is full */ else { //printf("Buffer full - deleting...\n"); tmp = packets; /* Find second last packet */ while (tmp->next->next) { tmp = tmp->next; } /* Delete last packet */ free(tmp->next->packet); free(tmp->next); tmp->next = NULL; /*Add the new packet */ tmp = packets; packets = malloc(sizeof(struct packnode)); packets->packet = malloc(size); memcpy(packets->packet, p, size); packets->next = tmp; return 1; } } return 0; } /* *Get the packet with index 'index' */ union olsr_message * get_packet(int idx) { int i = 0; struct packnode *tmp; if (idx > MAXPACKS) return 0; if (idx == 0) return packets->packet; tmp = packets; while (i != idx) { tmp = tmp->next; i++; } return tmp->packet; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/packet.h000066400000000000000000000027331234304727700177410ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* *Andreas Tonnesen (andreto@ifi.uio.no) * *The list of cached packets * */ #ifndef _PACKET_H #define _PACKET_H struct packnode { union olsr_message *packet; struct packnode *next; }; /* * Unions for IPv4 <-> IPv6 compability */ union hello_message { struct hellomsg v4; struct hellomsg6 v6; }; union tc_message { struct olsr_tcmsg v4; struct olsr_tcmsg6 v6; }; union mid_message { struct midmsg v4; struct midmsg6 v6; }; union hna_message { struct hnamsg v4; struct hnamsg6 v6; }; #endif /* _PACKET_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/pixmaps.h000066400000000000000000000017321234304727700201510ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "pixmaps/logo.xpm" /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/pixmaps/000077500000000000000000000000001234304727700177755ustar00rootroot00000000000000olsrd-0.6.6.2/gui/linux-gtk/src/pixmaps/logo.xpm000066400000000000000000001550351234304727700214740ustar00rootroot00000000000000/* XPM */ static const char * logo_xpm[] = { "87 103 2340 2", " c #FFFFFF", ". c #FBFBFB", "+ c #F8F8F8", "@ c #F4F4F4", "# c #F2F2F2", "$ c #FEFEFE", "% c #F5F5F5", "& c #FCFCFC", "* c #FAFAFA", "= c #F6F6F6", "- c #EAEAEA", "; c #CDCDCD", "> c #6F6F6F", ", c #777777", "' c #343434", ") c #040404", "! c #020202", "~ c #000000", "{ c #161616", "] c #545454", "^ c #727272", "/ c #AFAFAF", "( c #E6E6E6", "_ c #FDFDFD", ": c #F0F0F0", "< c #F3F3F3", "[ c #D0D0D0", "} c #7F7F7F", "| c #2A2A2A", "1 c #0A0A0A", "2 c #030303", "3 c #010101", "4 c #050505", "5 c #202020", "6 c #7D7D7D", "7 c #E1E1E1", "8 c #EFEFEF", "9 c #F7F7F7", "0 c #929292", "a c #0D0D0D", "b c #111111", "c c #080808", "d c #060606", "e c #0B0B0B", "f c #1E1E1E", "g c #0E0E0E", "h c #313131", "i c #ADADAD", "j c #E3E3E3", "k c #DCDCDC", "l c #2B2B2B", "m c #070707", "n c #0C0C0C", "o c #D9D9D9", "p c #2D2D2D", "q c #353535", "r c #D4D4D4", "s c #F9F9F9", "t c #676767", "u c #565656", "v c #C3C3C3", "w c #171717", "x c #141414", "y c #303030", "z c #090909", "A c #A5A5A5", "B c #F1F1F1", "C c #4A4A4A", "D c #131313", "E c #292929", "F c #595959", "G c #5F5F5F", "H c #2F2F2F", "I c #272727", "J c #D2D2D2", "K c #252525", "L c #5B5B5B", "M c #454545", "N c #1D1D1D", "O c #A8A8A8", "P c #444444", "Q c #121212", "R c #181818", "S c #717171", "T c #0F0F0F", "U c #C8C8C8", "V c #3C3C3C", "W c #828282", "X c #101010", "Y c #3E3E3E", "Z c #373737", "` c #848484", " . c #5C5C5C", ".. c #484848", "+. c #1A1A1A", "@. c #747474", "#. c #242424", "$. c #434343", "%. c #858585", "&. c #6B6B6B", "*. c #494949", "=. c #474747", "-. c #B7B7B7", ";. c #B4B4B4", ">. c #6D6D6D", ",. c #B9B9B9", "'. c #B0B0B0", "). c #ABABAB", "!. c #838383", "~. c #4E4E4E", "{. c #CFCFCF", "]. c #414141", "^. c #C0C2C1", "/. c #BEC0BF", "(. c #C1C1C1", "_. c #C5C5C5", ":. c #4B4A4F", "<. c #56555B", "[. c #010009", "}. c #0B0715", "|. c #01000B", "1. c #04010C", "2. c #010007", "3. c #17161B", "4. c #848683", "5. c #C7CCC5", "6. c #E0E6DC", "7. c #E8EEE2", "8. c #E5E5E5", "9. c #B5B5B5", "0. c #393939", "a. c #ACACAC", "b. c #C8C9CD", "c. c #F1F2F6", "d. c #EAEBED", "e. c #DDDFDC", "f. c #C2C4BF", "g. c #282A25", "h. c #000200", "i. c #040000", "j. c #050000", "k. c #0E0A07", "l. c #2E2A29", "m. c #B4B0AF", "n. c #FBF7F6", "o. c #FAF6F5", "p. c #EDE9E8", "q. c #E2E2E2", "r. c #707070", "s. c #323232", "t. c #F4F3F9", "u. c #E6E7EC", "v. c #959698", "w. c #D0D2CF", "x. c #F5FAF3", "y. c #7A8074", "z. c #0C1303", "A. c #000900", "B. c #030100", "C. c #050200", "D. c #090600", "E. c #797471", "F. c #DDD7D7", "G. c #E3DADF", "H. c #6F656D", "I. c #3E343D", "J. c #212121", "K. c #EDEDED", "L. c #C7C7C7", "M. c #878787", "N. c #DBDBDB", "O. c #9FA1A0", "P. c #303231", "Q. c #08090B", "R. c #515256", "S. c #AEB2B5", "T. c #ADB1B0", "U. c #0A0F0B", "V. c #080C0D", "W. c #000102", "X. c #000002", "Y. c #88888A", "Z. c #D7D7D9", "`. c #636164", " + c #030002", ".+ c #030004", "++ c #808080", "@+ c #E8E8E8", "#+ c #2A2E20", "$+ c #000300", "%+ c #73727A", "&+ c #797785", "*+ c #FFFCFF", "=+ c #080413", "-+ c #130F1E", ";+ c #000212", ">+ c #00010F", ",+ c #010713", "'+ c #737A82", ")+ c #CED3D6", "!+ c #030905", "~+ c #0F160F", "{+ c #868686", "]+ c #EEEEEE", "^+ c #0B1403", "/+ c #000500", "(+ c #101211", "_+ c #413E47", ":+ c #8D8592", "<+ c #E2D6E4", "[+ c #1C0F19", "}+ c #0A0002", "|+ c #000004", "1+ c #19181D", "2+ c #666867", "3+ c #A4A9A5", "4+ c #000400", "5+ c #696969", "6+ c #475148", "7+ c #060D06", "8+ c #0D0707", "9+ c #433834", "0+ c #C9B7A9", "a+ c #412D14", "b+ c #342000", "c+ c #3D2D09", "d+ c #544524", "e+ c #160800", "f+ c #4A3F2B", "g+ c #857D70", "h+ c #100B05", "i+ c #010000", "j+ c #939393", "k+ c #8D9798", "l+ c #000202", "m+ c #060000", "n+ c #0D0100", "o+ c #AF9C72", "p+ c #917B3F", "q+ c #A68E46", "r+ c #A98E41", "s+ c #9E833E", "t+ c #9F864E", "u+ c #5A441B", "v+ c #BDAB95", "w+ c #0D0000", "x+ c #16070E", "y+ c #0B000C", "z+ c #FDF7F7", "A+ c #FFFEFF", "B+ c #FEFFFF", "C+ c #FCFFFF", "D+ c #EFF5F5", "E+ c #070B0C", "F+ c #060709", "G+ c #100F14", "H+ c #E7EEF4", "I+ c #4D4D4F", "J+ c #0A0000", "K+ c #270A04", "L+ c #835A44", "M+ c #CC9D67", "N+ c #B0801E", "O+ c #FFD956", "P+ c #EBC548", "Q+ c #C79929", "R+ c #C38D2D", "S+ c #E9B059", "T+ c #EDB86C", "U+ c #A57B3F", "V+ c #462806", "W+ c #110000", "X+ c #0F0006", "Y+ c #746E72", "Z+ c #F2F6F5", "`+ c #FAFEFD", " @ c #383236", ".@ c #080004", "+@ c #120411", "@@ c #040009", "#@ c #737373", "$@ c #FFFEFD", "%@ c #F8F6F7", "&@ c #070508", "*@ c #807585", "=@ c #E0D3CA", "-@ c #49360B", ";@ c #B79A56", ">@ c #E7C16C", ",@ c #C69836", "'@ c #FFDA67", ")@ c #E0AF2E", "!@ c #FFD06A", "~@ c #F4C166", "{@ c #EDB966", "]@ c #F6C370", "^@ c #FFD37A", "/@ c #F0CD73", "(@ c #C9AE5D", "_@ c #A8914B", ":@ c #96753F", "<@ c #FAE2B6", "[@ c #E9DEC2", "}@ c #403933", "|@ c #0B0310", "1@ c #0F0B19", "2@ c #000104", "3@ c #000A00", "4@ c #F9F7F8", "5@ c #EFF3F2", "6@ c #252726", "7@ c #020001", "8@ c #030000", "9@ c #210303", "0@ c #BC9F75", "a@ c #D8BA58", "b@ c #EBCA3F", "c@ c #EDC42C", "d@ c #FFE04F", "e@ c #E4B029", "f@ c #FFD455", "g@ c #F3BB4A", "h@ c #F9C361", "i@ c #FBCB77", "j@ c #F9D07E", "k@ c #FCDA80", "l@ c #FFE180", "m@ c #FFDE7D", "n@ c #F6D377", "o@ c #FAC952", "p@ c #E9BF5B", "q@ c #B59656", "r@ c #1E0800", "s@ c #060007", "t@ c #0A0D1C", "u@ c #000600", "v@ c #000C00", "w@ c #5E5E5E", "x@ c #FEFAFB", "y@ c #FBFDFC", "z@ c #FCFEFB", "A@ c #FBFDFA", "B@ c #686765", "C@ c #0E0906", "D@ c #0B0301", "E@ c #5F3401", "F@ c #E4BB63", "G@ c #F1C73F", "H@ c #FFD730", "I@ c #F4C41C", "J@ c #F6C028", "K@ c #F0B831", "L@ c #FFD053", "M@ c #F7BF2C", "N@ c #F7C447", "O@ c #FBD373", "P@ c #FFE191", "Q@ c #FCDF93", "R@ c #F6D286", "S@ c #F7CB82", "T@ c #FFCE8C", "U@ c #FDCA4A", "V@ c #EDBA44", "W@ c #F8CC6D", "X@ c #A58650", "Y@ c #000007", "Z@ c #050F0E", "`@ c #3B3B3B", " # c #FCFAFD", ".# c #FCFEFD", "+# c #FEFFFD", "@# c #F4F5F0", "## c #7A7772", "$# c #100805", "%# c #322924", "&# c #EFBF53", "*# c #F3C343", "=# c #FFCF3C", "-# c #F5BF27", ";# c #FEC536", "># c #FFCF4F", ",# c #F8BC42", "'# c #FCC247", ")# c #FFCE48", "!# c #FFCD5F", "~# c #FCD47F", "{# c #FADC96", "]# c #FBDC99", "^# c #FBD58C", "/# c #FFD089", "(# c #FFCF8C", "_# c #FED271", ":# c #FCC95C", "<# c #F7C554", "[# c #E4BF67", "}# c #503F14", "|# c #0C0612", "1# c #0F020C", "2# c #D8D8D8", "3# c #F5F5F7", "4# c #FAFCF9", "5# c #F6F5F0", "6# c #6C6761", "7# c #070000", "8# c #50433D", "9# c #F5C849", "0# c #EEBE38", "a# c #FDC93F", "b# c #F3BA37", "c# c #FFC34E", "d# c #FFC555", "e# c #FFD05C", "f# c #F3BD41", "g# c #FCC36C", "h# c #FFCD85", "i# c #FFD196", "j# c #F4CE90", "k# c #F6D284", "l# c #FFDB7B", "m# c #FFD168", "n# c #F5BF55", "o# c #E7BE6E", "p# c #D8A53A", "q# c #D69C1F", "r# c #E6BB52", "s# c #7D6831", "t# c #0F0013", "u# c #0F000C", "v# c #9A9A9A", "w# c #F7F7F9", "x# c #FAFBF6", "y# c #FBFAF5", "z# c #908981", "A# c #080000", "B# c #3C2D26", "C# c #CFA245", "D# c #EBBD4E", "E# c #FFD353", "F# c #F9C740", "G# c #FAC545", "H# c #F7C147", "I# c #F4C144", "J# c #F7C645", "K# c #F7C773", "L# c #FFD187", "M# c #FFD593", "N# c #FED287", "O# c #FACF71", "P# c #F5CB5B", "Q# c #EBBC48", "R# c #DDAB3A", "S# c #C99D30", "T# c #F9BD3B", "U# c #FFD14D", "V# c #F2BC58", "W# c #3E2800", "X# c #110D1C", "Y# c #FAFCFB", "Z# c #FFFFFB", "`# c #FFFCF5", " $ c #D2CBC3", ".$ c #160500", "+$ c #AC7C4B", "@$ c #D5A855", "#$ c #D5A92E", "$$ c #EABE29", "%$ c #FCCF36", "&$ c #FDCF3E", "*$ c #EBBD34", "=$ c #FFD752", "-$ c #FBD75D", ";$ c #F3CB5C", ">$ c #F4C867", ",$ c #F9CB6B", "'$ c #EDBD57", ")$ c #D2A33B", "!$ c #CC9B3C", "~$ c #D8A651", "{$ c #F8C52E", "]$ c #FFBE24", "^$ c #EA980E", "/$ c #DA9C47", "($ c #1C0700", "_$ c #00020B", ":$ c #27291B", "<$ c #D6D6D6", "[$ c #361500", "}$ c #D8B453", "|$ c #E4BA42", "1$ c #C68D24", "2$ c #C6823B", "3$ c #E09866", "4$ c #EDA96A", "5$ c #F4B764", "6$ c #F3B85C", "7$ c #E7AF5A", "8$ c #D2A250", "9$ c #C19745", "0$ c #C09539", "a$ c #D4A136", "b$ c #F1B739", "c$ c #FFC73C", "d$ c #F3B019", "e$ c #D19519", "f$ c #CEA053", "g$ c #C7A889", "h$ c #0E040D", "i$ c #0E0B12", "j$ c #2F2D2E", "k$ c #4B4B4B", "l$ c #575757", "m$ c #D3D3D3", "n$ c #7E4E5C", "o$ c #D39E72", "p$ c #D69A2A", "q$ c #FCBA28", "r$ c #FFC23D", "s$ c #CB9326", "t$ c #956F0E", "u$ c #99811F", "v$ c #937D31", "w$ c #A4842D", "x$ c #C5942D", "y$ c #EEA932", "z$ c #FFB936", "A$ c #FFB82F", "B$ c #FCA61B", "C$ c #E9960A", "D$ c #C08D31", "E$ c #E1B56C", "F$ c #DABB8F", "G$ c #C2B1A1", "H$ c #000100", "I$ c #121710", "J$ c #898989", "K$ c #797979", "L$ c #3A3A3A", "M$ c #9C9C9C", "N$ c #735C90", "O$ c #E3C2BB", "P$ c #DBA954", "Q$ c #D5920D", "R$ c #E6A00D", "S$ c #F9BA2F", "T$ c #F1C33C", "U$ c #E6C63D", "V$ c #D5BB5A", "W$ c #EABF4C", "X$ c #FFBE32", "Y$ c #FFB518", "Z$ c #FFA409", "`$ c #F5950D", " % c #DB8B1C", ".% c #CC872A", "+% c #C9AE99", "@% c #DEC8BA", "#% c #D5CBC2", "$% c #C1C1BF", "%% c #000302", "&% c #101A19", "*% c #091308", "=% c #909090", "-% c #333333", ";% c #546B73", ">% c #C4CEC3", ",% c #CEC29A", "'% c #D2AE72", ")% c #D59848", "!% c #DC8D24", "~% c #EA9305", "{% c #FEA600", "]% c #F9A416", "^% c #FCA20D", "/% c #F89B00", "(% c #E78D00", "_% c #D2860C", ":% c #CC9543", "<% c #D6B68F", "[% c #E3D1C3", "}% c #DBD0E1", "|% c #CCC6D4", "1% c #CBCBD3", "2% c #CDD2D5", "3% c #27302F", "4% c #000502", "5% c #070B0A", "6% c #383838", "7% c #A0A0A0", "8% c #E7E7E7", "9% c #7A8273", "0% c #C1CDC1", "a% c #B9C4BE", "b% c #CCCBC6", "c% c #CFB6A0", "d% c #CE9359", "e% c #DD851B", "f% c #FB9004", "g% c #FF9106", "h% c #EF8E0B", "i% c #DA8F1C", "j% c #C9963D", "k% c #C2A36C", "l% c #C2B3A0", "m% c #C3C0C9", "n% c #C6C7E3", "o% c #DCDAE7", "p% c #E7E7EF", "q% c #F6F8F5", "r% c #B8BAB7", "s% c #1C171D", "t% c #040007", "u% c #363636", "v% c #757575", "w% c #151515", "x% c #653F4A", "y% c #C9B2BC", "z% c #C5C4CA", "A% c #BDC9C7", "B% c #BEC9B8", "C% c #D8CEAA", "D% c #D9B581", "E% c #C28C50", "F% c #D2994C", "G% c #D0A060", "H% c #CCAD7F", "I% c #CABBA4", "J% c #D0CBC5", "K% c #DED9DD", "L% c #EEE4ED", "M% c #F8EBF5", "N% c #F9FAF5", "O% c #FFFFFA", "P% c #FFFEFB", "Q% c #767074", "R% c #040005", "S% c #100513", "T% c #E0C8D6", "U% c #FFF7FF", "V% c #DFD5DD", "W% c #CCCDC8", "X% c #B9C0B0", "Y% c #B8C1AE", "Z% c #C7CDC1", "`% c #CFD4CE", " & c #C0C4B6", ".& c #C8C9C1", "+& c #D1CDCC", "@& c #D5CCD1", "#& c #D6CDD2", "$& c #E1D8D9", "%& c #F4EFEB", "&& c #FFFFF6", "*& c #FCFFF8", "=& c #FEFFFA", "-& c #F4F6F3", ";& c #F1F1F3", ">& c #EAEAEC", ",& c #121315", "'& c #0A0B0D", ")& c #1C1C1C", "!& c #DADADA", "~& c #E9E9E9", "{& c #8B8B8B", "]& c #D9FFEA", "^& c #F1FFFF", "/& c #D6D4DF", "(& c #E2D0DE", "_& c #DCC9CF", ":& c #CAC4C4", "<& c #BCC8C8", "[& c #B0C9CD", "}& c #B2D0DB", "|& c #BDCBD4", "1& c #D2CBD2", "2& c #ECD6D9", "3& c #FEE9E8", "4& c #FFFBF7", "5& c #F3FFFE", "6& c #E6FFFF", "7& c #EDF4ED", "8& c #FBFFFF", "9& c #F9FDFF", "0& c #EAF4F5", "a& c #95A299", "b& c #000700", "c& c #6E6E6E", "d& c #2C2C2C", "e& c #DDDDDD", "f& c #D1D1D1", "g& c #D5D5D5", "h& c #EBEBEB", "i& c #B3B3B3", "j& c #C0C0C0", "k& c #404040", "l& c #E0E0E0", "m& c #505050", "n& c #767676", "o& c #888888", "p& c #A1A1A1", "q& c #959595", "r& c #1B1B1B", "s& c #CBCBCB", "t& c #3D3D3D", "u& c #5A5A5A", "v& c #555555", "w& c #ECECEC", "x& c #969696", "y& c #BBBBBB", "z& c #222222", "A& c #464646", "B& c #7C7C7C", "C& c #B8B8B8", "D& c #262626", "E& c #9F9F9F", "F& c #BFBFBF", "G& c #BABABA", "H& c #C6C6C6", "I& c #DFDFDF", "J& c #CCCCCC", "K& c #515151", "L& c #B6B6B6", "M& c #D7D7D7", "N& c #C4C4C4", "O& c #C2C2C2", "P& c #4C4C4C", "Q& c #CACACA", "R& c #BCBCBC", "S& c #535353", "T& c #949494", "U& c #AAAAAA", "V& c #424242", "W& c #CECECE", "X& c #636363", "Y& c #6A6A6A", "Z& c #4F4F4F", "`& c #DEDEDE", " * c #BEBEBE", ".* c #BDBDBD", "+* c #191919", "@* c #3F3F3F", "#* c #232323", "$* c #2E2E2E", "%* c #1F1F1F", "&* c #5D5D5D", "** c #282828", "=* c #A9A9A9", "-* c #4D4D4D", ";* c #525252", ">* c #E4E4E4", ",* c #FDF8F2", "'* c #FFFBFF", ")* c #F1F0F6", "!* c #F3F6FF", "~* c #101920", "{* c #021013", "]* c #00090B", "^* c #0A0603", "/* c #7D7874", "(* c #100B07", "_* c #050100", ":* c #555452", "<* c #F6F7F9", "[* c #F5FEEB", "}* c #FCFBFF", "|* c #FFFAFF", "1* c #FFF8FF", "2* c #EBEAF2", "3* c #6E716A", "4* c #FDFBFC", "5* c #CFCECC", "6* c #030200", "7* c #050402", "8* c #71706E", "9* c #373634", "0* c #0A0907", "a* c #62615F", "b* c #FFFDFF", "c* c #FFFBF8", "d* c #A6A2A1", "e* c #0E080A", "f* c #F9FBFF", "g* c #FAFBFF", "h* c #F9F9F7", "i* c #FFFFF8", "j* c #8C887F", "k* c #0B0400", "l* c #16070C", "m* c #050608", "n* c #7C7D7F", "o* c #454648", "p* c #090A0C", "q* c #FEFDFB", "r* c #F3F2F0", "s* c #FFF3FF", "t* c #FEFEF4", "u* c #F9FEEA", "v* c #FEFFEF", "w* c #C1B6BE", "x* c #0A000B", "y* c #A2A2A2", "z* c #F8FAF7", "A* c #ECF2E8", "B* c #323730", "C* c #000009", "D* c #010010", "E* c #353A3E", "F* c #7F8488", "G* c #B3B4B6", "H* c #FFFFFD", "I* c #F7FFFC", "J* c #F2FDF7", "K* c #F4F8F7", "L* c #CBC6CC", "M* c #150915", "N* c #050706", "O* c #030504", "P* c #9EA09F", "Q* c #FFFDFD", "R* c #F9FBF6", "S* c #EDF6F1", "T* c #212F2F", "U* c #00060E", "V* c #000515", "W* c #000017", "X* c #080705", "Y* c #090D10", "Z* c #7E8387", "`* c #2C3135", " = c #D8D9DB", ".= c #FCFBF9", "+= c #FDF8F4", "@= c #F5F9FA", "#= c #F8FFFF", "$= c #F4FDFF", "%= c #EFF8FF", "&= c #C4C8C9", "*= c #262922", "== c #010302", "-= c #060807", ";= c #070908", ">= c #A8AAA9", ",= c #FFFCF6", "'= c #FBF6F2", ")= c #F5F7F4", "!= c #F9FFFF", "~= c #515B5C", "{= c #000603", "]= c #0A0F09", "^= c #090A04", "/= c #141311", "(= c #1C2023", "_= c #6A6F73", ":= c #CBCCCE", "<= c #F0EBE7", "[= c #F5FFF3", "}= c #ECF3EC", "|= c #FBFCFF", "1= c #959C95", "2= c #081406", "3= c #020605", "4= c #000403", "5= c #131716", "6= c #CACECD", "7= c #FBFCF7", "8= c #F7F8FA", "9= c #FBFBFD", "0= c #898079", "a= c #1B0A00", "b= c #513505", "c= c #583600", "d= c #200900", "e= c #1D0D00", "f= c #323639", "g= c #A4A5A7", "h= c #F7F6F4", "i= c #FFFEFA", "j= c #FFFBE2", "k= c #FFE8C4", "l= c #FFF4D0", "m= c #FBEBD2", "n= c #656259", "o= c #090D0C", "p= c #0E1211", "q= c #010504", "r= c #1E2221", "s= c #F3FDF2", "t= c #FEF4F5", "u= c #CAB09F", "v= c #774B1A", "w= c #E5AB57", "x= c #F6B247", "y= c #BD9F87", "z= c #38210F", "A= c #1F1209", "B= c #05090C", "C= c #28292B", "D= c #CECDCB", "E= c #FDF9F6", "F= c #F6F5FF", "G= c #FFFBF2", "H= c #FFE1AD", "I= c #D0A757", "J= c #D2A959", "K= c #D5B783", "L= c #40332A", "M= c #010012", "N= c #232927", "O= c #242A28", "P= c #000301", "Q= c #050B09", "R= c #1B211F", "S= c #F9FFFD", "T= c #F2F8F6", "U= c #FCFFEF", "V= c #F9FAF4", "W= c #FBEEFF", "X= c #FFF2FF", "Y= c #FDFFF1", "Z= c #EEEAC7", "`= c #D5B642", " - c #E5A802", ".- c #FFB018", "+- c #FFAA32", "@- c #FFBF40", "#- c #DFAB55", "$- c #482B0B", "%- c #060203", "&- c #010A11", "*- c #030D0F", "=- c #645961", "-- c #FFF5E8", ";- c #FFEBEF", ">- c #CD9A25", ",- c #F19B00", "'- c #FF920C", ")- c #FFA72C", "!- c #5B3003", "~- c #020200", "{- c #01000D", "]- c #02000D", "^- c #03000B", "/- c #030005", "(- c #040006", "_- c #05020D", ":- c #00000C", "<- c #090005", "[- c #39280E", "}- c #1D0000", "|- c #9E7B99", "1- c #F7FFE5", "2- c #FEFFF9", "3- c #F6FCFC", "4- c #F2FBF8", "5- c #F6FBFE", "6- c #FEFDFF", "7- c #F8FDFF", "8- c #EFFDFD", "9- c #F5FEF9", "0- c #F8FCFF", "a- c #FAF0E4", "b- c #F3CD8C", "c- c #EEAA2B", "d- c #F9A608", "e- c #FFB122", "f- c #FCB340", "g- c #FFBD40", "h- c #E8B343", "i- c #D7B764", "j- c #3B2C03", "k- c #00000B", "l- c #07060B", "m- c #FFF7F2", "n- c #FEE3DC", "o- c #D5A92C", "p- c #FFB120", "q- c #FFA32F", "r- c #ECA124", "s- c #573603", "t- c #060910", "u- c #030102", "v- c #020100", "w- c #0A0D06", "x- c #0A021A", "y- c #120007", "z- c #A78B4C", "A- c #A88521", "B- c #BE9955", "C- c #FFF4DA", "D- c #F9F3E5", "E- c #FDFEF8", "F- c #F2FFFF", "G- c #F3FBFF", "H- c #FFFFF1", "I- c #FCFFE9", "J- c #FBFFF1", "K- c #FBF9EA", "L- c #FAD79D", "M- c #FAB246", "N- c #FFA41A", "O- c #FFA817", "P- c #FEB12D", "Q- c #F2BB47", "R- c #F2AF2D", "S- c #FFD144", "T- c #F4C843", "U- c #CAA84F", "V- c #462E12", "W- c #131416", "X- c #FAF5F9", "Y- c #EFDBC2", "Z- c #DDB82C", "`- c #FEB535", " ; c #FFAB4E", ".; c #E6AA25", "+; c #684F0C", "@; c #040410", "#; c #080901", "$; c #010200", "%; c #030400", "&; c #060700", "*; c #030009", "=; c #160611", "-; c #745630", ";; c #F6CD4D", ">; c #F8C416", ",; c #E9B428", "'; c #DCB568", "); c #FFEEC5", "!; c #FDFEF9", "~; c #EDFFFF", "{; c #FCFEFF", "]; c #FFF0D6", "^; c #F6DE9E", "/; c #EED789", "(; c #F9DB9B", "_; c #FFE4BA", ":; c #F0E1C2", "<; c #FCDD9A", "[; c #F5BD4C", "}; c #F6A319", "|; c #FFAB20", "1; c #FFB32E", "2; c #F8B435", "3; c #F2C341", "4; c #FFBF2D", "5; c #FFCC37", "6; c #F7BA2E", "7; c #F4BE51", "8; c #C09453", "9; c #140000", "0; c #030C13", "a; c #FBF2F5", "b; c #F1DBAC", "c; c #ECC627", "d; c #F3A831", "e; c #FFAC59", "f; c #FBC531", "g; c #9D8324", "h; c #241512", "i; c #040402", "j; c #000005", "k; c #050912", "l; c #0B0007", "m; c #604A25", "n; c #DDB949", "o; c #FFC81F", "p; c #F9AD01", "q; c #FFB82E", "r; c #CE952A", "s; c #FEDA7A", "t; c #FCFDF7", "u; c #FCFDF8", "v; c #F0FFFD", "w; c #FFF9F0", "x; c #FFE1C1", "y; c #F8BE75", "z; c #E3A834", "A; c #E4A621", "B; c #F2A62E", "C; c #FFA33E", "D; c #EEAB43", "E; c #F8B334", "F; c #EFA915", "G; c #ECA612", "H; c #FDBA37", "I; c #FEC045", "J; c #F7BE39", "K; c #FCC834", "L; c #FFC924", "M; c #FFBD33", "N; c #FFC95A", "O; c #F7B046", "P; c #EFB94F", "Q; c #9D7D30", "R; c #0B0000", "S; c #040025", "T; c #F6EBE5", "U; c #F2D59D", "V; c #FDCE28", "W; c #FBAD31", "X; c #FFAF58", "Y; c #FFD233", "Z; c #DCB63B", "`; c #805E31", " > c #0D0805", ".> c #151014", "+> c #0A0815", "@> c #000010", "#> c #0D0B18", "$> c #171216", "%> c #0B0603", "&> c #6D5121", "*> c #D1B258", "=> c #F3C742", "-> c #FEB825", ";> c #FFAF21", ">> c #FFB631", ",> c #F4B035", "'> c #EEBC4B", ")> c #FBFCF6", "!> c #FEFEFC", "~> c #F9FCF1", "{> c #FBDEB6", "]> c #F7B561", "^> c #EF9D20", "/> c #EE9E0B", "(> c #F7A60C", "_> c #FFA20A", ":> c #FF9602", "<> c #FDA408", "[> c #FFAD10", "}> c #FFB119", "|> c #F7BA2C", "1> c #F4C746", "2> c #F2C94B", "3> c #F7C33B", "4> c #FFC22E", "5> c #F5C11F", "6> c #FFC247", "7> c #FFB959", "8> c #FFCD60", "9> c #F3B931", "0> c #FFD863", "a> c #5C4018", "b> c #0D0013", "c> c #E1DBCB", "d> c #E2C394", "e> c #FCCA2D", "f> c #FFBF3A", "g> c #FFB451", "h> c #FDC625", "i> c #F9C83D", "j> c #E3AE52", "k> c #8B7150", "l> c #2C1400", "m> c #0F0000", "n> c #1E0D05", "o> c #221109", "p> c #371F05", "q> c #957B5A", "r> c #DEB537", "s> c #F4C84D", "t> c #FDC75A", "u> c #FFB650", "v> c #FFBB39", "w> c #FFBC1D", "x> c #EAA71B", "y> c #FABD64", "z> c #FAFBF5", "A> c #FFF6E6", "B> c #F1C480", "C> c #ED9E1B", "D> c #FBA303", "E> c #FFB61E", "F> c #FFBC30", "G> c #FFB827", "H> c #FFB718", "I> c #FFC123", "J> c #FFBA29", "K> c #FFBD3A", "L> c #FFC546", "M> c #F8C63F", "N> c #F3C83D", "O> c #FEC43E", "P> c #FFB93B", "Q> c #FECB3C", "R> c #FDC145", "S> c #FFBC49", "T> c #FFBE3B", "U> c #FFD13C", "V> c #D8A927", "W> c #B48C44", "X> c #340E00", "Y> c #C8D1BE", "Z> c #D4BEA7", "`> c #F0C43D", " , c #FFC93C", "., c #FAB84A", "+, c #F5C32C", "@, c #FAC73A", "#, c #FFCA45", "$, c #F9C160", "%, c #E0AD54", "&, c #AF8136", "*, c #855918", "=, c #895D1C", "-, c #B7893E", ";, c #E8B55C", ">, c #FFC867", ",, c #FFC947", "', c #ECB429", "), c #FFD25A", "!, c #F9BB56", "~, c #FBB836", "{, c #FFBD14", "], c #DB9E07", "^, c #FFC366", "/, c #FDFDFB", "(, c #FFF1DF", "_, c #EEBB62", ":, c #ED9E00", "<, c #FFB202", "[, c #FFC234", "}, c #E6B745", "|, c #E7B739", "1, c #FFCA32", "2, c #EACD41", "3, c #F0B83F", "4, c #FFB64C", "5, c #FFBE48", "6, c #FCBB2B", "7, c #FAC42C", "8, c #FFC846", "9, c #FFBA50", "0, c #F9C74E", "a, c #FCC745", "b, c #FEC635", "c, c #F9BE22", "d, c #FFC831", "e, c #FFD050", "f, c #EBBA5D", "g, c #B68945", "h, c #6C6C6C", "i, c #BCD3C1", "j, c #D9CBC8", "k, c #EBC653", "l, c #FCC93A", "m, c #F4BF4D", "n, c #FFD64B", "o, c #F9C83F", "p, c #F7C025", "q, c #FFBE27", "r, c #FFBB2F", "s, c #F6B537", "t, c #EEB13E", "u, c #EFB23F", "v, c #F8B739", "w, c #FFB92D", "x, c #FFBA23", "y, c #FFB15C", "z, c #FFC736", "A, c #EEC21B", "B, c #F4C43C", "C, c #F5BE40", "D, c #F1B61E", "E, c #FFCA2F", "F, c #EAB033", "G, c #FCF4F1", "H, c #EBC982", "I, c #E6A407", "J, c #FFAC0C", "K, c #FFB141", "L, c #F5BB2C", "M, c #FCCD27", "N, c #F8BC4A", "O, c #FDC53E", "P, c #FFC740", "Q, c #FEC63B", "R, c #FDC53A", "S, c #FCC43D", "T, c #FBC23F", "U, c #FBC143", "V, c #6B4D31", "W, c #1C0200", "X, c #08000B", "Y, c #03030F", "Z, c #020300", "`, c #C7CBCA", " ' c #E8D5C4", ".' c #E7BF5F", "+' c #EEB727", "@' c #FFC750", "#' c #F1B539", "$' c #FFCC3B", "%' c #FCC149", "&' c #FDBF38", "*' c #FCBE37", "=' c #FBBD36", "-' c #FABC35", ";' c #F9C33F", ">' c #FAC43E", ",' c #FEC33B", "'' c #FFBF37", ")' c #FCBA30", "!' c #FAB52C", "~' c #F7B227", "{' c #F0DB8A", "]' c #FDEDC9", "^' c #F3FFFF", "/' c #F9FFF3", "(' c #FFFAF7", "_' c #F2D091", ":' c #EBA915", "<' c #FFAE10", "[' c #FFB340", "}' c #F7BC30", "|' c #FFCD2C", "1' c #FBBF4D", "2' c #FDC43F", "3' c #FFC641", "4' c #FEC63D", "5' c #FDC53C", "6' c #FCC33E", "7' c #FBC241", "8' c #FBC144", "9' c #D9B463", "0' c #6C4C1B", "a' c #2C160B", "b' c #160C14", "c' c #0F110C", "d' c #AEAEAE", "e' c #CACDD2", "f' c #D4BEB3", "g' c #E3B85C", "h' c #FFC63B", "i' c #FFC04C", "j' c #FFC448", "k' c #FFC837", "l' c #F8BE43", "m' c #FFC13A", "n' c #FEC23D", "o' c #FFBF39", "p' c #FEBC34", "q' c #FCB82F", "r' c #FBB62D", "s' c #E6C954", "t' c #FBE2A0", "u' c #FFF9F2", "v' c #F5FCFF", "w' c #F7FEF6", "x' c #F9D9AA", "y' c #EEAE2A", "z' c #FEAD13", "A' c #FFB43E", "B' c #F7BC34", "C' c #FFCD30", "D' c #FEC04F", "E' c #FDC441", "F' c #FFC645", "G' c #FFC643", "H' c #FEC63F", "I' c #FCC340", "J' c #FBC146", "K' c #D0A445", "L' c #624219", "M' c #020700", "N' c #DADCE9", "O' c #826A68", "P' c #A0711F", "Q' c #FCBD3A", "R' c #FFBA4E", "S' c #FFC54C", "T' c #F1B928", "U' c #FFC94C", "V' c #FFC33E", "W' c #FCC640", "X' c #FEC039", "Y' c #FEBE38", "Z' c #FFBD35", "`' c #E7BE24", " ) c #F9D26B", ".) c #FFE7BF", "+) c #FFF0EC", "@) c #FAFFF8", "#) c #FCFFFB", "$) c #FBFFFB", "%) c #FDE0C0", "&) c #EFB03F", "*) c #F9A912", "=) c #FFB437", "-) c #F5B934", ";) c #FDC731", ">) c #FEC14E", ",) c #FDC443", "') c #FEC544", ")) c #FEC542", "!) c #FEC540", "~) c #FCC342", "{) c #FCC245", "]) c #F8B61A", "^) c #FFD34E", "/) c #B68F32", "() c #3B2400", "_) c #130709", ":) c #0E0719", "<) c #030106", "[) c #0D0D01", "}) c #9E9FB1", "|) c #2C1215", "1) c #8D590E", "2) c #F5B136", "3) c #FCB14B", "4) c #FFBF4A", "5) c #FFCE50", "6) c #FFC43F", "7) c #FCC23C", "8) c #FDC13C", "9) c #FFC13C", "0) c #FFC13D", "a) c #FFC23E", "b) c #FBC326", "c) c #FAC446", "d) c #F6CA73", "e) c #F7D89F", "f) c #FFF0C7", "g) c #FFFFE8", "h) c #F7FFF8", "i) c #FFE9D8", "j) c #F4B558", "k) c #F5AA11", "l) c #FEB62E", "m) c #F6BA35", "n) c #FCC632", "o) c #FFC249", "p) c #FCC244", "q) c #FFC039", "r) c #FFBF2A", "s) c #F8C73E", "t) c #B28B3E", "u) c #3B191A", "v) c #0D001B", "w) c #0C0111", "x) c #010300", "y) c #252638", "z) c #D49B54", "A) c #FEB640", "B) c #F8A545", "C) c #FFBD4E", "D) c #FFC838", "E) c #FABF41", "F) c #FEC43F", "G) c #FFC841", "H) c #FDC33E", "I) c #FFC33F", "J) c #FFC541", "K) c #FFC642", "L) c #FFC543", "M) c #FFC03D", "N) c #F4BF3D", "O) c #F1C950", "P) c #F9E07C", "Q) c #FFF5B9", "R) c #FFFAEE", "S) c #F2FFF3", "T) c #FFF2ED", "U) c #F6BB6D", "V) c #F6AD12", "W) c #FFBB28", "X) c #F9BE34", "Y) c #FEC633", "Z) c #FDC345", "`) c #FFC851", " ! c #F1B01E", ".! c #FEBF26", "+! c #F4B84A", "@! c #905833", "#! c #2A0109", "$! c #151400", "%! c #EDB36A", "&! c #FFB13E", "*! c #FFA84B", "=! c #FFB647", "-! c #FFC334", ";! c #F6BB3D", ">! c #FFC741", ",! c #FFC640", "'! c #FEC341", ")! c #FFC442", "!! c #FFC545", "~! c #FFC646", "{! c #FFC251", "]! c #FFC341", "^! c #FFC531", "/! c #F2CA46", "(! c #F4D67C", "_! c #FBE9BB", ":! c #EDFFEE", "~ c #FFC420", ",~ c #FFC41E", "'~ c #FEC422", ")~ c #FEC424", "!~ c #FCC425", "~~ c #FDC528", "{~ c #FCC628", "]~ c #FCC52A", "^~ c #FFCC3C", "/~ c #F2B934", "(~ c #F5B937", "_~ c #FEB31A", ":~ c #DB9211", "<~ c #CC9048", "[~ c #D9A790", "}~ c #ECF6FF", "|~ c #F7F4EF", "1~ c #EFFAEC", "2~ c #FEFFFB", "3~ c #8F8F8F", "4~ c #070311", "5~ c #643F13", "6~ c #E69641", "7~ c #FF9D48", "8~ c #FFA949", "9~ c #F6B130", "0~ c #FEC339", "a~ c #F8BA41", "b~ c #F7C030", "c~ c #FFC840", "d~ c #FDBD3F", "e~ c #FFBB40", "f~ c #FFC64E", "g~ c #FFC753", "h~ c #FFC745", "i~ c #FEC230", "j~ c #F7BE26", "k~ c #F7C332", "l~ c #FACC54", "m~ c #FBCF76", "n~ c #FBF4FF", "o~ c #F9E296", "p~ c #E2AF15", "q~ c #F2A904", "r~ c #FFB618", "s~ c #FBB80F", "t~ c #FFC519", "u~ c #F8C120", "v~ c #FEC41B", "w~ c #FEC41A", "x~ c #FFC219", "y~ c #FDC319", "z~ c #FDC31A", "A~ c #FCC31A", "B~ c #FDC41D", "C~ c #FBC41F", "D~ c #FBC421", "E~ c #F6C123", "F~ c #FFCE3E", "G~ c #F2AC19", "H~ c #FFB219", "I~ c #FFBE35", "J~ c #D6953B", "K~ c #8D5524", "L~ c #7B7E83", "M~ c #ECECEE", "N~ c #FAFFFA", "O~ c #FBFFF8", "P~ c #F6EEF9", "Q~ c #05000A", "R~ c #71481A", "S~ c #E6963F", "T~ c #FC9641", "U~ c #FFA647", "V~ c #F5B031", "W~ c #F9B840", "X~ c #FFCB48", "Y~ c #FFC441", "Z~ c #FBBF3D", "`~ c #FCC141", " { c #FFCA49", ".{ c #FFCB4A", "+{ c #FBC443", "@{ c #F3BC3B", "#{ c #F3B52E", "${ c #FFC53B", "%{ c #FFCF42", "&{ c #FDC942", "*{ c #EEBF4D", "={ c #F0C871", "-{ c #FFE0A7", ";{ c #FFECE5", ">{ c #E9C46C", ",{ c #DF9F0A", "'{ c #FEAB11", "){ c #FFB41A", "!{ c #F7B403", "~{ c #FDC403", "{{ c #FBC50B", "]{ c #FEC111", "^{ c #FEC110", "/{ c #FEC10E", "({ c #FEC20C", "_{ c #FDC00D", ":{ c #FDC210", "<{ c #FCC312", "[{ c #FCC314", "}{ c #FBC314", "|{ c #FCC415", "1{ c #FAC515", "2{ c #FFCC2B", "3{ c #FFC32D", "4{ c #F8B119", "5{ c #FFB113", "6{ c #FFB622", "7{ c #E59D25", "8{ c #B47518", "9{ c #0D0500", "0{ c #736D71", "a{ c #C9C6D1", "b{ c #E2E3E7", "c{ c #F3F8F2", "d{ c #FFFAFE", "e{ c #787878", "f{ c #0D0007", "g{ c #8B5F2E", "h{ c #ED9C43", "i{ c #F9953F", "j{ c #FFAB4A", "k{ c #F9B538", "l{ c #F9BE36", "m{ c #FFBE46", "n{ c #FFBF44", "o{ c #FFC143", "p{ c #FDC240", "q{ c #F6C63E", "r{ c #F3C83E", "s{ c #F3CA3E", "t{ c #FFC636", "u{ c #FCC23A", "v{ c #EFBB41", "w{ c #E5B755", "x{ c #E8C37D", "y{ c #F5DCB3", "z{ c #FFF4E2", "A{ c #FFDD9E", "B{ c #E5B137", "C{ c #EAA100", "D{ c #FFAF13", "E{ c #FFB015", "F{ c #F8B400", "G{ c #FBC200", "H{ c #F9C000", "I{ c #FABD03", "J{ c #FBBE04", "K{ c #FBBE03", "L{ c #FBBE01", "M{ c #FCC000", "N{ c #FEBE05", "O{ c #FDC006", "P{ c #FDC107", "Q{ c #FDC308", "R{ c #FDC30A", "S{ c #FEC40B", "T{ c #FFC90A", "U{ c #F5C00E", "V{ c #F9C01B", "W{ c #FFC121", "X{ c #FFB312", "Y{ c #F8A001", "Z{ c #F5A311", "`{ c #FFB731", " ] c #4C3513", ".] c #151026", "+] c #5A5F63", "@] c #C5CAC3", "#] c #D6D6D8", "$] c #F9F6FD", "%] c #F2F3EE", "&] c #170104", "*] c #A87643", "=] c #F39F45", "-] c #F6943D", ";] c #FFAD4D", ">] c #F9B93D", ",] c #F8BD35", "'] c #FFC24A", ")] c #F8BB3C", "!] c #FEBF3E", "~] c #FFC23B", "{] c #FCBE35", "]] c #F9BF37", "^] c #FFCC45", "/] c #F5BD42", "(] c #E8B447", "_] c #DBAD58", ":] c #DFBC82", "<] c #F4DDBD", "[] c #FFF9ED", "}] c #F3C44E", "|] c #E6AB09", "1] c #FAAA00", "2] c #FFAE0B", "3] c #FFAA0B", "4] c #FCB600", "5] c #FEC000", "6] c #FBBB04", "7] c #FBBA00", "8] c #FCBB00", "9] c #FDBC00", "0] c #FDBD00", "a] c #FEBE00", "b] c #FFBB00", "c] c #FEBD01", "d] c #FEBF02", "e] c #FFC003", "f] c #FEC202", "g] c #FFC303", "h] c #FAC307", "i] c #FAC10F", "j] c #FFBE12", "k] c #FFB60E", "l] c #FFAF09", "m] c #FDA704", "n] c #EFA101", "o] c #956F2E", "p] c #000305", "q] c #060900", "r] c #0C040F", "s] c #494351", "t] c #3B3E35", "u] c #585858", "v] c #240405", "w] c #B9824A", "x] c #F09B40", "y] c #F1913A", "z] c #F9A94A", "A] c #F3B53A", "B] c #F3B732", "C] c #FFBE47", "D] c #FFCC42", "E] c #FFBF38", "F] c #FFC342", "G] c #FFC045", "H] c #FDB441", "I] c #F1A93A", "J] c #C99B50", "K] c #DBB274", "L] c #F2D1A4", "M] c #FFE9D1", "N] c #FFF9EF", "O] c #F6FFFF", "P] c #E5AD26", "Q] c #E7A300", "R] c #FFAA00", "S] c #FFA303", "T] c #FBA407", "U] c #FFB600", "V] c #FAB600", "W] c #FDB410", "X] c #FBB400", "Y] c #FCB501", "Z] c #FDB700", "`] c #FEB800", " ^ c #FFB900", ".^ c #FEBA00", "+^ c #FEBD00", "@^ c #FEBF00", "#^ c #FFBC02", "$^ c #FFC207", "%^ c #F9C205", "&^ c #F9BB04", "*^ c #FFB709", "=^ c #FFB20A", "-^ c #FEA700", ";^ c #EB9A00", ">^ c #BD8C26", ",^ c #000019", "'^ c #000804", ")^ c #07000B", "!^ c #191126", "~^ c #39100C", "{^ c #C78B4F", "]^ c #ED983B", "^^ c #F5973F", "/^ c #F5A94B", "(^ c #F1B73C", "_^ c #F4BA35", ":^ c #FFBC48", "<^ c #FAC63C", "[^ c #FFC340", "}^ c #FFBE44", "|^ c #FEB64A", "1^ c #F4AB4F", "2^ c #E6A154", "3^ c #DF9C56", "4^ c #DCBDA1", "5^ c #F2D8C1", "6^ c #FFF3E5", "7^ c #FFFDF6", "8^ c #F7FDF9", "9^ c #F6FFF9", "0^ c #E4A43A", "a^ c #E79C0D", "b^ c #F89F03", "c^ c #F39406", "d^ c #F49F08", "e^ c #F8AF00", "f^ c #EBA100", "g^ c #FCAA16", "h^ c #F6AB00", "i^ c #F7AC01", "j^ c #F8AE01", "k^ c #F8AE00", "l^ c #F9AF00", "m^ c #FAB000", "n^ c #FBB000", "o^ c #FBB200", "p^ c #FCB300", "q^ c #FBB500", "r^ c #FCB800", "s^ c #FDB900", "t^ c #FFB80D", "u^ c #FCBC03", "v^ c #F6C000", "w^ c #F8BF00", "x^ c #FDB400", "y^ c #FDA702", "z^ c #FEA805", "A^ c #FFB00C", "B^ c #D79D17", "C^ c #361100", "D^ c #000F05", "E^ c #08000E", "F^ c #070016", "G^ c #051000", "H^ c #4F1E17", "I^ c #D08E51", "J^ c #EC9536", "K^ c #FBA047", "L^ c #F4A94C", "M^ c #EFB73C", "N^ c #F8BE39", "O^ c #FFBB47", "P^ c #F3B637", "Q^ c #FDBD42", "R^ c #FFBE4D", "S^ c #F3B351", "T^ c #E0A557", "U^ c #D7A870", "V^ c #DFBB97", "W^ c #EDCFB7", "X^ c #FFF9F5", "Y^ c #FFFDF7", "Z^ c #FDFCF7", "`^ c #F7F9F4", " / c #F5FAF4", "./ c #F9FEF8", "+/ c #FDFFFA", "@/ c #EEA65E", "#/ c #E9982C", "$/ c #F09312", "%/ c #E7880A", "&/ c #F19A0C", "*/ c #EEA400", "=/ c #D98D00", "-/ c #F7A013", ";/ c #EFA200", ">/ c #F0A300", ",/ c #F1A400", "'/ c #F2A500", ")/ c #F3A700", "!/ c #F4A800", "~/ c #F8AC00", "{/ c #F9AD00", "]/ c #FAAF00", "^/ c #FAB100", "// c #FBB700", "(/ c #FEAA09", "_/ c #FEBC06", ":/ c #F7C100", "( c #FCB34C", ",( c #FFAF49", "'( c #DE903B", ")( c #C49253", "!( c #DBC5A0", "~( c #F8F3E0", "{( c #F9FAF2", "]( c #F5F6EE", "^( c #FBF8EF", "/( c #FFF8FB", "(( c #FFF9F3", "_( c #FFF9EA", ":( c #FFF6DB", "<( c #FFECC6", "[( c #FFDDAF", "}( c #F6D19D", "|( c #DBBE78", "1( c #D5B165", "2( c #CD9F47", "3( c #CE932B", "4( c #DA9017", "5( c #E99109", "6( c #F59200", "7( c #FB9400", "8( c #FC9610", "9( c #F59107", "0( c #F19200", "a( c #F59D00", "b( c #F7A600", "c( c #F5AA00", "d( c #F3AE00", "e( c #F5B200", "f( c #F8B200", "g( c #F9B105", "h( c #FAAE0A", "i( c #FBAE0A", "j( c #FEB005", "k( c #FFAE06", "l( c #FEA408", "m( c #F79808", "n( c #C68916", "o( c #290200", "p( c #040021", "q( c #09190F", "r( c #08000C", "s( c #090018", "t( c #202B1B", "u( c #1F0000", "v( c #B7734C", "w( c #FA994A", "x( c #F79532", "y( c #DC8E2C", "z( c #ECAC4A", "A( c #F8B447", "B( c #FFB139", "C( c #FAB33F", "D( c #FEB944", "E( c #FFC048", "F( c #FFC149", "G( c #FFBC47", "H( c #FBB243", "I( c #F9A741", "J( c #F7A13E", "K( c #D6873C", "L( c #DA9A5C", "M( c #E9BF97", "N( c #F9E7D3", "O( c #FBFBFF", "P( c #FDFCFF", "Q( c #FFF2FC", "R( c #F5FFFD", "S( c #F9FFF0", "T( c #F2EBCE", "U( c #EBD3A3", "V( c #E7BC78", "W( c #E0A24D", "X( c #D78C27", "Y( c #D07E12", "Z( c #ED9108", "`( c #EC8D00", " _ c #F18D00", "._ c #FC9500", "+_ c #FF9C00", "@_ c #FA9E00", "#_ c #EF9B00", "$_ c #E89A00", "%_ c #F2A107", "&_ c #F8A50B", "*_ c #F9A706", "=_ c #F3A100", "-_ c #EE9B00", ";_ c #EB9703", ">_ c #C39130", ",_ c #301003", "'_ c #323F38", ")_ c #797C67", "!_ c #B6AAB8", "~_ c #C0B8CD", "{_ c #DDE5D8", "]_ c #754946", "^_ c #BA7053", "/_ c #D76F32", "(_ c #F58635", "__ c #F1953E", ":_ c #E59C3E", "<_ c #E39F34", "[_ c #F4AC34", "}_ c #F8B95A", "|_ c #F1B04A", "1_ c #EEA63A", "2_ c #F1A130", "3_ c #F6A033", "4_ c #F39A36", "5_ c #EA8F36", "6_ c #E08333", "7_ c #C9956E", "8_ c #ECC3A5", "9_ c #FFF0E3", "0_ c #FFFCFD", "a_ c #FEFEFF", "b_ c #FFF9FF", "c_ c #FFFFF3", "d_ c #FEFFF4", "e_ c #F8FBF0", "f_ c #F1F6EF", "g_ c #F1F7F3", "h_ c #F5FBFB", "i_ c #F7FFFF", "j_ c #F0F0F2", "k_ c #F5F3F4", "l_ c #FFFAF6", "m_ c #FFFDF3", "n_ c #FFFDEC", "o_ c #FFF4DC", "p_ c #F9E6C8", "q_ c #F0DBBC", "r_ c #D29B36", "s_ c #D6962A", "t_ c #E29219", "u_ c #EE920D", "v_ c #F69208", "w_ c #F79309", "x_ c #F2940E", "y_ c #F09511", "z_ c #F9A700", "A_ c #F6A000", "B_ c #F79D09", "C_ c #FCA00F", "D_ c #F89F07", "E_ c #ED9A00", "F_ c #EC9E08", "G_ c #F3A819", "H_ c #BE9A50", "I_ c #C2AAA0", "J_ c #DFDCF1", "K_ c #F4F8E9", "L_ c #FEF7FF", "M_ c #EDE7F5", "N_ c #FFE3E0", "O_ c #D9A08C", "P_ c #B85D30", "Q_ c #E3793B", "R_ c #FF9B56", "S_ c #EB9242", "T_ c #E59234", "U_ c #F8A73C", "V_ c #E7A14B", "W_ c #F0A349", "X_ c #F9A543", "Y_ c #FC9F3F", "Z_ c #F3953B", "`_ c #E58D43", " : c #D9894E", ".: c #D18758", "+: c #EFD8CA", "@: c #FFEFE8", "#: c #FCFCFF", "$: c #F5F7FF", "%: c #FDFDFF", "&: c #FFF5FD", "*: c #FEFFF3", "=: c #FBFFF4", "-: c #F9FFF4", ";: c #F9FCFF", ">: c #F4FBFF", ",: c #F2F9FF", "': c #FFF8F5", "): c #F9DECB", "!: c #E1B588", "~: c #CC8F3F", "{: c #C77A0E", "]: c #D28000", "^: c #E79300", "/: c #F6A106", "(: c #E69300", "_: c #E89000", ":: c #EF8F07", "<: c #F2920A", "[: c #E99002", "}: c #E19104", "|: c #E9A422", "1: c #F9BB44", "2: c #FFEEBF", "3: c #FFFBF4", "4: c #F6FCF2", "5: c #F0D6C7", "6: c #C98E70", "7: c #C06B42", "8: c #D2713E", "9: c #DB793C", "0: c #EE8D46", "a: c #EE8D3E", "b: c #E38837", "c: c #EF9340", "d: c #F39744", "e: c #E2883C", "f: c #C87839", "g: c #C38258", "h: c #DAAA93", "i: c #F7CFC3", "j: c #FFFDF8", "k: c #F7FBFC", "l: c #F3F8FC", "m: c #F4F9FD", "n: c #FDFEFF", "o: c #FFF5FF", "p: c #FFF6FF", "q: c #FFFDFE", "r: c #F7FDFF", "s: c #F7FAFF", "t: c #F7F7FF", "u: c #FBF9FE", "v: c #FFFDFB", "w: c #FFFFEF", "x: c #FFF2CC", "y: c #FFD79A", "z: c #ECB563", "A: c #D39331", "B: c #C07C11", "C: c #D89115", "D: c #DF931B", "E: c #E99620", "F: c #EB971D", "G: c #E4991C", "H: c #E2A634", "I: c #F0C368", "J: c #FFDC95", "K: c #FFFBE3", "L: c #FCF9FF", "M: c #FCFDFF", "N: c #F2F7F1", "O: c #F8FDF9", "P: c #E7F3F1", "Q: c #F5F5ED", "R: c #E9D2C2", "S: c #CC9A81", "T: c #C9805D", "U: c #CE774A", "V: c #E98B58", "W: c #DA7A47", "X: c #EB8441", "Y: c #E2803F", "Z: c #D67D43", "`: c #C98151", " < c #CA9374", ".< c #D9B8A7", "+< c #F4E2DE", "@< c #F5FBF9", "#< c #FDFAFF", "$< c #FBF8FF", "%< c #FEF9FF", "&< c #F4FEFF", "*< c #FFFCF4", "=< c #FFFBF1", "-< c #F8FFF0", ";< c #F7FFF1", ">< c #F3FEF0", ",< c #F2F8EC", "'< c #FAF4E4", ")< c #FFEDD5", "!< c #FFDCBC", "~< c #F7C9A5", "{< c #E1B15D", "]< c #EDB761", "^< c #F5B85B", "/< c #F3B850", "(< c #F0C159", "_< c #F6D785", ":< c #FFF0C5", "<< c #F3F4EF", "[< c #FDFCFA", "}< c #F8E6DA", "|< c #F9D1B8", "1< c #DFA482", "2< c #E6A07E", "3< c #CE8564", "4< c #D8774C", "5< c #D47F58", "6< c #DA977A", "7< c #F0C1AF", "8< c #FFEDE4", "9< c #FFFCFA", "0< c #FCFCFA", "a< c #FAFAF8", " . + @ # $ % & * = - ; > , ' ) ! ~ ~ { ] ^ / ( * _ = @ _ @ . + . ", " _ * : < [ } | 1 2 ! ~ 3 4 4 3 ~ ! ~ ~ 5 6 7 8 @ _ ", " < . $ % 9 0 a ~ b ~ ~ ~ c d ~ ~ c e 3 ~ f g ~ h i @ 9 + % _ $ ", " . & * j k l ~ g ~ ~ 1 e m ) ! ! ~ ~ ~ 3 4 ~ ~ 1 m n > @ % $ 9 . $ ", " * * * . o p d ) ~ 4 m ~ ~ ~ ~ ~ 4 d ~ ~ ~ ~ ) 4 ) ~ ~ e q r s = * ", " * = % t 4 ~ c ! ~ ! c n m c 2 ~ ~ 2 c m m c ~ ~ ! 4 4 a u @ * ", " $ # + v w ~ x ~ ~ a m ~ ~ ~ 2 m 3 ~ ) ~ ~ g y q w ~ ~ ~ ! z A % + ", " % B s C 4 ~ ~ 3 D ~ ~ w ~ ~ ~ ~ ~ 3 ! ) m E F G H n 4 ) ! c I s @ . ", " J 1 2 c ~ 2 ~ ~ 2 c ~ ~ 3 ! ~ ~ d 4 ~ K L L M N ~ 4 ) 3 ~ / + . s ", " . _ s + O ! ~ ~ ~ ~ 2 d ~ ~ ! 1 ~ ~ ~ ~ ~ ~ ) P C Q n R a ~ ~ 1 ~ I j _ = ", " . . + S 2 ~ 4 D ~ ~ ~ e ! ~ ~ ~ ~ 2 4 4 d c T 1 ~ x ~ ~ ~ n ~ 2 ~ U = . ", " & V 4 ! ~ ~ ~ 4 e ~ ~ 2 ~ 4 c ~ ~ ! ~ ~ ) Q ~ ) ~ g ~ ~ ~ ~ Q W . % ", " _ $ . _ X ! ~ ! ~ a z ~ ~ ) 3 ) 4 ) ~ ~ ~ ! 4 ~ T 3 ~ ~ 2 ~ T z ~ b Y B & _ $ ", " $ $ $ _ . ~ ! ~ 3 ~ d D g g e ~ 4 ~ ~ z 4 ~ ~ d 2 Z ` .z m X ~ 3 ~ ~ ..& * ", " & & ~ ) ! ~ ~ +.L @.l ~ ~ ! 3 ~ ~ 3 1 R #.$.~ P %.&.g ~ n ~ ) 3 *.@ & $ ", " 9 * ~ ! ~ =.-.;.S &...z ! ~ T 1 ~ { >.i ,.'.).@.| !.~.~ ) c ~ ~ T {.+ _ _ ", " . 8 ~ ) ].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.: 8.9.0 q 0.b ~ 3 ~ ~ ! r $ $ ", " & + * b D a.b.c.d.e.f.g.h.h.i.j.k.l.m.n.o.p. q.r.1 ~ ~ 3 ~ ~ ! r $ $ ", " & < s ~ s.{.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.> K. L.b ~ n 3 ~ ~ ! r $ $ ", " s * ! M.N.O.P.Q.R.S.T.U.h.V.W.X.Y.Z.`. +.+1 ++U < K 3 ~ 3 ~ ~ ! r $ $ ", " + & ~ M.@+#+$+X.%+&+*+=+-+;+>+,+'+)+h.!+~+z {+, ]+s 0.m 4 3 ~ ~ ! r $ $ ", " # ~ s.@ ^+/+(+_+:+<+[+}+|+1+X.2+3+$+$+4+! 5+>. Z ~ ) 3 ~ ~ ! r $ $ ", " + s z D q.6+7+~ 8+9+0+a+b+c+d+e+f+g+h+i+i+~ y j+9 L.a ~ 2 3 ~ ~ ! r $ $ ", " $ s . ~ ) W k+l+x m+n+o+p+q+r+s+t+u+v+w+x+y+4 x o + i 4 T ~ 3 ~ ~ ! r $ $ ", " z+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@@@~ z ~ ~ #@ & ", " $@%@B+Z+C+X.X.&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@2@3@2 d ~ ~ > s ", " A+4@B+5@C+6@7@8@9@0@a@b@c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@! ~ ~ ~ w@ ", " x@A+y@z@A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@w+Y@Z@u@~ ~ ~ ~ `@. ", " # .#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#/#(#_#:#<#[#}#i.|#1#~ 1 ~ d Q 2#& s ", " A+3#B+4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#p#q#r#s#m+t#u#~ 4 ~ c ~ v#* ", " A+w#B+x#y#z#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#|+X#}+n ~ 3 m ~ ..: ", " A+ Y#Z#`# $J+.$+$@$#$$$%$&$*$=$-$;$>$,$'$)$!$~${$]$^$/$($;+_$:$E ~ X c ~ ) k s ", " $ $ . 9 <$) 4 [$}$|$1$2$3$4$5$6$7$8$9$0$a$b$c$d$e$f$g$w+h$i$j$#@k$N ! ~ 3 l$& @ * s * ", " * $ . m$z ! n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$m+|+H$I$@.J$K$L$n ~ E M$ . & @ s ", " 8 B % ^ z ~ N$O$P$Q$R$S$T$U$V$W$X$Y$Z$`$ %.%+%@%#%$%%%&%4+*%V W =%].m ~ 3 -%% B 9 _ ", " < 9 _ ).m ~ 1 ;%>%,%'%)%!%~%{%]%^%/%(%_%:%<%[%}%|%1%2%3%4%5%H$~ 6%=.b ~ ) ~ ) 7%* + ", " % < 8%-%3 ~ e 9%0%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%d.q%r%i+s%t%~ c e ~ ~ g ~ 2 u%= s 8 * ", " s v%~ w%~ ~ x%y%z%A%B%C%D%E%F%G%H%I%J%K%L%M%N%Z#O%O%P%Q%R%S%4 ~ ~ ~ ) d ~ c z 0 % 9 ", " 9 v x ~ z ~ | T%U%V%W%X%Y%Z%`% &.&+&@&#&$&%&&&*&=&-&# ;&>&,&'&3 ~ 3 ~ ~ ~ ~ 4 c )&!&]+* ~& ", " 9 . P Q ) 3 ! {&]&^&/&(&_&:&<&[&}&|&1&2&3&4&5&6&7&8&8&9&8&0&a&b&~ ~ d ~ ~ d ~ ~ 3 ~ c& + s & ", " @ @ $ 9 _ W ~ ~ T 3 d&@+s $ _ : e&f&f&g&g&N.8.: + _ . + & h&X n ~ ~ n ~ ~ m 2 ~ m ) i& # $ _ & ", " = _ = 8 ;.R 2 a ~ x j&& * _ $ s B h&- h&8 < + $ $ * & $ . c&~ 4 2 ~ ~ z c ~ ) ~ c k&l& 9 & $ _ $ ", " % % 9 ]+m&2 c ) ~ $.* $ _ $ _ * + * & _ _ . s 9 _ . _ [ 4 n ! ~ 4 ~ ~ e z 4 2 2 n& + $ _ _ _ $ ", " & . & B o&~ D ~ ~ x p&9 $ _ _ _ $ _ . s . & + . $ * u%n ~ 4 a ! ~ 2 ~ g ~ ~ d q&s 9 . $ $ & _ $ ", " . B + U a ~ 4 ~ ) K ~& s & _ & . s s . _ _ & & $ s * + * # s L z ~ ! a d&r&~ ~ ~ c ! ~ 5 s& & s & & ", " % % t&~ b ~ c 3 u&_ . $ _ & . * * * $ _ & ~&( o&1 ~ ) ~ +.| #.D ~ ~ z X 2 v&8 & $ * ", " * w& ]+++~ X ~ ~ ~ 3 x&w&- & * * . 9 : ~&B = & $ . + 8 % - K.k 2#y&z&~ d ~ ~ T A&| e ~ ~ ~ d ~ B&w&. & ", " 9 & < C&4 e ~ d ~ 3 D&E&F&G&g&@ K.( 8.( e&s&y&H&[ I&K.@ @ 8 h&!&j J&e&; [ J g&r M 4 ~ m e ~ X K&p J.~ 3 4 c g r ]+ _ ", " $ $ s ~&r&2 ~ 3 ~ 2 n *.M$a.a.J s @ 8%I&<$j&L&(.{.k ~&: % + < - M&M&<$J J&L.N&O&_.i ~ ! 1 ! ~ ~ b A&P&~ ! 1 ~ ) d& ]+ + & ", " $ $ $ . $ K$a ~ ~ ! ) ~ ) &.L&r 8%. & _ * s < k ; r w&@ . & $ & = . < ( M&Q&(.y&C&R&R&u&~ ~ ~ m c ~ p S&L$c ~ ~ 2 e T& _ + ", " $ $ $ $ s G&w ~ ~ ~ ~ m ~ I i&8.+ & . B j @+$ $ $ & $ * % K.I&{.v i&(.U&D&3 2 ! 3 ~ n V&&.r&~ 2 ~ ~ z&e&s 9 $ ", " $ $ _ _ = P&) ~ ~ n ~ c ~ r.- $ 8 _ . . = : + _ _ & * * & $ $ + * # ( W&_.G&, 3 e ~ ~ c ~ +.X&k&! c ~ ~ ~ ^ + & & . ", " $ $ _ & & R&) T ~ ) d 2 ) g -.% + . s & s $ _ _ $ $ $ s * $ & _ N.N&;.g ~ c ~ g ~ 2 Y Y&Q d ~ 4 4 X I& s _ ", " $ $ _ . . & Z&~ c ~ X ~ z ) ~.K._ & & _ $ $ * $ $ & $ & . _ $ _ . B B `&l$~ D ~ 2 ~ d z&++D&~ d ~ X ~ v# s ", " $ _ & . * *m d 4 ~ z&~ d J.;. 9 * * $ _ * * _ $ & * & . _ _ * * s s .*+*2 ~ ~ ! m T , @*~ 4 ~ c ~ t&h&* ", " $ _ & . * v%~ ~ b ~ y b ~ *. s % @ $ _ * $ . & _ _ $ * + s $ * * _ + L$~ g ~ ) ~ ~ X&S&~ ~ ) ~ e ~ O& $ * ", " * s = h&c z ~ b #*K ~ d {.8 & 9 & s $ . < , ~ ~ ) ~ 4 ! V&u&2 ~ ~ ~ 2 ) L _ * * ", " & & 0 ~ 2 2 3 R e ~ F ~&* _ . . & s . y&z 4 3 ~ ) 4 @*G z 4 ) ~ ~ ~ $** 9 ", " & = s.~ 3 g z %*! Q .* $ & $ _ 9 _ # ~&3 ~ ~ 2 3 4 u%&*1 d 2 ~ 3 ~ 2 j = ", " * * . s .*m c 3 z p **z M @ & + . s @+w&c ~ ~ m ~ 2 d&K&2 ~ ~ ~ ) 4 ~ =*. . ", " * 9 $ > ! ) ~ ~ -*D 2 ++ * * & $ 9 _ & = 8 ' 3 ~ d ~ 3 d&V&3 ~ ~ ~ ! a ~ F s ", " 9 . # d&~ ~ ! g ;*~ ~ C& $ $ & _ & = = ] ~ ~ 2 ~ 3 u%q ) 2 3 ~ ~ m ! r& & ", " 9 _ R&z ~ ~ m $*`@~ { >* _ $ $ $ _ _ 9 * u ~ 2 ~ ! ! ].I ) ) ) ~ ~ ~ ) n ", " & ]+++~ ~ ~ ) $.5 n ' 9 * * _ _ s . . & _ S&e 1 ~ d 3 =.+.~ ~ ! ~ 2 3 c R s $ ", " ,*P%'*)*!*~*{*]*^*i./*(*_*:* <* [*=&}*|*1*2*3*/+e ~ ) ~ =.m d ~ ~ ~ ~ d ) d G&$ ", " 4*A+5*6*i+i+i+7*8*9*0*a*]+ b*$@c*Z#Z#P%d*e*~ ~ e 1 6%~ ! d m 4 ! 2 3 3 ).& ", " f*g*h*i*j*k*A#l*X.m*n*o*p*5+q*r* s*|*t*u*v*&&w*x*m b b X J.~ ~ z ! ~ ) ~ ~ 3 y* ", " b*A+z*A*B*X.C*D*2@2@E*F*2@G*H*c* |*b*C+I*J*K*L*M*~ ! ~ 1 w ! ~ ~ H$H$N*H$H$O*P*B+$ ", " '*Q*R*S*T*U*V*W*X*~ Y*Z*`* =.=+= =&@=#=$=$=%=&=*=%*L$t&$.D&2 ~ ~ H$==-=H$H$;=>=y@_ $ $ ", " ,='=)=!=~={=]=^=J+m+/=(=_=:=H*<= [=}=g**+b*|=1=2=b ~ ~ d **-%**c H$3=H$H$4=5=6=C+_ _ _ $ ", " &&7=8=9=0=a=b=c=d=e=m+~ f=g=h=i= #=&&j=k=l=m=n=%%~ 4 1 4 ~ ~ D&s.o=p=H$q=4=r=5@C+& & _ $ ", " s=!=B+t=u=v=w=x=y=z=A=i+B=C=D=E= F=G=H=I=J=K=L=M=d ! ! ~ 4 ~ Q ~ N=O=P=Q=h.R=S=T=. & _ _ $ ", "U%&&U=V=W=X='*Y=l=$@!=Z=`= -.-+-@-#-$-%-&-*-X.=-@ B _ . & $ $ $ _ $ $ & --;->-,-'-)-!-~-{-]-^-/-(-_-]-:-h.:-<-[-}-|-1*1-2-=&Z#H*H* ", "}*3-4-5-6-b*7-8-9-0-a-b-c-d-e-f-g-h-i-j-8@k-l-~-0.H& K. s _ $ $ $ $ $ _ & m-n-o-p-q-r-s-t-u-i+i+8@8@v-6*u-w-x-y-z-A-B-C-D-E-=&Z#H*H* ", "F-G-9& H-I-J-8&F-K-L-M-N-O-P-Q-R-S-T-U-V-.@W-/+~ w%s& * $ $ _ $ $ & X-Y-Z-`- ;.;+;@;#;H$H$$;%;H$H$&;*;=;-;;;>;,;';);E-!;=&H*H* ", "~;{;|*];^;/;(;_;:;<;[;};|;1;2;3;4;5;6;7;8;9;8@0;4 ~ 5 9._ * * & $ $ * a;b;c;d;e;f;g;h;i;X.j;k;k;j;X.~ l;m;n;o;p;q;r;s;t;u;=&H*H* ", "v;w;x;y;z;A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;d ~ ~ N c&@ s _ _ $ + T;U;V;W;X;Y;Z;`; >.>+>@>@>#>$>%>&>*>=>->;>>>,>'>)>7=!;!>H* ", "~>{>]>^>/>(>_>:><>[>}>|>1>2>3>4>5>6>7>8>9>0>a>b>~ n ~ ~ a F $ $ $ _ & % c>d>e>f>g>h>i>j>k>l>m>n>o>m>p>q>r>s>t>u>v>w>x>y>z>7=u;!>H* ", "A>B>C>D>E>F>G>H>I>J>K>L>M>N>O>P>Q>R>S>T>U>V>W>X>4 m a ~ X 1 &*@ $ $ $ _ . # Y>Z>`> ,.,+,@,#,$,%,&,*,=,-,;,>,,,',),!,~,{,],^,V=x#u;/,H* ", "(,_,:,<,[,},|,1,2,3,4,5,6,7,8,9,0,a,b,c,d,e,f,g,b ~ 3 Q ~ ~ Q h,$ $ $ $ * : i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,V=x#7=/,!> ", "G,H,I,J,K,L,M,N,O,O,O,O,O,O,O,O,P,P,Q,R,R,S,T,U,V,W,R;X,Y,Y@==Z,&. : . $ s & _ = `, '.'+'@'#'$'%'&'*'='-'-'='*'&';'>'O>,''')'!'~'{']'*+#=^'/'&&", "('_':'<'['}'|'1'2'2'2'2'2'2'2'2'3'P,4'5'5'6'7'8'9'0'a'b'X.4+c'X.g d' . & s * s $ $ + s e'f'g'h'i'j'k'l'm'm'&'&'&'&'m'm'>'6'O>n'o'p'q'r's't'u'*+v'w'i*", "Z#x'y'z'A'B'C'D'E'E'E'E'E'E'E'E'F'G'H'O,2'I'U,J'a#K'L'R;i+M'H$~ 2 P _ % + @ = $ % _ 9 N'O'P'Q'R'S'T'U'V'V'n'n'n'n'V'V'W'2'O>n'X'Y'Z'p'`' ).)+)n.@)#)", "$)%)&)*)=)-);)>),),),),),),),),)')))!)2'2'~){)'#])^)/)()_):)<)[)2 k&# 8. h& K. % < K. })|)1)2)3)4)T'5)6)6)V'V'V'V'6)6)3'!)O>7)8)9)0)a)b)c)d)e)f)g)C+", "h)i)j)k)l)m)n)o)E'E'E'E'E'E'E'E'')))O,O,2'E'p)'#q)r)s)t)u)v)w)x)3 -*. & $ _ 8 * _.y)9;z)A)B)C)D)E)F)F)F)F)F)F)F)F)G)P,F)H)H)I)J)K)L)M)N)O)P)Q)R)", "S)T)U)V)W)X)Y)F'O,O,O,O,O,O,O,O,2'O,5'R,5'2',)Z)`) !.!+!@!#!w+$!y -. 9 # . B & {.-%_$9;%!&!*!=!-!;!H)H)F)F)F)F)H)H)>!,!F)F)'!)!!!~!{!]!^!7,/!(!_!", ":!~,~>~'~)~!~~~{~]~^~/~(~[,_~:~<~[~}~C+|~H*$)1~2~|*& _ $ & s s % 3~x ~ b ~ 4~5~6~7~8~9~0~a~E'))))G'G'))))E'b~R,c~J)d~e~Y!f~g~h~i~j~k~l~m~", "n~o~p~q~r~s~t~u~>~,~,~v~v~w~w~w~x~y~z~A~B~C~D~D~E~F~0~G~H~I~J~K~L~M~A+s N~O~H*P~ s @ = $ !&v&~ 1 ~ ~ +*Q~R~S~T~U~V~X)W~E'))))G'G'))))E'X~Y~Z~`~ {.{+{@{#{${%{&{*{={-{", ";{>{,{'{){!{~{{{]{]{^{^{/{({({({_{_{:{:{<{[{}{|{1{2{3{4{5{6{7{8{9{0{a{b{#)c{ d{ + @ _ 9 ( e{f ~ c ~ 2 X ~ f{g{h{i{j{k{l{m{E'E'))))))))E'E'n{o{o{p{>'q{r{s{t{u{v{w{x{y{z{", "A{B{C{D{E{F{G{H{I{I{J{K{L{L{M{M{N{N{O{P{P{Q{R{S{T{U{V{W{X{Y{Z{`{ ]R;.]+]@]#]$]%] . & _ ~&d'F +.2 ~ 2 1 ~ ~ ! ~ &]*]=]-];]>],]']I'E'))))))))E'I')]!]6)~]{]]]H'^]/](]_]:]<][] ", "}]|]1]2]3]4]5]6]7]7]7]8]9]9]0]a]b]9]c]d]e]f]f]g]M{h]i]j]k]l]m]n]o]9;W*p]q]r]s]t]u]K&P s.5 X d 3 ~ +*) ~ d 3 ~ 1 v]w]x]y]z]A]B]C]I'I'E'))))E'I'I'D]R,{]E]F]G]H]I]J]K]L]M]N]+#O]", "P]Q]R]S]T]U]V]W]X]X]Y]Z]Z]`] ^ ^Z]Z]`].^9]+^@^@^#^$^%^&^*^=^-^;^>^e!,^'^$+)^!^4+~ ~ ~ 3 ~ ~ ~ ~ ) ~ ~ g ~ ! a ~ ~^{^]^^^/^(^_^:^I'I'E'E'E'E'I'I'<^4'[^}^|^1^2^3^4^5^6^7^!;8^9^", "0^a^b^c^d^e^f^g^h^h^i^j^k^l^m^m^n^o^p^q^4]r^s^.^t^u^v^w^x^y^z^A^B^C^W*D^4+E^F^G^X c ~ ~ ! ) ~ ~ z 2 ~ 3 ~ ~ ~ 4 H^I^J^K^L^M^N^O^T,I'I'E'E'I'I'T,P^Q^R^S^T^U^V^W^X^Y^Z^`^ /./+/", "@/#/$/%/&/*/=/-/;/;/>/,/'/'/)/!/~/{/]/^/o^q^////(/_/:/>%(&(*(=(-(;(>(,('()(!(~({(](^( ", "1*/(((_(:(<([(}(|(1(2(3(4(5(6(7(8(9(0(a(b(c(d(e(f(g(h(i(j(k(l(m(n(o(p(q(5/r(s(t(s.z&r&L$n&7%x&v%H l $*-%| x ) 3 u(v(w(x(y(z(A(B(C(D(E(F(G(H(I(J(K(L(M(N(O%B+A+b* ", "O(O(P(*+'*'*U%Q(R(S(T(U(V(W(X(Y(Z(`( _._+_@_#_$_h^'/%_&_*_=_-_;_>_,_W*'_)_!_~_{__ _ . _ . % $ & _ $ ]+f&,./ ]_^_/_(___:_<_[_}_|_1_2_3_4_5_6_7_8_9_0_a_6-b*b_ ", "c_d_e_f_g_h_i_!=j_k_l_m_n_o_p_q_r_s_t_u_v_w_x_y_z_A_B_C_D_E_F_G_H_I_J_!=K_L_M_=&]++ $ * 9 s _ * * $ * < < N_O_P_Q_R_S_T_U_V_W_X_Y_Z_`_ :.:+:@:0_#:$:%:*+&: ", "c_c_c_c_*:=:-:-:|*'**+b*6-;:>:,:':):!:~:{:]:^:/:(:_:::<:[:}:|:1:2:3:*+8&4: b*H* $ _ 9 * + s & $ O%5:6:7:8:9:0:a:b:c:d:e:f:g:h:i:j:/,k:l:m:n:$@P% ", "o:p:1**+q:q*t;z>r:s:$:t:u:q:P%v:^'8&w:x:y:z:A:B:C:D:E:F:G:H:I:J:K:,=L:M:N:O:* *+s _ & & & s + P:Q:R:S:T:U:V:W:X:Y:Z:`: <.<+<,<'<)next = route_set.next; route_set.next->prev = new_entry; route_set.next = new_entry; new_entry->prev = &route_set; route_count++; return 1; } int del_route_entry(struct route_entry *entry __attribute__((unused))) { route_count--; return 1; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/linux-gtk/src/routes.h000066400000000000000000000031711234304727700200100ustar00rootroot00000000000000 /* * OLSR ad-hoc routing table management protocol GUI front-end * Copyright (C) 2003 Andreas Tonnesen (andreto@ifi.uio.no) * * This file is part of olsr.org. * * uolsrGUI is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * uolsrGUI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with olsr.org; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* * Route entries are registered * separatly from the node set * * This set is not used for anything in particular * intended for future use */ #ifndef _OLSRD_FRONTEND_ROUTE #define _OLSRD_FRONTEND_ROUTE #include "common.h" #define MAX_IF_NAMESIZ 10 struct route_entry { union olsr_ip_addr gw; union olsr_ip_addr dst; olsr_u16_t hopcnt; char if_name[MAX_IF_NAMESIZ]; struct route_entry *next; struct route_entry *prev; }; /* List */ struct route_entry route_set; /* Counter */ olsr_u32_t route_count; /* Functions */ int init_route_entries(void); int add_route_entry(struct route_entry *); int del_route_entry(struct route_entry *); #endif /* _OLSRD_FRONTEND_ROUTE */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/000077500000000000000000000000001234304727700145455ustar00rootroot00000000000000olsrd-0.6.6.2/gui/win32/.gitignore000066400000000000000000000000671234304727700165400ustar00rootroot00000000000000/Main/Debug/ /Main/Release/ /Shim/Debug/ /Shim/Release/olsrd-0.6.6.2/gui/win32/Inst/000077500000000000000000000000001234304727700154625ustar00rootroot00000000000000olsrd-0.6.6.2/gui/win32/Inst/installer.nsi000066400000000000000000000150551234304727700202000ustar00rootroot00000000000000; ; The olsr.org Optimized Link-State Routing daemon (olsrd) ; Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) ; All rights reserved. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions ; are met: ; ; * Redistributions of source code must retain the above copyright ; notice, this list of conditions and the following disclaimer. ; * Redistributions in binary form must reproduce the above copyright ; notice, this list of conditions and the following disclaimer in ; the documentation and/or other materials provided with the ; distribution. ; * Neither the name of olsr.org, olsrd nor the names of its ; contributors may be used to endorse or promote products derived ; from this software without specific prior written permission. ; ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ; FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ; COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, ; BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ; ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ; POSSIBILITY OF SUCH DAMAGE. ; ; Visit http://www.olsr.org for more information. ; ; If you find this software useful feel free to make a donation ; to the project. For more information see the website or contact ; the copyright holders. ; ; Name olsr.org OutFile ..\..\..\olsr-setup.exe BrandingText "www.olsr.org" InstallDir $PROGRAMFILES\olsr.org LicenseData ..\..\..\license.txt XPStyle on Page license Page components Page directory Page instfiles UninstPage uninstConfirm UninstPage instfiles Function .onInit MessageBox MB_YESNO "This will install olsr.org 0.6.6.2 on your computer. Continue?" IDYES NoAbort Abort NoAbort: FunctionEnd InstType "ETX Configuration (recommended)" InstType "RFC Configuration" Section "Program Files" SectionIn 1 2 RO SetOutPath $INSTDIR File ..\Main\release\Switch.exe File ..\Shim\release\Shim.exe File ..\..\..\olsrd.exe File ..\..\..\src\cfgparser\olsrd_cfgparser.dll File /oname=README.txt ..\..\..\README File /oname=README-LQ.html ..\..\..\README-Link-Quality.html File /oname=README-Fish-Eye.txt ..\..\..\README-Link-Quality-Fish-Eye.txt File ..\..\..\README-Olsr-Switch.html File linux-manual.txt File ..\Main\RFC-Default.olsr File ..\Main\LQ-Default.olsr File ..\..\..\lib\dot_draw\olsrd_dot_draw.dll File ..\..\..\lib\httpinfo\olsrd_httpinfo.dll File ..\..\..\lib\mini\olsrd_mini.dll File ..\..\..\lib\pgraph\olsrd_pgraph.dll File ..\..\..\lib\secure\olsrd_secure.dll File ..\..\..\lib\txtinfo\olsrd_txtinfo.dll WriteRegStr HKLM Software\Microsoft\Windows\CurrentVersion\Uninstall\olsr.org DisplayName olsr.org WriteRegStr HKLM Software\Microsoft\Windows\CurrentVersion\Uninstall\olsr.org UninstallString $INSTDIR\uninstall.exe WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\Uninstall\olsr.org NoModify 1 WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\Uninstall\olsr.org NoRepair 1 WriteUninstaller $INSTDIR\uninstall.exe SectionEnd Section "ETX Configuration" SectionIn 1 RO File ..\..\..\gui\win32\Main\RFC-Default.olsr File ..\..\..\gui\win32\Main\LQ-Default.olsr File /oname=Default.olsr ..\..\..\gui\win32\Main\LQ-Default.olsr SectionEnd Section "RFC Configuration" SectionIn 2 RO File ..\..\..\gui\win32\Main\RFC-Default.olsr File ..\..\..\gui\win32\Main\LQ-Default.olsr File /oname=Default.olsr ..\..\..\gui\win32\Main\RFC-Default.olsr SectionEnd Section "Start Menu Shortcuts" SectionIn 1 2 CreateDirectory $SMPROGRAMS\olsr.org CreateShortCut "$SMPROGRAMS\olsr.org\OLSR Switch.lnk" $INSTDIR\Switch.exe "" $INSTDIR\Switch.exe 0 CreateShortCut $SMPROGRAMS\olsr.org\README.lnk $INSTDIR\README.txt CreateShortCut $SMPROGRAMS\olsr.org\README-LQ.lnk $INSTDIR\README-LQ.html CreateShortCut $SMPROGRAMS\olsr.org\Uninstall.lnk $INSTDIR\uninstall.exe "" $INSTDIR\uninstall.exe 0 SectionEnd Section "Desktop Shortcut" SectionIn 1 2 CreateShortCut "$DESKTOP\OLSR Switch.lnk" $INSTDIR\Switch.exe "" $INSTDIR\Switch.exe 0 SectionEnd Section "File Association (*.olsr)" SectionIn 1 2 WriteRegStr HKCR .olsr "" OlsrOrgConfigFile WriteRegStr HKCR OlsrOrgConfigFile "" "olsr.org Configuration File" WriteRegStr HKCR OlsrOrgConfigFile\shell "" open WriteRegStr HKCR OlsrOrgConfigFile\DefaultIcon "" $INSTDIR\Switch.exe,0 WriteRegStr HKCR OlsrOrgConfigFile\shell\open\command "" '$INSTDIR\Switch.exe "%1"' SectionEnd Section "Uninstall" DeleteRegKey HKLM Software\Microsoft\Windows\CurrentVersion\Uninstall\olsr.org DeleteRegKey HKCR .olsr DeleteRegKey HKCR OlsrOrgConfigFile Delete $INSTDIR\Switch.exe Delete $INSTDIR\Shim.exe Delete $INSTDIR\olsrd.exe Delete $INSTDIR\olsr_switch.exe Delete $INSTDIR\olsrd_cfgparser.dll Delete $INSTDIR\README.txt Delete $INSTDIR\README-LQ.html Delete $INSTDIR\README-Fish-Eye.txt Delete $INSTDIR\README-Olsr-Switch.html Delete $INSTDIR\linux-manual.txt Delete $INSTDIR\Default.olsr Delete $INSTDIR\RFC-Default.olsr Delete $INSTDIR\LQ-Default.olsr Delete $INSTDIR\olsrd.conf.rfc Delete $INSTDIR\olsrd.conf.lq Delete $INSTDIR\olsrd_dot_draw.dll Delete $INSTDIR\olsrd_httpinfo.dll Delete $INSTDIR\olsrd_mini.dll Delete $INSTDIR\olsrd_pgraph.dll Delete $INSTDIR\olsrd_secure.dll Delete $INSTDIR\olsrd_txtinfo.dll Delete $INSTDIR\uninstall.exe RMDir $INSTDIR Delete "$SMPROGRAMS\olsr.org\OLSR Switch.lnk" Delete $SMPROGRAMS\olsr.org\README.lnk Delete $SMPROGRAMS\olsr.org\README-LQ.lnk Delete $SMPROGRAMS\olsr.org\Uninstall.lnk RMDir $SMPROGRAMS\olsr.org Delete "$DESKTOP\OLSR Switch.lnk" SectionEnd olsrd-0.6.6.2/gui/win32/Inst/linux-manual.txt000066400000000000000000000124451234304727700206430ustar00rootroot00000000000000olsrd(8) olsrd(8) NAME olsrd - Optimized Link State Routing protocol daemon SYNOPSIS olsrd [ -i interface1 [interface2 ...] ] [ -f configfile ] [ -d debuglevel ] [ -ipv6 ] [ -ipc ] [ -tnl ] [ -bcast broadcastaddress ] [ -delgw ] [ -hint HELLO interval for wire- less interfaces ] [ -tcint TC interval ] [ -midint MID interval ] [ -hnaint HNA interval ] [ -hhold HELLO validity time ] [ -thold TC validity time ] [ -tos TOS value ] [ -nhint HELLO interval non WLAN ] [ -nhhold HELLO validity time non WLAN ] [ -T scheduler poll rate ] DESCRIPTION olsrd is an implementation of the Optimized Link State Routing protocol for Mobile Ad-Hoc networks(MANET). The protocol is described in RFC3626. It is designed to be run as a standalone server process - but as it is still in an experimental stage most users will prefer running it with some debug output which is directed to STDOUT. This manual page only lists the command line arguments. For details of the configuration file see the comments included in /etc/olsrd.conf. Note that none of these options need to be set at the command line - all these options and others can be set in the configuration file. The homepage of olsrd is http://www.olsr.org OPTIONS -i interface1 ... interfaceN This option specifies on what network interfaces olsrd should run. These interfaces cannot be aliased interfaces such as eth0:1. -f configfile This option overrides the default configuration file path used by olsrd - /etc/olsrd.conf -d debuglevel This option specifies the amount of debug information olsrd should write to STDOUT. If set to 0 olsrd will run in the background. -ipv6 This option instructs olsrd to use the Internet Protocol version 6. The default is version 4. -ipc This option allows the GUI front-end created fro olsrd to connect to olsrd at runtime. -tnl When this option is set olsrd will use IP-in-IP tunneling to Internet gateways. This is very experimental code and it should not be used as of yet. -delgw If this option is set olsrd will remove any default routes set prior to adding an Internet route based on OLSR rout- ing. -bcast broadcastaddress This option specifies what IPv4 broadcastaddress to use for OLSR control traffic. The only value that currently makes sense when setting broadcast address mannually is 255.255.255.255. The default action is to use the broad- castaddres that the network interface is preconfigured with(per interface). -hint seconds This value sets the interval on which HELLO messages should be generated. The value is a floating point number repre- senting seconds. -nhint seconds This value sets the interval on which HELLO messages should be generated on interfaces that are not detected to be wireless. The value is a floating point number represent- ing seconds. -tcint seconds This value sets the interval on which TC messages should be generated. The value is a floating point number represent- ing seconds. -midint seconds This value sets the interval on which MID messages should be generated. The value is a floating point number repre- senting seconds. -hnaint seconds This value sets the interval on which HNA messages should be generated. The value is a floating point number repre- senting seconds. -hhold multiplier This option sets the announced HELLO validity time as a multiplier of the HELLO interval. -nhhold multiplier This option sets the announced HELLO validity time on non- WLAN interfaces, as a multiplier of the HELLO interval. -thold multiplier This option sets the announced TC validity time as a multi- plier of the TC interval. -tos TOS-value This option sets the type of service value that should be set in the OLSR control traffic packet IP headers. -T seconds This option sets the polling intervall of the scheduler. The default is 0.1 seconds. This option should only be con- sidered if running with really low emission intervals. FILES /etc/olsrd.conf SEE ALSO iwconfig(8) route(8). olsrd-0.6.6.2/gui/win32/Main/000077500000000000000000000000001234304727700154315ustar00rootroot00000000000000olsrd-0.6.6.2/gui/win32/Main/Frontend.clw000066400000000000000000000123261234304727700177230ustar00rootroot00000000000000; CLW file contains information for the MFC ClassWizard [General Info] Version=1 LastClass=MyDialog2 LastTemplate=CDialog NewFileInclude1=#include "stdafx.h" NewFileInclude2=#include "frontend.h" LastPage=0 ClassCount=8 Class1=CFrontendApp Class2=CFrontendDlg Class3=MyDialog1 Class4=MyDialog2 Class5=MyDialog3 Class6=MyDialog4 Class7=MyEdit Class8=MyTabCtrl ResourceCount=6 Resource1=IDD_DIALOG1 (Englisch (USA)) Resource2=IDD_DIALOG3 (Englisch (USA)) Resource3=IDD_DIALOG4 (Englisch (USA)) Resource4=IDD_DIALOG2 (Englisch (USA)) Resource5=IDD_FRONTEND_DIALOG (Englisch (USA)) Resource6=IDR_TRAYMENU (Englisch (USA)) [CLS:CFrontendApp] Type=0 BaseClass=CWinApp HeaderFile=Frontend.h ImplementationFile=Frontend.cpp LastObject=CFrontendApp [CLS:CFrontendDlg] Type=0 BaseClass=CDialog HeaderFile=FrontendDlg.h ImplementationFile=FrontendDlg.cpp LastObject=IDC_TAB1 [CLS:MyDialog1] Type=0 BaseClass=CDialog HeaderFile=MyDialog1.h ImplementationFile=MyDialog1.cpp LastObject=IDC_BUTTON1 [CLS:MyDialog2] Type=0 BaseClass=CDialog HeaderFile=MyDialog2.h ImplementationFile=MyDialog2.cpp LastObject=IDC_COMBO3 Filter=D VirtualFilter=dWC [CLS:MyDialog3] Type=0 BaseClass=CDialog HeaderFile=MyDialog3.h ImplementationFile=MyDialog3.cpp LastObject=IDC_LIST1 [CLS:MyDialog4] Type=0 BaseClass=CDialog HeaderFile=MyDialog4.h ImplementationFile=MyDialog4.cpp LastObject=IDC_LIST1 [CLS:MyEdit] Type=0 BaseClass=CEdit HeaderFile=MyEdit.h ImplementationFile=MyEdit.cpp [CLS:MyTabCtrl] Type=0 BaseClass=CTabCtrl HeaderFile=MyTabCtrl.h ImplementationFile=MyTabCtrl.cpp [DLG:IDD_FRONTEND_DIALOG] Type=1 Class=CFrontendDlg [DLG:IDD_DIALOG1] Type=1 Class=MyDialog1 [DLG:IDD_DIALOG2] Type=1 Class=MyDialog2 [DLG:IDD_DIALOG3] Type=1 Class=MyDialog3 [DLG:IDD_DIALOG4] Type=1 Class=MyDialog4 [DLG:IDD_FRONTEND_DIALOG (Englisch (USA))] Type=1 Class=CFrontendDlg ControlCount=4 Control1=IDC_TAB1,SysTabControl32,1342177280 Control2=IDC_BUTTON1,button,1342242816 Control3=IDC_BUTTON2,button,1342242816 Control4=IDC_BUTTON3,button,1342242816 [DLG:IDD_DIALOG4 (Englisch (USA))] Type=1 Class=MyDialog4 ControlCount=2 Control1=IDC_LIST1,SysListView32,1350631425 Control2=IDC_STATIC,static,1342308352 [DLG:IDD_DIALOG3 (Englisch (USA))] Type=1 Class=MyDialog3 ControlCount=6 Control1=IDC_LIST1,SysListView32,1350631429 Control2=IDC_LIST4,SysListView32,1350631429 Control3=IDC_LIST5,SysListView32,1350631429 Control4=IDC_LIST6,SysListView32,1350631429 Control5=IDC_STATIC,static,1342308352 Control6=IDC_STATIC,static,1342308352 [DLG:IDD_DIALOG2 (Englisch (USA))] Type=1 Class=MyDialog2 ControlCount=54 Control1=IDC_LIST1,SysListView32,1350631427 Control2=IDC_SLIDER2,msctls_trackbar32,1342242825 Control3=IDC_EDIT7,edit,1350631426 Control4=IDC_CHECK3,button,1476460547 Control5=IDC_CHECK2,button,1342242819 Control6=IDC_EDIT1,edit,1350631426 Control7=IDC_EDIT2,edit,1350631426 Control8=IDC_EDIT3,edit,1350631426 Control9=IDC_EDIT9,edit,1350631426 Control10=IDC_EDIT4,edit,1350631426 Control11=IDC_EDIT10,edit,1350631426 Control12=IDC_EDIT5,edit,1350631426 Control13=IDC_EDIT6,edit,1350631426 Control14=IDC_COMBO1,combobox,1344340227 Control15=IDC_EDIT15,edit,1350639618 Control16=IDC_CHECK1,button,1342242819 Control17=IDC_EDIT12,edit,1350631426 Control18=IDC_EDIT13,edit,1350631426 Control19=IDC_EDIT11,edit,1350631426 Control20=IDC_CHECK4,button,1342242819 Control21=IDC_RADIO1,button,1342373897 Control22=IDC_RADIO2,button,1342373897 Control23=IDC_BUTTON4,button,1342242816 Control24=IDC_BUTTON5,button,1342242816 Control25=IDC_BUTTON1,button,1342242816 Control26=IDC_STATIC,static,1342308352 Control27=IDC_STATIC,static,1342308352 Control28=IDC_STATIC,static,1342308354 Control29=IDC_STATIC,static,1342308354 Control30=IDC_STATIC,static,1342308354 Control31=IDC_STATIC,static,1342308354 Control32=IDC_STATIC,static,1342308354 Control33=IDC_STATIC,static,1342308354 Control34=IDC_STATIC,static,1342308354 Control35=IDC_STATIC,static,1342308354 Control36=IDC_STATIC,static,1342308354 Control37=IDC_STATIC,static,1342308354 Control38=IDC_STATIC,static,1342308352 Control39=IDC_STATIC,static,1342308352 Control40=IDC_STATIC,static,1342308352 Control41=IDC_STATIC,static,1342308352 Control42=IDC_STATIC,static,1342308352 Control43=IDC_STATIC,static,1342308352 Control44=IDC_STATIC,static,1342308352 Control45=IDC_STATIC,static,1342308352 Control46=IDC_STATIC,static,1342308354 Control47=IDC_STATIC,static,1342308352 Control48=IDC_TEXT1,static,1342308353 Control49=IDC_STATIC,static,1342308354 Control50=IDC_STATIC,static,1342308354 Control51=IDC_STATIC,static,1342308354 Control52=IDC_STATIC,static,1342308354 Control53=IDC_CHECK5,button,1342242819 Control54=IDC_COMBO3,combobox,1344340227 [DLG:IDD_DIALOG1 (Englisch (USA))] Type=1 Class=MyDialog1 ControlCount=5 Control1=IDC_EDIT1,edit,1353783300 Control2=IDC_BUTTON3,button,1342242816 Control3=IDC_BUTTON2,button,1342242816 Control4=IDC_BUTTON4,button,1342242816 Control5=IDC_BUTTON1,button,1342242816 [MNU:IDR_TRAYMENU (Englisch (USA))] Type=1 Class=? Command1=IDM_START Command2=IDM_STOP Command3=IDM_WINDOW Command4=IDM_SETTINGS Command5=IDM_OUTPUT Command6=IDM_EXIT CommandCount=6 olsrd-0.6.6.2/gui/win32/Main/Frontend.cpp000066400000000000000000000152731234304727700177240ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "stdafx.h" #include "Frontend.h" #include "FrontendDlg.h" #include "TrayIcon.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /* _DEBUG */ BEGIN_MESSAGE_MAP(CFrontendApp, CWinApp) //{{AFX_MSG_MAP(CFrontendApp) //}}AFX_MSG ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() CFrontendApp::CFrontendApp() { } CFrontendApp theApp; static int SetEnableRedirKey(unsigned long New) { HKEY Key; unsigned long Type; unsigned long Len; unsigned long Old; if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ | KEY_WRITE, &Key) != ERROR_SUCCESS) return -1; Len = sizeof (Old); if (::RegQueryValueEx(Key, "EnableICMPRedirect", NULL, &Type, (unsigned char *)&Old, &Len) != ERROR_SUCCESS || Type != REG_DWORD) Old = 1; if (::RegSetValueEx(Key, "EnableICMPRedirect", 0, REG_DWORD, (unsigned char *)&New, sizeof (New))) { ::RegCloseKey(Key); return -1; } ::RegCloseKey(Key); return Old; } BOOL CFrontendApp::InitInstance() { int Res; CCommandLineInfo CmdLineInfo; ParseCommandLine(CmdLineInfo); CFrontendDlg dlg; tray_icon = new TrayIcon( dlg, AfxGetInstanceHandle() ); dlg.ConfigFile = CmdLineInfo.m_strFileName; m_pMainWnd = &dlg; Res = SetEnableRedirKey(0); if (Res == 1) { Res = AfxMessageBox("- WARNING -\n\n" "The OLSR software has just switched off the processing of incoming ICMP " " redirect messages in your registry.\n\n" " Please REBOOT your computer for this change to take effect.\n\n" " Do you want to allow the OLSR software to reboot your computer now?\n\n" " (Please say \"Yes\".)", MB_YESNO | MB_ICONEXCLAMATION); if (Res == IDYES) { HANDLE Proc; HMODULE Lib; BOOL (*Open)(HANDLE, DWORD, HANDLE *); BOOL (*Lookup)(char *, char *, LUID *); BOOL (*Adjust)(HANDLE, BOOL, TOKEN_PRIVILEGES *, DWORD, TOKEN_PRIVILEGES *, DWORD *); HANDLE Token; Proc = ::GetCurrentProcess(); Lib = ::LoadLibrary("advapi32.dll"); if (Lib != NULL) { Open = (BOOL (*)(HANDLE, DWORD, HANDLE *)) ::GetProcAddress(Lib, "OpenProcessToken"); Lookup = (BOOL (*)(char *, char *, LUID *)) ::GetProcAddress(Lib, "LookupPrivilegeValueA"); Adjust = (BOOL (*)(HANDLE, BOOL, TOKEN_PRIVILEGES *, DWORD, TOKEN_PRIVILEGES *, DWORD *)) ::GetProcAddress(Lib, "AdjustTokenPrivileges"); if (Open != NULL && Lookup != NULL && Adjust != NULL) { struct { DWORD Count; LUID_AND_ATTRIBUTES Priv; } TokPriv; Proc = ::GetCurrentProcess(); if (!Open(Proc, TOKEN_ALL_ACCESS, &Token)) AfxMessageBox("OpenProcessToken() failed."); else if (!Lookup("", "SeShutdownPrivilege", &TokPriv.Priv.Luid)) AfxMessageBox("LookupPrivilegeValue() failed."); else { TokPriv.Count = 1; TokPriv.Priv.Attributes = SE_PRIVILEGE_ENABLED; if (!Adjust(Token, FALSE, (TOKEN_PRIVILEGES *)&TokPriv, 0, NULL, NULL)) AfxMessageBox("AdjustTokenPrivilege() failed."); } } ::FreeLibrary(Lib); } ::ExitWindowsEx(EWX_REBOOT, 0); ::TerminateProcess(Proc, 0); } } RedirectStdHandles(); dlg.DoModal(); return FALSE; } unsigned int CFrontendApp::RedirectThreadFunc(void) { char Buff[1000]; int Len; int Left, Right; CString Line; CString Int; while (::ReadFile(OutRead, Buff, sizeof (Buff) - 1, (unsigned long *)&Len, NULL)) { if (Len == 0) break; Left = 0; for (Right = 0; Right < Len; Right++) { if (Buff[Right] != 13) Buff[Left++] = Buff[Right]; } Len = Left; Left = 0; for (Right = 0; Right < Len; Right++) { if (Buff[Right] == 10) { Buff[Right] = 0; Line += (Buff + Left); AfxMessageBox(Line); Line.Empty(); Left = Right + 1; } } Buff[Right] = 0; Line += (Buff + Left); } AfxEndThread(0); return 0; } static unsigned int RedirectThreadStub(void *Arg) { class CFrontendApp *This; This = (class CFrontendApp *)Arg; return This->RedirectThreadFunc(); } struct IoInfo { HANDLE Hand; unsigned char Attr; char Buff; #if defined _MT int Flag; CRITICAL_SECTION Lock; #endif }; extern "C" struct IoInfo *__pioinfo[]; int CFrontendApp::RedirectStdHandles(void) { SECURITY_ATTRIBUTES SecAttr; HANDLE OutWrite; struct IoInfo *Info; SecAttr.nLength = sizeof (SECURITY_ATTRIBUTES); SecAttr.lpSecurityDescriptor = NULL; SecAttr.bInheritHandle = TRUE; if (!::CreatePipe(&OutRead, &OutWrite, &SecAttr, 0)) { AfxMessageBox("Cannot create stdout pipe."); return -1; } AfxBeginThread(RedirectThreadStub, (void *)this); Info = __pioinfo[0]; // Info[1].Hand = OutWrite; // Info[1].Attr = 0x89; // FOPEN | FTEXT | FPIPE; Info[2].Hand = OutWrite; Info[2].Attr = 0x89; // stdout->_file = 1; stderr->_file = 2; win32_stdio_hack((unsigned int)OutWrite); return 0; } #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/Frontend.dsp000066400000000000000000000140721234304727700177240ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="Frontend" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=Frontend - Win32 Debug !MESSAGE Dies ist kein gltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und fhren Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "Frontend.mak". !MESSAGE !MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "Frontend.mak" CFG="Frontend - Win32 Debug" !MESSAGE !MESSAGE Fr die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "Frontend - Win32 Release" (basierend auf "Win32 (x86) Application") !MESSAGE "Frontend - Win32 Debug" (basierend auf "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "Frontend - Win32 Release" # PROP BASE Use_MFC 6 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 5 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c # ADD CPP /nologo /MT /W4 /GX /O2 /I "..\..\..\src" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX"stdafx.h" /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "NDEBUG" /d "_AFXDLL" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 /nologo /subsystem:windows /machine:I386 # ADD LINK32 olsrd_cfgparser.lib ws2_32.lib iphlpapi.lib /nologo /subsystem:windows /machine:I386 /out:"Release/Switch.exe" !ELSEIF "$(CFG)" == "Frontend - Win32 Debug" # PROP BASE Use_MFC 6 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 5 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /GZ /c # ADD CPP /nologo /MTd /W4 /Gm /GX /ZI /Od /I "..\..\..\src" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FR /YX"stdafx.h" /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "_DEBUG" /d "_AFXDLL" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 olsrd_cfgparser.lib ws2_32.lib iphlpapi.lib /nologo /subsystem:windows /debug /machine:I386 /out:"Debug/Switch.exe" /pdbtype:sept !ENDIF # Begin Target # Name "Frontend - Win32 Release" # Name "Frontend - Win32 Debug" # Begin Group "Quellcodedateien" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\Frontend.cpp # End Source File # Begin Source File SOURCE=.\Frontend.rc # End Source File # Begin Source File SOURCE=.\FrontendDlg.cpp # End Source File # Begin Source File SOURCE=.\HnaEntry.cpp # End Source File # Begin Source File SOURCE=.\MidEntry.cpp # End Source File # Begin Source File SOURCE=.\MprEntry.cpp # End Source File # Begin Source File SOURCE=.\MyDialog1.cpp # End Source File # Begin Source File SOURCE=.\MyDialog2.cpp # End Source File # Begin Source File SOURCE=.\MyDialog3.cpp # End Source File # Begin Source File SOURCE=.\MyDialog4.cpp # End Source File # Begin Source File SOURCE=.\MyEdit.cpp # End Source File # Begin Source File SOURCE=.\MyTabCtrl.cpp # End Source File # Begin Source File SOURCE=.\NodeEntry.cpp # End Source File # Begin Source File SOURCE=.\StdAfx.cpp # End Source File # Begin Source File SOURCE=.\TrayIcon.cpp # End Source File # End Group # Begin Group "Header-Dateien" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\Frontend.h # End Source File # Begin Source File SOURCE=.\FrontendDlg.h # End Source File # Begin Source File SOURCE=.\HnaEntry.h # End Source File # Begin Source File SOURCE=.\Ipc.h # End Source File # Begin Source File SOURCE=.\MidEntry.h # End Source File # Begin Source File SOURCE=.\MprEntry.h # End Source File # Begin Source File SOURCE=.\MyDialog1.h # End Source File # Begin Source File SOURCE=.\MyDialog2.h # End Source File # Begin Source File SOURCE=.\MyDialog3.h # End Source File # Begin Source File SOURCE=.\MyDialog4.h # End Source File # Begin Source File SOURCE=.\MyEdit.h # End Source File # Begin Source File SOURCE=.\MyTabCtrl.h # End Source File # Begin Source File SOURCE=.\NodeEntry.h # End Source File # Begin Source File SOURCE=..\..\..\src\olsr_cfg.h # End Source File # Begin Source File SOURCE=..\..\..\src\olsr_types.h # End Source File # Begin Source File SOURCE=.\Resource.h # End Source File # Begin Source File SOURCE=.\StdAfx.h # End Source File # Begin Source File SOURCE=.\TrayIcon.h # End Source File # End Group # Begin Group "Ressourcendateien" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # Begin Source File SOURCE=.\res\Frontend.ico # End Source File # Begin Source File SOURCE=.\res\Frontend.rc2 # End Source File # Begin Source File SOURCE=.\res\Tray1.ico # End Source File # Begin Source File SOURCE=.\res\Tray2.ico # End Source File # End Group # Begin Source File SOURCE=.\trustInfo.manifest # End Source File # End Target # End Project olsrd-0.6.6.2/gui/win32/Main/Frontend.h000066400000000000000000000054431234304727700173670ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined(AFX_FRONTEND_H__8033A41F_6FDC_4054_A582_AB7B6AC5EEAE__INCLUDED_) #define AFX_FRONTEND_H__8033A41F_6FDC_4054_A582_AB7B6AC5EEAE__INCLUDED_ #if defined _MSC_VER && _MSC_VER > 1000 #pragma once #endif /* defined _MSC_VER && _MSC_VER > 1000 */ #ifndef __AFXWIN_H__ #error include 'stdafx.h' before including this file for PCH #endif /* __AFXWIN_H__ */ #include "resource.h" class TrayIcon; class CFrontendApp:public CWinApp { public: CFrontendApp(); int RedirectStdHandles(void); unsigned int RedirectThreadFunc(void); HANDLE OutRead; TrayIcon *tray_icon; //{{AFX_VIRTUAL(CFrontendApp) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL //{{AFX_MSG(CFrontendApp) //}}AFX_MSG DECLARE_MESSAGE_MAP()}; //{{AFX_INSERT_LOCATION}} #endif /* !defined(AFX_FRONTEND_H__8033A41F_6FDC_4054_A582_AB7B6AC5EEAE__INCLUDED_) */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/Frontend.rc000066400000000000000000000255011234304727700175410ustar00rootroot00000000000000//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Englisch (USA) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE MOVEABLE PURE BEGIN "resource.h\0" END 2 TEXTINCLUDE MOVEABLE PURE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE MOVEABLE PURE BEGIN "#define _AFX_NO_SPLITTER_RESOURCES\r\n" "#define _AFX_NO_OLE_RESOURCES\r\n" "#define _AFX_NO_TRACKER_RESOURCES\r\n" "#define _AFX_NO_PROPERTY_RESOURCES\r\n" "\r\n" "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" "#ifdef _WIN32\r\n" "LANGUAGE 9, 1\r\n" "#pragma code_page(1252)\r\n" "#endif //_WIN32\r\n" "#include ""res\\Frontend.rc2"" // non-Microsoft Visual C++ edited resources\r\n" "#include ""afxres.rc"" // Standard components\r\n" "#endif\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_FRONTEND_DIALOG DIALOGEX 0, 0, 399, 289 STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_APPWINDOW CAPTION "olsr.org Switch 0.6.6.2" FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN CONTROL "Tab1",IDC_TAB1,"SysTabControl32",0x0,7,7,383,256 PUSHBUTTON "Start",IDC_BUTTON1,228,268,50,14 PUSHBUTTON "Stop",IDC_BUTTON2,284,268,50,14 PUSHBUTTON "Exit",IDC_BUTTON3,340,268,50,14 END IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 377, 240 STYLE WS_CHILD | WS_VISIBLE FONT 8, "MS Sans Serif" BEGIN EDITTEXT IDC_EDIT1,7,25,363,208,ES_MULTILINE | ES_READONLY | ES_WANTRETURN | WS_VSCROLL | WS_HSCROLL PUSHBUTTON "Freeze",IDC_BUTTON3,152,7,50,14 PUSHBUTTON "Continue",IDC_BUTTON2,208,7,50,14 PUSHBUTTON "Save",IDC_BUTTON4,264,7,50,14 PUSHBUTTON "Clear",IDC_BUTTON1,320,7,50,14 END IDD_DIALOG2 DIALOG DISCARDABLE 0, 0, 377, 240 STYLE WS_CHILD | WS_VISIBLE FONT 8, "MS Sans Serif" BEGIN CONTROL "List1",IDC_LIST1,"SysListView32",LVS_LIST | WS_BORDER | WS_TABSTOP,7,19,103,76 CONTROL "Slider2",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,8,116,87,26 EDITTEXT IDC_EDIT7,55,153,26,12,ES_RIGHT CONTROL "Enable IP version 6",IDC_CHECK3,"Button", BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,7,171,93,10 CONTROL "Offer Internet connection",IDC_CHECK2,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,7,187,93,10 EDITTEXT IDC_EDIT1,189,7,26,12,ES_RIGHT EDITTEXT IDC_EDIT2,305,7,26,12,ES_RIGHT EDITTEXT IDC_EDIT3,189,23,26,12,ES_RIGHT EDITTEXT IDC_EDIT9,305,23,26,12,ES_RIGHT EDITTEXT IDC_EDIT4,189,39,26,12,ES_RIGHT EDITTEXT IDC_EDIT10,305,39,26,12,ES_RIGHT EDITTEXT IDC_EDIT5,189,55,26,12,ES_RIGHT EDITTEXT IDC_EDIT6,305,55,26,12,ES_RIGHT COMBOBOX IDC_COMBO1,189,77,26,41,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_EDIT15,305,77,26,12,ES_RIGHT | ES_NUMBER CONTROL "Enable hysteresis",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,134,101,74,10 EDITTEXT IDC_EDIT12,189,115,26,12,ES_RIGHT EDITTEXT IDC_EDIT13,305,115,26,12,ES_RIGHT EDITTEXT IDC_EDIT11,189,131,26,12,ES_RIGHT CONTROL "Enable ETX link quality",IDC_CHECK4,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,132,155,92,10 CONTROL "for MPR selection only",IDC_RADIO1,"Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,132,171,87,10 CONTROL "for MPR selection and routing",IDC_RADIO2,"Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,132,187,109, 10 PUSHBUTTON "Open",IDC_BUTTON4,210,219,50,14 PUSHBUTTON "Save",IDC_BUTTON5,265,219,50,14 PUSHBUTTON "Reset",IDC_BUTTON1,320,219,50,14 LTEXT "Interface list",IDC_STATIC,7,8,39,8 LTEXT "Debug level",IDC_STATIC,7,105,39,8 RTEXT "HELLO interval:",IDC_STATIC,132,9,51,8 RTEXT "HELLO hold:",IDC_STATIC,247,9,42,8 RTEXT "MID interval:",IDC_STATIC,132,25,41,8 RTEXT "MID hold:",IDC_STATIC,247,25,32,8 RTEXT "HNA interval:",IDC_STATIC,132,41,43,8 RTEXT "HNA hold:",IDC_STATIC,247,41,34,8 RTEXT "TC interval:",IDC_STATIC,132,57,37,8 RTEXT "TC hold:",IDC_STATIC,247,57,28,8 RTEXT "TC redundancy:",IDC_STATIC,132,79,52,8 RTEXT "MPR coverage:",IDC_STATIC,247,79,51,8 LTEXT "sec",IDC_STATIC,219,9,12,8 LTEXT "sec",IDC_STATIC,335,9,12,8 LTEXT "sec",IDC_STATIC,219,25,12,8 LTEXT "sec",IDC_STATIC,335,25,12,8 LTEXT "sec",IDC_STATIC,219,41,12,8 LTEXT "sec",IDC_STATIC,335,41,12,8 LTEXT "sec",IDC_STATIC,219,57,12,8 LTEXT "sec",IDC_STATIC,335,57,12,8 RTEXT "Poll interval:",IDC_STATIC,7,155,39,8 LTEXT "sec",IDC_STATIC,85,155,12,8 CTEXT "0",IDC_TEXT1,96,123,11,8 RTEXT "Low mark:",IDC_STATIC,132,117,34,8 RTEXT "Scaling:",IDC_STATIC,132,133,26,8 RTEXT "High mark:",IDC_STATIC,247,117,35,8 RTEXT "LQ Algorithm",IDC_STATIC,247,171,41,8 CONTROL "Enable Fish Eye",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,249,187,92,10 COMBOBOX IDC_COMBO3,297,169,36,41,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP END IDD_DIALOG3 DIALOG DISCARDABLE 0, 0, 377, 240 STYLE WS_CHILD | WS_VISIBLE FONT 8, "MS Sans Serif" BEGIN CONTROL "List1",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,18,239,215 CONTROL "List4",IDC_LIST4,"SysListView32",LVS_REPORT | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,255,18,115,66 CONTROL "List4",IDC_LIST5,"SysListView32",LVS_REPORT | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,255,92,115,66 CONTROL "List4",IDC_LIST6,"SysListView32",LVS_REPORT | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,255,167,115,66 LTEXT "Node list",IDC_STATIC,7,7,32,8 LTEXT "Node information",IDC_STATIC,257,7,59,8 END IDD_DIALOG4 DIALOG DISCARDABLE 0, 0, 377, 240 STYLE WS_CHILD | WS_VISIBLE FONT 8, "MS Sans Serif" BEGIN CONTROL "List1",IDC_LIST1,"SysListView32",LVS_REPORT | WS_BORDER | WS_TABSTOP,7,18,363,215 LTEXT "Routing table",IDC_STATIC,7,7,48,8 END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO MOVEABLE PURE BEGIN IDD_FRONTEND_DIALOG, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 390 TOPMARGIN, 7 BOTTOMMARGIN, 282 END IDD_DIALOG1, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 370 TOPMARGIN, 7 BOTTOMMARGIN, 233 END IDD_DIALOG2, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 370 TOPMARGIN, 6 BOTTOMMARGIN, 233 END IDD_DIALOG3, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 370 TOPMARGIN, 7 BOTTOMMARGIN, 233 END IDD_DIALOG4, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 370 TOPMARGIN, 7 BOTTOMMARGIN, 233 END END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_ICON1 ICON DISCARDABLE "res\\Frontend.ico" IDI_ICON3 ICON DISCARDABLE "res\\Tray2.ico" IDI_ICON2 ICON DISCARDABLE "res\\Tray1.ico" ///////////////////////////////////////////////////////////////////////////// // // Menu // IDR_TRAYMENU MENU DISCARDABLE BEGIN POPUP "IDR_TRAYMENU" BEGIN MENUITEM "Start", IDM_START MENUITEM "Stop", IDM_STOP POPUP "Show" BEGIN MENUITEM "Window", IDM_WINDOW MENUITEM "Settings", IDM_SETTINGS MENUITEM "Output", IDM_OUTPUT END MENUITEM "Exit", IDM_EXIT END END ///////////////////////////////////////////////////////////////////////////// // // Dialog Info // IDD_DIALOG2 DLGINIT BEGIN IDC_COMBO1, 0x403, 2, 0 0x0030, IDC_COMBO1, 0x403, 2, 0 0x0031, IDC_COMBO1, 0x403, 2, 0 0x0032, IDC_COMBO3, 0x403, 8, 0 0x7465, 0x5f78, 0x7066, 0x006d, IDC_COMBO3, 0x403, 10, 0 0x7465, 0x5f78, 0x6c66, 0x616f, 0x0074, IDC_COMBO3, 0x403, 7, 0 0x7465, 0x5f78, 0x6666, "\000" 0 END ///////////////////////////////////////////////////////////////////////////// // // 24 // 1 24 DISCARDABLE "trustInfo.manifest" #endif // Englisch (USA) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // #define _AFX_NO_SPLITTER_RESOURCES #define _AFX_NO_OLE_RESOURCES #define _AFX_NO_TRACKER_RESOURCES #define _AFX_NO_PROPERTY_RESOURCES #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE 9, 1 #pragma code_page(1252) #endif //_WIN32 #include "res\Frontend.rc2" // non-Microsoft Visual C++ edited resources #include "afxres.rc" // Standard components #endif ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED olsrd-0.6.6.2/gui/win32/Main/FrontendDlg.cpp000066400000000000000000000470161234304727700203530ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "stdafx.h" #include "Frontend.h" #include "FrontendDlg.h" #include "TrayIcon.h" #include "Ipc.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /* _DEBUG */ CFrontendDlg::CFrontendDlg(CWnd* pParent) : CDialog(CFrontendDlg::IDD, pParent) { //{{AFX_DATA_INIT(CFrontendDlg) //}}AFX_DATA_INIT Event = CreateEvent(NULL, FALSE, FALSE, "TheOlsrdShimEvent"); LogThread = NULL; NetThread = NULL; } void CFrontendDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CFrontendDlg) DDX_Control(pDX, IDC_BUTTON2, m_StopButton); DDX_Control(pDX, IDC_BUTTON1, m_StartButton); DDX_Control(pDX, IDC_TAB1, m_TabCtrl); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CFrontendDlg, CDialog) //{{AFX_MSG_MAP(CFrontendDlg) ON_BN_CLICKED(IDC_BUTTON1, OnStartButton) ON_BN_CLICKED(IDC_BUTTON2, OnStopButton) ON_BN_CLICKED(IDC_BUTTON3, OnExitButton) ON_BN_CLICKED(IDOK, OnOK) ON_BN_CLICKED(IDCANCEL, OnCancel) //}}AFX_MSG_MAP END_MESSAGE_MAP() #if 0 static void HexDump(unsigned char *Mem, int Len) { char Buff[10000]; int i, k; char *Walker = Buff; for (i = 0; i < Len; i += k) { Walker += sprintf(Walker, "%08x:", i); for (k = 0; i + k < Len && k < 16; k++) Walker += sprintf(Walker, " %02x", Mem[i + k]); while (k < 16) { Walker += sprintf(Walker, " "); k++; } Walker += sprintf(Walker, " "); for (k = 0; i + k < Len && k < 16; k++) if (Mem[i + k] < 32 || Mem[i + k] > 126) Walker += sprintf(Walker, "."); else Walker += sprintf(Walker, "%c", Mem[i + k]); Walker += sprintf(Walker, "\r\n"); } ::MessageBox(NULL, Buff, "HEXDUMP", MB_OK); } #endif // XXX - pretty inefficient void CFrontendDlg::Timeout(void) { POSITION Pos, Pos2; class NodeEntry Entry; class MprEntry MprEntry; class MidEntry MidEntry; class HnaEntry HnaEntry; Restart0: Pos = NodeList.GetHeadPosition(); while (Pos != NULL) { Entry = NodeList.GetAt(Pos); if (Entry.Timeout < Now) { NodeList.RemoveAt(Pos); goto Restart0; } Restart1: Pos2 = Entry.MprList.GetHeadPosition(); while (Pos2 != NULL) { MprEntry = Entry.MprList.GetAt(Pos2); if (MprEntry.Timeout < Now) { Entry.MprList.RemoveAt(Pos2); goto Restart1; } Entry.MprList.GetNext(Pos2); } Restart2: Pos2 = Entry.MidList.GetHeadPosition(); while (Pos2 != NULL) { MidEntry = Entry.MidList.GetAt(Pos2); if (MidEntry.Timeout < Now) { Entry.MidList.RemoveAt(Pos2); goto Restart2; } Entry.MidList.GetNext(Pos2); } Restart3: Pos2 = Entry.HnaList.GetHeadPosition(); while (Pos2 != NULL) { HnaEntry = Entry.HnaList.GetAt(Pos2); if (HnaEntry.Timeout < Now) { Entry.HnaList.RemoveAt(Pos2); goto Restart3; } Entry.HnaList.GetNext(Pos2); } NodeList.GetNext(Pos); } if( NodeList.IsEmpty() ) TrayIcon::getInstance()->setStatus( TrayIcon::ON, "No nodes found" ); else TrayIcon::getInstance()->setStatus( TrayIcon::CONNECTED, "Nodes available" ); m_TabCtrl.m_Dialog3.UpdateNodeInfo(NodeList); } unsigned int VTimeToInt(unsigned int VTime) { return ((0x10 | ((VTime & 0xf0) >> 4)) << (VTime & 0x0f)) >> 8; } void CFrontendDlg::AddMpr(unsigned int MprAddr, unsigned int NodeAddr, unsigned int VTime) { class NodeEntry NewEntry; POSITION Pos; unsigned __int64 Timeout; Timeout = Now + (unsigned __int64)VTimeToInt(VTime) * (unsigned __int64)10000000; AddNode(NodeAddr, VTime); AddNode(MprAddr, VTime); NewEntry.Addr = NodeAddr; Pos = NodeList.Find(NewEntry); if (Pos == NULL) return; class NodeEntry &OldEntry = NodeList.GetAt(Pos); OldEntry.AddMpr(MprAddr, Timeout); m_TabCtrl.m_Dialog3.UpdateNodeInfo(NodeList); } void CFrontendDlg::AddMid(unsigned int IntAddr, unsigned int NodeAddr, unsigned int VTime) { class NodeEntry NewEntry; POSITION Pos; unsigned __int64 Timeout; Timeout = Now + (unsigned __int64)VTimeToInt(VTime) * (unsigned __int64)10000000; AddNode(NodeAddr, VTime); NewEntry.Addr = NodeAddr; Pos = NodeList.Find(NewEntry); if (Pos == NULL) return; class NodeEntry &OldEntry = NodeList.GetAt(Pos); OldEntry.AddMid(IntAddr, Timeout); m_TabCtrl.m_Dialog3.UpdateNodeInfo(NodeList); } void CFrontendDlg::AddHna(unsigned int NetAddr, unsigned int NetMask, unsigned int NodeAddr, unsigned int VTime) { class NodeEntry NewEntry; POSITION Pos; unsigned __int64 Timeout; Timeout = Now + (unsigned __int64)VTimeToInt(VTime) * (unsigned __int64)10000000; AddNode(NodeAddr, VTime); NewEntry.Addr = NodeAddr; Pos = NodeList.Find(NewEntry); if (Pos == NULL) return; class NodeEntry &OldEntry = NodeList.GetAt(Pos); OldEntry.AddHna(NetAddr, NetMask, Timeout); m_TabCtrl.m_Dialog3.UpdateNodeInfo(NodeList); } void CFrontendDlg::AddNode(unsigned int NodeAddr, unsigned int VTime) { class NodeEntry NewEntry; POSITION Pos; unsigned __int64 Timeout; if (NodeAddr == LocalHost) return; Timeout = Now + (unsigned __int64)VTimeToInt(VTime) * (unsigned __int64)10000000; NewEntry.Addr = NodeAddr; Pos = NodeList.Find(NewEntry); if (Pos != NULL) { class NodeEntry &OldEntry = NodeList.GetAt(Pos); OldEntry.Timeout = Timeout; } else { NewEntry.Timeout = Timeout; NodeList.AddTail(NewEntry); } m_TabCtrl.m_Dialog3.UpdateNodeInfo(NodeList); } void CFrontendDlg::HandleOlsrTc(struct OlsrTc *Msg, int UseLq) { int Size; unsigned int *Addr; Msg->Header.SeqNo = ::ntohs(Msg->Header.SeqNo); Msg->Ansn = ::ntohs(Msg->Ansn); AddNode(Msg->Header.Orig, Msg->Header.VTime); Size = Msg->Header.Size; Size -= sizeof (struct OlsrTc); Addr = (unsigned int *)(Msg + 1); while (Size > 0) { Size -= 4; AddMpr(*Addr, Msg->Header.Orig, Msg->Header.VTime); Addr++; if (UseLq != 0) { Size -= 4; Addr++; } } } void CFrontendDlg::HandleOlsrMid(struct OlsrHeader *Msg) { int Size; unsigned int *Addr; Msg->SeqNo = ::ntohs(Msg->SeqNo); AddNode(Msg->Orig, Msg->VTime); Size = Msg->Size; Size -= sizeof (struct OlsrHeader); Addr = (unsigned int *)(Msg + 1); while (Size > 0) { Size -= 4; AddMid(*Addr, Msg->Orig, Msg->VTime); Addr++; } } void CFrontendDlg::HandleOlsrHna(struct OlsrHeader *Msg) { int Size; unsigned int *Addr; Msg->SeqNo = ::ntohs(Msg->SeqNo); AddNode(Msg->Orig, Msg->VTime); Size = Msg->Size; Size -= sizeof (struct OlsrHeader); Addr = (unsigned int *)(Msg + 1); while (Size > 0) { Size -= 8; AddHna(Addr[0], Addr[1], Msg->Orig, Msg->VTime); Addr += 2; } } void CFrontendDlg::HandleOlsrHello(struct OlsrHello *Msg, int UseLq) { int Size, LinkSize; struct OlsrHelloLink *Link; unsigned int *Addr; Msg->Header.SeqNo = ::ntohs(Msg->Header.SeqNo); AddNode(Msg->Header.Orig, Msg->Header.VTime); Size = Msg->Header.Size; Size -= sizeof (struct OlsrHello); Link = (struct OlsrHelloLink *)(Msg + 1); while (Size > 0) { Link->Size = ::ntohs(Link->Size); LinkSize = Link->Size; Size -= LinkSize; LinkSize -= sizeof (struct OlsrHelloLink); Addr = (unsigned int *)(Link + 1); while (LinkSize > 0) { LinkSize -= 4; AddNode(*Addr, Msg->Header.VTime); if ((Link->LinkCode & 0x0c) == 0x08) AddMpr(*Addr, Msg->Header.Orig, Msg->Header.VTime); Addr++; if (UseLq != 0) { LinkSize -= 4; Addr++; } } Link = (struct OlsrHelloLink *)Addr; } } void CFrontendDlg::HandleIpcRoute(struct IpcRoute *Msg) { if (Msg->Header.Size != sizeof (struct IpcRoute)) return; if (Msg->Add == 0) m_TabCtrl.m_Dialog4.DeleteRoute(Msg->Dest.v4); else m_TabCtrl.m_Dialog4.AddRoute(Msg->Dest.v4, Msg->Gate.v4, Msg->Metric, Msg->Int); } void CFrontendDlg::HandleIpcConfig(struct IpcConfig *Msg) { if (Msg->Header.Size != sizeof (struct IpcConfig)) return; Msg->HelloInt = ::ntohs(Msg->HelloInt); Msg->WiredHelloInt = ::ntohs(Msg->WiredHelloInt); Msg->TcInt = ::ntohs(Msg->TcInt); Msg->HelloHold = ::ntohs(Msg->HelloHold); Msg->TcHold = ::ntohs(Msg->TcHold); LocalHost = Msg->MainAddr.v4; } static int FullRead(SOCKET SockHand, char *Buff, int Len) { int Res; do { Res = ::recv(SockHand, Buff, Len, 0); if (Res <= 0) return -1; Len -= Res; Buff += Res; } while (Len > 0); return 0; } // XXX - we should have access to olsrd's internal data structures instead unsigned int CFrontendDlg::NetThreadFunc(void) { struct IpcHeader Header; int Res; char *Msg; for (;;) { Res = FullRead(SockHand, (char *)&Header, sizeof (struct IpcHeader)); if (Res < 0) break; Header.Size = ntohs(Header.Size); Msg = new char [Header.Size]; ::memcpy(Msg, &Header, sizeof (struct IpcHeader)); Res = FullRead(SockHand, Msg + sizeof (struct IpcHeader), Header.Size - sizeof (struct IpcHeader)); if (Res < 0) break; SYSTEMTIME SysTime; FILETIME FileTime; ::GetSystemTime(&SysTime); ::SystemTimeToFileTime(&SysTime, &FileTime); Now = *(unsigned __int64 *)&FileTime; switch (Header.Type) { case MSG_TYPE_IPC_ROUTE: HandleIpcRoute((struct IpcRoute *)Msg); break; case MSG_TYPE_IPC_CONFIG: HandleIpcConfig((struct IpcConfig *)Msg); break; case MSG_TYPE_OLSR_HELLO: HandleOlsrHello((struct OlsrHello *)Msg, 0); break; case MSG_TYPE_OLSR_TC: HandleOlsrTc((struct OlsrTc *)Msg, 0); break; case MSG_TYPE_OLSR_MID: HandleOlsrMid((struct OlsrHeader *)Msg); break; case MSG_TYPE_OLSR_HNA: HandleOlsrHna((struct OlsrHeader *)Msg); break; case MSG_TYPE_OLSR_LQ_HELLO: HandleOlsrHello((struct OlsrHello *)Msg, 1); break; case MSG_TYPE_OLSR_LQ_TC: HandleOlsrTc((struct OlsrTc *)Msg, 1); break; } delete[] Msg; // XXX - nodes are only timed out while messages keep coming in Timeout(); } AfxEndThread(0); return 0; } unsigned int CFrontendDlg::LogThreadFunc(void) { char Buff[1000]; int Len; int Left, Right; CString Line; CString Int; while (::ReadFile(OutRead, Buff, sizeof (Buff) - 1, (unsigned long *)&Len, NULL)) { if (Len == 0) break; Left = 0; for (Right = 0; Right < Len; Right++) { if (Buff[Right] != 13) Buff[Left++] = Buff[Right]; } Len = Left; Left = 0; for (Right = 0; Right < Len; Right++) { if (Buff[Right] == 10) { Buff[Right] = 0; Line += (Buff + Left); if (PipeMode == PIPE_MODE_RUN) m_TabCtrl.m_Dialog1.AddOutputLine(Line); else if (Line.GetLength() > 8 && Line[0] == 'i' && Line[1] == 'f') { Int = Line.Mid(0, 4); Int.MakeUpper(); Interfaces.Add(Int); IsWlan.Add(Line.Mid(6, 1)); Addresses.Add(Line.Mid(8)); } Line.Empty(); Left = Right + 1; } } Buff[Right] = 0; Line += (Buff + Left); } if (PipeMode == PIPE_MODE_RUN) { m_StopButton.EnableWindow(FALSE); m_StartButton.EnableWindow(TRUE); } AfxEndThread(0); return 0; } static unsigned int LogThreadStub(void *Arg) { class CFrontendDlg *This; This = (class CFrontendDlg *)Arg; return This->LogThreadFunc(); } static unsigned int NetThreadStub(void *Arg) { class CFrontendDlg *This; This = (class CFrontendDlg *)Arg; return This->NetThreadFunc(); } int CFrontendDlg::ExecutePipe(const char *CmdLine, HANDLE *InWrite, HANDLE *OutRead, HANDLE *ShimProc) { SECURITY_ATTRIBUTES SecAttr; HANDLE OutWrite, OutReadTmp; HANDLE ErrWrite; HANDLE InRead, InWriteTmp; HANDLE Proc; STARTUPINFO StartupInfo; PROCESS_INFORMATION ProcessInfo; SecAttr.nLength = sizeof (SECURITY_ATTRIBUTES); SecAttr.lpSecurityDescriptor = NULL; SecAttr.bInheritHandle = TRUE; Proc = ::GetCurrentProcess(); if (!::CreatePipe(&OutReadTmp, &OutWrite, &SecAttr, 0)) { AfxMessageBox("Cannot create stdout pipe."); return -1; } if (!::DuplicateHandle(Proc, OutReadTmp, Proc, OutRead, 0, FALSE, DUPLICATE_SAME_ACCESS)) { AfxMessageBox("Cannot duplicate temporary stdout read handle."); return -1; } if (!::CloseHandle(OutReadTmp)) { AfxMessageBox("Cannot close temporary stdout read handle."); return -1; } if (!::CreatePipe(&InRead, &InWriteTmp, &SecAttr, 0)) { AfxMessageBox("Cannot create stdin pipe."); return -1; } if (!::DuplicateHandle(Proc, InWriteTmp, Proc, InWrite, 0, FALSE, DUPLICATE_SAME_ACCESS)) { AfxMessageBox("Cannot duplicate temporary stdin write handle."); return -1; } if (!::CloseHandle(InWriteTmp)) { AfxMessageBox("Cannot close temporary stdin write handle."); return -1; } if (!::DuplicateHandle(Proc, OutWrite, Proc, &ErrWrite, 0, TRUE, DUPLICATE_SAME_ACCESS)) { AfxMessageBox("Cannot duplicate stdout write handle for stderr."); return -1; } ::memset(&StartupInfo, 0, sizeof (STARTUPINFO)); StartupInfo.cb = sizeof (STARTUPINFO); StartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; StartupInfo.hStdInput = InRead; StartupInfo.hStdOutput = OutWrite; StartupInfo.hStdError = ErrWrite; StartupInfo.wShowWindow = SW_HIDE; if (!::CreateProcess(NULL, (char *)CmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &StartupInfo, &ProcessInfo)) { AfxMessageBox("Cannot create OLSR server process."); return -1; } if (!::CloseHandle(InRead)) { AfxMessageBox("Cannot close stdin read handle."); return -1; } if (!::CloseHandle(OutWrite)) { AfxMessageBox("Cannot close stdout write handle."); return -1; } if (!::CloseHandle(ErrWrite)) { AfxMessageBox("Cannot close stderr write handle."); return -1; } *ShimProc = ProcessInfo.hProcess; return 0; } int CFrontendDlg::GetInterfaces() { char GuiPath[MAX_PATH]; CString CmdLine; CWinThread *IntThread; ::GetModuleFileName(NULL, GuiPath, MAX_PATH); CmdLine = GuiPath; CmdLine = CmdLine.Mid(0, CmdLine.ReverseFind('\\')) + "\\olsrd.exe -int"; if (ExecutePipe((const char *)CmdLine, &InWrite, &OutRead, &ShimProc) < 0) { AfxMessageBox("Cannot execute '" + CmdLine + "'."); return -1; } PipeMode = PIPE_MODE_INT; IntThread = AfxBeginThread(LogThreadStub, (void *)this); ::WaitForSingleObject((HANDLE)(*IntThread), INFINITE); return 0; } int CFrontendDlg::StartOlsrd() { WSADATA WsaData; CString CmdLine; char Path[MAX_PATH]; char TempPath[MAX_PATH]; int Try; m_TabCtrl.m_Dialog3.ClearNodeInfo(); m_TabCtrl.m_Dialog4.ClearRoutes(); if (WSAStartup(0x0202, &WsaData)) { AfxMessageBox("Cannot initialize WinSock library."); return -1; } ::GetModuleFileName(NULL, Path, MAX_PATH); CmdLine = Path; CmdLine = CmdLine.Mid(0, CmdLine.ReverseFind('\\')) + "\\Shim.exe"; ::GetTempPath(MAX_PATH - 16, Path); ::GetTempFileName(Path, "GNU", 0, TempPath); StoredTempFile = TempPath; if (m_TabCtrl.m_Dialog2.SaveConfigFile(StoredTempFile, 0) < 0) { AfxMessageBox("Cannot save temporary configuration file '" + StoredTempFile + "'."); return -1; } CmdLine += " -f " + StoredTempFile; if (ExecutePipe((const char *)CmdLine, &InWrite, &OutRead, &ShimProc) < 0) { AfxMessageBox("Cannot execute '" + CmdLine + "'."); return -1; } PipeMode = PIPE_MODE_RUN; LogThread = AfxBeginThread(LogThreadStub, (void *)this); struct sockaddr_in Addr; Addr.sin_family = AF_INET; Addr.sin_port = ::htons(1212); Addr.sin_addr.s_addr = ::inet_addr("127.0.0.1"); SockHand = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (SockHand < 0) { AfxMessageBox("Cannot create IPC socket."); ::SetEvent(Event); ::WaitForSingleObject((HANDLE)LogThread, INFINITE); LogThread = NULL; return -1; } for (Try = 0; Try < 5; Try++) { if (::connect(SockHand, (struct sockaddr *)&Addr, sizeof (struct sockaddr_in)) >= 0) break; ::Sleep(500); } if (Try == 10) { AfxMessageBox("Cannot connect to IPC port."); ::SetEvent(Event); ::WaitForSingleObject((HANDLE)LogThread, INFINITE); ::closesocket(SockHand); LogThread = NULL; return -1; } NetThread = AfxBeginThread(NetThreadStub, (void *)this); return 0; } int CFrontendDlg::StopOlsrd() { if (LogThread == NULL && NetThread == NULL) return 0; TrayIcon::getInstance()->setStatus( TrayIcon::OFF, "Off" ); ::SetEvent(Event); ::WaitForSingleObject((HANDLE)LogThread, INFINITE); ::WaitForSingleObject((HANDLE)NetThread, INFINITE); LogThread = NULL; NetThread = NULL; ::DeleteFile(StoredTempFile); return 0; } BOOL CFrontendDlg::OnInitDialog() { HICON Small, Large; CDialog::OnInitDialog(); Small = (HICON)::LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0); Large = (HICON)::LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), 0); SetIcon(Small, FALSE); SetIcon(Large, TRUE); GetInterfaces(); m_TabCtrl.InsertItem(0, "Settings"); m_TabCtrl.InsertItem(1, "Output"); m_TabCtrl.InsertItem(2, "Nodes"); m_TabCtrl.InsertItem(3, "Routes"); m_TabCtrl.InitTabDialogs(&Interfaces, &Addresses, &IsWlan); m_StopButton.EnableWindow(FALSE); if (!ConfigFile.IsEmpty()) { if (m_TabCtrl.m_Dialog2.OpenConfigFile(ConfigFile) < 0) AfxMessageBox("Cannot open configuration file '" + ConfigFile + "'."); else { OnStartButton(); m_TabCtrl.SetCurSel(1); m_TabCtrl.DisplayTabDialog(); } } return TRUE; } void CFrontendDlg::OnOK() { } void CFrontendDlg::OnCancel() { OnExitButton(); } void CFrontendDlg::OnStartButton() { m_StartButton.EnableWindow(FALSE); m_TabCtrl.m_Dialog1.SetFrozen(1); if (StartOlsrd() < 0) { m_TabCtrl.m_Dialog1.SetFrozen(0); m_TabCtrl.m_Dialog1.AddOutputLine(""); AfxMessageBox("Cannot start OLSR server."); m_StartButton.EnableWindow(TRUE); return; } m_TabCtrl.m_Dialog1.HandleStart(); m_StopButton.EnableWindow(TRUE); } void CFrontendDlg::OnStopButton() { if (StopOlsrd() < 0) return; m_TabCtrl.m_Dialog1.HandleStop(); m_StopButton.EnableWindow(FALSE); m_StartButton.EnableWindow(TRUE); } void CFrontendDlg::OnExitButton() { delete TrayIcon::getInstance(); if (StopOlsrd() < 0) return; m_TabCtrl.m_Dialog3.ClearNodeInfo(); m_TabCtrl.m_Dialog4.ClearRoutes(); DestroyWindow(); } #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/FrontendDlg.h000066400000000000000000000101601234304727700200060ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined(AFX_FRONTENDDLG_H__7D68FBC0_7448_479B_81F0_3FBBDE291395__INCLUDED_) #define AFX_FRONTENDDLG_H__7D68FBC0_7448_479B_81F0_3FBBDE291395__INCLUDED_ #if defined _MSC_VER && _MSC_VER > 1000 #pragma once #endif /* defined _MSC_VER && _MSC_VER > 1000 */ #include "MyTabCtrl.h" #include "NodeEntry.h" #define PIPE_MODE_RUN 0 #define PIPE_MODE_INT 1 class CFrontendDlg:public CDialog { public: CFrontendDlg(CWnd * pParent = NULL); //{{AFX_DATA(CFrontendDlg) enum { IDD = IDD_FRONTEND_DIALOG }; CButton m_StopButton; CButton m_StartButton; MyTabCtrl m_TabCtrl; //}}AFX_DATA unsigned int LogThreadFunc(void); unsigned int NetThreadFunc(void); CString ConfigFile; protected: //{{AFX_VIRTUAL(CFrontendDlg) virtual void DoDataExchange(CDataExchange * pDX); //}}AFX_VIRTUAL public: //{{AFX_MSG(CFrontendDlg) virtual BOOL OnInitDialog(); afx_msg void OnOK(); afx_msg void OnCancel(); afx_msg void OnStartButton(); afx_msg void OnStopButton(); afx_msg void OnExitButton(); //}}AFX_MSG protected: DECLARE_MESSAGE_MAP() int StartOlsrd(void); int StopOlsrd(void); int GetInterfaces(void); HANDLE Event; CString StoredTempFile; SOCKET SockHand; int PipeMode; int ExecutePipe(const char *, HANDLE *, HANDLE *, HANDLE *); CWinThread *LogThread; CWinThread *NetThread; CStringArray Interfaces; CStringArray Addresses; CStringArray IsWlan; HANDLE OutRead, InWrite; HANDLE ShimProc; void HandleIpcRoute(struct IpcRoute *); void HandleIpcConfig(struct IpcConfig *); void HandleOlsrHello(struct OlsrHello *, int); void HandleOlsrTc(struct OlsrTc *, int); void HandleOlsrMid(struct OlsrHeader *); void HandleOlsrHna(struct OlsrHeader *); void AddNode(unsigned int, unsigned int); void AddMpr(unsigned int, unsigned int, unsigned int); void AddMid(unsigned int, unsigned int, unsigned int); void AddHna(unsigned int, unsigned int, unsigned int, unsigned int); CList < class NodeEntry, class NodeEntry & >NodeList; void Timeout(void); unsigned __int64 Now; unsigned int LocalHost; }; //{{AFX_INSERT_LOCATION}} #endif /* !defined(AFX_FRONTENDDLG_H__7D68FBC0_7448_479B_81F0_3FBBDE291395__INCLUDED_) */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/HnaEntry.cpp000066400000000000000000000042601234304727700176670ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "stdafx.h" #include "HnaEntry.h" class HnaEntry &HnaEntry::operator=(class HnaEntry &Src) { Addr = Src.Addr; Mask = Src.Mask; Timeout = Src.Timeout; return *this; } BOOL HnaEntry::operator==(const class HnaEntry &Comp) const { return Addr == Comp.Addr && Mask == Comp.Mask; } #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/HnaEntry.h000066400000000000000000000043711234304727700173370ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined TL_HNAENTRY_H #define TL_HNAENTRY_H class HnaEntry { public: unsigned int Addr; unsigned int Mask; unsigned __int64 Timeout; class HnaEntry & HnaEntry::operator=(class HnaEntry &); BOOL HnaEntry::operator==(const class HnaEntry &) const; }; #endif /* !defined TL_HNAENTRY_H */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/Ipc.h000066400000000000000000000067701234304727700163270ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined TL_IPC_H #define TL_IPC_H #define MSG_TYPE_OLSR_HELLO 1 #define MSG_TYPE_OLSR_TC 2 #define MSG_TYPE_OLSR_MID 3 #define MSG_TYPE_OLSR_HNA 4 #define MSG_TYPE_OLSR_LQ_HELLO 201 #define MSG_TYPE_OLSR_LQ_TC 202 #define MSG_TYPE_IPC_ROUTE 11 #define MSG_TYPE_IPC_CONFIG 12 #pragma pack(push, BeforeIpcMessages, 1) struct OlsrHeader { unsigned char Type; unsigned char VTime; unsigned short Size; unsigned int Orig; unsigned char Ttl; unsigned char Hops; unsigned short SeqNo; }; struct OlsrHello { struct OlsrHeader Header; unsigned short Reserved; unsigned char HTime; unsigned char Will; }; struct OlsrHelloLink { unsigned char LinkCode; unsigned char Reserved; unsigned short Size; }; struct OlsrTc { struct OlsrHeader Header; unsigned short Ansn; unsigned short Reserved; }; union IpcIpAddr { unsigned int v4; unsigned char v6[16]; }; struct IpcHeader { unsigned char Type; unsigned char Reserved; unsigned short Size; }; struct IpcRoute { struct IpcHeader Header; unsigned char Metric; unsigned char Add; unsigned char Reserved[2]; union IpcIpAddr Dest; union IpcIpAddr Gate; char Int[4]; }; struct IpcConfig { struct IpcHeader Header; unsigned char NumMid; unsigned char NumHna; unsigned char Reserved1[2]; unsigned short HelloInt; unsigned short WiredHelloInt; unsigned short TcInt; unsigned short HelloHold; unsigned short TcHold; unsigned char Ipv6; unsigned char Reserved2; IpcIpAddr MainAddr; }; #pragma pack (pop, BeforeIpcMessages) #endif /* !defined TL_IPC_H */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/LQ-Default.olsr000066400000000000000000000121461234304727700202340ustar00rootroot00000000000000# # Default configuration for the GUI # # Debug level(0-9) # If set to 0 the daemon runs in the background DebugLevel 0 # IP version to use (4 or 6) IpVersion 4 # FIBMetric ("flat" or "correct") FIBMetric "flat" # HNA IPv4 routes # syntax: netaddr/prefix Hna4 { } # Should olsrd keep on running even if there are # no interfaces available? This is a good idea # for a PCMCIA/USB hotswap environment. # "yes" OR "no" AllowNoInt yes # TOS(type of service) to use. Default is 16 TosValue 16 # Policy Routing Table to use. Default is 254 RtTable 254 # The fixed willingness to use(0-7) # If not set willingness will be calculated # dynammically based on battery/power status #Willingness 4 # Allow processes like the GUI front-end # to connect to the daemon. IpcConnect { MaxConnections 1 Host 127.0.0.1 Net 192.168.1.0/24 } # Hysteresis adds more robustness to the # link sensing. # Used by default. 'yes' or 'no' UseHysteresis no # Hysteresis parameters # Do not alter these unless you know # what you are doing! # Set to auto by default. Allowed # values are floating point values # in the interval 0,1 # THR_LOW must always be lower than # THR_HIGH!! #HystScaling 0.50 #HystThrHigh 0.80 #HystThrLow 0.30 # Polling rate in seconds(float). # Auto uses default value 0.05 sec Pollrate 0.05 # Interval to poll network interfaces for configuration # changes. Defaults to 2.5 seconds NicChgsPollInt 2.50 # TC redundancy # Specifies how much neighbor info should # be sent in TC messages # Possible values are: # 0 - only send MPR selectors # 1 - send MPR selectors and MPRs # 2 - send all neighbors # # defaults to 0 TcRedundancy 2 # MPR coverage # Specifies how many MPRs a node should # try select to reach every 2 hop neighbor # Can be set to any integer >0 # defaults to 1 MprCoverage 7 # Link quality level # 0 = do not use link quality # 1 = use link quality for MPR selection # 2 = use link quality for MPR selection and routing LinkQualityLevel 2 # Fish Eye algorithm # 0 = do not use fish eye # 1 = use fish eye LinkQualityFishEye 1 # Link quality algorithm (if LinkQualityLevel > 0) # etx_fpm (hello loss, fixed point math) # etx_float (hello loss, floating point) # etx_ff (packet loss for freifunk compat) LinkQualityAlgorithm "etx_ff" # Clear screen when printing debug output? ClearScreen no # Olsrd plugins to load # This must be the absolute path to the file # or the loader will use the following scheme: # - Try the paths in the LD_LIBRARY_PATH # environment variable. # - The list of libraries cached in /etc/ld.so.cache # - /lib, followed by /usr/lib LoadPlugin "olsrd_txtinfo.dll" { PlParam "Accept" "127.0.0.1" } LoadPlugin "olsrd_dot_draw.dll" { PlParam "Accept" "127.0.0.1" } LoadPlugin "olsrd_httpinfo.dll" { PlParam "port" "8080" PlParam "Host" "127.0.0.1" PlParam "Net" "104.0.0.0 255.0.0.0" PlParam "Net" "192.168.0.0 255.255.0.0" } # Interfaces # Multiple interfaces with the same configuration # can shar the same config block. Just list the # interfaces(e.g. Interface "eth0" "eth2" Interface "GUI" { # Interface Mode is used to prevent unnecessary # packet forwarding on switched ethernet interfaces # valid Modes are "mesh" and "ether" # The default value is mesh! # Mode "mesh" # IPv4 broadcast address to use. The # one useful example would be 255.255.255.255 # If not defined the broadcastaddress # every card is configured with is used # The second useful value would be to # specify the peer address of an ptp-tunnel. # another name of this parameter is "IPv4Multicast" # Ip4Broadcast 255.255.255.255 # IPv6 multicast address # If not defined, FF02::1 is used # IPv6Multicast FF02::1 # IPv4 src address # If not defined (0.0.0.0), the interface IP is used # IPv4Src 0.0.0.0 # IPv6 src prefix. # If not defined (::/0), a not-linklocal interface IP is used # IPv6Src ::/0 # Olsrd can autodetect changes in # interface configurations. Enabled by default # turn off to save CPU. AutoDetectChanges: yes # Emission and validity intervals. # If not defined, RFC proposed values will # in most cases be used. HelloInterval 5.00 HelloValidityTime 125.00 TcInterval 3.00 TcValidityTime 375.00 MidInterval 25.00 MidValidityTime 375.00 HnaInterval 25.00 HnaValidityTime 375.00 #LinkQualityMult default 1.0 # When multiple links exist between hosts # the weight of interface is used to determine # the link to use. Normally the weight is # automatically calculated by olsrd based # on the characteristics of the interface, # but here you can specify a fixed value. # Olsrd will choose links with the lowest value. # Note: # Interface weight is used only when LinkQualityLevel is 0. # For any other value of LinkQualityLevel, the interface ETX # value is used instead. #Weight 0 } olsrd-0.6.6.2/gui/win32/Main/Main.vcproj000066400000000000000000000155661234304727700175570ustar00rootroot00000000000000 olsrd-0.6.6.2/gui/win32/Main/MidEntry.cpp000066400000000000000000000042111234304727700176660ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "stdafx.h" #include "MidEntry.h" class MidEntry &MidEntry::operator=(class MidEntry &Src) { Addr = Src.Addr; Timeout = Src.Timeout; return *this; } BOOL MidEntry::operator==(const class MidEntry &Comp) const { return Addr == Comp.Addr; } #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/MidEntry.h000066400000000000000000000043441234304727700173420ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined TL_MIDENTRY_H #define TL_MIDENTRY_H class MidEntry { public: unsigned int Addr; unsigned __int64 Timeout; class MidEntry & MidEntry::operator=(class MidEntry &); BOOL MidEntry::operator==(const class MidEntry &) const; }; #endif /* !defined TL_MIDENTRY_H */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/MprEntry.cpp000066400000000000000000000042111234304727700177130ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "stdafx.h" #include "MprEntry.h" class MprEntry &MprEntry::operator=(class MprEntry &Src) { Addr = Src.Addr; Timeout = Src.Timeout; return *this; } BOOL MprEntry::operator==(const class MprEntry &Comp) const { return Addr == Comp.Addr; } #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/MprEntry.h000066400000000000000000000043441234304727700173670ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined TL_MPRENTRY_H #define TL_MPRENTRY_H class MprEntry { public: unsigned int Addr; unsigned __int64 Timeout; class MprEntry & MprEntry::operator=(class MprEntry &); BOOL MprEntry::operator==(const class MprEntry &) const; }; #endif /* !defined TL_MPRENTRY_H */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/MyDialog1.cpp000066400000000000000000000140171234304727700177260ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "stdafx.h" #include "Frontend.h" #include "MyDialog1.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /* _DEBUG */ MyDialog1::MyDialog1(CWnd* pParent) : CDialog(MyDialog1::IDD, pParent) { NumLines = 0; //{{AFX_DATA_INIT(MyDialog1) //}}AFX_DATA_INIT } BOOL MyDialog1::Create(CWnd *Parent) { return CDialog::Create(MyDialog1::IDD, Parent); } void MyDialog1::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(MyDialog1) DDX_Control(pDX, IDC_BUTTON4, m_SaveButton); DDX_Control(pDX, IDC_BUTTON3, m_FreezeButton); DDX_Control(pDX, IDC_BUTTON2, m_ContinueButton); DDX_Control(pDX, IDC_BUTTON1, m_ClearButton); DDX_Control(pDX, IDC_EDIT1, m_OutputWindow); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(MyDialog1, CDialog) //{{AFX_MSG_MAP(MyDialog1) ON_BN_CLICKED(IDC_BUTTON1, OnClearButton) ON_BN_CLICKED(IDC_BUTTON2, OnContinueButton) ON_BN_CLICKED(IDC_BUTTON3, OnFreezeButton) ON_WM_CTLCOLOR() ON_BN_CLICKED(IDOK, OnOK) ON_BN_CLICKED(IDCANCEL, OnCancel) ON_BN_CLICKED(IDC_BUTTON4, OnSaveButton) //}}AFX_MSG_MAP END_MESSAGE_MAP() void MyDialog1::OnOK() { } void MyDialog1::OnCancel() { } void MyDialog1::AddOutputLine(CString Line) { int Index; CritSect.Lock(); Output += Line + "\r\n"; if (NumLines == 1000) { Index = Output.Find("\r\n"); Output.Delete(0, Index + 2); } else NumLines++; CritSect.Unlock(); if (Frozen == 0) { m_OutputWindow.SetWindowText(Output); m_OutputWindow.SetSel(Output.GetLength(), Output.GetLength()); } } void MyDialog1::SetFrozen(int NewFrozen) { Frozen = NewFrozen; } BOOL MyDialog1::OnInitDialog() { CDialog::OnInitDialog(); CClientDC DevCont(&m_OutputWindow); EditFont.CreatePointFont(90, "Courier New", NULL); m_OutputWindow.SetFont(&EditFont); m_FreezeButton.EnableWindow(FALSE); m_ContinueButton.EnableWindow(FALSE); Frozen = 0; WhiteBrush.CreateSolidBrush(RGB(255, 255, 255)); return TRUE; } void MyDialog1::OnClearButton() { CritSect.Lock(); Output.Empty(); NumLines = 0; CritSect.Unlock(); m_OutputWindow.SetWindowText(Output); m_OutputWindow.SetSel(0, 0); } void MyDialog1::OnContinueButton() { CString Copy; int Len; m_FreezeButton.EnableWindow(TRUE); m_ContinueButton.EnableWindow(FALSE); Frozen = 0; CritSect.Lock(); Copy = Output; Len = Output.GetLength(); CritSect.Unlock(); m_OutputWindow.SetWindowText(Copy); m_OutputWindow.SetSel(Len, Len); } void MyDialog1::OnFreezeButton() { m_FreezeButton.EnableWindow(FALSE); m_ContinueButton.EnableWindow(TRUE); Frozen = 1; } void MyDialog1::HandleStart(void) { CString Copy; int Len; m_FreezeButton.EnableWindow(TRUE); m_ContinueButton.EnableWindow(FALSE); Frozen = 0; CritSect.Lock(); Copy = Output; Len = Output.GetLength(); CritSect.Unlock(); m_OutputWindow.SetWindowText(Copy); m_OutputWindow.SetSel(Len, Len); } void MyDialog1::HandleStop(void) { CString Copy; int Len; m_FreezeButton.EnableWindow(FALSE); m_ContinueButton.EnableWindow(FALSE); Frozen = 0; CritSect.Lock(); Copy = Output; Len = Output.GetLength(); CritSect.Unlock(); m_OutputWindow.SetWindowText(Copy); m_OutputWindow.SetSel(Len, Len); } HBRUSH MyDialog1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd == &m_OutputWindow) { pDC->SetBkColor(RGB(255, 255, 255)); hbr = WhiteBrush; } return hbr; } void MyDialog1::OnSaveButton() { CString Copy; int Len; CFileDialog FileDialog(FALSE); CString FileName = "OLSR log.txt"; CString PathName; CFile File; CritSect.Lock(); Copy = Output; Len = Output.GetLength(); CritSect.Unlock(); FileDialog.m_ofn.lpstrFilter = "Text file (*.txt)\0*.txt\0"; FileDialog.m_ofn.nFilterIndex = 1; FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500); FileDialog.m_ofn.nMaxFile = 500; if (FileDialog.DoModal() == IDOK) { PathName = FileDialog.GetPathName(); if (File.Open(PathName, CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive) == 0) AfxMessageBox("Cannot open logfile '" + PathName + "'."); else { File.Write((const char *)Copy, Len); File.Close(); } } FileName.ReleaseBuffer(); } #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/MyDialog1.h000066400000000000000000000064541234304727700174010ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined(AFX_MYDIALOG1_H__1A381668_A36B_4C51_9B79_643BC2A59D88__INCLUDED_) #define AFX_MYDIALOG1_H__1A381668_A36B_4C51_9B79_643BC2A59D88__INCLUDED_ #if defined _MSC_VER && _MSC_VER > 1000 #pragma once #endif /* defined _MSC_VER && _MSC_VER > 1000 */ class MyDialog1:public CDialog { public: MyDialog1(CWnd * pParent = NULL); BOOL Create(CWnd * Parent); void AddOutputLine(CString); void SetFrozen(int); void HandleStart(void); void HandleStop(void); //{{AFX_DATA(MyDialog1) enum { IDD = IDD_DIALOG1 }; CButton m_SaveButton; CButton m_FreezeButton; CButton m_ContinueButton; CButton m_ClearButton; CEdit m_OutputWindow; //}}AFX_DATA //{{AFX_VIRTUAL(MyDialog1) protected: virtual void DoDataExchange(CDataExchange * pDX); //}}AFX_VIRTUAL protected: //{{AFX_MSG(MyDialog1) afx_msg void OnOK(); afx_msg void OnCancel(); virtual BOOL OnInitDialog(); afx_msg void OnClearButton(); afx_msg void OnContinueButton(); afx_msg void OnFreezeButton(); afx_msg HBRUSH OnCtlColor(CDC * pDC, CWnd * pWnd, UINT nCtlColor); afx_msg void OnSaveButton(); //}}AFX_MSG DECLARE_MESSAGE_MAP() CCriticalSection CritSect; CString Output; int NumLines; int Frozen; CFont EditFont; CBrush WhiteBrush; }; //{{AFX_INSERT_LOCATION}} #endif /* !defined(AFX_MYDIALOG1_H__1A381668_A36B_4C51_9B79_643BC2A59D88__INCLUDED_) */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/MyDialog2.cpp000066400000000000000000000372451234304727700177370ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "stdafx.h" #include "Frontend.h" #include "MyDialog2.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /* _DEBUG */ #define MAXIF 100 MyDialog2::MyDialog2(CWnd* pParent) : CDialog(MyDialog2::IDD, pParent) { Conf = NULL; //{{AFX_DATA_INIT(MyDialog2) //}}AFX_DATA_INIT } void MyDialog2::SetDebugLevel(int Level) { char LevelText[2]; LevelText[0] = (char)(Level + '0'); LevelText[1] = 0; DebugLevel = Level; m_DebugLevel.SetPos(Level); m_DebugLevelText.SetWindowText(LevelText); } BOOL MyDialog2::Create(CWnd *Parent) { return CDialog::Create(MyDialog2::IDD, Parent); } void MyDialog2::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(MyDialog2) DDX_Control(pDX, IDC_COMBO3, m_LqAlgo); DDX_Control(pDX, IDC_COMBO1, m_TcRed); DDX_Control(pDX, IDC_EDIT15, m_MprCov); DDX_Control(pDX, IDC_RADIO2, m_EtxRadio2); DDX_Control(pDX, IDC_RADIO1, m_EtxRadio1); DDX_Control(pDX, IDC_CHECK4, m_EtxCheck); DDX_Control(pDX, IDC_CHECK3, m_Ipv6Check); DDX_Control(pDX, IDC_CHECK2, m_InternetCheck); DDX_Control(pDX, IDC_CHECK1, m_HystCheck); DDX_Control(pDX, IDC_CHECK5, m_FishEyeCheck); DDX_Control(pDX, IDC_EDIT13, m_HystThresholdHigh); DDX_Control(pDX, IDC_EDIT12, m_HystThresholdLow); DDX_Control(pDX, IDC_EDIT11, m_HystScaling); DDX_Control(pDX, IDC_EDIT10, m_HnaHold); DDX_Control(pDX, IDC_EDIT9, m_MidHold); DDX_Control(pDX, IDC_EDIT7, m_PollInt); DDX_Control(pDX, IDC_EDIT6, m_TcHold); DDX_Control(pDX, IDC_EDIT5, m_TcInt); DDX_Control(pDX, IDC_EDIT4, m_HnaInt); DDX_Control(pDX, IDC_EDIT3, m_MidInt); DDX_Control(pDX, IDC_EDIT2, m_HelloHold); DDX_Control(pDX, IDC_EDIT1, m_HelloInt); DDX_Control(pDX, IDC_LIST1, m_InterfaceList); DDX_Control(pDX, IDC_TEXT1, m_DebugLevelText); DDX_Control(pDX, IDC_SLIDER2, m_DebugLevel); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(MyDialog2, CDialog) //{{AFX_MSG_MAP(MyDialog2) ON_WM_HSCROLL() ON_BN_CLICKED(IDC_CHECK1, OnHystCheck) ON_BN_CLICKED(IDC_BUTTON4, OnOpenButton) ON_BN_CLICKED(IDC_BUTTON5, OnSaveButton) ON_BN_CLICKED(IDC_BUTTON1, OnResetButton) ON_BN_CLICKED(IDC_CHECK4, OnEtxCheck) ON_BN_CLICKED(IDC_RADIO1, OnEtxRadio1) ON_BN_CLICKED(IDC_RADIO2, OnEtxRadio2) ON_BN_CLICKED(IDOK, OnOK) ON_BN_CLICKED(IDCANCEL, OnCancel) //}}AFX_MSG_MAP END_MESSAGE_MAP() void MyDialog2::OnOK() { } void MyDialog2::OnCancel() { } void MyDialog2::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { if (pScrollBar == (CScrollBar *)&m_DebugLevel) SetDebugLevel(m_DebugLevel.GetPos()); CDialog::OnHScroll(nSBCode, nPos, pScrollBar); } void MyDialog2::Reset(void) { char PathName[MAX_PATH + 50]; char *Walker; int i; ::GetModuleFileName(NULL, PathName, MAX_PATH); for (Walker = PathName; *Walker != 0; Walker++); while (*Walker != '\\') Walker--; lstrcpy(Walker + 1, "Default.olsr"); if (OpenConfigFile(PathName) < 0) return; m_Ipv6Check.SetCheck(FALSE); if (Conf->interfaces == NULL) { for (i = 0; i < Interfaces->GetSize(); i++) { if ((*IsWlan)[i] == "-") m_InterfaceList.SetCheck(i, FALSE); else m_InterfaceList.SetCheck(i, TRUE); } } } BOOL MyDialog2::OnInitDialog() { int i; CDialog::OnInitDialog(); m_DebugLevel.SetRange(0, 9, TRUE); m_InterfaceList.SetExtendedStyle(m_InterfaceList.GetExtendedStyle() | LVS_EX_CHECKBOXES); for (i = 0; i < Interfaces->GetSize(); i++) { m_InterfaceList.InsertItem(i, (*Interfaces)[i] + " - " + (*Addresses)[i]); } MIB_IPFORWARDROW IpFwdRow; if (::GetBestRoute(0, 0, &IpFwdRow) != NO_ERROR) m_InternetCheck.EnableWindow(FALSE); m_MprCov.LimitText(1); Reset(); return TRUE; } void MyDialog2::OnHystCheck() { BOOL EnaDis = m_HystCheck.GetCheck(); m_HystThresholdLow.EnableWindow(EnaDis); m_HystThresholdHigh.EnableWindow(EnaDis); m_HystScaling.EnableWindow(EnaDis); } void MyDialog2::OnEtxCheckWorker() { BOOL EnaDis = m_EtxCheck.GetCheck(); m_EtxRadio1.EnableWindow(EnaDis); m_EtxRadio2.EnableWindow(EnaDis); m_FishEyeCheck.EnableWindow(EnaDis); } void MyDialog2::OnEtxCheck() { OnEtxCheckWorker(); AfxMessageBox("WARNING - This parameter breaks compliance with the OLSR standard.\n\n" "Make sure that either all nodes in your network use ETX or all nodes in your network don't use ETX.\n\n" "DO NOT MIX NODES WITH DIFFERENT ETX SETTINGS!"); } int MyDialog2::OpenConfigFile(CString PathName) { struct ip_prefix_list *Hna; struct olsr_if *Int, *PrevInt; struct olsr_msg_params *MsgPar; int NumInt = m_InterfaceList.GetItemCount(); int i; CString IntName; CString Conv; if (Conf != NULL) olsrd_free_cnf(Conf); if (olsrd_parse_cnf(PathName) < 0) return -1; Conf = olsr_cnf; for (i = 0; i < NumInt; i++) m_InterfaceList.SetCheck(i, FALSE); for (Int = Conf->interfaces; Int != NULL; Int = Int->next) { IntName = Int->name; IntName.MakeUpper(); for (i = 0; i < NumInt; i++) { if (m_InterfaceList.GetItemText(i, 0).Mid(0, 4) == IntName) m_InterfaceList.SetCheck(i, TRUE); } } Int = Conf->interfaces; MsgPar = &Int->cnf->hello_params; Conv.Format("%.2f", MsgPar->emission_interval); m_HelloInt.SetWindowText(Conv); Conv.Format("%.2f", MsgPar->validity_time); m_HelloHold.SetWindowText(Conv); MsgPar = &Int->cnf->tc_params; Conv.Format("%.2f", MsgPar->emission_interval); m_TcInt.SetWindowText(Conv); Conv.Format("%.2f", MsgPar->validity_time); m_TcHold.SetWindowText(Conv); MsgPar = &Int->cnf->mid_params; Conv.Format("%.2f", MsgPar->emission_interval); m_MidInt.SetWindowText(Conv); Conv.Format("%.2f", MsgPar->validity_time); m_MidHold.SetWindowText(Conv); MsgPar = &Int->cnf->hna_params; Conv.Format("%.2f", MsgPar->emission_interval); m_HnaInt.SetWindowText(Conv); Conv.Format("%.2f", MsgPar->validity_time); m_HnaHold.SetWindowText(Conv); SetDebugLevel(Conf->debug_level); Conv.Format("%.2f", Conf->pollrate); m_PollInt.SetWindowText(Conv); Conv.Format("%d", Conf->mpr_coverage); m_MprCov.SetWindowText(Conv); m_TcRed.SetCurSel(Conf->tc_redundancy); m_LqAlgo.SetCurSel(m_LqAlgo.FindStringExact(-1, Conf->lq_algorithm)); m_HystCheck.SetCheck(Conf->use_hysteresis); Conv.Format("%.2f", Conf->hysteresis_param.scaling); m_HystScaling.SetWindowText(Conv); Conv.Format("%.2f", Conf->hysteresis_param.thr_high); m_HystThresholdHigh.SetWindowText(Conv); Conv.Format("%.2f", Conf->hysteresis_param.thr_low); m_HystThresholdLow.SetWindowText(Conv); OnHystCheck(); m_FishEyeCheck.SetCheck(Conf->lq_fish > 0); m_EtxCheck.SetCheck(Conf->lq_level > 0); #if 0 Conv.Format("%d", Conf->lq_wsize); m_EtxWindowSize.SetWindowText(Conv); #endif m_EtxRadio1.SetCheck(Conf->lq_level == 1); m_EtxRadio2.SetCheck(Conf->lq_level == 0 || Conf->lq_level == 2); OnEtxCheckWorker(); m_InternetCheck.SetCheck(FALSE); for (Hna = Conf->hna_entries; Hna != NULL; Hna = Hna->next) if (0 == Hna->net.prefix_len && m_InternetCheck.IsWindowEnabled()) m_InternetCheck.SetCheck(TRUE); PrevInt = NULL; for (Int = Conf->interfaces; Int != NULL; Int = Int->next) { IntName = Int->name; if (IntName.CompareNoCase("GUI") == 0) break; PrevInt = Int; } if (Int != NULL) { if (PrevInt == NULL) Conf->interfaces = Int->next; else PrevInt->next = Int->next; win32_olsrd_free(Int); } return 0; } static struct olsr_if *AddInterface(struct olsrd_config **Conf, CString Name) { struct olsr_if *Int; Int = (struct olsr_if *)win32_olsrd_malloc(sizeof (struct olsr_if)); if (Int == NULL) { AfxMessageBox("Cannot allocate memory."); return NULL; } Int->name = (char *)win32_olsrd_malloc(Name.GetLength() + 1); if (Int->name == NULL) { win32_olsrd_free(Int); AfxMessageBox("Cannot allocate memory."); return NULL; } ::lstrcpy(Int->name, Name); Int->config = NULL; Int->configured = false; Int->interf = NULL; Int->cnf = get_default_if_config(); Int->next = (*Conf)->interfaces; (*Conf)->interfaces = Int; return Int; } int MyDialog2::SaveConfigFile(CString PathName, int Real) { struct olsr_if *Int, *PrevInt; struct olsr_msg_params *MsgPar; CString Conv; struct ip_prefix_list *Hna, *NewHna, *PrevHna; int NumInt = m_InterfaceList.GetItemCount(); int i; CString IntName, IntName2; struct ip_prefix_list *IpcHost; union olsr_ip_addr Local; PrevInt = NULL; // remove interfaces that we do not want for (Int = Conf->interfaces; Int != NULL; Int = Int->next) { IntName = Int->name; IntName.MakeUpper(); for (i = 0; i < NumInt; i++) if (m_InterfaceList.GetItemText(i, 0).Mid(0, 4) == IntName) break; if (i == NumInt || !m_InterfaceList.GetCheck(i)) { if (PrevInt != NULL) PrevInt->next = Int->next; else Conf->interfaces = Int->next; } } // add missing interfaces for (i = 0; i < NumInt; i++) { if (!m_InterfaceList.GetCheck(i)) continue; IntName2 = m_InterfaceList.GetItemText(i, 0).Mid(0, 4); for (Int = Conf->interfaces; Int != NULL; Int = Int->next) { IntName = Int->name; IntName.MakeUpper(); if (IntName2 == IntName) break; } if (Int == NULL) AddInterface(&Conf, m_InterfaceList.GetItemText(i, 0).Mid(0, 4)); } // add dummy interface, if there aren't any real interfaces if (Conf->interfaces == NULL && Real != 0) AddInterface(&Conf, "GUI"); // per-interface settings for (Int = Conf->interfaces; Int != NULL; Int = Int->next) { MsgPar = &Int->cnf->hello_params; m_HelloInt.GetWindowText(Conv); MsgPar->emission_interval = (float)atof(Conv); m_HelloHold.GetWindowText(Conv); MsgPar->validity_time = (float)atof(Conv); MsgPar = &Int->cnf->tc_params; m_TcInt.GetWindowText(Conv); MsgPar->emission_interval = (float)atof(Conv); m_TcHold.GetWindowText(Conv); MsgPar->validity_time = (float)atof(Conv); MsgPar = &Int->cnf->mid_params; m_MidInt.GetWindowText(Conv); MsgPar->emission_interval = (float)atof(Conv); m_MidHold.GetWindowText(Conv); MsgPar->validity_time = (float)atof(Conv); MsgPar = &Int->cnf->hna_params; m_HnaInt.GetWindowText(Conv); MsgPar->emission_interval = (float)atof(Conv); m_HnaHold.GetWindowText(Conv); MsgPar->validity_time = (float)atof(Conv); } // global settings Conf->debug_level = DebugLevel; m_PollInt.GetWindowText(Conv); Conf->pollrate = (float)atof(Conv); Conf->tc_redundancy = (unsigned char)m_TcRed.GetCurSel(); i = m_LqAlgo.GetCurSel(); Conf->lq_algorithm = NULL; if (0 <= i) { CString str; m_LqAlgo.GetLBText(i, str); Conf->lq_algorithm = strdup((LPCTSTR)str); } m_MprCov.GetWindowText(Conv); Conf->mpr_coverage = (unsigned char)atoi(Conv); Conf->use_hysteresis = m_HystCheck.GetCheck() ? true : false; m_HystScaling.GetWindowText(Conv); Conf->hysteresis_param.scaling = (float)atof(Conv); m_HystThresholdHigh.GetWindowText(Conv); Conf->hysteresis_param.thr_high = (float)atof(Conv); m_HystThresholdLow.GetWindowText(Conv); Conf->hysteresis_param.thr_low = (float)atof(Conv); if (!m_EtxCheck.GetCheck()) Conf->lq_level = 0; else if (m_EtxRadio1.GetCheck()) Conf->lq_level = 1; else Conf->lq_level = 2; if (!m_FishEyeCheck.GetCheck()) Conf->lq_fish = 0; else Conf->lq_fish = 1; PrevHna = NULL; // check for a default gateway HNA4 entry for (Hna = Conf->hna_entries; Hna != NULL; Hna = Hna->next) { if (0 == Hna->net.prefix_len) break; PrevHna = Hna; } // add default gateway HNA entry if (m_InternetCheck.GetCheck() && Hna == NULL) { NewHna = (struct ip_prefix_list * ) win32_olsrd_malloc(sizeof (struct ip_prefix_list)); if (NewHna == NULL) { AfxMessageBox("Cannot allocate memory."); return -1; } memset(NewHna, 0, sizeof (struct ip_prefix_list)); NewHna->next = Conf->hna_entries; Conf->hna_entries = NewHna; } // remove default gateway HNA4 entry if (!m_InternetCheck.GetCheck() && Hna != NULL) { if (PrevHna == NULL) Conf->hna_entries = Hna->next; else PrevHna->next = Hna->next; win32_olsrd_free(Hna); } if (AF_INET == Conf->ip_version) { Local.v4.s_addr = ::inet_addr("127.0.0.1"); } else { memset(&Local, 0, sizeof(Local)); Local.v6.u.Byte[15] = 1; } for (IpcHost = Conf->ipc_nets; IpcHost != NULL; IpcHost = IpcHost->next) if (0 == memcmp(&IpcHost->net.prefix, &Local, Conf->ipsize)) break; if (IpcHost == NULL && Real == 0) { IpcHost = (struct ip_prefix_list *) win32_olsrd_malloc(sizeof (struct ip_prefix_list)); if (IpcHost == NULL) { AfxMessageBox("Cannot allocate memory."); return -1; } IpcHost->net.prefix = Local; IpcHost->net.prefix_len = (uint8_t)Conf->ipsize; IpcHost->next = Conf->ipc_nets; Conf->ipc_nets = IpcHost; Conf->ipc_connections++; } // write configuration file if (olsrd_write_cnf(Conf, PathName) < 0) return -1; return 0; } void MyDialog2::OnSaveButton() { CFileDialog FileDialog(FALSE); CString FileName = "Default.olsr"; CString PathName; FileDialog.m_ofn.lpstrFilter = "Configuration file (*.olsr)\0*.olsr\0"; FileDialog.m_ofn.nFilterIndex = 1; FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500); FileDialog.m_ofn.nMaxFile = 500; if (FileDialog.DoModal() == IDOK) { PathName = FileDialog.GetPathName(); if (SaveConfigFile(PathName, 1) < 0) AfxMessageBox("Cannot save configuration file '" + PathName + "'."); } FileName.ReleaseBuffer(); } void MyDialog2::OnOpenButton() { CFileDialog FileDialog(TRUE); CString FileName = "Default.olsr"; CString PathName; FileDialog.m_ofn.lpstrFilter = "Configuration file (*.olsr)\0*.olsr\0"; FileDialog.m_ofn.nFilterIndex = 1; FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500); FileDialog.m_ofn.nMaxFile = 500; if (FileDialog.DoModal() == IDOK) { PathName = FileDialog.GetPathName(); if (OpenConfigFile(PathName) < 0) AfxMessageBox("Cannot open configuration file '" + PathName + "'."); } FileName.ReleaseBuffer(); } void MyDialog2::OnResetButton() { Reset(); } void MyDialog2::OnEtxRadio1() { m_EtxRadio2.SetCheck(FALSE); } void MyDialog2::OnEtxRadio2() { m_EtxRadio1.SetCheck(FALSE); } #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/MyDialog2.h000066400000000000000000000077571234304727700174110ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined(AFX_MYDIALOG2_H__1A381668_A36B_4C51_9B79_643BC2A59D88__INCLUDED_) #define AFX_MYDIALOG2_H__1A381668_A36B_4C51_9B79_643BC2A59D88__INCLUDED_ #if defined _MSC_VER && _MSC_VER > 1000 #pragma once #endif /* defined _MSC_VER && _MSC_VER > 1000 */ #include "MyEdit.h" #define MAKELIB #define OLSR_PLUGIN #include #include "afxwin.h" class MyDialog2:public CDialog { public: MyDialog2(CWnd * pParent = NULL); BOOL Create(CWnd * Parent); int OpenConfigFile(CString); int SaveConfigFile(CString, int); CStringArray *Interfaces; CStringArray *Addresses; CStringArray *IsWlan; struct olsrd_config *Conf; //{{AFX_DATA(MyDialog2) enum { IDD = IDD_DIALOG2 }; CComboBox m_LqAlgo; CComboBox m_TcRed; CEdit m_MprCov; CButton m_EtxRadio2; CButton m_EtxRadio1; CButton m_EtxCheck; CButton m_Ipv6Check; CButton m_InternetCheck; CButton m_HystCheck; CButton m_FishEyeCheck; MyEdit m_HystThresholdHigh; MyEdit m_HystThresholdLow; MyEdit m_HystScaling; MyEdit m_HnaHold; MyEdit m_MidHold; MyEdit m_PollInt; MyEdit m_TcHold; MyEdit m_TcInt; MyEdit m_HnaInt; MyEdit m_MidInt; MyEdit m_HelloHold; MyEdit m_HelloInt; CListCtrl m_InterfaceList; CStatic m_DebugLevelText; CSliderCtrl m_DebugLevel; //}}AFX_DATA //{{AFX_VIRTUAL(MyDialog2) protected: virtual void DoDataExchange(CDataExchange * pDX); //}}AFX_VIRTUAL protected: //{{AFX_MSG(MyDialog2) afx_msg void OnOK(); afx_msg void OnCancel(); afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar * pScrollBar); virtual BOOL OnInitDialog(); afx_msg void OnHystCheck(); afx_msg void OnOpenButton(); afx_msg void OnSaveButton(); afx_msg void OnResetButton(); afx_msg void OnEtxCheck(); afx_msg void OnEtxRadio1(); afx_msg void OnEtxRadio2(); //}}AFX_MSG DECLARE_MESSAGE_MAP() CFont EditFont; int DebugLevel; void SetDebugLevel(int); void Reset(void); void OnEtxCheckWorker(void); }; //{{AFX_INSERT_LOCATION}} #endif /* !defined(AFX_MYDIALOG2_H__1A381668_A36B_4C51_9B79_643BC2A59D88__INCLUDED_) */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/MyDialog3.cpp000066400000000000000000000165611234304727700177360ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "stdafx.h" #include "Frontend.h" #include "MyDialog3.h" #include "MprEntry.h" #include "MidEntry.h" #include "HnaEntry.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /* _DEBUG */ MyDialog3::MyDialog3(CWnd* pParent) : CDialog(MyDialog3::IDD, pParent) { LastUpdate = 0; Info = NULL; //{{AFX_DATA_INIT(MyDialog3) //}}AFX_DATA_INIT } BOOL MyDialog3::Create(CWnd *Parent) { return CDialog::Create(MyDialog3::IDD, Parent); } void MyDialog3::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(MyDialog3) DDX_Control(pDX, IDC_LIST6, m_HnaList); DDX_Control(pDX, IDC_LIST5, m_MidList); DDX_Control(pDX, IDC_LIST4, m_MprList); DDX_Control(pDX, IDC_LIST1, m_NodeList); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(MyDialog3, CDialog) //{{AFX_MSG_MAP(MyDialog3) ON_BN_CLICKED(IDOK, OnOK) ON_BN_CLICKED(IDCANCEL, OnCancel) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, OnItemchangedNodeList) //}}AFX_MSG_MAP END_MESSAGE_MAP() void MyDialog3::OnOK() { } void MyDialog3::OnCancel() { } BOOL MyDialog3::OnInitDialog() { CDialog::OnInitDialog(); m_NodeList.InsertColumn(0, "Address", LVCFMT_LEFT, 110, 0); m_NodeList.InsertColumn(1, "Timeout", LVCFMT_LEFT, 110, 1); m_NodeList.InsertColumn(2, "MID", LVCFMT_LEFT, 68, 2); m_NodeList.InsertColumn(3, "HNA", LVCFMT_LEFT, 67, 3); m_MprList.InsertColumn(0, "MPR", LVCFMT_LEFT, 169, 0); m_MidList.InsertColumn(0, "MID", LVCFMT_LEFT, 169, 0); m_HnaList.InsertColumn(0, "HNA", LVCFMT_LEFT, 169, 0); return TRUE; } void MyDialog3::ClearNodeInfo(void) { m_NodeList.DeleteAllItems(); m_MprList.DeleteAllItems(); m_MidList.DeleteAllItems(); m_HnaList.DeleteAllItems(); if (Info != NULL) { delete[] Info; Info = NULL; } } void MyDialog3::UpdateNodeInfo(CList &NodeList) { SYSTEMTIME SysTime; FILETIME FileTime; unsigned __int64 Now; class NodeEntry Entry; POSITION Pos; CString AddrStr; CString TimeoutStr; int Idx, Num; POSITION Pos2; class MprEntry MprEntry; class MidEntry MidEntry; class HnaEntry HnaEntry; CString CurrNode; ::GetSystemTime(&SysTime); ::SystemTimeToFileTime(&SysTime, &FileTime); Now = *(unsigned __int64 *)&FileTime; if (Now < LastUpdate + (__int64)3 * (__int64)10000000) return; LastUpdate = Now; int CurrItem = m_NodeList.GetNextItem(-1, LVNI_SELECTED); if (CurrItem >= 0) CurrNode = m_NodeList.GetItemText(CurrItem, 0); m_NodeList.DeleteAllItems(); if (Info != NULL) { delete[] Info; Info = NULL; } Num = NodeList.GetCount(); if (Num == 0) return; Info = new class NodeInfo[Num]; Pos = NodeList.GetHeadPosition(); Idx = 0; while (Pos != NULL) { Entry = NodeList.GetNext(Pos); Pos2 = Entry.MprList.GetHeadPosition(); while (Pos2 != NULL) { MprEntry = Entry.MprList.GetNext(Pos2); AddrStr.Format("%d.%d.%d.%d", ((unsigned char *)&MprEntry.Addr)[0], ((unsigned char *)&MprEntry.Addr)[1], ((unsigned char *)&MprEntry.Addr)[2], ((unsigned char *)&MprEntry.Addr)[3]); Info[Idx].MprList.Add(AddrStr); } Pos2 = Entry.MidList.GetHeadPosition(); while (Pos2 != NULL) { MidEntry = Entry.MidList.GetNext(Pos2); AddrStr.Format("%d.%d.%d.%d", ((unsigned char *)&MidEntry.Addr)[0], ((unsigned char *)&MidEntry.Addr)[1], ((unsigned char *)&MidEntry.Addr)[2], ((unsigned char *)&MidEntry.Addr)[3]); Info[Idx].MidList.Add(AddrStr); } Pos2 = Entry.HnaList.GetHeadPosition(); while (Pos2 != NULL) { HnaEntry = Entry.HnaList.GetNext(Pos2); unsigned int Mask = 0x80000000; unsigned int Val = ::ntohl(HnaEntry.Mask); int Bits; for (Bits = 0; Bits < 32; Bits++) { if ((Val & Mask) == 0) break; Mask >>= 1; } AddrStr.Format("%d.%d.%d.%d/%d", ((unsigned char *)&HnaEntry.Addr)[0], ((unsigned char *)&HnaEntry.Addr)[1], ((unsigned char *)&HnaEntry.Addr)[2], ((unsigned char *)&HnaEntry.Addr)[3], Bits); Info[Idx].HnaList.Add(AddrStr); } AddrStr.Format("%d.%d.%d.%d", ((unsigned char *)&Entry.Addr)[0], ((unsigned char *)&Entry.Addr)[1], ((unsigned char *)&Entry.Addr)[2], ((unsigned char *)&Entry.Addr)[3]); m_NodeList.InsertItem(Idx, AddrStr); if (AddrStr == CurrNode) m_NodeList.SetItemState(Idx, LVIS_SELECTED, LVIS_SELECTED); SYSTEMTIME SysTime; FILETIME LocalFileTime; ::FileTimeToLocalFileTime((FILETIME *)&Entry.Timeout, &LocalFileTime); ::FileTimeToSystemTime(&LocalFileTime, &SysTime); TimeoutStr.Format("%02d:%02d:%02d", SysTime.wHour, SysTime.wMinute, SysTime.wSecond); m_NodeList.SetItemText(Idx, 1, TimeoutStr); if (Entry.MidList.IsEmpty()) m_NodeList.SetItemText(Idx, 2, "no"); else m_NodeList.SetItemText(Idx, 2, "yes"); if (Entry.HnaList.IsEmpty()) m_NodeList.SetItemText(Idx, 3, "no"); else m_NodeList.SetItemText(Idx, 3, "yes"); Idx++; } } void MyDialog3::OnItemchangedNodeList(NMHDR* pNMHDR, LRESULT* pResult) { int Item; int Idx; int Num; pNMHDR = pNMHDR; *pResult = 0; Item = m_NodeList.GetNextItem(-1, LVNI_SELECTED); if (Item < 0) return; m_MprList.DeleteAllItems(); Num = Info[Item].MprList.GetSize(); for (Idx = 0; Idx < Num; Idx++) m_MprList.InsertItem(Idx, Info[Item].MprList.GetAt(Idx)); m_MidList.DeleteAllItems(); Num = Info[Item].MidList.GetSize(); for (Idx = 0; Idx < Num; Idx++) m_MidList.InsertItem(Idx, Info[Item].MidList.GetAt(Idx)); m_HnaList.DeleteAllItems(); Num = Info[Item].HnaList.GetSize(); for (Idx = 0; Idx < Num; Idx++) m_HnaList.InsertItem(Idx, Info[Item].HnaList.GetAt(Idx)); } #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/MyDialog3.h000066400000000000000000000062771234304727700174060ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined(AFX_MYDIALOG3_H__1A381668_A36B_4C51_9B79_643BC2A59D88__INCLUDED_) #define AFX_MYDIALOG3_H__1A381668_A36B_4C51_9B79_643BC2A59D88__INCLUDED_ #if defined _MSC_VER && _MSC_VER > 1000 #pragma once #endif /* defined _MSC_VER && _MSC_VER > 1000 */ #include "NodeEntry.h" class NodeInfo { public: CStringArray MprList; CStringArray MidList; CStringArray HnaList; }; class MyDialog3:public CDialog { public: MyDialog3(CWnd * pParent = NULL); BOOL Create(CWnd * Parent); void UpdateNodeInfo(CList < class NodeEntry, class NodeEntry & >&); void ClearNodeInfo(void); //{{AFX_DATA(MyDialog3) enum { IDD = IDD_DIALOG3 }; CListCtrl m_HnaList; CListCtrl m_MidList; CListCtrl m_MprList; CListCtrl m_NodeList; //}}AFX_DATA //{{AFX_VIRTUAL(MyDialog3) protected: virtual void DoDataExchange(CDataExchange * pDX); //}}AFX_VIRTUAL protected: unsigned __int64 LastUpdate; class NodeInfo *Info; //{{AFX_MSG(MyDialog3) afx_msg void OnOK(); afx_msg void OnCancel(); virtual BOOL OnInitDialog(); afx_msg void OnItemchangedNodeList(NMHDR * pNMHDR, LRESULT * pResult); //}}AFX_MSG DECLARE_MESSAGE_MAP()}; //{{AFX_INSERT_LOCATION}} #endif /* !defined(AFX_MYDIALOG3_H__1A381668_A36B_4C51_9B79_643BC2A59D88__INCLUDED_) */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/MyDialog4.cpp000066400000000000000000000104471234304727700177340ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "stdafx.h" #include "Frontend.h" #include "MyDialog4.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /* _DEBUG */ MyDialog4::MyDialog4(CWnd* pParent) : CDialog(MyDialog4::IDD, pParent) { //{{AFX_DATA_INIT(MyDialog4) //}}AFX_DATA_INIT } BOOL MyDialog4::Create(CWnd *Parent) { return CDialog::Create(MyDialog4::IDD, Parent); } void MyDialog4::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(MyDialog4) DDX_Control(pDX, IDC_LIST1, m_RoutingTable); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(MyDialog4, CDialog) //{{AFX_MSG_MAP(MyDialog4) ON_BN_CLICKED(IDOK, OnOK) ON_BN_CLICKED(IDCANCEL, OnCancel) //}}AFX_MSG_MAP END_MESSAGE_MAP() void MyDialog4::OnOK() { } void MyDialog4::OnCancel() { } BOOL MyDialog4::OnInitDialog() { CDialog::OnInitDialog(); m_RoutingTable.InsertColumn(0, "Destination", LVCFMT_LEFT, 110, 0); m_RoutingTable.InsertColumn(1, "Gateway", LVCFMT_LEFT, 110, 1); m_RoutingTable.InsertColumn(2, "Metric", LVCFMT_LEFT, 68, 2); m_RoutingTable.InsertColumn(3, "Interface", LVCFMT_LEFT, 67, 3); return TRUE; } void MyDialog4::AddRoute(unsigned int Dest, unsigned int Gate, int Metric, char *Int) { CString DestStr; CString GateStr; CString MetricStr; CString IntStr; int Idx; DestStr.Format("%d.%d.%d.%d", ((unsigned char *)&Dest)[0], ((unsigned char *)&Dest)[1], ((unsigned char *)&Dest)[2], ((unsigned char *)&Dest)[3]); GateStr.Format("%d.%d.%d.%d", ((unsigned char *)&Gate)[0], ((unsigned char *)&Gate)[1], ((unsigned char *)&Gate)[2], ((unsigned char *)&Gate)[3]); MetricStr.Format("%d", Metric); IntStr.Format("%c%c%c%c", Int[0], Int[1], Int[2], Int[3]); IntStr.MakeUpper(); Idx = m_RoutingTable.GetItemCount(); m_RoutingTable.InsertItem(Idx, DestStr); m_RoutingTable.SetItemText(Idx, 1, GateStr); m_RoutingTable.SetItemText(Idx, 2, MetricStr); m_RoutingTable.SetItemText(Idx, 3, IntStr); } void MyDialog4::DeleteRoute(unsigned int Dest) { CString DestStr; int Idx, Num; DestStr.Format("%d.%d.%d.%d", ((unsigned char *)&Dest)[0], ((unsigned char *)&Dest)[1], ((unsigned char *)&Dest)[2], ((unsigned char *)&Dest)[3]); Num = m_RoutingTable.GetItemCount(); for (Idx = 0; Idx < Num; Idx++) { if (m_RoutingTable.GetItemText(Idx, 0) == DestStr) { m_RoutingTable.DeleteItem(Idx); break; } } } void MyDialog4::ClearRoutes(void) { m_RoutingTable.DeleteAllItems(); } #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/MyDialog4.h000066400000000000000000000056271234304727700174050ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined(AFX_MYDIALOG4_H__1A381668_A36B_4C51_9B79_643BC2A59D88__INCLUDED_) #define AFX_MYDIALOG4_H__1A381668_A36B_4C51_9B79_643BC2A59D88__INCLUDED_ #if defined _MSC_VER && _MSC_VER > 1000 #pragma once #endif /* defined _MSC_VER && _MSC_VER > 1000 */ class MyDialog4:public CDialog { public: MyDialog4(CWnd * pParent = NULL); BOOL Create(CWnd * Parent); void AddRoute(unsigned int, unsigned int, int, char *); void DeleteRoute(unsigned int); void ClearRoutes(void); //{{AFX_DATA(MyDialog4) enum { IDD = IDD_DIALOG4 }; CListCtrl m_RoutingTable; //}}AFX_DATA //{{AFX_VIRTUAL(MyDialog4) protected: virtual void DoDataExchange(CDataExchange * pDX); //}}AFX_VIRTUAL protected: //{{AFX_MSG(MyDialog4) afx_msg void OnOK(); afx_msg void OnCancel(); virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP()}; //{{AFX_INSERT_LOCATION}} #endif /* !defined(AFX_MYDIALOG4_H__1A381668_A36B_4C51_9B79_643BC2A59D88__INCLUDED_) */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/MyEdit.cpp000066400000000000000000000060361234304727700173350ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "stdafx.h" #include "frontend.h" #include "MyEdit.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /* _DEBUG */ MyEdit::MyEdit() { } MyEdit::~MyEdit() { } BEGIN_MESSAGE_MAP(MyEdit, CEdit) //{{AFX_MSG_MAP(MyEdit) ON_WM_CHAR() ON_WM_KILLFOCUS() //}}AFX_MSG_MAP END_MESSAGE_MAP() void MyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { static unsigned char *Allowed = (unsigned char *)"0123456789."; int i; CString Text; if (nChar >= 32) { for (i = 0; Allowed[i] != 0; i++) if (nChar == Allowed[i]) break; if (Allowed[i] == 0) return; GetWindowText(Text); if (nChar == '.' && Text.Find('.') >= 0) return; if (Text.GetLength() > 2 && Text.Find('.') < 0 && nChar != '.') return; } CEdit::OnChar(nChar, nRepCnt, nFlags); } void MyEdit::OnKillFocus(CWnd* pNewWnd) { CString Text; int Index; int Len; GetWindowText(Text); Index = Text.Find('.'); Len = Text.GetLength(); if (Len == 0) SetWindowText("0.0"); else if (Index < 0) SetWindowText(Text + ".0"); else if (Index == Len - 1) SetWindowText(Text + "0"); CEdit::OnKillFocus(pNewWnd); } #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/MyEdit.h000066400000000000000000000051371234304727700170030ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined(AFX_MYEDIT_H__951EC391_AFE3_428F_865D_24CA55C68C7C__INCLUDED_) #define AFX_MYEDIT_H__951EC391_AFE3_428F_865D_24CA55C68C7C__INCLUDED_ #if defined _MSC_VER && _MSC_VER > 1000 #pragma once #endif /* defined _MSC_VER && _MSC_VER > 1000 */ class MyEdit:public CEdit { public: MyEdit(); //{{AFX_VIRTUAL(MyEdit) //}}AFX_VIRTUAL virtual ~ MyEdit(); protected: //{{AFX_MSG(MyEdit) afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnKillFocus(CWnd * pNewWnd); //}}AFX_MSG DECLARE_MESSAGE_MAP()}; //{{AFX_INSERT_LOCATION}} #endif /* !defined(AFX_MYEDIT_H__951EC391_AFE3_428F_865D_24CA55C68C7C__INCLUDED_) */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/MyTabCtrl.cpp000066400000000000000000000065331234304727700200050ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "stdafx.h" #include "Frontend.h" #include "MyTabCtrl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /* _DEBUG */ MyTabCtrl::MyTabCtrl() { } MyTabCtrl::~MyTabCtrl() { } BEGIN_MESSAGE_MAP(MyTabCtrl, CTabCtrl) //{{AFX_MSG_MAP(MyTabCtrl) ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnSelchange) //}}AFX_MSG_MAP END_MESSAGE_MAP() void MyTabCtrl::InitTabDialogs(CStringArray *Interfaces, CStringArray *Addresses, CStringArray *IsWlan) { int i; CRect Client; CRect Win; m_Dialog2.Interfaces = Interfaces; m_Dialog2.Addresses = Addresses; m_Dialog2.IsWlan = IsWlan; m_Dialog1.Create(GetParent()); m_Dialog2.Create(GetParent()); m_Dialog3.Create(GetParent()); m_Dialog4.Create(GetParent()); Dialogs[0] = &m_Dialog2; Dialogs[1] = &m_Dialog1; Dialogs[2] = &m_Dialog3; Dialogs[3] = &m_Dialog4; Sel = -1; for (i = 0; i < 4; i++) { GetClientRect(Client); AdjustRect(FALSE, Client); GetWindowRect(Win); GetParent()->ScreenToClient(Win); Client.OffsetRect(Win.left, Win.top); Dialogs[i]->SetWindowPos(&wndTop, Client.left, Client.top, Client.Width(), Client.Height(), SWP_HIDEWINDOW); } DisplayTabDialog(); } void MyTabCtrl::DisplayTabDialog() { if (Sel != -1) Dialogs[Sel]->ShowWindow(SW_HIDE); Sel = GetCurSel(); Dialogs[Sel]->ShowWindow(SW_SHOW); } void MyTabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) { pNMHDR = pNMHDR; DisplayTabDialog(); *pResult = 0; } #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/MyTabCtrl.h000066400000000000000000000056601234304727700174520ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined(AFX_MYTABCTRL_H__D443FF52_C52D_4C89_AB4B_19B09687EBAE__INCLUDED_) #define AFX_MYTABCTRL_H__D443FF52_C52D_4C89_AB4B_19B09687EBAE__INCLUDED_ #if defined _MSC_VER && _MSC_VER > 1000 #pragma once #endif /* defined _MSC_VER && _MSC_VER > 1000 */ #include "MyDialog1.h" #include "MyDialog2.h" #include "MyDialog3.h" #include "MyDialog4.h" class MyTabCtrl:public CTabCtrl { public: MyTabCtrl(); class MyDialog1 m_Dialog1; class MyDialog2 m_Dialog2; class MyDialog3 m_Dialog3; class MyDialog4 m_Dialog4; void InitTabDialogs(CStringArray *, CStringArray *, CStringArray *); void DisplayTabDialog(void); //{{AFX_VIRTUAL(MyTabCtrl) //}}AFX_VIRTUAL virtual ~ MyTabCtrl(); protected: CDialog * Dialogs[4]; int Sel; //{{AFX_MSG(MyTabCtrl) afx_msg void OnSelchange(NMHDR * pNMHDR, LRESULT * pResult); //}}AFX_MSG DECLARE_MESSAGE_MAP()}; //{{AFX_INSERT_LOCATION}} #endif /* !defined(AFX_MYTABCTRL_H__D443FF52_C52D_4C89_AB4B_19B09687EBAE__INCLUDED_) */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/NodeEntry.cpp000066400000000000000000000066141234304727700200530ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "stdafx.h" #include "NodeEntry.h" class NodeEntry &NodeEntry::operator=(class NodeEntry &Src) { Addr = Src.Addr; Timeout = Src.Timeout; MprList.RemoveAll(); MprList.AddHead(&Src.MprList); HnaList.RemoveAll(); HnaList.AddHead(&Src.HnaList); MidList.RemoveAll(); MidList.AddHead(&Src.MidList); return *this; } BOOL NodeEntry::operator==(const class NodeEntry &Comp) const { return Addr == Comp.Addr; } void NodeEntry::AddMpr(unsigned int MprAddr, unsigned __int64 Timeout) { class MprEntry NewEntry; POSITION Pos; NewEntry.Addr = MprAddr; Pos = MprList.Find(NewEntry); if (Pos != NULL) { class MprEntry &OldEntry = MprList.GetAt(Pos); OldEntry.Timeout = Timeout; } else { NewEntry.Timeout = Timeout; MprList.AddTail(NewEntry); } } void NodeEntry::AddMid(unsigned int IntAddr, unsigned __int64 Timeout) { class MidEntry NewEntry; POSITION Pos; NewEntry.Addr = IntAddr; Pos = MidList.Find(NewEntry); if (Pos != NULL) { class MidEntry &OldEntry = MidList.GetAt(Pos); OldEntry.Timeout = Timeout; } else { NewEntry.Timeout = Timeout; MidList.AddTail(NewEntry); } } void NodeEntry::AddHna(unsigned int NetAddr, unsigned int NetMask, unsigned __int64 Timeout) { class HnaEntry NewEntry; POSITION Pos; NewEntry.Addr = NetAddr; NewEntry.Mask = NetMask; Pos = HnaList.Find(NewEntry); if (Pos != NULL) { class HnaEntry &OldEntry = HnaList.GetAt(Pos); OldEntry.Timeout = Timeout; } else { NewEntry.Timeout = Timeout; HnaList.AddTail(NewEntry); } } #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/NodeEntry.h000066400000000000000000000051621234304727700175150ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined TL_NODEENTRY_H #define TL_NODEENTRY_H #include "MprEntry.h" #include "MidEntry.h" #include "HnaEntry.h" class NodeEntry { public: unsigned int Addr; unsigned __int64 Timeout; CList < class MprEntry, class MprEntry & >MprList; CList < class MidEntry, class MidEntry & >MidList; CList < class HnaEntry, class HnaEntry & >HnaList; void AddMpr(unsigned int, unsigned __int64); void AddMid(unsigned int, unsigned __int64); void AddHna(unsigned int, unsigned int, unsigned __int64); class NodeEntry & NodeEntry::operator=(class NodeEntry &); BOOL NodeEntry::operator==(const class NodeEntry &) const; }; #endif /* !defined TL_NODEENTRY_H */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/RFC-Default.olsr000066400000000000000000000114741234304727700203350ustar00rootroot00000000000000# # Default configuration for the GUI # # Debug level(0-9) # If set to 0 the daemon runs in the background DebugLevel 0 # IP version to use (4 or 6) IpVersion 4 # FIBMetric ("flat" or "correct") FIBMetric "flat" # HNA IPv4 routes # syntax: netaddr/prefix Hna4 { } # Should olsrd keep on running even if there are # no interfaces available? This is a good idea # for a PCMCIA/USB hotswap environment. # "yes" OR "no" AllowNoInt yes # TOS(type of service) to use. Default is 16 TosValue 16 # Policy Routing Table to use. Default is 254 RtTable 254 # The fixed willingness to use(0-7) # If not set willingness will be calculated # dynammically based on battery/power status #Willingness 4 # Allow processes like the GUI front-end # to connect to the daemon. IpcConnect { MaxConnections 0 } # Hysteresis adds more robustness to the # link sensing. # Used by default. 'yes' or 'no' UseHysteresis no # Hysteresis parameters # Do not alter these unless you know # what you are doing! # Set to auto by default. Allowed # values are floating point values # in the interval 0,1 # THR_LOW must always be lower than # THR_HIGH!! #HystScaling 0.50 #HystThrHigh 0.80 #HystThrLow 0.30 # Polling rate in seconds(float). # Auto uses default value 0.05 sec Pollrate 0.10 # Interval to poll network interfaces for configuration # changes. Defaults to 2.5 seconds NicChgsPollInt 2.50 # TC redundancy # Specifies how much neighbor info should # be sent in TC messages # Possible values are: # 0 - only send MPR selectors # 1 - send MPR selectors and MPRs # 2 - send all neighbors # # defaults to 0 TcRedundancy 0 # MPR coverage # Specifies how many MPRs a node should # try select to reach every 2 hop neighbor # Can be set to any integer >0 # defaults to 1 MprCoverage 1 # Link quality level # 0 = do not use link quality # 1 = use link quality for MPR selection # 2 = use link quality for MPR selection and routing LinkQualityLevel 0 # Fish Eye algorithm # 0 = do not use fish eye # 1 = use fish eye LinkQualityFishEye 0 # Link quality algorithm (if LinkQualityLevel > 0) # etx_fpm (hello loss, fixed point math) # etx_float (hello loss, floating point) # etx_ff (packet loss for freifunk compat) LinkQualityAlgorithm "etx_fpm" # Clear screen when printing debug output? ClearScreen no # Olsrd plugins to load # This must be the absolute path to the file # or the loader will use the following scheme: # - Try the paths in the LD_LIBRARY_PATH # environment variable. # - The list of libraries cached in /etc/ld.so.cache # - /lib, followed by /usr/lib LoadPlugin "olsrd_httpinfo.dll" { PlParam "Net" "0.0.0.0 0.0.0.0" } # Interfaces # Multiple interfaces with the same configuration # can shar the same config block. Just list the # interfaces(e.g. Interface "eth0" "eth2" Interface "GUI" { # Interface Mode is used to prevent unnecessary # packet forwarding on switched ethernet interfaces # valid Modes are "mesh" and "ether" # The default value is mesh! # Mode "mesh" # IPv4 broadcast address to use. The # one useful example would be 255.255.255.255 # If not defined the broadcastaddress # every card is configured with is used # The second useful value would be to # specify the peer address of an ptp-tunnel. # another name of this parameter is "IPv4Multicast" # Ip4Broadcast 255.255.255.255 # IPv6 multicast address # If not defined, FF02::1 is used # IPv6Multicast FF02::1 # IPv4 src address # If not defined (0.0.0.0), the interface IP is used # IPv4Src 0.0.0.0 # IPv6 src prefix. # If not defined (::/0), a not-linklocal interface IP is used # IPv6Src ::/0 # Olsrd can autodetect changes in # interface configurations. Enabled by default # turn off to save CPU. AutoDetectChanges: yes # Emission and validity intervals. # If not defined, RFC proposed values will # in most cases be used. #HelloInterval 2.00 #HelloValidityTime 6.00 #TcInterval 5.00 #TcValidityTime 15.00 #MidInterval 5.00 #MidValidityTime 15.00 #HnaInterval 5.00 #HnaValidityTime 15.00 #LinkQualityMult default 1.0 # When multiple links exist between hosts # the weight of interface is used to determine # the link to use. Normally the weight is # automatically calculated by olsrd based # on the characteristics of the interface, # but here you can specify a fixed value. # Olsrd will choose links with the lowest value. # Note: # Interface weight is used only when LinkQualityLevel is 0. # For any other value of LinkQualityLevel, the interface ETX # value is used instead. #Weight 0 } olsrd-0.6.6.2/gui/win32/Main/StdAfx.cpp000066400000000000000000000000701234304727700173230ustar00rootroot00000000000000#ifdef _WIN32 #include "stdafx.h" #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/StdAfx.h000066400000000000000000000025261234304727700170000ustar00rootroot00000000000000#ifdef _WIN32 // stdafx.h : Include-Datei f�r Standard-System-Include-Dateien, // oder projektspezifische Include-Dateien, die h�ufig benutzt, aber // in unregelm��igen Abst�nden ge�ndert werden. // #if !defined(AFX_STDAFX_H__D43BD17B_AEC0_43A5_9F3B_1DAA99152E38__INCLUDED_) #define AFX_STDAFX_H__D43BD17B_AEC0_43A5_9F3B_1DAA99152E38__INCLUDED_ #if defined _MSC_VER && _MSC_VER > 1000 #pragma once #endif /* defined _MSC_VER && _MSC_VER > 1000 */ #define VC_EXTRALEAN // Selten verwendete Teile der Windows-Header nicht einbinden #include // MFC-Kern- und -Standardkomponenten #include // MFC-Erweiterungen #include // MFC-Unterst�tzung f�r allgemeine Steuerelemente von Internet Explorer 4 #ifndef _AFX_NO_AFXCMN_SUPPORT #include // MFC-Unterst�tzung f�r g�ngige Windows-Steuerelemente #endif /* _AFX_NO_AFXCMN_SUPPORT */ #include #include #include #include //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ f�gt unmittelbar vor der vorhergehenden Zeile zus�tzliche Deklarationen ein. #endif /* !defined(AFX_STDAFX_H__D43BD17B_AEC0_43A5_9F3B_1DAA99152E38__INCLUDED_) */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/TrayIcon.cpp000066400000000000000000000076541234304727700177010ustar00rootroot00000000000000#ifdef _WIN32 #include "stdafx.h" #include "TrayIcon.h" #include #include #include "Frontend.h" #include "FrontendDlg.h" #include "Resource.h" #define TRAYICONID 987435 HWND s_hWnd; TrayIcon* TrayIcon::instance = NULL; LRESULT CALLBACK TrayIconProc( HWND, UINT, WPARAM, LPARAM lParam ) { switch (lParam) { case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: TrayIcon::instance->displayPopup(); break; } return 1; } void TrayIcon::displayPopup() { HMENU hMenu = LoadMenu(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_TRAYMENU)); HMENU hSubMenu = GetSubMenu(hMenu, 0); EnableMenuItem(hSubMenu, IDM_STOP, MF_BYCOMMAND | (main_dlg.m_StopButton.IsWindowEnabled() ? MF_ENABLED : MF_GRAYED)); EnableMenuItem(hSubMenu, IDM_START, MF_BYCOMMAND | (main_dlg.m_StartButton.IsWindowEnabled() ? MF_ENABLED : MF_GRAYED)); POINT pt; GetCursorPos(&pt); SetForegroundWindow( s_hWnd ); int cmd = TrackPopupMenu(hSubMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y, 0, s_hWnd, NULL); PostMessage(s_hWnd, WM_NULL, 0, 0); switch(cmd) { case IDM_EXIT: main_dlg.OnExitButton(); break; case IDM_WINDOW: main_dlg.OpenIcon(); main_dlg.SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); break; case IDM_SETTINGS: main_dlg.m_TabCtrl.SetCurSel(0); main_dlg.m_TabCtrl.DisplayTabDialog(); main_dlg.OpenIcon(); main_dlg.SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); break; case IDM_OUTPUT: main_dlg.m_TabCtrl.SetCurSel(1); main_dlg.m_TabCtrl.DisplayTabDialog(); main_dlg.OpenIcon(); main_dlg.SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); break; case IDM_STOP: main_dlg.OnStopButton(); break; case IDM_START: main_dlg.OnStartButton(); break; } DestroyMenu(hMenu); } void TrayIcon::setStatus( status con_stat, const char* message ) { switch( con_stat ) { case CONNECTED: setTrayAppearance( false, IDI_ICON2, message ); break; case OFF: setTrayAppearance( false, IDI_ICON3, message ); break; case ON: setTrayAppearance( false, IDI_ICON1, message ); break; } } void TrayIcon::setTrayAppearance( bool start, unsigned int res_id, const char* message ) { NOTIFYICONDATA notifyIconData; notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hWnd = s_hWnd; notifyIconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; notifyIconData.uCallbackMessage = 123456; notifyIconData.uID = TRAYICONID; notifyIconData.hIcon = (HICON)LoadIcon( hInst, MAKEINTRESOURCE( res_id ) ); strncpy( notifyIconData.szTip, message, sizeof (notifyIconData.szTip) ); if( start ) Shell_NotifyIcon( NIM_ADD, ¬ifyIconData ); else Shell_NotifyIcon( NIM_MODIFY, ¬ifyIconData ); } TrayIcon::TrayIcon( CFrontendDlg& dlg, HINSTANCE hInst ) : main_dlg( dlg ), hInst( hInst ) { instance = this; WNDCLASS wndClass; wndClass.style = 0; wndClass.lpfnWndProc = TrayIconProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInst; wndClass.hIcon = NULL; wndClass.hCursor = NULL; wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndClass.lpszMenuName = NULL; wndClass.lpszClassName = "OLSRdTrayIcon"; if (0 != RegisterClass(&wndClass)) { s_hWnd = CreateWindow( "OLSRdTrayIcon", "Invisible Message Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL); if (s_hWnd) { ShowWindow(s_hWnd, SW_HIDE); UpdateWindow(s_hWnd); } } setTrayAppearance( true, IDI_ICON3, "Starting..." ); } TrayIcon::~TrayIcon() { NOTIFYICONDATA notifyIconData; notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hWnd = s_hWnd; notifyIconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; notifyIconData.uCallbackMessage = 123456; notifyIconData.uID = TRAYICONID; notifyIconData.hIcon = NULL; Shell_NotifyIcon( NIM_DELETE, ¬ifyIconData ); } #endif /* _WIN32 */ olsrd-0.6.6.2/gui/win32/Main/TrayIcon.h000066400000000000000000000013201234304727700173260ustar00rootroot00000000000000#ifdef _WIN32 #ifndef TRAYICON_H_171149531 #define TRAYICON_H_171149531 class CFrontendDlg; class TrayIcon { public: TrayIcon(CFrontendDlg &, HINSTANCE); ~TrayIcon(); void displayPopup(); static TrayIcon *getInstance() { return instance; } enum status { CONNECTED, ON, OFF }; void setStatus(status con_status, const char *message); private: void setTrayAppearance(bool, unsigned int, const char *message); HINSTANCE hInst; CFrontendDlg & main_dlg; friend LRESULT CALLBACK TrayIconProc(HWND, UINT, WPARAM, LPARAM); static TrayIcon *instance; }; #endif /* TRAYICON_H_171149531 */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/gnome-shutdown.png000066400000000000000000000106641234304727700211240ustar00rootroot00000000000000PNG  IHDR00W{IDATxYkl[y~ΕNݩ%[,G$۵[un7ɂbt̀"S[Ѧҵ R]/wvfKuX,K%ooj%a0 BPSSۍPt"AFA_o0`mmZa}@l~gߺy֕ / a0GHn/ C'0 TAC[en$\"@"O? OJѣ{6n܈5il6>ŊHkVRVv|gy)S`…ܭWQ,q|I޽{Ohb~O[, CCCUKTXi%I xL,P ztdpΟ/[:8>wEpr*ȅ4 lٲW\ie9J.ߍUsY.p (J^G\3r,*AWpkx)J6D"}ky@Ý*@0{ވ(CsJBL&jXVr9|2p` &) ߍK,+)!jYSWT]hjjz@b Lz_>1==]D"i( $i O<é"Jk:P&5;Ri? fؾ};Cw@i:1===nooR@UUfBE)g& ˅>ca@h@<@* \"a.KC( x@Z[fqڵk{"/DnjFӴV^^*WbE\ :EVX c~?  T(@( ٽD*cKo P%#r֭[=U(040$͖U8'E<(Xn j Sat? 0R)0k$v10 Ħn'^#[nMӠ(Pnqur"a@-͡e nOD> 8@_D:0لQ(Ccf|||_$wm DeeYO}}U`Yd2\KK 9zU$Y^GC䃉2@>$E7E"s'X֭[׮]kOzk*dp3;v9*aU4P(v:H($ 1fw rӾ2H" ϣ=4ȉU$@ߏ6l~ޕ~_[e-alhQ2$I ˲$JUߏ6T9&O^AMo/JL,^)@x#XLle}}}͛7VVVެt#@J"xjN@<BEQ)xeh) EPXdž1;vx?;;w:8<6B`\333,˿]c snwwssR]!IqI&U%pww7ξ1l(Ѷo)Y[shپ>L9wS3 ۶D"{/X?;s%)׷}ƆB/Ca&VԄWOY  ( H%0omKg'j?9H6g/~BRv{mP?nGi6t %IBeg6aL&CQ~PY DӾ"G3NaEx~<Y`=xREeí*s֭3mJ (rUA I."L&TĿ-p@KF.q_R.Hp@P100PL/;X TPhwWWtO 0z65M+ߗ$ X MbC `\}@}wM`)`@ss3(q`YMMMM(0t:jP({l6[U*c24UU|>_J|{\MJ%kߏC+_ zzz`ZaN'ZZZ axn#LV=Oɓsyظq#}zy*"jjj< @2"r\YY_3w R4M'oܸ@#f ⤻59cǎСChkkai555p\hkkC&2d:hMH&B~woQU5FaJM5l4#&r:Mӈ㘝E"`Y,˂i$ a,//#-LLL| @nIL oppг^L&l(ZZ]2 Mp8 ""$ 0r qke;8dYMӘ&n;D!XKYAL~}ӦMʴZ,+8t]q$ AQB!D"B!(MD ]ŐL&Q(0992o|>Wg?I{`nnnC{{;W`Gٰa H$( 4h.,Ek`0+bIa.],MVKˇ~B⪪_oߺ^[nKKKet||֞u~4MY^^N+| xPJ$PjdSԨ닳u۷o\>C2L&0 ra1x<EQT8v޸qͺRY3@O8KLLLXWWWP(T'4T*BH$B7oqYbX6oLuttе$ . ~?ܶ .jZӴ>l߶m\v AE,//`0(k>=(]]]B[[Fy<p0NBj,v[3g@EP+W +,,,p+++CPرcޱzzzV8b+ HA`-3 xv) 5"GWWW韄BaEQ|څ wܹ^Ÿn2 u=JQTe_'>9T*ڥKBAey(?˲W4M+Ȳ-Crl0pis\ ۝Z)UU,'7o,SRWSW4M/k!!dNBjT9gKiP8>hZf1A(F4Mihhi/9lIENDB`olsrd-0.6.6.2/gui/win32/Main/res/000077500000000000000000000000001234304727700162225ustar00rootroot00000000000000olsrd-0.6.6.2/gui/win32/Main/res/Frontend.ico000066400000000000000000000537261234304727700205120ustar00rootroot0000000000000000f h00 %  B hnS(0` !1199!!!)))111999BJBRZRZckkks{s{{BBBJJJBBZRRRZZZccckkksss{{{!1!!)11199!!))))99!!!)!!!)1!)99!!)1)9)91999BBBBkk{{ssBBJJBBJJZZRZZZJRRRRZZZRRRccc{{cckkss{{ss{{))11119!!99BJJJJJBRRRRZRRRZJJBZRcZccckkksssksk{c{s&$#&% !&$!$%&""#$%%&$$!##&&$$! !&!%&&%"&!$!###$ !ÿ!!"#!"ƪ%##%$$$!$ê&&&%$%ƪ&$""ª "&"#ƪ  !#!"";< "&$ƿ*r%#"(4_%##ƿ,FM( "&!,4IMykg&ÿ1JNpK^if!% -GNa0DKKKtA<""%5NO/DDKKKLLLx&&#2JO\DDDKLLL~~~#.HNpBBDDļKLLL~c!#3WXBBBDPKKLLLc#!!3SX/BBBDKKKKLR!Ÿ6N]/0BBQDDKKP"$$ 3TNq))//0CEBDDDP#ž.:X>')))//00BDz !¿ 9Y'')')/0z !$7U'vÿ:Z%7V'=!%è+:|''omdž#""9Zul''j?ew%ƪ9Vnl''|jeo##8S[))'|?'?o&)))}l'jo$Ś)))q@i&&ț`/)))yx''j%Ȼb//))))'''j%Ⱥ///))))''{$"&ȷ0///))))'¿&hs))%?????px( @)!19911!!))))119BBJRRZZ!B99Bckkks{{{{!!s)1sJJJRRRRRZZZZccccckkkksss{{{!!!!!1199!!))!!)))11199!))))))))111199!!))!!!9)91199199B9BZZccssJJRRRRZZBBBBRRZZZZcckks{{{ss)1119)))9111B9J)B1RJJBRJRRZRccc{{{{{{%!'')("$)%(('%%$%))%"')$'""$"'(()(%$)'(%) #)$'  $%))';@ $)()Ih  )'$6PpA8) 0Kf`NSadD(JYdFHTO{1WGHQOOzq''.KMFFNNOe)7c[5F_RNN`)'/Vg,,45FFH_)'(UC**,,4L:X@&V|@(:}}?+mv=>#9V~}n8?u(3JD75?(0` %1JJ1!sssƔքscRJJJR!{B9))JJJ眜ƽ֭Ɯ{JJJ!!!JRRRsss999BBB!!!c9)RRRƌν!!!Bkkksss{{{BBB999)))R!R999筭֔111sssZZZssssss{{{kkkkkkRRRBBB999!!!111)111cccBBBRΔ{{{{{{kkkkkkRRR111JJJBBB{{{999!sss{{{{{{sssJJJJJJZZZ{{{RRR)))cZ)))ֵkkkRRRccccccccckkk)))!!!cB)!)RRRJJJRRRZZZcccJJJBBB)))111ZB1s999ޭsssccccccssskkkkkkkkkBBB999999)))s)BƜ{{{{{{{{{JJJccc999s!ccc罽{{{kkkZZZBBB1J!!!Υ!!!ZZZ{{{ZZZ{!9BBZ1!!!RRRccc1111R111ֵZZZ)1111111ZZZ{{{BBBsB9RZkkZ1BBBsss)))sBBB޵JJJ)1RZ{skcR1BBBsss999)!!!JRZ{{skkcR1111RRR)JJJJJJkskkBB{{{sskcc{{sss111J!!!έkBJJR!!RRJJBBs{sskkk1119!!!9)9RZ!!JJRR99{{11RRR9k999sss{Zc99JJkkcc{{{)JRc!)RR111Z111cccBRJRRR99JJJ9B!!!k!!Zc99{BBBRRR1!!Rc)))J)))έ{Rc99JJRRR9!ccc!!!B!RRZ)))ޭ!!ks!!{ss))))))))R!!){{{{ss999ZRBBBkkk!!!)){{{{{{{skccJJJkkkƄs!))){{{ssssskk999ΌsssB!))1){{{ssssk99RRR{)kkk!)11BZss{ZZZZsssBB999ZZZZ!)111RcJJJJ))BBss{{9999BBB!)1111RZJJssJJ{BBZZssccc)))k1!19111ss))))ZZ{s111Rk{19911{{JJJJZZ{{JJJkc{9991RR))BB{{{{{BBB9999RZs99)9kkccJJkkk9ZscccΜ޽919JJ)))RRRccckkkkkksss{ccssBB999B{քcccBBB!!!֥kk999ck{Ƅ)))9cRBBc֥ZZsB999JBRZks111έ便c)))k9BJZcs{{{{)))Z9)19JRc!!!9!19B{{{JJ?????( @ )cZ9!999BΔ{k)))1JJJ)))!!!c9kkkƵRRRJRRR޵{{{sssRRRBBB)))!!!k)JJJZcccsssBBBJssskkkZZZ999999ZZZ999ckkk{{{cccRRRkkk{{{ZZZJ)))RRRRRRZZZJJJ)))!!!B)k{{{ssssss{{{ssscccJJJ99919111sssZZZ))){{{119RRZ{{{BBBJ9RRR))))1s9)))ZZZccc!kkk9!))kR)119ZZZ{{{RRRJccc!k9B{skZB)!!){{{111!111ZZZRJRBB!!{sk!!sJJJ!c119))!!1111{{J9BBB99Bc)1111))JJ)))s1)BR{{BBJJJ)BRRR99B)9cc99R{{{J)9))!!{{))111ZZZZ1)9B!!ZZZ)111sssZ!1B)1{cR!B!)9J)){{{sssJJJZZZcckk))9J)){{ssk{ZZZ9{{{B!11RZ!!RRkk11s99c)))RRZ!)11RR!!cc!!RRsZZJJJ)cccs{!9111ZZ!!JJJJ{{{ccc9k֭)B91ZZ!!ss99ZZ{cc))){cZZZZ1R)9ZZ11RRJJc!111kkkޥRcRR1J!!!9s{{{{BBB{99B{{ZZ1111)))){!!kkkJZk{999!B11BJ11BRss{{ss99BZZZ)9BRckkk{)JJJ1)9J999Z< ??(  @!!!{1sssƭBcccBBB111BBBsRRR{{{ZZZccck!Z{{{{{{RRR9sss11RRRR111!!!{!!J!)kB!!Bkkksss)ss{)1!!{RRJ999Z!)))))ssBBB9Zcs!!ccBBRRRk)9))Z9JRs)19{ssZZZ!19911BB!!R9R1))BB9999)))cBRc))!!k)))!k!!!s))1Z11kBBJJ))ks)9sssc!olsrd-0.6.6.2/gui/win32/Main/res/Frontend.rc2000066400000000000000000000006031234304727700204100ustar00rootroot00000000000000// // FRONTEND.RC2 - resources Microsoft Visual C++ does not edit directly // #ifdef APSTUDIO_INVOKED #error this file is not editable by Microsoft Visual C++ #endif //APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // Add manually edited resources here... ///////////////////////////////////////////////////////////////////////////// olsrd-0.6.6.2/gui/win32/Main/res/Tray1.ico000066400000000000000000000263561234304727700177320ustar00rootroot00000000000000006 h)(0` qqqоMMM  NNNǵLLL%%%VVVrrr:::AAA"""WWWͺ$$$mmmwwwxxxAAA>>>...???ĭ777rrr ZZZpppwwwxxxjjjkkkTTTFFF<<<###000333aaaȻEEE yyyzzzllllllTTT444IIIDDDyyy::: êwwwzzz}}}rrrMMMKKK___zzzSSS((((((ƧkkkUUUeeebbb```jjj---$$$òSSSIIIRRRZZZeeeKKKBBB...111;;;似ðsssaaaaaatttlllllllllGGG???999***ع{{{{{{~~~MMMeee>>> fff任}}}oooXXXDDD !!!Ѽ&&&___ĭ~~~XXX徾BXD1$$$VVVbbb333333ο___.4035111^^^{{{FFF8 QXljY6BBBttt¾/// DDDLLL (3SYxrlgV5BBBuuu===%%%ĩI U] ~ytnhbU3222PPPIIIIII  ltikFFxzvpiecyyvvv666 !!!Ǐj  @KJQ##UUOOFFv{wqmhh111$$$<  -:U^##OOUU88}x55SSS888tttx   ]g88OOjjddxxxK   Wc$(لRR222777ccc   BPKSPPҧ88JJJ%%%ϭi  #\f絭88CCCQQQ1  !Ubݙ,,,(((ҝ z  Ta89NNܙUUUeee%%%C  ! QU ,,,֒  $hq##ytt,,,+++R &)ʇ{{rr===@@@lll" $+-‹{|yz{zyroaaęOOOooo u$+/.}{yvsurrok:::pppG"(/0/…}{yvsrpn::ſSSSnnnݱ &/21FXuu}^^XXsrpDDԕ===]]]X#,332V`OOLLˆ**@@trxx;;;GGGι $*3653SXOOqqJJ}FF]]wtggg(((ͫ1'08765ss,,++]]ywη666iz79876ɅxxMMHH^^{yIIIez:980ʅUUΘ,,ǍCC}{{{{FFF<<>>͹666ϠΚҡ֧Dž+++|||+++Dz&&&ο}}}??????x( @ ???̳***MMM,,,""" lllãPPPRRR}}}wwwQQQFFF---!!! JJJaaaʱsssFFF«xxxhhh]]]>>>===___??? pppľbbbTTTlll~~~YYY...ϱSSSUUU```MMM000 zzzǹrrrsssyyyuuu```MMM>>>666ھttt^^^,,,ƽ4?5X^X|||GGG SSSۿ---.t1 ; +++[[[bbbghg= #)-jP*7<7]]]}}}VVV ddd÷"o >Hwm\C.'0'~~~000333ƿ[[[T JSBC''|rk'q'KKK ț3 1=*/!!3333 { BBB7C8a -1744 //NN(((͜3 )EP ܍||IIJJJTTTк8C:  .<ggه>> }}} K ,=+/##}}..000 ]]]3 *9@$$[[[444vvvZ"3E02~ ٥D"#*;L,-{yxwqwJJJ[[[_nb l)/;L,,{yuspx»\\\ ܫB%11U_"" QQhh00r::Ҕ,,,U[U ".53RW""``''UUu^^LLLcccv%=676YY''KKOOyfff ޔ+H94XX tt<>99(((Vg** $k$(((ƛ&&&-6-8m8AAOO+h+tttolsrd-0.6.6.2/gui/win32/Main/res/Tray2.ico000066400000000000000000000447261234304727700177340ustar00rootroot0000000000000000f h00 9hnF(0` !1199!!!)))111999BJBRZRZckkks{s{{BBBJJJBBZRRRZZZccckkksss{{{!1!!)11199!!))))99!!!)!!!)1!)99!!)1)9)91999BBBBkk{{ssBBJJBBJJZZRZZZJRRRRZZZRRRccc{{cckkss{{ss{{))11119!!99BJJJJJBRRRRZRRRZJJBZRcZccckkksssksk{c{s%ª ¿ !%  ! $%&  ¿ %"%%&$$! # &&$$! & %&&%"&!  $!###$ ÿ!!"#  ƪ%##%$$$ ê&&&# #ƪ&$" ª "&" ƪ !#  " "& ƿ % %  "% % ƿ &  ! # &%  ÿ $$ !&%# %   #& !%%! ! %  #%&&   %  # %% %ê "    " !   Ÿ &" % !# %   ž  ¿ ! $ !" %$ÿ !"" % """ !! $è !""& %$ "ž " !"""&$ #" ƪ"##"%$ # #% # !####  % ##### $ #% ƞ###" %" & ǥ##" & #$#Ǩ## # !#$$%Ǧ& " ¦#  ƨ ¿ & ¿& ¿ &??????x( @)!19911!!))))119BBJRRZZ!B99Bckkks{{{{!!s)1sJJJRRRRRZZZZccccckkkksss{{{!!!!!1199!!))!!)))11199!))))))))111199!!))!!!9)91199199B9BZZccssJJRRRRZZBBBBRRZZZZcckks{{{ss)1119)))9111B9J)B1RJJBRJRRZRccc{{{{{{ ! '"")("! !%(!)'$$()%"')$ ""%! )(()(%! ($ )$)!" !  $% % !! $)"% !'  ) $ !(%! ! !%" !!$" ! !"$ !$!$( "( ! '!" !%! %) !%" !! " $ "% !$ ( !'" ! !"'! !$% !$'! $ !$$)! ')! " ""%$(!)!' (!%$%%%( !% ' %(%$( !$( ( $(%( "(" ''  )!'"""! ' $'!|8?? ?( BZ!!B!!J11Rkks{{RRRZZZJRsZcsccckkksssss{{{{!!!99))1199!!)!)))!!))9919!))))9)1RRBBZZBBRRBBssss11))9RRcccJABA @G JICA GLNIGEA@ NOJ@ @EEBLONI EAOPL C OPNI @ FQPN @@ QROG  FJRQO G CSPF CPPJ @IL@  JC  AJ(0` qqqоMMM  NNNǵLLL%%%VVVqqq:::AAA"""WWWͺ$$$mmmvvvxxxAAA>>>...>>>ĭ777qqq ZZZpppvvvxxxjjjkkkTTTFFF<<<###000333aaaȻEEE yyyzzzllllllTTT444IIIDDDyyy::: êvvvzzz}}}qqqMMMKKK___zzzSSS((((((ƧkkkUUUeeebbb```jjj---$$$òSSSIIIRRRZZZeeeKKKBBB...111:::㼼ðsssaaaaaatttlllllllllGGG>>>888***ع{{{{{{}}}MMMeee>>> fff㻻}}}oooXXXDDD !!!Ѽ&&&___ĭ}}}XXX徾III$$$VVVbbb333333ο___LLLKKK111^^^{{{FFF111sss BBBttt¾/// DDDLLL111777XXXwww$$$""" BBBuuu===%%%ĩ555===BBB|||...%%%$$$"""!!!222PPPIIIIII 555;;;AAADDDeee$$$&&&$$$###!!!|||uuu666 !!!Ǐ(((888BBBFFFmmmooo444QQQyyytttaaa###$$$###!!! rrr111$$$777@@@FFF```}}}///444555666666SSSuuusssTTT%%%$$$LLLSSS888ttt///<<>>IIIUUUXXX$$$%%%$$$$$$$$$$$$$$$"""!!!)))vvvęOOOooo333EEESSSZZZZZZ%%%$$$$$$###"""###""""""!!! :::ppp@@@MMMZZZ[[[ZZZ&&&%%%$$$$$$###""""""!!!!!!PPPSSSnnnݱ;;;GGGWWW]]]\\\zzz'''&&&%%%uuuooo""""""!!!ZZZԕ===]]]&&&BBBSSS___^^^]]]yyyjjj''''''fffHHHZZZ"""""":::GGGιCCCMMM\\\aaa```___qqqkkk((('''eee%%%```sss###"""ggg(((ͫJJJHHHVVVcccbbbaaa```))))))(((LLL&&&IIIttt$$$###666ɔbbbdddcccbbbaaa***))))))hhh'''cccuuu$$$$$$III痗eeedddccc[[[******)))pppLLL___%%%$$${{{FFF<<<衡eeeddd]]]+++******)))|||'''&&&eeekkkaaa賳eee```,,,+++******))))))(((''''''fff+++SSSccciiinnnqqq謬---,,,+++******))))))(((''']]]888ըaaaBBB###山------,,,+++******))))))(((===Dz///MMMyyy))))))""">>>͹666+++|||+++Dz&&&ο}}}??????x( @ ???̳***MMM,,,""" lllãPPPRRR}}}vvvQQQFFF---!!! JJJaaaʱsssFFF«xxxhhh]]]>>>===___??? pppľbbbTTTlll~~~YYY...ϱSSSUUU```MMM000 yyyǹrrrsssyyyuuu```LLL>>>666پttt^^^,,,ƽ888ZZZ|||GGG SSSۿ---DDD+++[[[bbbgggFFFLLL  999]]]}}}VVV ddd÷)))@@@jjj)))### ***~~~000333ƿ[[[;;;HHHsssdddKKK>>>***!!!===JJJ ț"""666BBBbbbUUU777GGGOOOYYYRRR...555 BBB;;;&&&AAAUUU[[[222444MMM___888CCC^^^ppp(((͜999RRRppp777333BBB777888999jjjJJJTTTк<<<555FFFbbbBBB000222555777:::bbb }}}$$$AAAaaaSSS...000NNNGGG444666WWW000 ]]]888QQQaaa(((***,,,444555111333MMM[[[444vvv&&&GGGiiiQQQ%%%'''&&&(((***+++DDD ٥,,,DDDSSSoooKKK%%%$$$######"""%%%JJJ[[[eee111OOOZZZoooKKK%%%$$$###"""!!!666\\\ ܫFFF[[[\\\|||DDD---jjj}}}LLL"""RRRҔ,,,WWW???TTT```^^^qqq>>>DDDxxxFFFlll###qqqLLLccč___```bbbaaarrr)))IIIggg555hhh$$$fff ߴpppddd___ttt***DDDYYYrrr%%%ppp/// [[[www```uuu******QQQppp999;;;PPP444mmmѿooo,,,+++***)))(((::: '''Ѩ}}}HHH???oooWWWVVVPPPLLL222%%% mmmѵ::: 777666:::___œmmmMMM˱<<<|8?? ?(  sssƌ dddEEE444@@@TTTƼ{{{[[[aaaлzzzWWWrrr;;;SSS222###ӿ000OOO!!!///ooouuuvvv555]]]KKKDDD000ccc:::ֿ,,,VVV>>>ZZZYYYEEEAAAeeeHHHIII888666dddSSSڷ111[[[(((,,,///UUUZZZPPP]]]$$$###(((WWW᭭===]]]\\\UUU___BBByyyaaaNNN___ZZZRRR(((φOOO444???999(((ƛ&&&000GGGWWWkkk===tttolsrd-0.6.6.2/gui/win32/Main/resource.h000066400000000000000000000056041234304727700174360ustar00rootroot00000000000000#ifdef _WIN32 //{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by Frontend.rc // #define IDD_FRONTEND_DIALOG 102 #define IDP_SOCKETS_INIT_FAILED 103 #define IDR_MAINFRAME 128 #define IDD_DIALOG1 129 #define IDD_DIALOG2 130 #define IDD_DIALOG3 131 #define IDD_DIALOG4 132 #define IDI_ICON1 132 #define IDR_241 138 #define IDI_ICON3 141 #define IDR_TRAYMENU 141 #define IDI_ICON2 142 #define IDC_TAB1 1000 #define IDC_BUTTON1 1001 #define IDC_EDIT1 1003 #define IDC_BUTTON2 1004 #define IDC_EDIT2 1004 #define IDC_EDIT3 1005 #define IDC_BUTTON3 1006 #define IDC_EDIT4 1006 #define IDC_EDIT5 1007 #define IDC_LIST1 1008 #define IDC_SLIDER2 1009 #define IDC_TEXT1 1010 #define IDC_EDIT6 1011 #define IDC_EDIT7 1012 #define IDC_CHECK1 1013 #define IDC_CHECK2 1014 #define IDC_EDIT9 1015 #define IDC_CHECK3 1016 #define IDC_BUTTON4 1017 #define IDC_BUTTON5 1018 #define IDC_CHECK4 1019 #define IDC_EDIT10 1020 #define IDC_EDIT11 1021 #define IDC_EDIT8 1022 #define IDC_CHECK5 1022 #define IDC_EDIT12 1023 #define IDC_EDIT13 1024 #define IDC_LIST4 1025 #define IDC_LIST5 1026 #define IDC_EDIT15 1026 #define IDC_LIST6 1027 #define IDC_RADIO1 1029 #define IDC_RADIO2 1030 #define IDC_COMBO1 1031 #define IDC_COMBO3 1035 #define IDM_START 32773 #define IDM_STOP 32774 #define IDM_WINDOW 32775 #define IDM_SETTINGS 32776 #define IDM_OUTPUT 32777 #define IDM_EXIT 32778 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 143 #define _APS_NEXT_COMMAND_VALUE 32779 #define _APS_NEXT_CONTROL_VALUE 1036 #define _APS_NEXT_SYMED_VALUE 101 #endif /* APSTUDIO_READONLY_SYMBOLS */ #endif /* APSTUDIO_INVOKED */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Main/trustInfo.manifest000066400000000000000000000005341234304727700211600ustar00rootroot00000000000000 olsrd-0.6.6.2/gui/win32/Shim/000077500000000000000000000000001234304727700154455ustar00rootroot00000000000000olsrd-0.6.6.2/gui/win32/Shim/Shim.dsp000066400000000000000000000103651234304727700170620ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="Shim" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=Shim - Win32 Debug !MESSAGE Dies ist kein gltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und fhren Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "Shim.mak". !MESSAGE !MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "Shim.mak" CFG="Shim - Win32 Debug" !MESSAGE !MESSAGE Fr die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "Shim - Win32 Release" (basierend auf "Win32 (x86) Console Application") !MESSAGE "Shim - Win32 Debug" (basierend auf "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "Shim - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "Shim - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "Shim - Win32 Release" # Name "Shim - Win32 Debug" # Begin Group "Quellcodedateien" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\shim.c # End Source File # End Group # Begin Group "Header-Dateien" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Ressourcendateien" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project olsrd-0.6.6.2/gui/win32/Shim/Shim.vcproj000066400000000000000000000073731234304727700176040ustar00rootroot00000000000000 olsrd-0.6.6.2/gui/win32/Shim/shim.c000066400000000000000000000074331234304727700165600ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include int main(int argc, char *argv[]) { STARTUPINFO StartInfo; PROCESS_INFORMATION ProcInfo; int i; char *CmdLine; char *Walker; char NewCmdLine[MAX_PATH + 500]; HANDLE Handles[2]; unsigned long Res; int Quotes; Handles[0] = OpenEvent(EVENT_ALL_ACCESS, FALSE, "TheOlsrdShimEvent"); if (Handles[0] == NULL) { MessageBox(NULL, "Cannot open event.", "Shim Error", MB_ICONERROR | MB_OK); ExitProcess(1); } CmdLine = GetCommandLine(); Quotes = 0; while (*CmdLine != 0) { if (*CmdLine == '"') Quotes = !Quotes; else if (*CmdLine == ' ' && !Quotes) break; CmdLine++; } if (*CmdLine == 0) { MessageBox(NULL, "Missing arguments.", "Shim Error", MB_ICONERROR | MB_OK); ExitProcess(1); } GetModuleFileName(NULL, NewCmdLine, MAX_PATH); for (Walker = NewCmdLine; *Walker != 0; Walker++); while (*Walker != '\\') Walker--; Walker[1] = 'o'; Walker[2] = 'l'; Walker[3] = 's'; Walker[4] = 'r'; Walker[5] = 'd'; Walker[6] = '.'; Walker[7] = 'e'; Walker[8] = 'x'; Walker[9] = 'e'; Walker[10] = ' '; Walker += 11; while ((*Walker++ = *CmdLine++) != 0); for (i = 0; i < sizeof(STARTUPINFO); i++) ((char *)&StartInfo)[i] = 0; StartInfo.cb = sizeof(STARTUPINFO); if (!CreateProcess(NULL, NewCmdLine, NULL, NULL, TRUE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &StartInfo, &ProcInfo)) { MessageBox(NULL, "Cannot execute OLSR server.", "Shim Error", MB_ICONERROR | MB_OK); ExitProcess(1); } Handles[1] = ProcInfo.hProcess; Res = WaitForMultipleObjects(2, Handles, FALSE, INFINITE); if (Res == WAIT_OBJECT_0) { GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, ProcInfo.dwProcessId); WaitForSingleObject(ProcInfo.hProcess, INFINITE); } CloseHandle(ProcInfo.hThread); CloseHandle(ProcInfo.hProcess); ExitProcess(0); } #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/gui/win32/Switch.dsw000066400000000000000000000015211234304727700165240ustar00rootroot00000000000000Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELSCHT WERDEN! ############################################################################### Project: "Frontend"=".\Main\Frontend.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name Shim End Project Dependency }}} ############################################################################### Project: "Shim"=".\Shim\Shim.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### olsrd-0.6.6.2/gui/win32/Switch.sln000066400000000000000000000024251234304727700165270ustar00rootroot00000000000000 Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Shim", "Shim\Shim.vcproj", "{C09B8925-0F9C-4F88-9BAE-7D5EAD8159D3}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Main", "Main\Main.vcproj", "{01BB6810-46BB-4BE5-BCE3-96FF48F5DF1D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {C09B8925-0F9C-4F88-9BAE-7D5EAD8159D3}.Debug|Win32.ActiveCfg = Debug|Win32 {C09B8925-0F9C-4F88-9BAE-7D5EAD8159D3}.Debug|Win32.Build.0 = Debug|Win32 {C09B8925-0F9C-4F88-9BAE-7D5EAD8159D3}.Release|Win32.ActiveCfg = Release|Win32 {C09B8925-0F9C-4F88-9BAE-7D5EAD8159D3}.Release|Win32.Build.0 = Release|Win32 {01BB6810-46BB-4BE5-BCE3-96FF48F5DF1D}.Debug|Win32.ActiveCfg = Debug|Win32 {01BB6810-46BB-4BE5-BCE3-96FF48F5DF1D}.Debug|Win32.Build.0 = Debug|Win32 {01BB6810-46BB-4BE5-BCE3-96FF48F5DF1D}.Release|Win32.ActiveCfg = Release|Win32 {01BB6810-46BB-4BE5-BCE3-96FF48F5DF1D}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal olsrd-0.6.6.2/gui/win32/readme.txt000066400000000000000000000034411234304727700165450ustar00rootroot00000000000000Build the olsr.org Routing Daemon on Windows ============================================ Some remarks that may help you to build and run the olsr.org's routing daemon on Windows. You need the following softs to compile: - A Cygwin compiling environment. Download the Cygwin setup.exe from http://www.cygwin.com/ and install at least these packages: devel/bison, devel/flex, devel/gcc-mingw-g++ and devel/make - You need a running copy of MSVC. Either MSVC6 or MSVC8 may be supported. You also need the Microsoft Platform SDK installed. MSVC8 should be easy, while MSVC6 needs an older version: http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm It's OK to install the "Core SDK" and ignore other stuff. - Be sure to add the Microsoft SDK pathes to your MSVC-GUI-Pathes (Extras/Options/Pathes, Add Inlude and Lib at least) - To build the setup, Nullsoft's installer is required. Download: http://nsis.sourceforge.net/ You need the Cygwin suite up and running. Normally, the users home dir is not installed properly with this. Start the "bash" command line and check by entering "cd". If an error message shows up you can set a shortcut/link from c:\cygwin to c:\Docs+Settings, then go to Windows-SysCtl/System/Advanced/Envrionment and explicitly set the HOME=c:\Docs+Settings\[yourloginname]. Then try again to "cd". Then enter the olsrd's directory (either bash or cmd.exe will do). Start "make all libs". Should compile. Spits out olsrd.exe and some dll's for the plugins. For the GUI, you also need the linking lib to the olsrd_cfgparser.dll: "make gui/win32/Main/olsrd_cfgparser.lib" Then enter your favorite MSVC flavour and hit [F7]. After some prayers, you may be able to hack in the GUI changes you want... // Sven-Ola in Dec-2007 olsrd-0.6.6.2/ld-warnings000077500000000000000000000022131234304727700151700ustar00rootroot00000000000000#!/bin/sh # # We expect warning options for gcc as arguments and return the ones which are # accepted by the given gcc. # set -ue #set -vx # make sure we do not use some locale .... export LANG=C LC_ALL=C LC_COLLATE=C LC_CTYPE=C LC_MESSAGES=C LC_NUMERIC=C OPTS="" for param; do case "$param" in -[fWm]?*) OPTS="$OPTS $param";; *) echo "Ignoring $param" >&2 esac done testcompile() { $CC $OPTS -x c -o /dev/null - 2>&1 <<- EOF int main(void) { return 0; } EOF } parsetest() { while read error; do case "$error" in *ld:\ unrecognized\ *option\ \'*) opt="${error#*\'}" opt="${opt%\'*}" ;; *) continue ;; esac # if we come here, we have in $opt the option to remove. and # we remove all instances. And we save agoinst leading "-" NEW_OPTS="" for o in $OPTS; do case "$o" in -Wl,$opt) : echo "Removed $o" >&2;; *) NEW_OPTS="$NEW_OPTS $o";; esac done OPTS="$NEW_OPTS" done echo $OPTS } testcompile | parsetest exit 0 olsrd-0.6.6.2/lib/000077500000000000000000000000001234304727700135655ustar00rootroot00000000000000olsrd-0.6.6.2/lib/arprefresh/000077500000000000000000000000001234304727700157265ustar00rootroot00000000000000olsrd-0.6.6.2/lib/arprefresh/Makefile000066400000000000000000000045301234304727700173700ustar00rootroot00000000000000# The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # Arprefresh plugin Copyright (c) 2007, Sven-Ola-aet-gmx.de # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_arprefresh PLUGIN_VER = 0.1 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) olsrd-0.6.6.2/lib/arprefresh/README_ARPREFRESH000066400000000000000000000021301234304727700203230ustar00rootroot00000000000000--------------------------------------------------------------------- ARP REFRESH PLUGIN FOR OLSRD by Sven-Ola Tuecke --------------------------------------------------------------------- This plugin listens to all received UDP packets and maintains an internal list of MAC addresses extracted from these. By hitchhiking the set-route-function, the kernel ARP cache will be refreshed from this list if a direct-neighbor host route is configured. Result: no more ARP lookups if you use a larger routing chain - e.g. fetch a web site 8 olsr-hops away does not show the typical 8-nodes-need to ARP first delay. --------------------------------------------------------------------- PLUGIN PARAMETERS (PlParam) --------------------------------------------------------------------- None. --------------------------------------------------------------------- SAMPLE CONFIG --------------------------------------------------------------------- add in /etc/olsrd.conf: LoadPlugin "arprefresh.so.0.1" { } --------------------------------------------------------------------- EOF / 2007-AUG-02 olsrd-0.6.6.2/lib/arprefresh/src/000077500000000000000000000000001234304727700165155ustar00rootroot00000000000000olsrd-0.6.6.2/lib/arprefresh/src/olsrd_arprefresh.c000066400000000000000000000212501234304727700222250ustar00rootroot00000000000000 /* * Copyright (c) 2007, Sven-Ola Tuecke * Copyright (c) 2004, Andreas Tonnesen(andreto-at-olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the UniK olsr daemon nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * Plugin to refresh the local ARP cache from received OLSR broadcasts. * * Note: this code does not work with IPv6 and not with VLANs (on IPv4 or IPv6) */ #include #include #include #include #include #include #include #include #ifndef __ANDROID__ #include #endif /* __ANDROID__ */ #include #include #include #include #include #include #include "olsrd_arprefresh.h" #include "kernel_routes.h" #include "scheduler.h" #undef ARPREFRESH_DEBUG #define PLUGIN_INTERFACE_VERSION 5 /**************************************************************************** * Functions that the plugin MUST provide * ****************************************************************************/ /** * Plugin interface version * Used by main olsrd to check plugin interface version */ int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } static const struct olsrd_plugin_parameters plugin_parameters[] = { }; void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = sizeof(plugin_parameters) / sizeof(*plugin_parameters); } typedef struct { struct ethhdr eth; struct iphdr ip; struct udphdr udp; } __attribute__ ((packed)) arprefresh_buf; static int arprefresh_sockfd = -1; static const int arprefresh_portnum = 698; /** * Scheduled event to fetch gathered packets and update the ARP cache * called from olsrd main thread */ static void olsr_arp_event(void *foo __attribute__ ((unused))) { if (0 <= arprefresh_sockfd) { arprefresh_buf buf; struct sockaddr_ll from; socklen_t fromlen = sizeof(from); /* * Grab a single snapshot on the packet socket. This only works * if not too much IP traffic is currently flowing through. */ ssize_t size = recvfrom(arprefresh_sockfd, &buf, sizeof(buf), MSG_TRUNC, (struct sockaddr *)&from, &fromlen); if (0 <= size && size >= (ssize_t) sizeof(buf)) { union { struct arpreq arp; struct sockaddr_in in_pa; struct sockaddr_in6 in_pa6; } req; memset(&req, 0, sizeof(req)); req.in_pa.sin_family = AF_INET; memcpy(&req.in_pa.sin_addr, &buf.ip.saddr, sizeof(buf.ip.saddr)); req.arp.arp_ha.sa_family = AF_LOCAL; memcpy(&req.arp.arp_ha.sa_data, &buf.eth.h_source, sizeof(buf.eth.h_source)); req.arp.arp_flags = ATF_COM; if_indextoname(from.sll_ifindex, req.arp.arp_dev); #ifdef ARPREFRESH_DEBUG { int i; OLSR_PRINTF(0, "Refresh on %s, %s=", req.arp.arp_dev, inet_ntoa(*((struct in_addr *)&buf.ip.saddr))); for (i = 0; i < (ssize_t) sizeof(buf.eth.h_source); i++) { OLSR_PRINTF(0, "%02x%s", ((unsigned char *)&buf.eth.h_source)[i], i < (ssize_t) sizeof(buf.eth.h_source) - 1 ? ":" : "\n"); } } #endif /* ARPREFRESH_DEBUG */ if (ioctl(arprefresh_sockfd, SIOCSARP, &req) < 0) { OLSR_PRINTF(1, "*** ARPREFRESH: SIOCSARP: %s\n", strerror(errno)); close(arprefresh_sockfd); arprefresh_sockfd = -1; return; } } } } /** * Initialize plugin * Called after all parameters are passed */ int olsrd_plugin_init(void) { int ret = 0; if (AF_INET == olsr_cnf->ip_version) { int flags; struct sock_fprog filter; struct sock_filter BPF_code[] = { /* tcpdump -s [sizeof(arprefresh_buf)] -ni lo udp and dst port [arprefresh_portnum] -dd */ /* Note: This program assumes NON-VLAN */ /* See also http://www.unix.com/man-page/FreeBSD/4/bpf/ */ /* code jump-true jump-false generic-multiuse-field */ {BPF_LD | BPF_H | BPF_ABS , 0, 0, 0x0000000c}, // 0x28: A <- P[k:2], get 2-bytes from offset 0x0c : get Ethernet type /* test4 */ {BPF_JMP | BPF_JEQ | BPF_K , 0, 8, 0x00000800}, // 0x15: pc += (A == k) ? ipv4 : ignore : IPv4? /* ipv4 */ {BPF_LD | BPF_B | BPF_ABS , 0, 0, 0x00000017}, // 0x30: A <- P[k:1], get 1-byte from offset 0x17 : get IPv4 protocol {BPF_JMP | BPF_JEQ | BPF_K , 0, 6, 0x00000011}, // 0x15: pc += (A == k) ? udp4 : ignore : UDP? /* udp4 */ {BPF_LD | BPF_H | BPF_ABS , 0, 0, 0x00000014}, // 0x28: A <- P[k:2], get 2-bytes from offset 0x14 : get fragment offset {BPF_JMP | BPF_JSET | BPF_K , 4, 0, 0x00001fff}, // 0x45: pc += (A & k) ? ignore : nofrag : is this a fragment? /* nofrag */ {BPF_LDX | BPF_B | BPF_MSH , 0, 0, 0x0000000e}, // 0xb1: X <- 4*(P[k:1]&0xf) : get the IP header length in bytes {BPF_LD | BPF_H | BPF_IND , 0, 0, 0x00000010}, // 0x48: A <- P[X+k:2] : get UDP destination port {BPF_JMP | BPF_JEQ | BPF_K , 0, 1, arprefresh_portnum}, // 0x15: pc += (A == k) ? ok : ignore : sent to port arprefresh_portnum? /* ok */ {BPF_RET | BPF_K , 0, 0, sizeof(arprefresh_buf)}, // : accept sizeof(arprefresh_buf) bytes (all headers) /* ignore */ {BPF_RET | BPF_K , 0, 0, 0x00000000} // : accept 0 bytes }; filter.len = ARRAYSIZE(BPF_code); filter.filter = BPF_code; if (0 <= (arprefresh_sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) && 0 <= (flags = fcntl(arprefresh_sockfd, F_GETFL)) && 0 <= fcntl(arprefresh_sockfd, F_SETFL, flags | O_NONBLOCK) && 0 <= setsockopt(arprefresh_sockfd, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter))) { /* Register the ARP refresh event */ olsr_start_timer(2 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, &olsr_arp_event, NULL, 0); ret = 1; } else { OLSR_PRINTF(1, "*** ARPREFRESH: Cannot create non-blocking filtering packet socket: %s\n", strerror(errno)); } } else { OLSR_PRINTF(1, "*** ARPREFRESH: IPv6 not supported\n"); } return ret; } /**************************************************************************** * Optional private constructor and destructor functions * ****************************************************************************/ static void __attribute__ ((constructor)) my_init(void); static void __attribute__ ((destructor)) my_fini(void); static void my_init(void) { printf("OLSRD arprefresh plugin by Sven-Ola\n"); } /** * Optional Private Destructor */ static void my_fini(void) { if (0 <= arprefresh_sockfd) { close(arprefresh_sockfd); arprefresh_sockfd = -1; } } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/arprefresh/src/olsrd_arprefresh.h000066400000000000000000000040221234304727700222300ustar00rootroot00000000000000 /* * Copyright (c) 2007, Sven-Ola Tuecke * Copyright (c) 2004, Andreas Tonnesen(andreto-at-olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the UniK olsr daemon nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef _OLSRD_ARPREFRESH #define _OLSRD_ARPREFRESH #include "olsr_types.h" #include "olsrd_plugin.h" #include "plugin_util.h" int olsrd_plugin_init(void); void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size); int olsrd_plugin_interface_version(void); #endif /* _OLSRD_ARPREFRESH */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/arprefresh/version-script.txt000066400000000000000000000002051234304727700214530ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/bmf/000077500000000000000000000000001234304727700143315ustar00rootroot00000000000000olsrd-0.6.6.2/lib/bmf/Makefile000066400000000000000000000044031234304727700157720ustar00rootroot00000000000000# # OLSR Basic Multicast Forwarding (BMF) plugin. # Copyright (c) 2005, 2006, Thales Communications, Huizen, The Netherlands. # Written by Erik Tromp. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of Thales, BMF nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_bmf PLUGIN_VER = 1.7.0 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc ifeq ($(OS),$(filter $(OS),linux android)) default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) else default_target install clean: @echo "*** BMF Plugin only supported on Linux and Android, sorry!" endif olsrd-0.6.6.2/lib/bmf/README_BMF000066400000000000000000000767701234304727700157160ustar00rootroot00000000000000BASIC MULTICAST FORWARDING PLUGIN FOR OLSRD by Erik Tromp (eriktromp@users.sourceforge.net, erik_tromp@hotmail.com) Version 1.7.0 1. Introduction --------------- The Basic Multicast Forwarding Plugin floods IP-multicast and IP-local-broadcast traffic over an OLSRD network. It uses the Multi-Point Relays (MPRs) as identified by the OLSR protocol to optimize the flooding of multicast and local broadcast packets to all the hosts in the network. To prevent broadcast storms, a history of packets is kept; only packets that have not been seen in the past 3-6 seconds are forwarded. 2. How to build and install --------------------------- Download the olsr-bmf-v1.7.0.tar.gz file and save it into your OLSRD base install directory. Change directory (cd) to your OLSRD base install directory. At the command prompt, type: tar -zxvf ./olsr-bmf-v1.7.0.tar.gz then type: make build_all followed by: make install_all Next, turn on the possibility to create a tuntap interface (see also /usr/src/linux/Documentation/networking/tuntap.txt): mkdir /dev/net # if it doesn't exist already mknod /dev/net/tun c 10 200 Set permissions, e.g.: chmod 0700 /dev/net/tun To configure BMF in OLSR, you must edit the file /etc/olsrd.conf to load the BMF plugin. For example, add the following lines: LoadPlugin "olsrd_bmf.so.1.7.0" { # No PlParam entries required for basic operation } 3. How to run ------------- After building and installing OLSRD with the BMF plugin, run the olsrd daemon by entering at the shell prompt: olsrd Look at the output; it should list the BMF plugin, e.g.: ---------- LOADING LIBRARY olsrd_bmf.so.1.7.0 ---------- OLSRD Basic Multicast Forwarding (BMF) plugin 1.7.0 (Mar 22 2010 21:44:23) (C) Thales Communications Huizen, Netherlands Erik Tromp (eriktromp@users.sourceforge.net) Checking plugin interface version: 5 - OK Trying to fetch plugin init function: OK Trying to fetch parameter table and it's size... Sending parameters... "NonOlsrIf"/"eth4"... NonOlsrIf: OK Running plugin_init function... OLSRD Basic Multicast Forwarding (BMF) plugin: opened 5 sockets ---------- LIBRARY olsrd_bmf.so.1.7.0 LOADED ---------- 4. How to check if it works --------------------------- Enter the following command on the command prompt: ping 224.0.0.1 All OLSR-BMF hosts in the OLSR network should respond. For example, assume we have three hosts, with IP addresses 192.168.151.50, 192.168.151.53 and 192.168.151.55. On host 192.168.151.50 we enter the following ping command: root@IsdbServer:~# ping 224.0.0.1 PING 224.0.0.1 (224.0.0.1) 56(84) bytes of data. 64 bytes from 192.168.151.50: icmp_seq=1 ttl=64 time=0.511 ms 64 bytes from 192.168.151.53: icmp_seq=1 ttl=64 time=4.67 ms (DUP!) 64 bytes from 192.168.151.55: icmp_seq=1 ttl=63 time=10.7 ms (DUP!) 64 bytes from 192.168.151.50: icmp_seq=2 ttl=64 time=0.076 ms 64 bytes from 192.168.151.53: icmp_seq=2 ttl=64 time=1.23 ms (DUP!) 64 bytes from 192.168.151.55: icmp_seq=2 ttl=63 time=1.23 ms (DUP!) 64 bytes from 192.168.151.50: icmp_seq=3 ttl=64 time=0.059 ms 64 bytes from 192.168.151.53: icmp_seq=3 ttl=64 time=2.94 ms (DUP!) 64 bytes from 192.168.151.55: icmp_seq=3 ttl=63 time=5.62 ms (DUP!) 64 bytes from 192.168.151.50: icmp_seq=4 ttl=64 time=0.158 ms 64 bytes from 192.168.151.53: icmp_seq=4 ttl=64 time=1.14 ms (DUP!) 64 bytes from 192.168.151.55: icmp_seq=4 ttl=63 time=1.16 ms (DUP!) We can see the response from the originating host (192.168.151.50) (it is normal behaviour for hosts sending multicast packets to receive their own packets). We can also see the responses by the other hosts (correctly seen as DUPlicates by ping). Note: when using an older version of ping than the standard from iputils-20020927, as found in most current Linux distributions, you may want to test BMF by specifying the output interface to the ping command: ping -I bmf0 224.0.0.1 Older versions of 'ping' (e.g. as found in iputils-20020124) may bind to the autoselected source address, which may be incorrect. Since BMF re-uses one of the existing IP addresses for the "bmf0" network interface, the older-version ping command may 'autobind' to the wrong interface. See also the note in the iputils-20020927/RELNOTES file: "* Mads Martin Jrgensen : ping should not bind to autoselected source address, it used to work when routing changes. Return classic behaviour, option -B is added to enforce binding." 5. How does it work ------------------- In the IP header there is room for only two IP-addresses: * the destination IP address (in our case either a multicast IP-address 224.0.0.0...239.255.255.255, or a local broadcast address e.g. 192.168.1.255), and * the source IP address (the originator). For optimized flooding, however, we need more information. Let's assume we are the BMF process on one host. We will need to know which host forwarded the IP packet to us. Since OLSR keeps track of which hosts select our host as MPR (see the olsr_lookup_mprs_set(...) function), we can determine if the host that forwarded the packet, has selected us as MPR. If so, we must also forward the packet, changing the 'forwarded-by' IP-address to that of us. If not, we do not forward the packet. Because we need more information than fits in a normal IP-header, the original packets are encapsulated into a new IP packet. Encapsulated packets are transported in UDP, port 50698. The source address of the encapsulation packet is set to the address of the forwarder instead of the originator. Of course, the payload of the encapsulation packet is the original IP packet. For an exact specification of the encapsulation format, refer to paragraph 10 below. For local reception, each received encapsulated packets is unpacked and passed into a tuntap interface which is specially created for this purpose. There are other flooding solutions available that do not use encapsulation. The problem with these solutions is that they cannot prevent duplicates of forwarded packets to enter the IP stack. For example, if a host is receiving flooded (unencapsulated, native IP) packets via two MPR hosts, there is no way to stop the reception of the packets coming in via the second MPR host. To prevent this, BMF uses a combination of encapsulated flooding and local reception via a tuntap interface. Here is in short how the flooding works (see also the BmfEncapsulatedPacketReceived(...) function; details with respect to the forwarding towards non-OLSR enabled hosts are omitted): On all OLSR-enabled interfaces, setup reception of packets on UDP port 50698. Upon reception of such a packet: If the received packet was sent by myself, drop it. If the packet was recently seen, drop it. Unpack the encapsulated packet and send a copy to myself via the TunTap interface. If I am an MPR for the host that forwarded the packet to me, forward the packet to all OLSR-enabled interfaces *including* the interface on which it was received. 6. Advanced configuration ------------------------- All configuration of BMF is done via the "LoadPlugin" section in the /etc/olsrd.conf file. The following gives an overview of all plugin parameters that can be configured. Unless otherwise stated, settings may differ for each node in the network. LoadPlugin "olsrd_bmf.so.1.7.0" { # Specify the name of the BMF network interface. # Defaults to "bmf0". PlParam "BmfInterface" "bmf0" # Specify the IP address and mask for the BMF network interface. # By default, the IP address of the first OLSR interface is copied. # The default prefix length is 32. PlParam "BmfInterfaceIp" "10.10.10.234/24" # Enable or disable marking the BMF network interface as persistent. # When the interface is persistent (default) then it will not be removed # when olsrd shuts down. This is to facilitate other programs (for example # multicast routing daemon mrouted) to continue using it. PlParam "BmfInterfacePersistent" "yes" # Enable or disable the flooding of local broadcast packets # (e.g. packets with IP destination 192.168.1.255). Either "yes" # or "no". Defaults to "yes". # Note: all nodes in the same network should have the same setting for # this plugin parameter. PlParam "DoLocalBroadcast" "yes" # Enable or disable the capturing packets on the OLSR-enabled # interfaces (in promiscuous mode). Either "yes" or "no". Defaults # to "no". # The multicast (and, if configured, local broadcast) packets sent on # the non-OLSR network interfaces and on the BMF network interface will # always be flooded over the OLSR network. # If this parameter is "yes", also the packets sent on the OLSR-enabled # network interfaces will be flooded over the OLSR network. # NOTE: This parameter should be set consistently on all hosts throughout # the network. If not, hosts may receive multicast packets in duplicate. PlParam "CapturePacketsOnOlsrInterfaces" "no" # The forwarding mechanism to use. Either "Broadcast" or # "UnicastPromiscuous". Defaults to "Broadcast". # In the "UnicastPromiscuous" mode, packets are forwarded (unicast) to the # best candidate neighbor; other neighbors listen promiscuously. IP-local # broadcast is not used. This saves air time on 802.11 WLAN networks, # on which unicast packets are usually sent at a much higher bit rate # than broadcast packets (which are sent at a basic bit rate). # Note: all nodes in the same network should have the same setting for # this plugin parameter. PlParam "BmfMechanism" "Broadcast" # The number of times BMF will transmit the same packet whenever it decides # to use broadcast to forward a packet. Defaults to 1. Not used if # "BmfMechanism" is set to "UnicastPromiscuous". PlParam "BroadcastRetransmitCount" "1" # If the number of neighbors to forward to is less than or equal to the # FanOutLimit, then packets to be relayed will be sent via unicast. # If the number is greater than the FanOutLimit the packet goes out # as broadcast. Legal values are 0...10. See MAX_UNICAST_NEIGHBORS # as defined in NetworkInterfaces.h . 0 means broadcast is always used, # even if there is only 1 neighbor to forward to. Defaults to 2. # This plugin parameter is not used if "BmfMechanism" is set to # "UnicastPromiscuous". PlParam "FanOutLimit" "2" # List of non-OLSR interfaces to include PlParam "NonOlsrIf" "eth2" PlParam "NonOlsrIf" "eth3" } BmfInterfaceIp -------------- By default, the BMF network interface will get the IP address of the first OLSR interface, with a prefix length of 32. Having two network interfaces with the same IP address may seem strange, but it is not a problem, since the BMF network interface is not used in any point-to- point routing. The advantage of assigning a known OLSR IP address to the BMF network interface is that multicast packets, sent via the BMF network interface, get a known IP source address, to which the receivers of the packets can reply. That is useful when using, for example, the command "ping 224.0.0.1". An advantage of using a prefix length of 32 is that the Linux IP stack will not automatically enter a subnet routing entry (via the BMF network interface) into the kernel routing table. Such a routing entry would be useless, because the BMF network interface does not forward point-to-point traffic. If you configure a specific IP address and mask via the "BmfInterfaceIp" parameter, BMF will cause the specified IP host address to be advertised into the OLSR network via the HNA mechanism, so that the other hosts in the network know how to route back. CapturePacketsOnOlsrInterfaces ------------------------------ If "CapturePacketsOnOlsrInterfaces" is set to "yes", any multicast or local broadcast IP packet, sent by an application on *any* OLSR interface, will be flooded over the OLSR network. Each OLSR host will receive the packet on its BMF network interface, "bmf0". The OLSR-interfaces will be in promiscuous mode to capture the multicast or local broadcast packets. For example, if "eth1" is an OLSR interface, the following command will result in one response from each OLSR host in the network: ping -I eth1 224.0.0.1 A disadvantage of this configuration is that a host may, in rare cases, receive a multicast packet twice. This is best explained by looking at the following network diagram: eth0 eth0 A ----------- B eth1 | / eth1 | / eth0 | / C --------+ eth1 Suppose host A is running a ping session that is sending ping packets on "eth1". The BMF process on host A will see the outgoing packets on "eth1", encapsulates these packets and sends the encapsulated packets on "eth0". Let's assume we are using the link quality extensions of OLSR, and the 2-hop path A - B - C is better (in terms of ETX) than the 1-hop path A - C. In that case host B is an MPR for host A. Host B receives the encapsulated packets of host A on its "eth0" interface, and, since it is an MPR, it decides to forward them on "eth1". In most cases, host C will receive the original, unencapsulated ping packet on its "eth0" interface before the encapsulated ping packet from host B arrives on its "eth1" interface. When the encapsulated packet from B arrives, the BMF process will then see that it is a duplicate and discard it. However, in the IP world, there are no guarantees, so it may happen that host C receives the encapsulated packet from host B first. That packet is then unpacked and locally delivered to the BMF network interface "bmf0". When the original, unencapsulated packet then comes in on "eth0", there is no way to stop it from being received (for a second time) by the Linux IP stack. As said, this may be a rare case. Besides, most applications can deal with a duplicate reception of the same packet. But if you're a purist and want everything to work correct, you should leave "CapturePacketsOnOlsrInterfaces" to its default value "no". A disadvantage of leaving "CapturePacketsOnOlsrInterfaces" to its default value "no" is that all multicast traffic must go via the BMF network interface "bmf0". However, this should not be a problem, since a route to all multicast addresses via the BMF network interface "bmf0" is automatically added when BMF is started. 7. Adding non-OLSR interfaces to the multicast flooding ------------------------------------------------------- As a special feature, it is possible to also forward from and to non-OLSR interfaces. If you have network interfaces on which OLSR is *not* running, but you *do* want to forward multicast and local-broadcast IP packets, specify these interfaces one by one as "NonOlsrIf" parameters in the BMF plugin section of /etc/olsrd.conf. For example: LoadPlugin "olsrd_bmf.so.1.7.0" { # Non-OLSR interfaces to participate in the multicast flooding PlParam "NonOlsrIf" "eth2" PlParam "NonOlsrIf" "eth3" } If an interface is listed both as "NonOlsrIf" for BMF, and in the Interfaces { ... } section of olsrd.conf, it will be seen by BMF as an OLSR-enabled interface. 8. Interworking with other multicast routers -------------------------------------------- In a typical interworking configuration there is a network of OLSR hosts in which one host acts as a gateway to a fixed infrastructure network. Usually that host will be advertising a default route via the HNA mechanism, e.g. by adding the following lines to its /etc/olsrd.conf file: Hna4 { # Internet gateway: 0.0.0.0 0.0.0.0 } Alternatively, the gateway is running OLSRDs dynamic internet gateway plugin; read the file ../../lib/dyn_gw/README_DYN_GW . The gateway host will usually have at least one OLSR-interface, and at least one non-OLSR interface, running a third-party routing protocol like OSPF. It is beyond the scope of this document to deal with the interworking between BMF and all possible multicast routing daemons. As an example, let's assume the gateway is running the mrouted multicast daemon (which implements the DVMRP protocol). Also, assume that all the IP addresses in the OLSR network are within the IP subnet 10.0.0.0/8 . Then mrouted on the gateway needs to be configured to accept IGMP requests from IP clients within the 10.0.0.0/8 subnet on the BMF network interface ("bmf0"). This is easily configured by adding a line to the /etc/mrouted.conf configuration file: phyint bmf0 altnet 10.0.0.0/8 Not strictly necessary, but clean, is to disable the DVMRP protocol on the OLSR interfaces, as no DVMRP routers are expected inside the OLSR network. Suppose the gateway is running OLSR on "eth1", then add the following line /etc/mrouted.conf : phyint eth1 disable Finally, mrouted does not accept interfaces with prefix length 32. Therefore, override the default IP address and prefix length of the BMF network interface, by editing the /etc/olsrd.conf file. For example: LoadPlugin "olsrd_bmf.so.1.7.0" { PlParam "BmfInterfaceIp" "10.10.10.4/24" } Note that it is not necessary, and even incorrect, to pass the non-OLSR interface to BMF as a "NonOlsrIf" parameter in the "LoadPlugin" section of the gateway host. When the mrouted multicast daemon is running, the forwarding of multicast traffic between the OLSR interface and the non-OLSR interface is done by the Linux kernel. The remaining text in this section has nothing to do with BMF or OLSR, but is added to give a number of helpful hints you might need when your multicast interworking, for some reason, is not working. When using the mrouted multicast daemon, there is a useful command, mrinfo, that gives information about what mrouted thinks of its neighbor hosts. For example: root@node-4:/# mrinfo 127.0.0.1 (localhost.localdomain) [DVMRPv3 compliant]: 10.1.2.4 -> 10.1.2.2 (10.1.2.2) [1/1/querier] 10.0.6.4 -> 0.0.0.0 (local) [1/1/disabled] 10.255.255.253 -> 0.0.0.0 (local) [1/1/querier/leaf] In this example, the line starting with "10.1.2.4" is for the non-OLSR interface "eth0", on which mrouted has found an mrouted-neighbor host "10.1.2.2". The next line is for the OLSR interface "eth1", which is disabled for mrouted. The last line is for the BMF interface "bmf0". It is clear that mrouted sees no mrouted-neighbors on that interface (leaf). To see what multicast traffic has flown through the gateway, view the files /proc/net/ip_mr_vif and /proc/net/ip_mr_cache: root@node-4:/# cat /proc/net/ip_mr_vif Interface BytesIn PktsIn BytesOut PktsOut Flags Local Remote 0 eth0 27832 98 14200 50 00000 0402010A 00000000 2 bmf0 14484 51 13916 49 00000 FDFFFF0A 00000000 root@node-4:/# cat /proc/net/ip_mr_cache Group Origin Iif Pkts Bytes Wrong Oifs 4D4237EA C747010A 0 51 14484 0 2:1 4D4237EA C702010A 0 51 14484 0 2:1 4D4237EA C84C000A 2 53 15052 0 0:1 From the above we can deduce that traffic from input interface 0 (Iif 0, "eth0") is forwarded on output interface 2 (Oifs 2, = "bmf0"), and traffic from input interface 2 (Iif 2, "bmf0") is forwarded on output interface 0 (Oifs 0, "eth0"). The ":1" behind the Oifs numbers indicates the TTL thresholds, in this case packets with TTL value 1 or less will not be forwarded. Note that when you are connecting an OLSR-BMF network to another multicast network (e.g. a DVMRP-mrouted network), you might be surprised that, when you ping the all-routers multicast address 224.0.0.1 from within the OLSR network, only the OLSR hosts respond. This is, however, compliant behaviour: packets with their destination IP address in the range 224.0.0.0 - 224.0.0.255 are not routed by normal multicast protocols (i.e. their TTL is implicitly assumed to be 1). It doesn't mean that multicast is not working; if your application uses a multicast address outisde the range 224.0.0.0 - 224.0.0.255, it should work. 9. Common problems, FAQ ------------------------ --------- Question: On which platforms does BMF currently compile? Answer: Only on Linux. No compilation on Windows (yet). The oldest Linux kernel on which the BMF plugin was tested was version 2.4.18. --------- Question: When starting OLSRD with the BMF plugin, I can see the following error message: OLSRD Basic Multicast Forwarding (BMF) plugin: error opening /dev/net/tun: No such file or directory Wat to do? Answer: Turn on the possibility to create a tuntap interface; see section 2 of this file. --------- Question: When starting OLSRD with the BMF plugin, I can see the following error message: OLSRD Basic Multicast Forwarding (BMF) plugin: error opening /dev/net/tun: No such device Wat to do? Answer: First, turn on the possibility to create a tuntap interface; see section 2 of this file. Check if the device is there: ~ # ls -l /dev/net/tun crw------- 1 root root 10, 200 Sep 9 2006 /dev/net/tun If the device is there, but the error message remains to appear, the tap/tun device is not compiled in your kernel. Try the command: modprobe tun If "modprobe tun" says something like "modprobe: Can't locate module tun", then either it is not compiled at all or it is not compiled into the kernel. Note: if you do not want to receive multicast packets, only forward the packets that other hosts send, then you do not need the tuntap interface. This could be the case if your host is purely an OLSR router; normally no traffic will be directed to the router itself. In that case you can ignore this error message. Beware, though, that you will then not be able to do the simple 'ping 224.0.0.1' test (as described in section 4. How to check if it works) to check for the presence of all OLSR-BMF routers in the network. --------- Question: I have enabled BMF, but my multicast application is not receiving any multicast packets. Answer: Many multicast applications must be configured to listen to a specific network interface. Make sure that your multicast application is listening on the BMF network interface, either by specifying the interface name itself (e.g. "bmf0") or by specifying its IP address. 10. Version history ------------------- 21 March 2010: Version 1.7.0 * Ported 1.6.2 back into OLSRd for 0.5.7.0 release: the BMF functions are registered with OLSR so that a separate thread for BMF to run in is no longer necessary. This also removes the need for a mutex to guarantee safe access to OLSR data. Done by Henning Rogge . * Code Cleanup: duplicate code moved to separate functions 'ForwardPacket (...)' and 'EncapsulateAndForwardPacket (...)' * Prevent the calling of 'sendto' when that would lead to blocking the thread --> thanks to Daniele Lacamera for finding and solving this issue. * Changed the legal range of the 'FanOutLimit' plugin parameter from 1...10 to 0...10 . 23 November 2008: Version 1.6.2 * Fixed a bug that prevented the route for multicast traffic to be updated when a network interface was added at runtime --> thanks to Daniele Lacamera for finding and solving this bug. 22 July 2008: Version 1.6.1 * Introduced a mutex for safe access to the OLSR data by the BMF thread. 4 July 2008: Version 1.6 * Fixed a bug in the CreateInterface() function: missing initialization of newIf->next to NULL. 24 February 2008: Version 1.5.3 * Fixed a bug so that dying or dead end edges are not taken into account. As of OLSRd version 0.5.4 , stale TC entries are not cleaned up, but marked with a flag OLSR_TC_EDGE_DOWN. This flag was not taken into account by BMF. 7 December 2007: Version 1.5.2 * Fixed a bug that would cause BMF to always send encapsulated broadcast packets twice --> thanks to Frank Renwick and Joseph Giovatto for finding this bug :-) * Added the plugin parameters "BroadcastRetransmitCount" and "FanOutLimit"; thanks to Frank and Joe for the idea. 3 September 2007: Version 1.5.1 * Fixed a bug that would cause BMF to crash (and OLSR with it) if a link was timing out --> thanks to Frank Renwick * Fixed bug in the checking of the packet length --> thanks to Frank Renwick * Fixed a bug in shutdown, which cause a crash if the BMF thread was not yet running --> thanks to Bernd Petrovitsch * Updated to OLSR plugin interface version 5. 16 May 2007: Version 1.5 * Improved packet history list to take into account the full 32 bits of the packet fingerprint. Previous versions derived a 16-bits value from the 32-bits packet fingerprint and used that 16-bits value to determine packet unicity. In situations with high packet rates (e.g. multicast video), this leads to packets being incorrectly seen as duplicates of other, previously received packets. * New encapsulation format. In previous versions, a complete Ethernet frame was encapsulated. This is unnecessary, and not very clean; e.g. from packets coming in on non-Ethernet media such as PPP, the data in the Ethernet header is bogus. The new encapsulation format encapsulates only the IP packet. An outer IP header [1], UDP header [2] and BMF Encapsulation Header are inserted before the datagram's existing IP header, as follows: +---------------------------+ | | | Outer IP Header | +---------------------------+ | | | UDP Header | +---------------------------+ | BMF Encapsulation | | Header | +---------------------------+ +---------------------------+ | | | | | IP Header | | IP Header | +---------------------------+ ====> +---------------------------+ | | | | | IP Payload | | IP Payload | | | | | | | | | +---------------------------+ +---------------------------+ The BMF encapsulation header has a typical type-length-value (TLV) format: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Length | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Packet fingerprint | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Type 1 Length 6. Length in bytes of this extension, not including the Type and Length bytes. Reserved Reserved for future use. MUST be set to 0 on sending, MUST be verified as 0 on receipt; otherwise the extension must be handled as not understood and silently skipped. Packet fingerprint 32-bits unique fingerprint inserted by the encapsulator. MAY be used by the receiver to determine duplicate packet reception. The new encapsulation format is incompatible with those of previous BMF versions, implying that all network nodes need to be updated. 31 Mar 2007: Version 1.4 * Optimized the standard forwarding mechanism in such a way that retransmissions of packets are only done on those network interfaces that make a host a multi-point relay (MPR) for the sender. I.e.: retransmitting a packet on a network interface is not done if that does not lead to any new hosts being reached. * Optimized the standard forwarding mechanism such that, if the network topology indicates there is only one neighbor on an interface, packets are sent to the specific IP address (unicast) of that neighbor. If the network topology indicates there are multiple neighbors, then BMF will still send packets to the IP local-broadcast address. * Introduced a new forwarding mechanism, using only IP-unicast to forward packets. Packets are forwarded to the best candidate neighbor; other neighbors listen promiscuously. IP-local broadcast is not used. This saves air time on 802.11 WLAN networks, on which unicast packets are usually sent at a much higher bit rate than broadcast packets (which are sent at a basic bit rate). This mechanism can be activated by specifying the following plugin parameter: PlParam "BmfMechanism" "UnicastPromiscuous" See also section 6 - Advanced configuration. 18 Dec 2006: Version 1.3 * Added the possibility to configure the BMF network interface: name (e.g. "bmf0"), type (tun or tap), IP address and subnet mask. * Flooding of local broadcast packets (e.g. with destination IP address 192.168.1.255) can now be turned off by configuration. * When an application sends packets to the BMF network interface, BMF also floods these packets over the OLSR network. * Removed the TTL decrementing so that equipment connected to a non-OLSR interface can still send their IGMP messages (TTL = 1) to a fixed multicast router (running e.g. mrouted - DVMRP) connected to a non-OLSR interface on another host in the OLSR network. In this way, a whole OLSR network, including its non-OLSR capable hosts, can be made multicast-routable from a fixed multicast-enabled IP network. For an example of such a configuration read section 8 above. * Removed the check for 'IsNullMacAddress' when creating a network interface object. The check was not necessary and prevented BMF to work on non-ethernet interfaces such as ppp. * Bug fix: in case there are multiple OLSR interfaces, when an application sends packets to one OLSR interface, BMF did not flood these packets via the other OLSR interfaces. This is fixed. Also, packets sent to an OLSR interface are transmitted on the non-OLSR interfaces. 23 Oct 2006: Version 1.2 * Packets to a local broadcast destination have their destination IP address adapted to the subnet on which they are forwarded. This makes it possible to use broadcast-based services (such as NetBIOS) across different IP subnets. * The code to relate fragments with their main IP packet did not work when the fragment arrived earlier than the main packet. This would cause fragments of BMF-packets to be falsely forwarded. For now, removed the forwarding of IP fragments. (Who's using IP-fragments anyway?) * Packets are forwarded from one non-OLSR interface to the other non-OLSR interfaces. * Various small optimizations and style improvements. 12 Jul 2006: Version 1.1 * Major updates in code forwarding from and to non-OLSR enabled network interfaces. * Debug level 9 gives a better indication of what happens to each handled multicast/broadcast packet. To run the olsr daemon with debug level 9, run "olsrd -d 9"; if you're only interested in BMF debug messages, run "olsrd -d 9 | grep -i bmf". * Can now deal with network interface removal ("ifdown eth1") and addition ("ifup eth1"). * CRC-calculation for duplicate detection is done over first 256 bytes in packet instead of over full packet length. * CRC calculated only on captured packets, and is subsequently passed on in a special OLSR-BMF encapsulation header. * Deals correctly with fragmented packets 27 Apr 2006: Version 1.0.1 * First release. 11. Normative References ------------------------ [1] Postel, J., "Internet Protocol", STD 5, RFC 791, September 1981. [2] Postel, J., "User Datagram Protocol", STD 6, RFC 768, August 1980. olsrd-0.6.6.2/lib/bmf/src/000077500000000000000000000000001234304727700151205ustar00rootroot00000000000000olsrd-0.6.6.2/lib/bmf/src/Address.c000066400000000000000000000123151234304727700166530ustar00rootroot00000000000000/* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Thales, BMF nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ------------------------------------------------------------------------- * File : Address.c * Description: IP packet characterization functions * Created : 29 Jun 2006 * * ------------------------------------------------------------------------- */ #include "Address.h" /* System includes */ #include /* NULL */ #include /* assert() */ #include /* struct ip */ #include /* struct udphdr */ /* OLSRD includes */ #include "defs.h" /* ipequal */ /* Plugin includes */ #include "Bmf.h" /* BMF_ENCAP_PORT */ #include "NetworkInterfaces.h" /* TBmfInterface */ /* Whether or not to flood local broadcast packets (e.g. packets with IP * destination 192.168.1.255). May be overruled by setting the plugin * parameter "DoLocalBroadcast" to "no" */ int EnableLocalBroadcast = 1; /* ------------------------------------------------------------------------- * Function : DoLocalBroadcast * Description: Overrule the default setting, enabling or disabling the * flooding of local broadcast packets * Input : enable - either "yes" or "no" * data - not used * addon - not used * Output : none * Return : success (0) or fail (1) * Data Used : none * ------------------------------------------------------------------------- */ int DoLocalBroadcast( const char* enable, void* data __attribute__((unused)), set_plugin_parameter_addon addon __attribute__((unused))) { if (strcmp(enable, "yes") == 0) { EnableLocalBroadcast = 1; return 0; } else if (strcmp(enable, "no") == 0) { EnableLocalBroadcast = 0; return 0; } /* Value not recognized */ return 1; } /* ------------------------------------------------------------------------- * Function : IsMulticast * Description: Check if an IP address is a multicast address * Input : ipAddress * Output : none * Return : true (1) or false (0) * Data Used : none * ------------------------------------------------------------------------- */ int IsMulticast(union olsr_ip_addr* ipAddress) { assert(ipAddress != NULL); return IN_MULTICAST(ntohl(ipAddress->v4.s_addr)); } /* ------------------------------------------------------------------------- * Function : IsOlsrOrBmfPacket * Description: Check if an IP packet is either an OLSR packet or a BMF packet * Input : ipPacket * Output : none * Return : true (1) or false (0) * Data Used : none * ------------------------------------------------------------------------- */ int IsOlsrOrBmfPacket(unsigned char* ipPacket) { struct ip* ipHeader; unsigned int ipHeaderLen; struct udphdr* udpHeader; u_int16_t destPort; assert(ipPacket != NULL); /* OLSR packets are UDP - port 698 * OLSR-BMF packets are UDP - port 50698 * OLSR-Autodetect probe packets are UDP - port 51698 */ /* Check if UDP */ ipHeader = (struct ip*) ARM_NOWARN_ALIGN(ipPacket); if (ipHeader->ip_p != SOL_UDP) { /* Not UDP */ return 0; } /* The total length must be at least large enough to store the UDP header */ ipHeaderLen = GetIpHeaderLength(ipPacket); if (GetIpTotalLength(ipPacket) < ipHeaderLen + sizeof(struct udphdr)) { /* Not long enough */ return 0; } /* Go into the UDP header and check port number */ udpHeader = (struct udphdr*) ARM_NOWARN_ALIGN((ipPacket + ipHeaderLen)); destPort = ntohs(udpHeader->dest); if (destPort == olsr_cnf->olsrport || destPort == BMF_ENCAP_PORT || destPort == 51698) /* TODO: #define for 51698 */ { return 1; } return 0; } olsrd-0.6.6.2/lib/bmf/src/Address.h000066400000000000000000000046111234304727700166600ustar00rootroot00000000000000#ifndef _BMF_ADDRESS_H #define _BMF_ADDRESS_H /* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Thales, BMF nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ------------------------------------------------------------------------- * File : Address.h * Description: IP packet characterization functions * Created : 29 Jun 2006 * * ------------------------------------------------------------------------- */ #include "olsr_types.h" /* olsr_ip_addr */ #include "olsrd_plugin.h" /* union set_plugin_parameter_addon */ #include "interfaces.h" /* struct interface */ struct TBmfInterface; extern int EnableLocalBroadcast; int DoLocalBroadcast(const char* enable, void* data, set_plugin_parameter_addon addon); int IsMulticast(union olsr_ip_addr* ipAddress); int IsOlsrOrBmfPacket(unsigned char* ipPacket); #endif /* _BMF_ADDRESS_H */ olsrd-0.6.6.2/lib/bmf/src/Bmf.c000066400000000000000000001250231234304727700157730ustar00rootroot00000000000000/* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Thales, BMF nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ------------------------------------------------------------------------- * File : Bmf.c * Description: Multicast forwarding functions * Created : 29 Jun 2006 * * ------------------------------------------------------------------------- */ #define _MULTI_THREADED #include "Bmf.h" /* System includes */ #include /* NULL */ #include /* ssize_t */ #include /* strerror() */ #include /* va_list, va_start, va_end */ #include /* errno */ #include /* assert() */ #include /* ETH_P_IP */ #include /* struct sockaddr_ll, PACKET_MULTICAST */ #include /* sigset_t, sigfillset(), sigdelset(), SIGINT */ #include /* struct ip */ #include /* struct udphdr */ #include /* read(), write() */ #include /* Daniele Lacamera: Added guard poll for sendto(), needs poll.h */ /* OLSRD includes */ #include "plugin_util.h" /* set_plugin_int */ #include "defs.h" /* olsr_cnf, OLSR_PRINTF */ #include "ipcalc.h" #include "olsr.h" /* olsr_printf */ #include "mid_set.h" /* mid_lookup_main_addr() */ #include "mpr_selector_set.h" /* olsr_lookup_mprs_set() */ #include "link_set.h" /* get_best_link_to_neighbor() */ #include "net_olsr.h" /* ipequal */ /* BMF includes */ #include "NetworkInterfaces.h" /* TBmfInterface, CreateBmfNetworkInterfaces(), CloseBmfNetworkInterfaces() */ #include "Address.h" /* IsMulticast() */ #include "Packet.h" /* ENCAP_HDR_LEN, BMF_ENCAP_TYPE, BMF_ENCAP_LEN etc. */ #include "PacketHistory.h" /* InitPacketHistory() */ /* unicast/broadcast fan out limit */ int FanOutLimit = 2; int BroadcastRetransmitCount = 1; /* ------------------------------------------------------------------------- * Function : BmfPError * Description: Prints an error message at OLSR debug level 1. * First the plug-in name is printed. Then (if format is not NULL * and *format is not empty) the arguments are printed, followed * by a colon and a blank. Then the message and a new-line. * Input : format, arguments * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ void BmfPError(const char* format, ...) { #define MAX_STR_DESC 255 char* strErr = strerror(errno); char strDesc[MAX_STR_DESC]; /* Rely on short-circuit boolean evaluation */ if (format == NULL || *format == '\0') { olsr_printf(1, "%s: %s\n", PLUGIN_NAME, strErr); } else { va_list arglist; olsr_printf(1, "%s: ", PLUGIN_NAME); va_start(arglist, format); vsnprintf(strDesc, MAX_STR_DESC, format, arglist); va_end(arglist); strDesc[MAX_STR_DESC - 1] = '\0'; /* Ensures null termination */ olsr_printf(1, "%s: %s\n", strDesc, strErr); } } /* BmfPError */ /* ------------------------------------------------------------------------- * Function : MainAddressOf * Description: Lookup the main address of a node * Input : ip - IP address of the node * Output : none * Return : The main IP address of the node * Data Used : none * ------------------------------------------------------------------------- */ union olsr_ip_addr* MainAddressOf(union olsr_ip_addr* ip) { union olsr_ip_addr* result; result = mid_lookup_main_addr(ip); if (result == NULL) { result = ip; } return result; } /* MainAddressOf */ /* ------------------------------------------------------------------------- * Function : ForwardPacket * Description: Forward a raw IP packet * Input : intf - the network interface on which to forward the packet. The * packet will be forwarded on its 'capturing' socket. * ipPacket - the IP packet to be forwarded * ipPacketLen - the length of the IP packet to be forwarded * debugInfo - string to use printing debugging information * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ static void ForwardPacket( struct TBmfInterface* intf, unsigned char* ipPacket, u_int16_t ipPacketLen, const char* debugInfo) { int nBytesWritten; struct sockaddr_ll dest; int pollret; struct pollfd guard; guard.fd = intf->capturingSkfd; guard.events = POLLOUT; /* If the IP packet is a local broadcast packet, * update its destination address to match the subnet of the network * interface on which the packet is being sent. */ CheckAndUpdateLocalBroadcast(ipPacket, &intf->broadAddr); memset(&dest, 0, sizeof(dest)); dest.sll_family = AF_PACKET; dest.sll_protocol = htons(ETH_P_IP); dest.sll_ifindex = if_nametoindex(intf->ifName); dest.sll_halen = IFHWADDRLEN; /* Use all-ones as destination MAC address. When the IP destination is * a multicast address, the destination MAC address should normally also * be a multicast address. E.g., when the destination IP is 224.0.0.1, * the destination MAC should be 01:00:5e:00:00:01. However, it does not * seem to matter when the destination MAC address is set to all-ones * in that case. */ memset(dest.sll_addr, 0xFF, IFHWADDRLEN); /* Daniele Lacamera: poll guard to avoid locking in sendto(). * Wait at most 2 polling periods. Since we're running in the context of the main * OLSR thread, we should not wait too long. 2 polling periods is considered a * reasonable time. */ pollret = poll (&guard, 1, 2 * olsr_cnf->pollrate * MSEC_PER_SEC); if (pollret <= 0) { BmfPError("sendto() on \"%s\": not ready to send pkt. pollret=%d\n", intf->ifName, pollret); /* Apparently the network interface is jammed. Give up. */ return; } /* Forward the BMF packet via the capturing socket */ nBytesWritten = sendto( intf->capturingSkfd, ipPacket, ipPacketLen, 0, (struct sockaddr*) &dest, sizeof(dest)); if (nBytesWritten != ipPacketLen) { BmfPError("sendto() error forwarding pkt on \"%s\"", intf->ifName); return; } /* Increase counter */ intf->nBmfPacketsTx++; OLSR_PRINTF( 8, "%s: --> %s \"%s\"\n", PLUGIN_NAME_SHORT, debugInfo, intf->ifName); } /* ForwardPacket */ /* ------------------------------------------------------------------------- * Function : EncapsulateAndForwardPacket * Description: Encapsulate a captured raw IP packet and forward it * Input : intf - the network interface on which to forward the packet * encapsulationUdpData - The encapsulation header, followed by * the encapsulated IP packet * source - the source IP address of the BMF packet, or NULL if * unknown or not applicable * forwardedBy - the IP address of the node that forwarded the BMF * packet, or NULL if unknown or not applicable * forwardedTo - the IP address of the node to which the BMF packet * was directed, or NULL if unknown or not applicable * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ static void EncapsulateAndForwardPacket( struct TBmfInterface* intf, unsigned char* encapsulationUdpData, union olsr_ip_addr* source, union olsr_ip_addr* forwardedBy, union olsr_ip_addr* forwardedTo) { /* Retrieve the number of bytes to be forwarded via the encapsulation socket */ u_int16_t udpDataLen = GetEncapsulationUdpDataLength(encapsulationUdpData); /* The next destination(s) */ struct TBestNeighbors bestNeighborLinks; struct link_entry* bestNeighbor; int nPossibleNeighbors = 0; struct sockaddr_in forwardTo; /* Next destination of encapsulation packet */ int nPacketsToSend; int sendUnicast; /* 0 = send broadcast; 1 = send unicast */ int i; /* Find at most 'FanOutLimit' best neigbors to forward the packet to */ FindNeighbors( &bestNeighborLinks, &bestNeighbor, intf, source, forwardedBy, forwardedTo, &nPossibleNeighbors); if (nPossibleNeighbors <= 0) { OLSR_PRINTF( 8, "%s: --> not encap-forwarding on \"%s\": there is no neighbor that needs my retransmission\n", PLUGIN_NAME_SHORT, intf->ifName); return; } /* if */ /* Compose destination of encapsulation packet */ memset(&forwardTo, 0, sizeof(forwardTo)); forwardTo.sin_family = AF_INET; forwardTo.sin_port = htons(BMF_ENCAP_PORT); /* Start by filling in the local broadcast address. This may be overwritten later. */ forwardTo.sin_addr = intf->broadAddr.v4; /* - If the BMF mechanism is BM_UNICAST_PROMISCUOUS, always send just one * unicast packet (to the best neighbor). * - But if the BMF mechanism is BM_BROADCAST, * - send 'nPossibleNeighbors' unicast packets if there are up to * 'FanOutLimit' possible neighbors, * - if there are more than 'FanOutLimit' possible neighbors, then * send a (WLAN-air-expensive, less reliable) broadcast packet. */ if (BmfMechanism == BM_UNICAST_PROMISCUOUS) { /* One unicast packet to the best neighbor */ nPacketsToSend = 1; sendUnicast = 1; bestNeighborLinks.links[0] = bestNeighbor; } else /* BmfMechanism == BM_BROADCAST */ { if (nPossibleNeighbors <= FanOutLimit) { /* 'nPossibleNeighbors' unicast packets */ nPacketsToSend = nPossibleNeighbors; sendUnicast = 1; } else /* nPossibleNeighbors > FanOutLimit */ { /* One broadcast packet, possibly retransmitted as specified in the * 'BroadcastRetransmitCount' plugin parameter */ nPacketsToSend = BroadcastRetransmitCount; sendUnicast = 0; } /* if */ } /* if */ for (i = 0; i < nPacketsToSend; i++) { int nBytesWritten; int pollret; struct pollfd guard; guard.fd = intf->encapsulatingSkfd; guard.events = POLLOUT; if (sendUnicast == 1) { /* For unicast, overwrite the local broadcast address which was filled in above */ forwardTo.sin_addr = bestNeighborLinks.links[i]->neighbor_iface_addr.v4; } /* Daniele Lacamera: poll guard to avoid locking in sendto(). * Wait at most 2 polling periods. Since we're running in the context of the main * OLSR thread, we should not wait too long. 2 polling periods is considered a * reasonable time. */ pollret = poll (&guard, 1, 2 * olsr_cnf->pollrate * MSEC_PER_SEC); if (pollret <= 0) { BmfPError("sendto() on \"%s\": not ready to send pkt. pollret=%d\n", intf->ifName, pollret); /* Apparently the network interface is jammed. Give up and return. */ return; } /* Forward the BMF packet via the encapsulation socket */ nBytesWritten = sendto( intf->encapsulatingSkfd, encapsulationUdpData, udpDataLen, MSG_DONTROUTE, (struct sockaddr*) &forwardTo, sizeof(forwardTo)); /* Evaluate and display result */ if (nBytesWritten != udpDataLen) { BmfPError("sendto() error forwarding encapsulated pkt on \"%s\"", intf->ifName); return; } /* if (nBytesWritten != udpDataLen) */ /* Increase counter */ intf->nBmfPacketsTx++; OLSR_PRINTF( 8, "%s: --> forwarded encapsulated packet on \"%s\" to %s\n", PLUGIN_NAME_SHORT, intf->ifName, inet_ntoa(forwardTo.sin_addr)); } /* for */ } /* EncapsulateAndForwardPacket */ /* ------------------------------------------------------------------------- * Function : BmfPacketCaptured * Description: Handle a captured IP packet * Input : intf - the network interface on which the packet was captured * sllPkttype - the type of packet. Either PACKET_OUTGOING, * PACKET_BROADCAST or PACKET_MULTICAST. * encapsulationUdpData - space for the encapsulation header, followed by * the captured IP packet * Output : none * Return : none * Data Used : BmfInterfaces * Notes : The IP packet is assumed to be captured on a socket of family * PF_PACKET and type SOCK_DGRAM (cooked). * ------------------------------------------------------------------------- */ static void BmfPacketCaptured( struct TBmfInterface* intf, unsigned char sllPkttype, unsigned char* encapsulationUdpData) { union olsr_ip_addr src; /* Source IP address in captured packet */ union olsr_ip_addr dst; /* Destination IP address in captured packet */ union olsr_ip_addr* origIp; /* Main OLSR address of source of captured packet */ struct TBmfInterface* walker; int isFromOlsrIntf; int isFromOlsrNeighbor; int iAmMpr; unsigned char* ipPacket; /* The captured IP packet... */ u_int16_t ipPacketLen; /* ...and its length */ struct ip* ipHeader; /* The IP header inside the captured IP packet */ u_int32_t crc32; struct TEncapHeader* encapHdr; #ifndef NODEBUG struct ipaddr_str srcBuf, dstBuf; #endif /* NODEBUG */ ipHeader = GetIpHeader(encapsulationUdpData); dst.v4 = ipHeader->ip_dst; /* Only forward multicast packets. If configured, also forward local broadcast packets */ if (IsMulticast(&dst) || (EnableLocalBroadcast != 0 && ipequal(&dst, &intf->broadAddr))) { /* continue */ } else { return; } ipPacket = GetIpPacket(encapsulationUdpData); /* Don't forward fragments of IP packets: there is no way to distinguish fragments * of BMF encapsulation packets from other fragments. * Well yes, there is the IP-ID, which can be kept in a list to relate a fragment * to earlier sent BMF packets, but... sometimes the second fragment comes in earlier * than the first fragment, so that the list is not yet up to date and the second * fragment is not recognized as a BMF packet. * Also, don't forward OLSR packets (UDP port 698) and BMF encapsulated packets */ if (IsIpFragment(ipPacket) || IsOlsrOrBmfPacket(ipPacket)) { return; } /* Increase counter */ intf->nBmfPacketsRx++; /* Check if the frame is captured on an OLSR-enabled interface */ isFromOlsrIntf = (intf->olsrIntf != NULL); /* Retrieve the length of the captured packet */ ipPacketLen = GetIpTotalLength(ipPacket); src.v4 = ipHeader->ip_src; OLSR_PRINTF( 8, "%s: %s pkt of %ld bytes captured on %s interface \"%s\": %s->%s\n", PLUGIN_NAME_SHORT, sllPkttype == PACKET_OUTGOING ? "outgoing" : "incoming", (long)ipPacketLen, isFromOlsrIntf ? "OLSR" : "non-OLSR", intf->ifName, olsr_ip_to_string(&srcBuf, &src), olsr_ip_to_string(&dstBuf, &dst)); /* Lookup main address of source in the MID table of OLSR */ origIp = MainAddressOf(&src); /* Calculate packet fingerprint */ crc32 = PacketCrc32(ipPacket, ipPacketLen); /* Check if this packet was seen recently */ if (CheckAndMarkRecentPacket(crc32)) { /* Increase counter */ intf->nBmfPacketsRxDup++; OLSR_PRINTF( 8, "%s: --> discarding: packet is duplicate\n", PLUGIN_NAME_SHORT); return; } /* Compose encapsulation header */ encapHdr = (struct TEncapHeader*) encapsulationUdpData; memset (encapHdr, 0, ENCAP_HDR_LEN); encapHdr->type = BMF_ENCAP_TYPE; encapHdr->len = BMF_ENCAP_LEN; encapHdr->reserved = 0; encapHdr->crc32 = htonl(crc32); /* Check if the frame is captured on an OLSR interface from an OLSR neighbor. * TODO: get_best_link_to_neighbor() may be very CPU-expensive, a simpler call * would do here (something like 'get_any_link_to_neighbor()'). */ isFromOlsrNeighbor = (isFromOlsrIntf /* The frame is captured on an OLSR interface... */ && get_best_link_to_neighbor(origIp) != NULL); /* ...from an OLSR neighbor */ /* Check with OLSR if I am MPR for that neighbor */ iAmMpr = olsr_lookup_mprs_set(origIp) != NULL; /* Check with each network interface what needs to be done on it */ for (walker = BmfInterfaces; walker != NULL; walker = walker->next) { /* Is the forwarding interface OLSR-enabled? */ int isToOlsrIntf = (walker->olsrIntf != NULL); /* Depending on certain conditions, we decide whether or not to forward * the packet, and if it is forwarded, in which form (encapsulated * or not, TTL decreased or not). These conditions are: * - is the packet is coming in on an OLSR interface or not? (isFromOlsrIntf) * - is the packet going out on an OLSR interface or not? (isToOlsrIntf) * - if the packet if coming in on an OLSR interface: * - is the node that forwarded the packet my OLSR-neighbor? (isFromOlsrNeighbor) * - has the node that forwarded the packet selected me as MPR? (iAmMpr) * * Based on these conditions, the following cases can be distinguished: * * - Case 1: Packet coming in on an OLSR interface. What to * do with it on an OLSR interface? * Answer: * - Case 1.1: If the forwarding node is an OLSR neighbor that has *not* * selected me as MPR: don't forward the packet. * - Case 1.2: If the forwarding node is an OLSR neighbor that has selected * me as MPR: encapsulate and forward the packet. * - Case 1.3: If the forwarding node is not an OLSR neighbor: encapsulate * and forward the packet. * NOTE: Case 1.3 is a special case. In the perfect world, we expect to * see only OLSR-neighbors on OLSR-enabled interfaces. Sometimes, however, * ignorant users will connect a host not running OLSR, to a LAN in * which there are hosts running OLSR. Of course these ignorant users, * expecting magic, want to see their multicast packets being forwarded * through the network. * * - Case 2: Packet coming in on an OLSR interface. What to do with it on a * non-OLSR interface? * Answer: Forward it. * * - Case 3: Packet coming in on a non-OLSR interface. What to * do with it on an OLSR interface? * Answer: Encapsulate and forward it. * * - Case 4: Packet coming in on non-OLSR interface. What to do with it on a * non-OLSR interface? * Answer 1: nothing. Multicast routing between non-OLSR interfaces * is to be done by other protocols (e.g. PIM, DVMRP). * Answer 2 (better): Forward it. */ if (isFromOlsrIntf && isToOlsrIntf) { /* Case 1: Forward from an OLSR interface to an OLSR interface */ if (isFromOlsrNeighbor && !iAmMpr) { /* Case 1.1 */ { #ifndef NODEBUG struct ipaddr_str buf; #endif /* NODEBUG */ OLSR_PRINTF( 8, "%s: --> not encap-forwarding on \"%s\": I am not selected as MPR by neighbor %s\n", PLUGIN_NAME_SHORT, walker->ifName, olsr_ip_to_string(&buf, &src)); } } else if (sllPkttype == PACKET_OUTGOING && intf == walker) { OLSR_PRINTF( 8, "%s: --> not encap-forwarding on \"%s\": pkt was captured on that interface\n", PLUGIN_NAME_SHORT, walker->ifName); } else { /* Case 1.2 and 1.3 */ EncapsulateAndForwardPacket(walker, encapsulationUdpData, NULL, NULL, NULL); } } /* if (isFromOlsrIntf && isToOlsrIntf) */ else if (isFromOlsrIntf && !isToOlsrIntf) { /* Case 2: Forward from OLSR interface to non-OLSR interface */ ForwardPacket (walker, ipPacket, ipPacketLen, "forwarded to non-OLSR interface"); } /* else if (isFromOlsrIntf && !isToOlsrIntf) */ else if (!isFromOlsrIntf && isToOlsrIntf) { /* Case 3: Forward from a non-OLSR interface to an OLSR interface. * Encapsulate and forward packet. */ EncapsulateAndForwardPacket(walker, encapsulationUdpData, NULL, NULL, NULL); } /* else if (!isFromOlsrIntf && isToOlsrIntf) */ else { /* Case 4: Forward from non-OLSR interface to non-OLSR interface. */ /* Don't forward on interface on which packet was received */ if (intf == walker) { OLSR_PRINTF( 8, "%s: --> not forwarding on \"%s\": pkt was captured on that interface\n", PLUGIN_NAME_SHORT, walker->ifName); } else { ForwardPacket (walker, ipPacket, ipPacketLen, "forwarded from non-OLSR to non-OLSR interface"); } /* if (intf == walker) */ } /* if */ } /* for */ } /* BmfPacketCaptured */ /* ------------------------------------------------------------------------- * Function : BmfEncapsulationPacketReceived * Description: Handle a received BMF-encapsulation packet * Input : intf - the network interface on which the packet was received * forwardedBy - the IP node that forwarded the packet to me * forwardedTo - the destination IP address of the encapsulation * packet, in case the packet was received promiscuously. * Pass NULL if the packet is received normally (unicast or * broadcast). * encapsulationUdpData - the encapsulating IP UDP data, containting * the BMF encapsulation header, followed by the encapsulated * IP packet * Output : none * Return : none * Data Used : BmfInterfaces * ------------------------------------------------------------------------- */ static void BmfEncapsulationPacketReceived( struct TBmfInterface* intf, union olsr_ip_addr* forwardedBy, union olsr_ip_addr* forwardedTo, unsigned char* encapsulationUdpData) { int iAmMpr; /* True (1) if I am selected as MPR by 'forwardedBy' */ unsigned char* ipPacket; /* The encapsulated IP packet */ u_int16_t ipPacketLen; /* Length of the encapsulated IP packet */ struct ip* ipHeader; /* IP header inside the encapsulated IP packet */ union olsr_ip_addr mcSrc; /* Original source of the encapsulated multicast packet */ union olsr_ip_addr mcDst; /* Multicast destination of the encapsulated packet */ struct TEncapHeader* encapsulationHdr; struct TBmfInterface* walker; #ifndef NODEBUG struct ipaddr_str mcSrcBuf, mcDstBuf, forwardedByBuf, forwardedToBuf; #endif /* NODEBUG */ /* Are we talking to ourselves? */ if (if_ifwithaddr(forwardedBy) != NULL) { return; } /* Discard encapsulated packets received on a non-OLSR interface */ if (intf->olsrIntf == NULL) { return; } /* Retrieve details about the encapsulated IP packet */ ipPacket = GetIpPacket(encapsulationUdpData); ipPacketLen = GetIpTotalLength(ipPacket); ipHeader = GetIpHeader(encapsulationUdpData); mcSrc.v4 = ipHeader->ip_src; mcDst.v4 = ipHeader->ip_dst; /* Increase counter */ intf->nBmfPacketsRx++; /* Beware: not possible to call olsr_ip_to_string more than 4 times in same printf */ OLSR_PRINTF( 8, "%s: encapsulated pkt of %ld bytes incoming on \"%s\": %s->%s, forwarded by %s to %s\n", PLUGIN_NAME_SHORT, (long)ipPacketLen, intf->ifName, olsr_ip_to_string(&mcSrcBuf, &mcSrc), olsr_ip_to_string(&mcDstBuf, &mcDst), olsr_ip_to_string(&forwardedByBuf, forwardedBy), forwardedTo != NULL ? olsr_ip_to_string(&forwardedToBuf, forwardedTo) : "me"); /* Get encapsulation header */ encapsulationHdr = (struct TEncapHeader*) encapsulationUdpData; /* Verify correct format of BMF encapsulation header */ if (encapsulationHdr->type != BMF_ENCAP_TYPE || encapsulationHdr->len != BMF_ENCAP_LEN || ntohs(encapsulationHdr->reserved != 0)) { OLSR_PRINTF( 8, "%s: --> discarding: format of BMF encapsulation header not recognized\n", PLUGIN_NAME_SHORT); return; } /* Check if this packet was seen recently */ if (CheckAndMarkRecentPacket(ntohl(encapsulationHdr->crc32))) { /* Increase counter */ intf->nBmfPacketsRxDup++; OLSR_PRINTF( 8, "%s: --> discarding: packet is duplicate\n", PLUGIN_NAME_SHORT); return; } if (EtherTunTapFd >= 0) { /* Unpack the encapsulated IP packet and deliver it locally, by sending * a copy into the local IP stack via the EtherTunTap interface */ union olsr_ip_addr broadAddr; int nBytesToWrite, nBytesWritten; unsigned char* bufferToWrite; /* If the encapsulated IP packet is a local broadcast packet, * update its destination address to match the subnet of the EtherTunTap * interface */ broadAddr.v4.s_addr = htonl(EtherTunTapIpBroadcast); CheckAndUpdateLocalBroadcast(ipPacket, &broadAddr); bufferToWrite = ipPacket; nBytesToWrite = ipPacketLen; /* Write the packet into the EtherTunTap interface for local delivery */ nBytesWritten = write(EtherTunTapFd, bufferToWrite, nBytesToWrite); if (nBytesWritten != nBytesToWrite) { BmfPError("write() error forwarding encapsulated pkt on \"%s\"", EtherTunTapIfName); } else { OLSR_PRINTF( 8, "%s: --> unpacked and delivered locally on \"%s\"\n", PLUGIN_NAME_SHORT, EtherTunTapIfName); } } /* if (EtherTunTapFd >= 0) */ /* Check if I am MPR for the forwarder */ iAmMpr = (olsr_lookup_mprs_set(MainAddressOf(forwardedBy)) != NULL); /* Check with each network interface what needs to be done on it */ for (walker = BmfInterfaces; walker != NULL; walker = walker->next) { /* What to do with the packet on a non-OLSR interface? Unpack * encapsulated packet, and forward it. * * What to do with the packet on an OLSR interface? Forward it only * if the forwarding node has selected us as MPR (iAmMpr). * * Note that the packet is always coming in on an OLSR interface, because * it is an encapsulated BMF packet. */ /* To a non-OLSR interface: unpack the encapsulated IP packet and forward it */ if (walker->olsrIntf == NULL) { ForwardPacket (walker, ipPacket, ipPacketLen, "unpacked and forwarded to non-OLSR interface"); } /* if (walker->olsrIntf == NULL) */ /* To an OLSR interface: forward the packet, but only if this node is * selected as MPR by the forwarding node */ else if (iAmMpr) { EncapsulateAndForwardPacket ( walker, encapsulationUdpData, &mcSrc, forwardedBy, forwardedTo); } /* else if (iAmMpr) */ else /* walker->olsrIntf != NULL && !iAmMpr */ { #ifndef NODEBUG struct ipaddr_str buf; #endif /*NODEBUG */ /* 'walker' is an OLSR interface, but I am not selected as MPR. In that * case, don't forward. */ OLSR_PRINTF( 8, "%s: --> not forwarding on \"%s\": I am not selected as MPR by %s\n", PLUGIN_NAME_SHORT, walker->ifName, olsr_ip_to_string(&buf, forwardedBy)); } /* else */ } /* for */ } /* BmfEncapsulationPacketReceived */ /* ------------------------------------------------------------------------- * Function : BmfTunPacketCaptured * Description: Handle an IP packet, captured outgoing on the tuntap interface * Input : encapsulationUdpData - space for the encapsulation header, followed by * the captured outgoing IP packet * Output : none * Return : none * Data Used : none * Notes : The packet is assumed to be captured on a socket of family * PF_PACKET and type SOCK_DGRAM (cooked). * ------------------------------------------------------------------------- */ static void BmfTunPacketCaptured(unsigned char* encapsulationUdpData) { union olsr_ip_addr srcIp; union olsr_ip_addr dstIp; union olsr_ip_addr broadAddr; struct TBmfInterface* walker; unsigned char* ipPacket; u_int16_t ipPacketLen; struct ip* ipHeader; u_int32_t crc32; struct TEncapHeader* encapHdr; #ifndef NODEBUG struct ipaddr_str srcIpBuf, dstIpBuf; #endif /* NODEBUG */ ipPacket = GetIpPacket(encapsulationUdpData); ipPacketLen = GetIpTotalLength(ipPacket); ipHeader = GetIpHeader(encapsulationUdpData); dstIp.v4 = ipHeader->ip_dst; broadAddr.v4.s_addr = htonl(EtherTunTapIpBroadcast); /* Only forward multicast packets. If configured, also forward local broadcast packets */ if (IsMulticast(&dstIp) || (EnableLocalBroadcast != 0 && ipequal(&dstIp, &broadAddr))) { /* continue */ } else { return; } srcIp.v4 = ipHeader->ip_src; OLSR_PRINTF( 8, "%s: outgoing pkt of %ld bytes captured on tuntap interface \"%s\": %s->%s\n", PLUGIN_NAME_SHORT, (long)ipPacketLen, EtherTunTapIfName, olsr_ip_to_string(&srcIpBuf, &srcIp), olsr_ip_to_string(&dstIpBuf, &dstIp)); /* Calculate packet fingerprint */ crc32 = PacketCrc32(ipPacket, ipPacketLen); /* Check if this packet was seen recently */ if (CheckAndMarkRecentPacket(crc32)) { OLSR_PRINTF( 8, "%s: --> discarding: packet is duplicate\n", PLUGIN_NAME_SHORT); return; } /* Compose encapsulation header */ encapHdr = (struct TEncapHeader*) encapsulationUdpData; memset (encapHdr, 0, ENCAP_HDR_LEN); encapHdr->type = BMF_ENCAP_TYPE; encapHdr->len = BMF_ENCAP_LEN; encapHdr->reserved = 0; encapHdr->crc32 = htonl(crc32); /* Check with each network interface what needs to be done on it */ for (walker = BmfInterfaces; walker != NULL; walker = walker->next) { /* Is the forwarding interface OLSR-enabled? */ if (walker->olsrIntf != NULL) { /* On an OLSR interface: encapsulate and forward packet. */ EncapsulateAndForwardPacket(walker, encapsulationUdpData, NULL, NULL, NULL); } else { /* On a non-OLSR interface: what to do? * Answer 1: nothing. Multicast routing between non-OLSR interfaces * is to be done by other protocols (e.g. PIM, DVMRP). * Answer 2 (better): Forward it. */ ForwardPacket (walker, ipPacket, ipPacketLen, "forwarded from non-OLSR to non-OLSR interface"); } /* if */ } /* for */ } /* BmfTunPacketCaptured */ /* ------------------------------------------------------------------------- * Function : DoBmf * Description: Wait (blocking) for IP packets, then call the handler for each * received packet * Input : none * Output : none * Return : none * Data Used : BmfInterfaces * ------------------------------------------------------------------------- */ void BMF_handle_captureFd(int skfd, void *data, unsigned int flags __attribute__ ((unused))) { unsigned char rxBuffer[BMF_BUFFER_SIZE]; struct TBmfInterface* walker = data; struct sockaddr_ll pktAddr; socklen_t addrLen = sizeof(pktAddr); int nBytes; unsigned char* ipPacket; /* Receive the captured Ethernet frame, leaving space for the BMF * encapsulation header */ ipPacket = GetIpPacket(rxBuffer); nBytes = recvfrom( skfd, ipPacket, BMF_BUFFER_SIZE - ENCAP_HDR_LEN, 0, (struct sockaddr*)&pktAddr, &addrLen); if (nBytes < 0) { BmfPError("recvfrom() error on \"%s\"", walker->ifName); return; } /* if (nBytes < 0) */ /* Check if the number of received bytes is large enough for an IP * packet which contains at least a minimum-size IP header. * Note: There is an apparent bug in the packet socket implementation in * combination with VLAN interfaces. On a VLAN interface, the value returned * by 'recvfrom' may (but need not) be 4 (bytes) larger than the value * returned on a non-VLAN interface, for the same ethernet frame. */ if (nBytes < (int)sizeof(struct ip)) { olsr_printf( 1, "%s: captured frame too short (%d bytes) on \"%s\"\n", PLUGIN_NAME, nBytes, walker->ifName); return; } if (pktAddr.sll_pkttype == PACKET_OUTGOING || pktAddr.sll_pkttype == PACKET_MULTICAST || pktAddr.sll_pkttype == PACKET_BROADCAST) { /* A multicast or broadcast packet was captured */ BmfPacketCaptured(walker, pktAddr.sll_pkttype, rxBuffer); } /* if (pktAddr.sll_pkttype == ...) */ } void BMF_handle_listeningFd(int skfd, void *data, unsigned int flags __attribute__ ((unused))) { unsigned char rxBuffer[BMF_BUFFER_SIZE]; struct TBmfInterface* walker = data; struct sockaddr_ll pktAddr; socklen_t addrLen = sizeof(pktAddr); int nBytes; int minimumLength; struct ip* ipHeader; unsigned int headerLength; struct udphdr* udpHeader; u_int16_t destPort; union olsr_ip_addr forwardedBy; union olsr_ip_addr forwardedTo; /* Heard a BMF packet */ nBytes = recvfrom( skfd, rxBuffer, BMF_BUFFER_SIZE, 0, (struct sockaddr*)&pktAddr, &addrLen); if (nBytes < 0) { BmfPError("recvfrom() error on \"%s\"", walker->ifName); return; } /* if (nBytes < 0) */ /* Check if the received packet is actually directed to another * node on the LAN */ if (pktAddr.sll_pkttype != PACKET_OTHERHOST) { /* No, the packet is directed to this node. In that case it will * be, or will already have been received, via the encapsulating * socket. Discard it here. */ return; } /* if (pktAddr.sll_pkttype ...) */ /* Check if the received packet is UDP - BMF port */ ipHeader = (struct ip*) ARM_NOWARN_ALIGN(rxBuffer); if (ipHeader->ip_p != SOL_UDP) { /* Not UDP */ return; } /* Check if the number of received bytes is large enough for a minimal BMF * encapsulation packet, at least: * - the IP header of the encapsulation IP packet * - the UDP header of the encapsulation IP packet * - the encapsulation header * - a minimum IP header inside the encapsulated packet * Note: on a VLAN interface, the value returned by 'recvfrom' may (but need * not) be 4 (bytes) larger than the value returned on a non-VLAN interface, for * the same ethernet frame. */ headerLength = GetIpHeaderLength(rxBuffer); minimumLength = headerLength + sizeof(struct udphdr) + ENCAP_HDR_LEN + sizeof(struct ip); if (minimumLength > BMF_BUFFER_SIZE) { olsr_printf(1, "%s: IP header length %u is too large\n", PLUGIN_NAME, headerLength); return; } if (nBytes < minimumLength) { olsr_printf( 1, "%s: captured a too short encapsulation packet (%d bytes) on \"%s\"\n", PLUGIN_NAME, nBytes, walker->ifName); return; } udpHeader = (struct udphdr*) ARM_NOWARN_ALIGN((rxBuffer + headerLength)); destPort = ntohs(udpHeader->dest); if (destPort != BMF_ENCAP_PORT) { /* Not BMF */ return; } forwardedBy.v4 = ipHeader->ip_src; forwardedTo.v4 = ipHeader->ip_dst; BmfEncapsulationPacketReceived( walker, &forwardedBy, &forwardedTo, rxBuffer + headerLength + sizeof(struct udphdr)); } void BMF_handle_encapsulatingFd(int skfd, void *data, unsigned int flags __attribute__ ((unused))) { unsigned char rxBuffer[BMF_BUFFER_SIZE]; struct TBmfInterface* walker = data; struct sockaddr_in from; socklen_t fromLen = sizeof(from); int nBytes; int minimumLength; union olsr_ip_addr forwardedBy; /* An encapsulated packet was received */ nBytes = recvfrom( skfd, rxBuffer, BMF_BUFFER_SIZE, 0, (struct sockaddr*)&from, &fromLen); if (nBytes < 0) { BmfPError("recvfrom() error on \"%s\"", walker->ifName); return; } /* if (nBytes < 0) */ forwardedBy.v4 = from.sin_addr; /* Check if the number of received bytes is large enough for a minimal BMF * encapsulation packet, at least: * - the encapsulation header * - a minimum IP header inside the encapsulated packet */ minimumLength = ENCAP_HDR_LEN + sizeof(struct ip); if (nBytes < minimumLength) { struct ipaddr_str buf; olsr_printf( 1, "%s: received a too short encapsulation packet (%d bytes) from %s on \"%s\"\n", PLUGIN_NAME, nBytes, olsr_ip_to_string(&buf, &forwardedBy), walker->ifName); return; } /* Unfortunately, the recvfrom call does not return the destination * of the encapsulation packet (the destination may be either the * my unicast or my local broadcast address). Therefore we fill in 'NULL' * for the 'forwardedTo' parameter. */ BmfEncapsulationPacketReceived(walker, &forwardedBy, NULL, rxBuffer); } void BMF_handle_tuntapFd(int skfd __attribute__ ((unused)), void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { unsigned char rxBuffer[BMF_BUFFER_SIZE]; int nBytes; unsigned char* ipPacket; unsigned char* bufferToRead; size_t nBytesToRead; /* Receive the packet, leaving space for the BMF encapsulation header */ ipPacket = GetIpPacket(rxBuffer); bufferToRead = ipPacket; nBytesToRead = BMF_BUFFER_SIZE - ENCAP_HDR_LEN; nBytes = read(EtherTunTapFd, bufferToRead, nBytesToRead); if (nBytes < 0) { BmfPError("recvfrom() error on \"%s\"", EtherTunTapIfName); return; } /* Check if the number of received bytes is large enough for an IP * packet which contains at least a minimum-size IP header */ if (nBytes < (int)sizeof(struct ip)) { olsr_printf( 1, "%s: captured packet too short (%d bytes) on \"%s\"\n", PLUGIN_NAME, nBytes, EtherTunTapIfName); return; } BmfTunPacketCaptured(rxBuffer); } /* ------------------------------------------------------------------------- * Function : InterfaceChange * Description: Callback function passed to OLSRD for it to call whenever a * network interface has been added, removed or updated * Input : if_index - index of the interface * interf - the network interface to deal with * (might be NULL for non-OLSR interfaces) * action - indicates if the specified network interface was * added, removed or updated. * Output : none * Data Used : none * ------------------------------------------------------------------------- */ void InterfaceChange(int if_index __attribute__((unused)), struct interface* interf, enum olsr_ifchg_flag action) { if (interf == NULL) { return; } switch (action) { case (IFCHG_IF_ADD): /* If the new interfaces is ready, completely restart BMF. In this way * the IP address for the BMF network interface is correctly re-evaluated, * and a default route for multicast traffic is (re)established. * Thanks to Daniele Lacamera for finding and solving this bug. */ CloseBmf(); InitBmf(NULL); olsr_printf(1, "%s: interface %s added\n", PLUGIN_NAME, interf->int_name); break; case (IFCHG_IF_REMOVE): /* We cannot just remove the interface, because the receive-thread is likely * to be waiting in select(...) for packets coming in via the interface. * Therefore we first close BMF (CloseBmf()), interrupting and kiling the * receive-thread so that it is safe to remove this (and all other) * interfaces. After that, BMF is re-started (InitBmf(interf)). */ CloseBmf(); InitBmf(interf); olsr_printf(1, "%s: interface %s removed\n", PLUGIN_NAME, interf->int_name); break; case (IFCHG_IF_UPDATE): olsr_printf(1, "%s: interface %s updated\n", PLUGIN_NAME, interf->int_name); break; default: olsr_printf( 1, "%s: interface %s: error - unknown action (%d)\n", PLUGIN_NAME, interf->int_name, action); break; } } /* InterfaceChange */ /* ------------------------------------------------------------------------- * Function : SetFanOutLimit * Description: Overrule the default fan out limit value (2) * Input : value - fan out limit value (0...MAX_UNICAST_NEIGHBORS) * data - not used * addon - not used * Output : none * Return : success (0) or fail (1) * Data Used : FanOutLimit * ------------------------------------------------------------------------- */ int SetFanOutLimit( const char* value, void* data __attribute__((unused)), set_plugin_parameter_addon addon __attribute__((unused))) { if (set_plugin_int(value, &FanOutLimit, addon) == 0) { /* Extra check if within range */ if (FanOutLimit >= 0 && FanOutLimit <= MAX_UNICAST_NEIGHBORS) { return 0; } } return 1; } /* ------------------------------------------------------------------------- * Function : InitBmf * Description: Initialize the BMF plugin * Input : skipThisIntf - specifies which network interface should not * be enabled for BMF. Pass NULL if not applicable. * Output : none * Return : fail (0) or success (1) * Data Used : BmfThreadRunning, BmfThread * ------------------------------------------------------------------------- */ int InitBmf(struct interface* skipThisIntf) { CreateBmfNetworkInterfaces(skipThisIntf); if (EtherTunTapFd >= 0) { /* Deactivate IP spoof filter for EtherTunTap interface */ DeactivateSpoofFilter(); /* If the BMF network interface has a sensible IP address, it is a good idea * to route all multicast traffic through that interface */ if (EtherTunTapIp != ETHERTUNTAPDEFAULTIP) { AddMulticastRoute(); } } return 1; } /* InitBmf */ /* ------------------------------------------------------------------------- * Function : CloseBmf * Description: Close the BMF plugin and clean up * Input : none * Output : none * Return : none * Data Used : BmfThread * ------------------------------------------------------------------------- */ void CloseBmf(void) { if (EtherTunTapFd >= 0) { /* If there is a multicast route, try to delete it first */ DeleteMulticastRoute(); /* Restore IP spoof filter for EtherTunTap interface */ RestoreSpoofFilter(); } /* Clean up after the BmfThread has been killed */ CloseBmfNetworkInterfaces(); } /* CloseBmf */ olsrd-0.6.6.2/lib/bmf/src/Bmf.h000066400000000000000000000065601234304727700160040ustar00rootroot00000000000000#ifndef _BMF_BMF_H #define _BMF_BMF_H /* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Thales, BMF nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ------------------------------------------------------------------------- * File : Bmf.h * Description: Multicast forwarding functions * Created : 29 Jun 2006 * * ------------------------------------------------------------------------- */ #include "olsrd_plugin.h" /* union set_plugin_parameter_addon */ #include "interfaces.h" /* enum olsr_ifchg_flag */ /* BMF plugin data */ #define PLUGIN_NAME "OLSRD Basic Multicast Forwarding (BMF) plugin" #define PLUGIN_NAME_SHORT "OLSRD BMF" #define PLUGIN_VERSION "1.7.0 (" __DATE__ " " __TIME__ ")" #define PLUGIN_COPYRIGHT " (C) Thales Communications Huizen, Netherlands" #define PLUGIN_AUTHOR " Erik Tromp (eriktromp@users.sourceforge.net)" #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION "\n" PLUGIN_COPYRIGHT "\n" PLUGIN_AUTHOR #define PLUGIN_INTERFACE_VERSION 5 /* UDP-Port on which multicast packets are encapsulated */ #define BMF_ENCAP_PORT 50698 /* Forward declaration of OLSR interface type */ struct interface; extern int FanOutLimit; extern int BroadcastRetransmitCount; void BMF_handle_captureFd(int skfd, void *data, unsigned int); void BMF_handle_listeningFd(int skfd, void *data, unsigned int); void BMF_handle_encapsulatingFd(int skfd, void *data, unsigned int); void BMF_handle_tuntapFd(int, void*, unsigned int); void BmfPError(const char* format, ...) __attribute__((format(printf, 1, 2))); union olsr_ip_addr* MainAddressOf(union olsr_ip_addr* ip); void InterfaceChange(int, struct interface* interf, enum olsr_ifchg_flag action); int SetFanOutLimit(const char* value, void* data, set_plugin_parameter_addon addon); int InitBmf(struct interface* skipThisIntf); void CloseBmf(void); #endif /* _BMF_BMF_H */ olsrd-0.6.6.2/lib/bmf/src/NetworkInterfaces.c000066400000000000000000001773751234304727700207450ustar00rootroot00000000000000/* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Thales, BMF nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ------------------------------------------------------------------------- * File : NetworkInterfaces.c * Description: Functions to open and close sockets * Created : 29 Jun 2006 * * ------------------------------------------------------------------------- */ #include "NetworkInterfaces.h" /* System includes */ #include /* NULL */ #include /* syslog() */ #include /* strerror(), strchr(), strcmp() */ #include /* errno */ #include /* close() */ #include /* ioctl() */ #include /* fcntl() */ #include /* assert() */ #include /* socket(), ifreq, if_indextoname(), if_nametoindex() */ #include /* htons() */ #include /* ETH_P_IP */ #include /* packet_mreq, PACKET_MR_PROMISC, PACKET_ADD_MEMBERSHIP */ #include /* IFF_TAP */ #include /* struct ip */ #include /* SOL_UDP */ /* OLSRD includes */ #include "olsr.h" /* olsr_printf() */ #include "ipcalc.h" #include "defs.h" /* olsr_cnf */ #include "link_set.h" /* get_link_set() */ #include "tc_set.h" /* olsr_lookup_tc_entry(), olsr_lookup_tc_edge() */ #include "net_olsr.h" /* ipequal */ #include "lq_plugin.h" #include "kernel_tunnel.h" /* Plugin includes */ #include "Packet.h" /* IFHWADDRLEN */ #include "Bmf.h" /* PLUGIN_NAME, MainAddressOf() */ #include "Address.h" /* IsMulticast() */ /* List of network interface objects used by BMF plugin */ struct TBmfInterface* BmfInterfaces = NULL; struct TBmfInterface* LastBmfInterface = NULL; /* Highest-numbered open socket file descriptor. To be used as first * parameter in calls to select(...). */ int HighestSkfd = -1; /* Set of socket file descriptors */ fd_set InputSet; /* File descriptor of EtherTunTap interface */ int EtherTunTapFd = -1; /* Network interface name of EtherTunTap interface. May be overruled by * setting the plugin parameter "BmfInterface". */ char EtherTunTapIfName[IFNAMSIZ] = "bmf0"; /* The underlying mechanism to forward multicast packets. Either: * - BM_BROADCAST: BMF uses the IP local broadcast as destination address * - BM_UNICAST_PROMISCUOUS: BMF uses the IP address of the best neighbor as * destination address. The other neighbors listen promiscuously. */ enum TBmfMechanism BmfMechanism = BM_BROADCAST; #define ETHERTUNTAPIPNOTSET 0 /* The IP address of the BMF network interface in host byte order. * May be overruled by setting the plugin parameter "BmfInterfaceIp". */ u_int32_t EtherTunTapIp = ETHERTUNTAPIPNOTSET; /* 255.255.255.255 in host byte order. May be overruled by * setting the plugin parameter "BmfInterfaceIp". */ u_int32_t EtherTunTapIpMask = 0xFFFFFFFF; /* The IP broadcast address of the BMF network interface in host byte order. * May be overruled by setting the plugin parameter "BmfinterfaceIp". */ u_int32_t EtherTunTapIpBroadcast = ETHERTUNTAPIPNOTSET; /* Whether or not the BMF network interface must be marked as persistent */ int EtherTunTapPersistent = 1; /* Whether or not the configuration has overruled the default IP * configuration of the EtherTunTap interface */ int TunTapIpOverruled = 0; /* Whether or not to capture packets on the OLSR-enabled * interfaces (in promiscuous mode). May be overruled by setting the plugin * parameter "CapturePacketsOnOlsrInterfaces" to "yes". */ int CapturePacketsOnOlsrInterfaces = 0; /* ------------------------------------------------------------------------- * Function : SetBmfInterfaceName * Description: Overrule the default network interface name ("bmf0") of the * EtherTunTap interface * Input : ifname - network interface name (e.g. "mybmf0") * data - not used * addon - not used * Output : none * Return : success (0) or fail (1) * Data Used : EtherTunTapIfName * ------------------------------------------------------------------------- */ int SetBmfInterfaceName( const char* ifname, void* data __attribute__((unused)), set_plugin_parameter_addon addon __attribute__((unused))) { strncpy(EtherTunTapIfName, ifname, IFNAMSIZ - 1); EtherTunTapIfName[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ return 0; } /* SetBmfInterfaceName */ /* ------------------------------------------------------------------------- * Function : SetBmfInterfaceIp * Description: Overrule the default IP address and prefix length * ("10.255.255.253/30") of the EtherTunTap interface * Input : ip - IP address string, followed by '/' and prefix length * data - not used * addon - not used * Output : none * Return : success (0) or fail (1) * Data Used : EtherTunTapIp, EtherTunTapIpMask, EtherTunTapIpBroadcast, * TunTapIpOverruled * ------------------------------------------------------------------------- */ int SetBmfInterfaceIp( const char* ip, void* data __attribute__((unused)), set_plugin_parameter_addon addon __attribute__((unused))) { #define IPV4_MAX_ADDRLEN 16 #define IPV4_MAX_PREFIXLEN 32 char* slashAt; char ipAddr[IPV4_MAX_ADDRLEN]; struct in_addr sinaddr; int prefixLen; int i; /* Inspired by function str2prefix_ipv4 as found in Quagga source * file lib/prefix.c */ /* Find slash inside string. */ slashAt = strchr(ip, '/'); /* String doesn't contain slash. */ if (slashAt == NULL || slashAt - ip >= IPV4_MAX_ADDRLEN) { /* No prefix length specified, or IP address too long */ return 1; } strncpy(ipAddr, ip, slashAt - ip); *(ipAddr + (slashAt - ip)) = '\0'; if (inet_aton(ipAddr, &sinaddr) == 0) { /* Invalid address passed */ return 1; } EtherTunTapIp = ntohl(sinaddr.s_addr); /* Get prefix length. */ prefixLen = atoi(++slashAt); if (prefixLen <= 0 || prefixLen > IPV4_MAX_PREFIXLEN) { return 1; } /* Compose IP subnet mask in host byte order */ EtherTunTapIpMask = 0; for (i = 0; i < prefixLen; i++) { EtherTunTapIpMask |= (1 << (IPV4_MAX_PREFIXLEN - 1 - i)); } /* Compose IP broadcast address in host byte order */ EtherTunTapIpBroadcast = EtherTunTapIp; for (i = prefixLen; i < IPV4_MAX_PREFIXLEN; i++) { EtherTunTapIpBroadcast |= (1 << (IPV4_MAX_PREFIXLEN - 1 - i)); } TunTapIpOverruled = 1; return 0; } /* SetBmfInterfaceIp */ /* ------------------------------------------------------------------------- * Function : SetBmfInterfacePersistent * Description: Determine if the EtherTunTap interface must be marked * persistent or not * Input : value - yes/true/1 or no/false/0 * data - not used * addon - not used * Output : none * Return : success (0) or fail (1) * Data Used : EtherTunTapPersistent * ------------------------------------------------------------------------- */ int SetBmfInterfacePersistent( const char* value, void* data __attribute__((unused)), set_plugin_parameter_addon addon __attribute__((unused))) { if (strcasecmp(value, "yes") == 0 || strcasecmp(value, "true") == 0 || strcasecmp(value, "1") == 0) { EtherTunTapPersistent = 1; } else if (strcasecmp(value, "no") == 0 || strcasecmp(value, "false") == 0 || strcasecmp(value, "0") == 0) { EtherTunTapPersistent = 0; } else { return 1; } return 0; } /* SetBmfInterfacePersistent */ /* ------------------------------------------------------------------------- * Function : SetCapturePacketsOnOlsrInterfaces * Description: Overrule the default setting, enabling or disabling the * capturing of packets on OLSR-enabled interfaces. * Input : enable - either "yes" or "no" * data - not used * addon - not used * Output : none * Return : success (0) or fail (1) * Data Used : none * ------------------------------------------------------------------------- */ int SetCapturePacketsOnOlsrInterfaces( const char* enable, void* data __attribute__((unused)), set_plugin_parameter_addon addon __attribute__((unused))) { if (strcmp(enable, "yes") == 0) { CapturePacketsOnOlsrInterfaces = 1; return 0; } else if (strcmp(enable, "no") == 0) { CapturePacketsOnOlsrInterfaces = 0; return 0; } /* Value not recognized */ return 1; } /* SetCapturePacketsOnOlsrInterfaces */ /* ------------------------------------------------------------------------- * Function : SetBmfMechanism * Description: Overrule the default BMF mechanism to either BM_BROADCAST or * BM_UNICAST_PROMISCUOUS. * Input : mechanism - either "Broadcast" or "UnicastPromiscuous" * data - not used * addon - not used * Output : none * Return : success (0) or fail (1) * Data Used : none * ------------------------------------------------------------------------- */ int SetBmfMechanism( const char* mechanism, void* data __attribute__((unused)), set_plugin_parameter_addon addon __attribute__((unused))) { if (strcmp(mechanism, "Broadcast") == 0) { BmfMechanism = BM_BROADCAST; return 0; } else if (strcmp(mechanism, "UnicastPromiscuous") == 0) { BmfMechanism = BM_UNICAST_PROMISCUOUS; return 0; } /* Value not recognized */ return 1; } /* SetBmfMechanism */ /* ------------------------------------------------------------------------- * Function : AddDescriptorToInputSet * Description: Add a socket descriptor to the global set of socket file descriptors * Input : skfd - socket file descriptor * Output : none * Return : none * Data Used : HighestSkfd, InputSet * Notes : Keeps track of the highest-numbered descriptor * ------------------------------------------------------------------------- */ static void AddDescriptorToInputSet(int skfd) { /* Keep the highest-numbered descriptor */ if (skfd > HighestSkfd) { HighestSkfd = skfd; } /* Add descriptor to input set */ FD_SET(skfd, &InputSet); } /* AddDescriptorToInputSet */ /* To save the state of the IP spoof filter for the EtherTunTap interface */ static char EthTapSpoofState = '1'; /* ------------------------------------------------------------------------- * Function : DeactivateSpoofFilter * Description: Deactivates the Linux anti-spoofing filter for the tuntap * interface * Input : none * Output : none * Return : fail (0) or success (1) * Data Used : EtherTunTapIfName, EthTapSpoofState * Notes : Saves the current filter state for later restoring * ------------------------------------------------------------------------- */ int DeactivateSpoofFilter(void) { FILE* procSpoof; char procFile[FILENAME_MAX]; /* Generate the procfile name */ sprintf(procFile, "/proc/sys/net/ipv4/conf/%s/rp_filter", EtherTunTapIfName); /* Open procfile for reading */ procSpoof = fopen(procFile, "r"); if (procSpoof == NULL) { fprintf( stderr, "WARNING! Could not open the %s file to check/disable the IP spoof filter!\n" "Are you using the procfile filesystem?\n" "Does your system support IPv4?\n" "I will continue (in 3 sec) - but you should manually ensure that IP spoof\n" "filtering is disabled!\n\n", procFile); sleep(3); return 0; } EthTapSpoofState = (char)fgetc(procSpoof); fclose(procSpoof); /* Open procfile for writing */ procSpoof = fopen(procFile, "w"); if (procSpoof == NULL) { fprintf(stderr, "Could not open %s for writing!\n", procFile); fprintf( stderr, "I will continue (in 3 sec) - but you should manually ensure that IP" " spoof filtering is disabled!\n\n"); sleep(3); return 0; } syslog(LOG_INFO, "Writing \"0\" to %s", procFile); fputs("0", procSpoof); fclose(procSpoof); return 1; } /* DeactivateSpoofFilter */ /* ------------------------------------------------------------------------- * Function : RestoreSpoofFilter * Description: Restores the Linux anti-spoofing filter setting for the tuntap * interface * Input : none * Output : none * Return : none * Data Used : EtherTunTapIfName, EthTapSpoofState * ------------------------------------------------------------------------- */ void RestoreSpoofFilter(void) { FILE* procSpoof; char procFile[FILENAME_MAX]; /* Generate the procfile name */ sprintf(procFile, "/proc/sys/net/ipv4/conf/%s/rp_filter", EtherTunTapIfName); /* Open procfile for writing */ procSpoof = fopen(procFile, "w"); if (procSpoof == NULL) { fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procFile); } else { syslog(LOG_INFO, "Resetting %s to %c\n", procFile, EthTapSpoofState); fputc(EthTapSpoofState, procSpoof); fclose(procSpoof); } } /* RestoreSpoofFilter */ /* ------------------------------------------------------------------------- * Function : FindNeighbors * Description: Find the neighbors on a network interface to forward a BMF * packet to * Input : intf - the network interface * source - the source IP address of the BMF packet, or NULL if * unknown or not applicable * forwardedBy - the IP address of the node that forwarded the BMF * packet, or NULL if unknown or not applicable * forwardedTo - the IP address of the node to which the BMF packet * was directed, or NULL if unknown or not applicable * Output : neighbors - list of (up to a number of 'FanOutLimit') neighbors. * bestNeighbor - the best neighbor (in terms of lowest cost or ETX * value) * nPossibleNeighbors - number of found possible neighbors * Data Used : FanOutLimit * ------------------------------------------------------------------------- */ void FindNeighbors( struct TBestNeighbors* neighbors, struct link_entry** bestNeighbor, struct TBmfInterface* intf, union olsr_ip_addr* source, union olsr_ip_addr* forwardedBy, union olsr_ip_addr* forwardedTo, int* nPossibleNeighbors) { #ifndef NODEBUG struct ipaddr_str buf; #endif /* NODEBUG */ int i; /* Initialize */ *bestNeighbor = NULL; for (i = 0; i < MAX_UNICAST_NEIGHBORS; i++) { neighbors->links[i] = NULL; } *nPossibleNeighbors = 0; /* handle the non-LQ case */ if (olsr_cnf->lq_level == 0) { struct link_entry* walker; OLSR_FOR_ALL_LINK_ENTRIES(walker) { union olsr_ip_addr* neighborMainIp; /* Consider only links from the specified interface */ if (! ipequal(&intf->intAddr, &walker->local_iface_addr)) { continue; /* for */ } OLSR_PRINTF( 8, "%s: ----> considering forwarding pkt on \"%s\" to %s\n", PLUGIN_NAME_SHORT, intf->ifName, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); neighborMainIp = MainAddressOf(&walker->neighbor_iface_addr); /* Consider only neighbors with an IP address that differs from the * passed IP addresses (if passed). Rely on short-circuit boolean evaluation. */ if (source != NULL && ipequal(neighborMainIp, MainAddressOf(source))) { OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: is source of pkt\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); continue; /* for */ } /* Rely on short-circuit boolean evaluation */ if (forwardedBy != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedBy))) { OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: is the node that forwarded the pkt\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); continue; /* for */ } /* Rely on short-circuit boolean evaluation */ if (forwardedTo != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedTo))) { OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: is the node to which the pkt was forwarded\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); continue; /* for */ } /* Found a candidate neighbor to direct our packet to */ /* In the non-LQ case, it is not possible to select neigbors * by quality or cost. So just remember the first found link. * TODO: come on, there must be something better than to simply * select the first one found! */ if (*bestNeighbor == NULL) { *bestNeighbor = walker; } /* Fill the list with up to 'FanOutLimit' neighbors. If there * are more neighbors, broadcast is used instead of unicast. In that * case we do not need the list of neighbors. */ if (*nPossibleNeighbors < FanOutLimit) { neighbors->links[*nPossibleNeighbors] = walker; } *nPossibleNeighbors += 1; } OLSR_FOR_ALL_LINK_ENTRIES_END(walker); } /* handle the LQ case */ else { #ifdef USING_THALES_LINK_COST_ROUTING struct link_entry* walker; float previousLinkCost = 2 * INFINITE_COST; float bestLinkCost = 2 * INFINITE_COST; if (forwardedBy != NULL) { /* Retrieve the cost of the link from 'forwardedBy' to myself */ struct link_entry* bestLinkFromForwarder = get_best_link_to_neighbor(forwardedBy); if (bestLinkFromForwarder != NULL) { previousLinkCost = bestLinkFromForwarder->link_cost; } } for (walker = get_link_set(); walker != NULL; walker = walker->next) { union olsr_ip_addr* neighborMainIp; struct link_entry* bestLinkToNeighbor; struct tc_entry* tcLastHop; /* Consider only links from the specified interface */ if (! ipequal(&intf->intAddr, &walker->local_iface_addr)) { continue; /* for */ } OLSR_PRINTF( 9, "%s: ----> considering forwarding pkt on \"%s\" to %s\n", PLUGIN_NAME_SHORT, intf->ifName, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); neighborMainIp = MainAddressOf(&walker->neighbor_iface_addr); /* Consider only neighbors with an IP address that differs from the * passed IP addresses (if passed). Rely on short-circuit boolean evaluation. */ if (source != NULL && ipequal(neighborMainIp, MainAddressOf(source))) { OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: is source of pkt\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); continue; /* for */ } /* Rely on short-circuit boolean evaluation */ if (forwardedBy != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedBy))) { OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: is the node that forwarded the pkt\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); continue; /* for */ } /* Rely on short-circuit boolean evaluation */ if (forwardedTo != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedTo))) { OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: is the node to which the pkt was forwarded\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); continue; /* for */ } /* Found a candidate neighbor to direct our packet to */ if (walker->link_cost >= INFINITE_COST) { OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: link is timing out\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); continue; /* for */ } /* Compare costs to check if the candidate neighbor is best reached via 'intf' */ OLSR_PRINTF( 9, "%s: ----> forwarding pkt to %s will cost %5.2f\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr), walker->link_cost); /* If the candidate neighbor is best reached via another interface, then skip * the candidate neighbor; the candidate neighbor has been / will be selected via that * other interface. */ bestLinkToNeighbor = get_best_link_to_neighbor(&walker->neighbor_iface_addr); if (walker != bestLinkToNeighbor) { if (bestLinkToNeighbor == NULL) { OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: no link found\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); } else { struct interface* bestIntf = if_ifwithaddr(&bestLinkToNeighbor->local_iface_addr); OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: \"%s\" gives a better link to this neighbor, costing %5.2f\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr), bestIntf->int_name, bestLinkToNeighbor->link_cost); } continue; /* for */ } if (forwardedBy != NULL) { OLSR_PRINTF( 9, "%s: ----> 2-hop path from %s via me to %s will cost %5.2f\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&forwardedByBuf, forwardedBy), olsr_ip_to_string(&niaBuf, &walker->neighbor_iface_addr), previousLinkCost + walker->link_cost); } /* Check the topology table whether the 'forwardedBy' node is itself a direct * neighbor of the candidate neighbor, at a lower cost than the 2-hop route * via myself. If so, we do not need to forward the BMF packet to the candidate * neighbor, because the 'forwardedBy' node will forward the packet. */ if (forwardedBy != NULL) { tcLastHop = olsr_lookup_tc_entry(MainAddressOf(forwardedBy)); if (tcLastHop != NULL) { struct tc_edge_entry* tc_edge; tc_edge = olsr_lookup_tc_edge(tcLastHop, MainAddressOf(&walker->neighbor_iface_addr)); /* We are not interested in dead-end or dying edges. */ if (tc_edge != NULL && (tc_edge->flags & OLSR_TC_EDGE_DOWN) == 0) { if (previousLinkCost + walker->link_cost > tc_edge->link_cost) { #ifndef NODEBUG struct ipaddr_str neighbor_iface_buf, forw_buf; olsr_ip_to_string(&neighbor_iface_buf, &walker->neighbor_iface_addr); #endif /* NODEBUG */ OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: I am not an MPR between %s and %s, direct link costs %5.2f\n", PLUGIN_NAME_SHORT, neighbor_iface_buf.buf, olsr_ip_to_string(&forw_buf, forwardedBy), neighbor_iface_buf.buf, tc_edge->link_cost); continue; /* for */ } /* if */ } /* if */ } /* if */ } /* if */ /* Remember the best neighbor. If all are very bad, remember none. */ if (walker->link_cost < bestLinkCost) { *bestNeighbor = walker; bestLinkCost = walker->link_cost; } /* Fill the list with up to 'FanOutLimit' neighbors. If there * are more neighbors, broadcast is used instead of unicast. In that * case we do not need the list of neighbors. */ if (*nPossibleNeighbors < FanOutLimit) { neighbors->links[*nPossibleNeighbors] = walker; } *nPossibleNeighbors += 1; } /* for */ #else /* USING_THALES_LINK_COST_ROUTING */ struct link_entry* walker; olsr_linkcost previousLinkEtx = LINK_COST_BROKEN; olsr_linkcost bestEtx = LINK_COST_BROKEN; if (forwardedBy != NULL) { /* Retrieve the cost of the link from 'forwardedBy' to myself */ struct link_entry* bestLinkFromForwarder = get_best_link_to_neighbor(forwardedBy); if (bestLinkFromForwarder != NULL) { previousLinkEtx = bestLinkFromForwarder->linkcost; } } OLSR_FOR_ALL_LINK_ENTRIES(walker) { union olsr_ip_addr* neighborMainIp; struct link_entry* bestLinkToNeighbor; struct tc_entry* tcLastHop; float currEtx; /* Consider only links from the specified interface */ if (! ipequal(&intf->intAddr, &walker->local_iface_addr)) { continue; /* for */ } OLSR_PRINTF( 9, "%s: ----> considering forwarding pkt on \"%s\" to %s\n", PLUGIN_NAME_SHORT, intf->ifName, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); neighborMainIp = MainAddressOf(&walker->neighbor_iface_addr); /* Consider only neighbors with an IP address that differs from the * passed IP addresses (if passed). Rely on short-circuit boolean evaluation. */ if (source != NULL && ipequal(neighborMainIp, MainAddressOf(source))) { OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: is source of pkt\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); continue; /* for */ } /* Rely on short-circuit boolean evaluation */ if (forwardedBy != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedBy))) { OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: is the node that forwarded the pkt\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); continue; /* for */ } /* Rely on short-circuit boolean evaluation */ if (forwardedTo != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedTo))) { OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: is the node to which the pkt was forwarded\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); continue; /* for */ } /* Found a candidate neighbor to direct our packet to */ /* Calculate the link quality (ETX) of the link to the found neighbor */ currEtx = walker->linkcost; if (currEtx >= LINK_COST_BROKEN) { OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: link is timing out\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); continue; /* for */ } /* Compare costs to check if the candidate neighbor is best reached via 'intf' */ OLSR_PRINTF( 9, "%s: ----> forwarding pkt to %s will cost ETX %5.2f\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr), (double)currEtx); /* If the candidate neighbor is best reached via another interface, then skip * the candidate neighbor; the candidate neighbor has been / will be selected via that * other interface. */ bestLinkToNeighbor = get_best_link_to_neighbor(&walker->neighbor_iface_addr); if (walker != bestLinkToNeighbor) { if (bestLinkToNeighbor == NULL) { OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: no link found\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); } else { #ifndef NODEBUG struct interface* bestIntf = if_ifwithaddr(&bestLinkToNeighbor->local_iface_addr); struct lqtextbuffer lqbuffer; #endif /* NODEBUG */ OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: \"%s\" gives a better link to this neighbor, costing %s\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr), bestIntf ? bestIntf->int_name : "NULL", get_linkcost_text(bestLinkToNeighbor->linkcost, false, &lqbuffer)); } continue; /* for */ } if (forwardedBy != NULL) { #ifndef NODEBUG struct ipaddr_str forwardedByBuf, niaBuf; struct lqtextbuffer lqbuffer; #endif /* NODEBUG */ OLSR_PRINTF( 9, "%s: ----> 2-hop path from %s via me to %s will cost ETX %s\n", PLUGIN_NAME_SHORT, olsr_ip_to_string(&forwardedByBuf, forwardedBy), olsr_ip_to_string(&niaBuf, &walker->neighbor_iface_addr), get_linkcost_text(previousLinkEtx + currEtx, true, &lqbuffer)); } /* Check the topology table whether the 'forwardedBy' node is itself a direct * neighbor of the candidate neighbor, at a lower cost than the 2-hop route * via myself. If so, we do not need to forward the BMF packet to the candidate * neighbor, because the 'forwardedBy' node will forward the packet. */ if (forwardedBy != NULL) { tcLastHop = olsr_lookup_tc_entry(MainAddressOf(forwardedBy)); if (tcLastHop != NULL) { struct tc_edge_entry* tc_edge; tc_edge = olsr_lookup_tc_edge(tcLastHop, MainAddressOf(&walker->neighbor_iface_addr)); /* We are not interested in dead-end edges. */ if (tc_edge) { olsr_linkcost tcEtx = tc_edge->cost; if (previousLinkEtx + currEtx > tcEtx) { #ifndef NODEBUG struct ipaddr_str neighbor_iface_buf, forw_buf; struct lqtextbuffer lqbuffer; olsr_ip_to_string(&neighbor_iface_buf, &walker->neighbor_iface_addr); #endif /* NODEBUG */ OLSR_PRINTF( 9, "%s: ----> not forwarding to %s: I am not an MPR between %s and %s, direct link costs %s\n", PLUGIN_NAME_SHORT, neighbor_iface_buf.buf, olsr_ip_to_string(&forw_buf, forwardedBy), neighbor_iface_buf.buf, get_linkcost_text(tcEtx, false, &lqbuffer)); continue; /* for */ } /* if */ } /* if */ } /* if */ } /* if */ /* Remember the best neighbor. If all are very bad, remember none. */ if (currEtx < bestEtx) { *bestNeighbor = walker; bestEtx = currEtx; } /* Fill the list with up to 'FanOutLimit' neighbors. If there * are more neighbors, broadcast is used instead of unicast. In that * case we do not need the list of neighbors. */ if (*nPossibleNeighbors < FanOutLimit) { neighbors->links[*nPossibleNeighbors] = walker; } *nPossibleNeighbors += 1; } OLSR_FOR_ALL_LINK_ENTRIES_END(walker); #endif /* USING_THALES_LINK_COST_ROUTING */ } /* if */ /* Display the result of the neighbor search */ if (*nPossibleNeighbors == 0) { OLSR_PRINTF( 9, "%s: ----> no suitable neighbor found to forward to on \"%s\"\n", PLUGIN_NAME_SHORT, intf->ifName); } else { OLSR_PRINTF( 9, "%s: ----> %d neighbors found on \"%s\"; best neighbor to forward to: %s\n", PLUGIN_NAME_SHORT, *nPossibleNeighbors, intf->ifName, olsr_ip_to_string(&buf, &(*bestNeighbor)->neighbor_iface_addr)); } /* if */ } /* FindNeighbors */ /* ------------------------------------------------------------------------- * Function : CreateCaptureSocket * Description: Create socket for promiscuously capturing multicast IP traffic * Input : ifname - network interface (e.g. "eth0") * Output : none * Return : the socket descriptor ( >= 0), or -1 if an error occurred * Data Used : none * Notes : The socket is a cooked IP packet socket, bound to the specified * network interface * ------------------------------------------------------------------------- */ static int CreateCaptureSocket(const char* ifName) { int ifIndex = if_nametoindex(ifName); struct packet_mreq mreq; struct ifreq req; struct sockaddr_ll bindTo; /* Open cooked IP packet socket */ int skfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)); if (skfd < 0) { BmfPError("socket(PF_PACKET) error"); return -1; } /* Set interface to promiscuous mode */ memset(&mreq, 0, sizeof(struct packet_mreq)); mreq.mr_ifindex = ifIndex; mreq.mr_type = PACKET_MR_PROMISC; if (setsockopt(skfd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { BmfPError("setsockopt(PACKET_MR_PROMISC) error"); close(skfd); return -1; } /* Get hardware (MAC) address */ memset(&req, 0, sizeof(struct ifreq)); strncpy(req.ifr_name, ifName, IFNAMSIZ - 1); req.ifr_name[IFNAMSIZ-1] = '\0'; /* Ensures null termination */ if (ioctl(skfd, SIOCGIFHWADDR, &req) < 0) { BmfPError("error retrieving MAC address"); close(skfd); return -1; } /* Bind the socket to the specified interface */ memset(&bindTo, 0, sizeof(bindTo)); bindTo.sll_family = AF_PACKET; bindTo.sll_protocol = htons(ETH_P_IP); bindTo.sll_ifindex = ifIndex; memcpy(bindTo.sll_addr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); bindTo.sll_halen = IFHWADDRLEN; if (bind(skfd, (struct sockaddr*)&bindTo, sizeof(bindTo)) < 0) { BmfPError("bind() error"); close(skfd); return -1; } /* Set socket to blocking operation */ if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0) { BmfPError("fcntl() error"); close(skfd); return -1; } AddDescriptorToInputSet(skfd); return skfd; } /* CreateCaptureSocket */ /* ------------------------------------------------------------------------- * Function : CreateListeningSocket * Description: Create socket for promiscuously listening to BMF packets. * Used only when 'BmfMechanism' is BM_UNICAST_PROMISCUOUS * Input : ifname - network interface (e.g. "eth0") * Output : none * Return : the socket descriptor ( >= 0), or -1 if an error occurred * Data Used : none * Notes : The socket is a cooked IP packet socket, bound to the specified * network interface * ------------------------------------------------------------------------- */ static int CreateListeningSocket(const char* ifName) { int ifIndex = if_nametoindex(ifName); struct packet_mreq mreq; struct ifreq req; struct sockaddr_ll bindTo; /* Open cooked IP packet socket */ int skfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)); if (skfd < 0) { BmfPError("socket(PF_PACKET) error"); return -1; } /* Set interface to promiscuous mode */ memset(&mreq, 0, sizeof(struct packet_mreq)); mreq.mr_ifindex = ifIndex; mreq.mr_type = PACKET_MR_PROMISC; if (setsockopt(skfd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { BmfPError("setsockopt(PACKET_MR_PROMISC) error"); close(skfd); return -1; } /* Get hardware (MAC) address */ memset(&req, 0, sizeof(struct ifreq)); strncpy(req.ifr_name, ifName, IFNAMSIZ - 1); req.ifr_name[IFNAMSIZ-1] = '\0'; /* Ensures null termination */ if (ioctl(skfd, SIOCGIFHWADDR, &req) < 0) { BmfPError("error retrieving MAC address"); close(skfd); return -1; } /* Bind the socket to the specified interface */ memset(&bindTo, 0, sizeof(bindTo)); bindTo.sll_family = AF_PACKET; bindTo.sll_protocol = htons(ETH_P_IP); bindTo.sll_ifindex = ifIndex; memcpy(bindTo.sll_addr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); bindTo.sll_halen = IFHWADDRLEN; if (bind(skfd, (struct sockaddr*)&bindTo, sizeof(bindTo)) < 0) { BmfPError("bind() error"); close(skfd); return -1; } /* Set socket to blocking operation */ if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0) { BmfPError("fcntl() error"); close(skfd); return -1; } AddDescriptorToInputSet(skfd); return skfd; } /* CreateListeningSocket */ /* ------------------------------------------------------------------------- * Function : CreateEncapsulateSocket * Description: Create a socket for sending and receiving encapsulated * multicast packets * Input : ifname - network interface (e.g. "eth0") * Output : none * Return : the socket descriptor ( >= 0), or -1 if an error occurred * Data Used : none * Notes : The socket is an UDP (datagram) over IP socket, bound to the * specified network interface * ------------------------------------------------------------------------- */ static int CreateEncapsulateSocket(const char* ifName) { int on = 1; struct sockaddr_in bindTo; /* Open UDP-IP socket */ int skfd = socket(PF_INET, SOCK_DGRAM, 0); if (skfd < 0) { BmfPError("socket(PF_INET) error"); return -1; } /* Enable sending to broadcast addresses */ if (setsockopt(skfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) < 0) { BmfPError("setsockopt(SO_BROADCAST) error"); close(skfd); return -1; } /* Bind to the specific network interfaces indicated by ifName. */ /* When using Kernel 2.6 this must happer prior to the port binding! */ if (setsockopt(skfd, SOL_SOCKET, SO_BINDTODEVICE, ifName, strlen(ifName) + 1) < 0) { BmfPError("setsockopt(SO_BINDTODEVICE) error"); close(skfd); return -1; } /* Bind to BMF port */ memset(&bindTo, 0, sizeof(bindTo)); bindTo.sin_family = AF_INET; bindTo.sin_port = htons(BMF_ENCAP_PORT); bindTo.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(skfd, (struct sockaddr*)&bindTo, sizeof(bindTo)) < 0) { BmfPError("bind() error"); close(skfd); return -1; } /* Set socket to blocking operation */ if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0) { BmfPError("fcntl() error"); close(skfd); return -1; } AddDescriptorToInputSet(skfd); return skfd; } /* CreateEncapsulateSocket */ /* ------------------------------------------------------------------------- * Function : CreateLocalEtherTunTap * Description: Creates and brings up an EtherTunTap interface * Input : none * Output : none * Return : the socket file descriptor (>= 0), or -1 in case of failure * Data Used : EtherTunTapIfName - name used for the tuntap interface (e.g. * "bmf0") * EtherTunTapIp * EtherTunTapIpMask * EtherTunTapIpBroadcast * BmfInterfaces * Note : Order dependency: call this function only if BmfInterfaces * is filled with a list of network interfaces. * ------------------------------------------------------------------------- */ static int CreateLocalEtherTunTap(void) { static const char * deviceName = OS_TUNNEL_PATH; struct ifreq ifreq; int etfd; int ioctlSkfd; int ioctlres; etfd = open(deviceName, O_RDWR | O_NONBLOCK); if (etfd < 0) { BmfPError("error opening %s", deviceName); return -1; } memset(&ifreq, 0, sizeof(ifreq)); strncpy(ifreq.ifr_name, EtherTunTapIfName, IFNAMSIZ - 1); ifreq.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ /* Specify the IFF_TUN flag for IP packets. * Specify IFF_NO_PI for not receiving extra meta packet information. */ ifreq.ifr_flags = IFF_TUN; ifreq.ifr_flags |= IFF_NO_PI; if (ioctl(etfd, TUNSETIFF, (void *)&ifreq) < 0) { BmfPError("ioctl(TUNSETIFF) error on %s", deviceName); close(etfd); return -1; } memset(&ifreq, 0, sizeof(ifreq)); strncpy(ifreq.ifr_name, EtherTunTapIfName, IFNAMSIZ - 1); ifreq.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ ifreq.ifr_addr.sa_family = AF_INET; ioctlSkfd = socket(PF_INET, SOCK_DGRAM, 0); if (ioctlSkfd < 0) { BmfPError("socket(PF_INET) error on %s", deviceName); close(etfd); return -1; } /* Give the EtherTunTap interface an IP address. * The default IP address is the address of the first OLSR interface; * the default netmask is 255.255.255.255 . Having an all-ones netmask prevents * automatic entry of the BMF network interface in the routing table. */ if (EtherTunTapIp == ETHERTUNTAPIPNOTSET) { struct TBmfInterface* nextBmfIf = BmfInterfaces; while (nextBmfIf != NULL) { struct TBmfInterface* bmfIf = nextBmfIf; nextBmfIf = bmfIf->next; if (bmfIf->olsrIntf != NULL) { EtherTunTapIp = ntohl(bmfIf->intAddr.v4.s_addr); EtherTunTapIpBroadcast = EtherTunTapIp; } } } if (EtherTunTapIp == ETHERTUNTAPIPNOTSET) { /* No IP address configured for BMF network interface, and no OLSR interface found to * copy IP address from. Fall back to default: 10.255.255.253 . */ EtherTunTapIp = ETHERTUNTAPDEFAULTIP; } ((struct sockaddr_in*) ARM_NOWARN_ALIGN(&ifreq.ifr_addr))->sin_addr.s_addr = htonl(EtherTunTapIp); ioctlres = ioctl(ioctlSkfd, SIOCSIFADDR, &ifreq); if (ioctlres >= 0) { /* Set net mask */ ((struct sockaddr_in*) ARM_NOWARN_ALIGN(&ifreq.ifr_netmask))->sin_addr.s_addr = htonl(EtherTunTapIpMask); ioctlres = ioctl(ioctlSkfd, SIOCSIFNETMASK, &ifreq); if (ioctlres >= 0) { /* Set broadcast IP */ ((struct sockaddr_in*) ARM_NOWARN_ALIGN(&ifreq.ifr_broadaddr))->sin_addr.s_addr = htonl(EtherTunTapIpBroadcast); ioctlres = ioctl(ioctlSkfd, SIOCSIFBRDADDR, &ifreq); if (ioctlres >= 0) { /* Bring EtherTunTap interface up (if not already) */ ioctlres = ioctl(ioctlSkfd, SIOCGIFFLAGS, &ifreq); if (ioctlres >= 0) { ifreq.ifr_flags |= (IFF_UP | IFF_RUNNING | IFF_BROADCAST); ioctlres = ioctl(ioctlSkfd, SIOCSIFFLAGS, &ifreq); } } } } if (ioctlres < 0) { /* Any of the above ioctl() calls failed */ BmfPError("error bringing up EtherTunTap interface \"%s\"", EtherTunTapIfName); close(etfd); close(ioctlSkfd); return -1; } /* if (ioctlres < 0) */ /* Set the multicast flag on the interface */ memset(&ifreq, 0, sizeof(ifreq)); strncpy(ifreq.ifr_name, EtherTunTapIfName, IFNAMSIZ - 1); ifreq.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ ioctlres = ioctl(ioctlSkfd, SIOCGIFFLAGS, &ifreq); if (ioctlres >= 0) { ifreq.ifr_flags |= IFF_MULTICAST; ioctlres = ioctl(ioctlSkfd, SIOCSIFFLAGS, &ifreq); } if (ioctlres < 0) { /* Any of the two above ioctl() calls failed */ BmfPError("error setting multicast flag on EtherTunTap interface \"%s\"", EtherTunTapIfName); /* Continue anyway */ } /* Use ioctl to make the tuntap persistent. Otherwise it will disappear * when this program exits. That is not desirable, since a multicast * daemon (e.g. mrouted) may be using the tuntap interface. */ if (ioctl(etfd, TUNSETPERSIST, EtherTunTapPersistent ? (void *)&ifreq : NULL) < 0) { BmfPError("error making EtherTunTap interface \"%s\" %spersistent", EtherTunTapIfName, !EtherTunTapPersistent ? "non-" : ""); /* Continue anyway */ } OLSR_PRINTF(8, "%s: opened 1 socket on \"%s\"\n", PLUGIN_NAME_SHORT, EtherTunTapIfName); AddDescriptorToInputSet(etfd); /* If the user configured a specific IP address for the BMF network interface, * help the user and advertise the IP address of the BMF network interface * on the OLSR network via HNA */ if (TunTapIpOverruled != 0) { union olsr_ip_addr temp_net; temp_net.v4.s_addr = htonl(EtherTunTapIp); ip_prefix_list_add(&olsr_cnf->hna_entries, &temp_net, 32); } close(ioctlSkfd); return etfd; } /* CreateLocalEtherTunTap */ /* ------------------------------------------------------------------------- * Function : CreateInterface * Description: Create a new TBmfInterface object and adds it to the global * BmfInterfaces list * Input : ifName - name of the network interface (e.g. "eth0") * : olsrIntf - OLSR interface object of the network interface, or * NULL if the network interface is not OLSR-enabled * Output : none * Return : the number of opened sockets * Data Used : BmfInterfaces, LastBmfInterface * ------------------------------------------------------------------------- */ static int CreateInterface( const char* ifName, struct interface* olsrIntf) { int capturingSkfd = -1; int encapsulatingSkfd = -1; int listeningSkfd = -1; int ioctlSkfd; struct ifreq ifr; int nOpened = 0; struct TBmfInterface* newIf = malloc(sizeof(struct TBmfInterface)); assert(ifName != NULL); if (newIf == NULL) { return 0; } if (olsrIntf != NULL) { /* On OLSR-enabled interfaces, create socket for encapsulating and forwarding * multicast packets */ encapsulatingSkfd = CreateEncapsulateSocket(ifName); if (encapsulatingSkfd < 0) { free(newIf); return 0; } nOpened++; } /* Create socket for capturing and sending of multicast packets on * non-OLSR interfaces, and on OLSR-interfaces if configured. */ if ((olsrIntf == NULL) || (CapturePacketsOnOlsrInterfaces != 0)) { capturingSkfd = CreateCaptureSocket(ifName); if (capturingSkfd < 0) { if (encapsulatingSkfd >= 0) { close(encapsulatingSkfd); } free(newIf); return 0; } nOpened++; } /* Create promiscuous mode listening interface if BMF uses IP unicast * as underlying forwarding mechanism */ if (BmfMechanism == BM_UNICAST_PROMISCUOUS) { listeningSkfd = CreateListeningSocket(ifName); if (listeningSkfd < 0) { if (encapsulatingSkfd >= 0) { close(encapsulatingSkfd); /* no problem if 'encapsulatingSkfd' is -1 */ } free(newIf); return 0; } nOpened++; } /* For ioctl operations on the network interface, use either capturingSkfd * or encapsulatingSkfd, whichever is available */ ioctlSkfd = (capturingSkfd >= 0) ? capturingSkfd : encapsulatingSkfd; /* Retrieve the MAC address of the interface. */ memset(&ifr, 0, sizeof(struct ifreq)); strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1); ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ if (ioctl(ioctlSkfd, SIOCGIFHWADDR, &ifr) < 0) { BmfPError("ioctl(SIOCGIFHWADDR) error for interface \"%s\"", ifName); if (capturingSkfd >= 0) { close(capturingSkfd); } if (encapsulatingSkfd >= 0) { close(encapsulatingSkfd); } free(newIf); return 0; } /* add listeners to sockets */ if (capturingSkfd != -1) { add_olsr_socket(capturingSkfd, NULL, BMF_handle_captureFd, newIf, SP_IMM_READ); } if (encapsulatingSkfd != -1) { add_olsr_socket(encapsulatingSkfd, NULL, BMF_handle_encapsulatingFd, newIf, SP_IMM_READ); } if (listeningSkfd != -1) { add_olsr_socket(listeningSkfd, NULL, BMF_handle_listeningFd, newIf, SP_IMM_READ); } /* Copy data into TBmfInterface object */ newIf->capturingSkfd = capturingSkfd; newIf->encapsulatingSkfd = encapsulatingSkfd; newIf->listeningSkfd = listeningSkfd; memcpy(newIf->macAddr, ifr.ifr_hwaddr.sa_data, IFHWADDRLEN); memcpy(newIf->ifName, ifName, IFNAMSIZ); newIf->olsrIntf = olsrIntf; if (olsrIntf != NULL) { /* For an OLSR-interface, copy the interface address and broadcast * address from the OLSR interface object. Downcast to correct sockaddr * subtype. */ newIf->intAddr.v4 = ((struct sockaddr_in *)&olsrIntf->int_addr)->sin_addr; newIf->broadAddr.v4 = ((struct sockaddr_in *)&olsrIntf->int_broadaddr)->sin_addr; } else { /* For a non-OLSR interface, retrieve the IP address ourselves */ memset(&ifr, 0, sizeof(struct ifreq)); strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1); ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ if (ioctl(ioctlSkfd, SIOCGIFADDR, &ifr) < 0) { BmfPError("ioctl(SIOCGIFADDR) error for interface \"%s\"", ifName); newIf->intAddr.v4.s_addr = inet_addr("0.0.0.0"); } else { /* Downcast to correct sockaddr subtype */ newIf->intAddr.v4 = ((struct sockaddr_in *) ARM_NOWARN_ALIGN(&ifr.ifr_addr))->sin_addr; } /* For a non-OLSR interface, retrieve the IP broadcast address ourselves */ memset(&ifr, 0, sizeof(struct ifreq)); strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1); ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ if (ioctl(ioctlSkfd, SIOCGIFBRDADDR, &ifr) < 0) { BmfPError("ioctl(SIOCGIFBRDADDR) error for interface \"%s\"", ifName); newIf->broadAddr.v4.s_addr = inet_addr("0.0.0.0"); } else { /* Downcast to correct sockaddr subtype */ newIf->broadAddr.v4 = ((struct sockaddr_in *) ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr))->sin_addr; } } /* Reset counters */ newIf->nBmfPacketsRx = 0; newIf->nBmfPacketsRxDup = 0; newIf->nBmfPacketsTx = 0; /* Add new TBmfInterface object to global list. OLSR interfaces are * added at the front of the list, non-OLSR interfaces at the back. */ if (BmfInterfaces == NULL) { /* First TBmfInterface object in list */ newIf->next = NULL; BmfInterfaces = newIf; LastBmfInterface = newIf; } else if (olsrIntf != NULL) { /* Add new TBmfInterface object at front of list */ newIf->next = BmfInterfaces; BmfInterfaces = newIf; } else { /* Add new TBmfInterface object at back of list */ newIf->next = NULL; LastBmfInterface->next= newIf; LastBmfInterface = newIf; } OLSR_PRINTF( 8, "%s: opened %d socket%s on %s interface \"%s\"\n", PLUGIN_NAME_SHORT, nOpened, nOpened == 1 ? "" : "s", olsrIntf != NULL ? "OLSR" : "non-OLSR", ifName); return nOpened; } /* CreateInterface */ /* ------------------------------------------------------------------------- * Function : CreateBmfNetworkInterfaces * Description: Create a list of TBmfInterface objects, one for each network * interface on which BMF runs * Input : skipThisIntf - network interface to skip, if seen * Output : none * Return : fail (-1) or success (0) * Data Used : none * ------------------------------------------------------------------------- */ int CreateBmfNetworkInterfaces(struct interface* skipThisIntf) { int skfd; struct ifconf ifc; int numreqs = 30; struct ifreq* ifr; int n; int nOpenedSockets = 0; /* Clear input descriptor set */ FD_ZERO(&InputSet); skfd = socket(PF_INET, SOCK_DGRAM, 0); if (skfd < 0) { BmfPError("no inet socket available to retrieve interface list"); return -1; } /* Retrieve the network interface configuration list */ ifc.ifc_buf = NULL; for (;;) { ifc.ifc_len = sizeof(struct ifreq) * numreqs; ifc.ifc_buf = realloc(ifc.ifc_buf, ifc.ifc_len); if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) { BmfPError("ioctl(SIOCGIFCONF) error"); close(skfd); free(ifc.ifc_buf); return -1; } if ((unsigned)ifc.ifc_len == sizeof(struct ifreq) * numreqs) { /* Assume it overflowed; double the space and try again */ numreqs *= 2; assert(numreqs < 1024); continue; /* for (;;) */ } break; /* for (;;) */ } /* for (;;) */ close(skfd); /* For each item in the interface configuration list... */ ifr = ifc.ifc_req; for (n = ifc.ifc_len / sizeof(struct ifreq); --n >= 0; ifr++) { struct interface* olsrIntf; union olsr_ip_addr ipAddr; /* Skip the BMF network interface itself */ if (strncmp(ifr->ifr_name, EtherTunTapIfName, IFNAMSIZ) == 0) { continue; /* for (n = ...) */ } /* ...find the OLSR interface structure, if any */ ipAddr.v4 = ((struct sockaddr_in*) ARM_NOWARN_ALIGN(&ifr->ifr_addr))->sin_addr; olsrIntf = if_ifwithaddr(&ipAddr); if (skipThisIntf != NULL && olsrIntf == skipThisIntf) { continue; /* for (n = ...) */ } if (olsrIntf == NULL && ! IsNonOlsrBmfIf(ifr->ifr_name)) { /* Interface is neither OLSR interface, nor specified as non-OLSR BMF * interface in the BMF plugin parameter list */ continue; /* for (n = ...) */ } nOpenedSockets += CreateInterface(ifr->ifr_name, olsrIntf); } /* for (n = ...) */ free(ifc.ifc_buf); /* Create the BMF network interface */ EtherTunTapFd = CreateLocalEtherTunTap(); if (EtherTunTapFd >= 0) { add_olsr_socket(EtherTunTapFd, NULL, BMF_handle_tuntapFd, NULL, SP_IMM_READ); nOpenedSockets++; } if (BmfInterfaces == NULL) { olsr_printf(1, "%s: could not initialize any network interface\n", PLUGIN_NAME); } else { olsr_printf(1, "%s: opened %d sockets\n", PLUGIN_NAME, nOpenedSockets); } return 0; } /* CreateBmfNetworkInterfaces */ /* ------------------------------------------------------------------------- * Function : CloseBmfNetworkInterfaces * Description: Closes every socket on each network interface used by BMF * Input : none * Output : none * Return : none * Data Used : BmfInterfaces, LastBmfInterface * Notes : Closes * - the local EtherTunTap interface (e.g. "tun0" or "tap0") * - for each BMF-enabled interface, the socket used for * capturing multicast packets * - for each OLSR-enabled interface, the socket used for * encapsulating packets * Also restores the network state to the situation before BMF * was started. * ------------------------------------------------------------------------- */ void CloseBmfNetworkInterfaces(void) { int nClosed = 0; u_int32_t totalOlsrBmfPacketsRx = 0; u_int32_t totalOlsrBmfPacketsRxDup = 0; u_int32_t totalOlsrBmfPacketsTx = 0; u_int32_t totalNonOlsrBmfPacketsRx = 0; u_int32_t totalNonOlsrBmfPacketsRxDup = 0; u_int32_t totalNonOlsrBmfPacketsTx = 0; /* Close all opened sockets */ struct TBmfInterface* nextBmfIf = BmfInterfaces; while (nextBmfIf != NULL) { struct TBmfInterface* bmfIf = nextBmfIf; nextBmfIf = bmfIf->next; if (bmfIf->capturingSkfd >= 0) { close(bmfIf->capturingSkfd); remove_olsr_socket(bmfIf->capturingSkfd, NULL, BMF_handle_captureFd); nClosed++; } if (bmfIf->encapsulatingSkfd >= 0) { close(bmfIf->encapsulatingSkfd); remove_olsr_socket(bmfIf->encapsulatingSkfd, NULL, BMF_handle_encapsulatingFd); nClosed++; } if (bmfIf->listeningSkfd >= 0) { close(bmfIf->listeningSkfd); remove_olsr_socket(bmfIf->listeningSkfd, NULL, BMF_handle_listeningFd); nClosed++; } OLSR_PRINTF( 7, "%s: %s interface \"%s\": RX pkts %d (%d dups); TX pkts %d\n", PLUGIN_NAME_SHORT, bmfIf->olsrIntf != NULL ? "OLSR" : "non-OLSR", bmfIf->ifName, bmfIf->nBmfPacketsRx, bmfIf->nBmfPacketsRxDup, bmfIf->nBmfPacketsTx); olsr_printf( 1, "%s: closed %s interface \"%s\"\n", PLUGIN_NAME_SHORT, bmfIf->olsrIntf != NULL ? "OLSR" : "non-OLSR", bmfIf->ifName); /* Add totals */ if (bmfIf->olsrIntf != NULL) { totalOlsrBmfPacketsRx += bmfIf->nBmfPacketsRx; totalOlsrBmfPacketsRxDup += bmfIf->nBmfPacketsRxDup; totalOlsrBmfPacketsTx += bmfIf->nBmfPacketsTx; } else { totalNonOlsrBmfPacketsRx += bmfIf->nBmfPacketsRx; totalNonOlsrBmfPacketsRxDup += bmfIf->nBmfPacketsRxDup; totalNonOlsrBmfPacketsTx += bmfIf->nBmfPacketsTx; } free(bmfIf); } /* while */ if (EtherTunTapFd >= 0) { close(EtherTunTapFd); remove_olsr_socket(EtherTunTapFd, NULL, BMF_handle_tuntapFd); nClosed++; OLSR_PRINTF(7, "%s: closed \"%s\"\n", PLUGIN_NAME_SHORT, EtherTunTapIfName); } BmfInterfaces = NULL; LastBmfInterface = NULL; /* Re-initialize the IP address for the BMF network interface. Thanks to * Daniele Lacamera for finding and solving this bug. */ EtherTunTapIp = ETHERTUNTAPIPNOTSET; olsr_printf(1, "%s: closed %d sockets\n", PLUGIN_NAME_SHORT, nClosed); OLSR_PRINTF( 7, "%s: total all OLSR interfaces : RX pkts %d (%d dups); TX pkts %d\n", PLUGIN_NAME_SHORT, totalOlsrBmfPacketsRx, totalOlsrBmfPacketsRxDup, totalOlsrBmfPacketsTx); OLSR_PRINTF( 7, "%s: total all non-OLSR interfaces: RX pkts %d (%d dups); TX pkts %d\n", PLUGIN_NAME_SHORT, totalNonOlsrBmfPacketsRx, totalNonOlsrBmfPacketsRxDup, totalNonOlsrBmfPacketsTx); } /* CloseBmfNetworkInterfaces */ #define MAX_NON_OLSR_IFS 32 static char NonOlsrIfNames[MAX_NON_OLSR_IFS][IFNAMSIZ]; static int nNonOlsrIfs = 0; /* ------------------------------------------------------------------------- * Function : AddNonOlsrBmfIf * Description: Add an non-OLSR enabled network interface to the list of BMF-enabled * network interfaces * Input : ifName - network interface (e.g. "eth0") * data - not used * addon - not used * Output : none * Return : success (0) or fail (1) * Data Used : NonOlsrIfNames * ------------------------------------------------------------------------- */ int AddNonOlsrBmfIf( const char* ifName, void* data __attribute__((unused)), set_plugin_parameter_addon addon __attribute__((unused))) { assert(ifName != NULL); if (nNonOlsrIfs >= MAX_NON_OLSR_IFS) { olsr_printf( 1, "%s: too many non-OLSR interfaces specified, maximum is %d\n", PLUGIN_NAME, MAX_NON_OLSR_IFS); return 1; } strncpy(NonOlsrIfNames[nNonOlsrIfs], ifName, IFNAMSIZ - 1); NonOlsrIfNames[nNonOlsrIfs][IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ nNonOlsrIfs++; return 0; } /* AddNonOlsrBmfIf */ /* ------------------------------------------------------------------------- * Function : IsNonOlsrBmfIf * Description: Checks if a network interface is OLSR-enabled * Input : ifName - network interface (e.g. "eth0") * Output : none * Return : true (1) or false (0) * Data Used : NonOlsrIfNames * ------------------------------------------------------------------------- */ int IsNonOlsrBmfIf(const char* ifName) { int i; assert(ifName != NULL); for (i = 0; i < nNonOlsrIfs; i++) { if (strncmp(NonOlsrIfNames[i], ifName, IFNAMSIZ) == 0) return 1; } return 0; } /* IsNonOlsrBmfIf */ /* ------------------------------------------------------------------------- * Function : CheckAndUpdateLocalBroadcast * Description: For an IP packet, check if the destination address is not a * multicast address. If it is not, the packet is assumed to be * a local broadcast packet. In that case, set the destination * address of the IP packet to the passed broadcast address. * Input : ipPacket - the IP packet * broadAddr - the broadcast address to fill in * Output : none * Return : none * Data Used : none * Notes : See also RFC1141 * ------------------------------------------------------------------------- */ void CheckAndUpdateLocalBroadcast(unsigned char* ipPacket, union olsr_ip_addr* broadAddr) { struct iphdr* iph; union olsr_ip_addr destIp; assert(ipPacket != NULL && broadAddr != NULL); iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket); destIp.v4.s_addr = iph->daddr; if (! IsMulticast(&destIp)) { u_int32_t origDaddr, newDaddr; u_int32_t check; origDaddr = ntohl(iph->daddr); iph->daddr = broadAddr->v4.s_addr; newDaddr = ntohl(iph->daddr); /* Re-calculate IP header checksum for new destination */ check = ntohs(iph->check); check = ~ (~ check - ((origDaddr >> 16) & 0xFFFF) + ((newDaddr >> 16) & 0xFFFF)); check = ~ (~ check - (origDaddr & 0xFFFF) + (newDaddr & 0xFFFF)); /* Add carry */ check = check + (check >> 16); iph->check = htons(check); if (iph->protocol == SOL_UDP) { /* Re-calculate UDP/IP checksum for new destination */ int ipHeaderLen = GetIpHeaderLength(ipPacket); struct udphdr* udph = (struct udphdr*) ARM_NOWARN_ALIGN((ipPacket + ipHeaderLen)); /* RFC 1624, Eq. 3: HC' = ~(~HC - m + m') */ check = ntohs(udph->check); check = ~ (~ check - ((origDaddr >> 16) & 0xFFFF) + ((newDaddr >> 16) & 0xFFFF)); check = ~ (~ check - (origDaddr & 0xFFFF) + (newDaddr & 0xFFFF)); /* Add carry */ check = check + (check >> 16); udph->check = htons(check); } /* if */ } /* if */ } /* CheckAndUpdateLocalBroadcast */ /* ------------------------------------------------------------------------- * Function : AddMulticastRoute * Description: Insert a route to all multicast addresses in the kernel * routing table. The route will be via the BMF network interface. * Input : none * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ void AddMulticastRoute(void) { struct rtentry kernel_route; int ioctlSkfd = socket(PF_INET, SOCK_DGRAM, 0); if (ioctlSkfd < 0) { BmfPError("socket(PF_INET) error"); return; } memset(&kernel_route, 0, sizeof(struct rtentry)); ((struct sockaddr *) ARM_NOWARN_ALIGN(&kernel_route.rt_dst))->sa_family = AF_INET; ((struct sockaddr *) ARM_NOWARN_ALIGN(&kernel_route.rt_gateway))->sa_family = AF_INET; ((struct sockaddr *) ARM_NOWARN_ALIGN(&kernel_route.rt_genmask))->sa_family = AF_INET; /* 224.0.0.0/4 */ ((struct sockaddr_in *) ARM_NOWARN_ALIGN(&kernel_route.rt_dst))->sin_addr.s_addr = htonl(0xE0000000); ((struct sockaddr_in *) ARM_NOWARN_ALIGN(&kernel_route.rt_genmask))->sin_addr.s_addr = htonl(0xF0000000); kernel_route.rt_metric = 0; kernel_route.rt_flags = RTF_UP; kernel_route.rt_dev = EtherTunTapIfName; if (ioctl(ioctlSkfd, SIOCADDRT, &kernel_route) < 0) { BmfPError("error setting multicast route via EtherTunTap interface \"%s\"", EtherTunTapIfName); /* Continue anyway */ } close(ioctlSkfd); } /* AddMulticastRoute */ /* ------------------------------------------------------------------------- * Function : DeleteMulticastRoute * Description: Delete the route to all multicast addresses from the kernel * routing table * Input : none * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ void DeleteMulticastRoute(void) { if (EtherTunTapIp != ETHERTUNTAPDEFAULTIP) { struct rtentry kernel_route; int ioctlSkfd = socket(PF_INET, SOCK_DGRAM, 0); if (ioctlSkfd < 0) { BmfPError("socket(PF_INET) error"); return; } memset(&kernel_route, 0, sizeof(struct rtentry)); ((struct sockaddr *) ARM_NOWARN_ALIGN(&kernel_route.rt_dst))->sa_family = AF_INET; ((struct sockaddr *) ARM_NOWARN_ALIGN(&kernel_route.rt_gateway))->sa_family = AF_INET; ((struct sockaddr *) ARM_NOWARN_ALIGN(&kernel_route.rt_genmask))->sa_family = AF_INET; /* 224.0.0.0/4 */ ((struct sockaddr_in *) ARM_NOWARN_ALIGN(&kernel_route.rt_dst))->sin_addr.s_addr = htonl(0xE0000000); ((struct sockaddr_in *) ARM_NOWARN_ALIGN(&kernel_route.rt_genmask))->sin_addr.s_addr = htonl(0xF0000000); kernel_route.rt_metric = 0; kernel_route.rt_flags = RTF_UP; kernel_route.rt_dev = EtherTunTapIfName; if (ioctl(ioctlSkfd, SIOCDELRT, &kernel_route) < 0) { BmfPError("error deleting multicast route via EtherTunTap interface \"%s\"", EtherTunTapIfName); /* Continue anyway */ } close(ioctlSkfd); } /* if */ } /* DeleteMulticastRoute */ olsrd-0.6.6.2/lib/bmf/src/NetworkInterfaces.h000066400000000000000000000122461234304727700207330ustar00rootroot00000000000000#ifndef _BMF_NETWORKINTERFACES_H #define _BMF_NETWORKINTERFACES_H /* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Thales, BMF nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ------------------------------------------------------------------------- * File : NetworkInterfaces.h * Description: Functions to open and close sockets * Created : 29 Jun 2006 * * ------------------------------------------------------------------------- */ /* System includes */ #include /* struct in_addr */ /* OLSR includes */ #include "olsr_types.h" /* olsr_ip_addr */ #include "olsrd_plugin.h" /* union set_plugin_parameter_addon */ /* Plugin includes */ #include "Packet.h" /* IFHWADDRLEN */ /* Size of buffer in which packets are received */ #define BMF_BUFFER_SIZE 2048 struct TBmfInterface { /* File descriptor of raw packet socket, used for capturing multicast packets */ int capturingSkfd; /* File descriptor of UDP (datagram) socket for encapsulated multicast packets. * Only used for OLSR-enabled interfaces; set to -1 if interface is not OLSR-enabled. */ int encapsulatingSkfd; /* File descriptor of UDP packet socket, used for listening to encapsulation packets. * Used only when PlParam "BmfMechanism" is set to "UnicastPromiscuous". */ int listeningSkfd; unsigned char macAddr[IFHWADDRLEN]; char ifName[IFNAMSIZ]; /* OLSRs idea of this network interface. NULL if this interface is not * OLSR-enabled. */ struct interface* olsrIntf; /* IP address of this network interface */ union olsr_ip_addr intAddr; /* Broadcast address of this network interface */ union olsr_ip_addr broadAddr; /* Number of received and transmitted BMF packets on this interface */ u_int32_t nBmfPacketsRx; u_int32_t nBmfPacketsRxDup; u_int32_t nBmfPacketsTx; /* Next element in list */ struct TBmfInterface* next; }; extern struct TBmfInterface* BmfInterfaces; extern int HighestSkfd; extern fd_set InputSet; extern int EtherTunTapFd; extern char EtherTunTapIfName[]; /* 10.255.255.253 in host byte order */ #define ETHERTUNTAPDEFAULTIP 0x0AFFFFFD extern u_int32_t EtherTunTapIp; extern u_int32_t EtherTunTapIpMask; extern u_int32_t EtherTunTapIpBroadcast; extern int CapturePacketsOnOlsrInterfaces; enum TBmfMechanism { BM_BROADCAST = 0, BM_UNICAST_PROMISCUOUS }; extern enum TBmfMechanism BmfMechanism; int SetBmfInterfaceName(const char* ifname, void* data, set_plugin_parameter_addon addon); int SetBmfInterfaceIp(const char* ip, void* data, set_plugin_parameter_addon addon); int SetBmfInterfacePersistent(const char* value, void* data, set_plugin_parameter_addon addon); int SetCapturePacketsOnOlsrInterfaces(const char* enable, void* data, set_plugin_parameter_addon addon); int SetBmfMechanism(const char* mechanism, void* data, set_plugin_parameter_addon addon); int DeactivateSpoofFilter(void); void RestoreSpoofFilter(void); #define MAX_UNICAST_NEIGHBORS 10 struct TBestNeighbors { struct link_entry* links[MAX_UNICAST_NEIGHBORS]; }; void FindNeighbors( struct TBestNeighbors* neighbors, struct link_entry** bestNeighbor, struct TBmfInterface* intf, union olsr_ip_addr* source, union olsr_ip_addr* forwardedBy, union olsr_ip_addr* forwardedTo, int* nPossibleNeighbors); int CreateBmfNetworkInterfaces(struct interface* skipThisIntf); void CloseBmfNetworkInterfaces(void); int AddNonOlsrBmfIf(const char* ifName, void* data, set_plugin_parameter_addon addon); int IsNonOlsrBmfIf(const char* ifName); void CheckAndUpdateLocalBroadcast(unsigned char* ipPacket, union olsr_ip_addr* broadAddr); void AddMulticastRoute(void); void DeleteMulticastRoute(void); #endif /* _BMF_NETWORKINTERFACES_H */ olsrd-0.6.6.2/lib/bmf/src/Packet.c000066400000000000000000000210261234304727700164740ustar00rootroot00000000000000/* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Thales, BMF nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ------------------------------------------------------------------------- * File : Packet.c * Description: IP packet and Ethernet frame processing functions * Created : 29 Jun 2006 * * ------------------------------------------------------------------------- */ #include "olsr.h" #include "Packet.h" /* System includes */ #include /* NULL */ #include /* assert() */ #include /* memcpy() */ #include /* u_int8_t, u_int16_t, u_int32_t */ #include /* ntohs(), htons() */ #include /* struct iphdr */ /* ------------------------------------------------------------------------- * Function : IsIpFragment * Description: Check if an IP packet is an IP fragment * Input : ipPacket - the IP packet * Output : none * Return : true (1) or false (0) * Data Used : none * ------------------------------------------------------------------------- */ int IsIpFragment(unsigned char* ipPacket) { struct ip* iph; assert(ipPacket != NULL); iph = (struct ip*) ARM_NOWARN_ALIGN(ipPacket); if ((ntohs(iph->ip_off) & IP_OFFMASK) != 0) { return 1; } return 0; } /* IsIpFragment */ /* ------------------------------------------------------------------------- * Function : GetIpTotalLength * Description: Retrieve the total length of the IP packet (in bytes) of * an IP packet * Input : ipPacket - the IP packet * Output : none * Return : IP packet length * Data Used : none * ------------------------------------------------------------------------- */ u_int16_t GetIpTotalLength(unsigned char* ipPacket) { struct iphdr* iph; assert(ipPacket != NULL); iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket); return ntohs(iph->tot_len); } /* GetIpTotalLength */ /* ------------------------------------------------------------------------- * Function : GetIpHeaderLength * Description: Retrieve the IP header length (in bytes) of an IP packet * Input : ipPacket - the IP packet * Output : none * Return : IP header length * Data Used : none * ------------------------------------------------------------------------- */ unsigned int GetIpHeaderLength(unsigned char* ipPacket) { struct iphdr* iph; assert(ipPacket != NULL); iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket); return iph->ihl << 2; } /* GetIpHeaderLength */ /* ------------------------------------------------------------------------- * Function : GetTtl * Description: Retrieve the TTL (Time To Live) value from the IP header of * an IP packet * Input : ipPacket - the IP packet * Output : none * Return : TTL value * Data Used : none * ------------------------------------------------------------------------- */ u_int8_t GetTtl(unsigned char* ipPacket) { struct iphdr* iph; assert(ipPacket != NULL); iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket); return iph->ttl; } /* GetTtl */ /* ------------------------------------------------------------------------- * Function : SaveTtlAndChecksum * Description: Save the TTL (Time To Live) value and IP checksum as found in * the IP header of an IP packet * Input : ipPacket - the IP packet * Output : sttl - the TTL and checksum values * Return : none * Data Used : none * ------------------------------------------------------------------------- */ void SaveTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl) { struct iphdr* iph; assert(ipPacket != NULL && sttl != NULL); iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket); sttl->ttl = iph->ttl; sttl->check = ntohs(iph->check); } /* SaveTtlAndChecksum */ /* ------------------------------------------------------------------------- * Function : RestoreTtlAndChecksum * Description: Restore the TTL (Time To Live) value and IP checksum in * the IP header of an IP packet * Input : ipPacket - the IP packet * sttl - the TTL and checksum values * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ void RestoreTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl) { struct iphdr* iph; assert(ipPacket != NULL && sttl != NULL); iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket); iph->ttl = sttl->ttl; iph->check = htons(sttl->check); } /* RestoreTtlAndChecksum */ /* ------------------------------------------------------------------------- * Function : DecreaseTtlAndUpdateHeaderChecksum * Description: For an IP packet, decrement the TTL value and update the IP header * checksum accordingly. * Input : ipPacket - the IP packet * Output : none * Return : none * Data Used : none * Notes : See also RFC1141 * ------------------------------------------------------------------------- */ void DecreaseTtlAndUpdateHeaderChecksum(unsigned char* ipPacket) { struct iphdr* iph; u_int32_t sum; assert(ipPacket != NULL); iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket); iph->ttl--; /* decrement ttl */ sum = ntohs(iph->check) + 0x100; /* increment checksum high byte */ iph->check = htons(sum + (sum>>16)); /* add carry */ } /* DecreaseTtlAndUpdateHeaderChecksum */ /* ------------------------------------------------------------------------- * Function : GetIpHeader * Description: Retrieve the IP header from BMF encapsulation UDP data * Input : encapsulationUdpData - the encapsulation UDP data * Output : none * Return : IP header * Data Used : none * ------------------------------------------------------------------------- */ struct ip* GetIpHeader(unsigned char* encapsulationUdpData) { return (struct ip*) ARM_NOWARN_ALIGN((encapsulationUdpData + ENCAP_HDR_LEN)); } /* GetIpHeader */ /* ------------------------------------------------------------------------- * Function : GetIpPacket * Description: Retrieve the IP packet from BMF encapsulation UDP data * Input : encapsulationUdpData - the encapsulation UDP data * Output : none * Return : The IP packet * Data Used : none * ------------------------------------------------------------------------- */ unsigned char* GetIpPacket(unsigned char* encapsulationUdpData) { return encapsulationUdpData + ENCAP_HDR_LEN; } /* GetIpPacket */ /* ------------------------------------------------------------------------- * Function : GetEncapsulationUdpDataLength * Description: Return the length of BMF encapsulation UDP data * Input : encapsulationUdpData - the encapsulation UDP data * Output : none * Return : The encapsulation data length * Data Used : none * ------------------------------------------------------------------------- */ u_int16_t GetEncapsulationUdpDataLength(unsigned char* encapsulationUdpData) { return GetIpTotalLength(GetIpPacket(encapsulationUdpData)) + ENCAP_HDR_LEN; } /* GetEncapsulationUdpDataLength */ olsrd-0.6.6.2/lib/bmf/src/Packet.h000066400000000000000000000064251234304727700165070ustar00rootroot00000000000000#ifndef _BMF_PACKET_H #define _BMF_PACKET_H /* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Thales, BMF nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ------------------------------------------------------------------------- * File : Packet.h * Description: BMF and IP packet processing functions * Created : 29 Jun 2006 * * ------------------------------------------------------------------------- */ /* System includes */ #include /* IFNAMSIZ, IFHWADDRLEN */ #include /* u_int8_t, u_int16_t */ /* BMF-encapsulated packets are Ethernet-IP-UDP packets, which start * with a 8-bytes BMF header (struct TEncapHeader), followed by the * encapsulated Ethernet-IP packet itself */ struct TEncapHeader { /* Use a standard Type-Length-Value (TLV) element */ u_int8_t type; u_int8_t len; u_int16_t reserved; /* Always 0 */ u_int32_t crc32; } __attribute__((__packed__)); #define ENCAP_HDR_LEN ((int)sizeof(struct TEncapHeader)) #define BMF_ENCAP_TYPE 1 #define BMF_ENCAP_LEN 6 struct TSaveTtl { u_int8_t ttl; u_int16_t check; } __attribute__((__packed__)); int IsIpFragment(unsigned char* ipPacket); u_int16_t GetIpTotalLength(unsigned char* ipPacket); unsigned int GetIpHeaderLength(unsigned char* ipPacket); u_int8_t GetTtl(unsigned char* ipPacket); void SaveTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl); void RestoreTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl); void DecreaseTtlAndUpdateHeaderChecksum(unsigned char* ipPacket); struct ip* GetIpHeader(unsigned char* encapsulationUdpData); unsigned char* GetIpPacket(unsigned char* encapsulationUdpData); u_int16_t GetEncapsulationUdpDataLength(unsigned char* encapsulationUdpData); #endif /* _BMF_PACKET_H */ olsrd-0.6.6.2/lib/bmf/src/PacketHistory.c000066400000000000000000000222731234304727700200630ustar00rootroot00000000000000/* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Thales, BMF nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ------------------------------------------------------------------------- * File : PacketHistory.c * Description: Functions for keeping and accessing the history of processed * multicast IP packets. * Created : 29 Jun 2006 * * ------------------------------------------------------------------------- */ #include "PacketHistory.h" /* System includes */ #include /* NULL */ #include /* assert() */ #include /* memset */ #include /* u_int16_t, u_int32_t */ #include /* struct iphdr */ #include /* free() */ /* OLSRD includes */ #include "olsr.h" /* olsr_malloc */ #include "scheduler.h" /* GET_TIMESTAMP, TIMED_OUT */ /* Plugin includes */ #include "Packet.h" static struct TDupEntry* PacketHistory[HISTORY_HASH_SIZE]; #define CRC_UPTO_NBYTES 256 /* ------------------------------------------------------------------------- * Function : GenerateCrc32Table * Description: Generate the table of CRC remainders for all possible bytes, * according to CRC-32-IEEE 802.3 * Input : none * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ #define CRC32_POLYNOMIAL 0xedb88320UL /* bit-inverse of 0x04c11db7UL */ static unsigned long CrcTable[256]; static void GenerateCrc32Table(void) { int i, j; u_int32_t crc; for (i = 0; i < 256; i++) { crc = (u_int32_t) i; for (j = 0; j < 8; j++) { if (crc & 1) { crc = (crc >> 1) ^ CRC32_POLYNOMIAL; } else { crc = (crc >> 1); } } CrcTable[i] = crc; } /* for */ } /* GenerateCrc32Table */ /* ------------------------------------------------------------------------- * Function : CalcCrc32 * Description: Calculate CRC-32 according to CRC-32-IEEE 802.3 * Input : buffer - the bytes to calculate the CRC value over * len - the number of bytes to calculate the CRC value over * Output : none * Return : CRC-32 value * Data Used : none * ------------------------------------------------------------------------- */ static u_int32_t CalcCrc32(unsigned char* buffer, ssize_t len) { int i, j; u_int32_t crc = 0xffffffffUL; for (i = 0; i < len; i++) { j = ((int) (crc & 0xFF) ^ *buffer++); crc = (crc >> 8) ^ CrcTable[j]; } return crc ^ 0xffffffffUL; } /* CalcCrc32 */ /* ------------------------------------------------------------------------- * Function : PacketCrc32 * Description: Calculates the CRC-32 value for an IP packet * Input : ipPacket - the IP packet * len - the number of octets in the IP packet * Output : none * Return : 32-bits CRC value * Data Used : none * ------------------------------------------------------------------------- */ u_int32_t PacketCrc32(unsigned char* ipPacket, ssize_t len) { struct TSaveTtl sttl; struct ip* ipHeader; u_int32_t result; assert(ipPacket != NULL); /* Skip TTL: in a multi-homed OLSR-network, the same multicast packet * may enter the network multiple times, each copy differing only in its * TTL value. BMF must not calculate a different CRC for packets that * differ only in TTL. Skip also the IP-header checksum, because it changes * along with TTL. Besides, it is not a good idea to calculate a CRC over * data that already contains a checksum. * * Clip number of bytes over which CRC is calculated to prevent * long packets from possibly claiming too much CPU resources. */ assert(len > 0); if (len > CRC_UPTO_NBYTES) { len = CRC_UPTO_NBYTES; } SaveTtlAndChecksum(ipPacket, &sttl); ipHeader = (struct ip*) ARM_NOWARN_ALIGN(ipPacket); ipHeader->ip_ttl = 0xFF; /* fixed value of TTL for CRC-32 calculation */ ipHeader->ip_sum = 0x5A5A; /* fixed value of IP header checksum for CRC-32 calculation */ result = CalcCrc32(ipPacket, len); RestoreTtlAndChecksum(ipPacket, &sttl); return result; } /* PacketCrc32 */ /* ------------------------------------------------------------------------- * Function : Hash * Description: Calculates a hash value from a 32-bit value * Input : from32 - 32-bit value * Output : none * Return : hash value * Data Used : none * ------------------------------------------------------------------------- */ u_int32_t Hash(u_int32_t from32) { return ((from32 >> N_HASH_BITS) + from32) & ((1 << N_HASH_BITS) - 1); } /* Hash */ /* ------------------------------------------------------------------------- * Function : InitPacketHistory * Description: Initialize the packet history table and CRC-32 table * Input : none * Output : none * Return : none * Data Used : PacketHistory * ------------------------------------------------------------------------- */ void InitPacketHistory(void) { int i; GenerateCrc32Table(); for(i = 0; i < HISTORY_HASH_SIZE; i++) { PacketHistory[i] = NULL; } } /* InitPacketHistory */ /* ------------------------------------------------------------------------- * Function : CheckAndMarkRecentPacket * Description: Check if this packet was seen recently, then record the fact * that this packet was seen recently. * Input : crc32 - 32-bits crc value of the packet * Output : none * Return : not recently seen (0), recently seen (1) * Data Used : PacketHistory * ------------------------------------------------------------------------- */ int CheckAndMarkRecentPacket(u_int32_t crc32) { u_int32_t idx; struct TDupEntry* walker; struct TDupEntry* newEntry; idx = Hash(crc32); assert(idx < HISTORY_HASH_SIZE); for (walker = PacketHistory[idx]; walker != NULL; walker = walker->next) { if (walker->crc32 == crc32) { /* Found duplicate entry */ /* Always mark as "seen recently": refresh time-out */ walker->timeOut = olsr_getTimestamp(HISTORY_HOLD_TIME); return 1; } /* if */ } /* for */ /* No duplicate entry found: create one */ newEntry = olsr_malloc(sizeof(struct TDupEntry), "BMF: TDupEntry"); if (newEntry != NULL) { newEntry->crc32 = crc32; newEntry->timeOut = olsr_getTimestamp(HISTORY_HOLD_TIME); /* Add new entry at the front of the list */ newEntry->next = PacketHistory[idx]; PacketHistory[idx] = newEntry; } return 0; } /* CheckAndMarkRecentPacket */ /* ------------------------------------------------------------------------- * Function : PrunePacketHistory * Description: Prune the packet history table. * Input : useless - not used * Output : none * Return : none * Data Used : PacketHistory * ------------------------------------------------------------------------- */ void PrunePacketHistory(void* useless __attribute__((unused))) { uint i; for (i = 0; i < HISTORY_HASH_SIZE; i++) { if (PacketHistory[i] != NULL) { struct TDupEntry* nextEntry = PacketHistory[i]; struct TDupEntry* prevEntry = NULL; while (nextEntry != NULL) { struct TDupEntry* entry = nextEntry; nextEntry = entry->next; if (olsr_isTimedOut(entry->timeOut)) { /* De-queue */ if (prevEntry != NULL) { prevEntry->next = entry->next; } else { PacketHistory[i] = entry->next; } /* if */ /* De-allocate memory */ free(entry); } else { prevEntry = entry; } /* if */ } /* while */ } /* if (PacketHistory[i] != NULL) */ } /* for (i = ...) */ } /* PrunePacketHistory */ olsrd-0.6.6.2/lib/bmf/src/PacketHistory.h000066400000000000000000000052251234304727700200660ustar00rootroot00000000000000#ifndef _BMF_PACKETHISTORY_H #define _BMF_PACKETHISTORY_H /* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Thales, BMF nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ------------------------------------------------------------------------- * File : PacketHistory.h * Description: Functions for keeping and accessing the history of processed * multicast IP packets. * Created : 29 Jun 2006 * * ------------------------------------------------------------------------- */ /* System includes */ #include /* ssize_t */ #include /* clock_t */ #define N_HASH_BITS 12 #define HISTORY_HASH_SIZE (1 << N_HASH_BITS) /* Time-out of duplicate entries, in milliseconds */ #define HISTORY_HOLD_TIME 3000 struct TDupEntry { u_int32_t crc32; clock_t timeOut; struct TDupEntry* next; }; void InitPacketHistory(void); u_int32_t PacketCrc32(unsigned char* ipPkt, ssize_t len); u_int32_t Hash(u_int32_t from32); void MarkRecentPacket(u_int32_t crc32); int CheckAndMarkRecentPacket(u_int32_t crc32); void PrunePacketHistory(void*); #endif /* _BMF_PACKETHISTORY_H */ olsrd-0.6.6.2/lib/bmf/src/olsrd_plugin.c000066400000000000000000000155561234304727700200010ustar00rootroot00000000000000/* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Thales, BMF nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ------------------------------------------------------------------------- * File : olsrd_plugin.c * Description: Interface to the OLSRD plugin system * Created : 29 Jun 2006 * * ------------------------------------------------------------------------- */ /* System includes */ #include /* assert() */ #include /* NULL */ /* OLSRD includes */ #include "olsrd_plugin.h" #include "plugin_util.h" #include "defs.h" /* olsr_u8_t, olsr_cnf */ #include "scheduler.h" /* olsr_start_timer() */ /* BMF includes */ #include "Bmf.h" /* InitBmf(), CloseBmf() */ #include "PacketHistory.h" /* InitPacketHistory() */ #include "NetworkInterfaces.h" /* AddNonOlsrBmfIf(), SetBmfInterfaceIp(), ... */ #include "Address.h" /* DoLocalBroadcast() */ static void __attribute__ ((constructor)) my_init(void); static void __attribute__ ((destructor)) my_fini(void); void olsr_plugin_exit(void); /* ------------------------------------------------------------------------- * Function : olsrd_plugin_interface_version * Description: Plugin interface version * Input : none * Output : none * Return : BMF plugin interface version number * Data Used : none * Notes : Called by main OLSRD (olsr_load_dl) to check plugin interface * version * ------------------------------------------------------------------------- */ int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } /* ------------------------------------------------------------------------- * Function : olsrd_plugin_init * Description: Plugin initialisation * Input : none * Output : none * Return : fail (0) or success (1) * Data Used : olsr_cnf * Notes : Called by main OLSRD (init_olsr_plugin) to initialize plugin * ------------------------------------------------------------------------- */ int olsrd_plugin_init(void) { /* Check validity */ if (olsr_cnf->ip_version != AF_INET) { fprintf(stderr, PLUGIN_NAME ": This plugin only supports IPv4!\n"); return 0; } /* Clear the packet history */ InitPacketHistory(); /* Register ifchange function */ olsr_add_ifchange_handler(&InterfaceChange); /* Register the duplicate registration pruning process */ olsr_start_timer(3 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, &PrunePacketHistory, NULL, 0); return InitBmf(NULL); } /* ------------------------------------------------------------------------- * Function : olsr_plugin_exit * Description: Plugin cleanup * Input : none * Output : none * Return : none * Data Used : none * Notes : Called by my_fini() at unload of shared object * ------------------------------------------------------------------------- */ void olsr_plugin_exit(void) { CloseBmf(); } static const struct olsrd_plugin_parameters plugin_parameters[] = { { .name = "NonOlsrIf", .set_plugin_parameter = &AddNonOlsrBmfIf, .data = NULL }, { .name = "DoLocalBroadcast", .set_plugin_parameter = &DoLocalBroadcast, .data = NULL }, { .name = "BmfInterface", .set_plugin_parameter = &SetBmfInterfaceName, .data = NULL }, { .name = "BmfInterfaceIp", .set_plugin_parameter = &SetBmfInterfaceIp, .data = NULL }, { .name = "BmfInterfacePersistent", .set_plugin_parameter = &SetBmfInterfacePersistent, .data = NULL }, { .name = "CapturePacketsOnOlsrInterfaces", .set_plugin_parameter = &SetCapturePacketsOnOlsrInterfaces, .data = NULL }, { .name = "BmfMechanism", .set_plugin_parameter = &SetBmfMechanism, .data = NULL }, { .name = "FanOutLimit", .set_plugin_parameter = &SetFanOutLimit, .data = NULL }, { .name = "BroadcastRetransmitCount", .set_plugin_parameter = &set_plugin_int, .data = &BroadcastRetransmitCount}, }; /* ------------------------------------------------------------------------- * Function : olsrd_get_plugin_parameters * Description: Return the parameter table and its size * Input : none * Output : params - the parameter table * size - its size in no. of entries * Return : none * Data Used : plugin_parameters * Notes : Called by main OLSR (init_olsr_plugin) for all plugins * ------------------------------------------------------------------------- */ void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = sizeof(plugin_parameters)/sizeof(*plugin_parameters); } /* ------------------------------------------------------------------------- * Function : my_init * Description: Plugin constructor * Input : none * Output : none * Return : none * Data Used : none * Notes : Called at load of shared object * ------------------------------------------------------------------------- */ static void my_init(void) { /* Print plugin info to stdout */ printf("%s\n", MOD_DESC); return; } /* ------------------------------------------------------------------------- * Function : my_fini * Description: Plugin destructor * Input : none * Output : none * Return : none * Data Used : none * Notes : Called at unload of shared object * ------------------------------------------------------------------------- */ static void my_fini(void) { olsr_plugin_exit(); } olsrd-0.6.6.2/lib/bmf/version-script.txt000066400000000000000000000002051234304727700200560ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/dot_draw/000077500000000000000000000000001234304727700153705ustar00rootroot00000000000000olsrd-0.6.6.2/lib/dot_draw/Makefile000066400000000000000000000044321234304727700170330ustar00rootroot00000000000000# The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_dot_draw PLUGIN_VER = 0.3 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) olsrd-0.6.6.2/lib/dot_draw/README_DOT_DRAW000066400000000000000000000020541234304727700175740ustar00rootroot00000000000000DOT DATA GENERATION PLUGIN FOR OLSRD by Andreas Tonnesen(andreto@olsr.org) Bruno Randolf 02.06.05 Added patch by Sebastian Hagen to fix FD leakage 05.12.2004 Various updates by Bruno Randolf has been applied to this plugin 06.11.2004 - Updated plugin interface version - Added plugin interface version function - Topology is generated upon every new connection 29.06.2004 ABOUT Note that this code is a quick hack done at the Wizards Of Oz 3 The plugin generates output (over a TCP-IPv4 socket) in the dot format. The dot tool generates visual presentations of directed graphs. It can be downloaded as part of the GraphViz package from: http://www.graphviz.org/ telet to 127.0.0.1 port 2004 to receive the data installation: make make install - Andreas T olsr-topology-view.pl is a simple script to visualize the dotdraw data on your computer. You will find some more explanations about the script at http://n0rg.org/node1448/OlsrTopologyVisualization/OlsrTopologyVisualization.htm or http://br1.einfach.org/OlsrTopologyVisualization - Henning Rogge olsrd-0.6.6.2/lib/dot_draw/misc/000077500000000000000000000000001234304727700163235ustar00rootroot00000000000000olsrd-0.6.6.2/lib/dot_draw/misc/olsr-topology-view.pl000066400000000000000000000135141234304727700224650ustar00rootroot00000000000000#!/usr/bin/perl # a hack to display OLSR topology information # # copyleft 2004 Bruno Randolf # licensed under the GPL use IO::Socket; use Getopt::Long; $TOPPATH = "/tmp"; $NAME = "topology"; $FILENAME = "$TOPPATH/$NAME.dot"; $EXT = "png"; $SERVER = "localhost"; $PORT = "2004"; $FULLSCREEN = 0; $HELP = 0; $KEEP = 0; $BGCOLOR = "black"; $STYLE = 1; $SIZE = "8,8"; $ROOTWIN = 0; $ONCE = 0; $GRAPH = 1; $SHOW = 1; $FONTNAME = "Courier"; $FONTSIZE = 12; $LINEWIDTH = 0; $LINECOLOR = 0; $RESOLV = 0; GetOptions ("server=s" => \$SERVER, "port=s" => \$PORT, "fullscreen!" => \$FULLSCREEN, "help!" => \$HELP, "keep!" => \$KEEP, "bgcolor=s" => \$BGCOLOR, "fontname=s" => \$FONTNAME, "fontsize=s" => \$FONTSIZE, "style=i" => \$STYLE, "size=s" => \$SIZE, "rootwin!" => \$ROOTWIN, "once!" => \$ONCE, "graph!" => \$GRAPH, "show!" => \$SHOW, "linewidth!" => \$LINEWIDTH, "linecolor!" => \$LINECOLOR, "resolv" => \$RESOLV, ); if ($HELP) { print << "EOF"; usage: $0 [ --server SERVER ] [--port PORT] [--fullscreen] [--keep] a hack to display OLSR topology information options: --server SERVER connect to OLSR node (default: localhost) --port PORT connect to port (default: 2004) --bgcolor background color (default: black) --fontname font name (default: Courier) --fontsize font size (default: 12) --style drawing style 1, 2 or 3 (default:1) --size X,Y image size in inches for graphviz (default: 8,8) --[no]fullscreen display fullscreen (default: off) --[no]rootwin display in root window (default: off) --[no]graph genereate graphics (default: on) --[no]show display the graphics (default: on) --[no]once run only 1 time, then exit (default: run forever) --[no]linewith change line width according to metric (default: off) --[no]linecolor change line color according to metric (default: off) --[no]resolv resolv hostnames (default: off) --[no]keep keep the .dot files with timestamp in /tmp (default: off) requires the "graphviz" and "imagemagick" packages installed and the "olsrd_dot_draw" plugin configured on the olsr node EOF exit; } `touch $TOPPATH/$NAME.$EXT`; $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $SERVER, PeerPort => $PORT, ) or die "cannot connect to port $PORT at $SERVER!\nis the olsrd_dot_draw plugin loaded and configured to allow connections from this host?\n"; $f; $start = 1; $FULLOPT = "-backdrop -background black" if $FULLSCREEN; if ($STYLE == 1) { $DOT_CMD = "neato -Tpng -Gsize=${SIZE} -Gbgcolor=${BGCOLOR} -Gsplines=true -Nstyle=filled -Nfontname=${FONTNAME} -Nfontsize=${FONTSIZE} -Efontname=${FONTNAME} -Efontsize=${FONTSIZE} -Ncolor=white -Nfillcolor=white -Ecolor=grey -Elen=4 -Earrowsize=2 -Efontcolor=white $FILENAME -o $TOPPATH/$NAME.new"; } elsif ($STYLE == 2) { $BGCOLOR = "grey"; $DOT_CMD = "dot -Tpng -Gsize=${SIZE} -Elen=2 -Ncolor=grey -Nstyle=filled -Nfillcolor=white -Nfontname=${FONTNAME} -Nfontsize=${FONTSIZE} -Efontname=${FONTNAME} -Efontsize=${FONTSIZE} -Nfontcolor=red -Nwidth=1 -Gbgcolor=$BGCOLOR $FILENAME -o $TOPPATH/$NAME.new"; } elsif ($STYLE == 3) { $BGCOLOR = "\#ff6600"; $DOT_CMD = "neato -Tpng -Gsize=10,9 -Gbgcolor=${BGCOLOR} -Gsplines=true -Nstyle=filled -Nfontname=${FONTNAME} -Nfontsize=${FONTSIZE} -Efontname=${FONTNAME} -Efontsize=${FONTSIZE} -Nheight=1.3 -Nwidth=1.3 -Gsplines=true -Ncolor=darkslategrey -Nfillcolor=darkslategrey -Ecolor=black -Elen=4 -Earrowsize=3 $FILENAME -o $TOPPATH/$NAME.new"; } while ( <$remote> ) { $line = $_; if ($RESOLV) { $line = resolv( $line ); } if ($LINEWIDTH || $LINECOLOR) { $line = draw_thicker_metric_lines( $line ); } $f = $f . $line; # end of one graph if ( $line =~ /}/i ) { #print "* "; open DOTFILE, ">$FILENAME"; print DOTFILE $f; close DOTFILE; $f = ""; if ($GRAPH) { `$DOT_CMD`; `mv $TOPPATH/$NAME.new $TOPPATH/$NAME.$EXT`; } if ($KEEP) { `cp $TOPPATH/$NAME.dot $TOPPATH/$NAME-\$(date +'%Y-%m-%d-%H-%M-%S').dot`; } if ($SHOW) { if ($ROOTWIN) { system "display -window root -backdrop $TOPPATH/$NAME.$EXT &"; } elsif ($start) { system "display $FULLOPT -update 5 $TOPPATH/$NAME.$EXT &"; $start = 0; } } exit if $ONCE; } } print "connection closed\n"; sub resolv { my $l = shift; if ( $l =~ /\"(.*)\" -> "([^[]*)"(.*)/) { my $from = $1; my $to = $2; my $rest = $3; $from =~ s/\"//g; $to =~ s/\"//g; my $iaddrf = inet_aton($from); my $fromn = gethostbyaddr($iaddrf, AF_INET); my $iaddrt = inet_aton($to); my $ton = gethostbyaddr($iaddrt, AF_INET); $fromn = $from if ! $fromn; $ton = $to if ! $ton; $l = "\"$fromn\" -> \"$ton\"$rest\n"; } return $l; } sub draw_thicker_metric_lines { # sla 04.04.2005 # a hack to draws thicker lines for better metrics (the better the thicker). # colorize the metric lines. # my $l = shift; if ($l =~ /.*label="[0-9].*/){ # recognizion pattern @n=split (/"/,$l); # split the string to get the metric value if ($LINECOLOR) { if ( $n[5]>2 ) { # colorize metrics greater than 2 gray $c="888888"; } else { # colorize metrics less than 2 black $c="000000"; } $setcol = "color=\"#$c\","; } if ($LINEWIDTH) { if ($n[5]>0 && $n[5]<10) { # thicker lines if 10 > metric > 0 $lt=6/$n[5]; $at=$lt/2; } else { # at least draw a thin line $lt=1; $at=$lt; } $setwidth = "style=\"setlinewidth($lt)\", arrowsize=$at"; } $l =~ s/\]/, $setcol $setwidth]/g; # replace pattern } return $l; } __END__ olsrd-0.6.6.2/lib/dot_draw/olsr-topology-view.pl000066400000000000000000000135141234304727700215320ustar00rootroot00000000000000#!/usr/bin/perl # a hack to display OLSR topology information # # copyleft 2004 Bruno Randolf # licensed under the GPL use IO::Socket; use Getopt::Long; $TOPPATH = "/tmp"; $NAME = "topology"; $FILENAME = "$TOPPATH/$NAME.dot"; $EXT = "png"; $SERVER = "localhost"; $PORT = "2004"; $FULLSCREEN = 0; $HELP = 0; $KEEP = 0; $BGCOLOR = "black"; $STYLE = 1; $SIZE = "8,8"; $ROOTWIN = 0; $ONCE = 0; $GRAPH = 1; $SHOW = 1; $FONTNAME = "Courier"; $FONTSIZE = 12; $LINEWIDTH = 0; $LINECOLOR = 0; $RESOLV = 0; GetOptions ("server=s" => \$SERVER, "port=s" => \$PORT, "fullscreen!" => \$FULLSCREEN, "help!" => \$HELP, "keep!" => \$KEEP, "bgcolor=s" => \$BGCOLOR, "fontname=s" => \$FONTNAME, "fontsize=s" => \$FONTSIZE, "style=i" => \$STYLE, "size=s" => \$SIZE, "rootwin!" => \$ROOTWIN, "once!" => \$ONCE, "graph!" => \$GRAPH, "show!" => \$SHOW, "linewidth!" => \$LINEWIDTH, "linecolor!" => \$LINECOLOR, "resolv" => \$RESOLV, ); if ($HELP) { print << "EOF"; usage: $0 [ --server SERVER ] [--port PORT] [--fullscreen] [--keep] a hack to display OLSR topology information options: --server SERVER connect to OLSR node (default: localhost) --port PORT connect to port (default: 2004) --bgcolor background color (default: black) --fontname font name (default: Courier) --fontsize font size (default: 12) --style drawing style 1, 2 or 3 (default:1) --size X,Y image size in inches for graphviz (default: 8,8) --[no]fullscreen display fullscreen (default: off) --[no]rootwin display in root window (default: off) --[no]graph genereate graphics (default: on) --[no]show display the graphics (default: on) --[no]once run only 1 time, then exit (default: run forever) --[no]linewith change line width according to metric (default: off) --[no]linecolor change line color according to metric (default: off) --[no]resolv resolv hostnames (default: off) --[no]keep keep the .dot files with timestamp in /tmp (default: off) requires the "graphviz" and "imagemagick" packages installed and the "olsrd_dot_draw" plugin configured on the olsr node EOF exit; } `touch $TOPPATH/$NAME.$EXT`; $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $SERVER, PeerPort => $PORT, ) or die "cannot connect to port $PORT at $SERVER!\nis the olsrd_dot_draw plugin loaded and configured to allow connections from this host?\n"; $f; $start = 1; $FULLOPT = "-backdrop -background black" if $FULLSCREEN; if ($STYLE == 1) { $DOT_CMD = "neato -Tpng -Gsize=${SIZE} -Gbgcolor=${BGCOLOR} -Gsplines=true -Nstyle=filled -Nfontname=${FONTNAME} -Nfontsize=${FONTSIZE} -Efontname=${FONTNAME} -Efontsize=${FONTSIZE} -Ncolor=white -Nfillcolor=white -Ecolor=grey -Elen=4 -Earrowsize=2 -Efontcolor=white $FILENAME -o $TOPPATH/$NAME.new"; } elsif ($STYLE == 2) { $BGCOLOR = "grey"; $DOT_CMD = "dot -Tpng -Gsize=${SIZE} -Elen=2 -Ncolor=grey -Nstyle=filled -Nfillcolor=white -Nfontname=${FONTNAME} -Nfontsize=${FONTSIZE} -Efontname=${FONTNAME} -Efontsize=${FONTSIZE} -Nfontcolor=red -Nwidth=1 -Gbgcolor=$BGCOLOR $FILENAME -o $TOPPATH/$NAME.new"; } elsif ($STYLE == 3) { $BGCOLOR = "\#ff6600"; $DOT_CMD = "neato -Tpng -Gsize=10,9 -Gbgcolor=${BGCOLOR} -Gsplines=true -Nstyle=filled -Nfontname=${FONTNAME} -Nfontsize=${FONTSIZE} -Efontname=${FONTNAME} -Efontsize=${FONTSIZE} -Nheight=1.3 -Nwidth=1.3 -Gsplines=true -Ncolor=darkslategrey -Nfillcolor=darkslategrey -Ecolor=black -Elen=4 -Earrowsize=3 $FILENAME -o $TOPPATH/$NAME.new"; } while ( <$remote> ) { $line = $_; if ($RESOLV) { $line = resolv( $line ); } if ($LINEWIDTH || $LINECOLOR) { $line = draw_thicker_metric_lines( $line ); } $f = $f . $line; # end of one graph if ( $line =~ /}/i ) { #print "* "; open DOTFILE, ">$FILENAME"; print DOTFILE $f; close DOTFILE; $f = ""; if ($GRAPH) { `$DOT_CMD`; `mv $TOPPATH/$NAME.new $TOPPATH/$NAME.$EXT`; } if ($KEEP) { `cp $TOPPATH/$NAME.dot $TOPPATH/$NAME-\$(date +'%Y-%m-%d-%H-%M-%S').dot`; } if ($SHOW) { if ($ROOTWIN) { system "display -window root -backdrop $TOPPATH/$NAME.$EXT &"; } elsif ($start) { system "display $FULLOPT -update 5 $TOPPATH/$NAME.$EXT &"; $start = 0; } } exit if $ONCE; } } print "connection closed\n"; sub resolv { my $l = shift; if ( $l =~ /\"(.*)\" -> "([^[]*)"(.*)/) { my $from = $1; my $to = $2; my $rest = $3; $from =~ s/\"//g; $to =~ s/\"//g; my $iaddrf = inet_aton($from); my $fromn = gethostbyaddr($iaddrf, AF_INET); my $iaddrt = inet_aton($to); my $ton = gethostbyaddr($iaddrt, AF_INET); $fromn = $from if ! $fromn; $ton = $to if ! $ton; $l = "\"$fromn\" -> \"$ton\"$rest\n"; } return $l; } sub draw_thicker_metric_lines { # sla 04.04.2005 # a hack to draws thicker lines for better metrics (the better the thicker). # colorize the metric lines. # my $l = shift; if ($l =~ /.*label="[0-9].*/){ # recognizion pattern @n=split (/"/,$l); # split the string to get the metric value if ($LINECOLOR) { if ( $n[5]>2 ) { # colorize metrics greater than 2 gray $c="888888"; } else { # colorize metrics less than 2 black $c="000000"; } $setcol = "color=\"#$c\","; } if ($LINEWIDTH) { if ($n[5]>0 && $n[5]<10) { # thicker lines if 10 > metric > 0 $lt=6/$n[5]; $at=$lt/2; } else { # at least draw a thin line $lt=1; $at=$lt; } $setwidth = "style=\"setlinewidth($lt)\", arrowsize=$at"; } $l =~ s/\]/, $setcol $setwidth]/g; # replace pattern } return $l; } __END__ olsrd-0.6.6.2/lib/dot_draw/src/000077500000000000000000000000001234304727700161575ustar00rootroot00000000000000olsrd-0.6.6.2/lib/dot_draw/src/olsrd_dot_draw.c000066400000000000000000000265441234304727700213440ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * includes code by Bruno Randolf * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #ifdef _WRS_KERNEL #include #include #include #else /* _WRS_KERNEL */ #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* _WRS_KERNEL */ #include "olsr.h" #include "ipcalc.h" #include "olsr_types.h" #include "neighbor_table.h" #include "two_hop_neighbor_table.h" #include "tc_set.h" #include "hna_set.h" #include "mid_set.h" #include "link_set.h" #include "net_olsr.h" #include "lq_plugin.h" #include "common/autobuf.h" #include "olsrd_dot_draw.h" #include "olsrd_plugin.h" #ifdef _WIN32 #define close(x) closesocket(x) #endif /* _WIN32 */ #ifdef _WRS_KERNEL static int ipc_open; static int ipc_socket_up; #define DOT_DRAW_PORT 2004 #endif /* _WRS_KERNEL */ static int ipc_socket = -1; struct autobuf outbuffer; static int outbuffer_socket = -1; static struct timer_entry *writetimer_entry = NULL; /* IPC initialization function */ static int plugin_ipc_init(void); /* Event function to register with the sceduler */ static int pcf_event(int, int, int); static void ipc_action(int, void *, unsigned int); static void ipc_print_neigh_link(struct autobuf *abuf, const struct neighbor_entry *neighbor); static void ipc_print_tc_link(struct autobuf *abuf, const struct tc_entry *, const struct tc_edge_entry *); static void ipc_print_net(struct autobuf *abuf, const union olsr_ip_addr *, const union olsr_ip_addr *, uint8_t); /** *Do initialization here * *This function is called by the my_init *function in uolsrd_plugin.c */ #ifdef _WRS_KERNEL int olsrd_dotdraw_init(void) #else /* _WRS_KERNEL */ int olsrd_plugin_init(void) #endif /* _WRS_KERNEL */ { /* Initial IPC */ plugin_ipc_init(); /* Register the "ProcessChanges" function */ register_pcf(&pcf_event); return 1; } /** * destructor - called at unload */ #ifdef _WRS_KERNEL void olsrd_dotdraw_exit(void) #else /* _WRS_KERNEL */ void olsr_plugin_exit(void) #endif /* _WRS_KERNEL */ { if (writetimer_entry) { close(outbuffer_socket); abuf_free(&outbuffer); olsr_stop_timer(writetimer_entry); } if (ipc_socket != -1) { CLOSE(ipc_socket); } } static void ipc_print_neigh_link(struct autobuf *abuf, const struct neighbor_entry *neighbor) { static const char DASHED[] = "dashed"; static const char SOLID[] = "solid"; struct ipaddr_str mainaddrstrbuf, strbuf; olsr_linkcost etx = 0.0; const char *style; const char *adr = olsr_ip_to_string(&mainaddrstrbuf, &olsr_cnf->main_addr); struct link_entry *the_link; struct lqtextbuffer lqbuffer; if (neighbor->status == 0) { /* non SYM */ style = DASHED; } else { the_link = get_best_link_to_neighbor(&neighbor->neighbor_main_addr); if (the_link) { etx = the_link->linkcost; } style = SOLID; } abuf_appendf(abuf, "\"%s\" -> \"%s\"[label=\"%s\", style=%s];\n", adr, olsr_ip_to_string(&strbuf, &neighbor->neighbor_main_addr), get_linkcost_text(etx, false, &lqbuffer), style); if (neighbor->is_mpr) { abuf_appendf(abuf, "\"%s\"[shape=box];\n", adr); } } static int plugin_ipc_init(void) { struct sockaddr_in sock_in; uint32_t yes = 1; if (ipc_socket != -1) { close(ipc_socket); } /* Init ipc socket */ ipc_socket = socket(AF_INET, SOCK_STREAM, 0); if (ipc_socket == -1) { olsr_printf(1, "(DOT DRAW)IPC socket %s\n", strerror(errno)); return 0; } if (setsockopt(ipc_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) { perror("SO_REUSEADDR failed"); CLOSE(ipc_socket); return 0; } #if (defined __FreeBSD__ || defined __FreeBSD_kernel__) && defined SO_NOSIGPIPE if (setsockopt(ipc_socket, SOL_SOCKET, SO_NOSIGPIPE, (char *)&yes, sizeof(yes)) < 0) { perror("SO_REUSEADDR failed"); CLOSE(ipc_socket); return 0; } #endif /* (defined __FreeBSD__ || defined __FreeBSD_kernel__) && defined SO_NOSIGPIPE */ /* Bind the socket */ /* complete the socket structure */ memset(&sock_in, 0, sizeof(sock_in)); sock_in.sin_family = AF_INET; sock_in.sin_addr.s_addr = ipc_listen_ip.v4.s_addr; sock_in.sin_port = htons(ipc_port); /* bind the socket to the port number */ if (bind(ipc_socket, (struct sockaddr *)&sock_in, sizeof(sock_in)) == -1) { olsr_printf(1, "(DOT DRAW)IPC bind %s\n", strerror(errno)); CLOSE(ipc_socket); return 0; } /* show that we are willing to listen */ if (listen(ipc_socket, 1) == -1) { olsr_printf(1, "(DOT DRAW)IPC listen %s\n", strerror(errno)); CLOSE(ipc_socket); return 0; } /* Register with olsrd */ add_olsr_socket(ipc_socket, &ipc_action, NULL, NULL, SP_PR_READ); return 1; } static void ipc_action(int fd __attribute__ ((unused)), void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { struct sockaddr_in pin; socklen_t addrlen = sizeof(struct sockaddr_in); int ipc_connection; ipc_connection = accept(ipc_socket, (struct sockaddr *)&pin, &addrlen); if (ipc_connection == -1) { olsr_printf(1, "(DOT DRAW)IPC accept: %s\n", strerror(errno)); return; } if (outbuffer_socket != -1) { olsr_printf(1, "(DOT DRAW)Only one connection at once allowed.\n"); close(ipc_connection); return; } #ifndef _WRS_KERNEL if (!ip4equal(&pin.sin_addr, &ipc_accept_ip.v4) && ipc_accept_ip.v4.s_addr != INADDR_ANY) { olsr_printf(0, "Front end-connection from foreign host (%s) not allowed!\n", inet_ntoa(pin.sin_addr)); CLOSE(ipc_connection); return; } #endif /* _WRS_KERNEL */ olsr_printf(1, "(DOT DRAW)IPC: Connection from %s\n", inet_ntoa(pin.sin_addr)); abuf_init(&outbuffer, 4096); outbuffer_socket = ipc_connection; pcf_event(1, 1, 1); } static void dotdraw_write_data(void *foo __attribute__ ((unused))) { fd_set set; int result; struct timeval tv; FD_ZERO(&set); /* prevent warning on WIN32 */ FD_SET((unsigned int)outbuffer_socket, &set); tv.tv_sec = 0; tv.tv_usec = 0; result = select(outbuffer_socket + 1, NULL, &set, NULL, &tv); if (result <= 0) { return; } if (FD_ISSET(outbuffer_socket, &set)) { result = send(outbuffer_socket, outbuffer.buf, outbuffer.len, 0); if (result > 0) abuf_pull(&outbuffer, result); if (result <= 0) { /* close this socket and cleanup*/ close(outbuffer_socket); abuf_free(&outbuffer); olsr_stop_timer(writetimer_entry); writetimer_entry = NULL; outbuffer_socket = -1; } } if (outbuffer.len == 0) { /* close this socket and cleanup*/ close(outbuffer_socket); abuf_free(&outbuffer); olsr_stop_timer(writetimer_entry); writetimer_entry = NULL; outbuffer_socket = -1; } } /** *Scheduled event */ static int pcf_event(int my_changes_neighborhood, int my_changes_topology, int my_changes_hna) { struct neighbor_entry *neighbor_table_tmp; struct tc_entry *tc; struct tc_edge_entry *tc_edge; struct hna_entry *tmp_hna; struct hna_net *tmp_net; struct ip_prefix_list *hna; int res = 0; /* nothing to do */ if (outbuffer_socket == -1) { return 1; } if (my_changes_neighborhood || my_changes_topology || my_changes_hna) { /* Print tables to IPC socket */ abuf_puts(&outbuffer, "digraph topology\n{\n"); /* Neighbors */ OLSR_FOR_ALL_NBR_ENTRIES(neighbor_table_tmp) { ipc_print_neigh_link(&outbuffer, neighbor_table_tmp); } OLSR_FOR_ALL_NBR_ENTRIES_END(neighbor_table_tmp); /* Topology */ OLSR_FOR_ALL_TC_ENTRIES(tc) { OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) { if (tc_edge->edge_inv) { ipc_print_tc_link(&outbuffer, tc, tc_edge); } } OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge); } OLSR_FOR_ALL_TC_ENTRIES_END(tc); /* HNA entries */ OLSR_FOR_ALL_HNA_ENTRIES(tmp_hna) { /* Check all networks */ for (tmp_net = tmp_hna->networks.next; tmp_net != &tmp_hna->networks; tmp_net = tmp_net->next) { ipc_print_net(&outbuffer, &tmp_hna->A_gateway_addr, &tmp_net->hna_prefix.prefix, tmp_net->hna_prefix.prefix_len); } } OLSR_FOR_ALL_HNA_ENTRIES_END(tmp_hna); /* Local HNA entries */ for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next) { ipc_print_net(&outbuffer, &olsr_cnf->main_addr, &hna->net.prefix, hna->net.prefix_len); } abuf_puts(&outbuffer, "}\n\n"); res = 1; } if (writetimer_entry == NULL) { writetimer_entry = olsr_start_timer(100, 0, OLSR_TIMER_PERIODIC, &dotdraw_write_data, NULL, 0); } return res; } static void ipc_print_tc_link(struct autobuf *abuf, const struct tc_entry *entry, const struct tc_edge_entry *dst_entry) { struct ipaddr_str strbuf1, strbuf2; struct lqtextbuffer lqbuffer; abuf_appendf(abuf, "\"%s\" -> \"%s\"[label=\"%s\"];\n", olsr_ip_to_string(&strbuf1, &entry->addr), olsr_ip_to_string(&strbuf2, &dst_entry->T_dest_addr), get_linkcost_text(dst_entry->cost, false, &lqbuffer)); } static void ipc_print_net(struct autobuf *abuf, const union olsr_ip_addr *gw, const union olsr_ip_addr *net, uint8_t prefixlen) { struct ipaddr_str gwbuf, netbuf; abuf_appendf(abuf, "\"%s\" -> \"%s/%d\"[label=\"HNA\"];\n", olsr_ip_to_string(&gwbuf, gw), olsr_ip_to_string(&netbuf, net), prefixlen); abuf_appendf(abuf, "\"%s/%d\"[shape=diamond];\n", olsr_ip_to_string(&netbuf, net), prefixlen); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/dot_draw/src/olsrd_dot_draw.h000066400000000000000000000047061234304727700213450ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * includes code by Bruno Randolf * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #ifndef _OLSRD_DOT_DRAW #define _OLSRD_DOT_DRAW #include "olsrd_plugin.h" #include "plugin_util.h" extern union olsr_ip_addr ipc_accept_ip; extern union olsr_ip_addr ipc_listen_ip; extern int ipc_port; int olsrd_plugin_interface_version(void); int olsrd_plugin_init(void); void olsr_plugin_exit(void); void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size); #endif /* _OLSRD_DOT_DRAW */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/dot_draw/src/olsrd_plugin.c000066400000000000000000000073401234304727700210300ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #include #include #include #include #include #include #include "olsr.h" #include "olsrd_plugin.h" #include "olsrd_dot_draw.h" #define PLUGIN_NAME "OLSRD dot draw plugin" #define PLUGIN_VERSION "0.3" #define PLUGIN_AUTHOR "Andreas Tonnesen" #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR #define PLUGIN_INTERFACE_VERSION 5 union olsr_ip_addr ipc_accept_ip; union olsr_ip_addr ipc_listen_ip; int ipc_port; static void my_init(void) __attribute__ ((constructor)); static void my_fini(void) __attribute__ ((destructor)); /** *Constructor */ static void my_init(void) { /* Print plugin info to stdout */ printf("%s\n", MOD_DESC); /* defaults for parameters */ ipc_port = 2004; ipc_accept_ip.v4.s_addr = htonl(INADDR_LOOPBACK); ipc_listen_ip.v4.s_addr = htonl(INADDR_ANY); } /** *Destructor */ static void my_fini(void) { /* Calls the destruction function * olsr_plugin_exit() * This function should be present in your * sourcefile and all data destruction * should happen there - NOT HERE! */ olsr_plugin_exit(); } int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } static const struct olsrd_plugin_parameters plugin_parameters[] = { {.name = "port",.set_plugin_parameter = &set_plugin_port,.data = &ipc_port}, {.name = "accept",.set_plugin_parameter = &set_plugin_ipaddress,.data = &ipc_accept_ip}, {.name = "listen",.set_plugin_parameter = &set_plugin_ipaddress,.data = &ipc_listen_ip}, }; void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = sizeof(plugin_parameters) / sizeof(*plugin_parameters); } /* * Local Variables: * mode: c * style: linux * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/dot_draw/version-script.txt000066400000000000000000000002051234304727700211150ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/dyn_gw/000077500000000000000000000000001234304727700150545ustar00rootroot00000000000000olsrd-0.6.6.2/lib/dyn_gw/Makefile000066400000000000000000000046061234304727700165220ustar00rootroot00000000000000# The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_dyn_gw PLUGIN_VER = 0.5 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc LIBS += $(OS_LIB_PTHREAD) # Must be specified along with -lpthread on linux CPPFLAGS += $(OS_CFLAG_PTHREAD) default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) olsrd-0.6.6.2/lib/dyn_gw/README_DYN_GW000066400000000000000000000132411234304727700170440ustar00rootroot00000000000000DYNAMIC INTERNET GATEWAY PLUGIN FOR olsr.org olsrd by Andreas Tonnesen(andreto@olsr.org) Additions by Jens Nachitgall and others ABOUT Plugin is IPv4 only and it only runs on Linux with the libpthread library installed! This is a plugin that checks if the local node has a Internet- connection. A Internet-connetion is identified by a "default gw" with a hopcount of 0. That is a route to 0.0.0.0/0 with metric 0. By default the check is done every 5 secs. You can change the check interval by providing an value for "PingInterval" in the plugin's section of olsrd.conf. If one or more IPv4 addresses are given as values for "Ping" in the section or dyn_gw in olsrd.conf, then a test is done to validate if there is really an internet connection (and not just an entry in the routing table). If any of the arbitrary many given IPv4 addresses can be pinged, the validation was successful. The addresses are pinged in the order given in the olsrd.conf (i.e. the first given address is pinged first, the the 2nd, and so on). For this to work a command like "ping -c 1 -q " must be possible on the system olsrd runs on. The validation is based on the return value of this ping command. Since OLSR uses hopcount/metric on all routes this plugin will not respond to Internet gateways added by olsrd. When a Internet gateway is discovered - this node will start announcing 0.0.0.0/0 connectivity by HNA messages flooded into the OLSR network. If the route is removed the HNA messages will not be transmitted. This check is totally dynamic and Internet connectivity might come and go. This plugin can also process more specific routes by specifying groups of HNAs (Host and Network Association) and ping hosts. This plugin will work very good with a automatic network cable detection daemon such as netplug: http://freshmeat.net/projects/key-netplug/ This plugin is a good example of using plugins for other stuff than packet transmission. HOW TO USE (version 0.5) LoadPlugin "olsrd_dyn_gw.so.0.5" { # The plugin check interval can be set here in milliseconds. # The default is 1000 ms (1 second). PlParam "CheckInterval" "5000" # The ping check interval in case there is any pinged host specified. # The default is 5 seconds. PlParam "PingInterval" "40" # If one or more IPv4 addresses are given, do a ping on these in # descending order to validate that there is not only an entry in # routing table, but also a real network connection. If any of # these addresses could be pinged successfully, the test was # succesful, i.e. if the ping on the 1st address was successful,the # 2nd won't be pinged. # # The Ping list applies to the group of HNAs specified above or to the # default internet gateway when no HNA is specified. # # Running the plugin without parameters acts as the 'old' dyn_gw_plain. # The following ping entries for the internet gateway PlParam "Ping" "141.1.1.1" PlParam "Ping" "194.25.2.129" # First group of HNAs with related ping host PlParam "HNA" "192.168.80.0 255.255.255.0" PlParam "HNA" "192.168.81.0 255.255.255.0" PlParam "Ping" "192.168.81.12" # Second HNA group with multiple related ping hosts. # Specifying multiple ping hosts provides redundancy. PlParam "HNA" "192.168.100.0 255.255.255.0" PlParam "HNA" "192.168.101.0 255.255.255.0" PlParam "HNA" "192.168.102.0 255.255.255.0" PlParam "Ping" "192.168.100.10" PlParam "Ping" "192.168.101.10" # Third HNA group without ping check PlParam "HNA" "192.168.200.0 255.255.255.0" PlParam "HNA" "192.168.201.0 255.255.255.0" PlParam "HNA" "192.168.202.0 255.255.255.0" } -------------------------------------------------------------------------------- Change log: 18.02.2010 Caspar van Zon / C2SC - Changed HNA checking. The 'Ping' PlParam processing has been modified so that it is not only valid for the previous HNA entry but all entries proceeding the ping parameter until either the beginning of the list or the previous ping parameter. If there is no previous HNA entry then HNA '0.0.0.0 0.0.0.0' for the internet gateway is inserted instead. - Two new interval parameters 'PingInterval' and 'CheckInterval' have been introduced. 'PingInterval' is the new name for the 'Interval' parameter, the old name has been maintained as well for compatibility. The 'CheckInterval' is new and specifies the check interval for the OLSR event loop in milliseconds. - When no ping hosts are specified at all the thread for the ping check will not be started, eliminating the thread totally is left for future improvement. - Code and variable names have been cleaned up in various places to improve both readability and maintainability. - Due to significant changes in the code base and the modified functionality the version of the package has been increased to version 0.5 - Running the plugin without parameters acts like dyn_gw_plain so the dyn_gw_plain plugin can be made obsolete. 21.12.2004 bjoern Riemer - added universal hna checking the plParams are parsed in spechial order, first the HNA parameter syntax: "net mask" the following Ping parameter are only used for the previus HNA entry. if there is no previus HNA entry then HNA "0.0.0.0 0.0.0.0" for internet GW is assumed 30.11.2004 updates by Jens: - Upgraded to confirm with v2 plugin interface - removed IPC stuff - Removed much unnessecarry stuff - Added an optional validation based on the ping command, which caused some internal restructuring, e.g. the dependency of a threading library) - the config file accepts an "Interval", meaning how often the check is done olsrd-0.6.6.2/lib/dyn_gw/src/000077500000000000000000000000001234304727700156435ustar00rootroot00000000000000olsrd-0.6.6.2/lib/dyn_gw/src/olsrd_dyn_gw.c000066400000000000000000000514501234304727700205060ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * -Threaded ping code added by Jens Nachtigall * -HNA4 checking by bjoern riemer */ #include #include "olsr_types.h" #include "olsrd_dyn_gw.h" #include "olsr.h" #include "defs.h" #include "ipcalc.h" #include "scheduler.h" #include "log.h" #include "routing_table.h" #include #include #include #include #include #include #include #include #ifndef _WIN32 #include #else /* _WIN32 */ #define WIN32_LEAN_AND_MEAN #include #undef interface #define close(x) closesocket(x) typedef HANDLE pthread_mutex_t; typedef HANDLE pthread_t; int pthread_create(HANDLE * Hand, void *Attr, void *(*Func) (void *), void *Arg); int pthread_kill(HANDLE Hand, int Sig); int pthread_mutex_init(HANDLE * Hand, void *Attr); int pthread_mutex_lock(HANDLE * Hand); int pthread_mutex_unlock(HANDLE * Hand); struct ThreadPara { void *(*Func) (void *); void *Arg; }; #endif /* _WIN32 */ static int hna_check_interval = DEFAULT_HNA_CHECK_INTERVAL; /* set default interval, in case none is given in the config file */ static int ping_check_interval = DEFAULT_PING_CHECK_INTERVAL; /* list to store the Ping IP addresses given in the config file */ struct ping_list { char *ping_address; struct ping_list *next; }; static struct ping_list *add_to_ping_list(const char *, struct ping_list *); struct hna_list { union olsr_ip_addr hna_addr; uint8_t hna_prefixlen; bool hna_added; bool checked; bool active; struct hna_list * next; }; static struct hna_list *add_to_hna_list(struct hna_list *, union olsr_ip_addr *hna_addr, uint8_t hna_prefixlen); struct hna_group { struct hna_list * hna_list; struct ping_list * ping_hosts; bool probe_ok; struct hna_group * next; }; bool hna_ping_check = false; static struct hna_group * hna_groups = NULL; static struct hna_group *add_to_hna_group(struct hna_group *); static void looped_checks(void *) __attribute__ ((noreturn)); static bool check_gw(union olsr_ip_addr *, uint8_t, struct ping_list *); static int ping_is_possible(struct ping_list *); /* Event function to register with the scheduler */ static void olsr_event_doing_hna(void *); struct hna_list* find_hna(uint32_t src_addr, uint32_t src_mask); char *get_ip_str(uint32_t address, char *s, size_t maxlen); int update_routing(void); /** * read config file parameters */ static int set_plugin_ping(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { union olsr_ip_addr foo_addr; if (inet_pton(olsr_cnf->ip_version, value, &foo_addr) <= 0) { OLSR_PRINTF(0, "Illegal IP address \"%s\"", value); return 1; } if (hna_groups == NULL) { hna_groups = add_to_hna_group(hna_groups); if (hna_groups == NULL) return 1; } else { if (hna_groups->hna_list != NULL) { hna_groups = add_to_hna_group(hna_groups); } } hna_groups->ping_hosts = add_to_ping_list(value, hna_groups->ping_hosts); hna_ping_check = true; return 0; } static int set_plugin_hna(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { union olsr_ip_addr temp_addr; union olsr_ip_addr temp_mask; char s_addr[128]; char s_mask[128]; //Example: 192.168.1.0 255.255.255.0 int i = sscanf(value, "%127s %127s", s_addr, s_mask); if (i != 2) { OLSR_PRINTF(0, "Cannot get IP address and netmask from \"%s\"", value); return 1; } if (inet_pton(olsr_cnf->ip_version, s_addr, &temp_addr) <= 0) { OLSR_PRINTF(0, "Illegal IP address \"%s\"", s_addr); return 1; } if (inet_pton(olsr_cnf->ip_version, s_mask, &temp_mask) <= 0) { OLSR_PRINTF(0, "Illegal netmask \"%s\"", s_mask); return 1; } if (hna_groups == NULL) { hna_groups = add_to_hna_group(hna_groups); if (hna_groups == NULL) { return 1; } } hna_groups->hna_list = add_to_hna_list(hna_groups->hna_list, &temp_addr, olsr_netmask_to_prefix(&temp_mask)); if (hna_groups->hna_list == NULL) { return 1; } return 0; } static const struct olsrd_plugin_parameters plugin_parameters[] = { {.name = "interval", .set_plugin_parameter = &set_plugin_int, .data = &ping_check_interval }, {.name = "pinginterval", .set_plugin_parameter = &set_plugin_int, .data = &ping_check_interval }, {.name = "checkinterval", .set_plugin_parameter = &set_plugin_int, .data = &hna_check_interval }, {.name = "ping", .set_plugin_parameter = &set_plugin_ping, .data = NULL }, {.name = "hna", .set_plugin_parameter = &set_plugin_hna, .data = NULL }, }; void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = sizeof(plugin_parameters) / sizeof(*plugin_parameters); } /** *Do initialization here * * *This function is called by the my_init *function in uolsrd_plugin.c *It is ran _after_ register_olsr_param */ int olsrd_plugin_init(void) { pthread_t ping_thread; if (hna_groups == NULL) { hna_groups = add_to_hna_group(hna_groups); if (hna_groups == NULL) return 1; } // Add a default gateway if the top entry was just a ping address if (hna_groups->hna_list == NULL) { union olsr_ip_addr temp_addr; union olsr_ip_addr temp_mask; temp_addr.v4.s_addr = INET_ADDR; temp_mask.v4.s_addr = INET_MASK; hna_groups->hna_list = add_to_hna_list(hna_groups->hna_list, &temp_addr, olsr_netmask_to_prefix(&temp_mask)); if (hna_groups->hna_list == NULL) { return 1; } } // Prepare all routing information update_routing(); if (hna_ping_check) { pthread_create(&ping_thread, NULL, (void *(*)(void *))looped_checks, NULL); } else { struct hna_group *grp; for (grp = hna_groups; grp; grp = grp->next) { grp->probe_ok = true; } } // Print the current configuration { struct hna_group *grp; int i = 0; for (grp = hna_groups; grp; grp = grp->next, ++i) { struct hna_list *lst; struct ping_list *png; olsr_printf(1, "Group %d:\n", i); for (lst = grp->hna_list; lst; lst = lst->next) { char addr[INET_ADDRSTRLEN]; olsr_printf(1, " HNA %s\n", get_ip_str(lst->hna_addr.v4.s_addr, addr, INET_ADDRSTRLEN)); } for (png = grp->ping_hosts; png; png = png->next) { olsr_printf(1, " PING %s\n", png->ping_address); } } } /* Register the GW check */ olsr_start_timer(hna_check_interval, 0, OLSR_TIMER_PERIODIC, &olsr_event_doing_hna, NULL, 0); return 1; } /** * Scheduled event to update the hna table, * called from olsrd main thread to keep the hna table thread-safe */ static void olsr_event_doing_hna(void *foo __attribute__ ((unused))) { struct hna_group* grp; struct hna_list *li; update_routing(); for (grp = hna_groups; grp; grp = grp->next) { for (li = grp->hna_list; li; li = li->next) { if (!li->hna_added) { if (grp->probe_ok && li->active) { olsr_printf(1, "Adding OLSR local HNA entry\n"); ip_prefix_list_add(&olsr_cnf->hna_entries, &li->hna_addr, li->hna_prefixlen); li->hna_added = true; } } else { if (!grp->probe_ok || !li->active) { while (ip_prefix_list_remove(&olsr_cnf->hna_entries, &li->hna_addr, li->hna_prefixlen)) { olsr_printf(1, "Removing OLSR local HNA entry\n"); } li->hna_added = false; } } } } } /** * the threaded function which happens within an endless loop, * reiterated every "Interval" sec (as given in the config or * the default value) */ static void looped_checks(void *foo __attribute__ ((unused))) { for (;;) { struct hna_group *grp; struct hna_list *li; struct timespec remainder_spec; /* the time to wait in "Interval" sec (see connfig), default=5sec */ struct timespec sleeptime_spec = { ping_check_interval, 0L }; for (grp = hna_groups; grp; grp = grp->next) { for (li = grp->hna_list; li; li = li->next) { // If this HNA is not active skip to the next one if (!li->active) continue; /* check for gw in table entry and if Ping IPs are given also do pings */ grp->probe_ok = check_gw(&li->hna_addr, li->hna_prefixlen, grp->ping_hosts); if (grp->probe_ok) break; // Valid host found so we can bail out of the inner loop here } } while (nanosleep(&sleeptime_spec, &remainder_spec) < 0) sleeptime_spec = remainder_spec; } // return NULL; } /* ------------------------------------------------------------------------- * Function : find_hna * Description: Lookup an HNA that matches the specified parameters * Input : src_addr - IP address of the HNA to find * src_mask - Address mask of the HNA to find * Output : none * Return : The HNA specified or NULL when HNA not found * Data Used : none * ------------------------------------------------------------------------- */ struct hna_list* find_hna(uint32_t src_addr, uint32_t src_mask) { struct hna_group * grp; struct hna_list *li; union olsr_ip_addr mask; for (grp = hna_groups; grp; grp = grp->next) { for (li = grp->hna_list; li; li = li->next) { olsr_prefix_to_netmask(&mask, li->hna_prefixlen); if (li->hna_addr.v4.s_addr == src_addr && mask.v4.s_addr == src_mask) { return li; } } } return NULL; } /* ------------------------------------------------------------------------- * Function : get_ip_str * Description: Convert the specified address to an IPv4 compatible string * Input : address - IPv4 address to convert to string * s - string buffer to contain the resulting string * maxlen - maximum length of the string buffer * Output : none * Return : Pointer to the string buffer containing the result * Data Used : none * ------------------------------------------------------------------------- */ char * get_ip_str(uint32_t address, char *s, size_t maxlen) { struct sockaddr_in v4; v4.sin_addr.s_addr = address; inet_ntop(AF_INET, &v4.sin_addr, s, maxlen); return s; } /* ------------------------------------------------------------------------- * Function : update_routing * Description: Mark the HNAs in the HNA list(s) corresponding to the results * found in the routing table. HNAs that are found in the routing * table will be marked as 'active', otherwise they'll remain * inactive. * Input : nothing * Output : none * Return : -1 if an error occurred, 0 otherwise * Data Used : none * ------------------------------------------------------------------------- */ int update_routing(void) { char buf[1024], iface[16]; uint32_t gate_addr, dest_addr, netmask; unsigned int iflags; int metric, refcnt, use; struct hna_group *grp; struct hna_list *li; FILE *fp = fopen(PROCENTRY_ROUTE, "r"); if (!fp) { perror(PROCENTRY_ROUTE); olsr_printf(1, "INET (IPv4) not configured in this system.\n"); return -1; } // Phase 1: reset the 'checked' flag, during the check of the routing table we // will (re)discover whether the HNA is valid or not. for (grp = hna_groups; grp; grp = grp->next) { for (li = grp->hna_list; li; li = li->next) { li->checked = false; } } /* olsr_printf(1, "Genmask Destination Gateway " "Flags Metric Ref Use Iface\n"); */ while (fgets(buf, sizeof(buf), fp)) { struct hna_list *hna; char s_addr[INET_ADDRSTRLEN], s_mask[INET_ADDRSTRLEN]; int num = sscanf(buf, "%15s %128X %128X %X %d %d %d %128X \n", iface, &dest_addr, &gate_addr, &iflags, &refcnt, &use, &metric, &netmask); if (num < 8) continue; get_ip_str(dest_addr, s_addr, INET_ADDRSTRLEN); get_ip_str(netmask, s_mask, INET_ADDRSTRLEN); hna = find_hna(dest_addr, netmask); if (hna == NULL) { // Entry not found, try the next one continue; } if ((iflags & RTF_UP) && (metric != RT_METRIC_DEFAULT)) { hna->checked = true; } } fclose(fp); // Phase 2: now copy the 'checked' flag to the 'active' flag. // The total check is a 2-phase process so the ping check loop won't be // disturbed too badly. for (grp = hna_groups; grp; grp = grp->next) { for (li = grp->hna_list; li; li = li->next) { li->active = li->checked; } } return 0; } /* ------------------------------------------------------------------------- * Function : check_gw * Description: Check the specified gateway(s) by sending a ping * Input : addr - the address of the HNA to which the ping is related * prefixlen - the length of the prefix for this HNA * the_ping_list - list with related ping hosts * Output : none * Return : true if the ping host could be reached, false otherwise * Data Used : none * ------------------------------------------------------------------------- */ static bool check_gw(union olsr_ip_addr *addr, uint8_t prefixlen, struct ping_list *the_ping_list) { bool retval = false; union olsr_ip_addr mask; olsr_prefix_to_netmask(&mask, prefixlen); /* don't ping, if there was no "Ping" IP addr in the config file */ if (the_ping_list != NULL) { /*validate the found inet gw by pinging */ if (ping_is_possible(the_ping_list)) { olsr_printf(1, "HNA[%08x/%08x](ping is possible) detected in routing table.\n", addr->v4.s_addr, mask.v4.s_addr); retval = true; } } else { olsr_printf(1, "HNA[%08x/%08x] detected in routing table.\n", addr->v4.s_addr, mask.v4.s_addr); retval = true; } if (retval == false) { /* And we cast here since we get warnings on Win32 */ olsr_printf(1, "HNA[%08x/%08x] is invalid\n", (unsigned int)addr->v4.s_addr, (unsigned int)mask.v4.s_addr); } return retval; } /* ------------------------------------------------------------------------- * Function : ping_is_possible * Description: Ping the specified host(s) * Input : the_ping_list - the list of hosts to ping * Output : none * Return : 1 if any host responded, 0 otherwise * Data Used : none * ------------------------------------------------------------------------- */ static int ping_is_possible(struct ping_list *the_ping_list) { struct ping_list *list; for (list = the_ping_list; list; list = list->next) { char ping_command[50]; snprintf(ping_command, sizeof(ping_command), "ping -c 1 -q %s", list->ping_address); olsr_printf(1, "\nDo ping on %s ...\n", list->ping_address); if (system(ping_command) == 0) { olsr_printf(1, "...OK\n\n"); return 1; } olsr_printf(1, "...FAILED\n\n"); } return 0; } /* ------------------------------------------------------------------------- * Function : add_to_ping_list * Description: Add a new ping host to the list of ping hosts * Input : ping_address - the address of the ping host * the_ping_list - the list of ping hosts * Output : none * Return : a pointer to the newly added ping host, i.e. start of the list * Data Used : none * ------------------------------------------------------------------------- */ /* add the valid IPs to the head of the list */ static struct ping_list * add_to_ping_list(const char *ping_address, struct ping_list *the_ping_list) { struct ping_list *new = calloc(1, sizeof(struct ping_list)); if (!new) { fprintf(stderr, "DYN GW: Out of memory!\n"); olsr_syslog(OLSR_LOG_ERR, "DYN GW: Out of memory!\n"); exit(0); } new->ping_address = strdup(ping_address); new->next = the_ping_list; return new; } /* ------------------------------------------------------------------------- * Function : add_to_hna_list * Description: Add a new HNA entry to the list of HNA entries * Input : list_root - the start of the list with HNA entries * hna_addr - the address of the new HNA entry * prefixlen - the prefix-length of the new HNA entry * Output : none * Return : a pointer to the newly added HNA entry, i.e. start of the list * Data Used : none * ------------------------------------------------------------------------- */ static struct hna_list * add_to_hna_list(struct hna_list *list_root, union olsr_ip_addr *hna_addr, uint8_t hna_prefixlen) { struct hna_list *new = calloc(1, sizeof(struct hna_list)); if (new == NULL) { fprintf(stderr, "DYN GW: Out of memory!\n"); olsr_syslog(OLSR_LOG_ERR, "DYN GW: Out of memory!\n"); exit(0); } new->hna_addr.v4 = hna_addr->v4; new->hna_prefixlen = hna_prefixlen; new->hna_added = false; new->next = list_root; return new; } /* ------------------------------------------------------------------------- * Function : add_to_hna_group * Description: Add a new HNA group to the list of HNA groups * Input : list_root - the start of the list with HNA groups * Output : none * Return : a pointer to the newly added HNA group, i.e. start of the list * Data Used : none * ------------------------------------------------------------------------- */ static struct hna_group * add_to_hna_group(struct hna_group *list_root) { struct hna_group *new = calloc(1, sizeof(struct hna_group)); if (new == NULL) { fprintf(stderr, "DYN GW: Out of memory!\n"); olsr_syslog(OLSR_LOG_ERR, "DYN GW: Out of memory!\n"); exit(0); } new->next = list_root; return new; } #ifdef _WIN32 /* * Windows pthread compat stuff */ static unsigned long __stdcall ThreadWrapper(void *Para) { struct ThreadPara *Cast; void *(*Func) (void *); void *Arg; Cast = (struct ThreadPara *)Para; Func = Cast->Func; Arg = Cast->Arg; HeapFree(GetProcessHeap(), 0, Para); Func(Arg); return 0; } int pthread_create(HANDLE * Hand, void *Attr __attribute__ ((unused)), void *(*Func) (void *), void *Arg) { struct ThreadPara *Para; unsigned long ThreadId; Para = HeapAlloc(GetProcessHeap(), 0, sizeof(struct ThreadPara)); if (Para == NULL) return -1; Para->Func = Func; Para->Arg = Arg; *Hand = CreateThread(NULL, 0, ThreadWrapper, Para, 0, &ThreadId); if (*Hand == NULL) return -1; return 0; } int pthread_kill(HANDLE Hand, int Sig __attribute__ ((unused))) { if (!TerminateThread(Hand, 0)) return -1; return 0; } int pthread_mutex_init(HANDLE * Hand, void *Attr __attribute__ ((unused))) { *Hand = CreateMutex(NULL, FALSE, NULL); if (*Hand == NULL) return -1; return 0; } int pthread_mutex_lock(HANDLE * Hand) { if (WaitForSingleObject(*Hand, INFINITE) == WAIT_FAILED) return -1; return 0; } int pthread_mutex_unlock(HANDLE * Hand) { if (!ReleaseMutex(*Hand)) return -1; return 0; } #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/dyn_gw/src/olsrd_dyn_gw.h000066400000000000000000000046561234304727700205210ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSRD_DYNGW_H #define _OLSRD_DYNGW_H #include "olsrd_plugin.h" #include "plugin_util.h" //#define INET_NET 0 //#define INET_PREFIX 0 #define INET_ADDR 0 #define INET_MASK 0 #define PROCENTRY_ROUTE "/proc/net/route" #define DEFAULT_HNA_CHECK_INTERVAL 1000 #define DEFAULT_PING_CHECK_INTERVAL 5 int olsrd_plugin_init(void); int olsrd_plugin_interface_version(void); void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size); #endif /* _OLSRD_DYNGW_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/dyn_gw/src/olsrd_plugin.c000066400000000000000000000052211234304727700205100ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "olsrd_plugin.h" #include "olsrd_dyn_gw.h" #include #define PLUGIN_NAME "OLSRD dynamic gateway plugin" #define PLUGIN_VERSION "0.4" #define PLUGIN_AUTHOR "Various artists" #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR #define PLUGIN_INTERFACE_VERSION 5 /** * "Private" declarations */ static void my_init(void) __attribute__ ((constructor)); /* * Defines the version of the plugin interface that is used * THIS IS NOT THE VERSION OF YOUR PLUGIN! * Do not alter unless you know what you are doing! */ int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } /** *Constructor */ void my_init(void) { /* Print plugin info to stdout */ printf("%s\n", MOD_DESC); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/dyn_gw/version-script.txt000066400000000000000000000002051234304727700206010ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/dyn_gw_plain/000077500000000000000000000000001234304727700162375ustar00rootroot00000000000000olsrd-0.6.6.2/lib/dyn_gw_plain/Makefile000066400000000000000000000044361234304727700177060ustar00rootroot00000000000000# The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_dyn_gw_plain PLUGIN_VER = 0.4 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) olsrd-0.6.6.2/lib/dyn_gw_plain/README_DYN_GW_PLAIN000066400000000000000000000005131234304727700211500ustar00rootroot00000000000000DYNAMIC INTERNET GATEWAY PLAIN PLUGIN FOR olsr.org olsrd by Andreas Tonnesen(andreto@olsr.org) additions by Sven-Ola Tuecke This plugin is without Ping/libthread. It is the plain dyn_gw! HOW TO USE Add an entry like this to your olsrd configuration file: LoadPlugin "olsrd_dyn_gw_plain.so.0.4" { } ABOUT Plugin is IPv4 only. olsrd-0.6.6.2/lib/dyn_gw_plain/src/000077500000000000000000000000001234304727700170265ustar00rootroot00000000000000olsrd-0.6.6.2/lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.c000066400000000000000000000127671234304727700230640ustar00rootroot00000000000000 /* * Copyright (c) 2006, Sven-Ola Tuecke * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. */ #include "olsrd_dyn_gw_plain.h" #include "olsr_types.h" #include "ipcalc.h" #include "scheduler.h" #include "olsr.h" #include #include #include #include #include #include #define DEBUGLEV 1 #define PLUGIN_INTERFACE_VERSION 5 static int has_inet_gateway; /** * Plugin interface version * Used by main olsrd to check plugin interface version */ int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } static const struct olsrd_plugin_parameters plugin_parameters[] = { }; void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = sizeof(plugin_parameters) / sizeof(*plugin_parameters); } /** * Initialize plugin * Called after all parameters are passed */ int olsrd_plugin_init(void) { printf("OLSRD dyn_gw_plain plugin by Sven-Ola\n"); gw_net.v4.s_addr = INET_NET; gw_netmask.v4.s_addr = INET_PREFIX; has_inet_gateway = 0; /* Remove all local Inet HNA entries */ while (ip_prefix_list_remove(&olsr_cnf->hna_entries, &gw_net, olsr_netmask_to_prefix(&gw_netmask))) { olsr_printf(DEBUGLEV, "HNA Internet gateway deleted\n"); } /* Register the GW check */ olsr_start_timer(3 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, &olsr_event, NULL, 0); return 1; } int check_gw(union olsr_ip_addr *net, union olsr_ip_addr *mask) { char buff[1024], iface[17]; uint32_t gate_addr, dest_addr, netmask; unsigned int iflags; int num, metric, refcnt, use; int retval = 0; FILE *fp = fopen(PROCENTRY_ROUTE, "r"); if (!fp) { perror(PROCENTRY_ROUTE); olsr_printf(DEBUGLEV, "INET (IPv4) not configured in this system.\n"); return -1; } rewind(fp); /* olsr_printf(DEBUGLEV, "Genmask Destination Gateway " "Flags Metric Ref Use Iface\n"); */ while (fgets(buff, 1023, fp)) { num = sscanf(buff, "%16s %128X %128X %X %d %d %d %128X \n", iface, &dest_addr, &gate_addr, &iflags, &refcnt, &use, &metric, &netmask); if (num < 8) { continue; } /* olsr_printf(DEBUGLEV, "%-15s ", olsr_ip_to_string((union olsr_ip_addr *)&netmask)); olsr_printf(DEBUGLEV, "%-15s ", olsr_ip_to_string((union olsr_ip_addr *)&dest_addr)); olsr_printf(DEBUGLEV, "%-15s %-6d %-2d %7d %s\n", olsr_ip_to_string((union olsr_ip_addr *)&gate_addr), metric, refcnt, use, iface); */ if ( //(iflags & RTF_GATEWAY) && (iflags & RTF_UP) && (metric == 0) && (netmask == mask->v4.s_addr) && (dest_addr == net->v4.s_addr)) { olsr_printf(DEBUGLEV, "INTERNET GATEWAY VIA %s detected in routing table.\n", iface); retval = 1; } } fclose(fp); if (retval == 0) { olsr_printf(DEBUGLEV, "No Internet GWs detected...\n"); } return retval; } /** * Scheduled event to update the hna table, * called from olsrd main thread to keep the hna table thread-safe */ void olsr_event(void *foo __attribute__ ((unused))) { int res = check_gw(&gw_net, &gw_netmask); if (1 == res && 0 == has_inet_gateway) { olsr_printf(DEBUGLEV, "Adding OLSR local HNA entry for Internet\n"); ip_prefix_list_add(&olsr_cnf->hna_entries, &gw_net, olsr_netmask_to_prefix(&gw_netmask)); has_inet_gateway = 1; } else if (0 == res && 1 == has_inet_gateway) { /* Remove all local Inet HNA entries */ while (ip_prefix_list_remove(&olsr_cnf->hna_entries, &gw_net, olsr_netmask_to_prefix(&gw_netmask))) { olsr_printf(DEBUGLEV, "Removing OLSR local HNA entry for Internet\n"); } has_inet_gateway = 0; } } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.h000066400000000000000000000045261234304727700230630ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. */ #ifndef _OLSRD_DYNGWPLAIN_H #define _OLSRD_DYNGWPLAIN_H #include "olsrd_plugin.h" #include "olsr.h" #define INET_NET 0 #define INET_PREFIX 0 #define PROCENTRY_ROUTE "/proc/net/route" union olsr_ip_addr gw_net; union olsr_ip_addr gw_netmask; int check_gw(union olsr_ip_addr *net, union olsr_ip_addr *mask); /* Event function to register with the scheduler */ void olsr_event(void *foo); #endif /* _OLSRD_DYNGWPLAIN_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/dyn_gw_plain/version-script.txt000066400000000000000000000002051234304727700217640ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/httpinfo/000077500000000000000000000000001234304727700154205ustar00rootroot00000000000000olsrd-0.6.6.2/lib/httpinfo/Makefile000066400000000000000000000047351234304727700170710ustar00rootroot00000000000000# The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_httpinfo PLUGIN_VER = 0.1 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc ifdef ADMIN_INTERFACE CPPFLAGS += -DADMIN_INTERFACE endif OBJS += $(TOPDIR)/src/cfgparser/cfgfile_gen.o default_target: $(PLUGIN_FULLNAME) ifdef ADMIN_INTERFACE @echo 'WARNING - BUILT WITH EXPERIMENTAL ADMIN INTERFACE!' endif $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) olsrd-0.6.6.2/lib/httpinfo/README_HTTPINFO000066400000000000000000000047411234304727700176210ustar00rootroot00000000000000HTTP MINI-SERVER PLUGIN FOR OLSRD 0.1 by Andreas Tonnesen(andreto@olsr.org) ----------------------------------------------------- ABOUT This plugin implements a tiny HTTP server that will gespond to a GET request by returning a HTML formatted page contanin various information about the currently running olsrd process. This information includes detailed link status for all links and neighbors, all olsrd routes in the kernel, local configuration, uptime and more. The plugin can also generate a olsrd configfile based on current running configuration. In adittion an experimental administrtion interface is available. ----------------------------------------------------- PARAMETERS The plugin takes the parameter "Port" "[portnumber]" to set the TCP port on which the server is to run. It defaults to 1978. Now remember to open this port in your firewall if planning to access the HTTP server from a remote host! The parameter "Host" "[IP address]" is used to allow access from a single host(muliple such entries can be set) and the parameter "Net" "[IP net] [IP mask]" is used to allow access from entire net-ranges. To allow access from all hosts do: PlParam "Net" "0.0.0.0 0.0.0.0" A configuration example: LoadPlugin "olsrd_httpinfo.so.0.1" { PlParam "port" "80" PlParam "Host" "163.24.87.3" PlParam "Host" "80.23.53.22" PlParam "Net" "10.0.0.0 255.0.0.0" PlParam "Net" "192.168.0.0 255.255.0.0" } This will run the webserver on port 80(the normal HTTP port) and allow access from the hosts 163.24.87.3 and 80.23.53.22 and the networks 10.0.0.0/8 and 192.168.0.0/16. access is always allowed from 127.0.0.1(localhost). ----------------------------------------------------- EXPERIMENTAL ADMIN INTERFACE The plugin can be compiled with a experimental adminitrator interface. This is a web page that will let the user change olsrd settings in realtime. To compile with this feature pass ADMIN_INTERFACE=1 as an argument to make(eg. make ADMIN_INTERFACE=1) ----------------------------------------------------- NOTE! This plugin is very olsrd version sensitive. This means that to be sure everything woks as it is supposed to you should use the version of olsrd that the plugin was shipped with. If using CVS you should check out/update both olsrd and this plugin. The plugin should now compile on windows and FreeBSD as well. To compile in windows: make OS=win32 to compile in FreeBSD: gmake OS=fbsd installation: make make install - Andreas T olsrd-0.6.6.2/lib/httpinfo/src/000077500000000000000000000000001234304727700162075ustar00rootroot00000000000000olsrd-0.6.6.2/lib/httpinfo/src/admin_interface.c000066400000000000000000000302001234304727700214560ustar00rootroot00000000000000 /* * HTTP Info plugin for the olsr.org OLSR daemon * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #include "olsr.h" #include "olsrd_httpinfo.h" #include "olsr_cfg.h" #include "admin_interface.h" #include "net_olsr.h" #include "ipcalc.h" #include #include #include static const char admin_basic_setting_int[] = "%s\n"; static const char admin_basic_setting_float[] = "%s\n"; static const char admin_basic_setting_string[] = "%s\n"; static const char admin_frame_prolog[] = "Administrator interface
\n" "

Change basic settings

\n" "
\n" "\n"; static const char admin_frame_mid[] = "
\n
\n" "
\n" "
\n" "
\n" "

Add/remove local HNA entries

\n" "
\n" "\n" "\n" "\n" "\n" "\n" "
Network:Netmask/Prefix:

\n" "
\n" "\n" "\n"; static const char admin_frame_epilog[] = "
DeleteNetworkNetmask
\n
\n" "
\n" "
\n"; int build_admin_body(char *buf, uint32_t bufsize __attribute__ ((unused))) { int size = 0; size += snprintf(&buf[size], bufsize - size, admin_frame_prolog); size += snprintf(&buf[size], bufsize - size, "\n"); size += snprintf(&buf[size], bufsize - size, admin_basic_setting_int, "Debug level:", "debug_level", 2, olsr_cnf->debug_level); size += snprintf(&buf[size], bufsize - size, admin_basic_setting_float, "Pollrate:", "pollrate", 4, (double)olsr_cnf->pollrate); size += snprintf(&buf[size], bufsize - size, admin_basic_setting_string, "TOS:", "tos", 6, "TBD"); size += snprintf(&buf[size], bufsize - size, "\n" "\n"); size += snprintf(&buf[size], bufsize - size, admin_basic_setting_int, "TC redundancy:", "tc_redundancy", 1, olsr_cnf->tc_redundancy); size += snprintf(&buf[size], bufsize - size, admin_basic_setting_int, "MPR coverage:", "mpr_coverage", 1, olsr_cnf->mpr_coverage); size += snprintf(&buf[size], bufsize - size, admin_basic_setting_int, "Willingness:", "willingness", 1, olsr_cnf->willingness); size += snprintf(&buf[size], bufsize - size, "\n" "\n"); if (olsr_cnf->use_hysteresis) { size += snprintf(&buf[size], bufsize - size, admin_basic_setting_float, "Hyst scaling:", "hyst_scaling", 4, (double)olsr_cnf->hysteresis_param.scaling); size += snprintf(&buf[size], bufsize - size, admin_basic_setting_float, "Lower thr:", "hyst_lower", 4, (double)olsr_cnf->hysteresis_param.thr_low); size += snprintf(&buf[size], bufsize - size, admin_basic_setting_float, "Upper thr:", "hyst_upper", 4, (double)olsr_cnf->hysteresis_param.thr_high); } else { size += snprintf(&buf[size], bufsize - size, "Hysteresis disabled\n"); } size += snprintf(&buf[size], bufsize - size, "\n" "\n"); if (olsr_cnf->lq_level) { size += snprintf(&buf[size], bufsize - size, admin_basic_setting_int, "LQ level:", "lq_level", 1, olsr_cnf->lq_level); size += snprintf(&buf[size], bufsize - size, admin_basic_setting_float, "LQ aging:", "lq_aging", 2, (double)olsr_cnf->lq_aging); } else { size += snprintf(&buf[size], bufsize - size, "LQ disabled\n"); } size += snprintf(&buf[size], bufsize - size, "\n" "\n"); size += snprintf(&buf[size], bufsize - size, "\n"); size += snprintf(&buf[size], bufsize - size, admin_frame_mid); if (olsr_cnf->hna_entries) { struct ip_prefix_list *hna; for (hna = olsr_cnf->hna_entries; hna; hna = hna->next) { struct ipaddr_str netbuf; olsr_ip_to_string(&netbuf, &hna->net.prefix); size += snprintf(&buf[size], bufsize - size, "%s%d\n", netbuf.buf, hna->net.prefix_len, netbuf.buf, hna->net.prefix_len); } } size += snprintf(&buf[size], bufsize - size, admin_frame_epilog); return size; } #ifdef ADMIN_INTERFACE int process_param(char *key, char *value) { static union olsr_ip_addr curr_hna_net; static bool curr_hna_ok = false; if (!strcmp(key, "debug_level")) { int ival = atoi(value); if ((ival < 0) || (ival > 9)) return -1; olsr_cnf->debug_level = ival; return 1; } if (!strcmp(key, "tc_redundancy")) { int ival = atoi(value); if ((ival < 0) || (ival > 3)) return -1; olsr_cnf->tc_redundancy = ival; return 1; } if (!strcmp(key, "mpr_coverage")) { int ival = atoi(value); if (ival < 0) return -1; olsr_cnf->mpr_coverage = ival; return 1; } if (!strcmp(key, "willingness")) { int ival = atoi(value); if ((ival < 0) || (ival > 7)) return -1; olsr_cnf->willingness = ival; return 1; } if (!strcmp(key, "lq_level")) { int ival = atoi(value); if ((ival < 0) || (ival > 2)) return -1; olsr_cnf->lq_level = ival; return 1; } if (!strcmp(key, "lq_wsize")) { int ival = atoi(value); if ((ival < 0) || (ival > 10)) return -1; olsr_cnf->lq_wsize = ival; return 1; } if (!strcmp(key, "hyst_scaling")) { float fval = 1.1; sscanf(value, "%f", &fval); if ((fval < 0.0) || (fval > 1.0)) return -1; olsr_cnf->hysteresis_param.scaling = fval; return 1; } if (!strcmp(key, "hyst_scaling")) { float fval = 1.1; sscanf(value, "%f", &fval); if ((fval < 0.0) || (fval > 1.0)) return -1; olsr_cnf->hysteresis_param.scaling = fval; return 1; } if (!strcmp(key, "hyst_lower")) { float fval = 1.1; sscanf(value, "%f", &fval); if ((fval < 0.0) || (fval > 1.0)) return -1; olsr_cnf->hysteresis_param.thr_low = fval; return 1; } if (!strcmp(key, "hyst_upper")) { float fval = 1.1; sscanf(value, "%f", &fval); if ((fval < 0.0) || (fval > 1.0)) return -1; olsr_cnf->hysteresis_param.thr_high = fval; return 1; } if (!strcmp(key, "pollrate")) { float fval = 1.1; sscanf(value, "%f", &fval); if ((fval < 0.0) || (fval > 1.0)) return -1; olsr_cnf->pollrate = fval; return 1; } if (!strcmp(key, "hna_new_net")) { if (inet_pton(olsr_cnf->ipsize, value, &curr_hna_net.v4) == 0) { fprintf(stderr, "Failed converting new HNA net %s\n", value); return -1; } curr_hna_ok = true; return 1; } if (!strcmp(key, "hna_new_netmask")) { struct in_addr in; uint8_t prefixlen; if (!curr_hna_ok) return -1; curr_hna_ok = false; if (inet_aton(value, &in) == 0) { fprintf(stderr, "Failed converting new HNA netmask %s\n", value); return -1; } prefixlen = netmask_to_prefix((uint8_t *) & in, olsr_cnf->ipsize); if (prefixlen == UCHAR_MAX) { fprintf(stderr, "Failed converting new HNA netmask %s\n", value); return -1; } ip_prefix_list_add(&olsr_cnf->hna_entries, &curr_hna_net, prefixlen); return 1; } if (!strncmp(key, "del_hna", 7) && !strcmp(value, "on")) { struct in_addr net, mask; char ip_net[16], ip_mask[16]; int seperator = 0; uint8_t prefixlen; while (key[7 + seperator] != '*') { seperator++; } memcpy(ip_net, &key[7], seperator); ip_net[seperator] = 0; memcpy(ip_mask, &key[7 + seperator + 1], 16); olsr_printf(1, "Deleting HNA %s/%s\n", ip_net, ip_mask); if (inet_aton(ip_net, &net) == 0) { fprintf(stderr, "Failed converting HNA net %s for deletion\n", ip_net); return -1; } if (inet_aton(ip_mask, &mask) == 0) { fprintf(stderr, "Failed converting HNA netmask %s for deletion\n", ip_mask); return -1; } prefixlen = netmask_to_prefix((uint8_t *) & mask, olsr_cnf->ipsize); if (prefixlen == UCHAR_MAX) { fprintf(stderr, "Failed converting new HNA netmask %s\n", value); return -1; } ip_prefix_list_add(&olsr_cnf->hna_entries, &curr_hna_net, prefixlen); return 1; } return 0; } int process_set_values(char *data, uint32_t data_size, char *buf, uint32_t bufsize __attribute__ ((unused))) { int size = 0; int val_start, key_start; uint32_t i; size += sprintf(buf, "\nolsr.org httpinfo plugin\n\n"); key_start = 0; val_start = 0; for (i = 0; i < data_size; i++) { if (data[i] == '=') { data[i] = '\0'; val_start = i + 1; } if (data[i] == '&') { data[i] = '\0'; if (!process_param(&data[key_start], &data[val_start])) { size += snprintf(&buf[size], bufsize - size, "

FAILED PROCESSING!


Key: %s Value: %s
\n", &data[key_start], &data[val_start]); return -1; } key_start = i + 1; } } if (!process_param(&data[key_start], &data[val_start])) { size += snprintf(&buf[size], bufsize - size, "FAILED PROCESSING!
Key: %s Value: %s
\n", &data[key_start], &data[val_start]); return -1; } size += snprintf(&buf[size], bufsize - size, "

UPDATE SUCESSFULL!


Press BACK and RELOAD in your browser to return to the plugin
\n\n\n"); size += snprintf(&buf[size], bufsize - size, "\n\n\n"); return size; } #endif /* ADMIN_INTERFACE */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/httpinfo/src/admin_interface.h000066400000000000000000000042711234304727700214740ustar00rootroot00000000000000 /* * HTTP Info plugin for the olsr.org OLSR daemon * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #ifndef ADMIN_INTERFACE_H #define ADMIN_INTERFACE_H int build_admin_body(char *, uint32_t); int process_set_values(char *, uint32_t, char *, uint32_t); int process_param(char *, char *); #endif /* ADMIN_INTERFACE_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/httpinfo/src/gfx.h000066400000000000000000000674561234304727700171660ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * includes code by Bruno Randolf * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #ifndef _GFX_H #define _GFX_H static unsigned char favicon_ico[] = { 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x05, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x31, 0x73, 0xde, 0x00, 0x42, 0xff, 0xff, 0x00, 0x52, 0x52, 0x52, 0x00, 0xad, 0xad, 0xad, 0x00, 0x21, 0x21, 0x9c, 0x00, 0x9c, 0xef, 0xff, 0x00, 0x39, 0xb5, 0xff, 0x00, 0x29, 0x29, 0x29, 0x00, 0xd6, 0xd6, 0xd6, 0x00, 0x7b, 0x7b, 0x7b, 0x00, 0x29, 0x31, 0xce, 0x00, 0xc6, 0xff, 0xff, 0x00, 0x94, 0x94, 0x94, 0x00, 0xc6, 0xbd, 0xbd, 0x00, 0x29, 0x52, 0xce, 0x00, 0x94, 0xa5, 0xbd, 0x00, 0x7b, 0x84, 0x9c, 0x00, 0x52, 0x63, 0x6b, 0x00, 0x29, 0xce, 0xff, 0x00, 0x18, 0x18, 0x18, 0x00, 0xe7, 0xe7, 0xe7, 0x00, 0x39, 0x39, 0x39, 0x00, 0x31, 0x9c, 0xf7, 0x00, 0x6b, 0x6b, 0x6b, 0x00, 0x4a, 0xe7, 0xff, 0x00, 0x42, 0xce, 0xff, 0x00, 0x8c, 0xf7, 0xff, 0x00, 0x31, 0xb5, 0xef, 0x00, 0xb5, 0xff, 0xff, 0x00, 0x84, 0x84, 0x84, 0x00, 0x08, 0x08, 0x08, 0x00, 0x10, 0x10, 0x10, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xef, 0xef, 0xef, 0x00, 0x31, 0x31, 0x31, 0x00, 0xde, 0xde, 0xde, 0x00, 0x4a, 0x4a, 0x4a, 0x00, 0xce, 0xce, 0xce, 0x00, 0x5a, 0x5a, 0x5a, 0x00, 0xb5, 0xb5, 0xb5, 0x00, 0x73, 0x73, 0x73, 0x00, 0xa5, 0xa5, 0xa5, 0x00, 0x9c, 0x9c, 0x9c, 0x00, 0x8c, 0x8c, 0x8c, 0x00, 0xc6, 0xc6, 0xc6, 0x00, 0x29, 0x4a, 0xc6, 0x00, 0x29, 0x5a, 0xd6, 0x00, 0xe7, 0xde, 0xde, 0x00, 0xbd, 0xbd, 0xbd, 0x00, 0xf7, 0xff, 0xff, 0x00, 0x73, 0x6b, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0x02, 0x0c, 0x05, 0x25, 0x25, 0x30, 0x10, 0x2f, 0x06, 0x12, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x1a, 0x1b, 0x13, 0x2a, 0x34, 0x1e, 0x0d, 0x07, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x2d, 0x0e, 0x2b, 0x0e, 0x2a, 0x19, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x32, 0x2e, 0x27, 0x2e, 0x32, 0x2b, 0x2d, 0x2a, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x09, 0x25, 0x00, 0x26, 0x00, 0x0b, 0x1f, 0x2d, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x0a, 0x00, 0x26, 0x16, 0x00, 0x2d, 0x00, 0x2c, 0x2d, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x24, 0x23, 0x26, 0x22, 0x00, 0x0e, 0x00, 0x05, 0x04, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x16, 0x22, 0x22, 0x22, 0x22, 0x16, 0x0a, 0x32, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x01, 0x22, 0x23, 0x25, 0x24, 0x21, 0x15, 0x00, 0x00, 0x00, 0x00, 0x20, 0x17, 0x17, 0x2c, 0x32, 0x03, 0x14, 0x33, 0x09, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0a, 0x0a, 0x31, 0x0f, 0x22, 0x16, 0x27, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x28, 0x16, 0x23, 0x16, 0x28, 0x19, 0x22, 0x16, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x01, 0x01, 0x01, 0x32, 0x27, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0a, 0x29, 0x2d, 0x0b, 0x19, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x05, 0x1f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00 }; static unsigned char logo_gif[] = { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x50, 0x00, 0x50, 0x00, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x84, 0x10, 0x18, 0x7b, 0x10, 0x18, 0x7b, 0x42, 0x4a, 0x84, 0x84, 0x94, 0x5a, 0x5a, 0x63, 0x7b, 0x7b, 0x84, 0x6b, 0x6b, 0x73, 0x84, 0x84, 0x8c, 0x94, 0x94, 0x9c, 0xbd, 0xbd, 0xc6, 0xb5, 0xb5, 0xbd, 0xde, 0xde, 0xe7, 0xc6, 0xc6, 0xce, 0xe7, 0xe7, 0xef, 0x39, 0x42, 0x4a, 0x5a, 0x63, 0x63, 0x52, 0x5a, 0x5a, 0xd6, 0xde, 0xde, 0xa5, 0xad, 0x73, 0xff, 0xff, 0x42, 0xff, 0xff, 0x4a, 0xff, 0xff, 0x52, 0xff, 0xff, 0x63, 0xff, 0xff, 0x7b, 0xde, 0xde, 0x73, 0xff, 0xff, 0x94, 0xff, 0xff, 0x9c, 0xa5, 0xa5, 0x6b, 0x7b, 0x7b, 0x52, 0xde, 0xde, 0x9c, 0xff, 0xff, 0xb5, 0xff, 0xff, 0xc6, 0x73, 0x73, 0x5a, 0xef, 0xef, 0xbd, 0xd6, 0xd6, 0xad, 0x7b, 0x7b, 0x63, 0x84, 0x84, 0x6b, 0xde, 0xde, 0xb5, 0xe7, 0xe7, 0xbd, 0xef, 0xef, 0xc6, 0xf7, 0xf7, 0xce, 0xa5, 0xa5, 0x8c, 0xad, 0xad, 0x94, 0x7b, 0x7b, 0x6b, 0xde, 0xde, 0xc6, 0xc6, 0xc6, 0xb5, 0x73, 0x73, 0x6b, 0xf7, 0xf7, 0xe7, 0x9c, 0x9c, 0x94, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0x31, 0xff, 0xf7, 0x4a, 0xef, 0xe7, 0x6b, 0xff, 0xf7, 0x73, 0xff, 0xef, 0x29, 0xff, 0xef, 0x39, 0xff, 0xf7, 0x8c, 0xff, 0xef, 0x6b, 0xd6, 0xce, 0x7b, 0xff, 0xf7, 0xad, 0xff, 0xf7, 0xb5, 0xff, 0xe7, 0x31, 0xff, 0xe7, 0x39, 0xff, 0xe7, 0x42, 0xff, 0xe7, 0x4a, 0xff, 0xef, 0x73, 0xff, 0xef, 0x7b, 0xff, 0xf7, 0xbd, 0xf7, 0xde, 0x42, 0xe7, 0xce, 0x42, 0xf7, 0xde, 0x4a, 0xff, 0xe7, 0x5a, 0xbd, 0xad, 0x52, 0xf7, 0xe7, 0x8c, 0xd6, 0xce, 0x9c, 0xef, 0xce, 0x29, 0xe7, 0xce, 0x5a, 0xf7, 0xe7, 0x94, 0xff, 0xef, 0x9c, 0xff, 0xd6, 0x21, 0xff, 0xd6, 0x31, 0xce, 0xb5, 0x4a, 0xa5, 0x94, 0x4a, 0x9c, 0x94, 0x73, 0xff, 0xd6, 0x39, 0xf7, 0xde, 0x84, 0xff, 0xce, 0x29, 0xf7, 0xc6, 0x31, 0xf7, 0xce, 0x4a, 0xff, 0xd6, 0x52, 0xd6, 0xb5, 0x4a, 0xf7, 0xd6, 0x6b, 0xff, 0xe7, 0x9c, 0x73, 0x6b, 0x52, 0xff, 0xce, 0x42, 0xff, 0xe7, 0xa5, 0xe7, 0xde, 0xc6, 0xd6, 0xbd, 0x7b, 0xef, 0xde, 0xb5, 0xe7, 0xad, 0x29, 0xef, 0xb5, 0x31, 0xef, 0xb5, 0x39, 0xef, 0xc6, 0x6b, 0x6b, 0x63, 0x52, 0xff, 0xb5, 0x21, 0xf7, 0xb5, 0x31, 0xef, 0xbd, 0x5a, 0xde, 0xb5, 0x63, 0xef, 0xc6, 0x73, 0xef, 0xad, 0x39, 0xbd, 0x94, 0x4a, 0xef, 0xc6, 0x7b, 0xff, 0xad, 0x29, 0xef, 0xa5, 0x31, 0xff, 0xb5, 0x39, 0xf7, 0xb5, 0x4a, 0xef, 0xb5, 0x52, 0xef, 0xa5, 0x39, 0xf7, 0xa5, 0x31, 0xbd, 0xa5, 0x84, 0xde, 0xc6, 0xa5, 0xde, 0x8c, 0x29, 0xf7, 0x9c, 0x31, 0xef, 0x9c, 0x39, 0xd6, 0x84, 0x29, 0xe7, 0x8c, 0x31, 0xf7, 0x9c, 0x42, 0xd6, 0x8c, 0x42, 0xc6, 0x8c, 0x52, 0xde, 0xce, 0xbd, 0x73, 0x6b, 0x63, 0x7b, 0x73, 0x6b, 0xef, 0x8c, 0x31, 0xf7, 0x8c, 0x31, 0xce, 0x73, 0x29, 0xe7, 0x84, 0x31, 0xde, 0x84, 0x39, 0xce, 0x94, 0x63, 0xde, 0x7b, 0x31, 0xce, 0x7b, 0x42, 0xbd, 0xa5, 0x94, 0xde, 0x73, 0x31, 0x7b, 0x52, 0x39, 0xb5, 0x8c, 0x73, 0xbd, 0x5a, 0x21, 0xde, 0x6b, 0x29, 0xc6, 0x63, 0x29, 0xc6, 0x6b, 0x39, 0xef, 0x73, 0x31, 0xd6, 0x6b, 0x31, 0xe7, 0x73, 0x39, 0xe7, 0x63, 0x29, 0x6b, 0x5a, 0x52, 0xd6, 0x5a, 0x29, 0xc6, 0x63, 0x39, 0xce, 0x6b, 0x42, 0xb5, 0x4a, 0x21, 0x9c, 0x84, 0x7b, 0xce, 0x52, 0x29, 0xbd, 0x42, 0x21, 0xb5, 0x42, 0x21, 0xc6, 0x5a, 0x39, 0xd6, 0x4a, 0x29, 0xc6, 0x4a, 0x29, 0xad, 0x84, 0x7b, 0xa5, 0x31, 0x21, 0xb5, 0x4a, 0x39, 0xb5, 0x31, 0x21, 0xad, 0x31, 0x21, 0xa5, 0x5a, 0x52, 0xad, 0x6b, 0x63, 0x9c, 0x39, 0x31, 0xa5, 0x42, 0x39, 0xad, 0x4a, 0x42, 0xce, 0x31, 0x29, 0x9c, 0x21, 0x21, 0x94, 0x31, 0x31, 0x8c, 0x31, 0x31, 0x84, 0x31, 0x31, 0xa5, 0x52, 0x52, 0x94, 0x63, 0x63, 0x94, 0x73, 0x73, 0xa5, 0x94, 0x94, 0xc6, 0xbd, 0xbd, 0xd6, 0xce, 0xce, 0xf7, 0xf7, 0xf7, 0xef, 0xef, 0xef, 0xe7, 0xe7, 0xe7, 0xde, 0xde, 0xde, 0xd6, 0xd6, 0xd6, 0xce, 0xce, 0xce, 0xc6, 0xc6, 0xc6, 0xbd, 0xbd, 0xbd, 0xb5, 0xb5, 0xb5, 0xad, 0xad, 0xad, 0xa5, 0xa5, 0xa5, 0x9c, 0x9c, 0x9c, 0x94, 0x94, 0x94, 0x8c, 0x8c, 0x8c, 0x84, 0x84, 0x84, 0x7b, 0x7b, 0x7b, 0x73, 0x73, 0x73, 0x6b, 0x6b, 0x6b, 0x63, 0x63, 0x63, 0x5a, 0x5a, 0x5a, 0x52, 0x52, 0x52, 0x4a, 0x4a, 0x4a, 0x42, 0x42, 0x42, 0x39, 0x39, 0x39, 0x31, 0x31, 0x31, 0x29, 0x29, 0x29, 0x21, 0x21, 0x21, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0xd9, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x08, 0xff, 0x00, 0xb3, 0x09, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x08, 0x13, 0x2a, 0x5c, 0xc8, 0xb0, 0xa1, 0xc3, 0x87, 0x10, 0x23, 0x4a, 0x9c, 0x48, 0xb1, 0xa2, 0xc5, 0x8b, 0x18, 0x33, 0x6a, 0xdc, 0xc8, 0xb1, 0xa3, 0xc7, 0x8f, 0x20, 0x43, 0x8a, 0x1c, 0x49, 0xb2, 0xa4, 0x49, 0x87, 0xc7, 0x96, 0x35, 0x6b, 0xe6, 0xac, 0x19, 0x33, 0x65, 0xc7, 0x4e, 0x76, 0x2c, 0x76, 0xcc, 0x98, 0x31, 0x62, 0x38, 0x8b, 0xd1, 0x4c, 0xc6, 0x2c, 0x5a, 0x34, 0x65, 0x32, 0x2f, 0xea, 0x2c, 0x46, 0x4c, 0xa7, 0xcd, 0x63, 0x48, 0x8f, 0x21, 0x5b, 0xca, 0x4c, 0x9a, 0x35, 0x67, 0x41, 0x25, 0x0e, 0xb5, 0x49, 0xf5, 0x28, 0xd2, 0x64, 0xc8, 0x92, 0x29, 0xdb, 0xfa, 0xec, 0x1a, 0xb6, 0x65, 0x51, 0x51, 0x26, 0x1d, 0x3b, 0x76, 0x69, 0x32, 0xad, 0xca, 0x96, 0x31, 0x63, 0xd6, 0xcc, 0x1a, 0x80, 0x69, 0x61, 0x15, 0x22, 0x53, 0x7a, 0x8c, 0xd8, 0xaf, 0x5e, 0xbd, 0x7e, 0x0d, 0xa3, 0xbb, 0x34, 0xeb, 0x56, 0xb5, 0x6c, 0x9b, 0x75, 0x05, 0x80, 0x0d, 0x59, 0x5c, 0x83, 0x58, 0x93, 0x1d, 0xf3, 0x15, 0xa0, 0xb1, 0xe3, 0x5e, 0xc6, 0x12, 0xa3, 0x4d, 0xcb, 0xcc, 0x99, 0xb3, 0x67, 0xcf, 0xa2, 0x01, 0x20, 0x0c, 0xf4, 0xb0, 0x40, 0x65, 0x5a, 0x8f, 0xf1, 0x72, 0x4c, 0x3a, 0xc0, 0x2e, 0x63, 0xa0, 0xb5, 0xaa, 0x75, 0xb9, 0x1a, 0x5a, 0xb4, 0x6a, 0x9b, 0x01, 0x74, 0x8e, 0xfb, 0x72, 0x2b, 0xe3, 0xd2, 0xa4, 0x79, 0xa1, 0x55, 0x7b, 0x0c, 0x58, 0xaf, 0x5d, 0xbb, 0x7a, 0x01, 0x43, 0x26, 0x2d, 0x36, 0x80, 0x64, 0x71, 0x59, 0x33, 0x23, 0xd6, 0x18, 0x38, 0xee, 0xc6, 0xc2, 0x96, 0x49, 0x07, 0xf6, 0x3c, 0xc0, 0xaf, 0x69, 0xb1, 0xb1, 0x15, 0x8b, 0x8a, 0x2c, 0x9a, 0xda, 0x65, 0x8c, 0x9d, 0x8b, 0xff, 0xcf, 0xad, 0xf6, 0x57, 0x69, 0xe0, 0xce, 0x7f, 0xc1, 0xde, 0x4c, 0x2d, 0x6a, 0xb5, 0x95, 0xcd, 0x92, 0xf1, 0x42, 0xbf, 0xcb, 0x74, 0xfd, 0xfa, 0xf3, 0x03, 0x20, 0x63, 0xee, 0xf8, 0x3e, 0x70, 0x5e, 0xf3, 0x19, 0x63, 0x5c, 0x33, 0x32, 0x41, 0x33, 0xcd, 0x4a, 0xce, 0x20, 0xf3, 0x1f, 0x7d, 0xce, 0xf9, 0x32, 0x0c, 0x32, 0xc2, 0x0c, 0x03, 0x4c, 0x30, 0xa3, 0x31, 0x08, 0x20, 0x5e, 0xd7, 0x65, 0x67, 0x8c, 0x49, 0xc6, 0x60, 0x03, 0x8d, 0x65, 0xcf, 0x20, 0xc3, 0x4b, 0x2f, 0x00, 0x02, 0x88, 0x5e, 0x2f, 0xc7, 0xf4, 0x32, 0x8c, 0x33, 0xc6, 0x0c, 0xb3, 0x56, 0x2f, 0xf6, 0xed, 0x72, 0x61, 0x2f, 0xbe, 0xf8, 0xf2, 0x8c, 0x71, 0xd1, 0x98, 0x44, 0x8d, 0x35, 0x98, 0x3d, 0x03, 0x8d, 0x88, 0x78, 0x91, 0x58, 0xe2, 0x2e, 0xbf, 0xb8, 0xc4, 0x96, 0x74, 0x3d, 0x51, 0x27, 0xe3, 0x8c, 0xbe, 0xfc, 0x02, 0xcc, 0x8d, 0x9b, 0x61, 0x83, 0x4d, 0x4c, 0x23, 0x09, 0x48, 0x0d, 0x34, 0xd0, 0xf8, 0x08, 0x9e, 0x2f, 0x41, 0xe2, 0x35, 0x9f, 0x2f, 0x2c, 0x59, 0xa6, 0x56, 0x34, 0xcd, 0xf8, 0xb2, 0xe4, 0x88, 0x34, 0x3a, 0x19, 0x4c, 0x71, 0x51, 0x62, 0x93, 0xe3, 0x48, 0xd0, 0x00, 0x70, 0x25, 0x96, 0xd0, 0x34, 0x03, 0xcc, 0x2f, 0xbf, 0xd4, 0xc8, 0xa5, 0x97, 0xc5, 0x60, 0xa6, 0x0c, 0x33, 0xc5, 0x08, 0xf3, 0xcb, 0x92, 0x78, 0xd5, 0xa8, 0xa6, 0x31, 0xd7, 0xb4, 0x79, 0xcd, 0x35, 0x1b, 0x8a, 0x94, 0x68, 0x35, 0x3e, 0xb9, 0x06, 0x8d, 0x5d, 0xc0, 0xdc, 0x99, 0x67, 0x9e, 0x0d, 0x3c, 0xb0, 0x00, 0x03, 0x0b, 0x48, 0x80, 0xc0, 0x7c, 0x0f, 0x84, 0x4a, 0x63, 0x93, 0x13, 0x0a, 0xa3, 0x59, 0x94, 0x8b, 0x5e, 0x43, 0x60, 0x48, 0xca, 0x60, 0x03, 0x80, 0x35, 0xd2, 0xf8, 0xff, 0xe4, 0x13, 0x33, 0xc1, 0xd4, 0x5a, 0xa9, 0xa5, 0x2e, 0xa0, 0x90, 0x82, 0x0a, 0x29, 0x9c, 0x40, 0x82, 0x18, 0x29, 0xa4, 0x80, 0xc2, 0x09, 0x4d, 0x3a, 0x09, 0x8c, 0x30, 0x50, 0x2a, 0x0a, 0xab, 0x48, 0x9a, 0x49, 0x39, 0x8d, 0x34, 0xb1, 0xfa, 0x04, 0xa1, 0x30, 0xd4, 0xd6, 0xea, 0xc0, 0x07, 0x15, 0x64, 0x6b, 0xc1, 0xb6, 0x15, 0xd0, 0xf0, 0x43, 0x14, 0x6c, 0x04, 0xe3, 0x40, 0x30, 0xc2, 0x1c, 0x83, 0x5d, 0x76, 0xd8, 0x2c, 0x6a, 0x4d, 0x35, 0x8d, 0x7e, 0xe4, 0xd5, 0x66, 0xd5, 0x40, 0x1b, 0xab, 0x34, 0xd0, 0xd4, 0x45, 0xcc, 0x30, 0xc3, 0x08, 0xb3, 0xc0, 0x02, 0x1a, 0x64, 0xeb, 0x6f, 0x0e, 0x56, 0x60, 0xc1, 0x06, 0x30, 0x13, 0xf4, 0x22, 0x0c, 0x9b, 0xc6, 0x11, 0x76, 0x8d, 0x35, 0x0c, 0x83, 0xf5, 0x51, 0x87, 0x52, 0x12, 0xf6, 0xac, 0xbc, 0xd2, 0x4c, 0xb3, 0x9f, 0x31, 0x3a, 0x11, 0x23, 0xcc, 0x04, 0x19, 0xd0, 0x90, 0x6d, 0x0e, 0x40, 0x60, 0x51, 0x87, 0x2e, 0xbc, 0xcc, 0x00, 0xdc, 0x30, 0xd4, 0x24, 0x2c, 0xe5, 0xc2, 0xd5, 0x54, 0xf3, 0x0c, 0x48, 0xcb, 0x10, 0x16, 0x9b, 0x35, 0xd3, 0x4c, 0x3c, 0x0d, 0x33, 0xbf, 0x19, 0x6b, 0xa6, 0x69, 0x18, 0xd0, 0x00, 0x32, 0x16, 0x6f, 0x0c, 0xf2, 0xc0, 0x7f, 0x5f, 0xc6, 0xd9, 0x66, 0xba, 0xeb, 0x42, 0x2a, 0xcc, 0x47, 0x37, 0x46, 0xcc, 0x5e, 0xcd, 0xd5, 0x2c, 0x73, 0xdf, 0x73, 0x31, 0xd4, 0x80, 0x83, 0x14, 0x72, 0xe8, 0x31, 0x34, 0xd1, 0x24, 0xf6, 0x62, 0xb4, 0x94, 0x48, 0x57, 0x43, 0x4d, 0x35, 0xc3, 0x78, 0x04, 0xb1, 0xab, 0xc6, 0x8d, 0xdd, 0x0c, 0x83, 0xfe, 0xd5, 0x17, 0x80, 0x0a, 0x52, 0xa8, 0xa1, 0x35, 0x7a, 0x33, 0x06, 0x79, 0x2a, 0xd2, 0xd6, 0x8c, 0xad, 0x6a, 0x47, 0xc7, 0x64, 0xff, 0x97, 0x30, 0x00, 0xd1, 0xfc, 0x36, 0x1f, 0x7d, 0xa6, 0x91, 0x46, 0xc6, 0x18, 0x0d, 0xd0, 0xcd, 0x64, 0x8d, 0xc0, 0x60, 0x97, 0xee, 0x35, 0x62, 0x57, 0xe3, 0xd6, 0xaa, 0x19, 0xc5, 0x6c, 0x1c, 0xda, 0x51, 0x0a, 0x23, 0xe3, 0xe6, 0x84, 0x8f, 0x47, 0x5f, 0x89, 0x85, 0x16, 0xeb, 0x0b, 0x31, 0x5e, 0xb1, 0xdc, 0xb2, 0x35, 0xae, 0x42, 0x93, 0x51, 0x33, 0x7f, 0x27, 0xac, 0x4c, 0x70, 0x42, 0xb2, 0x5d, 0x38, 0xdb, 0x75, 0x1b, 0x5a, 0xe9, 0x2f, 0x31, 0x9b, 0x2e, 0x39, 0xda, 0x70, 0x59, 0x74, 0x6a, 0xeb, 0xec, 0xdd, 0xe5, 0xcb, 0x88, 0x43, 0xfa, 0x67, 0x9f, 0x7d, 0xf3, 0xd5, 0x8e, 0xe7, 0x84, 0xe4, 0x4e, 0x03, 0x79, 0xcb, 0xbb, 0xc7, 0x56, 0x4d, 0x45, 0x08, 0x03, 0x0f, 0x00, 0x32, 0x34, 0x06, 0x69, 0xe2, 0xe0, 0x6c, 0x2b, 0x1e, 0xa4, 0xed, 0xa5, 0x06, 0x93, 0x8c, 0xee, 0xa8, 0x1b, 0x67, 0xcd, 0x44, 0x29, 0x5b, 0x0f, 0x6f, 0x9e, 0x35, 0x7a, 0x69, 0x62, 0xf7, 0x8a, 0xa3, 0x69, 0xa8, 0x9a, 0xe4, 0x0e, 0x43, 0x8c, 0x53, 0x2d, 0x8f, 0x8d, 0x79, 0x94, 0x54, 0x3e, 0xa4, 0x7e, 0x6c, 0xe0, 0xc1, 0x53, 0xfb, 0x84, 0xf4, 0x3e, 0xda, 0xd5, 0x8e, 0x54, 0xb5, 0x8a, 0x10, 0xbe, 0x98, 0x91, 0x34, 0xc9, 0x79, 0x05, 0x69, 0xd4, 0xa0, 0xc6, 0xcb, 0x22, 0xb2, 0x13, 0xca, 0xb8, 0x25, 0x3b, 0x76, 0x11, 0xe0, 0x9e, 0x08, 0xc8, 0xbd, 0x25, 0x71, 0x6d, 0x54, 0xc6, 0xaa, 0x9f, 0xfd, 0x88, 0x61, 0x2e, 0x6a, 0x3c, 0x8b, 0x1a, 0xc9, 0xc0, 0x97, 0x30, 0x6c, 0x95, 0x11, 0xa3, 0x6d, 0x66, 0x1a, 0xb7, 0xfa, 0x85, 0x33, 0xb0, 0xa3, 0x2a, 0x00, 0x15, 0x03, 0x00, 0xd0, 0x18, 0x92, 0x30, 0xce, 0x05, 0x80, 0x66, 0xa0, 0xc8, 0x38, 0xcf, 0x88, 0x50, 0x51, 0xff, 0x8a, 0x61, 0x8c, 0x67, 0x50, 0x03, 0x5a, 0xd3, 0x20, 0xc6, 0x47, 0x62, 0x86, 0x36, 0x3b, 0x55, 0x2a, 0x66, 0x65, 0x12, 0x50, 0x33, 0x78, 0x21, 0xa0, 0x67, 0xd0, 0x8d, 0x66, 0xc3, 0x18, 0xd1, 0x30, 0x7c, 0x81, 0x0c, 0xc0, 0x01, 0x83, 0x19, 0xb2, 0xb1, 0x1f, 0x11, 0x8d, 0xc1, 0x8c, 0x67, 0x4d, 0x23, 0x1a, 0x65, 0xf3, 0xc8, 0x0d, 0x63, 0x83, 0x8c, 0x09, 0x01, 0x23, 0x1a, 0xd7, 0x68, 0x9f, 0x5b, 0xa8, 0x88, 0xc3, 0x12, 0xf1, 0xe2, 0x2d, 0xbe, 0x19, 0x55, 0x17, 0xa3, 0x01, 0x8c, 0x64, 0x00, 0x60, 0x19, 0x45, 0x39, 0x8a, 0x32, 0xcc, 0xf8, 0x8c, 0x60, 0x80, 0xe4, 0x82, 0xd7, 0x08, 0x94, 0x30, 0x80, 0x01, 0x38, 0xf6, 0xc5, 0xa9, 0x26, 0x75, 0x2c, 0x91, 0xd1, 0x9a, 0x11, 0x8c, 0x1a, 0xed, 0x91, 0x18, 0x29, 0xc3, 0x18, 0x11, 0xaf, 0x12, 0x0d, 0x69, 0x50, 0x63, 0x19, 0xbf, 0x00, 0x89, 0xd1, 0xa8, 0x91, 0xaf, 0x5a, 0x35, 0xb2, 0x46, 0x71, 0xb2, 0x49, 0x24, 0xbd, 0x34, 0xc8, 0xcd, 0x20, 0xe3, 0x17, 0x5d, 0x04, 0x60, 0x20, 0x91, 0xb2, 0x14, 0x03, 0x51, 0xa3, 0x7f, 0x1e, 0xf1, 0x23, 0xe0, 0x54, 0x18, 0x8c, 0x46, 0xe6, 0xe9, 0x91, 0x02, 0x82, 0x46, 0x97, 0x0a, 0x45, 0xba, 0x3f, 0xfa, 0x51, 0x1a, 0x37, 0x42, 0xc6, 0x18, 0x95, 0x72, 0x16, 0x23, 0xa2, 0xd1, 0x51, 0x38, 0x8c, 0xd0, 0x0a, 0xe1, 0x88, 0xa7, 0x5f, 0xb8, 0xe5, 0x87, 0xc2, 0xfc, 0x9e, 0x9e, 0xf6, 0xe8, 0xc7, 0x68, 0xdc, 0x30, 0x91, 0xc6, 0x60, 0x66, 0x33, 0xdf, 0x03, 0x0c, 0x91, 0xdc, 0x08, 0x1a, 0xf8, 0xca, 0x17, 0x18, 0x9d, 0x01, 0x4b, 0x00, 0x38, 0xc3, 0x17, 0x7d, 0x13, 0x66, 0xfb, 0xa8, 0xa1, 0x8c, 0xa5, 0xb8, 0x65, 0x19, 0xc7, 0x1c, 0x06, 0x6c, 0x96, 0xa1, 0xff, 0x14, 0xbf, 0x28, 0x03, 0x1a, 0xd5, 0xc0, 0xe5, 0x47, 0x6e, 0x88, 0xce, 0x7b, 0xad, 0x90, 0x19, 0x29, 0xb3, 0xc6, 0x96, 0xfa, 0x66, 0x1c, 0x68, 0xa4, 0x4f, 0x4e, 0xc9, 0x08, 0x86, 0x32, 0x00, 0x20, 0x0d, 0x62, 0xe8, 0x32, 0x31, 0x7f, 0xf1, 0x89, 0x21, 0x47, 0x72, 0x46, 0xfb, 0xf1, 0xf2, 0x76, 0xd5, 0xd4, 0x93, 0x48, 0xab, 0x59, 0xa9, 0x04, 0x8a, 0x91, 0x26, 0xe2, 0x4c, 0x4b, 0x33, 0xa4, 0x91, 0x8c, 0x50, 0x8e, 0xa4, 0x18, 0x15, 0x25, 0x0a, 0xb5, 0x56, 0x18, 0x0c, 0x90, 0x56, 0x93, 0xa4, 0x21, 0x24, 0x97, 0x10, 0x8b, 0x42, 0xcb, 0xb3, 0x50, 0xe6, 0x32, 0x4b, 0x2b, 0x89, 0x32, 0x30, 0x66, 0x50, 0x9a, 0xd6, 0x34, 0x86, 0x77, 0xba, 0x15, 0xf3, 0x44, 0x18, 0xc8, 0x70, 0x66, 0x45, 0x35, 0x95, 0x79, 0x86, 0x40, 0xab, 0x44, 0x94, 0x7b, 0xe5, 0xcb, 0xa8, 0x35, 0xcd, 0x6a, 0x49, 0x13, 0xa8, 0xc0, 0xa6, 0xa6, 0x74, 0x35, 0xcf, 0x58, 0xc6, 0x46, 0x4f, 0x92, 0x31, 0x15, 0xce, 0xf4, 0xac, 0xe4, 0xd2, 0x29, 0xb5, 0xf0, 0xe5, 0x55, 0xb3, 0xa8, 0x46, 0x25, 0xcf, 0x70, 0x46, 0x1a, 0x83, 0x52, 0x14, 0x9c, 0x58, 0xd5, 0xaa, 0xe9, 0xbc, 0x2a, 0x5b, 0xdb, 0xea, 0xcf, 0xb4, 0xc0, 0xf5, 0x19, 0xed, 0x0a, 0x0a, 0x51, 0xaa, 0x3a, 0x94, 0xc2, 0x56, 0xd5, 0xae, 0xb3, 0x34, 0xcb, 0x5f, 0x90, 0x24, 0x18, 0x68, 0x20, 0xe7, 0x30, 0x37, 0x19, 0xa3, 0x0c, 0xfa, 0x39, 0x97, 0x9a, 0xd8, 0x64, 0x99, 0xcc, 0xf4, 0xeb, 0x5a, 0xd6, 0xd2, 0xd8, 0x88, 0x7a, 0x26, 0x1b, 0x0a, 0x50, 0x00, 0x32, 0x0a, 0x90, 0x80, 0x03, 0x28, 0xa3, 0x05, 0x5b, 0xc1, 0x4a, 0x65, 0x7b, 0x4a, 0x99, 0xc0, 0x38, 0x43, 0x02, 0xcf, 0x80, 0x00, 0x04, 0x92, 0x01, 0x0c, 0x5f, 0xff, 0x7c, 0x96, 0x05, 0x1d, 0xa0, 0x40, 0x15, 0x4c, 0x00, 0x83, 0x08, 0x18, 0xc0, 0x00, 0xcc, 0x58, 0x46, 0x6a, 0xfa, 0x82, 0x16, 0x04, 0x34, 0x43, 0x02, 0x2d, 0x29, 0x44, 0x0b, 0x4a, 0xe0, 0x01, 0x13, 0xac, 0x80, 0x05, 0x2f, 0x08, 0x0b, 0x07, 0x38, 0xa0, 0x83, 0x0c, 0x60, 0xa0, 0x02, 0x3f, 0xc8, 0x81, 0x11, 0x8e, 0x30, 0x05, 0x2a, 0x7c, 0x41, 0x02, 0xc0, 0x15, 0x2e, 0x68, 0xfe, 0xc2, 0x0c, 0x03, 0x88, 0xa0, 0x03, 0x4c, 0x18, 0x41, 0x08, 0xd6, 0x0b, 0x02, 0x0e, 0x64, 0xe0, 0x02, 0xda, 0x75, 0xc2, 0x18, 0x48, 0xa2, 0x83, 0xfa, 0xea, 0x60, 0x03, 0xf6, 0x1d, 0xc2, 0x10, 0x84, 0x20, 0x05, 0x2b, 0x58, 0x01, 0x0c, 0x60, 0xa8, 0x03, 0x1c, 0xd2, 0xe0, 0x8c, 0xe0, 0x8a, 0x77, 0x19, 0x08, 0x20, 0x84, 0x12, 0x6c, 0x00, 0x82, 0xf5, 0xae, 0xb7, 0x08, 0x3e, 0xe8, 0x01, 0x14, 0x88, 0x80, 0x84, 0x26, 0x98, 0xc1, 0x0c, 0x7b, 0x68, 0x84, 0x23, 0x40, 0x52, 0x01, 0x0c, 0xec, 0xe0, 0x06, 0x37, 0xd0, 0xef, 0x0e, 0x92, 0x90, 0x84, 0x2e, 0x68, 0x21, 0x0b, 0x66, 0xb8, 0xc3, 0x1d, 0xfa, 0xd0, 0x07, 0x40, 0x04, 0x42, 0x13, 0x12, 0x30, 0x12, 0x5b, 0xd2, 0xc0, 0x85, 0x20, 0x0c, 0xe1, 0x09, 0x61, 0xc8, 0x71, 0x18, 0xbc, 0xf0, 0x84, 0x25, 0x5c, 0x01, 0x0d, 0x67, 0x28, 0xc3, 0x1f, 0xfc, 0x40, 0x09, 0x4f, 0xa8, 0xc2, 0x14, 0x1e, 0xe1, 0x01, 0x0d, 0x8c, 0x80, 0x04, 0x12, 0x77, 0x21, 0x09, 0x5b, 0x70, 0x82, 0x16, 0xce, 0x60, 0x86, 0x39, 0xcc, 0xe1, 0x0f, 0x89, 0x60, 0xc4, 0x25, 0x30, 0x81, 0x09, 0x48, 0x40, 0x00, 0x33, 0x97, 0x91, 0xc0, 0x17, 0xde, 0x70, 0x87, 0x37, 0xd8, 0x01, 0x0d, 0x6e, 0x88, 0x83, 0x9a, 0xdd, 0xd0, 0x06, 0x3b, 0xf4, 0xc1, 0xce, 0x0f, 0x7e, 0x40, 0x84, 0x24, 0x44, 0x71, 0x0a, 0x01, 0x10, 0xe0, 0x23, 0x41, 0x90, 0x42, 0x13, 0xb2, 0xc0, 0xe7, 0x33, 0x9c, 0x61, 0x0d, 0x78, 0x98, 0x83, 0x21, 0x12, 0xf1, 0x88, 0x47, 0x6c, 0x02, 0x14, 0xa0, 0x28, 0x05, 0x2a, 0x0a, 0x21, 0x9d, 0xad, 0x98, 0x16, 0x19, 0x82, 0x18, 0x32, 0x9c, 0xff, 0xa0, 0x88, 0x4a, 0x33, 0x62, 0x12, 0x88, 0xa0, 0x04, 0x25, 0x4a, 0xe1, 0x89, 0x53, 0xc4, 0x62, 0x00, 0x03, 0xb8, 0x05, 0x48, 0xda, 0x40, 0x07, 0x3a, 0xe0, 0xe1, 0xd4, 0x7c, 0x38, 0x84, 0x21, 0x2c, 0xf1, 0x88, 0x4c, 0x64, 0x82, 0x14, 0xb0, 0x80, 0x45, 0x2a, 0x56, 0x41, 0x0c, 0x07, 0xb0, 0xaf, 0x7d, 0xbe, 0x70, 0x40, 0x24, 0x2a, 0xb1, 0x89, 0x43, 0x23, 0x3a, 0xd1, 0xa5, 0x28, 0x45, 0x28, 0xe8, 0x1c, 0x8b, 0x4f, 0xd3, 0xe2, 0x13, 0x23, 0xc9, 0xc3, 0x22, 0x04, 0xd1, 0x88, 0x46, 0x74, 0xa2, 0x13, 0x9c, 0x18, 0xc5, 0x2b, 0xa6, 0xbd, 0x8a, 0x4f, 0xd4, 0x9a, 0x21, 0xb8, 0x60, 0x45, 0x2d, 0x5c, 0xc1, 0xed, 0x56, 0xb8, 0x42, 0x16, 0xe0, 0x9e, 0x05, 0x01, 0x6c, 0x21, 0x83, 0xa0, 0x96, 0x24, 0x18, 0xb9, 0x98, 0x69, 0x2e, 0xd6, 0x5d, 0x53, 0x89, 0xa0, 0xfb, 0xac, 0x0b, 0x58, 0xe1, 0x9d, 0x3e, 0x4b, 0xef, 0x7a, 0xdb, 0xfb, 0xde, 0xf8, 0xce, 0xb7, 0xbe, 0xf7, 0xcd, 0xef, 0x7e, 0xfb, 0xfb, 0xdf, 0x00, 0x0f, 0xb8, 0xc0, 0x39, 0x12, 0x10, 0x00, 0x3b }; static unsigned char grayline_gif[] = { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x01, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x44, 0x01, 0x00, 0x3b }; #endif /* _GFX_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/httpinfo/src/olsrd_httpinfo.c000066400000000000000000001444131234304727700214200ustar00rootroot00000000000000 /* * HTTP Info plugin for the olsr.org OLSR daemon * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #include #include #include #include #include #ifdef _WIN32 #include #else /* _WIN32 */ #include #endif /* _WIN32 */ #include "olsr.h" #include "builddata.h" #include "olsr_cfg.h" #include "interfaces.h" #include "olsr_protocol.h" #include "net_olsr.h" #include "link_set.h" #include "ipcalc.h" #include "lq_plugin.h" #include "common/autobuf.h" #ifdef HTTPINFO_PUD #include #include #include #include #endif /* HTTPINFO_PUD */ #include "olsrd_httpinfo.h" #include "admin_interface.h" #include "gfx.h" #ifdef OS #undef OS #endif /* OS */ #ifdef _WIN32 #define close(x) closesocket(x) #define OS "Windows" #endif /* _WIN32 */ #ifdef __linux__ #define OS "GNU/Linux" #endif /* __linux__ */ #if defined __FreeBSD__ || defined __FreeBSD_kernel__ #define OS "FreeBSD" #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ */ #ifndef OS #define OS "Undefined" #endif /* OS */ static char copyright_string[] __attribute__ ((unused)) = "olsr.org HTTPINFO plugin Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) All rights reserved."; #define MAX_CLIENTS 3 #define MAX_HTTPREQ_SIZE (1024 * 10) #define DEFAULT_TCP_PORT 1978 #define HTML_BUFSIZE (1024 * 4000) #define FRAMEWIDTH (resolve_ip_addresses ? 900 : 800) #define FILENREQ_MATCH(req, filename) \ !strcmp(req, filename) || \ (strlen(req) && !strcmp(&req[1], filename)) static const char httpinfo_css[] = "#A {text-decoration: none}\n" "TH{text-align: left}\n" "H1, H3, TD, TH {font-family: Helvetica; font-size: 80%}\n" "h2\n {\nfont-family: Helvetica;\n font-size: 14px;text-align: center;\n" "line-height: 16px;\ntext-decoration: none;\nborder: 1px solid #ccc;\n" "margin: 5px;\nbackground: #ececec;\n}\n" "hr\n{\nborder: none;\npadding: 1px;\nbackground: url(grayline.gif) repeat-x bottom;\n}\n" "#maintable\n{\nmargin: 0px;\npadding: 5px;\nborder-left: 1px solid #ccc;\n" "border-right: 1px solid #ccc;\nborder-bottom: 1px solid #ccc;\n}\n" "#footer\n{\nfont-size: 10px;\nline-height: 14px;\ntext-decoration: none;\ncolor: #666;\n}\n" "#hdr\n{\nfont-size: 14px;\ntext-align: center;\nline-height: 16px;\n" "text-decoration: none;\nborder: 1px solid #ccc;\n" "margin: 5px;\nbackground: #ececec;\n}\n" "#container\n{\nwidth: 1000px;\npadding: 30px;\nborder: 1px solid #ccc;\nbackground: #fff;\n}\n" "#tabnav\n{\nheight: 20px;\nmargin: 0;\npadding-left: 10px;\n" "background: url(grayline.gif) repeat-x bottom;\n}\n" "#tabnav li\n{\nmargin: 0;\npadding: 0;\ndisplay: inline;\nlist-style-type: none;\n}\n" "#tabnav a:link, #tabnav a:visited\n{\nfloat: left;\nbackground: #ececec;\n" "font-size: 12px;\nline-height: 14px;\nfont-weight: bold;\npadding: 2px 10px 2px 10px;\n" "margin-right: 4px;\nborder: 1px solid #ccc;\ntext-decoration: none;\ncolor: #777;\n}\n" "#tabnav a:link.active, #tabnav a:visited.active\n{\nborder-bottom: 1px solid #fff;\n" "background: #ffffff;\ncolor: #000;\n}\n" "#tabnav a:hover\n{\nbackground: #777777;\ncolor: #ffffff;\n}\n" ".input_text\n{\nbackground: #E5E5E5;\nmargin-left: 5px; margin-top: 0px;\n" "text-align: left;\n\nwidth: 100px;\npadding: 0px;\ncolor: #000000;\n" "text-decoration: none;\nfont-family: verdana;\nfont-size: 12px;\n" "border: 1px solid #ccc;\n}\n" ".input_button\n{\nbackground: #B5D1EE;\nmargin-left: 5px;\nmargin-top: 0px;\n" "text-align: center;\nwidth: 120px;\npadding: 0px;\ncolor: #000000;\n" "text-decoration: none;\nfont-family: verdana;\nfont-size: 12px;\n" "border: 1px solid #000;\n}\n"; typedef void (*build_body_callback) (struct autobuf *); struct tab_entry { const char *tab_label; const char *filename; build_body_callback build_body_cb; bool display_tab; }; struct static_bin_file_entry { const char *filename; unsigned char *data; unsigned int data_size; }; struct static_txt_file_entry { const char *filename; const char *data; }; struct dynamic_file_entry { const char *filename; int (*process_data_cb) (char *, uint32_t, char *, uint32_t); }; static int get_http_socket(int); static void build_tabs(struct autobuf *, int); static void parse_http_request(int fd, void *, unsigned int); static int build_http_header(http_header_type, bool, uint32_t, char *, uint32_t); static void build_frame(struct autobuf *, const char *, const char *, int, build_body_callback frame_body_cb); static void build_routes_body(struct autobuf *); static void build_config_body(struct autobuf *); static void build_neigh_body(struct autobuf *); static void build_topo_body(struct autobuf *); static void build_mid_body(struct autobuf *); static void build_nodes_body(struct autobuf *); static void build_all_body(struct autobuf *); #ifdef HTTPINFO_PUD static void build_pud_body(struct autobuf *); #endif /* HTTPINFO_PUD */ static void build_about_body(struct autobuf *); static void build_cfgfile_body(struct autobuf *); static int check_allowed_ip(const struct allowed_net *const /*allowed_nets*/, const union olsr_ip_addr *const /*addr*/); static void build_ip_txt(struct autobuf *, const bool want_link, const char *const ipaddrstr, const int prefix_len); static void build_ipaddr_link(struct autobuf *, const bool want_link, const union olsr_ip_addr *const ipaddr, const int prefix_len); static void section_title(struct autobuf *, const char *title); static void httpinfo_write_data(void *foo); static struct timeval start_time; static struct http_stats stats; static int http_socket; static char *outbuffer[MAX_CLIENTS]; static size_t outbuffer_size[MAX_CLIENTS]; static size_t outbuffer_written[MAX_CLIENTS]; static int outbuffer_socket[MAX_CLIENTS]; static int outbuffer_count; static struct timer_entry *writetimer_entry; static const struct tab_entry tab_entries[] = { {"Configuration", "config", build_config_body, true}, {"Routes", "routes", build_routes_body, true}, {"Links/Topology", "nodes", build_nodes_body, true}, #ifdef HTTPINFO_PUD {"Position", "position", build_pud_body, true}, #endif /* HTTPINFO_PUD */ {"All", "all", build_all_body, true}, #ifdef ADMIN_INTERFACE {"Admin", "admin", build_admin_body, true}, #endif /* ADMIN_INTERFACE */ {"About", "about", build_about_body, true}, {"FOO", "cfgfile", build_cfgfile_body, false}, {NULL, NULL, NULL, false} }; static const struct static_bin_file_entry static_bin_files[] = { {"favicon.ico", favicon_ico, sizeof(favicon_ico)} , {"logo.gif", logo_gif, sizeof(logo_gif)} , {"grayline.gif", grayline_gif, sizeof(grayline_gif)} , {NULL, NULL, 0} }; static const struct static_txt_file_entry static_txt_files[] = { {"httpinfo.css", httpinfo_css}, {NULL, NULL} }; #ifdef ADMIN_INTERFACE static const struct dynamic_file_entry dynamic_files[] = { {"set_values", process_set_values}, {NULL, NULL} }; #endif /* ADMIN_INTERFACE */ static int get_http_socket(int port) { struct sockaddr_in sock_in; uint32_t yes = 1; /* Init ipc socket */ int s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { olsr_printf(1, "(HTTPINFO)socket %s\n", strerror(errno)); return -1; } if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) { olsr_printf(1, "(HTTPINFO)SO_REUSEADDR failed %s\n", strerror(errno)); close(s); return -1; } /* Bind the socket */ /* complete the socket structure */ memset(&sock_in, 0, sizeof(sock_in)); sock_in.sin_family = AF_INET; sock_in.sin_addr.s_addr = httpinfo_listen_ip.v4.s_addr; sock_in.sin_port = htons(port); /* bind the socket to the port number */ if (bind(s, (struct sockaddr *)&sock_in, sizeof(sock_in)) == -1) { olsr_printf(1, "(HTTPINFO) bind failed %s\n", strerror(errno)); close(s); return -1; } /* show that we are willing to listen */ if (listen(s, 1) == -1) { olsr_printf(1, "(HTTPINFO) listen failed %s\n", strerror(errno)); close(s); return -1; } return s; } /** *Do initialization here * *This function is called by the my_init *function in uolsrd_plugin.c */ int olsrd_plugin_init(void) { /* Get start time */ gettimeofday(&start_time, NULL); /* set up HTTP socket */ http_socket = get_http_socket(http_port != 0 ? http_port : DEFAULT_TCP_PORT); if (http_socket < 0) { fprintf(stderr, "(HTTPINFO) could not initialize HTTP socket\n"); exit(1); } /* Register socket */ add_olsr_socket(http_socket, &parse_http_request, NULL, NULL, SP_PR_READ); return 1; } /* Non reentrant - but we are not multithreaded anyway */ static void parse_http_request(int fd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { struct sockaddr_in pin; struct autobuf body_abuf = { 0, 0, NULL }; socklen_t addrlen; char header_buf[MAX_HTTPREQ_SIZE]; char req_type[11]; char filename[251]; char http_version[11]; int client_socket; size_t header_length = 0; size_t c = 0; int r = 1; #ifdef __linux__ struct timeval timeout = { 0, 200 }; #endif /* __linux__ */ if (outbuffer_count >= MAX_CLIENTS) { olsr_printf(1, "(HTTPINFO) maximum number of connection reached\n"); return; } addrlen = sizeof(struct sockaddr_in); client_socket = accept(fd, (struct sockaddr *)&pin, &addrlen); if (client_socket == -1) { olsr_printf(1, "(HTTPINFO) accept: %s\n", strerror(errno)); goto close_connection; } #ifdef __linux__ if (setsockopt(client_socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0) { olsr_printf(1, "(HTTPINFO)SO_RCVTIMEO failed %s\n", strerror(errno)); goto close_connection; } if (setsockopt(client_socket, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)) < 0) { olsr_printf(1, "(HTTPINFO)SO_SNDTIMEO failed %s\n", strerror(errno)); goto close_connection; } #endif /* __linux__ */ if (!check_allowed_ip(allowed_nets, (union olsr_ip_addr *)&pin.sin_addr.s_addr)) { struct ipaddr_str strbuf; olsr_printf(0, "HTTP request from non-allowed host %s!\n", olsr_ip_to_string(&strbuf, (union olsr_ip_addr *)&pin.sin_addr.s_addr)); goto close_connection; } memset(header_buf, 0, sizeof(header_buf)); while ((r = recv(client_socket, &header_buf[c], 1, 0)) > 0 && (c < sizeof(header_buf) - 1)) { c++; if ((c > 3 && !strcmp(&header_buf[c - 4], "\r\n\r\n")) || (c > 1 && !strcmp(&header_buf[c - 2], "\n\n"))) break; } if (r < 0) { olsr_printf(1, "(HTTPINFO) Failed to receive data from client!\n"); stats.err_hits++; goto close_connection; } /* Get the request */ if (sscanf(header_buf, "%10s %250s %10s\n", req_type, filename, http_version) != 3) { /* Try without HTTP version */ if (sscanf(header_buf, "%10s %250s\n", req_type, filename) != 2) { olsr_printf(1, "(HTTPINFO) Error parsing request %s!\n", header_buf); stats.err_hits++; goto close_connection; } } olsr_printf(1, "Request: %s\nfile: %s\nVersion: %s\n\n", req_type, filename, http_version); abuf_init(&body_abuf, 102400); if (!strcmp(req_type, "POST")) { #ifdef ADMIN_INTERFACE int i = 0; while (dynamic_files[i].filename) { printf("POST checking %s\n", dynamic_files[i].filename); if (FILENREQ_MATCH(filename, dynamic_files[i].filename)) { uint32_t param_size; stats.ok_hits++; param_size = recv(client_sockets[curr_clients], header_buf, sizeof(header_buf) - 1, 0); header_buf[param_size] = '\0'; printf("Dynamic read %d bytes\n", param_size); //memcpy(body, dynamic_files[i].data, static_bin_files[i].data_size); body_length += dynamic_files[i].process_data_cb(header_buf, param_size, &body_buf[body_length], sizeof(body_buf) - body_length); header_length = build_http_header(HTTP_OK, true, body_length, header_buf, sizeof(header_buf)); goto send_http_data; } i++; } #endif /* ADMIN_INTERFACE */ /* We only support GET */ abuf_puts(&body_abuf, HTTP_400_MSG); stats.ill_hits++; header_length = build_http_header(HTTP_BAD_REQ, true, body_abuf.len, header_buf, sizeof(header_buf)); } else if (!strcmp(req_type, "GET")) { int i = 0; for (i = 0; static_bin_files[i].filename; i++) { if (FILENREQ_MATCH(filename, static_bin_files[i].filename)) { break; } } if (static_bin_files[i].filename) { stats.ok_hits++; abuf_memcpy(&body_abuf, static_bin_files[i].data, static_bin_files[i].data_size); header_length = build_http_header(HTTP_OK, false, body_abuf.len, header_buf, sizeof(header_buf)); goto send_http_data; } i = 0; while (static_txt_files[i].filename) { if (FILENREQ_MATCH(filename, static_txt_files[i].filename)) { break; } i++; } if (static_txt_files[i].filename) { stats.ok_hits++; abuf_puts(&body_abuf, static_txt_files[i].data); header_length = build_http_header(HTTP_OK, false, body_abuf.len, header_buf, sizeof(header_buf)); goto send_http_data; } i = 0; if (strlen(filename) > 1) { while (tab_entries[i].filename) { if (FILENREQ_MATCH(filename, tab_entries[i].filename)) { break; } i++; } } if (tab_entries[i].filename) { #ifdef NETDIRECT header_length = build_http_header(HTTP_OK, true, body_length, header_buf, sizeof(header_buf)); r = send(client_sockets[curr_clients], header_buf, header_length, 0); if (r < 0) { olsr_printf(1, "(HTTPINFO) Failed sending data to client!\n"); goto close_connection; } netsprintf_error = 0; netsprintf_direct = 1; #endif /* NETDIRECT */ abuf_appendf(&body_abuf, "\n" "\n" "\n" "olsr.org httpinfo plugin\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "
\n" "   olsr.org OLSR daemon\n" "\"olsrd
\n", FRAMEWIDTH); build_tabs(&body_abuf, i); build_frame(&body_abuf, "Current Routes", "routes", FRAMEWIDTH, tab_entries[i].build_body_cb); stats.ok_hits++; abuf_appendf(&body_abuf, "\n" "
\n" "
\n" "(C)2005 Andreas Tønnesen
\n" "http://www.olsr.org\n" "
\n" "
\n" "\n" "\n"); #ifdef NETDIRECT netsprintf_direct = 1; goto close_connection; #else /* NETDIRECT */ header_length = build_http_header(HTTP_OK, true, body_abuf.len, header_buf, sizeof(header_buf)); goto send_http_data; #endif /* NETDIRECT */ } stats.ill_hits++; abuf_puts(&body_abuf, HTTP_404_MSG); header_length = build_http_header(HTTP_BAD_FILE, true, body_abuf.len, header_buf, sizeof(header_buf)); } else { /* We only support GET */ abuf_puts(&body_abuf, HTTP_404_MSG); stats.ill_hits++; header_length = build_http_header(HTTP_BAD_REQ, true, body_abuf.len, header_buf, sizeof(header_buf)); } send_http_data: if (header_length + body_abuf.len > 0) { outbuffer[outbuffer_count] = olsr_malloc(header_length + body_abuf.len, "http output buffer"); outbuffer_size[outbuffer_count] = header_length + body_abuf.len; outbuffer_written[outbuffer_count] = 0; outbuffer_socket[outbuffer_count] = client_socket; memcpy(outbuffer[outbuffer_count], header_buf, header_length); if (body_abuf.len > 0) { memcpy((outbuffer[outbuffer_count]) + header_length, body_abuf.buf, body_abuf.len); } outbuffer_count++; if (outbuffer_count == 1) { writetimer_entry = olsr_start_timer(100, 0, OLSR_TIMER_PERIODIC, &httpinfo_write_data, NULL, 0); } } abuf_free(&body_abuf); /* * client_socket is stored in outbuffer_socket[outbuffer_count] and closed * by the httpinfo_write_data timer callback, so don't close it here */ return; close_connection: abuf_free(&body_abuf); if (client_socket >= 0) { close(client_socket); } } static void httpinfo_write_data(void *foo __attribute__ ((unused))) { fd_set set; int result, i, j, max; struct timeval tv; FD_ZERO(&set); max = 0; for (i=0; i max) { max = outbuffer_socket[i]; } } tv.tv_sec = 0; tv.tv_usec = 0; result = select(max + 1, NULL, &set, NULL, &tv); if (result <= 0) { return; } for (i=0; i 0) { outbuffer_written[i] += result; } if (result <= 0 || outbuffer_written[i] == outbuffer_size[i]) { /* close this socket and cleanup*/ close(outbuffer_socket[i]); free (outbuffer[i]); for (j=i+1; j 0) { size += snprintf(&buf[size], bufsize - size, "Content-length: %i\r\n", msgsize); } /* Cache-control * No caching dynamic pages */ size += snprintf(&buf[size], bufsize - size, "Cache-Control: no-cache\r\n"); if (!is_html) { size += snprintf(&buf[size], bufsize - size, "Accept-Ranges: bytes\r\n"); } /* End header */ size += snprintf(&buf[size], bufsize - size, "\r\n"); olsr_printf(1, "HEADER:\n%s", buf); return size; } static void build_tabs(struct autobuf *abuf, int active) { int tabs = 0; abuf_appendf(abuf, "\n" "\n" "\n"); for (hna = olsr_cnf->hna_entries; hna; hna = hna->next) { struct ipaddr_str netbuf; abuf_appendf(abuf, "\n", olsr_ip_to_string(&netbuf, &hna->net.prefix), hna->net.prefix_len); } } else { abuf_puts(abuf, "\n"); } abuf_puts(abuf, "
\n" "
    \n", FRAMEWIDTH); for (tabs = 0; tab_entries[tabs].tab_label; tabs++) { if (!tab_entries[tabs].display_tab) { continue; } abuf_appendf(abuf, "
  • %s
  • \n", tab_entries[tabs].filename, tabs == active ? " class=\"active\"" : "", tab_entries[tabs].tab_label); } abuf_appendf(abuf, "
\n" "
\n"); } /* * destructor - called at unload */ void olsr_plugin_exit(void) { struct allowed_net *a, *next; if (http_socket >= 0) { CLOSE(http_socket); } for (a = allowed_nets; a != NULL; a = next) { next = a->next; free(a); } } static void section_title(struct autobuf *abuf, const char *title) { abuf_appendf(abuf, "

%s

\n" "\n", title); } static void build_frame(struct autobuf *abuf, const char *title __attribute__ ((unused)), const char *the_link __attribute__ ((unused)), int width __attribute__ ((unused)), build_body_callback frame_body_cb) { abuf_puts(abuf, "
\n"); frame_body_cb(abuf); abuf_puts(abuf, "
\n"); } static void fmt_href(struct autobuf *abuf, const char *const ipaddr) { abuf_appendf(abuf, "", ipaddr, http_port); } static void build_ip_txt(struct autobuf *abuf, const bool print_link, const char *const ipaddrstr, const int prefix_len) { if (print_link) { fmt_href(abuf, ipaddrstr); } abuf_puts(abuf, ipaddrstr); /* print ip address or ip prefix ? */ if (prefix_len != -1 && prefix_len != olsr_cnf->maxplen) { abuf_appendf(abuf, "/%d", prefix_len); } if (print_link) { /* Print the link only if there is no prefix_len */ abuf_puts(abuf, ""); } } static void build_ipaddr_link(struct autobuf *abuf, const bool want_link, const union olsr_ip_addr *const ipaddr, const int prefix_len) { struct ipaddr_str ipaddrstr; const struct hostent *const hp = #ifndef _WIN32 resolve_ip_addresses ? gethostbyaddr((const void *)ipaddr, olsr_cnf->ipsize, olsr_cnf->ip_version) : #endif /* _WIN32 */ NULL; /* Print the link only if there is no prefix_len and ip_version is AF_INET */ const int print_link = want_link && (prefix_len == -1 || prefix_len == olsr_cnf->maxplen) && (olsr_cnf->ip_version == AF_INET); olsr_ip_to_string(&ipaddrstr, ipaddr); abuf_puts(abuf, ""); if (resolve_ip_addresses) { if (hp) { abuf_puts(abuf, ""); } else { abuf_puts(abuf, ""); build_ipaddr_with_link(abuf, &rt->rt_dst.prefix, rt->rt_dst.prefix_len); build_ipaddr_with_link(abuf, &rt->rt_best->rtp_nexthop.gateway, -1); abuf_appendf(abuf, "", rt->rt_best->rtp_metric.hops); abuf_appendf(abuf, "", get_linkcost_text(rt->rt_best->rtp_metric.cost, true, &lqbuffer)); abuf_appendf(abuf, "\n", if_ifwithindex_name(rt->rt_best->rtp_nexthop.iif_index)); } static void build_routes_body(struct autobuf *abuf) { struct rt_entry *rt; const char *colspan = resolve_ip_addresses ? " colspan=\"2\"" : ""; section_title(abuf, "OLSR Routes in Kernel"); abuf_appendf(abuf, "DestinationGateway\n", colspan, colspan); /* Walk the route table */ OLSR_FOR_ALL_RT_ENTRIES(rt) { build_route(abuf, rt); } OLSR_FOR_ALL_RT_ENTRIES_END(rt); abuf_puts(abuf, "
"); build_ip_txt(abuf, print_link, ipaddrstr.buf, prefix_len); abuf_puts(abuf, "("); if (print_link) { fmt_href(abuf, ipaddrstr.buf); } abuf_puts(abuf, hp->h_name); if (print_link) { abuf_puts(abuf, ""); } abuf_puts(abuf, ")"); } } } #define build_ipaddr_with_link(buf, ipaddr, plen) \ build_ipaddr_link((buf), true, (ipaddr), (plen)) #define build_ipaddr_no_link(buf, ipaddr, plen) \ build_ipaddr_link((buf), false, (ipaddr), (plen)) static void build_route(struct autobuf *abuf, const struct rt_entry *rt) { struct lqtextbuffer lqbuffer; abuf_puts(abuf, "
%d%s%s
MetricETXInterface
\n"); } static void build_config_body(struct autobuf *abuf) { const struct olsr_if *ifs; const struct plugin_entry *pentry; const struct plugin_param *pparam; struct ipaddr_str mainaddrbuf; abuf_appendf(abuf, "Version: %s (built on %s on %s)\n
", olsrd_version, build_date, build_host); abuf_appendf(abuf, "OS: %s\n
", OS); { const time_t currtime = time(NULL); abuf_strftime(abuf, "System time: %a, %d %b %Y %H:%M:%S
", localtime(&currtime)); } { struct timeval now, uptime; int hours, mins, days; gettimeofday(&now, NULL); timersub(&now, &start_time, &uptime); days = uptime.tv_sec / 86400; uptime.tv_sec %= 86400; hours = uptime.tv_sec / 3600; uptime.tv_sec %= 3600; mins = uptime.tv_sec / 60; uptime.tv_sec %= 60; abuf_puts(abuf, "Olsrd uptime: "); if (days) { abuf_appendf(abuf, "%d day(s) ", days); } abuf_appendf(abuf, "%02d hours %02d minutes %02d seconds
\n", hours, mins, (int)uptime.tv_sec); } abuf_appendf(abuf, "HTTP stats(ok/dyn/error/illegal): %d/%d/%d/%d
\n", stats.ok_hits, stats.dyn_hits, stats.err_hits, stats.ill_hits); abuf_puts(abuf, "Click here to generate a configuration file for this node.\n"); abuf_puts(abuf, "

Variables

\n"); abuf_puts(abuf, "\n"); abuf_appendf(abuf, "\n", olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->main_addr)); abuf_appendf(abuf, "\n", olsr_cnf->ip_version == AF_INET ? 4 : 6); abuf_appendf(abuf, "\n", olsr_cnf->debug_level); abuf_appendf(abuf, "\n", FIB_METRIC_TXT[olsr_cnf->fib_metric]); abuf_puts(abuf, "\n\n"); abuf_appendf(abuf, "\n", (double)olsr_cnf->pollrate); abuf_appendf(abuf, "\n", olsr_cnf->tc_redundancy); abuf_appendf(abuf, "\n", olsr_cnf->mpr_coverage); abuf_appendf(abuf, "\n", (double)olsr_cnf->lq_nat_thresh); abuf_puts(abuf, "\n\n"); abuf_appendf(abuf, "\n", olsr_cnf->lq_fish ? "Enabled" : "Disabled"); abuf_appendf(abuf, "\n", olsr_cnf->tos); abuf_appendf(abuf, "\n", olsr_cnf->rt_table, olsr_cnf->rt_table); abuf_appendf(abuf, "\n", olsr_cnf->rt_table_default, olsr_cnf->rt_table_default); abuf_appendf(abuf, "\n", olsr_cnf->rt_table_tunnel, olsr_cnf->rt_table_tunnel); abuf_appendf(abuf, "\n", olsr_cnf->willingness, olsr_cnf->willingness_auto ? "(auto)" : ""); if (olsr_cnf->lq_level == 0) { abuf_appendf(abuf, "\n\n" "\n", olsr_cnf->use_hysteresis ? "Enabled" : "Disabled"); if (olsr_cnf->use_hysteresis) { abuf_appendf(abuf, "\n", (double)olsr_cnf->hysteresis_param.scaling); abuf_appendf(abuf, "\n", (double)olsr_cnf->hysteresis_param.thr_low, (double)olsr_cnf->hysteresis_param.thr_high); } } abuf_appendf(abuf, "\n\n" "\n", olsr_cnf->lq_level ? "Enabled" : "Disabled"); if (olsr_cnf->lq_level) { abuf_appendf(abuf, "\n" "\n", olsr_cnf->lq_level, (double)olsr_cnf->lq_aging); } abuf_puts(abuf, "
Main address: %sIP version: %dDebug level: %dFIB Metrics: %s
Pollrate: %0.2fTC redundancy: %dMPR coverage: %dNAT threshold: %f
Fisheye: %sTOS: 0x%04xRtTable: 0x%04x/%dRtTableDefault: 0x%04x/%dRtTableTunnel: 0x%04x/%dWillingness: %d %s
Hysteresis: %sHyst scaling: %0.2fHyst lower/upper: %0.2f/%0.2f
LQ extension: %sLQ level: %dLQ aging: %f
\n"); abuf_puts(abuf, "

Interfaces

\n"); abuf_puts(abuf, "\n"); for (ifs = olsr_cnf->interfaces; ifs != NULL; ifs = ifs->next) { const struct interface *const rifs = ifs->interf; abuf_appendf(abuf, "\n", ifs->name); if (!rifs) { abuf_puts(abuf, "\n"); continue; } if (olsr_cnf->ip_version == AF_INET) { struct ipaddr_str addrbuf, maskbuf, bcastbuf; abuf_appendf(abuf, "\n" "\n" "\n" "\n" "\n", ip4_to_string(&addrbuf, rifs->int_addr.sin_addr), ip4_to_string(&maskbuf, rifs->int_netmask.sin_addr), ip4_to_string(&bcastbuf, rifs->int_broadaddr.sin_addr)); } else { struct ipaddr_str addrbuf, maskbuf; abuf_appendf(abuf, "\n" "\n" "\n" "\n" "\n", ip6_to_string(&addrbuf, &rifs->int6_addr.sin6_addr), ip6_to_string(&maskbuf, &rifs->int6_multaddr.sin6_addr)); } abuf_appendf(abuf, "\n" "\n" "\n" "\n" "\n", rifs->int_mtu, rifs->is_wireless ? "Yes" : "No"); } abuf_puts(abuf, "
%s
Status: DOWN
IP: %sMASK: %sBCAST: %s
IP: %sMCAST: %s
MTU: %dWLAN: %sSTATUS: UP
\n"); abuf_appendf(abuf, "Olsrd is configured to %s if no interfaces are available
\n", olsr_cnf->allow_no_interfaces ? "run even" : "halt"); abuf_puts(abuf, "

Plugins

\n"); abuf_puts(abuf, "\n"); for (pentry = olsr_cnf->plugins; pentry; pentry = pentry->next) { abuf_appendf(abuf, "\n" "\n"); } abuf_puts(abuf, "
NameParameters
%s
\n"); section_title(abuf, "Announced HNA entries"); if (olsr_cnf->hna_entries) { struct ip_prefix_list *hna; abuf_puts(abuf, "
Network
%s/%d
\n"); } static void build_neigh_body(struct autobuf *abuf) { struct neighbor_entry *neigh; struct link_entry *the_link = NULL; const char *colspan = resolve_ip_addresses ? " colspan=\"2\"" : ""; section_title(abuf, "Links"); abuf_appendf(abuf, "Local IPRemote IPHysteresis", colspan, colspan); if (olsr_cnf->lq_level > 0) { abuf_puts(abuf, "LinkCost"); } abuf_puts(abuf, "\n"); /* Link set */ OLSR_FOR_ALL_LINK_ENTRIES(the_link) { abuf_puts(abuf, ""); build_ipaddr_with_link(abuf, &the_link->local_iface_addr, -1); build_ipaddr_with_link(abuf, &the_link->neighbor_iface_addr, -1); abuf_appendf(abuf, "%0.2f", (double)the_link->L_link_quality); if (olsr_cnf->lq_level > 0) { struct lqtextbuffer lqbuffer1, lqbuffer2; abuf_appendf(abuf, "(%s) %s", get_link_entry_text(the_link, '/', &lqbuffer1), get_linkcost_text(the_link->linkcost, false, &lqbuffer2)); } abuf_puts(abuf, "\n"); } OLSR_FOR_ALL_LINK_ENTRIES_END(the_link); abuf_puts(abuf, "\n"); section_title(abuf, "Neighbors"); abuf_appendf(abuf, "IP AddressSYMMPRMPRSWillingness2 Hop Neighbors\n", colspan); /* Neighbors */ OLSR_FOR_ALL_NBR_ENTRIES(neigh) { struct neighbor_2_list_entry *list_2; int thop_cnt; abuf_puts(abuf, ""); build_ipaddr_with_link(abuf, &neigh->neighbor_main_addr, -1); abuf_appendf(abuf, "%s" "%s" "%s" "%d", (neigh->status == SYM) ? "YES" : "NO", neigh->is_mpr ? "YES" : "NO", olsr_lookup_mprs_set(&neigh->neighbor_main_addr) ? "YES" : "NO", neigh->willingness); abuf_puts(abuf, " (%d)\n", thop_cnt); } OLSR_FOR_ALL_NBR_ENTRIES_END(neigh); abuf_puts(abuf, "\n"); } static void build_topo_body(struct autobuf *abuf) { struct tc_entry *tc; const char *colspan = resolve_ip_addresses ? " colspan=\"2\"" : ""; section_title(abuf, "Topology Entries"); abuf_appendf(abuf, "Destination IPLast Hop IP", colspan, colspan); if (olsr_cnf->lq_level > 0) { abuf_puts(abuf, "Linkcost"); } abuf_puts(abuf, "\n"); OLSR_FOR_ALL_TC_ENTRIES(tc) { struct tc_edge_entry *tc_edge; OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) { if (tc_edge->edge_inv) { abuf_puts(abuf, ""); build_ipaddr_with_link(abuf, &tc_edge->T_dest_addr, -1); build_ipaddr_with_link(abuf, &tc->addr, -1); if (olsr_cnf->lq_level > 0) { struct lqtextbuffer lqbuffer1, lqbuffer2; abuf_appendf(abuf, "(%s) %s\n", get_tc_edge_entry_text(tc_edge, '/', &lqbuffer1), get_linkcost_text(tc_edge->cost, false, &lqbuffer2)); } abuf_puts(abuf, "\n"); } } OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge); } OLSR_FOR_ALL_TC_ENTRIES_END(tc); abuf_puts(abuf, "\n"); } static void build_mid_body(struct autobuf *abuf) { int idx; const char *colspan = resolve_ip_addresses ? " colspan=\"2\"" : ""; section_title(abuf, "MID Entries"); abuf_appendf(abuf, "Main AddressAliases\n", colspan); /* MID */ for (idx = 0; idx < HASHSIZE; idx++) { struct mid_entry *entry; for (entry = mid_set[idx].next; entry != &mid_set[idx]; entry = entry->next) { int mid_cnt; struct mid_address *alias; abuf_puts(abuf, ""); build_ipaddr_with_link(abuf, &entry->main_addr, -1); abuf_puts(abuf, " (%d)\n", mid_cnt); } } abuf_puts(abuf, "\n"); } static void build_nodes_body(struct autobuf *abuf) { build_neigh_body(abuf); build_topo_body(abuf); build_mid_body(abuf); } static void build_all_body(struct autobuf *abuf) { build_config_body(abuf); build_routes_body(abuf); build_neigh_body(abuf); build_topo_body(abuf); build_mid_body(abuf); #ifdef HTTPINFO_PUD build_pud_body(abuf); #endif /* HTTPINFO_PUD */ } #ifdef HTTPINFO_PUD /** * Determine if a nmeaINFO structure has a certain field. * We need this function locally because nmealib might not be loaded. * * @param present the presence field * @param fieldName use a name from nmeaINFO_FIELD * @return a boolean, true when the structure has the requested field */ static inline bool nmea_INFO_has_field_local(uint32_t present, nmeaINFO_FIELD fieldName) { return ((present & fieldName) != 0); } static const char * NA_STRING = "N.A."; static const char * SAT_INUSE_COLOR = "lime"; static const char * SAT_NOTINUSE_COLOR = "red"; static void build_pud_body(struct autobuf *abuf) { TransmitGpsInformation * txGpsInfo = olsr_cnf->pud_position; char * nodeId; char nodeIdString[256]; bool datePresent; bool timePresent; abuf_puts(abuf, "

Position

"); if (!txGpsInfo) { abuf_puts(abuf, "

" PUD_PLUGIN_ABBR " plugin not loaded

\n"); return; } nodeId = (char *) txGpsInfo->nodeId; if (!nodeId || !strlen(nodeId)) { inet_ntop(olsr_cnf->ip_version, &olsr_cnf->main_addr, &nodeIdString[0], sizeof(nodeIdString)); nodeId = nodeIdString; } /* start of table */ abuf_puts(abuf, "

\n" "\n" ); /* nodeId */ abuf_appendf(abuf, "\n", nodeId ); /* utc */ abuf_puts(abuf, "\n"); /* smask */ abuf_puts(abuf, "\n"); /* sig */ abuf_puts(abuf, "\n"); /* fix */ abuf_puts(abuf, "\n"); /* PDOP */ abuf_puts(abuf, "\n"); /* HDOP */ abuf_puts(abuf, "\n"); /* VDOP */ abuf_puts(abuf, "\n"); /* lat */ abuf_puts(abuf, "\n"); /* lon */ abuf_puts(abuf, "\n"); /* elv */ abuf_puts(abuf, "\n"); /* speed */ abuf_puts(abuf, "\n"); /* track */ abuf_puts(abuf, "\n"); /* mtrack */ abuf_puts(abuf, "\n"); /* magvar */ abuf_puts(abuf, "\n"); /* end of table */ abuf_puts(abuf, "
Parameter  Unit  Value
Name%s
Date / TimeUTC"); datePresent = nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, UTCDATE); timePresent = nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, UTCTIME); if (datePresent || timePresent) { if (datePresent) { abuf_appendf(abuf, "%04d%02d%02d", txGpsInfo->txPosition.nmeaInfo.utc.year + 1900, txGpsInfo->txPosition.nmeaInfo.utc.mon, txGpsInfo->txPosition.nmeaInfo.utc.day); } if (datePresent && timePresent) { abuf_puts(abuf, " "); } if (timePresent) { abuf_appendf(abuf, "%02d:%02d:%02d.%02d", txGpsInfo->txPosition.nmeaInfo.utc.hour, txGpsInfo->txPosition.nmeaInfo.utc.min, txGpsInfo->txPosition.nmeaInfo.utc.sec, txGpsInfo->txPosition.nmeaInfo.utc.hsec); } } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "
Input Sentences"); if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, SMASK) && (txGpsInfo->txPosition.nmeaInfo.smask != GPNON)) { const int id[] = { GPGGA, GPGSA, GPGSV, GPRMC, GPVTG, GPNON }; const char * ids[] = { "GPGGA", "GPGSA", "GPGSV", "GPRMC", "GPVTG" }; bool printed = false; int i = 0; while (id[i] != GPNON) { if (txGpsInfo->txPosition.nmeaInfo.smask & id[i]) { if (printed) abuf_puts(abuf, " "); abuf_puts(abuf, ids[i]); printed = true; } i++; } } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "
Signal Strength"); if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, SIG)) { const char * s; switch (txGpsInfo->txPosition.nmeaInfo.sig) { case NMEA_SIG_BAD: s = "Invalid"; break; case NMEA_SIG_LOW: s = "Fix"; break; case NMEA_SIG_MID: s = "Differential"; break; case NMEA_SIG_HIGH: s = "Sensitive"; break; case NMEA_SIG_RTKIN: s = "Real Time Kinematic"; break; case NMEA_SIG_FLRTK: s = "Float RTK"; break; case NMEA_SIG_ESTIM: s = "Estimated (Dead Reckoning)"; break; case NMEA_SIG_MAN: s = "Manual Input Mode"; break; case NMEA_SIG_SIM: s = "Simulation Mode"; break; default: s = "Unknown"; break; } abuf_appendf(abuf, "%s (%d)", s, txGpsInfo->txPosition.nmeaInfo.sig); } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "
Fix"); if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, FIX)) { const char * s; switch (txGpsInfo->txPosition.nmeaInfo.fix) { case NMEA_FIX_BAD: s = "BAD"; break; case NMEA_FIX_2D: s = "2D"; break; case NMEA_FIX_3D: s = "3D"; break; default: s = "Unknown"; break; } abuf_appendf(abuf, "%s (%d)", s, txGpsInfo->txPosition.nmeaInfo.fix); } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "
PDOP"); if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, PDOP)) { abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.PDOP); } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "
HDOP"); if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, HDOP)) { abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.HDOP); } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "
VDOP"); if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, VDOP)) { abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.VDOP); } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "
Latitudedegrees"); if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, LAT)) { abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.lat); } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "
Longitudedegrees"); if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, LON)) { abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.lon); } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "
Elevationm"); if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, ELV)) { abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.elv); } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "
Speedkph"); if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, SPEED)) { abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.speed); } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "
Trackdegrees"); if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, TRACK)) { abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.track); } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "
Magnetic Trackdegrees"); if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, MTRACK)) { abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.mtrack); } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "
Magnetic Variationdegrees"); if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, MAGVAR)) { abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.magvar); } else { abuf_puts(abuf, NA_STRING); } abuf_puts(abuf, "

\n"); /* sats */ if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, SATINVIEW)) { int cnt = 0; abuf_puts(abuf, "

\n"); abuf_puts(abuf, "Satellite Infomation:\n"); abuf_puts(abuf, "\n"); abuf_puts(abuf, "\n"); abuf_puts(abuf, "\n"); if (txGpsInfo->txPosition.nmeaInfo.satinfo.inview) { int satIndex; for (satIndex = 0; satIndex < NMEA_MAXSAT; satIndex++) { nmeaSATELLITE * sat = &txGpsInfo->txPosition.nmeaInfo.satinfo.sat[satIndex]; if (sat->id) { bool inuse = false; const char * inuseStr; if (!nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, SATINUSE)) { inuseStr = NA_STRING; } else { int inuseIndex; for (inuseIndex = 0; inuseIndex < NMEA_MAXSAT; inuseIndex++) { if (txGpsInfo->txPosition.nmeaInfo.satinfo.in_use[inuseIndex] == sat->id) { inuse = true; break; } } if (inuse) { inuseStr = "yes"; } else { inuseStr = "no"; } } abuf_appendf(abuf, "\n", sat->id, inuse ? SAT_INUSE_COLOR : SAT_NOTINUSE_COLOR, inuseStr, sat->elv, sat->azimuth, sat->sig); cnt++; } } } if (!cnt) { abuf_puts(abuf, "\n"); } abuf_puts(abuf, "
IDIn UseElevation (degrees)Azimuth (degrees)Signal (dB)
%02d%s%02d%03d%02d
none
\n"); abuf_puts(abuf, "

\n"); } /* add Google Maps and OpenStreetMap links when we have both lat and lon */ if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, LAT) && nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, LON)) { const char * c = nodeId; abuf_appendf(abuf, "

\n" "txPosition.nmeaInfo.lat, txGpsInfo->txPosition.nmeaInfo.lon ); while (*c != '\0') { if (*c == ' ' || *c == '\t') { abuf_puts(abuf, "+"); } else { abuf_appendf(abuf, "%c", *c); } c++; } abuf_puts(abuf, "%29&iwloc=A\">Show on Google Maps

\n"); abuf_appendf(abuf, "

\n" "Show on OpenStreetMap

\n", txGpsInfo->txPosition.nmeaInfo.lat, txGpsInfo->txPosition.nmeaInfo.lon ); } } #endif /* HTTPINFO_PUD */ static void build_about_body(struct autobuf *abuf) { abuf_appendf(abuf, "" PLUGIN_NAME " version " PLUGIN_VERSION "
\n" "by Andreas Tønnesen (C)2005.
\n" "Compiled " #ifdef ADMIN_INTERFACE "with experimental admin interface " #endif /* ADMIN_INTERFACE */ "%s at %s
\n" "This plugin implements a HTTP server that supplies\n" "the client with various dynamic web pages representing\n" "the current olsrd status.
The different pages include:\n" "
    \n
  • Configuration - This page displays information\n" "about the current olsrd configuration. This includes various\n" "olsr settings such as IP version, MID/TC redundancy, hysteresis\n" "etc. Information about the current status of the interfaces on\n" "which olsrd is configured to run is also displayed. Loaded olsrd\n" "plugins are shown with their plugin parameters. Finally all local\n" "HNA entries are shown. These are the networks that the local host\n" "will anounce itself as a gateway to.
  • \n" "
  • Routes - This page displays all routes currently set in\n" "the kernel by olsrd. The type of route is also displayed(host\n" "or HNA).
  • \n" "
  • Links/Topology - This page displays all information about\n" "links, neighbors, topology, MID and HNA entries.
  • \n" "
  • All - Here all the previous pages are displayed as one.\n" "This is to make all information available as easy as possible(for example\n" "for a script) and using as few resources as possible.
  • \n" #ifdef ADMIN_INTERFACE "
  • Admin - This page is highly experimental(and unsecure)!\n" "As of now it is not working at all but it provides a impression of\n" "the future possibilities of httpinfo. This is to be a interface to\n" "changing olsrd settings in realtime. These settings include various\n" "\"basic\" settings and local HNA settings.
  • \n" #endif /* ADMIN_INTERFACE */ "
  • About - this help page.
  • \n
" "
\n" "Send questions or comments to\n" "olsr-users@olsr.org or\n" "andreto-at-olsr.org
\n" "Official olsrd homepage: http://www.olsr.org
\n", build_date, build_host); } static void build_cfgfile_body(struct autobuf *abuf) { abuf_puts(abuf, "\n\n" "This is a automatically generated configuration\n" "file based on the current olsrd configuration of this node.
\n" "
\n" "
\n");
  olsrd_write_cnf_autobuf(abuf, olsr_cnf);

  abuf_puts(abuf, "
\n
\n"); } static int check_allowed_ip(const struct allowed_net *const my_allowed_nets, const union olsr_ip_addr *const addr) { const struct allowed_net *alln; for (alln = my_allowed_nets; alln != NULL; alln = alln->next) { if (ip_in_net(addr, &alln->prefix)) { return 1; } } return 0; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/httpinfo/src/olsrd_httpinfo.h000066400000000000000000000057241234304727700214260ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #ifndef _OLSRD_HTTP_INFO #define _OLSRD_HTTP_INFO #include "olsrd_plugin.h" #include "plugin_util.h" #define HTTP_VERSION "HTTP/1.1" /**Response types */ #define HTTP_200 HTTP_VERSION " 200 OK\r\n" #define HTTP_400 HTTP_VERSION " 400 Bad Request\r\n" #define HTTP_404 HTTP_VERSION " 404 Not Found\r\n" #define HTTP_400_MSG "

400 - ERROR


" PLUGIN_NAME " version " PLUGIN_VERSION "" #define HTTP_404_MSG "

404 - ERROR, no such file


This server does not support file requests!

" PLUGIN_NAME " version " PLUGIN_VERSION "" typedef enum { HTTP_BAD_REQ, HTTP_BAD_FILE, HTTP_OK } http_header_type; struct http_stats { uint32_t ok_hits; uint32_t dyn_hits; uint32_t err_hits; uint32_t ill_hits; }; extern struct olsrd_config *olsr_cfg; extern union olsr_ip_addr httpinfo_listen_ip; /* Destructor function */ void olsr_plugin_exit(void); void olsr_plugin_exit(void); #endif /* _OLSRD_HTTP_INFO */ /* * Local Variables: * mode: c * style: linux * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/httpinfo/src/olsrd_plugin.c000066400000000000000000000107101234304727700210530ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #include "olsr.h" #include "olsrd_plugin.h" #include "olsr_cfg.h" #include #include #include #include #ifndef _WIN32 #include #endif /* _WIN32 */ #include "olsrd_httpinfo.h" int http_port = 0; int resolve_ip_addresses = 0; struct allowed_net *allowed_nets = NULL; union olsr_ip_addr httpinfo_listen_ip; static void my_init(void) __attribute__ ((constructor)); static void my_fini(void) __attribute__ ((destructor)); static int add_plugin_access(const char *value, void *data, set_plugin_parameter_addon); /* * Defines the version of the plugin interface that is used * THIS IS NOT THE VERSION OF YOUR PLUGIN! * Do not alter unless you know what you are doing! */ int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } /** *Constructor */ static void my_init(void) { /* Print plugin info to stdout */ printf("%s\n", MOD_DESC); httpinfo_listen_ip.v4.s_addr = htonl(INADDR_ANY); } /** *Destructor */ static void my_fini(void) { /* Calls the destruction function * olsr_plugin_exit() * This function should be present in your * sourcefile and all data destruction * should happen there - NOT HERE! */ olsr_plugin_exit(); } static const struct olsrd_plugin_parameters plugin_parameters[] = { {.name = "port",.set_plugin_parameter = &set_plugin_port,.data = &http_port}, {.name = "host",.set_plugin_parameter = &add_plugin_access,.data = &allowed_nets}, {.name = "net",.set_plugin_parameter = &add_plugin_access,.data = &allowed_nets}, {.name = "resolve",.set_plugin_parameter = &set_plugin_boolean,.data = &resolve_ip_addresses}, }; void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = sizeof(plugin_parameters) / sizeof(*plugin_parameters); } static int add_plugin_access(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused))) { struct olsr_ip_prefix prefix; struct allowed_net **my_allowed_nets = data; struct allowed_net *an; if (olsr_string_to_prefix(olsr_cnf->ip_version, &prefix, value)) { fprintf(stderr, "(HTTPINFO) unknown access restriction parameter: %s!\n", value); exit(0); } an = olsr_malloc(sizeof(*an), __func__); if (an == NULL) { fprintf(stderr, "(HTTPINFO) register param net out of memory!\n"); exit(0); } an->prefix = prefix; an->next = *my_allowed_nets; *my_allowed_nets = an; return 0; } /* * Local Variables: * mode: c * style: linux * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/httpinfo/src/olsrd_plugin.h000066400000000000000000000065401234304727700210660ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #ifndef _OLSRD_PLUGIN_DEFS #define _OLSRD_PLUGIN_DEFS #include #include #include #include #include #include #include #include #include "olsr_types.h" #include "../../../src/olsrd_plugin.h" #include "neighbor_table.h" #include "two_hop_neighbor_table.h" #include "tc_set.h" #include "hna_set.h" #include "mid_set.h" #include "mpr_selector_set.h" #include "routing_table.h" #define PLUGIN_NAME "Httpinfo olsrd plugin" #define PLUGIN_VERSION "0.1" #define PLUGIN_AUTHOR "Andreas Tonnesen" #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR #define PLUGIN_INTERFACE_VERSION 5 extern int http_port; extern int resolve_ip_addresses; /* Allowed hosts stuff */ struct allowed_net { struct olsr_ip_prefix prefix; struct allowed_net *next; }; extern struct allowed_net *allowed_nets; /**************************************************************************** * Functions that the plugin MUST provide * ****************************************************************************/ /* Initialization function */ int olsrd_plugin_init(void); void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size); int olsrd_plugin_interface_version(void); #endif /* _OLSRD_PLUGIN_DEFS */ /* * Local Variables: * mode: c * style: linux * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/httpinfo/version-script.txt000066400000000000000000000002051234304727700211450ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/jsoninfo/000077500000000000000000000000001234304727700154125ustar00rootroot00000000000000olsrd-0.6.6.2/lib/jsoninfo/Makefile000066400000000000000000000044321234304727700170550ustar00rootroot00000000000000# The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_jsoninfo PLUGIN_VER = 0.0 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) olsrd-0.6.6.2/lib/jsoninfo/README_JSONINFO000066400000000000000000000071431234304727700176040ustar00rootroot00000000000000 The jsoninfo plugin aims to deliver all of the information about the runtime status and configuration of olsrd. You can request specific chunks of information, or overviews of runtime or startup configuration, or all of the information in one report. Additionally, the jsoninfo plugin will dump the current olsrd config in the olsrd.conf format. The jsoninfo plugin provides all of the information that both the txtinfo and httpinfo plugins provide, as well as quite a bit more. There is a Java library called OlsrInfo that provides Java classes for parsing the data from jsoninfo (and txtinfo also). It is based on the Jackson JSON processing library OlsrInfo: https://github.com/guardianproject/OlsrInfo Jackson JSON: http://jackson.codehaus.org/ PLUGIN USAGE ============ There are a number of commands for getting information from this plugin. They are designed to be tacked onto a URL, but can also be sent directly via a network socket. The commands are similar to the txtinfo plugin, but not exactly the same. If there is no command or no recognized command, then it sends the /status output, which is the combination of /neighbors, /links, /routes, /hna, /mid, /topology, /gateways, and /interfaces. grouped information: * /all - all of the data in JSON format * /runtime - all of the data that reflects the runtime status of olsrd and the mesh * /startup - all of the data about the startup configuration runtime information: * /neighbors (including 2-hop) * /links * /routes * /hna * /mid * /topology * /gateways * /interfaces * /status - data that changes during runtime (all above commands combined) start-up information: * /config - the current configuration, i.e. what was loaded from the olsrd.conf * /plugins - currently loaded plugins and their config parameters start-up information not in JSON format: * /olsrd.conf - the current config, formatted for writing directly to /etc/olsrd.conf PLUGIN CONFIGURATION ==================== The plugin accepts two parameters: "port" and "accept". There are no futher parameters. Here's an example configuration for UNIX systems (for Windows, change the plugin to end in .dll): LoadPlugin "olsrd_jsoninfo.so.0.0" { # the default port is 9090 but you can change it like this: #PlParam "port" "8080" # You can set a "accept" single address to allow to connect to # jsoninfo. If no address is specified, then localhost (127.0.0.1) # is allowed by default. jsoninfo will only use the first "accept" # parameter specified and will ignore the rest. # to allow a specific host: #PlParam "accept" "172.29.44.23" # if you set it to 0.0.0.0, it will accept all connections #PlParam "accept" "0.0.0.0" # The "httpheaders" parameter prepends HTTP headers to the reply. # If not set it will default to "no" and have the same behaviour as before. # Among with a minimal set of headers also Cross-origin resource sharing # headers (CORS) are included in reply allowing the json retrieval by # javascript applications not served by olsrd itself. # You can enable it uncommenting the following line: #PlParam "httpheaders" "yes" # specify a UUID for this node to track it for debugging #PlParam "UUIDFile" "/etc/olsrd/olsrd.uuid" } Example Usage ============= You can use http URLs with various web tools to access the information: curl http://localhost:9090/all You can combine the various commands to generate a custom report: curl http://localhost:9090/interfaces/routes/links If you want a copy of the current configuration, you can download it using this URL: wget http://localhost:9090/olsrd.conf olsrd-0.6.6.2/lib/jsoninfo/src/000077500000000000000000000000001234304727700162015ustar00rootroot00000000000000olsrd-0.6.6.2/lib/jsoninfo/src/olsrd_jsoninfo.c000066400000000000000000001431031234304727700213770ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * includes code by Bruno Randolf * includes code by Andreas Lopatic * includes code by Sven-Ola Tuecke * includes code by Lorenz Schori * includes bugs by Markus Kittenberger * includes bugs by Hans-Christoph Steiner * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #include #include #ifndef _WIN32 #include #endif /* _WIN32 */ #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __linux__ #include #endif /* __linux__ */ #include "ipcalc.h" #include "olsr.h" #include "builddata.h" #include "olsr_types.h" #include "neighbor_table.h" #include "two_hop_neighbor_table.h" #include "mpr_selector_set.h" #include "tc_set.h" #include "hna_set.h" #include "mid_set.h" #include "link_set.h" #include "net_olsr.h" #include "lq_plugin.h" #include "common/autobuf.h" #include "gateway.h" #include "olsrd_jsoninfo.h" #include "olsrd_plugin.h" #ifdef _WIN32 #define close(x) closesocket(x) #endif /* _WIN32 */ static int ipc_socket; /* Response types */ #define HTTP_200 "HTTP/1.1 200 OK" /* IPC initialization function */ static int plugin_ipc_init(void); static int read_uuid_from_file(const char *file); static void abuf_json_open_object(struct autobuf *abuf, const char* header); static void abuf_json_close_object(struct autobuf *abuf); static void abuf_json_open_array(struct autobuf *abuf, const char* header); static void abuf_json_close_array(struct autobuf *abuf); static void abuf_json_open_array_entry(struct autobuf *abuf); static void abuf_json_close_array_entry(struct autobuf *abuf); static void abuf_json_boolean(struct autobuf *abuf, const char* key, int value); static void abuf_json_string(struct autobuf *abuf, const char* key, const char* value); static void abuf_json_int(struct autobuf *abuf, const char* key, long value); static void abuf_json_float(struct autobuf *abuf, const char* key, float value); static void send_info(unsigned int /*send_what*/, int /*socket*/); static void ipc_action(int, void *, unsigned int); static void ipc_print_neighbors(struct autobuf *); static void ipc_print_links(struct autobuf *); static void ipc_print_routes(struct autobuf *); static void ipc_print_topology(struct autobuf *); static void ipc_print_hna(struct autobuf *); static void ipc_print_mid(struct autobuf *); static void ipc_print_gateways(struct autobuf *); static void ipc_print_config(struct autobuf *); static void ipc_print_interfaces(struct autobuf *); static void ipc_print_plugins(struct autobuf *); static void ipc_print_olsrd_conf(struct autobuf *abuf); static size_t build_http_header(const char *status, const char *mime, uint32_t msgsize, char *buf, uint32_t bufsize); /* * this is the size of the buffer used for build_http_header * the amount of data written into the buffer will be less than * 400 bytes approximatively. * The size may vary because the Content-Length header contains * the length of the json data */ #define MAX_HTTPHEADER_SIZE 512 #define TXT_IPC_BUFSIZE 256 /* these provide all of the runtime status info */ #define SIW_NEIGHBORS 0x0001 #define SIW_LINKS 0x0002 #define SIW_ROUTES 0x0004 #define SIW_HNA 0x0008 #define SIW_MID 0x0010 #define SIW_TOPOLOGY 0x0020 #define SIW_GATEWAYS 0x0040 #define SIW_INTERFACES 0x0080 #define SIW_RUNTIME_ALL 0x00FF /* these only change at olsrd startup */ #define SIW_CONFIG 0x0100 #define SIW_PLUGINS 0x0200 #define SIW_STARTUP_ALL 0x0F00 /* this is everything in JSON format */ #define SIW_ALL 0x0FFF /* this data is not JSON format but olsrd.conf format */ #define SIW_OLSRD_CONF 0x1000 #define MAX_CLIENTS 3 static char *outbuffer[MAX_CLIENTS]; static size_t outbuffer_size[MAX_CLIENTS]; static size_t outbuffer_written[MAX_CLIENTS]; static int outbuffer_socket[MAX_CLIENTS]; static int outbuffer_count; char uuid[UUIDLEN + 1]; char uuidfile[FILENAME_MAX]; static struct timeval start_time; static struct timer_entry *writetimer_entry; /* JSON support functions */ /* JSON does not allow commas dangling at the end of arrays, so we need to * count which entry number we're at in order to make sure we don't tack a * dangling comma on at the end */ static int entrynumber[5] = {0,0,0,0,0}; static int currentjsondepth = 0; static void abuf_json_open_object(struct autobuf *abuf, const char* header) { abuf_appendf(abuf, "\"%s\": {", header); entrynumber[currentjsondepth]++; currentjsondepth++; entrynumber[currentjsondepth] = 0; } static void abuf_json_close_object(struct autobuf *abuf) { abuf_appendf(abuf, "\t}\n"); currentjsondepth--; } static void abuf_json_open_array(struct autobuf *abuf, const char* header) { if (entrynumber[currentjsondepth]) abuf_appendf(abuf, ",\n\t"); abuf_appendf(abuf, "\"%s\": [\n", header); entrynumber[currentjsondepth]++; currentjsondepth++; entrynumber[currentjsondepth] = 0; } static void abuf_json_close_array(struct autobuf *abuf) { abuf_appendf(abuf, "]\n"); entrynumber[currentjsondepth] = 0; currentjsondepth--; } static void abuf_json_open_array_entry(struct autobuf *abuf) { if (entrynumber[currentjsondepth]) abuf_appendf(abuf, ",\n{"); else abuf_appendf(abuf, "{"); entrynumber[currentjsondepth]++; currentjsondepth++; entrynumber[currentjsondepth] = 0; } static void abuf_json_close_array_entry(struct autobuf *abuf) { abuf_appendf(abuf, "}"); entrynumber[currentjsondepth] = 0; currentjsondepth--; } static void abuf_json_insert_comma(struct autobuf *abuf) { if (entrynumber[currentjsondepth]) abuf_appendf(abuf, ",\n"); else abuf_appendf(abuf, "\n"); entrynumber[currentjsondepth]++; } static void abuf_json_boolean(struct autobuf *abuf, const char* key, int value) { abuf_json_insert_comma(abuf); abuf_appendf(abuf, "\t\"%s\": %s", key, value ? "true" : "false"); } static void abuf_json_string(struct autobuf *abuf, const char* key, const char* value) { abuf_json_insert_comma(abuf); abuf_appendf(abuf, "\t\"%s\": \"%s\"", key, value); } static void abuf_json_int(struct autobuf *abuf, const char* key, long value) { abuf_json_insert_comma(abuf); abuf_appendf(abuf, "\t\"%s\": %li", key, value); } static void abuf_json_float(struct autobuf *abuf, const char* key, float value) { abuf_json_insert_comma(abuf); abuf_appendf(abuf, "\t\"%s\": %.03f", key, (double)value); } /* Linux specific functions for getting system info */ #ifdef __linux__ static int get_string_from_file(const char* filename, char* buf, int len) { int bytes = -1; int fd = open(filename, O_RDONLY); if (fd > -1) { bytes = read(fd, buf, len); if (bytes < len) buf[bytes-1] = '\0'; // remove trailing \n else buf[len-1] = '\0'; close(fd); } return bytes; } static int abuf_json_sysdata(struct autobuf *abuf, const char* key, const char* syspath) { int ret = -1; char buf[256]; *buf = 0; ret = get_string_from_file(syspath, buf, 256); if (*buf != 0) abuf_json_string(abuf, key, buf); return ret; } static void abuf_json_sys_class_net(struct autobuf *abuf, const char* key, const char* ifname, const char* datapoint) { char filename[256]; snprintf(filename, 255, "/sys/class/net/%s/%s", ifname, datapoint); abuf_json_sysdata(abuf, key, filename); } #endif /* __linux__ */ /** *Do initialization here * *This function is called by the my_init *function in uolsrd_plugin.c */ int olsrd_plugin_init(void) { /* Initial IPC value */ ipc_socket = -1; /* Get start time */ gettimeofday(&start_time, NULL); if (!strlen(uuidfile)) strscpy(uuidfile, "uuid.txt", sizeof(uuidfile)); read_uuid_from_file(uuidfile); plugin_ipc_init(); return 1; } /** * destructor - called at unload */ void olsr_plugin_exit(void) { if (ipc_socket != -1) close(ipc_socket); } static int plugin_ipc_init(void) { union olsr_sockaddr sst; uint32_t yes = 1; socklen_t addrlen; /* Init ipc socket */ if ((ipc_socket = socket(olsr_cnf->ip_version, SOCK_STREAM, 0)) == -1) { #ifndef NODEBUG olsr_printf(1, "(JSONINFO) socket()=%s\n", strerror(errno)); #endif /* NODEBUG */ return 0; } else { if (setsockopt(ipc_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) { #ifndef NODEBUG olsr_printf(1, "(JSONINFO) setsockopt()=%s\n", strerror(errno)); #endif /* NODEBUG */ return 0; } #if (defined __FreeBSD__ || defined __FreeBSD_kernel__) && defined SO_NOSIGPIPE if (setsockopt(ipc_socket, SOL_SOCKET, SO_NOSIGPIPE, (char *)&yes, sizeof(yes)) < 0) { perror("SO_REUSEADDR failed"); return 0; } #endif /* (defined __FreeBSD__ || defined __FreeBSD_kernel__) && defined SO_NOSIGPIPE */ /* Bind the socket */ /* complete the socket structure */ memset(&sst, 0, sizeof(sst)); if (olsr_cnf->ip_version == AF_INET) { sst.in4.sin_family = AF_INET; addrlen = sizeof(struct sockaddr_in); #ifdef SIN6_LEN sst.in4.sin_len = addrlen; #endif /* SIN6_LEN */ sst.in4.sin_addr.s_addr = jsoninfo_listen_ip.v4.s_addr; sst.in4.sin_port = htons(ipc_port); } else { sst.in6.sin6_family = AF_INET6; addrlen = sizeof(struct sockaddr_in6); #ifdef SIN6_LEN sst.in6.sin6_len = addrlen; #endif /* SIN6_LEN */ sst.in6.sin6_addr = jsoninfo_listen_ip.v6; sst.in6.sin6_port = htons(ipc_port); } /* bind the socket to the port number */ if (bind(ipc_socket, &sst.in, addrlen) == -1) { #ifndef NODEBUG olsr_printf(1, "(JSONINFO) bind()=%s\n", strerror(errno)); #endif /* NODEBUG */ return 0; } /* show that we are willing to listen */ if (listen(ipc_socket, 1) == -1) { #ifndef NODEBUG olsr_printf(1, "(JSONINFO) listen()=%s\n", strerror(errno)); #endif /* NODEBUG */ return 0; } /* Register with olsrd */ add_olsr_socket(ipc_socket, &ipc_action, NULL, NULL, SP_PR_READ); #ifndef NODEBUG olsr_printf(2, "(JSONINFO) listening on port %d\n", ipc_port); #endif /* NODEBUG */ } return 1; } static int read_uuid_from_file(const char *file) { FILE *f; char* end; int r = 0; size_t chars; memset(uuid, 0, sizeof(uuid)); f = fopen(file, "r"); olsr_printf(1, "(JSONINFO) Reading UUID from '%s'\n", file); if (f == NULL ) { olsr_printf(1, "(JSONINFO) Could not open '%s': %s\n", file, strerror(errno)); return -1; } chars = fread(uuid, 1, UUIDLEN, f); if (chars > 0) { uuid[chars] = '\0'; /* null-terminate the string */ /* we only use the first line of the file */ end = strchr(uuid, '\n'); if(end) *end = 0; r = 0; } else { olsr_printf(1, "(JSONINFO) Could not read UUID from '%s': %s\n", file, strerror(errno)); r = -1; } fclose(f); return r; } static void ipc_action(int fd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { union olsr_sockaddr pin; char addr[INET6_ADDRSTRLEN]; fd_set rfds; struct timeval tv; unsigned int send_what = 0; int ipc_connection; socklen_t addrlen = sizeof(pin); if ((ipc_connection = accept(fd, &pin.in, &addrlen)) == -1) { #ifndef NODEBUG olsr_printf(1, "(JSONINFO) accept()=%s\n", strerror(errno)); #endif /* NODEBUG */ return; } tv.tv_sec = tv.tv_usec = 0; if (olsr_cnf->ip_version == AF_INET) { if (inet_ntop(olsr_cnf->ip_version, &pin.in4.sin_addr, addr, INET6_ADDRSTRLEN) == NULL) addr[0] = '\0'; if (!ip4equal(&pin.in4.sin_addr, &jsoninfo_accept_ip.v4) && jsoninfo_accept_ip.v4.s_addr != INADDR_ANY) { #ifdef JSONINFO_ALLOW_LOCALHOST if (pin.in4.sin_addr.s_addr != INADDR_LOOPBACK) { #endif /* JSONINFO_ALLOW_LOCALHOST */ olsr_printf(1, "(JSONINFO) From host(%s) not allowed!\n", addr); close(ipc_connection); return; #ifdef JSONINFO_ALLOW_LOCALHOST } #endif /* JSONINFO_ALLOW_LOCALHOST */ } } else { if (inet_ntop(olsr_cnf->ip_version, &pin.in6.sin6_addr, addr, INET6_ADDRSTRLEN) == NULL) addr[0] = '\0'; /* Use in6addr_any (::) in olsr.conf to allow anybody. */ if (!ip6equal(&in6addr_any, &jsoninfo_accept_ip.v6) && !ip6equal(&pin.in6.sin6_addr, &jsoninfo_accept_ip.v6)) { olsr_printf(1, "(JSONINFO) From host(%s) not allowed!\n", addr); close(ipc_connection); return; } } #ifndef NODEBUG olsr_printf(2, "(JSONINFO) Connect from %s\n", addr); #endif /* NODEBUG */ /* purge read buffer to prevent blocking on linux */ FD_ZERO(&rfds); FD_SET((unsigned int)ipc_connection, &rfds); /* Win32 needs the cast here */ if (0 <= select(ipc_connection + 1, &rfds, NULL, NULL, &tv)) { char requ[1024]; ssize_t s = recv(ipc_connection, (void *)&requ, sizeof(requ)-1, 0); /* Win32 needs the cast here */ if (s == sizeof(requ)-1) { /* input was too much long, just skip the rest */ char dummy[1024]; while (recv(ipc_connection, (void *)&dummy, sizeof(dummy), 0) == sizeof(dummy)); } if (0 < s) { requ[s] = 0; /* print out the requested tables */ if (0 != strstr(requ, "/olsrd.conf")) send_what |= SIW_OLSRD_CONF; else if (0 != strstr(requ, "/all")) send_what = SIW_ALL; else { // these are the two overarching categories if (0 != strstr(requ, "/runtime")) send_what |= SIW_RUNTIME_ALL; if (0 != strstr(requ, "/startup")) send_what |= SIW_STARTUP_ALL; // these are the individual sections if (0 != strstr(requ, "/neighbors")) send_what |= SIW_NEIGHBORS; if (0 != strstr(requ, "/links")) send_what |= SIW_LINKS; if (0 != strstr(requ, "/routes")) send_what |= SIW_ROUTES; if (0 != strstr(requ, "/hna")) send_what |= SIW_HNA; if (0 != strstr(requ, "/mid")) send_what |= SIW_MID; if (0 != strstr(requ, "/topology")) send_what |= SIW_TOPOLOGY; if (0 != strstr(requ, "/gateways")) send_what |= SIW_GATEWAYS; if (0 != strstr(requ, "/interfaces")) send_what |= SIW_INTERFACES; if (0 != strstr(requ, "/config")) send_what |= SIW_CONFIG; if (0 != strstr(requ, "/plugins")) send_what |= SIW_PLUGINS; } } if ( send_what == 0 ) send_what = SIW_ALL; } send_info(send_what, ipc_connection); } static void ipc_print_neighbors(struct autobuf *abuf) { struct ipaddr_str buf1; struct neighbor_entry *neigh; struct neighbor_2_list_entry *list_2; int thop_cnt; abuf_json_open_array(abuf, "neighbors"); /* Neighbors */ OLSR_FOR_ALL_NBR_ENTRIES(neigh) { abuf_json_open_array_entry(abuf); abuf_json_string(abuf, "ipv4Address", olsr_ip_to_string(&buf1, &neigh->neighbor_main_addr)); abuf_json_boolean(abuf, "symmetric", (neigh->status == SYM)); abuf_json_boolean(abuf, "multiPointRelay", neigh->is_mpr); abuf_json_boolean(abuf, "multiPointRelaySelector", olsr_lookup_mprs_set(&neigh->neighbor_main_addr) != NULL); abuf_json_int(abuf, "willingness", neigh->willingness); abuf_appendf(abuf, ",\n"); thop_cnt = 0; if (neigh->neighbor_2_list.next) { abuf_appendf(abuf, "\t\"twoHopNeighbors\": ["); for (list_2 = neigh->neighbor_2_list.next; list_2 != &neigh->neighbor_2_list; list_2 = list_2->next) { if (thop_cnt) abuf_appendf(abuf, ", "); abuf_appendf(abuf, "\"%s\"", olsr_ip_to_string(&buf1, &list_2->neighbor_2->neighbor_2_addr)); thop_cnt++; } } abuf_appendf(abuf, "]"); abuf_json_int(abuf, "twoHopNeighborCount", thop_cnt); abuf_json_close_array_entry(abuf); } OLSR_FOR_ALL_NBR_ENTRIES_END(neigh); abuf_json_close_array(abuf); } static void ipc_print_links(struct autobuf *abuf) { struct ipaddr_str buf1, buf2; struct lqtextbuffer lqbuffer1; struct link_entry *my_link = NULL; abuf_json_open_array(abuf, "links"); OLSR_FOR_ALL_LINK_ENTRIES(my_link) { const char* lqs; int diff = (unsigned int)(my_link->link_timer->timer_clock - now_times); abuf_json_open_array_entry(abuf); abuf_json_string(abuf, "localIP", olsr_ip_to_string(&buf1, &my_link->local_iface_addr)); abuf_json_string(abuf, "remoteIP", olsr_ip_to_string(&buf2, &my_link->neighbor_iface_addr)); abuf_json_int(abuf, "validityTime", diff); lqs = get_link_entry_text(my_link, '\t', &lqbuffer1); abuf_json_float(abuf, "linkQuality", atof(lqs)); abuf_json_float(abuf, "neighborLinkQuality", atof(strrchr(lqs, '\t'))); if (my_link->linkcost >= LINK_COST_BROKEN) abuf_json_int(abuf, "linkCost", LINK_COST_BROKEN); else abuf_json_int(abuf, "linkCost", my_link->linkcost); abuf_json_close_array_entry(abuf); } OLSR_FOR_ALL_LINK_ENTRIES_END(my_link); abuf_json_close_array(abuf); } static void ipc_print_routes(struct autobuf *abuf) { struct ipaddr_str buf1, buf2; struct rt_entry *rt; abuf_json_open_array(abuf, "routes"); /* Walk the route table */ OLSR_FOR_ALL_RT_ENTRIES(rt) { abuf_json_open_array_entry(abuf); abuf_json_string(abuf, "destination", olsr_ip_to_string(&buf1, &rt->rt_dst.prefix)); abuf_json_int(abuf, "genmask", rt->rt_dst.prefix_len); abuf_json_string(abuf, "gateway", olsr_ip_to_string(&buf2, &rt->rt_best->rtp_nexthop.gateway)); abuf_json_int(abuf, "metric", rt->rt_best->rtp_metric.hops); if (rt->rt_best->rtp_metric.cost >= ROUTE_COST_BROKEN) abuf_json_int(abuf, "rtpMetricCost", ROUTE_COST_BROKEN); else abuf_json_int(abuf, "rtpMetricCost", rt->rt_best->rtp_metric.cost); abuf_json_string(abuf, "networkInterface", if_ifwithindex_name(rt->rt_best->rtp_nexthop.iif_index)); abuf_json_close_array_entry(abuf); } OLSR_FOR_ALL_RT_ENTRIES_END(rt); abuf_json_close_array(abuf); } static void ipc_print_topology(struct autobuf *abuf) { struct tc_entry *tc; abuf_json_open_array(abuf, "topology"); /* Topology */ OLSR_FOR_ALL_TC_ENTRIES(tc) { struct tc_edge_entry *tc_edge; OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) { if (tc_edge->edge_inv) { struct ipaddr_str dstbuf, addrbuf; struct lqtextbuffer lqbuffer1; uint32_t vt = tc->validity_timer != NULL ? (tc->validity_timer->timer_clock - now_times) : 0; int diff = (int)(vt); const char* lqs; abuf_json_open_array_entry(abuf); abuf_json_string(abuf, "destinationIP", olsr_ip_to_string(&dstbuf, &tc_edge->T_dest_addr)); abuf_json_string(abuf, "lastHopIP", olsr_ip_to_string(&addrbuf, &tc->addr)); lqs = get_tc_edge_entry_text(tc_edge, '\t', &lqbuffer1); abuf_json_float(abuf, "linkQuality", atof(lqs)); abuf_json_float(abuf, "neighborLinkQuality", atof(strrchr(lqs, '\t'))); if (tc_edge->cost >= LINK_COST_BROKEN) abuf_json_int(abuf, "tcEdgeCost", LINK_COST_BROKEN); else abuf_json_int(abuf, "tcEdgeCost", tc_edge->cost); abuf_json_int(abuf, "validityTime", diff); abuf_json_close_array_entry(abuf); } } OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge); } OLSR_FOR_ALL_TC_ENTRIES_END(tc); abuf_json_close_array(abuf); } static void ipc_print_hna(struct autobuf *abuf) { struct hna_entry *tmp_hna; struct hna_net *tmp_net; struct ipaddr_str buf, mainaddrbuf; abuf_json_open_array(abuf, "hna"); OLSR_FOR_ALL_HNA_ENTRIES(tmp_hna) { /* Check all networks */ for (tmp_net = tmp_hna->networks.next; tmp_net != &tmp_hna->networks; tmp_net = tmp_net->next) { uint32_t vt = tmp_net->hna_net_timer != NULL ? (tmp_net->hna_net_timer->timer_clock - now_times) : 0; int diff = (int)(vt); abuf_json_open_array_entry(abuf); abuf_json_string(abuf, "destination", olsr_ip_to_string(&buf, &tmp_net->hna_prefix.prefix)), abuf_json_int(abuf, "genmask", tmp_net->hna_prefix.prefix_len); abuf_json_string(abuf, "gateway", olsr_ip_to_string(&mainaddrbuf, &tmp_hna->A_gateway_addr)); abuf_json_int(abuf, "validityTime", diff); abuf_json_close_array_entry(abuf); } } OLSR_FOR_ALL_HNA_ENTRIES_END(tmp_hna); abuf_json_close_array(abuf); } static void ipc_print_mid(struct autobuf *abuf) { int idx; struct mid_entry *entry; struct mid_address *alias; abuf_json_open_array(abuf, "mid"); /* MID */ for (idx = 0; idx < HASHSIZE; idx++) { entry = mid_set[idx].next; while (entry != &mid_set[idx]) { struct ipaddr_str buf, buf2; abuf_json_open_array_entry(abuf); abuf_json_string(abuf, "ipAddress", olsr_ip_to_string(&buf, &entry->main_addr)); abuf_json_open_array(abuf, "aliases"); alias = entry->aliases; while (alias) { uint32_t vt = alias->vtime - now_times; int diff = (int)(vt); abuf_json_open_array_entry(abuf); abuf_json_string(abuf, "ipAddress", olsr_ip_to_string(&buf2, &alias->alias)); abuf_json_int(abuf, "validityTime", diff); abuf_json_close_array_entry(abuf); alias = alias->next_alias; } abuf_json_close_array(abuf); // aliases abuf_json_close_array_entry(abuf); entry = entry->next; } } abuf_json_close_array(abuf); // mid } static void ipc_print_gateways(struct autobuf *abuf) { #ifndef __linux__ abuf_json_string(abuf, "error", "Gateway mode is only supported in Linux"); #else /* __linux__ */ struct ipaddr_str buf; struct gateway_entry *gw; abuf_json_open_array(abuf, "gateways"); OLSR_FOR_ALL_GATEWAY_ENTRIES(gw) { const char *v4 = "", *v6 = ""; bool autoV4 = false, autoV6 = false; const char *ipType = ""; struct tc_entry *tc; if ((tc = olsr_lookup_tc_entry(&gw->originator)) == NULL) { continue; } if (gw == olsr_get_inet_gateway(false)) { v4 = "s"; } else if (gw->ipv4 && (olsr_cnf->ip_version == AF_INET || olsr_cnf->use_niit) && (olsr_cnf->smart_gw_allow_nat || !gw->ipv4nat)) { v4 = "u"; } if (gw == olsr_get_inet_gateway(true)) { v6 = "s"; } else if (gw->ipv6 && olsr_cnf->ip_version == AF_INET6) { v6 = "u"; } abuf_json_open_array_entry(abuf); if (gw->ipv4) { ipType = "ipv4"; abuf_json_string(abuf, "ipv4Status", v4); } else if (gw->ipv6) { ipType = "ipv6"; abuf_json_string(abuf, "ipv6Status", v6); } abuf_json_string(abuf, "ipType", ipType); abuf_json_boolean(abuf, "ipv4", gw->ipv4); abuf_json_boolean(abuf, "ipv4Nat", gw->ipv4nat); abuf_json_boolean(abuf, "ipv6", gw->ipv6); abuf_json_boolean(abuf, "autoIpv4", autoV4); abuf_json_boolean(abuf, "autoIpv6", autoV6); abuf_json_string(abuf, "ipAddress", olsr_ip_to_string(&buf, &gw->originator)); if (tc->path_cost >= ROUTE_COST_BROKEN) abuf_json_int(abuf, "tcPathCost", ROUTE_COST_BROKEN); else abuf_json_int(abuf, "tcPathCost", tc->path_cost); abuf_json_int(abuf, "hopCount", tc->hops); abuf_json_int(abuf, "uplinkSpeed", gw->uplink); abuf_json_int(abuf, "downlinkSpeed", gw->downlink); if(gw->external_prefix.prefix_len == 0) abuf_json_string(abuf, "externalPrefix", olsr_ip_prefix_to_string(&gw->external_prefix)); abuf_json_close_array_entry(abuf); } OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw) abuf_json_close_array(abuf); #endif /* __linux__ */ } static void ipc_print_plugins(struct autobuf *abuf) { struct plugin_entry *pentry; struct plugin_param *pparam; abuf_json_open_array(abuf, "plugins"); if (olsr_cnf->plugins) for (pentry = olsr_cnf->plugins; pentry; pentry = pentry->next) { abuf_json_open_array_entry(abuf); abuf_json_string(abuf, "plugin", pentry->name); for (pparam = pentry->params; pparam; pparam = pparam->next) { int i, keylen = strlen(pparam->key); char key[keylen + 1]; long value; char valueTest[256]; strcpy(key, pparam->key); for (i = 0; i < keylen; i++) key[i] = tolower(key[i]); // test if a int/long and set as such in JSON value = atol(pparam->value); snprintf(valueTest, 255, "%li", value); if (strcmp(valueTest, pparam->value) == 0) abuf_json_int(abuf, key, value); else abuf_json_string(abuf, key, pparam->value); } abuf_json_close_array_entry(abuf); } abuf_json_close_array(abuf); } static void ipc_print_config(struct autobuf *abuf) { struct ip_prefix_list *hna; struct ipaddr_str buf, mainaddrbuf; struct ip_prefix_list *ipcn; struct olsr_lq_mult *mult; char ipv6_buf[INET6_ADDRSTRLEN]; /* buffer for IPv6 inet_htop */ abuf_json_open_object(abuf, "config"); abuf_json_int(abuf, "olsrPort", olsr_cnf->olsrport); abuf_json_int(abuf, "debugLevel", olsr_cnf->debug_level); abuf_json_boolean(abuf, "noFork", olsr_cnf->no_fork); abuf_json_boolean(abuf, "hostEmulation", olsr_cnf->host_emul); abuf_json_int(abuf, "ipVersion", olsr_cnf->ip_version); abuf_json_boolean(abuf, "allowNoInterfaces", olsr_cnf->allow_no_interfaces); abuf_json_int(abuf, "typeOfService", olsr_cnf->tos); abuf_json_int(abuf, "rtProto", olsr_cnf->rt_proto); abuf_json_int(abuf, "rtTable", olsr_cnf->rt_table); abuf_json_int(abuf, "rtTableDefault", olsr_cnf->rt_table_default); abuf_json_int(abuf, "rtTableTunnel", olsr_cnf->rt_table_tunnel); abuf_json_int(abuf, "rtTablePriority", olsr_cnf->rt_table_pri); abuf_json_int(abuf, "rtTableTunnelPriority", olsr_cnf->rt_table_tunnel_pri); abuf_json_int(abuf, "rtTableDefauiltOlsrPriority", olsr_cnf->rt_table_defaultolsr_pri); abuf_json_int(abuf, "rtTableDefaultPriority", olsr_cnf->rt_table_default_pri); abuf_json_int(abuf, "willingness", olsr_cnf->willingness); abuf_json_boolean(abuf, "willingnessAuto", olsr_cnf->willingness_auto); abuf_json_int(abuf, "brokenLinkCost", LINK_COST_BROKEN); abuf_json_int(abuf, "brokenRouteCost", ROUTE_COST_BROKEN); abuf_json_string(abuf, "fibMetrics", FIB_METRIC_TXT[olsr_cnf->fib_metric]); abuf_json_string(abuf, "defaultIpv6Multicast", inet_ntop(AF_INET6, &olsr_cnf->interface_defaults->ipv6_multicast.v6, ipv6_buf, sizeof(ipv6_buf))); if (olsr_cnf->interface_defaults->ipv4_multicast.v4.s_addr) abuf_json_string(abuf, "defaultIpv4Broadcast", inet_ntoa(olsr_cnf->interface_defaults->ipv4_multicast.v4)); else abuf_json_string(abuf, "defaultIpv4Broadcast", "auto"); if (olsr_cnf->interface_defaults->mode==IF_MODE_ETHER) abuf_json_string(abuf, "defaultInterfaceMode", "ether"); else abuf_json_string(abuf, "defaultInterfaceMode", "mesh"); abuf_json_float(abuf, "defaultHelloEmissionInterval", olsr_cnf->interface_defaults->hello_params.emission_interval); abuf_json_float(abuf, "defaultHelloValidityTime", olsr_cnf->interface_defaults->hello_params.validity_time); abuf_json_float(abuf, "defaultTcEmissionInterval", olsr_cnf->interface_defaults->tc_params.emission_interval); abuf_json_float(abuf, "defaultTcValidityTime", olsr_cnf->interface_defaults->tc_params.validity_time); abuf_json_float(abuf, "defaultMidEmissionInterval", olsr_cnf->interface_defaults->mid_params.emission_interval); abuf_json_float(abuf, "defaultMidValidityTime", olsr_cnf->interface_defaults->mid_params.validity_time); abuf_json_float(abuf, "defaultHnaEmissionInterval", olsr_cnf->interface_defaults->hna_params.emission_interval); abuf_json_float(abuf, "defaultHnaValidityTime", olsr_cnf->interface_defaults->hna_params.validity_time); abuf_json_boolean(abuf, "defaultAutoDetectChanges", olsr_cnf->interface_defaults->autodetect_chg); abuf_json_open_array(abuf, "defaultLinkQualityMultipliers"); for (mult = olsr_cnf->interface_defaults->lq_mult; mult != NULL; mult = mult->next) { abuf_json_open_array_entry(abuf); abuf_json_string(abuf, "route", inet_ntop(olsr_cnf->ip_version, &mult->addr, ipv6_buf, sizeof(ipv6_buf))); abuf_json_float(abuf, "multiplier", mult->value / 65535.0); abuf_json_close_array_entry(abuf); } abuf_json_close_array(abuf); abuf_json_open_array(abuf, "hna"); for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next) { abuf_json_open_array_entry(abuf); abuf_json_string(abuf, "destination", olsr_ip_to_string(&buf, &hna->net.prefix)); abuf_json_int(abuf, "genmask", hna->net.prefix_len); abuf_json_string(abuf, "gateway", olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->main_addr)); abuf_json_close_array_entry(abuf); } abuf_json_close_array(abuf); abuf_json_int(abuf, "totalIpcConnectionsAllowed", olsr_cnf->ipc_connections); abuf_json_open_array(abuf, "ipcAllowedAddresses"); if (olsr_cnf->ipc_connections) { for (ipcn = olsr_cnf->ipc_nets; ipcn != NULL; ipcn = ipcn->next) { abuf_json_open_array_entry(abuf); abuf_json_string(abuf, "ipAddress", olsr_ip_to_string(&mainaddrbuf, &ipcn->net.prefix)); abuf_json_int(abuf, "netmask", ipcn->net.prefix_len); abuf_json_close_array_entry(abuf); } } abuf_json_close_array(abuf); // keep all time in ms, so convert these two, which are in seconds abuf_json_int(abuf, "pollRate", olsr_cnf->pollrate * 1000); abuf_json_int(abuf, "nicChangePollInterval", olsr_cnf->nic_chgs_pollrate * 1000); abuf_json_boolean(abuf, "clearScreen", olsr_cnf->clear_screen); abuf_json_int(abuf, "tcRedundancy", olsr_cnf->tc_redundancy); abuf_json_int(abuf, "mprCoverage", olsr_cnf->mpr_coverage); if (olsr_cnf->lq_level == 0) { abuf_json_boolean(abuf, "useHysteresis", olsr_cnf->use_hysteresis); if (olsr_cnf->use_hysteresis) { abuf_json_float(abuf, "hysteresisScaling", olsr_cnf->hysteresis_param.scaling); abuf_json_float(abuf, "hysteresisLowThreshold", olsr_cnf->hysteresis_param.thr_low); abuf_json_float(abuf, "hysteresisHighThreshold", olsr_cnf->hysteresis_param.thr_high); } } abuf_json_int(abuf, "linkQualityLevel", olsr_cnf->lq_level); abuf_json_float(abuf, "linkQualityAging", olsr_cnf->lq_aging); abuf_json_boolean(abuf, "linkQualityFisheye", olsr_cnf->lq_fish); abuf_json_string(abuf, "linkQualityAlgorithm", olsr_cnf->lq_algorithm); // keep all time in ms, so convert this from seconds abuf_json_int(abuf, "minTcValidTime", olsr_cnf->min_tc_vtime * 1000); abuf_json_boolean(abuf, "setIpForward", olsr_cnf->set_ip_forward); abuf_json_string(abuf, "lockFile", olsr_cnf->lock_file); abuf_json_boolean(abuf, "useNiit", olsr_cnf->use_niit); #ifdef __linux__ abuf_json_boolean(abuf, "smartGateway", olsr_cnf->smart_gw_active); if (olsr_cnf->smart_gw_active) { abuf_json_boolean(abuf, "smartGatewayAlwaysRemoveServerTunnel", olsr_cnf->smart_gw_always_remove_server_tunnel); abuf_json_int(abuf, "smartGatewayUseCount", olsr_cnf->smart_gw_use_count); abuf_json_string(abuf, "smartGatewayPolicyRoutingScript", olsr_cnf->smart_gw_policyrouting_script); { struct autobuf egressbuf; struct sgw_egress_if * egressif = olsr_cnf->smart_gw_egress_interfaces; abuf_init(&egressbuf, (olsr_cnf->smart_gw_egress_interfaces_count * IFNAMSIZ) /* interface names */ + (olsr_cnf->smart_gw_egress_interfaces_count - 1) /* commas */); while (egressif) { if (egressbuf.len) { abuf_puts(&egressbuf, ","); } abuf_appendf(&egressbuf, "%s", egressif->name); egressif = egressif->next; } abuf_json_string(abuf, "smartGatewayEgressInterfaces", egressbuf.buf); abuf_free(&egressbuf); } abuf_json_int(abuf, "smartGatewayMarkOffsetEgress", olsr_cnf->smart_gw_mark_offset_egress); abuf_json_int(abuf, "smartGatewayMarkOffsetTunnels", olsr_cnf->smart_gw_mark_offset_tunnels); abuf_json_boolean(abuf, "smartGatewayAllowNat", olsr_cnf->smart_gw_allow_nat); abuf_json_boolean(abuf, "smartGatewayUplinkNat", olsr_cnf->smart_gw_uplink_nat); abuf_json_int(abuf, "smartGatewayPeriod", olsr_cnf->smart_gw_period); abuf_json_int(abuf, "smartGatewayStableCount", olsr_cnf->smart_gw_stablecount); abuf_json_int(abuf, "smartGatewayThreshold", olsr_cnf->smart_gw_thresh); abuf_json_int(abuf, "smartGatewayUplink", olsr_cnf->smart_gw_uplink); abuf_json_int(abuf, "smartGatewayDownlink", olsr_cnf->smart_gw_downlink); abuf_json_int(abuf, "smartGatewayType", olsr_cnf->smart_gw_type); abuf_json_string(abuf, "smartGatewayPrefix", olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->smart_gw_prefix.prefix)); abuf_json_int(abuf, "smartGatewayPrefixLength", olsr_cnf->smart_gw_prefix.prefix_len); } #endif /* __linux__ */ abuf_json_string(abuf, "mainIpAddress", olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->main_addr)); abuf_json_string(abuf, "unicastSourceIpAddress", olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->unicast_src_ip)); abuf_json_boolean(abuf, "useSourceIpRoutes", olsr_cnf->use_src_ip_routes); abuf_json_int(abuf, "maxPrefixLength", olsr_cnf->maxplen); abuf_json_int(abuf, "ipSize", olsr_cnf->ipsize); abuf_json_boolean(abuf, "deleteInternetGatewaysAtStartup", olsr_cnf->del_gws); // keep all time in ms, so convert this from seconds abuf_json_int(abuf, "willingnessUpdateInterval", olsr_cnf->will_int * 1000); abuf_json_float(abuf, "maxSendMessageJitter", olsr_cnf->max_jitter); abuf_json_int(abuf, "exitValue", olsr_cnf->exit_value); // keep all time in ms, so convert this from seconds abuf_json_int(abuf, "maxTcValidTime", olsr_cnf->max_tc_vtime * 1000); abuf_json_int(abuf, "niit4to6InterfaceIndex", olsr_cnf->niit4to6_if_index); abuf_json_int(abuf, "niit6to4InterfaceIndex", olsr_cnf->niit6to4_if_index); abuf_json_boolean(abuf, "hasIpv4Gateway", olsr_cnf->has_ipv4_gateway); abuf_json_boolean(abuf, "hasIpv6Gateway", olsr_cnf->has_ipv6_gateway); abuf_json_int(abuf, "ioctlSocket", olsr_cnf->ioctl_s); #ifdef __linux__ abuf_json_int(abuf, "routeNetlinkSocket", olsr_cnf->rtnl_s); abuf_json_int(abuf, "routeMonitorSocket", olsr_cnf->rt_monitor_socket); #endif /* __linux__ */ #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ abuf_json_int(abuf, "routeChangeSocket", olsr_cnf->rts); #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ */ abuf_json_float(abuf, "linkQualityNatThreshold", olsr_cnf->lq_nat_thresh); abuf_json_string(abuf, "olsrdVersion", olsrd_version); abuf_json_string(abuf, "olsrdBuildDate", build_date); abuf_json_string(abuf, "olsrdBuildHost", build_host); #if defined _WIN32 || defined _WIN64 abuf_json_string(abuf, "os", "Windows"); #elif defined __gnu_linux__ abuf_json_string(abuf, "os", "GNU/Linux"); #elif defined __ANDROID__ abuf_json_string(abuf, "os", "Android"); #elif defined __APPLE__ abuf_json_string(abuf, "os", "Mac OS X"); #elif defined __NetBSD__ abuf_json_string(abuf, "os", "NetBSD"); #elif defined __OpenBSD__ abuf_json_string(abuf, "os", "OpenBSD"); #elif defined __FreeBSD__ || defined __FreeBSD_kernel__ abuf_json_string(abuf, "os", "FreeBSD"); #else /* OS detection */ abuf_json_string(abuf, "os", "Undefined"); #endif /* OS detection */ abuf_json_int(abuf, "startTime", start_time.tv_sec); abuf_json_close_object(abuf); } static void ipc_print_interfaces(struct autobuf *abuf) { #ifdef __linux__ int linklen; char path[PATH_MAX], linkpath[PATH_MAX]; #endif /* __linux__ */ char ipv6_buf[INET6_ADDRSTRLEN]; /* buffer for IPv6 inet_htop */ struct olsr_lq_mult *mult; const struct olsr_if *ifs; abuf_json_open_array(abuf, "interfaces"); for (ifs = olsr_cnf->interfaces; ifs != NULL; ifs = ifs->next) { const struct interface *const rifs = ifs->interf; abuf_json_open_array_entry(abuf); abuf_json_string(abuf, "name", ifs->name); abuf_json_open_array(abuf, "linkQualityMultipliers"); for (mult = ifs->cnf->lq_mult; mult != NULL; mult = mult->next) { abuf_json_open_array_entry(abuf); abuf_json_string(abuf, "route", inet_ntop(olsr_cnf->ip_version, &mult->addr, ipv6_buf, sizeof(ipv6_buf))); abuf_json_float(abuf, "multiplier", mult->value / 65535.0); abuf_json_close_array_entry(abuf); } abuf_json_close_array(abuf); if (!rifs) { abuf_json_string(abuf, "state", "down"); } else { abuf_json_string(abuf, "state", "up"); abuf_json_string(abuf, "nameFromKernel", rifs->int_name); abuf_json_int(abuf, "interfaceMode", rifs->mode); abuf_json_boolean(abuf, "emulatedHostClientInterface", rifs->is_hcif); abuf_json_boolean(abuf, "sendTcImmediately", rifs->immediate_send_tc); abuf_json_int(abuf, "fishEyeTtlIndex", rifs->ttl_index); abuf_json_int(abuf, "olsrForwardingTimeout", rifs->fwdtimer); abuf_json_int(abuf, "olsrMessageSequenceNumber", rifs->olsr_seqnum); abuf_json_int(abuf, "olsrInterfaceMetric", rifs->int_metric); abuf_json_int(abuf, "olsrMTU", rifs->int_mtu); abuf_json_int(abuf, "helloEmissionInterval", rifs->hello_etime); abuf_json_int(abuf, "helloValidityTime", rifs->valtimes.hello); abuf_json_int(abuf, "tcValidityTime", rifs->valtimes.tc); abuf_json_int(abuf, "midValidityTime", rifs->valtimes.mid); abuf_json_int(abuf, "hnaValidityTime", rifs->valtimes.hna); abuf_json_boolean(abuf, "wireless", rifs->is_wireless); #ifdef __linux__ abuf_json_boolean(abuf, "icmpRedirect", rifs->nic_state.redirect); abuf_json_boolean(abuf, "spoofFilter", rifs->nic_state.spoof); #endif /* __linux__ */ if (olsr_cnf->ip_version == AF_INET) { struct ipaddr_str addrbuf, maskbuf, bcastbuf; abuf_json_string(abuf, "ipv4Address", ip4_to_string(&addrbuf, rifs->int_addr.sin_addr)); abuf_json_string(abuf, "netmask", ip4_to_string(&maskbuf, rifs->int_netmask.sin_addr)); abuf_json_string(abuf, "broadcast", ip4_to_string(&bcastbuf, rifs->int_broadaddr.sin_addr)); } else { struct ipaddr_str addrbuf, maskbuf; abuf_json_string(abuf, "ipv6Address", ip6_to_string(&addrbuf, &rifs->int6_addr.sin6_addr)); abuf_json_string(abuf, "multicast", ip6_to_string(&maskbuf, &rifs->int6_multaddr.sin6_addr)); } } #ifdef __linux__ snprintf(path, PATH_MAX, "/sys/class/net/%s/device/driver/module", ifs->name); linklen = readlink(path, linkpath, PATH_MAX - 1); if (linklen > 1) { linkpath[linklen] = '\0'; abuf_json_string(abuf, "kernelModule", basename(linkpath)); } abuf_json_sys_class_net(abuf, "addressLength", ifs->name, "addr_len"); abuf_json_sys_class_net(abuf, "carrier", ifs->name, "carrier"); abuf_json_sys_class_net(abuf, "dormant", ifs->name, "dormant"); abuf_json_sys_class_net(abuf, "features", ifs->name, "features"); abuf_json_sys_class_net(abuf, "flags", ifs->name, "flags"); abuf_json_sys_class_net(abuf, "linkMode", ifs->name, "link_mode"); abuf_json_sys_class_net(abuf, "macAddress", ifs->name, "address"); abuf_json_sys_class_net(abuf, "ethernetMTU", ifs->name, "mtu"); abuf_json_sys_class_net(abuf, "operationalState", ifs->name, "operstate"); abuf_json_sys_class_net(abuf, "txQueueLength", ifs->name, "tx_queue_len"); abuf_json_sys_class_net(abuf, "collisions", ifs->name, "statistics/collisions"); abuf_json_sys_class_net(abuf, "multicastPackets", ifs->name, "statistics/multicast"); abuf_json_sys_class_net(abuf, "rxBytes", ifs->name, "statistics/rx_bytes"); abuf_json_sys_class_net(abuf, "rxCompressed", ifs->name, "statistics/rx_compressed"); abuf_json_sys_class_net(abuf, "rxCrcErrors", ifs->name, "statistics/rx_crc_errors"); abuf_json_sys_class_net(abuf, "rxDropped", ifs->name, "statistics/rx_dropped"); abuf_json_sys_class_net(abuf, "rxErrors", ifs->name, "statistics/rx_errors"); abuf_json_sys_class_net(abuf, "rxFifoErrors", ifs->name, "statistics/rx_fifo_errors"); abuf_json_sys_class_net(abuf, "rxFrameErrors", ifs->name, "statistics/rx_frame_errors"); abuf_json_sys_class_net(abuf, "rxLengthErrors", ifs->name, "statistics/rx_length_errors"); abuf_json_sys_class_net(abuf, "rxMissedErrors", ifs->name, "statistics/rx_missed_errors"); abuf_json_sys_class_net(abuf, "rxOverErrors", ifs->name, "statistics/rx_over_errors"); abuf_json_sys_class_net(abuf, "rxPackets", ifs->name, "statistics/rx_packets"); abuf_json_sys_class_net(abuf, "txAbortedErrors", ifs->name, "statistics/tx_aborted_errors"); abuf_json_sys_class_net(abuf, "txBytes", ifs->name, "statistics/tx_bytes"); abuf_json_sys_class_net(abuf, "txCarrierErrors", ifs->name, "statistics/tx_carrier_errors"); abuf_json_sys_class_net(abuf, "txCompressed", ifs->name, "statistics/tx_compressed"); abuf_json_sys_class_net(abuf, "txDropped", ifs->name, "statistics/tx_dropped"); abuf_json_sys_class_net(abuf, "txErrors", ifs->name, "statistics/tx_errors"); abuf_json_sys_class_net(abuf, "txFifoErrors", ifs->name, "statistics/tx_fifo_errors"); abuf_json_sys_class_net(abuf, "txHeartbeatErrors", ifs->name, "statistics/tx_heartbeat_errors"); abuf_json_sys_class_net(abuf, "txPackets", ifs->name, "statistics/tx_packets"); abuf_json_sys_class_net(abuf, "txWindowErrors", ifs->name, "statistics/tx_window_errors"); abuf_json_sys_class_net(abuf, "beaconing", ifs->name, "wireless/beacon"); abuf_json_sys_class_net(abuf, "encryptionKey", ifs->name, "wireless/crypt"); abuf_json_sys_class_net(abuf, "fragmentationThreshold", ifs->name, "wireless/fragment"); abuf_json_sys_class_net(abuf, "signalLevel", ifs->name, "wireless/level"); abuf_json_sys_class_net(abuf, "linkQuality", ifs->name, "wireless/link"); abuf_json_sys_class_net(abuf, "misc", ifs->name, "wireless/misc"); abuf_json_sys_class_net(abuf, "noiseLevel", ifs->name, "wireless/noise"); abuf_json_sys_class_net(abuf, "nwid", ifs->name, "wireless/nwid"); abuf_json_sys_class_net(abuf, "wirelessRetries", ifs->name, "wireless/retries"); abuf_json_sys_class_net(abuf, "wirelessStatus", ifs->name, "wireless/status"); #endif /* __linux__ */ abuf_json_close_array_entry(abuf); } abuf_json_close_array(abuf); } static void ipc_print_olsrd_conf(struct autobuf *abuf) { olsrd_write_cnf_autobuf(abuf, olsr_cnf); } static void jsoninfo_write_data(void *foo __attribute__ ((unused))) { fd_set set; int result, i, j, max; struct timeval tv; FD_ZERO(&set); max = 0; for (i=0; i max) { max = outbuffer_socket[i]; } } tv.tv_sec = 0; tv.tv_usec = 0; result = select(max + 1, NULL, &set, NULL, &tv); if (result <= 0) { return; } for (i=0; i 0) { outbuffer_written[i] += result; } if (result <= 0 || outbuffer_written[i] == outbuffer_size[i]) { /* close this socket and cleanup*/ close(outbuffer_socket[i]); free (outbuffer[i]); for (j=i+1; j 0) { size += snprintf(&buf[size], bufsize - size, "Content-length: %i\r\n", msgsize); } /* Cache-control * No caching dynamic pages */ size += snprintf(&buf[size], bufsize - size, "Cache-Control: no-cache\r\n"); /* End header */ size += snprintf(&buf[size], bufsize - size, "\r\n"); return size; } /* * Local Variables: * mode: c * style: linux * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/jsoninfo/src/olsrd_jsoninfo.h000066400000000000000000000054431234304727700214100ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * includes code by Bruno Randolf * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #ifndef _OLSRD_JSONINFO #define _OLSRD_JSONINFO #include "olsr_types.h" #include "olsrd_plugin.h" #include "plugin_util.h" /* uncomment this to allow connections from 127.0.0.1 regardless of olsrd.conf (useful to allow externel ip/network + localhost) (ipv4 only)*/ /* #define JSONINFO_ALLOW_LOCALHOST */ #define UUIDLEN 256 extern char uuid[UUIDLEN + 1]; extern char uuidfile[FILENAME_MAX]; extern union olsr_ip_addr jsoninfo_accept_ip; extern union olsr_ip_addr jsoninfo_listen_ip; extern int ipc_port; extern int nompr; extern bool http_headers; int olsrd_plugin_interface_version(void); int olsrd_plugin_init(void); void olsr_plugin_exit(void); void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size); #endif /* _OLSRD_JSONINFO */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/jsoninfo/src/olsrd_plugin.c000066400000000000000000000112241234304727700210460ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #include #include #include #include #include #include #include "olsrd_plugin.h" #include "olsrd_jsoninfo.h" #include "defs.h" #define PLUGIN_NAME "JSON info and dyn_gw plugin" #define PLUGIN_VERSION "0.0" #define PLUGIN_AUTHOR "Hans-Christoph Steiner" #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR #define PLUGIN_INTERFACE_VERSION 5 union olsr_ip_addr jsoninfo_accept_ip; union olsr_ip_addr jsoninfo_listen_ip; int ipc_port; int nompr; bool http_headers; static void my_init(void) __attribute__ ((constructor)); static void my_fini(void) __attribute__ ((destructor)); /** *Constructor */ static void my_init(void) { /* Print plugin info to stdout */ printf("%s\n", MOD_DESC); /* defaults for parameters */ ipc_port = 9090; http_headers = false; if (olsr_cnf->ip_version == AF_INET) { jsoninfo_accept_ip.v4.s_addr = htonl(INADDR_LOOPBACK); jsoninfo_listen_ip.v4.s_addr = htonl(INADDR_ANY); } else { jsoninfo_accept_ip.v6 = in6addr_loopback; jsoninfo_listen_ip.v6 = in6addr_any; } /* highlite neighbours by default */ nompr = 0; } /** *Destructor */ static void my_fini(void) { /* Calls the destruction function * olsr_plugin_exit() * This function should be present in your * sourcefile and all data destruction * should happen there - NOT HERE! */ olsr_plugin_exit(); } int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } static int store_string(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused))) { char *str = data; snprintf(str, FILENAME_MAX, "%s", value); return 0; } static int store_boolean(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused))) { bool *dest = data; if(strcmp(value, "yes") == 0) *dest = true; else if (strcmp(value, "no") == 0) *dest = false; else return 1; //error return 0; } static const struct olsrd_plugin_parameters plugin_parameters[] = { {.name = "port",.set_plugin_parameter = &set_plugin_port,.data = &ipc_port}, {.name = "accept",.set_plugin_parameter = &set_plugin_ipaddress,.data = &jsoninfo_accept_ip}, {.name = "listen",.set_plugin_parameter = &set_plugin_ipaddress,.data = &jsoninfo_listen_ip}, {.name = "uuidfile",.set_plugin_parameter = &store_string,.data = uuidfile}, {.name = "httpheaders",.set_plugin_parameter = &store_boolean,.data = &http_headers}, }; void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = sizeof(plugin_parameters) / sizeof(*plugin_parameters); } /* * Local Variables: * mode: c * style: linux * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/jsoninfo/version-script.txt000066400000000000000000000002051234304727700211370ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/mdns/000077500000000000000000000000001234304727700145265ustar00rootroot00000000000000olsrd-0.6.6.2/lib/mdns/Makefile000066400000000000000000000014031234304727700161640ustar00rootroot00000000000000 OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_mdns PLUGIN_VER = 1.0.1 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc SUPPORTED = 0 ifeq ($(OS),linux) SUPPORTED = 1 endif ifeq ($(OS),android) SUPPORTED = 1 endif ifeq ($(SUPPORTED),0) .PHONY: all default_target install clean all: default_target default_target install clean: @echo "*** $(PLUGIN_NAME) plugin not supported on $(OS), sorry!" else default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) endif olsrd-0.6.6.2/lib/mdns/README000066400000000000000000000074111234304727700154110ustar00rootroot00000000000000= OLSR mdns plugin = This README file is the main documentation source for the OLSR mdns plugin Last update 20/07/2012 == Description == This plugin goal is the distribution of multicast DNS messages over an OLSR Wireless Mesh Network. In a wireless mesh network, the usage of wireless interfaces in ad-hoc mode and the OLSR routing protocol prevent multicast messages to be distributed all over the network. We are especially interested in the distribution of Multicast DNS (mDNS) messages, used for host-based service discovery, over the networks that do not directly partecipate in the OLSR mesh cloud. This task is achieved in the following way: 1. the local router picks up from the local non-OLSR (HNA) network mDNS messages and encapsulates them in a new type of OLSR messages, 2. the OLSR infrastructure is exploited for the transport of these messages, 3. remote routers decapsulate mDNS messages from received OLSR messages and send them over their attached non-OLSR networks. The work could have its practical and immediate application in all the wireless network communities that employ the OLSR protocol. The plugin captures the traffic (only IPv4 if OLSR is running IPv4 and only IPv6 if OLSR is running IPv6) and encapsulates this traffic in OLSR messages that are forwarded to all the other nodes in the mesh. Other nodes running the plugin will decapsulate the packets and will send them to the interfaces specified in the configuration file Let's get this example topology pc1->eth0 ----- eth0<-r1->ath0 -------ath0<-r2->eth0 ---------eth0<-pc2 r1 and r2 are OLSR routers with mdns plugin enabled. pc1 will be able to receive mdns traffic generated at pc2 and vice versa The most interesting feature is that messages are forwarded also by OLSR routers without the plugin. For example: pc1->eth0 ----- eth0<-r1->ath0 ---r3----ath0<-r2->eth0 ---------eth0<-pc2 also in this topology mdns traffic between pc1 and pc2 is possible because r3 forwards mdns plugin OLSR packets even if it is not aware of the new application. == Configuration == To enable the Plugin use the following syntax LoadPlugin "olsrd_mdns.so.1.0.1" { PlParam "NonOlsrIf" "eth0" PlParam "NonOlsrIf" "eth1" PlParam "MDNS_TTL" "5" PlParam "TTL_Check" "true" PlParam "Network_ID" "1" PlParam "FilteredHost" "192.168.0.1" PlParam "FilteredHost" "2001:1418::1" } Where eth0 and eth1 are the names of the interfaces where you want to capture traffic (and decapsulate incoming traffic). Note that this interfaces must not talk OLSR and also the subnets on this interfaces must be announced with an appropriate HNA entry. This version of the plugin will not chech this stuff to be properly configured! MDNS_TTL is the time to live given to the MDNS OLSR messages. It makes no sense to announce your services to hosts that are too many hops away, because they will experience a very bad unicast connection. With this TTL setting we can tune how far we announce our services and we make the protocol scale much better TTL_Check enable or disable the rule that set TTL/HopLimit of generated mDns packet to 1 and discard capture of packets with TTL/HopLimit set to 1 Network_ID is the network id value (default 1) that is used into router election for elect master router on the local hna, the plugin will elect master router the device with lower ip number on the same network id. FilteredHost is the ipv4 or ipv6 address of a mdns packets source that the router will discard. === References === * Multicast DNS: [http://tools.ietf.org/html/draft-cheshire-dnsext-multicastdns-07 IETF draft-cheshire-dnsext-multicastdns-07] * OLSR Optimized Link State Routing: [http://tools.ietf.org/html/rfc3626 IETF RFC 3626] === Contact === * Saverio Proto proto@ing.uniroma2.it * Claudio Pisa claudio.pisa@clauz.net olsrd-0.6.6.2/lib/mdns/src/000077500000000000000000000000001234304727700153155ustar00rootroot00000000000000olsrd-0.6.6.2/lib/mdns/src/Address.c000066400000000000000000000060471234304727700170550ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "Address.h" /* System includes */ #include /* NULL */ #include /* strcmp */ #include /* assert() */ #include /* struct ip */ #include /* struct udphdr */ /* OLSRD includes */ #include "defs.h" /* ipequal */ #include "olsr_protocol.h" /* OLSRPORT */ /* Plugin includes */ #include "mdns.h" /* BMF_ENCAP_PORT */ #include "NetworkInterfaces.h" /* TBmfInterface */ /* Whether or not to flood local broadcast packets (e.g. packets with IP * destination 192.168.1.255). May be overruled by setting the plugin * parameter "DoLocalBroadcast" to "no" */ //int EnableLocalBroadcast = 1; /* ------------------------------------------------------------------------- * Function : IsMulticast * Description: Check if an IP address is a multicast address * Input : ipAddress * Output : none * Return : true (1) or false (0) * Data Used : none * ------------------------------------------------------------------------- */ int IsMulticast(union olsr_ip_addr *ipAddress) { assert(ipAddress != NULL); return IN_MULTICAST(ntohl(ipAddress->v4.s_addr)); } olsrd-0.6.6.2/lib/mdns/src/Address.h000066400000000000000000000043051234304727700170550ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _MDNS_ADDRESS_H #define _MDNS_ADDRESS_H #include "olsr_types.h" /* olsr_ip_addr */ #include "olsrd_plugin.h" /* union set_plugin_parameter_addon */ #include "interfaces.h" /* struct interface */ #include "list_backport.h" struct TBmfInterface; int IsMulticast(union olsr_ip_addr *ipAddress); #endif /* _MDNS_ADDRESS_H */ olsrd-0.6.6.2/lib/mdns/src/NetworkInterfaces.c000066400000000000000000000704431234304727700211260ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "NetworkInterfaces.h" /* System includes */ #include /* NULL */ #include /* syslog() */ #include /* strerror(), strchr(), strcmp() */ #include /* errno */ #include /* close() */ #include /* ioctl() */ #include /* fcntl() */ #include /* assert() */ #include /* socket(), ifreq, if_indextoname(), if_nametoindex() */ #include /* htons() */ #ifdef __linux__ #include /* ETH_P_IP */ #include /* packet_mreq, PACKET_MR_PROMISC, PACKET_ADD_MEMBERSHIP */ #include /* IFF_TAP */ #endif /* __linux__ */ #include /* struct ip */ #include /* SOL_UDP */ #include /* atoi, malloc */ #include /* strcasecmp */ /* OLSRD includes */ #include "olsr.h" /* OLSR_PRINTF() */ #include "ipcalc.h" #include "defs.h" /* olsr_cnf */ #include "link_set.h" /* get_link_set() */ #include "tc_set.h" /* olsr_lookup_tc_entry(), olsr_lookup_tc_edge() */ #include "net_olsr.h" /* ipequal */ #include "lq_plugin.h" //#include "olsr_ip_prefix_list.h" /* Plugin includes */ #include "Packet.h" /* IFHWADDRLEN */ #include "mdns.h" /* PLUGIN_NAME, MainAddressOf() */ #include "Address.h" /* IsMulticast() */ #include "plugin_util.h" int my_MDNS_TTL = 0; int my_TTL_Check = 1; /* List of network interface objects used by BMF plugin */ struct TBmfInterface *BmfInterfaces = NULL; struct TBmfInterface *LastBmfInterface = NULL; /* Highest-numbered open socket file descriptor. To be used as first * parameter in calls to select(...). */ int HighestSkfd = -1; /* Set of socket file descriptors */ fd_set InputSet; /* ------------------------------------------------------------------------- * Function : CreateCaptureSocket * Description: Create socket for promiscuously capturing multicast IP traffic * Input : ifname - network interface (e.g. "eth0") * Output : none * Return : the socket descriptor ( >= 0), or -1 if an error occurred * Data Used : none * Notes : The socket is a cooked IP packet socket, bound to the specified * network interface * ------------------------------------------------------------------------- */ static int CreateCaptureSocket(const char *ifName) { int ifIndex = if_nametoindex(ifName); struct packet_mreq mreq; struct ifreq req; struct sockaddr_ll bindTo; int skfd = 0; /* Open cooked IP packet socket */ if (olsr_cnf->ip_version == AF_INET) { skfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)); } else { skfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IPV6)); } if (skfd < 0) { BmfPError("socket(PF_PACKET) error"); return -1; } /* Set interface to promiscuous mode */ memset(&mreq, 0, sizeof(struct packet_mreq)); mreq.mr_ifindex = ifIndex; mreq.mr_type = PACKET_MR_PROMISC; if (setsockopt(skfd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { BmfPError("setsockopt(PACKET_MR_PROMISC) error"); close(skfd); return -1; } /* Get hardware (MAC) address */ memset(&req, 0, sizeof(struct ifreq)); strncpy(req.ifr_name, ifName, IFNAMSIZ - 1); req.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ if (ioctl(skfd, SIOCGIFHWADDR, &req) < 0) { BmfPError("error retrieving MAC address"); close(skfd); return -1; } /* Bind the socket to the specified interface */ memset(&bindTo, 0, sizeof(bindTo)); bindTo.sll_family = AF_PACKET; if (olsr_cnf->ip_version == AF_INET) { bindTo.sll_protocol = htons(ETH_P_IP); } else { bindTo.sll_protocol = htons(ETH_P_IPV6); } bindTo.sll_ifindex = ifIndex; memcpy(bindTo.sll_addr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); bindTo.sll_halen = IFHWADDRLEN; if (bind(skfd, (struct sockaddr *)&bindTo, sizeof(bindTo)) < 0) { BmfPError("bind() error"); close(skfd); return -1; } /* Set socket to blocking operation */ if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0) { BmfPError("fcntl() error"); close(skfd); return -1; } //AddDescriptorToInputSet(skfd); add_olsr_socket(skfd, &DoMDNS,NULL, NULL, SP_PR_READ); return skfd; } /* CreateCaptureSocket */ /* ------------------------------------------------------------------------- * Function : CreateRouterElectionSocket * Description: Create socket for capturing router election hello packets * Input : ifname - network interface (e.g. "eth0") * Output : none * Return : the socket descriptor ( >= 0), or -1 if an error occurred * Data Used : none * Notes : The socket is a cooked IP packet socket, bound to the specified * network interface * ------------------------------------------------------------------------- */ static int CreateRouterElectionSocket(const char *ifName) { int ipFamilySetting; int ipProtoSetting; int ipMcLoopSetting; int ipAddMembershipSetting; short int ipPort = htons(5354); struct in_addr ipv4_addr; struct ifreq req; int ifIndex = if_nametoindex(ifName); void * addr; size_t addrSize; union olsr_sockaddr address; int rxSocket = -1; int socketReuseFlagValue = 1; int mcLoopValue = 1; memset(&address, 0, sizeof(address)); if (olsr_cnf->ip_version == AF_INET) { ipFamilySetting = AF_INET; ipProtoSetting = IPPROTO_IP; ipMcLoopSetting = IP_MULTICAST_LOOP; ipAddMembershipSetting = IP_ADD_MEMBERSHIP; address.in4.sin_family = ipFamilySetting; address.in4.sin_addr.s_addr = INADDR_ANY; address.in4.sin_port = ipPort; addr = &address.in4; addrSize = sizeof(struct sockaddr_in); } else { ipFamilySetting = AF_INET6; ipProtoSetting = IPPROTO_IPV6; ipMcLoopSetting = IPV6_MULTICAST_LOOP; ipAddMembershipSetting = IPV6_ADD_MEMBERSHIP; address.in6.sin6_family = ipFamilySetting; address.in6.sin6_addr = in6addr_any; address.in6.sin6_port = ipPort; addr = &address.in6; addrSize = sizeof(struct sockaddr_in6); } /* Create a datagram socket on which to receive. */ errno = 0; rxSocket = socket(ipFamilySetting, SOCK_DGRAM, 0); if (rxSocket < 0) { BmfPError("Could not create a receive socket for interface %s", ifName); goto bail; } /* Enable SO_REUSEADDR to allow multiple applications to receive the same * multicast messages */ errno = 0; if (setsockopt(rxSocket, SOL_SOCKET, SO_REUSEADDR, &socketReuseFlagValue, sizeof(socketReuseFlagValue)) < 0) { BmfPError("Could not set the reuse flag on the receive socket for" " interface %s", ifName); goto bail; } /* Bind to the proper port number with the IP address INADDR_ANY * (INADDR_ANY is really required here, do not change it) */ errno = 0; if (bind(rxSocket, addr, addrSize) < 0) { BmfPError("Could not bind the receive socket for interface" " %s to port %u", ifName, ntohs(ipPort)); goto bail; } /* Enable multicast local loopback */ errno = 0; if (setsockopt(rxSocket, ipProtoSetting, ipMcLoopSetting, &mcLoopValue, sizeof(mcLoopValue)) < 0) { BmfPError("Could not enable multicast loopback on the" " receive socket for interface %s", ifName); goto bail; } /* Join the multicast group on the local interface. Note that this * ADD_MEMBERSHIP option must be called for each local interface over * which the multicast datagrams are to be received. */ if (ipFamilySetting == AF_INET) { static const char * mc4Addr = "224.0.0.2"; struct ip_mreq mc_settings; (void) memset(&mc_settings, 0, sizeof(mc_settings)); if (inet_pton(AF_INET, mc4Addr, &mc_settings.imr_multiaddr.s_addr) != 1) { BmfPError("Could not convert ipv4 multicast address %s", mc4Addr); goto bail; } (void) memset(&req, 0, sizeof(struct ifreq)); strncpy(req.ifr_name, ifName, IFNAMSIZ - 1); req.ifr_name[IFNAMSIZ -1] = '\0'; /* Ensure null termination */ if(ioctl(rxSocket, SIOCGIFADDR, &req)){ BmfPError("Could not get ipv4 address of %s interface", ifName); goto bail; } ipv4_addr = ((struct sockaddr_in *)(void *) &req.ifr_addr)->sin_addr; mc_settings.imr_interface = ipv4_addr; errno = 0; if (setsockopt(rxSocket, ipProtoSetting, ipAddMembershipSetting, &mc_settings, sizeof(mc_settings)) < 0) { BmfPError("Could not subscribe interface %s to the configured" " multicast group", ifName); goto bail; } } else { static const char * mc6Addr = "ff02::2"; struct ipv6_mreq mc6_settings; (void) memset(&mc6_settings, 0, sizeof(mc6_settings)); if (inet_pton(AF_INET6, mc6Addr, &mc6_settings.ipv6mr_multiaddr.s6_addr) != 1) { BmfPError("Could not convert ipv6 multicast address %s", mc6Addr); goto bail; } mc6_settings.ipv6mr_interface = ifIndex; errno = 0; if (setsockopt(rxSocket, ipProtoSetting, ipAddMembershipSetting, &mc6_settings, sizeof(mc6_settings)) < 0) { BmfPError("Could not subscribe interface %s to the configured" " multicast group", ifName); goto bail; } } add_olsr_socket(rxSocket, DoElection, NULL, NULL, SP_PR_READ); return rxSocket; bail: if (rxSocket >= 0) { close(rxSocket); } return -1; } /* CreateRouterElectionSocket */ static int CreateHelloSocket(const char *ifName) { int ipFamilySetting; int ipProtoSetting; int ipMcLoopSetting; int ipMcIfSetting; int ipTtlSetting; short int ipPort = htons(5354); struct in_addr ipv4_addr; struct ifreq req; int ifIndex = if_nametoindex(ifName); void * addr; size_t addrSize; union olsr_sockaddr address; int txSocket = -1; int mcLoopValue = 0; int txTtl = 2; memset(&address, 0, sizeof(address)); if (olsr_cnf->ip_version == AF_INET) { ipFamilySetting = AF_INET; ipProtoSetting = IPPROTO_IP; ipMcLoopSetting = IP_MULTICAST_LOOP; ipMcIfSetting = IP_MULTICAST_IF; ipTtlSetting = IP_MULTICAST_TTL; ifIndex = if_nametoindex(ifName); } else { ipFamilySetting = AF_INET6; ipProtoSetting = IPPROTO_IPV6; ipMcLoopSetting = IPV6_MULTICAST_LOOP; ipMcIfSetting = IPV6_MULTICAST_IF; ipTtlSetting = IPV6_MULTICAST_HOPS; ifIndex = if_nametoindex(ifName); addr = &ifIndex; addrSize = sizeof(ifIndex); } /* Create a datagram socket on which to transmit */ errno = 0; txSocket = socket(ipFamilySetting, SOCK_DGRAM, 0); if (txSocket < 0) { BmfPError("Could not create a transmit socket for interface %s", ifName); goto bail; } if (olsr_cnf->ip_version == AF_INET) { (void) memset(&req, 0, sizeof(struct ifreq)); strncpy(req.ifr_name, ifName, IFNAMSIZ - 1); req.ifr_name[IFNAMSIZ -1] = '\0'; /* Ensure null termination */ if(ioctl(txSocket, SIOCGIFADDR, &req)){ BmfPError("Could not get ipv4 address of %s interface", ifName); goto bail; } ipv4_addr = ((struct sockaddr_in *)(void *) &req.ifr_addr)->sin_addr; address.in4.sin_addr = ipv4_addr; address.in4.sin_family = ipFamilySetting; address.in4.sin_port = ipPort; addr = &address.in4; addrSize = sizeof(struct sockaddr_in); } /* Bind the socket to the desired interface */ errno = 0; if (setsockopt(txSocket, ipProtoSetting, ipMcIfSetting, addr, addrSize) < 0) { BmfPError("Could not set the multicast interface on the" " transmit socket to interface %s", ifName); goto bail; } /* Disable multicast local loopback */ errno = 0; if (setsockopt(txSocket, ipProtoSetting, ipMcLoopSetting, &mcLoopValue, sizeof(mcLoopValue)) < 0) { BmfPError("Could not disable multicast loopback on the" " transmit socket for interface %s", ifName); goto bail; } /* Set the TTL on the socket */ errno = 0; if (setsockopt(txSocket, ipProtoSetting, ipTtlSetting, &txTtl, sizeof(txTtl)) < 0) { BmfPError("Could not set TTL on the transmit socket" " for interface %s", ifName); goto bail; } /* Set the no delay option on the socket */ errno = 0; if (fcntl(txSocket, F_SETFL, O_NDELAY) < 0) { BmfPError("Could not set the no delay option on the" " transmit socket for interface %s", ifName); goto bail; } return txSocket; bail: if (txSocket >= 0) { close(txSocket); } return -1; } /* ------------------------------------------------------------------------- * Function : CreateInterface * Description: Create a new TBmfInterface object and adds it to the global * BmfInterfaces list * Input : ifName - name of the network interface (e.g. "eth0") * : olsrIntf - OLSR interface object of the network interface, or * NULL if the network interface is not OLSR-enabled * Output : none * Return : the number of opened sockets * Data Used : BmfInterfaces, LastBmfInterface * ------------------------------------------------------------------------- */ //FOR MDNS IS ALWAYS CALLED WITH NULL AS SECOND ARG static int CreateInterface(const char *ifName, struct interface *olsrIntf) { int capturingSkfd = -1; int encapsulatingSkfd = -1; int listeningSkfd = -1; int electionSkfd = -1; int helloSkfd = -1; int ioctlSkfd; struct ifreq ifr; int nOpened = 0; struct TBmfInterface *newIf = olsr_malloc(sizeof(struct TBmfInterface), "TBMFInterface (mdns)"); assert(ifName != NULL); if (newIf == NULL) { return 0; } //TODO: assert interface is not talking OLSR /* Create socket for capturing and sending of multicast packets on * non-OLSR interfaces, and on OLSR-interfaces if configured. */ if ((olsrIntf == NULL)) { capturingSkfd = CreateCaptureSocket(ifName); electionSkfd = CreateRouterElectionSocket(ifName); helloSkfd = CreateHelloSocket(ifName); if (capturingSkfd < 0 || electionSkfd < 0 || helloSkfd < 0) { if (capturingSkfd >= 0) { close(capturingSkfd); } if (electionSkfd >= 0) { close(electionSkfd); } if (helloSkfd >= 0) { close(helloSkfd); } free(newIf); return 0; } nOpened++; } /* For ioctl operations on the network interface, use either capturingSkfd * or encapsulatingSkfd, whichever is available */ ioctlSkfd = (capturingSkfd >= 0) ? capturingSkfd : encapsulatingSkfd; /* Retrieve the MAC address of the interface. */ memset(&ifr, 0, sizeof(struct ifreq)); strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1); ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ if (ioctl(ioctlSkfd, SIOCGIFHWADDR, &ifr) < 0) { BmfPError("ioctl(SIOCGIFHWADDR) error for interface \"%s\"", ifName); if (capturingSkfd >= 0) { close(capturingSkfd); } if (electionSkfd >= 0) { close(electionSkfd); } if (helloSkfd >= 0) { close(helloSkfd); } free(newIf); return 0; } /* Copy data into TBmfInterface object */ newIf->capturingSkfd = capturingSkfd; newIf->encapsulatingSkfd = encapsulatingSkfd; newIf->listeningSkfd = listeningSkfd; newIf->electionSkfd = electionSkfd; newIf->helloSkfd = helloSkfd; memcpy(newIf->macAddr, ifr.ifr_hwaddr.sa_data, IFHWADDRLEN); memcpy(newIf->ifName, ifName, IFNAMSIZ); newIf->olsrIntf = olsrIntf; newIf->isActive = 1; //as default the interface is active if (olsrIntf != NULL) { /* For an OLSR-interface, copy the interface address and broadcast * address from the OLSR interface object. Downcast to correct sockaddr * subtype. */ newIf->intAddr.v4 = olsrIntf->int_addr.sin_addr; newIf->broadAddr.v4 = olsrIntf->int_broadaddr.sin_addr; } else { /* For a non-OLSR interface, retrieve the IP address ourselves */ memset(&ifr, 0, sizeof(struct ifreq)); strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1); ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ if (ioctl(ioctlSkfd, SIOCGIFADDR, &ifr) < 0) { BmfPError("ioctl(SIOCGIFADDR) error for interface \"%s\"", ifName); newIf->intAddr.v4.s_addr = inet_addr("0.0.0.0"); } else { /* Downcast to correct sockaddr subtype */ newIf->intAddr.v4 = ((struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifr.ifr_addr))->sin_addr; } /* For a non-OLSR interface, retrieve the IP broadcast address ourselves */ memset(&ifr, 0, sizeof(struct ifreq)); strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1); ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ if (ioctl(ioctlSkfd, SIOCGIFBRDADDR, &ifr) < 0) { BmfPError("ioctl(SIOCGIFBRDADDR) error for interface \"%s\"", ifName); newIf->broadAddr.v4.s_addr = inet_addr("0.0.0.0"); } else { /* Downcast to correct sockaddr subtype */ newIf->broadAddr.v4 = ((struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr))->sin_addr; } } /* Initialize fragment history table */ //memset(&newIf->fragmentHistory, 0, sizeof(newIf->fragmentHistory)); //newIf->nextFragmentHistoryEntry = 0; /* Reset counters */ //newIf->nBmfPacketsRx = 0; //newIf->nBmfPacketsRxDup = 0; //newIf->nBmfPacketsTx = 0; /* Add new TBmfInterface object to global list. OLSR interfaces are * added at the front of the list, non-OLSR interfaces at the back. */ if (BmfInterfaces == NULL) { /* First TBmfInterface object in list */ newIf->next = NULL; BmfInterfaces = newIf; LastBmfInterface = newIf; } else if (olsrIntf != NULL) { /* Add new TBmfInterface object at front of list */ newIf->next = BmfInterfaces; BmfInterfaces = newIf; } else { /* Add new TBmfInterface object at back of list */ newIf->next = NULL; LastBmfInterface->next = newIf; LastBmfInterface = newIf; } //OLSR_PRINTF( // 8, // "%s: opened %d socket%s on %s interface \"%s\"\n", // PLUGIN_NAME_SHORT, // nOpened, // nOpened == 1 ? "" : "s", // olsrIntf != NULL ? "OLSR" : "non-OLSR", // ifName); return nOpened; } /* CreateInterface */ /* ------------------------------------------------------------------------- * Function : CreateBmfNetworkInterfaces * Description: Create a list of TBmfInterface objects, one for each network * interface on which BMF runs * Input : skipThisIntf - network interface to skip, if seen * Output : none * Return : fail (-1) or success (0) * Data Used : none * ------------------------------------------------------------------------- */ int CreateBmfNetworkInterfaces(struct interface *skipThisIntf) { int skfd; struct ifconf ifc; int numreqs = 30; struct ifreq *ifr; int n; int nOpenedSockets = 0; /* Clear input descriptor set */ FD_ZERO(&InputSet); skfd = socket(PF_INET, SOCK_DGRAM, 0); if (skfd < 0) { BmfPError("no inet socket available to retrieve interface list"); return -1; } /* Retrieve the network interface configuration list */ ifc.ifc_buf = NULL; for (;;) { ifc.ifc_len = sizeof(struct ifreq) * numreqs; ifc.ifc_buf = realloc(ifc.ifc_buf, ifc.ifc_len); if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) { BmfPError("ioctl(SIOCGIFCONF) error"); close(skfd); free(ifc.ifc_buf); return -1; } if ((unsigned)ifc.ifc_len == sizeof(struct ifreq) * numreqs) { /* Assume it overflowed; double the space and try again */ numreqs *= 2; assert(numreqs < 1024); continue; /* for (;;) */ } break; /* for (;;) */ } /* for (;;) */ close(skfd); /* For each item in the interface configuration list... */ ifr = ifc.ifc_req; for (n = ifc.ifc_len / sizeof(struct ifreq); --n >= 0; ifr++) { struct interface *olsrIntf; union olsr_ip_addr ipAddr; /* Skip the BMF network interface itself */ //if (strncmp(ifr->ifr_name, EtherTunTapIfName, IFNAMSIZ) == 0) //{ // continue; /* for (n = ...) */ //} /* ...find the OLSR interface structure, if any */ ipAddr.v4 = ((struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifr->ifr_addr))->sin_addr; olsrIntf = if_ifwithaddr(&ipAddr); if (skipThisIntf != NULL && olsrIntf == skipThisIntf) { continue; /* for (n = ...) */ } if (olsrIntf == NULL && !IsNonOlsrBmfIf(ifr->ifr_name)) { /* Interface is neither OLSR interface, nor specified as non-OLSR BMF * interface in the BMF plugin parameter list */ continue; /* for (n = ...) */ } if (!IsNonOlsrBmfIf(ifr->ifr_name)) { //If the interface is not specified in the configuration file then go ahead continue; /* for (n = ...) */ } //TODO: asser if->ifr_name is not talking OLSR //nOpenedSockets += CreateInterface(ifr->ifr_name, olsrIntf); nOpenedSockets += CreateInterface(ifr->ifr_name, NULL); } /* for (n = ...) */ free(ifc.ifc_buf); if (BmfInterfaces == NULL) { //OLSR_PRINTF(1, "%s: could not initialize any network interface\n", PLUGIN_NAME); } else { //OLSR_PRINTF(1, "%s: opened %d sockets\n", PLUGIN_NAME, nOpenedSockets); } return 0; } /* CreateBmfNetworkInterfaces */ /* ------------------------------------------------------------------------- * Function : AddInterface * Description: Add an OLSR-enabled network interface to the list of BMF-enabled * network interfaces * Input : newIntf - network interface to add * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ void AddInterface(struct interface *newIntf) { /* int nOpened; */ assert(newIntf != NULL); /* nOpened = */ (void)CreateInterface(newIntf->int_name, newIntf); //OLSR_PRINTF(1, "%s: opened %d sockets\n", PLUGIN_NAME, nOpened); } /* AddInterface */ /* ------------------------------------------------------------------------- * Function : CloseBmfNetworkInterfaces * Description: Closes every socket on each network interface used by BMF * Input : none * Output : none * Return : none * Data Used : none * Notes : Closes * - the local EtherTunTap interface (e.g. "tun0" or "tap0") * - for each BMF-enabled interface, the socket used for * capturing multicast packets * - for each OLSR-enabled interface, the socket used for * encapsulating packets * Also restores the network state to the situation before BMF * was started. * ------------------------------------------------------------------------- */ void CloseBmfNetworkInterfaces(void) { int nClosed = 0; u_int32_t totalOlsrBmfPacketsRx = 0; u_int32_t totalOlsrBmfPacketsRxDup = 0; u_int32_t totalOlsrBmfPacketsTx = 0; u_int32_t totalNonOlsrBmfPacketsRx = 0; u_int32_t totalNonOlsrBmfPacketsRxDup = 0; u_int32_t totalNonOlsrBmfPacketsTx = 0; /* Close all opened sockets */ struct TBmfInterface *nextBmfIf = BmfInterfaces; while (nextBmfIf != NULL) { struct TBmfInterface *bmfIf = nextBmfIf; nextBmfIf = bmfIf->next; if (bmfIf->capturingSkfd >= 0) { close(bmfIf->capturingSkfd); nClosed++; } if (bmfIf->encapsulatingSkfd >= 0) { close(bmfIf->encapsulatingSkfd); nClosed++; } if (bmfIf->electionSkfd >= 0) { close(bmfIf->electionSkfd); nClosed++; } if (bmfIf->helloSkfd >= 0) { close(bmfIf->helloSkfd); nClosed++; } //OLSR_PRINTF( // 7, // "%s: %s interface \"%s\": RX pkts %u (%u dups); TX pkts %u\n", // PLUGIN_NAME_SHORT, // bmfIf->olsrIntf != NULL ? "OLSR" : "non-OLSR", // bmfIf->ifName, // bmfIf->nBmfPacketsRx, // bmfIf->nBmfPacketsRxDup, // bmfIf->nBmfPacketsTx); //OLSR_PRINTF( // 1, // "%s: closed %s interface \"%s\"\n", // PLUGIN_NAME_SHORT, // bmfIf->olsrIntf != NULL ? "OLSR" : "non-OLSR", // bmfIf->ifName); /* Add totals */ if (bmfIf->olsrIntf != NULL) { totalOlsrBmfPacketsRx += bmfIf->nBmfPacketsRx; totalOlsrBmfPacketsRxDup += bmfIf->nBmfPacketsRxDup; totalOlsrBmfPacketsTx += bmfIf->nBmfPacketsTx; } else { totalNonOlsrBmfPacketsRx += bmfIf->nBmfPacketsRx; totalNonOlsrBmfPacketsRxDup += bmfIf->nBmfPacketsRxDup; totalNonOlsrBmfPacketsTx += bmfIf->nBmfPacketsTx; } free(bmfIf); } /* while */ BmfInterfaces = NULL; //OLSR_PRINTF(1, "%s: closed %d sockets\n", PLUGIN_NAME_SHORT, nClosed); } /* CloseBmfNetworkInterfaces */ #define MAX_NON_OLSR_IFS 32 static char NonOlsrIfNames[MAX_NON_OLSR_IFS][IFNAMSIZ]; static int nNonOlsrIfs = 0; /* ------------------------------------------------------------------------- * Function : AddNonOlsrBmfIf * Description: Add an non-OLSR enabled network interface to the list of BMF-enabled * network interfaces * Input : ifName - network interface (e.g. "eth0") * data - not used * addon - not used * Output : none * Return : success (0) or fail (1) * Data Used : NonOlsrIfNames * ------------------------------------------------------------------------- */ int AddNonOlsrBmfIf(const char *ifName, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { assert(ifName != NULL); if (nNonOlsrIfs >= MAX_NON_OLSR_IFS) { //OLSR_PRINTF( // 1, // "%s: too many non-OLSR interfaces specified, maximum is %d\n", // PLUGIN_NAME, // MAX_NON_OLSR_IFS); return 1; } strncpy(NonOlsrIfNames[nNonOlsrIfs], ifName, IFNAMSIZ - 1); NonOlsrIfNames[nNonOlsrIfs][IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ nNonOlsrIfs++; return 0; } /* AddNonOlsrBmfIf */ int set_TTL_Check(const char *TTL_Check, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { assert(TTL_Check!= NULL); set_plugin_boolean(TTL_Check, &my_TTL_Check, addon); return 0; } /* Set TTL Check */ int set_MDNS_TTL(const char *MDNS_TTL, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { assert(MDNS_TTL!= NULL); my_MDNS_TTL = atoi(MDNS_TTL); return 0; } /* set_MDNS_TTL */ /* ------------------------------------------------------------------------- * Function : IsNonOlsrBmfIf * Description: Checks if a network interface is OLSR-enabled * Input : ifName - network interface (e.g. "eth0") * Output : none * Return : true (1) or false (0) * Data Used : NonOlsrIfNames * ------------------------------------------------------------------------- */ int IsNonOlsrBmfIf(const char *ifName) { int i; assert(ifName != NULL); for (i = 0; i < nNonOlsrIfs; i++) { if (strncmp(NonOlsrIfNames[i], ifName, IFNAMSIZ) == 0) return 1; } return 0; } /* IsNonOlsrBmfIf */ olsrd-0.6.6.2/lib/mdns/src/NetworkInterfaces.h000066400000000000000000000137431234304727700211330ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _MDNS_NETWORKINTERFACES_H #define _MDNS_NETWORKINTERFACES_H /* System includes */ #include /* struct in_addr */ /* OLSR includes */ #include "olsr_types.h" /* olsr_ip_addr */ #include "olsrd_plugin.h" /* union set_plugin_parameter_addon */ /* Plugin includes */ #include "Packet.h" /* IFHWADDRLEN */ #include "mdns.h" /* Size of buffer in which packets are received */ #define BMF_BUFFER_SIZE 2048 #define HELLO_BUFFER_SIZE 2048 struct TBmfInterface { /* File descriptor of raw packet socket, used for capturing multicast packets */ int capturingSkfd; /* File descriptor of UDP (datagram) socket for encapsulated multicast packets. * Only used for OLSR-enabled interfaces; set to -1 if interface is not OLSR-enabled. */ int encapsulatingSkfd; /* File descriptor of UDP packet socket, used for listening to encapsulation packets. * Used only when PlParam "BmfMechanism" is set to "UnicastPromiscuous". */ int listeningSkfd; /* File descriptor of UDP packet socket, used for listening router election hello * packets */ int electionSkfd; /* File descriptor of UDP packet socket, used for sending router election hello * packets */ int helloSkfd; /* Used to check if the router is master on the selected interface */ int isActive; unsigned char macAddr[IFHWADDRLEN]; char ifName[IFNAMSIZ]; /* OLSRs idea of this network interface. NULL if this interface is not * OLSR-enabled. */ struct interface *olsrIntf; /* IP address of this network interface */ union olsr_ip_addr intAddr; /* Broadcast address of this network interface */ union olsr_ip_addr broadAddr; #define FRAGMENT_HISTORY_SIZE 10 struct TFragmentHistory { u_int16_t ipId; u_int8_t ipProto; struct in_addr ipSrc; struct in_addr ipDst; } fragmentHistory[FRAGMENT_HISTORY_SIZE]; int nextFragmentHistoryEntry; /* Number of received and transmitted BMF packets on this interface */ u_int32_t nBmfPacketsRx; u_int32_t nBmfPacketsRxDup; u_int32_t nBmfPacketsTx; /* Next element in list */ struct TBmfInterface *next; }; extern struct TBmfInterface *BmfInterfaces; extern int my_MDNS_TTL; extern int my_TTL_Check; extern int HighestSkfd; extern fd_set InputSet; extern int EtherTunTapFd; extern char EtherTunTapIfName[]; /* 10.255.255.253 in host byte order */ #define ETHERTUNTAPDEFAULTIP 0x0AFFFFFD extern u_int32_t EtherTunTapIp; extern u_int32_t EtherTunTapIpMask; extern u_int32_t EtherTunTapIpBroadcast; enum TBmfMechanism { BM_BROADCAST = 0, BM_UNICAST_PROMISCUOUS }; extern enum TBmfMechanism BmfMechanism; int SetBmfInterfaceName(const char *ifname, void *data, set_plugin_parameter_addon addon); int SetBmfInterfaceIp(const char *ip, void *data, set_plugin_parameter_addon addon); int SetCapturePacketsOnOlsrInterfaces(const char *enable, void *data, set_plugin_parameter_addon addon); int SetBmfMechanism(const char *mechanism, void *data, set_plugin_parameter_addon addon); int DeactivateSpoofFilter(void); void RestoreSpoofFilter(void); #define MAX_UNICAST_NEIGHBORS 10 struct TBestNeighbors { struct link_entry *links[MAX_UNICAST_NEIGHBORS]; }; void FindNeighbors(struct TBestNeighbors *neighbors, struct link_entry **bestNeighbor, struct TBmfInterface *intf, union olsr_ip_addr *source, union olsr_ip_addr *forwardedBy, union olsr_ip_addr *forwardedTo, int *nPossibleNeighbors); int CreateBmfNetworkInterfaces(struct interface *skipThisIntf); void AddInterface(struct interface *newIntf); void CloseBmfNetworkInterfaces(void); int AddNonOlsrBmfIf(const char *ifName, void *data, set_plugin_parameter_addon addon); int set_TTL_Check(const char *TTL_Check, void *data, set_plugin_parameter_addon addon); int set_MDNS_TTL(const char *MDNS_TTL, void *data, set_plugin_parameter_addon addon); int IsNonOlsrBmfIf(const char *ifName); void CheckAndUpdateLocalBroadcast(unsigned char *ipPacket, union olsr_ip_addr *broadAddr); void AddMulticastRoute(void); void DeleteMulticastRoute(void); #endif /* _MDNS_NETWORKINTERFACES_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/mdns/src/Packet.c000066400000000000000000000204571234304727700167000ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "Packet.h" /* System includes */ #include /* NULL */ #include /* assert() */ #include /* memcpy() */ #include /* u_int8_t, u_int16_t, u_int32_t */ #include /* ntohs(), htons() */ #include /* struct iphdr */ #include "defs.h" /* ARM_NOWARN_ALIGN */ /* ------------------------------------------------------------------------- * Function : IsIpFragment * Description: Check if an IP packet is an IP fragment * Input : ipPacket - the IP packet * Output : none * Return : true (1) or false (0) * Data Used : none * ------------------------------------------------------------------------- */ int IsIpFragment(unsigned char *ipPacket) { struct ip *iph; assert(ipPacket != NULL); iph = (struct ip *)ARM_NOWARN_ALIGN(ipPacket); if ((ntohs(iph->ip_off) & IP_OFFMASK) != 0) { return 1; } return 0; } /* IsIpFragment */ /* ------------------------------------------------------------------------- * Function : GetIpTotalLength * Description: Retrieve the total length of the IP packet (in bytes) of * an IP packet * Input : ipPacket - the IP packet * Output : none * Return : IP packet length * Data Used : none * ------------------------------------------------------------------------- */ u_int16_t GetIpTotalLength(unsigned char *ipPacket) { struct iphdr *iph; assert(ipPacket != NULL); iph = (struct iphdr *)ARM_NOWARN_ALIGN(ipPacket); return ntohs(iph->tot_len); } /* GetIpTotalLength */ /* ------------------------------------------------------------------------- * Function : GetIpHeaderLength * Description: Retrieve the IP header length (in bytes) of an IP packet * Input : ipPacket - the IP packet * Output : none * Return : IP header length * Data Used : none * ------------------------------------------------------------------------- */ unsigned int GetIpHeaderLength(unsigned char *ipPacket) { struct iphdr *iph; assert(ipPacket != NULL); iph = (struct iphdr *)ARM_NOWARN_ALIGN(ipPacket); return iph->ihl << 2; } /* GetIpHeaderLength */ /* ------------------------------------------------------------------------- * Function : GetTtl * Description: Retrieve the TTL (Time To Live) value from the IP header of * an IP packet * Input : ipPacket - the IP packet * Output : none * Return : TTL value * Data Used : none * ------------------------------------------------------------------------- */ u_int8_t GetTtl(unsigned char *ipPacket) { struct iphdr *iph; assert(ipPacket != NULL); iph = (struct iphdr *)ARM_NOWARN_ALIGN(ipPacket); return iph->ttl; } /* GetTtl */ /* ------------------------------------------------------------------------- * Function : SaveTtlAndChecksum * Description: Save the TTL (Time To Live) value and IP checksum as found in * the IP header of an IP packet * Input : ipPacket - the IP packet * Output : sttl - the TTL and checksum values * Return : none * Data Used : none * ------------------------------------------------------------------------- */ void SaveTtlAndChecksum(unsigned char *ipPacket, struct TSaveTtl *sttl) { struct iphdr *iph; assert(ipPacket != NULL && sttl != NULL); iph = (struct iphdr *)ARM_NOWARN_ALIGN(ipPacket); sttl->ttl = iph->ttl; sttl->check = ntohs(iph->check); } /* SaveTtlAndChecksum */ /* ------------------------------------------------------------------------- * Function : RestoreTtlAndChecksum * Description: Restore the TTL (Time To Live) value and IP checksum in * the IP header of an IP packet * Input : ipPacket - the IP packet * sttl - the TTL and checksum values * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ void RestoreTtlAndChecksum(unsigned char *ipPacket, struct TSaveTtl *sttl) { struct iphdr *iph; assert(ipPacket != NULL && sttl != NULL); iph = (struct iphdr *)ARM_NOWARN_ALIGN(ipPacket); iph->ttl = sttl->ttl; iph->check = htons(sttl->check); } /* RestoreTtlAndChecksum */ /* ------------------------------------------------------------------------- * Function : DecreaseTtlAndUpdateHeaderChecksum * Description: For an IP packet, decrement the TTL value and update the IP header * checksum accordingly. * Input : ipPacket - the IP packet * Output : none * Return : none * Data Used : none * Notes : See also RFC1141 * ------------------------------------------------------------------------- */ void DecreaseTtlAndUpdateHeaderChecksum(unsigned char *ipPacket) { struct iphdr *iph; u_int32_t sum; assert(ipPacket != NULL); iph = (struct iphdr *)ARM_NOWARN_ALIGN(ipPacket); iph->ttl--; /* decrement ttl */ sum = ntohs(iph->check) + 0x100; /* increment checksum high byte */ iph->check = htons(sum + (sum >> 16)); /* add carry */ } /* DecreaseTtlAndUpdateHeaderChecksum */ /* ------------------------------------------------------------------------- * Function : GetIpHeader * Description: Retrieve the IP header from BMF encapsulation UDP data * Input : encapsulationUdpData - the encapsulation UDP data * Output : none * Return : IP header * Data Used : none * ------------------------------------------------------------------------- */ struct ip * GetIpHeader(unsigned char *encapsulationUdpData) { return (struct ip *)ARM_NOWARN_ALIGN(encapsulationUdpData + ENCAP_HDR_LEN); } /* GetIpHeader */ /* ------------------------------------------------------------------------- * Function : GetIpPacket * Description: Retrieve the IP packet from BMF encapsulation UDP data * Input : encapsulationUdpData - the encapsulation UDP data * Output : none * Return : The IP packet * Data Used : none * ------------------------------------------------------------------------- */ unsigned char * GetIpPacket(unsigned char *encapsulationUdpData) { return encapsulationUdpData + ENCAP_HDR_LEN; } /* GetIpPacket */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/mdns/src/Packet.h000066400000000000000000000062351234304727700167030ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _MDNS_PACKET_H #define _MDNS_PACKET_H /* System includes */ #include /* IFNAMSIZ, IFHWADDRLEN */ #include /* u_int8_t, u_int16_t */ /* BMF-encapsulated packets are Ethernet-IP-UDP packets, which start * with a 8-bytes BMF header (struct TEncapHeader), followed by the * encapsulated Ethernet-IP packet itself */ struct TEncapHeader { /* Use a standard Type-Length-Value (TLV) element */ u_int8_t type; u_int8_t len; u_int16_t reserved; /* Always 0 */ u_int32_t crc32; } __attribute__ ((__packed__)); #define ENCAP_HDR_LEN ((int)sizeof(struct TEncapHeader)) #define BMF_ENCAP_TYPE 1 #define BMF_ENCAP_LEN 6 struct TSaveTtl { u_int8_t ttl; u_int16_t check; } __attribute__ ((__packed__)); int IsIpFragment(unsigned char *ipPacket); u_int16_t GetIpTotalLength(unsigned char *ipPacket); unsigned int GetIpHeaderLength(unsigned char *ipPacket); u_int8_t GetTtl(unsigned char *ipPacket); void SaveTtlAndChecksum(unsigned char *ipPacket, struct TSaveTtl *sttl); void RestoreTtlAndChecksum(unsigned char *ipPacket, struct TSaveTtl *sttl); void DecreaseTtlAndUpdateHeaderChecksum(unsigned char *ipPacket); struct ip *GetIpHeader(unsigned char *encapsulationUdpData); unsigned char *GetIpPacket(unsigned char *encapsulationUdpData); #endif /* _MDNS_PACKET_H */ olsrd-0.6.6.2/lib/mdns/src/RouterElection.c000066400000000000000000000205341234304727700204300ustar00rootroot00000000000000/* System includes */ #include /* NULL */ #include /* ssize_t */ #include /* strerror() */ #include /* va_list, va_start, va_end */ #include /* errno */ #include /* assert() */ #include /* ETH_P_IP */ #include /* struct sockaddr_ll, PACKET_MULTICAST */ #include /* sigset_t, sigfillset(), sigdelset(), SIGINT */ #include /* struct ip */ #include /* struct udphdr */ #include /* close() */ #include #include /* OLSRD includes */ #include "plugin_util.h" /* set_plugin_int */ #include "defs.h" /* olsr_cnf, //OLSR_PRINTF */ #include "ipcalc.h" #include "olsr.h" /* //OLSR_PRINTF */ #include "mid_set.h" /* mid_lookup_main_addr() */ #include "link_set.h" /* get_best_link_to_neighbor() */ #include "net_olsr.h" /* ipequal */ #include "hna_set.h" /* plugin includes */ #include "NetworkInterfaces.h" /* TBmfInterface, CreateBmfNetworkInterfaces(), CloseBmfNetworkInterfaces() */ #include "Address.h" /* IsMulticast() */ #include "Packet.h" /* ENCAP_HDR_LEN, BMF_ENCAP_TYPE, BMF_ENCAP_LEN etc. */ #include "list_backport.h" #include "RouterElection.h" #include "mdns.h" struct RtElHelloPkt *hello; uint8_t NETWORK_ID; union olsr_ip_addr ROUTER_ID; //List for routers struct list_entity ListOfRouter; #define ROUTER_ELECTION_ENTRIES(nr, iterator) listbackport_for_each_element_safe(&ListOfRouter, nr, list, iterator) int ParseElectionPacket (struct RtElHelloPkt *rcvPkt, struct RouterListEntry *listEntry, int skfd){ OLSR_PRINTF(1, "parsing ipv4 packet \n"); listEntry->ttl = ENTRYTTL; listEntry->network_id = rcvPkt->network_id; listbackport_init_node(&listEntry->list); listEntry->skfd = skfd; (void) memcpy(&listEntry->router_id, &rcvPkt->router_id.v4, sizeof(struct in_addr)); //Need to insert an address validity check? return 1; } int ParseElectionPacket6 (struct RtElHelloPkt *rcvPkt, struct RouterListEntry6 *listEntry6, int skfd){ OLSR_PRINTF(1, "parsing ipv6 packet \n"); listEntry6->ttl = ENTRYTTL; listEntry6->network_id = rcvPkt->network_id; listbackport_init_node(&listEntry6->list); listEntry6->skfd = skfd; (void) memcpy(&listEntry6->router_id, &rcvPkt->router_id.v6, sizeof(struct in6_addr));//Need to insert an address validity check? return 1; } int UpdateRouterList (struct RouterListEntry *listEntry){ struct RouterListEntry *tmp, *iterator; int exist = 0, status = 0; if (olsr_cnf->ip_version == AF_INET6) //mdns plugin is running in ipv4, discard ipv6 return 0; ROUTER_ELECTION_ENTRIES(tmp, iterator) { OLSR_PRINTF(1,"inspecting entry"); if((tmp->network_id == listEntry->network_id) && (tmp->skfd == listEntry->skfd) && (memcmp(&listEntry->router_id, &tmp->router_id, sizeof(struct in_addr)) == 0)){ exist = 1; tmp->ttl = listEntry->ttl; status = 1; } } if (exist == 0) listbackport_add_tail(&ListOfRouter, &(listEntry->list)); return status; } int UpdateRouterList6 (struct RouterListEntry6 *listEntry6){ struct RouterListEntry6 *tmp, *iterator; int exist = 0, status = 0; if (olsr_cnf->ip_version == AF_INET) //mdns plugin is running in ipv6, discard ipv4 return 0; ROUTER_ELECTION_ENTRIES(tmp, iterator) { if((tmp->network_id == listEntry6->network_id) && (tmp->skfd == listEntry6->skfd) && (memcmp(&listEntry6->router_id, &tmp->router_id, sizeof(struct in6_addr))) == 0){ exist = 1; tmp->ttl = listEntry6->ttl; status = 1; } } if (exist == 0) listbackport_add_tail(&ListOfRouter, &(listEntry6->list)); return status; } void helloTimer (void *foo __attribute__ ((unused))){ struct TBmfInterface *walker; struct sockaddr_in dest; struct sockaddr_in6 dest6; OLSR_PRINTF(1,"hello start \n"); for (walker = BmfInterfaces; walker != NULL; walker = walker->next) { if (olsr_cnf->ip_version == AF_INET) { memset((char *) &dest, 0, sizeof(dest)); dest.sin_family = AF_INET; dest.sin_addr.s_addr = inet_addr("224.0.0.2"); dest.sin_port = htons(5354); OLSR_PRINTF(1,"hello running \n"); if (sendto(walker->helloSkfd, (const char * ) hello, sizeof(struct RtElHelloPkt), 0, (struct sockaddr *)&dest, sizeof(dest)) < 0) { BmfPError("Could not send to interface %s", walker->olsrIntf->int_name); } } else{ memset((char *) &dest6, 0, sizeof(dest6)); dest6.sin6_family = AF_INET6; (void) inet_pton(AF_INET6, "ff02::2", &dest6.sin6_addr); dest6.sin6_port = htons(5354); OLSR_PRINTF(1,"hello running \n"); if (sendto(walker->helloSkfd, (const char * ) hello, sizeof(struct RtElHelloPkt), 0, (struct sockaddr *)&dest6, sizeof(dest6)) < 0) { BmfPError("Could not send to interface %s", walker->olsrIntf->int_name); } } } return; } void electTimer (void *foo __attribute__ ((unused))){ struct TBmfInterface *walker; struct RouterListEntry *tmp, *iterator; struct RouterListEntry6 *tmp6, *iterator6; OLSR_PRINTF(1,"elect start \n"); for(walker = BmfInterfaces; walker != NULL; walker = walker->next){ if (listbackport_is_empty(&ListOfRouter)){ walker->isActive = 1; OLSR_PRINTF(1,"elect empty \n"); continue; } walker->isActive = 1; if (olsr_cnf->ip_version == AF_INET) { ROUTER_ELECTION_ENTRIES(tmp, iterator){ OLSR_PRINTF(1,"inspecting element \n"); if(tmp->network_id == NETWORK_ID) if(tmp->skfd == walker->electionSkfd) if(memcmp(&tmp->router_id, &ROUTER_ID.v4, sizeof(struct in_addr)) < 0) walker->isActive = 0; OLSR_PRINTF(1,"confrontation done \n"); tmp->ttl = ((tmp->ttl)- 1); if(tmp->ttl <= 0){ listbackport_remove(&tmp->list); free(tmp); } OLSR_PRINTF(1,"inspect finish \n"); } } else{ ROUTER_ELECTION_ENTRIES(tmp6, iterator6){ if(tmp6->network_id == NETWORK_ID) if(tmp6->skfd == walker->electionSkfd) if(memcmp(&tmp6->router_id, &ROUTER_ID.v6, sizeof(struct in6_addr)) < 0) walker->isActive = 0; tmp6->ttl = ((tmp6->ttl)- 1); if(tmp6->ttl <= 0){ listbackport_remove(&tmp6->list); free(tmp6); } } } OLSR_PRINTF(1,"elect finish \n"); } return; } void initTimer (void *foo __attribute__ ((unused))){ listbackport_init_head(&ListOfRouter); NETWORK_ID = (uint8_t) 1; //Default Network id OLSR_PRINTF(1,"Initialization \n"); memcpy(&ROUTER_ID, &olsr_cnf->main_addr, sizeof(union olsr_ip_addr)); hello = (struct RtElHelloPkt *) malloc(sizeof(struct RtElHelloPkt)); OLSR_PRINTF(1,"initialization running step 1\n"); memcpy(hello->head, "$REP", 4); if(olsr_cnf->ip_version == AF_INET) hello->ipFamily = AF_INET; else hello->ipFamily = AF_INET6; hello->network_id = NETWORK_ID; memcpy(&hello->router_id, &ROUTER_ID, sizeof(union olsr_ip_addr)); OLSR_PRINTF(1,"initialization end\n"); return; } int set_Network_ID(const char *Network_ID, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { int temp; assert(Network_ID!= NULL); set_plugin_int(Network_ID, &temp, addon); NETWORK_ID = (uint8_t) temp; return 0; } /* Set Network ID */ int InitRouterList(void *foo __attribute__ ((unused))){ struct olsr_cookie_info *RouterElectionTimerCookie = NULL; struct olsr_cookie_info *HelloTimerCookie = NULL; struct olsr_cookie_info *InitCookie = NULL; RouterElectionTimerCookie = olsr_alloc_cookie("Router Election", OLSR_COOKIE_TYPE_TIMER); HelloTimerCookie = olsr_alloc_cookie("Hello Packet", OLSR_COOKIE_TYPE_TIMER); InitCookie = olsr_alloc_cookie("Init", OLSR_COOKIE_TYPE_TIMER); olsr_start_timer((unsigned int) INIT_TIMER * MSEC_PER_SEC, 0, OLSR_TIMER_ONESHOT, initTimer, NULL, InitCookie); olsr_start_timer((unsigned int) HELLO_TIMER * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, helloTimer, NULL, HelloTimerCookie); olsr_start_timer((unsigned int) ELECTION_TIMER * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, electTimer, NULL, RouterElectionTimerCookie); return 0; } olsrd-0.6.6.2/lib/mdns/src/RouterElection.h000066400000000000000000000025061234304727700204340ustar00rootroot00000000000000#ifndef _ROUTER_ELECTION_H_ #define _ROUTER_ELECTION_H_ #include #define ELECTION_TIMER 15 #define HELLO_TIMER 20 #define INIT_TIMER 1 #define ENTRYTTL 10 struct RtElHelloPkt{ char head[4]; //"$REP" int ipFamily; union olsr_ip_addr router_id; uint8_t network_id; } __attribute__((__packed__)); struct RouterListEntry{ struct in_addr router_id; uint8_t network_id; int ttl; int skfd; struct list_entity list; }; struct RouterListEntry6{ struct in6_addr router_id; uint8_t network_id; int ttl; int skfd; struct list_entity list; }; int UpdateRouterList (struct RouterListEntry *listEntry); //update router list int UpdateRouterList6 (struct RouterListEntry6 *listEntry6); int ParseElectionPacket (struct RtElHelloPkt *rcvPkt, struct RouterListEntry *listEntry, int skfd); //used to parse a received int ParseElectionPacket6 (struct RtElHelloPkt *rcvPkt, struct RouterListEntry6 *listEntry6, int skfd); //packet into a list entry int InitRouterList (void *foo __attribute__ ((unused))); void helloTimer (void *foo __attribute__ ((unused))); void electTimer (void *foo __attribute__ ((unused))); void initTimer (void *foo __attribute__ ((unused))); int set_Network_ID(const char *Network_ID, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))); #endif olsrd-0.6.6.2/lib/mdns/src/container_of.h000066400000000000000000000057341234304727700201450ustar00rootroot00000000000000/* * PacketBB handler library (see RFC 5444) * Copyright (c) 2010 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org/git for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. */ #ifndef CONTAINER_OF_H_ #define CONTAINER_OF_H_ #include /* allow compilation with c99 mode */ #ifndef typeof #define typeof(x) __typeof__(x) #endif /** * casts an embedded node of a list/tree into the surrounding struct * this macro returns bad results if ptr is NULL * @param ptr pointer to node * @param type data type of surrounding struct * @param member name of node inside struct * @return pointer to surrounding struct */ #define container_of(ptr, type, member) ((type *) (((size_t) ptr) - offsetof(type, member) )) /** * Helper function for NULL safe container_of macro */ static inline void * __container_of_if_notnull(void *ptr, size_t offset) { return ptr == NULL ? NULL : (((char *)ptr) - offset); } /** * casts an embedded node of a list/tree into the surrounding struct * this macro returns bad results if ptr is NULL * @param ptr pointer to node * @param type data type of surrounding struct * @param member name of node inside struct * @return pointer to surrounding struct */ #define container_of_if_notnull(ptr, type, member) ((type *)__container_of_if_notnull(ptr, offsetof(type, member))) #endif /* CONTAINER_OF_H_ */ olsrd-0.6.6.2/lib/mdns/src/list_backport.h000066400000000000000000000446711234304727700203420ustar00rootroot00000000000000/* * PacketBB handler library (see RFC 5444) * Copyright (c) 2010 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org/git for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. */ #ifndef LISTBACKPORT_H_ #define LISTBACKPORT_H_ #include #include #include "container_of.h" /** * this struct is used as list head and list elements. * the list-nodes and the list-head contain two rings of * pointers (one forward, one backward), the first/last node * have a link to the head, no NULL element. */ struct list_entity { /** * Pointer to next element in list or to list head if last element */ struct list_entity *next; /** * Pointer to previous element in list or list head if first element */ struct list_entity *prev; }; /** * initialize a list-head * @param pointer to list-head */ static inline void listbackport_init_head(struct list_entity *head) { head->next = head->prev = head; } /** * initialize a list-node * @param pointer to list-node */ static inline void listbackport_init_node(struct list_entity *entity) { entity->next = entity->prev = NULL; } /** * internal function to add a new node between two other nodes. * @param prev node before the insertion point * @param next node after the insertion point * @param new node which will be added to the list between 'prev' and 'next' */ static inline void __listbackport_add(struct list_entity *prev, struct list_entity *next, struct list_entity *new) { new->next = next; new->prev = prev; next->prev = new; prev->next = new; } /** * adds a node at the beginning of a list * @param head pointer to list head * @param new node which will be added to the list */ static inline void listbackport_add_head(struct list_entity *head, struct list_entity *new) { __listbackport_add(head, head->next, new); } /** * adds a node at the end of a list * @param head pointer to list head * @param new node which will be added to the list */ static inline void listbackport_add_tail(struct list_entity *head, struct list_entity *new) { __listbackport_add(head->prev, head, new); } /** * adds a node before another node * @param before reference node in the list * @param new node which will be added to the list */ static inline void listbackport_add_before(struct list_entity *before, struct list_entity *new) { __listbackport_add(before->prev, before, new); } /** * adds a node after another node * @param before reference node in the list * @param new node which will be added to the list */ static inline void listbackport_add_after(struct list_entity *after, struct list_entity *new) { __listbackport_add(after, after->next, new); } /** * internal function that removes the nodes between two other nodes. * @param prev node before the removed part of the list * @param next node after the removed part of the list */ static inline void __listbackport_remove(struct list_entity *prev, struct list_entity *next) { prev->next = next; next->prev = prev; } /** * removes a node from a list and clears node pointers * @param entity node to remove from the list */ static inline void listbackport_remove(struct list_entity *entity) { __listbackport_remove(entity->prev, entity->next); entity->prev = entity->next = NULL; } /** * checks if list is empty * @param head pointer to list head * @return true if list is empty, false otherwise */ static inline bool listbackport_is_empty(struct list_entity *head) { return head->next == head && head->prev == head; } /** * checks if node has been added to a list * @param node pointer to node * @return true if both pointers of the node are initialized, * false otherwise */ static inline bool listbackport_node_added(struct list_entity *node) { return node->next != NULL && node->prev != NULL; } /** * checks if a node is the first element of a list * @param head pointer to list head * @param entity pointer to node * @return true if node is first element of list, false otherwise */ static inline bool listbackport_is_first(const struct list_entity *head, const struct list_entity *entity) { return head->next == entity; } /** * checks if node is the last element of a list * @param head pointer to list head * @param entity pointer to node * @return true if node is last element of list, false otherwise */ static inline bool listbackport_is_last(const struct list_entity *head, const struct list_entity *entity) { return head->prev == entity; } /** * Merge two lists and clear the second head * @param add_to head of the list which will contain all elements * @param remove_from head of the list which elements will be added after the elements * of the first one */ static inline void listbackport_merge(struct list_entity *add_to, struct list_entity *remove_from) { if (listbackport_is_empty(remove_from)) { return; } add_to->next->prev = remove_from->prev; remove_from->prev->next = add_to->next; add_to->next = remove_from->next; remove_from->next->prev = add_to; listbackport_init_head(remove_from); } /** * @param head pointer to list-head * @param element pointer to a node element * (don't need to be initialized) * @param listbackport_member name of the list_entity element inside the * larger struct * @return pointer to the first element of the list * (automatically converted to type 'element') */ #define listbackport_first_element(head, element, listbackport_member) \ container_of((head)->next, typeof(*(element)), listbackport_member) /** * @param head pointer to list-head * @param element pointer to a node element * (don't need to be initialized) * @param listbackport_member name of the list_entity element inside the * larger struct * @return pointer to the last element of the list * (automatically converted to type 'element') */ #define listbackport_last_element(head, element, listbackport_member) \ container_of((head)->prev, typeof(*(element)), listbackport_member) /** * This function must not be called for the last element of * a list * * @param element pointer to a node of the list * @param listbackport_member name of the list_entity element inside the * larger struct * @return pointer to the node after 'element' * (automatically converted to type 'element') */ #define listbackport_next_element(element, listbackport_member) \ container_of((&(element)->listbackport_member)->next, typeof(*(element)), listbackport_member) /** * This function must not be called for the first element of * a list * * @param element pointer to a node of the list * @param listbackport_member name of the list_entity element inside the * larger struct * @return pointer to the node before 'element' * (automatically converted to type 'element') */ #define listbackport_prev_element(element, listbackport_member) \ container_of((&(element)->listbackport_member)->prev, typeof(*(element)), listbackport_member) /** * Loop over a block of elements of a list, used similar to a for() command. * This loop should not be used if elements are removed from the list during * the loop. * * @param first_element first element of loop * @param last_element last element of loop * @param element iterator pointer to list element struct * @param listbackport_member name of list_entity within list element struct */ #define listbackport_for_element_range(first_element, last_element, element, listbackport_member) \ for (element = (first_element); \ element->listbackport_member.prev != &(last_element)->listbackport_member; \ element = listbackport_next_element(element, listbackport_member)) /** * Loop over a block of elements of a list backwards, used similar to a for() command. * This loop should not be used if elements are removed from the list during * the loop. * * @param first_element first element of range (will be last returned by the loop) * @param last_element last element of range (will be first returned by the loop) * @param element iterator pointer to list element struct * @param listbackport_member name of list_entity within list element struct */ #define listbackport_for_element_range_reverse(first_element, last_element, element, listbackport_member) \ for (element = (last_element); \ element->listbackport_member.next != &(first_element)->listbackport_member; \ element = listbackport_prev_element(element, listbackport_member)) /** * Loop over all elements of a list, used similar to a for() command. * This loop should not be used if elements are removed from the list during * the loop. * * @param head pointer to list-head * @param element pointer to a node of the list, this element will * contain the current node of the list during the loop * @param listbackport_member name of the list_entity element inside the * larger struct */ #define listbackport_for_each_element(head, element, listbackport_member) \ listbackport_for_element_range(listbackport_first_element(head, element, listbackport_member), \ listbackport_last_element(head, element, listbackport_member), \ element, listbackport_member) /** * Loop over all elements of a list backwards, used similar to a for() command. * This loop should not be used if elements are removed from the list during * the loop. * * @param head pointer to list-head * @param element pointer to a node of the list, this element will * contain the current node of the list during the loop * @param listbackport_member name of the list_entity element inside the * larger struct */ #define listbackport_for_each_element_reverse(head, element, listbackport_member) \ listbackport_for_element_range_reverse(listbackport_first_element(head, element, listbackport_member), \ listbackport_last_element(head, element, listbackport_member), \ element, listbackport_member) /** * Loop over a block of elements of a list, used similar to a for() command. * This loop should not be used if elements are removed from the list during * the loop. * The loop runs from the element 'first' to the end of the list. * * @param head pointer to head of list * @param first pointer to first element of loop * @param element pointer to a node of the list, this element will * contain the current node of the list during the loop * @param listbackport_member name of the list_entity element inside the * larger struct */ #define listbackport_for_element_to_last(head, first, element, listbackport_member) \ listbackport_for_element_range(first, listbackport_last_element(head, element, listbackport_member), element, listbackport_member) /** * Loop over a block of elements of a list backwards, used similar to a for() command. * This loop should not be used if elements are removed from the list during * the loop. * The loop runs from the end of the list to the element 'first'. * * @param head pointer to head of list * @param first pointer to first element of loop * @param element pointer to a node of the list, this element will * contain the current node of the list during the loop * @param listbackport_member name of the list_entity element inside the * larger struct */ #define listbackport_for_element_to_last_reverse(head, first, element, listbackport_member) \ listbackport_for_element_range_reverse(first, listbackport_last_element(head, element, listbackport_member), element, listbackport_member) /** * Loop over a block of elements of a list, used similar to a for() command. * This loop should not be used if elements are removed from the list during * the loop. * The loop runs from the start of the list to the element 'last'. * * @param head pointer to head of list * @param last pointer to last element of loop * @param element pointer to a node of the list, this element will * contain the current node of the list during the loop * @param listbackport_member name of the list_entity element inside the * larger struct */ #define listbackport_for_first_to_element(head, last, element, listbackport_member) \ listbackport_for_element_range(listbackport_first_element(head, element, listbackport_member), last, element, listbackport_member) /** * Loop over a block of elements of a list backwards, used similar to a for() command. * This loop should not be used if elements are removed from the list during * the loop. * The loop runs from the element 'last' to the start of the list. * * @param head pointer to head of list * @param last pointer to last element of loop * @param element pointer to a node of the list, this element will * contain the current node of the list during the loop * @param listbackport_member name of the list_entity element inside the * larger struct * @param loop_ptr pointer to an list_entity which is used as the * internal iterator */ #define listbackport_for_first_to_element_reverse(head, last, element, listbackport_member) \ listbackport_for_element_range_reverse(listbackport_first_element(head, element, listbackport_member), last, element, listbackport_member) /** * Loop over a block of elements of a list, used similar to a for() command. * This loop can be used if the current element might be removed from * the list during the loop. Other elements should not be removed during * the loop. * * @param first_element first element of loop * @param last_element last element of loop * @param element iterator pointer to list element struct * @param listbackport_member name of list_entity within list element struct * @param ptr pointer to list element struct which is used to store * the next node during the loop */ #define listbackport_for_element_range_safe(first_element, last_element, element, listbackport_member, ptr) \ for (element = (first_element), ptr = listbackport_next_element(first_element, listbackport_member); \ element->listbackport_member.prev != &(last_element)->listbackport_member; \ element = ptr, ptr = listbackport_next_element(ptr, listbackport_member)) /** * Loop over a block of elements of a list backwards, used similar to a for() command. * This loop can be used if the current element might be removed from * the list during the loop. Other elements should not be removed during * the loop. * * @param first_element first element of range (will be last returned by the loop) * @param last_element last element of range (will be first returned by the loop) * @param element iterator pointer to list element struct * @param listbackport_member name of list_entity within list element struct * @param ptr pointer to list element struct which is used to store * the previous node during the loop */ #define listbackport_for_element_range_reverse_safe(first_element, last_element, element, listbackport_member, ptr) \ for (element = (last_element), ptr = listbackport_prev_element(last_element, listbackport_member); \ element->listbackport_member.next != &(first_element)->listbackport_member; \ element = ptr, ptr = listbackport_prev_element(ptr, listbackport_member)) /** * Loop over all elements of a list, used similar to a for() command. * This loop can be used if the current element might be removed from * the list during the loop. Other elements should not be removed during * the loop. * * @param head pointer to list-head * @param element pointer to a node of the list, this element will * contain the current node of the list during the loop * @param listbackport_member name of the list_entity element inside the * larger struct * @param ptr pointer to an list element struct which is used to store * the next node during the loop */ #define listbackport_for_each_element_safe(head, element, listbackport_member, ptr) \ listbackport_for_element_range_safe(listbackport_first_element(head, element, listbackport_member), \ listbackport_last_element(head, element, listbackport_member), \ element, listbackport_member, ptr) /** * Loop over all elements of a list backwards, used similar to a for() command. * This loop can be used if the current element might be removed from * the list during the loop. Other elements should not be removed during * the loop. * * @param head pointer to list-head * @param element pointer to a node of the list, this element will * contain the current node of the list during the loop * @param listbackport_member name of the list_entity element inside the * larger struct * @param ptr pointer to an list element struct which is used to store * the next node during the loop */ #define listbackport_for_each_element_reverse_safe(head, element, listbackport_member, ptr) \ listbackport_for_element_range_reverse_safe(listbackport_first_element(head, element, listbackport_member), \ listbackport_last_element(head, element, listbackport_member), \ element, listbackport_member, ptr) #endif /* LIST_H_ */ olsrd-0.6.6.2/lib/mdns/src/mdns.c000066400000000000000000000600031234304727700164210ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "mdns.h" /* System includes */ #include /* NULL */ #include /* ssize_t */ #include /* strerror() */ #include /* va_list, va_start, va_end */ #include /* errno */ #include /* assert() */ #include /* ETH_P_IP */ #include /* struct sockaddr_ll, PACKET_MULTICAST */ #include /* sigset_t, sigfillset(), sigdelset(), SIGINT */ #include /* struct ip */ #include /* struct udphdr */ #include /* close() */ #include #include /* OLSRD includes */ #include "plugin_util.h" /* set_plugin_int */ #include "defs.h" /* olsr_cnf, //OLSR_PRINTF */ #include "ipcalc.h" #include "olsr.h" /* //OLSR_PRINTF */ #include "mid_set.h" /* mid_lookup_main_addr() */ #include "link_set.h" /* get_best_link_to_neighbor() */ #include "net_olsr.h" /* ipequal */ /* plugin includes */ #include "NetworkInterfaces.h" /* TBmfInterface, CreateBmfNetworkInterfaces(), CloseBmfNetworkInterfaces() */ #include "Address.h" /* IsMulticast() */ #include "Packet.h" /* ENCAP_HDR_LEN, BMF_ENCAP_TYPE, BMF_ENCAP_LEN etc. */ #include "list_backport.h" #include "RouterElection.h" #include "list_backport.h" #define OLSR_FOR_ALL_FILTEREDNODES_ENTRIES(n, iterator) listbackport_for_each_element_safe(&ListOfFilteredHosts, n, list, iterator) #define IPH_HL(hdr) (((hdr)->ip_hl)*4) struct list_entity ListOfFilteredHosts; int FHListInit = 0; static uint16_t ip_checksum(char* data, int len) { uint sum = 0; if ((len & 1) == 0) len = len >> 1; else len = (len >> 1) + 1; while (len > 0) { sum += *((unsigned short int*)(void *)data); data += sizeof(unsigned short int); len--; } sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); return(~sum); } /* ------------------------------------------------------------------------- * Function : PacketReceivedFromOLSR * Description: Handle a received packet from a OLSR message * Input : ipPacket into an unsigned char and the lenght of the packet * Output : none * Return : none * Data Used : BmfInterfaces * ------------------------------------------------------------------------- */ static void PacketReceivedFromOLSR(unsigned char *encapsulationUdpData, int len) { struct ip *ipHeader; /* IP header inside the encapsulated IP packet */ struct ip6_hdr *ip6Header; /* IP header inside the encapsulated IP packet */ //union olsr_ip_addr mcSrc; /* Original source of the encapsulated multicast packet */ //union olsr_ip_addr mcDst; /* Multicast destination of the encapsulated packet */ struct TBmfInterface *walker; int stripped_len = 0; uint16_t csum_ip; ipHeader = (struct ip *)ARM_NOWARN_ALIGN(encapsulationUdpData); ip6Header = (struct ip6_hdr *)ARM_NOWARN_ALIGN(encapsulationUdpData); //mcSrc.v4 = ipHeader->ip_src; //mcDst.v4 = ipHeader->ip_dst; //OLSR_DEBUG(LOG_PLUGINS, "MDNS PLUGIN got packet from OLSR message\n"); /* Check with each network interface what needs to be done on it */ for (walker = BmfInterfaces; walker != NULL; walker = walker->next) { /* To a non-OLSR interface: unpack the encapsulated IP packet and forward it */ if (walker->olsrIntf == NULL) { int nBytesWritten; struct sockaddr_ll dest; memset(&dest, 0, sizeof(dest)); dest.sll_family = AF_PACKET; if ((encapsulationUdpData[0] & 0xf0) == 0x40) { dest.sll_protocol = htons(ETH_P_IP); stripped_len = ntohs(ipHeader->ip_len); if(my_TTL_Check) ipHeader->ip_ttl = (u_int8_t) 1; //setting up TTL to 1 to avoid mdns packets flood } //Recalculate IP Checksum ipHeader->ip_sum=0x0000; csum_ip = ip_checksum((char*)ipHeader, IPH_HL(ipHeader)); ipHeader->ip_sum=csum_ip; if ((encapsulationUdpData[0] & 0xf0) == 0x60) { dest.sll_protocol = htons(ETH_P_IPV6); stripped_len = 40 + ntohs(ip6Header->ip6_plen); //IPv6 Header size (40) + payload_len if(my_TTL_Check) ip6Header->ip6_hops = (uint8_t) 1; //setting up Hop Limit to 1 to avoid mdns packets flood } // Sven-Ola: Don't know how to handle the "stripped_len is uninitialized" condition, maybe exit(1) is better...? if (0 == stripped_len) return; //TODO: if packet is not IP die here if (stripped_len > len) { //OLSR_DEBUG(LOG_PLUGINS, "MDNS: Stripped len bigger than len ??\n"); } dest.sll_ifindex = if_nametoindex(walker->ifName); dest.sll_halen = IFHWADDRLEN; /* Use all-ones as destination MAC address. When the IP destination is * a multicast address, the destination MAC address should normally also * be a multicast address. E.g., when the destination IP is 224.0.0.1, * the destination MAC should be 01:00:5e:00:00:01. However, it does not * seem to matter when the destination MAC address is set to all-ones * in that case. */ memset(dest.sll_addr, 0xFF, IFHWADDRLEN); if(walker->isActive == 0) { //Don't forward packet if isn't master router OLSR_PRINTF(1,"Not forwarding mDNS packet to interface %s because this router is not master\n",walker->ifName); return; } nBytesWritten = sendto(walker->capturingSkfd, encapsulationUdpData, stripped_len, 0, (struct sockaddr *)&dest, sizeof(dest)); if (nBytesWritten != stripped_len) { BmfPError("sendto() error forwarding unpacked encapsulated pkt on \"%s\"", walker->ifName); } else { //OLSR_PRINTF( // 2, // "%s: --> unpacked and forwarded on \"%s\"\n", // PLUGIN_NAME_SHORT, // walker->ifName); } } /* if (walker->olsrIntf == NULL) */ } } /* PacketReceivedFromOLSR */ bool olsr_parser(union olsr_message *m, struct interface *in_if __attribute__ ((unused)), union olsr_ip_addr *ipaddr) { union olsr_ip_addr originator; int size; //OLSR_DEBUG(LOG_PLUGINS, "MDNS PLUGIN: Received msg in parser\n"); /* Fetch the originator of the messsage */ if (olsr_cnf->ip_version == AF_INET) { memcpy(&originator, &m->v4.originator, olsr_cnf->ipsize); size = ntohs(m->v4.olsr_msgsize); } else { memcpy(&originator, &m->v6.originator, olsr_cnf->ipsize); size = ntohs(m->v6.olsr_msgsize); } /* Check if message originated from this node. * If so - back off */ if (ipequal(&originator, &olsr_cnf->main_addr)) return false; /* Check that the neighbor this message was received from is symmetric. * If not - back off*/ if (check_neighbor_link(ipaddr) != SYM_LINK) { //struct ipaddr_str strbuf; //OLSR_PRINTF(3, "NAME PLUGIN: Received msg from NON SYM neighbor %s\n", olsr_ip_to_string(&strbuf, ipaddr)); return false; } if (olsr_cnf->ip_version == AF_INET) { PacketReceivedFromOLSR((unsigned char *)&m->v4.message, size - 12); } else { PacketReceivedFromOLSR((unsigned char *)&m->v6.message, size - 12 - 96); } //forward the message return true; } //Sends a packet in the OLSR network void olsr_mdns_gen(unsigned char *packet, int len) { /* send buffer: huge */ char buffer[10240]; int aligned_size; union olsr_message *message = (union olsr_message *)buffer; struct interface *ifn; aligned_size=len; if ((aligned_size % 4) != 0) { aligned_size = (aligned_size - (aligned_size % 4)) + 4; } /* fill message */ if (olsr_cnf->ip_version == AF_INET) { /* IPv4 */ message->v4.olsr_msgtype = MESSAGE_TYPE; message->v4.olsr_vtime = reltime_to_me(MDNS_VALID_TIME * MSEC_PER_SEC); memcpy(&message->v4.originator, &olsr_cnf->main_addr, olsr_cnf->ipsize); //message->v4.ttl = MAX_TTL; if (my_MDNS_TTL) message->v4.ttl = my_MDNS_TTL; else message->v4.ttl = MAX_TTL; message->v4.hopcnt = 0; message->v4.seqno = htons(get_msg_seqno()); message->v4.olsr_msgsize = htons(aligned_size + 12); memset(&message->v4.message, 0, aligned_size); memcpy(&message->v4.message, packet, len); aligned_size = aligned_size + 12; } else { /* IPv6 */ message->v6.olsr_msgtype = MESSAGE_TYPE; message->v6.olsr_vtime = reltime_to_me(MDNS_VALID_TIME * MSEC_PER_SEC); memcpy(&message->v6.originator, &olsr_cnf->main_addr, olsr_cnf->ipsize); //message->v6.ttl = MAX_TTL; if (my_MDNS_TTL) message->v6.ttl = my_MDNS_TTL; else message->v6.ttl = MAX_TTL; message->v6.hopcnt = 0; message->v6.seqno = htons(get_msg_seqno()); message->v6.olsr_msgsize = htons(aligned_size + 12 + 96); memset(&message->v6.message, 0, aligned_size); memcpy(&message->v6.message, packet, len); aligned_size = aligned_size + 12 + 96; } /* looping trough interfaces */ for (ifn = ifnet; ifn; ifn = ifn->int_next) { //OLSR_PRINTF(1, "MDNS PLUGIN: Generating packet - [%s]\n", ifn->int_name); if (net_outbuffer_push(ifn, message, aligned_size) != aligned_size) { /* send data and try again */ net_output(ifn); if (net_outbuffer_push(ifn, message, aligned_size) != aligned_size) { //OLSR_PRINTF(1, "MDNS PLUGIN: could not send on interface: %s\n", ifn->int_name); } } } } /* ------------------------------------------------------------------------- * Function : BmfPError * Description: Prints an error message at OLSR debug level 1. * First the plug-in name is printed. Then (if format is not NULL * and *format is not empty) the arguments are printed, followed * by a colon and a blank. Then the message and a new-line. * Input : format, arguments * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ void BmfPError(const char *format, ...) { #define MAX_STR_DESC 255 char strDesc[MAX_STR_DESC]; #if !defined REMOVE_LOG_DEBUG //char *stringErr = strerror(errno); #endif /* !defined REMOVE_LOG_DEBUG */ /* Rely on short-circuit boolean evaluation */ if (format == NULL || *format == '\0') { //OLSR_DEBUG(LOG_PLUGINS, "%s: %s\n", PLUGIN_NAME, stringErr); } else { va_list arglist; va_start(arglist, format); vsnprintf(strDesc, MAX_STR_DESC, format, arglist); va_end(arglist); strDesc[MAX_STR_DESC - 1] = '\0'; /* Ensures null termination */ //OLSR_DEBUG(LOG_PLUGINS, "%s: %s\n", strDesc, stringErr); } } /* BmfPError */ /* ------------------------------------------------------------------------- * Function : MainAddressOf * Description: Lookup the main address of a node * Input : ip - IP address of the node * Output : none * Return : The main IP address of the node * Data Used : none * ------------------------------------------------------------------------- */ union olsr_ip_addr * MainAddressOf(union olsr_ip_addr *ip) { union olsr_ip_addr *result; /* TODO: mid_lookup_main_addr() is not thread-safe! */ result = mid_lookup_main_addr(ip); if (result == NULL) { result = ip; } return result; } /* MainAddressOf */ int AddFilteredHost(const char *FilteredHost, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))){ int res = 0; struct FilteredHost *tmp; tmp = (struct FilteredHost *) malloc(sizeof(struct FilteredHost)); listbackport_init_node(&tmp->list); if(FHListInit == 0){ listbackport_init_head(&ListOfFilteredHosts); FHListInit = 1; } if(olsr_cnf->ip_version == AF_INET){ res = inet_pton(AF_INET, FilteredHost, &tmp->host.v4); if(res > 0){ listbackport_add_tail(&ListOfFilteredHosts, &tmp->list); } else free(tmp); } else{ res = inet_pton(AF_INET6, FilteredHost, &tmp->host.v6); if(res > 0) listbackport_add_tail(&ListOfFilteredHosts, &tmp->list); else free(tmp); } return 0; } int isInFilteredList(union olsr_ip_addr *src){ struct FilteredHost *tmp, *iterator; struct ipaddr_str buf1; struct ipaddr_str buf2; if(FHListInit == 0){ listbackport_init_head(&ListOfFilteredHosts); FHListInit = 1; } if(listbackport_is_empty(&ListOfFilteredHosts)) { OLSR_PRINTF(2,"Accept packet captured because of filtered hosts ACL: List Empty\n"); return 0; } OLSR_FOR_ALL_FILTEREDNODES_ENTRIES(tmp, iterator){ OLSR_PRINTF(2, "Checking host: %s against list entry: %s\n", olsr_ip_to_string(&buf1, src), olsr_ip_to_string(&buf2, &tmp->host) ); if(olsr_cnf->ip_version == AF_INET){ if(memcmp(&tmp->host.v4, &src->v4, sizeof(struct in_addr)) == 0) return 1; } else{ if(memcmp(&tmp->host.v6, &src->v6, sizeof(struct in6_addr)) == 0) return 1; } } OLSR_PRINTF(2,"Accept packet captured because of filtered hosts ACL: Did not find any match in list\n"); return 0; } /* ------------------------------------------------------------------------- * Function : BmfPacketCaptured * Description: Handle a captured IP packet * Input : intf - the network interface on which the packet was captured * sllPkttype - the type of packet. Either PACKET_OUTGOING, * PACKET_BROADCAST or PACKET_MULTICAST. * encapsulationUdpData - space for the encapsulation header, followed by * the captured IP packet * Output : none * Return : none * Data Used : BmfInterfaces * Notes : The IP packet is assumed to be captured on a socket of family * PF_PACKET and type SOCK_DGRAM (cooked). * ------------------------------------------------------------------------- */ static void BmfPacketCaptured( //struct TBmfInterface* intf, //unsigned char sllPkttype, unsigned char *encapsulationUdpData, int nBytes) { union olsr_ip_addr dst; /* Destination IP address in captured packet */ union olsr_ip_addr src; struct ip *ipHeader; /* The IP header inside the captured IP packet */ struct ip6_hdr *ipHeader6; /* The IP header inside the captured IP packet */ struct udphdr *udpHeader; u_int16_t destPort; if ((encapsulationUdpData[0] & 0xf0) == 0x40) { //IPV4 ipHeader = (struct ip *)ARM_NOWARN_ALIGN(encapsulationUdpData); dst.v4 = ipHeader->ip_dst; src.v4 = ipHeader->ip_src; /* Only forward multicast packets. If configured, also forward local broadcast packets */ if (IsMulticast(&dst)) { /* continue */ } else { return; } if (ipHeader->ip_p != SOL_UDP) { /* Not UDP */ //OLSR_PRINTF(1,"NON UDP PACKET\n"); return; /* for */ } udpHeader = (struct udphdr *)ARM_NOWARN_ALIGN(encapsulationUdpData + GetIpHeaderLength(encapsulationUdpData)); destPort = ntohs(udpHeader->dest); if (destPort != 5353) { return; } if(my_TTL_Check) { if(((u_int8_t) ipHeader->ip_ttl) <= ((u_int8_t) 1)) { // Discard mdns packet with TTL limit 1 or less OLSR_PRINTF(1,"Discarding packet captured with TTL = 1\n"); return; } } if (isInFilteredList(&src)) { OLSR_PRINTF(1,"Discarding packet captured because of filtered hosts ACL\n"); return; } } //END IPV4 else if ((encapsulationUdpData[0] & 0xf0) == 0x60) { //IPv6 ipHeader6 = (struct ip6_hdr *)ARM_NOWARN_ALIGN(encapsulationUdpData); //TODO: mettere dentro src.v6 l'indirizzo IPv6 if (ipHeader6->ip6_dst.s6_addr[0] == 0xff) //Multicast { //Continua } else { return; //not multicast } if (ipHeader6->ip6_nxt != SOL_UDP) { /* Not UDP */ //OLSR_PRINTF(1,"NON UDP PACKET\n"); return; /* for */ } udpHeader = (struct udphdr *)ARM_NOWARN_ALIGN(encapsulationUdpData + 40); destPort = ntohs(udpHeader->dest); if (destPort != 5353) { return; } if(my_TTL_Check) { if(((uint8_t) ipHeader6->ip6_hops) <= ((uint8_t) 1)) { // Discard mdns packet with hop limit 1 or less OLSR_PRINTF(1,"Discarding packet captured with TTL = 1\n"); return; } } if (isInFilteredList(&src)) { OLSR_PRINTF(1,"Discarding packet captured because of filtered hosts ACL\n"); return; } } //END IPV6 else return; //Is not IP packet /* Check if the frame is captured on an OLSR-enabled interface */ //isFromOlsrIntf = (intf->olsrIntf != NULL); TODO: put again this check // send the packet to OLSR forward mechanism olsr_mdns_gen(encapsulationUdpData, nBytes); } /* BmfPacketCaptured */ /* ------------------------------------------------------------------------- * Function : DoMDNS * Description: This function is registered with the OLSR scheduler and called when something is captured * Input : none * Output : none * Return : none * Data Used : * ------------------------------------------------------------------------- */ void DoMDNS(int skfd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { unsigned char rxBuffer[BMF_BUFFER_SIZE]; if (skfd >= 0) { struct sockaddr_ll pktAddr; socklen_t addrLen = sizeof(pktAddr); int nBytes; unsigned char *ipPacket; struct TBmfInterface *walker; /* Receive the captured Ethernet frame, leaving space for the BMF * encapsulation header */ ipPacket = GetIpPacket(rxBuffer); nBytes = recvfrom(skfd, ipPacket, BMF_BUFFER_SIZE, //TODO: understand how to change this 0, (struct sockaddr *)&pktAddr, &addrLen); if (nBytes < 0) { return; /* for */ } /* if (nBytes < 0) */ /* Check if the number of received bytes is large enough for an IP * packet which contains at least a minimum-size IP header. * Note: There is an apparent bug in the packet socket implementation in * combination with VLAN interfaces. On a VLAN interface, the value returned * by 'recvfrom' may (but need not) be 4 (bytes) larger than the value * returned on a non-VLAN interface, for the same ethernet frame. */ if (nBytes < (int)sizeof(struct ip)) { ////OLSR_PRINTF( // 1, // "%s: captured frame too short (%d bytes) on \"%s\"\n", // PLUGIN_NAME, // nBytes, // walker->ifName); return; /* for */ } for(walker = BmfInterfaces; walker != NULL; walker = walker->next){ //if the router isn't the master for this interface if(skfd == walker->capturingSkfd && walker->isActive == 0) { //discard mdns packets OLSR_PRINTF(1,"Not capturing mDNS packet from interface %s because this router is not master\n",walker->ifName); return; } } if (pktAddr.sll_pkttype == PACKET_OUTGOING || pktAddr.sll_pkttype == PACKET_MULTICAST || pktAddr.sll_pkttype == PACKET_BROADCAST) { /* A multicast or broadcast packet was captured */ ////OLSR_PRINTF( // 1, // "%s: captured frame (%d bytes) on \"%s\"\n", // PLUGIN_NAME, // nBytes, // walker->ifName); //BmfPacketCaptured(walker, pktAddr.sll_pkttype, rxBuffer); BmfPacketCaptured(ipPacket, nBytes); } /* if (pktAddr.sll_pkttype == ...) */ } /* if (skfd >= 0 && (FD_ISSET...)) */ } /* DoMDNS */ int InitMDNS(struct interface *skipThisIntf) { //Tells OLSR to launch olsr_parser when the packets for this plugin arrive olsr_parser_add_function(&olsr_parser, PARSER_TYPE); //Creates captures sockets and register them to the OLSR scheduler CreateBmfNetworkInterfaces(skipThisIntf); InitRouterList(NULL); return 1; } /* InitMDNS */ /* ------------------------------------------------------------------------- * Function : CloseMDNS * Description: Close the MDNS plugin and clean up * Input : none * Output : none * Return : none * Data Used : * ------------------------------------------------------------------------- */ void CloseMDNS(void) { CloseBmfNetworkInterfaces(); } void DoElection(int skfd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { static const char * rxBufferPrefix = "$REP"; static const ssize_t rxBufferPrefixLength = 4; unsigned char rxBuffer[HELLO_BUFFER_SIZE]; ssize_t rxCount; union olsr_sockaddr sender; socklen_t senderSize = sizeof(sender); struct RtElHelloPkt *rcvPkt; struct RouterListEntry *listEntry; struct RouterListEntry6 *listEntry6; OLSR_PRINTF(1,"Packet Received \n"); if (skfd >= 0) { memset(&sender, 0, senderSize); rxCount = recvfrom(skfd, &rxBuffer[0], (sizeof(rxBuffer) - 1), 0, (struct sockaddr *)&sender, &senderSize); if(rxCount < 0){ BmfPError("Receive error in %s, ignoring message.", __func__); return; } /* make sure the string is null terminated */ rxBuffer[rxCount] = '\0'; /* do not process when this message doesn't start with $REP */ if ((rxCount < rxBufferPrefixLength) || (strncmp((char *) rxBuffer, rxBufferPrefix, rxBufferPrefixLength) != 0)) return; if ( rxCount < (int)sizeof(struct RtElHelloPkt)) return; // too small to be a hello pkt else rcvPkt = (struct RtElHelloPkt *)ARM_NOWARN_ALIGN(rxBuffer); if (rcvPkt->ipFamily == AF_INET){ listEntry = (struct RouterListEntry *)malloc(sizeof(struct RouterListEntry)); if(ParseElectionPacket(rcvPkt, listEntry, skfd)){ OLSR_PRINTF(1,"processing ipv4 packet \n"); if(UpdateRouterList(listEntry)) free(listEntry); } else{ free(listEntry); return; //packet not valid } } else{ listEntry6 = (struct RouterListEntry6 *)malloc(sizeof(struct RouterListEntry6)); if(ParseElectionPacket6(rcvPkt, listEntry6, skfd)){ OLSR_PRINTF(1,"processing ipv6 packet"); if(UpdateRouterList6(listEntry6)) free(listEntry6); } else{ free(listEntry6); return; //packet not valid } } } return; } olsrd-0.6.6.2/lib/mdns/src/mdns.h000066400000000000000000000076521234304727700164410ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _MDNS_MDNS_H #define _MDNS_MDNS_H #include "olsrd_plugin.h" /* union set_plugin_parameter_addon */ #include "duplicate_set.h" #include "parser.h" #include "list_backport.h" #define MESSAGE_TYPE 132 #define PARSER_TYPE MESSAGE_TYPE #define EMISSION_INTERVAL 10 /* seconds */ #define EMISSION_JITTER 25 /* percent */ #define MDNS_VALID_TIME 1800 /* seconds */ /* BMF plugin data */ #define PLUGIN_NAME "OLSRD MDNS plugin" #define PLUGIN_NAME_SHORT "OLSRD MDNS" #define PLUGIN_VERSION "1.0.1 (" __DATE__ " " __TIME__ ")" #define PLUGIN_COPYRIGHT " (C) Ninux.org" #define PLUGIN_AUTHOR " Saverio Proto (zioproto@gmail.com)" #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION "\n" PLUGIN_COPYRIGHT "\n" PLUGIN_AUTHOR #define PLUGIN_INTERFACE_VERSION 5 /* UDP-Port on which multicast packets are encapsulated */ //#define BMF_ENCAP_PORT 50698 /* Forward declaration of OLSR interface type */ struct interface; struct FilteredHost{ union olsr_ip_addr host; struct list_entity list; }; //extern int FanOutLimit; //extern int BroadcastRetransmitCount; void DoMDNS(int sd, void *x, unsigned int y); void DoElection(int skfd, void *x, unsigned int y); void BmfPError(const char *format, ...) __attribute__ ((format(printf, 1, 2))); union olsr_ip_addr *MainAddressOf(union olsr_ip_addr *ip); //int InterfaceChange(struct interface* interf, int action); //int SetFanOutLimit(const char* value, void* data, set_plugin_parameter_addon addon); //int InitBmf(struct interface* skipThisIntf); //void CloseBmf(void); int InitMDNS(struct interface *skipThisIntf); void CloseMDNS(void); int AddFilteredHost(const char *FilteredHost, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))); int isInFilteredList(union olsr_ip_addr *src); void olsr_mdns_gen(unsigned char *packet, int len); /* Parser function to register with the scheduler */ bool olsr_parser(union olsr_message *, struct interface *, union olsr_ip_addr *); #endif /* _MDNS_MDNS_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/mdns/src/olsrd_plugin.c000066400000000000000000000164111234304727700201650ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* System includes */ #include /* assert() */ #include /* NULL */ /* OLSRD includes */ #include "olsrd_plugin.h" #include "plugin_util.h" #include "defs.h" /* uint8_t, olsr_cnf */ #include "scheduler.h" /* olsr_start_timer() */ #include "olsr_cfg.h" /* olsr_cnf() */ #include "olsr_cookie.h" /* olsr_alloc_cookie() */ /* BMF includes */ #include "mdns.h" /* InitBmf(), CloseBmf() */ #include "NetworkInterfaces.h" /* AddNonOlsrBmfIf(), SetBmfInterfaceIp(), ... */ #include "Address.h" /* DoLocalBroadcast() */ #include "RouterElection.h" static void __attribute__ ((constructor)) my_init(void); static void __attribute__ ((destructor)) my_fini(void); //static struct olsr_cookie_info *prune_packet_history_timer_cookie; void olsr_plugin_exit(void); /* ------------------------------------------------------------------------- * Function : olsrd_plugin_interface_version * Description: Plugin interface version * Input : none * Output : none * Return : BMF plugin interface version number * Data Used : none * Notes : Called by main OLSRD (olsr_load_dl) to check plugin interface * version * ------------------------------------------------------------------------- */ int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } /* ------------------------------------------------------------------------- * Function : olsrd_plugin_init * Description: Plugin initialisation * Input : none * Output : none * Return : fail (0) or success (1) * Data Used : olsr_cnf * Notes : Called by main OLSRD (init_olsr_plugin) to initialize plugin * ------------------------------------------------------------------------- */ int olsrd_plugin_init(void) { /* Clear the packet history */ //InitPacketHistory(); /* Register ifchange function */ //add_ifchgf(&InterfaceChange); /* create the cookie */ //prune_packet_history_timer_cookie = olsr_alloc_cookie("BMF: Prune Packet History", OLSR_COOKIE_TYPE_TIMER); /* Register the duplicate registration pruning process */ //olsr_start_timer(3 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, // &PrunePacketHistory, NULL, prune_packet_history_timer_cookie->ci_id); return InitMDNS(NULL); } /* ------------------------------------------------------------------------- * Function : olsr_plugin_exit * Description: Plugin cleanup * Input : none * Output : none * Return : none * Data Used : none * Notes : Called by my_fini() at unload of shared object * ------------------------------------------------------------------------- */ void olsr_plugin_exit(void) { CloseMDNS(); } static const struct olsrd_plugin_parameters plugin_parameters[] = { {.name = "NonOlsrIf",.set_plugin_parameter = &AddNonOlsrBmfIf,.data = NULL}, {.name = "MDNS_TTL", .set_plugin_parameter = &set_MDNS_TTL, .data = NULL }, {.name = "FilteredHost", .set_plugin_parameter = &AddFilteredHost, .data = NULL }, {.name = "TTL_Check", .set_plugin_parameter = &set_TTL_Check, .data = NULL}, {.name = "Network_ID", .set_plugin_parameter = &set_Network_ID, .data = NULL}, //{ .name = "DoLocalBroadcast", .set_plugin_parameter = &DoLocalBroadcast, .data = NULL }, //{ .name = "BmfInterface", .set_plugin_parameter = &SetBmfInterfaceName, .data = NULL }, //{ .name = "BmfInterfaceIp", .set_plugin_parameter = &SetBmfInterfaceIp, .data = NULL }, //{ .name = "CapturePacketsOnOlsrInterfaces", .set_plugin_parameter = &SetCapturePacketsOnOlsrInterfaces, .data = NULL }, //{ .name = "BmfMechanism", .set_plugin_parameter = &SetBmfMechanism, .data = NULL }, //{ .name = "FanOutLimit", .set_plugin_parameter = &SetFanOutLimit, .data = NULL }, //{ .name = "BroadcastRetransmitCount", .set_plugin_parameter = &set_plugin_int, .data = &BroadcastRetransmitCount}, }; /* ------------------------------------------------------------------------- * Function : olsrd_get_plugin_parameters * Description: Return the parameter table and its size * Input : none * Output : params - the parameter table * size - its size in no. of entries * Return : none * Data Used : plugin_parameters * Notes : Called by main OLSR (init_olsr_plugin) for all plugins * ------------------------------------------------------------------------- */ void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = ARRAYSIZE(plugin_parameters); } /* ------------------------------------------------------------------------- * Function : my_init * Description: Plugin constructor * Input : none * Output : none * Return : none * Data Used : none * Notes : Called at load of shared object * ------------------------------------------------------------------------- */ static void my_init(void) { /* Print plugin info to stdout */ printf("%s\n", MOD_DESC); return; } /* ------------------------------------------------------------------------- * Function : my_fini * Description: Plugin destructor * Input : none * Output : none * Return : none * Data Used : none * Notes : Called at unload of shared object * ------------------------------------------------------------------------- */ static void my_fini(void) { olsr_plugin_exit(); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/mdns/version-script.txt000066400000000000000000000002051234304727700202530ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/mini/000077500000000000000000000000001234304727700145215ustar00rootroot00000000000000olsrd-0.6.6.2/lib/mini/Makefile000066400000000000000000000044261234304727700161670ustar00rootroot00000000000000# The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_mini PLUGIN_VER = 0.1 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) olsrd-0.6.6.2/lib/mini/README_MINI000066400000000000000000000021041234304727700162120ustar00rootroot00000000000000--------------------------------------------------------------------- MINI PLUGIN FOR OLSRD by Bruno Randolf --------------------------------------------------------------------- This is a minimal example plugin to demonstrate the functions a plugin must implement. It documents the minimal requirements for the new plugin interface and is a good start for creating new plugins and testing the plugin loader. This plugin does nothing, except printing messages when it is loaded and unloaded. --------------------------------------------------------------------- PLUGIN PARAMETERS (PlParam) --------------------------------------------------------------------- PlParam "test" "anything" just for a test: print the parameter. --------------------------------------------------------------------- SAMPLE CONFIG --------------------------------------------------------------------- add in /etc/olsrd.conf: LoadPlugin "olsrd_mini.so.0.1" { PlParam "test" "hello" } --------------------------------------------------------------------- EOF / 26.05.2005 olsrd-0.6.6.2/lib/mini/src/000077500000000000000000000000001234304727700153105ustar00rootroot00000000000000olsrd-0.6.6.2/lib/mini/src/olsrd_plugin.c000066400000000000000000000075041234304727700201630ustar00rootroot00000000000000 /* * Copyright (c) 2005, Bruno Randolf * Copyright (c) 2004, Andreas Tonnesen(andreto-at-olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the UniK olsr daemon nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * Example plugin for olsrd.org OLSR daemon * Only the bare minimum */ #include #include #include "../../../src/olsrd_plugin.h" #include "olsrd_plugin.h" #include "olsr.h" #define PLUGIN_INTERFACE_VERSION 5 /**************************************************************************** * Functions that the plugin MUST provide * ****************************************************************************/ /** * Plugin interface version * Used by main olsrd to check plugin interface version */ int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } static int set_plugin_test(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { printf("\n*** MINI: parameter test: %s\n", value); return 0; } /** * Register parameters from config file * Called for all plugin parameters */ static const struct olsrd_plugin_parameters plugin_parameters[] = { {.name = "test",.set_plugin_parameter = &set_plugin_test,.data = NULL}, }; void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = sizeof(plugin_parameters) / sizeof(*plugin_parameters); } /** * Initialize plugin * Called after all parameters are passed */ int olsrd_plugin_init(void) { printf("*** MINI: plugin_init\n"); /* call a function from main olsrd */ olsr_printf(2, "*** MINI: printed this with olsr_printf\n"); return 1; } /**************************************************************************** * Optional private constructor and destructor functions * ****************************************************************************/ /* attention: make static to avoid name clashes */ static void my_init(void) __attribute__ ((constructor)); static void my_fini(void) __attribute__ ((destructor)); /** * Optional Private Constructor */ static void my_init(void) { printf("*** MINI: constructor\n"); } /** * Optional Private Destructor */ static void my_fini(void) { printf("*** MINI: destructor\n"); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/mini/src/olsrd_plugin.h000066400000000000000000000042761234304727700201730ustar00rootroot00000000000000 /* * Copyright (c) 2005, Bruno Randolf * Copyright (c) 2004, Andreas Tonnesen(andreto-at-olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the UniK olsr daemon nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #ifndef _OLSRD_PLUGIN_MINI #define _OLSRD_PLUGIN_MINI /**************************************************************************** * Functions that the plugin MUST provide * ****************************************************************************/ /* Initialization function */ int olsrd_plugin_init(void); int olsrd_plugin_interface_version(void); #endif /* _OLSRD_PLUGIN_MINI */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/mini/version-script.txt000066400000000000000000000002051234304727700202460ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/nameservice/000077500000000000000000000000001234304727700160665ustar00rootroot00000000000000olsrd-0.6.6.2/lib/nameservice/Makefile000066400000000000000000000054051234304727700175320ustar00rootroot00000000000000# The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_nameservice PLUGIN_VER = 0.3 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc ifeq ($(OS),win32) default_target install clean: @echo "**** We use the regex library here. Does Win32 has something like this?" else ifeq ($(OS),android) # On Android Google forgot to include regex engine code for Froyo version (but also there was # no support in older versions for it) so we have here this missing code. # http://groups.google.com/group/android-ndk/browse_thread/thread/5ea6f0650f0e3fc OBJS += $(REGEX_LIB) CFLAGS += -D__POSIX_VISIBLE endif default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: $(REGEX_CLEAN) rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) endif olsrd-0.6.6.2/lib/nameservice/README_NAMESERVICE000066400000000000000000000165061234304727700205770ustar00rootroot00000000000000--------------------------------------------------------------------- NAMESERVICE PLUGIN FOR OLSRD by Bruno Randolf --------------------------------------------------------------------- a simple DNS replacement for OLSR networks this plugin distributes host name (DNS) information over OLSR. every node which runs the olsr daemon can announce it's own name, names for other IP addresses it is associated with (HNAs) and if it is running a "real" nameserver which can resolve other (internet) names (upstream dns server). the nodes in the network collect this information and write the host names to a file (possibly /etc/hosts), and the 3 nearest upstream nameservers to another file (possibly /etc/resolv.conf). these files can be used to resolve hostnames on the local system and/or be read by a DNS server like "dnsmasq", to make the names available via the ordinary DNS protocol to other clients as well. the default location of the hosts file is "/var/run/hosts_olsr" on unixes "C:\WINDOWS\hosts_olsr" on windows --------------------------------------------------------------------- PLUGIN PARAMETERS (PlParam) --------------------------------------------------------------------- PlParam "name" "my-name.mesh" the name of this OLSR node (main address). can be specified multiple times for different names. PlParam "IP.ADDR" "another-name.mesh" a name for a specified IP address. the IP address has to be either from one of the olsr interfaces or within a HNA network we announce. can be specified multiple times. PlParam "hosts-file" "/path/to/hosts_file" which file to write to (usually /etc/hosts). (default: /var/run/hosts_olsr) PlParam "suffix" ".olsr" local suffix which is appended to all received names. (default: "") PlParam "add-hosts" "/path/to/file" copy contents of this additional hosts file to output file. this is practical if you alreay use your /etc/hosts file. PlParam "dns-server" "IP.ADDR" anounce that this IP has a full (upstream) DNS server. if IP.ADDR is not specified (""), the main address is used. nodes which don't know a nameserver will automatically use this nameserver. PlParam "resolv-file" "/path/to/resolv.conf" path to resolv.conf file (usually /etc/resolv.conf) if set, the 3 nearest (best ETX) upstream nameservers annonced by other nodes in the network are written to this file PlParam "interval" "SEC" interval for sending NAME messages in seconds. (default: 120 - 2 minutes) PlParam "timeout" "SEC" validity time for received NAME messages in seconds. (default: 3600 - 1 hour) PlParam "lat" "12.123" Float: Decimal latitude for this node to be flooded in the mesh PlParam "lon" "12.123" Float: Decimal longitude for this node to be flooded in the mesh PlParam "latlon-file" "/var/run/latlon.js" Filename to write Javascript statements to. Default is "latlon.js" (either /var/run or windows directory). This file is written, if the "lat" and "lon" parameters are set. It has this format: /* One or more mid-aliases of multihomed nodes */ Mid('fromip','toip'); /* One special Node() entry for this node * defhna means: This node announces hna 0.0.0.0/0 * defroute means: The current neighbour IP for 0.0.0.0/0 */ Self('mainip',lat,lon,defhna?1:0,'defroute','name'); /* One or more node entires for other nodes */ Node('mainip',lat,lon,this-node-defhna?1:0,'defroute','name'); /* One or more links between nodes */ Link('fromip','toip',lq,nlq,etx); PlParam "latlon-infile" "name-of-input.txt" Filename to read lat/lon positions from. Meant to be used by a walking GPS receiver. Just write comma separated decimal latitude and longitude to this file. Will overwrite the "lat" and "lon" parameters during runtime. PlParam "sighup-pid-file" "/path/to/pidfile.pid" (*nix systems only) Sends a HUP signal to the process specified by the pidfile (usually /var/run/dnsmasq.pid) when the host name table changes. This is useful for letting dnsmasq or bind know they have to reload their hosts file. PlParam "name-change-script" "/path/to/script" Script to execute when there is a change in the hosts names table. Useful for executing a script that uses the hosts file to keep a website or a database updated. PlParam "service" "http://me.olsr:80|tcp|my little homepage" Add a new service announcement to be spreaded in the mesh. PlParam "services-file" "/path/to/services_file" File to write (default: /var/run/services_olsr) PlParam "services-change-script" "/path/to/script" Similar to the previous parameter. Script to execute when there is a change in the services list propagated by the nameserver plugin. Useful for executing a script that uses the services file to keep a website or a database updated. PlParam "mac" "xx:xx:xx:xx:xx:xx[,0-255]" Add a new MAC addr to be spreaded in the mesh. This MAC addr may be used to fine control nerve-wreck-page solutions based on MAC addresses. The optional dec. number designates a class. PlParam "macs-file" "/path/to/macs_file" File to write (default: /var/run/macs_olsr) PlParam "macs-change-script" "/path/to/script" Similar to the previous parameter. Script to execute when there is a change in the macs list propagated by the nameserver plugin. Useful for executing a script that uses the services file to keep a website or a database updated. --------------------------------------------------------------------- SAMPLE CONFIG --------------------------------------------------------------------- add in /etc/olsrd.conf: LoadPlugin "olsrd_nameservice.so.0.2" { PlParam "name" "thisismyname" PlParam "hosts-file" "/etc/hosts" PlParam "resolv-file" "/etc/resolv.conf" } --------------------------------------------------------------------- USING THE NAME INFORMATION --------------------------------------------------------------------- to use the name information distributed by the plugin actually for name resolution you can do one of the following. UNIX VARIANTS: * overwrite /etc/hosts be sure you have nothing in /etc/hosts which you still need and configure the plugin with PlParam "host-file" "/etc/hosts" * link /etc/hosts ln -s /var/run/hosts_olsr /etc/hosts * use dnsmasq if you want to make the names available via ordinary DNS you can use dnsmasq to read the hosts file and serve it to users. add "addn-hosts=/var/run/hosts_olsr" to dnsmasq.conf and: PlParam "sighup-pid-file" "/var/run/dnsmasq.pid" to your nameservice plugin configuration. This is especially useful for infrastructure mesh networks that can't afford to run olsrd on all the clients but wish to provide DNS to them. This is solved by running dnsmasq and olsrd with this setup on "edge" nodes that provide connectivity. WINDOWS: * overwrite C:\WINDOWS\system32\drivers\etc\hosts be sure you have nothing in the file which you still need and configure the plugin with PlParam "hosts-file" "C:\WINDOWS\system32\drivers\etc\hosts" --------------------------------------------------------------------- TODO --------------------------------------------------------------------- * implement a small DNS server into the plugin? * or make dynamic DNS updates for bind? --------------------------------------------------------------------- EOF / 30.06.2007 olsrd-0.6.6.2/lib/nameservice/src/000077500000000000000000000000001234304727700166555ustar00rootroot00000000000000olsrd-0.6.6.2/lib/nameservice/src/compat.c000066400000000000000000000010231234304727700203000ustar00rootroot00000000000000#include "compat.h" #if !defined(__linux__) && !defined(__GLIBC__) #include #include /* strndup() is a GNU extention */ char * strndup(const char *ptr, size_t size) { size_t len = strlen(ptr); char *ret = NULL; if (len > size) len = size; ret = malloc(len + 1); if (!ret) return NULL; memcpy(ret, ptr, len); ret[len] = '\0'; return ret; } #endif /* !defined(__linux__) && !defined(__GLIBC__) */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/nameservice/src/compat.h000066400000000000000000000005311234304727700203100ustar00rootroot00000000000000#ifndef _NAMESERVICE_COMPAT #define _NAMESERVICE_COMPAT #include #if !defined(__linux__) && !defined(__GLIBC__) char *strndup(const char *ptr, size_t size); #endif /* !defined(__linux__) && !defined(__GLIBC__) */ #endif /* _NAMESERVICE_COMPAT */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/nameservice/src/mapwrite.c000066400000000000000000000176051234304727700206620ustar00rootroot00000000000000 /* * Copyright (c) 2007, Sven-Ola * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the UniK olsr daemon nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include #include #include #include #include #include #include #include "defs.h" #include "scheduler.h" #include "nameservice.h" #include "mid_set.h" #include "tc_set.h" #include "ipcalc.h" #include "lq_plugin.h" #include "mapwrite.h" static char my_latlon_str[48]; /** * lookup a nodes position */ static char * lookup_position_latlon(union olsr_ip_addr *ip) { int hash; struct db_entry *entry; struct list_node *list_head, *list_node; if (ipequal(ip, &olsr_cnf->main_addr)) { return my_latlon_str; } for (hash = 0; hash < HASHSIZE; hash++) { list_head = &latlon_list[hash]; for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) { entry = list2db(list_node); if (entry->names && ipequal(&entry->originator, ip)) { return entry->names->name; } } } return NULL; } /** * write latlon positions to a file */ void mapwrite_work(FILE * fmap) { int hash; struct olsr_if *ifs; union olsr_ip_addr ip; struct ipaddr_str strbuf1, strbuf2; struct tc_entry *tc; struct tc_edge_entry *tc_edge; if (!my_names || !fmap) return; for (ifs = olsr_cnf->interfaces; ifs; ifs = ifs->next) { if (0 != ifs->interf) { if (olsr_cnf->ip_version == AF_INET) { if (!(ip4equal((struct in_addr *)&olsr_cnf->main_addr, &ifs->interf->int_addr.sin_addr))) { if (0 > fprintf(fmap, "Mid('%s','%s');\n", olsr_ip_to_string(&strbuf1, &olsr_cnf->main_addr), olsr_ip_to_string(&strbuf2, (union olsr_ip_addr *)&ifs->interf->int_addr.sin_addr))) { return; } } } else if (!(ip6equal((struct in6_addr *)&olsr_cnf->main_addr, &ifs->interf->int6_addr.sin6_addr))) { if (0 > fprintf(fmap, "Mid('%s','%s');\n", olsr_ip_to_string(&strbuf1, &olsr_cnf->main_addr), olsr_ip_to_string(&strbuf2, (union olsr_ip_addr *)&ifs->interf->int6_addr.sin6_addr))) { return; } } } } for (hash = 0; hash < HASHSIZE; hash++) { struct mid_entry *entry = mid_set[hash].next; while (entry != &mid_set[hash]) { struct mid_address *alias = entry->aliases; while (alias) { if (0 > fprintf(fmap, "Mid('%s','%s');\n", olsr_ip_to_string(&strbuf1, &entry->main_addr), olsr_ip_to_string(&strbuf2, &alias->alias))) { return; } alias = alias->next_alias; } entry = entry->next; } } lookup_defhna_latlon(&ip); sprintf(my_latlon_str, "%f,%f,%d", (double)my_lat, (double)my_lon, get_isdefhna_latlon()); if (0 > fprintf(fmap, "Self('%s',%s,'%s','%s');\n", olsr_ip_to_string(&strbuf1, &olsr_cnf->main_addr), my_latlon_str, olsr_ip_to_string(&strbuf2, &ip), my_names->name)) { return; } for (hash = 0; hash < HASHSIZE; hash++) { struct db_entry *entry; struct list_node *list_head, *list_node; list_head = &latlon_list[hash]; for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) { entry = list2db(list_node); if (NULL != entry->names) { if (0 > fprintf(fmap, "Node('%s',%s,'%s','%s');\n", olsr_ip_to_string(&strbuf1, &entry->originator), entry->names->name, olsr_ip_to_string(&strbuf2, &entry->names->ip), lookup_name_latlon(&entry->originator))) { return; } } } } OLSR_FOR_ALL_TC_ENTRIES(tc) { OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) { char *lla = lookup_position_latlon(&tc->addr); char *llb = lookup_position_latlon(&tc_edge->T_dest_addr); if (NULL != lla && NULL != llb) { struct lqtextbuffer lqbuffer, lqbuffer2; /* * To speed up processing, Links with both positions are named PLink() */ if (0 > fprintf(fmap, "PLink('%s','%s',%s,%s,%s,%s);\n", olsr_ip_to_string(&strbuf1, &tc_edge->T_dest_addr), olsr_ip_to_string(&strbuf2, &tc->addr), get_tc_edge_entry_text(tc_edge, ',', &lqbuffer2), get_linkcost_text(tc_edge->cost, false, &lqbuffer), lla, llb)) { return; } } else { struct lqtextbuffer lqbuffer, lqbuffer2; /* * If one link end pos is unkown, only send Link() */ if (0 > fprintf(fmap, "Link('%s','%s',%s,%s);\n", olsr_ip_to_string(&strbuf1, &tc_edge->T_dest_addr), olsr_ip_to_string(&strbuf2, &tc->addr), get_tc_edge_entry_text(tc_edge, ',', &lqbuffer2), get_linkcost_text(tc_edge->cost, false, &lqbuffer))) { return; } } } OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge); } OLSR_FOR_ALL_TC_ENTRIES_END(tc); } #ifndef _WIN32 /* * Windows doesn't know fifo's AFAIK. We better write * to a file (done in nameservice.c, see #ifdef _WIN32) */ static const char *the_fifoname = 0; static int fifopolltime = 0; static void mapwrite_poll(void *context __attribute__ ((unused))) { fifopolltime++; if (0 == (fifopolltime & 7) && 0 != the_fifoname) { FILE *fout; /* Non-blocking means: fail open if no pipe reader */ int fd = open(the_fifoname, O_WRONLY | O_NONBLOCK); if (0 <= fd) { /* * Change to blocking, otherwise expect fprintf errors */ if (fcntl(fd, F_SETFL, O_WRONLY) == -1) { close(fd); } else { fout = fdopen(fd, "w"); if (0 != fout) { mapwrite_work(fout); fclose(fout); /* Give pipe reader cpu slot to detect EOF */ usleep(1); } else { close(fd); } } } } } int mapwrite_init(const char *fifoname) { the_fifoname = fifoname; if (0 != fifoname && 0 != *fifoname) { unlink(fifoname); if (0 > mkfifo(fifoname, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH)) { OLSR_PRINTF(1, "mkfifo(%s): %s", fifoname, strerror(errno)); return false; } else { the_fifoname = fifoname; olsr_start_timer(100, 5, OLSR_TIMER_PERIODIC, &mapwrite_poll, NULL, 0); } } return true; } void mapwrite_exit(void) { if (0 != the_fifoname) { unlink(the_fifoname); /* Ignore any Error */ the_fifoname = 0; } } #endif /* _WIN32 */ /* * Local Variables: * mode: c * c-indent-tabs-mode: t * c-basic-offset: 4 * tab-width: 4 * End: */ olsrd-0.6.6.2/lib/nameservice/src/mapwrite.h000066400000000000000000000035141234304727700206610ustar00rootroot00000000000000 /* * Copyright (c) 2007, Sven-Ola * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the UniK olsr daemon nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef _MAPWRITE_H #define _MAPWRITE_H int mapwrite_init(const char *fifoname); void mapwrite_work(FILE * fmap); void mapwrite_exit(void); #endif /* _MAPWRITE_H */ /* * Local Variables: * mode: c * c-indent-tabs-mode: t * c-basic-offset: 4 * tab-width: 4 * End: */ olsrd-0.6.6.2/lib/nameservice/src/nameservice.c000066400000000000000000001524711234304727700213340ustar00rootroot00000000000000 /* * Copyright (c) 2006, Jens Nachtigall * Copyright (c) 2005, Bruno Randolf * Copyright (c) 2004, Andreas Tonnesen(andreto-at-olsr.org) * Copyright (c) 2007, Sven-Ola * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the UniK olsr daemon nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * Dynamic linked library for UniK OLSRd */ #define _GNU_SOURCE 1 #include #include #include #include #include #include #include #include #include #include #include "olsr.h" #include "ipcalc.h" #include "net_olsr.h" #include "routing_table.h" #include "mantissa.h" #include "scheduler.h" #include "parser.h" #include "duplicate_set.h" #include "tc_set.h" #include "hna_set.h" #include "mid_set.h" #include "link_set.h" #include "plugin_util.h" #include "nameservice.h" #include "mapwrite.h" #include "compat.h" /* true if plugin has been configured */ static bool nameservice_configured = false; /* config parameters */ static char my_hosts_file[MAX_FILE + 1]; static char my_sighup_pid_file[MAX_FILE + 1]; static char my_add_hosts[MAX_FILE + 1]; static char my_suffix[MAX_SUFFIX]; static int my_interval = EMISSION_INTERVAL; static float my_timeout = NAME_VALID_TIME; static char my_resolv_file[MAX_FILE + 1]; static char my_services_file[MAX_FILE + 1]; static char my_macs_file[MAX_FILE + 1]; static char my_name_change_script[MAX_FILE + 1]; static char my_services_change_script[MAX_FILE + 1]; static char my_macs_change_script[MAX_FILE + 1]; static char latlon_in_file[MAX_FILE + 1]; static char my_latlon_file[MAX_FILE + 1]; float my_lat = 0.0, my_lon = 0.0; /* the databases (using hashing) * for hostnames, service_lines and dns-servers * * my own hostnames, service_lines and dns-servers * are store in a linked list (without hashing) * */ static struct list_node name_list[HASHSIZE]; struct name_entry *my_names = NULL; struct timer_entry *name_table_write = NULL; static bool name_table_changed = true; static struct list_node service_list[HASHSIZE]; static struct name_entry *my_services = NULL; static bool service_table_changed = true; static struct list_node mac_list[HASHSIZE]; static struct name_entry *my_macs = NULL; static bool mac_table_changed = true; static struct list_node forwarder_list[HASHSIZE]; static struct name_entry *my_forwarders = NULL; static bool forwarder_table_changed = true; struct list_node latlon_list[HASHSIZE]; static bool latlon_table_changed = true; /* backoff timer for writing changes into a file */ struct timer_entry *write_file_timer = NULL; /* periodic message generation */ struct timer_entry *msg_gen_timer = NULL; /* regular expression to be matched by valid hostnames, compiled in name_init() */ static regex_t regex_t_name; static regmatch_t regmatch_t_name; /* regular expression to be matched by valid service_lines, compiled in name_init() */ static regex_t regex_t_service; static int pmatch_service = 10; static regmatch_t regmatch_t_service[10]; /** * do initialization */ void name_constructor(void) { int i; #ifdef _WIN32 int len; GetWindowsDirectory(my_hosts_file, MAX_FILE - 12); GetWindowsDirectory(my_services_file, MAX_FILE - 12); GetWindowsDirectory(my_macs_file, MAX_FILE - 12); GetWindowsDirectory(my_resolv_file, MAX_FILE - 12); len = strlen(my_hosts_file); if (my_hosts_file[len - 1] != '\\') strscat(my_hosts_file, "\\", sizeof(my_host_file)); strscat(my_hosts_file, "hosts_olsr", sizeof(my_host_file)); len = strlen(my_services_file); if (my_services_file[len - 1] != '\\') strscat(my_services_file, "\\", sizeof(my_services_file)); strscat(my_services_file, "services_olsr", sizeof(my_services_file)); len = strlen(my_macs_file); if (my_macs_file[len - 1] != '\\') strscat(my_macs_file, "\\", sizeof(my_macs_file)); strscat(my_macs_file, "macs_olsr", sizeof(my_macs_file)); len = strlen(my_resolv_file); if (my_resolv_file[len - 1] != '\\') strscat(my_resolv_file, "\\", sizeof(my_resolv_file)); strscat(my_resolv_file, "resolvconf_olsr", sizeof(my_resolv_file)); #else /* _WIN32 */ strscpy(my_hosts_file, "/var/run/hosts_olsr", sizeof(my_hosts_file)); strscpy(my_services_file, "/var/run/services_olsr", sizeof(my_services_file)); strscpy(my_macs_file, "/var/run/macs_olsr", sizeof(my_macs_file)); strscpy(my_resolv_file, "/var/run/resolvconf_olsr", sizeof(my_resolv_file)); *my_sighup_pid_file = 0; #endif /* _WIN32 */ my_suffix[0] = '\0'; my_add_hosts[0] = '\0'; my_latlon_file[0] = '\0'; latlon_in_file[0] = '\0'; my_name_change_script[0] = '\0'; my_services_change_script[0] = '\0'; my_macs_change_script[0] = '\0'; /* init the lists heads */ for (i = 0; i < HASHSIZE; i++) { list_head_init(&name_list[i]); list_head_init(&forwarder_list[i]); list_head_init(&service_list[i]); list_head_init(&mac_list[i]); list_head_init(&latlon_list[i]); } } static int set_nameservice_server(const char *value, void *data, set_plugin_parameter_addon addon) { union olsr_ip_addr ip; struct name_entry **v = data; if (0 == strlen(value)) { *v = add_name_to_list(*v, "", addon.ui, NULL); OLSR_PRINTF(1, "%s got %s (main address)\n", "Got", value); return 0; } else if (0 < inet_pton(olsr_cnf->ip_version, value, &ip)) { *v = add_name_to_list(*v, "", addon.ui, &ip); OLSR_PRINTF(1, "%s got %s\n", "Got", value); return 0; } else { OLSR_PRINTF(0, "Illegal IP address \"%s\"", value); } return 1; } static int set_nameservice_name(const char *value, void *data, set_plugin_parameter_addon addon) { struct name_entry **v = data; if (0 < strlen(value)) { *v = add_name_to_list(*v, value, addon.ui, NULL); OLSR_PRINTF(1, "%s got %s (main address)\n", "Got", value); return 0; } else { OLSR_PRINTF(0, "Illegal name \"%s\"", value); } return 1; } static int set_nameservice_host(const char *value, void *data, set_plugin_parameter_addon addon) { union olsr_ip_addr ip; struct name_entry **v = data; if (0 < inet_pton(olsr_cnf->ip_version, addon.pc, &ip)) { // the IP is validated later *v = add_name_to_list(*v, value, NAME_HOST, &ip); OLSR_PRINTF(1, "%s: %s got %s\n", "Got", addon.pc, value); return 0; } else { OLSR_PRINTF(0, "%s: Illegal IP address \"%s\"", addon.pc, value); } return 1; } static int set_nameservice_float(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused))) { if (data != NULL) { sscanf(value, "%f", (float *)data); OLSR_PRINTF(1, "%s float %f\n", "Got", (double)(*(float *)data)); } else { OLSR_PRINTF(0, "%s float %s\n", "Ignored", value); } return 0; } /* *INDENT-OFF* */ static const struct olsrd_plugin_parameters plugin_parameters[] = { { .name = "interval", .set_plugin_parameter = &set_plugin_int, .data = &my_interval }, { .name = "timeout", .set_plugin_parameter = &set_nameservice_float, .data = &my_timeout }, { .name = "sighup-pid-file", .set_plugin_parameter = &set_plugin_string, .data = &my_sighup_pid_file, .addon = {sizeof(my_sighup_pid_file)} }, { .name = "hosts-file", .set_plugin_parameter = &set_plugin_string, .data = &my_hosts_file, .addon = {sizeof(my_hosts_file)} }, { .name = "name-change-script", .set_plugin_parameter = &set_plugin_string, .data = &my_name_change_script, .addon = {sizeof(my_name_change_script)} }, { .name = "services-change-script", .set_plugin_parameter = &set_plugin_string, .data = &my_services_change_script, .addon = {sizeof(my_services_change_script)} }, { .name = "macs-change-script", .set_plugin_parameter = &set_plugin_string, .data = &my_macs_change_script, .addon = {sizeof(my_macs_change_script)} }, { .name = "resolv-file", .set_plugin_parameter = &set_plugin_string, .data = &my_resolv_file, .addon = {sizeof(my_resolv_file)} }, { .name = "suffix", .set_plugin_parameter = &set_plugin_string, .data = &my_suffix, .addon = {sizeof(my_suffix)} }, { .name = "add-hosts", .set_plugin_parameter = &set_plugin_string, .data = &my_add_hosts, .addon = {sizeof(my_add_hosts)} }, { .name = "services-file", .set_plugin_parameter = &set_plugin_string, .data = &my_services_file, .addon = {sizeof(my_services_file)} }, { .name = "macs-file", .set_plugin_parameter = &set_plugin_string, .data = &my_macs_file, .addon = {sizeof(my_macs_file)} }, { .name = "lat", .set_plugin_parameter = &set_nameservice_float, .data = &my_lat }, { .name = "lon", .set_plugin_parameter = &set_nameservice_float, .data = &my_lon }, { .name = "latlon-file", .set_plugin_parameter = &set_plugin_string, .data = &my_latlon_file, .addon = {sizeof(my_latlon_file)} }, { .name = "latlon-infile", .set_plugin_parameter = &set_plugin_string, .data = &latlon_in_file, .addon = {sizeof(latlon_in_file)} }, { .name = "dns-server", .set_plugin_parameter = &set_nameservice_server, .data = &my_forwarders, .addon = {NAME_FORWARDER} }, { .name = "name", .set_plugin_parameter = &set_nameservice_name, .data = &my_names, .addon = {NAME_HOST} }, { .name = "service", .set_plugin_parameter = &set_nameservice_name, .data = &my_services, .addon = {NAME_SERVICE} }, { .name = "mac", .set_plugin_parameter = &set_nameservice_name, .data = &my_macs, .addon = {NAME_MACADDR} }, { .name = "", .set_plugin_parameter = &set_nameservice_host, .data = &my_names }, }; /* *INDENT-OFF* */ void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = sizeof(plugin_parameters) / sizeof(*plugin_parameters); } /** * queue the name/forwarder/service given in value * to the front of my_list */ struct name_entry * add_name_to_list(struct name_entry *my_list, const char *value, int type, const union olsr_ip_addr *ip) { struct name_entry *tmp = olsr_malloc(sizeof(struct name_entry), "new name_entry add_name_to_list"); tmp->name = strndup(value, MAX_NAME); tmp->len = strlen(tmp->name); tmp->type = type; // all IPs with value 0 will be set to main_addr later if (ip == NULL) memset(&tmp->ip, 0, sizeof(tmp->ip)); else tmp->ip = *ip; tmp->next = my_list; return tmp; } /** * last initialization * * we have to do this here because some things like main_addr * or the dns suffix (for validation) are not known before * * this is beause of the order in which the plugin is initialized * by the plugin loader: * - first the parameters are sent * - then register_olsr_data() from olsrd_plugin.c is called * which sets up main_addr and some other variables * - register_olsr_data() then then finally calls this function */ int name_init(void) { /* register functions with olsrd */ olsr_parser_add_function(&olsr_parser, PARSER_TYPE); /* periodic message generation */ msg_gen_timer = olsr_start_timer(my_interval * MSEC_PER_SEC, EMISSION_JITTER, OLSR_TIMER_PERIODIC, &olsr_namesvc_gen, NULL, 0); return 1; } static void name_lazy_init(void) { struct name_entry *name; union olsr_ip_addr ipz; int ret; //regex string for validating the hostnames const char *regex_name = "^[[:alnum:]_.-]+$"; //regex string for the service line size_t regex_size; char *regex_service; /* wait for configured master IP */ if (ipequal(&olsr_cnf->main_addr, &olsr_ip_zero)) { return; } nameservice_configured = true; regex_size = 256 * sizeof(char) + strlen(my_suffix); regex_service = olsr_malloc(regex_size, "new *char from name_init for regex_service"); memset(&ipz, 0, sizeof(ipz)); //compile the regex from the string if ((ret = regcomp(®ex_t_name, regex_name, REG_EXTENDED)) != 0) { /* #2: call regerror() if regcomp failed * commented out, because only for debuggin needed * int errmsgsz = regerror(ret, ®ex_t_name, NULL, 0); char *errmsg = malloc(errmsgsz); regerror(ret, ®ex_t_name, errmsg, errmsgsz); fprintf(stderr, "regcomp: %s", errmsg); free(errmsg); regfree(®ex_t_name); * */ OLSR_PRINTF(0, "compilation of regex \"%s\" for hostname failed", regex_name); } // a service line is something like prot://hostname.suffix:port|tcp|my little description about this service // for example http://router.olsr:80|tcp|my homepage // prot :// (hostname.suffix OR ip) //regex_service = "^[[:alnum:]]+://(([[:alnum:]_.-]+.olsr)|([[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\.[[:digit:]]{1,3})) // : port /path |(tcp OR udp) |short description // :[[:digit:]]+[[:alnum:]/?._=#-]*\\|(tcp|udp)\\|[^|[:cntrl:]]+$"; strscpy(regex_service, "^[[:alnum:]]+://(([[:alnum:]_.-]+", regex_size); strscat(regex_service, my_suffix, regex_size); strscat(regex_service, ")|([[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\.[[:digit:]]{1,3})):[[:digit:]]+[[:alnum:]/?._=#-]*\\|(tcp|udp)\\|[^|[:cntrl:]]+$", regex_size); /* #1: call regcomp() to compile the regex */ if ((ret = regcomp(®ex_t_service, regex_service, REG_EXTENDED)) != 0) { /* #2: call regerror() if regcomp failed * commented out, because only for debuggin needed * int errmsgsz = regerror(ret, ®ex_t_service, NULL, 0); char *errmsg = malloc(errmsgsz); regerror(ret, ®ex_t_service, errmsg, errmsgsz); fprintf(stderr, "regcomp: %s", errmsg); free(errmsg); regfree(®ex_t_service); * */ OLSR_PRINTF(0, "compilation of regex \"%s\" for hostname failed", regex_name); } free(regex_service); regex_service = NULL; //fill in main addr for all entries with ip==0 //this does not matter for service, because the ip does not matter //for service for (name = my_names; name != NULL; name = name->next) { if (ipequal(&name->ip, &ipz)) { OLSR_PRINTF(2, "NAME PLUGIN: insert main addr for name %s \n", name->name); name->ip = olsr_cnf->main_addr; } } for (name = my_forwarders; name != NULL; name = name->next) { if (name->ip.v4.s_addr == 0) { OLSR_PRINTF(2, "NAME PLUGIN: insert main addr for name %s \n", name->name); name->ip = olsr_cnf->main_addr; } } //check if entries I want to announce myself are valid and allowed my_names = remove_nonvalid_names_from_list(my_names, NAME_HOST); my_forwarders = remove_nonvalid_names_from_list(my_forwarders, NAME_FORWARDER); my_services = remove_nonvalid_names_from_list(my_services, NAME_SERVICE); my_macs = remove_nonvalid_names_from_list(my_macs, NAME_MACADDR); mapwrite_init(my_latlon_file); return; } struct name_entry * remove_nonvalid_names_from_list(struct name_entry *my_list, int type) { struct name_entry *next = my_list; bool valid = false; if (my_list == NULL) { return NULL; } switch (type) { case NAME_HOST: valid = is_name_wellformed(my_list->name) && allowed_ip(&my_list->ip); break; case NAME_FORWARDER: valid = allowed_ip(&my_list->ip); break; case NAME_SERVICE: valid = allowed_service(my_list->name); break; case NAME_MACADDR: valid = is_mac_wellformed(my_list->name); break; case NAME_LATLON: valid = is_latlon_wellformed(my_list->name); break; default: valid = false; break; } if (!valid) { struct ipaddr_str strbuf; OLSR_PRINTF(1, "NAME PLUGIN: invalid or malformed parameter %s (%s), fix your config!\n", my_list->name, olsr_ip_to_string(&strbuf, &my_list->ip)); next = my_list->next; free(my_list->name); my_list->name = NULL; free(my_list); my_list = NULL; return remove_nonvalid_names_from_list(next, type); } else { struct ipaddr_str strbuf; OLSR_PRINTF(2, "NAME PLUGIN: validate parameter %s (%s) -> OK\n", my_list->name, olsr_ip_to_string(&strbuf, &my_list->ip)); my_list->next = remove_nonvalid_names_from_list(my_list->next, type); return my_list; } } /** * called at unload: free everything * * XXX: should I delete the hosts/services/resolv.conf files on exit? */ void name_destructor(void) { OLSR_PRINTF(2, "NAME PLUGIN: exit. cleaning up...\n"); free_name_entry_list(&my_names); free_name_entry_list(&my_services); free_name_entry_list(&my_macs); free_name_entry_list(&my_forwarders); free_all_list_entries(name_list); free_all_list_entries(service_list); free_all_list_entries(mac_list); free_all_list_entries(forwarder_list); free_all_list_entries(latlon_list); olsr_stop_timer(write_file_timer); olsr_stop_timer(msg_gen_timer); regfree(®ex_t_name); regfree(®ex_t_service); mapwrite_exit(); } /* free all list entries */ void free_all_list_entries(struct list_node *this_db_list) { struct db_entry *db; struct list_node *list_head, *list_node, *list_node_next; int i; for (i = 0; i < HASHSIZE; i++) { list_head = &this_db_list[i]; for (list_node = list_head->next; list_node != list_head; list_node = list_node_next) { /* prefetch next node before loosing context */ list_node_next = list_node->next; db = list2db(list_node); olsr_namesvc_delete_db_entry(db); } } } /** * The write file timer has fired. */ void olsr_expire_write_file_timer(void *context __attribute__ ((unused))) { write_file_timer = NULL; write_resolv_file(); /* if forwarder_table_changed */ write_hosts_file(); /* if name_table_changed */ write_services_file(false); /* if service_table_changed */ write_services_file(true); /* if mac_table_changed */ #ifdef _WIN32 write_latlon_file(); /* if latlon_table_changed */ #endif /* _WIN32 */ } /* * Kick a timer to write everything into a file. * This also paces things a bit. */ static void olsr_start_write_file_timer(void) { if (write_file_timer) { return; } write_file_timer = olsr_start_timer(5 * MSEC_PER_SEC, 5, OLSR_TIMER_ONESHOT, olsr_expire_write_file_timer, NULL, 0); } /* * Delete and unlink db_entry. */ void olsr_namesvc_delete_db_entry(struct db_entry *db) { struct ipaddr_str strbuf; OLSR_PRINTF(2, "NAME PLUGIN: %s timed out... deleting\n", olsr_ip_to_string(&strbuf, &db->originator)); olsr_start_write_file_timer(); olsr_stop_timer(db->db_timer); /* stop timer if running */ /* Delete */ free_name_entry_list(&db->names); list_remove(&db->db_list); free(db); } /** * Callback for the db validity timer. */ static void olsr_nameservice_expire_db_timer(void *context) { struct db_entry *db; db = (struct db_entry *)context; db->db_timer = NULL; /* be pedandic */ olsr_namesvc_delete_db_entry(db); } /** * Scheduled event: generate and send NAME packet */ void olsr_namesvc_gen(void *foo __attribute__ ((unused))) { /* send buffer: huge */ char buffer[10240]; union olsr_message *message = (union olsr_message *)buffer; struct interface *ifn; int namesize; if (!nameservice_configured) { name_lazy_init(); if (!nameservice_configured) { return; } } /* fill message */ if (olsr_cnf->ip_version == AF_INET) { /* IPv4 */ message->v4.olsr_msgtype = MESSAGE_TYPE; message->v4.olsr_vtime = reltime_to_me(my_timeout * MSEC_PER_SEC); memcpy(&message->v4.originator, &olsr_cnf->main_addr, olsr_cnf->ipsize); message->v4.ttl = MAX_TTL; message->v4.hopcnt = 0; message->v4.seqno = htons(get_msg_seqno()); namesize = encap_namemsg((struct namemsg *)ARM_NOWARN_ALIGN(&message->v4.message)); namesize = namesize + sizeof(struct olsrmsg); message->v4.olsr_msgsize = htons(namesize); } else { /* IPv6 */ message->v6.olsr_msgtype = MESSAGE_TYPE; message->v6.olsr_vtime = reltime_to_me(my_timeout * MSEC_PER_SEC); memcpy(&message->v6.originator, &olsr_cnf->main_addr, olsr_cnf->ipsize); message->v6.ttl = MAX_TTL; message->v6.hopcnt = 0; message->v6.seqno = htons(get_msg_seqno()); namesize = encap_namemsg((struct namemsg *)ARM_NOWARN_ALIGN(&message->v6.message)); namesize = namesize + sizeof(struct olsrmsg6); message->v6.olsr_msgsize = htons(namesize); } /* looping trough interfaces */ for (ifn = ifnet; ifn; ifn = ifn->int_next) { OLSR_PRINTF(3, "NAME PLUGIN: Generating packet - [%s]\n", ifn->int_name); if (net_outbuffer_push(ifn, message, namesize) != namesize) { /* send data and try again */ net_output(ifn); if (net_outbuffer_push(ifn, message, namesize) != namesize) { OLSR_PRINTF(1, "NAME PLUGIN: could not send on interface: %s\n", ifn->int_name); } } } } /** * Parse name olsr message of NAME type */ bool olsr_parser(union olsr_message *m, struct interface *in_if __attribute__ ((unused)), union olsr_ip_addr *ipaddr) { struct namemsg *namemessage; union olsr_ip_addr originator; olsr_reltime vtime; int size; if (!nameservice_configured) { name_lazy_init(); if (!nameservice_configured) { return false; } } /* Fetch the originator of the messsage */ if (olsr_cnf->ip_version == AF_INET) { memcpy(&originator, &m->v4.originator, olsr_cnf->ipsize); } else { memcpy(&originator, &m->v6.originator, olsr_cnf->ipsize); } /* Fetch the message based on IP version */ if (olsr_cnf->ip_version == AF_INET) { vtime = me_to_reltime(m->v4.olsr_vtime); size = ntohs(m->v4.olsr_msgsize); namemessage = (struct namemsg *)ARM_NOWARN_ALIGN(&m->v4.message); } else { vtime = me_to_reltime(m->v6.olsr_vtime); size = ntohs(m->v6.olsr_msgsize); namemessage = (struct namemsg *)ARM_NOWARN_ALIGN(&m->v6.message); } /* Check if message originated from this node. If so - back off */ if (ipequal(&originator, &olsr_cnf->main_addr)) return false; /* Check that the neighbor this message was received from is symmetric. If not - back off */ if (check_neighbor_link(ipaddr) != SYM_LINK) { struct ipaddr_str strbuf; OLSR_PRINTF(3, "NAME PLUGIN: Received msg from NON SYM neighbor %s\n", olsr_ip_to_string(&strbuf, ipaddr)); return false; } update_name_entry(&originator, namemessage, size, vtime); /* Forward the message */ return true; } /** * Encapsulate a name message into a packet. * * It assumed that there is enough space in the buffer to do this! * * Returns: the length of the message that was appended */ int encap_namemsg(struct namemsg *msg) { struct name_entry *my_name; // add the hostname, service and forwarder entries after the namemsg header char *pos = (char *)msg + sizeof(struct namemsg); short i = 0; // names for (my_name = my_names; my_name != NULL; my_name = my_name->next) { pos = create_packet((struct name *)ARM_NOWARN_ALIGN(pos), my_name); i++; } // forwarders for (my_name = my_forwarders; my_name != NULL; my_name = my_name->next) { pos = create_packet((struct name *)ARM_NOWARN_ALIGN(pos), my_name); i++; } // services for (my_name = my_services; my_name != NULL; my_name = my_name->next) { pos = create_packet((struct name *)ARM_NOWARN_ALIGN(pos), my_name); i++; } // macs for (my_name = my_macs; my_name != NULL; my_name = my_name->next) { pos = create_packet((struct name *)ARM_NOWARN_ALIGN(pos), my_name); i++; } // latlon if ('\0' != latlon_in_file[0]) { FILE *in = fopen(latlon_in_file, "r"); if (in != NULL) { if (fscanf(in, "%f,%f", &my_lat, &my_lon)) {} fclose(in); } else { OLSR_PRINTF(0, "NAME PLUGIN: cant read latlon in file %s\n", latlon_in_file); } } if (0.0f != my_lat && 0.0f != my_lon) { char s[64]; struct name_entry e; memset(&e, 0, sizeof(e)); sprintf(s, "%f,%f,%d", (double)my_lat, (double)my_lon, get_isdefhna_latlon()); e.len = strlen(s); e.type = NAME_LATLON; e.name = s; lookup_defhna_latlon(&e.ip); pos = create_packet((struct name *)ARM_NOWARN_ALIGN(pos), &e); i++; } // write the namemsg header with the number of announced entries and the protocol version msg->nr_names = htons(i); msg->version = htons(NAME_PROTOCOL_VERSION); return pos - (char *)msg; //length } /** * convert each of my to be announced name_entries into network * compatible format * * return the length of the name packet */ char * create_packet(struct name *to, struct name_entry *from) { char *pos = (char *)to; int k; struct ipaddr_str strbuf; OLSR_PRINTF(3, "NAME PLUGIN: Announcing name %s (%s) %d\n", from->name, olsr_ip_to_string(&strbuf, &from->ip), from->len); to->type = htons(from->type); to->len = htons(from->len); to->ip = from->ip; pos += sizeof(struct name); memcpy(pos, from->name, from->len); pos += from->len; for (k = from->len; (k & 3) != 0; k++) *pos++ = '\0'; return pos; } /** * decapsulate a received name, service or forwarder and update the corresponding hash table if necessary */ void decap_namemsg(struct name *from_packet, struct name_entry **to, bool * this_table_changed) { struct ipaddr_str strbuf; struct name_entry *tmp; struct name_entry *already_saved_name_entries; char *name = (char *)from_packet + sizeof(struct name); int type_of_from_packet = ntohs(from_packet->type); unsigned int len_of_name = ntohs(from_packet->len); OLSR_PRINTF(4, "NAME PLUGIN: decap type=%d, len=%d, name=%s\n", type_of_from_packet, len_of_name, name); //XXX: should I check the from_packet->ip here? If so, why not also check the ip from HOST and SERVICE? if ((type_of_from_packet == NAME_HOST && !is_name_wellformed(name)) || (type_of_from_packet == NAME_SERVICE && !is_service_wellformed(name)) || (type_of_from_packet == NAME_MACADDR && !is_mac_wellformed(name)) || (type_of_from_packet == NAME_LATLON && !is_latlon_wellformed(name))) { OLSR_PRINTF(4, "NAME PLUGIN: invalid name [%s] received, skipping.\n", name); return; } //ignore all packets with a too long name //or a spoofed len of its included name string if (len_of_name > MAX_NAME || strlen(name) != len_of_name || NULL != strchr(name, '\\') || NULL != strchr(name, '\'')) { OLSR_PRINTF(4, "NAME PLUGIN: from_packet->len %d > MAX_NAME %d or from_packet->len %d !0 strlen(name [%s] in packet)\n", len_of_name, MAX_NAME, len_of_name, name); return; } // don't insert the received entry again, if it has already been inserted in the hash table. // Instead only the validity time is set in insert_new_name_in_list function, which calls this one for (already_saved_name_entries = (*to); already_saved_name_entries != NULL; already_saved_name_entries = already_saved_name_entries->next) { if ((type_of_from_packet == NAME_HOST || type_of_from_packet == NAME_SERVICE) && strncmp(already_saved_name_entries->name, name, len_of_name) == 0) { OLSR_PRINTF(4, "NAME PLUGIN: received name or service entry %s (%s) already in hash table\n", name, olsr_ip_to_string(&strbuf, &already_saved_name_entries->ip)); return; } else if (type_of_from_packet == NAME_FORWARDER && ipequal(&already_saved_name_entries->ip, &from_packet->ip)) { OLSR_PRINTF(4, "NAME PLUGIN: received forwarder entry %s (%s) already in hash table\n", name, olsr_ip_to_string(&strbuf, &already_saved_name_entries->ip)); return; } else if (type_of_from_packet == NAME_LATLON) { if (0 != strncmp(already_saved_name_entries->name, name, len_of_name)) { OLSR_PRINTF(4, "NAME PLUGIN: updating name %s -> %s (%s)\n", already_saved_name_entries->name, name, olsr_ip_to_string(&strbuf, &already_saved_name_entries->ip)); free(already_saved_name_entries->name); already_saved_name_entries->name = olsr_malloc(len_of_name + 1, "upd name_entry name"); strscpy(already_saved_name_entries->name, name, len_of_name + 1); *this_table_changed = true; olsr_start_write_file_timer(); } if (!ipequal(&already_saved_name_entries->ip, &from_packet->ip)) { struct ipaddr_str strbuf2, strbuf3; OLSR_PRINTF(4, "NAME PLUGIN: updating ip %s -> %s (%s)\n", olsr_ip_to_string(&strbuf, &already_saved_name_entries->ip), olsr_ip_to_string(&strbuf2, &from_packet->ip), olsr_ip_to_string(&strbuf3, &already_saved_name_entries->ip)); already_saved_name_entries->ip = from_packet->ip; *this_table_changed = true; olsr_start_write_file_timer(); } if (!*this_table_changed) { OLSR_PRINTF(4, "NAME PLUGIN: received latlon entry %s (%s) already in hash table\n", name, olsr_ip_to_string(&strbuf, &already_saved_name_entries->ip)); } return; } } //if not yet known entry tmp = olsr_malloc(sizeof(struct name_entry), "new name_entry"); tmp->type = ntohs(from_packet->type); tmp->len = ntohs(from_packet->len); tmp->name = olsr_malloc(tmp->len + 1, "new name_entry name"); tmp->ip = from_packet->ip; strscpy(tmp->name, name, tmp->len + 1); OLSR_PRINTF(3, "\nNAME PLUGIN: create new name/service/forwarder entry %s (%s) [len=%d] [type=%d] in linked list\n", tmp->name, olsr_ip_to_string(&strbuf, &tmp->ip), tmp->len, tmp->type); *this_table_changed = true; olsr_start_write_file_timer(); // queue to front tmp->next = *to; *to = tmp; } /** * unpack the received message and delegate to the decapsulation function for each * name/service/forwarder entry in the message */ void update_name_entry(union olsr_ip_addr *originator, struct namemsg *msg, int msg_size, olsr_reltime vtime) { struct ipaddr_str strbuf; char *pos, *end_pos; struct name *from_packet; int i; OLSR_PRINTF(3, "NAME PLUGIN: Received Message from %s\n", olsr_ip_to_string(&strbuf, originator)); if (ntohs(msg->version) != NAME_PROTOCOL_VERSION) { OLSR_PRINTF(3, "NAME PLUGIN: ignoring wrong version %d\n", msg->version); return; } /* now add the names from the message */ pos = (char *)msg + sizeof(struct namemsg); end_pos = pos + msg_size - sizeof(struct name *); // at least one struct name has to be left for (i = ntohs(msg->nr_names); i > 0 && pos < end_pos; i--) { from_packet = (struct name *)ARM_NOWARN_ALIGN(pos); switch (ntohs(from_packet->type)) { case NAME_HOST: insert_new_name_in_list(originator, name_list, from_packet, &name_table_changed, vtime); break; case NAME_FORWARDER: insert_new_name_in_list(originator, forwarder_list, from_packet, &forwarder_table_changed, vtime); break; case NAME_SERVICE: insert_new_name_in_list(originator, service_list, from_packet, &service_table_changed, vtime); break; case NAME_MACADDR: insert_new_name_in_list(originator, mac_list, from_packet, &mac_table_changed, vtime); break; case NAME_LATLON: insert_new_name_in_list(originator, latlon_list, from_packet, &latlon_table_changed, vtime); break; default: OLSR_PRINTF(3, "NAME PLUGIN: Received Message of unknown type [%d] from (%s)\n", from_packet->type, olsr_ip_to_string(&strbuf, originator)); break; } pos += sizeof(struct name); pos += 1 + ((ntohs(from_packet->len) - 1) | 3); } if (i != 0) OLSR_PRINTF(4, "NAME PLUGIN: Lost %d entries in received packet due to length inconsistency (%s)\n", i, olsr_ip_to_string(&strbuf, originator)); } /** * insert all the new names,services and forwarders from a received packet into the * corresponding entry for this ip in the corresponding hash table */ void insert_new_name_in_list(union olsr_ip_addr *originator, struct list_node *this_list, struct name *from_packet, bool * this_table_changed, olsr_reltime vtime) { int hash; struct db_entry *entry; struct list_node *list_head, *list_node; bool entry_found = false; hash = olsr_ip_hashing(originator); /* find the entry for originator, if there is already one */ list_head = &this_list[hash]; for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) { entry = list2db(list_node); if (ipequal(originator, &entry->originator)) { struct ipaddr_str strbuf; // found OLSR_PRINTF(4, "NAME PLUGIN: found entry for (%s) in its hash table\n", olsr_ip_to_string(&strbuf, originator)); //delegate to function for parsing the packet and linking it to entry->names decap_namemsg(from_packet, &entry->names, this_table_changed); olsr_set_timer(&entry->db_timer, vtime, OLSR_NAMESVC_DB_JITTER, OLSR_TIMER_ONESHOT, &olsr_nameservice_expire_db_timer, entry, 0); entry_found = true; } } if (!entry_found) { struct ipaddr_str strbuf; OLSR_PRINTF(3, "NAME PLUGIN: create new db entry for ip (%s) in hash table\n", olsr_ip_to_string(&strbuf, originator)); /* insert a new entry */ entry = olsr_malloc(sizeof(struct db_entry), "new db_entry"); memset(entry, 0, sizeof(struct db_entry)); entry->originator = *originator; olsr_set_timer(&entry->db_timer, vtime, OLSR_LINK_LOSS_JITTER, OLSR_TIMER_ONESHOT, &olsr_nameservice_expire_db_timer, entry, 0); entry->names = NULL; /* insert to the list */ list_add_before(&this_list[hash], &entry->db_list); //delegate to function for parsing the packet and linking it to entry->names decap_namemsg(from_packet, &entry->names, this_table_changed); } } #ifndef _WIN32 static void send_sighup_to_pidfile(char *pid_file) { int fd; int i = 0; int result; pid_t ipid; char line[20]; char *endptr; fd = open(pid_file, O_RDONLY); if (fd < 0) { OLSR_PRINTF(2, "NAME PLUGIN: can't open file %s\n", pid_file); goto out; } while (i < 19) { result = read(fd, line + i, 19 - i); if (!result) { /* EOF */ break; } else if (result > 0) { i += result; } else if (errno != EINTR && errno != EAGAIN) { OLSR_PRINTF(2, "NAME PLUGIN: can't read file %s\n", pid_file); goto out; } } line[i] = 0; close(fd); fd = -1; ipid = strtol(line, &endptr, 0); if (endptr == line) { OLSR_PRINTF(2, "NAME PLUGIN: invalid pid at file %s\n", pid_file); goto out;; } result = kill(ipid, SIGHUP); if (result == 0) { OLSR_PRINTF(2, "NAME PLUGIN: SIGHUP sent to pid %i\n", ipid); } else { OLSR_PRINTF(2, "NAME PLUGIN: failed to send SIGHUP to pid %i\n", ipid); } out: if (fd >= 0) { close(fd); } } #endif /* _WIN32 */ /** * write names to a file in /etc/hosts compatible format */ void write_hosts_file(void) { int hash; struct name_entry *name; struct db_entry *entry; struct list_node *list_head, *list_node; FILE *hosts; FILE *add_hosts; int c = 0; time_t currtime; #ifdef MID_ENTRIES struct mid_address *alias; #endif /* MID_ENTRIES */ if (!name_table_changed) return; OLSR_PRINTF(2, "NAME PLUGIN: writing hosts file\n"); hosts = fopen(my_hosts_file, "w"); if (hosts == NULL) { OLSR_PRINTF(2, "NAME PLUGIN: cant write hosts file\n"); return; } fprintf(hosts, "### this /etc/hosts file is overwritten regularly by olsrd\n"); fprintf(hosts, "### do not edit\n\n"); fprintf(hosts, "127.0.0.1\tlocalhost\n"); fprintf(hosts, "::1\t\tlocalhost\n\n"); // copy content from additional hosts filename if (my_add_hosts[0] != '\0') { add_hosts = fopen(my_add_hosts, "r"); if (add_hosts == NULL) { OLSR_PRINTF(2, "NAME PLUGIN: cant open additional hosts file\n"); } else { fprintf(hosts, "### contents from '%s' ###\n\n", my_add_hosts); while ((c = getc(add_hosts)) != EOF) putc(c, hosts); fclose(add_hosts); } fprintf(hosts, "\n### olsr names ###\n\n"); } // write own names for (name = my_names; name != NULL; name = name->next) { struct ipaddr_str strbuf; fprintf(hosts, "%s\t%s%s\t# myself\n", olsr_ip_to_string(&strbuf, &name->ip), name->name, my_suffix); } // write received names for (hash = 0; hash < HASHSIZE; hash++) { list_head = &name_list[hash]; for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) { entry = list2db(list_node); for (name = entry->names; name != NULL; name = name->next) { struct ipaddr_str strbuf1, strbuf2; OLSR_PRINTF(6, "%s\t%s%s\t#%s\n", olsr_ip_to_string(&strbuf1, &name->ip), name->name, my_suffix, olsr_ip_to_string(&strbuf2, &entry->originator)); fprintf(hosts, "%s\t%s%s\t# %s\n", olsr_ip_to_string(&strbuf1, &name->ip), name->name, my_suffix, olsr_ip_to_string(&strbuf2, &entry->originator)); #ifdef MID_ENTRIES // write mid entries if ((alias = mid_lookup_aliases(&name->ip)) != NULL) { unsigned short mid_num = 1; char mid_prefix[MID_MAXLEN]; while (alias != NULL) { // generate mid prefix sprintf(mid_prefix, MID_PREFIX, mid_num); OLSR_PRINTF(6, "%s\t%s%s%s\t# %s (mid #%i)\n", olsr_ip_to_string(&strbuf1, &alias->alias), mid_prefix, name->name, my_suffix, olsr_ip_to_string(&strbuf2, &entry->originator), mid_num); fprintf(hosts, "%s\t%s%s%s\t# %s (mid #%i)\n", olsr_ip_to_string(&strbuf1, &alias->alias), mid_prefix, name->name, my_suffix, olsr_ip_to_string(&strbuf2, &entry->originator), mid_num); alias = alias->next_alias; mid_num++; } } #endif /* MID_ENTRIES */ } } } if (time(&currtime)) { fprintf(hosts, "\n### written by olsrd at %s", ctime(&currtime)); } fclose(hosts); #ifndef _WIN32 if (*my_sighup_pid_file) send_sighup_to_pidfile(my_sighup_pid_file); #endif /* _WIN32 */ name_table_changed = false; // Executes my_name_change_script after writing the hosts file if (my_name_change_script[0] != '\0') { if (system(my_name_change_script) != -1) { OLSR_PRINTF(2, "NAME PLUGIN: Name changed, %s executed\n", my_name_change_script); } else { OLSR_PRINTF(2, "NAME PLUGIN: WARNING! Failed to execute %s on hosts change\n", my_name_change_script); } } } /** * write services or macs to a file in the format: * service-or-mac #originator ip * * since service has a special format * each line will look similar to e.g. * http://me.olsr:80|tcp|my little homepage * while a mac line will look similar to * 02:ca:ff:ee:ba:be,1 */ void write_services_file(bool writemacs) { int hash; struct name_entry *name; struct db_entry *entry; struct list_node *list_head, *list_node; FILE *file; time_t currtime; if ((writemacs && !mac_table_changed) || (!writemacs && !service_table_changed)) return; OLSR_PRINTF(2, "NAME PLUGIN: writing %s file\n", writemacs ? "macs" : "services"); file = fopen(writemacs ? my_macs_file : my_services_file, "w"); if (file == NULL) { OLSR_PRINTF(2, "NAME PLUGIN: cant write %s\n", writemacs ? my_macs_file : my_services_file); return; } fprintf(file, "### this file is overwritten regularly by olsrd\n"); fprintf(file, "### do not edit\n\n"); // write own services or macs for (name = writemacs ? my_macs : my_services; name != NULL; name = name->next) { fprintf(file, "%s\t# my own %s\n", name->name, writemacs ? "mac" : "service"); } // write received services or macs for (hash = 0; hash < HASHSIZE; hash++) { list_head = writemacs ? &mac_list[hash] : &service_list[hash]; for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) { entry = list2db(list_node); for (name = entry->names; name != NULL; name = name->next) { struct ipaddr_str strbuf; OLSR_PRINTF(6, "%s\t", name->name); OLSR_PRINTF(6, "\t#%s\n", olsr_ip_to_string(&strbuf, &entry->originator)); fprintf(file, "%s\t", name->name); fprintf(file, "\t#%s\n", olsr_ip_to_string(&strbuf, &entry->originator)); } } } if (time(&currtime)) { fprintf(file, "\n### written by olsrd at %s", ctime(&currtime)); } fclose(file); if (writemacs) { // Executes my_macs_change_script after writing the macs file if (my_macs_change_script[0] != '\0') { if (system(my_macs_change_script) != -1) { OLSR_PRINTF(2, "NAME PLUGIN: Service changed, %s executed\n", my_macs_change_script); } else { OLSR_PRINTF(2, "NAME PLUGIN: WARNING! Failed to execute %s on mac change\n", my_macs_change_script); } } mac_table_changed = false; } else { // Executes my_services_change_script after writing the services file if (my_services_change_script[0] != '\0') { if (system(my_services_change_script) != -1) { OLSR_PRINTF(2, "NAME PLUGIN: Service changed, %s executed\n", my_services_change_script); } else { OLSR_PRINTF(2, "NAME PLUGIN: WARNING! Failed to execute %s on service change\n", my_services_change_script); } } service_table_changed = false; } } /** * Sort the nameserver pointer array. * * fresh entries are at the beginning of the array and * the best entry is at the end of the array. */ static void select_best_nameserver(struct rt_entry **rt) { int nameserver_idx; struct rt_entry *rt1, *rt2; for (nameserver_idx = 0; nameserver_idx < NAMESERVER_COUNT; nameserver_idx++) { rt1 = rt[nameserver_idx]; rt2 = rt[nameserver_idx + 1]; /* * compare the next two pointers in the array. * if the second pointer is NULL then percolate it up. */ if (!rt2 || olsr_cmp_rt(rt1, rt2)) { #ifndef NODEBUG struct ipaddr_str strbuf; struct lqtextbuffer lqbuffer; #endif /* NODEBUG */ /* * first is better, swap the pointers. */ OLSR_PRINTF(6, "NAME PLUGIN: nameserver %s, cost %s\n", olsr_ip_to_string(&strbuf, &rt1->rt_dst.prefix), get_linkcost_text(rt1->rt_best->rtp_metric.cost, true, &lqbuffer)); rt[nameserver_idx] = rt2; rt[nameserver_idx + 1] = rt1; } } } /** * write the 3 best upstream DNS servers to resolv.conf file * best means the 3 with the best etx value in routing table */ void write_resolv_file(void) { int hash; struct name_entry *name; struct db_entry *entry; struct list_node *list_head, *list_node; struct rt_entry *route; static struct rt_entry *nameserver_routes[NAMESERVER_COUNT + 1]; FILE *resolv; int i = 0; time_t currtime; if (!forwarder_table_changed || my_forwarders != NULL || my_resolv_file[0] == '\0') return; /* clear the array of 3+1 nameserver routes */ memset(nameserver_routes, 0, sizeof(nameserver_routes)); for (hash = 0; hash < HASHSIZE; hash++) { list_head = &forwarder_list[hash]; for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) { entry = list2db(list_node); for (name = entry->names; name != NULL; name = name->next) { #ifndef NODEBUG struct ipaddr_str strbuf; struct lqtextbuffer lqbuffer; #endif /* NODEBUG */ route = olsr_lookup_routing_table(&name->ip); OLSR_PRINTF(6, "NAME PLUGIN: check route for nameserver %s %s", olsr_ip_to_string(&strbuf, &name->ip), route ? "suceeded" : "failed"); if (route == NULL) // it's possible that route is not present yet continue; /* enqueue it on the head of list */ *nameserver_routes = route; OLSR_PRINTF(6, "NAME PLUGIN: found nameserver %s, cost %s", olsr_ip_to_string(&strbuf, &name->ip), get_linkcost_text(route->rt_best->rtp_metric.cost, true, &lqbuffer)); /* find the closet one */ select_best_nameserver(nameserver_routes); } } } /* if there is no best route we are done */ if (nameserver_routes[NAMESERVER_COUNT] == NULL) return; /* write to file */ OLSR_PRINTF(2, "NAME PLUGIN: try to write to resolv file\n"); resolv = fopen(my_resolv_file, "w"); if (resolv == NULL) { OLSR_PRINTF(2, "NAME PLUGIN: can't write resolv file\n"); return; } fprintf(resolv, "### this file is overwritten regularly by olsrd\n"); fprintf(resolv, "### do not edit\n\n"); for (i = NAMESERVER_COUNT; i >= 0; i--) { struct ipaddr_str strbuf; route = nameserver_routes[i]; OLSR_PRINTF(2, "NAME PLUGIN: nameserver_routes #%d %p\n", i, route); if (!route) { continue; } OLSR_PRINTF(2, "NAME PLUGIN: nameserver %s\n", olsr_ip_to_string(&strbuf, &route->rt_dst.prefix)); fprintf(resolv, "nameserver %s\n", olsr_ip_to_string(&strbuf, &route->rt_dst.prefix)); } if (time(&currtime)) { fprintf(resolv, "\n### written by olsrd at %s", ctime(&currtime)); } fclose(resolv); forwarder_table_changed = false; } /** * completely free a list of name_entries */ void free_name_entry_list(struct name_entry **list) { struct name_entry **tmp = list; struct name_entry *to_delete; while (*tmp != NULL) { to_delete = *tmp; *tmp = (*tmp)->next; /* flag changes */ switch (to_delete->type) { case NAME_HOST: name_table_changed = true; break; case NAME_FORWARDER: forwarder_table_changed = true; break; case NAME_SERVICE: service_table_changed = true; break; case NAME_MACADDR: mac_table_changed = true; break; case NAME_LATLON: latlon_table_changed = true; break; default: break; } free(to_delete->name); to_delete->name = NULL; free(to_delete); to_delete = NULL; } } /** * we only allow names for IP addresses which we are * responsible for: * so the IP must either be from one of the interfaces * or inside a HNA which we have configured */ bool allowed_ip(const union olsr_ip_addr *addr) { struct ip_prefix_list *hna; struct interface *iface; union olsr_ip_addr tmp_ip, tmp_msk; struct ipaddr_str strbuf; OLSR_PRINTF(6, "checking %s\n", olsr_ip_to_string(&strbuf, addr)); for (iface = ifnet; iface; iface = iface->int_next) { OLSR_PRINTF(6, "interface %s\n", olsr_ip_to_string(&strbuf, &iface->ip_addr)); if (ipequal(&iface->ip_addr, addr)) { OLSR_PRINTF(6, "MATCHED\n"); return true; } } if (olsr_cnf->ip_version == AF_INET) { for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next) { union olsr_ip_addr netmask; OLSR_PRINTF(6, "HNA %s/%d\n", olsr_ip_to_string(&strbuf, &hna->net.prefix), hna->net.prefix_len); if (hna->net.prefix_len == 0) { continue; } olsr_prefix_to_netmask(&netmask, hna->net.prefix_len); if ((addr->v4.s_addr & netmask.v4.s_addr) == hna->net.prefix.v4.s_addr) { OLSR_PRINTF(6, "MATCHED\n"); return true; } } } else { for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next) { unsigned int i; OLSR_PRINTF(6, "HNA %s/%d\n", olsr_ip_to_string(&strbuf, &hna->net.prefix), hna->net.prefix_len); if (hna->net.prefix_len == 0) continue; olsr_prefix_to_netmask(&tmp_msk, hna->net.prefix_len); for (i = 0; i < sizeof(tmp_ip.v6.s6_addr); i++) { tmp_ip.v6.s6_addr[i] = addr->v6.s6_addr[i] & tmp_msk.v6.s6_addr[i]; } if (ipequal(&tmp_ip, &hna->net.prefix)) { OLSR_PRINTF(6, "MATCHED\n"); return true; } } } return false; } /** check if name has the right syntax, i.e. it must adhere to a special regex * stored in regex_t_name * necessary to avaid names like "0.0.0.0 google.de\n etc" */ bool is_name_wellformed(const char *name) { return regexec(®ex_t_name, name, 1, ®match_t_name, 0) == 0; } /** * check if the service is in the right syntax and also that the hostname * or ip whithin the service is allowed */ bool allowed_service(const char *service_line) { /* the call of is_service_wellformed generates the submatches stored in regmatch_t_service * these are then used by allowed_hostname_or_ip_in_service * see regexec(3) for more infos */ if (!is_service_wellformed(service_line)) { return false; } else if (!allowed_hostname_or_ip_in_service(service_line, &(regmatch_t_service[1]))) { return false; } return true; } bool allowed_hostname_or_ip_in_service(const char *service_line, const regmatch_t * hostname_or_ip_match) { char *hostname_or_ip; union olsr_ip_addr olsr_ip; struct name_entry *name; if (hostname_or_ip_match->rm_so < 0 || hostname_or_ip_match->rm_eo < 0) { return false; } hostname_or_ip = strndup(&service_line[hostname_or_ip_match->rm_so], hostname_or_ip_match->rm_eo - hostname_or_ip_match->rm_so); //hostname is one of the names, that I announce (i.e. one that i am allowed to announce) for (name = my_names; name != NULL; name = name->next) { if (strncmp(name->name, hostname_or_ip, name->len - strlen(my_suffix)) == 0) { OLSR_PRINTF(4, "NAME PLUGIN: hostname %s in service %s is OK\n", hostname_or_ip, service_line); free(hostname_or_ip); hostname_or_ip = NULL; return true; } } //ip in service-line is allowed if (inet_pton(olsr_cnf->ip_version, hostname_or_ip, &olsr_ip) > 0) { if (allowed_ip(&olsr_ip)) { struct ipaddr_str strbuf; OLSR_PRINTF(2, "NAME PLUGIN: ip %s in service %s is OK\n", olsr_ip_to_string(&strbuf, &olsr_ip), service_line); free(hostname_or_ip); hostname_or_ip = NULL; return true; } } OLSR_PRINTF(1, "NAME PLUGIN: ip or hostname %s in service %s is NOT allowed (does not belong to you)\n", hostname_or_ip, service_line); free(hostname_or_ip); hostname_or_ip = NULL; return false; } /** * check if the service matches the syntax * of "protocol://host:port/path|tcp_or_udp|a short description", * which is given in the regex regex_t_service */ bool is_service_wellformed(const char *service_line) { return regexec(®ex_t_service, service_line, pmatch_service, regmatch_t_service, 0) == 0; } /* * check if the mac matches the syntax */ bool is_mac_wellformed(const char *mac_line) { size_t i; bool ret; int x[6], d = -1; for(i = 0; i < ARRAYSIZE(x); i++) x[i] = -1; sscanf(mac_line, "%02x:%02x:%02x:%02x:%02x:%02x,%d\n", &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &d); ret = 0 <= d && d <= 0xffff; for(i = 0; i < ARRAYSIZE(x); i++) ret = ret && 0 <= x[i]; return ret; } /** * check if the latlot matches the syntax */ bool is_latlon_wellformed(const char *latlon_line) { int hna = -1; float a = 0.0, b = 0.0; sscanf(latlon_line, "%f,%f,%d", &a, &b, &hna); return (a != 0.0f && b != 0.0f && -1 != hna); } /** * Returns 1 if this olsrd announces inet */ bool get_isdefhna_latlon(void) { struct ip_prefix_list *hna; for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next) { if (hna->net.prefix_len == 0) { return true; } } return false; } /** * Grabs the current HNA selected default route */ void lookup_defhna_latlon(union olsr_ip_addr *ip) { struct rt_entry *rt; struct avl_node *rt_tree_node; struct olsr_ip_prefix prefix; memset(ip, 0, sizeof(*ip)); memset(&prefix, 0, sizeof(prefix)); if (NULL != (rt_tree_node = avl_find(&routingtree, &prefix))) { rt = rt_tree2rt(rt_tree_node); *ip = rt->rt_best->rtp_nexthop.gateway; } } /** * lookup a nodes name */ const char * lookup_name_latlon(union olsr_ip_addr *ip) { int hash; struct db_entry *entry; struct list_node *list_head, *list_node; struct name_entry *name; for (hash = 0; hash < HASHSIZE; hash++) { list_head = &name_list[hash]; for (list_node = list_head->next; list_node != list_head; list_node = list_node->next) { entry = list2db(list_node); for (name = entry->names; name != NULL; name = name->next) { if (ipequal(&name->ip, ip)) return name->name; } } } return ""; } #ifdef _WIN32 /** * write latlon positions to a javascript file */ void write_latlon_file(void) { FILE *fmap; if (!my_names || !latlon_table_changed) return; OLSR_PRINTF(2, "NAME PLUGIN: writing latlon file\n"); if (NULL == (fmap = fopen(my_latlon_file, "w"))) { OLSR_PRINTF(0, "NAME PLUGIN: cant write latlon file\n"); return; } fprintf(fmap, "/* This file is overwritten regularly by olsrd */\n"); mapwrite_work(fmap); fclose(fmap); latlon_table_changed = false; } #endif /* _WIN32 */ /* * Local Variables: * mode: c * c-indent-tabs-mode: t * indent-tabs-mode: t * c-basic-offset: 4 * tab-width: 4 * End: */ olsrd-0.6.6.2/lib/nameservice/src/nameservice.h000066400000000000000000000137431234304727700213370ustar00rootroot00000000000000 /* * Copyright (c) 2005, Bruno Randolf * Copyright (c) 2004, Andreas Tonnesen(andreto-at-olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the UniK olsr daemon nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * Dynamic linked library for UniK OLSRd */ #ifndef _NAMESERVICE_PLUGIN #define _NAMESERVICE_PLUGIN #include #include #include "olsr_types.h" #include "interfaces.h" #include "olsr_protocol.h" #include "common/list.h" #include "olsrd_plugin.h" #include "nameservice_msg.h" #include "hashing.h" #include "mapwrite.h" #include "mantissa.h" #define PLUGIN_NAME "OLSRD nameservice plugin" #define PLUGIN_VERSION "0.3" #define PLUGIN_AUTHOR "Bruno Randolf, Jens Nachtigall, Sven-Ola Tuecke" // useful to set for the freifunkfirmware to remove all // calls to olsr_printf by the empty statement ";" //#define olsr_printf(...) ; #define MESSAGE_TYPE 130 #define PARSER_TYPE MESSAGE_TYPE #define EMISSION_INTERVAL 120 /* seconds */ #define EMISSION_JITTER 25 /* percent */ #define NAME_VALID_TIME 1800 /* seconds */ #define NAMESERVER_COUNT 3 #define NAME_PROTOCOL_VERSION 1 #define MAX_NAME 127 #define MAX_FILE 255 #define MAX_SUFFIX 63 #define MID_ENTRIES 1 #define MID_MAXLEN 16 #define MID_PREFIX "mid%i." /** * a linked list of name_entry * if type is NAME_HOST, name is a hostname and ip its IP addr * if type is NAME_FORWARDER, then ip is a dns-server (and name is irrelevant) * if type is NAME_SERVICE, then name is a service-line (and the ip is irrelevant) * if type is NAME_LATLON, then name has 2 floats with lat and lon (and the ip is irrelevant) */ struct name_entry { union olsr_ip_addr ip; uint16_t type; uint16_t len; char *name; struct name_entry *next; /* linked list */ }; /* * * linked list of db_entries for each originator with * originator being its main_addr * * names points to the name_entry with its hostname, dns-server or * service-line entry * * all the db_entries are hashed in nameservice.c to avoid a too long list * for many nodes in a net * * */ struct db_entry { union olsr_ip_addr originator; /* IP address of the node this entry describes */ struct timer_entry *db_timer; /* Validity time */ struct name_entry *names; /* list of names this originator declares */ struct list_node db_list; /* linked list of db entries per hash container */ }; /* inline to recast from db_list back to db_entry */ LISTNODE2STRUCT(list2db, struct db_entry, db_list); #define OLSR_NAMESVC_DB_JITTER 5 /* percent */ extern struct name_entry *my_names; extern struct list_node latlon_list[HASHSIZE]; extern float my_lat, my_lon; void olsr_expire_write_file_timer(void *); void olsr_namesvc_delete_db_entry(struct db_entry *); /* Parser function to register with the sceduler */ bool olsr_parser(union olsr_message *, struct interface *, union olsr_ip_addr *); /* callback for periodic timer */ void olsr_namesvc_gen(void *); int encap_namemsg(struct namemsg *); struct name_entry *add_name_to_list(struct name_entry *my_list, const char *value, int type, const union olsr_ip_addr *ip); struct name_entry *remove_nonvalid_names_from_list(struct name_entry *my_list, int type); void free_all_list_entries(struct list_node *); void decap_namemsg(struct name *from_packet, struct name_entry **to, bool * this_table_changed); void insert_new_name_in_list(union olsr_ip_addr *, struct list_node *, struct name *, bool *, olsr_reltime); bool allowed_hostname_or_ip_in_service(const char *service_line, const regmatch_t * hostname_or_ip); void update_name_entry(union olsr_ip_addr *, struct namemsg *, int, olsr_reltime); void write_hosts_file(void); void write_services_file(bool writemacs); void write_resolv_file(void); int register_olsr_param(char *key, char *value); void free_name_entry_list(struct name_entry **list); bool allowed_ip(const union olsr_ip_addr *addr); bool allowed_service(const char *service_line); bool is_name_wellformed(const char *service_line); bool is_service_wellformed(const char *service_line); bool is_mac_wellformed(const char *service_line); bool is_latlon_wellformed(const char *latlon_line); bool get_isdefhna_latlon(void); void lookup_defhna_latlon(union olsr_ip_addr *ip); const char *lookup_name_latlon(union olsr_ip_addr *ip); void write_latlon_file(void); char *create_packet(struct name *to, struct name_entry *from); void name_constructor(void); void name_destructor(void); int name_init(void); #endif /* _NAMESERVICE_PLUGIN */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/nameservice/src/nameservice_msg.h000066400000000000000000000052141234304727700221770ustar00rootroot00000000000000 /* * Copyright (c) 2005, Bruno Randolf * Copyright (c) 2004, Andreas Tonnesen(andreto-at-olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the UniK olsr daemon nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * Dynamic linked library for UniK OLSRd */ #ifndef _NAMESEVICE_MSG #define _NAMESEVICE_MSG /* type of the packet of name_entry */ typedef enum { NAME_HOST = 0, NAME_FORWARDER = 1, NAME_SERVICE = 2, NAME_LATLON = 3, NAME_MACADDR = 4, } NAME_TYPE; /** * the name, forwarder or service entry as found in a packet within a * message **/ struct name { uint16_t type; uint16_t len; // length of the name // the ip of the hostname, or the ip of the dns-server // ip is irrelevant for services union olsr_ip_addr ip; /* * name or service is written in plain text after this struct and padded to 4 byte */ }; struct namemsg { uint16_t version; // version number of the nameservice plugin uint16_t nr_names; // number of following packets including names, forwarders or services /* * at least one struct name following */ }; #endif /* _NAMESEVICE_MSG */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/nameservice/src/olsrd_plugin.c000066400000000000000000000050021234304727700215170ustar00rootroot00000000000000 /* * Copyright (c) 2005, Bruno Randolf * Copyright (c) 2004, Andreas Tonnesen(andreto-at-olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the UniK olsr daemon nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * Dynamic linked library for olsr.org olsrd */ #include #include #include "olsrd_plugin.h" #include "nameservice.h" #define PLUGIN_NAME "OLSRD nameservice plugin" #define PLUGIN_VERSION "0.3" #define PLUGIN_AUTHOR "Bruno Randolf, Jens Nachtigall, Sven-Ola Tuecke" #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION #define PLUGIN_INTERFACE_VERSION 5 static void __attribute__ ((constructor)) my_init(void); static void __attribute__ ((destructor)) my_fini(void); int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } int olsrd_plugin_init(void) { return name_init(); } static void my_init(void) { /* Print plugin info to stdout */ printf("%s\n", MOD_DESC); name_constructor(); return; } static void my_fini(void) { name_destructor(); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/nameservice/version-script.txt000066400000000000000000000002051234304727700216130ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/p2pd/000077500000000000000000000000001234304727700144325ustar00rootroot00000000000000olsrd-0.6.6.2/lib/p2pd/Makefile000066400000000000000000000014031234304727700160700ustar00rootroot00000000000000 OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_p2pd PLUGIN_VER = 0.1.0 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc SUPPORTED = 0 ifeq ($(OS),linux) SUPPORTED = 1 endif ifeq ($(OS),android) SUPPORTED = 1 endif ifeq ($(SUPPORTED),0) .PHONY: all default_target install clean all: default_target default_target install clean: @echo "*** $(PLUGIN_NAME) plugin not supported on $(OS), sorry!" else default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) endif olsrd-0.6.6.2/lib/p2pd/README000066400000000000000000000113371234304727700153170ustar00rootroot00000000000000= OLSR P2PD plugin = This README file is the main documentation source for the OLSR P2PD plugin Last update 01/03/2010 == Description == This plugin goal is the distribution of Peer to Peer Discovery messages over an OLSR Wireless Mesh Network. In a wireless mesh network, the usage of wireless interfaces in ad-hoc mode and the OLSR routing protocol prevent UDP messages to be distributed all over the network. We are especially interested in the distribution of UDP messages, used for host- based service discovery, over the networks that do not directly participate in the OLSR mesh cloud. This task is achieved in the following way: 1. the local router picks up from the local non-OLSR (HNA) network UDP messages and encapsulates them in a new type of OLSR messages, 2. the OLSR infrastructure is exploited for the transport of these messages, 3. remote routers decapsulate UDP messages from received OLSR messages and send them over their attached non-OLSR networks. The work could have its practical and immediate application in wireless network communities that employ the OLSR protocol. The plugin captures the traffic (only IPv4 if OLSR is running IPv4 and only IPv6 if OLSR is running IPv6) and encapsulates this traffic in OLSR messages that are forwarded to all the other nodes in the mesh. Other nodes running the plugin will decapsulate the packets and will send them to the interfaces specified in the configuration file Let's get this example topology pc1->eth0 ----- eth0<-r1->ath0 -------ath0<-r2->eth0 ---------eth0<-pc2 r1 and r2 are OLSR routers with p2pd plugin enabled. pc1 will be able to receive UDP traffic generated at pc2 and vice versa The most interesting feature is that messages are forwarded also by OLSR routers without the plugin. For example: pc1->eth0 ----- eth0<-r1->ath0 ---r3----ath0<-r2->eth0 ---------eth0<-pc2 also in this topology UDP traffic between pc1 and pc2 is possible because r3 forwards UDP plugin OLSR packets even if it is not aware of the new application. == Configuration == To enable the Plugin use the following syntax LoadPlugin "olsrd_p2pd.so.0.1.0" { # Specify interfaces where the hosts running Peer to Peer applications are # attached PlParam "NonOlsrIf" "eth0" PlParam "NonOlsrIf" "eth1" # P2pdTtl is the time to live given to the P2PD OLSR messages PlParam "P2pdTtl" "5" # Specify the UDP destination address/port for P2P node discovery # Allowed: IPv4 broadcast and multicast, IPv6 multicast only # MS Groove PlParam "UdpDestPort" "255.255.255.255 1211" # MDNS multicast (draft-cheshire-dnsext-multicastdns) PlParam "UdpDestPort" "224.0.0.251 5353" } Where eth0 and eth1 are the names of the interfaces where you want to capture traffic (and decapsulate incoming traffic). Note that this interfaces must not talk OLSR and also the subnets on this interfaces must be announced with an appropriate HNA entry. This version of the plugin will not chech this stuff to be properly configured! P2pdTtl is the time to live given to the P2PD OLSR messages. It makes no sense to announce your services to hosts that are too many hops away, because they will experience a very bad unicast connection. With this TTL setting we can tune how far we announce our services and we make the protocol scale much better === References === * OLSR Optimized Link State Routing: [http://tools.ietf.org/html/rfc3626 IETF RFC 3626] === Contact === * Caspar van Zon CHW.van.Zon@mindef.nl Revision history ================ 01/03/2010 - Changes relative to olsr_mdns plug-in which was used as a base * A new plug-in called olsrd_p2pd has been created based on the olsrd_mdns plug-in. * The initial version number for this plug-in has been set to v 0.1.0 * A parameter 'UdpDestPort' was added to allow for specification of a UDP IP address/port pair. * A number of obsolete functions have been removed from the source to decrease the plug-in footprint. * A mechanism has been added to check whether duplicate messages are received and to allow them to be filtered out of the message stream. This is a new mechanism and not the one provided within OLSR because the old mechanism seems to hold a single list and this should not be contaminated. At this time the list holds tuples with information conforming draft-ietf-manet-olsrv2-10. Older non-duplicate messages are forwarded to NonOlsrIf interfaces. * Some of the return values in the olsr_parser function (p2pdc) have been changed so the related messages will not be forwarded if that is not desired. * Fragmented packets not supported. * TTL for outgoing packets are not modified. * Parameter 'UdpDestPort' is checked so only IPv4 broadcast and multicast and IPv6 multicast values are allowed as the destination address.olsrd-0.6.6.2/lib/p2pd/src/000077500000000000000000000000001234304727700152215ustar00rootroot00000000000000olsrd-0.6.6.2/lib/p2pd/src/NetworkInterfaces.c000066400000000000000000000462471234304727700210370ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "NetworkInterfaces.h" /* System includes */ #include /* NULL */ #include /* syslog() */ #include /* strerror(), strchr(), strcmp() */ #include /* errno */ #include /* close() */ #include /* ioctl() */ #include /* fcntl() */ #include /* assert() */ #include /* socket(), ifreq, if_indextoname(), if_nametoindex() */ #include /* htons() */ #include /* ETH_P_IP */ #include /* packet_mreq, PACKET_MR_PROMISC, PACKET_ADD_MEMBERSHIP */ #include /* IFF_TAP */ #include /* struct ip */ #include /* SOL_UDP */ #include /* atoi, malloc */ /* OLSRD includes */ #include "olsr.h" /* OLSR_PRINTF() */ #include "ipcalc.h" #include "defs.h" /* olsr_cnf */ #include "link_set.h" /* get_link_set() */ #include "tc_set.h" /* olsr_lookup_tc_entry(), olsr_lookup_tc_edge() */ #include "net_olsr.h" /* ipequal */ #include "lq_plugin.h" //#include "olsr_ip_prefix_list.h" /* Plugin includes */ #include "Packet.h" /* IFHWADDRLEN */ #include "p2pd.h" /* PLUGIN_NAME, MainAddressOf() */ //#include "Address.h" /* IsMulticast() */ /* List of network interface objects used by BMF plugin */ struct NonOlsrInterface *nonOlsrInterfaces = NULL; struct NonOlsrInterface *lastNonOlsrInterface = NULL; /* ------------------------------------------------------------------------- * Function : CreateCaptureSocket * Description: Create socket for promiscuously capturing multicast IP traffic * Input : ifname - network interface (e.g. "eth0") * Output : none * Return : the socket descriptor ( >= 0), or -1 if an error occurred * Data Used : none * Notes : The socket is a cooked IP packet socket, bound to the specified * network interface * ------------------------------------------------------------------------- */ int CreateCaptureSocket(const char *ifName) { int ifIndex = if_nametoindex(ifName); struct packet_mreq mreq; struct ifreq req; struct sockaddr_ll bindTo; int skfd = 0; /* Open cooked IP packet socket */ if (olsr_cnf->ip_version == AF_INET) { skfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)); } else { skfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IPV6)); } if (skfd < 0) { P2pdPError("socket(PF_PACKET) error"); return -1; } /* Set interface to promiscuous mode */ memset(&mreq, 0, sizeof(struct packet_mreq)); mreq.mr_ifindex = ifIndex; mreq.mr_type = PACKET_MR_PROMISC; if (setsockopt(skfd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { P2pdPError("setsockopt(PACKET_MR_PROMISC) error"); close(skfd); return -1; } /* Get hardware (MAC) address */ memset(&req, 0, sizeof(struct ifreq)); strncpy(req.ifr_name, ifName, IFNAMSIZ - 1); req.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ if (ioctl(skfd, SIOCGIFHWADDR, &req) < 0) { P2pdPError("error retrieving MAC address"); close(skfd); return -1; } /* Bind the socket to the specified interface */ memset(&bindTo, 0, sizeof(bindTo)); bindTo.sll_family = AF_PACKET; if (olsr_cnf->ip_version == AF_INET) { bindTo.sll_protocol = htons(ETH_P_IP); } else { bindTo.sll_protocol = htons(ETH_P_IPV6); } bindTo.sll_ifindex = ifIndex; memcpy(bindTo.sll_addr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); bindTo.sll_halen = IFHWADDRLEN; if (bind(skfd, (struct sockaddr *)&bindTo, sizeof(bindTo)) < 0) { P2pdPError("bind() error"); close(skfd); return -1; } /* Set socket to blocking operation */ if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0) { P2pdPError("fcntl() error"); close(skfd); return -1; } //AddDescriptorToInputSet(skfd); add_olsr_socket(skfd, (socket_handler_func)&DoP2pd, NULL, NULL, SP_PR_READ); return skfd; } /* CreateCaptureSocket */ /* ------------------------------------------------------------------------- * Function : CreateInterface * Description: Create a new NonOlsrInterface object and adds it to the global * nonOlsrInterfaces list * Input : ifName - name of the network interface (e.g. "eth0") * : olsrIntf - OLSR interface object of the network interface, or * NULL if the network interface is not OLSR-enabled * Output : none * Return : the number of opened sockets * Data Used : nonOlsrInterfaces, lastNonOlsrInterface * ------------------------------------------------------------------------- */ //FOR MDNS IS ALWAYS CALLED WITH NULL AS SECOND ARG static int CreateInterface(const char *ifName, struct interface *olsrIntf) { int capturingSkfd = -1; int encapsulatingSkfd = -1; int listeningSkfd = -1; int ioctlSkfd; struct ifreq ifr; int nOpened = 0; struct NonOlsrInterface *newIf = malloc(sizeof(struct NonOlsrInterface)); assert(ifName != NULL); if (newIf == NULL) { return 0; } //TODO: assert interface is not talking OLSR /* Create socket for capturing and sending of multicast packets on * non-OLSR interfaces, and on OLSR-interfaces if configured. */ if ((olsrIntf == NULL)) { capturingSkfd = CreateCaptureSocket(ifName); if (capturingSkfd < 0) { free(newIf); return 0; } nOpened++; } /* For ioctl operations on the network interface, use either capturingSkfd * or encapsulatingSkfd, whichever is available */ ioctlSkfd = (capturingSkfd >= 0) ? capturingSkfd : encapsulatingSkfd; /* Retrieve the MAC address of the interface. */ memset(&ifr, 0, sizeof(struct ifreq)); strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1); ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ if (ioctl(ioctlSkfd, SIOCGIFHWADDR, &ifr) < 0) { P2pdPError("ioctl(SIOCGIFHWADDR) error for interface \"%s\"", ifName); if (capturingSkfd >= 0) { close(capturingSkfd); } free(newIf); return 0; } /* Copy data into NonOlsrInterface object */ newIf->capturingSkfd = capturingSkfd; newIf->encapsulatingSkfd = encapsulatingSkfd; newIf->listeningSkfd = listeningSkfd; memcpy(newIf->macAddr, ifr.ifr_hwaddr.sa_data, IFHWADDRLEN); memcpy(newIf->ifName, ifName, IFNAMSIZ); newIf->olsrIntf = olsrIntf; if (olsrIntf != NULL) { /* For an OLSR-interface, copy the interface address and broadcast * address from the OLSR interface object. Downcast to correct sockaddr * subtype. */ newIf->intAddr.v4 = olsrIntf->int_addr.sin_addr; newIf->broadAddr.v4 = olsrIntf->int_broadaddr.sin_addr; } else { /* For a non-OLSR interface, retrieve the IP address ourselves */ memset(&ifr, 0, sizeof(struct ifreq)); strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1); ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ if (ioctl(ioctlSkfd, SIOCGIFADDR, &ifr) < 0) { P2pdPError("ioctl(SIOCGIFADDR) error for interface \"%s\"", ifName); newIf->intAddr.v4.s_addr = inet_addr("0.0.0.0"); } else { /* Downcast to correct sockaddr subtype */ newIf->intAddr.v4 = ((struct sockaddr_in *) ARM_NOWARN_ALIGN(&ifr.ifr_addr))->sin_addr; } /* For a non-OLSR interface, retrieve the IP broadcast address ourselves */ memset(&ifr, 0, sizeof(struct ifreq)); strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1); ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ if (ioctl(ioctlSkfd, SIOCGIFBRDADDR, &ifr) < 0) { P2pdPError("ioctl(SIOCGIFBRDADDR) error for interface \"%s\"", ifName); newIf->broadAddr.v4.s_addr = inet_addr("0.0.0.0"); } else { /* Downcast to correct sockaddr subtype */ newIf->broadAddr.v4 = ((struct sockaddr_in *) ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr))->sin_addr; } } /* Initialize fragment history table */ //memset(&newIf->fragmentHistory, 0, sizeof(newIf->fragmentHistory)); //newIf->nextFragmentHistoryEntry = 0; /* Reset counters */ //newIf->nNonOlsrPacketsRx = 0; //newIf->nNonOlsrPacketsRxDup = 0; //newIf->nNonOlsrPacketsTx = 0; /* Add new NonOlsrInterface object to global list. OLSR interfaces are * added at the front of the list, non-OLSR interfaces at the back. */ if (nonOlsrInterfaces == NULL) { /* First NonOlsrInterface object in list */ newIf->next = NULL; nonOlsrInterfaces = newIf; lastNonOlsrInterface = newIf; } else if (olsrIntf != NULL) { /* Add new NonOlsrInterface object at front of list */ newIf->next = nonOlsrInterfaces; nonOlsrInterfaces = newIf; } else { /* Add new NonOlsrInterface object at back of list */ newIf->next = NULL; lastNonOlsrInterface->next = newIf; lastNonOlsrInterface = newIf; } //OLSR_PRINTF( // 8, // "%s: opened %d socket%s on %s interface \"%s\"\n", // PLUGIN_NAME_SHORT, // nOpened, // nOpened == 1 ? "" : "s", // olsrIntf != NULL ? "OLSR" : "non-OLSR", // ifName); return nOpened; } /* CreateInterface */ /* ------------------------------------------------------------------------- * Function : CreateNonOlsrNetworkInterfaces * Description: Create a list of NonOlsrInterface objects, one for each network * interface on which BMF runs * Input : skipThisIntf - network interface to skip, if seen * Output : none * Return : fail (-1) or success (0) * Data Used : none * ------------------------------------------------------------------------- */ int CreateNonOlsrNetworkInterfaces(struct interface *skipThisIntf) { int skfd; struct ifconf ifc; int numreqs = 30; struct ifreq *ifr; int n; int nOpenedSockets = 0; /* Clear input descriptor set */ FD_ZERO(&InputSet); skfd = socket(PF_INET, SOCK_DGRAM, 0); if (skfd < 0) { P2pdPError("no inet socket available to retrieve interface list"); return -1; } /* Retrieve the network interface configuration list */ ifc.ifc_buf = NULL; for (;;) { ifc.ifc_len = sizeof(struct ifreq) * numreqs; ifc.ifc_buf = realloc(ifc.ifc_buf, ifc.ifc_len); if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) { P2pdPError("ioctl(SIOCGIFCONF) error"); close(skfd); free(ifc.ifc_buf); return -1; } if ((unsigned)ifc.ifc_len == sizeof(struct ifreq) * numreqs) { /* Assume it overflowed; double the space and try again */ numreqs *= 2; assert(numreqs < 1024); continue; /* for (;;) */ } break; /* for (;;) */ } /* for (;;) */ close(skfd); /* For each item in the interface configuration list... */ ifr = ifc.ifc_req; for (n = ifc.ifc_len / sizeof(struct ifreq); --n >= 0; ifr++) { struct interface *olsrIntf; union olsr_ip_addr ipAddr; /* Skip the BMF network interface itself */ //if (strncmp(ifr->ifr_name, EtherTunTapIfName, IFNAMSIZ) == 0) //{ // continue; /* for (n = ...) */ //} /* ...find the OLSR interface structure, if any */ ipAddr.v4 = ((struct sockaddr_in *) ARM_NOWARN_ALIGN(&ifr->ifr_addr))->sin_addr; olsrIntf = if_ifwithaddr(&ipAddr); if (skipThisIntf != NULL && olsrIntf == skipThisIntf) { continue; /* for (n = ...) */ } if (olsrIntf == NULL && !IsNonOlsrIf(ifr->ifr_name)) { /* Interface is neither OLSR interface, nor specified as non-OLSR * interface in the plugin parameter list */ continue; /* for (n = ...) */ } if (!IsNonOlsrIf(ifr->ifr_name)) { //If the interface is not specified in the configuration file then go ahead continue; /* for (n = ...) */ } //TODO: asser if->ifr_name is not talking OLSR //nOpenedSockets += CreateInterface(ifr->ifr_name, olsrIntf); nOpenedSockets += CreateInterface(ifr->ifr_name, NULL); } /* for (n = ...) */ free(ifc.ifc_buf); if (nonOlsrInterfaces == NULL) { //OLSR_PRINTF(1, "%s: could not initialize any network interface\n", PLUGIN_NAME); } else { //OLSR_PRINTF(1, "%s: opened %d sockets\n", PLUGIN_NAME, nOpenedSockets); } return 0; } /* CreateNonOlsrNetworkInterfaces */ /* ------------------------------------------------------------------------- * Function : AddInterface * Description: Add an OLSR-enabled network interface to the list of BMF-enabled * network interfaces * Input : newIntf - network interface to add * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ void AddInterface(struct interface *newIntf) { /* int nOpened; */ assert(newIntf != NULL); /* nOpened = */ (void)CreateInterface(newIntf->int_name, newIntf); //OLSR_PRINTF(1, "%s: opened %d sockets\n", PLUGIN_NAME, nOpened); } /* AddInterface */ /* ------------------------------------------------------------------------- * Function : CloseNonOlsrNetworkInterfaces * Description: Closes every socket on each network interface used by BMF * Input : none * Output : none * Return : none * Data Used : none * Notes : Closes * - the local EtherTunTap interface (e.g. "tun0" or "tap0") * - for each BMF-enabled interface, the socket used for * capturing multicast packets * - for each OLSR-enabled interface, the socket used for * encapsulating packets * Also restores the network state to the situation before BMF * was started. * ------------------------------------------------------------------------- */ void CloseNonOlsrNetworkInterfaces(void) { int nClosed = 0; u_int32_t totalOlsrPacketsRx = 0; u_int32_t totalOlsrPacketsRxDup = 0; u_int32_t totalOlsrPacketsTx = 0; u_int32_t totalNonOlsrPacketsRx = 0; u_int32_t totalNonOlsrPacketsRxDup = 0; u_int32_t totalNonOlsrPacketsTx = 0; /* Close all opened sockets */ struct NonOlsrInterface *nextIf = nonOlsrInterfaces; while (nextIf != NULL) { struct NonOlsrInterface *ifc = nextIf; nextIf = ifc->next; if (ifc->capturingSkfd >= 0) { close(ifc->capturingSkfd); nClosed++; } if (ifc->encapsulatingSkfd >= 0) { close(ifc->encapsulatingSkfd); nClosed++; } //OLSR_PRINTF( // 7, // "%s: %s interface \"%s\": RX pkts %u (%u dups); TX pkts %u\n", // PLUGIN_NAME_SHORT, // ifc->olsrIntf != NULL ? "OLSR" : "non-OLSR", // ifc->ifName, // ifc->nPacketsRx, // ifc->nPacketsRxDup, // ifc->nPacketsTx); //OLSR_PRINTF( // 1, // "%s: closed %s interface \"%s\"\n", // PLUGIN_NAME_SHORT, // ifc->olsrIntf != NULL ? "OLSR" : "non-OLSR", // ifc->ifName); /* Add totals */ if (ifc->olsrIntf != NULL) { totalOlsrPacketsRx += ifc->nPacketsRx; totalOlsrPacketsRxDup += ifc->nPacketsRxDup; totalOlsrPacketsTx += ifc->nPacketsTx; } else { totalNonOlsrPacketsRx += ifc->nPacketsRx; totalNonOlsrPacketsRxDup += ifc->nPacketsRxDup; totalNonOlsrPacketsTx += ifc->nPacketsTx; } free(ifc); } /* while */ nonOlsrInterfaces = NULL; //OLSR_PRINTF(1, "%s: closed %d sockets\n", PLUGIN_NAME_SHORT, nClosed); } /* CloseNonOlsrNetworkInterfaces */ #define MAX_NON_OLSR_IFS 32 static char NonOlsrIfNames[MAX_NON_OLSR_IFS][IFNAMSIZ]; static int nNonOlsrIfs = 0; /* ------------------------------------------------------------------------- * Function : AddNonOlsrIf * Description: Add an non-OLSR enabled network interface to the list of BMF-enabled * network interfaces * Input : ifName - network interface (e.g. "eth0") * data - not used * addon - not used * Output : none * Return : success (0) or fail (1) * Data Used : NonOlsrIfNames * ------------------------------------------------------------------------- */ int AddNonOlsrIf(const char *ifName, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { assert(ifName != NULL); if (nNonOlsrIfs >= MAX_NON_OLSR_IFS) { //OLSR_PRINTF( // 1, // "%s: too many non-OLSR interfaces specified, maximum is %d\n", // PLUGIN_NAME, // MAX_NON_OLSR_IFS); return 1; } olsr_printf(1, "\nAdding interface '%s' to list of interface\n", ifName); strncpy(NonOlsrIfNames[nNonOlsrIfs], ifName, IFNAMSIZ - 1); NonOlsrIfNames[nNonOlsrIfs][IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ nNonOlsrIfs++; return 0; } /* AddNonOlsrIf */ /* ------------------------------------------------------------------------- * Function : IsNonOlsrIf * Description: Checks if a network interface is OLSR-enabled * Input : ifName - network interface (e.g. "eth0") * Output : none * Return : true (1) or false (0) * Data Used : NonOlsrIfNames * ------------------------------------------------------------------------- */ int IsNonOlsrIf(const char *ifName) { int i; assert(ifName != NULL); for (i = 0; i < nNonOlsrIfs; i++) { if (strncmp(NonOlsrIfNames[i], ifName, IFNAMSIZ) == 0) return 1; } return 0; } /* IsNonOlsrIf */ olsrd-0.6.6.2/lib/p2pd/src/NetworkInterfaces.h000066400000000000000000000127401234304727700210330ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _P2PD_NETWORKINTERFACES_H #define _P2PD_NETWORKINTERFACES_H /* System includes */ #include /* struct in_addr */ /* OLSR includes */ #include "olsr_types.h" /* olsr_ip_addr */ #include "olsrd_plugin.h" /* union set_plugin_parameter_addon */ /* Plugin includes */ #include "Packet.h" /* IFHWADDRLEN */ #include "p2pd.h" /* Size of buffer in which packets are received */ #define P2PD_BUFFER_SIZE 2048 struct NonOlsrInterface { /* File descriptor of raw packet socket, used for capturing multicast packets */ int capturingSkfd; /* File descriptor of UDP (datagram) socket for encapsulated multicast packets. * Only used for OLSR-enabled interfaces; set to -1 if interface is not OLSR-enabled. */ int encapsulatingSkfd; /* File descriptor of UDP packet socket, used for listening to encapsulation packets. * Used only when PlParam "P2pdMechanism" is set to "UnicastPromiscuous". */ int listeningSkfd; unsigned char macAddr[IFHWADDRLEN]; char ifName[IFNAMSIZ]; /* OLSRs idea of this network interface. NULL if this interface is not * OLSR-enabled. */ struct interface *olsrIntf; /* IP address of this network interface */ union olsr_ip_addr intAddr; /* Broadcast address of this network interface */ union olsr_ip_addr broadAddr; #define FRAGMENT_HISTORY_SIZE 10 struct TFragmentHistory { u_int16_t ipId; u_int8_t ipProto; struct in_addr ipSrc; struct in_addr ipDst; } fragmentHistory[FRAGMENT_HISTORY_SIZE]; int nextFragmentHistoryEntry; /* Number of received and transmitted BMF packets on this interface */ u_int32_t nPacketsRx; u_int32_t nPacketsRxDup; u_int32_t nPacketsTx; /* Next element in list */ struct NonOlsrInterface *next; }; extern struct NonOlsrInterface *nonOlsrInterfaces; extern int HighestSkfd; extern fd_set InputSet; extern int EtherTunTapFd; extern char EtherTunTapIfName[]; /* 10.255.255.253 in host byte order */ #define ETHERTUNTAPDEFAULTIP 0x0AFFFFFD extern u_int32_t EtherTunTapIp; extern u_int32_t EtherTunTapIpMask; extern u_int32_t EtherTunTapIpBroadcast; enum P2pdMechanism { BM_BROADCAST = 0, BM_UNICAST_PROMISCUOUS }; extern enum P2pdMechanism P2pdMechanism; int SetNonOlsrInterfaceName(const char *ifname, void *data, set_plugin_parameter_addon addon); int SetNonOlsrInterfaceIp(const char *ip, void *data, set_plugin_parameter_addon addon); int SetCapturePacketsOnOlsrInterfaces(const char *enable, void *data, set_plugin_parameter_addon addon); int SetP2pdMechanism(const char *mechanism, void *data, set_plugin_parameter_addon addon); int DeactivateSpoofFilter(void); void RestoreSpoofFilter(void); #define MAX_UNICAST_NEIGHBORS 10 struct TBestNeighbors { struct link_entry *links[MAX_UNICAST_NEIGHBORS]; }; void FindNeighbors(struct TBestNeighbors *neighbors, struct link_entry **bestNeighbor, struct NonOlsrInterface *intf, union olsr_ip_addr *source, union olsr_ip_addr *forwardedBy, union olsr_ip_addr *forwardedTo, int *nPossibleNeighbors); int CreateNonOlsrNetworkInterfaces(struct interface *skipThisIntf); void AddInterface(struct interface *newIntf); void CloseNonOlsrNetworkInterfaces(void); int AddNonOlsrIf(const char *ifName, void *data, set_plugin_parameter_addon addon); int IsNonOlsrIf(const char *ifName); void CheckAndUpdateLocalBroadcast(unsigned char *ipPacket, union olsr_ip_addr *broadAddr); void AddMulticastRoute(void); void DeleteMulticastRoute(void); int CreateCaptureSocket(const char *ifName); #endif /* _P2PD_NETWORKINTERFACES_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/p2pd/src/Packet.c000066400000000000000000000214161234304727700166000ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "olsr.h" #include "Packet.h" /* System includes */ #include /* NULL */ #include /* assert() */ #include /* memcpy() */ #include /* u_int8_t, u_int16_t, u_int32_t */ #include /* ntohs(), htons() */ #include /* struct iphdr */ /* ------------------------------------------------------------------------- * Function : IsIpFragment * Description: Check if an IP packet is an IP fragment * Input : ipPacket - the IP packet * Output : none * Return : true (1) or false (0) * Data Used : none * ------------------------------------------------------------------------- */ int IsIpFragment(unsigned char* ipPacket) { struct ip* iph; assert(ipPacket != NULL); iph = (struct ip*) ARM_NOWARN_ALIGN(ipPacket); if ((ntohs(iph->ip_off) & IP_OFFMASK) != 0) { return 1; } return 0; } /* IsIpFragment */ /* ------------------------------------------------------------------------- * Function : GetIpTotalLength * Description: Retrieve the total length of the IP packet (in bytes) of * an IP packet * Input : ipPacket - the IP packet * Output : none * Return : IP packet length * Data Used : none * ------------------------------------------------------------------------- */ u_int16_t GetIpTotalLength(unsigned char* ipPacket) { struct iphdr* iph; assert(ipPacket != NULL); iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket); return ntohs(iph->tot_len); } /* GetIpTotalLength */ /* ------------------------------------------------------------------------- * Function : IsIpv4Fragment * Description: Check if an IP packet is an IP fragment * Input : ipPacket - the IP packet * Output : none * Return : true (1) or false (0) * Data Used : none * ------------------------------------------------------------------------- */ int IsIpv4Fragment(struct ip* hdr) { assert(hdr != NULL); if ((ntohs(hdr->ip_off) & IP_OFFMASK) != 0) { return 1; } return 0; } /* IsIpv4Fragment */ int IsMulticastv4(struct ip* hdr) { assert(hdr != NULL); if (IN_MULTICAST(ntohl(hdr->ip_dst.s_addr))) return 1; return 0; } /* ------------------------------------------------------------------------- * Function : IsIpv6Fragment * Description: Check if an IP packet is an IP fragment * Input : ipPacket - the IP packet * Output : none * Return : true (1) or false (0) * Data Used : none * ------------------------------------------------------------------------- */ int IsIpv6Fragment(struct ip6_hdr* hdr __attribute__ ((unused))) { assert(hdr != NULL); //#error Implementation required if (0) return 1; return 0; } int IsMulticastv6(struct ip6_hdr* hdr __attribute__ ((unused))) { assert(hdr != NULL); return 0; } /* ------------------------------------------------------------------------- * Function : GetIpHeaderLength * Description: Retrieve the IP header length (in bytes) of an IP packet * Input : ipPacket - the IP packet * Output : none * Return : IP header length * Data Used : none * ------------------------------------------------------------------------- */ unsigned int GetIpHeaderLength(unsigned char *ipPacket) { struct iphdr *iph; assert(ipPacket != NULL); iph = (struct iphdr *) ARM_NOWARN_ALIGN(ipPacket); return iph->ihl << 2; } /* GetIpHeaderLength */ /* ------------------------------------------------------------------------- * Function : GetIpPacket * Description: Retrieve the IP packet from BMF encapsulation UDP data * Input : encapsulationUdpData - the encapsulation UDP data * Output : none * Return : The IP packet * Data Used : none * ------------------------------------------------------------------------- */ unsigned char * GetIpPacket(unsigned char *encapsulationUdpData) { return encapsulationUdpData + ENCAP_HDR_LEN; } /* GetIpPacket */ /* ------------------------------------------------------------------------- * Function : GetTtl * Description: Retrieve the TTL (Time To Live) value from the IP header of * an IP packet * Input : ipPacket - the IP packet * Output : none * Return : TTL value * Data Used : none * ------------------------------------------------------------------------- */ u_int8_t GetTtl(unsigned char* ipPacket) { struct iphdr* iph; assert(ipPacket != NULL); iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket); return iph->ttl; } /* GetTtl */ /* ------------------------------------------------------------------------- * Function : SaveTtlAndChecksum * Description: Save the TTL (Time To Live) value and IP checksum as found in * the IP header of an IP packet * Input : ipPacket - the IP packet * Output : sttl - the TTL and checksum values * Return : none * Data Used : none * ------------------------------------------------------------------------- */ void SaveTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl) { struct iphdr* iph; assert(ipPacket != NULL && sttl != NULL); iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket); sttl->ttl = iph->ttl; sttl->check = ntohs(iph->check); } /* SaveTtlAndChecksum */ /* ------------------------------------------------------------------------- * Function : RestoreTtlAndChecksum * Description: Restore the TTL (Time To Live) value and IP checksum in * the IP header of an IP packet * Input : ipPacket - the IP packet * sttl - the TTL and checksum values * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ void RestoreTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl) { struct iphdr* iph; assert(ipPacket != NULL && sttl != NULL); iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket); iph->ttl = sttl->ttl; iph->check = htons(sttl->check); } /* RestoreTtlAndChecksum */ /* ------------------------------------------------------------------------- * Function : DecreaseTtlAndUpdateHeaderChecksum * Description: For an IP packet, decrement the TTL value and update the IP header * checksum accordingly. * Input : ipPacket - the IP packet * Output : none * Return : none * Data Used : none * Notes : See also RFC1141 * ------------------------------------------------------------------------- */ void DecreaseTtlAndUpdateHeaderChecksum(unsigned char* ipPacket) { struct iphdr* iph; u_int32_t sum; assert(ipPacket != NULL); iph = (struct iphdr*) ARM_NOWARN_ALIGN(ipPacket); iph->ttl--; /* decrement ttl */ sum = ntohs(iph->check) + 0x100; /* increment checksum high byte */ iph->check = htons(sum + (sum>>16)); /* add carry */ } /* DecreaseTtlAndUpdateHeaderChecksum */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/p2pd/src/Packet.h000066400000000000000000000064301234304727700166040ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _P2PD_PACKET_H #define _P2PD_PACKET_H /* System includes */ #include /* struct ip */ #include /* struct ip6_hdr */ #include /* IFNAMSIZ, IFHWADDRLEN */ #include /* u_int8_t, u_int16_t */ struct TSaveTtl { u_int8_t ttl; u_int16_t check; } __attribute__((__packed__)); /* P2PD-encapsulated packets are Ethernet-IP-UDP packets, which start * with a 8-bytes header (struct TEncapHeader), followed by the * encapsulated Ethernet-IP packet itself */ struct TEncapHeader { /* Use a standard Type-Length-Value (TLV) element */ u_int8_t type; u_int8_t len; u_int16_t reserved; /* Always 0 */ u_int32_t crc32; } __attribute__ ((__packed__)); #define ENCAP_HDR_LEN ((int)sizeof(struct TEncapHeader)) int IsIpFragment(unsigned char* ipPacket); u_int16_t GetIpTotalLength(unsigned char* ipPacket); int IsIpv4Fragment(struct ip*); int IsMulticastv4(struct ip*); int IsIpv6Fragment(struct ip6_hdr*); int IsMulticastv6(struct ip6_hdr*); u_int8_t GetTtl(unsigned char* ipPacket); void SaveTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl); void RestoreTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl); void DecreaseTtlAndUpdateHeaderChecksum(unsigned char* ipPacket); unsigned int GetIpHeaderLength(unsigned char *ipPacket); unsigned char *GetIpPacket(unsigned char *encapsulationUdpData); #endif /* _P2PD_PACKET_H */ olsrd-0.6.6.2/lib/p2pd/src/PacketHistory.c000066400000000000000000000223031234304727700201560ustar00rootroot00000000000000/* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Thales, BMF nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ------------------------------------------------------------------------- * File : PacketHistory.c * Description: Functions for keeping and accessing the history of processed * multicast IP packets. * Created : 29 Jun 2006 * * ------------------------------------------------------------------------- */ #include "PacketHistory.h" /* System includes */ #include /* NULL */ #include /* assert() */ #include /* memset */ #include /* u_int16_t, u_int32_t */ #include /* struct iphdr */ #include /* free() */ /* OLSRD includes */ #include "olsr.h" /* olsr_printf */ #include "scheduler.h" /* GET_TIMESTAMP, TIMED_OUT */ /* Plugin includes */ #include "Packet.h" static struct TDupEntry* PacketHistory[HISTORY_HASH_SIZE]; #define CRC_UPTO_NBYTES 256 /* ------------------------------------------------------------------------- * Function : GenerateCrc32Table * Description: Generate the table of CRC remainders for all possible bytes, * according to CRC-32-IEEE 802.3 * Input : none * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ #define CRC32_POLYNOMIAL 0xedb88320UL /* bit-inverse of 0x04c11db7UL */ static unsigned long CrcTable[256]; static void GenerateCrc32Table(void) { int i, j; u_int32_t crc; for (i = 0; i < 256; i++) { crc = (u_int32_t) i; for (j = 0; j < 8; j++) { if (crc & 1) { crc = (crc >> 1) ^ CRC32_POLYNOMIAL; } else { crc = (crc >> 1); } } CrcTable[i] = crc; } /* for */ } /* GenerateCrc32Table */ /* ------------------------------------------------------------------------- * Function : CalcCrc32 * Description: Calculate CRC-32 according to CRC-32-IEEE 802.3 * Input : buffer - the bytes to calculate the CRC value over * len - the number of bytes to calculate the CRC value over * Output : none * Return : CRC-32 value * Data Used : none * ------------------------------------------------------------------------- */ static u_int32_t CalcCrc32(unsigned char* buffer, ssize_t len) { int i, j; u_int32_t crc = 0xffffffffUL; for (i = 0; i < len; i++) { j = ((int) (crc & 0xFF) ^ *buffer++); crc = (crc >> 8) ^ CrcTable[j]; } return crc ^ 0xffffffffUL; } /* CalcCrc32 */ /* ------------------------------------------------------------------------- * Function : PacketCrc32 * Description: Calculates the CRC-32 value for an IP packet * Input : ipPacket - the IP packet * len - the number of octets in the IP packet * Output : none * Return : 32-bits CRC value * Data Used : none * ------------------------------------------------------------------------- */ u_int32_t PacketCrc32(unsigned char* ipPacket, ssize_t len) { struct TSaveTtl sttl; struct ip* ipHeader; u_int32_t result; assert(ipPacket != NULL); /* Skip TTL: in a multi-homed OLSR-network, the same multicast packet * may enter the network multiple times, each copy differing only in its * TTL value. BMF must not calculate a different CRC for packets that * differ only in TTL. Skip also the IP-header checksum, because it changes * along with TTL. Besides, it is not a good idea to calculate a CRC over * data that already contains a checksum. * * Clip number of bytes over which CRC is calculated to prevent * long packets from possibly claiming too much CPU resources. */ assert(len > 0); if (len > CRC_UPTO_NBYTES) { len = CRC_UPTO_NBYTES; } SaveTtlAndChecksum(ipPacket, &sttl); ipHeader = (struct ip*) ARM_NOWARN_ALIGN(ipPacket); ipHeader->ip_ttl = 0xFF; /* fixed value of TTL for CRC-32 calculation */ ipHeader->ip_sum = 0x5A5A; /* fixed value of IP header checksum for CRC-32 calculation */ result = CalcCrc32(ipPacket, len); RestoreTtlAndChecksum(ipPacket, &sttl); return result; } /* PacketCrc32 */ /* ------------------------------------------------------------------------- * Function : Hash * Description: Calculates a hash value from a 32-bit value * Input : from32 - 32-bit value * Output : none * Return : hash value * Data Used : none * ------------------------------------------------------------------------- */ u_int32_t Hash(u_int32_t from32) { return ((from32 >> N_HASH_BITS) + from32) & ((1 << N_HASH_BITS) - 1); } /* Hash */ /* ------------------------------------------------------------------------- * Function : InitPacketHistory * Description: Initialize the packet history table and CRC-32 table * Input : none * Output : none * Return : none * Data Used : PacketHistory * ------------------------------------------------------------------------- */ void InitPacketHistory(void) { int i; GenerateCrc32Table(); for(i = 0; i < HISTORY_HASH_SIZE; i++) { PacketHistory[i] = NULL; } } /* InitPacketHistory */ /* ------------------------------------------------------------------------- * Function : CheckAndMarkRecentPacket * Description: Check if this packet was seen recently, then record the fact * that this packet was seen recently. * Input : crc32 - 32-bits crc value of the packet * Output : none * Return : not recently seen (0), recently seen (1) * Data Used : PacketHistory * ------------------------------------------------------------------------- */ int CheckAndMarkRecentPacket(u_int32_t crc32) { u_int32_t idx; struct TDupEntry* walker; struct TDupEntry* newEntry; idx = Hash(crc32); assert(idx < HISTORY_HASH_SIZE); for (walker = PacketHistory[idx]; walker != NULL; walker = walker->next) { if (walker->crc32 == crc32) { /* Found duplicate entry */ /* Always mark as "seen recently": refresh time-out */ walker->timeOut = olsr_getTimestamp(HISTORY_HOLD_TIME); return 1; } /* if */ } /* for */ /* No duplicate entry found: create one */ newEntry = olsr_malloc(sizeof(struct TDupEntry), "OLSRD P2PD: TDupEntry"); if (newEntry != NULL) { newEntry->crc32 = crc32; newEntry->timeOut = olsr_getTimestamp(HISTORY_HOLD_TIME); /* Add new entry at the front of the list */ newEntry->next = PacketHistory[idx]; PacketHistory[idx] = newEntry; } return 0; } /* CheckAndMarkRecentPacket */ /* ------------------------------------------------------------------------- * Function : PrunePacketHistory * Description: Prune the packet history table. * Input : useless - not used * Output : none * Return : none * Data Used : PacketHistory * ------------------------------------------------------------------------- */ void PrunePacketHistory(void* useless __attribute__ ((unused))) { uint i; for (i = 0; i < HISTORY_HASH_SIZE; i++) { if (PacketHistory[i] != NULL) { struct TDupEntry* nextEntry = PacketHistory[i]; struct TDupEntry* prevEntry = NULL; while (nextEntry != NULL) { struct TDupEntry* entry = nextEntry; nextEntry = entry->next; if (olsr_isTimedOut(entry->timeOut)) { /* De-queue */ if (prevEntry != NULL) { prevEntry->next = entry->next; } else { PacketHistory[i] = entry->next; } /* if */ /* De-allocate memory */ free(entry); } else { prevEntry = entry; } /* if */ } /* while */ } /* if (PacketHistory[i] != NULL) */ } /* for (i = ...) */ } /* PrunePacketHistory */ olsrd-0.6.6.2/lib/p2pd/src/PacketHistory.h000066400000000000000000000052301234304727700201630ustar00rootroot00000000000000#ifndef _P2PD_PACKETHISTORY_H #define _P2PD_PACKETHISTORY_H /* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Thales, BMF nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* ------------------------------------------------------------------------- * File : PacketHistory.h * Description: Functions for keeping and accessing the history of processed * multicast IP packets. * Created : 29 Jun 2006 * * ------------------------------------------------------------------------- */ /* System includes */ #include /* ssize_t */ #include /* clock_t */ #define N_HASH_BITS 15 #define HISTORY_HASH_SIZE (1 << N_HASH_BITS) /* Time-out of duplicate entries, in milliseconds */ #define HISTORY_HOLD_TIME 3000 struct TDupEntry { u_int32_t crc32; clock_t timeOut; struct TDupEntry* next; }; void InitPacketHistory(void); u_int32_t PacketCrc32(unsigned char* ipPkt, ssize_t len); u_int32_t Hash(u_int32_t from32); void MarkRecentPacket(u_int32_t crc32); int CheckAndMarkRecentPacket(u_int32_t crc32); void PrunePacketHistory(void*); #endif /* _P2PD_PACKETHISTORY_H */ olsrd-0.6.6.2/lib/p2pd/src/dllist.c000066400000000000000000000056361234304727700166720ustar00rootroot00000000000000#include #include "olsr_types.h" #include "dllist.h" /*------------------------------------------------------------------------------ * Description : appends a node to the list specified by the head and tail * elements * Parameters : head - pointer to the head of the list * tail - pointer to the tail of the list * data - pointer to the data to store in the list * Returns : pointer to the newly created element in the list * Uses data : none *------------------------------------------------------------------------------ */ struct node * append_node(struct node ** head, struct node ** tail, void * data) { struct node * new = calloc(1, sizeof(struct node)); if (*head == NULL) { *head = new; } else { new->prev = *tail; (*tail)->next = new; } new->data = data; *tail = new; return new; } /*------------------------------------------------------------------------------ * Description : removes the specified element from the list specified by the * head and tail elements * Parameters : head - pointer to the head of the list * tail - pointer to the tail of the list * node - the element to remove from the list * free_data - indicator whether to free the content of the data * element * Returns : nothing * Uses data : none *------------------------------------------------------------------------------ */ void remove_node(struct node ** head, struct node **tail, struct node * node, bool free_data) { struct node * curr = NULL; for (curr = *head; curr; curr = curr->next) { if (curr == node) { // Now we found the proper node so we can remove it if (free_data) free(curr->data); if (curr == *head) { // Head node *head = curr->next; } else if (curr == *tail) { // Tail node *tail = curr->prev; } else { // Middle node curr->prev->next = curr->next; curr->next->prev = curr->prev; } if (*head != NULL) (*head)->prev = NULL; if (*tail != NULL) (*tail)->next = NULL; if (curr != NULL) { curr->next = curr->prev = NULL; free(curr); } break; // Bail out if we handled a remove } } } /*------------------------------------------------------------------------------ * Description : clears the entire list specified by the head and tail elements * Parameters : head - pointer to the head of the list * tail - pointer to the tail of the list * free_data - indicator whether to free the data pointer * Returns : nothing * Uses data : none *------------------------------------------------------------------------------ */ void clear_list(struct node **head, struct node **tail, bool free_data) { while (*head) remove_node(head, tail, *head, free_data); } olsrd-0.6.6.2/lib/p2pd/src/dllist.h000066400000000000000000000007401234304727700166660ustar00rootroot00000000000000/* * File: dllist.h * Author: Caspar * * Created on February 28, 2010, 1:59 PM */ #ifndef _DLLIST_H #define _DLLIST_H struct node { void * data; struct node * next; struct node * prev; }; struct node * append_node(struct node ** head, struct node ** tail, void * data); void remove_node(struct node ** head, struct node **tail, struct node * node, bool free_data); void clear_list(struct node **head, struct node **tail, bool free_data); #endif /* _DLLIST_H */ olsrd-0.6.6.2/lib/p2pd/src/olsrd_plugin.c000066400000000000000000000136541234304727700200770ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* System includes */ #include /* assert() */ #include /* NULL */ /* OLSRD includes */ #include "olsrd_plugin.h" #include "plugin_util.h" #include "defs.h" /* uint8_t, olsr_cnf */ #include "scheduler.h" /* olsr_start_timer() */ #include "olsr_cfg.h" /* olsr_cnf() */ #include "olsr_cookie.h" /* olsr_alloc_cookie() */ /* P2PD includes */ #include "p2pd.h" /* InitP2pd(), CloseP2pd() */ #include "NetworkInterfaces.h" /* AddNonOlsrIf */ static void __attribute__ ((constructor)) my_init(void); static void __attribute__ ((destructor)) my_fini(void); //static struct olsr_cookie_info *prune_packet_history_timer_cookie; void olsr_plugin_exit(void); /* ------------------------------------------------------------------------- * Function : olsrd_plugin_interface_version * Description: Plugin interface version * Input : none * Output : none * Return : P2PD plugin interface version number * Data Used : none * Notes : Called by main OLSRD (olsr_load_dl) to check plugin interface * version * ------------------------------------------------------------------------- */ int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } /* ------------------------------------------------------------------------- * Function : olsrd_plugin_init * Description: Plugin initialisation * Input : none * Output : none * Return : fail (0) or success (1) * Data Used : olsr_cnf * Notes : Called by main OLSRD (init_olsr_plugin) to initialize plugin * ------------------------------------------------------------------------- */ int olsrd_plugin_init(void) { return InitP2pd(NULL); } /* ------------------------------------------------------------------------- * Function : olsr_plugin_exit * Description: Plugin cleanup * Input : none * Output : none * Return : none * Data Used : none * Notes : Called by my_fini() at unload of shared object * ------------------------------------------------------------------------- */ void olsr_plugin_exit(void) { CloseP2pd(); } static const struct olsrd_plugin_parameters plugin_parameters[] = { {.name = "NonOlsrIf",.set_plugin_parameter = &AddNonOlsrIf,.data = NULL}, {.name = "P2pdTtl", .set_plugin_parameter = &SetP2pdTtl, .data = NULL }, {.name = "UdpDestPort",.set_plugin_parameter = &AddUdpDestPort,.data = NULL}, {.name = "UseHashFilter",.set_plugin_parameter = &SetP2pdUseHashFilter,.data = NULL}, }; /* ------------------------------------------------------------------------- * Function : olsrd_get_plugin_parameters * Description: Return the parameter table and its size * Input : none * Output : params - the parameter table * size - its size in no. of entries * Return : none * Data Used : plugin_parameters * Notes : Called by main OLSR (init_olsr_plugin) for all plugins * ------------------------------------------------------------------------- */ void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = ARRAYSIZE(plugin_parameters); } /* ------------------------------------------------------------------------- * Function : my_init * Description: Plugin constructor * Input : none * Output : none * Return : none * Data Used : none * Notes : Called at load of shared object * ------------------------------------------------------------------------- */ static void my_init(void) { /* Print plugin info to stdout */ printf("%s\n", MOD_DESC); return; } /* ------------------------------------------------------------------------- * Function : my_fini * Description: Plugin destructor * Input : none * Output : none * Return : none * Data Used : none * Notes : Called at unload of shared object * ------------------------------------------------------------------------- */ static void my_fini(void) { olsr_plugin_exit(); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/p2pd/src/p2pd.c000066400000000000000000001146411234304727700162410ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "p2pd.h" /* System includes */ #include /* NULL */ #include /* ssize_t */ #include /* strerror() */ #include /* va_list, va_start, va_end */ #include /* errno */ #include /* assert() */ #include #include #include /* ETH_P_IP */ #include /* struct sockaddr_ll, PACKET_MULTICAST */ #include /* sigset_t, sigfillset(), sigdelset(), SIGINT */ #include /* struct ip */ #include /* struct udphdr */ #include /* close() */ #include #include #include /* OLSRD includes */ #include "plugin_util.h" /* set_plugin_int */ #include "defs.h" /* olsr_cnf, //OLSR_PRINTF */ #include "ipcalc.h" #include "olsr.h" /* //OLSR_PRINTF */ #include "mid_set.h" /* mid_lookup_main_addr() */ #include "link_set.h" /* get_best_link_to_neighbor() */ #include "net_olsr.h" /* ipequal */ #include "parser.h" /* plugin includes */ #include "NetworkInterfaces.h" /* NonOlsrInterface, CreateBmfNetworkInterfaces(), CloseBmfNetworkInterfaces() */ //#include "Address.h" /* IsMulticast() */ #include "Packet.h" /* ENCAP_HDR_LEN, BMF_ENCAP_TYPE, BMF_ENCAP_LEN etc. */ #include "PacketHistory.h" #include "dllist.h" int P2pdTtl = 0; int P2pdUseHash = 0; /* Switch off hash filter by default */ int P2pdDuplicateTimeout = P2PD_VALID_TIME; /* List of UDP destination address and port information */ struct UdpDestPort * UdpDestPortList = NULL; /* List of filter entries to check for duplicate messages */ struct node * dupFilterHead = NULL; struct node * dupFilterTail = NULL; bool is_broadcast(const struct sockaddr_in addr); bool is_multicast(const struct sockaddr_in addr); char * get_ipv4_str(uint32_t address, char *s, size_t maxlen); char * get_ipv6_str(unsigned char* address, char *s, size_t maxlen); #ifdef INCLUDE_DEBUG_OUTPUT void dump_packet(unsigned char* packet, int length); #endif /* INCLUDE_DEBUG_OUTPUT */ bool check_and_mark_recent_packet(unsigned char *data, int len); /* ------------------------------------------------------------------------- * Function : PacketReceivedFromOLSR * Description: Handle a received packet from a OLSR message * Input : ipPacket into an unsigned char and the lenght of the packet * Output : none * Return : none * Data Used : BmfInterfaces * ------------------------------------------------------------------------- */ static void PacketReceivedFromOLSR(unsigned char *encapsulationUdpData, int len) { struct ip *ipHeader; /* IP header inside the encapsulated IP packet */ struct ip6_hdr *ip6Header; /* IP header inside the encapsulated IP packet */ struct udphdr *udpHeader; struct NonOlsrInterface *walker; int stripped_len = 0; union olsr_ip_addr destAddr; int destPort; bool isInList = false; ipHeader = (struct ip *) ARM_NOWARN_ALIGN(encapsulationUdpData); ip6Header = (struct ip6_hdr *) ARM_NOWARN_ALIGN(encapsulationUdpData); //OLSR_DEBUG(LOG_PLUGINS, "P2PD PLUGIN got packet from OLSR message\n"); if (check_and_mark_recent_packet(encapsulationUdpData, len)) return; /* Check with each network interface what needs to be done on it */ for (walker = nonOlsrInterfaces; walker != NULL; walker = walker->next) { /* To a non-OLSR interface: unpack encapsulated IP packet and forward it */ if (walker->olsrIntf == NULL) { int nBytesWritten; struct sockaddr_ll dest; memset(&dest, 0, sizeof(dest)); dest.sll_family = AF_PACKET; if ((encapsulationUdpData[0] & 0xf0) == 0x40) { dest.sll_protocol = htons(ETH_P_IP); stripped_len = ntohs(ipHeader->ip_len); } if ((encapsulationUdpData[0] & 0xf0) == 0x60) { dest.sll_protocol = htons(ETH_P_IPV6); stripped_len = 40 + ntohs(ip6Header->ip6_plen); // IPv6 Header size (40) // + payload_len } // Sven-Ola: Don't know how to handle the "stripped_len is uninitialized" // condition, maybe exit(1) is better...? if (0 == stripped_len) return; //TODO: if packet is not IP die here if (stripped_len > len) { } dest.sll_ifindex = if_nametoindex(walker->ifName); dest.sll_halen = IFHWADDRLEN; if (olsr_cnf->ip_version == AF_INET) { /* Use all-ones as destination MAC address. When the IP destination is * a multicast address, the destination MAC address should normally also * be a multicast address. E.g., when the destination IP is 224.0.0.1, * the destination MAC should be 01:00:5e:00:00:01. However, it does not * seem to matter when the destination MAC address is set to all-ones * in that case. */ if (IsMulticastv4(ipHeader)) { in_addr_t addr = ntohl(ipHeader->ip_dst.s_addr); dest.sll_addr[0] = 0x01; dest.sll_addr[1] = 0x00; dest.sll_addr[2] = 0x5E; dest.sll_addr[3] = (addr >> 16) & 0x7F; dest.sll_addr[4] = (addr >> 8) & 0xFF; dest.sll_addr[5] = addr & 0xFF; } else { /* broadcast or whatever */ memset(dest.sll_addr, 0xFF, IFHWADDRLEN); } } else /*(olsr_cnf->ip_version == AF_INET6) */ { if (IsMulticastv6(ip6Header)) { dest.sll_addr[0] = 0x33; dest.sll_addr[1] = 0x33; dest.sll_addr[2] = ip6Header->ip6_dst.s6_addr[12]; dest.sll_addr[3] = ip6Header->ip6_dst.s6_addr[13]; dest.sll_addr[4] = ip6Header->ip6_dst.s6_addr[14]; dest.sll_addr[5] = ip6Header->ip6_dst.s6_addr[15]; } } if (olsr_cnf->ip_version == AF_INET) { // Determine the IP address and the port from the header information if (ipHeader->ip_p == SOL_UDP && !IsIpv4Fragment(ipHeader)) { udpHeader = (struct udphdr*) ARM_NOWARN_ALIGN((encapsulationUdpData + GetIpHeaderLength(encapsulationUdpData))); destAddr.v4.s_addr = ipHeader->ip_dst.s_addr; destPort = htons(udpHeader->dest); isInList = InUdpDestPortList(AF_INET, &destAddr, destPort); #ifdef INCLUDE_DEBUG_OUTPUT if (!isInList) { char tmp[32]; OLSR_PRINTF(1, "%s: Not in dest/port list: %s:%d\n", PLUGIN_NAME_SHORT, get_ipv4_str(destAddr.v4.s_addr, tmp, sizeof(tmp)), destPort); } #endif /* INCLUDE_DEBUG_OUTPUT */ } } else /* (olsr_cnf->ip_version == AF_INET6) */ { if (ip6Header->ip6_nxt == SOL_UDP && !IsIpv6Fragment(ip6Header)) { udpHeader = (struct udphdr*) ARM_NOWARN_ALIGN((encapsulationUdpData + 40)); memcpy(&destAddr.v6, &ip6Header->ip6_dst, sizeof(struct in6_addr)); destPort = htons(udpHeader->dest); isInList = InUdpDestPortList(AF_INET6, &destAddr, destPort); #ifdef INCLUDE_DEBUG_OUTPUT if (!isInList) { char tmp[64]; OLSR_PRINTF(1, "%s: Not in dest/port list: %s:%d\n", PLUGIN_NAME_SHORT, get_ipv6_str(destAddr.v6.s6_addr, tmp, sizeof(tmp)), destPort); } #endif /* INCLUDE_DEBUG_OUTPUT */ } } if (!isInList) { /* Address/port combination of this packet is not in the UDP dest/port * list and will therefore be suppressed. I.e. just continue with the * next interface to emit on. */ continue; } nBytesWritten = sendto(walker->capturingSkfd, encapsulationUdpData, stripped_len, 0, (struct sockaddr *)&dest, sizeof(dest)); if (nBytesWritten != stripped_len) { P2pdPError("sendto() error forwarding unpacked encapsulated pkt on \"%s\"", walker->ifName); } else { //OLSR_PRINTF( // 2, // "%s: --> unpacked and forwarded on \"%s\"\n", // PLUGIN_NAME_SHORT, // walker->ifName); } } /* if (walker->olsrIntf == NULL) */ } } /* PacketReceivedFromOLSR */ /* Highest-numbered open socket file descriptor. To be used as first * parameter in calls to select(...). */ int HighestSkfd = -1; /* Set of socket file descriptors */ fd_set InputSet; /* ------------------------------------------------------------------------- * Function : p2pd_message_seen * Description: Check whether the current message has been seen before * Input : head - start of the list to check for the message * tail - end of the list to check for the message * m - message to check for in the list * Output : none * Return : true if message was found, false otherwise * Data Used : P2pdDuplicateTimeout * ------------------------------------------------------------------------- */ bool p2pd_message_seen(struct node **head, struct node **tail, union olsr_message *m) { struct node * curr; time_t now; now = time(NULL); // Check whether any entries have aged curr = *head; while (curr) { struct DupFilterEntry *filter; struct node * next = curr->next; // Save the current pointer since curr may // be destroyed filter = (struct DupFilterEntry*)curr->data; if ((filter->creationtime + P2pdDuplicateTimeout) < now) remove_node(head, tail, curr, true); // Skip to the next element curr = next; } // Now check whether there are any duplicates for (curr = *head; curr; curr = curr->next) { struct DupFilterEntry *filter = (struct DupFilterEntry*)curr->data; if (olsr_cnf->ip_version == AF_INET) { if (filter->address.v4.s_addr == m->v4.originator && filter->msgtype == m->v4.olsr_msgtype && filter->seqno == m->v4.seqno) { return true; } } else /* if (olsr_cnf->ip_version == AF_INET6) */ { if (memcmp(filter->address.v6.s6_addr, m->v6.originator.s6_addr, sizeof(m->v6.originator.s6_addr)) == 0 && filter->msgtype == m->v6.olsr_msgtype && filter->seqno == m->v6.seqno) { return true; } } } return false; } /* ------------------------------------------------------------------------- * Function : p2pd_store_message * Description: Store a new message in the duplicate message check list * Input : head - start of the list to add the message to * tail - end of the list to add the message to * m - message to add to the list * Output : none * Return : nothing * Data Used : none * ------------------------------------------------------------------------- */ void p2pd_store_message(struct node **head, struct node **tail, union olsr_message *m) { time_t now; // Store a message into the database struct DupFilterEntry *new_dup = calloc(1, sizeof(struct DupFilterEntry)); if (new_dup == NULL) { OLSR_PRINTF(1, "%s: Out of memory\n", PLUGIN_NAME_SHORT); return; } now = time(NULL); new_dup->creationtime = now; if (olsr_cnf->ip_version == AF_INET) { new_dup->address.v4.s_addr = m->v4.originator; new_dup->msgtype = m->v4.olsr_msgtype; new_dup->seqno = m->v4.seqno; } else /* if (olsr_cnf->ip_version == AF_INET6) */ { memcpy(new_dup->address.v6.s6_addr, m->v6.originator.s6_addr, sizeof(m->v6.originator.s6_addr)); new_dup->msgtype = m->v6.olsr_msgtype; new_dup->seqno = m->v6.seqno; } // Add the element to the head of the list append_node(head, tail, new_dup); } /* ------------------------------------------------------------------------- * Function : p2pd_is_duplicate_message * Description: Check whether the specified message is a duplicate * Input : msg - message to check for in the list of duplicate messages * Output : none * Return : true if message was found, false otherwise * Data Used : none * ------------------------------------------------------------------------- */ bool p2pd_is_duplicate_message(union olsr_message *msg) { if(p2pd_message_seen(&dupFilterHead, &dupFilterTail, msg)) { return true; } p2pd_store_message(&dupFilterHead, &dupFilterTail, msg); return false; } /* ------------------------------------------------------------------------- * Function : olsr_parser * Description: Function to be passed to the parser engine. This function * processes the incoming message and passes it on if necessary. * Input : m - message to parse * in_if - interface to use (unused in this application) * ipaddr - IP-address to use (unused in this application) * Output : none * Return : false if message should be supressed, true otherwise * Data Used : none * ------------------------------------------------------------------------- */ bool olsr_parser(union olsr_message *m, struct interface *in_if __attribute__ ((unused)), union olsr_ip_addr *ipaddr __attribute__ ((unused))) { union olsr_ip_addr originator; int size; //OLSR_DEBUG(LOG_PLUGINS, "P2PD PLUGIN: Received msg in parser\n"); /* Fetch the originator of the messsage */ if (olsr_cnf->ip_version == AF_INET) { memcpy(&originator, &m->v4.originator, olsr_cnf->ipsize); size = ntohs(m->v4.olsr_msgsize); } else { memcpy(&originator, &m->v6.originator, olsr_cnf->ipsize); size = ntohs(m->v6.olsr_msgsize); } /* Check if message originated from this node. * If so - back off */ if (ipequal(&originator, &olsr_cnf->main_addr)) return false; /* Don't forward either */ /* Check for duplicate messages for processing */ if (p2pd_is_duplicate_message(m)) return true; /* Don't process but allow to be forwarded */ if (olsr_cnf->ip_version == AF_INET) { PacketReceivedFromOLSR((unsigned char *)&m->v4.message, size - 12); } else { PacketReceivedFromOLSR((unsigned char *)&m->v6.message, size - 12 - 96); } return true; } /* ------------------------------------------------------------------------- * Function : olsr_p2pd_gen * Description: Sends a packet in the OLSR network * Input : packet - packet to send in the OLSR network * len - length of the packet to send * Output : none * Return : nothing * Data Used : none * ------------------------------------------------------------------------- */ void olsr_p2pd_gen(unsigned char *packet, int len) { /* send buffer: huge */ char buffer[10240]; int aligned_size; union olsr_message *message = (union olsr_message *)buffer; struct interface *ifn; aligned_size=len; if ((aligned_size % 4) != 0) { aligned_size = (aligned_size - (aligned_size % 4)) + 4; } /* fill message */ if (olsr_cnf->ip_version == AF_INET) { /* IPv4 */ message->v4.olsr_msgtype = P2PD_MESSAGE_TYPE; message->v4.olsr_vtime = reltime_to_me(P2PD_VALID_TIME * MSEC_PER_SEC); memcpy(&message->v4.originator, &olsr_cnf->main_addr, olsr_cnf->ipsize); message->v4.ttl = P2pdTtl ? P2pdTtl : MAX_TTL; message->v4.hopcnt = 0; message->v4.seqno = htons(get_msg_seqno()); message->v4.olsr_msgsize = htons(aligned_size + 12); memset(&message->v4.message, 0, aligned_size); memcpy(&message->v4.message, packet, len); aligned_size = aligned_size + 12; } else /* if (olsr_cnf->ip_version == AF_INET6) */ { /* IPv6 */ message->v6.olsr_msgtype = P2PD_MESSAGE_TYPE; message->v6.olsr_vtime = reltime_to_me(P2PD_VALID_TIME * MSEC_PER_SEC); memcpy(&message->v6.originator, &olsr_cnf->main_addr, olsr_cnf->ipsize); message->v6.ttl = P2pdTtl ? P2pdTtl : MAX_TTL; message->v6.hopcnt = 0; message->v6.seqno = htons(get_msg_seqno()); message->v6.olsr_msgsize = htons(aligned_size + 12 + 96); memset(&message->v6.message, 0, aligned_size); memcpy(&message->v6.message, packet, len); aligned_size = aligned_size + 12 + 96; } /* looping through interfaces */ for (ifn = ifnet; ifn; ifn = ifn->int_next) { //OLSR_PRINTF(1, "%s: Generating packet - [%s]\n", PLUGIN_NAME_SHORT, ifn->int_name); if (net_outbuffer_push(ifn, message, aligned_size) != aligned_size) { /* send data and try again */ net_output(ifn); if (net_outbuffer_push(ifn, message, aligned_size) != aligned_size) { //OLSR_PRINTF(1, "%s: could not send on interface: %s\n", PLUGIN_NAME_SHORT, ifn->int_name); } } } } /* ------------------------------------------------------------------------- * Function : P2pdPError * Description: Prints an error message at OLSR debug level 1. * First the plug-in name is printed. Then (if format is not NULL * and *format is not empty) the arguments are printed, followed * by a colon and a blank. Then the message and a new-line. * Input : format, arguments * Output : none * Return : none * Data Used : none * ------------------------------------------------------------------------- */ void P2pdPError(const char *format, ...) { #define MAX_STR_DESC 255 char strDesc[MAX_STR_DESC]; #if !defined REMOVE_LOG_DEBUG char *stringErr = strerror(errno); #endif /* !defined REMOVE_LOG_DEBUG */ /* Rely on short-circuit boolean evaluation */ if (format == NULL || *format == '\0') { //OLSR_DEBUG(LOG_PLUGINS, "%s: %s\n", PLUGIN_NAME, stringErr); } else { va_list arglist; va_start(arglist, format); vsnprintf(strDesc, MAX_STR_DESC, format, arglist); va_end(arglist); strDesc[MAX_STR_DESC - 1] = '\0'; /* Ensures null termination */ #if !defined REMOVE_LOG_DEBUG OLSR_DEBUG(LOG_PLUGINS, "%s: %s\n", strDesc, stringErr); #endif /* !defined REMOVE_LOG_DEBUG */ } } /* P2pdPError */ /* ------------------------------------------------------------------------- * Function : MainAddressOf * Description: Lookup the main address of a node * Input : ip - IP address of the node * Output : none * Return : The main IP address of the node * Data Used : none * ------------------------------------------------------------------------- */ union olsr_ip_addr * MainAddressOf(union olsr_ip_addr *ip) { union olsr_ip_addr *result; /* TODO: mid_lookup_main_addr() is not thread-safe! */ result = mid_lookup_main_addr(ip); if (result == NULL) { result = ip; } return result; } /* MainAddressOf */ /* ------------------------------------------------------------------------- * Function : InUdpDestPortList * Description: Check whether the specified address and port is in the list of * configured UDP destination/port entries * Input : ip_version - IP version to use for this check * addr - address to check for in the list * port - port to check for in the list * Output : none * Return : true if destination/port combination was found, false otherwise * Data Used : UdpDestPortList * ------------------------------------------------------------------------- */ bool InUdpDestPortList(int ip_version, union olsr_ip_addr *addr, uint16_t port) { struct UdpDestPort *walker; for (walker = UdpDestPortList; walker; walker = walker->next) { if (walker->ip_version == ip_version) { if (ip_version == AF_INET) { if (addr->v4.s_addr == walker->address.v4.s_addr && walker->port == port) return true; // Found so we can stop here } else /* ip_version == AF_INET6 */ { if ((memcmp(addr->v6.s6_addr, walker->address.v6.s6_addr, sizeof(addr->v6.s6_addr)) == 0) && (walker->port == port)) return true; // Found so we can stop here } } } return false; } /* ------------------------------------------------------------------------- * Function : P2pdPacketCaptured * Description: Handle a captured IP packet * Input : encapsulationUdpData - space for the encapsulation header, * followed by the captured IP packet * nBytes - The number of bytes in the data packet * Output : none * Return : none * Data Used : P2pdInterfaces * Notes : The IP packet is assumed to be captured on a socket of family * PF_PACKET and type SOCK_DGRAM (cooked). * ------------------------------------------------------------------------- */ static void P2pdPacketCaptured(unsigned char *encapsulationUdpData, int nBytes) { union olsr_ip_addr dst; /* Destination IP address in captured packet */ struct ip *ipHeader; /* The IP header inside the captured IP packet */ struct ip6_hdr *ipHeader6; /* The IP header inside the captured IP packet */ struct udphdr *udpHeader; u_int16_t destPort; if ((encapsulationUdpData[0] & 0xf0) == 0x40) { //IPV4 ipHeader = (struct ip *) ARM_NOWARN_ALIGN(encapsulationUdpData); dst.v4 = ipHeader->ip_dst; if (ipHeader->ip_p != SOL_UDP) { /* Not UDP */ #ifdef INCLUDE_DEBUG_OUTPUT OLSR_PRINTF(1,"%s: NON UDP PACKET\n", PLUGIN_NAME_SHORT); #endif /* INCLUDE_DEBUG_OUTPUT */ return; /* for */ } // If we're dealing with a fragment we bail out here since there's no valid // UDP header in this message if (IsIpv4Fragment(ipHeader)) { #ifdef INCLUDE_DEBUG_OUTPUT OLSR_PRINTF(1, "%s: Is IPv4 fragment\n", PLUGIN_NAME_SHORT); #endif /* INCLUDE_DEBUG_OUTPUT */ return; } if (check_and_mark_recent_packet(encapsulationUdpData, nBytes)) return; udpHeader = (struct udphdr *) ARM_NOWARN_ALIGN((encapsulationUdpData + GetIpHeaderLength(encapsulationUdpData))); destPort = ntohs(udpHeader->dest); if (!InUdpDestPortList(AF_INET, &dst, destPort)) { #ifdef INCLUDE_DEBUG_OUTPUT char tmp[32]; OLSR_PRINTF(1, "%s: Not in dest/port list: %s:%d\n", PLUGIN_NAME_SHORT, get_ipv4_str(dst.v4.s_addr, tmp, sizeof(tmp)), destPort); #endif /* INCLUDE_DEBUG_OUTPUT */ return; } } //END IPV4 else if ((encapsulationUdpData[0] & 0xf0) == 0x60) { //IPv6 ipHeader6 = (struct ip6_hdr *) ARM_NOWARN_ALIGN(encapsulationUdpData); memcpy(&dst.v6, &ipHeader6->ip6_dst, sizeof(struct in6_addr)); if (ipHeader6->ip6_dst.s6_addr[0] == 0xff) //Multicast { //Continue } else { return; //not multicast } if (ipHeader6->ip6_nxt != SOL_UDP) { /* Not UDP */ //OLSR_PRINTF(1,"%s: NON UDP PACKET\n", PLUGIN_NAME_SHORT); return; /* for */ } // Check whether this is a IPv6 fragment if (IsIpv6Fragment(ipHeader6)) { #ifdef INCLUDE_DEBUG_OUTPUT OLSR_PRINTF(1, "%s: Is IPv6 fragment\n", PLUGIN_NAME_SHORT); #endif /* INCLUDE_DEBUG_OUTPUT */ return; } if (check_and_mark_recent_packet(encapsulationUdpData, nBytes)) return; udpHeader = (struct udphdr *) ARM_NOWARN_ALIGN((encapsulationUdpData + 40)); destPort = ntohs(udpHeader->dest); if (!InUdpDestPortList(AF_INET6, &dst, destPort)) { #ifdef INCLUDE_DEBUG_OUTPUT char tmp[64]; OLSR_PRINTF(1, "%s: Not in dest/port list: %s:%d\n", PLUGIN_NAME_SHORT, get_ipv6_str(dst.v6.s6_addr, tmp, sizeof(tmp)), destPort); #endif /* INCLUDE_DEBUG_OUTPUT */ return; } } //END IPV6 else { return; //Is not IP packet } // send the packet to OLSR forward mechanism olsr_p2pd_gen(encapsulationUdpData, nBytes); } /* P2pdPacketCaptured */ /* ------------------------------------------------------------------------- * Function : DoP2pd * Description: This function is registered with the OLSR scheduler and called * when something is captured * Input : none * Output : none * Return : none * Data Used : * ------------------------------------------------------------------------- */ void DoP2pd(int skfd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { unsigned char rxBuffer[P2PD_BUFFER_SIZE]; if (skfd >= 0) { struct sockaddr_ll pktAddr; socklen_t addrLen = sizeof(pktAddr); int nBytes; unsigned char *ipPacket; /* Receive the captured Ethernet frame, leaving space for the BMF * encapsulation header */ ipPacket = GetIpPacket(rxBuffer); nBytes = recvfrom(skfd, ipPacket, P2PD_BUFFER_SIZE, 0, (struct sockaddr *)&pktAddr, &addrLen); #ifdef INCLUDE_DEBUG_OUTPUT OLSR_PRINTF(1, "%s: Received %d bytes\n", PLUGIN_NAME_SHORT, nBytes); #endif /* INCLUDE_DEBUG_OUTPUT */ if (nBytes < 0) { return; /* for */ } /* if (nBytes < 0) */ /* Check if the number of received bytes is large enough for an IP * packet which contains at least a minimum-size IP header. * Note: There is an apparent bug in the packet socket implementation in * combination with VLAN interfaces. On a VLAN interface, the value returned * by 'recvfrom' may (but need not) be 4 (bytes) larger than the value * returned on a non-VLAN interface, for the same ethernet frame. */ if (nBytes < (int)sizeof(struct ip)) { ////OLSR_PRINTF( // 1, // "%s: captured frame too short (%d bytes) on \"%s\"\n", // PLUGIN_NAME_SHORT, // nBytes, // walker->ifName); return; /* for */ } if (pktAddr.sll_pkttype == PACKET_OUTGOING || pktAddr.sll_pkttype == PACKET_MULTICAST || pktAddr.sll_pkttype == PACKET_BROADCAST) { #ifdef INCLUDE_DEBUG_OUTPUT OLSR_PRINTF(1, "%s: Multicast or broadcast packet was captured.\n", PLUGIN_NAME_SHORT); dump_packet(ipPacket, nBytes); #endif /* INCLUDE_DEBUG_OUTPUT */ /* A multicast or broadcast packet was captured */ P2pdPacketCaptured(ipPacket, nBytes); } /* if (pktAddr.sll_pkttype == ...) */ } /* if (skfd >= 0 && (FD_ISSET...)) */ } /* DoP2pd */ /* ------------------------------------------------------------------------- * Function : InitP2pd * Description: Initialize the P2pd plugin * Input : skipThisInterface - pointer to interface to skip * Output : none * Return : Always 0 * Data Used : none * ------------------------------------------------------------------------- */ int InitP2pd(struct interface *skipThisIntf) { if (P2pdUseHash) { // Initialize hash table for hash based duplicate IP packet check InitPacketHistory(); } //Tells OLSR to launch olsr_parser when the packets for this plugin arrive //olsr_parser_add_function(&olsr_parser, PARSER_TYPE,1); olsr_parser_add_function(&olsr_parser, PARSER_TYPE); //Creates captures sockets and register them to the OLSR scheduler CreateNonOlsrNetworkInterfaces(skipThisIntf); return 0; } /* InitP2pd */ /* ------------------------------------------------------------------------- * Function : CloseP2pd * Description: Close the P2pd plugin and clean up * Input : none * Output : none * Return : none * Data Used : * ------------------------------------------------------------------------- */ void CloseP2pd(void) { CloseNonOlsrNetworkInterfaces(); } /* ------------------------------------------------------------------------- * Function : SetP2pdTtl * Description: Set the TTL for message from this plugin * Input : value - parameter value to evaluate * Output : none * Return : Always 0 * Data Used : P2pdTtl * ------------------------------------------------------------------------- */ int SetP2pdTtl(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { assert(value != NULL); P2pdTtl = atoi(value); return 0; } /* ------------------------------------------------------------------------- * Function : SetP2pdUseHashFilter * Description: Set the Hash filter flag for this plug-in * Input : value - parameter value to evaluate * data - data associated with this parameter (unused in this app) * addon - additional parameter data * Output : none * Return : Always 0 * Data Used : P2pdUseHash * ------------------------------------------------------------------------- */ int SetP2pdUseHashFilter(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { assert(value != NULL); P2pdUseHash = atoi(value); return 0; } /* ------------------------------------------------------------------------- * Function : AddUdpDestPort * Description: Set the UDP destination/port combination as an entry in the * UdpDestPortList * Input : value - parameter value to evaluate * Output : none * Return : -1 on error condition, 0 if all is ok * Data Used : UdpDestPortList * ------------------------------------------------------------------------- */ int AddUdpDestPort(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { char destAddr[INET6_ADDRSTRLEN]; uint16_t destPort; int num; struct UdpDestPort * new; struct sockaddr_in addr4; struct sockaddr_in6 addr6; int ip_version = AF_INET; int res; assert(value != NULL); // Retrieve the data from the argument string passed memset(destAddr, 0, sizeof(destAddr)); num = sscanf(value, "%45s %hd", destAddr, &destPort); if (num != 2) { OLSR_PRINTF(1, "%s: Invalid argument for \"UdpDestPort\"", PLUGIN_NAME_SHORT); return -1; } // Check whether we're dealing with an IPv4 or IPv6 address // When the string contains a ':' we can assume we're dealing with IPv6 if (strchr(destAddr, (int)':')) { ip_version = AF_INET6; } // Check whether the specified address was either IPv4 multicast, // IPv4 broadcast or IPv6 multicast. switch (ip_version) { case AF_INET6: res = inet_pton(AF_INET6, destAddr, &addr6.sin6_addr); if (addr6.sin6_addr.s6_addr[0] != 0xFF) { OLSR_PRINTF(1,"WARNING: IPv6 address must be multicast... "); return -1; } break; default: res = inet_pton(AF_INET, destAddr, &addr4.sin_addr); if (!is_broadcast(addr4) && !is_multicast(addr4)) { OLSR_PRINTF(1,"WARNING: IPv4 address must be multicast or broadcast... "); } break; } // Determine whether it is a valid IP address if (res == 0) { OLSR_PRINTF(1, "Invalid address specified for \"UdpDestPort\""); return -1; } // Create a new entry and link it into the chain new = calloc(1, sizeof(struct UdpDestPort)); if (new == NULL) { OLSR_PRINTF(1, "%s: Out of memory", PLUGIN_NAME_SHORT); return -1; } new->ip_version = ip_version; switch (ip_version) { case AF_INET6: memcpy(&new->address.v6.s6_addr, &addr6.sin6_addr.s6_addr, sizeof(addr6.sin6_addr.s6_addr)); break; default: new->address.v4.s_addr = addr4.sin_addr.s_addr; break; } new->port = destPort; new->next = UdpDestPortList; UdpDestPortList = new; // And then we're done return 0; } /* ------------------------------------------------------------------------- * Function : get_ipv4_str * Description: Convert the specified address to an IPv4 compatible string * Input : address - IPv4 address to convert to string * s - string buffer to contain the resulting string * maxlen - maximum length of the string buffer * Output : none * Return : Pointer to the string buffer containing the result * Data Used : none * ------------------------------------------------------------------------- */ char * get_ipv4_str(uint32_t address, char *s, size_t maxlen) { struct sockaddr_in v4; v4.sin_addr.s_addr = address; inet_ntop(AF_INET, &v4.sin_addr, s, maxlen); return s; } /* ------------------------------------------------------------------------- * Function : get_ipv6_str * Description: Convert the specified address to an IPv4 compatible string * Input : address - IPv6 address to convert to string * s - string buffer to contain the resulting string * maxlen - maximum length of the string buffer * Output : none * Return : Pointer to the string buffer containing the result * Data Used : none * ------------------------------------------------------------------------- */ char * get_ipv6_str(unsigned char* address, char *s, size_t maxlen) { struct sockaddr_in6 v6; memcpy(v6.sin6_addr.s6_addr, address, sizeof(v6.sin6_addr.s6_addr)); inet_ntop(AF_INET6, &v6.sin6_addr, s, maxlen); return s; } /* ------------------------------------------------------------------------- * Function : is_broadcast * Description: Check whether the address represents a broadcast address * Input : addr - IPv4 address to check * Output : none * Return : true if broadcast address, false otherwise * Data Used : none * ------------------------------------------------------------------------- */ bool is_broadcast(const struct sockaddr_in addr) { if (addr.sin_addr.s_addr == 0xFFFFFFFF) return true; return false; } /* ------------------------------------------------------------------------- * Function : is_multicast * Description: Check whether the address represents a multicast address * Input : addr - IPv4 address to check * Output : none * Return : true if broadcast address, false otherwise * Data Used : none * ------------------------------------------------------------------------- */ bool is_multicast(const struct sockaddr_in addr) { if ((htonl(addr.sin_addr.s_addr) & 0xE0000000) == 0xE0000000) return true; return false; } #ifdef INCLUDE_DEBUG_OUTPUT /* ------------------------------------------------------------------------- * Function : dump_packet * Description: Dump the specified data as hex output * Input : packet - packet to dump to output * length - length of the data in the packet * Output : none * Return : nothing * Data Used : none * ------------------------------------------------------------------------- */ void dump_packet(unsigned char* packet, int length) { int idx; OLSR_PRINTF(1, "%s: ", PLUGIN_NAME_SHORT); for (idx = 0; idx < length; idx++) { if (idx > 0 && ((idx % 16) == 0)) OLSR_PRINTF(1, "\n%s: ", PLUGIN_NAME_SHORT); OLSR_PRINTF(1, "%2.2X ", packet[idx]); } OLSR_PRINTF(1, "\n"); } #endif /* INCLUDE_DEBUG_OUTPUT */ /* ------------------------------------------------------------------------- * Function : check_and_mark_recent_packet * Description: Wrapper function for the Hash based duplicate check * Input : data - pointer to a packet of data to be checked * Output : none * Return : true if duplicate packet, false otherwise * Data Used : P2pdUseHash * ------------------------------------------------------------------------- */ bool check_and_mark_recent_packet(unsigned char *data, int len __attribute__ ((unused))) { unsigned char * ipPacket; uint16_t ipPacketLen; uint32_t crc32; /* If we don't use this filter bail out here */ if (!P2pdUseHash) return false; /* Clean up the hash table each time before we check it */ PrunePacketHistory(NULL); /* Check for duplicate IP packets now based on a hash */ ipPacket = GetIpPacket(data); ipPacketLen = GetIpTotalLength(ipPacket); /* Calculate packet fingerprint */ crc32 = PacketCrc32(ipPacket, ipPacketLen); /* Check if this packet was seen recently */ if (CheckAndMarkRecentPacket(crc32)) { OLSR_PRINTF( 8, "%s: --> discarding: packet is duplicate\n", PLUGIN_NAME_SHORT); return true; } return false; } olsrd-0.6.6.2/lib/p2pd/src/p2pd.h000066400000000000000000000112341234304727700162400ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _P2PD_H #define _P2PD_H #define REMOVE_LOG_DEBUG // Either #define or #undef the following line to include extra debugging #undef INCLUDE_DEBUG_OUTPUT #include "olsrd_plugin.h" /* union set_plugin_parameter_addon */ #include "duplicate_set.h" //#include "socket_parser.h" #include "dllist.h" #define P2PD_MESSAGE_TYPE 132 #define PARSER_TYPE P2PD_MESSAGE_TYPE #define P2PD_VALID_TIME 180 /* seconds */ /* P2PD plugin data */ #define PLUGIN_NAME "OLSRD P2PD plugin" #define PLUGIN_NAME_SHORT "OLSRD P2PD" #define PLUGIN_VERSION "0.1.0 (" __DATE__ " " __TIME__ ")" #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION #define PLUGIN_INTERFACE_VERSION 5 #define IPHDR_FRAGMENT_MASK 0xC000 /* Forward declaration of OLSR interface type */ struct interface; struct DupFilterEntry { int ip_version; union olsr_ip_addr address; uint16_t seqno; uint8_t msgtype; time_t creationtime; }; struct UdpDestPort { int ip_version; union olsr_ip_addr address; uint16_t port; struct UdpDestPort * next; }; extern int P2pdTtl; extern int P2pdDuplicateTimeout; extern int HighestSkfd; extern fd_set InputSet; extern struct UdpDestPort * UdpDestPortList; extern struct DuplicateFilterEntry * FilterList; void DoP2pd(int sd, void *x, unsigned int y); void P2pdPError(const char *format, ...) __attribute__ ((format(printf, 1, 2))); union olsr_ip_addr *MainAddressOf(union olsr_ip_addr *ip); int InitP2pd(struct interface *skipThisIntf); void CloseP2pd(void); int SetP2pdTtl(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))); int AddUdpDestPort(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))); bool InUdpDestPortList(int ip_version, union olsr_ip_addr *addr, uint16_t port); int SetP2pdTtl(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))); int SetP2pdUseHashFilter(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))); bool p2pd_message_seen(struct node **head, struct node **tail, union olsr_message *m); void p2pd_store_message(struct node **head, struct node **tail, union olsr_message *m); bool p2pd_is_duplicate_message(union olsr_message *msg); void olsr_p2pd_gen(unsigned char *packet, int len); /* Parser function to register with the scheduler */ bool olsr_parser(union olsr_message *, struct interface *, union olsr_ip_addr *); #endif /* _P2PD_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/p2pd/src/version-script.txt000066400000000000000000000002051234304727700207460ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/p2pd/version-script.txt000066400000000000000000000002051234304727700201570ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/pgraph/000077500000000000000000000000001234304727700150465ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pgraph/Makefile000066400000000000000000000044301234304727700165070ustar00rootroot00000000000000# The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_pgraph PLUGIN_VER = 1.1 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) olsrd-0.6.6.2/lib/pgraph/README_PGRAPH000066400000000000000000000056351234304727700170000ustar00rootroot00000000000000README-OLSR Modified: 05/17/2005 #======================================================================== # These programs NEVER meet your needs. In fact, they can cause # serious damages to your precious things, including, but not being # limited to, time, money, effort, computer files, information, # hardware, software, and other things that you value. # # The author DOES NOT request or even suggest that you use any of these # programs. You understand clearly that you are taking a big risk # in using these programs and that you are completely (100%) liable # for using them. # # You further understand that although you can use these programs # without paying the author or the employer of the author, you # do not own them. You will give proper credits to the # author and his employer whenever you use them; i.e., # you will never pretend that you are the author of these programs. # If you make any changes to them, you will send a copy # of each modified programs to the author. You will also NEVER # sell or give any of them to anyone else without the approval of the # author or his employer. Parser: OLSRConnect.py Description: This parser has been written to interface with a plugin for the version 4.9 OLSR from olsr.org. The plugin can also be found in this directory. Parser for OLSR: OLSRConnect.py Plugin for OLSRv4.9: olsr_v4.9-pgraph-plugin Usage: 1) Copy the "olsr_v4.9-pgraph-plugin" directory from this distribution to the "//lib/." 2) cd to the "//lib/." directory, run "make" and "make install" This will create the "olsrd_pgraph.so.1.1" file and install it. 3) Modify the "/etc/olsrd.conf" file of the system you wish to monitor from to load the plugin. Add the line: "LoadPlugin "olsrd_pgraph.so.1.1" {}" 4) The plugin actually allows any host to connect regardless of what is specified in the olsrd.conf file. This is currently done for testing purposes and due to the fact that the "Host" parameter in the olsrd.conf file never worked. # By default only localhost will be able to connect to the IPC # system of the olsrd process so if you are not going to be # running pgraph locally, modify the "Host" variable of the # "IpcConnect" structure in the "/etc/olsrd.conf" file to # reflect the IP address of the host you will be connecting from. 5) Start olsrd and make sure that the plugin has loaded correctly. 6) On the machine you will be running pgraph from, use the "OLSRConnect.py" parser to connect to the olsrd plugin and pipe the output to pgraph. Usage: (note the use of the backquote "`") "python OLSRConnect.py 2004 | `python pgraph.py`" - Where the "2004" above is the default port that the plugin will be listening on. To kill pgraph when using the parser: - Hit "Ctl-C" in the terminal. olsrd-0.6.6.2/lib/pgraph/src/000077500000000000000000000000001234304727700156355ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pgraph/src/olsrd_pgraph.c000066400000000000000000000251571234304727700204770ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * includes code by Bruno Randolf * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #include "olsrd_pgraph.h" #include "ipcalc.h" #include "olsrd_plugin.h" #include "plugin_util.h" #include "net_olsr.h" #include #include #include #include #include #ifdef _WIN32 #define close(x) closesocket(x) #endif /* _WIN32 */ #define PLUGIN_NAME "OLSRD pgraph plugin" #define PLUGIN_VERSION "0.1" #define PLUGIN_AUTHOR "Richard Gopaul" #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR #define PLUGIN_INTERFACE_VERSION 5 static union olsr_ip_addr ipc_accept_ip; static int ipc_port; static int ipc_socket; static int ipc_connection; void my_init(void) __attribute__ ((constructor)); void my_fini(void) __attribute__ ((destructor)); /* * Defines the version of the plugin interface that is used * THIS IS NOT THE VERSION OF YOUR PLUGIN! * Do not alter unless you know what you are doing! */ int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } /** *Constructor */ void my_init(void) { /* Print plugin info to stdout */ printf("%s\n", MOD_DESC); /* defaults for parameters */ ipc_port = 2004; if (olsr_cnf->ip_version == AF_INET) { ipc_accept_ip.v4.s_addr = htonl(INADDR_LOOPBACK); } else { ipc_accept_ip.v6 = in6addr_loopback; } ipc_socket = -1; ipc_connection = -1; } /** *Destructor */ void my_fini(void) { if (ipc_socket >= 0) { close(ipc_socket); ipc_socket = -1; } if (ipc_connection >= 0) { close(ipc_connection); ipc_connection = -1; } } static const struct olsrd_plugin_parameters plugin_parameters[] = { {.name = "port",.set_plugin_parameter = &set_plugin_port,.data = &ipc_port}, {.name = "accept",.set_plugin_parameter = &set_plugin_ipaddress,.data = &ipc_accept_ip}, }; void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = sizeof(plugin_parameters) / sizeof(*plugin_parameters); } /* Event function to register with the sceduler */ static int pcf_event(int, int, int); static void ipc_action(int, void *, unsigned int); static void ipc_print_neigh_link(struct neighbor_entry *neighbor); static void ipc_print_tc_link(struct tc_entry *entry, struct tc_edge_entry *dst_entry); static int ipc_send(const char *, int); static void ipc_print_neigh_link(struct neighbor_entry *); static int plugin_ipc_init(void); static void ipc_print_neigh_link(struct neighbor_entry *neighbor) { char buf[256]; int len; struct ipaddr_str main_adr, adr; // double etx=0.0; // char* style = "solid"; // struct link_entry* link; len = sprintf(buf, "add link %s %s\n", olsr_ip_to_string(&main_adr, &olsr_cnf->main_addr), olsr_ip_to_string(&adr, &neighbor->neighbor_main_addr)); ipc_send(buf, len); // if (neighbor->status == 0) { // non SYM // style = "dashed"; // } // else { /* find best link to neighbor for the ETX */ //? why cant i just get it one time at fetch_olsrd_data??? (br1) // if(olsr_plugin_io(GETD__LINK_SET, &link, sizeof(link)) && link) // { // link_set = link; // for olsr_neighbor_best_link // link = olsr_neighbor_best_link(&neighbor->neighbor_main_addr); // if (link) { // etx = olsr_calc_etx(link); // } // } // } //len = sprintf( buf, "\"%s\"[label=\"%.2f\", style=%s];\n", adr, etx, style ); //len = sprintf( buf, "%s\n", adr ); //ipc_send(buf, len); //if (neighbor->is_mpr) { // len = sprintf( buf, "\"%s\"[shape=box];\n", adr ); // ipc_send(buf, len); //} } /** *Do initialization here * *This function is called by the my_init *function in uolsrd_plugin.c */ int olsrd_plugin_init(void) { /* Initial IPC value */ ipc_socket = -1; /* Register the "ProcessChanges" function */ register_pcf(&pcf_event); return 1; } static int plugin_ipc_init(void) { struct sockaddr_in sin; uint32_t yes = 1; /* Init ipc socket */ if ((ipc_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { olsr_printf(1, "(DOT DRAW)IPC socket %s\n", strerror(errno)); return 0; } else { if (setsockopt(ipc_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) { perror("SO_REUSEADDR failed"); return 0; } #if defined __FreeBSD__ if (setsockopt(ipc_socket, SOL_SOCKET, SO_NOSIGPIPE, (char *)&yes, sizeof(yes)) < 0) { perror("SO_NOSIGPIPE failed"); return 0; } #endif /* defined __FreeBSD__ */ /* Bind the socket */ /* complete the socket structure */ memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(ipc_port); /* bind the socket to the port number */ if (bind(ipc_socket, (struct sockaddr *)&sin, sizeof(sin)) == -1) { olsr_printf(1, "(DOT DRAW)IPC bind %s\n", strerror(errno)); return 0; } /* show that we are willing to listen */ if (listen(ipc_socket, 1) == -1) { olsr_printf(1, "(DOT DRAW)IPC listen %s\n", strerror(errno)); return 0; } /* Register with olsrd */ add_olsr_socket(ipc_socket, &ipc_action, NULL, NULL, SP_PR_READ); } return 1; } static void ipc_action(int fd __attribute__ ((unused)), void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { struct sockaddr_in pin; socklen_t addrlen; char *addr; char buf[256]; int len; addrlen = sizeof(struct sockaddr_in); if ((ipc_connection = accept(ipc_socket, (struct sockaddr *)&pin, &addrlen)) == -1) { olsr_printf(1, "(DOT DRAW)IPC accept: %s\n", strerror(errno)); exit(1); } else { struct ipaddr_str main_addr; addr = inet_ntoa(pin.sin_addr); /* if(ntohl(pin.sin_addr.s_addr) != ntohl(ipc_accept_ip.s_addr)) { olsr_printf(1, "Front end-connection from foregin host(%s) not allowed!\n", addr); close(ipc_connection); return; } else { */ olsr_printf(1, "(DOT DRAW)IPC: Connection from %s\n", addr); len = sprintf(buf, "add node %s\n", olsr_ip_to_string(&main_addr, &olsr_cnf->main_addr)); ipc_send(buf, len); pcf_event(1, 1, 1); // } } } /** *Scheduled event */ static int pcf_event(int my_changes_neighborhood, int my_changes_topology, int my_changes_hna __attribute__ ((unused))) { int res; struct neighbor_entry *neighbor_table_tmp; struct tc_entry *tc; struct tc_edge_entry *tc_edge; res = 0; if (my_changes_neighborhood || my_changes_topology) { /* Print tables to IPC socket */ //ipc_send("start ", strlen("start ")); /* Neighbors */ OLSR_FOR_ALL_NBR_ENTRIES(neighbor_table_tmp) { ipc_print_neigh_link(neighbor_table_tmp); } OLSR_FOR_ALL_NBR_ENTRIES_END(neighbor_table_tmp); /* Topology */ OLSR_FOR_ALL_TC_ENTRIES(tc) { OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) { ipc_print_tc_link(tc, tc_edge); } OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge); } OLSR_FOR_ALL_TC_ENTRIES_END(tc); ipc_send(" end ", strlen(" end ")); /* HNA entries */ // for(index=0;indexnetworks.next; // // while(tmp_net != &tmp_hna->networks) // { // ipc_print_net(&tmp_hna->A_gateway_addr, // &tmp_net->A_network_addr, // &tmp_net->A_netmask); // tmp_net = tmp_net->next; // } // // tmp_hna = tmp_hna->next; // } // } // ipc_send("}\n\n", strlen("}\n\n")); res = 1; } if (ipc_socket == -1) { plugin_ipc_init(); } return res; } static void ipc_print_tc_link(struct tc_entry *entry, struct tc_edge_entry *dst_entry) { char buf[256]; int len; struct ipaddr_str main_adr, adr; // double etx = olsr_calc_tc_etx(dst_entry); len = sprintf(buf, "add link %s %s\n", olsr_ip_to_string(&main_adr, &entry->addr), olsr_ip_to_string(&adr, &dst_entry->T_dest_addr)); ipc_send(buf, len); } static int ipc_send(const char *data, int size) { if (ipc_connection == -1) return 0; #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __OpenBSD__ #define FLAG 0 #else /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __OpenBSD__ */ #define FLAG MSG_NOSIGNAL #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __OpenBSD__ */ if (send(ipc_connection, data, size, FLAG) < 0) { olsr_printf(1, "(DOT DRAW)IPC connection lost!\n"); close(ipc_connection); ipc_connection = -1; return -1; } return 1; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/pgraph/src/olsrd_pgraph.h000066400000000000000000000053031234304727700204730ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * includes code by Bruno Randolf * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #ifndef _OLSRD_PGRAPH_PLUGIN #define _OLSRD_PGRAPH_PLUGIN #include #include #include #include #include #include #include #include #include #include #include #include "olsrd_plugin.h" #include "olsr_types.h" #include "olsr.h" #include "neighbor_table.h" #include "two_hop_neighbor_table.h" #include "tc_set.h" #include "hna_set.h" #include "mid_set.h" #include "link_set.h" void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size); int olsrd_plugin_interface_version(void); #endif /* _OLSRD_PGRAPH_PLUGIN */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/pgraph/version-script.txt000066400000000000000000000002051234304727700205730ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/pud/000077500000000000000000000000001234304727700143555ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/Makefile000066400000000000000000000074541234304727700160270ustar00rootroot00000000000000NMEALIB_PATH = nmealib LIBRARY_PATH = wireformat JAVA_PATH = wireformat-java include $(LIBRARY_PATH)/Makefile.inc NMEALIB_NAME := nmea LIBRARY_NAME := $(PROJECT) include Makefile.inc TOPDIR = ../.. include $(TOPDIR)/Makefile.inc PUD_NMEALIB_STATICALLY_LINKED ?= CFLAGS += -D_GNU_SOURCE RESOURCESDIR = ./resources NMEALIB_INC = $(NMEALIB_PATH)/include NMEALIB_LIB = $(NMEALIB_PATH)/lib LIBRARY_INC = $(LIBRARY_PATH)/include LIBRARY_LIB = $(LIBRARY_PATH)/lib NMEALIB_LIB_STATIC = $(NMEALIB_LIB)/lib$(NMEALIB_NAME).a CFLAGS += -I $(NMEALIB_INC) -I $(LIBRARY_INC) ifeq ($(PUD_NMEALIB_STATICALLY_LINKED),) LIBS += -L $(NMEALIB_LIB) -L $(LIBRARY_LIB) -l$(NMEALIB_NAME) -lm -l$(LIBRARY_NAME) else # libnmea is statically linked LIBS += -L $(LIBRARY_LIB) -lm -l$(LIBRARY_NAME) endif SUPPORTED = 0 ifeq ($(OS),linux) SUPPORTED = 1 endif ifeq ($(OS),android) SUPPORTED = 1 endif ifeq ($(SUPPORTED),0) .PHONY: all default_target install clean all: default_target default_target install clean: @echo "*** $(PLUGIN_NAME) plugin not supported on $(OS), sorry!" else GIT_SHA = $(shell git describe 2> /dev/null || echo "Unknown") CFLAGS += -DGIT_SHA=\"$(GIT_SHA)\" -DPLUGIN_VER=\"$(PLUGIN_VER)\" .PHONY: all default_target install uninstall clean doc doc-clean nmealib library java java-instal java-uninstall all: default_target default_target: nmealib library $(PLUGIN_FULLNAME) # repeat from toplevel Makefile.inc, and adjust: we need the library includes %.d: %.c $(MAKECMDPREFIX)$(filter-out $(CCACHE),$(CC)) -M $(strip $(CPPFLAGS)) -I $(NMEALIB_INC) -I $(LIBRARY_INC) "$<" | sed -e '1s/\($(call quote,$(*F))\.o\)[ :]*/$(call quote,$(*D)/\1 $@: Makefile $(TOPDIR)$(if $(TOPDIR),/)Makefile.inc) /g' >"$@" $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(PUD_NMEALIB_STATICALLY_LINKED),) ifeq ($(VERBOSE),0) @echo "[LD] $@ (nmealib dynamically linked)" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) else ifeq ($(VERBOSE),0) @echo "[LD] $@ (nmealib statically linked)" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(NMEALIB_LIB_STATIC) $(LIBS) endif install: all $(MAKECMDPREFIX)$(MAKE) -C "$(NMEALIB_PATH)" DESTDIR="$(DESTDIR)" install $(MAKECMDPREFIX)$(MAKE) -C "$(LIBRARY_PATH)" DESTDIR="$(DESTDIR)" install $(INSTALL_LIB) mkdir -p "$(DOCDIR_OLSRD)" cp "$(RESOURCESDIR)/olsrd.pud.position.conf" "$(DOCDIR_OLSRD)" $(STRIP) "$(LIBDIR)/$(PLUGIN_FULLNAME)" uninstall: $(MAKECMDPREFIX)$(MAKE) -C "$(NMEALIB_PATH)" DESTDIR="$(DESTDIR)" uninstall $(MAKECMDPREFIX)$(MAKE) -C "$(LIBRARY_PATH)" DESTDIR="$(DESTDIR)" uninstall rm -f "$(LIBDIR)/lib$(PLUGIN_NAME).so" "$(LIBDIR)/$(PLUGIN_NAME)" "$(DOCDIR_OLSRD)/olsrd.pud.position.conf" $(UNINSTALL_LIB) rmdir -v -p --ignore-fail-on-non-empty "$(LIBDIR)" "$(DOCDIR_OLSRD)" clean: ifeq ($(VERBOSE),0) @echo "[$@]" endif $(MAKECMDPREFIX)rm -f $(OBJS) $(SRCS:%.c=%.d) "$(PLUGIN_FULLNAME)" $(MAKECMDPREFIX)$(MAKE) -C doc clean $(MAKECMDPREFIX)$(MAKE) -C "$(NMEALIB_PATH)" clean $(MAKECMDPREFIX)$(MAKE) -C "$(LIBRARY_PATH)" clean $(MAKECMDPREFIX)$(MAKE) -C "$(JAVA_PATH)" clean doc: $(MAKECMDPREFIX)$(MAKE) -C doc all $(MAKECMDPREFIX)$(MAKE) -C "$(NMEALIB_PATH)" doc $(MAKECMDPREFIX)$(MAKE) -C "$(LIBRARY_PATH)" doc $(MAKECMDPREFIX)$(MAKE) -C "$(JAVA_PATH)" doc doc-clean: $(MAKECMDPREFIX)$(MAKE) -C doc clean $(MAKECMDPREFIX)$(MAKE) -C "$(NMEALIB_PATH)" doc clean $(MAKECMDPREFIX)$(MAKE) -C "$(LIBRARY_PATH)" doc clean $(MAKECMDPREFIX)$(MAKE) -C "$(JAVA_PATH)" doc clean nmealib: $(MAKECMDPREFIX)$(MAKE) -C "$(NMEALIB_PATH)" all library: $(MAKECMDPREFIX)$(MAKE) -C "$(LIBRARY_PATH)" all java: library $(MAKECMDPREFIX)$(MAKE) -C "$(JAVA_PATH)" all java-install: java $(MAKECMDPREFIX)$(MAKE) -C "$(JAVA_PATH)" DESTDIR="$(DESTDIR)" install java-uninstall: $(MAKECMDPREFIX)$(MAKE) -C "$(JAVA_PATH)" DESTDIR="$(DESTDIR)" uninstall endif olsrd-0.6.6.2/lib/pud/Makefile.inc000066400000000000000000000001021234304727700165560ustar00rootroot00000000000000OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_pud PLUGIN_VER = 1.1.0 olsrd-0.6.6.2/lib/pud/README000066400000000000000000000001571234304727700152400ustar00rootroot00000000000000This plugin depends on the NMEA parsing library that can be found at: https://github.com/AHR-Project/nmealib olsrd-0.6.6.2/lib/pud/doc/000077500000000000000000000000001234304727700151225ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/doc/.gitignore000066400000000000000000000000671234304727700171150ustar00rootroot00000000000000/html/ /man/ /latex/ /doxygen.conf.temp /olsrd_pud.pdf olsrd-0.6.6.2/lib/pud/doc/Makefile000066400000000000000000000020601234304727700165600ustar00rootroot00000000000000include ../Makefile.inc HTML_DIR = html MAN_DIR = man LATEX_DIR = latex PDF_NAME = $(PLUGIN_NAME).pdf DOX_FILE = doxygen.conf TMP_DOX_FILE = $(DOX_FILE).temp .PHONY: .gitignore all clean .gitignore: ifeq ($(VERBOSE),0) @echo "[$@] doc" endif $(MAKECMDPREFIX)echo "/$(HTML_DIR)/" > $@ $(MAKECMDPREFIX)echo "/$(MAN_DIR)/" >> $@ $(MAKECMDPREFIX)echo "/$(LATEX_DIR)/" >> $@ $(MAKECMDPREFIX)echo "/$(TMP_DOX_FILE)" >> $@ $(MAKECMDPREFIX)echo "/$(PDF_NAME)" >> $@ clean: ifeq ($(VERBOSE),0) @echo "[$@] doc" endif $(MAKECMDPREFIX)rm -fr "$(TMP_DOX_FILE)" "$(HTML_DIR)" "$(LATEX_DIR)" "$(MAN_DIR)" "$(PDF_NAME)" all: clean $(DOX_FILE) ifeq ($(VERBOSE),0) @echo "[$@] doc" endif $(MAKECMDPREFIX)sed \ -e "s/__PLUGIN_VER__/$(PLUGIN_VER)/" \ -e "s/__LIBNAME__/$(PLUGIN_NAME)/" \ "$(DOX_FILE)" > "$(TMP_DOX_FILE)" $(MAKECMDPREFIX)doxygen "$(TMP_DOX_FILE)" $(MAKECMDPREFIX)rm "$(TMP_DOX_FILE)" $(MAKECMDPREFIX)$(MAKE) -s -C $(LATEX_DIR) all > /dev/null 2>&1 $(MAKECMDPREFIX)mv "$(LATEX_DIR)/refman.pdf" "$(PDF_NAME)" $(MAKECMDPREFIX)rm -fr "$(LATEX_DIR)" olsrd-0.6.6.2/lib/pud/doc/doxygen.conf000066400000000000000000002252271234304727700174600ustar00rootroot00000000000000# Doxyfile 1.8.1.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = "__LIBNAME__" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = "__PLUGIN_VER__" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 2 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all # comments according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you # can mix doxygen, HTML, and XML commands with Markdown formatting. # Disable only in case of backward compatibilities issues. MARKDOWN_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields will be shown inline in the documentation # of the scope in which they are defined (i.e. file, namespace, or group # documentation), provided this scope is documented. If set to NO (the default), # structs, classes, and unions are shown on a separate page (for HTML and Man # pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. SYMBOL_CACHE_SIZE = 0 # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # their name and scope. Since this can be an expensive process and often the # same symbol appear multiple times in the code, doxygen keeps a cache of # pre-resolved symbols. If the cache is too small doxygen will become slower. # If the cache is too large, memory is wasted. The cache size is given by this # formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = YES # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. CITE_BIB_FILES = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.c \ *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C, C++ and Fortran comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 2 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # style sheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of # entries shown in the various tree structured indices initially; the user # can expand and collapse entries dynamically later on. Doxygen will expand # the tree to such a level that at most the specified number of entries are # visible (unless a fully collapsed tree already exceeds this amount). # So setting the number of entries 1 will produce a full collapsed tree by # default. 0 is a special value representing an infinite number of entries # and will result in a full expanded tree by default. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = __LIBNAME__.chm # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = YES # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = YES # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you may also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to # the MathJax Content Delivery Network so you can quickly see the result without # installing MathJax. # However, it is strongly recommended to install a local # copy of MathJax from http://www.mathjax.org before deployment. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = YES # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # http://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = YES # Load style sheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = YES # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = YES #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = "__attribute__(x)=" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. For each # tag file the location of the external documentation should be added. The # format of a tag file without this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths # or URLs. Note that each tag file must have a unique name (where the name does # NOT include the path). If a tag file is not located in the directory in which # doxygen is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You need to make sure dot is able to find # the font, which can be done by putting it in a standard location or by setting # the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the # directory containing the font. DOT_FONTNAME = FreeSans.ttf # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If the UML_LOOK tag is enabled, the fields and methods are shown inside # the class node. If there are many fields or methods and many nodes the # graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS # threshold limits the number of items for each type to make the size more # managable. Set this to 0 for no limit. Note that the threshold may be # exceeded by 50% before the limit is enforced. UML_LIMIT_NUM_FIELDS = 10 # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = YES # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = YES # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES olsrd-0.6.6.2/lib/pud/doc/pud.odt000077500000000000000000002201721234304727700164310ustar00rootroot00000000000000PKb0B^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKb0BConfigurations2/images/Bitmaps/PKb0BConfigurations2/popupmenu/PKb0BConfigurations2/toolpanel/PKb0BConfigurations2/statusbar/PKb0BConfigurations2/toolbar/PKb0BConfigurations2/progressbar/PKb0BConfigurations2/menubar/PKb0BConfigurations2/floater/PKb0B'Configurations2/accelerator/current.xmlPKPKb0B layout-cache]PA}wN$QK4*_@oQ Htz޻9ͼycfisP L;go.0hd"(=ß.vtBV%dQ>e$l WېcQ& b>V$5UnLJToN H*<H\qud/PKDbPKb0B content.xml}rH}ƞiS֐ԘRʇS)eADD%pP:/ek=g{DYV%wwwal+w-yYQ덊BkZe͛ZGw0t1qZu_; {2-1? '8W''t,ܟ&5nLǿ6=>|k>5Ńm9__VFA099>u^G&SϦ1 u8l;&>ləo5F` sspj#qvl4_K3^y¶ T=k{u{u#P@)Zw5@b[V9 =f蓚I#_cF_V޻#+P.ȝCóԊ"+l<Ǘ?|Krkgt{ T6_rw! 9Js6$P 5$L"r`=sh-N@refe3Nm(sՊ~L>5Z XqIi 6玍LTC.ؠ]{ˀvͲB|Џ~@ƥ2"Qdܶy L<0f-L|3x`.9RaB{[ Dj 4@`]_yxO 8t>h9`T0F|3ۙYi</l 6bMpPx?S`7?M>(4tUtʧ_q[Po6S1+kmUmPMvg^W͔[o m5-8 "<~Nx2',(# FP~skk{[^+YX@ҶO=YҤ9_$IH2s x@ -$3$IH2s x@Z[If.HRw < %In$< Km-0,S $)P[N1$$â *eI|I.HH2u@?6@x"L]. .d2p$mp$S6d+ɻo&8QFf@J}ѩm,]c>m|ꇘ :π/SۘOd36BQ< h %]`$viR7eu(#qۙ*pF/x ܿ3?_gog~qFLf#$v| ܿ3?Tڍ_-pPc8~I*nvʳ#$IJ owұ I9m,tlHrS?Կ-INv߱ !6NP"&Yqw#>=- 5zCx 6nv gt7lܪkzsiXtKZk 뻹>v6ַC%{;Co([!7~I>{;Co}nvX_ɜ}qvg_۠߫ξ:z{}3ۙ}Onbx3&:V?js 1 wE_kdzGPT()ܕ0׸އ/vc͇@atSB8k)]3|pذîg:5GU;7m96bbY|f1O5@dZIx;!j)O\Z -(*WV"3 Xç!R߭D98Bx嵉Օu`8aj(yD _aR"< RB&uG)g*D%b/+}0Fr]j-fɋu:HynI^kEM{Zs~ 6VR6L.x,GSCQj#p^oYz؀r>WzURwHE3õԟbCk2ye03>d9&KoTK/}kFqot1 NRA\Bф loZ.v8(G61oBs]@9^I8CHn=yrG57{R#ַ`]~S'Ch-?:O֨k]GՖ2zT}ki0Gm.u=#O^>zjD;GHS*LJw8μLqv&~v 0UTf1fFӨ_kM~^Y|&D޼&}b܄ֵ#"X:rM.6t G!XxXYnL7ׂ{ߕmc&6Vm?󣋀}-otfV?kh% .˞@>L,-"Nsx)K /M_TYR 4 )4yt8B_4IC]['q[IX 8tm/s %[NZ$Q;LNb.8$AFYVs(ȁLXFf/W"b϶I$7Z×b"m`[r44~ʼ[n'.`nB+AS*UE {67QgKjˋ<ეC˝e+SOi`&%ʤ#DcφzZ||R[as$& 6#6_Sز3_f蠸~6Zd46P ;05h\'kbdq q8)v >Þ{An~ĨO jӋ֢VR„zF+AeX/@mm4%JIM;KIԧGs%:|NOF>.~>~KUt?Qx? D{JztQriE>.~=~Y {(n( %:-z6 -#/w͟F6vO`(@,Ri=i)SZ=0J'*UWaoi”5-QVY=% S)/TzboEaZey+VO(LLޒi=! z6gx:x6vVNP!Z<BgcWhul3 F!㐱!␱!_␱!␱!ᐱ!Wᐱ!!!O!fF`*_2z)r*_2z)r%$NXw&_>q&_>q(;awAr%*_>r%*_Bb''4pF` 芿u~f6IwAmb _}_sJBOcJIdZ6k4sqĥmO3}Rm{?Kwr3,k8)8dL""yΰxUF0{'_m/]dRӟs}"h::x{ A~U@0*);}Wb $̠I ɽ}U@Y CWQ,O׆m[\SrZ7>Qlt-xkO*Us\¯È"Riit sfruu}.޻}öX`c|v0d- K-=}BAԸs(<'912P}c7,Vc쏁%$"wSvrb)6ږ?\ŵ}TV!; ]iXA׷Y>SKg2 `ځ7 Dr>y. k |0>0s*J+̶r祉V^s*Sh qA5g<>lcˡ>bEQjVll]P.L=kBe&2Q P.3xd?GŹ5@_tjW xh 0) ̂=-.>٫b4,maJLMB7Zuh.exj Н9QvgbwRrcVp `'t*Ƚ%:$ló 4`n:G;YnC5 \q\`OAeCGjʿ?uݯh q_?6UF[vZ 2DU^F~L ܖIm(岼ӛIq&~S%HЬned?c ,<dfiZn}DZw%yoA@1CX4X z09M6?zhp1''",! \@eGju/}xQ0|@YU=;ET^FWǏ*;G]鎘gc>$0=gKd⹰bkdbyU"ZZB%6=6yl-0##qd;͏gܟ (}R>\>񷾘 VJHGD.1G n^hAKݙmgL>̂7\T>7A|; WH6vky3;VޣZ+G\GPn _lGl3tϺ5i.:{75H3C w\d'Ju٪Ѫ_+Q PB I^9RbEdx<E)p/szA( EN=&EV|1 hdh,%쑤%kk`tt{!t-Ż?]ect 6_՚-=YTꃫ"iPpup]oq:_x14:c2OL¾*'7v?4}H6X'Stk{}p8SiJ/vKno[nM3uI^}}[۪ }{> Q+u#>SA6 aRmnYycU"QNa(S9*SGN;ibN2udz!B?1THl@e #J(΋]3'VE* lƗ0*2.L<Ÿ<eזCl쑂]9En4sww"DIAk< Zf)O;!\ $bg9+_ҕO1Ƣ)K/ t1ywܮ9CC"sRf}|u{^ЌnCYHz q4cBW*N ,>!Gg㵑q{ [$uRgCs1:3=0̘`叕#k)`A@" sҕ=P{LMYH֯ #=˙SjX>2x|&boq8j$Q.@XCsH+c&j@qj&DEk ĖU*EHSzx 4=^wH`"lJ-#LsgNi6:iNAL8t8JIX#6FVDsÔac - ϸ$~$S*+RzN£(5)UQa Uy3?'0`#6e)4HQW .ڋALH#csP NkFZ`$&$kӺ)2HS{f؊yDR1퀸tQ𨈈9hyC#v0R}$\\Ļʓms.܀$(f 26@=2L\/;(+t2 .&ȷ{JTݫjش+>%aK£WV:l/3T12˄xVc4ܽ3G&lb0DE&4iIzHRꪍvjw3V!}Fg&G% , X~??Oo??Bxw10px?P#}"M ΔhM!U陈oB|a_nʠt/n޿;f& *cg÷0S(3tXg2fmBLjta$;nf{,HYҲ. 3'Bޡ뚋MHͳr ,꼪6Ֆޮ7ճ5n[mjF~;V[}]FVճ:FH}HO7o՛j[ |Z۷g1pVU֡gW`&|n- XzF&RmzhVWv:Ԡt[vןMH6Tڱ"ѫ-Gh6 8 jCG_ѯF@[qq v] mZ)a6 9_ѳN0mDBA4!bL[NoEM lҀ7?y~)cyCH?M lj64*2M^,*}P޺BtU<\EPd:jGx `Wu=Ƽ ]!QTJED@,_euwP >6`@vbq5(hDvfK5KJ7V we,<,Vٟ*2%#g_,T94v,})ѣ8qZt]LD,\ً|蹢I`BZtވtK6YBET¡Y o'4 vyQ)ۢ+e\}~7sZFG1 e9T.`S b 㖃A`s9N9T/)T- RPy@ +] ˥9 h֜ArO> \.IYqQc2Cě@|pM" %*Eޕ^e HV[.CV<)O(2XU (q2艂cuS_E &<24$-ycCQC phG'J(+0%J((%.4`oԇ`/E&dOQ?QC Xlh*#'Z,HQbqa.zf:Fqf3}S`Px8:we2Ӑ |6Lv<,äG<= CtC$]OH#R؊լM* ^ 1|]ŔGE6vRFij'h8ƞY7M\#etp`h>QW0{t~IVi}jV+G5t(ih@(gw+&MӣQEu [jGx+צ_<"Pc6[<% q$P,ݏX~zVt1 7LAGh4 +GjnEG4oo/A $)Ǫk|*؋/@ 7+^9x]ޡ=M]#Vi6s<18Os^5L$3}26Y/Y$8n͟DRۿ^m~ tX<|2]@k5> &je%^1]z$iMrVWZ3'2,-zU&&*SUgd$5Oc5U3a'1xϋдo v]%^]-uQΞU-uA%cz_b@RnK!BXl{wuu}]h{s߹=XW 6i:l2:^5=^a;ti=3:mN\ғOc-c75g9D#W`vsZWMTPEE. dVNر4k$qf3 YmAڮ ~m q|:'BҬа ̀QZX-0ubnD<+7Xjr2eb0TȰS7b*m(v٢IF#̄25썪/U0݁apB&QO.&Yl[Yp%JNHh%)x.¸va@/:ʻ20IOY&kԎax-J0oUN܇;L֢Gfj'za~I&X{De~ÿS^ us,sYAw=8 8_MwE\]WV3q; ģ[B1 A5GBmk?u{Y5ֶ z xcg!>!=п"x0Fep 8;XQoCT|a*3;yz:||`ʣes0ROؑ%&|sdseNȓ4`g8O]DY@"1A@5a"f[Gn@٪ Ϋme {ᝆ4xj~ׯ6h ;?"c -D3$~yyPn BemyJ>s2\7IvR 3!(fn&E9j5]NȷhX6¨πO*4Mp <#9^\_~vcִFJ1A'd<&|G2·}O_]|VAV&roΑ3`3< G&0wZ\B]̩P_~k,*__ Čj0{_6ډt~yvҵP4KmLS ]%ϰ'OɆbj!k\̙PWzq9Ejp/+Pf޶/*E:r3: z'-"{'YbBK_>gZ_+P>C +8Gv#`[>2^K*#QLNf`c>5YdSǶVp >1Rs<ʑ T,v{<"T5u7jBC2vܸ`SNj >P<~d~u44\sZHy C" jDT,a -eQmb,y)%H/g5}-&-[[=E:)t.sXY[Pe^"vBdX lQc*⎢^kj]>+&ķr.0 &ca ,LV ﴂDh54?}+1!v9!t1Ai,-\3ŔPK -%,6j!_mԠ33YWA4qFxIO ϱ2k8 !F hۗ)iDe99눹4?l_dCT2xo°꧉凨삝(*7 j+Z7 Vv c|6\U]TX!ղl! ĎrdE^_,^9rt'R0r 6 ]#媉wfcުUZA>[#2fȌfT0L 6'K*gpG[!(sAMܒOFw@ı1*A8a^303 ˦Xi]L۶{omJm꼥X'ܺʘ_fG3O?-VaO7, ~30Zd'^Vz,w{rL~jdl9A?Jaܷr>[A FCm#=htY2+g65X7pmJ gRc6YYw_V>2x5LácXc\YC|&ӛ|"n0 '?{ʩZf񆍄 y%Knw %|]c\d Vp &;9 A,~Z(~8 m90\wIf5ei#שmKguNbR_)},l (GSZDqHA,^,l9C C溅BECECB=ݲgap@JݱXBnp Za9kQr8{̄sﰒ~AT)x!`2m9+)Zx ?O"qg 5U bUv ~ mc >Drdʧ’_U(t!`O\k\N Ϥjˌ,\_(tVz :Ep@  \[|`_?t]m3O;un !)1KX5I]+ 3Xڽg`r$uǺ6v; !J*@ba] <,JoF w3'p^<iiV٩_ vHs\߇'좻5%tU >Cm0O,e Mm5ն S}X2^"Ǵv\|8$o UQ5/|VĝɈͣ2ܩ2uRޠA/ܒv:CJߦ>ۏ >]q+~8g%Tkxk's`>N!~-X3fJ=c%#rVpvԛOoNe.Q 3fXNLvXTwW+gXvUt }~-1$DA"jk 1"j6#9ucDf#M,wHm+!"F- ɸ9J+Rx)4Mc)9íI[Jlbyg)[YJF-4aK)ZY`xF^moTZMQTA!vL Wj ҈BF,Ϧ6h `" 4qmG=G9vvscHGI e˻t##F-:t]n#$7ӑZ|Rrl]Fc=ƴb)mx{Ty̽{ WXƏDO?PK@Z>tPKb0BObjectReplacements/Object 6`!$!VB"$+V"V""b=jFK6RZ-*UԪ}jӪU{݋K"/>uqGծWFTFQ?6iT"l"P}_9*ī=.Y3*ЎeQ< l 5,-e+~KΘ`sWzڹsb|lm&ȡTWZͨqu[ET-9o)ÿ}JRjZܬ,7mҝˬ?W*'<~cnms'QrB27#9]9g#ۏ}\:]7v s$K_A<$үts%"~tSEFXdlQFZT]/FsvHާ,ϿN*kmZحG\oJn:;{oc٨\%azAN T&R=U[@z%d2,r\M@R l؞qI#[f#l^etIKzUWeHrUäWgLrUTҧc*?|hX櫘!|n*%ٖu7)MQ3 ?7Mf}S%Ya&ˆSWTQqW9Q1,1K,?3I"TUՊh:e%2KElkd/k%!mCvϿa*{ u4UHFU#Y&=2+ջR?a6 Q?vUj+We<w#U+u=i/ 7ߖxwʈ;(啛+ ;RmxRה(!>ko:釳mg]g>j?%r"uuQj1ǙCUEO"7w}zf36ҵؿ޾Mi_lgmuBaQ}H~y?1Z5.oqE3> qFmq0Nũ8 ״Z܂i.H37|0?q}e"1OV(a<ĞX:LݔĥDs%^< 'q;-Xalc"N:~0b}2wrxW_H<юF\9X.c[\C;0L3 ZnWEIfS:Â8oꋿ`g\8#-,X |k|pxm[EwBwu:k,$jzT:ձ6EL#q/ĥ-&fG ɟNa1!{iך*Sp"ĥwbSÓ'ټվզШ&&>45Hᓎs*NeV)e(w&2ް0#nXp"5|I43zJIK:j&w4Z>'vvӱʛSũOehO=%Rk(NSbM/{ISy/^/P~7?mP/Ez'Qtypi1=T۟()NSY >pa,9DZ]Uι {po9Xs}OwI[yݦ0M"%]:|+y]Ֆ(ɇ!yuW1G-MKbO GEtjX&l4m?ޜmf:^dU.w_r֚AGۘw#.Ewa6qnǁx3遥YʈQpFQtB,oPSP0+[`A̋1QL"^8w:f%9)Q|'+a'tY𠓹je0`_q58 3cbgq#F }1'3y8El;9I `̒ܜ 0W] yu+B,ۏeFg<몛İ CqU7sPT7v陹pHf{^ȥWbt?=sIgc*陞|)eFF3 I ĦXWݡT㣣 a̰Ez 3ZL]GKǙ8K痩5`F 傺 g=C/<=)z}O=×[n^!q13F\d%-=kSCLݥۯ<#N.ݍ#3i22_vܺEp ˫gN~%Nx{--l2̭gdvun= *3wѹqA5ʡ@4a¦NIWq((7G4SEw= 4dN~}􋞩Kۙ~F}&BϬ,7mng> RȰ&ۙw;b䲆UbIkZ֪5Nnnopėen׏v&?%0ohgJz}?&WZSCsYnf UʳYYn|5$J :Y)MĿ9:a>PI#FWU{s8ҙ~CJ9,Ql1bTՋuG6Y kj3`#ڌKFg=8֫y[SzǪ'Fv] ]*MLT2y{j捄nϜgh-J0DWrMzEaK6ֽ ٜ29/JO*i5\[Nm^Ğf0YnR{O'1U]V'+%]&%v=WmgtR7ф ] LvVr4ah ɱӌ3g >NGzhB*yv5"X%M&_afei0;g}S:Y)LX0XڥZ^E:pޅ`2}1r~sۥI8W͘ϝ 6kYD Gő02}h봚/5L2Jeo4QAuc ͠eo` _J,o]qyqV/z(y<XLӼQFX?J]Ow|uag\gka kw4xqFl&/J f߇yOq5q+Am{AǁT ]S"M@ӗdZ,.4^q+6!]Do?t/LZUgؔkf|ox݈|<0/ޑ$ǻ9~A/= 9c8 8,O嬗eJzP(Ɣ\߃܁p-%/v[z=܂UduF:"lNĭ9Yr=K8L8 /s8ph~8G@%qK'K_8R OϢ:7# 7T\\F?E-lE0[C1a}8?c,>Xa !7p썃p,nxwcH(au k{q8h6H>JXi?6o+&ðiYCqYd1\p5޺܉xĜ4k!aOyZ8X9RLO0W[Й8+m20hVT}T7`KlF^J9*5EH_))9VwRRn 5^©Q)JQwek8al)[}X:v4Zm߾] 6[T|U<.nkYDN7[o&G25b>5+M۱taqz˼DujK?v%'$sݗѵL'9]pկW;&޼bخ}d;h=I;IePu+TczQwEFXdl *~t|u*WU?Z:SY9CEŶM=wײsQ_[^RMW`wD) 7ff̅j~x{{nlАQB+eiNz%o q\MDfV*+9VIҌW];23[e*WeH}]2*S*2sbS:rCEbiBԫnf[eޤ,7mGH1fuD6FVz(5S3_^'GXFYb\CӣTQUbRR-֝(㝕,eq^b_ĶxY{alOP@ o2ViF(Jv *>CideJT3Bq:\N`cNi ~H`UZDUFaǥN3ܶRpν)᜗Ǽ97!X/1YvRʶ[І}Q` b}H(T ^H9?ܳ fҴt4.`yN>=PD# 8.\H^xys jsH|(;il%M,O& ey tp{r2s; (]·/;Nqwf 'WU&בMz9G =O9gE5Y/NhuPlҺacJ^Fëd }Gۻdp0x,1#^%;7jl2,ע'd}siY `,1K`/YgceYq | Zass0`danQ8@}>|-q!VX @O<)4#N=Xgc{S12@Yxufʅ:Cq>8{R삇3fNt" b?uk".A}~x#jA]G o,E`&Vģ-ܜ;Hƹb 0b-•İi8Vޢy.'1/`S {vXV6ơ1c̓1.HLƪxŨ72P!8qfx |[W3m1ïNqZݘ덯H=M1 Dەuk#Zeg$ꅘ+ۿ[ FH^q1ƅ:{inɘijCў&-3pYswi,%9xF(qVt[HnۑΔ9C+rp;MhOY]+܇et\Iw&S f K(kpsX+c=+]sl!}k+$R"uތ]҇)8,BaHh_!ۿ(xyV3tK&`"\-Ea)y9JChW*0,ͽĵh]nCD+xYs>F̄qE79]1Hk` 5Łg<3ѥan5%8zY]ѓ8`g|n|M@̏vBHM'c:a;b1,(g1&aZ\sc38P|cLy=B߇fi(Nf#AWWW繟cp'o6 }q"f9+b$6P8}[ 2F-_aiQ:&0}`<\I4Ә_Oy;aɘwnߨp{aftXWOe).n8[ēHc_nuR /`w:aNwÜ1fx8bL2?z`st FmQC\Ίa}t.}\ÀX;vNj#p7~ p:^Ŧxv܃Wq6#J;EІ|ML涰/NI8`k܎.Oq>ŨŨ6G4s.5~;)FwMۏΔlkR_FÒs dLbgɩFɩ= \Kx+BoHO$FxS/dj5=KS&/M/&b>$b}I_c^asʏ~ry;2,ĹH@7~\..(j7⮢4%\_b4kT=nn(9^ޞ嚻qU\Z ]w3[IĺV%oc%Ἲڂ>\[,|Lɥxg_mZH}y=8k1NeuҞ1mrMSCu\'ouYµ`,IxOdR Nj ̆q?`V>2ÅpFuoSuu)N;Gqc+2z9XQeI_&Vi,%sExKԙ},yxIo0a)A_MN!a" XƼ Q|1(@슡2up=GwP~pNΣg £yt?1|4T?WtH€'7n|MȎ~mPf݀6x)@?/&M̖c~\!x+K LՕX_ú8;`~h#..9Oqa0Nނ%m;7Bi ӫ^W0/am/:|՘8w7ǝEcq#-±hvWxc`EW` }qA|s$YxY&+$/I)ŗ|&\7W &nM4Kaje_1o}]KqhOlŰ6^'[6uX cEOFpXc C:v'IlLb'.=8ӫ KJc<q ~2#3=C7a V/zgºx+P]©2#x6._^md9{'PϤu 3l 0Q z_ҟ*3rFagdH6J IE9>: 'oq#6F ܏I _z/8g9t3u~+<7fNϫې/8C~=OO3|^(,q擡7|PNOꙺK_<:cFݍ)3i2[ya;FnGFcACs陴hXtRhr+xy3eM^zNfWҳ2sW+>#&iҳlOvm62#.X}ݿԁ*CxCψ%;gpn͕<\p̰z޺M'̮Y'ٿ(.B{s3q,~v˻:f {\wW;\P~1.2ws[pt6]nƥ:J7opUe= p7w@ڗXÂݱbq3͇8z'Ny墿tw`*2saDV=cg:^w mGpd ˻Fn >Lz24jsE0\K'ɳw)8&NKMeٱ"oj ىg/| =6{ Ņ?Wީ&.Wq((7Gi4S]w?m4oN(3uz.n.GlOrv'bUzRaM"_7_!O.gPqiS=UKJuTFɗks`5[fFx.uGI߲n?_ЈO}C>Oʣٷ*(W,7m ~:$>@huD 6@(Jw7*J~wc- u!QrQebQ[7lhXZ|V8dzVV#ch9c>V=4v7l_àKxvZĀy.> %HG,`kP=5d8X+/j֭gGN#]+uN="]°%Cnk֏ZqlF/JOo*ie\^^-ڻB??Bn.@;D[!CaLyJ'|J-imV{ 'z"?je" ;R%O(Kcx??,'²$*u'Xq- feigI|*!d=fm"!Lr;+5O(O(7%w})KMLn`i]MrvNSMZ'՛&P,/([7 &4;'4+qMrv`Xm}J :YO"Zr >_^|>^й֋<-sz.^P*oVi|Q7OL_|o%Oԛ'o j~󤤺͓͓_!'V]z|o*iU8h iO>|S'U!!ן ؟qj" Y*V4'߹ R2dI?Yħ2:YObem"acf)|D'u]I=RY&Lo \9j8%EHXt4x_MHyH%mخ2w^$鯍%}%.'IJ߇ ˳VR*tkf@o/4Wi;ϴz adh]PSunlXjzg, yfw-'N<^K3XG_~obkX:T抑6򻻚PKѲJ߀PKb0BObjectReplacements/Object 2ZkAmkK@h"I`FJ/lZ= ^Z{RBѓ*@ {;;;Ad_6y3{ͤScd@\Kz]:vcYMb TqO۝?;KhF F5|JɂY*'W m63w٨, 880aj4a9W{om,eA ?{K_I;T - Bera.?_V$◹ah$1E mϡmi ڴMxZ/m_Hx8rkc1/ QG S;z3{.cxǾ3F)͗[<_~A"w<5Z. SxDn!gA.uFTV\m䡄zYC9 G3j}3A"%QіCB녇 rq@gx; }mgJE[tբbDz"ILAUbB'MJpw$P/hρ>Jwâoc㇄[MՅ-@Pj) f86. c_\Zi2iyǭDҹ Ȱ.\)h,[oqƤ#(Hd[{TPmaA.Ȧ!"&"Ik a6DCw_"O (S'c~8)C7J(DlBiDz KhAWAE׳q,OPKZ:ib"PKb0BObjectReplacements/Object 3՚MLQgR 1,B &kʮ)$x2p0xFN͏ލ?$fy ݷQHwhtuf>;5]v1uX8w^%#~ ;LNHu飊T{D9pWm,*jmT>=v؁Ә`o774^qz!A5 L0۔M黗''L].i_l0LyAq0 |w:#E0h,5Ma\sV.eIQ+_xӈ(7͍<aԚe+u{qPnE Dzzt걆#DZБ0 3$?bDu}p:Ef} Nb;}9\c-{JEOWB` iT%/cy Vm_ ?Qj̛nOJwsU 8L68lCGHÊF.?چmݓl|p9vVT׼2_c}e.bf:2?%#11H[ 1O(# BGFPt?3oC~*ʦ!!-}lGH|FC'M\{Qjwc5_V#.Eoa($dR|"#Ԧ-s#!9hsUss| PK4`"PKb0BObjectReplacements/Object 4՘OhPǿiRՊ8 W9k8X?o,=Jhez,qkqS},:M+)3vr8e9@*ݥ@4p{* CS|'6 mֿGCFqDUS<1Ӱmowc:ԥ)I'0NbFF|iøZujW>eIPJ-ԸFgcGi Ą6E/(T>FeF<ϯ-S'j ?s> @irY)J2gWLk_%$!=J%-Fxܶ%6 XFJ )wm}JKz_ Ϛ56o)M ^dem3A["c]=:3-]o#Zy8F:hGA'${b=IWԥ-H>jw3k7ѓzG3hBXs kH+\Yw_ڡmukVoͻ\-$C NsPK 2010-11-16T14:38:26PT11H58M39S115LibreOffice/3.5$Linux_X86_64 LibreOffice_project/350m1$Build-22013-01-16T18:03:04Ferry Huberts0.24PKb0B settings.xmlZs8~"@zat )--) fo^Y}W2rsԶ?v~}pq*Bqνzǻ?np6h1}@kzDB۷^*E TKTK-L@l_k}eeWV<ϷBU-˳y~}}]w(fXWo]!#Bq~~Y˾{'E Mûa4؜l.z5jޡzޗ&x;zbկWھma?/g) ዋF/]l|(h}BJ4,0Ewe |D[Rg}Ƹ:i̒Hp?X̾CB wLMB8ܫ7vsҼ^5(*F1>FD'dk7(ugkLuy]po(6seޏKeگ Ʀ!v%](Vۛub5JdTQ6;(~d8ac."+E%j|LBsw>ߨ+  y4 Rm\_P}O)XRޛ0CCDSHQ5&CTA@^;ꯩlݧ੧H/Ho${v Cح|UyT0 JT Ѥj2EUXRfSg㘉UX;2m:.  njKd@+'5nj.2HH"A6rbա@Iʇ5% Ck"){DCH'ɒ+Dߥ2SS.y-|NlOd0b'23T}X5NB[k:)G+GVRQ("AGCw}`;.@2=sa JSSS$eeÁBݎ/jK ʔLFoo&K]7$QH0>Z?8^vs`YʀYN,u\n$6\Fg= fFI)D1NtSC%[0^Enq颖& _ziߎ? #9h1'P=я (V( ?8L^G@t8*o3V*5bR=_騳z'}d+UwfrBsv$:Lwb23){wNs c5玁2j5/6grk|vRjqxLw` ERXYBld_N|LIң׶7+~9Q/PKH4|=#PKb0B manifest.rdf͓n0D|e`9\_X/.%}]'*͡]fh8C;4`kg*|>y&ڸ^jj~ *!eI^eYExE%yL,Ƽ FD>} fy%N:90;:PD LچL(-&)}܂Gm-c1su_5R`""?^v}㧓 Fz{ ?VG5'PK=PKb0B Thumbnails/thumbnail.pngPNG  IHDRzA sIDATx}hU;\aZ1uk$ͰRG96큥TԠ'4Ȭ&= $lTDX&i,êQj4uNk1zߺn8;s眝Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}I>>/4iR=^ݰaC߾}/3ZvCfΜO?UUUƾ裏⋩~<})S -[VTTԹs-`ƜT.];vl̘1K,y7m4p@ͬͽ袋zꫯ1">uT̥^y_uUZUZZѣG5W+k^w۷F/]s5V;rȍ7dddihh;V\Y\\mڴȐ!p0<-5+ŋZjРAoI`m+I?~[ڈk0@rΜ9u-1 X_կZwK:Ÿ8qB &wܹ{̔ϳu}e˖o1nT68rO!`$W_}VD%\={[8椒}h?~\OӣG.++Bq퍺 5?S}5.swX`v]tx뭷[^E-Z2x~ᣏ>u5>Tg 7[>N7Lٺuw߭ư~]QdmI>Lu]먮kIM+. `ME?u~z7u5tyZÌ3S3Wus&ԥ֦kᘓJ2Ԩ˜Ml:4WՆo hpHg;Eת1'@GqX}}bS|]`wt{-###N.k֬3fL׮]zZG?ew bo{wŋzZG죴W^ߴ]-Sqt>ޅ۰aCm@ SQgC}dffjޅvbtt>̙SVV6k֬.\mb/وNG#++K^Wwc#;TIIGC :t3dA@ Cp}8}qɕ+Wvҥpƍ۶m5kVzzƍ<ԫWk6rYeeeW\qѣ?1>.]}stMnӧO0`@MMM>M6m~aѣN ĉ6mzd~g_~esrr|I4u}kǎź::t7.?T Nk.]᳙ItS>txǵǎ!t[n%}rIbX"xoYNNzNL֭KII J槛Z}8cKӟ\jwUh}rz}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}8>Cp}I>p͹۷ggg.VQQؘvQF_>??ETiiiΝ RRRbk/he]iiNVVVb?>zW_wժU^qqqyyc48Ԁ̌3nݪ>4TImmm3:uTYYY]]}ɚ#Fٳg۶mziذarjÇ1v%K<WV޽{II̙35ֆ j5`s> gT__?w^{k׮vݻ'MT8#Ӄ9m?.\>`SS&&Loɚ2e֯'NL?nmu)`_2|1<*OS"CE$e8w_#Z_Cp}8>Cp}8߆QZoIENDB`PKb0BObject 1/settings.xmlXMs0W0 dBRLiHϋ`Mdɣ}e2Ę J{3 I89Zݩ y@آL's9 #d*Q)c"+ƝI/s`I B)1md %JŞ.mt:71J*|6ٜ,Eɬ9篢,Tx^okz(Wb[y3&WHt(Lbu}흜@]FMlzsJ7)~wO(z! ._){Hd+0ᱳVHrVuwq>=¹*o5ΎG7uG"YE`1ٕ1["ƏlUT93)sJhK̀ LF9|Q?F5+DP|fz_6-nS*C0R$ |;5g`ɉsTڱͶe1-xoA HOJ`Jݺ@e{pD1?NO0-Pp7IiH=,J$%A,ᐥ(AmʋbB( )E0qbK!x@8 )#[׼t4C1\ ypV_ |S'a <4̙8;_W˪p0,5{0_ f 5 1Njd8ͫ:wi6 @{i< tJ G5.2Yeh6.Ѣ^fSݒNR 4 i4{R9Gԯ'( ,Mim3BGڪ,Y%eje@(VwcWANKznE[LNf(UVṫr[pn Zׅ]<.Wo<滅tMWkf- 5yY뼌V4Jnl4MrmmY uT ldb53 GxQGY:Efɬާ;T"TNIn=o}~cܥ4Khq$7i(ֵ3 yghUŗd3Hge~#ڸ!fdx⇂ /͇o]Q}flIH\gn;}ZF嗤p̸ޕe;{*ARVZYӼ1OKs-}#Ǫ(hP_`͇~)Օ t.^7iA`_wUk'ȠZ;^,Q3iǡ[f { Nή[q埁]gUmlvxek nJ!ꠟsAPjŰhdbkfdtV52 A*5$PCUjH>/^ԓiJOWiH~W8N/}"p~9]^U6UqmWψ헾krl~C?brgJPcB7hLR> $?k5%{럔O}HN8Fc|D.i¾r:._>Y>UR(y]a+*L.bɹ<\K8h\liscS?ԗ! TA>mυo'0s`=y[|qzEtYhAWC4;H Π @A"Ј߻)ye\97Ey~O605 Rn(9 PK^y :PKb0B(Object 1/Configurations2/images/Bitmaps/PKb0B#Object 1/Configurations2/popupmenu/PKb0B#Object 1/Configurations2/toolpanel/PKb0B#Object 1/Configurations2/statusbar/PKb0B!Object 1/Configurations2/toolbar/PKb0B%Object 1/Configurations2/progressbar/PKb0B!Object 1/Configurations2/floater/PKb0B!Object 1/Configurations2/menubar/PKb0B0Object 1/Configurations2/accelerator/current.xmlPKPKb0BObject 1/styles.xml[ێ6}W 7Y{o6(Z ئEFKń>%LْW%("Ό8s8Xy:5%a ƾ3ybrϝ߼bIB"sU&pWĶlDs%.gC-"Nfjn[1֨*t+uCߟzep"0أQ8˺@7vgx{d0U3q OKؤTd?eHa]8du&^wMӪa*${T =zc8A5 :ʱԕU/o z$q2”G]/^ɍ!lGGh3Pr\"^8huHYkn xtvq*Zޑ^K8v8*R9@5`&J@j3͊h"f+<y$+h:.9FP{JI$ E-:7c1rW, )apw y{zTD7DK ~viׁU](1۸jQI ,IȠ-*X[K>œ$zepW8Ie(oqDD׈f|Ti!EB+X¹ZX ʼF7]ߨ,١Jz)5 C]j2R|}+s^~NjJjHsvيPv

O4OB'gwӁg}]"׽2ЧQz4 U݈ך^VskUQڋ,AV aaY$H9V[В|cH~Gp^>щgP22uY17 @]hHs5h읮*EF|3&7cD5me[1z(G+P.=v6~K{XH5}8ǔïغ˭(E5aÖp$6D@ֳ">wF4N5##H:Ώn g֤$ʥe6t !='u*'[gid15=~ Ȓ'[*5pz_(YAɒڒd{:y}=4paU/ԑӓY|unp&)ͥ`D,oGԌ@Ș!!YTC=r rz@ c]%3XVl88G 5IrHEHL a`X=Aɘ'Ȋg g/2b] &vE*cbUD aZ򎒭F('x1T+4=9 :/v2ԓ&^qsj՜#< g+ ~ۀa0&w]* 9)ۙ` R0Ei> U:gh J[Z'UDך}g{-4Xrx8- MU,ݹu.O,XrmRL CF qbd/e CȢgi0j9_%dQp)&dj)Zb*P;r.ʒQt]14WX@"1 >q+/Sv>>>˴PK;]PKb0BObject 3/content.xmlUN0Wʣ5)(1L ri-%veB0wf~ vDJQ)Z}䜓>)ͥAD$;@ j`Bhj4M{nO >,#hPaxI:; 6(ڨo6rp6!DИGRL0#pQJ6hkb>ײh(?ٶµ8./e Du8bp%c~(AJ/Gew}17i Zj4`7F_ٴh2V1L4-?c!G賮uNq#/r_/l1/]02rgQ!.kPu r\E׭gF`i2%# වN]P v\-0 yfK ;u:)?'׼*i[x~[K PKD,PKb0B#Object 3/Configurations2/popupmenu/PKb0B(Object 3/Configurations2/images/Bitmaps/PKb0B#Object 3/Configurations2/toolpanel/PKb0B#Object 3/Configurations2/statusbar/PKb0B!Object 3/Configurations2/toolbar/PKb0B%Object 3/Configurations2/progressbar/PKb0B!Object 3/Configurations2/floater/PKb0B!Object 3/Configurations2/menubar/PKb0B0Object 3/Configurations2/accelerator/current.xmlPKPKb0B styles.xml˒`(κu6vzص]D"T 9c$|BBAHj{4~z4 I|?p±O0^~|ھ|/|. ~qj'S ɝd4#( prwdc9NSpNcv0-E3s`ut@Ѧ` G>GfK|3&ސeZ_;$*Dk )Zf’=f$ V:~ʬw(NoHLjTZ%l1!%u`H{7Df*pP@h}"DOJxE^Wџq}⿇?pl}f?ysQBZ@it ̡mׂd&1tA7Lxu[*ܧO.-X?W(XY{{썾Q& CFKţd#f[_s#!*\fm9| eQ IJ/(Z/C ao{Maۧi⚓ dm;&6 %lf ] cmn ! 5!S( k`!jwV5\لYEkDgBmMb L(K$'t(FA%)hY*{Xˈc~Q;4/bG DJ!ze 넩f=8{g5Y 1.'*31 ?Ny[EЄc,N)hŏbuL *N"fK=,]|,Yc ƢwVq]_lY26vXШHzc 9-0pԷui&2ÆUºR*`1N\:nnmRV̜R؜Rt鴔\(&8B*!+6UHMvYa-"TYU=U8-:aj}6ۍ˓CKLxmd%+;137:Pw`T[HE(^X7ISVpt }[PF2j Vk3_< ^н]Xqm><6)jOd*~i5c\A~aj-oL`XGIvJf;J>'u@bqň 쉇A#+~ {!MQGU̲V\EǾI]H9:f\<66(H cjo^}j+Sd5=:eݓN)hE_8U Ň*My3\sCkZm2r"Yʕ#,sOSZ\;x۲Cb*{v{FJ( 5=9.f .ASy1L1ńtj]7R&UMM*S͔Y;0[A?:2\!p{ZlP!-_@#  i{|.<1-ڨkK}FR^T8(<^^!x:ѻoMWs`N }lIpPؼ+ӛ?F 9{D7Bb%$ 3 ڻ~Ɛ~Ϫaj̵8U8UΙjǕW*Qdep8Q,kfvtzYO]&?.l/nu|6rګ m_3WCTfGg'ZUuxP1T{<[G;)`A$Xs=z-i o"iA@X^Rh sPS(4 4A+? u:&Dux8r>uFG)$~-eCVǤok+R=H[ȳsms]~\"J}LI~$.%vah- CZ#"8HL ><*!Rnq]fdI8t?dK٧rޱmmAIK(N .ԉIˢA!6\r[CE8 %o0/;Xcgxo G fѸa*(T9^籅x9ZS. X@yI?@LbIi@ Z +L2趮n?r e?susk|ɳ^K^ĕ? `vU~CpJp5R|.u]Ncr/&`erܿ=6I/_xӖn=rk?2sSqo8N%׻(%IHUIm|R/tP^oO: Sxz_R1yySvIoC1iIG2i9$v$vG2iN^ :9Ns׽K.z4"s߽{ק%+'/‰]^\{.s.yEbp·񍾘 E͜ěxSc6'a$ޜdN&I97ɜě{s'&6 $ߟʶbo|?_dsI&6I&>?dg|}3'#{*ɽM|=ɽ''<ɽ/>I'<\d1#$9!)Η)Uy0Tg$xbI^VMe0%e5Z0^ _@zԅ`}:%pTh~6cFQ"'yyNrԳ'DzeӞ/}W\ͮ"(K }[vC H 4߬W[;T*Ux& %l{C՜w,qXu7]d> 01 a1(7)EaXɀۛIٜ3}/PAKPt^ζO+Xہ@3tw;Kv &h<y aZ'}?I\(8 ~͒T$N4yWVD>s?WBwQc# wkP+<ܴʑvejvW0p:>x:"kz:^D{H$'HOih/%O׶3W*\wX/.QՕMȧtv,*B LHaz|vjk'Bt:iR; qhFa59z2IߨU03So&7ۇaNapXWvUEzd{]߫0nE^~dd,K 9*OG`yuT94?wߖ>H9P-Hɴz|/90}нU9gh *[V'UDך}g{ 2Xrx)-584A"YsK*]W,X9f5 ]6)!lśuIϐ-(r.*E9J<|JI9Zʖ#*7tGeQE2U0F6Q`qJ8 XY<եo0)V:a4Q#S =~|a҈svϽ_\y';#`'#@6etqŴKbDP2(*P_1+3)RHc9oOkL: [rR%~=R5)$ޔɖҔ:z𩷧#)~\x۩e?qRu?jG+v9`T}poϯ`/6Bؐ/o'fZ<̏̆Y`7DU҇E7T i`DU"D6pyk3}V;Z %3yPK겴wPKb0B#Object 4/Configurations2/popupmenu/PKb0B(Object 4/Configurations2/images/Bitmaps/PKb0B#Object 4/Configurations2/toolpanel/PKb0B#Object 4/Configurations2/statusbar/PKb0B!Object 4/Configurations2/toolbar/PKb0B%Object 4/Configurations2/progressbar/PKb0B!Object 4/Configurations2/floater/PKb0B!Object 4/Configurations2/menubar/PKb0B0Object 4/Configurations2/accelerator/current.xmlPKPKb0BObject 5/settings.xmlMs0H;dBhZf Y@HrJ6&C-JZAz+IeթqJ<.:םO-ͨ(.$(ȊΥn;IIS!t;ڋaɓ, =].%[k6n6#d.  3!q&ի+7T6Nt8; qhJa59Oz2Iߨu0sSm&N7;aN"F@lf3xC<Q '7ι)=r:%`gF01sTd66QTc|[ CymA S}>Rf@zJ MWTaʂZ3BP97ҢŽ!c@IScJ;"YzjM/hxQ/&T($ـm .(cHE ?qјxx̴N8/' ^5oOwS@1&hlyRgL N &pgqΥ>] en_Mj4D0bgzU}}p;SPKf_oPKb0BObject 6/content.xml[ێ6}߯ l|1;S7_ޗifg2g'buY"g:=+bu֗> s5-k1X=et3Jn*{Y>-*߮ :-a2U貮gMt#y-8WU&8+2?j#>^γ:>/_j~UMޮ.l9lΖ]{쀙ˤgAxUdI_wԗ׍Bg秏C[J|9f#/˲[Wh{X`LQ*'O",^24."o1n;пsz͓p~ZU,6Yb.@&|+xٽSyg8hq=eYM_Et6a kY5)1 dBt1 TJ% LwHX3B'ښ,]fU|A(g=fZ+UXymY]b-~갾f\UQTTiчոkH߫滇t>,m&ׯhjnDLfh|XuVΪdyeR$V ,oM|CٴޕqZe2 TO&£.(s{-%G?"Pyſ`!>-Er@3誮/!e~FqCL˳yY>e"x:b|x}0Ѓk{ћ|D:_3ZhT_"8PUhO$_]ew=pƯy3kr[!Kªgٹ֋ }NBg[:hvCCmk>~ Rw_wy~#X" H;]K9/bgu;-&};]M؊ńjs}ZG> uVpqUYMNߎYGcE}y|[{o⻤:uM׶:(V>\_hldw\B*H6@?PŃ6:eblZVwt=\$NiB,#&-BMZH?Dޤ̓YHIاidRo'i_bx"?Qpz|SqQNvC_25L~u O{6qZ!oھirUԣv*K۪.gJ>{(&EnF)GŜo=_Ʈ{J[-ߞ/+o =;'G Ql.[zc+z81l^.xI}y䣶-5Rf"FswYXFHUIXdp#% 1_ ]'M֍UF0c-aFL(e r{n#܈TJMȘZNbkD૆<&q" # "DAM3ED8 C2 g]sI3Di2GAC{la*Xmż~l- PLc#~!?X(+1wp1(&pŚr2N-ƔQ`Tt5<]Q)ZR,F@FhhT15QÐ$> e9ƇWT_`%95q Њ"6ANM{T` z~4Ga ( k t;~=* ளN1wOIǑqzQ(o?Lߨ7PL FW5 #yG K?'D &prj9A`ZN;[N-'=9p}'g= [N;֜Npn9A_' T%A(PxA:S 3XxJ/z1ywsDʀev铠>㰠/T\c>-j6&m$Į\Hh">m 1xwۭˊ-76̵q0WI' uuCν5dGCpTw?]6R+|ԕs)HbaޥzNp6d^ I͹:LqȄlOι!(tx pH[f=cqȷr<؈w o< a{[|.銞^1`w9wޮRHd|GcvZ38!!9ꅊ:{p"ՑBR29Am"2B9ƌ ۮ\cޡcƐ>3RRh8Q^B!KGʜ _D $`t JhC+u 'ȊPL6DYd¾UFN Re +QY$*$Ґ*k% Fľ*}(d~ҡ1Sal!l(ycbj}/|AD*j ֠ @/=$B@D:b,xQE(9((Wr|7Q)n )•~A` u#£j_4` ᾔRE%cP 1&ak=а9X(T:YJ0 *;R1.|9oj/:P8aiɬcpm&m^op|/?PKA >PKb0B#Object 6/Configurations2/popupmenu/PKb0B(Object 6/Configurations2/images/Bitmaps/PKb0B#Object 6/Configurations2/toolpanel/PKb0B#Object 6/Configurations2/statusbar/PKb0B!Object 6/Configurations2/toolbar/PKb0B%Object 6/Configurations2/progressbar/PKb0B!Object 6/Configurations2/floater/PKb0B!Object 6/Configurations2/menubar/PKb0B0Object 6/Configurations2/accelerator/current.xmlPKPKb0BObject 6/styles.xml[ێ6}W 7Y{o6(Z ئEFKń>%LْW%("Ό8s8Xy:5%a ƾ3ybrϝ߼bIB"sU&pWĶlDs%.gC-"Nfjn[1֨*t+uCߟzep"0أQ8˺@7vgx{d0U3q OKؤTd?eHa]8du&^wMӪa*${T =zc8A5 :ʱԕU/o z$q2”G]/^ɍ!lGGh3Pr\"^8huHYkn xtvq*Zޑ^K8v8*R9@5`&J@j3͊h"f+<y$+h:.9FP{JI$ E-:7c1rW, )apw y{zTD7DK ~viׁU](1۸jQI ,IȠ-*X[K>œ$zepW8Ie(oqDD׈f|Ti!EB+X¹ZX ʼF7]ߨ,١Jz)5 C]j2R|}+s^~NjJjHsvيPv

O4OB'gwӁg}]"׽2ЧQz4 U݈ך^VskUQڋ,AV aaY$H9V[В|cH~Gp^>щgP22uY17 @]hHs5h읮*EF|3&7cD5me[1z(G+P.=v6~K{XH5}8ǔïغ˭(E5aÖp$6D@ֳ">wF4N5##H:Ώn g֤$ʥe6t !='u*'[gid15=~ Ȓ'[*5pz_(YAɒڒd{:y}=4paU/ԑӓYv0\f/dKer0vv\f <G]'Oa~31%(m ծFL`EUq *$ BSFiW;0`WR/05X/Ko87 kyo LJ>c +S<|*A``B"btYX?T; 19p8katD0YBXOr' Danzm 3YEQ@T ༨5_lУ zmu!Ntv7 'xm[,jڨw'k<-M27:Gk\rg`)=T[U`{z]~WI,)QgIӚ5ֶh&ɝF쌽4 Ӹڢ}4L~N|3:ѶhNo}`JÔ)h0߇ )PKiR#KPKb0B^2 ''mimetypePKb0BMConfigurations2/images/Bitmaps/PKb0BConfigurations2/popupmenu/PKb0BConfigurations2/toolpanel/PKb0BConfigurations2/statusbar/PKb0B2Configurations2/toolbar/PKb0BhConfigurations2/progressbar/PKb0BConfigurations2/menubar/PKb0BConfigurations2/floater/PKb0B'Configurations2/accelerator/current.xmlPKb0BDb elayout-cachePKb0B@Z>t acontent.xmlPKb0BYAObjectReplacements/Object 6PKb0BѲJ߀w_ObjectReplacements/Object 1PKb0BZ:ib" }ObjectReplacements/Object 2PKb0B4`"ObjectReplacements/Object 3PKb0BtObject 6/content.xmlPKb0B#Object 6/Configurations2/popupmenu/PKb0B(8Object 6/Configurations2/images/Bitmaps/PKb0B#~Object 6/Configurations2/toolpanel/PKb0B#Object 6/Configurations2/statusbar/PKb0B!Object 6/Configurations2/toolbar/PKb0B%?Object 6/Configurations2/progressbar/PKb0B!Object 6/Configurations2/floater/PKb0B!Object 6/Configurations2/menubar/PKb0B0Object 6/Configurations2/accelerator/current.xmlPKb0B8h0`Object 6/styles.xmlPKb0BiR#KMETA-INF/manifest.xmlPK\\jolsrd-0.6.6.2/lib/pud/nmealib/000077500000000000000000000000001234304727700157645ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/nmealib/.gitignore000066400000000000000000000000161234304727700177510ustar00rootroot00000000000000/build/ /lib/ olsrd-0.6.6.2/lib/pud/nmealib/LICENSE000066400000000000000000000636421234304727700170040ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! olsrd-0.6.6.2/lib/pud/nmealib/Makefile000066400000000000000000000041451234304727700174300ustar00rootroot00000000000000include ../Makefile.inc OLSRD_PLUGIN = false TOPDIR = ../../.. include $(TOPDIR)/Makefile.inc include Makefile.inc # # Settings # LIBNAME = libnmea.so LIBNAMESTATIC = libnmea.a DESTDIR ?= USRDIR ?= $(DESTDIR)/usr INCLUDEDIR ?= $(DESTDIR)/usr/include LIBDIR ?= $(USRDIR)/lib MODULES = context conversions generate generator gmath info parse parser sentence tok OBJ = $(MODULES:%=build/%.o) LIBRARIES = -lm INCLUDES = -I ./include # # Targets # all: default_target default_target: all-before lib/$(LIBNAMESTATIC) lib/$(LIBNAME) remake: clean all lib/$(LIBNAMESTATIC): $(OBJ) ifeq ($(VERBOSE),0) @echo "[AR] $@" endif $(MAKECMDPREFIX)ar rcs "$@" $(OBJ) lib/$(LIBNAME): $(OBJ) ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -Wl,-soname=$(LIBNAME) -o "$@" $(LIBRARIES) $(OBJ) build/%.o: src/%.c Makefile Makefile.inc ifeq ($(VERBOSE),0) @echo "[CC] $<" endif $(MAKECMDPREFIX)$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ samples: all $(MAKECMDPREFIX)$(MAKE) -C samples all # # Phony Targets # .PHONY: all default_target all-before clean doc install install-headers uninstall uninstall-headers all-before: $(MAKECMDPREFIX)mkdir -p build lib clean: $(MAKECMDPREFIX)$(MAKE) -C doc clean $(MAKECMDPREFIX)$(MAKE) -C samples clean $(MAKECMDPREFIX)rm -frv build lib doc: $(MAKECMDPREFIX)$(MAKE) -C doc all doc-clean: $(MAKECMDPREFIX)$(MAKE) -C doc clean install: all $(MAKECMDPREFIX)mkdir -v -p "$(LIBDIR)" $(MAKECMDPREFIX)cp -v "lib/$(LIBNAME)" "$(LIBDIR)/$(LIBNAME).$(VERSION)" $(MAKECMDPREFIX)$(STRIP) "$(LIBDIR)/$(LIBNAME).$(VERSION)" $(MAKECMDPREFIX)/sbin/ldconfig -n "$(LIBDIR)" install-headers: all $(MAKECMDPREFIX)mkdir -v -p "$(INCLUDEDIR)" $(MAKECMDPREFIX)rm -fr "$(INCLUDEDIR)/nmea" $(MAKECMDPREFIX)cp -rv include/nmea "$(INCLUDEDIR)" uninstall: $(MAKECMDPREFIX)rm -fv "$(LIBDIR)/$(LIBNAME)" "$(LIBDIR)/$(LIBNAME).$(VERSION)" $(MAKECMDPREFIX)/sbin/ldconfig -n "$(LIBDIR)" $(MAKECMDPREFIX)rmdir -v -p --ignore-fail-on-non-empty "$(LIBDIR)" uninstall-headers: $(MAKECMDPREFIX)rm -frv "$(INCLUDEDIR)/nmea" $(MAKECMDPREFIX)rmdir -v -p --ignore-fail-on-non-empty "$(INCLUDEDIR)" olsrd-0.6.6.2/lib/pud/nmealib/Makefile.inc000066400000000000000000000027411234304727700202000ustar00rootroot00000000000000###################### # # Highlevel configuration options for all # # # activate debugging with 1 or deactivate with 0 DEBUG ?= 1 # shows full compiler/linker calls if activated VERBOSE ?= 0 ifeq ($(VERBOSE),0) MAKECMDPREFIX = @ else MAKECMDPREFIX = endif ###################### # # Lowlevel options and rules # ifeq ($(DEBUG),0) STRIP ?= strip else STRIP ?= : endif # we expect the version to be like 'v0.5.3-27-g0c2727a' and then strip the 'v', # and the '-27-g0c2727a' parts VERSION=1.0.4 # protect against no version number ifeq ($(strip $(VERSION)),) VERSION=0.0.0 endif CC ?= gcc CFLAGS ?= -Wall -Wextra -Wold-style-definition -Wdeclaration-after-statement -Wmissing-prototypes -Wstrict-prototypes \ -Wmissing-declarations -Wsign-compare -Waggregate-return -Wmissing-noreturn -Wmissing-format-attribute \ -Wno-multichar -Wno-deprecated-declarations -Wendif-labels -Wwrite-strings -Wbad-function-cast \ -Wpointer-arith -Wcast-qual -Wshadow -Wformat -Wsequence-point -Wcast-align -Wnested-externs \ -Winline -Wdisabled-optimization -finline-functions-called-once -funit-at-a-time -fearly-inlining \ -finline-limit=350 -fPIC -ggdb -Wformat=2 -Winit-self -Wmissing-include-dirs \ -Wswitch-default -Wswitch-enum ifeq ($(DEBUG),0) CFLAGS+= -O2 else CFLAGS+= -O0 endif LDFLAGS = -shared -Wl,--warn-common -fPIC # 32/64 cross compilation ifdef M32 CFLAGS += -m32 LDFLAGS += -m32 endif ifdef M64 CFLAGS += -m64 LDFLAGS += -m64 endif olsrd-0.6.6.2/lib/pud/nmealib/README000066400000000000000000000022241234304727700166440ustar00rootroot00000000000000NMEA library Disclaimer The National Marine Electronics Association (NMEA) has developed a specification that defines the interface between various pieces of marine electronic equipment. The standard permits marine electronics to send information to computers and to other marine equipment. Most computer programs that provide real time position information understand and expect data to be in NMEA format. This data includes the complete PVT (position, velocity, time) solution computed by the GPS receiver. The idea of NMEA is to send a line of data called a sentence that is totally self contained and independent from other sentences. All NMEA sentences are sequences of ACSII symbols that begin with a '$' and end with a carriage return/line feed sequence and can be no longer than 80 characters of visible text (plus the line terminators). Introduction Features - Parsing of NMEA sentences into C structures - Generate NMEA sentences from C structures - Supported sentences: GPGGA, GPGSA, GPGSV, GPRMC, GPVTG - Multilevel architecture of algorithms - Additional functions of geographical mathematics Supported (tested) platforms - Linux (GCC) Licence: LGPL olsrd-0.6.6.2/lib/pud/nmealib/doc/000077500000000000000000000000001234304727700165315ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/nmealib/doc/.gitignore000066400000000000000000000000651234304727700205220ustar00rootroot00000000000000/html/ /latex/ /man/ /nmealib.pdf /nmea.doxygen.temp olsrd-0.6.6.2/lib/pud/nmealib/doc/Makefile000066400000000000000000000012621234304727700201720ustar00rootroot00000000000000include ../Makefile.inc .PHONY: all clean clean: $(MAKECMDPREFIX)rm -fr html latex man nmealib.pdf all: clean nmea.doxygen ifeq ($(VERBOSE),0) @echo "Updating version..." endif $(MAKECMDPREFIX)sed -r "s/^([[:space:]]*PROJECT_NUMBER[[:space:]]*=).*/\1 $(GITVERSION)/" nmea.doxygen > nmea.doxygen.temp ifeq ($(VERBOSE),0) @echo "Generating HTML and man pages..." endif $(MAKECMDPREFIX)doxygen nmea.doxygen.temp $(MAKECMDPREFIX)rm nmea.doxygen.temp ifeq ($(VERBOSE),0) @echo "Generating PDF..." @$(MAKE) -C latex -s > /dev/null 2>&1 else $(MAKE) -C latex endif $(MAKECMDPREFIX)mv latex/refman.pdf nmealib.pdf $(MAKECMDPREFIX)rm -fr latex ifeq ($(VERBOSE),0) @echo "Done" endif olsrd-0.6.6.2/lib/pud/nmealib/doc/nmea.doxygen000066400000000000000000002252551234304727700210630ustar00rootroot00000000000000# Doxyfile 1.8.1.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = "NMEAlib" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 2 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all # comments according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you # can mix doxygen, HTML, and XML commands with Markdown formatting. # Disable only in case of backward compatibilities issues. MARKDOWN_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields will be shown inline in the documentation # of the scope in which they are defined (i.e. file, namespace, or group # documentation), provided this scope is documented. If set to NO (the default), # structs, classes, and unions are shown on a separate page (for HTML and Man # pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. SYMBOL_CACHE_SIZE = 0 # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # their name and scope. Since this can be an expensive process and often the # same symbol appear multiple times in the code, doxygen keeps a cache of # pre-resolved symbols. If the cache is too small doxygen will become slower. # If the cache is too large, memory is wasted. The cache size is given by this # formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = YES # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. CITE_BIB_FILES = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../src \ ../include/nmea # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.c \ *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C, C++ and Fortran comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 2 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # style sheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of # entries shown in the various tree structured indices initially; the user # can expand and collapse entries dynamically later on. Doxygen will expand # the tree to such a level that at most the specified number of entries are # visible (unless a fully collapsed tree already exceeds this amount). # So setting the number of entries 1 will produce a full collapsed tree by # default. 0 is a special value representing an infinite number of entries # and will result in a full expanded tree by default. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = nmealib.chm # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = YES # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = YES # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you may also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to # the MathJax Content Delivery Network so you can quickly see the result without # installing MathJax. # However, it is strongly recommended to install a local # copy of MathJax from http://www.mathjax.org before deployment. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = YES # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # http://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = YES # Load style sheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = YES # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = YES #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = "__attribute__(x)=" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. For each # tag file the location of the external documentation should be added. The # format of a tag file without this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths # or URLs. Note that each tag file must have a unique name (where the name does # NOT include the path). If a tag file is not located in the directory in which # doxygen is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You need to make sure dot is able to find # the font, which can be done by putting it in a standard location or by setting # the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the # directory containing the font. DOT_FONTNAME = FreeSans.ttf # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If the UML_LOOK tag is enabled, the fields and methods are shown inside # the class node. If there are many fields or methods and many nodes the # graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS # threshold limits the number of items for each type to make the size more # managable. Set this to 0 for no limit. Note that the threshold may be # exceeded by 50% before the limit is enforced. UML_LIMIT_NUM_FIELDS = 10 # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = YES # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = YES # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES olsrd-0.6.6.2/lib/pud/nmealib/include/000077500000000000000000000000001234304727700174075ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/nmealib/include/nmea/000077500000000000000000000000001234304727700203275ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/nmealib/include/nmea/context.h000066400000000000000000000036251234304727700221720ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __NMEA_CONTEXT_H__ #define __NMEA_CONTEXT_H__ /** the default size for the temporary buffers */ #define NMEA_DEF_PARSEBUFF 1024 /** the minimum size for the temporary buffers */ #define NMEA_MIN_PARSEBUFF 256 #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** * Function type definition for tracing * * @param str the string to trace * @param str_size the length of the string */ typedef void (*nmeaTraceFunc)(const char *str, int str_size); /** * Function type definition for error logging * * @param str the string to log * @param str_size the length of the string */ typedef void (*nmeaErrorFunc)(const char *str, int str_size); void nmea_context_set_trace_func(nmeaTraceFunc func); void nmea_context_set_error_func(nmeaErrorFunc func); void nmea_context_set_buffer_size(int buff_size); int nmea_context_get_buffer_size(void); void nmea_trace(const char *str, ...) __attribute__ ((format(printf, 1, 2))); void nmea_trace_buff(const char *buff, int buff_size); void nmea_error(const char *str, ...) __attribute__ ((format(printf, 1, 2))); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __NMEA_CONTEXT_H__ */ olsrd-0.6.6.2/lib/pud/nmealib/include/nmea/conversions.h000066400000000000000000000032471234304727700230560ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __NMEA_CONVERSIONS_H__ #define __NMEA_CONVERSIONS_H__ #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ int nmea_gsv_npack(int sat_count); void nmea_GPGGA2info(const nmeaGPGGA *pack, nmeaINFO *info); void nmea_info2GPGGA(const nmeaINFO *info, nmeaGPGGA *pack); void nmea_GPGSA2info(const nmeaGPGSA *pack, nmeaINFO *info); void nmea_info2GPGSA(const nmeaINFO *info, nmeaGPGSA *pack); void nmea_GPGSV2info(const nmeaGPGSV *pack, nmeaINFO *info); void nmea_info2GPGSV(const nmeaINFO *info, nmeaGPGSV *pack, int pack_idx); void nmea_GPRMC2info(const nmeaGPRMC *pack, nmeaINFO *info); void nmea_info2GPRMC(const nmeaINFO *info, nmeaGPRMC *pack); void nmea_GPVTG2info(const nmeaGPVTG *pack, nmeaINFO *info); void nmea_info2GPVTG(const nmeaINFO *info, nmeaGPVTG *pack); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __NMEA_CONVERSIONS_H__ */ olsrd-0.6.6.2/lib/pud/nmealib/include/nmea/generate.h000066400000000000000000000026311234304727700222740ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __NMEA_GENERATE_H__ #define __NMEA_GENERATE_H__ #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ int nmea_gen_GPGGA(char *s, const int len, const nmeaGPGGA *pack); int nmea_gen_GPGSA(char *s, const int len, const nmeaGPGSA *pack); int nmea_gen_GPGSV(char *s, const int len, const nmeaGPGSV *pack); int nmea_gen_GPRMC(char *s, const int len, const nmeaGPRMC *pack); int nmea_gen_GPVTG(char *s, const int len, const nmeaGPVTG *pack); int nmea_generate(char *s, const int len, const nmeaINFO *info, const int generate_mask); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __NMEA_GENERATE_H__ */ olsrd-0.6.6.2/lib/pud/nmealib/include/nmea/generator.h000066400000000000000000000063021234304727700224670ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __NMEA_GENERATOR_H__ #define __NMEA_GENERATOR_H__ #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* forward declaration */ struct _nmeaGENERATOR; /** * Generator type enum */ enum nmeaGENTYPE { NMEA_GEN_NOISE = 0, NMEA_GEN_STATIC, NMEA_GEN_ROTATE, NMEA_GEN_SAT_STATIC, NMEA_GEN_SAT_ROTATE, NMEA_GEN_POS_RANDMOVE, NMEA_GEN_LAST }; struct _nmeaGENERATOR * nmea_create_generator(const int type, nmeaINFO *info); int nmea_generate_from(char *buff, int buff_sz, nmeaINFO *info, struct _nmeaGENERATOR *gen, int generate_mask); /** * Generator initialiser function definition. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ typedef int (*nmeaNMEA_GEN_INIT)(struct _nmeaGENERATOR *gen, nmeaINFO *info); /** * Generator loop function definition. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ typedef int (*nmeaNMEA_GEN_LOOP)(struct _nmeaGENERATOR *gen, nmeaINFO *info); /** * Generator reset function definition. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ typedef int (*nmeaNMEA_GEN_RESET)(struct _nmeaGENERATOR *gen, nmeaINFO *info); /** * Generator destroy function definition. * * @param gen a pointer to the generator * @return 1 (true) on success, 0 (false) otherwise */typedef int (*nmeaNMEA_GEN_DESTROY)(struct _nmeaGENERATOR *gen); /** * Generator structure */ typedef struct _nmeaGENERATOR { void *gen_data; /**< generator data */ nmeaNMEA_GEN_INIT init_call; /**< initialiser function */ nmeaNMEA_GEN_LOOP loop_call; /**< loop function */ nmeaNMEA_GEN_RESET reset_call; /**< reset function */ nmeaNMEA_GEN_DESTROY destroy_call; /**< destroy function */ struct _nmeaGENERATOR *next; /**< the next generator */ } nmeaGENERATOR; int nmea_gen_init(nmeaGENERATOR *gen, nmeaINFO *info); int nmea_gen_loop(nmeaGENERATOR *gen, nmeaINFO *info); int nmea_gen_reset(nmeaGENERATOR *gen, nmeaINFO *info); void nmea_gen_destroy(nmeaGENERATOR *gen); void nmea_gen_add(nmeaGENERATOR *to, nmeaGENERATOR *gen); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __NMEA_GENERATOR_H__ */ olsrd-0.6.6.2/lib/pud/nmealib/include/nmea/gmath.h000066400000000000000000000064471234304727700216130ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __NMEA_GMATH_H__ #define __NMEA_GMATH_H__ #include #define NMEA_TUD_YARDS (1.0936133) /**< Yards, meter * NMEA_TUD_YARDS = yard */ #define NMEA_TUD_KNOTS (1.852) /**< Knots, kilometer / NMEA_TUD_KNOTS = knot */ #define NMEA_TUD_MILES (1.609344) /**< Miles, kilometer / NMEA_TUD_MILES = mile */ #define NMEA_TUS_MS (3.6) /**< Meters per seconds, (k/h) / NMEA_TUS_MS= (m/s) */ #define NMEA_PI (3.141592653589793) /**< PI value */ #define NMEA_PI180 (NMEA_PI / 180) /**< PI division by 180 */ #define NMEA_EARTHRADIUS_KM (6378) /**< Earth's mean radius in km */ #define NMEA_EARTHRADIUS_M (NMEA_EARTHRADIUS_KM * 1000) /**< Earth's mean radius in m */ #define NMEA_EARTH_SEMIMAJORAXIS_M (6378137.0) /**< Earth's semi-major axis in m according WGS84 */ #define NMEA_EARTH_SEMIMAJORAXIS_KM (NMEA_EARTHMAJORAXIS_KM / 1000) /**< Earth's semi-major axis in km according WGS 84 */ #define NMEA_EARTH_FLATTENING (1 / 298.257223563) /**< Earth's flattening according WGS 84 */ #define NMEA_DOP_FACTOR (5) /**< Factor for translating DOP to meters */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* * degree VS radian */ double nmea_degree2radian(const double val); double nmea_radian2degree(const double val); /* * NDEG (NMEA degree) */ double nmea_ndeg2degree(const double val); double nmea_degree2ndeg(const double val); double nmea_ndeg2radian(const double val); double nmea_radian2ndeg(const double val); /* * DOP */ double nmea_calc_pdop(const double hdop, const double vdop); double nmea_dop2meters(const double dop); double nmea_meters2dop(const double meters); /* * positions work */ void nmea_info2pos(const nmeaINFO *info, nmeaPOS *pos); void nmea_pos2info(const nmeaPOS *pos, nmeaINFO *info); double nmea_distance(const nmeaPOS *from_pos, const nmeaPOS *to_pos); double nmea_distance_ellipsoid(const nmeaPOS *from_pos, const nmeaPOS *to_pos, double *from_azimuth, double *to_azimuth); int nmea_move_horz(const nmeaPOS *start_pos, nmeaPOS *end_pos, double azimuth, double distance); int nmea_move_horz_ellipsoid(const nmeaPOS *start_pos, nmeaPOS *end_pos, double azimuth, double distance, double *end_azimuth); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __NMEA_GMATH_H__ */ olsrd-0.6.6.2/lib/pud/nmealib/include/nmea/info.h000066400000000000000000000164051234304727700214410ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __NMEA_INFO_H__ #define __NMEA_INFO_H__ #include #include /** * @file * The table below describes which fields are present in the sentences that are * supported by the library.

 field/sentence       GPGGA   GPGSA   GPGSV   GPRMC   GPVTG
 present:               x       x       x       x       x
 smask:                 x       x       x       x       x
 utc (date):                                    x
 utc (time):            x                       x
 sig:                   x                       x1
 fix:                           x               x1
 PDOP:                          x
 HDOP:                  x       x
 VDOP:                          x
 lat:                   x                       x
 lon:                   x                       x
 elv:                   x
 speed:                                         x       x
 track:                                         x       x
 mtrack:                                                x
 magvar:                                        x
 satinfo (inuse count): x       x1
 satinfo (inuse):               x
 satinfo (inview):                      x

 x1 = not present in the sentence but the library sets it up.
 
*/ #define NMEA_SIG_FIRST (NMEA_SIG_BAD) #define NMEA_SIG_BAD (0) #define NMEA_SIG_LOW (1) #define NMEA_SIG_MID (2) #define NMEA_SIG_HIGH (3) #define NMEA_SIG_RTKIN (4) #define NMEA_SIG_FLRTK (5) #define NMEA_SIG_ESTIM (6) #define NMEA_SIG_MAN (7) #define NMEA_SIG_SIM (8) #define NMEA_SIG_LAST (NMEA_SIG_SIM) #define NMEA_FIX_FIRST (NMEA_FIX_BAD) #define NMEA_FIX_BAD (1) #define NMEA_FIX_2D (2) #define NMEA_FIX_3D (3) #define NMEA_FIX_LAST (NMEA_FIX_3D) #define NMEA_MAXSAT (64) #define NMEA_SATINPACK (4) #define NMEA_NSATPACKS (NMEA_MAXSAT / NMEA_SATINPACK) #define NMEA_DEF_LAT (0.0) #define NMEA_DEF_LON (0.0) #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** * Date and time data * @see nmea_time_now */ typedef struct _nmeaTIME { int year; /**< Years since 1900 */ int mon; /**< Months since January - [0,11] */ int day; /**< Day of the month - [1,31] */ int hour; /**< Hours since midnight - [0,23] */ int min; /**< Minutes after the hour - [0,59] */ int sec; /**< Seconds after the minute - [0,59] */ int hsec; /**< Hundredth part of second - [0,99] */ } nmeaTIME; /** * Position data in fractional degrees or radians */ typedef struct _nmeaPOS { double lat; /**< Latitude */ double lon; /**< Longitude */ } nmeaPOS; /** * Information about satellite * @see nmeaSATINFO * @see nmeaGPGSV */ typedef struct _nmeaSATELLITE { int id; /**< Satellite PRN number */ int elv; /**< Elevation in degrees, 90 maximum */ int azimuth; /**< Azimuth, degrees from true north, 000 to 359 */ int sig; /**< Signal, 00-99 dB */ } nmeaSATELLITE; /** * Information about all satellites in view * @see nmeaINFO * @see nmeaGPGSV */ typedef struct _nmeaSATINFO { int inuse; /**< Number of satellites in use (not those in view) */ int in_use[NMEA_MAXSAT]; /**< IDs of satellites in use (not those in view) */ int inview; /**< Total number of satellites in view */ nmeaSATELLITE sat[NMEA_MAXSAT]; /**< Satellites information (in view) */ } nmeaSATINFO; /** * Summary GPS information from all parsed packets, * used also for generating NMEA stream * @see nmea_parse * @see nmea_GPGGA2info, nmea_...2info */ typedef struct _nmeaINFO { uint32_t present; /**< Mask specifying which fields are present */ int smask; /**< Mask specifying from which sentences data has been obtained */ nmeaTIME utc; /**< UTC of position */ int sig; /**< GPS quality indicator: 0 = Invalid 1 = Fix; 2 = Differential 3 = Sensitive 4 = Real Time Kinematic 5 = Float RTK, 6 = estimated (dead reckoning) (v2.3) 7 = Manual input mode 8 = Simulation mode) */ int fix; /**< Operating mode, used for navigation: 1 = Fix not available 2 = 2D 3 = 3D) */ double PDOP; /**< Position Dilution Of Precision */ double HDOP; /**< Horizontal Dilution Of Precision */ double VDOP; /**< Vertical Dilution Of Precision */ double lat; /**< Latitude in NDEG: +/-[degree][min].[sec/60] */ double lon; /**< Longitude in NDEG: +/-[degree][min].[sec/60] */ double elv; /**< Antenna altitude above/below mean sea level (geoid) in meters */ double speed; /**< Speed over the ground in kph */ double track; /**< Track angle in degrees True */ double mtrack; /**< Magnetic Track angle in degrees True */ double magvar; /**< Magnetic variation degrees */ nmeaSATINFO satinfo; /**< Satellites information */ } nmeaINFO; /** * Enumeration for the fields names of a nmeaINFO structure. * The values are used in the 'present' mask. */ typedef enum _nmeaINFO_FIELD { SMASK = (1 << 0), /* 0x00001 */ UTCDATE = (1 << 1), /* 0x00002 */ UTCTIME = (1 << 2), /* 0x00004 */ SIG = (1 << 3), /* 0x00008 */ FIX = (1 << 4), /* 0x00010 */ PDOP = (1 << 5), /* 0x00020 */ HDOP = (1 << 6), /* 0x00040 */ VDOP = (1 << 7), /* 0x00080 */ LAT = (1 << 8), /* 0x00100 */ LON = (1 << 9), /* 0x00200 */ ELV = (1 << 10), /* 0x00400 */ SPEED = (1 << 11), /* 0x00800 */ TRACK = (1 << 12), /* 0x01000 */ MTRACK = (1 << 13), /* 0x02000 */ MAGVAR = (1 << 14), /* 0x04000 */ SATINUSECOUNT = (1 << 15), /* 0x08000 */ SATINUSE = (1 << 16), /* 0x10000 */ SATINVIEW = (1 << 17), /* 0x20000 */ _nmeaINFO_FIELD_LAST = SATINVIEW } nmeaINFO_FIELD; #define NMEA_INFO_PRESENT_MASK ((_nmeaINFO_FIELD_LAST << 1) - 1) void nmea_time_now(nmeaTIME *utc, uint32_t * present); void nmea_zero_INFO(nmeaINFO *info); bool nmea_INFO_is_present_smask(int smask, nmeaINFO_FIELD fieldName); bool nmea_INFO_is_present(uint32_t present, nmeaINFO_FIELD fieldName); void nmea_INFO_set_present(uint32_t * present, nmeaINFO_FIELD fieldName); void nmea_INFO_unset_present(uint32_t * present, nmeaINFO_FIELD fieldName); void nmea_INFO_sanitise(nmeaINFO *nmeaInfo); void nmea_INFO_unit_conversion(nmeaINFO * nmeaInfo); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __NMEA_INFO_H__ */ olsrd-0.6.6.2/lib/pud/nmealib/include/nmea/parse.h000066400000000000000000000032201234304727700216070ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __NMEA_PARSE_H__ #define __NMEA_PARSE_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ bool nmea_parse_sentence_has_invalid_chars(const char * str, const size_t str_len, const char * strName, char * report, const size_t reportSize); int nmea_parse_get_sentence_type(const char *s, const int len); int nmea_parse_get_sentence_length(const char *s, const int len, int *checksum); int nmea_parse_GPGGA(const char *s, const int len, nmeaGPGGA *pack); int nmea_parse_GPGSA(const char *s, const int len, nmeaGPGSA *pack); int nmea_parse_GPGSV(const char *s, const int len, nmeaGPGSV *pack); int nmea_parse_GPRMC(const char *s, const int len, nmeaGPRMC *pack); int nmea_parse_GPVTG(const char *s, const int len, nmeaGPVTG *pack); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __NMEA_PARSE_H__ */ olsrd-0.6.6.2/lib/pud/nmealib/include/nmea/parser.h000066400000000000000000000043771234304727700220070ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __NMEA_PARSER_H__ #define __NMEA_PARSER_H__ #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** * Description of a parser node / packet */ typedef struct _nmeaParserNODE { int packType; /**< the type of the packet (see nmeaPACKTYPE) */ void *pack; /**< the packet (a pointer to a malloced sentence sctucture) */ struct _nmeaParserNODE *next_node; /**< pointer to the next node / packet */ } nmeaParserNODE; /** * The parser data. */ typedef struct _nmeaPARSER { nmeaParserNODE *top_node; /**< the first node / packet */ nmeaParserNODE *end_node; /**< the last node / packet */ char *buffer; /**< the buffer containing the string to parse */ int buff_size; /**< the size of the buffer */ int buff_use; /**< the number of bytes in the buffer */ } nmeaPARSER; int nmea_parser_init(nmeaPARSER *parser); void nmea_parser_destroy(nmeaPARSER *parser); int nmea_parse(nmeaPARSER *parser, const char *buff, const int buff_sz, nmeaINFO *info); int nmea_parser_push(nmeaPARSER *parser, const char *buff, int buff_sz); int nmea_parser_top(const nmeaPARSER *parser); int nmea_parser_pop(nmeaPARSER *parser, void **pack_ptr); int nmea_parser_peek(const nmeaPARSER *parser, void **pack_ptr); int nmea_parser_drop(nmeaPARSER *parser); void nmea_parser_buff_clear(nmeaPARSER *parser); void nmea_parser_queue_clear(nmeaPARSER *parser); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __NMEA_PARSER_H__ */ olsrd-0.6.6.2/lib/pud/nmealib/include/nmea/sentence.h000066400000000000000000000311171234304727700223070ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * Extended descriptions of sentences are taken from * http://www.gpsinformation.org/dale/nmea.htm */ #ifndef __NMEA_SENTENCE_H__ #define __NMEA_SENTENCE_H__ #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** * NMEA packets type which parsed and generated by library */ enum nmeaPACKTYPE { GPNON = 0, /**< Unknown packet type. */ GPGGA = (1 << 0), /**< GGA - Essential fix data which provide 3D location and accuracy data. */ GPGSA = (1 << 1), /**< GSA - GPS receiver operating mode, SVs used for navigation, and DOP values. */ GPGSV = (1 << 2), /**< GSV - Number of SVs in view, PRN numbers, elevation, azimuth & SNR values. */ GPRMC = (1 << 3), /**< RMC - Recommended Minimum Specific GPS/TRANSIT Data. */ GPVTG = (1 << 4) /**< VTG - Actual track made good and speed over ground. */ }; /** * GGA packet information structure (Global Positioning System Fix Data) * *
 * GGA - essential fix data which provide 3D location and accuracy data.
 *
 * $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
 *
 * Where:
 *      GGA          Global Positioning System Fix Data
 *      123519       Fix taken at 12:35:19 UTC
 *      4807.038,N   Latitude 48 deg 07.038' N
 *      01131.000,E  Longitude 11 deg 31.000' E
 *      1            Signal quality: 0 = invalid
 *                                   1 = GPS fix (SPS)
 *                                   2 = DGPS fix
 *                                   3 = PPS fix
 * 			                         4 = Real Time Kinematic
 * 			                         5 = Float RTK
 *                                   6 = estimated (dead reckoning) (2.3 feature)
 * 			                         7 = Manual input mode
 * 			                         8 = Simulation mode
 *      08           Number of satellites being tracked
 *      0.9          Horizontal dilution of position
 *      545.4,M      Altitude, Meters, above mean sea level
 *      46.9,M       Height of geoid (mean sea level) above WGS84
 *                       ellipsoid
 *      (empty field) time in seconds since last DGPS update
 *      (empty field) DGPS station ID number
 *      *47          the checksum data, always begins with *
 *
 * If the height of geoid is missing then the altitude should be suspect. Some
 * non-standard implementations report altitude with respect to the ellipsoid
 * rather than geoid altitude. Some units do not report negative altitudes at
 * all. This is the only sentence that reports altitude.
 * 
*/ typedef struct _nmeaGPGGA { uint32_t present; /**< Mask specifying which fields are present, same as in nmeaINFO */ nmeaTIME utc; /**< UTC of position (just time) */ double lat; /**< Latitude in NDEG - [degree][min].[sec/60] */ char ns; /**< [N]orth or [S]outh */ double lon; /**< Longitude in NDEG - [degree][min].[sec/60] */ char ew; /**< [E]ast or [W]est */ int sig; /**< GPS quality indicator (0 = Invalid; 1 = Fix; 2 = Differential, 3 = Sensitive) */ int satinuse; /**< Number of satellites in use (not those in view) */ double HDOP; /**< Horizontal dilution of precision */ double elv; /**< Antenna altitude above/below mean sea level (geoid) */ char elv_units; /**< [M]eters (Antenna height unit) */ double diff; /**< Geoidal separation (Diff. between WGS-84 earth ellipsoid and mean sea level. '-' = geoid is below WGS-84 ellipsoid) */ char diff_units; /**< [M]eters (Units of geoidal separation) */ double dgps_age; /**< Time in seconds since last DGPS update */ int dgps_sid; /**< DGPS station ID number */ } nmeaGPGGA; /** * GSA packet information structure (Satellite status) * *
 * GSA - GPS DOP and active satellites.
 *
 * This sentence provides details on the nature of the fix. It includes the
 * numbers of the satellites being used in the current solution and the DOP.
 *
 * DOP (dilution of precision) is an indication of the effect of satellite
 * geometry on the accuracy of the fix. It is a unitless number where smaller
 * is better. For 3D fixes using 4 satellites a 1.0 would be considered to be
 * a perfect number, however for overdetermined solutions it is possible to see
 * numbers below 1.0.
 *
 * There are differences in the way the PRN's are presented which can effect the
 * ability of some programs to display this data. For example, in the example
 * shown below there are 5 satellites in the solution and the null fields are
 * scattered indicating that the almanac would show satellites in the null
 * positions that are not being used as part of this solution. Other receivers
 * might output all of the satellites used at the beginning of the sentence with
 * the null field all stacked up at the end. This difference accounts for some
 * satellite display programs not always being able to display the satellites
 * being tracked. Some units may show all satellites that have ephemeris data
 * without regard to their use as part of the solution but this is non-standard.
 *
 * $GPGSA,A,3,04,05,,09,12,,,24,,,,,2.5,1.3,2.1*39
 *
 * Where:
 *      GSA      Satellite status
 *      A        Auto selection of 2D or 3D fix (M = manual)
 *      3        3D fix - values include: 1 = no fix
 *                                        2 = 2D fix
 *                                        3 = 3D fix
 *      04,05... PRNs of satellites used for fix (space for 12)
 *      2.5      PDOP (dilution of precision)
 *      1.3      Horizontal dilution of precision (HDOP)
 *      2.1      Vertical dilution of precision (VDOP)
 *      *39      the checksum data, always begins with *
 * 
*/ typedef struct _nmeaGPGSA { uint32_t present; /**< Mask specifying which fields are present, same as in nmeaINFO */ char fix_mode; /**< Mode (M = Manual, forced to operate in 2D or 3D; A = Automatic, 3D/2D) */ int fix_type; /**< Type, used for navigation (1 = Fix not available; 2 = 2D; 3 = 3D) */ int sat_prn[NMEA_MAXSAT]; /**< PRNs of satellites used in position fix (0 for unused fields) */ double PDOP; /**< Dilution of precision */ double HDOP; /**< Horizontal dilution of precision */ double VDOP; /**< Vertical dilution of precision */ } nmeaGPGSA; /** * GSV packet information structure (Satellites in view) * *
 * GSV - Satellites in View
 *
 * Shows data about the satellites that the unit might be able to find based on
 * its viewing mask and almanac data. It also shows current ability to track
 * this data. Note that one GSV sentence only can provide data for up to 4
 * satellites and thus there may need to be 3 sentences for the full
 * information. It is reasonable for the GSV sentence to contain more satellites
 * than GGA might indicate since GSV may include satellites that are not used as
 * part of the solution. It is not a requirement that the GSV sentences all
 * appear in sequence. To avoid overloading the data bandwidth some receivers
 * may place the various sentences in totally different samples since each
 * sentence identifies which one it is.
 *
 * The field called SNR (Signal to Noise Ratio) in the NMEA standard is often
 * referred to as signal strength. SNR is an indirect but more useful value than
 * raw signal strength. It can range from 0 to 99 and has units of dB according
 * to the NMEA standard, but the various manufacturers send different ranges of
 * numbers with different starting numbers so the values themselves cannot
 * necessarily be used to evaluate different units. The range of working values
 * in a given gps will usually show a difference of about 25 to 35 between the
 * lowest and highest values, however 0 is a special case and may be shown on
 * satellites that are in view but not being tracked.
 *
 * $GPGSV,2,1,08,01,40,083,46,02,17,308,41,12,07,344,39,14,22,228,45*75
 *
 * Where:
 *      GSV          Satellites in view
 *      2            Number of sentences for full data
 *      1            sentence 1 of 2
 *      08           Number of satellites in view
 *
 *      01           Satellite PRN number
 *      40           Elevation, degrees
 *      083          Azimuth, degrees
 *      46           SNR - higher is better
 *           for up to 4 satellites per sentence
 *
 *      *75          the checksum data, always begins with *
 * 
*/ typedef struct _nmeaGPGSV { uint32_t present; /**< Mask specifying which fields are present, same as in nmeaINFO */ int pack_count; /**< Total number of messages of this type in this cycle */ int pack_index; /**< Message number */ int sat_count; /**< Total number of satellites in view */ nmeaSATELLITE sat_data[NMEA_SATINPACK]; } nmeaGPGSV; /** * RMC -packet information structure (Recommended Minimum sentence C) * *
 * RMC - Recommended Minimum sentence C
 *
 * NMEA has its own version of essential gps pvt (position, velocity,
 * time) data. It is called RMC, the Recommended Minimum, which will look
 * similar to:
 *
 * $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
 * $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W,A*6A (v2.3)
 *
 * Where:
 *      RMC          Recommended Minimum sentence C
 *      123519       Fix taken at 12:35:19 UTC
 *      A            Status A=active or V=Void.
 *      4807.038,N   Latitude 48 deg 07.038' N
 *      01131.000,E  Longitude 11 deg 31.000' E
 *      022.4        Speed over the ground in knots
 *      084.4        Track angle in degrees True
 *      230394       Date - 23rd of March 1994
 *      003.1,W      Magnetic Variation
 *      A            Mode A=autonomous, D=differential, E=Estimated,
 *                        N=not valid, S=Simulator (NMEA v2.3)
 *      *6A          The checksum data, always begins with *
 * 
*/ typedef struct _nmeaGPRMC { uint32_t present; /**< Mask specifying which fields are present, same as in nmeaINFO */ nmeaTIME utc; /**< UTC of position */ char status; /**< Status (A = active or V = void) */ double lat; /**< Latitude in NDEG - [degree][min].[sec/60] */ char ns; /**< [N]orth or [S]outh */ double lon; /**< Longitude in NDEG - [degree][min].[sec/60] */ char ew; /**< [E]ast or [W]est */ double speed; /**< Speed over the ground in knots */ double track; /**< Track angle in degrees True */ double magvar; /**< Magnetic variation degrees (Easterly var. subtracts from true course) */ char magvar_ew; /**< [E]ast or [W]est */ char mode; /**< Mode indicator of fix type (A=autonomous, D=differential, E=Estimated, N=not valid, S=Simulator) */ } nmeaGPRMC; /** * VTG packet information structure (Track made good and ground speed) * *
 * VTG - Velocity made good.
 *
 * The gps receiver may use the LC prefix instead of GP if it is emulating
 * Loran output.
 *
 * $GPVTG,054.7,T,034.4,M,005.5,N,010.2,K*48
 *
 * where:
 *      VTG          Track made good and ground speed
 *      054.7,T      True track made good (degrees)
 *      034.4,M      Magnetic track made good
 *      005.5,N      Ground speed, knots
 *      010.2,K      Ground speed, Kilometers per hour
 *      *48          Checksum
 * 
*/ typedef struct _nmeaGPVTG { uint32_t present; /**< Mask specifying which fields are present, same as in nmeaINFO */ double track; /**< True track made good (degrees) */ char track_t; /**< Fixed text 'T' indicates that track made good is relative to true north */ double mtrack; /**< Magnetic track made good */ char mtrack_m; /**< Fixed text 'M' */ double spn; /**< Ground speed, knots */ char spn_n; /**< Fixed text 'N' indicates that speed over ground is in knots */ double spk; /**< Ground speed, kilometers per hour */ char spk_k; /**< Fixed text 'K' indicates that speed over ground is in kilometers/hour */ } nmeaGPVTG; void nmea_zero_GPGGA(nmeaGPGGA *pack); void nmea_zero_GPGSA(nmeaGPGSA *pack); void nmea_zero_GPGSV(nmeaGPGSV *pack); void nmea_zero_GPRMC(nmeaGPRMC *pack); void nmea_zero_GPVTG(nmeaGPVTG *pack); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __NMEA_SENTENCE_H__ */ olsrd-0.6.6.2/lib/pud/nmealib/include/nmea/tok.h000066400000000000000000000024071234304727700213000ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __NMEA_TOK_H__ #define __NMEA_TOK_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ int nmea_calc_crc(const char *s, const int len); int nmea_atoi(const char *s, const int len, const int radix); double nmea_atof(const char *s, const int len); int nmea_printf(char *s, int len, const char *format, ...) __attribute__ ((format(printf, 3, 4))); int nmea_scanf(const char *s, int len, const char *format, ...); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __NMEA_TOK_H__ */ olsrd-0.6.6.2/lib/pud/nmealib/samples/000077500000000000000000000000001234304727700174305ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/nmealib/samples/Makefile000066400000000000000000000013451234304727700210730ustar00rootroot00000000000000include ../Makefile.inc # # Settings # SAMPLES = generate generator math parse parse_file SMPLS = $(SAMPLES:%=../build/samples/%) SMPLOBJ = $(SAMPLES:%=%/main.o) LIBRARIES = -lm -L../lib -lnmea INCLUDES = -I ../include # # Targets # all: all-before samples remake: clean all samples: $(SMPLS) ../build/samples/%: %/main.o ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(CFLAGS) $< $(LIBRARIES) -o $@ %/main.o: %/main.c Makefile ../Makefile.inc ifeq ($(VERBOSE),0) @echo "[CC] $<" endif $(MAKECMDPREFIX)$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ # # Phony Targets # .PHONY: all all-before clean samples all-before: $(MAKECMDPREFIX)mkdir -p ../build/samples clean: $(MAKECMDPREFIX)rm -f $(SMPLOBJ) $(SMPLS) olsrd-0.6.6.2/lib/pud/nmealib/samples/generate/000077500000000000000000000000001234304727700212225ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/nmealib/samples/generate/main.c000066400000000000000000000050161234304727700223140ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include int main(int argc __attribute__((unused)), char *argv[] __attribute__((unused))) { nmeaINFO info; char buff[2048]; int gen_sz; int it; nmea_zero_INFO(&info); info.sig = 3; info.fix = 3; info.lat = 5000.0; info.lon = 3600.0; info.speed = 2.14 * NMEA_TUS_MS; info.elv = 10.86; info.track = 45; info.mtrack = 55; info.magvar = 55; info.HDOP = 2.3; info.VDOP = 1.2; info.PDOP = 2.594224354; nmea_INFO_set_present(&info.present, SIG); nmea_INFO_set_present(&info.present, FIX); nmea_INFO_set_present(&info.present, LAT); nmea_INFO_set_present(&info.present, LON); nmea_INFO_set_present(&info.present, SPEED); nmea_INFO_set_present(&info.present, ELV); nmea_INFO_set_present(&info.present, TRACK); nmea_INFO_set_present(&info.present, MTRACK); nmea_INFO_set_present(&info.present, MAGVAR); nmea_INFO_set_present(&info.present, HDOP); nmea_INFO_set_present(&info.present, VDOP); nmea_INFO_set_present(&info.present, PDOP); info.satinfo.inuse = NMEA_MAXSAT; nmea_INFO_set_present(&info.present, SATINUSECOUNT); for (it = 0; it < NMEA_MAXSAT; it++) { info.satinfo.in_use[it] = it + 1; } nmea_INFO_set_present(&info.present, SATINUSE); info.satinfo.inview = NMEA_MAXSAT; for (it = 0; it < NMEA_MAXSAT; it++) { info.satinfo.sat[it].id = it + 1; info.satinfo.sat[it].elv = (it * 10); info.satinfo.sat[it].azimuth = it + 1; info.satinfo.sat[it].sig = 99 - it; } nmea_INFO_set_present(&info.present, SATINVIEW); for (it = 0; it < 10; it++) { gen_sz = nmea_generate(&buff[0], 2048, &info, GPGGA | GPGSA | GPGSV | GPRMC | GPVTG); buff[gen_sz] = 0; printf("%s\n", &buff[0]); usleep(500000); info.speed += .1; } return 0; } olsrd-0.6.6.2/lib/pud/nmealib/samples/generator/000077500000000000000000000000001234304727700214165ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/nmealib/samples/generator/main.c000066400000000000000000000030341234304727700225060ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include int main(int argc __attribute__((unused)), char *argv[] __attribute__((unused))) { nmeaGENERATOR *gen; nmeaINFO info; char buff[2048]; int gen_sz; int it; nmea_zero_INFO(&info); nmea_INFO_set_present(&info.present, PDOP); nmea_INFO_set_present(&info.present, HDOP); nmea_INFO_set_present(&info.present, VDOP); nmea_INFO_set_present(&info.present, ELV); if (0 == (gen = nmea_create_generator(NMEA_GEN_ROTATE, &info))) return -1; for (it = 0; it < 10000; it++) { gen_sz = nmea_generate_from(&buff[0], 2048, &info, gen, GPGGA | GPGSA | GPGSV | GPRMC | GPVTG); buff[gen_sz] = 0; printf("%s\n", &buff[0]); usleep(500000); } nmea_gen_destroy(gen); return 0; } olsrd-0.6.6.2/lib/pud/nmealib/samples/math/000077500000000000000000000000001234304727700203615ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/nmealib/samples/math/main.c000066400000000000000000000071761234304727700214640ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #define NUM_POINTS 4 int main(int argc __attribute__((unused)), char *argv[] __attribute__((unused))) { const char *buff[] = { "$GPRMC,213916.199,A,4221.0377,N,07102.9778,W,0.00,,010207,,,A*6A\r\n", "$GPRMC,213917.199,A,4221.0510,N,07102.9549,W,0.23,175.43,010207,,,A*77\r\n", "$GPRMC,213925.000,A,4221.1129,N,07102.9146,W,0.00,,010207,,,A*68\r\n", "$GPRMC,111609.14,A,5001.27,N,3613.06,E,11.2,0.0,261206,0.0,E*50\r\n" }; nmeaPOS pos[NUM_POINTS], pos_moved[NUM_POINTS][2]; double dist[NUM_POINTS][2]; double azimuth[NUM_POINTS][2], azimuth_moved[NUM_POINTS]; int result[2]; int it = 0; nmeaPARSER parser; nmea_parser_init(&parser); for (it = 0; it < NUM_POINTS; it++) { nmeaINFO info; nmea_zero_INFO(&info); (void) nmea_parse(&parser, buff[it], (int) strlen(buff[it]), &info); nmea_info2pos(&info, &pos[it]); } nmea_parser_destroy(&parser); for (it = 0; it < NUM_POINTS; it++) { dist[it][0] = nmea_distance(&pos[0], &pos[it]); dist[it][1] = nmea_distance_ellipsoid(&pos[0], &pos[it], &azimuth[it][0], &azimuth[it][1]); } for (it = 0; it < NUM_POINTS; it++) { result[0] = nmea_move_horz(&pos[0], &pos_moved[it][0], azimuth[it][0], dist[it][0]); result[1] = nmea_move_horz_ellipsoid(&pos[0], &pos_moved[it][1], azimuth[it][0], dist[it][0], &azimuth_moved[it]); } /* Output of results */ printf("Coordinate points:\n"); for (it = 0; it < NUM_POINTS; it++) { printf("P%d in radians: lat:%9.6lf lon:%9.6lf \tin degree: lat:%+010.6lf° lon:%+011.6lf°\n", it, pos[it].lat, pos[it].lon, nmea_radian2degree(pos[it].lat), nmea_radian2degree(pos[it].lon)); } printf("\nCalculation results:\n"); for (it = 0; it < NUM_POINTS; it++) { printf("\n"); printf("Distance P0 to P%d\ton spheroid: %14.3lf m\n", it, dist[it][0]); printf("Distance P0 to P%d\ton ellipsoid: %14.3lf m\n", it, dist[it][1]); printf("Azimuth P0 to P%d\tat start: %8.3lf°\tat end: %8.3lf°\n", it, nmea_radian2degree(azimuth[it][0]), nmea_radian2degree(azimuth[it][1])); printf("Move P0 to P%d\t \tAzimuth at end: %8.3lf°\n", it, nmea_radian2degree(azimuth_moved[it])); printf("Move P0 to P%d\ton spheroid: %3s lat:%+010.6lf° lon:%+011.6lf°\n", it, result[0] == 1 ? "OK" : "nOK", nmea_radian2degree(pos_moved[it][0].lat), nmea_radian2degree(pos_moved[it][0].lon)); printf("Move P0 to P%d\ton ellipsoid: %3s lat:%+010.6lf° lon:%+011.6lf°\n", it, result[0] == 1 ? "OK" : "nOK", nmea_radian2degree(pos_moved[it][1].lat), nmea_radian2degree(pos_moved[it][1].lon)); printf("Move P0 to P%d\toriginal: lat:%+010.6lf° lon:%+011.6lf°\n", it, nmea_radian2degree(pos[it].lat), nmea_radian2degree(pos[it].lon)); } return 0; } olsrd-0.6.6.2/lib/pud/nmealib/samples/parse/000077500000000000000000000000001234304727700205425ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/nmealib/samples/parse/main.c000066400000000000000000000035641234304727700216420ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include int main(int argc __attribute__((unused)), char *argv[] __attribute__((unused))) { const char *buff[] = { "$GPRMC,173843,A,3349.896,N,11808.521,W,000.0,360.0,230108,013.4,E*69\r\n", "$GPGGA,111609.14,5001.27,N,3613.06,E,3,08,0.0,10.2,M,0.0,M,0.0,0000*70\r\n", "$GPGSV,2,1,08,01,05,005,80,02,05,050,80,03,05,095,80,04,05,140,80*7f\r\n", "$GPGSV,2,2,08,05,05,185,80,06,05,230,80,07,05,275,80,08,05,320,80*71\r\n", "$GPGSA,A,3,01,02,03,04,05,06,07,08,00,00,00,00,0.0,0.0,0.0*3a\r\n", "$GPRMC,111609.14,A,5001.27,N,3613.06,E,11.2,0.0,261206,0.0,E*50\r\n", "$GPVTG,217.5,T,208.8,M,000.00,N,000.01,K*4C\r\n" }; int it; nmeaINFO info; nmeaPARSER parser; nmeaPOS dpos; nmea_zero_INFO(&info); nmea_parser_init(&parser); for (it = 0; it < 6; it++) { nmea_parse(&parser, buff[it], (int) strlen(buff[it]), &info); nmea_info2pos(&info, &dpos); printf("%03d, Lat: %f, Lon: %f, Sig: %d, Fix: %d\n", it, dpos.lat, dpos.lon, info.sig, info.fix); } nmea_parser_destroy(&parser); return 0; } olsrd-0.6.6.2/lib/pud/nmealib/samples/parse_file/000077500000000000000000000000001234304727700215415ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/nmealib/samples/parse_file/gpslog.txt000066400000000000000000000325541234304727700236060ustar00rootroot00000000000000$PSRFTXTVersion GSW3.2.1PAT_3.1.00.12-SDK001P1.00c *3F $PSRFTXTHTC GPS_ART_321000_GEN*20 $PSRFTXTTOW: 258712*32 $PSRFTXTWK: 1412*4F $PSRFTXTPOS: 1518885 -4470072 4274168*24 $PSRFTXTCLK: 94817*02 $PSRFTXTCHNL: 12*5F $PSRFTXTBaud rate: 57600 *51 $GPGGA,213638.949,,,,,0,00,,,M,0.0,M,,0000*5F $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213638.949,V,,,,,,,010207,,,N*40 $GPGGA,213639.897,,,,,0,00,,,M,0.0,M,,0000*5C $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213639.897,V,,,,,,,010207,,,N*43 $GPGGA,213640.886,,,,,0,00,,,M,0.0,M,,0000*52 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213640.886,V,,,,,,,010207,,,N*4D $GPGGA,213641.886,,,,,0,00,,,M,0.0,M,,0000*53 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213641.886,V,,,,,,,010207,,,N*4C $GPGGA,213642.897,,,,,0,00,,,M,0.0,M,,0000*50 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,20,00,000,,10,00,000,,25,00,000,,27,00,000,*79 $GPGSV,3,2,12,22,00,000,,07,00,000,,21,00,000,,24,00,000,*79 $GPGSV,3,3,12,16,00,000,,28,00,000,,26,00,000,,29,00,000,*78 $GPRMC,213642.897,V,,,,,,,010207,,,N*4F $GPGGA,213643.886,,,,,0,00,,,M,0.0,M,,0000*51 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213643.886,V,,,,,,,010207,,,N*4E $GPGGA,213644.886,,,,,0,00,,,M,0.0,M,,0000*56 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213644.886,V,,,,,,,010207,,,N*49 $GPGGA,213645.897,,,,,0,00,,,M,0.0,M,,0000*57 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213645.897,V,,,,,,,010207,,,N*48 $GPGGA,213646.886,,,,,0,00,,,M,0.0,M,,0000*54 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213646.886,V,,,,,,,010207,,,N*4B $GPGGA,213647.886,,,,,0,00,,,M,0.0,M,,0000*55 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,20,00,000,,10,00,000,,25,00,000,,27,00,000,*79 $GPGSV,3,2,12,22,00,000,,07,00,000,,21,00,000,,24,00,000,*79 $GPGSV,3,3,12,16,00,000,,28,00,000,,26,00,000,,29,00,000,*78 $GPRMC,213647.886,V,,,,,,,010207,,,N*4A $GPGGA,213648.897,,,,,0,00,,,M,0.0,M,,0000*5A $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213648.897,V,,,,,,,010207,,,N*45 $GPGGA,213649.886,,,,,0,00,,,M,0.0,M,,0000*5B $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213649.886,V,,,,,,,010207,,,N*44 $GPGGA,213650.886,,,,,0,00,,,M,0.0,M,,0000*53 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213650.886,V,,,,,,,010207,,,N*4C $GPGGA,213651.897,,,,,0,00,,,M,0.0,M,,0000*52 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213651.897,V,,,,,,,010207,,,N*4D $GPGGA,213652.886,,,,,0,00,,,M,0.0,M,,0000*51 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,20,00,000,,10,00,000,,25,00,000,,27,00,000,*79 $GPGSV,3,2,12,22,00,000,,07,00,000,,21,00,000,,24,00,000,*79 $GPGSV,3,3,12,16,00,000,,28,00,000,,26,00,000,,29,00,000,*78 $GPRMC,213652.886,V,,,,,,,010207,,,N*4E $GPGGA,213653.886,,,,,0,00,,,M,0.0,M,,0000*50 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213653.886,V,,,,,,,010207,,,N*4F $GPGGA,213654.898,,,,,0,00,,,M,0.0,M,,0000*58 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213654.898,V,,,,,,,010207,,,N*47 $GPGGA,213655.886,,,,,0,00,,,M,0.0,M,,0000*56 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213655.886,V,,,,,,,010207,,,N*49 $GPGGA,213656.886,,,,,0,00,,,M,0.0,M,,0000*55 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213656.886,V,,,,,,,010207,,,N*4A $GPGGA,213657.897,,,,,0,00,,,M,0.0,M,,0000*54 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,20,00,000,,10,00,000,,25,00,000,,27,00,000,*79 $GPGSV,3,2,12,22,00,000,,07,00,000,,21,00,000,,24,00,000,*79 $GPGSV,3,3,12,16,00,000,,28,00,000,,26,00,000,,29,00,000,*78 $GPRMC,213657.897,V,,,,,,,010207,,,N*4B $GPGGA,213658.886,,,,,0,00,,,M,0.0,M,,0000*5B $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213658.886,V,,,,,,,010207,,,N*44 $GPGGA,213659.886,,,,,0,00,,,M,0.0,M,,0000*5A $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213659.886,V,,,,,,,010207,,,N*45 $GPGGA,213700.880,,,,,0,00,,,M,0.0,M,,0000*51 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213700.880,V,,,,,,,010207,,,N*4E $GPGGA,213701.880,,,,,0,00,,,M,0.0,M,,0000*50 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213701.880,V,,,,,,,010207,,,N*4F $GPGGA,213702.880,,,,,0,00,,,M,0.0,M,,0000*53 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,24,83,052,,29,63,170,,26,55,179,,10,46,055,*70 $GPGSV,3,2,10,06,41,282,,02,23,120,,21,21,303,,08,16,068,*73 $GPGSV,3,3,10,27,10,042,,18,08,257,*7B $GPRMC,213702.880,V,,,,,,,010207,,,N*4C $GPGGA,213703.880,,,,,0,00,,,M,0.0,M,,0000*52 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213703.880,V,,,,,,,010207,,,N*4D $GPGGA,213704.880,,,,,0,00,,,M,0.0,M,,0000*55 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213704.880,V,,,,,,,010207,,,N*4A $GPGGA,213705.879,,,,,0,00,,,M,0.0,M,,0000*52 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213705.879,V,,,,,,,010207,,,N*4D $GPGGA,213706.879,,,,,0,00,,,M,0.0,M,,0000*51 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213706.879,V,,,,,,,010207,,,N*4E $GPGGA,213707.879,,,,,0,00,,,M,0.0,M,,0000*50 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,24,83,052,,29,63,170,,26,55,179,,10,46,055,*70 $GPGSV,3,2,10,06,41,282,,02,23,120,,21,21,303,,08,16,068,*73 $GPGSV,3,3,10,27,10,042,,18,08,257,*7B $GPRMC,213707.879,V,,,,,,,010207,,,N*4F $GPGGA,213708.879,,,,,0,00,,,M,0.0,M,,0000*5F $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213708.879,V,,,,,,,010207,,,N*40 $GPGGA,213709.879,,,,,0,00,,,M,0.0,M,,0000*5E $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213709.879,V,,,,,,,010207,,,N*41 $GPGGA,213710.879,,,,,0,00,,,M,0.0,M,,0000*56 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213710.879,V,,,,,,,010207,,,N*49 $GPGGA,213711.879,,,,,0,00,,,M,0.0,M,,0000*57 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213711.879,V,,,,,,,010207,,,N*48 $GPGGA,213712.879,,,,,0,00,,,M,0.0,M,,0000*54 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,24,83,052,,29,63,170,,26,55,179,,10,46,055,*70 $GPGSV,3,2,10,06,41,282,,02,23,120,,21,21,303,,08,16,068,*73 $GPGSV,3,3,10,27,10,042,,18,08,257,*7B $GPRMC,213712.879,V,,,,,,,010207,,,N*4B $GPGGA,213713.879,,,,,0,00,,,M,0.0,M,,0000*55 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213713.879,V,,,,,,,010207,,,N*4A $GPGGA,213714.879,,,,,0,00,,,M,0.0,M,,0000*52 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213714.879,V,,,,,,,010207,,,N*4D $GPGGA,213715.879,,,,,0,00,,,M,0.0,M,,0000*53 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213715.879,V,,,,,,,010207,,,N*4C $GPGGA,213716.879,,,,,0,00,,,M,0.0,M,,0000*50 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213716.879,V,,,,,,,010207,,,N*4F $GPGGA,213717.879,,,,,0,00,,,M,0.0,M,,0000*51 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,24,83,052,,29,63,170,,26,55,179,25,10,46,055,*77 $GPGSV,3,2,10,06,41,282,35,02,23,120,,21,21,303,,08,16,068,*75 $GPGSV,3,3,10,27,10,042,,18,08,257,*7B $GPRMC,213717.879,V,,,,,,,010207,,,N*4E $GPGGA,213718.879,,,,,0,00,,,M,0.0,M,,0000*5E $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213718.879,V,,,,,,,010207,,,N*41 $GPGGA,213719.879,,,,,0,00,,,M,0.0,M,,0000*5F $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213719.879,V,,,,,,,010207,,,N*40 $GPGGA,213720.879,,,,,0,00,,,M,0.0,M,,0000*55 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213720.879,V,,,,,,,010207,,,N*4A $GPGGA,213721.879,,,,,0,00,,,M,0.0,M,,0000*54 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213721.879,V,,,,,,,010207,,,N*4B $GPGGA,213722.879,,,,,0,00,,,M,0.0,M,,0000*57 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,24,83,052,,29,63,170,,26,55,179,31,10,46,055,*72 $GPGSV,3,2,10,06,41,282,34,02,23,120,,21,21,303,,08,16,068,*74 $GPGSV,3,3,10,27,10,042,,18,08,257,*7B $GPRMC,213722.879,V,,,,,,,010207,,,N*48 $GPGGA,213723.990,,,,,0,00,,,M,0.0,M,,0000*50 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213723.990,V,,,,,,,010207,,,N*4F $GPGGA,213724.990,,,,,0,00,,,M,0.0,M,,0000*57 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213724.990,V,,,,,,,010207,,,N*48 $GPGGA,213725.990,,,,,0,00,,,M,0.0,M,,0000*56 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213725.990,V,,,,,,,010207,,,N*49 $GPGGA,213726.990,,,,,0,00,,,M,0.0,M,,0000*55 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213726.990,V,,,,,,,010207,,,N*4A $GPGGA,213727.990,,,,,0,00,,,M,0.0,M,,0000*54 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,24,83,052,,29,63,170,,26,55,179,30,10,46,055,*73 $GPGSV,3,2,10,06,41,282,34,02,23,120,,21,21,303,,08,16,068,*74 $GPGSV,3,3,10,27,10,042,,18,08,257,*7B $GPRMC,213727.990,V,,,,,,,010207,,,N*4B $GPGGA,213728.990,,,,,0,00,,,M,0.0,M,,0000*5B $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213728.990,V,,,,,,,010207,,,N*44 $GPGGA,213729.990,,,,,0,00,,,M,0.0,M,,0000*5A $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213729.990,V,,,,,,,010207,,,N*45 $GPGGA,213730.990,,,,,0,00,,,M,0.0,M,,0000*52 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213730.990,V,,,,,,,010207,,,N*4D $GPGGA,213731.990,,,,,0,00,,,M,0.0,M,,0000*53 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213731.990,V,,,,,,,010207,,,N*4C $GPGGA,213732.990,,,,,0,00,,,M,0.0,M,,0000*50 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,24,83,052,,29,63,170,,26,55,179,27,10,46,055,*75 $GPGSV,3,2,10,06,41,282,35,02,23,120,,21,21,303,,08,16,068,*75 $GPGSV,3,3,10,27,10,042,,18,08,257,*7B $GPRMC,213732.990,V,,,,,,,010207,,,N*4F $GPGGA,213733.990,,,,,0,00,,,M,0.0,M,,0000*51 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213733.990,V,,,,,,,010207,,,N*4E $GPGGA,213734.990,,,,,0,00,,,M,0.0,M,,0000*56 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213734.990,V,,,,,,,010207,,,N*49 $GPGGA,213735.990,,,,,0,00,,,M,0.0,M,,0000*57 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213735.990,V,,,,,,,010207,,,N*48 $GPGGA,213736.990,,,,,0,00,,,M,0.0,M,,0000*54 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213736.990,V,,,,,,,010207,,,N*4B $GPGGA,213737.990,,,,,0,00,,,M,0.0,M,,0000*55 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,24,83,052,,29,63,170,,26,55,179,28,10,46,055,*7A $GPGSV,3,2,10,06,41,282,34,02,23,120,,21,21,303,,08,16,068,*74 $GPGSV,3,3,10,27,10,042,,18,08,257,*7B $GPRMC,213737.990,V,,,,,,,010207,,,N*4A $GPGGA,213738.990,,,,,0,00,,,M,0.0,M,,0000*5A $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213738.990,V,,,,,,,010207,,,N*45 $GPGGA,213739.990,,,,,0,00,,,M,0.0,M,,0000*5B $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213739.990,V,,,,,,,010207,,,N*44 $GPGGA,213740.990,,,,,0,00,,,M,0.0,M,,0000*55 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213740.990,V,,,,,,,010207,,,N*4A $GPGGA,213741.990,,,,,0,00,,,M,0.0,M,,0000*54 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213741.990,V,,,,,,,010207,,,N*4B $GPGGA,213742.990,,,,,0,00,,,M,0.0,M,,0000*57 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,24,83,052,,29,63,170,,26,55,179,28,10,46,055,*7A $GPGSV,3,2,10,06,41,282,34,02,23,120,,21,21,303,,08,16,068,*74 $GPGSV,3,3,10,27,10,042,,18,08,257,*7B $GPRMC,213742.990,V,,,,,,,010207,,,N*48 $GPGGA,213743.990,,,,,0,00,,,M,0.0,M,,0000*56 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213743.990,V,,,,,,,010207,,,N*49 $GPGGA,213744.990,,,,,0,00,,,M,0.0,M,,0000*51 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213744.990,V,,,,,,,010207,,,N*4E $GPGGA,213745.990,,,,,0,00,,,M,0.0,M,,0000*50 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213745.990,V,,,,,,,010207,,,N*4F $GPGGA,213746.990,,,,,0,00,,,M,0.0,M,,0000*53 $PSRFTXTVersion GSW3.2.1PAT_3.1.00.12-SDK001P1.00c *3F $PSRFTXTHTC GPS_ART_321000_GEN*20 $PSRFTXTTOW: 423546*3B $PSRFTXTWK: 1412*4F $PSRFTXTPOS: 1533096 -4464909 4274442*2A $PSRFTXTCLK: 94810*05 $PSRFTXTCHNL: 12*5F $PSRFTXTBaud rate: 57600 *51 $GPGGA,213912.270,,,,,0,00,,,M,0.0,M,,0000*59 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213912.270,V,,,,,,,010207,,,N*46 $GPGGA,213913.211,,,,,0,00,,,M,0.0,M,,0000*5F $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213913.211,V,,,,,,,010207,,,N*40 $GPGGA,213914.200,,,,,0,00,,,M,0.0,M,,0000*58 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213914.200,V,,,,,,,010207,,,N*47 $GPGGA,213915.196,,,,,0,00,,,M,0.0,M,,0000*55 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,213915.196,V,,,,,,,010207,,,N*4A $GPGGA,213916.199,4221.0377,N,07102.9778,W,1,03,13.4,-32.4,M,-33.7,M,,0000*45 $GPGSA,A,2,26,07,06,,,,,,,,,,13.4,13.4,1.0*37 $GPGSV,3,1,11,26,55,180,28,06,46,258,33,07,43,272,30,21,22,304,*77 $GPGSV,3,2,11,24,83,061,,29,64,170,,10,45,056,,02,23,121,*7F $GPGSV,3,3,11,08,17,067,,27,10,041,,18,05,257,*4B $GPRMC,213916.199,A,4221.0377,N,07102.9778,W,0.00,,010207,,,A*6A $GPGGA,213917.199,4221.0510,N,07102.9549,W,1,04,3.9,-65.2,M,-33.7,M,,0000*7C $GPGSA,A,3,26,07,06,21,,,,,,,,,4.1,3.9,1.0*3A $GPRMC,213917.199,A,4221.0510,N,07102.9549,W,0.23,175.43,010207,,,A*77 $GPGGA,213918.199,4221.0853,N,07102.9382,W,1,04,3.9,50.0,M,-33.7,M,,0000*51 $GPGSA,A,3,26,07,06,21,,,,,,,,,4.1,3.9,1.0*3A $GPRMC,213918.199,A,4221.0853,N,07102.9382,W,0.95,326.55,010207,,,A*7D $GPGGA,213919.000,4221.0975,N,07102.9300,W,1,04,3.9,86.2,M,-33.7,M,,0000*57 $GPGSA,A,3,26,07,06,21,,,,,,,,,4.1,3.9,1.0*3A $GPRMC,213919.000,A,4221.0975,N,07102.9300,W,0.55,332.53,010207,,,A*7D $GPGGA,213920.000,4221.1129,N,07102.9146,W,1,04,3.9,129.7,M,-33.7,M,,0000*6C $GPGSA,A,3,26,07,06,21,,,,,,,,,4.1,3.9,1.0*3A $GPRMC,213920.000,A,4221.1129,N,07102.9146,W,0.00,,010207,,,A*6D $GPGGA,213921.000,4221.1129,N,07102.9146,W,1,04,3.9,129.7,M,-33.7,M,,0000*6D $GPGSA,A,3,26,07,06,21,,,,,,,,,4.1,3.9,1.0*3A $GPGSV,3,1,11,26,55,180,29,06,46,258,26,07,43,272,33,21,22,304,26*75 $GPGSV,3,2,11,24,83,061,,29,64,170,,10,45,056,,02,23,121,*7F $GPGSV,3,3,11,08,17,067,28,27,10,041,,18,05,257,*41 $GPRMC,213921.000,A,4221.1129,N,07102.9146,W,0.00,,010207,,,A*6C $GPGGA,213922.000,4221.1129,N,07102.9146,W,1,04,3.9,129.7,M,-33.7,M,,0000*6E $GPGSA,A,3,26,07,06,21,,,,,,,,,4.1,3.9,1.0*3A $GPRMC,213922.000,A,4221.1129,N,07102.9146,W,0.00,,010207,,,A*6F $GPGGA,213923.000,4221.1129,N,07102.9146,W,1,04,3.9,129.7,M,-33.7,M,,0000*6F $GPGSA,A,3,26,07,06,21,,,,,,,,,4.1,3.9,1.0*3A $GPRMC,213923.000,A,4221.1129,N,07102.9146,W,0.00,,010207,,,A*6E $GPGGA,213924.000,4221.1129,N,07102.9146,W,1,04,3.9,129.7,M,-33.7,M,,0000*68 $GPGSA,A,3,26,07,06,21,,,,,,,,,4.0,3.9,1.0*3B $GPRMC,213924.000,A,4221.1129,N,07102.9146,W,0.00,,010207,,,A*69 $GPGGA,213925.000,4221.1129,N,07102.9146,W,1,04,3.9,129.7,M,-33.7,M,,0000*69 $GPGSA,A,3,26,07,06,21,,,,,,,,,4.0,3.9,1.0*3B $GPRMC,213925.000,A,4221.1129,N,07102.9146,W,0.00,,010207,,,A*68 $GPGGA,213926.000,4221.1112,N,07102.9177,W,1,04,3.9,136.5,M,-33.7,M,,0000*6C olsrd-0.6.6.2/lib/pud/nmealib/samples/parse_file/main.c000066400000000000000000000046521234304727700226400ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include static const char * traceStr = "Trace: "; static const char * errorStr = "Error: "; static const char * eol = "\n"; static void trace(const char *str, int str_size) { write(1, traceStr, strlen(traceStr)); write(1, str, str_size); write(1, eol, strlen(eol)); } static void error(const char *str, int str_size) { write(1, errorStr, strlen(errorStr)); write(1, str, str_size); write(1, eol, strlen(eol)); } int main(int argc __attribute__((unused)), char *argv[] __attribute__((unused))) { char fn[2048]; const char * filename = &fn[0]; const char * deffile; const char * dn; nmeaINFO info; nmeaPARSER parser; FILE *file; char buff[2048]; int size, it = 0; nmeaPOS dpos; if (argc <= 1) { dn = dirname(argv[0]); deffile="/../../samples/parse_file/gpslog.txt"; } else { dn=""; deffile = argv[1]; } snprintf(&fn[0], sizeof(fn),"%s%s", dn, deffile); printf("Using file %s\n", filename); file = fopen(filename, "rb"); if (!file) { printf("Could not open file %s\n", filename); return -1; } nmea_context_set_trace_func(&trace); nmea_context_set_error_func(&error); nmea_zero_INFO(&info); nmea_parser_init(&parser); while (!feof(file)) { size = (int) fread(&buff[0], 1, 100, file); nmea_parse(&parser, &buff[0], size, &info); nmea_info2pos(&info, &dpos); printf("*** %03d, Lat: %f, Lon: %f, Sig: %d, Fix: %d\n", it++, dpos.lat, dpos.lon, info.sig, info.fix); } fseek(file, 0, SEEK_SET); /* } */ nmea_parser_destroy(&parser); fclose(file); return 0; } olsrd-0.6.6.2/lib/pud/nmealib/src/000077500000000000000000000000001234304727700165535ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/nmealib/src/context.c000066400000000000000000000063661234304727700204160ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include /** * The structure with nmealib context. */ typedef struct _nmeaPROPERTY { nmeaTraceFunc trace_func; /**< the tracing function, defaults to NULL (disabled) */ nmeaErrorFunc error_func; /**< the error function, defaults to NULL (disabled) */ int parse_buff_size; /**< the size to use for temporary buffers, minimum is NMEA_MIN_PARSEBUFF */ } nmeaPROPERTY; /** the nmealib context */ static nmeaPROPERTY property = { .trace_func = NULL, .error_func = NULL, .parse_buff_size = NMEA_DEF_PARSEBUFF }; /** * Set the trace function * * @param func the trace function */ void nmea_context_set_trace_func(nmeaTraceFunc func) { property.trace_func = func; } /** * Set the error function * * @param func the error function */ void nmea_context_set_error_func(nmeaErrorFunc func) { property.error_func = func; } /** * Set the buffer size for temporary buffers. * If the size is less than NMEA_MIN_PARSEBUFF, then the size that is * configured will be NMEA_MIN_PARSEBUFF. * * @param buff_size the buffer size for temporary buffers */ void nmea_context_set_buffer_size(int buff_size) { if (buff_size < NMEA_MIN_PARSEBUFF) property.parse_buff_size = NMEA_MIN_PARSEBUFF; else property.parse_buff_size = buff_size; } /** * @return the buffer size for temporary buffers */ int nmea_context_get_buffer_size(void) { return property.parse_buff_size; } /** * Trace a formatted string * * @param str a formatted string */ void nmea_trace(const char *str, ...) { nmeaTraceFunc func = property.trace_func; if (func) { int size; va_list arg_list; char buff[property.parse_buff_size]; va_start(arg_list, str); size = vsnprintf(&buff[0], property.parse_buff_size - 1, str, arg_list); va_end(arg_list); if (size > 0) (*func)(&buff[0], size); } } /** * Trace a buffer * * @param buff a pointer to the buffer * @param buff_size the size of the buffer */ void nmea_trace_buff(const char *buff, int buff_size) { nmeaTraceFunc func = property.trace_func; if (func && buff_size) (*func)(buff, buff_size); } /** * Log a formatted error string * * @param str a formatted error string */ void nmea_error(const char *str, ...) { nmeaErrorFunc func = property.error_func; if (func) { int size; va_list arg_list; char buff[property.parse_buff_size]; va_start(arg_list, str); size = vsnprintf(&buff[0], property.parse_buff_size - 1, str, arg_list); va_end(arg_list); if (size > 0) (*func)(&buff[0], size); } } olsrd-0.6.6.2/lib/pud/nmealib/src/conversions.c000066400000000000000000000312151234304727700212710ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include /** * Determine the number of GSV sentences needed for a number of sats * * @param sats the number of sats * @return the number of GSV sentences needed */ int nmea_gsv_npack(int sats) { int pack_count = sats / NMEA_SATINPACK; if ((sats % NMEA_SATINPACK) > 0) pack_count++; if (!pack_count) pack_count++; return pack_count; } /** * Fill nmeaINFO structure from GGA packet structure * * @param pack a pointer to the packet structure * @param info a pointer to the nmeaINFO structure */ void nmea_GPGGA2info(const nmeaGPGGA *pack, nmeaINFO *info) { assert(pack); assert(info); info->present |= pack->present; nmea_INFO_set_present(&info->present, SMASK); info->smask |= GPGGA; if (nmea_INFO_is_present(pack->present, UTCTIME)) { info->utc.hour = pack->utc.hour; info->utc.min = pack->utc.min; info->utc.sec = pack->utc.sec; info->utc.hsec = pack->utc.hsec; } if (nmea_INFO_is_present(pack->present, LAT)) { info->lat = ((pack->ns == 'N') ? pack->lat : -pack->lat); } if (nmea_INFO_is_present(pack->present, LON)) { info->lon = ((pack->ew == 'E') ? pack->lon : -pack->lon); } if (nmea_INFO_is_present(pack->present, SIG)) { info->sig = pack->sig; } if (nmea_INFO_is_present(pack->present, SATINUSECOUNT)) { info->satinfo.inuse = pack->satinuse; } if (nmea_INFO_is_present(pack->present, HDOP)) { info->HDOP = pack->HDOP; } if (nmea_INFO_is_present(pack->present, ELV)) { info->elv = pack->elv; } /* ignore diff and diff_units */ /* ignore dgps_age and dgps_sid */ } /** * Convert an nmeaINFO structure into an nmeaGPGGA structure * * @param info a pointer to the nmeaINFO structure * @param pack a pointer to the nmeaGPGGA structure */ void nmea_info2GPGGA(const nmeaINFO *info, nmeaGPGGA *pack) { assert(pack); assert(info); nmea_zero_GPGGA(pack); pack->present = info->present; nmea_INFO_unset_present(&pack->present, SMASK); if (nmea_INFO_is_present(info->present, UTCTIME)) { pack->utc.hour = info->utc.hour; pack->utc.min = info->utc.min; pack->utc.sec = info->utc.sec; pack->utc.hsec = info->utc.hsec; } if (nmea_INFO_is_present(info->present, LAT)) { pack->lat = fabs(info->lat); pack->ns = ((info->lat > 0) ? 'N' : 'S'); } if (nmea_INFO_is_present(info->present, LON)) { pack->lon = fabs(info->lon); pack->ew = ((info->lon > 0) ? 'E' : 'W'); } if (nmea_INFO_is_present(info->present, SIG)) { pack->sig = info->sig; } if (nmea_INFO_is_present(info->present, SATINUSECOUNT)) { pack->satinuse = info->satinfo.inuse; } if (nmea_INFO_is_present(info->present, HDOP)) { pack->HDOP = info->HDOP; } if (nmea_INFO_is_present(info->present, ELV)) { pack->elv = info->elv; pack->elv_units = 'M'; } /* defaults for (ignored) diff and diff_units */ pack->diff = 0; pack->diff_units = 'M'; /* defaults for (ignored) dgps_age and dgps_sid */ pack->dgps_age = 0; pack->dgps_sid = 0; } /** * Fill nmeaINFO structure from GSA packet structure * * @param pack a pointer to the packet structure * @param info a pointer to the nmeaINFO structure */ void nmea_GPGSA2info(const nmeaGPGSA *pack, nmeaINFO *info) { int i = 0; assert(pack); assert(info); info->present |= pack->present; nmea_INFO_set_present(&info->present, SMASK); info->smask |= GPGSA; if (nmea_INFO_is_present(pack->present, FIX)) { /* fix_mode is ignored */ info->fix = pack->fix_type; } if (nmea_INFO_is_present(pack->present, SATINUSE)) { assert(sizeof(info->satinfo.in_use) == sizeof(info->satinfo.in_use)); info->satinfo.inuse = 0; for (i = 0; i < NMEA_MAXSAT; i++) { info->satinfo.in_use[i] = pack->sat_prn[i]; if (pack->sat_prn[i]) { info->satinfo.inuse++; } } nmea_INFO_set_present(&info->present, SATINUSECOUNT); } if (nmea_INFO_is_present(pack->present, PDOP)) { info->PDOP = pack->PDOP; } if (nmea_INFO_is_present(pack->present, HDOP)) { info->HDOP = pack->HDOP; } if (nmea_INFO_is_present(pack->present, VDOP)) { info->VDOP = pack->VDOP; } } /** * Convert an nmeaINFO structure into an nmeaGPGSA structure * * @param info a pointer to the nmeaINFO structure * @param pack a pointer to the nmeaGPGSA structure */ void nmea_info2GPGSA(const nmeaINFO *info, nmeaGPGSA *pack) { assert(pack); assert(info); nmea_zero_GPGSA(pack); pack->present = info->present; nmea_INFO_unset_present(&pack->present, SMASK); if (nmea_INFO_is_present(info->present, FIX)) { pack->fix_mode = 'A'; pack->fix_type = info->fix; } if (nmea_INFO_is_present(info->present, SATINUSE)) { memcpy(pack->sat_prn, info->satinfo.in_use, sizeof(pack->sat_prn)); } if (nmea_INFO_is_present(info->present, PDOP)) { pack->PDOP = info->PDOP; } if (nmea_INFO_is_present(info->present, HDOP)) { pack->HDOP = info->HDOP; } if (nmea_INFO_is_present(info->present, VDOP)) { pack->VDOP = info->VDOP; } } /** * Fill nmeaINFO structure from GSV packet structure * * @param pack a pointer to the packet structure * @param info a pointer to the nmeaINFO structure */ void nmea_GPGSV2info(const nmeaGPGSV *pack, nmeaINFO *info) { int pack_index; assert(pack); assert(info); pack_index = pack->pack_index; if (pack_index < 1) pack_index = 1; if (pack_index > pack->pack_count) pack_index = pack->pack_count; if ((pack_index * NMEA_SATINPACK) > NMEA_MAXSAT) pack_index = NMEA_NSATPACKS; info->present |= pack->present; nmea_INFO_set_present(&info->present, SMASK); info->smask |= GPGSV; if (nmea_INFO_is_present(pack->present, SATINVIEW)) { int sat_index; /* index of 1st sat in pack */ int sat_offset = (pack_index - 1) * NMEA_SATINPACK; /* the number of sats in this sentence */ int sat_count = ((sat_offset + NMEA_SATINPACK) > pack->sat_count) ? (pack->sat_count - sat_offset) : NMEA_SATINPACK; for (sat_index = 0; sat_index < sat_count; sat_index++) { info->satinfo.sat[sat_offset + sat_index].id = pack->sat_data[sat_index].id; info->satinfo.sat[sat_offset + sat_index].elv = pack->sat_data[sat_index].elv; info->satinfo.sat[sat_offset + sat_index].azimuth = pack->sat_data[sat_index].azimuth; info->satinfo.sat[sat_offset + sat_index].sig = pack->sat_data[sat_index].sig; } info->satinfo.inview = pack->sat_count; } } /** * Convert an nmeaINFO structure into an nmeaGPGSV structure * * @param info a pointer to the nmeaINFO structure * @param pack a pointer to the nmeaGPGSV structure * @param pack_idx pack index (zero based) */ void nmea_info2GPGSV(const nmeaINFO *info, nmeaGPGSV *pack, int pack_idx) { assert(pack); assert(info); nmea_zero_GPGSV(pack); pack->present = info->present; nmea_INFO_unset_present(&pack->present, SMASK); if (nmea_INFO_is_present(info->present, SATINVIEW)) { int sit; int pit; int toskip; pack->sat_count = (info->satinfo.inview < NMEA_MAXSAT) ? info->satinfo.inview : NMEA_MAXSAT; pack->pack_count = nmea_gsv_npack(pack->sat_count); if (pack_idx >= pack->pack_count) pack->pack_index = pack->pack_count; else pack->pack_index = pack_idx + 1; /* now skip the first ((pack->pack_index - 1) * NMEA_SATINPACK) in view sats */ toskip = ((pack->pack_index - 1) * NMEA_SATINPACK); sit = 0; while ((toskip > 0) && (sit < NMEA_MAXSAT)) { if (info->satinfo.sat[sit].id) { toskip--; } sit++; } for (pit = 0; pit < NMEA_SATINPACK; sit++) { if (sit < NMEA_MAXSAT) { if (info->satinfo.sat[sit].id) { pack->sat_data[pit] = info->satinfo.sat[sit]; pit++; } } else { memset(&pack->sat_data[pit], 0, sizeof(pack->sat_data[pit])); pit++; } } } } /** * Fill nmeaINFO structure from RMC packet structure * * @param pack a pointer to the packet structure * @param info a pointer to the nmeaINFO structure */ void nmea_GPRMC2info(const nmeaGPRMC *pack, nmeaINFO *info) { assert(pack); assert(info); info->present |= pack->present; nmea_INFO_set_present(&info->present, SMASK); info->smask |= GPRMC; if (nmea_INFO_is_present(pack->present, UTCDATE)) { info->utc.year = pack->utc.year; info->utc.mon = pack->utc.mon; info->utc.day = pack->utc.day; } if (nmea_INFO_is_present(pack->present, UTCTIME)) { info->utc.hour = pack->utc.hour; info->utc.min = pack->utc.min; info->utc.sec = pack->utc.sec; info->utc.hsec = pack->utc.hsec; } nmea_INFO_set_present(&info->present, SIG); nmea_INFO_set_present(&info->present, FIX); if (pack->status == 'A') { if (info->sig == NMEA_SIG_BAD) { info->sig = NMEA_SIG_MID; } if (info->fix == NMEA_FIX_BAD) { info->fix = NMEA_FIX_2D; } } else { info->sig = NMEA_SIG_BAD; info->fix = NMEA_FIX_BAD; } if (nmea_INFO_is_present(pack->present, LAT)) { info->lat = ((pack->ns == 'N') ? pack->lat : -pack->lat); } if (nmea_INFO_is_present(pack->present, LON)) { info->lon = ((pack->ew == 'E') ? pack->lon : -pack->lon); } if (nmea_INFO_is_present(pack->present, SPEED)) { info->speed = pack->speed * NMEA_TUD_KNOTS; } if (nmea_INFO_is_present(pack->present, TRACK)) { info->track = pack->track; } if (nmea_INFO_is_present(pack->present, MAGVAR)) { info->magvar = ((pack->magvar_ew == 'E') ? pack->magvar : -pack->magvar); } /* mode is ignored */ } /** * Convert an nmeaINFO structure into an nmeaGPRMC structure * * @param info a pointer to the nmeaINFO structure * @param pack a pointer to the nmeaGPRMC structure */ void nmea_info2GPRMC(const nmeaINFO *info, nmeaGPRMC *pack) { assert(pack); assert(info); nmea_zero_GPRMC(pack); pack->present = info->present; nmea_INFO_unset_present(&pack->present, SMASK); if (nmea_INFO_is_present(info->present, UTCDATE)) { pack->utc.year = info->utc.year; pack->utc.mon = info->utc.mon; pack->utc.day = info->utc.day; } if (nmea_INFO_is_present(info->present, UTCTIME)) { pack->utc.hour = info->utc.hour; pack->utc.min = info->utc.min; pack->utc.sec = info->utc.sec; pack->utc.hsec = info->utc.hsec; } if (nmea_INFO_is_present(info->present, SIG)) { pack->status = ((info->sig != NMEA_SIG_BAD) ? 'A' : 'V'); } else { pack->status = 'V'; } if (nmea_INFO_is_present(info->present, LAT)) { pack->lat = fabs(info->lat); pack->ns = ((info->lat > 0) ? 'N' : 'S'); } if (nmea_INFO_is_present(info->present, LON)) { pack->lon = fabs(info->lon); pack->ew = ((info->lon > 0) ? 'E' : 'W'); } if (nmea_INFO_is_present(info->present, SPEED)) { pack->speed = info->speed / NMEA_TUD_KNOTS; } if (nmea_INFO_is_present(info->present, TRACK)) { pack->track = info->track; } if (nmea_INFO_is_present(info->present, MAGVAR)) { pack->magvar = fabs(info->magvar); pack->magvar_ew = ((info->magvar > 0) ? 'E' : 'W'); } if (nmea_INFO_is_present(info->present, SIG)) { pack->mode = ((info->sig != NMEA_SIG_BAD) ? 'A' : 'N'); } else { pack->mode = 'N'; } } /** * Fill nmeaINFO structure from VTG packet structure * * @param pack a pointer to the packet structure * @param info a pointer to the nmeaINFO structure */ void nmea_GPVTG2info(const nmeaGPVTG *pack, nmeaINFO *info) { assert(pack); assert(info); info->present |= pack->present; nmea_INFO_set_present(&info->present, SMASK); info->smask |= GPVTG; if (nmea_INFO_is_present(pack->present, SPEED)) { info->speed = pack->spk; } if (nmea_INFO_is_present(pack->present, TRACK)) { info->track = pack->track; } if (nmea_INFO_is_present(pack->present, MTRACK)) { info->mtrack = pack->mtrack; } } /** * Convert an nmeaINFO structure into an nmeaGPVTG structure * * @param info a pointer to the nmeaINFO structure * @param pack a pointer to the nmeaGPRMC structure */ void nmea_info2GPVTG(const nmeaINFO *info, nmeaGPVTG *pack) { assert(pack); assert(info); nmea_zero_GPVTG(pack); /* also sets up units */ pack->present = info->present; nmea_INFO_unset_present(&pack->present, SMASK); if (nmea_INFO_is_present(info->present, TRACK)) { pack->track = info->track; } if (nmea_INFO_is_present(info->present, MTRACK)) { pack->mtrack = info->mtrack; } if (nmea_INFO_is_present(info->present, SPEED)) { pack->spn = info->speed / NMEA_TUD_KNOTS; pack->spk = info->speed; } } olsrd-0.6.6.2/lib/pud/nmealib/src/generate.c000066400000000000000000000253311234304727700205150ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include /** * Generate a GPGGA sentence from an nmeaGPGGA structure * * @param s a pointer to the buffer to generate the string in * @param len the size of the buffer * @param pack the structure * @return the length of the generated sentence */ int nmea_gen_GPGGA(char *s, const int len, const nmeaGPGGA *pack) { char sTime[16]; char sLat[16]; char sNs[2]; char sLon[16]; char sEw[2]; char sSig[4]; char sSatInUse[4]; char sHdop[16]; char sElv[16]; char sElvUnit[2]; sTime[0] = 0; sLat[0] = 0; sNs[0] = sNs[1] = 0; sLon[0] = 0; sEw[0] = sEw[1] = 0; sSig[0] = 0; sSatInUse[0] = 0; sHdop[0] = 0; sElv[0] = 0; sElvUnit[0] = sElvUnit[1] = 0; if (nmea_INFO_is_present(pack->present, UTCTIME)) { snprintf(&sTime[0], sizeof(sTime), "%02d%02d%02d.%02d", pack->utc.hour, pack->utc.min, pack->utc.sec, pack->utc.hsec); } if (nmea_INFO_is_present(pack->present, LAT)) { snprintf(&sLat[0], sizeof(sLat), "%09.4f", pack->lat); sNs[0] = pack->ns; } if (nmea_INFO_is_present(pack->present, LON)) { snprintf(&sLon[0], sizeof(sLon), "%010.4f", pack->lon); sEw[0] = pack->ew; } if (nmea_INFO_is_present(pack->present, SIG)) { snprintf(&sSig[0], sizeof(sSig), "%1d", pack->sig); } if (nmea_INFO_is_present(pack->present, SATINUSECOUNT)) { snprintf(&sSatInUse[0], sizeof(sSatInUse), "%02d", pack->satinuse); } if (nmea_INFO_is_present(pack->present, HDOP)) { snprintf(&sHdop[0], sizeof(sHdop), "%03.1f", pack->HDOP); } if (nmea_INFO_is_present(pack->present, ELV)) { snprintf(&sElv[0], sizeof(sElv), "%03.1f", pack->elv); sElvUnit[0] = pack->elv_units; } return nmea_printf(s, len, "$GPGGA,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,,,,", &sTime[0], &sLat[0], &sNs[0], &sLon[0], &sEw[0], &sSig[0], &sSatInUse[0], &sHdop[0], &sElv[0], &sElvUnit[0]); } /** * Generate a GPGSA sentence from an nmeaGPGSA structure * * @param s a pointer to the buffer to generate the string in * @param len the size of the buffer * @param pack the structure * @return the length of the generated sentence */ int nmea_gen_GPGSA(char *s, const int len, const nmeaGPGSA *pack) { int i; char sFixMode[2]; char sFixType[2]; char sSatPrn[(NMEA_MAXSAT * 4) + 1]; char sPdop[16]; char sHdop[16]; char sVdop[16]; char * psSatPrn = &sSatPrn[0]; int ssSatPrn = sizeof(sSatPrn) - 1; bool satinuse = nmea_INFO_is_present(pack->present, SATINUSE); sFixMode[0] = sFixMode[1] = 0; sFixType[0] = sFixType[1] = 0; sSatPrn[0] = 0; sPdop[0] = 0; sHdop[0] = 0; sVdop[0] = 0; if (nmea_INFO_is_present(pack->present, FIX)) { sFixMode[0] = pack->fix_mode; snprintf(&sFixType[0], sizeof(sFixType), "%1d", pack->fix_type); } for (i = 0; i < NMEA_MAXSAT; i++) { if (satinuse && pack->sat_prn[i]) { int cnt = snprintf(psSatPrn, ssSatPrn, "%d", pack->sat_prn[i]); if (cnt >= ssSatPrn) { ssSatPrn = 0; psSatPrn = &sSatPrn[sizeof(sSatPrn) - 1]; *psSatPrn = '\0'; break; } else { ssSatPrn -= cnt; psSatPrn += cnt; } } if (i < (NMEA_MAXSAT - 1)) { *psSatPrn = ','; psSatPrn++; ssSatPrn--; *psSatPrn = '\0'; } } if (nmea_INFO_is_present(pack->present, PDOP)) { snprintf(&sPdop[0], sizeof(sPdop), "%03.1f", pack->PDOP); } if (nmea_INFO_is_present(pack->present, HDOP)) { snprintf(&sHdop[0], sizeof(sHdop), "%03.1f", pack->HDOP); } if (nmea_INFO_is_present(pack->present, VDOP)) { snprintf(&sVdop[0], sizeof(sVdop), "%03.1f", pack->VDOP); } return nmea_printf(s, len, "$GPGSA,%s,%s,%s,%s,%s,%s", &sFixMode[0], &sFixType[0], &sSatPrn[0], &sPdop[0], &sHdop[0], &sVdop[0]); } /** * Generate a GPGSV sentence from an nmeaGPGSV structure * * @param s a pointer to the buffer to generate the string in * @param len the size of the buffer * @param pack the structure * @return the length of the generated sentence */ int nmea_gen_GPGSV(char *s, const int len, const nmeaGPGSV *pack) { char sCount[2]; char sIndex[2]; char sSatCount[4]; char sSatInfo[(NMEA_SATINPACK * 4) + 1]; char * psSatInfo = &sSatInfo[0]; int ssSatInfo = sizeof(sSatInfo) - 1; bool satinview = nmea_INFO_is_present(pack->present, SATINVIEW); int i; sCount[0] = 0; sIndex[0] = 0; sSatCount[0] = 0; sSatInfo[0] = 0; if (satinview) { snprintf(&sCount[0], sizeof(sCount), "%1d", pack->pack_count); snprintf(&sIndex[0], sizeof(sIndex), "%1d", pack->pack_index); snprintf(&sSatCount[0], sizeof(sSatCount), "%02d", pack->sat_count); } for (i = 0; i < NMEA_SATINPACK; i++) { int cnt = 0; if (satinview && pack->sat_data[i].id) { cnt = snprintf(psSatInfo, ssSatInfo, "%02d,%02d,%03d,%02d", pack->sat_data[i].id, pack->sat_data[i].elv, pack->sat_data[i].azimuth, pack->sat_data[i].sig); } else { cnt = snprintf(psSatInfo, ssSatInfo, ",,,"); } if (cnt >= ssSatInfo) { ssSatInfo = 0; psSatInfo = &sSatInfo[sizeof(sSatInfo) - 1]; *psSatInfo = '\0'; break; } else { ssSatInfo -= cnt; psSatInfo += cnt; } if (i < (NMEA_SATINPACK - 1)) { *psSatInfo = ','; psSatInfo++; ssSatInfo--; *psSatInfo = '\0'; } } return nmea_printf(s, len, "$GPGSV,%s,%s,%s,%s", &sCount[0], &sIndex[0], &sSatCount[0], &sSatInfo[0]); } /** * Generate a GPRMC sentence from an nmeaGPRMC structure * * @param s a pointer to the buffer to generate the string in * @param len the size of the buffer * @param pack the structure * @return the length of the generated sentence */ int nmea_gen_GPRMC(char *s, const int len, const nmeaGPRMC *pack) { char sTime[16]; char sDate[16]; char sLat[16]; char sNs[2]; char sLon[16]; char sEw[2]; char sSpeed[16]; char sTrack[16]; char sMagvar[16]; char sMagvar_ew[2]; sTime[0] = 0; sDate[0] = 0; sLat[0] = 0; sNs[0] = sNs[1] = 0; sLon[0] = 0; sEw[0] = sEw[1] = 0; sSpeed[0] = 0; sTrack[0] = 0; sMagvar[0] = 0; sMagvar_ew[0] = sMagvar_ew[1] = 0; if (nmea_INFO_is_present(pack->present, UTCDATE)) { snprintf(&sDate[0], sizeof(sDate), "%02d%02d%02d", pack->utc.day, pack->utc.mon + 1, pack->utc.year - 100); } if (nmea_INFO_is_present(pack->present, UTCTIME)) { snprintf(&sTime[0], sizeof(sTime), "%02d%02d%02d.%02d", pack->utc.hour, pack->utc.min, pack->utc.sec, pack->utc.hsec); } if (nmea_INFO_is_present(pack->present, LAT)) { snprintf(&sLat[0], sizeof(sLat), "%09.4f", pack->lat); sNs[0] = pack->ns; } if (nmea_INFO_is_present(pack->present, LON)) { snprintf(&sLon[0], sizeof(sLon), "%010.4f", pack->lon); sEw[0] = pack->ew; } if (nmea_INFO_is_present(pack->present, SPEED)) { snprintf(&sSpeed[0], sizeof(sSpeed), "%03.1f", pack->speed); } if (nmea_INFO_is_present(pack->present, TRACK)) { snprintf(&sTrack[0], sizeof(sTrack), "%03.1f", pack->track); } if (nmea_INFO_is_present(pack->present, MAGVAR)) { snprintf(&sMagvar[0], sizeof(sMagvar), "%03.1f", pack->magvar); sMagvar_ew[0] = pack->magvar_ew; } return nmea_printf(s, len, "$GPRMC,%s,%c,%s,%s,%s,%s,%s,%s,%s,%s,%s,%c", &sTime[0], pack->status, &sLat[0], &sNs[0], &sLon[0], &sEw[0], &sSpeed[0], &sTrack[0], &sDate[0], &sMagvar[0], &sMagvar_ew[0], pack->mode); } /** * Generate a GPVTG sentence from an nmeaGPVTG structure * * @param s a pointer to the buffer to generate the string in * @param len the size of the buffer * @param pack the structure * @return the length of the generated sentence */ int nmea_gen_GPVTG(char *s, const int len, const nmeaGPVTG *pack) { char sTrackT[16]; char sTrackM[16]; char sSpeedN[16]; char sSpeedK[16]; char sUnitT[2]; char sUnitM[2]; char sUnitN[2]; char sUnitK[2]; sTrackT[0] = 0; sTrackM[0] = 0; sSpeedN[0] = 0; sSpeedK[0] = 0; sUnitT[0] = sUnitT[1] = 0; sUnitM[0] = sUnitM[1] = 0; sUnitN[0] = sUnitN[1] = 0; sUnitK[0] = sUnitK[1] = 0; if (nmea_INFO_is_present(pack->present, TRACK)) { snprintf(&sTrackT[0], sizeof(sTrackT), "%03.1f", pack->track); sUnitT[0] = 'T'; } if (nmea_INFO_is_present(pack->present, MTRACK)) { snprintf(&sTrackM[0], sizeof(sTrackM), "%03.1f", pack->mtrack); sUnitM[0] = 'M'; } if (nmea_INFO_is_present(pack->present, SPEED)) { snprintf(&sSpeedN[0], sizeof(sSpeedN), "%03.1f", pack->spn); sUnitN[0] = 'N'; snprintf(&sSpeedK[0], sizeof(sSpeedK), "%03.1f", pack->spk); sUnitK[0] = 'K'; } return nmea_printf(s, len, "$GPVTG,%s,%s,%s,%s,%s,%s,%s,%s", &sTrackT[0], &sUnitT[0], &sTrackM[0], &sUnitM[0], &sSpeedN[0], &sUnitN[0], &sSpeedK[0], &sUnitK[0]); } /** * Generate a number of sentences from an nmeaINFO structure. * * @param s a pointer to the buffer in which to generate the sentences * @param len the size of the buffer * @param info the structure * @param generate_mask the mask of which sentences to generate * @return the total length of the generated sentences */ int nmea_generate(char *s, const int len, const nmeaINFO *info, const int generate_mask) { int gen_count = 0; int pack_mask = generate_mask; if (!s || !len || !info || !generate_mask) return 0; while (pack_mask) { if (pack_mask & GPGGA) { nmeaGPGGA gga; nmea_info2GPGGA(info, &gga); gen_count += nmea_gen_GPGGA(s + gen_count, len - gen_count, &gga); pack_mask &= ~GPGGA; } else if (pack_mask & GPGSA) { nmeaGPGSA gsa; nmea_info2GPGSA(info, &gsa); gen_count += nmea_gen_GPGSA(s + gen_count, len - gen_count, &gsa); pack_mask &= ~GPGSA; } else if (pack_mask & GPGSV) { nmeaGPGSV gsv; int gsv_it; int gsv_count = nmea_gsv_npack(info->satinfo.inview); for (gsv_it = 0; gsv_it < gsv_count && len - gen_count > 0; gsv_it++) { nmea_info2GPGSV(info, &gsv, gsv_it); gen_count += nmea_gen_GPGSV(s + gen_count, len - gen_count, &gsv); } pack_mask &= ~GPGSV; } else if (pack_mask & GPRMC) { nmeaGPRMC rmc; nmea_info2GPRMC(info, &rmc); gen_count += nmea_gen_GPRMC(s + gen_count, len - gen_count, &rmc); pack_mask &= ~GPRMC; } else if (pack_mask & GPVTG) { nmeaGPVTG vtg; nmea_info2GPVTG(info, &vtg); gen_count += nmea_gen_GPVTG(s + gen_count, len - gen_count, &vtg); pack_mask &= ~GPVTG; } else { /* no more known sentences to process */ break; } if (len - gen_count <= 0) break; } return gen_count; } olsrd-0.6.6.2/lib/pud/nmealib/src/generator.c000066400000000000000000000345001234304727700207070ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include /** * Generate a random number in the range [min, max] * * @param min the minimum * @param max the maximum * @return a random number */ static double nmea_random(const double min, const double max) { static double rand_max = RAND_MAX; double rand_val = rand(); double bounds = max - min; return min + (rand_val * bounds) / rand_max; } /** * Initialise the generator * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * (present and smask are preserved, other fields are reset before generation starts) * @return 1 (true) on success, 0 (false) otherwise */ int nmea_gen_init(nmeaGENERATOR *gen, nmeaINFO *info) { int retval = 1; int present = info->present; int smask = info->smask; nmeaGENERATOR *igen = gen; nmea_zero_INFO(info); info->present = present; info->smask = smask; nmea_INFO_set_present(&info->present, SMASK); info->lat = NMEA_DEF_LAT; info->lon = NMEA_DEF_LON; nmea_INFO_set_present(&info->present, LAT); nmea_INFO_set_present(&info->present, LON); while (retval && igen) { if (igen->init_call) retval = (*igen->init_call)(igen, info); igen = igen->next; } return retval; } /** * Loop the generator. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ int nmea_gen_loop(nmeaGENERATOR *gen, nmeaINFO *info) { int retVal = 1; if (gen->loop_call) retVal = (*gen->loop_call)(gen, info); if (retVal && gen->next) retVal = nmea_gen_loop(gen->next, info); return retVal; } /** * Reset the generator. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ int nmea_gen_reset(nmeaGENERATOR *gen, nmeaINFO *info) { int RetVal = 1; if (gen->reset_call) RetVal = (*gen->reset_call)(gen, info); return RetVal; } /** * Destroy the generator. * * @param gen a pointer to the generator */ void nmea_gen_destroy(nmeaGENERATOR *gen) { if (gen->next) { nmea_gen_destroy(gen->next); gen->next = 0; } if (gen->destroy_call) (*gen->destroy_call)(gen); free(gen); } /** * Add a generator to the existing ones. * * @param to the generators to add to * @param gen the generator to add */ void nmea_gen_add(nmeaGENERATOR *to, nmeaGENERATOR *gen) { nmeaGENERATOR * next = to; while (next->next) next = to->next; next->next = gen; } /** * Run a new generation loop on the generator * * @param s a pointer to the string buffer in which to generate * @param len the size of the buffer * @param info a pointer to an nmeaINFO structure to use during generation * @param gen a pointer to the generator * @param generate_mask the smask of sentences to generate * @return the total length of the generated sentences */ int nmea_generate_from(char *s, int len, nmeaINFO *info, nmeaGENERATOR *gen, int generate_mask) { int retval; if ((retval = nmea_gen_loop(gen, info))) retval = nmea_generate(s, len, info, generate_mask); return retval; } /* * NOISE generator */ /** * NOISE Generator loop function. * Does not touch smask and utc in info. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ static int nmea_igen_noise_loop(nmeaGENERATOR *gen __attribute__ ((unused)), nmeaINFO *info) { int it; int in_use; info->sig = lrint(nmea_random(1, 3)); info->fix = lrint(nmea_random(2, 3)); info->PDOP = nmea_random(0, 9); info->HDOP = nmea_random(0, 9); info->VDOP = nmea_random(0, 9); info->lat = nmea_random(0, 100); info->lon = nmea_random(0, 100); info->elv = lrint(nmea_random(-100, 100)); info->speed = nmea_random(0, 100); info->track = nmea_random(0, 360); info->mtrack = nmea_random(0, 360); info->magvar = nmea_random(0, 360); nmea_INFO_set_present(&info->present, SIG); nmea_INFO_set_present(&info->present, FIX); nmea_INFO_set_present(&info->present, PDOP); nmea_INFO_set_present(&info->present, HDOP); nmea_INFO_set_present(&info->present, VDOP); nmea_INFO_set_present(&info->present, LAT); nmea_INFO_set_present(&info->present, LON); nmea_INFO_set_present(&info->present, ELV); nmea_INFO_set_present(&info->present, SPEED); nmea_INFO_set_present(&info->present, TRACK); nmea_INFO_set_present(&info->present, MTRACK); nmea_INFO_set_present(&info->present, MAGVAR); info->satinfo.inuse = 0; info->satinfo.inview = 0; for (it = 0; it < NMEA_MAXSAT; it++) { in_use = lrint(nmea_random(0, 3)); info->satinfo.in_use[it] = in_use ? it : 0; info->satinfo.sat[it].id = it; info->satinfo.sat[it].elv = lrint(nmea_random(0, 90)); info->satinfo.sat[it].azimuth = lrint(nmea_random(0, 359)); info->satinfo.sat[it].sig = (int) (in_use ? nmea_random(40, 99) : nmea_random(0, 40)); if (in_use) info->satinfo.inuse++; if (info->satinfo.sat[it].sig > 0) info->satinfo.inview++; } nmea_INFO_set_present(&info->present, SATINUSECOUNT); nmea_INFO_set_present(&info->present, SATINUSE); nmea_INFO_set_present(&info->present, SATINVIEW); return 1; } /* * STATIC generator */ /** * STATIC Generator loop function. * Only touches utc in info. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ static int nmea_igen_static_loop(nmeaGENERATOR *gen __attribute__ ((unused)), nmeaINFO *info) { nmea_time_now(&info->utc, &info->present); return 1; } /** * STATIC Generator reset function. * Resets only the satinfo to 4 sats in use and in view. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ static int nmea_igen_static_reset(nmeaGENERATOR *gen __attribute__ ((unused)), nmeaINFO *info) { info->satinfo.inuse = 4; info->satinfo.inview = 4; info->satinfo.in_use[0] = 1; info->satinfo.sat[0].id = 1; info->satinfo.sat[0].elv = 50; info->satinfo.sat[0].azimuth = 0; info->satinfo.sat[0].sig = 99; info->satinfo.in_use[1] = 2; info->satinfo.sat[1].id = 2; info->satinfo.sat[1].elv = 50; info->satinfo.sat[1].azimuth = 90; info->satinfo.sat[1].sig = 99; info->satinfo.in_use[2] = 3; info->satinfo.sat[2].id = 3; info->satinfo.sat[2].elv = 50; info->satinfo.sat[2].azimuth = 180; info->satinfo.sat[2].sig = 99; info->satinfo.in_use[3] = 4; info->satinfo.sat[3].id = 4; info->satinfo.sat[3].elv = 50; info->satinfo.sat[3].azimuth = 270; info->satinfo.sat[3].sig = 99; nmea_INFO_set_present(&info->present, SATINUSECOUNT); nmea_INFO_set_present(&info->present, SATINUSE); nmea_INFO_set_present(&info->present, SATINVIEW); return 1; } /** * STATIC Generator initialiser function. * Only touches sig, fix and satinfo in info. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ static int nmea_igen_static_init(nmeaGENERATOR *gen, nmeaINFO *info) { info->sig = 3; info->fix = 3; nmea_INFO_set_present(&info->present, SIG); nmea_INFO_set_present(&info->present, FIX); nmea_igen_static_reset(gen, info); return 1; } /* * SAT_ROTATE generator */ /** * SAT_ROTATE Generator loop function. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ static int nmea_igen_rotate_loop(nmeaGENERATOR *gen __attribute__ ((unused)), nmeaINFO *info) { int it; int count = info->satinfo.inview; double deg = 360 / (count ? count : 1); double srt = (count ? (info->satinfo.sat[0].azimuth) : 0) + 5; nmea_time_now(&info->utc, &info->present); for (it = 0; it < count; it++) { info->satinfo.sat[it].azimuth = (int) ((srt >= 360) ? srt - 360 : srt); srt += deg; } nmea_INFO_set_present(&info->present, SATINVIEW); return 1; } /** * SAT_ROTATE Generator reset function. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ static int nmea_igen_rotate_reset(nmeaGENERATOR *gen __attribute__ ((unused)), nmeaINFO *info) { int it; double deg = 360 / 8; double srt = 0; info->satinfo.inuse = 8; info->satinfo.inview = 8; for (it = 0; it < info->satinfo.inview; it++) { info->satinfo.in_use[it] = it + 1; info->satinfo.sat[it].id = it + 1; info->satinfo.sat[it].elv = 5; info->satinfo.sat[it].azimuth = (int) srt; info->satinfo.sat[it].sig = 80; srt += deg; } nmea_INFO_set_present(&info->present, SATINUSECOUNT); nmea_INFO_set_present(&info->present, SATINUSE); nmea_INFO_set_present(&info->present, SATINVIEW); return 1; } /** * SAT_ROTATE Generator initialiser function. * Only touches sig, fix and satinfo in info. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ static int nmea_igen_rotate_init(nmeaGENERATOR *gen, nmeaINFO *info) { info->sig = 3; info->fix = 3; nmea_INFO_set_present(&info->present, SIG); nmea_INFO_set_present(&info->present, FIX); nmea_igen_rotate_reset(gen, info); return 1; } /* * POS_RANDMOVE generator */ /** * POS_RANDMOVE Generator initialiser function. * Only touches sig, fix, track, mtrack, magvar and speed in info. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ static int nmea_igen_pos_rmove_init(nmeaGENERATOR *gen __attribute__ ((unused)), nmeaINFO *info) { info->sig = 3; info->fix = 3; info->speed = 20; info->track = 0; info->mtrack = 0; info->magvar = 0; nmea_INFO_set_present(&info->present, SIG); nmea_INFO_set_present(&info->present, FIX); nmea_INFO_set_present(&info->present, SPEED); nmea_INFO_set_present(&info->present, TRACK); nmea_INFO_set_present(&info->present, MTRACK); nmea_INFO_set_present(&info->present, MAGVAR); return 1; } /** * POS_RANDMOVE Generator loop function. * * @param gen a pointer to the generator * @param info a pointer to an nmeaINFO structure to use during generation * @return 1 (true) on success, 0 (false) otherwise */ static int nmea_igen_pos_rmove_loop(nmeaGENERATOR *gen __attribute__ ((unused)), nmeaINFO *info) { nmeaPOS crd; info->track += nmea_random(-10, 10); info->mtrack += nmea_random(-10, 10); info->speed += nmea_random(-2, 3); if (info->track < 0) { info->track = 359 + info->track; } if (info->track > 359) { info->track -= 359; } if (info->mtrack < 0) { info->mtrack = 359 + info->mtrack; } if (info->mtrack > 359) { info->mtrack -= 359; } if (info->speed > 40) info->speed = 40; if (info->speed < 1) info->speed = 1; nmea_info2pos(info, &crd); nmea_move_horz(&crd, &crd, info->track, info->speed / 3600); nmea_pos2info(&crd, info); info->magvar = info->track; nmea_INFO_set_present(&info->present, LAT); nmea_INFO_set_present(&info->present, LON); nmea_INFO_set_present(&info->present, SPEED); nmea_INFO_set_present(&info->present, TRACK); nmea_INFO_set_present(&info->present, MTRACK); nmea_INFO_set_present(&info->present, MAGVAR); return 1; } /** * Create the generator. * * @param type the type of the generator to create (see nmeaGENTYPE) * @param info a pointer to an nmeaINFO structure to use during generation * @return the generator */ static nmeaGENERATOR * __nmea_create_generator(const int type, nmeaINFO *info) { nmeaGENERATOR *gen = 0; switch (type) { case NMEA_GEN_NOISE: if (!(gen = malloc(sizeof(nmeaGENERATOR)))) nmea_error("__nmea_create_generator: insufficient memory!"); else { memset(gen, 0, sizeof(nmeaGENERATOR)); gen->loop_call = &nmea_igen_noise_loop; } break; case NMEA_GEN_STATIC: case NMEA_GEN_SAT_STATIC: if (!(gen = malloc(sizeof(nmeaGENERATOR)))) nmea_error("__nmea_create_generator: insufficient memory!"); else { memset(gen, 0, sizeof(nmeaGENERATOR)); gen->init_call = &nmea_igen_static_init; gen->loop_call = &nmea_igen_static_loop; gen->reset_call = &nmea_igen_static_reset; } break; case NMEA_GEN_SAT_ROTATE: if (!(gen = malloc(sizeof(nmeaGENERATOR)))) nmea_error("__nmea_create_generator: insufficient memory!"); else { memset(gen, 0, sizeof(nmeaGENERATOR)); gen->init_call = &nmea_igen_rotate_init; gen->loop_call = &nmea_igen_rotate_loop; gen->reset_call = &nmea_igen_rotate_reset; } break; case NMEA_GEN_POS_RANDMOVE: if (!(gen = malloc(sizeof(nmeaGENERATOR)))) nmea_error("__nmea_create_generator: insufficient memory!"); else { memset(gen, 0, sizeof(nmeaGENERATOR)); gen->init_call = &nmea_igen_pos_rmove_init; gen->loop_call = &nmea_igen_pos_rmove_loop; } break; default: /* case NMEA_GEN_ROTATE: */ gen = __nmea_create_generator(NMEA_GEN_SAT_ROTATE, info); nmea_gen_add(gen, __nmea_create_generator(NMEA_GEN_POS_RANDMOVE, info)); break; }; return gen; } /** * Create the generator and initialise it. * * @param type the type of the generator to create (see nmeaGENTYPE) * @param info a pointer to an nmeaINFO structure to use during generation * @return the generator */ nmeaGENERATOR * nmea_create_generator(const int type, nmeaINFO *info) { nmeaGENERATOR *gen = __nmea_create_generator(type, info); if (gen) nmea_gen_init(gen, info); return gen; } olsrd-0.6.6.2/lib/pud/nmealib/src/gmath.c000066400000000000000000000304641234304727700200260ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include /** * Convert degrees to radians * * @param val degrees * @return radians */ double nmea_degree2radian(const double val) { return (val * NMEA_PI180); } /** * Convert radians to degrees * * @param val radians * @return degrees */ double nmea_radian2degree(const double val) { return (val / NMEA_PI180); } /** * Convert NDEG (NMEA degrees) to decimal (fractional) degrees * * @param val NDEG (NMEA degrees) * @return decimal (fractional) degrees */ double nmea_ndeg2degree(const double val) { double deg; double fra_part = modf(val / 100.0, °); return (deg + ((fra_part * 100.0) / 60.0)); } /** * Convert decimal (fractional) degrees to NDEG (NMEA degrees) * * @param val decimal (fractional) degrees * @return NDEG (NMEA degrees) */ double nmea_degree2ndeg(const double val) { double deg; double fra_part = modf(val, °); return ((deg * 100.0) + (fra_part * 60.0)); } /** * Convert NDEG (NMEA degrees) to radians * * @param val NDEG (NMEA degrees) * @return radians */ double nmea_ndeg2radian(const double val) { return nmea_degree2radian(nmea_ndeg2degree(val)); } /** * Convert radians to NDEG (NMEA degrees) * * @param val radians * @return NDEG (NMEA degrees) */ double nmea_radian2ndeg(const double val) { return nmea_degree2ndeg(nmea_radian2degree(val)); } /** * Calculate PDOP (Position Dilution Of Precision) factor from HDOP and VDOP * * @param hdop HDOP * @param vdop VDOP * @return PDOP */ double nmea_calc_pdop(const double hdop, const double vdop) { return sqrt(pow(hdop, 2) + pow(vdop, 2)); } /** * Convert DOP to meters, using the NMEA_DOP_FACTOR factor * * @param dop the DOP * @return the DOP in meters */ double nmea_dop2meters(const double dop) { return (dop * NMEA_DOP_FACTOR); } /** * Convert DOP in meters to plain DOP, using the NMEA_DOP_FACTOR factor * * @param meters the DOP in meters * @return the plain DOP */ double nmea_meters2dop(const double meters) { return (meters / NMEA_DOP_FACTOR); } /** * Calculate distance between two points * * @param from_pos a pointer to the from position (in radians) * @param to_pos a pointer to the to position (in radians) * @return distance in meters */ double nmea_distance(const nmeaPOS *from_pos, const nmeaPOS *to_pos) { return ((double) NMEA_EARTHRADIUS_M) * acos( sin(to_pos->lat) * sin(from_pos->lat) + cos(to_pos->lat) * cos(from_pos->lat) * cos(to_pos->lon - from_pos->lon)); } /** * Calculate the distance between two points. * This function uses an algorithm for an oblate spheroid earth model. * The algorithm is described here: * http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf * * @param from_pos a pointer to the from position (in radians) * @param to_pos a pointer to the to position (in radians) * @param from_azimuth a pointer to the azimuth at "from" position (in radians) (output) * @param to_azimuth a pointer to the azimuth at "to" position (in radians) (output) * @return distance in meters */ double nmea_distance_ellipsoid(const nmeaPOS *from_pos, const nmeaPOS *to_pos, double *from_azimuth, double *to_azimuth) { /* All variables */ double f, a, b, sqr_a, sqr_b; double L, phi1, phi2, U1, U2, sin_U1, sin_U2, cos_U1, cos_U2; double sigma, sin_sigma, cos_sigma, cos_2_sigmam, sqr_cos_2_sigmam, sqr_cos_alpha, lambda, sin_lambda, cos_lambda, delta_lambda; int remaining_steps; double sqr_u, A, B, delta_sigma, lambda_prev; /* Check input */ assert(from_pos != 0); assert(to_pos != 0); if ((from_pos->lat == to_pos->lat) && (from_pos->lon == to_pos->lon)) { /* Identical points */ if (from_azimuth != 0) *from_azimuth = 0; if (to_azimuth != 0) *to_azimuth = 0; return 0; } /* Identical points */ /* Earth geometry */ f = NMEA_EARTH_FLATTENING; a = NMEA_EARTH_SEMIMAJORAXIS_M; b = (1 - f) * a; sqr_a = a * a; sqr_b = b * b; /* Calculation */ L = to_pos->lon - from_pos->lon; phi1 = from_pos->lat; phi2 = to_pos->lat; U1 = atan((1 - f) * tan(phi1)); U2 = atan((1 - f) * tan(phi2)); sin_U1 = sin(U1); sin_U2 = sin(U2); cos_U1 = cos(U1); cos_U2 = cos(U2); /* Initialize iteration */ sigma = 0; sin_sigma = sin(sigma); cos_sigma = cos(sigma); cos_2_sigmam = 0; sqr_cos_2_sigmam = cos_2_sigmam * cos_2_sigmam; sqr_cos_alpha = 0; lambda = L; sin_lambda = sin(lambda); cos_lambda = cos(lambda); lambda_prev = (double) 2.0 * (double) NMEA_PI; delta_lambda = lambda_prev - lambda; if (delta_lambda < 0) delta_lambda = -delta_lambda; remaining_steps = 20; while ((delta_lambda > 1e-12) && (remaining_steps > 0)) { /* Iterate */ /* Variables */ double tmp1, tmp2, sin_alpha, cos_alpha, C; /* Calculation */ tmp1 = cos_U2 * sin_lambda; tmp2 = cos_U1 * sin_U2 - sin_U1 * cos_U2 * cos_lambda; sin_sigma = sqrt(tmp1 * tmp1 + tmp2 * tmp2); cos_sigma = sin_U1 * sin_U2 + cos_U1 * cos_U2 * cos_lambda; sin_alpha = cos_U1 * cos_U2 * sin_lambda / sin_sigma; cos_alpha = cos(asin(sin_alpha)); sqr_cos_alpha = cos_alpha * cos_alpha; cos_2_sigmam = cos_sigma - 2 * sin_U1 * sin_U2 / sqr_cos_alpha; sqr_cos_2_sigmam = cos_2_sigmam * cos_2_sigmam; C = f / 16 * sqr_cos_alpha * (4 + f * (4 - 3 * sqr_cos_alpha)); lambda_prev = lambda; sigma = asin(sin_sigma); lambda = L + (1 - C) * f * sin_alpha * (sigma + C * sin_sigma * (cos_2_sigmam + C * cos_sigma * (-1 + 2 * sqr_cos_2_sigmam))); delta_lambda = lambda_prev - lambda; if (delta_lambda < 0) delta_lambda = -delta_lambda; sin_lambda = sin(lambda); cos_lambda = cos(lambda); remaining_steps--; } /* Iterate */ /* More calculation */ sqr_u = sqr_cos_alpha * (sqr_a - sqr_b) / sqr_b; A = 1 + sqr_u / 16384 * (4096 + sqr_u * (-768 + sqr_u * (320 - 175 * sqr_u))); B = sqr_u / 1024 * (256 + sqr_u * (-128 + sqr_u * (74 - 47 * sqr_u))); delta_sigma = B * sin_sigma * (cos_2_sigmam + B / 4 * (cos_sigma * (-1 + 2 * sqr_cos_2_sigmam) - B / 6 * cos_2_sigmam * (-3 + 4 * sin_sigma * sin_sigma) * (-3 + 4 * sqr_cos_2_sigmam))); /* Calculate result */ if (from_azimuth != 0) { double tan_alpha_1 = cos_U2 * sin_lambda / (cos_U1 * sin_U2 - sin_U1 * cos_U2 * cos_lambda); *from_azimuth = atan(tan_alpha_1); } if (to_azimuth != 0) { double tan_alpha_2 = cos_U1 * sin_lambda / (-sin_U1 * cos_U2 + cos_U1 * sin_U2 * cos_lambda); *to_azimuth = atan(tan_alpha_2); } return b * A * (sigma - delta_sigma); } /** * Perform a horizontal move. * * @param start_pos a pointer to the start position (in radians) * @param end_pos a pointer to the end position (in radians) (output) * @param azimuth azimuth (in degrees, [0, 359]) * @param distance the distance (in km) * @return 1 (true) on success, 0 (false) on failure */ int nmea_move_horz(const nmeaPOS *start_pos, nmeaPOS *end_pos, double azimuth, double distance) { nmeaPOS p1 = *start_pos; int RetVal = 1; distance /= NMEA_EARTHRADIUS_KM; /* Angular distance covered on earth's surface */ azimuth = nmea_degree2radian(azimuth); end_pos->lat = asin(sin(p1.lat) * cos(distance) + cos(p1.lat) * sin(distance) * cos(azimuth)); end_pos->lon = p1.lon + atan2(sin(azimuth) * sin(distance) * cos(p1.lat), cos(distance) - sin(p1.lat) * sin(end_pos->lat)); if (isnan(end_pos->lat) || isnan(end_pos->lon)) { end_pos->lat = 0; end_pos->lon = 0; RetVal = 0; } return RetVal; } /** * Perform a horizontal move. * This function uses an algorithm for an oblate spheroid earth model. * The algorithm is described here: * http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf * * @param start_pos a pointer to the start position (in radians) * @param end_pos a pointer to the end position (in radians) (output) * @param azimuth azimuth (in radians) * @param distance the distance (in km) * @param end_azimuth azimuth at end position (in radians) (output) * @return 1 (true) on success, 0 (false) on failure */ int nmea_move_horz_ellipsoid(const nmeaPOS *start_pos, nmeaPOS *end_pos, double azimuth, double distance, double *end_azimuth) { /* Variables */ double f, a, b, sqr_a, sqr_b; double phi1, tan_U1, sin_U1, cos_U1, s, alpha1, sin_alpha1, cos_alpha1; double sigma1, sin_alpha, sqr_cos_alpha, sqr_u, A, B; double sigma_initial, sigma, sigma_prev, sin_sigma, cos_sigma, cos_2_sigmam, sqr_cos_2_sigmam, delta_sigma; int remaining_steps; double tmp1, phi2, lambda, C, L; /* Check input */ assert(start_pos != 0); assert(end_pos != 0); if (fabs(distance) < 1e-12) { /* No move */ *end_pos = *start_pos; if (end_azimuth != 0) *end_azimuth = azimuth; return !(isnan(end_pos->lat) || isnan(end_pos->lon)); } /* No move */ /* Earth geometry */ f = NMEA_EARTH_FLATTENING; a = NMEA_EARTH_SEMIMAJORAXIS_M; b = (1 - f) * a; sqr_a = a * a; sqr_b = b * b; /* Calculation */ phi1 = start_pos->lat; tan_U1 = (1 - f) * tan(phi1); cos_U1 = 1 / sqrt(1 + tan_U1 * tan_U1); sin_U1 = tan_U1 * cos_U1; s = distance; alpha1 = azimuth; sin_alpha1 = sin(alpha1); cos_alpha1 = cos(alpha1); sigma1 = atan2(tan_U1, cos_alpha1); sin_alpha = cos_U1 * sin_alpha1; sqr_cos_alpha = 1 - sin_alpha * sin_alpha; sqr_u = sqr_cos_alpha * (sqr_a - sqr_b) / sqr_b; A = 1 + sqr_u / 16384 * (4096 + sqr_u * (-768 + sqr_u * (320 - 175 * sqr_u))); B = sqr_u / 1024 * (256 + sqr_u * (-128 + sqr_u * (74 - 47 * sqr_u))); /* Initialize iteration */ sigma_initial = s / (b * A); sigma = sigma_initial; sin_sigma = sin(sigma); cos_sigma = cos(sigma); cos_2_sigmam = cos(2 * sigma1 + sigma); sqr_cos_2_sigmam = cos_2_sigmam * cos_2_sigmam; delta_sigma = 0; sigma_prev = 2 * NMEA_PI; remaining_steps = 20; while ((fabs(sigma - sigma_prev) > 1e-12) && (remaining_steps > 0)) { /* Iterate */ cos_2_sigmam = cos(2 * sigma1 + sigma); sqr_cos_2_sigmam = cos_2_sigmam * cos_2_sigmam; sin_sigma = sin(sigma); cos_sigma = cos(sigma); delta_sigma = B * sin_sigma * (cos_2_sigmam + B / 4 * (cos_sigma * (-1 + 2 * sqr_cos_2_sigmam) - B / 6 * cos_2_sigmam * (-3 + 4 * sin_sigma * sin_sigma) * (-3 + 4 * sqr_cos_2_sigmam))); sigma_prev = sigma; sigma = sigma_initial + delta_sigma; remaining_steps--; } /* Iterate */ /* Calculate result */ tmp1 = (sin_U1 * sin_sigma - cos_U1 * cos_sigma * cos_alpha1); phi2 = atan2(sin_U1 * cos_sigma + cos_U1 * sin_sigma * cos_alpha1, (1 - f) * sqrt(sin_alpha * sin_alpha + tmp1 * tmp1)); lambda = atan2(sin_sigma * sin_alpha1, cos_U1 * cos_sigma - sin_U1 * sin_sigma * cos_alpha1); C = f / 16 * sqr_cos_alpha * (4 + f * (4 - 3 * sqr_cos_alpha)); L = lambda - (1 - C) * f * sin_alpha * (sigma + C * sin_sigma * (cos_2_sigmam + C * cos_sigma * (-1 + 2 * sqr_cos_2_sigmam))); /* Result */ end_pos->lon = start_pos->lon + L; end_pos->lat = phi2; if (end_azimuth != 0) { *end_azimuth = atan2(sin_alpha, -sin_U1 * sin_sigma + cos_U1 * cos_sigma * cos_alpha1); } return !(isnan(end_pos->lat) || isnan(end_pos->lon)); } /** * Convert a position from INFO to radians position * * @param info a pointer to the INFO position * @param pos a pointer to the radians position (output) */ void nmea_info2pos(const nmeaINFO *info, nmeaPOS *pos) { if (nmea_INFO_is_present(info->present, LAT)) pos->lat = nmea_ndeg2radian(info->lat); else pos->lat = NMEA_DEF_LAT; if (nmea_INFO_is_present(info->present, LON)) pos->lon = nmea_ndeg2radian(info->lon); else pos->lon = NMEA_DEF_LON; } /** * Convert a radians position to a position from INFO * * @param pos a pointer to the radians position * @param info a pointer to the INFO position (output) */ void nmea_pos2info(const nmeaPOS *pos, nmeaINFO *info) { info->lat = nmea_radian2ndeg(pos->lat); info->lon = nmea_radian2ndeg(pos->lon); nmea_INFO_set_present(&info->present, LAT); nmea_INFO_set_present(&info->present, LON); } olsrd-0.6.6.2/lib/pud/nmealib/src/info.c000066400000000000000000000325441234304727700176620ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include /** * Reset the time to now * * @param utc a pointer to the time structure * @param present a pointer to a present field. when non-NULL then the UTCDATE * and UTCTIME flags are set in it. */ void nmea_time_now(nmeaTIME *utc, uint32_t * present) { struct timeval tp; struct tm tt; assert(utc); gettimeofday(&tp, NULL ); gmtime_r(&tp.tv_sec, &tt); utc->year = tt.tm_year; utc->mon = tt.tm_mon; utc->day = tt.tm_mday; utc->hour = tt.tm_hour; utc->min = tt.tm_min; utc->sec = tt.tm_sec; utc->hsec = (tp.tv_usec / 10000); if (present) { *present |= (UTCDATE | UTCTIME); } } /** * Clear an info structure. * Resets the time to now, sets up the signal as BAD, the FIX as BAD, and * signals presence of these fields. * Resets all other fields to 0. * * @param info a pointer to the structure */ void nmea_zero_INFO(nmeaINFO *info) { if (!info) { return; } memset(info, 0, sizeof(nmeaINFO)); nmea_time_now(&info->utc, &info->present); info->sig = NMEA_SIG_BAD; nmea_INFO_set_present(&info->present, SIG); info->fix = NMEA_FIX_BAD; nmea_INFO_set_present(&info->present, FIX); } /** * Determine if a nmeaINFO structure has a certain field (from the smask). * Note: this is not the complete truth as fields may be absent in certain * sentences and are presented as 'present' by this function. * * @deprecated use nmea_INFO_is_present instead * @param smask the smask field * @param fieldName use a name from nmeaINFO_FIELD * @return a boolean, true when the structure has the requested field */ bool nmea_INFO_is_present_smask(int smask, nmeaINFO_FIELD fieldName) { switch (fieldName) { case SMASK: return true; case ELV: return ((smask & GPGGA) != 0); case PDOP: case VDOP: case SATINUSE: return ((smask & GPGSA) != 0); case SATINVIEW: return ((smask & GPGSV) != 0); case UTCDATE: case MAGVAR: return ((smask & GPRMC) != 0); case MTRACK: return ((smask & GPVTG) != 0); case SATINUSECOUNT: case HDOP: return ((smask & (GPGGA | GPGSA)) != 0); case UTCTIME: case SIG: case LAT: case LON: return ((smask & (GPGGA | GPRMC)) != 0); case FIX: return ((smask & (GPGSA | GPRMC)) != 0); case SPEED: case TRACK: return ((smask & (GPRMC | GPVTG)) != 0); default: return false; } } /** * Determine if a nmeaINFO structure has a certain field * * @param present the presence field * @param fieldName use a name from nmeaINFO_FIELD * @return a boolean, true when the structure has the requested field */ bool nmea_INFO_is_present(uint32_t present, nmeaINFO_FIELD fieldName) { return ((present & fieldName) != 0); } /** * Flag a nmeaINFO structure to contain a certain field * * @param present a pointer to the presence field * @param fieldName use a name from nmeaINFO_FIELD */ void nmea_INFO_set_present(uint32_t * present, nmeaINFO_FIELD fieldName) { assert(present); *present |= fieldName; } /** * Flag a nmeaINFO structure to NOT contain a certain field * * @param present a pointer to the presence field * @param fieldName use a name from nmeaINFO_FIELD */ void nmea_INFO_unset_present(uint32_t * present, nmeaINFO_FIELD fieldName) { assert(present); *present &= ~fieldName; } /** * Sanitise the NMEA info, make sure that: * - sig is in the range [0, 8], * - fix is in the range [1, 3], * - DOPs are positive, * - latitude is in the range [-9000, 9000], * - longitude is in the range [-18000, 18000], * - speed is positive, * - track is in the range [0, 360>. * - mtrack is in the range [0, 360>. * - magvar is in the range [0, 360>. * - satinfo: * - inuse and in_use are consistent (w.r.t. count) * - inview and sat are consistent (w.r.t. count/id) * - in_use and sat are consistent (w.r.t. count/id) * - elv is in the range [0, 90] * - azimuth is in the range [0, 359] * - sig is in the range [0, 99] * * Time is set to the current time when not present. * Fields are reset to their defaults (0) when not signaled as being present. * * @param nmeaInfo * the NMEA info structure to sanitise */ void nmea_INFO_sanitise(nmeaINFO *nmeaInfo) { double lat = 0; double lon = 0; double speed = 0; double track = 0; double mtrack = 0; double magvar = 0; bool latAdjusted = false; bool lonAdjusted = false; bool speedAdjusted = false; bool trackAdjusted = false; bool mtrackAdjusted = false; bool magvarAdjusted = false; nmeaTIME utc; int inuseIndex; int inviewIndex; if (!nmeaInfo) { return; } nmeaInfo->present = nmeaInfo->present & NMEA_INFO_PRESENT_MASK; if (!nmea_INFO_is_present(nmeaInfo->present, SMASK)) { nmeaInfo->smask = 0; } if (!nmea_INFO_is_present(nmeaInfo->present, UTCDATE) || !nmea_INFO_is_present(nmeaInfo->present, UTCTIME)) { nmea_time_now(&utc, NULL); } if (!nmea_INFO_is_present(nmeaInfo->present, UTCDATE)) { nmeaInfo->utc.year = utc.year; nmeaInfo->utc.mon = utc.mon; nmeaInfo->utc.day = utc.day; } if (!nmea_INFO_is_present(nmeaInfo->present, UTCTIME)) { nmeaInfo->utc.hour = utc.hour; nmeaInfo->utc.min = utc.min; nmeaInfo->utc.sec = utc.sec; nmeaInfo->utc.hsec = utc.hsec; } if (!nmea_INFO_is_present(nmeaInfo->present, SIG)) { nmeaInfo->sig = NMEA_SIG_BAD; } else { if ((nmeaInfo->sig < NMEA_SIG_BAD) || (nmeaInfo->sig > NMEA_SIG_SIM)) { nmeaInfo->sig = NMEA_SIG_BAD; } } if (!nmea_INFO_is_present(nmeaInfo->present, FIX)) { nmeaInfo->fix = NMEA_FIX_BAD; } else { if ((nmeaInfo->fix < NMEA_FIX_BAD) || (nmeaInfo->fix > NMEA_FIX_3D)) { nmeaInfo->fix = NMEA_FIX_BAD; } } if (!nmea_INFO_is_present(nmeaInfo->present, PDOP)) { nmeaInfo->PDOP = 0; } else { nmeaInfo->PDOP = fabs(nmeaInfo->PDOP); } if (!nmea_INFO_is_present(nmeaInfo->present, HDOP)) { nmeaInfo->HDOP = 0; } else { nmeaInfo->HDOP = fabs(nmeaInfo->HDOP); } if (!nmea_INFO_is_present(nmeaInfo->present, VDOP)) { nmeaInfo->VDOP = 0; } else { nmeaInfo->VDOP = fabs(nmeaInfo->VDOP); } if (!nmea_INFO_is_present(nmeaInfo->present, LAT)) { nmeaInfo->lat = 0; } if (!nmea_INFO_is_present(nmeaInfo->present, LON)) { nmeaInfo->lon = 0; } if (!nmea_INFO_is_present(nmeaInfo->present, ELV)) { nmeaInfo->elv = 0; } if (!nmea_INFO_is_present(nmeaInfo->present, SPEED)) { nmeaInfo->speed = 0; } if (!nmea_INFO_is_present(nmeaInfo->present, TRACK)) { nmeaInfo->track = 0; } if (!nmea_INFO_is_present(nmeaInfo->present, MTRACK)) { nmeaInfo->mtrack = 0; } if (!nmea_INFO_is_present(nmeaInfo->present, MAGVAR)) { nmeaInfo->magvar = 0; } if (!nmea_INFO_is_present(nmeaInfo->present, SATINUSECOUNT)) { nmeaInfo->satinfo.inuse = 0; } if (!nmea_INFO_is_present(nmeaInfo->present, SATINUSE)) { memset(&nmeaInfo->satinfo.in_use, 0, sizeof(nmeaInfo->satinfo.in_use)); } if (!nmea_INFO_is_present(nmeaInfo->present, SATINVIEW)) { nmeaInfo->satinfo.inview = 0; memset(&nmeaInfo->satinfo.sat, 0, sizeof(nmeaInfo->satinfo.sat)); } /* * lat */ lat = nmeaInfo->lat; lon = nmeaInfo->lon; /* force lat in [-18000, 18000] */ while (lat < -18000.0) { lat += 36000.0; latAdjusted = true; } while (lat > 18000.0) { lat -= 36000.0; latAdjusted = true; } /* lat is now in [-18000, 18000] */ /* force lat from <9000, 18000] in [9000, 0] */ if (lat > 9000.0) { lat = 18000.0 - lat; lon += 18000.0; latAdjusted = true; lonAdjusted = true; } /* force lat from [-18000, -9000> in [0, -9000] */ if (lat < -9000.0) { lat = -18000.0 - lat; lon += 18000.0; latAdjusted = true; lonAdjusted = true; } /* lat is now in [-9000, 9000] */ if (latAdjusted) { nmeaInfo->lat = lat; } /* * lon */ /* force lon in [-18000, 18000] */ while (lon < -18000.0) { lon += 36000.0; lonAdjusted = true; } while (lon > 18000.0) { lon -= 36000.0; lonAdjusted = true; } /* lon is now in [-18000, 18000] */ if (lonAdjusted) { nmeaInfo->lon = lon; } /* * speed */ speed = nmeaInfo->speed; track = nmeaInfo->track; mtrack = nmeaInfo->mtrack; if (speed < 0.0) { speed = -speed; track += 180.0; mtrack += 180.0; speedAdjusted = true; trackAdjusted = true; mtrackAdjusted = true; } /* speed is now in [0, max> */ if (speedAdjusted) { nmeaInfo->speed = speed; } /* * track */ /* force track in [0, 360> */ while (track < 0.0) { track += 360.0; trackAdjusted = true; } while (track >= 360.0) { track -= 360.0; trackAdjusted = true; } /* track is now in [0, 360> */ if (trackAdjusted) { nmeaInfo->track = track; } /* * mtrack */ /* force mtrack in [0, 360> */ while (mtrack < 0.0) { mtrack += 360.0; mtrackAdjusted = true; } while (mtrack >= 360.0) { mtrack -= 360.0; mtrackAdjusted = true; } /* mtrack is now in [0, 360> */ if (mtrackAdjusted) { nmeaInfo->mtrack = mtrack; } /* * magvar */ magvar = nmeaInfo->magvar; /* force magvar in [0, 360> */ while (magvar < 0.0) { magvar += 360.0; magvarAdjusted = true; } while (magvar >= 360.0) { magvar -= 360.0; magvarAdjusted = true; } /* magvar is now in [0, 360> */ if (magvarAdjusted) { nmeaInfo->magvar = magvar; } /* * satinfo */ nmeaInfo->satinfo.inuse = 0; for (inuseIndex = 0; inuseIndex < NMEA_MAXSAT; inuseIndex++) { if (nmeaInfo->satinfo.in_use[inuseIndex]) nmeaInfo->satinfo.inuse++; } nmeaInfo->satinfo.inview = 0; for (inviewIndex = 0; inviewIndex < NMEA_MAXSAT; inviewIndex++) { if (nmeaInfo->satinfo.sat[inviewIndex].id) { nmeaInfo->satinfo.inview++; /* force elv in [-180, 180] */ while (nmeaInfo->satinfo.sat[inviewIndex].elv < -180) { nmeaInfo->satinfo.sat[inviewIndex].elv += 360; } while (nmeaInfo->satinfo.sat[inviewIndex].elv > 180) { nmeaInfo->satinfo.sat[inviewIndex].elv -= 360; } /* elv is now in [-180, 180] */ /* force elv from <90, 180] in [90, 0] */ if (nmeaInfo->satinfo.sat[inviewIndex].elv > 90) { nmeaInfo->satinfo.sat[inviewIndex].elv = 180 - nmeaInfo->satinfo.sat[inviewIndex].elv; } /* force elv from [-180, -90> in [0, -90] */ if (nmeaInfo->satinfo.sat[inviewIndex].elv < -90) { nmeaInfo->satinfo.sat[inviewIndex].elv = -180 - nmeaInfo->satinfo.sat[inviewIndex].elv; } /* elv is now in [-90, 90] */ if (nmeaInfo->satinfo.sat[inviewIndex].elv < 0) { nmeaInfo->satinfo.sat[inviewIndex].elv = -nmeaInfo->satinfo.sat[inviewIndex].elv; } /* elv is now in [0, 90] */ /* force azimuth in [0, 360> */ while (nmeaInfo->satinfo.sat[inviewIndex].azimuth < 0) { nmeaInfo->satinfo.sat[inviewIndex].azimuth += 360; } while (nmeaInfo->satinfo.sat[inviewIndex].azimuth >= 360) { nmeaInfo->satinfo.sat[inviewIndex].azimuth -= 360; } /* azimuth is now in [0, 360> */ /* force sig in [0, 99] */ if (nmeaInfo->satinfo.sat[inviewIndex].sig < 0) nmeaInfo->satinfo.sat[inviewIndex].sig = 0; if (nmeaInfo->satinfo.sat[inviewIndex].sig > 99) nmeaInfo->satinfo.sat[inviewIndex].sig = 99; } } /* make sure the in_use IDs map to sat IDs */ for (inuseIndex = 0; inuseIndex < NMEA_MAXSAT; inuseIndex++) { int inuseID = nmeaInfo->satinfo.in_use[inuseIndex]; if (inuseID) { bool found = false; for (inviewIndex = 0; inviewIndex < NMEA_MAXSAT; inviewIndex++) { int inviewID = nmeaInfo->satinfo.sat[inviewIndex].id; if (inuseID == inviewID) { found = true; break; } } if (!found) { /* clear the id, did not find it */ nmeaInfo->satinfo.in_use[inuseIndex] = 0; if (nmeaInfo->satinfo.inuse) nmeaInfo->satinfo.inuse--; } } } } /** * Converts the position fields to degrees and DOP fields to meters so that * all fields use normal metric units. * * @param nmeaInfo * the nmeaINFO */ void nmea_INFO_unit_conversion(nmeaINFO * nmeaInfo) { if (!nmeaInfo) { return; } /* smask (already in correct format) */ /* utc (already in correct format) */ /* sig (already in correct format) */ /* fix (already in correct format) */ if (nmea_INFO_is_present(nmeaInfo->present, PDOP)) { nmeaInfo->PDOP = nmea_dop2meters(nmeaInfo->PDOP); } if (nmea_INFO_is_present(nmeaInfo->present, HDOP)) { nmeaInfo->HDOP = nmea_dop2meters(nmeaInfo->HDOP); } if (nmea_INFO_is_present(nmeaInfo->present, VDOP)) { nmeaInfo->VDOP = nmea_dop2meters(nmeaInfo->VDOP); } if (nmea_INFO_is_present(nmeaInfo->present, LAT)) { nmeaInfo->lat = nmea_ndeg2degree(nmeaInfo->lat); } if (nmea_INFO_is_present(nmeaInfo->present, LON)) { nmeaInfo->lon = nmea_ndeg2degree(nmeaInfo->lon); } /* elv (already in correct format) */ /* speed (already in correct format) */ /* track (already in correct format) */ /* mtrack (already in correct format) */ /* magvar (already in correct format) */ /* satinfo (already in correct format) */ } olsrd-0.6.6.2/lib/pud/nmealib/src/parse.c000066400000000000000000000560241234304727700200400ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include /** the size of the buffer to put time string (that is to be parsed) into */ #define NMEA_TIMEPARSE_BUF 256 /** * Parse nmeaTIME (time only, no date) from a string. * The format that is used (hhmmss, hhmmss.s, hhmmss.ss or hhmmss.sss) is * determined by the length of the string. * * @param s the string * @param len the length of the string * @param t a pointer to the nmeaTIME structure in which to store the parsed time * @return true on success, false otherwise */ static bool _nmea_parse_time(const char *s, const int len, nmeaTIME *t) { assert(s); assert(t); if (len == (sizeof("hhmmss") - 1)) { t->hsec = 0; return (3 == nmea_scanf(s, len, "%2d%2d%2d", &t->hour, &t->min, &t->sec)); } if (len == (sizeof("hhmmss.s") - 1)) { if (4 == nmea_scanf(s, len, "%2d%2d%2d.%d", &t->hour, &t->min, &t->sec, &t->hsec)) { t->hsec *= 10; return true; } return false; } if (len == (sizeof("hhmmss.ss") - 1)) { return (4 == nmea_scanf(s, len, "%2d%2d%2d.%d", &t->hour, &t->min, &t->sec, &t->hsec)); } if (len == (sizeof("hhmmss.sss") - 1)) { if ((4 == nmea_scanf(s, len, "%2d%2d%2d.%d", &t->hour, &t->min, &t->sec, &t->hsec))) { t->hsec = (t->hsec + 9) / 10; return true; } return false; } nmea_error("Parse error: invalid time format in %s", s); return false; } /** * Parse nmeaTIME (date only, no time) from a string. * The month is adjusted -1 to comply with the nmeaTIME month range of [0, 11]. * The year is adjusted +100 for years before 90 to comply with the nmeaTIME * year range of [90, 189]. * * @param date the date * @param t a pointer to the nmeaTIME structure in which to store the parsed date * @return true on success, false otherwise */ static bool _nmea_parse_date(const int date, nmeaTIME *t) { assert(t); if ((date < 0) || (date > 999999)) { nmea_error("Parse error: invalid time format in %d", date); return false; } t->day = date / 10000; t->mon = (date / 100) % 100; t->mon--; t->year = date % 100; if (t->year < 90) { t->year += 100; } return true; } /** * Validate the time fields in an nmeaTIME structure. * Expects: *
 *   0 <= hour <   24
 *   0 <= min  <   60
 *   0 <= sec  <=  60
 *   0 <= hsec <  100
 * 
* * @param t a pointer to the structure * @return true when valid, false otherwise */ static bool validateTime(const nmeaTIME * t) { if (!t) { return false; } if (!((t->hour >= 0) && (t->hour < 24) && (t->min >= 0) && (t->min < 60) && (t->sec >= 0) && (t->sec <= 60) && (t->hsec >= 0) && (t->hsec < 100))) { nmea_error("Parse error: invalid time (%d:%d:%d.%d)", t->hour, t->min, t->sec, t->hsec); return false; } return true; } /** * Validate the date fields in an nmeaTIME structure. * Expects: *
 *   year  [90, 189]
 *   month [ 0,  11]
 *   day   [ 1,  31]
 * 
* * @param t a pointer to the structure * @return true when valid, false otherwise */ static bool validateDate(const nmeaTIME * t) { if (!t) { return false; } if (!((t->year >= 90) && (t->year <= 189) && (t->mon >= 0) && (t->mon <= 11) && (t->day >= 1) && (t->day <= 31))) { nmea_error("Parse error: invalid date (%d-%d-%d - D-M-Y)", t->day, t->mon, t->year); return false; } return true; } /** * Validate north/south or east/west and uppercase it. * Expects: *
 *   c in { n, N, s, S } (for north/south)
 *   c in { e, E, w, W } (for east/west)
 * 
* * @param c a pointer to the character. The character will be converted to uppercase. * @param ns true: evaluate north/south, false: evaluate east/west * @return true when valid, false otherwise */ static bool validateNSEW(char * c, const bool ns) { if (!c) { return false; } *c = toupper(*c); if (ns) { if (!((*c == 'N') || (*c == 'S'))) { nmea_error("Parse error: invalid north/south (%c)", *c); return false; } } else { if (!((*c == 'E') || (*c == 'W'))) { nmea_error("Parse error: invalid east/west (%c)", *c); return false; } } return true; } /** * Uppercase mode and validate it. * Expects: *
 *   c in { A, D, E, F, M, N, P, R, S }
 *
 *   A = Autonomous. Satellite system used in non-differential mode in position fix
 *   D = Differential. Satellite system used in differential mode in position fix
 *   E = Estimated (dead reckoning) mode
 *   F = Float RTK. Satellite system used in real time kinematic mode with floating integers
 *   M = Manual input mode
 *   N = No fix. Satellite system not used in position fix, or fix not valid
 *   P = Precise. Satellite system used in precision mode. Precision mode is defined
 *       as no deliberate degradation (such as Selective Availability) and higher
 *       resolution code (P-code) is used to compute position fix.
 *   R = Real Time Kinematic. Satellite system used in RTK mode with fixed integers
 *   S = Simulator mode
 * 
* * @param c a pointer to the character. The character will be converted to uppercase. * @return true when valid, false otherwise */ static bool validateMode(char * c) { if (!c) { return false; } *c = toupper(*c); if (!((*c == 'A') || (*c == 'D') || (*c == 'E') || (*c == 'F') || (*c == 'M') || (*c == 'N') || (*c == 'P') || (*c == 'R') || (*c == 'S'))) { nmea_error("Parse error: invalid mode (%c)", *c); return false; } return true; } /** * Determine whether the given string contains characters that are not allowed * for fields in an NMEA string. * * @param str * The string to check * @param str_len * The length of the string to check * @param strName * The name of the string to report when invalid characters are encountered * @param report * A pointer to a buffer in which to place the report string when an invalid * nmea character is detected * @param reportSize * The size of the report buffer * * @return * - true when the string has invalid characters * - false otherwise */ bool nmea_parse_sentence_has_invalid_chars(const char * str, const size_t str_len, const char * strName, char * report, const size_t reportSize) { static const char invalidChars[] = { '$', '*', ',', '!', '\\', '^', '~' }; static const char * invalidCharsNames[] = { "sentence delimiter ($)", "checksum field delimiter (*)", "comma (,)", "exclamation mark (!)", "backslash (\\)", "power (^)", "tilde (~)" }; size_t i; size_t j; if (!str || !str_len) { return false; } for (i = 0; i < str_len; i++) { char c = str[i]; if (!((c >= 32) && (c <= 126))) { if (report && reportSize) { snprintf(report, reportSize, "Configured %s (%s)," " character %lu, can not contain non-printable" " characters (codes outside the range [32, 126])", strName, str, (unsigned long) i + 1); } return true; } for (j = 0; j < sizeof(invalidChars); j++) { if (c == invalidChars[j]) { if (report && reportSize) { snprintf(report, reportSize, "Configured %s (%s)," " character %lu, can not contain %s characters", strName, str, (unsigned long) i + 1, invalidCharsNames[j]); } return true; } } } return false; } /** * Determine sentence type (see nmeaPACKTYPE) by the header of a string. * The header is the start of an NMEA sentence, right after the $. * * @param s the string. must be the NMEA string, right after the initial $ * @param len the length of the string * @return The packet type (or GPNON when it could not be determined) */ int nmea_parse_get_sentence_type(const char *s, const int len) { static const char *pheads[] = { "GPGGA", "GPGSA", "GPGSV", "GPRMC", "GPVTG" }; static const int types[] = { GPGGA, GPGSA, GPGSV, GPRMC, GPVTG }; unsigned int i; assert(s); if (len < 5) return GPNON; for (i = 0; i < (sizeof(types) / sizeof(int)); i++) { if (!memcmp(s, pheads[i], 5)) { return types[i]; } } return GPNON; } /** * Find the tail ("\r\n") of a sentence in a string and check the checksum of the sentence. * * @param s the string * @param len the length of the string * @param checksum a pointer to the location where the checksum (as specified * in the sentence) should be stored (will be -1 if the checksum did not match * the calculated checksum or a new sentence was found in s after the start of s) * @return Number of bytes from the start of the string until the tail or 0 * when no sentence was found */ int nmea_parse_get_sentence_length(const char *s, const int len, int *checksum) { static const int tail_sz = 1 + 2 + 2 /* *xx\r\n */; const char * s_end = s + len; int nread = 0; int cksum = 0; assert(s); assert(checksum); *checksum = -1; for (; s < s_end; s++, nread++) { if ((*s == '$') && nread) { /* found a new sentence start marker _after_ the first character of s */ s = NULL; /* do not reset nread when exiting */ break; } if ('*' == *s) { /* found a sentence checksum marker */ if (((s + tail_sz) <= s_end) && ('\r' == s[3]) && ('\n' == s[4])) { *checksum = nmea_atoi(s + 1, 2, 16); nread = len - (int) (s_end - (s + tail_sz)); if (*checksum != cksum) { *checksum = -1; s = NULL; /* do not reset nread when exiting */ } } break; } if (nread) { cksum ^= (int) *s; } } if (s && (*checksum < 0)) nread = 0; return nread; } /** * Parse a GPGGA sentence from a string * * @param s the string * @param len the length of the string * @param pack a pointer to the result structure * @return 1 (true) - if parsed successfully or 0 (false) otherwise. */ int nmea_parse_GPGGA(const char *s, const int len, nmeaGPGGA *pack) { int token_count; char time_buff[NMEA_TIMEPARSE_BUF]; size_t time_buff_len = 0; assert(s); assert(pack); nmea_trace_buff(s, len); /* * Clear before parsing, to be able to detect absent fields */ time_buff[0] = '\0'; pack->present = 0; pack->utc.hour = -1; pack->utc.min = -1; pack->utc.sec = -1; pack->utc.hsec = -1; pack->lat = NAN; pack->ns = 0; pack->lon = NAN; pack->ew = 0; pack->sig = -1; pack->satinuse = -1; pack->HDOP = NAN; pack->elv = NAN; pack->elv_units = 0; pack->diff = 0; /* ignored */ pack->diff_units = 0; /* ignored */ pack->dgps_age = 0; /* ignored */ pack->dgps_sid = 0; /* ignored */ /* parse */ token_count = nmea_scanf(s, len, "$GPGGA,%s,%f,%c,%f,%c,%d,%d,%f,%f,%c,%f,%c,%f,%d*", &time_buff[0], &pack->lat, &pack->ns, &pack->lon, &pack->ew, &pack->sig, &pack->satinuse, &pack->HDOP, &pack->elv, &pack->elv_units, &pack->diff, &pack->diff_units, &pack->dgps_age, &pack->dgps_sid); /* see that we have enough tokens */ if (token_count != 14) { nmea_error("GPGGA parse error: need 14 tokens, got %d in %s", token_count, s); return 0; } /* determine which fields are present and validate them */ time_buff_len = strlen(&time_buff[0]); if (time_buff_len > (NMEA_TIMEPARSE_BUF - 1)) time_buff_len = NMEA_TIMEPARSE_BUF - 1; if (time_buff_len) { if (!_nmea_parse_time(&time_buff[0], time_buff_len, &pack->utc)) { return 0; } if (!validateTime(&pack->utc)) { return 0; } nmea_INFO_set_present(&pack->present, UTCTIME); } if (!isnan(pack->lat) && (pack->ns)) { if (!validateNSEW(&pack->ns, true)) { return 0; } nmea_INFO_set_present(&pack->present, LAT); } if (!isnan(pack->lon) && (pack->ew)) { if (!validateNSEW(&pack->ew, false)) { return 0; } nmea_INFO_set_present(&pack->present, LON); } if (pack->sig != -1) { if (!((pack->sig >= NMEA_SIG_FIRST) && (pack->sig <= NMEA_SIG_LAST))) { nmea_error("GPGGA parse error: invalid signal %d, expected [%d, %d]", pack->sig, NMEA_SIG_FIRST, NMEA_SIG_LAST); return 0; } nmea_INFO_set_present(&pack->present, SIG); } if (pack->satinuse != -1) { nmea_INFO_set_present(&pack->present, SATINUSECOUNT); } if (!isnan(pack->HDOP)) { nmea_INFO_set_present(&pack->present, HDOP); } if (!isnan(pack->elv) && (pack->elv_units)) { if (pack->elv_units != 'M') { nmea_error("GPGGA parse error: invalid elevation unit (%c)", pack->elv_units); return 0; } nmea_INFO_set_present(&pack->present, ELV); } /* ignore diff and diff_units */ /* ignore dgps_age and dgps_sid */ return 1; } /** * Parse a GPGSA sentence from a string * * @param s the string * @param len the length of the string * @param pack a pointer to the result structure * @return 1 (true) - if parsed successfully or 0 (false) otherwise. */ int nmea_parse_GPGSA(const char *s, const int len, nmeaGPGSA *pack) { int token_count; int i; assert(s); assert(pack); nmea_trace_buff(s, len); /* * Clear before parsing, to be able to detect absent fields */ pack->present = 0; pack->fix_mode = 0; pack->fix_type = -1; for (i = 0; i < NMEA_MAXSAT; i++) { pack->sat_prn[i] = 0; } pack->PDOP = NAN; pack->HDOP = NAN; pack->VDOP = NAN; /* parse */ token_count = nmea_scanf(s, len, "$GPGSA,%c,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%f,%f,%f*", &pack->fix_mode, &pack->fix_type, &pack->sat_prn[0], &pack->sat_prn[1], &pack->sat_prn[2], &pack->sat_prn[3], &pack->sat_prn[4], &pack->sat_prn[5], &pack->sat_prn[6], &pack->sat_prn[7], &pack->sat_prn[8], &pack->sat_prn[9], &pack->sat_prn[10], &pack->sat_prn[11], &pack->PDOP, &pack->HDOP, &pack->VDOP); /* see that we have enough tokens */ if (token_count != 17) { nmea_error("GPGSA parse error: need 17 tokens, got %d in %s", token_count, s); return 0; } /* determine which fields are present and validate them */ pack->fix_mode = toupper(pack->fix_mode); if (!((pack->fix_mode == 'A') || (pack->fix_mode == 'M'))) { nmea_error("GPGSA parse error: invalid fix mode (%c)", pack->fix_mode); return 0; } if (pack->fix_type != -1) { if (!((pack->fix_type >= NMEA_FIX_FIRST) && (pack->fix_type <= NMEA_FIX_LAST))) { nmea_error("GPGSA parse error: invalid fix type %d, expected [%d, %d]", pack->fix_type, NMEA_FIX_FIRST, NMEA_FIX_LAST); return 0; } nmea_INFO_set_present(&pack->present, FIX); } for (i = 0; i < NMEA_MAXSAT; i++) { if (pack->sat_prn[i] != 0) { nmea_INFO_set_present(&pack->present, SATINUSE); break; } } if (!isnan(pack->PDOP)) { nmea_INFO_set_present(&pack->present, PDOP); } if (!isnan(pack->HDOP)) { nmea_INFO_set_present(&pack->present, HDOP); } if (!isnan(pack->VDOP)) { nmea_INFO_set_present(&pack->present, VDOP); } return 1; } /** * Parse a GPGSV sentence from a string * * @param s the string * @param len the length of the string * @param pack a pointer to the result structure * @return 1 (true) - if parsed successfully or 0 (false) otherwise. */ int nmea_parse_GPGSV(const char *s, const int len, nmeaGPGSV *pack) { int token_count; int token_count_expected; int sat_count; int sat_counted = 0; assert(s); assert(pack); nmea_trace_buff(s, len); /* * Clear before parsing, to be able to detect absent fields */ memset(pack, 0, sizeof(nmeaGPGSV)); /* parse */ token_count = nmea_scanf(s, len, "$GPGSV,%d,%d,%d," "%d,%d,%d,%d," "%d,%d,%d,%d," "%d,%d,%d,%d," "%d,%d,%d,%d*", &pack->pack_count, &pack->pack_index, &pack->sat_count, &pack->sat_data[0].id, &pack->sat_data[0].elv, &pack->sat_data[0].azimuth, &pack->sat_data[0].sig, &pack->sat_data[1].id, &pack->sat_data[1].elv, &pack->sat_data[1].azimuth, &pack->sat_data[1].sig, &pack->sat_data[2].id, &pack->sat_data[2].elv, &pack->sat_data[2].azimuth, &pack->sat_data[2].sig, &pack->sat_data[3].id, &pack->sat_data[3].elv, &pack->sat_data[3].azimuth, &pack->sat_data[3].sig); /* return if we have no sentences or sats */ if ((pack->pack_count < 1) || (pack->pack_count > NMEA_NSATPACKS) || (pack->pack_index < 1) || (pack->pack_index > pack->pack_count) || (pack->sat_count < 0) || (pack->sat_count > NMEA_MAXSAT)) { nmea_error("GPGSV parse error: inconsistent pack (count/index/satcount = %d/%d/%d)", pack->pack_count, pack->pack_index, pack->sat_count); return 0; } /* validate all sat settings and count the number of sats in the sentence */ for (sat_count = 0; sat_count < NMEA_SATINPACK; sat_count++) { if (pack->sat_data[sat_count].id != 0) { if ((pack->sat_data[sat_count].id < 0)) { nmea_error("GPGSV parse error: invalid sat %d id (%d)", sat_count + 1, pack->sat_data[sat_count].id); return 0; } if ((pack->sat_data[sat_count].elv < -90) || (pack->sat_data[sat_count].elv > 90)) { nmea_error("GPGSV parse error: invalid sat %d elevation (%d)", sat_count + 1, pack->sat_data[sat_count].elv); return 0; } if ((pack->sat_data[sat_count].azimuth < 0) || (pack->sat_data[sat_count].azimuth >= 360)) { nmea_error("GPGSV parse error: invalid sat %d azimuth (%d)", sat_count + 1, pack->sat_data[sat_count].azimuth); return 0; } if ((pack->sat_data[sat_count].sig < 0) || (pack->sat_data[sat_count].sig > 99)) { nmea_error("GPGSV parse error: invalid sat %d signal (%d)", sat_count + 1, pack->sat_data[sat_count].sig); return 0; } sat_counted++; } } /* see that we have enough tokens */ token_count_expected = (sat_counted * 4) + 3; if ((token_count < token_count_expected) || (token_count > (NMEA_SATINPACK * 4 + 3))) { nmea_error("GPGSV parse error: need %d tokens, got %d", token_count_expected, token_count); return 0; } /* determine which fields are present and validate them */ if (pack->sat_count > 0) { nmea_INFO_set_present(&pack->present, SATINVIEW); } return 1; } /** * Parse a GPRMC sentence from a string * * @param s the string * @param len the length of the string * @param pack a pointer to the result structure * @return 1 (true) - if parsed successfully or 0 (false) otherwise. */ int nmea_parse_GPRMC(const char *s, const int len, nmeaGPRMC *pack) { int token_count; char time_buff[NMEA_TIMEPARSE_BUF]; int date; size_t time_buff_len = 0; assert(s); assert(pack); nmea_trace_buff(s, len); /* * Clear before parsing, to be able to detect absent fields */ time_buff[0] = '\0'; date = -1; pack->present = 0; pack->utc.year = -1; pack->utc.mon = -1; pack->utc.day = -1; pack->utc.hour = -1; pack->utc.min = -1; pack->utc.sec = -1; pack->utc.hsec = -1; pack->status = 0; pack->lat = NAN; pack->ns = 0; pack->lon = NAN; pack->ew = 0; pack->speed = NAN; pack->track = NAN; pack->magvar = NAN; pack->magvar_ew = 0; pack->mode = 0; /* parse */ token_count = nmea_scanf(s, len, "$GPRMC,%s,%c,%f,%c,%f,%c,%f,%f,%d,%f,%c,%c*", &time_buff[0], &pack->status, &pack->lat, &pack->ns, &pack->lon, &pack->ew, &pack->speed, &pack->track, &date, &pack->magvar, &pack->magvar_ew, &pack->mode); /* see that we have enough tokens */ if ((token_count != 11) && (token_count != 12)) { nmea_error("GPRMC parse error: need 11 or 12 tokens, got %d in %s", token_count, s); return 0; } /* determine which fields are present and validate them */ time_buff_len = strlen(&time_buff[0]); if (time_buff_len) { if (!_nmea_parse_time(&time_buff[0], time_buff_len, &pack->utc)) { return 0; } if (!validateTime(&pack->utc)) { return 0; } nmea_INFO_set_present(&pack->present, UTCTIME); } if (!pack->status) { pack->status = 'V'; } else { pack->status = toupper(pack->status); if (!((pack->status == 'A') || (pack->status == 'V'))) { nmea_error("GPRMC parse error: invalid status (%c)", pack->status); return 0; } } if (!isnan(pack->lat) && (pack->ns)) { if (!validateNSEW(&pack->ns, true)) { return 0; } nmea_INFO_set_present(&pack->present, LAT); } if (!isnan(pack->lon) && (pack->ew)) { if (!validateNSEW(&pack->ew, false)) { return 0; } nmea_INFO_set_present(&pack->present, LON); } if (!isnan(pack->speed)) { nmea_INFO_set_present(&pack->present, SPEED); } if (!isnan(pack->track)) { nmea_INFO_set_present(&pack->present, TRACK); } if (date != -1) { if (!_nmea_parse_date(date, &pack->utc)) { return 0; } if (!validateDate(&pack->utc)) { return 0; } nmea_INFO_set_present(&pack->present, UTCDATE); } if (!isnan(pack->magvar) && (pack->magvar_ew)) { if (!validateNSEW(&pack->magvar_ew, false)) { return 0; } nmea_INFO_set_present(&pack->present, MAGVAR); } if (token_count == 11) { pack->mode = 'A'; } else { if (!pack->mode) { pack->mode = 'N'; } else { if (!validateMode(&pack->mode)) { return 0; } } } return 1; } /** * Parse a GPVTG sentence from a string * * @param s the string * @param len the length of the string * @param pack a pointer to the result structure * @return 1 (true) - if parsed successfully or 0 (false) otherwise. */ int nmea_parse_GPVTG(const char *s, const int len, nmeaGPVTG *pack) { int token_count; assert(s); assert(pack); nmea_trace_buff(s, len); /* * Clear before parsing, to be able to detect absent fields */ pack->present = 0; pack->track = NAN; pack->track_t = 0; pack->mtrack = NAN; pack->mtrack_m = 0; pack->spn = NAN; pack->spn_n = 0; pack->spk = NAN; pack->spk_k = 0; /* parse */ token_count = nmea_scanf(s, len, "$GPVTG,%f,%c,%f,%c,%f,%c,%f,%c*", &pack->track, &pack->track_t, &pack->mtrack, &pack->mtrack_m, &pack->spn, &pack->spn_n, &pack->spk, &pack->spk_k); /* see that we have enough tokens */ if (token_count != 8) { nmea_error("GPVTG parse error: need 8 tokens, got %d in %s", token_count, s); return 0; } /* determine which fields are present and validate them */ if (!isnan(pack->track) && (pack->track_t)) { pack->track_t = toupper(pack->track_t); if (pack->track_t != 'T') { nmea_error("GPVTG parse error: invalid track unit, got %c, expected T", pack->track_t); return 0; } nmea_INFO_set_present(&pack->present, TRACK); } if (!isnan(pack->mtrack) && (pack->mtrack_m)) { pack->mtrack_m = toupper(pack->mtrack_m); if (pack->mtrack_m != 'M') { nmea_error("GPVTG parse error: invalid mtrack unit, got %c, expected M", pack->mtrack_m); return 0; } nmea_INFO_set_present(&pack->present, MTRACK); } if (!isnan(pack->spn) && (pack->spn_n)) { pack->spn_n = toupper(pack->spn_n); if (pack->spn_n != 'N') { nmea_error("GPVTG parse error: invalid knots speed unit, got %c, expected N", pack->spn_n); return 0; } nmea_INFO_set_present(&pack->present, SPEED); if (isnan(pack->spk)) { pack->spk = pack->spn * NMEA_TUD_KNOTS; pack->spk_k = 'K'; } } if (!isnan(pack->spk) && (pack->spk_k)) { pack->spk_k = toupper(pack->spk_k); if (pack->spk_k != 'K') { nmea_error("GPVTG parse error: invalid kph speed unit, got %c, expected K", pack->spk_k); return 0; } nmea_INFO_set_present(&pack->present, SPEED); if (isnan(pack->spn)) { pack->spn = pack->spk / NMEA_TUD_KNOTS; pack->spn_n = 'N'; } } return 1; } olsrd-0.6.6.2/lib/pud/nmealib/src/parser.c000066400000000000000000000220451234304727700202160ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include /* * high level */ /** * Initialise the parser. * Allocates a buffer. * * @param parser a pointer to the parser * @return true (1) - success or false (0) - fail */ int nmea_parser_init(nmeaPARSER *parser) { int resv = 0; int buff_size = nmea_context_get_buffer_size(); assert(parser); memset(parser, 0, sizeof(nmeaPARSER)); if (!(parser->buffer = malloc(buff_size))) nmea_error("nmea_parser_init: insufficient memory"); else { parser->buff_size = buff_size; resv = 1; } return resv; } /** * Destroy the parser. * Frees a buffer. * * @param parser a pointer to the parser */ void nmea_parser_destroy(nmeaPARSER *parser) { assert(parser); if (parser->buffer) { free(parser->buffer); parser->buffer = NULL; } nmea_parser_queue_clear(parser); memset(parser, 0, sizeof(nmeaPARSER)); } /** * Parse a string and store the results in the nmeaINFO structure * * @param parser a pointer to the parser * @param s the string * @param len the length of the string * @param info a pointer to the nmeaINFO structure * @return the number of packets that were parsed */ int nmea_parse(nmeaPARSER *parser, const char *s, const int len, nmeaINFO *info) { int packetType; int packetsParsed = 0; void *packet = 0; assert(parser); nmea_parser_push(parser, s, len); while (GPNON != (packetType = nmea_parser_pop(parser, &packet))) { packetsParsed++; switch (packetType) { case GPGGA: nmea_GPGGA2info((nmeaGPGGA *) packet, info); break; case GPGSA: nmea_GPGSA2info((nmeaGPGSA *) packet, info); break; case GPGSV: nmea_GPGSV2info((nmeaGPGSV *) packet, info); break; case GPRMC: nmea_GPRMC2info((nmeaGPRMC *) packet, info); break; case GPVTG: nmea_GPVTG2info((nmeaGPVTG *) packet, info); break; default: break; }; free(packet); } return packetsParsed; } /* * low level */ /** * Do the actual parsing of a string and store the results in the parser. * This function is used to parse (broken up parts) of a complete string. * * @param parser a pointer to the parser * @param s the string * @param len the length of the string * @return the number of bytes that were parsed, -1 on error */ static int nmea_parser_real_push(nmeaPARSER *parser, const char *s, int len) { int charsParsed = 0; int crc; int sentenceLength; int sentenceType; nmeaParserNODE *node = NULL; assert(parser); assert(parser->buffer); if (!s || !len) return 0; /* clear the buffer if the string is too large */ if ((parser->buff_use + len) >= parser->buff_size) nmea_parser_buff_clear(parser); /* check that the string will fit in the buffer */ if ((parser->buff_use + len) >= parser->buff_size) { nmea_error("nmea_parser_real_push: string too long to fit in parser buffer"); return 0; } /* put the string in the buffer */ memcpy(parser->buffer + parser->buff_use, s, len); parser->buff_use += len; /* parse */ for (;; node = NULL) { sentenceLength = nmea_parse_get_sentence_length(parser->buffer + charsParsed, parser->buff_use - charsParsed, &crc); if (!sentenceLength) { if (charsParsed) memmove(parser->buffer, parser->buffer + charsParsed, parser->buff_use -= charsParsed); break; } else if (crc >= 0) { sentenceType = nmea_parse_get_sentence_type(parser->buffer + charsParsed + 1, parser->buff_use - charsParsed - 1); if (!(node = malloc(sizeof(nmeaParserNODE)))) goto mem_fail; node->pack = NULL; switch (sentenceType) { case GPGGA: if (!(node->pack = malloc(sizeof(nmeaGPGGA)))) goto mem_fail; node->packType = GPGGA; if (!nmea_parse_GPGGA(parser->buffer + charsParsed, sentenceLength, (nmeaGPGGA *) node->pack)) { free(node->pack); free(node); node = NULL; } break; case GPGSA: if (!(node->pack = malloc(sizeof(nmeaGPGSA)))) goto mem_fail; node->packType = GPGSA; if (!nmea_parse_GPGSA(parser->buffer + charsParsed, sentenceLength, (nmeaGPGSA *) node->pack)) { free(node->pack); free(node); node = NULL; } break; case GPGSV: if (!(node->pack = malloc(sizeof(nmeaGPGSV)))) goto mem_fail; node->packType = GPGSV; if (!nmea_parse_GPGSV(parser->buffer + charsParsed, sentenceLength, (nmeaGPGSV *) node->pack)) { free(node->pack); free(node); node = NULL; } break; case GPRMC: if (!(node->pack = malloc(sizeof(nmeaGPRMC)))) goto mem_fail; node->packType = GPRMC; if (!nmea_parse_GPRMC(parser->buffer + charsParsed, sentenceLength, (nmeaGPRMC *) node->pack)) { free(node->pack); free(node); node = NULL; } break; case GPVTG: if (!(node->pack = malloc(sizeof(nmeaGPVTG)))) goto mem_fail; node->packType = GPVTG; if (!nmea_parse_GPVTG(parser->buffer + charsParsed, sentenceLength, (nmeaGPVTG *) node->pack)) { free(node->pack); free(node); node = NULL; } break; default: free(node); node = NULL; break; }; if (node) { if (parser->end_node) parser->end_node->next_node = node; parser->end_node = node; if (!parser->top_node) parser->top_node = node; node->next_node = NULL; } } charsParsed += sentenceLength; } return charsParsed; mem_fail: if (node) free(node); nmea_error("Insufficient memory!"); return -1; } /** * Parse a string and store the results in the parser * * @param parser a pointer to the parser * @param s the string * @param len the length of the string * @return the number of bytes that were parsed */ int nmea_parser_push(nmeaPARSER *parser, const char *s, int len) { int charsParsed = 0; assert(parser); if (!s || !len) return 0; do { int charsToParse; if (len > parser->buff_size) charsToParse = parser->buff_size; else charsToParse = len; charsParsed += nmea_parser_real_push(parser, s, charsToParse); len -= charsToParse; } while (len); return charsParsed; } /** * Get the type of top packet * * @param parser a pointer to the parser * @return the type of the top packet (see nmeaPACKTYPE) */ int nmea_parser_top(const nmeaPARSER *parser) { int retval = GPNON; nmeaParserNODE *node; assert(parser); node = parser->top_node; if (node) retval = node->packType; return retval; } /** * Remove the top packet from the parser * * @param parser a pointer to the parser * @param pack_ptr a pointer to the location where to store a pointer to the packet * @return the type of the top packet (see nmeaPACKTYPE) */ int nmea_parser_pop(nmeaPARSER *parser, void **pack_ptr) { int retval = GPNON; nmeaParserNODE *node; assert(parser); node = parser->top_node; if (node) { retval = node->packType; if (pack_ptr) *pack_ptr = node->pack; parser->top_node = node->next_node; if (!parser->top_node) parser->end_node = 0; free(node); } return retval; } /** * Get the top packet from the parser without removing it * * @param parser a pointer to the parser * @param pack_ptr a pointer to the location where to store a pointer to the packet * @return the type of the top packet (see nmeaPACKTYPE) */ int nmea_parser_peek(const nmeaPARSER *parser, void **pack_ptr) { int retval = GPNON; nmeaParserNODE *node; assert(parser); node = parser->top_node; if (node) { retval = node->packType; if (pack_ptr) *pack_ptr = node->pack; } return retval; } /** * Remove the top packet from the parser * * @param parser a pointer to the parser * @return the type of the removed packet (see nmeaPACKTYPE) */ int nmea_parser_drop(nmeaPARSER *parser) { int retval = GPNON; nmeaParserNODE *node; assert(parser); node = parser->top_node; if (node) { retval = node->packType; if (node->pack) free(node->pack); parser->top_node = node->next_node; if (!parser->top_node) parser->end_node = NULL; free(node); } return retval; } /** * Clear the cache of the parser * * @param parser a pointer to the parser */ void nmea_parser_buff_clear(nmeaPARSER *parser) { assert(parser); parser->buff_use = 0; } /** * Clear the packets queue in the parser * * @param parser a pointer to the parser */ void nmea_parser_queue_clear(nmeaPARSER *parser) { assert(parser); while (parser->top_node) nmea_parser_drop(parser); } olsrd-0.6.6.2/lib/pud/nmealib/src/sentence.c000066400000000000000000000031461234304727700205270ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include void nmea_zero_GPGGA(nmeaGPGGA *pack) { memset(pack, 0, sizeof(nmeaGPGGA)); nmea_time_now(&pack->utc, &pack->present); pack->ns = 'N'; pack->ew = 'E'; pack->elv_units = 'M'; pack->diff_units = 'M'; } void nmea_zero_GPGSA(nmeaGPGSA *pack) { memset(pack, 0, sizeof(nmeaGPGSA)); pack->fix_mode = 'A'; pack->fix_type = NMEA_FIX_BAD; } void nmea_zero_GPGSV(nmeaGPGSV *pack) { memset(pack, 0, sizeof(nmeaGPGSV)); } void nmea_zero_GPRMC(nmeaGPRMC *pack) { memset(pack, 0, sizeof(nmeaGPRMC)); nmea_time_now(&pack->utc, &pack->present); pack->status = 'V'; pack->ns = 'N'; pack->ew = 'E'; pack->magvar_ew = 'E'; pack->mode = 'N'; } void nmea_zero_GPVTG(nmeaGPVTG *pack) { memset(pack, 0, sizeof(nmeaGPVTG)); pack->track_t = 'T'; pack->mtrack_m = 'M'; pack->spn_n = 'N'; pack->spk_k = 'K'; } olsrd-0.6.6.2/lib/pud/nmealib/src/tok.c000066400000000000000000000136461234304727700175260ustar00rootroot00000000000000/* * This file is part of nmealib. * * Copyright (c) 2008 Timur Sinitsyn * Copyright (c) 2011 Ferry Huberts * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #define NMEA_TOKS_COMPARE 1 #define NMEA_TOKS_PERCENT 2 #define NMEA_TOKS_WIDTH 3 #define NMEA_TOKS_TYPE 4 /** number conversion buffer size */ #define NMEA_CONVSTR_BUF 64 /** * Calculate crc control sum of a string. * If the string starts with a '$' then that character is skipped as per * the NMEA spec. * * @param s the string * @param len the length of the string * @return the crc */ int nmea_calc_crc(const char *s, const int len) { int chksum = 0; int it = 0; if (s[it] == '$') it++; for (; it < len; it++) chksum ^= (int) s[it]; return chksum; } /** * Convert string to an integer * * @param s the string * @param len the length of the string * @param radix the radix of the numbers in the string * @return the converted number, or 0 on failure */ int nmea_atoi(const char *s, int len, int radix) { char *tmp_ptr; char buff[NMEA_CONVSTR_BUF]; long res = 0; if (len < NMEA_CONVSTR_BUF) { memcpy(&buff[0], s, len); buff[len] = '\0'; res = strtol(&buff[0], &tmp_ptr, radix); } return (int) res; } /** * Convert string to a floating point number * * @param s the string * @param len the length of the string * @return the converted number, or 0 on failure */ double nmea_atof(const char *s, const int len) { char *tmp_ptr; char buff[NMEA_CONVSTR_BUF]; double res = 0; if (len < NMEA_CONVSTR_BUF) { memcpy(&buff[0], s, len); buff[len] = '\0'; res = strtod(&buff[0], &tmp_ptr); } return res; } /** * Formating string (like standart printf) with CRC tail (*CRC) * * @param s the string buffer to printf into * @param len the size of the string buffer * @param format the string format to use * @return the number of printed characters */ int nmea_printf(char *s, int len, const char *format, ...) { int retval; int add = 0; va_list arg_ptr; if (len <= 0) return 0; va_start(arg_ptr, format); retval = vsnprintf(s, len, format, arg_ptr); if (retval > 0) { add = snprintf(s + retval, len - retval, "*%02x\r\n", nmea_calc_crc(s + 1, retval - 1)); } retval += add; if (retval < 0 || retval > len) { memset(s, ' ', len); retval = len; } va_end(arg_ptr); return retval; } /** * Analyse a string (specific for NMEA sentences) * * @param s the string * @param len the length of the string * @param format the string format to use * @return the number of scanned characters */ int nmea_scanf(const char *s, int len, const char *format, ...) { const char *beg_tok; const char *end_buf = s + len; va_list arg_ptr; int tok_type = NMEA_TOKS_COMPARE; int width = 0; const char *beg_fmt = 0; int snum = 0, unum = 0; int tok_count = 0; void *parg_target; va_start(arg_ptr, format); for (; *format && s < end_buf; format++) { switch (tok_type) { case NMEA_TOKS_COMPARE: if ('%' == *format) tok_type = NMEA_TOKS_PERCENT; else if (*s++ != *format) goto fail; break; case NMEA_TOKS_PERCENT: width = 0; beg_fmt = format; tok_type = NMEA_TOKS_WIDTH; /* no break */ case NMEA_TOKS_WIDTH: if (isdigit(*format)) break; { tok_type = NMEA_TOKS_TYPE; if (format > beg_fmt) width = nmea_atoi(beg_fmt, (int) (format - beg_fmt), 10); } /* no break */ case NMEA_TOKS_TYPE: beg_tok = s; if (!width && ('c' == *format || 'C' == *format) && *s != format[1]) width = 1; if (width) { if (s + width <= end_buf) s += width; else goto fail; } else { if (!format[1] || (0 == (s = (char *) memchr(s, format[1], end_buf - s)))) s = end_buf; } if (s > end_buf) goto fail; tok_type = NMEA_TOKS_COMPARE; tok_count++; parg_target = 0; width = (int) (s - beg_tok); switch (*format) { case 'c': case 'C': parg_target = (void *) va_arg(arg_ptr, char *); if (width && 0 != (parg_target)) *((char *) parg_target) = *beg_tok; break; case 's': case 'S': parg_target = (void *) va_arg(arg_ptr, char *); if (width && 0 != (parg_target)) { memcpy(parg_target, beg_tok, width); ((char *) parg_target)[width] = '\0'; } break; case 'f': case 'g': case 'G': case 'e': case 'E': parg_target = (void *) va_arg(arg_ptr, double *); if (width && 0 != (parg_target)) *((double *) parg_target) = nmea_atof(beg_tok, width); break; default: break; } ; if (parg_target) break; if (0 == (parg_target = (void *) va_arg(arg_ptr, int *))) break; if (!width) break; switch (*format) { case 'd': case 'i': snum = nmea_atoi(beg_tok, width, 10); memcpy(parg_target, &snum, sizeof(int)); break; case 'u': unum = nmea_atoi(beg_tok, width, 10); memcpy(parg_target, &unum, sizeof(unsigned int)); break; case 'x': case 'X': unum = nmea_atoi(beg_tok, width, 16); memcpy(parg_target, &unum, sizeof(unsigned int)); break; case 'o': unum = nmea_atoi(beg_tok, width, 8); memcpy(parg_target, &unum, sizeof(unsigned int)); break; default: goto fail; } ; break; default: break; }; } fail: va_end(arg_ptr); return tok_count; } olsrd-0.6.6.2/lib/pud/olsrd.conf.sample000066400000000000000000000301011234304727700176220ustar00rootroot00000000000000LoadPlugin "/olsrd_pud.so.1.1.0" { # nodeIdType is used to indicate the type of the nodeId field and is a # number in the range 0-255, with the following meaning: # # 0 : MAC address of sending interface # (nodeId is not relevant) # 1 : an MSISDN number with 15 digits # 2 : a Tetra number with 17 digits # 3 : a DNS name # 4 : IPv4 address (OLSR main address) of the sending node # (nodeId is not relevant) # 6 : IPv6 address (OLSR main address) of the sending node # (nodeId is not relevant) # 7 : an AIS MMSI number with 9 digits # 8 : a URN number with 8 digits # 192 : a 7 digit number conforming to 'Nationaal Nummerplan # Brandweer Nederland' # 193 : a 6 digit number conforming to 'Nationaal Nummerplan # Ambulancezorg Nederland' # 194 : a 4 digit number in the range [1, 8191] # # other numbers are reserved # # Note: setting 4 or 6 is the same for olsrd: both mean 'use the main # IP address, which is either an IPv4 or an IPv6 address, depending # on the IP version under which olsrd is run. # # Default: 4 or 6, depending on the IP version olsrd is using # #PlParam "nodeIdType" "4" # nodeId is the node identification with the meaning as indicated by the # nodeIdType parameter. When not set AND the nodeIdType is 3 (DNS # name) then the hostname is used. # # Note: Both the nodeIdType and nodeId fields are transported over # OLSR, so care must be taken to keep the size of the nodeId # parameter down. # # Default: none # #PlParam "nodeId" "" # # RX Parameters # # rxNonOlsrIf is a network interface on the host on which the plugin will # listen for GPS multicasts. Multiple such interfaces can be # specified by specifying the parameter multiple times. # # Default: none # #PlParam "rxNonOlsrIf" "" # rxAllowedSourceIpAddress is an IP address from which the plugin is # allowed to process/parse GPS sentences. When # this parameter is not configured then GPS # sentences from ALL IP addresses are processed. # Multiple IP addresses can be specified by # specifying the parameter multiple times. # # Default: none # #PlParam "rxAllowedSourceIpAddress" "" # rxMcAddr is the multicast address on which the plugin will listen for GPS # multicasts. # # Default: 224.0.0.224 (IPv4) or FF02:0:0:0:0:0:0:1 (IPv6) # #PlParam "rxMcAddr" "224.0.0.224" # rxMcPort is the UDP port on which the plugin will listen for GPS # multicasts. # # Default: 2240 # #PlParam "rxMcPort" "2240" # positionFile is the file that contains the position information that the # plugin should use. When this parameter is set then the # file is read during olsrd startup. An example file is # available in the doc directory of olsrd. # # Default: none # #PlParam "positionFile" "" # Specifies the period in milliseconds on which to read the positionFile # (if it changed) and activate its new setting for the position. # This setting is only relevant if positionFile has been configured. # A setting of zero disables dynamic updates, the positionFile is then only # read during olsrd startup. # # Default: 0 # #PlParam "positionFilePeriod" "0" # # TX Parameters # # txNonOlsrIf is a network interface on the host on which the plugin will # transmit GPS multicasts that were received through the OLSR # network. Multiple such interfaces can be specified by # specifying the parameter multiple times. # # Default: none # #PlParam "txNonOlsrIf" "" # txMcAddr is the multicast address on which the plugin will transmit GPS # multicasts that were received through the OLSR network. # # Default: 224.0.0.224 (IPv4) or FF02:0:0:0:0:0:0:1 (IPv6) # #PlParam "txMcAddr" "224.0.0.224" # txMcPort is the UDP port on which the plugin will transmit GPS multicasts # that were received through the OLSR network. # # Default: 2240 # #PlParam "txMcPort" "2240" # txTtl is the TTL that is used when transmitting GPS multicasts that were # received through the OLSR network # # Default: 1 # #PlParam "txTtl" "1" # txNmeaMessagePrefix is the NMEA message prefix of GPS multicasts that the # plugin transmits. It must be exactly 4 characters # long. # # Default: NBSX # #PlParam "txNmeaMessagePrefix" "NBSX" # # Uplink Parameters # # uplinkAddr is the IP address to which the plugin will transmit GPS # position updates. When not set, no uplink messages will be # sent. # # Default: none # #PlParam "uplinkAddr" "" # uplinkPort is the UDP port to which the plugin will transmit GPS position # updates. Can't be the same as the downlink port. # # Default: 2241 # #PlParam "uplinkPort" "2241" # downlinkPort is the UDP port on which the plugin will receive GPS position # updates. Can't be the same as the uplink port. # The downlink is only active when a proper uplink has been # configured. # # Default: 2242 # #PlParam "downlinkPort" "2242" # # OLSR Parameters # # olsrTtl is the TTL that is used when sending messages over the OLSR # networks # # Default: 64 # #PlParam "olsrTtl" "64" # # Update Parameters # # updateIntervalStationary is the interval (in seconds) between position # updates sent over the OLSR network when the # node is stationary # # Default: 60 # #PlParam "updateIntervalStationary" "60" # updateIntervalMoving is the interval (in seconds) between position # updates sent over the OLSR network when the # node is moving # # Default: 5 # #PlParam "updateIntervalMoving" "5" # uplinkUpdateIntervalStationary is the interval (in seconds) between # position updates sent over the uplink when # the node is stationary # # Default: 180 # #PlParam "uplinkUpdateIntervalStationary" "180" # uplinkUpdateIntervalMoving is the interval (in seconds) between position # updates sent over the OLSR network when the # node is moving # # Default: 15 # #PlParam "uplinkUpdateIntervalMoving" "15" # gatewayDeterminationInterval is the interval (in seconds) on which # determination of the best gateway is # performed # # Default: 1 # #PlParam "gatewayDeterminationInterval" "1" # movingSpeedThreshold is the speed from which we consider the node is # moving # # Default: 9 # #PlParam "movingSpeedThreshold" "9" # movingDistanceThreshold is the distance from the previous position from # which we consider the node is moving # # Default: 50 # #PlParam "movingDistanceThreshold" "50" # dopMultiplier One of the situations that is seen as movement is when the # current position with its uncertainty circle no longer # overlaps the last transmitted position with its uncertainty # circle. This parameter is used to adjust the sizes of these # uncertainty circles: setting it to a value less than 1.0 # will make both uncertainty circles smaller by this factor, # resulting in earlier movement detection. Setting it to a # value larger than 1.0 will detect movement later. # # Default: 2.5 # #PlParam "dopMultiplier" "2.5" # defaultHdop is the default value that is taken for HDOP (in meters) in # determining whether we are moving when there is a position # available but no HDOP. # # Default: 50 # #PlParam "defaultHdop" "50" # defaultVdop is the default value that is taken for VDOP (in meters) in # determining whether we are moving when there is a position # available but no VDOP. # # Default: 50 # #PlParam "defaultVdop" "50" # averageDepth is the depth of the position average list, or the number # of positions that are averaged to obtain the average # position # # Default: 5 # #PlParam "averageDepth" "5" # hysteresisCountToStationary is the number of position updates that # effectuate a state transition from moving to # stationary that must be received before the # actual transition is taken # # Default: 17 # #PlParam "hysteresisCountToStationary" "17" # hysteresisCountToMoving is the number of position updates that effectuate # a state transition from stationary to moving that # must be received before the actual transition is # taken # # Default: 5 # #PlParam "hysteresisCountToMoving" "5" # gatewayHysteresisCountToStationary is the number of times the gateway # must be the same that effectuate a state transition from # moving to stationary that must be received # before the actual transition is taken # # Default: 17 # #PlParam "gatewayHysteresisCountToStationary" "17" # gatewayHysteresisCountToMoving is the number of gateway updates that # effectuate a state transition from stationary to # moving that must be received before the actual # transition is taken # # Default: 5 # #PlParam "gatewayHysteresisCountToMoving" "5" # # Other Plugin Parameters # # useDeDup determines whether duplicate message detection is to be # performed. When 0 then no such detection is performed, when 1 # then the detection is performed # # Default: true # #PlParam "useDeDup" "true" # deDupDepth the number of messages that are tracked to detect duplucates # messages received from the OLSR network # # Default: 256 # #PlParam "deDupDepth" "256" # useLoopback determines whether the message that is sent over the OLSR # network should be immediately looped back, thus pretending # that the message (that is sent by this node) is received from # the OLSR network. When 0 then no loopback is performed, when # 1 then the loopback is performed # # Default: false # #PlParam "useLoopback" "true" } olsrd-0.6.6.2/lib/pud/resources/000077500000000000000000000000001234304727700163675ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/resources/olsrd.pud.position.conf000066400000000000000000000027021234304727700230140ustar00rootroot00000000000000# # OLSrd PUD plugin position configuration file # # GPS operating mode. # Values : bad, 2d, 3d # Default: bad # Note : a value of 'bad' will make the resulting position information invalid # (the mask will indicate that all other information is not present) #fix = bad # GPS quality indicator. # Values : bad, low, mid, high # Default: high #sig = high # HDOP (Horizontal Dilution Of Precision) # Values : floating point value # Default: 0.0 # Note : From HDOP, VDOP and PDOP are determined: VDOP = HDOP, and PDOP = sqrt(2) * HDOP. #hdop = 0.0 # Latitude # Values : floating point value # Unit is NMEA like latitude: ddmm.sssss (d=degrees, m=minutes, s=seconds) # Default: 0000.00000 #lat = 0000.00000 # Longitude # Values: floating point value # Unit is NMEA like longitude: dddmm.sssss (d=degrees, m=minutes, s=seconds) # Default: 00000.00000 #lon = 00000.00000 # Elevation # Values: floating point value # Unit is meters above the mean sea level (geoid) # Default: 0.0 #elv = 0.0 # Speed # Values: floating point value # Unit is over the ground in kph # Default: 0.0 #speed = 0.0 # Track # Values: floating point value # Unit is (compass) degrees # Default: 0.0 #track = 0.0 # Magnetic Track # Values: floating point value # Unit is (compass) degrees # Default: 0.0 #mtrack = 0.0 # Magnetic Variation # Values: floating point value # Unit is (compass) degrees # Default: 0.0 #magvar = 0.0 olsrd-0.6.6.2/lib/pud/src/000077500000000000000000000000001234304727700151445ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/src/compiler.h000066400000000000000000000010661234304727700171320ustar00rootroot00000000000000#ifndef _PUD_COMPILER_H_ #define _PUD_COMPILER_H_ /** Compiler hint to expect x */ #ifndef likely # if defined(__GNUC__) # define likely(x) __builtin_expect((x),1) # else /* defined(__GNUC__) */ # define likely(x) (x) # endif /* defined(__GNUC__) */ #endif /* likely */ /** Compiler hint to not expect x */ #ifndef unlikely # if defined(__GNUC__) # define unlikely(x) __builtin_expect((x),0) # else /* defined(__GNUC__) */ # define unlikely(x) (x) # endif /* defined(__GNUC__) */ #endif /* unlikely */ #endif /* _PUD_COMPILER_H_ */ olsrd-0.6.6.2/lib/pud/src/configTools.c000066400000000000000000000164041234304727700176030ustar00rootroot00000000000000#include "configTools.h" /* Plugin includes */ #include "pud.h" #include "netTools.h" /* OLSR includes */ /* System includes */ #include #include #include #include #include #include /** Read a boolean from a string @param parameterName The name of the parameter, used when reporting errors @param str The string to convert to a boolean @param dst A pointer to the location where to store the boolean upon successful conversion Not touched when errors are reported. @return - true on success - false otherwise */ bool readBool(const char * parameterName, const char * str, bool * dst) { bool retVal = true; char * endPtr = NULL; unsigned long value; char * strDup = strdup(str); char * c; assert(parameterName != NULL); assert(str != NULL); assert(dst != NULL); /* convert to lowercase */ for (c = strDup; *c != '\0'; c++) { if (isalpha(*c) && !islower(*c)) { *c = tolower(*c); } } /* try true/yes/on */ if (!strcmp("true", strDup) || !strcmp("yes", strDup) || !strcmp("on", strDup)) { *dst = true; goto out; } /* try false/no/off */ if (!strcmp("false", strDup) || !strcmp("no", strDup) || !strcmp("off", strDup)) { *dst = false; goto out; } /* try a number */ errno = 0; value = strtoul(str, &endPtr, 10); if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) { /* invalid conversion */ pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str); retVal = false; goto out; } if (value > 1) { pudError(false, "Value of parameter %s (%lu) is outside of valid range 0-1", parameterName, value); retVal = false; goto out; } /* 0 = false, 1 = true */ *dst = (value == 1); out: free(strDup); return retVal; } /** Read an unsigned char number from a string @param parameterName The name of the parameter, used when reporting errors @param str The string to convert to a number @param dst A pointer to the location where to store the number upon successful conversion Not touched when errors are reported. @return - true on success - false otherwise */ bool readUC(const char * parameterName, const char * str, unsigned char * dst) { char * endPtr = NULL; unsigned long value; assert(parameterName != NULL); assert(str != NULL); assert(dst != NULL); errno = 0; value = strtoul(str, &endPtr, 10); if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) { /* invalid conversion */ pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str); return false; } if (value > 255) { pudError(false, "Value of parameter %s (%lu) is outside of valid range 0-255", parameterName, value); return false; } *dst = value; return true; } /** Read an unsigned short number from a string @param parameterName The name of the parameter, used when reporting errors @param str The string to convert to a number @param dst A pointer to the location where to store the number upon successful conversion Not touched when errors are reported. @return - true on success - false otherwise */ bool readUS(const char * parameterName, const char * str, unsigned short * dst) { char * endPtr = NULL; unsigned long value; assert(parameterName != NULL); assert(str != NULL); assert(dst != NULL); errno = 0; value = strtoul(str, &endPtr, 10); if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) { /* invalid conversion */ pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str); return false; } if (value > 65535) { pudError(false, "Value of parameter %s (%lu) is outside of valid range 0-65535", parameterName, value); return false; } *dst = value; return true; } /** Read an unsigned long long number from a string @param parameterName The name of the parameter, used when reporting errors @param str The string to convert to a number @param dst A pointer to the location where to store the number upon successful conversion Not touched when errors are reported. @return - true on success - false otherwise */ bool readULL(const char * parameterName, const char * str, unsigned long long * dst) { char * endPtr = NULL; unsigned long long value; assert(parameterName != NULL); assert(str != NULL); assert(dst != NULL); errno = 0; value = strtoull(str, &endPtr, 10); if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) { /* invalid conversion */ pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str); return false; } *dst = value; return true; } /** Read a double number from a string @param parameterName The name of the parameter, used when reporting errors @param str The string to convert to a number @param dst A pointer to the location where to store the number upon successful conversion Not touched when errors are reported. @return - true on success - false otherwise */ bool readDouble(const char * parameterName, const char * str, double * dst) { char * endPtr = NULL; double value; assert(parameterName != NULL); assert(str != NULL); assert(dst != NULL); errno = 0; value = strtod(str, &endPtr); if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) { /* invalid conversion */ pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str); return false; } *dst = value; return true; } /** Read an (olsr_sockaddr) IP address from a string: First tries to parse the value as an IPv4 address, and if not successful tries to parse it as an IPv6 address. When the address wasn't set yet, the default port (portDefault) is set. @param parameterName The name of the parameter, used when reporting errors @param str The string to convert to an (olsr_sockaddr) IP address @param portDefault The default for the port (in host byte order, stored in network byte order) @param dst A pointer to the location where to store the (olsr_sockadd) IP address upon successful conversion. Not touched when errors are reported. @param dstSet A pointer to the location where to store the flag that signals whether the IP address is set. Not touched when errors are reported. @return - true on success - false otherwise */ bool readIPAddress(const char * parameterName, const char * str, in_port_t portDefault, union olsr_sockaddr * dst, bool * dstSet) { union olsr_sockaddr ip; int conversion; in_port_t port; assert(parameterName != NULL); assert(str != NULL); assert(dst != NULL); assert(dstSet != NULL); /* try IPv4 first */ memset(&ip, 0, sizeof(ip)); ip.in.sa_family = AF_INET; conversion = inet_pton(ip.in.sa_family, str, &ip.in4.sin_addr); /* now try IPv6 if IPv4 conversion was not successful */ if (conversion != 1) { memset(&ip, 0, sizeof(ip)); ip.in.sa_family = AF_INET6; conversion = inet_pton(ip.in.sa_family, str, &ip.in6.sin6_addr); } if (conversion != 1) { pudError((conversion == -1) ? true : false, "Value of parameter %s (%s) is not an IP address", parameterName, str); return false; } if (!*dstSet) { port = htons(portDefault); } else { port = getOlsrSockaddrPort(dst, portDefault); } dst->in.sa_family = ip.in.sa_family; setOlsrSockaddrPort(dst, port); setOlsrSockaddrAddr(dst, &ip); *dstSet = true; return true; } olsrd-0.6.6.2/lib/pud/src/configTools.h000066400000000000000000000013501234304727700176020ustar00rootroot00000000000000#ifndef _PUD_CONFIGTOOLS_H_ #define _PUD_CONFIGTOOLS_H_ /* Plugin includes */ /* OLSR includes */ #include "olsr_types.h" /* System includes */ #include bool readBool(const char * parameterName, const char * str, bool * dst); bool readUC(const char * parameterName, const char * str, unsigned char * dst); bool readUS(const char * parameterName, const char * str, unsigned short * dst); bool readULL(const char * parameterName, const char * str, unsigned long long * dst); bool readDouble(const char * parameterName, const char * str, double * dst); bool readIPAddress(const char * parameterName, const char * ipStr, unsigned short portDefault, union olsr_sockaddr * dst, bool * dstSet); #endif /* PUD_CONFIGTOOLS_H_ */ olsrd-0.6.6.2/lib/pud/src/configuration.c000066400000000000000000001112761234304727700201670ustar00rootroot00000000000000#include "configuration.h" /* Plugin includes */ #include "pud.h" #include "networkInterfaces.h" #include "netTools.h" #include "posFile.h" #include "configTools.h" /* OLSR includes */ #include /* System includes */ #include #include #include #include /* * Note: * Setters must return true when an error is detected, false otherwise */ /* * nodeIdType */ /** The nodeIdType */ static NodeIdType nodeIdType = PUD_NODE_ID_TYPE_DEFAULT; /** @return The node ID type */ NodeIdType getNodeIdTypeNumber(void) { return nodeIdType; } int setNodeIdType(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_NODE_ID_TYPE_NAME; unsigned long long nodeIdTypeNew; if (!readULL(valueName, value, &nodeIdTypeNew)) { return true; } if (!isValidNodeIdType(nodeIdTypeNew)) { pudError(false, "Value of parameter %s (%llu) is reserved", valueName, nodeIdTypeNew); return true; } nodeIdType = nodeIdTypeNew; return false; } /* * nodeId */ /** The nodeId buffer */ static unsigned char nodeId[PUD_TX_NODEID_BUFFERSIZE]; /** The length of the string in the nodeId buffer */ static size_t nodeIdLength = 0; /** True when the nodeId is set */ static bool nodeIdSet = false; /** The nodeId as a binary representation, with status */ static nodeIdBinaryType nodeIdBinary; /** @return The node ID */ unsigned char * getNodeId(void) { return getNodeIdWithLength(NULL); } /** Get the nodeId and its length @param length a pointer to the variable in which to store the nodeId length (allowed to be NULL, in which case the length is not stored) @return The node ID */ unsigned char * getNodeIdWithLength(size_t *length) { if (!nodeIdSet) { setNodeId("", NULL, (set_plugin_parameter_addon) {.pc = NULL}); } if (length != NULL) { *length = nodeIdLength; } return &nodeId[0]; } /** Get the nodeIdBinary @return The node ID in binary representation */ nodeIdBinaryType * getNodeIdBinary(void) { if (!nodeIdBinary.set) { setNodeId("", NULL, (set_plugin_parameter_addon) {.pc = NULL}); } return &nodeIdBinary; } int setNodeId(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { size_t valueLength; assert (value != NULL); valueLength = strlen(value); if (valueLength > (PUD_TX_NODEID_BUFFERSIZE - 1)) { pudError(false, "Value of parameter %s is too long, maximum length is" " %u, current length is %lu", PUD_NODE_ID_NAME, (PUD_TX_NODEID_BUFFERSIZE - 1), (unsigned long) valueLength); return true; } strcpy((char *) &nodeId[0], value); nodeIdLength = valueLength; nodeIdSet = true; nodeIdBinary.set = false; return false; } /* * nodeId Validation */ /** Validate whether the configured nodeId is valid w.r.t. the configured nodeIdType, for types that are MAC addresses @return - true when ok - false on failure */ static bool intSetupNodeIdBinaryMAC(void) { unsigned char * mac = getMainIpMacAddress(); if (!mac) { return false; } return setupNodeIdBinaryMAC(&nodeIdBinary, mac); } /** Validate whether the configured nodeId is valid w.r.t. the configured nodeIdType, for types that fit in an unsigned long long (64 bits) @param min the minimum value @param max the maximum value @param bytes the number of bytes in the buffer @return - true when ok - false on failure */ static bool intSetupNodeIdBinaryLongLong(unsigned long long min, unsigned long long max, unsigned int bytes) { unsigned long long longValue = 0; if (!readULL(PUD_NODE_ID_NAME, (char *) getNodeId(), &longValue)) { return false; } if ((longValue < min) || (longValue > max)) { pudError(false, "%s value %llu is out of range [%llu,%llu]", PUD_NODE_ID_NAME, longValue, min, max); return false; } return setupNodeIdBinaryLongLong(&nodeIdBinary, longValue, bytes); } /** Validate whether the configured nodeId is valid w.r.t. the configured nodeIdType, for types that are strings @return - true when ok - false on failure */ static bool intSetupNodeIdBinaryString(void) { char report[256]; size_t nodeidlength; char * nodeid = (char *)getNodeIdWithLength(&nodeidlength); if (nmea_parse_sentence_has_invalid_chars(nodeid, nodeidlength, PUD_NODE_ID_NAME, &report[0], sizeof(report))) { pudError(false, "%s", &report[0]); return false; } if (nodeidlength > (PUD_TX_NODEID_BUFFERSIZE - 1)) { pudError(false, "Length of parameter %s (%s) is too great", PUD_NODE_ID_NAME, &nodeid[0]); return false; } return setupNodeIdBinaryString(&nodeIdBinary, nodeid, nodeidlength); } /** Validate whether the configured nodeId is valid w.r.t. the configured nodeIdType, for types that are IP addresses @return - true when ok - false on failure */ static bool intSetupNodeIdBinaryIp(void) { void * src; size_t length; if (olsr_cnf->ip_version == AF_INET) { src = &olsr_cnf->main_addr.v4; length = sizeof(struct in_addr); } else { src = &olsr_cnf->main_addr.v6; length = sizeof(struct in6_addr); } return setupNodeIdBinaryIp(&nodeIdBinary, src, length); } /** Validate whether the configured nodeId is valid w.r.t. the configured nodeIdType and setup the binary value @return - true when ok - false on failure */ static bool setupNodeIdBinaryAndValidate(NodeIdType nodeIdTypeNumber) { switch (nodeIdTypeNumber) { case PUD_NODEIDTYPE_MAC: /* hardware address */ return intSetupNodeIdBinaryMAC(); case PUD_NODEIDTYPE_MSISDN: /* an MSISDN number */ return intSetupNodeIdBinaryLongLong(PUD_NODEIDTYPE_MSISDN_MIN, PUD_NODEIDTYPE_MSISDN_MAX, PUD_NODEIDTYPE_MSISDN_BYTES); case PUD_NODEIDTYPE_TETRA: /* a Tetra number */ return intSetupNodeIdBinaryLongLong(PUD_NODEIDTYPE_TETRA_MIN, PUD_NODEIDTYPE_TETRA_MAX, PUD_NODEIDTYPE_TETRA_BYTES); case PUD_NODEIDTYPE_DNS: /* DNS name */ return intSetupNodeIdBinaryString(); case PUD_NODEIDTYPE_MMSI: /* an AIS MMSI number */ return intSetupNodeIdBinaryLongLong(PUD_NODEIDTYPE_MMSI_MIN, PUD_NODEIDTYPE_MMSI_MAX, PUD_NODEIDTYPE_MMSI_BYTES); case PUD_NODEIDTYPE_URN: /* a URN number */ return intSetupNodeIdBinaryLongLong(PUD_NODEIDTYPE_URN_MIN, PUD_NODEIDTYPE_URN_MAX, PUD_NODEIDTYPE_URN_BYTES); case PUD_NODEIDTYPE_192: return intSetupNodeIdBinaryLongLong(PUD_NODEIDTYPE_192_MIN, PUD_NODEIDTYPE_192_MAX, PUD_NODEIDTYPE_192_BYTES); case PUD_NODEIDTYPE_193: return intSetupNodeIdBinaryLongLong(PUD_NODEIDTYPE_193_MIN, PUD_NODEIDTYPE_193_MAX, PUD_NODEIDTYPE_193_BYTES); case PUD_NODEIDTYPE_194: return intSetupNodeIdBinaryLongLong(PUD_NODEIDTYPE_194_MIN, PUD_NODEIDTYPE_194_MAX, PUD_NODEIDTYPE_194_BYTES); case PUD_NODEIDTYPE_IPV4: /* IPv4 address */ case PUD_NODEIDTYPE_IPV6: /* IPv6 address */ default: /* unsupported */ return intSetupNodeIdBinaryIp(); } return false; } /* * rxNonOlsrIf */ /** The maximum number of RX non-OLSR interfaces */ #define PUD_RX_NON_OLSR_IF_MAX 32 /** Array with RX non-OLSR interface names */ static unsigned char rxNonOlsrInterfaceNames[PUD_RX_NON_OLSR_IF_MAX][IFNAMSIZ + 1]; /** The number of RX non-OLSR interface names in the array */ static unsigned int rxNonOlsrInterfaceCount = 0; /** Determine whether a give interface name is configured as a receive non-OLSR interface. @param ifName The interface name to check @return - true when the given interface name is configured as a receive non-OLSR interface - false otherwise */ bool isRxNonOlsrInterface(const char *ifName) { unsigned int i; assert (ifName != NULL); for (i = 0; i < rxNonOlsrInterfaceCount; i++) { if (strncmp((char *) &rxNonOlsrInterfaceNames[i][0], ifName, IFNAMSIZ + 1) == 0) { return true; } } return false; } int addRxNonOlsrInterface(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { size_t valueLength; if (rxNonOlsrInterfaceCount >= PUD_RX_NON_OLSR_IF_MAX) { pudError(false, "Can't configure more than %u receive interfaces", PUD_RX_NON_OLSR_IF_MAX); return true; } assert (value != NULL); valueLength = strlen(value); if (valueLength > IFNAMSIZ) { pudError(false, "Value of parameter %s (%s) is too long," " maximum length is %u, current length is %lu", PUD_RX_NON_OLSR_IF_NAME, value, IFNAMSIZ, (long unsigned int)valueLength); return true; } if (!isRxNonOlsrInterface(value)) { strcpy((char *) &rxNonOlsrInterfaceNames[rxNonOlsrInterfaceCount][0], value); rxNonOlsrInterfaceCount++; } return false; } /** * @return the number of configured non-olsr receive interfaces */ unsigned int getRxNonOlsrInterfaceCount(void) { return rxNonOlsrInterfaceCount; } /** * @param idx the index of the configured non-olsr receive interface * @return the index-th interface name */ unsigned char * getRxNonOlsrInterfaceName(unsigned int idx) { return &rxNonOlsrInterfaceNames[idx][0]; } /* * rxAllowedSourceIpAddress */ /** The maximum number of RX allowed source IP addresses */ #define PUD_RX_ALLOWED_SOURCE_IP_MAX 32 /** Array with RX allowed source IP addresses */ static union olsr_sockaddr rxAllowedSourceIpAddresses[PUD_RX_ALLOWED_SOURCE_IP_MAX]; /** The number of RX allowed source IP addresses in the array */ static unsigned int rxAllowedSourceIpAddressesCount = 0; /** Determine whether a give IP address is configured as an allowed source IP address. @param sender The IP address to check @return - true when the given IP address is configured as an allowed source IP address - false otherwise */ bool isRxAllowedSourceIpAddress(union olsr_sockaddr * sender) { unsigned int i; if (rxAllowedSourceIpAddressesCount == 0) { return true; } if (sender == NULL) { return false; } for (i = 0; i < rxAllowedSourceIpAddressesCount; i++) { if (sender->in.sa_family != rxAllowedSourceIpAddresses[i].in.sa_family) { continue; } if (sender->in.sa_family == AF_INET) { if (memcmp(&rxAllowedSourceIpAddresses[i].in4.sin_addr, &sender->in4.sin_addr, sizeof(struct in_addr)) == 0) { return true; } } else { if (memcmp(&rxAllowedSourceIpAddresses[i].in6.sin6_addr, &sender->in6.sin6_addr, sizeof(struct in6_addr)) == 0) { return true; } } } return false; } int addRxAllowedSourceIpAddress(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_RX_ALLOWED_SOURCE_IP_NAME; union olsr_sockaddr addr; bool addrSet = false; if (rxAllowedSourceIpAddressesCount >= PUD_RX_ALLOWED_SOURCE_IP_MAX) { pudError(false, "Can't configure more than %u allowed source IP" " addresses", PUD_RX_ALLOWED_SOURCE_IP_MAX); return true; } if (!readIPAddress(valueName, value, 0, &addr, &addrSet)) { return true; } if (!isRxAllowedSourceIpAddress(&addr)) { rxAllowedSourceIpAddresses[rxAllowedSourceIpAddressesCount] = addr; rxAllowedSourceIpAddressesCount++; } return false; } /* * rxMcAddr + rxMcPort */ /** The rx multicast address */ static union olsr_sockaddr rxMcAddr; /** True when the rx multicast address is set */ static bool rxMcAddrSet = false; /** @return The receive multicast address (in network byte order). Sets both the address and the port to their default values when the address was not yet set. */ union olsr_sockaddr * getRxMcAddr(void) { if (!rxMcAddrSet) { setRxMcAddr((olsr_cnf->ip_version == AF_INET) ? PUD_RX_MC_ADDR_4_DEFAULT : PUD_RX_MC_ADDR_6_DEFAULT, NULL, ((set_plugin_parameter_addon) {.pc = NULL})); } return &rxMcAddr; } int setRxMcAddr(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_RX_MC_ADDR_NAME; if (!readIPAddress(valueName, value, PUD_RX_MC_PORT_DEFAULT, &rxMcAddr, &rxMcAddrSet)) { return true; } if (!isMulticast(&rxMcAddr)) { pudError(false, "Value of parameter %s (%s) is not a multicast address", valueName, value); return true; } return false; } /** @return The receive multicast port (in network byte order) */ unsigned short getRxMcPort(void) { return getOlsrSockaddrPort(getRxMcAddr(), PUD_RX_MC_PORT_DEFAULT); } int setRxMcPort(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_RX_MC_PORT_NAME; unsigned short rxMcPortNew; if (!readUS(valueName, value, &rxMcPortNew)) { return true; } if (rxMcPortNew < 1) { pudError(false, "Value of parameter %s (%u) is outside of valid range 1-65535", valueName, rxMcPortNew); return true; } setOlsrSockaddrPort(getRxMcAddr(), htons((in_port_t) rxMcPortNew)); return false; } /* * positionFile */ /** The positionFile buffer */ static char positionFile[PATH_MAX + 1]; /** True when the positionFile is set */ static bool positionFileSet = false; /** @return The positionFile (NULL when not set) */ char * getPositionFile(void) { if (!positionFileSet) { return NULL; } return &positionFile[0]; } int setPositionFile(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { size_t valueLength; assert(value != NULL); valueLength = strlen(value); if (valueLength > PATH_MAX) { pudError(false, "Value of parameter %s is too long, maximum length is" " %u, current length is %lu", PUD_POSFILE_NAME, PATH_MAX, (unsigned long) valueLength); return true; } strcpy((char *) &positionFile[0], value); positionFileSet = true; return false; } /* * positionFilePeriod */ /** The positionFilePeriod value (milliseconds) */ unsigned long long positionFilePeriod = PUD_POSFILEPERIOD_DEFAULT; /** @return The positionFilePeriod (in milliseconds) */ unsigned long long getPositionFilePeriod(void) { return positionFilePeriod; } /** Set the positionFilePeriod @param value The positionFilePeriod (a number in string representation) @param data Unused @param addon Unused @return - true when an error is detected - false otherwise */ int setPositionFilePeriod(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_POSFILEPERIOD_NAME; unsigned long long positionFilePeriodNew; assert(value != NULL); if (!readULL(valueName, value, &positionFilePeriodNew)) { return true; } if ((positionFilePeriodNew != 0) && ((positionFilePeriodNew < PUD_POSFILEPERIOD_MIN) || (positionFilePeriodNew > PUD_POSFILEPERIOD_MAX))) { pudError(false, "Configured %s (%llu) is outside of" " valid range %llu-%llu", valueName, positionFilePeriodNew, PUD_POSFILEPERIOD_MIN, PUD_POSFILEPERIOD_MAX); return true; } positionFilePeriod = positionFilePeriodNew; return false; } /* * txNonOlsrIf */ /** The maximum number of tx non-olsr interfaces */ #define PUD_TX_NON_OLSR_IF_MAX 32 /** Array with tx non-olsr interface names */ static unsigned char txNonOlsrInterfaceNames[PUD_TX_NON_OLSR_IF_MAX][IFNAMSIZ + 1]; /** The number of tx interface names in the array */ static unsigned int txNonOlsrInterfaceCount = 0; /** Determine whether a give interface name is configured as a transmit non-OLSR interface. @param ifName The interface to check @return - true when the given interface name is configured as a transmit non-OLSR interface - false otherwise */ bool isTxNonOlsrInterface(const char *ifName) { unsigned int i; assert (ifName != NULL); for (i = 0; i < txNonOlsrInterfaceCount; i++) { if (strncmp((char *) &txNonOlsrInterfaceNames[i][0], ifName, IFNAMSIZ + 1) == 0) { return true; } } return false; } int addTxNonOlsrInterface(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { size_t valueLength; assert (value != NULL); if (txNonOlsrInterfaceCount >= PUD_TX_NON_OLSR_IF_MAX) { pudError(false, "Can not configure more than %u transmit interfaces", PUD_TX_NON_OLSR_IF_MAX); return true; } valueLength = strlen(value); if (valueLength > IFNAMSIZ) { pudError(false, "Value of parameter %s (%s) is too long, maximum length is %u, current length is %lu", PUD_TX_NON_OLSR_IF_NAME, value, IFNAMSIZ, (long unsigned int)valueLength); return true; } if (!isTxNonOlsrInterface(value)) { strcpy((char *) &txNonOlsrInterfaceNames[txNonOlsrInterfaceCount][0], value); txNonOlsrInterfaceCount++; } return false; } /** * @return the number of configured non-olsr transmit interfaces */ unsigned int getTxNonOlsrInterfaceCount(void) { return txNonOlsrInterfaceCount; } /** * @param idx the index of the configured non-olsr transmit interface * @return the index-th interface name */ unsigned char * getTxNonOlsrInterfaceName(unsigned int idx) { return &txNonOlsrInterfaceNames[idx][0]; } /* * txMcAddr + txMcPort */ /** The tx multicast address */ static union olsr_sockaddr txMcAddr; /** True when the tx multicast address is set */ static bool txMcAddrSet = false; /** @return The transmit multicast address (in network byte order). Sets both the address and the port to their default values when the address was not yet set. */ union olsr_sockaddr * getTxMcAddr(void) { if (!txMcAddrSet) { setTxMcAddr((olsr_cnf->ip_version == AF_INET) ? PUD_TX_MC_ADDR_4_DEFAULT : PUD_TX_MC_ADDR_6_DEFAULT, NULL, ((set_plugin_parameter_addon) {.pc = NULL})); } return &txMcAddr; } int setTxMcAddr(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_TX_MC_ADDR_NAME; if (!readIPAddress(valueName, value, PUD_TX_MC_PORT_DEFAULT, &txMcAddr, &txMcAddrSet)) { return true; } if (!isMulticast(&txMcAddr)) { pudError(false, "Value of parameter %s (%s) is not a multicast address", valueName, value); return true; } return false; } /** @return The transmit multicast port (in network byte order) */ unsigned short getTxMcPort(void) { return getOlsrSockaddrPort(getTxMcAddr(), PUD_TX_MC_PORT_DEFAULT); } int setTxMcPort(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_TX_MC_PORT_NAME; unsigned short txMcPortNew; if (!readUS(valueName, value, &txMcPortNew)) { return true; } if (txMcPortNew < 1) { pudError(false, "Value of parameter %s (%u) is outside of valid range 1-65535", valueName, txMcPortNew); return true; } setOlsrSockaddrPort(getTxMcAddr(), htons((in_port_t) txMcPortNew)); return false; } /* * txTtl */ /** The tx TTL */ static unsigned char txTtl = PUD_TX_TTL_DEFAULT; /** @return The transmit multicast IP packet time-to-live */ unsigned char getTxTtl(void) { return txTtl; } int setTxTtl(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_TX_TTL_NAME; if (!readUC(valueName, value, &txTtl)) { return true; } if ((txTtl < 1) /* || (txTtl > MAX_TTL) */) { pudError(false, "Value of parameter %s (%u) is outside of" " valid range 1-%u", valueName, txTtl, MAX_TTL); return true; } return false; } /* * txNmeaMessagePrefix */ /** The exact length of the tx NMEA message prefix */ #define PUD_TXNMEAMESSAGEPREFIXLENGTH 4 /** The tx NMEA message prefix buffer */ static unsigned char txNmeaMessagePrefix[PUD_TXNMEAMESSAGEPREFIXLENGTH + 1]; /** True when the tx NMEA message prefix is set */ static bool txNmeaMessagePrefixSet = false; /** @return The transmit multicast NMEA message prefix */ unsigned char * getTxNmeaMessagePrefix(void) { if (!txNmeaMessagePrefixSet) { setTxNmeaMessagePrefix(PUD_TX_NMEAMESSAGEPREFIX_DEFAULT, NULL, (set_plugin_parameter_addon) {.pc = NULL}); } return &txNmeaMessagePrefix[0]; } int setTxNmeaMessagePrefix(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_TX_NMEAMESSAGEPREFIX_NAME; size_t valueLength; char report[256]; assert (value != NULL); valueLength = strlen(value); if (valueLength != PUD_TXNMEAMESSAGEPREFIXLENGTH) { pudError(false, "Length of parameter %s (%s) must be exactly %u characters", valueName, value, PUD_TXNMEAMESSAGEPREFIXLENGTH); return true; } if (nmea_parse_sentence_has_invalid_chars(value, valueLength, valueName, &report[0], sizeof(report))) { pudError(false, "%s", &report[0]); return true; } if ((strchr(value, ' ') != NULL) || (strchr(value, '\t') != NULL)) { pudError(false, "Value of parameter %s (%s) can not contain whitespace", valueName, value); return true; } strcpy((char *) &txNmeaMessagePrefix[0], value); txNmeaMessagePrefixSet = true; return false; } /* * uplinkAddr + uplinkPort */ /** The uplink address */ static union olsr_sockaddr uplinkAddr; /** True when the uplink address is set */ static bool uplinkAddrSet = false; /** @return - true when the uplink address is set - false otherwise */ bool isUplinkAddrSet(void) { return uplinkAddrSet; } /** @return The uplink address (in network byte order). Sets both the address and the port to their default values when the address was not yet set. */ union olsr_sockaddr * getUplinkAddr(void) { if (!uplinkAddrSet) { setUplinkAddr((olsr_cnf->ip_version == AF_INET) ? PUD_UPLINK_ADDR_4_DEFAULT : PUD_UPLINK_ADDR_6_DEFAULT, NULL, ((set_plugin_parameter_addon) {.pc = NULL})); } return &uplinkAddr; } int setUplinkAddr(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { return !readIPAddress(PUD_UPLINK_ADDR_NAME, value, PUD_UPLINK_PORT_DEFAULT, &uplinkAddr, &uplinkAddrSet); } /** @return The uplink port (in network byte order) */ unsigned short getUplinkPort(void) { return getOlsrSockaddrPort(getUplinkAddr(), PUD_UPLINK_PORT_DEFAULT); } int setUplinkPort(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_UPLINK_PORT_NAME; unsigned short uplinkPortNew; if (!readUS(valueName, value, &uplinkPortNew)) { return true; } if (uplinkPortNew < 1) { pudError(false, "Value of parameter %s (%u) is outside of valid range 1-65535", valueName, uplinkPortNew); return true; } setOlsrSockaddrPort(getUplinkAddr(), htons((in_port_t) uplinkPortNew)); return false; } /* * downlinkPort */ /** the downlink port */ unsigned short downlinkPort = 0; /** true when the downlinkPort is set */ bool downlinkPortSet = false; /** @return The downlink port (in network byte order) */ unsigned short getDownlinkPort(void) { if (!downlinkPortSet) { downlinkPort = htons(PUD_DOWNLINK_PORT_DEFAULT); downlinkPortSet = true; } return downlinkPort; } int setDownlinkPort(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_DOWNLINK_PORT_NAME; unsigned short downlinkPortNew; if (!readUS(valueName, value, &downlinkPortNew)) { return true; } if (downlinkPortNew < 1) { pudError(false, "Value of parameter %s (%u) is outside of valid range 1-65535", valueName, downlinkPortNew); return true; } downlinkPort = htons(downlinkPortNew); downlinkPortSet = true; return false; } /* * olsrTtl */ /** The OLSR TTL */ static unsigned char olsrTtl = PUD_OLSR_TTL_DEFAULT; /** @return The OLSR multicast IP packet time-to-live */ unsigned char getOlsrTtl(void) { return olsrTtl; } int setOlsrTtl(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_OLSR_TTL_NAME; if (!readUC(valueName, value, &olsrTtl)) { return true; } if ((olsrTtl < 1) /* || (olsrTtl > MAX_TTL) */) { pudError(false, "Value of parameter %s (%u) is outside of valid range 1-%u", valueName, olsrTtl, MAX_TTL); return true; } return false; } /* * updateIntervalStationary */ /** The stationary interval update plugin parameter (in seconds) */ static unsigned long long updateIntervalStationary = PUD_UPDATE_INTERVAL_STATIONARY_DEFAULT; /** @return The stationary interval update plugin parameter (in seconds) */ unsigned long long getUpdateIntervalStationary(void) { return updateIntervalStationary; } int setUpdateIntervalStationary(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_UPDATE_INTERVAL_STATIONARY_NAME; if (!readULL(valueName, value, &updateIntervalStationary)) { return true; } if (updateIntervalStationary < 1) { pudError(false, "Value of parameter %s must be at least 1", valueName); return true; } return false; } /* * updateIntervalMoving */ /** The moving interval update plugin parameter (in seconds) */ static unsigned long long updateIntervalMoving = PUD_UPDATE_INTERVAL_MOVING_DEFAULT; /** @return The moving interval update plugin parameter (in seconds) */ unsigned long long getUpdateIntervalMoving(void) { return updateIntervalMoving; } int setUpdateIntervalMoving(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_UPDATE_INTERVAL_MOVING_NAME; if (!readULL(valueName, value, &updateIntervalMoving)) { return true; } if (updateIntervalMoving < 1) { pudError(false, "Value of parameter %s must be at least 1", valueName); return true; } return false; } /* * uplinkUpdateIntervalStationary */ /** The uplink stationary interval update plugin parameter (in seconds) */ static unsigned long long uplinkUpdateIntervalStationary = PUD_UPLINK_UPDATE_INTERVAL_STATIONARY_DEFAULT; /** @return The uplink stationary interval update plugin parameter (in seconds) */ unsigned long long getUplinkUpdateIntervalStationary(void) { return uplinkUpdateIntervalStationary; } int setUplinkUpdateIntervalStationary(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_UPLINK_UPDATE_INTERVAL_STATIONARY_NAME; if (!readULL(valueName, value, &uplinkUpdateIntervalStationary)) { return true; } if (uplinkUpdateIntervalStationary < 1) { pudError(false, "Value of parameter %s must be at least 1", valueName); return true; } return false; } /* * uplinkUpdateIntervalMoving */ /** The uplink moving interval update plugin parameter (in seconds) */ static unsigned long long uplinkUpdateIntervalMoving = PUD_UPLINK_UPDATE_INTERVAL_MOVING_DEFAULT; /** @return The uplink moving interval update plugin parameter (in seconds) */ unsigned long long getUplinkUpdateIntervalMoving(void) { return uplinkUpdateIntervalMoving; } int setUplinkUpdateIntervalMoving(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_UPLINK_UPDATE_INTERVAL_MOVING_NAME; if (!readULL(valueName, value, &uplinkUpdateIntervalMoving)) { return true; } if (uplinkUpdateIntervalMoving < 1) { pudError(false, "Value of parameter %s must be at least 1", valueName); return true; } return false; } /* * gatewayDeterminationInterval */ /** The gateway determination interval plugin parameter (in seconds) */ static unsigned long long gatewayDeterminationInterval = PUD_GATEWAY_DETERMINATION_INTERVAL_DEFAULT; /** @return The gateway determination interval plugin parameter (in seconds) */ unsigned long long getGatewayDeterminationInterval(void) { return gatewayDeterminationInterval; } int setGatewayDeterminationInterval(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_GATEWAY_DETERMINATION_INTERVAL_NAME; if (!readULL(valueName, value, &gatewayDeterminationInterval)) { return true; } if (gatewayDeterminationInterval < 1) { pudError(false, "Value of parameter %s must be at least 1", valueName); return true; } return false; } /* * movingSpeedThreshold */ /** The moving speed threshold plugin parameter (in kph) */ static unsigned long long movingSpeedThreshold = PUD_MOVING_SPEED_THRESHOLD_DEFAULT; /** @return The moving speed threshold plugin parameter (in kph) */ unsigned long long getMovingSpeedThreshold(void) { return movingSpeedThreshold; } int setMovingSpeedThreshold(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { return !readULL(PUD_MOVING_SPEED_THRESHOLD_NAME, value, &movingSpeedThreshold); } /* * movingDistanceThreshold */ /** The moving distance threshold plugin parameter (in meters) */ static unsigned long long movingDistanceThreshold = PUD_MOVING_DISTANCE_THRESHOLD_DEFAULT; /** @return The moving distance threshold plugin parameter (in meters) */ unsigned long long getMovingDistanceThreshold(void) { return movingDistanceThreshold; } int setMovingDistanceThreshold(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { return !readULL(PUD_MOVING_DISTANCE_THRESHOLD_NAME, value, &movingDistanceThreshold); } /* * dopMultiplier */ /** The DOP multiplier plugin parameter */ static double dopMultiplier = PUD_DOP_MULTIPLIER_DEFAULT; /** @return The DOP multiplier plugin parameter */ double getDopMultiplier(void) { return dopMultiplier; } int setDopMultiplier(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { return !readDouble(PUD_DOP_MULTIPLIER_NAME, value, &dopMultiplier); } /* * defaultHdop */ /** The default HDOP plugin parameter (in meters) */ static unsigned long long defaultHdop = PUD_DEFAULT_HDOP_DEFAULT; /** @return The default HDOP plugin parameter (in meters) */ unsigned long long getDefaultHdop(void) { return defaultHdop; } int setDefaultHdop(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { return !readULL(PUD_DEFAULT_HDOP_NAME, value, &defaultHdop); } /* * defaultVdop */ /** The default VDOP plugin parameter (in meters) */ static unsigned long long defaultVdop = PUD_DEFAULT_VDOP_DEFAULT; /** @return The default VDOP plugin parameter (in meters) */ unsigned long long getDefaultVdop(void) { return defaultVdop; } int setDefaultVdop(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { return !readULL(PUD_DEFAULT_VDOP_NAME, value, &defaultVdop); } /* * averageDepth */ /** The depth of the average list */ static unsigned long long averageDepth = PUD_AVERAGE_DEPTH_DEFAULT; /** @return The depth of the average list */ unsigned long long getAverageDepth(void) { return averageDepth; } int setAverageDepth(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = PUD_AVERAGE_DEPTH_NAME; if (!readULL(valueName, value, &averageDepth)) { return true; } if (averageDepth < 1) { pudError(false, "Value of parameter %s must be at least 1", valueName); return true; } return false; } /* * hysteresisCountToStationary */ /** The hysteresis count for changing state from moving to stationary */ static unsigned long long hysteresisCountToStationary = PUD_HYSTERESIS_COUNT_2STAT_DEFAULT; /** @return The hysteresis count for changing state from moving to stationary */ unsigned long long getHysteresisCountToStationary(void) { return hysteresisCountToStationary; } int setHysteresisCountToStationary(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { return !readULL(PUD_HYSTERESIS_COUNT_2STAT_NAME, value, &hysteresisCountToStationary); } /* * hysteresisCountToMoving */ /** The hysteresis count for changing state from stationary to moving */ static unsigned long long hysteresisCountToMoving = PUD_HYSTERESIS_COUNT_2MOV_DEFAULT; /** @return The hysteresis count for changing state from stationary to moving */ unsigned long long getHysteresisCountToMoving(void) { return hysteresisCountToMoving; } int setHysteresisCountToMoving(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { return !readULL(PUD_HYSTERESIS_COUNT_2MOV_NAME, value, &hysteresisCountToMoving); } /* * gatewayHysteresisCountToStationary */ /** The hysteresis count for changing state from moving to stationary */ static unsigned long long gatewayHysteresisCountToStationary = PUD_GAT_HYSTERESIS_COUNT_2STAT_DEFAULT; /** @return The hysteresis count for changing state from moving to stationary */ unsigned long long getGatewayHysteresisCountToStationary(void) { return gatewayHysteresisCountToStationary; } int setGatewayHysteresisCountToStationary(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { return !readULL(PUD_GAT_HYSTERESIS_COUNT_2STAT_NAME, value, &gatewayHysteresisCountToStationary); } /* * gatewayHysteresisCountToMoving */ /** The hysteresis count for changing state from stationary to moving */ static unsigned long long gatewayHysteresisCountToMoving = PUD_GAT_HYSTERESIS_COUNT_2MOV_DEFAULT; /** @return The hysteresis count for changing state from stationary to moving */ unsigned long long getGatewayHysteresisCountToMoving(void) { return gatewayHysteresisCountToMoving; } int setGatewayHysteresisCountToMoving(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { return !readULL(PUD_GAT_HYSTERESIS_COUNT_2MOV_NAME, value, &gatewayHysteresisCountToMoving); } /* * useDeDup */ /** when true then duplicate message detection is performed */ static bool useDeDup = PUD_USE_DEDUP_DEFAULT; /** @return The duplicate message detection setting */ bool getUseDeDup(void) { return useDeDup; } int setUseDeDup(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { return !readBool(PUD_USE_DEDUP_NAME, value, &useDeDup); } /* * deDupDepth */ /** The deduplication depth */ static unsigned long long deDupDepth = PUD_DEDUP_DEPTH_DEFAULT; /** @return The deduplication depth */ unsigned long long getDeDupDepth(void) { return deDupDepth; } int setDeDupDepth(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { return !readULL(PUD_DEDUP_DEPTH_NAME, value, &deDupDepth); } /* * useLoopback */ /** when true then loopback is performed */ static bool useLoopback = PUD_USE_LOOPBACK_DEFAULT; /** @return The loopback usage setting */ bool getUseLoopback(void) { return useLoopback; } int setUseLoopback(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { return !readBool(PUD_USE_LOOPBACK_NAME, value, &useLoopback); } /* * Check Functions */ /** Check the configuration for consistency and validity. @return - true when the configuration is consistent and valid - false otherwise */ unsigned int checkConfig(void) { int retval = true; if (rxNonOlsrInterfaceCount == 0) { pudError(false, "No receive non-OLSR interfaces configured"); retval = false; } if (txNonOlsrInterfaceCount == 0) { pudError(false, "No transmit non-OLSR interfaces configured"); retval = false; } if (!nodeIdSet) { if (nodeIdType == PUD_NODEIDTYPE_DNS) { char name[PUD_TX_NODEID_BUFFERSIZE]; errno = 0; if (gethostname(&name[0], sizeof(name)) < 0) { pudError(true, "Could not get the host name"); retval = false; } else { setNodeId(&name[0], NULL, (set_plugin_parameter_addon) {.pc = NULL}); } name[PUD_TX_NODEID_BUFFERSIZE - 1] = '\0'; } else if ((nodeIdType != PUD_NODEIDTYPE_MAC) && (nodeIdType != PUD_NODEIDTYPE_IPV4) && (nodeIdType != PUD_NODEIDTYPE_IPV6)) { pudError(false, "No node ID set while one is required for" " node type %u", nodeIdType); retval = false; } } if (!setupNodeIdBinaryAndValidate(nodeIdType)) { retval = false; } if (updateIntervalMoving > updateIntervalStationary) { pudError(false,"The update interval for moving situations must not be" " larger than that for stationary situations"); retval = false; } if (uplinkUpdateIntervalMoving > uplinkUpdateIntervalStationary) { pudError(false,"The uplink update interval for moving situations must not be" " larger than that for stationary situations"); retval = false; } if (isUplinkAddrSet() && (getUplinkPort() == getDownlinkPort())) { pudError(false, "The uplink port and the downlink port must not be the same"); retval = false; } return retval; } /** Check the configuration for consistency and validity after everything has been setup. @return - true when the configuration is consistent and valid - false otherwise */ unsigned int checkRunSetup(void) { return true; } olsrd-0.6.6.2/lib/pud/src/configuration.h000066400000000000000000000336051234304727700201730ustar00rootroot00000000000000#ifndef _PUD_CONFIGURATION_H_ #define _PUD_CONFIGURATION_H_ /* Plugin includes */ /* OLSR includes */ #include "olsrd_plugin.h" #include "olsr_types.h" /* System includes */ #include #include #include /* * Global Parameters */ /** The name of the nodeIdType plugin parameter */ #define PUD_NODE_ID_TYPE_NAME "nodeIdType" /** The default value of the nodeIdType plugin parameter */ #define PUD_NODE_ID_TYPE_DEFAULT PUD_NODEIDTYPE_IPV4 NodeIdType getNodeIdTypeNumber(void); int setNodeIdType(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the nodeId plugin parameter */ #define PUD_NODE_ID_NAME "nodeId" unsigned char * getNodeId(void); unsigned char * getNodeIdWithLength(size_t *length); nodeIdBinaryType * getNodeIdBinary(void); int setNodeId(const char *value, void *data, set_plugin_parameter_addon addon); /* * RX Parameters */ /** The name of the receive non-OLSR interfaces plugin parameter */ #define PUD_RX_NON_OLSR_IF_NAME "rxNonOlsrIf" bool isRxNonOlsrInterface(const char *ifName); int addRxNonOlsrInterface(const char *value, void *data, set_plugin_parameter_addon addon); unsigned int getRxNonOlsrInterfaceCount(void); unsigned char * getRxNonOlsrInterfaceName(unsigned int index); /** The name of the allowed source IP address plugin parameter */ #define PUD_RX_ALLOWED_SOURCE_IP_NAME "rxAllowedSourceIpAddress" bool isRxAllowedSourceIpAddress(union olsr_sockaddr * sender); int addRxAllowedSourceIpAddress(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the receive multicast address plugin parameter */ #define PUD_RX_MC_ADDR_NAME "rxMcAddr" /** The default value of the receive multicast address plugin parameter for IPv4 */ #define PUD_RX_MC_ADDR_4_DEFAULT "224.0.0.224" /** The default value of the receive multicast address plugin parameter for IPv6 */ #define PUD_RX_MC_ADDR_6_DEFAULT "FF02:0:0:0:0:0:0:1" union olsr_sockaddr * getRxMcAddr(void); int setRxMcAddr(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the receive multicast port plugin parameter */ #define PUD_RX_MC_PORT_NAME "rxMcPort" /** The default value of the receive multicast port plugin parameter */ #define PUD_RX_MC_PORT_DEFAULT 2240 unsigned short getRxMcPort(void); int setRxMcPort(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the positionFile plugin parameter */ #define PUD_POSFILE_NAME "positionFile" char * getPositionFile(void); int setPositionFile(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the positionFilePeriod plugin parameter */ #define PUD_POSFILEPERIOD_NAME "positionFilePeriod" /** The default value of the positionFilePeriod plugin parameter */ #define PUD_POSFILEPERIOD_DEFAULT ((unsigned long long)0) /** The minimal value of the positionFilePeriod plugin parameter */ #define PUD_POSFILEPERIOD_MIN ((unsigned long long)1000) /** The maximal value of the positionFilePeriod plugin parameter */ #define PUD_POSFILEPERIOD_MAX ((unsigned long long)320000000) unsigned long long getPositionFilePeriod(void); int setPositionFilePeriod(const char *value, void *data, set_plugin_parameter_addon addon); /* * TX Parameters */ /** The name of the transmit non-OLSR interfaces plugin parameter */ #define PUD_TX_NON_OLSR_IF_NAME "txNonOlsrIf" bool isTxNonOlsrInterface(const char *ifName); int addTxNonOlsrInterface(const char *value, void *data, set_plugin_parameter_addon addon); unsigned int getTxNonOlsrInterfaceCount(void); unsigned char * getTxNonOlsrInterfaceName(unsigned int index); /** The name of the transmit multicast address plugin parameter */ #define PUD_TX_MC_ADDR_NAME "txMcAddr" /** The default value of the transmit multicast address plugin parameter fro IPv4*/ #define PUD_TX_MC_ADDR_4_DEFAULT "224.0.0.224" /** The default value of the transmit multicast address plugin parameter for IPv6 */ #define PUD_TX_MC_ADDR_6_DEFAULT "FF02:0:0:0:0:0:0:1" union olsr_sockaddr * getTxMcAddr(void); int setTxMcAddr(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the transmit multicast port plugin parameter */ #define PUD_TX_MC_PORT_NAME "txMcPort" /** The default value of the transmit multicast port plugin parameter */ #define PUD_TX_MC_PORT_DEFAULT 2240 unsigned short getTxMcPort(void); int setTxMcPort(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the transmit multicast time-to-live plugin parameter */ #define PUD_TX_TTL_NAME "txTtl" /** The default value of the transmit multicast time-to-live plugin parameter */ #define PUD_TX_TTL_DEFAULT 1 unsigned char getTxTtl(void); int setTxTtl(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the transmit multicast NMEA message prefix plugin parameter */ #define PUD_TX_NMEAMESSAGEPREFIX_NAME "txNmeaMessagePrefix" /** The default value of the transmit multicast NMEA message prefix plugin parameter */ #define PUD_TX_NMEAMESSAGEPREFIX_DEFAULT "NBSX" unsigned char * getTxNmeaMessagePrefix(void); int setTxNmeaMessagePrefix(const char *value, void *data, set_plugin_parameter_addon addon); /* * Uplink Parameters */ /** The name of the uplink address plugin parameter */ #define PUD_UPLINK_ADDR_NAME "uplinkAddr" /** The default value of the uplink address plugin parameter for IPv4*/ #define PUD_UPLINK_ADDR_4_DEFAULT "0.0.0.0" /** The default value of the uplink address plugin parameter for IPv6 */ #define PUD_UPLINK_ADDR_6_DEFAULT "0:0:0:0:0:0:0:0" bool isUplinkAddrSet(void); union olsr_sockaddr * getUplinkAddr(void); int setUplinkAddr(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the uplink port plugin parameter */ #define PUD_UPLINK_PORT_NAME "uplinkPort" /** The default value of the uplink port plugin parameter */ #define PUD_UPLINK_PORT_DEFAULT 2241 unsigned short getUplinkPort(void); int setUplinkPort(const char *value, void *data, set_plugin_parameter_addon addon); /* * Downlink Parameters */ /** The name of the downlink port plugin parameter */ #define PUD_DOWNLINK_PORT_NAME "downlinkPort" /** The default value of the downlink port plugin parameter */ #define PUD_DOWNLINK_PORT_DEFAULT 2242 unsigned short getDownlinkPort(void); int setDownlinkPort(const char *value, void *data, set_plugin_parameter_addon addon); /* * OLSR Parameters */ /** The name of the OLSR multicast time-to-live plugin parameter */ #define PUD_OLSR_TTL_NAME "olsrTtl" /** The default value of the OLSR multicast time-to-live plugin parameter */ #define PUD_OLSR_TTL_DEFAULT 64 unsigned char getOlsrTtl(void); int setOlsrTtl(const char *value, void *data, set_plugin_parameter_addon addon); /* * Update Parameters */ /** The name of the stationary update interval plugin parameter */ #define PUD_UPDATE_INTERVAL_STATIONARY_NAME "updateIntervalStationary" /** The default value of the stationary update interval plugin parameter */ #define PUD_UPDATE_INTERVAL_STATIONARY_DEFAULT 60 unsigned long long getUpdateIntervalStationary(void); int setUpdateIntervalStationary(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the moving update interval plugin parameter */ #define PUD_UPDATE_INTERVAL_MOVING_NAME "updateIntervalMoving" /** The default value of the moving update interval plugin parameter */ #define PUD_UPDATE_INTERVAL_MOVING_DEFAULT 5 unsigned long long getUpdateIntervalMoving(void); int setUpdateIntervalMoving(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the uplink stationary update interval plugin parameter */ #define PUD_UPLINK_UPDATE_INTERVAL_STATIONARY_NAME "uplinkUpdateIntervalStationary" /** The default value of the uplink stationary update interval plugin parameter */ #define PUD_UPLINK_UPDATE_INTERVAL_STATIONARY_DEFAULT 180 unsigned long long getUplinkUpdateIntervalStationary(void); int setUplinkUpdateIntervalStationary(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the uplink moving update interval plugin parameter */ #define PUD_UPLINK_UPDATE_INTERVAL_MOVING_NAME "uplinkUpdateIntervalMoving" /** The default value of the uplink moving update interval plugin parameter */ #define PUD_UPLINK_UPDATE_INTERVAL_MOVING_DEFAULT 15 unsigned long long getUplinkUpdateIntervalMoving(void); int setUplinkUpdateIntervalMoving(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the gateway determination interval plugin parameter */ #define PUD_GATEWAY_DETERMINATION_INTERVAL_NAME "gatewayDeterminationInterval" /** The default value of the gateway determination interval plugin parameter */ #define PUD_GATEWAY_DETERMINATION_INTERVAL_DEFAULT 1 unsigned long long getGatewayDeterminationInterval(void); int setGatewayDeterminationInterval(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the moving speed threshold plugin parameter */ #define PUD_MOVING_SPEED_THRESHOLD_NAME "movingSpeedThreshold" /** The default value of the moving speed threshold plugin parameter */ #define PUD_MOVING_SPEED_THRESHOLD_DEFAULT 9 unsigned long long getMovingSpeedThreshold(void); int setMovingSpeedThreshold(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the moving distance threshold plugin parameter */ #define PUD_MOVING_DISTANCE_THRESHOLD_NAME "movingDistanceThreshold" /** The default value of the moving distance threshold plugin parameter */ #define PUD_MOVING_DISTANCE_THRESHOLD_DEFAULT 50 unsigned long long getMovingDistanceThreshold(void); int setMovingDistanceThreshold(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the DOP multiplier plugin parameter */ #define PUD_DOP_MULTIPLIER_NAME "dopMultiplier" /** The default value of the DOP multiplier plugin parameter */ #define PUD_DOP_MULTIPLIER_DEFAULT 2.5 double getDopMultiplier(void); int setDopMultiplier(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the default HDOP plugin parameter */ #define PUD_DEFAULT_HDOP_NAME "defaultHdop" /** The default value of the default HDOP plugin parameter */ #define PUD_DEFAULT_HDOP_DEFAULT 50 unsigned long long getDefaultHdop(void); int setDefaultHdop(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the default VDOP plugin parameter */ #define PUD_DEFAULT_VDOP_NAME "defaultVdop" /** The default value of the default VDOP plugin parameter */ #define PUD_DEFAULT_VDOP_DEFAULT 50 unsigned long long getDefaultVdop(void); int setDefaultVdop(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the average depth plugin parameter */ #define PUD_AVERAGE_DEPTH_NAME "averageDepth" /** The default value of the average depth plugin parameter */ #define PUD_AVERAGE_DEPTH_DEFAULT 5 unsigned long long getAverageDepth(void); int setAverageDepth(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the hysteresis count to stationary plugin parameter */ #define PUD_HYSTERESIS_COUNT_2STAT_NAME "hysteresisCountToStationary" /** The default value of the hysteresis count to stationary plugin parameter */ #define PUD_HYSTERESIS_COUNT_2STAT_DEFAULT 17 unsigned long long getHysteresisCountToStationary(void); int setHysteresisCountToStationary(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the hysteresis count to moving plugin parameter */ #define PUD_HYSTERESIS_COUNT_2MOV_NAME "hysteresisCountToMoving" /** The default value of the hysteresis count to moving plugin parameter */ #define PUD_HYSTERESIS_COUNT_2MOV_DEFAULT 5 unsigned long long getHysteresisCountToMoving(void); int setHysteresisCountToMoving(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the hysteresis count to stationary plugin parameter */ #define PUD_GAT_HYSTERESIS_COUNT_2STAT_NAME "gatewayHysteresisCountToStationary" /** The default value of the hysteresis count to stationary plugin parameter */ #define PUD_GAT_HYSTERESIS_COUNT_2STAT_DEFAULT 17 unsigned long long getGatewayHysteresisCountToStationary(void); int setGatewayHysteresisCountToStationary(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the hysteresis count to moving plugin parameter */ #define PUD_GAT_HYSTERESIS_COUNT_2MOV_NAME "GatewayHysteresisCountToMoving" /** The default value of the hysteresis count to moving plugin parameter */ #define PUD_GAT_HYSTERESIS_COUNT_2MOV_DEFAULT 5 unsigned long long getGatewayHysteresisCountToMoving(void); int setGatewayHysteresisCountToMoving(const char *value, void *data, set_plugin_parameter_addon addon); /* * Other Plugin Settings */ /** The name of the deduplication usage plugin parameter */ #define PUD_USE_DEDUP_NAME "useDeDup" /** The default value of the deduplication usage plugin parameter */ #define PUD_USE_DEDUP_DEFAULT true bool getUseDeDup(void); int setUseDeDup(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the deduplication depth plugin parameter */ #define PUD_DEDUP_DEPTH_NAME "deDupDepth" /** The default value of the deduplication depth plugin parameter */ #define PUD_DEDUP_DEPTH_DEFAULT 256 unsigned long long getDeDupDepth(void); int setDeDupDepth(const char *value, void *data, set_plugin_parameter_addon addon); /** The name of the loopback usage plugin parameter */ #define PUD_USE_LOOPBACK_NAME "useLoopback" /** The default value of the loopback usage plugin parameter */ #define PUD_USE_LOOPBACK_DEFAULT false bool getUseLoopback(void); int setUseLoopback(const char *value, void *data, set_plugin_parameter_addon addon); /* * Check Functions */ unsigned int checkConfig(void); unsigned int checkRunSetup(void); #endif /* _PUD_CONFIGURATION_H_ */ olsrd-0.6.6.2/lib/pud/src/dedup.c000066400000000000000000000072231234304727700164150ustar00rootroot00000000000000#include "dedup.h" /* Plugin includes */ /* OLSR includes */ #include "olsr.h" /* System includes */ #include /* Defines */ #define LISTSIZE(x) ((x)->entriesMaxCount) /* always valid */ #define NEWESTINDEX(x) ((x)->newestEntryIndex) /* always valid */ #define WRAPINDEX(x, i) ((i) % LISTSIZE(x)) /* always valid for i>=0 */ #define INCOMINGINDEX(x) WRAPINDEX(x, (NEWESTINDEX(x) + LISTSIZE(x) - 1)) /* always valid */ /** Initialise the de-duplication list: allocate memory for the entries and reset fields. @param deDupList The de-duplication list @param maxEntries The maximum number of entries in the list (the number of messages that should be tracked) @return - false on failure - true otherwise */ bool initDeDupList(DeDupList * deDupList, unsigned long long maxEntries) { void * p; if (deDupList == NULL) { return false; } if (maxEntries < 1) { return false; } p = olsr_malloc(maxEntries * sizeof(DeDupEntry), "DeDupEntry entries for DeDupList (PUD)"); if (p == NULL) { return false; } deDupList->entriesMaxCount = maxEntries; deDupList->entries = p; deDupList->entriesCount = 0; deDupList->newestEntryIndex = 0; return true; } /** Clean up the de-duplication list: free memory and reset fields. @param deDupList The de-duplication list */ void destroyDeDupList(DeDupList * deDupList) { assert (deDupList != NULL); if (deDupList->entries != NULL) { free(deDupList->entries); deDupList->entries = NULL; } deDupList->entriesMaxCount = 0; deDupList->entriesCount = 0; deDupList->newestEntryIndex = 0; } /** Add a new (incoming) message to the de-duplication list @param deDupList The de-duplication list @param olsrMessage The message */ void addToDeDup(DeDupList * deDupList, union olsr_message *olsrMessage) { unsigned long long incomingIndex; DeDupEntry * newEntry; assert (deDupList != NULL); incomingIndex = INCOMINGINDEX(deDupList); newEntry = &deDupList->entries[incomingIndex]; memset(newEntry, 0, sizeof(DeDupEntry)); if (olsr_cnf->ip_version == AF_INET) { newEntry->seqno = olsrMessage->v4.seqno; newEntry->originator.v4.s_addr = olsrMessage->v4.originator; } else { newEntry->seqno = olsrMessage->v6.seqno; newEntry->originator.v6 = olsrMessage->v6.originator; } deDupList->newestEntryIndex = incomingIndex; if (deDupList->entriesCount < deDupList->entriesMaxCount) { deDupList ->entriesCount++; } } /** Determines whether a new (incoming) message is already in the de-duplication list @param deDupList The de-duplication list @param olsrMessage The message @return - true when the message is already in the list - false otherwise */ bool isInDeDupList(DeDupList * deDupList, union olsr_message *olsrMessage) { bool retval = false; unsigned long long iteratedIndex; unsigned long long count; iteratedIndex = NEWESTINDEX(deDupList); count = deDupList->entriesCount; /* we iterate from newest until oldest: we have a higher probability to * match on the newest entries */ while (count > 0) { DeDupEntry * iteratedEntry = &deDupList->entries[iteratedIndex]; if (olsr_cnf->ip_version == AF_INET) { if ((iteratedEntry->seqno == olsrMessage->v4.seqno) && (memcmp( &iteratedEntry->originator.v4, &olsrMessage->v4.originator, sizeof(iteratedEntry->originator.v4))) == 0) { retval = true; break; } } else { if ((iteratedEntry->seqno == olsrMessage->v6.seqno) && (memcmp( &iteratedEntry->originator.v6, &olsrMessage->v6.originator, sizeof(iteratedEntry->originator.v6)) == 0)) { retval = true; break; } } iteratedIndex = WRAPINDEX(deDupList, iteratedIndex + 1); /* go the the next older entry */ count--; } return retval; } olsrd-0.6.6.2/lib/pud/src/dedup.h000066400000000000000000000022261234304727700164200ustar00rootroot00000000000000#ifndef _PUD_DEDUP_H_ #define _PUD_DEDUP_H_ /* Plugin includes */ /* OLSR includes */ #include "olsr_types.h" #include "olsr_protocol.h" /* System includes */ #include #include /* A de-duplication entry holding the information to compare, 18 bytes */ typedef struct _DeDupEntry { uint16_t seqno; union olsr_ip_addr originator; } DeDupEntry; /** A list of de-duplication entries that are used to determine whether a received OLSR message was already seen. The list is a circular list. */ typedef struct _DeDupList { unsigned long long entriesMaxCount; /**< the maximum number of entries in the list */ DeDupEntry * entries; /**< the list entries */ unsigned long long entriesCount; /**< the number of entries in the list */ unsigned long long newestEntryIndex; /**< index of the newest entry in the list (zero-based) */ } DeDupList; bool initDeDupList(DeDupList * deDupList, unsigned long long maxEntries); void destroyDeDupList(DeDupList * deDupList); void addToDeDup(DeDupList * deDupList, union olsr_message *olsrMessage); bool isInDeDupList(DeDupList * deDupList, union olsr_message *olsrMessage); #endif /* _PUD_DEDUP_H_ */ olsrd-0.6.6.2/lib/pud/src/gpsConversion.c000066400000000000000000000247511234304727700201600ustar00rootroot00000000000000#include "gpsConversion.h" /* Plugin includes */ #include "pud.h" #include "configuration.h" #include "compiler.h" /* OLSR includes */ #include "olsr.h" /* System includes */ #include #include #include #include #include /* ************************************************************************ * OLSR --> External * ************************************************************************ */ /** Convert an OLSR message into a string to multicast on the LAN @param olsrMessage A pointer to the OLSR message @param txGpsBuffer A pointer to the buffer in which the transmit string can be written @param txGpsBufferSize The size of the txGpsBuffer @return - the length of the transmit string placed in the txGpsBuffer - 0 (zero) in case of an error */ unsigned int gpsFromOlsr(union olsr_message *olsrMessage, unsigned char * txGpsBuffer, unsigned int txGpsBufferSize) { unsigned long validityTime; struct tm timeStruct; char latitudeString[PUD_TX_LATITUDE_DIGITS]; const char * latitudeHemisphere; char longitudeString[PUD_TX_LONGITUDE_DIGITS]; const char * longitudeHemisphere; char altitudeString[PUD_TX_ALTITUDE_DIGITS]; char speedString[PUD_TX_SPEED_DIGITS]; char trackString[PUD_TX_TRACK_DIGITS]; char hdopString[PUD_TX_HDOP_DIGITS]; uint8_t smask; uint8_t flags; char gateway[2] = { '0', '\0' }; char nodeIdTypeString[PUD_TX_NODEIDTYPE_DIGITS]; char nodeIdString[PUD_TX_NODEID_BUFFERSIZE]; const char * nodeId; const void * ipAddr; char originatorBuffer[64]; const char * originator; unsigned int transmitStringLength; PudOlsrPositionUpdate * olsrGpsMessage = getOlsrMessagePayload(olsr_cnf->ip_version, olsrMessage); if (unlikely(getPositionUpdateVersion(olsrGpsMessage) != PUD_WIRE_FORMAT_VERSION)) { /* currently we can only handle our own version */ pudError(false, "Can not handle version %u OLSR PUD messages" " (only version %u): message ignored", getPositionUpdateVersion(olsrGpsMessage), PUD_WIRE_FORMAT_VERSION); return 0; } ipAddr = (olsr_cnf->ip_version == AF_INET) ? (void *) &olsrMessage->v4.originator : (void *) &olsrMessage->v6.originator; originator = inet_ntop(olsr_cnf->ip_version, ipAddr, &originatorBuffer[0], sizeof(originatorBuffer)); validityTime = getValidityTime(&olsrGpsMessage->validityTime); smask = getPositionUpdateSmask(olsrGpsMessage); flags = getPositionUpdateFlags(olsrGpsMessage); if (flags & PUD_FLAGS_GATEWAY) { gateway[0] = '1'; } /* time is ALWAYS present so we can just use it */ getPositionUpdateTime(olsrGpsMessage, time(NULL), &timeStruct); if (likely(nmea_INFO_is_present_smask(smask, LAT))) { double latitude = getPositionUpdateLatitude(olsrGpsMessage); if (latitude >= 0) { latitudeHemisphere = "N"; } else { latitudeHemisphere = "S"; latitude = -latitude; } latitude = nmea_degree2ndeg(latitude); snprintf(&latitudeString[0], PUD_TX_LATITUDE_DIGITS, "%." PUD_TX_LATITUDE_DECIMALS "f", latitude); } else { latitudeHemisphere = ""; latitudeString[0] = '\0'; } if (likely(nmea_INFO_is_present_smask(smask, LON))) { double longitude = getPositionUpdateLongitude(olsrGpsMessage); if (longitude >= 0) { longitudeHemisphere = "E"; } else { longitudeHemisphere = "W"; longitude = -longitude; } longitude = nmea_degree2ndeg(longitude); snprintf(&longitudeString[0], PUD_TX_LONGITUDE_DIGITS, "%." PUD_TX_LONGITUDE_DECIMALS "f", longitude); } else { longitudeHemisphere = ""; longitudeString[0] = '\0'; } if (likely(nmea_INFO_is_present_smask(smask, ELV))) { snprintf(&altitudeString[0], PUD_TX_ALTITUDE_DIGITS, "%ld", getPositionUpdateAltitude(olsrGpsMessage)); } else { altitudeString[0] = '\0'; } if (likely(nmea_INFO_is_present_smask(smask, SPEED))) { snprintf(&speedString[0], PUD_TX_SPEED_DIGITS, "%lu", getPositionUpdateSpeed(olsrGpsMessage)); } else { speedString[0] = '\0'; } if (likely(nmea_INFO_is_present_smask(smask, TRACK))) { snprintf(&trackString[0], PUD_TX_TRACK_DIGITS, "%lu", getPositionUpdateTrack(olsrGpsMessage)); } else { trackString[0] = '\0'; } if (likely(nmea_INFO_is_present_smask(smask, HDOP))) { snprintf(&hdopString[0], PUD_TX_HDOP_DIGITS, "%." PUD_TX_HDOP_DECIMALS "f", nmea_meters2dop(getPositionUpdateHdop(olsrGpsMessage))); } else { hdopString[0] = '\0'; } getNodeTypeStringFromOlsr(olsr_cnf->ip_version, olsrGpsMessage, &nodeIdTypeString[0], sizeof(nodeIdTypeString)); getNodeIdStringFromOlsr(olsr_cnf->ip_version, olsrMessage, &nodeId, &nodeIdString[0], sizeof(nodeIdString)); transmitStringLength = nmea_printf((char *) txGpsBuffer, txGpsBufferSize - 1, "$P%s," /* prefix (always) */ "%u," /* sentence version (always) */ "%s," /* gateway flag (always) */ "%s," /* OLSR originator (always) */ "%s,%s," /* nodeIdType/nodeId (always) */ "%02u%02u%02u," /* date (always) */ "%02u%02u%02u," /* time (always) */ "%lu," /* validity time (always) */ "%s,%s," /* latitude (optional) */ "%s,%s," /* longitude (optional) */ "%s," /* altitude (optional) */ "%s," /* speed (optional) */ "%s," /* track (optional) */ "%s" /* hdop (optional) */ , getTxNmeaMessagePrefix(), PUD_TX_SENTENCE_VERSION, &gateway[0], originator , &nodeIdTypeString[0], nodeId, timeStruct.tm_mday, timeStruct.tm_mon + 1, (timeStruct.tm_year % 100), timeStruct.tm_hour, timeStruct.tm_min, timeStruct.tm_sec, validityTime, &latitudeString[0], latitudeHemisphere, &longitudeString[0], longitudeHemisphere, &altitudeString[0], &speedString[0], &trackString[0], &hdopString[0]); if (unlikely(transmitStringLength > (txGpsBufferSize - 1))) { pudError(false, "String to transmit on non-OLSR is too large, need" " at least %u bytes, skipped", transmitStringLength); return 0; } if (unlikely(transmitStringLength == (txGpsBufferSize - 1))) { txGpsBuffer[txGpsBufferSize - 1] = '\0'; } else { txGpsBuffer[transmitStringLength] = '\0'; } return transmitStringLength; } /* ************************************************************************ * External --> OLSR * ************************************************************************ */ /** Convert a nmeaINFO structure into an OLSR message. @param nmeaInfo A pointer to a nmeaINFO structure @param olsrMessage A pointer to an OLSR message in which to place the converted information @param olsrMessageSize The maximum number of bytes available for the olsrMessage @param validityTime the validity time of the message in seconds @return - the aligned size of the converted information - 0 (zero) in case of an error */ unsigned int gpsToOlsr(nmeaINFO *nmeaInfo, union olsr_message *olsrMessage, unsigned int olsrMessageSize, unsigned long long validityTime) { unsigned int aligned_size; unsigned int aligned_size_remainder; size_t nodeLength; nodeIdBinaryType * nodeIdBinary = NULL; PudOlsrPositionUpdate * olsrGpsMessage = getOlsrMessagePayload(olsr_cnf->ip_version, olsrMessage); /* * Compose message contents */ memset(olsrGpsMessage, 0, sizeof (PudOlsrPositionUpdate)); setPositionUpdateVersion(olsrGpsMessage, PUD_WIRE_FORMAT_VERSION); setValidityTime(&olsrGpsMessage->validityTime, validityTime); setPositionUpdateSmask(olsrGpsMessage, nmeaInfo->smask); setPositionUpdateFlags(olsrGpsMessage, getPositionUpdateFlags(olsrGpsMessage) & ~PUD_FLAGS_GATEWAY); /* utc is always present, we make sure of that elsewhere, so just use it */ setPositionUpdateTime(olsrGpsMessage, nmeaInfo->utc.hour, nmeaInfo->utc.min, nmeaInfo->utc.sec); if (likely(nmea_INFO_is_present(nmeaInfo->present, LAT))) { setPositionUpdateLatitude(olsrGpsMessage, nmeaInfo->lat); } else { setPositionUpdateLatitude(olsrGpsMessage, 0.0); } if (likely(nmea_INFO_is_present(nmeaInfo->present, LON))) { setPositionUpdateLongitude(olsrGpsMessage, nmeaInfo->lon); } else { setPositionUpdateLongitude(olsrGpsMessage, 0.0); } if (likely(nmea_INFO_is_present(nmeaInfo->present, ELV))) { setPositionUpdateAltitude(olsrGpsMessage, nmeaInfo->elv); } else { setPositionUpdateAltitude(olsrGpsMessage, 0.0); } if (likely(nmea_INFO_is_present(nmeaInfo->present, SPEED))) { setPositionUpdateSpeed(olsrGpsMessage, nmeaInfo->speed); } else { setPositionUpdateSpeed(olsrGpsMessage, 0.0); } if (likely(nmea_INFO_is_present(nmeaInfo->present, TRACK))) { setPositionUpdateTrack(olsrGpsMessage, nmeaInfo->track); } else { setPositionUpdateTrack(olsrGpsMessage, 0); } if (likely(nmea_INFO_is_present(nmeaInfo->present, HDOP))) { setPositionUpdateHdop(olsrGpsMessage, nmeaInfo->HDOP); } else { setPositionUpdateHdop(olsrGpsMessage, PUD_HDOP_MAX); } nodeIdBinary = getNodeIdBinary(); nodeLength = setPositionUpdateNodeInfo(olsr_cnf->ip_version, olsrGpsMessage, olsrMessageSize, getNodeIdTypeNumber(), (unsigned char *) &nodeIdBinary->buffer, nodeIdBinary->length); /* * Messages in OLSR are 4-byte aligned: align */ /* size = type, string, string terminator */ aligned_size = PUD_OLSRWIREFORMATSIZE + nodeLength; aligned_size_remainder = (aligned_size % 4); if (aligned_size_remainder != 0) { aligned_size += (4 - aligned_size_remainder); } /* * Fill message headers (fill ALL fields, except message) * Note: olsr_vtime is currently unused, we use it for our validity time. */ if (olsr_cnf->ip_version == AF_INET) { /* IPv4 */ olsrMessage->v4.olsr_msgtype = PUD_OLSR_MSG_TYPE; olsrMessage->v4.olsr_vtime = reltime_to_me(validityTime * 1000); /* message->v4.olsr_msgsize at the end */ olsrMessage->v4.originator = olsr_cnf->main_addr.v4.s_addr; olsrMessage->v4.ttl = getOlsrTtl(); olsrMessage->v4.hopcnt = 0; olsrMessage->v4.seqno = htons(get_msg_seqno()); /* add length of message->v4 fields */ aligned_size += (sizeof(olsrMessage->v4) - sizeof(olsrMessage->v4.message)); olsrMessage->v4.olsr_msgsize = htons(aligned_size); } else { /* IPv6 */ olsrMessage->v6.olsr_msgtype = PUD_OLSR_MSG_TYPE; olsrMessage->v6.olsr_vtime = reltime_to_me(validityTime * 1000); /* message->v6.olsr_msgsize at the end */ olsrMessage->v6.originator = olsr_cnf->main_addr.v6; olsrMessage->v6.ttl = getOlsrTtl(); olsrMessage->v6.hopcnt = 0; olsrMessage->v6.seqno = htons(get_msg_seqno()); /* add length of message->v6 fields */ aligned_size += (sizeof(olsrMessage->v6) - sizeof(olsrMessage->v6.message)); olsrMessage->v6.olsr_msgsize = htons(aligned_size); } /* pad with zeroes */ if (aligned_size_remainder != 0) { memset(&(((char *) &olsrGpsMessage->nodeInfo.nodeIdType)[nodeLength]), 0, (4 - aligned_size_remainder)); } return aligned_size; } olsrd-0.6.6.2/lib/pud/src/gpsConversion.h000066400000000000000000000012571234304727700201610ustar00rootroot00000000000000#ifndef _PUD_GPSCONVERSION_H_ #define _PUD_GPSCONVERSION_H_ /* Plugin includes */ /* OLSR includes */ #include "olsr_protocol.h" /* System includes */ #include /* * Version */ /** The version of the transmit sentence */ #define PUD_TX_SENTENCE_VERSION 1 /** The OLSRD message type FIXME get an assigned one */ #define PUD_OLSR_MSG_TYPE 171 /* * Functions */ unsigned int gpsToOlsr(nmeaINFO *nmeaInfo, union olsr_message *olsrMessage, unsigned int olsrMessageSize, unsigned long long validityTime); unsigned int gpsFromOlsr(union olsr_message *olsrMessage, unsigned char * txGpsBuffer, unsigned int txGpsBufferSize); #endif /* _PUD_GPSCONVERSION_H_ */ olsrd-0.6.6.2/lib/pud/src/netTools.c000066400000000000000000000045001234304727700171160ustar00rootroot00000000000000#include "netTools.h" /* Plugin includes */ #include "pud.h" /* OLSR includes */ /* System includes */ #include #include #include /** Get the hardware address (MAC) of an interface @param ifName the name of the interface @param family the protocol family (AF_INET or AF_INET6) @param ifr the buffer in which to write the hardware address (MAC) @return - the pointer to the hardware address (inside ifr) - NULL on failure */ unsigned char * getHardwareAddress(const char * ifName, int family, struct ifreq *ifr) { int fd; int cpySize; assert(ifName != NULL); assert(strlen(ifName) <= IFNAMSIZ); assert((family == AF_INET) || (family == AF_INET6)); assert(ifr != NULL); fd = socket(family, SOCK_DGRAM, 0); if (fd < 0) { pudError(true, "%s@%u: socket error: %s", __FILE__, __LINE__, strerror(errno)); return NULL; } ifr->ifr_addr.sa_family = family; memset(ifr->ifr_name, 0, sizeof(ifr->ifr_name)); cpySize = (strlen(ifName) < sizeof(ifr->ifr_name)) ? strlen(ifName) : sizeof(ifr->ifr_name); strncpy(ifr->ifr_name, ifName, cpySize); errno = 0; if (ioctl(fd, SIOCGIFHWADDR, ifr) < 0) { pudError(true, "%s@%u: ioctl(SIOCGIFHWADDR) error", __FILE__, __LINE__); close(fd); return NULL; } close(fd); return (unsigned char *) &ifr->ifr_hwaddr.sa_data[0]; } /** Get the IPv4 address of an interface @param ifName the name of the interface @param ifr the buffer in which to write the IPv4 address @return - the pointer to the IPv4 address (inside ifr) - NULL on failure */ struct in_addr * getIPv4Address(const char * ifName, struct ifreq *ifr) { int fd; int cpySize; assert(ifName != NULL); assert(strlen(ifName) <= IFNAMSIZ); assert(ifr != NULL); fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { pudError(true, "%s@%u: socket error: %s", __FILE__, __LINE__, strerror(errno)); return NULL; } ifr->ifr_addr.sa_family = AF_INET; memset(ifr->ifr_name, 0, sizeof(ifr->ifr_name)); cpySize = (strlen(ifName) < sizeof(ifr->ifr_name)) ? strlen(ifName) : sizeof(ifr->ifr_name); strncpy(ifr->ifr_name, ifName, cpySize); errno = 0; if (ioctl(fd, SIOCGIFADDR, ifr) < 0) { pudError(true, "%s@%u: ioctl(SIOCGIFADDR) error", __FILE__, __LINE__); close(fd); return NULL; } close(fd); return &((struct sockaddr_in *)(void *) &ifr->ifr_addr)->sin_addr; } olsrd-0.6.6.2/lib/pud/src/netTools.h000066400000000000000000000042771234304727700171360ustar00rootroot00000000000000#ifndef _PUD_NETTOOLS_H_ #define _PUD_NETTOOLS_H_ /* Plugin includes */ /* OLSR includes */ #include "olsr_types.h" /* System includes */ #include #include #include #include #include #ifdef __ANDROID__ typedef __in_port_t in_port_t; #endif /* __ANDROID_API__ */ /** Get the port in an OLSR socket address @param addr A pointer to OLSR socket address @param defaultPort The default port (in host byte order), returned when addr is NULL @return The port (in network byte order) */ static inline in_port_t getOlsrSockaddrPort(union olsr_sockaddr * addr, in_port_t defaultPort) { if (!addr) { return htons(defaultPort); } if (addr->in.sa_family == AF_INET) { return addr->in4.sin_port; } else { return addr->in6.sin6_port; } } /** Set the port in an OLSR socket address @param addr A pointer to OLSR socket address @param port The port (in network byte order) */ static inline void setOlsrSockaddrPort(union olsr_sockaddr * addr, in_port_t port) { if (!addr) { return; } if (addr->in.sa_family == AF_INET) { addr->in4.sin_port = port; } else { addr->in6.sin6_port = port; } } /** Set the IP address in an OLSR socket address @param addr A pointer to OLSR socket address @param addr A pointer to the IP address (in network byte order) */ static inline void setOlsrSockaddrAddr(union olsr_sockaddr * addr, union olsr_sockaddr * ip) { if (!addr) { return; } if (addr->in.sa_family == AF_INET) { addr->in4.sin_addr = ip->in4.sin_addr; } else { addr->in6.sin6_addr = ip->in6.sin6_addr; } } /** Determine whether an IP address (v4 or v6) is a multicast address. @param addr An IP address (v4 or v6) @return - true when the address is a multicast address - false otherwise */ static inline bool isMulticast(union olsr_sockaddr *addr) { assert(addr != NULL); if (addr->in.sa_family == AF_INET) { return IN_MULTICAST(ntohl(addr->in4.sin_addr.s_addr)); } return IN6_IS_ADDR_MULTICAST(&addr->in6.sin6_addr); } unsigned char * getHardwareAddress(const char * ifName, int family, struct ifreq *ifr); struct in_addr * getIPv4Address(const char * ifName, struct ifreq *ifr); #endif /* _PUD_NETTOOLS_H_ */ olsrd-0.6.6.2/lib/pud/src/networkInterfaces.c000066400000000000000000000436141234304727700210150ustar00rootroot00000000000000#include "networkInterfaces.h" /* Plugin includes */ #include "pud.h" #include "configuration.h" #include "netTools.h" /* OLSRD includes */ #include "olsr.h" #include "interfaces.h" /* System includes */ #include #include /* * Main IP MAC address */ /** the MAC address of the main IP address */ static unsigned char mac[PUD_NODEIDTYPE_MAC_BYTES] = { 0 }; /** true when the MAC address of the main IP address has been retrieved */ static bool macSet = false; /** * @return * the MAC address of the main IP address */ unsigned char * getMainIpMacAddress(void) { if (!macSet) { struct ifreq ifr; unsigned char * macInIfr; struct interface *mainInterface = if_ifwithaddr(&olsr_cnf->main_addr); if (!mainInterface) { pudError(true, "Could not get the main interface"); return NULL; } macInIfr = getHardwareAddress(mainInterface->int_name, olsr_cnf->ip_version, &ifr); if (!macInIfr) { pudError(true, "Could not get the MAC address of the main interface"); return NULL; } memcpy(&mac[0], &macInIfr[0], PUD_NODEIDTYPE_MAC_BYTES); macSet = true; } return &mac[0]; } /* * RX interfaces */ /** The list of network interface objects, receiving GPS NMEA sentences */ static TRxTxNetworkInterface *rxNetworkInterfacesListHead = NULL; /** Pointer to the last network interface object, receiving GPS NMEA sentences */ static TRxTxNetworkInterface *lastRxNetworkInterface = NULL; /** @return The list of network interface objects, receiving GPS NMEA sentences */ TRxTxNetworkInterface *getRxNetworkInterfaces(void) { return rxNetworkInterfacesListHead; } /** Create a receive socket for a network interface @param networkInterface The network interface object. This function expects it to be filled with all information, except for the socket descriptor. @param rxSocketHandlerFunction The function that handles reception of data on the network interface @param rxMcAddr The receive multicast address @return - the socket descriptor (>= 0) - -1 if an error occurred */ static int createRxSocket(TRxTxNetworkInterface * networkInterface, socket_handler_func rxSocketHandlerFunction, union olsr_sockaddr * rxMcAddr) { int ipFamilySetting; int ipProtoSetting; int ipMcLoopSetting; int ipAddMembershipSetting; union olsr_sockaddr address; void * addr; size_t addrSize; int rxSocket = -1; int socketReuseFlagValue = 1; int mcLoopValue = 1; assert(networkInterface != NULL); assert(rxSocketHandlerFunction != NULL); assert(strncmp((char *) &networkInterface->name[0], "", sizeof(networkInterface->name)) != 0); memset(&address, 0, sizeof(address)); if (rxMcAddr->in.sa_family == AF_INET) { assert(rxMcAddr->in4.sin_addr.s_addr != INADDR_ANY); ipFamilySetting = AF_INET; ipProtoSetting = IPPROTO_IP; ipMcLoopSetting = IP_MULTICAST_LOOP; ipAddMembershipSetting = IP_ADD_MEMBERSHIP; address.in4.sin_family = ipFamilySetting; address.in4.sin_addr.s_addr = INADDR_ANY; address.in4.sin_port = getRxMcPort(); addr = &address.in4; addrSize = sizeof(struct sockaddr_in); } else { assert(rxMcAddr->in6.sin6_addr.s6_addr != in6addr_any.s6_addr); ipFamilySetting = AF_INET6; ipProtoSetting = IPPROTO_IPV6; ipMcLoopSetting = IPV6_MULTICAST_LOOP; ipAddMembershipSetting = IPV6_ADD_MEMBERSHIP; address.in6.sin6_family = ipFamilySetting; address.in6.sin6_addr = in6addr_any; address.in6.sin6_port = getRxMcPort(); addr = &address.in6; addrSize = sizeof(struct sockaddr_in6); } /* Create a datagram socket on which to receive. */ errno = 0; rxSocket = socket(ipFamilySetting, SOCK_DGRAM, 0); if (rxSocket < 0) { pudError(true, "Could not create a receive socket for interface %s", networkInterface->name); goto bail; } /* Enable SO_REUSEADDR to allow multiple applications to receive the same * multicast messages */ errno = 0; if (setsockopt(rxSocket, SOL_SOCKET, SO_REUSEADDR, &socketReuseFlagValue, sizeof(socketReuseFlagValue)) < 0) { pudError(true, "Could not set the reuse flag on the receive socket for" " interface %s", networkInterface->name); goto bail; } /* Bind to the proper port number with the IP address INADDR_ANY * (INADDR_ANY is really required here, do not change it) */ errno = 0; if (bind(rxSocket, addr, addrSize) < 0) { pudError(true, "Could not bind the receive socket for interface" " %s to port %u", networkInterface->name, ntohs(getRxMcPort())); goto bail; } /* Enable multicast local loopback */ errno = 0; if (setsockopt(rxSocket, ipProtoSetting, ipMcLoopSetting, &mcLoopValue, sizeof(mcLoopValue)) < 0) { pudError(true, "Could not enable multicast loopback on the" " receive socket for interface %s", networkInterface->name); goto bail; } /* Join the multicast group on the local interface. Note that this * ADD_MEMBERSHIP option must be called for each local interface over * which the multicast datagrams are to be received. */ if (ipFamilySetting == AF_INET) { struct ip_mreq mc_settings; struct ifreq ifr; struct in_addr * ifAddr = getIPv4Address(networkInterface->name, &ifr); if (!ifAddr) { pudError(true, "Could not get interface address of %s", networkInterface->name); goto bail; } (void) memset(&mc_settings, 0, sizeof(mc_settings)); mc_settings.imr_multiaddr = rxMcAddr->in4.sin_addr; mc_settings.imr_interface = *ifAddr; errno = 0; if (setsockopt(rxSocket, ipProtoSetting, ipAddMembershipSetting, &mc_settings, sizeof(mc_settings)) < 0) { pudError(true, "Could not subscribe interface %s to the configured" " multicast group", networkInterface->name); goto bail; } } else { struct ipv6_mreq mc6_settings; (void) memset(&mc6_settings, 0, sizeof(mc6_settings)); mc6_settings.ipv6mr_multiaddr = rxMcAddr->in6.sin6_addr; mc6_settings.ipv6mr_interface = if_nametoindex(networkInterface->name); errno = 0; if (setsockopt(rxSocket, ipProtoSetting, ipAddMembershipSetting, &mc6_settings, sizeof(mc6_settings)) < 0) { pudError(true, "Could not subscribe interface %s to the configured" " multicast group", networkInterface->name); goto bail; } } add_olsr_socket(rxSocket, rxSocketHandlerFunction, NULL, networkInterface, SP_PR_READ); return rxSocket; bail: if (rxSocket >= 0) { close(rxSocket); } return -1; } /** Create a receive interface and add it to the list of receive network interface objects @param ifName the network interface name @param rxSocketHandlerFunction the function that handles reception of data on the network interface @param rxMcAddr The receive multicast address @return - true on success - false on failure */ static bool createRxInterface(const char * ifName, socket_handler_func rxSocketHandlerFunction, union olsr_sockaddr * rxMcAddr) { int socketFd = -1; TRxTxNetworkInterface * networkInterface = NULL; if (ifName == NULL) { goto bail; } networkInterface = olsr_malloc(sizeof(TRxTxNetworkInterface), "TRxTxNetworkInterface (PUD)"); if (networkInterface == NULL) { goto bail; } memcpy(networkInterface->name, ifName, sizeof(networkInterface->name)); networkInterface->name[IFNAMSIZ] = '\0'; networkInterface->handler = NULL; networkInterface->next = NULL; /* networkInterface needs to be filled in when calling createRxSocket */ socketFd = createRxSocket(networkInterface, rxSocketHandlerFunction, rxMcAddr); if (socketFd < 0) { goto bail; } networkInterface->socketFd = socketFd; networkInterface->handler = rxSocketHandlerFunction; /* Add new object to the end of the global list. */ if (rxNetworkInterfacesListHead == NULL) { rxNetworkInterfacesListHead = networkInterface; lastRxNetworkInterface = networkInterface; } else { lastRxNetworkInterface->next = networkInterface; lastRxNetworkInterface = networkInterface; } return true; bail: if (networkInterface != NULL) { free(networkInterface); } return false; } /* * TX interfaces */ /** The list of network interface objects, sending our NMEA sentences */ static TRxTxNetworkInterface *txNetworkInterfacesListHead = NULL; /** Pointer to the last network interface object, sending our NMEA sentences */ static TRxTxNetworkInterface *lastTxNetworkInterface = NULL; /** @return The list of network interface objects, sending our NMEA sentences */ TRxTxNetworkInterface *getTxNetworkInterfaces(void) { return txNetworkInterfacesListHead; } /** Create a transmit socket for a network interface @param networkInterface The network interface object. This function expects it to be filled with all information, except for the socket descriptor. @param txMcAddr The transmit multicast address @return - the socket descriptor (>= 0) - -1 if an error occurred */ static int createTxSocket(TRxTxNetworkInterface * networkInterface, union olsr_sockaddr * txMcAddr) { int ipFamilySetting; int ipProtoSetting; int ipMcLoopSetting; int ipMcIfSetting; int ipTtlSetting; unsigned int ifIndex; union olsr_sockaddr address; void * addr; size_t addrSize; int txSocket = -1; int mcLoopValue = 1; int txTtl = getTxTtl(); assert(networkInterface != NULL); assert(strncmp((char *) &networkInterface->name[0], "", sizeof(networkInterface->name)) != 0); memset(&address, 0, sizeof(address)); if (txMcAddr->in.sa_family == AF_INET) { struct ifreq ifr; struct in_addr * ifAddr = getIPv4Address(networkInterface->name, &ifr); if (!ifAddr) { pudError(true, "Could not get interface address of %s", networkInterface->name); goto bail; } assert(txMcAddr->in4.sin_addr.s_addr != INADDR_ANY); ipFamilySetting = AF_INET; ipProtoSetting = IPPROTO_IP; ipMcLoopSetting = IP_MULTICAST_LOOP; ipMcIfSetting = IP_MULTICAST_IF; ipTtlSetting = IP_MULTICAST_TTL; ifIndex = 0; address.in4.sin_family = ipFamilySetting; address.in4.sin_addr = *ifAddr; address.in4.sin_port = getTxMcPort(); addr = &address.in4; addrSize = sizeof(struct sockaddr_in); } else { assert(txMcAddr->in6.sin6_addr.s6_addr != in6addr_any.s6_addr); ipFamilySetting = AF_INET6; ipProtoSetting = IPPROTO_IPV6; ipMcLoopSetting = IPV6_MULTICAST_LOOP; ipMcIfSetting = IPV6_MULTICAST_IF; ipTtlSetting = IPV6_MULTICAST_HOPS; ifIndex = if_nametoindex(networkInterface->name); addr = &ifIndex; addrSize = sizeof(ifIndex); } /* Create a datagram socket on which to transmit */ errno = 0; txSocket = socket(ipFamilySetting, SOCK_DGRAM, 0); if (txSocket < 0) { pudError(true, "Could not create a transmit socket for interface %s", networkInterface->name); goto bail; } /* Bind the socket to the desired interface */ errno = 0; if (setsockopt(txSocket, ipProtoSetting, ipMcIfSetting, addr, addrSize) < 0) { pudError(true, "Could not set the multicast interface on the" " transmit socket to interface %s", networkInterface->name); goto bail; } /* Disable multicast local loopback */ errno = 0; if (setsockopt(txSocket, ipProtoSetting, ipMcLoopSetting, &mcLoopValue, sizeof(mcLoopValue)) < 0) { pudError(true, "Could not disable multicast loopback on the" " transmit socket for interface %s", networkInterface->name); goto bail; } /* Set the TTL on the socket */ errno = 0; if (setsockopt(txSocket, ipProtoSetting, ipTtlSetting, &txTtl, sizeof(txTtl)) < 0) { pudError(true, "Could not set TTL on the transmit socket" " for interface %s", networkInterface->name); goto bail; } /* Set the no delay option on the socket */ errno = 0; if (fcntl(txSocket, F_SETFL, O_NDELAY) < 0) { pudError(true, "Could not set the no delay option on the" " transmit socket for interface %s", networkInterface->name); goto bail; } return txSocket; bail: if (txSocket >= 0) { close(txSocket); } return -1; } /** Create a transmit interface and add it to the list of transmit network interface objects @param ifName the network interface name @param txMcAddr the transmit multicast address @return - true on success - false on failure */ static bool createTxInterface(const char * ifName, union olsr_sockaddr * txMcAddr) { int socketFd = -1; TRxTxNetworkInterface * networkInterface = NULL; if (ifName == NULL) { goto bail; } networkInterface = olsr_malloc(sizeof(TRxTxNetworkInterface), "TRxTxNetworkInterface (PUD)"); if (networkInterface == NULL) { goto bail; } memcpy(networkInterface->name, ifName, sizeof(networkInterface->name)); networkInterface->name[IFNAMSIZ] = '\0'; networkInterface->handler = NULL; networkInterface->next = NULL; /* networkInterface needs to be filled in when calling createTxSocket */ socketFd = createTxSocket(networkInterface, txMcAddr); if (socketFd < 0) { goto bail; } networkInterface->socketFd = socketFd; /* Add new object to the end of the global list. */ if (txNetworkInterfacesListHead == NULL) { txNetworkInterfacesListHead = networkInterface; lastTxNetworkInterface = networkInterface; } else { lastTxNetworkInterface->next = networkInterface; lastTxNetworkInterface = networkInterface; } return true; bail: if (networkInterface != NULL) { free(networkInterface); } return false; } /* * Downlink interface */ /** The socket fd, receiving downlinked messages */ static int downlinkSocketFd = -1; /** the downlink handler function */ static socket_handler_func downlinkHandler = NULL; /** @return The downlink socket fd. -1 when not valid. */ int getDownlinkSocketFd(void) { return downlinkSocketFd; } /** Create an downlink socket @param ipVersion The IP version (AF_INET or AF_INET6) for the socket @param rxSocketHandlerFunction The socket handler function @return - the socket descriptor (>= 0) - -1 if an error occurred */ static int createDownlinkSocket(int ipVersion, socket_handler_func rxSocketHandlerFunction) { union olsr_sockaddr address; void * addr; size_t addrSize; int downlinkSocket = -1; int socketReuseFlagValue = 1; memset(&address, 0, sizeof(address)); if (ipVersion == AF_INET) { address.in4.sin_family = AF_INET; address.in4.sin_addr.s_addr = INADDR_ANY; address.in4.sin_port = getDownlinkPort(); addr = &address.in4; addrSize = sizeof(struct sockaddr_in); } else { address.in6.sin6_family = AF_INET6; address.in6.sin6_addr = in6addr_any; address.in6.sin6_port = getDownlinkPort(); addr = &address.in6; addrSize = sizeof(struct sockaddr_in6); } /* Create a datagram socket on which to receive */ errno = 0; downlinkSocket = socket(ipVersion, SOCK_DGRAM, 0); if (downlinkSocket < 0) { pudError(true, "Could not create the downlink socket"); goto bail; } /* Enable SO_REUSEADDR to allow multiple applications to receive the same * messages */ errno = 0; if (setsockopt(downlinkSocket, SOL_SOCKET, SO_REUSEADDR, &socketReuseFlagValue, sizeof(socketReuseFlagValue)) < 0) { pudError(true, "Could not set REUSE option on the downlink socket"); goto bail; } /* Bind to the proper port number with the IP address INADDR_ANY * (INADDR_ANY is really required here, do not change it) */ errno = 0; if (bind(downlinkSocket, addr, addrSize)) { pudError(true, "Could not bind downlink socket to port %d", getDownlinkPort()); goto bail; } add_olsr_socket(downlinkSocket, rxSocketHandlerFunction, NULL, NULL, SP_PR_READ); downlinkHandler = rxSocketHandlerFunction; return downlinkSocket; bail: if (downlinkSocket >= 0) { close(downlinkSocket); } return -1; } /* * Interface Functions */ /** Creates receive and transmit sockets and register the receive sockets with the OLSR stack @param rxSocketHandlerFunction The function to call upon reception of data on a receive socket @param rxSocketHandlerFunctionDownlink The function to call upon reception of data on a downlink receive socket @return - true on success - false on failure */ bool createNetworkInterfaces(socket_handler_func rxSocketHandlerFunction, socket_handler_func rxSocketHandlerFunctionDownlink) { union olsr_sockaddr * rxMcAddr = getRxMcAddr(); union olsr_sockaddr * txMcAddr = getTxMcAddr(); unsigned int count = 0; /* loop over all configured rx interfaces */ count = getRxNonOlsrInterfaceCount(); while (count--) { if (!createRxInterface((char *)getRxNonOlsrInterfaceName(count), rxSocketHandlerFunction, rxMcAddr)) { /* creating a receive interface failed */ return false; } } /* loop over all configured tx interfaces */ count = getTxNonOlsrInterfaceCount(); while (count--) { if (!createTxInterface((char *)getTxNonOlsrInterfaceName(count), txMcAddr)) { /* creating a transmit interface failed */ return false; } } /* create uplink socket when needed */ if (isUplinkAddrSet()) { downlinkSocketFd = createDownlinkSocket(getUplinkAddr()->in.sa_family, rxSocketHandlerFunctionDownlink); if (downlinkSocketFd == -1) { return false; } } else { downlinkSocketFd = -1; } return true; } /** Close and cleanup the network interfaces in the given list @param networkInterface the list of network interface to close and clean up */ static void closeInterfaces(TRxTxNetworkInterface * networkInterface) { TRxTxNetworkInterface * nextNetworkInterface = networkInterface; while (nextNetworkInterface != NULL) { TRxTxNetworkInterface * iteratedNetworkInterface = nextNetworkInterface; if (iteratedNetworkInterface->socketFd >= 0) { if (iteratedNetworkInterface->handler) { remove_olsr_socket(iteratedNetworkInterface->socketFd, iteratedNetworkInterface->handler, NULL); } close(iteratedNetworkInterface->socketFd); iteratedNetworkInterface->socketFd = -1; } nextNetworkInterface = iteratedNetworkInterface->next; iteratedNetworkInterface->next = NULL; free(iteratedNetworkInterface); } } /** Close and cleanup all receive and transmit network interfaces */ void closeNetworkInterfaces(void) { if (rxNetworkInterfacesListHead != NULL) { closeInterfaces(rxNetworkInterfacesListHead); rxNetworkInterfacesListHead = NULL; } if (txNetworkInterfacesListHead != NULL) { closeInterfaces(txNetworkInterfacesListHead); txNetworkInterfacesListHead = NULL; } if (downlinkSocketFd != -1 ) { if (downlinkHandler) { remove_olsr_socket (downlinkSocketFd, downlinkHandler, NULL); downlinkHandler = NULL; } close(downlinkSocketFd); downlinkSocketFd = -1; } } olsrd-0.6.6.2/lib/pud/src/networkInterfaces.h000066400000000000000000000026651234304727700210230ustar00rootroot00000000000000#ifndef _PUD_NETWORKINTERFACES_H #define _PUD_NETWORKINTERFACES_H /* Plugin includes */ /* OLSR includes */ #include "olsr_types.h" #include "interfaces.h" #include "scheduler.h" /* System includes */ #include #include /** A list of TRxTxNetworkInterface objects, used for non-OLSR interfaces */ typedef struct _TRxTxNetworkInterface { /** The socket file descriptor for the non-OLSR interface*/ int socketFd; /** The name of the interface */ char name[IFNAMSIZ + 1]; /** the socket handler function */ socket_handler_func handler; /** The next TRxTxNetworkInterface in the list */ struct _TRxTxNetworkInterface * next; } TRxTxNetworkInterface; /** A list of TOLSRNetworkInterface objects, used for OLSR interfaces */ typedef struct _TOLSRNetworkInterface { /** A pointer to the OLSR interface */ struct interface * olsrIntf; /** The next TOLSRNetworkInterface in the list */ struct _TOLSRNetworkInterface * next; } TOLSRNetworkInterface; bool createNetworkInterfaces(socket_handler_func rxSocketHandlerFunction, socket_handler_func rxSocketHandlerFunctionDownlink); void closeNetworkInterfaces(void); unsigned char * getMainIpMacAddress(void); TRxTxNetworkInterface * getRxNetworkInterfaces(void); TRxTxNetworkInterface * getTxNetworkInterfaces(void); int getDownlinkSocketFd(void); TOLSRNetworkInterface * getOlsrNetworkInterface(struct interface * olsrIntf); #endif /* _PUD_NETWORKINTERFACES_H */ olsrd-0.6.6.2/lib/pud/src/posAvg.c000066400000000000000000000461331234304727700165560ustar00rootroot00000000000000#include "posAvg.h" /* Plugin includes */ /* OLSR includes */ #include "olsr.h" /* System includes */ #include #include #include #include #include #include /* Defines */ #define LISTSIZE(x) (((x)->entriesMaxCount) + 1) /* always valid */ #define NEWESTINDEX(x) ((x)->newestEntryIndex) /* always valid */ #define WRAPINDEX(x, i) ((i) % LISTSIZE(x)) /* always valid for i>=0 */ #define INCOMINGINDEX(x) WRAPINDEX(x, (NEWESTINDEX(x) + 1)) /* always valid */ #define OLDESTINDEX(x) (((x)->entriesCount > 1) ? WRAPINDEX(x, (INCOMINGINDEX(x) + LISTSIZE(x) - (x)->entriesCount)) : NEWESTINDEX(x)) /* always valid */ /** Flush/empty the position average list @param positionAverageList The position average list */ void flushPositionAverageList(PositionAverageList * positionAverageList) { assert (positionAverageList != NULL); positionAverageList->entriesCount = 0; memset(&positionAverageList->counters, 0, sizeof(positionAverageList->counters)); nmea_zero_INFO(&positionAverageList->positionAverageCumulative.nmeaInfo); memset(&positionAverageList->positionAverageCumulative.track, 0, sizeof(positionAverageList->positionAverageCumulative.track)); memset(&positionAverageList->positionAverageCumulative.mtrack, 0, sizeof(positionAverageList->positionAverageCumulative.mtrack)); memset(&positionAverageList->positionAverageCumulative.magvar, 0, sizeof(positionAverageList->positionAverageCumulative.magvar)); nmea_zero_INFO(&positionAverageList->positionAverage.nmeaInfo); } /** Initialise the position average list: allocate memory for the entries and reset fields. @param positionAverageList The position average list @param maxEntries The maximum number of entries in the list (the number of entries that should be averaged) @return - false on failure - true otherwise */ bool initPositionAverageList(PositionAverageList * positionAverageList, unsigned long long maxEntries) { void * p; if (positionAverageList == NULL) { return false; } if (maxEntries < 2) { return false; } p = olsr_malloc((maxEntries + 1) * sizeof(PositionUpdateEntry), "PositionAverageEntry entries for PositionAverageList (PUD)"); if (p == NULL) { return false; } positionAverageList->entriesMaxCount = maxEntries; positionAverageList->entries = p; positionAverageList->newestEntryIndex = 0; flushPositionAverageList(positionAverageList); return true; } /** Clean up the position average list: free memory and reset fields. @param positionAverageList The position average list */ void destroyPositionAverageList(PositionAverageList * positionAverageList) { assert (positionAverageList != NULL); flushPositionAverageList(positionAverageList); if (positionAverageList->entries != NULL) { free(positionAverageList->entries); positionAverageList->entries = NULL; } positionAverageList->entriesMaxCount = 0; positionAverageList->newestEntryIndex = 0; } /** Get the entry for a certain type of position update. @param positionAvgList The position average list @param positionType The type of the position of the average entry @return A pointer to the requested position update entry */ PositionUpdateEntry * getPositionAverageEntry( PositionAverageList * positionAvgList, AverageEntryPositionType positionType) { PositionUpdateEntry * r = NULL; switch (positionType) { case OLDEST: assert(positionAvgList->entriesCount >= positionAvgList->entriesMaxCount); r = &positionAvgList->entries[OLDESTINDEX(positionAvgList)]; break; case INCOMING: r = &positionAvgList->entries[INCOMINGINDEX(positionAvgList)]; break; case NEWEST: r = &positionAvgList->entries[NEWESTINDEX(positionAvgList)]; break; case AVERAGECUMULATIVE: r = &positionAvgList->positionAverageCumulative; break; case AVERAGE: r = &positionAvgList->positionAverage; break; default: r = NULL; break; } return r; } /** Update position average present, smask and fix counters for a new entry or for an entry that is/will be removed. Update the respective counters when the smask of the entry has the corresponding flag set. The fix counters count the fix values separately. @param positionAverageList The position average list @param entry The entry to update the counters from @param add True when updating the counters for a new entry, false for an entry that is/will be removed */ static void updateCounters(PositionAverageList * positionAverageList, PositionUpdateEntry * entry, bool add) { PositionUpdateCounters * counters = &positionAverageList->counters; uint32_t present = entry->nmeaInfo.present; int smask = entry->nmeaInfo.smask; #ifndef NDEBUG unsigned long long maxCount = positionAverageList->entriesMaxCount; #endif int amount = (add ? 1 : -1); /* present */ if ((present & SMASK) != 0) { assert(add ? (counters->smask < maxCount):(counters->smask > 0)); counters->smask += amount; } if ((present & UTCDATE) != 0) { assert(add ? (counters->utcdate < maxCount):(counters->utcdate > 0)); counters->utcdate += amount; } if ((present & UTCTIME) != 0) { assert(add ? (counters->utctime < maxCount):(counters->utctime > 0)); counters->utctime += amount; } if ((present & SIG) != 0) { assert(add ? (counters->sig < maxCount):(counters->sig > 0)); counters->sig += amount; } if ((present & FIX) != 0) { assert(add ? (counters->fix < maxCount):(counters->fix > 0)); counters->fix += amount; } if ((present & PDOP) != 0) { assert(add ? (counters->pdop < maxCount):(counters->pdop > 0)); counters->pdop += amount; } if ((present & HDOP) != 0) { assert(add ? (counters->hdop < maxCount):(counters->hdop > 0)); counters->hdop += amount; } if ((present & VDOP) != 0) { assert(add ? (counters->vdop < maxCount):(counters->vdop > 0)); counters->vdop += amount; } if ((present & LAT) != 0) { assert(add ? (counters->lat < maxCount):(counters->lat > 0)); counters->lat += amount; } if ((present & LON) != 0) { assert(add ? (counters->lon < maxCount):(counters->lon > 0)); counters->lon += amount; } if ((present & ELV) != 0) { assert(add ? (counters->elv < maxCount):(counters->elv > 0)); counters->elv += amount; } if ((present & SPEED) != 0) { assert(add ? (counters->speed < maxCount):(counters->speed > 0)); counters->speed += amount; } if ((present & TRACK) != 0) { assert(add ? (counters->track < maxCount):(counters->track > 0)); counters->track += amount; } if ((present & MTRACK) != 0) { assert(add ? (counters->mtrack < maxCount):(counters->mtrack > 0)); counters->mtrack += amount; } if ((present & MAGVAR) != 0) { assert(add ? (counters->magvar < maxCount):(counters->magvar > 0)); counters->magvar += amount; } if ((present & SATINUSECOUNT) != 0) { assert(add ? (counters->satinusecount < maxCount):(counters->satinusecount > 0)); counters->satinusecount += amount; } if ((present & SATINUSE) != 0) { assert(add ? (counters->satinuse < maxCount):(counters->satinuse > 0)); counters->satinuse += amount; } if ((present & SATINVIEW) != 0) { assert(add ? (counters->satinview < maxCount):(counters->satinview > 0)); counters->satinview += amount; } /* smask */ if ((smask & GPGGA) != 0) { assert(add ? (counters->gpgga < maxCount):(counters->gpgga > 0)); counters->gpgga += amount; } if ((smask & GPGSA) != 0) { assert(add ? (counters->gpgsa < maxCount):(counters->gpgsa > 0)); counters->gpgsa += amount; } if ((smask & GPGSV) != 0) { assert(add ? (counters->gpgsv < maxCount):(counters->gpgsv > 0)); counters->gpgsv += amount; } if ((smask & GPRMC) != 0) { assert(add ? (counters->gprmc < maxCount):(counters->gprmc > 0)); counters->gprmc += amount; } if ((smask & GPVTG) != 0) { assert(add ? (counters->gpvtg < maxCount):(counters->gpvtg > 0)); counters->gpvtg += amount; } /* sig */ if (nmea_INFO_is_present(present, SIG)) { if (entry->nmeaInfo.sig == NMEA_SIG_HIGH) { assert(add ? (counters->sigHigh < maxCount):(counters->sigHigh > 0)); counters->sigHigh += amount; } else if (entry->nmeaInfo.sig == NMEA_SIG_MID) { assert(add ? (counters->sigMid < maxCount):(counters->sigMid > 0)); counters->sigMid += amount; } else if (entry->nmeaInfo.sig == NMEA_SIG_LOW) { assert(add ? (counters->sigLow < maxCount):(counters->sigLow > 0)); counters->sigLow += amount; } else { assert(add ? (counters->sigBad < maxCount):(counters->sigBad > 0)); counters->sigBad += amount; } } /* fix */ if (nmea_INFO_is_present(present, FIX)) { if (entry->nmeaInfo.fix == NMEA_FIX_3D) { assert(add ? (counters->fix3d < maxCount):(counters->fix3d > 0)); counters->fix3d += amount; } else if (entry->nmeaInfo.fix == NMEA_FIX_2D) { assert(add ? (counters->fix2d < maxCount):(counters->fix2d > 0)); counters->fix2d += amount; } else { assert(add ? (counters->fixBad < maxCount):(counters->fixBad > 0)); counters->fixBad += amount; } } } /** Determine the new smask, sig and fix of the average position based on the counters. The relevant smask bits (like GPGGA) are only set when all entries in the average list have that bit set. The sig and fix will be set to the lowest/worst value of all entries and will only be set to the highest/best value when all entries in the average list are set to the highest/best value. @param positionAverageList The position average list */ static void determineCumulativePresentSmaskSigFix( PositionAverageList * positionAverageList) { PositionUpdateEntry * cumulative = &positionAverageList->positionAverageCumulative; PositionUpdateCounters * counters = &positionAverageList->counters; unsigned long long count = positionAverageList->entriesCount; /* present */ cumulative->nmeaInfo.present = 0; if (counters->smask >= count) { cumulative->nmeaInfo.present |= SMASK; } if (counters->utcdate >= count) { cumulative->nmeaInfo.present |= UTCDATE; } if (counters->utctime >= count) { cumulative->nmeaInfo.present |= UTCTIME; } if (counters->sig >= count) { cumulative->nmeaInfo.present |= SIG; } if (counters->fix >= count) { cumulative->nmeaInfo.present |= FIX; } if (counters->pdop >= count) { cumulative->nmeaInfo.present |= PDOP; } if (counters->hdop >= count) { cumulative->nmeaInfo.present |= HDOP; } if (counters->vdop >= count) { cumulative->nmeaInfo.present |= VDOP; } if (counters->lat >= count) { cumulative->nmeaInfo.present |= LAT; } if (counters->lon >= count) { cumulative->nmeaInfo.present |= LON; } if (counters->elv >= count) { cumulative->nmeaInfo.present |= ELV; } if (counters->speed >= count) { cumulative->nmeaInfo.present |= SPEED; } if (counters->track >= count) { cumulative->nmeaInfo.present |= TRACK; } if (counters->mtrack >= count) { cumulative->nmeaInfo.present |= MTRACK; } if (counters->magvar >= count) { cumulative->nmeaInfo.present |= MAGVAR; } if (counters->satinusecount >= count) { cumulative->nmeaInfo.present |= SATINUSECOUNT; } if (counters->satinuse >= count) { cumulative->nmeaInfo.present |= SATINUSE; } if (counters->satinview >= count) { cumulative->nmeaInfo.present |= SATINVIEW; } /* smask */ cumulative->nmeaInfo.smask = 0; if (counters->gpgga >= count) { cumulative->nmeaInfo.smask |= GPGGA; } if (counters->gpgsa >= count) { cumulative->nmeaInfo.smask |= GPGSA; } if (counters->gpgsv >= count) { cumulative->nmeaInfo.smask |= GPGSV; } if (counters->gprmc >= count) { cumulative->nmeaInfo.smask |= GPRMC; } if (counters->gpvtg >= count) { cumulative->nmeaInfo.smask |= GPVTG; } /* sig */ cumulative->nmeaInfo.sig = NMEA_SIG_BAD; if (nmea_INFO_is_present(cumulative->nmeaInfo.present, SIG)) { if (counters->sigBad == 0) { if (counters->sigHigh >= count) { cumulative->nmeaInfo.sig = NMEA_SIG_HIGH; } else if (counters->sigMid > 0) { cumulative->nmeaInfo.sig = NMEA_SIG_MID; } else if (counters->sigLow > 0) { cumulative->nmeaInfo.sig = NMEA_SIG_LOW; } } } /* fix */ cumulative->nmeaInfo.fix = NMEA_FIX_BAD; if (nmea_INFO_is_present(cumulative->nmeaInfo.present, FIX)) { if (counters->fixBad == 0) { if (counters->fix3d >= count) { cumulative->nmeaInfo.fix = NMEA_FIX_3D; } else if (counters->fix2d > 0) { cumulative->nmeaInfo.fix = NMEA_FIX_2D; } } } } /** * Calculate angle components * * @param components a pointer to the components structure * @param angle a pointer to the angle (in degrees) from which to calculate * the components. Set to NULL when the angle is not present in the input data. * */ static void calculateAngleComponents(AngleComponents * components, double * angle) { if (!components) return; if (!angle) { components->x = 0.0; components->y = 0.0; return; } components->x = cos(nmea_degree2radian(*angle)); components->y = sin(nmea_degree2radian(*angle)); } /** * Calculate angle from its components * * @param components a pointer to the components structure * @return angle the angle (in degrees) */ static double calculateAngle(AngleComponents * components) { if (!components) return 0; return nmea_radian2degree(atan2(components->y, components->x)); } /** * Add the src angle components to the dst angle components (accumulate) * * @param dst a pointer to the destination components structure * @param src a pointer to the source components structure * @param add true to add, false to subtract */ static void addAngleComponents(AngleComponents * dst, AngleComponents * src, bool add) { if (!dst || !src) return; dst->x += add ? src->x : -src->x; dst->y += add ? src->y : -src->y; } /** Add/remove a position update entry to/from the average position list, updates the counters, adjusts the entriesCount and redetermines the cumulative smask, sig and fix. @param positionAverageList The position average list @param entry The entry to add/remove @param add True when the entry must be added to the list, false when it must be removed */ static void addOrRemoveEntryToFromCumulativeAverage( PositionAverageList * positionAverageList, PositionUpdateEntry * entry, bool add) { PositionUpdateEntry * cumulative = &positionAverageList->positionAverageCumulative; if (!add) { assert(positionAverageList->entriesCount >= positionAverageList->entriesMaxCount); assert(entry == getPositionAverageEntry(positionAverageList, OLDEST)); /* do not touch present */ /* do not touch smask */ /* do not touch utc */ /* do not touch sig */ /* do not touch fix */ /* do not touch satinfo */ } else { assert(positionAverageList->entriesCount < positionAverageList->entriesMaxCount); assert(entry == getPositionAverageEntry(positionAverageList, INCOMING)); /* present at the end */ /* smask at the end */ /* use the latest utc */ cumulative->nmeaInfo.utc = entry->nmeaInfo.utc; /* sig at the end */ /* fix at the end */ /* use the latest satinfo */ cumulative->nmeaInfo.satinfo = entry->nmeaInfo.satinfo; } /* PDOP, HDOP, VDOP */ cumulative->nmeaInfo.PDOP += add ? entry->nmeaInfo.PDOP : -entry->nmeaInfo.PDOP; cumulative->nmeaInfo.HDOP += add ? entry->nmeaInfo.HDOP : -entry->nmeaInfo.HDOP; cumulative->nmeaInfo.VDOP += add ? entry->nmeaInfo.VDOP : -entry->nmeaInfo.VDOP; /* lat, lon */ cumulative->nmeaInfo.lat += add ? entry->nmeaInfo.lat : -entry->nmeaInfo.lat; cumulative->nmeaInfo.lon += add ? entry->nmeaInfo.lon : -entry->nmeaInfo.lon; /* elv, speed */ cumulative->nmeaInfo.elv += add ? entry->nmeaInfo.elv : -entry->nmeaInfo.elv; cumulative->nmeaInfo.speed += add ? entry->nmeaInfo.speed : -entry->nmeaInfo.speed; /* track, mtrack, magvar */ cumulative->nmeaInfo.track += add ? entry->nmeaInfo.track : -entry->nmeaInfo.track; addAngleComponents(&cumulative->track, &entry->track, add); cumulative->nmeaInfo.mtrack += add ? entry->nmeaInfo.mtrack : -entry->nmeaInfo.mtrack; addAngleComponents(&cumulative->mtrack, &entry->mtrack, add); cumulative->nmeaInfo.magvar += add ? entry->nmeaInfo.magvar : -entry->nmeaInfo.magvar; addAngleComponents(&cumulative->magvar, &entry->magvar, add); /* adjust list count */ positionAverageList->entriesCount += (add ? 1 : -1); updateCounters(positionAverageList, entry, add); determineCumulativePresentSmaskSigFix(positionAverageList); } /** Update the average position from the cumulative average position. Basically divide all relevant cumulative values by the number of entries in the list. @param positionAverageList The position average list */ static void updatePositionAverageFromCumulative( PositionAverageList * positionAverageList) { double divider = positionAverageList->entriesCount; positionAverageList->positionAverage = positionAverageList->positionAverageCumulative; /* smask: use from cumulative average */ /* utc: use from cumulative average */ /* sig: use from cumulative average */ /* fix: use from cumulative average */ if (divider > 1.0) { positionAverageList->positionAverage.nmeaInfo.PDOP /= divider; positionAverageList->positionAverage.nmeaInfo.HDOP /= divider; positionAverageList->positionAverage.nmeaInfo.VDOP /= divider; positionAverageList->positionAverage.nmeaInfo.lat /= divider; positionAverageList->positionAverage.nmeaInfo.lon /= divider; positionAverageList->positionAverage.nmeaInfo.elv /= divider; positionAverageList->positionAverage.nmeaInfo.speed /= divider; positionAverageList->positionAverage.nmeaInfo.track = calculateAngle(&positionAverageList->positionAverageCumulative.track); positionAverageList->positionAverage.nmeaInfo.mtrack = calculateAngle(&positionAverageList->positionAverageCumulative.mtrack); positionAverageList->positionAverage.nmeaInfo.magvar = calculateAngle(&positionAverageList->positionAverageCumulative.magvar); } /* satinfo: use from average */ } /** Add a new (incoming) position update to the position average list @param positionAverageList The position average list @param newEntry The new (incoming) position update (must be the same as the one returned from the function getPositionAverageEntryForIncoming:INCOMING) */ void addNewPositionToAverage(PositionAverageList * positionAverageList, PositionUpdateEntry * newEntry) { assert (positionAverageList != NULL); assert (newEntry == getPositionAverageEntry(positionAverageList, INCOMING)); if (positionAverageList->entriesCount >= positionAverageList->entriesMaxCount) { /* list is full, so first remove the oldest from the average */ addOrRemoveEntryToFromCumulativeAverage(positionAverageList, getPositionAverageEntry(positionAverageList, OLDEST), false); } /* calculate the angle components */ calculateAngleComponents(&newEntry->track, nmea_INFO_is_present(newEntry->nmeaInfo.present, TRACK) ? &newEntry->nmeaInfo.track : NULL); calculateAngleComponents(&newEntry->mtrack, nmea_INFO_is_present(newEntry->nmeaInfo.present, MTRACK) ? &newEntry->nmeaInfo.mtrack : NULL); calculateAngleComponents(&newEntry->magvar, nmea_INFO_is_present(newEntry->nmeaInfo.present, MAGVAR) ? &newEntry->nmeaInfo.magvar : NULL); /* now just add the new position */ addOrRemoveEntryToFromCumulativeAverage(positionAverageList, newEntry, true); /* update the place where the new entry is stored */ positionAverageList->newestEntryIndex = WRAPINDEX(positionAverageList, NEWESTINDEX(positionAverageList) + 1); /* update average position */ updatePositionAverageFromCumulative(positionAverageList); } olsrd-0.6.6.2/lib/pud/src/posAvg.h000066400000000000000000000125731234304727700165640ustar00rootroot00000000000000#ifndef _PUD_POSAVG_H_ #define _PUD_POSAVG_H_ /* Plugin includes */ /* OLSR includes */ /* System includes */ #include #include /** Stores angle components */ typedef struct _AngleComponents { double x; /**< cos of the angle (in radians) */ double y; /**< sin of the angle (in radians) */ } AngleComponents; /** Stores an nmeaINFO entry, used in the averaging */ typedef struct _PositionUpdateEntry { nmeaINFO nmeaInfo; /**< the position information */ /* used for averaging of angles */ AngleComponents track; /**< the track angle components */ AngleComponents mtrack; /**< the mtrack angle components */ AngleComponents magvar; /**< the magvar angle components */ } PositionUpdateEntry; /** Counts the number of GPxxx based entries. Some parameters in nmeaINFO are dependent on different GPxxx NMEA sentences. These counters are used to determine which information would be valid for the average position. Also counts the fix values. */ typedef struct _PositionUpdateCounters { /* present */ unsigned long long smask; /**< the number of entries with SMASK present */ unsigned long long utcdate; /**< the number of entries with UTCDATE present */ unsigned long long utctime; /**< the number of entries with UTCTIME present */ unsigned long long sig; /**< the number of entries with SIG present */ unsigned long long fix; /**< the number of entries with FIX present */ unsigned long long pdop; /**< the number of entries with PDOP present */ unsigned long long hdop; /**< the number of entries with HDOP present */ unsigned long long vdop; /**< the number of entries with VDOP present */ unsigned long long lat; /**< the number of entries with LAT present */ unsigned long long lon; /**< the number of entries with LON present */ unsigned long long elv; /**< the number of entries with ELV present */ unsigned long long speed; /**< the number of entries with SPEED present */ unsigned long long track; /**< the number of entries with TRACK present */ unsigned long long mtrack; /**< the number of entries with MTRACK present */ unsigned long long magvar; /**< the number of entries with MAGVAR present */ unsigned long long satinusecount; /**< the number of entries with SATINUSECOUNT present */ unsigned long long satinuse; /**< the number of entries with SATINUSE present */ unsigned long long satinview; /**< the number of entries with SATINVIEW present */ /* smask */ unsigned long long gpgga; /**< the number of GPGGA based entries */ unsigned long long gpgsa; /**< the number of GPGSA based entries */ unsigned long long gpgsv; /**< the number of GPGSV based entries */ unsigned long long gprmc; /**< the number of GPRMC based entries */ unsigned long long gpvtg; /**< the number of GPVTG based entries */ /* sig */ unsigned long long sigBad; /**< the number of entries with a bad sig */ unsigned long long sigLow; /**< the number of entries with a low sig */ unsigned long long sigMid; /**< the number of entries with a mid sig */ unsigned long long sigHigh; /**< the number of entries with a high sig */ /* fix */ unsigned long long fixBad; /**< the number of entries with a bad fix */ unsigned long long fix2d; /**< the number of entries with a 2D fix */ unsigned long long fix3d; /**< the number of entries with a 3D fix */ } PositionUpdateCounters; /** A list of position updates that are used to determine the average position. The list uses 1 extra entry: when 5 entries have to be averaged then the list will have 6 entries. The 6th entry is used for the incoming entry, so that it is already in the list (together with the old entry that will be removed from the average) and does not need to be copied into the list. This is for better performance. The list is a circular list. This means that there is a gap/unused entry in the list between the newest entry and the oldest entry, which is the 'incoming entry'. Note that 'positionAverageCumulative' stores cumulative values for parameters for which an average is calculated. The reason is to minimise the number of calculations to be performed. */ typedef struct _PositionAverageList { unsigned long long entriesMaxCount; /**< the maximum number of entries in the list */ PositionUpdateEntry * entries; /**< the list entries */ unsigned long long entriesCount; /**< the number of entries in the list */ unsigned long long newestEntryIndex; /**< index of the newest entry in the list (zero-based) */ PositionUpdateCounters counters; /**< the counters */ PositionUpdateEntry positionAverageCumulative; /**< the average position with cumulative values */ PositionUpdateEntry positionAverage; /**< the average position */ } PositionAverageList; /** Enumeration describing the type of an entry position in the average list */ typedef enum _AverageEntryPositionType { OLDEST, NEWEST, INCOMING, AVERAGECUMULATIVE, AVERAGE } AverageEntryPositionType; bool initPositionAverageList(PositionAverageList * positionAverageList, unsigned long long maxEntries); void flushPositionAverageList(PositionAverageList * positionAverageList); void destroyPositionAverageList(PositionAverageList * positionAverageList); PositionUpdateEntry * getPositionAverageEntry( PositionAverageList * positionAverageList, AverageEntryPositionType positionType); void addNewPositionToAverage(PositionAverageList * positionAverageList, PositionUpdateEntry * newEntry); #endif /* _PUD_POSAVG_H_ */ olsrd-0.6.6.2/lib/pud/src/posFile.c000066400000000000000000000212101234304727700167050ustar00rootroot00000000000000#include "posFile.h" /* Plugin includes */ #include "pud.h" #include "configTools.h" /* OLSR includes */ /* System includes */ #include #include #include #include #include #include /** the maximal length of a line that is read from the file */ #define LINE_LENGTH 256 /** regular expression describing a comment */ static const char * regexCommentString = "^([[:space:]]*|[[:space:]#]+.*)$"; /** regular expression describing a key/value pair */ static const char * regexNameValueString = "^[[:space:]]*([^[:space:]]+)[[:space:]]*=[[:space:]]*([^[:space:]]+)[[:space:]]*$"; /** the number of matches in regexNameValueString */ static const size_t regexNameValuematchCount = 3; /** the compiled regular expression describing a comment */ static regex_t regexComment; /** the compiled regular expression describing a key/value pair */ static regex_t regexNameValue; /** true when the plugin has been started */ static bool started = false; /** type to hold the cached stat result */ typedef struct _CachedStat { time_t timeStamp; /* Time of last modification (second resolution) */ } CachedStat; /** the cached stat result */ static CachedStat cachedStat; /** * Initialises the positionFile reader. * @return true upon success, false otherwise */ bool startPositionFile(void) { if (started) { return true; } if (regcomp(®exComment, regexCommentString, REG_EXTENDED | REG_ICASE)) { pudError(false, "Could not compile regex \"%s\"", regexCommentString); return false; } if (regcomp(®exNameValue, regexNameValueString, REG_EXTENDED | REG_ICASE)) { pudError(false, "Could not compile regex \"%s\"", regexNameValueString); regfree(®exComment); return false; } cachedStat.timeStamp = -1; started = true; return true; } /** * Cleans up the positionFile reader. */ void stopPositionFile(void) { if (started) { regfree(®exNameValue); regfree(®exComment); started = false; } } /** * Performs a regex match * @param regex the compiled regex to match against * @param line the line to match * @param nmatch the number of matches to produce * @param pmatch the array with match information * @return true upon success, false otherwise */ static bool regexMatch(regex_t * regex, char * line, size_t nmatch, regmatch_t pmatch[]) { int result = regexec(regex, line, nmatch, pmatch, 0); if (!result) { return true; } if (result == REG_NOMATCH) { return false; } { char msgbuf[256]; regerror(result, regex, msgbuf, sizeof(msgbuf)); pudError(false, "Regex match failed: %s", msgbuf); } return false; } /** the buffer in which to store a line read from the file */ static char line[LINE_LENGTH]; /** * Read the position file * @param fileName the filename * @param nmeaInfo the NMEA data */ bool readPositionFile(char * fileName, nmeaINFO * nmeaInfo) { bool retval = false; int fd; struct stat statBuf; nmeaINFO result; FILE * fp = NULL; unsigned int lineNumber = 0; char * name = NULL; char * value = NULL; fd = open(fileName, O_RDONLY); if (fd < 0) { /* could not access the file */ goto out; } if (fstat(fd, &statBuf)) { /* could not access the file */ goto out; } if (!memcmp(&cachedStat.timeStamp, &statBuf.st_mtime, sizeof(cachedStat.timeStamp))) { /* file did not change since last read */ goto out; } fp = fdopen(fd, "r"); if (!fp) { goto out; } nmea_zero_INFO(&result); result.sig = POSFILE_DEFAULT_SIG; result.fix = POSFILE_DEFAULT_FIX; result.HDOP = POSFILE_DEFAULT_HDOP; result.VDOP = POSFILE_CALCULATED_VDOP(result.HDOP); result.PDOP = POSFILE_CALCULATED_PDOP(result.HDOP); result.lat = POSFILE_DEFAULT_LAT; result.lon = POSFILE_DEFAULT_LON; result.elv = POSFILE_DEFAULT_ELV; result.speed = POSFILE_DEFAULT_SPEED; result.track = POSFILE_DEFAULT_TRACK; result.mtrack = POSFILE_DEFAULT_MTRACK; result.magvar = POSFILE_DEFAULT_MAGVAR; memcpy(&cachedStat.timeStamp, &statBuf.st_mtime, sizeof(cachedStat.timeStamp)); while (fgets(line, LINE_LENGTH, fp)) { regmatch_t pmatch[regexNameValuematchCount]; lineNumber++; if (regexMatch(®exComment, line, 0, NULL)) { continue; } if (!regexMatch(®exNameValue, line, regexNameValuematchCount, pmatch)) { pudError(false, "Position file \"%s\", line %d uses invalid syntax: %s", fileName, lineNumber, line); goto out; } /* determine name/value */ name = &line[pmatch[1].rm_so]; line[pmatch[1].rm_eo] = '\0'; value = &line[pmatch[2].rm_so]; line[pmatch[2].rm_eo] = '\0'; if (!strncasecmp(POSFILE_NAME_SIG, name, sizeof(line))) { if (!strncasecmp(POSFILE_VALUE_SIG_BAD, value, sizeof(line))) { result.sig = NMEA_SIG_BAD; } else if (!strncasecmp(POSFILE_VALUE_SIG_LOW, value, sizeof(line))) { result.sig = NMEA_SIG_LOW; } else if (!strncasecmp(POSFILE_VALUE_SIG_MID, value, sizeof(line))) { result.sig = NMEA_SIG_MID; } else if (!strncasecmp(POSFILE_VALUE_SIG_HIGH, value, sizeof(line))) { result.sig = NMEA_SIG_HIGH; } else { pudError(false, "Position file \"%s\", line %d uses an invalid value for \"%s\"," " valid values are [%s|%s\%s|%s]", fileName, lineNumber, POSFILE_NAME_SIG, POSFILE_VALUE_SIG_BAD, POSFILE_VALUE_SIG_LOW, POSFILE_VALUE_SIG_MID, POSFILE_VALUE_SIG_HIGH); goto out; } nmea_INFO_set_present(&result.present, SIG); } else if (!strncasecmp(POSFILE_NAME_FIX, name, sizeof(line))) { if (!strncasecmp(POSFILE_VALUE_FIX_BAD, value, sizeof(line))) { result.fix = NMEA_FIX_BAD; } else if (!strncasecmp(POSFILE_VALUE_FIX_2D, value, sizeof(line))) { result.fix = NMEA_FIX_2D; } else if (!strncasecmp(POSFILE_VALUE_FIX_3D, value, sizeof(line))) { result.fix = NMEA_FIX_3D; } else { pudError(false, "Position file \"%s\", line %d uses an invalid value for \"%s\"," " valid values are [%s\%s|%s]", fileName, lineNumber, POSFILE_NAME_FIX, POSFILE_VALUE_FIX_BAD, POSFILE_VALUE_FIX_2D, POSFILE_VALUE_FIX_3D); goto out; } nmea_INFO_set_present(&result.present, FIX); } else if (!strncasecmp(POSFILE_NAME_HDOP, name, sizeof(line))) { double val; if (!readDouble(POSFILE_NAME_HDOP, value, &val)) { goto out; } result.HDOP = val; result.VDOP = POSFILE_CALCULATED_VDOP(result.HDOP); result.PDOP = POSFILE_CALCULATED_PDOP(result.HDOP); nmea_INFO_set_present(&result.present, HDOP); nmea_INFO_set_present(&result.present, VDOP); nmea_INFO_set_present(&result.present, PDOP); } else if (!strncasecmp(POSFILE_NAME_LAT, name, sizeof(line))) { double val; if (!readDouble(POSFILE_NAME_LAT, value, &val)) { goto out; } result.lat = val; nmea_INFO_set_present(&result.present, LAT); } else if (!strncasecmp(POSFILE_NAME_LON, name, sizeof(line))) { double val; if (!readDouble(POSFILE_NAME_LON, value, &val)) { goto out; } result.lon = val; nmea_INFO_set_present(&result.present, LON); } else if (!strncasecmp(POSFILE_NAME_ELV, name, sizeof(line))) { double val; if (!readDouble(POSFILE_NAME_ELV, value, &val)) { goto out; } result.elv = val; nmea_INFO_set_present(&result.present, ELV); } else if (!strncasecmp(POSFILE_NAME_SPEED, name, sizeof(line))) { double val; if (!readDouble(POSFILE_NAME_SPEED, value, &val)) { goto out; } result.speed = val; nmea_INFO_set_present(&result.present, SPEED); } else if (!strncasecmp(POSFILE_NAME_TRACK, name, sizeof(line))) { double val; if (!readDouble(POSFILE_NAME_TRACK, value, &val)) { goto out; } result.track = val; nmea_INFO_set_present(&result.present, TRACK); } else if (!strncasecmp(POSFILE_NAME_MTRACK, name, sizeof(line))) { double val; if (!readDouble(POSFILE_NAME_MTRACK, value, &val)) { goto out; } result.mtrack = val; nmea_INFO_set_present(&result.present, MTRACK); } else if (!strncasecmp(POSFILE_NAME_MAGVAR, name, sizeof(line))) { double val; if (!readDouble(POSFILE_NAME_MAGVAR, value, &val)) { goto out; } result.magvar = val; nmea_INFO_set_present(&result.present, MAGVAR); } else { pudError(false, "Position file \"%s\", line %d uses an invalid option \"%s\"," " valid options are [%s|%s|%s|%s|%s|%s|%s|%s|%s|%s]", fileName, lineNumber, name, POSFILE_NAME_SIG, POSFILE_NAME_FIX, POSFILE_NAME_HDOP, POSFILE_NAME_LAT, POSFILE_NAME_LON, POSFILE_NAME_ELV, POSFILE_NAME_SPEED, POSFILE_NAME_TRACK, POSFILE_NAME_MTRACK, POSFILE_NAME_MAGVAR); goto out; } } fclose(fp); fp = 0; result.smask = POSFILE_DEFAULT_SMASK; nmea_INFO_set_present(&result.present, SMASK); nmea_INFO_sanitise(&result); nmea_INFO_unit_conversion(&result); memcpy(nmeaInfo, &result, sizeof(result)); retval = true; out: if (fp) { fclose(fp); } if (fd >= 0) { close(fd); } return retval; } olsrd-0.6.6.2/lib/pud/src/posFile.h000066400000000000000000000056311234304727700167230ustar00rootroot00000000000000#ifndef _PUD_POSFILE_H_ #define _PUD_POSFILE_H_ /* Plugin includes */ /* OLSR includes */ /* System includes */ #include #include #include /**
 field/sentence       GPGGA   GPGSA   GPGSV   GPRMC   GPVTG
 present:               x       x       x       x       x
 smask:                 x       x       x       x       x
 utc (date):                                    x
 utc (time):            x                       x
 sig:                   x                       x1
 fix:                           x               x1
 PDOP:                          x                           =sqrt(2)*HDOP  (GPGSA)
 HDOP:                  x       x
 VDOP:                          x                           =HDOP          (GPGSA)
 lat:                   x                       x
 lon:                   x                       x
 elv:                   x
 speed:                                         x       x
 track:                                         x       x
 mtrack:                                                x
 magvar:                                        x
 satinfo (inuse count): x       x1
 satinfo (inuse):               x
 satinfo (inview):                      x

 x1 = not present in the sentence but the library sets it up.
 
*/ #define POSFILE_DEFAULT_SMASK (GPGGA | GPGSA | GPRMC | GPVTG) /* no default utc: current time is always used */ #define POSFILE_DEFAULT_SIG (NMEA_SIG_HIGH) #define POSFILE_DEFAULT_FIX (NMEA_FIX_BAD) #define POSFILE_DEFAULT_HDOP (0.0) #define POSFILE_DEFAULT_LAT (0.0) #define POSFILE_DEFAULT_LON (0.0) #define POSFILE_DEFAULT_ELV (0.0) #define POSFILE_DEFAULT_SPEED (0.0) #define POSFILE_DEFAULT_TRACK (0.0) #define POSFILE_DEFAULT_MTRACK (0.0) #define POSFILE_DEFAULT_MAGVAR (0.0) #define POSFILE_CALCULATED_VDOP(hdop) (hdop) #define POSFILE_CALCULATED_PDOP(hdop) (hdop * 1.414213562) #define POSFILE_NAME_SIG "sig" #define POSFILE_NAME_FIX "fix" #define POSFILE_NAME_HDOP "hdop" #define POSFILE_NAME_LAT "lat" #define POSFILE_NAME_LON "lon" #define POSFILE_NAME_ELV "elv" #define POSFILE_NAME_SPEED "speed" #define POSFILE_NAME_TRACK "track" #define POSFILE_NAME_MTRACK "mtrack" #define POSFILE_NAME_MAGVAR "magvar" #define POSFILE_VALUE_SIG_BAD "bad" #define POSFILE_VALUE_SIG_LOW "low" #define POSFILE_VALUE_SIG_MID "mid" #define POSFILE_VALUE_SIG_HIGH "high" #define POSFILE_VALUE_FIX_BAD "bad" #define POSFILE_VALUE_FIX_2D "2d" #define POSFILE_VALUE_FIX_3D "3d" bool startPositionFile(void); void stopPositionFile(void); bool readPositionFile(char * fileName, nmeaINFO * nmeaInfo); #endif /* _PUD_POSFILE_H_ */ olsrd-0.6.6.2/lib/pud/src/pud.c000066400000000000000000000270211234304727700161020ustar00rootroot00000000000000#include "pud.h" /* Plugin includes */ #include "dedup.h" #include "networkInterfaces.h" #include "configuration.h" #include "gpsConversion.h" #include "receiver.h" #include "state.h" #include "posFile.h" #include "compiler.h" /* OLSRD includes */ #include "olsr.h" #include "ipcalc.h" #include "net_olsr.h" #include "parser.h" #include "log.h" /* System includes */ /** The size of the buffer in which the received NMEA string is stored */ #define BUFFER_SIZE_RX_NMEA 2048 /** The size of the buffer in which the received downlink message is stored */ #define BUFFER_SIZE_RX_DOWNLINK 2048 /** The size of the buffer in which the converted NMEA string is assembled for * transmission over OSLR */ #define BUFFER_SIZE_TX_OLSR 512 /** The de-duplication list */ static DeDupList deDupList; /** When false, use olsr_printf in pudError, otherwise use olsr_syslog */ static bool pudErrorUseSysLog = false; /** Report a plugin error. @param useErrno when true then errno is used in the error message; the error reason is also reported. @param format a pointer to the format string @param ... arguments to the format string */ void pudError(bool useErrno, const char *format, ...) { char strDesc[256]; const char *colon; const char *stringErr; if ((format == NULL) || (*format == '\0')) { strDesc[0] = '\0'; colon = ""; if (!useErrno) { stringErr = "Unknown error"; } else { stringErr = strerror(errno); } } else { va_list arglist; va_start(arglist, format); vsnprintf(strDesc, sizeof(strDesc), format, arglist); va_end(arglist); if (useErrno) { colon = ": "; stringErr = strerror(errno); } else { colon = ""; stringErr = ""; } } if (!pudErrorUseSysLog) olsr_printf(0, "%s: %s%s%s\n", PUD_PLUGIN_ABBR, strDesc, colon, stringErr); else olsr_syslog(OLSR_LOG_ERR, "%s: %s%s%s\n", PUD_PLUGIN_ABBR, strDesc, colon, stringErr); } /** Sends a buffer out on all transmit interfaces @param buffer the buffer @param bufferLength the number of bytes in the buffer */ static void sendToAllTxInterfaces(unsigned char *buffer, unsigned int bufferLength) { union olsr_sockaddr * txAddress = getTxMcAddr(); void * addr; socklen_t addrSize; TRxTxNetworkInterface *txNetworkInterfaces = getTxNetworkInterfaces(); if (txAddress->in.sa_family == AF_INET) { addr = &txAddress->in4; addrSize = sizeof(struct sockaddr_in); } else { addr = &txAddress->in6; addrSize = sizeof(struct sockaddr_in6); } while (txNetworkInterfaces != NULL) { TRxTxNetworkInterface *networkInterface = txNetworkInterfaces; errno = 0; if (sendto(networkInterface->socketFd, buffer, bufferLength, 0, addr, addrSize) < 0) { pudError(true, "Transmit error on interface %s", &networkInterface->name[0]); } txNetworkInterfaces = networkInterface->next; } } /** Called by OLSR core when a packet for the plugin is received from the OLSR network. It converts the packet into an NMEA string and transmits it over all transmit non-OLSR network interfaces. @param olsrMessage a pointer to the received OLSR message @param in_if a pointer to the OLSR network interface on which the packet was received @param ipaddr a pointer to the IP address of the sender @return - true when the packet was processed - false otherwise */ bool packetReceivedFromOlsr(union olsr_message *olsrMessage, struct interface *in_if __attribute__ ((unused)), union olsr_ip_addr *ipaddr __attribute__ ((unused))) { const union olsr_ip_addr * originator = getOlsrMessageOriginator( olsr_cnf->ip_version, olsrMessage); unsigned int transmitStringLength; unsigned char buffer[BUFFER_SIZE_TX_OLSR]; /* when we do not loopback then check if the message originated from this * node: back off */ if (!getUseLoopback() && ipequal(originator, &olsr_cnf->main_addr)) { return false; } /* do deduplication: when we have already seen this message from the same * originator then just back off */ if (likely(getUseDeDup())) { if (isInDeDupList(&deDupList, olsrMessage)) { return false; } addToDeDup(&deDupList, olsrMessage); } transmitStringLength = gpsFromOlsr(olsrMessage, &buffer[0], sizeof(buffer)); if (unlikely(transmitStringLength == 0)) { return false; } sendToAllTxInterfaces(&buffer[0], transmitStringLength); return true; } /** Called by OLSR core when a packet for the plugin is received from the downlink. It unpacks the messages and distributes them into OLSR and on the LAN. @param skfd the socket file descriptor on which the packet is received @param data a pointer to the network interface structure on which the packet was received @param flags unused */ static void packetReceivedFromDownlink(int skfd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { if (skfd >= 0) { unsigned char rxBuffer[BUFFER_SIZE_RX_DOWNLINK]; ssize_t rxCount = 0; ssize_t rxIndex = 0; /* Receive the captured Ethernet frame */ errno = 0; rxCount = recvfrom(skfd, &rxBuffer[0], (sizeof(rxBuffer) - 1), 0, NULL, NULL); if (rxCount < 0) { pudError(true, "Receive error in %s, ignoring message.", __func__); return; } while (rxIndex < rxCount) { UplinkMessage * msg = (UplinkMessage *) &rxBuffer[rxIndex]; uint8_t type; uint16_t uplinkMessageLength; uint16_t olsrMessageLength; bool ipv6; union olsr_message * olsrMessage; type = getUplinkMessageType(&msg->header); olsrMessageLength = getUplinkMessageLength(&msg->header); uplinkMessageLength = olsrMessageLength + sizeof(UplinkHeader); if (unlikely((rxIndex + uplinkMessageLength) > rxCount)) { pudError(false, "Received wrong length (%d) in %s," " ignoring the rest of the messages.", olsrMessageLength, __func__); return; } rxIndex += uplinkMessageLength; if (type != POSITION) { pudError(false, "Received wrong type (%d) in %s," " ignoring message.", type, __func__); continue; } ipv6 = getUplinkMessageIPv6(&msg->header); if (unlikely(!ipv6 && (olsr_cnf->ip_version == AF_INET6)) || unlikely(ipv6 && (olsr_cnf->ip_version == AF_INET))) { pudError(false, "Received wrong IPv6 status (%s) in %s," " ignoring message.", (ipv6 ? "true" : "false"), __func__); continue; } olsrMessage = &msg->msg.olsrMessage; /* we now have a position update (olsrMessage) of a certain length * (olsrMessageLength). this needs to be transmitted over OLSR and on the LAN */ /* send out over OLSR interfaces (only when the smart gateway system is enabled) */ if (olsr_cnf->smart_gw_active) { int r; struct interface *ifn; for (ifn = ifnet; ifn; ifn = ifn->int_next) { /* force the pending buffer out if there's not enough space for our message */ if ((int)olsrMessageLength > net_outbuffer_bytes_left(ifn)) { net_output(ifn); } r = net_outbuffer_push(ifn, olsrMessage, olsrMessageLength); if (r != (int) olsrMessageLength) { pudError( false, "Could not send to OLSR interface %s: %s" " (length=%u, r=%d)", ifn->int_name, ((r == -1) ? "no buffer was found" : (r == 0) ? "there was not enough room in the buffer" : "unknown reason"), olsrMessageLength, r); } } } /* send out over tx interfaces */ (void) packetReceivedFromOlsr(olsrMessage, NULL, NULL); } } } /** Called by OLSR core when a packet for the plugin is received from the non-OLSR network. It converts the packet into the internal OLSR wire format for a position update and transmits it over all OLSR network interfaces. @param skfd the socket file descriptor on which the packet is received @param data a pointer to the network interface structure on which the packet was received @param flags unused */ static void packetReceivedForOlsr(int skfd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { if (skfd >= 0) { unsigned char rxBuffer[BUFFER_SIZE_RX_NMEA]; ssize_t rxCount; union olsr_sockaddr sender; socklen_t senderSize = sizeof(sender); assert(data != NULL); /* Receive the captured Ethernet frame */ memset(&sender, 0, senderSize); errno = 0; rxCount = recvfrom(skfd, &rxBuffer[0], (sizeof(rxBuffer) - 1), 0, (struct sockaddr *)&sender, &senderSize); if (rxCount < 0) { pudError(true, "Receive error in %s, ignoring message.", __func__); return; } /* make sure the string is null-terminated */ rxBuffer[rxCount] = '\0'; /* only accept messages from configured IP addresses */ if (!isRxAllowedSourceIpAddress(&sender)) { return; } /* we have the received string in the rxBuffer now */ /* hand the NMEA information to the receiver */ (void) receiverUpdateGpsInformation(&rxBuffer[0], rxCount); } } /** * Timer callback that reads the pud position file */ static void pud_read_position_file(void *context __attribute__ ((unused))) { updatePositionFromFile(); return; } /** The timer cookie, used to trace back the originator in debug */ static struct olsr_cookie_info *pud_position_file_timer_cookie = NULL; /** The timer */ static struct timer_entry * pud_position_file_timer = NULL; /** Initialise the plugin: check the configuration, initialise the NMEA parser, create network interface sockets, hookup the plugin to OLSR and setup data that can be setup in advance. @return - false upon failure - true otherwise */ bool initPud(void) { unsigned long long positionFilePeriod; if (!checkConfig()) { pudError(false, "Invalid configuration"); goto error; } initState(); if (!initDeDupList(&deDupList, getDeDupDepth())) { pudError(false, "Could not initialise de-duplication list"); goto error; } if (!startPositionFile()) { goto error; } if (!startReceiver()) { pudError(false, "Could not start receiver"); goto error; } /* * Creates receive and transmit sockets and register the receive sockets * with the OLSR stack */ if (!createNetworkInterfaces(&packetReceivedForOlsr, &packetReceivedFromDownlink)) { pudError(false, "Could not create require network interfaces"); goto error; } if (!checkRunSetup()) { pudError(false, "Invalid configuration"); goto error; } /* * Tell OLSR to call packetReceivedFromOlsr when the packets for this * plugin arrive from the OLSR network */ olsr_parser_add_function(&packetReceivedFromOlsr, PUD_OLSR_MSG_TYPE); /* switch to syslog logging, load was succesful */ pudErrorUseSysLog = !olsr_cnf->no_fork; positionFilePeriod = getPositionFilePeriod(); if (getPositionFile() && positionFilePeriod) { if (pud_position_file_timer_cookie == NULL) { pud_position_file_timer_cookie = olsr_alloc_cookie("pud position file", OLSR_COOKIE_TYPE_TIMER); if (pud_position_file_timer_cookie == NULL) { pudError(false, "Could not allocate pud position file cookie"); return false; } } if (pud_position_file_timer == NULL) { pud_position_file_timer = olsr_start_timer(positionFilePeriod, 0, OLSR_TIMER_PERIODIC, &pud_read_position_file, NULL, pud_position_file_timer_cookie); if (pud_position_file_timer == NULL) { pudError(false, "Could not start pud position file timer"); return false; } } } return true; error: closePud(); return false; } /** Stop the plugin: shut down all created network interface sockets and destroy the NMEA parser. */ void closePud(void) { if (pud_position_file_timer != NULL) { olsr_stop_timer(pud_position_file_timer); pud_position_file_timer = NULL; } if (pud_position_file_timer_cookie != NULL) { olsr_free_cookie(pud_position_file_timer_cookie); pud_position_file_timer_cookie = NULL; } stopPositionFile(); closeNetworkInterfaces(); stopReceiver(); destroyDeDupList(&deDupList); } olsrd-0.6.6.2/lib/pud/src/pud.h000066400000000000000000000013731234304727700161110ustar00rootroot00000000000000#ifndef _PUD_PUD_H #define _PUD_PUD_H /* Plugin includes */ /* OLSR includes */ #include "olsr_protocol.h" #include "interfaces.h" #include "olsr_types.h" /* System includes */ #include /* * Global */ /** The long plugin name */ #define PUD_PLUGIN_NAME_LONG "OLSRD Position Update Distribution (PUD) plugin" /** The short plugin name / abbreviation */ #define PUD_PLUGIN_ABBR "PUD" /* * Interface */ bool initPud(void); void closePud(void); void pudError(bool useErrno, const char *format, ...) __attribute__ ((format(printf, 2, 3))); bool packetReceivedFromOlsr(union olsr_message *olsrMessage, struct interface *in_if __attribute__ ((unused)), union olsr_ip_addr *ipaddr __attribute__ ((unused))); #endif /* _PUD_PUD_H */ olsrd-0.6.6.2/lib/pud/src/pudOlsrdPlugin.c000066400000000000000000000031321234304727700202620ustar00rootroot00000000000000#include "pudOlsrdPlugin.h" /* Plugin includes */ #include "pud.h" /* OLSRD includes */ #include "olsr.h" /* System includes */ /* * OLSR Entrypoints */ /** OLSR entrypoint to initialise the plugin. @return - 0 on fail - 1 on success */ int olsrd_plugin_init(void) { bool retval = initPud(); if (retval) { olsr_printf(0, "%s\n", PUD_PLUGIN_NAME_LONG #ifdef GIT_SHA " (" GIT_SHA ")" #endif /* GIT_SHA */ ); } return (retval ? 1 : 0); } /** OLSR entrypoint to retrieve the interface version supported by the plugin. @return the supported interface version */ int olsrd_plugin_interface_version(void) { return PUD_PLUGIN_INTERFACE_VERSION; } /** OLSR entrypoint to retrieve the plugin parameter configuration. @param params a pointer to a variable in which the function stores a pointer to the plugin parameter configuration @param size a pointer to a variable in which the function stores the number of rows of the plugin parameter configuration */ void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = &plugin_parameters[0]; *size = ARRAYSIZE(plugin_parameters); } /* * Shared Library Entrypoints */ /** Shared library entrypoint declaration for initialisation */ static void __attribute__ ((constructor)) pud_init(void); /** Shared library entrypoint declaration for destruction */ static void __attribute__ ((destructor)) pud_fini(void); /** Shared library entrypoint for initialisation */ static void pud_init(void) { } /** Shared library entrypoint for destruction */ static void pud_fini(void) { closePud(); } olsrd-0.6.6.2/lib/pud/src/pudOlsrdPlugin.h000066400000000000000000000101511234304727700202660ustar00rootroot00000000000000#ifndef _PUD_OLSRD_PLUGIN_H_ #define _PUD_OLSRD_PLUGIN_H_ /* Plugin includes */ #include "configuration.h" /* OLSRD includes */ #include "olsrd_plugin.h" /* System includes */ #include /** The interface version supported by the plugin */ #define PUD_PLUGIN_INTERFACE_VERSION 5 /** The plugin parameter configuration, containing the parameter names, pointers to their setters, and an optional data pointer that is given to the setter when it is called. */ static const struct olsrd_plugin_parameters plugin_parameters[] = { /* ID */ { .name = PUD_NODE_ID_TYPE_NAME, .set_plugin_parameter = &setNodeIdType, .data = NULL}, { .name = PUD_NODE_ID_NAME, .set_plugin_parameter = &setNodeId, .data = NULL}, /* OLSR */ { .name = PUD_OLSR_TTL_NAME, .set_plugin_parameter = &setOlsrTtl, .data = NULL}, { .name = PUD_UPDATE_INTERVAL_STATIONARY_NAME, .set_plugin_parameter = &setUpdateIntervalStationary, .data = NULL}, { .name = PUD_UPDATE_INTERVAL_MOVING_NAME, .set_plugin_parameter = &setUpdateIntervalMoving, .data = NULL}, /* RX */ { .name = PUD_RX_NON_OLSR_IF_NAME, .set_plugin_parameter = &addRxNonOlsrInterface, .data = NULL}, { .name = PUD_RX_ALLOWED_SOURCE_IP_NAME, .set_plugin_parameter = &addRxAllowedSourceIpAddress, .data = NULL}, { .name = PUD_RX_MC_ADDR_NAME, .set_plugin_parameter = &setRxMcAddr, .data = NULL}, { .name = PUD_RX_MC_PORT_NAME, .set_plugin_parameter = &setRxMcPort, .data = NULL}, { .name = PUD_POSFILE_NAME, .set_plugin_parameter = &setPositionFile, .data = NULL}, { .name = PUD_POSFILEPERIOD_NAME, .set_plugin_parameter = &setPositionFilePeriod, .data = NULL}, /* TX */ { .name = PUD_TX_NON_OLSR_IF_NAME, .set_plugin_parameter = &addTxNonOlsrInterface, .data = NULL}, { .name = PUD_TX_MC_ADDR_NAME, .set_plugin_parameter = &setTxMcAddr, .data = NULL}, { .name = PUD_TX_MC_PORT_NAME, .set_plugin_parameter = &setTxMcPort, .data = NULL}, { .name = PUD_TX_TTL_NAME, .set_plugin_parameter = &setTxTtl, .data = NULL}, { .name = PUD_TX_NMEAMESSAGEPREFIX_NAME, .set_plugin_parameter = &setTxNmeaMessagePrefix, .data = NULL}, /* UPLINK / DOWNLINK */ { .name = PUD_UPLINK_ADDR_NAME, .set_plugin_parameter = &setUplinkAddr, .data = NULL}, { .name = PUD_UPLINK_PORT_NAME, .set_plugin_parameter = &setUplinkPort, .data = NULL}, { .name = PUD_DOWNLINK_PORT_NAME, .set_plugin_parameter = &setDownlinkPort, .data = NULL}, { .name = PUD_UPLINK_UPDATE_INTERVAL_STATIONARY_NAME, .set_plugin_parameter = &setUplinkUpdateIntervalStationary, .data = NULL}, { .name = PUD_UPLINK_UPDATE_INTERVAL_MOVING_NAME, .set_plugin_parameter = &setUplinkUpdateIntervalMoving, .data = NULL}, /* MOVEMENT DETECTION */ { .name = PUD_AVERAGE_DEPTH_NAME, .set_plugin_parameter = &setAverageDepth, .data = NULL}, { .name = PUD_GATEWAY_DETERMINATION_INTERVAL_NAME, .set_plugin_parameter = &setGatewayDeterminationInterval, .data = NULL}, { .name = PUD_MOVING_SPEED_THRESHOLD_NAME, .set_plugin_parameter = &setMovingSpeedThreshold, .data = NULL}, { .name = PUD_MOVING_DISTANCE_THRESHOLD_NAME, .set_plugin_parameter = &setMovingDistanceThreshold, .data = NULL}, { .name = PUD_DOP_MULTIPLIER_NAME, .set_plugin_parameter = &setDopMultiplier, .data = NULL}, { .name = PUD_HYSTERESIS_COUNT_2STAT_NAME, .set_plugin_parameter = &setHysteresisCountToStationary, .data = NULL}, { .name = PUD_HYSTERESIS_COUNT_2MOV_NAME, .set_plugin_parameter = &setHysteresisCountToMoving, .data = NULL}, { .name = PUD_GAT_HYSTERESIS_COUNT_2STAT_NAME, .set_plugin_parameter = &setGatewayHysteresisCountToStationary, .data = NULL}, { .name = PUD_GAT_HYSTERESIS_COUNT_2MOV_NAME, .set_plugin_parameter = &setGatewayHysteresisCountToMoving, .data = NULL}, /* DEFAULTS */ { .name = PUD_DEFAULT_HDOP_NAME, .set_plugin_parameter = &setDefaultHdop, .data = NULL}, { .name = PUD_DEFAULT_VDOP_NAME, .set_plugin_parameter = &setDefaultVdop, .data = NULL}, /* DEDUPLICATION */ { .name = PUD_USE_DEDUP_NAME, .set_plugin_parameter = &setUseDeDup, .data = NULL}, { .name = PUD_DEDUP_DEPTH_NAME, .set_plugin_parameter = &setDeDupDepth, .data = NULL}, /* LOOPBACK */ { .name = PUD_USE_LOOPBACK_NAME, .set_plugin_parameter = &setUseLoopback, .data = NULL} }; #endif /* _PUD_OLSRD_PLUGIN_H_ */ olsrd-0.6.6.2/lib/pud/src/receiver.c000066400000000000000000000601731234304727700171230ustar00rootroot00000000000000#include "receiver.h" /* Plugin includes */ #include "pud.h" #include "state.h" #include "configuration.h" #include "gpsConversion.h" #include "networkInterfaces.h" #include "timers.h" #include "uplinkGateway.h" #include "posFile.h" /* OLSRD includes */ #include "net_olsr.h" /* System includes */ #include #include #include #include #include /* * NMEA parser */ /** The NMEA string parser */ static nmeaPARSER nmeaParser; /* * State */ /** Type describing movement calculations */ typedef struct _MovementType { TristateBoolean moving; /**< SET: we are moving */ TristateBoolean overThresholds; /**< SET: at least 1 threshold state is set */ TristateBoolean speedOverThreshold; /**< SET: speed is over threshold */ TristateBoolean hDistanceOverThreshold; /**< SET: horizontal distance is outside threshold */ TristateBoolean vDistanceOverThreshold; /**< SET: vertical distance is outside threshold */ TristateBoolean outside; /**< SET: at least 1 outside state is SET */ TristateBoolean outsideHdop; /**< SET: avg is outside lastTx HDOP */ TristateBoolean outsideVdop; /**< SET: avg is outside lastTx VDOP */ TristateBoolean inside; /**< SET: all inside states are SET */ TristateBoolean insideHdop; /**< SET: avg is inside lastTx HDOP */ TristateBoolean insideVdop; /**< SET: avg is inside lastTx VDOP */ } MovementType; /* * Averaging */ /** The average position with its administration */ static PositionAverageList positionAverageList; /* * TX to OLSR */ typedef enum _TimedTxInterface { TX_INTERFACE_OLSR = 1, TX_INTERFACE_UPLINK = 2 } TimedTxInterface; /** The latest position information that is transmitted */ static TransmitGpsInformation transmitGpsInformation; /** The size of the buffer in which the OLSR and uplink messages are assembled */ #define TX_BUFFER_SIZE_FOR_OLSR 1024 /* * Functions */ /** Clear the MovementType * @param result a pointer to the MovementType */ static void clearMovementType(MovementType * result) { /* clear outputs */ result->moving = TRISTATE_BOOLEAN_UNKNOWN; result->overThresholds = TRISTATE_BOOLEAN_UNKNOWN; result->speedOverThreshold = TRISTATE_BOOLEAN_UNKNOWN; result->hDistanceOverThreshold = TRISTATE_BOOLEAN_UNKNOWN; result->vDistanceOverThreshold = TRISTATE_BOOLEAN_UNKNOWN; result->outside = TRISTATE_BOOLEAN_UNKNOWN; result->outsideHdop = TRISTATE_BOOLEAN_UNKNOWN; result->outsideVdop = TRISTATE_BOOLEAN_UNKNOWN; result->inside = TRISTATE_BOOLEAN_UNKNOWN; result->insideHdop = TRISTATE_BOOLEAN_UNKNOWN; result->insideVdop = TRISTATE_BOOLEAN_UNKNOWN; } /** Determine whether s position is valid. @param position a pointer to a position @return - true when valid - false otherwise */ static bool positionValid(PositionUpdateEntry * position) { return (nmea_INFO_is_present(position->nmeaInfo.present, FIX) && (position->nmeaInfo.fix != NMEA_FIX_BAD)); } /** Send the transmit buffer out over all designated interfaces, called as a timer callback and also immediately on an external state change. @param interfaces a bitmap defining which interfaces to send over */ static void txToAllOlsrInterfaces(TimedTxInterface interfaces) { /** txBuffer is used to concatenate the position update and cluster leader messages in */ unsigned char txBuffer[TX_BUFFER_SIZE_FOR_OLSR]; unsigned int txBufferBytesUsed = 0; #define txBufferBytesFree (sizeof(txBuffer) - txBufferBytesUsed) /* * The first message in txBuffer is an OLSR position update. * * The position update is always present. * * The second message is the cluster leader message, but only when uplink * was requested and correctly configured. */ UplinkMessage * pu_uplink = (UplinkMessage *) &txBuffer[0]; union olsr_message * pu = &pu_uplink->msg.olsrMessage; unsigned int pu_size = 0; union olsr_ip_addr gateway; MovementState externalState; nmeaINFO nmeaInfo; externalState = getExternalState(); /* only fixup timestamp when the position is valid _and_ when the position was not updated */ if (positionValid(&transmitGpsInformation.txPosition) && !transmitGpsInformation.positionUpdated) { nmea_time_now(&transmitGpsInformation.txPosition.nmeaInfo.utc, &transmitGpsInformation.txPosition.nmeaInfo.present); } nmeaInfo = transmitGpsInformation.txPosition.nmeaInfo; transmitGpsInformation.positionUpdated = false; gateway = transmitGpsInformation.txGateway; /* convert nmeaINFO to wireformat olsr message */ txBufferBytesUsed += sizeof(UplinkHeader); /* keep before txBufferSpaceFree usage */ pu_size = gpsToOlsr(&nmeaInfo, pu, txBufferBytesFree, ((externalState == MOVEMENT_STATE_STATIONARY) ? getUpdateIntervalStationary() : getUpdateIntervalMoving())); txBufferBytesUsed += pu_size; /* * push out to all OLSR interfaces */ if (((interfaces & TX_INTERFACE_OLSR) != 0) && (pu_size > 0)) { int r; struct interface *ifn; for (ifn = ifnet; ifn; ifn = ifn->int_next) { /* force the pending buffer out if there's not enough space for our message */ if ((int)pu_size > net_outbuffer_bytes_left(ifn)) { net_output(ifn); } r = net_outbuffer_push(ifn, pu, pu_size); if (r != (int) pu_size) { pudError( false, "Could not send to OLSR interface %s: %s (size=%u, r=%d)", ifn->int_name, ((r == -1) ? "no buffer was found" : (r == 0) ? "there was not enough room in the buffer" : "unknown reason"), pu_size, r); } } /* loopback to tx interface when so configured */ if (getUseLoopback()) { (void) packetReceivedFromOlsr(pu, NULL, NULL); } } /* push out over uplink when an uplink is configured */ if (((interfaces & TX_INTERFACE_UPLINK) != 0) && isUplinkAddrSet()) { int fd = getDownlinkSocketFd(); if (fd != -1) { union olsr_sockaddr * uplink_addr = getUplinkAddr(); void * addr; socklen_t addrSize; UplinkMessage * cl_uplink = (UplinkMessage *) &txBuffer[txBufferBytesUsed]; UplinkClusterLeader * cl = &cl_uplink->msg.clusterLeader; union olsr_ip_addr * cl_originator = getClusterLeaderOriginator(olsr_cnf->ip_version, cl); union olsr_ip_addr * cl_clusterLeader = getClusterLeaderClusterLeader(olsr_cnf->ip_version, cl); unsigned int cl_size = sizeof(UplinkClusterLeader) - sizeof(cl->leader) + ((olsr_cnf->ip_version == AF_INET) ? sizeof(cl->leader.v4) : sizeof(cl->leader.v6)); unsigned long long uplinkUpdateInterval = (externalState == MOVEMENT_STATE_STATIONARY) ? getUplinkUpdateIntervalStationary() : getUplinkUpdateIntervalMoving(); if (uplink_addr->in.sa_family == AF_INET) { addr = &uplink_addr->in4; addrSize = sizeof(struct sockaddr_in); } else { addr = &uplink_addr->in6; addrSize = sizeof(struct sockaddr_in6); } /* * position update message (pu) */ /* set header fields in position update uplink message and adjust * the validity time to the uplink validity time */ if (pu_size > 0) { PudOlsrPositionUpdate * pu_gpsMessage = getOlsrMessagePayload(olsr_cnf->ip_version, pu); setUplinkMessageType(&pu_uplink->header, POSITION); setUplinkMessageLength(&pu_uplink->header, pu_size); setUplinkMessageIPv6(&pu_uplink->header, (olsr_cnf->ip_version != AF_INET)); setUplinkMessagePadding(&pu_uplink->header, 0); /* fixup validity time */ setValidityTime(&pu_gpsMessage->validityTime, uplinkUpdateInterval); } /* * cluster leader message (cl) */ /* set cl_uplink header fields */ setUplinkMessageType(&cl_uplink->header, CLUSTERLEADER); setUplinkMessageLength(&cl_uplink->header, cl_size); setUplinkMessageIPv6(&cl_uplink->header, (olsr_cnf->ip_version != AF_INET)); setUplinkMessagePadding(&cl_uplink->header, 0); /* setup cl */ setClusterLeaderVersion(cl, PUD_WIRE_FORMAT_VERSION); setValidityTime(&cl->validityTime, uplinkUpdateInterval); /* really need 2 memcpy's here because of olsr_cnf->ipsize */ memcpy(cl_originator, &olsr_cnf->main_addr, olsr_cnf->ipsize); memcpy(cl_clusterLeader, &gateway, olsr_cnf->ipsize); txBufferBytesUsed += sizeof(UplinkHeader); txBufferBytesUsed += cl_size; errno = 0; if (sendto(fd, &txBuffer, txBufferBytesUsed, 0, addr, addrSize) < 0) { pudError(true, "Could not send to uplink (size=%u)", txBufferBytesUsed); } } } } /* * Timer Callbacks */ /** The OLSR tx timer callback @param context unused */ static void pud_olsr_tx_timer_callback(void *context __attribute__ ((unused))) { txToAllOlsrInterfaces(TX_INTERFACE_OLSR); } /** The uplink timer callback @param context unused */ static void pud_uplink_timer_callback(void *context __attribute__ ((unused))) { txToAllOlsrInterfaces(TX_INTERFACE_UPLINK); } /** Restart the OLSR tx timer */ static void restartOlsrTimer(MovementState externalState) { if (!restartOlsrTxTimer( (externalState == MOVEMENT_STATE_STATIONARY) ? getUpdateIntervalStationary() : getUpdateIntervalMoving(), &pud_olsr_tx_timer_callback)) { pudError(0, "Could not restart OLSR tx timer, no periodic" " position updates will be sent to the OLSR network"); } } /** Restart the uplink tx timer */ static void restartUplinkTimer(MovementState externalState) { if (!restartUplinkTxTimer( (externalState == MOVEMENT_STATE_STATIONARY) ? getUplinkUpdateIntervalStationary() : getUplinkUpdateIntervalMoving(), &pud_uplink_timer_callback)) { pudError(0, "Could not restart uplink timer, no periodic" " position updates will be uplinked"); } } static void doImmediateTransmit(MovementState externalState) { TimedTxInterface interfaces = TX_INTERFACE_OLSR; /* always send over olsr */ restartOlsrTimer(externalState); if (isUplinkAddrSet()) { interfaces |= TX_INTERFACE_UPLINK; restartUplinkTimer(externalState); } /* do an immediate transmit */ txToAllOlsrInterfaces(interfaces); } /** The gateway timer callback @param context unused */ static void pud_gateway_timer_callback(void *context __attribute__ ((unused))) { union olsr_ip_addr bestGateway; bool externalStateChange; MovementState externalState; TristateBoolean movingNow = TRISTATE_BOOLEAN_UNSET; getBestUplinkGateway(&bestGateway); /* * Movement detection */ if (!ipequal(&bestGateway, &transmitGpsInformation.txGateway)) { movingNow = TRISTATE_BOOLEAN_SET; } /* * State Determination */ determineStateWithHysteresis(SUBSTATE_GATEWAY, movingNow, &externalState, &externalStateChange, NULL); /* * Update transmitGpsInformation */ if (movingNow == TRISTATE_BOOLEAN_SET) { transmitGpsInformation.txGateway = bestGateway; } if (externalStateChange) { doImmediateTransmit(externalState); } } /** Detemine whether we are moving from the position, by comparing fields from the average position against those of the last transmitted position. MUST be called which the position average list locked. @param avg the average position @param lastTx the last transmitted position @param result the results of all movement criteria */ static void detemineMovingFromPosition(PositionUpdateEntry * avg, PositionUpdateEntry * lastTx, MovementType * result) { /* avg field presence booleans */ bool avgHasSpeed; bool avgHasPos; bool avgHasHdop; bool avgHasElv; bool avgHasVdop; /* lastTx field presence booleans */bool lastTxHasPos; bool lastTxHasHdop; bool lastTxHasElv; bool lastTxHasVdop; /* these have defaults */ double dopMultiplier; double avgHdop; double lastTxHdop; double avgVdop; double lastTxVdop; /* calculated values and their validity booleans */ double hDistance; double vDistance; double hdopDistanceForOutside; double hdopDistanceForInside; double vdopDistanceForOutside; double vdopDistanceForInside; bool hDistanceValid; bool hdopDistanceValid; bool vDistanceValid; bool vdopDistanceValid; /* * Validity * * avg last movingNow * 0 0 UNKNOWN : can't determine whether we're moving * 0 1 UNKNOWN : can't determine whether we're moving * 1 0 UNKNOWN : can't determine whether we're moving * 1 1 determine via other parameters */ if (!positionValid(avg)) { result->moving = TRISTATE_BOOLEAN_UNKNOWN; return; } /* avg is valid here */ if (!positionValid(lastTx)) { result->moving = TRISTATE_BOOLEAN_UNKNOWN; return; } /* both avg and lastTx are valid here */ /* avg field presence booleans */ avgHasSpeed = nmea_INFO_is_present(avg->nmeaInfo.present, SPEED); avgHasPos = nmea_INFO_is_present(avg->nmeaInfo.present, LAT) && nmea_INFO_is_present(avg->nmeaInfo.present, LON); avgHasHdop = nmea_INFO_is_present(avg->nmeaInfo.present, HDOP); avgHasElv = nmea_INFO_is_present(avg->nmeaInfo.present, ELV); avgHasVdop = nmea_INFO_is_present(avg->nmeaInfo.present, VDOP); /* lastTx field presence booleans */ lastTxHasPos = nmea_INFO_is_present(lastTx->nmeaInfo.present, LAT) && nmea_INFO_is_present(lastTx->nmeaInfo.present, LON); lastTxHasHdop = nmea_INFO_is_present(lastTx->nmeaInfo.present, HDOP); lastTxHasElv = nmea_INFO_is_present(lastTx->nmeaInfo.present, ELV); lastTxHasVdop = nmea_INFO_is_present(lastTx->nmeaInfo.present, VDOP); /* fill in some values _or_ defaults */ dopMultiplier = getDopMultiplier(); avgHdop = avgHasHdop ? avg->nmeaInfo.HDOP : getDefaultHdop(); lastTxHdop = lastTxHasHdop ? lastTx->nmeaInfo.HDOP : getDefaultHdop(); avgVdop = avgHasVdop ? avg->nmeaInfo.VDOP : getDefaultVdop(); lastTxVdop = lastTxHasVdop ? lastTx->nmeaInfo.VDOP : getDefaultVdop(); /* * Calculations */ /* hDistance */ if (avgHasPos && lastTxHasPos) { nmeaPOS avgPos; nmeaPOS lastTxPos; avgPos.lat = nmea_degree2radian(avg->nmeaInfo.lat); avgPos.lon = nmea_degree2radian(avg->nmeaInfo.lon); lastTxPos.lat = nmea_degree2radian(lastTx->nmeaInfo.lat); lastTxPos.lon = nmea_degree2radian(lastTx->nmeaInfo.lon); hDistance = fabs(nmea_distance_ellipsoid(&avgPos, &lastTxPos, NULL, NULL)); hDistanceValid = true; } else { hDistanceValid = false; } /* hdopDistance */ if (avgHasHdop || lastTxHasHdop) { hdopDistanceForOutside = dopMultiplier * (lastTxHdop + avgHdop); hdopDistanceForInside = dopMultiplier * (lastTxHdop - avgHdop); hdopDistanceValid = true; } else { hdopDistanceValid = false; } /* vDistance */ if (avgHasElv && lastTxHasElv) { vDistance = fabs(lastTx->nmeaInfo.elv - avg->nmeaInfo.elv); vDistanceValid = true; } else { vDistanceValid = false; } /* vdopDistance */ if (avgHasVdop || lastTxHasVdop) { vdopDistanceForOutside = dopMultiplier * (lastTxVdop + avgVdop); vdopDistanceForInside = dopMultiplier * (lastTxVdop - avgVdop); vdopDistanceValid = true; } else { vdopDistanceValid = false; } /* * Moving Criteria Evaluation Start * We compare the average position against the last transmitted position. */ /* Speed */ if (avgHasSpeed) { if (avg->nmeaInfo.speed >= getMovingSpeedThreshold()) { result->speedOverThreshold = TRISTATE_BOOLEAN_SET; } else { result->speedOverThreshold = TRISTATE_BOOLEAN_UNSET; } } /* * Position * * avg last hDistanceMoving * 0 0 determine via other parameters * 0 1 determine via other parameters * 1 0 MOVING * 1 1 determine via distance threshold and HDOP */ if (avgHasPos && !lastTxHasPos) { result->hDistanceOverThreshold = TRISTATE_BOOLEAN_SET; } else if (hDistanceValid) { if (hDistance >= getMovingDistanceThreshold()) { result->hDistanceOverThreshold = TRISTATE_BOOLEAN_SET; } else { result->hDistanceOverThreshold = TRISTATE_BOOLEAN_UNSET; } /* * Position with HDOP * * avg last movingNow * 0 0 determine via other parameters * 0 1 determine via position with HDOP (avg has default HDOP) * 1 0 determine via position with HDOP (lastTx has default HDOP) * 1 1 determine via position with HDOP */ if (hdopDistanceValid) { /* we are outside the HDOP when the HDOPs no longer overlap */ if (hDistance > hdopDistanceForOutside) { result->outsideHdop = TRISTATE_BOOLEAN_SET; } else { result->outsideHdop = TRISTATE_BOOLEAN_UNSET; } /* we are inside the HDOP when the HDOPs fully overlap */ if (hDistance <= hdopDistanceForInside) { result->insideHdop = TRISTATE_BOOLEAN_SET; } else { result->insideHdop = TRISTATE_BOOLEAN_UNSET; } } } /* * Elevation * * avg last movingNow * 0 0 determine via other parameters * 0 1 determine via other parameters * 1 0 MOVING * 1 1 determine via distance threshold and VDOP */ if (avgHasElv && !lastTxHasElv) { result->vDistanceOverThreshold = TRISTATE_BOOLEAN_SET; } else if (vDistanceValid) { if (vDistance >= getMovingDistanceThreshold()) { result->vDistanceOverThreshold = TRISTATE_BOOLEAN_SET; } else { result->vDistanceOverThreshold = TRISTATE_BOOLEAN_UNSET; } /* * Elevation with VDOP * * avg last movingNow * 0 0 determine via other parameters * 0 1 determine via elevation with VDOP (avg has default VDOP) * 1 0 determine via elevation with VDOP (lastTx has default VDOP) * 1 1 determine via elevation with VDOP */ if (vdopDistanceValid) { /* we are outside the VDOP when the VDOPs no longer overlap */ if (vDistance > vdopDistanceForOutside) { result->outsideVdop = TRISTATE_BOOLEAN_SET; } else { result->outsideVdop = TRISTATE_BOOLEAN_UNSET; } /* we are inside the VDOP when the VDOPs fully overlap */ if (vDistance <= vdopDistanceForInside) { result->insideVdop = TRISTATE_BOOLEAN_SET; } else { result->insideVdop = TRISTATE_BOOLEAN_UNSET; } } } /* * Moving Criteria Evaluation End */ /* accumulate inside criteria */ if ((result->insideHdop == TRISTATE_BOOLEAN_SET) && (result->insideVdop == TRISTATE_BOOLEAN_SET)) { result->inside = TRISTATE_BOOLEAN_SET; } else if ((result->insideHdop == TRISTATE_BOOLEAN_UNSET) || (result->insideVdop == TRISTATE_BOOLEAN_UNSET)) { result->inside = TRISTATE_BOOLEAN_UNSET; } /* accumulate outside criteria */ if ((result->outsideHdop == TRISTATE_BOOLEAN_SET) || (result->outsideVdop == TRISTATE_BOOLEAN_SET)) { result->outside = TRISTATE_BOOLEAN_SET; } else if ((result->outsideHdop == TRISTATE_BOOLEAN_UNSET) || (result->outsideVdop == TRISTATE_BOOLEAN_UNSET)) { result->outside = TRISTATE_BOOLEAN_UNSET; } /* accumulate threshold criteria */ if ((result->speedOverThreshold == TRISTATE_BOOLEAN_SET) || (result->hDistanceOverThreshold == TRISTATE_BOOLEAN_SET) || (result->vDistanceOverThreshold == TRISTATE_BOOLEAN_SET)) { result->overThresholds = TRISTATE_BOOLEAN_SET; } else if ((result->speedOverThreshold == TRISTATE_BOOLEAN_UNSET) || (result->hDistanceOverThreshold == TRISTATE_BOOLEAN_UNSET) || (result->vDistanceOverThreshold == TRISTATE_BOOLEAN_UNSET)) { result->overThresholds = TRISTATE_BOOLEAN_UNSET; } /* accumulate moving criteria */ if ((result->overThresholds == TRISTATE_BOOLEAN_SET) || (result->outside == TRISTATE_BOOLEAN_SET)) { result->moving = TRISTATE_BOOLEAN_SET; } else if ((result->overThresholds == TRISTATE_BOOLEAN_UNSET) && (result->outside == TRISTATE_BOOLEAN_UNSET)) { result->moving = TRISTATE_BOOLEAN_UNSET; } return; } /** Update the latest GPS information. This function is called when a packet is received from a rxNonOlsr interface, containing one or more NMEA strings with GPS information. @param rxBuffer the receive buffer with the received NMEA string(s) @param rxCount the number of bytes in the receive buffer @return - false on failure - true otherwise */ bool receiverUpdateGpsInformation(unsigned char * rxBuffer, size_t rxCount) { static const char * rxBufferPrefix = "$GP"; static const size_t rxBufferPrefixLength = 3; bool retval = false; PositionUpdateEntry * incomingEntry; PositionUpdateEntry * posAvgEntry; MovementType movementResult; bool subStateExternalStateChange; bool externalStateChange; bool updateTransmitGpsInformation = false; MovementState externalState; /* do not process when the message does not start with $GP */ if ((rxCount < rxBufferPrefixLength) || (strncmp((char *) rxBuffer, rxBufferPrefix, rxBufferPrefixLength) != 0)) { return true; } /* parse all NMEA strings in the rxBuffer into the incoming entry */ incomingEntry = getPositionAverageEntry(&positionAverageList, INCOMING); nmea_zero_INFO(&incomingEntry->nmeaInfo); nmea_parse(&nmeaParser, (char *) rxBuffer, rxCount, &incomingEntry->nmeaInfo); /* ignore when no useful information */ if (incomingEntry->nmeaInfo.smask == GPNON) { retval = true; goto end; } nmea_INFO_sanitise(&incomingEntry->nmeaInfo); /* we always work with latitude, longitude in degrees and DOPs in meters */ nmea_INFO_unit_conversion(&incomingEntry->nmeaInfo); /* * Averaging */ if (getInternalState(SUBSTATE_POSITION) == MOVEMENT_STATE_MOVING) { /* flush average: keep only the incoming entry */ flushPositionAverageList(&positionAverageList); } addNewPositionToAverage(&positionAverageList, incomingEntry); posAvgEntry = getPositionAverageEntry(&positionAverageList, AVERAGE); /* * Movement detection */ clearMovementType(&movementResult); detemineMovingFromPosition(posAvgEntry, &transmitGpsInformation.txPosition, &movementResult); /* * State Determination */ determineStateWithHysteresis(SUBSTATE_POSITION, movementResult.moving, &externalState, &externalStateChange, &subStateExternalStateChange); /* * Update transmitGpsInformation */ updateTransmitGpsInformation = subStateExternalStateChange || (positionValid(posAvgEntry) && !positionValid(&transmitGpsInformation.txPosition)) || (movementResult.inside == TRISTATE_BOOLEAN_SET); if ((externalState == MOVEMENT_STATE_MOVING) || updateTransmitGpsInformation) { transmitGpsInformation.txPosition = *posAvgEntry; transmitGpsInformation.positionUpdated = true; /* * When we're stationary: * - the track is not reliable or even invalid, so we must clear it. * - to avoid confusion in consumers of the data, we must clear the speed * because it is possible to have a very low speed while moving. */ if (externalState == MOVEMENT_STATE_STATIONARY) { transmitGpsInformation.txPosition.nmeaInfo.speed = (double)0.0; transmitGpsInformation.txPosition.nmeaInfo.track = (double)0.0; } } if (externalStateChange) { doImmediateTransmit(externalState); } retval = true; end: return retval; } /** * Log nmea library errors as plugin errors * @param str * @param str_size */ static void nmea_errors(const char *str, int str_size __attribute__((unused))) { pudError(false, "NMEA library error: %s", str); } /** * Helper function to read the position file into the transmit position */ void updatePositionFromFile(void) { char * positionFile = getPositionFile(); if (positionFile) { readPositionFile(positionFile, &transmitGpsInformation.txPosition.nmeaInfo); } } /** Start the receiver @return - false on failure - true otherwise */ bool startReceiver(void) { MovementState externalState; if (!nmea_parser_init(&nmeaParser)) { pudError(false, "Could not initialise NMEA parser"); return false; } /* hook up the NMEA library error callback */ nmea_context_set_error_func(&nmea_errors); nmea_zero_INFO(&transmitGpsInformation.txPosition.nmeaInfo); updatePositionFromFile(); transmitGpsInformation.txGateway = olsr_cnf->main_addr; transmitGpsInformation.positionUpdated = false; transmitGpsInformation.nodeId = getNodeId(); #ifdef HTTPINFO_PUD olsr_cnf->pud_position = &transmitGpsInformation; #endif /* HTTPINFO_PUD */ initPositionAverageList(&positionAverageList, getAverageDepth()); if (!initOlsrTxTimer()) { stopReceiver(); return false; } if (!initUplinkTxTimer()) { stopReceiver(); return false; } if (!initGatewayTimer()) { stopReceiver(); return false; } externalState = getExternalState(); restartOlsrTimer(externalState); restartUplinkTimer(externalState); if (!restartGatewayTimer(getGatewayDeterminationInterval(), &pud_gateway_timer_callback)) { pudError(0, "Could not start gateway timer"); stopReceiver(); return false; } return true; } /** Stop the receiver */ void stopReceiver(void) { destroyGatewayTimer(); destroyUplinkTxTimer(); destroyOlsrTxTimer(); destroyPositionAverageList(&positionAverageList); nmea_zero_INFO(&transmitGpsInformation.txPosition.nmeaInfo); transmitGpsInformation.txGateway = olsr_cnf->main_addr; transmitGpsInformation.positionUpdated = false; nmea_parser_destroy(&nmeaParser); } olsrd-0.6.6.2/lib/pud/src/receiver.h000066400000000000000000000014171234304727700171240ustar00rootroot00000000000000#ifndef _PUD_RECEIVER_H_ #define _PUD_RECEIVER_H_ /* Plugin includes */ #include "posAvg.h" /* OLSRD includes */ #include "olsr_types.h" /* System includes */ #include #include /** Structure of the latest GPS information that is transmitted */ typedef struct _TransmitGpsInformation { unsigned char * nodeId; /**< the nodeId */ bool positionUpdated; /**< true when the position information was updated */ PositionUpdateEntry txPosition; /**< The last transmitted position */ union olsr_ip_addr txGateway; /**< the best gateway */ } TransmitGpsInformation; bool startReceiver(void); void stopReceiver(void); void updatePositionFromFile(void); bool receiverUpdateGpsInformation(unsigned char * rxBuffer, size_t rxCount); #endif /* _PUD_RECEIVER_H_ */ olsrd-0.6.6.2/lib/pud/src/state.c000066400000000000000000000132371234304727700164360ustar00rootroot00000000000000#include "state.h" /* Plugin includes */ #include "configuration.h" /* OLSRD includes */ /* System includes */ /* * Types */ /** Type describing substate */ typedef struct _SubStateType { MovementState internalState; /**< the internal movement state */ unsigned long long hysteresisCounter; /**< the hysteresis counter */ unsigned long long hysteresisCounterToStationary; /**< the hysteresis counter threshold for changing the state to STATIONARY */ unsigned long long hysteresisCounterToMoving; /**< the hysteresis counter threshold for changing the state to MOVING */ MovementState externalState; /**< the externally visible movement state */ } SubStateType; /** Type describing state */ typedef struct _StateType { SubStateType substate[SUBSTATE_COUNT]; /**< the sub states */ MovementState externalState; /**< the externally visible movement state */ } StateType; /* * Variables */ /** The state */ static StateType state; /* * Functions */ void initState(void) { state.substate[SUBSTATE_POSITION].internalState = MOVEMENT_STATE_STATIONARY; state.substate[SUBSTATE_POSITION].hysteresisCounter = 0; state.substate[SUBSTATE_POSITION].hysteresisCounterToStationary = getHysteresisCountToStationary(); state.substate[SUBSTATE_POSITION].hysteresisCounterToMoving = getHysteresisCountToMoving(); state.substate[SUBSTATE_POSITION].externalState = MOVEMENT_STATE_STATIONARY; state.substate[SUBSTATE_GATEWAY].internalState = MOVEMENT_STATE_MOVING; state.substate[SUBSTATE_GATEWAY].hysteresisCounter = 0; state.substate[SUBSTATE_GATEWAY].hysteresisCounterToStationary = getGatewayHysteresisCountToStationary(); state.substate[SUBSTATE_GATEWAY].hysteresisCounterToMoving = getGatewayHysteresisCountToMoving(); state.substate[SUBSTATE_GATEWAY].externalState = MOVEMENT_STATE_MOVING; state.externalState = MOVEMENT_STATE_MOVING; /* must comply to AND/OR conditions of sub-states */ } MovementState getExternalState(void) { return state.externalState; } /** * Determine new state * @param subStateIndex * the sub-state for/from which the new state should be determined * @param movingNow * the movement result of the sub-state * @param externalState * a pointer to the variable in which to store the new external state * @param externalStateChange * a pointer to the variable in which to store whether the external state changed * @param subStateExternalStateChange * a pointer to the variable in which to store whether the sub-state external state changed */ void determineStateWithHysteresis(SubStateIndex subStateIndex, TristateBoolean movingNow, MovementState * externalState, bool * externalStateChange, bool * subStateExternalStateChange) { MovementState newState; bool internalStateChange; bool subStateExternalStateChanged; SubStateType * subState = &state.substate[subStateIndex]; /* * Substate Internal State */ if (movingNow == TRISTATE_BOOLEAN_SET) { newState = MOVEMENT_STATE_MOVING; } else if (movingNow == TRISTATE_BOOLEAN_UNSET) { newState = MOVEMENT_STATE_STATIONARY; } else { /* keep current sub-state */ newState = subState->internalState; } internalStateChange = (subState->internalState != newState); subState->internalState = newState; /* * Substate External State (+ hysteresis) */ if (internalStateChange) { /* restart hysteresis for external state change when we have an internal * state change */ subState->hysteresisCounter = 0; } /* when internal state and external state are not the same we need to * perform hysteresis before we can propagate the internal state to the * external state */ newState = subState->externalState; if (subState->internalState != subState->externalState) { switch (subState->internalState) { case MOVEMENT_STATE_STATIONARY: /* internal state is STATIONARY, external state is MOVING */ /* delay going to stationary a bit */ subState->hysteresisCounter++; if (subState->hysteresisCounter >= subState->hysteresisCounterToStationary) { /* outside the hysteresis range, go to stationary */ newState = MOVEMENT_STATE_STATIONARY; } break; case MOVEMENT_STATE_MOVING: /* internal state is MOVING, external state is STATIONARY */ /* delay going to moving a bit */ subState->hysteresisCounter++; if (subState->hysteresisCounter >= subState->hysteresisCounterToMoving) { /* outside the hysteresis range, go to moving */ newState = MOVEMENT_STATE_MOVING; } break; default: /* when unknown then don't change state */ break; } } subStateExternalStateChanged = (subState->externalState != newState); if (subStateExternalStateChange) { *subStateExternalStateChange = subStateExternalStateChanged; } subState->externalState = newState; /* * external state may transition into MOVING when either one of the sub-states say so (OR), and * may transition into STATIONARY when all of the sub-states say so (AND) */ if (externalStateChange) { *externalStateChange = false; } if (subStateExternalStateChanged) { bool transition; if (newState == MOVEMENT_STATE_STATIONARY) { /* AND: all sub-states must agree on STATIONARY */ int i = 0; transition = true; for (i = 0; i < SUBSTATE_COUNT; i++) { transition = transition && (state.substate[i].externalState == newState); } } else /* if (newState == MOVEMENT_STATE_MOVING) */{ /* OR: one sub-state wanting MOVING is enough */ transition = true; } if (transition) { if (externalStateChange) { *externalStateChange = (state.externalState != newState); } state.externalState = newState; } } if (externalState) { *externalState = state.externalState; } } MovementState getInternalState(SubStateIndex subStateIndex) { return state.substate[subStateIndex].internalState; } olsrd-0.6.6.2/lib/pud/src/state.h000066400000000000000000000023351234304727700164400ustar00rootroot00000000000000#ifndef _PUD_STATE_H_ #define _PUD_STATE_H_ /* Plugin includes */ /* OLSRD includes */ /* System includes */ #include /* * Types */ /** Type describing a tri-state boolean */ typedef enum _TristateBoolean { TRISTATE_BOOLEAN_UNKNOWN = 0, TRISTATE_BOOLEAN_UNSET = 1, TRISTATE_BOOLEAN_SET = 2 } TristateBoolean; #define TristateBooleanToString(s) ((s == TRISTATE_BOOLEAN_SET) ? "set" : \ (s == TRISTATE_BOOLEAN_UNSET) ? "unset" : \ "unknown") /** Type describing movement state */ typedef enum _MovementState { MOVEMENT_STATE_STATIONARY = 0, MOVEMENT_STATE_MOVING = 1 } MovementState; #define MovementStateToString(s) ((s == MOVEMENT_STATE_MOVING) ? "moving" : \ "stationary") /** Type describing substate indexes */ typedef enum _SubStateIndex { SUBSTATE_POSITION = 0, SUBSTATE_GATEWAY = 1, SUBSTATE_COUNT = 2 } SubStateIndex; /* * Functions */ void initState(void); MovementState getExternalState(void); MovementState getInternalState(SubStateIndex subStateIndex); void determineStateWithHysteresis(SubStateIndex subStateIndex, TristateBoolean movingNow, MovementState * externalState, bool * externalStateChange, bool * subStateExternalStateChange); #endif /* _PUD_STATE_H_ */ olsrd-0.6.6.2/lib/pud/src/timers.c000066400000000000000000000133501234304727700166150ustar00rootroot00000000000000#include "timers.h" /* Plugin includes */ #include "pud.h" /* OLSRD includes */ #include "olsr_cookie.h" /* System includes */ /* * OLSR Tx Timer */ /** The timer cookie, used to trace back the originator in debug */ static struct olsr_cookie_info *pud_olsr_tx_timer_cookie = NULL; /** The timer */ static struct timer_entry * pud_olsr_tx_timer = NULL; /** Start the OLSR tx timer. Does nothing when the timer is already running. @param interval The interval in seconds @param cb_func The callback function to call when the timer expires @return - false on failure - true otherwise */ static int startOlsrTxTimer(unsigned long long interval, timer_cb_func cb_func) { if (pud_olsr_tx_timer == NULL) { pud_olsr_tx_timer = olsr_start_timer(interval * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, cb_func, NULL, pud_olsr_tx_timer_cookie); if (pud_olsr_tx_timer == NULL) { return false; } } return true; } /** Stop the OLSR tx timer */ static void stopOlsrTxTimer(void) { if (pud_olsr_tx_timer != NULL) { olsr_stop_timer(pud_olsr_tx_timer); pud_olsr_tx_timer = NULL; } } /** Restart the OLSR tx timer @param interval The interval in seconds @param cb_func The callback function to call when the timer expires @return - false on failure - true otherwise */ int restartOlsrTxTimer(unsigned long long interval, timer_cb_func cb_func) { stopOlsrTxTimer(); return startOlsrTxTimer(interval, cb_func); } /** Initialise the OLSR tx timer. @return - false on failure - true otherwise */ int initOlsrTxTimer(void) { if (pud_olsr_tx_timer_cookie == NULL) { pud_olsr_tx_timer_cookie = olsr_alloc_cookie( PUD_PLUGIN_ABBR ": OLSR tx timer", OLSR_COOKIE_TYPE_TIMER); if (pud_olsr_tx_timer_cookie == NULL) { return false; } } return true; } /** Destroy the OLSR tx timer. */ void destroyOlsrTxTimer(void) { stopOlsrTxTimer(); if (pud_olsr_tx_timer_cookie != NULL) { olsr_free_cookie(pud_olsr_tx_timer_cookie); pud_olsr_tx_timer_cookie = NULL; } } /* * Uplink Tx Timer */ /** The timer cookie, used to trace back the originator in debug */ static struct olsr_cookie_info *pud_uplink_tx_timer_cookie = NULL; /** The timer */ static struct timer_entry * pud_uplink_tx_timer = NULL; /** Start the uplink tx timer. Does nothing when the timer is already running. @param interval The interval in seconds @param cb_func The callback function to call when the timer expires @return - false on failure - true otherwise */ static int startUplinkTxTimer(unsigned long long interval, timer_cb_func cb_func) { if (pud_uplink_tx_timer == NULL) { pud_uplink_tx_timer = olsr_start_timer(interval * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, cb_func, NULL, pud_uplink_tx_timer_cookie); if (pud_uplink_tx_timer == NULL) { return false; } } return true; } /** Stop the uplink tx timer */ static void stopUplinkTxTimer(void) { if (pud_uplink_tx_timer != NULL) { olsr_stop_timer(pud_uplink_tx_timer); pud_uplink_tx_timer = NULL; } } /** Restart the uplink tx timer @param interval The interval in seconds @param cb_func The callback function to call when the timer expires @return - false on failure - true otherwise */ int restartUplinkTxTimer(unsigned long long interval, timer_cb_func cb_func) { stopUplinkTxTimer(); return startUplinkTxTimer(interval, cb_func); } /** Initialise the uplink tx timer. @return - false on failure - true otherwise */ int initUplinkTxTimer(void) { if (pud_uplink_tx_timer_cookie == NULL) { pud_uplink_tx_timer_cookie = olsr_alloc_cookie( PUD_PLUGIN_ABBR ": uplink tx timer", OLSR_COOKIE_TYPE_TIMER); if (pud_uplink_tx_timer_cookie == NULL) { return false; } } return true; } /** Destroy the uplink tx timer. */ void destroyUplinkTxTimer(void) { stopUplinkTxTimer(); if (pud_uplink_tx_timer_cookie != NULL) { olsr_free_cookie(pud_uplink_tx_timer_cookie); pud_uplink_tx_timer_cookie = NULL; } } /* * Best Gateway Timer */ /** The timer cookie, used to trace back the originator in debug */ static struct olsr_cookie_info *pud_gateway_timer_cookie = NULL; /** The timer */ static struct timer_entry * pud_gateway_timer = NULL; /** Start the gateway timer. Does nothing when the timer is already running. @param interval The interval in seconds @param cb_func The callback function to call when the timer expires @return - false on failure - true otherwise */ static int startGatewayTimer(unsigned long long interval, timer_cb_func cb_func) { if (pud_gateway_timer == NULL) { pud_gateway_timer = olsr_start_timer(interval * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, cb_func, NULL, pud_gateway_timer_cookie); if (pud_gateway_timer == NULL) { return false; } } return true; } /** Stop the gateway timer */ static void stopGatewayTimer(void) { if (pud_gateway_timer != NULL) { olsr_stop_timer(pud_gateway_timer); pud_gateway_timer = NULL; } } /** Restart the gateway timer @param interval The interval in seconds @param cb_func The callback function to call when the timer expires @return - false on failure - true otherwise */ int restartGatewayTimer(unsigned long long interval, timer_cb_func cb_func) { stopGatewayTimer(); return startGatewayTimer(interval, cb_func); } /** Initialise the gateway timer. @return - false on failure - true otherwise */ int initGatewayTimer(void) { if (pud_gateway_timer_cookie == NULL) { pud_gateway_timer_cookie = olsr_alloc_cookie( PUD_PLUGIN_ABBR ": gateway timer", OLSR_COOKIE_TYPE_TIMER); if (pud_gateway_timer_cookie == NULL) { return false; } } return true; } /** Destroy the gateway timer. */ void destroyGatewayTimer(void) { stopGatewayTimer(); if (pud_gateway_timer_cookie != NULL) { olsr_free_cookie(pud_gateway_timer_cookie); pud_gateway_timer_cookie = NULL; } } olsrd-0.6.6.2/lib/pud/src/timers.h000066400000000000000000000011041234304727700166140ustar00rootroot00000000000000#ifndef _PUD_TIMERS_H_ #define _PUD_TIMERS_H_ /* Plugin includes */ /* OLSRD includes */ #include "scheduler.h" /* System includes */ int initOlsrTxTimer(void); void destroyOlsrTxTimer(void); int restartOlsrTxTimer(unsigned long long interval, timer_cb_func cb_func); int initUplinkTxTimer(void); void destroyUplinkTxTimer(void); int restartUplinkTxTimer(unsigned long long interval, timer_cb_func cb_func); int initGatewayTimer(void); void destroyGatewayTimer(void); int restartGatewayTimer(unsigned long long interval, timer_cb_func cb_func); #endif /* _PUD_TIMERS_H_ */ olsrd-0.6.6.2/lib/pud/src/uplinkGateway.c000066400000000000000000000050511234304727700201350ustar00rootroot00000000000000#include "uplinkGateway.h" /* Plugin includes */ /* OLSRD includes */ #include "gateway.h" #include "tc_set.h" #include "lq_plugin.h" /* System includes */ /** * Determine the speed on which a gateway is chosen * @param gw the gateway entry * @return the speed */ static inline unsigned long long gw_speed(struct gateway_entry *gw) { return (gw->uplink + gw->downlink); } /** * Determine the best gateway for uplink: this is the cluster leader. * * Loop over all gateways to find the best one and return it. * When no best gateway is found then we return ourselves so that the behaviour * degrades gracefully. * * A gateway is better when the sum of its uplink and downlink are greater than * the previous best gateway. In case of a tie, the lowest IP address wins. * * @param bestGateway * a pointer to the variable in which to store the best gateway */ void getBestUplinkGateway(union olsr_ip_addr * bestGateway) { struct gateway_entry *gw_best = NULL; unsigned long long gw_best_value = 0; struct gateway_entry *gw; OLSR_FOR_ALL_GATEWAY_ENTRIES(gw) { bool eval4 = false; bool eval6 = false; struct tc_entry * tc = olsr_lookup_tc_entry(&gw->originator); if (!tc || (tc->path_cost == ROUTE_COST_BROKEN) || (!gw->uplink || !gw->downlink)) { /* gateways should not exist without tc entry */ /* do not consider nodes with an infinite ETX */ /* do not consider nodes without bandwidth or with a uni-directional link */ continue; } if (gw == olsr_get_inet_gateway(false)) { eval4 = true; } else if (gw->ipv4 && (olsr_cnf->ip_version == AF_INET || olsr_cnf->use_niit) && (olsr_cnf->smart_gw_allow_nat || !gw->ipv4nat)) { eval4 = true; } if (gw == olsr_get_inet_gateway(true)) { eval6 = true; } else if (gw->ipv6 && olsr_cnf->ip_version == AF_INET6) { eval6 = true; } if (eval4 || eval6) { unsigned long long gw_value = gw_speed(gw); if (!gw_best || (gw_value > gw_best_value)) { gw_best = gw; gw_best_value = gw_value; } else if (gw_value == gw_best_value) { bool gwHaslowerIpAddress = false; if (eval4) { gwHaslowerIpAddress = (ip4cmp(&gw->originator.v4, &gw_best->originator.v4) < 0); } else /* eval6 */{ gwHaslowerIpAddress = (ip6cmp(&gw->originator.v6, &gw_best->originator.v6) < 0); } if (gwHaslowerIpAddress) { gw_best = gw; gw_best_value = gw_value; } } } } OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw) if (!gw_best) { /* degrade gracefully */ *bestGateway = olsr_cnf->main_addr; return; } *bestGateway = gw_best->originator; } olsrd-0.6.6.2/lib/pud/src/uplinkGateway.h000066400000000000000000000003721234304727700201430ustar00rootroot00000000000000#ifndef _PUD_UPLINKGATEWAY_H_ #define _PUD_UPLINKGATEWAY_H_ /* Plugin includes */ /* OLSRD includes */ #include "olsr_types.h" /* System includes */ void getBestUplinkGateway(union olsr_ip_addr * bestGateway); #endif /* _PUD_UPLINKGATEWAY_H_ */ olsrd-0.6.6.2/lib/pud/version-script.txt000066400000000000000000000002051234304727700201020ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/pud/wireformat-java/000077500000000000000000000000001234304727700174535ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/.gitignore000066400000000000000000000003461234304727700214460ustar00rootroot00000000000000/build/ /lib/ /build.xml /src/main/c/org_olsr_plugin_pud_PositionUpdate.h /src/main/c/org_olsr_plugin_pud_ClusterLeader.h /src/main/c/org_olsr_plugin_pud_UplinkMessage.h /src/main/java/org/olsr/plugin/pud/WireFormatConstants.java olsrd-0.6.6.2/lib/pud/wireformat-java/Makefile000066400000000000000000000246011234304727700211160ustar00rootroot00000000000000include ../wireformat/Makefile.inc WIREFORMAT_PROJECT := $(PROJECT) include Makefile.inc include ../Makefile.inc OLSRD_PLUGIN = false TOPDIR = ../../.. include $(TOPDIR)/Makefile.inc LDFLAGS = -shared -Wl,--warn-common -fPIC # 32/64 cross compilation ifdef M32 CFLAGS += -m32 LDFLAGS += -m32 endif ifdef M64 CFLAGS += -m64 LDFLAGS += -m64 endif ###################### # # Settings # ###################### ifeq ($(DEBUG),1) DEBUGBOOLEAN = true else DEBUGBOOLEAN = false endif DESTDIR ?= USRDIR ?= $(DESTDIR)/usr LIBDIR ?= $(USRDIR)/lib SHAREDIR ?= $(USRDIR)/share SHAREJAVADIR ?= $(SHAREDIR)/java/$(EXENAME) MACHINE=$(shell uname -m) ARCH= ARCH2=-i386 ifeq ($(strip $(MACHINE)),x86_64) ARCH=.$(MACHINE) ARCH2=-amd64 endif RESOURCES_DIR = resources BUILD_DIR = build LIBDIR_BUILD = lib INC_DIR_WIREFORMAT = ../wireformat/include INC_DIR_WIREFORMAT_FULL = $(INC_DIR_WIREFORMAT)/$(WIREFORMAT_PROJECT) ifneq ($(wildcard /usr/lib/jvm/java),) INC_DIR_JVM = /usr/lib/jvm/java/include else ifneq ($(wildcard /usr/lib/jvm/java-1.7.0-openjdk$(ARCH)),) INC_DIR_JVM = /usr/lib/jvm/java-1.7.0-openjdk$(ARCH)/include else ifneq ($(wildcard /usr/lib/jvm/java-1.7.0-openjdk$(ARCH2)),) INC_DIR_JVM = /usr/lib/jvm/java-1.7.0-openjdk$(ARCH2)/include else ifneq ($(wildcard /usr/lib/jvm/java-1.7.0-openjdk),) INC_DIR_JVM = /usr/lib/jvm/java-1.7.0-openjdk/include else ifneq ($(wildcard /usr/lib/jvm/java-1.6.0-openjdk$(ARCH)),) INC_DIR_JVM = /usr/lib/jvm/java-1.6.0-openjdk$(ARCH)/include else ifneq ($(wildcard /usr/lib/jvm/java-1.6.0-openjdk$(ARCH2)),) INC_DIR_JVM = /usr/lib/jvm/java-1.6.0-openjdk$(ARCH2)/include else ifneq ($(wildcard /usr/lib/jvm/java-1.6.0-openjdk),) INC_DIR_JVM = /usr/lib/jvm/java-1.6.0-openjdk/include else $(error No java detected) endif endif endif endif endif endif endif INC_DIR_JVM_OS = $(INC_DIR_JVM)/$(OS) SRC_DIR_C = src/main/c INCLUDES = -I "$(INC_DIR_WIREFORMAT)" -I "$(INC_DIR_JVM)" -I "$(INC_DIR_JVM_OS)" LIBRARIES = -L ../wireformat/lib -l$(WIREFORMAT_PROJECT) BUILD_DIR_JNI = $(BUILD_DIR)/jni JAVASRC = src/main/java JAVAVERSIONSRC = 1.6 JAVAVERSIONDST = 1.6 JAVABOOTCLASSPATH = resources/ee.j2se/$(JAVAVERSIONSRC)/ee.j2se.jar JAVA_PKG = org.olsr.plugin.pud JAVA_PKG_DIR = $(subst .,/,$(JAVA_PKG)) JAVA_PKG_UNDER = $(subst .,_,$(JAVA_PKG)) ifneq ($(OS),linux) .PHONY: all default_target install clean all: default_target default_target install clean: @echo "*** only supported on Linux" else GIT_SHA = $(shell git describe 2> /dev/null || echo "Unknown") .PHONY: all default_target java prepare clean doc doc-clean install uninstall # # Targets # all: default_target default_target: prepare $(LIBDIR_BUILD)/$(SONAME) java .gitignore: ifeq ($(VERBOSE),0) @echo "[$@]" endif $(MAKECMDPREFIX)echo "/$(BUILD_DIR)/" > $@ $(MAKECMDPREFIX)echo "/$(LIBDIR_BUILD)/" >> $@ $(MAKECMDPREFIX)echo "/build.xml" >> $@ $(MAKECMDPREFIX)echo "/$(SRC_DIR_C)/$(JAVA_PKG_UNDER)_PositionUpdate.h" >> $@ $(MAKECMDPREFIX)echo "/$(SRC_DIR_C)/$(JAVA_PKG_UNDER)_ClusterLeader.h" >> $@ $(MAKECMDPREFIX)echo "/$(SRC_DIR_C)/$(JAVA_PKG_UNDER)_UplinkMessage.h" >> $@ $(MAKECMDPREFIX)echo "/$(JAVASRC)/$(JAVA_PKG_DIR)/WireFormatConstants.java" >> $@ $(MAKECMDPREFIX)$(MAKE) -C doc $@ $(LIBDIR_BUILD)/$(SONAME): $(BUILD_DIR)/$(JAVA_PKG_UNDER)_UplinkMessage.o \ $(BUILD_DIR)/$(JAVA_PKG_UNDER)_ClusterLeader.o \ $(BUILD_DIR)/$(JAVA_PKG_UNDER)_PositionUpdate.o ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -Wl,-soname=$(SONAME) $(LIBRARIES) -o "$@" \ $(BUILD_DIR)/$(JAVA_PKG_UNDER)_UplinkMessage.o \ $(BUILD_DIR)/$(JAVA_PKG_UNDER)_ClusterLeader.o \ $(BUILD_DIR)/$(JAVA_PKG_UNDER)_PositionUpdate.o # PositionUpdate $(BUILD_DIR)/$(JAVA_PKG_UNDER)_PositionUpdate.o: $(SRC_DIR_C)/$(JAVA_PKG_UNDER)_PositionUpdate.c \ $(SRC_DIR_C)/$(JAVA_PKG_UNDER)_PositionUpdate.h \ $(INC_DIR_WIREFORMAT_FULL)/wireFormat.h \ $(INC_DIR_WIREFORMAT_FULL)/nodeIdConversion.h ifeq ($(VERBOSE),0) @echo "[CC] $<" endif $(MAKECMDPREFIX)$(CC) $(CFLAGS) $(CPPFLAGS) $(INCLUDES) -c -o "$@" "$<" $(SRC_DIR_C)/$(JAVA_PKG_UNDER)_PositionUpdate.h: $(BUILD_DIR_JNI)/$(JAVA_PKG_DIR)/PositionUpdate.class ifeq ($(VERBOSE),0) @echo "[JavaH] $<" endif $(MAKECMDPREFIX)rm -f "$@" $(MAKECMDPREFIX)javah -jni -classpath "$(BUILD_DIR_JNI)" -o "$@" "$(JAVA_PKG).PositionUpdate" $(BUILD_DIR_JNI)/$(JAVA_PKG_DIR)/PositionUpdate.class: $(JAVASRC)/$(JAVA_PKG_DIR)/PositionUpdate.java \ $(JAVASRC)/$(JAVA_PKG_DIR)/LibraryLoader.java \ $(JAVASRC)/$(JAVA_PKG_DIR)/WireFormatConstants.java ifeq ($(VERBOSE),0) @echo "[JavaC] $<" endif $(MAKECMDPREFIX)javac -bootclasspath $(JAVABOOTCLASSPATH) -classpath $(JAVASRC) -source 1.6 -target 1.6 -Xlint -d "$(BUILD_DIR_JNI)" "$<" # ClusterLeader $(BUILD_DIR)/$(JAVA_PKG_UNDER)_ClusterLeader.o: $(SRC_DIR_C)/$(JAVA_PKG_UNDER)_ClusterLeader.c \ $(SRC_DIR_C)/$(JAVA_PKG_UNDER)_ClusterLeader.h \ $(INC_DIR_WIREFORMAT_FULL)/wireFormat.h \ $(INC_DIR_WIREFORMAT_FULL)/nodeIdConversion.h ifeq ($(VERBOSE),0) @echo "[CC] $<" endif $(MAKECMDPREFIX)$(CC) $(CFLAGS) $(CPPFLAGS) $(INCLUDES) -c -o "$@" "$<" $(SRC_DIR_C)/$(JAVA_PKG_UNDER)_ClusterLeader.h: $(BUILD_DIR_JNI)/$(JAVA_PKG_DIR)/ClusterLeader.class ifeq ($(VERBOSE),0) @echo "[JavaH] $<" endif $(MAKECMDPREFIX)rm -f "$@" $(MAKECMDPREFIX)javah -jni -classpath "$(BUILD_DIR_JNI)" -o "$@" "$(JAVA_PKG).ClusterLeader" $(BUILD_DIR_JNI)/$(JAVA_PKG_DIR)/ClusterLeader.class: $(JAVASRC)/$(JAVA_PKG_DIR)/ClusterLeader.java \ $(JAVASRC)/$(JAVA_PKG_DIR)/LibraryLoader.java \ $(JAVASRC)/$(JAVA_PKG_DIR)/WireFormatConstants.java ifeq ($(VERBOSE),0) @echo "[JavaC] $<" endif $(MAKECMDPREFIX)javac -bootclasspath $(JAVABOOTCLASSPATH) -classpath $(JAVASRC) -source 1.6 -target 1.6 -Xlint -d "$(BUILD_DIR_JNI)" "$<" # UplinkMessage $(BUILD_DIR)/$(JAVA_PKG_UNDER)_UplinkMessage.o: $(SRC_DIR_C)/$(JAVA_PKG_UNDER)_UplinkMessage.c \ $(SRC_DIR_C)/$(JAVA_PKG_UNDER)_UplinkMessage.h \ $(INC_DIR_WIREFORMAT_FULL)/wireFormat.h \ $(INC_DIR_WIREFORMAT_FULL)/nodeIdConversion.h ifeq ($(VERBOSE),0) @echo "[CC] $<" endif $(MAKECMDPREFIX)$(CC) $(CFLAGS) $(CPPFLAGS) $(INCLUDES) -c -o "$@" "$<" $(SRC_DIR_C)/$(JAVA_PKG_UNDER)_UplinkMessage.h: $(BUILD_DIR_JNI)/$(JAVA_PKG_DIR)/UplinkMessage.class ifeq ($(VERBOSE),0) @echo "[JavaH] $<" endif $(MAKECMDPREFIX)rm -f "$@" $(MAKECMDPREFIX)javah -jni -classpath "$(BUILD_DIR_JNI)" -o "$@" "$(JAVA_PKG).UplinkMessage" $(BUILD_DIR_JNI)/$(JAVA_PKG_DIR)/UplinkMessage.class: $(JAVASRC)/$(JAVA_PKG_DIR)/UplinkMessage.java \ $(JAVASRC)/$(JAVA_PKG_DIR)/LibraryLoader.java \ $(JAVASRC)/$(JAVA_PKG_DIR)/WireFormatConstants.java ifeq ($(VERBOSE),0) @echo "[JavaC] $<" endif $(MAKECMDPREFIX)javac -bootclasspath $(JAVABOOTCLASSPATH) -classpath $(JAVASRC) -source 1.6 -target 1.6 -Xlint -d "$(BUILD_DIR_JNI)" "$<" # # java # java: prepare \ build.xml \ $(JAVASRC)/$(JAVA_PKG_DIR)/PositionUpdate.java \ $(JAVASRC)/$(JAVA_PKG_DIR)/WireFormatConstants.java $(MAKECMDPREFIX)ant -f build.xml release build.xml: $(RESOURCES_DIR)/build.xml ifeq ($(VERBOSE),0) @echo "[generate] $@" endif $(MAKECMDPREFIX)sed -r -e "s#PLUGIN_VER#$(PLUGIN_VER)#g" \ -e "s#PROJECT#$(PROJECT)#g" \ -e "s#BUILD_DIR#$(BUILD_DIR)#g" \ -e "s#LIBDIR_BUILD#$(LIBDIR_BUILD)#g" \ -e "s#JAVASRC#$(JAVASRC)#g" \ -e "s#JAVAVERSIONSRC#$(JAVAVERSIONSRC)#g" \ -e "s#JAVAVERSIONDST#$(JAVAVERSIONDST)#g" \ -e "s#DEBUG#$(DEBUGBOOLEAN)#g" \ "$<" > "$@" # # generate java classes # $(JAVASRC)/$(JAVA_PKG_DIR)/WireFormatConstants.java: \ $(RESOURCES_DIR)/WireFormatConstants.java.h \ $(BUILD_DIR_JNI)/c/library.h \ $(BUILD_DIR_JNI)/c/wireFormat.h ifeq ($(VERBOSE),0) @echo "[generate] $@" endif $(MAKECMDPREFIX)$(CPP) -I "$(BUILD_DIR_JNI)/c" -DPLUGIN_VER=\"$(PLUGIN_VER)\" -DGIT_SHA=\"$(GIT_SHA)\" "$<" | \ sed -r -e '/^[[:space:]]*#.*$$/ d' \ -e '/^[[:space:]]*$$/ d' \ > "$@" # # generate jni includes # $(BUILD_DIR_JNI)/c/library.h: Makefile.inc ifeq ($(VERBOSE),0) @echo "[generate] $@" endif $(MAKECMDPREFIX)echo "#define PUD_WIRE_FORMAT_LIBRARYNAME \"$(PROJECT)\"" > "$@" $(BUILD_DIR_JNI)/c/wireFormat.h: $(INC_DIR_WIREFORMAT_FULL)/wireFormat.h ifeq ($(VERBOSE),0) @echo "[generate] $@" endif $(MAKECMDPREFIX)grep -E '^[[:space:]]*#define[[:space:]]+' "$<" > "$@" # # Phony Targets # prepare: $(MAKECMDPREFIX)mkdir -p "$(BUILD_DIR)" \ "$(LIBDIR_BUILD)" \ "$(BUILD_DIR_JNI)/c" clean: doc-clean ifeq ($(VERBOSE),0) @echo "[$@]" endif $(MAKECMDPREFIX)rm -fr "$(BUILD_DIR)" "$(LIBDIR_BUILD)" \ build.xml \ "$(SRC_DIR_C)/$(JAVA_PKG_UNDER)_PositionUpdate.h" \ "$(JAVASRC)/$(JAVA_PKG_DIR)/WireFormatConstants.java" doc: build.xml $(MAKECMDPREFIX)$(MAKE) -C doc all $(MAKECMDPREFIX)ant -f build.xml javadoc doc-clean: $(MAKECMDPREFIX)$(MAKE) -C doc clean install: all mkdir -v -p "$(LIBDIR)" cp "$(LIBDIR_BUILD)/$(SONAME)" "$(LIBDIR)/$(SONAME).$(PLUGIN_VER)" $(STRIP) "$(LIBDIR)/$(SONAME).$(PLUGIN_VER)" /sbin/ldconfig -n "$(LIBDIR)" mkdir -v -p "$(SHAREJAVADIR)" cp -t "$(SHAREJAVADIR)" \ "$(LIBDIR_BUILD)/$(PROJECT).jar" \ "$(LIBDIR_BUILD)/$(PROJECT)-src.zip" \ "$(LIBDIR_BUILD)/$(PROJECT)-doc.zip" uninstall: rm -f "$(LIBDIR)/$(SONAME)" \ "$(LIBDIR)/$(SONAME).$(PLUGIN_VER)" /sbin/ldconfig -n "$(LIBDIR)" rmdir -v -p --ignore-fail-on-non-empty "$(LIBDIR)" rm -f "$(SHAREJAVADIR)/$(PROJECT).jar" \ "$(SHAREJAVADIR)/$(PROJECT)-src.zip" \ "$(SHAREJAVADIR)/$(PROJECT)-doc.zip" rmdir -v -p --ignore-fail-on-non-empty "$(SHAREJAVADIR)" endif olsrd-0.6.6.2/lib/pud/wireformat-java/Makefile.inc000066400000000000000000000003251234304727700216630ustar00rootroot00000000000000###################### # # Highlevel configuration options for all # # PROJECT = OlsrdPudWireFormatJava LIBNAME = lib$(PROJECT) SONAME = $(LIBNAME).so # activate debugging with 1 or deactivate with 0 DEBUG ?= 1 olsrd-0.6.6.2/lib/pud/wireformat-java/README000066400000000000000000000012271234304727700203350ustar00rootroot00000000000000These are java bindings for the PUD wireformat library The source tree for the java bindings contains the ee.j2se-1.6.0.jar file. This jar file contains the API of J2SE 1.6.0, is generated by the OSGi Alliance from publicly available information. The jar file is licensed under the APL 2.0, which allows us redistribution, see the LICENSE file in the same directory as the jar file (this is the exact same LICENSE file as is included in the jar file itself). This jar file is only used at build time, it is _not_ included in any of the produced binaries. Please read the PDF files in the resources directory for an explanation of why this jar file is needed. olsrd-0.6.6.2/lib/pud/wireformat-java/doc/000077500000000000000000000000001234304727700202205ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/doc/.gitignore000066400000000000000000000001211234304727700222020ustar00rootroot00000000000000/javadoc/ /html/ /man/ /latex/ /doxygen.conf.temp /libOlsrdPudWireFormatJava.pdf olsrd-0.6.6.2/lib/pud/wireformat-java/doc/Makefile000066400000000000000000000022301234304727700216550ustar00rootroot00000000000000include ../Makefile.inc include ../../Makefile.inc JAVADOC_DIR = javadoc HTML_DIR = html MAN_DIR = man LATEX_DIR = latex PDF_NAME = $(LIBNAME).pdf DOX_FILE = doxygen.conf TMP_DOX_FILE = $(DOX_FILE).temp .PHONY: .gitignore all clean .gitignore: ifeq ($(VERBOSE),0) @echo "[$@]" endif $(MAKECMDPREFIX)echo "/$(JAVADOC_DIR)/" > $@ $(MAKECMDPREFIX)echo "/$(HTML_DIR)/" >> $@ $(MAKECMDPREFIX)echo "/$(MAN_DIR)/" >> $@ $(MAKECMDPREFIX)echo "/$(LATEX_DIR)/" >> $@ $(MAKECMDPREFIX)echo "/$(TMP_DOX_FILE)" >> $@ $(MAKECMDPREFIX)echo "/$(PDF_NAME)" >> $@ all: clean $(DOX_FILE) ifeq ($(VERBOSE),0) @echo "[$@]" endif $(MAKECMDPREFIX)sed \ -e "s/__PLUGIN_VER__/$(PLUGIN_VER)/" \ -e "s/__LIBNAME__/$(LIBNAME)/" \ "$(DOX_FILE)" > "$(TMP_DOX_FILE)" $(MAKECMDPREFIX)doxygen "$(TMP_DOX_FILE)" $(MAKECMDPREFIX)rm "$(TMP_DOX_FILE)" $(MAKECMDPREFIX)$(MAKE) -s -C $(LATEX_DIR) all > /dev/null 2>&1 $(MAKECMDPREFIX)mv "$(LATEX_DIR)/refman.pdf" "$(PDF_NAME)" $(MAKECMDPREFIX)rm -fr "$(LATEX_DIR)" clean: ifeq ($(VERBOSE),0) @echo "[$@]" endif $(MAKECMDPREFIX)rm -fr "$(JAVADOC_DIR)" "$(HTML_DIR)" "$(LATEX_DIR)" "$(MAN_DIR)" \ "$(TMP_DOX_FILE)" "$(PDF_NAME)" olsrd-0.6.6.2/lib/pud/wireformat-java/doc/doxygen.conf000066400000000000000000002252361234304727700225560ustar00rootroot00000000000000# Doxyfile 1.8.1.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = "__LIBNAME__" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = "__PLUGIN_VER__" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 2 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all # comments according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you # can mix doxygen, HTML, and XML commands with Markdown formatting. # Disable only in case of backward compatibilities issues. MARKDOWN_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields will be shown inline in the documentation # of the scope in which they are defined (i.e. file, namespace, or group # documentation), provided this scope is documented. If set to NO (the default), # structs, classes, and unions are shown on a separate page (for HTML and Man # pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. SYMBOL_CACHE_SIZE = 0 # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # their name and scope. Since this can be an expensive process and often the # same symbol appear multiple times in the code, doxygen keeps a cache of # pre-resolved symbols. If the cache is too small doxygen will become slower. # If the cache is too large, memory is wasted. The cache size is given by this # formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = YES # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. CITE_BIB_FILES = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../src/main/c # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.c \ *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C, C++ and Fortran comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 1 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # style sheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of # entries shown in the various tree structured indices initially; the user # can expand and collapse entries dynamically later on. Doxygen will expand # the tree to such a level that at most the specified number of entries are # visible (unless a fully collapsed tree already exceeds this amount). # So setting the number of entries 1 will produce a full collapsed tree by # default. 0 is a special value representing an infinite number of entries # and will result in a full expanded tree by default. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = __LIBNAME__.chm # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = YES # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = YES # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you may also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to # the MathJax Content Delivery Network so you can quickly see the result without # installing MathJax. # However, it is strongly recommended to install a local # copy of MathJax from http://www.mathjax.org before deployment. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = YES # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # http://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = YES # Load style sheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = YES # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = YES #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = "__attribute__(x)=" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. For each # tag file the location of the external documentation should be added. The # format of a tag file without this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths # or URLs. Note that each tag file must have a unique name (where the name does # NOT include the path). If a tag file is not located in the directory in which # doxygen is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You need to make sure dot is able to find # the font, which can be done by putting it in a standard location or by setting # the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the # directory containing the font. DOT_FONTNAME = FreeSans.ttf # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If the UML_LOOK tag is enabled, the fields and methods are shown inside # the class node. If there are many fields or methods and many nodes the # graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS # threshold limits the number of items for each type to make the size more # managable. Set this to 0 for no limit. Note that the threshold may be # exceeded by 50% before the limit is enforced. UML_LIMIT_NUM_FIELDS = 10 # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = YES # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = YES # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES olsrd-0.6.6.2/lib/pud/wireformat-java/resources/000077500000000000000000000000001234304727700214655ustar00rootroot00000000000000How_to_cross-compile_for_older_platform_versions__Joseph_D__Darc.pdf000066400000000000000000006221501234304727700370760ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/resources%PDF-1.4 %쏢 5 0 obj <> stream x\[orw.-:}$vry0 XyOzvH b 0v=ue ?9r,Kc ^aQx'{ 7Ǘ|ᛆ 8~ SEj-ޠ񆆦{A^҅)堥p2bC,OlL0 }%I@ 5T{83#R3"|vfPf2+>=}$i5,`;$:e=g \5 f$ ^a20.C 8hfAMlG [đQL{XY f-d 8'M鎤4CHxz!Jv {`/GmxrMN6~7'h19DWP] w- FwZI+m~ 8䭆zEpӗR7M7bQ"6>v:ݳ)\6hu;$x8P:8C 3|eg(障1]-@i쌬(TdCo0ɍ~F Gd<9'ٝ«Q%of#d4V,`x6V9 *Ks; t#yu`rMm iA]h渹9^;Q#yY(w5sn i0WJPÕ*Y 0W##@~ y(فd.qFC zͬ$,Yf^km9ƜdƁ`aVS|4W##ΐ4b ["gKY%YFFOU斬ktfB6fs#5Ȩwkl;kDwV Y-'x ; :O#vwIٳYCfEx Be伹~wg <3RaYf` # #MׅIisvHӳkTs`,?XXDf*#af{Wk=%kqU*ɚQSf4sNrJ t}@£uI%E3QY1be jQ]/AE5s6bj ͬIbD(.S93OՈJLGw M*NЍ0RfnD( sR]sX n.,6AjB}\c]4ˏڏ?N|1"LEV ,<36#WCֱ# jr R[`uXq,裊uwZwaB5S;z7҅NQeP*c1nYo YV| e>Y,wr!.-/wSy Ɋ2]bJ_V㨩URiD 9zǠ1w Aa>ls]q Vn'0H3~bC-sP[{'-u75k lgϟ_oΖm  .?f}bM'mrf7S9M 52R/wW|Ap(mM36lN6 Me0z K:_r}^|>B?>Cb;;t +.2s*o^I7Bø' 8On^ I"iyy P&"wtws Q ] SGG*U:3ǜGs -= a7GȼLL8p8C= ME.Ղ{Q$I{ܟR^SVQMNcSa?^>y4 R$*a2miy72Y +HYaǁi=.jjro,,&㬻|Yj@2EC(/vZlT I>5AkI$sAy|VJwZlP1Ubni|Z/< h4?;&S bAOPz l+`ql.qu(S‰iJZ38&!ყكt6:DYdGzsC nWZǡq_| %in%0Ф,j #v 2YIlO rCiQsȩ@[8XClSl,6,pQY&_>]FԞ6 ŀ*xºm hGwM")Ĵ̫(YQŮf$nJd$NFZ,jnsnlzwnn IkWAaFXt++mU]CqʆEV۔m`ۮ[dC90{ ' 菗x0NEc1P ;0s{ѐ`I;dweӒ&RC`9Bfp"^ewR"髽T>Lr E|>I{7"+`FgYm@*`0yн훓wӋݒBsHxG )*Sx%,~ZۊkQvwLqW:+<42ZT=W@q ||q wYPV97C(xu6jZJsWRؑFY("t]؀5iR@>{G]4۶yծ)-`J)h="]}2aػp֝〝qX^|aő&3/DT&6$-A`qW;g%$ޫeDg zxr&n`[!1?ïC2y*vymFG6^YB/7Kuۮ-ڗ_G x:7$:?Z4E$B=k2A9f! r$;6U ΁JԮ["E Ҕ0OSэi[ }=𔐆ڧ8EVR-O(=x_#) v,Iz \APXRfKA(f:Tiv74wJZad7: },<4ypFg sd7HǖWE!XԳQ%D >5 axWz4D<d9`AZAcY!4 HViۮ;YVY/T婚͘r = eƶDa!`'0vwV}toΊ>0BЬ+[)A𨕪£f}KU( PCۉ=6 B() I`Sq Ypzյ_U9pY^=f\9hʋpysڜyM(7GWQ1BAD!}J-1\*_$ JRU+h;*#q]%1}C}öz/D*c` YC.7"Er)<@KI>GԞ 2=dk9;Y)mRI p&hMX{M6wۨo )^Cl_D,iꝜ ?'#qp96 Rr \O$h 4nX]/Mn =Ǝ[ Kchb=inJ@Uɰʽڊא2fnɒYfoUgvmųe %&zf ;TmO*k"( A8tsxjCV0'&^,j+`vz;uH.&<  NŪ[_5'58`m2c[vAQ@S9O=IͮcQK*W@R`•Vmq@H|<-_sP9*U[CTH ure3`EUYUϴmPZ(xwR{un<؍kTnzjg8x;Dx=7E 2-NڴVeѶVbuciL 죕 -1~ dҝE{H'>h|c@<00oA&_t5nrӦ $Δ姪(rZ?ӷs "<-N>{G7p-d8U)bpfS'yfyH{M$nWk;zG応94Q\n+_~O7y𬐗v&<Di.Bg1x.L4 lduendstream endobj 6 0 obj 5620 endobj 19 0 obj <> stream x\ߏFr;r0+K#.ZY۰A @;͓ Xyȿ*6UJZgA\?wRz7/~půRN~t'\3e+Û qo:{e`E_C߉^F?O+  ?^çIEǛ!B;ǛU/y? ߻MxOt<^H&]|H"]G"=IHCjg.g.^'魹}Cݦ_4MI{٦o2]ݧ4;顧 1\? !Oϟ]qS6RU8J\ܴMٖUSwU]}Y PJ~iӒniGEZ}*]}s&Q^ɒ}Wo#>Ye4Mj6Т !=tqE.>:d^ta?%, Mhϟ2>qjv3{v(]Aooo2+ MV2o9yt1M BZG r-ɤnbr}^վD>~DTLMW)Ot:mNwi's phƻ |rB8ڍ[z+紝S6tozjUF `=ͮ&#Bgdt5V X#40 #vXgwi8߽lL08iֿ S p|f[={`!t;!T'LQ|^*(6\/yuA@d (1PM&cO6:hB,uz@:1A xi㖰{WBM8⚬jb;{Z"읡p{1!m3'7ڷ4\ܲڑf qdCjWӛ73;gq,H=Ï7%Xpt"]̦e.pq̈́~ tzX5<6#Bz>y:+U(ǢVeÂ5"<Cdlm `MyAsۮ;^ǑωP%nə)Z${XuXѡv4snaR<κ0bBf;`hs;V%3HtbIӂpt0lBvծsw+$`:XZnfybh3#Xl`(qZl -E3Un0[1D+.6.- &!oݲ0Ik8. بWj<1F17EA7ˎژNe;žʤ@$:RZL&} X52|P4ߕ(.,m darl_&:L40` Koh5s4#?uQxiSU*wJE;(d(:T٦ n =?>fN) Õ c&Uլv62ܙi  42E5$\&^vD!2R^)0&2~zM Ճj'Ue?j즼ۃ9!#UN)ʬhXW?H1.3Gɏf2Q/9N Z`nY(3"arfy^U͋;9,h:,w~ʭ|8(7LrT^] !9ַ kbC\mqyHq2PXJ"I-3@)ɵz`+4 J$4S +rIJ99*;(# ACI`Hw `LI<_F!;Kk>d\C{d %w@B'&؞Zˬ '1 Feh,O'aHZ@ Hu?)L+rv8%\āF˴U6: }1 (c31m>Ժ 5##ĽT帘?)2x Sʐ.Nu ]B$/UJG1yCWRőIMˢ~HjLɓz]=\B>ծ)`Ϛ k є cP2U) ڋ-;絗>eKR-`4Rleή^\OB:Pʹ,~r|TNL. e3riA,Lꤗ9@F/In&FgͮԹj_]1,)f΁32&=pN/ G~xhKrGQI&bdhu ^MHC1p!Dț0Z Adf2,6wHekk;RUDW/=MR\`zҥD"QGi-&7QBM۶H`5L]߾|WT)pZiY.!`7S z[ɜXmh uo$$m*ݩoش`2d30{n&\\YQ'xeHfsّ)wB!W(@gdwS1ISti?&i?>lEg_/-}E.cU,ۯ!,N6.आV䦼 kEP2j?|bV;yiEI% ջ(lz dͺةX SG)(f_DHd'}],XN?)Pט{ Jr}MId}'f8;@A GLqXvTz<\ޯnF%Pdj>Ґ ?MW>Z 앑 I,۷u] jUnwͶj þA:;ǒ~X*j ƽ@v@rdu ʸ'A+u`XG *r9|=t!':0b7wYG*5B/yqp 9}ހ}DsMe;ONvđE|`aYص%KD|ُU*/Qʝ}t{:)L2֫D Y0(̣ՎTcL5-P!Hc F:I=Vch8ޠY/ 23Ns`{H=lKi2g9θ즮;] DHp@p ݕaQʐ)Z hLHEj f9%{³"5SgULew]<@1gwE}^A{j4b[5 L ,I}XߜhDjnXt[LJ('Sz鱤Z?<#<ǎVף \;8'\fZiAVQkA\wSi`)ibuTzOm8,%x. MV D  I'pV*x6uKTE.:7|q2Wj@\g-h \0龛6 QV>('zw䞖_҄ hRͱZ}NGFVn`\Bg Cbn@ lW +o ![Hk ǂ%d^fD<ņA5A%dAx$FO&[ O*E[jcX{.R-M" 7d< d1*1CB ݴ#pŒ2Dr0I>x vazBzª^II8OD[kȘI$n5;,W_g% +\D 5[xu o s)gucKoOv(݇f9&n<0֬˻UfLoufrJtnrAHbm0Q|,VP( VF 3m,bHɆ#'F7sbN2Ěʎ^;]'g*r=sQŕ&6O@^LҮ3OnXt7JŮ}0$w@]G%r2IJh^DNiLX{. ZǚG8dv(̨U{Ӷdjɹd Z:V9%[Cfsu)=04TNRDsV ,l=ߍc7ovDgd&M&DʿX-?]F,bҨ`T*vh,ZU_70f_W%aSk=AtxNfJ2;2%A&NEUw0P+lPڱA.4Kf[wվz8X3|kM `ƑI0Oh c$z" :Ռu,X.\ KcaHP T t>$`Lx"zlz"fM=)T߭0Ԃkyݝ7I!١R;4Lr#oqV>t>g# {"!uKUqU7Z#ѷζGVԪSׯT U=+,@Zb#πtycW&`+avXV9QoC9J8`=4iĔ"i屠b!K&r΄}`ԍ}XJ[2|70;@@2pX(@Q'=ԭփTh0j!y0[,$YXj}a/LQN!_FU xp|lFT˪Ӹ1rlϾYg|b*3d:5)_sT̵269̡d$Whugg0*2S%7OGњw:jl}7lGp|BTȚX3Qm#F1ٖݕX%}µA]YC M8}ԧ)s5CYϻ Xs:!IIcճ`Vq~/`=6K< 4cG<~ͼXSy^hiWdDNW4KlWRS _QR]l :Twb&ke{K[!Z*8.C^5}dSr]z4.2DcQ-[<״kиӮh<0V08;0Vb 43TA éզ>YC֯DUk=Oډ \r`tbM[*~,,5hwJ[(I.\;X0@FB=&:}`2Ӈlِ2&M}ê rXCZ` 'Q]p`+,Jza@JtTֹ5T+Xo72+:'E^[5d4}'Y~pz/ 3ڳOgXCTa ܚ~ןWӻu=9~6 ?|p+[@靌Gy;Ҋⶤs*dHMdFf4~\7QÓ}s͊81.L/רcgL O ȀM^"PԐtˌYIF1oza֭c ` b 7̽d>D5dqvj\Jvf 7PL_Oǎ ۗL.G\&HP?|FF+^b^2LzW+ԭ,m YY@ N(endstream endobj 20 0 obj 6716 endobj 26 0 obj <> stream x+T032Q0A#9K?\!P@,nlj`g f DK>W &)endstream endobj 27 0 obj 66 endobj 32 0 obj <> stream x\͏\7r=0kݒH-/"y34l/` 7rc!~*=j[u"b}|?ԤN?_ h|лL s~l8QOrovۿv) o/@Mr{lōRZ{mKS-a.8y6w_^u dTR/"Z\-d~R P&FLJҍ3!ο L:n"$zUMSDHBna&/ )WzJZhg~o~{FpB)p`m ]NƸd*PPi&ϾV kHPeE+j B6XT >_Rl!n,"]LgɁn'ؐlAM6i d zrs g8-9n)28&LYOp3ÄKyN7`Fų&YpJ,k4Fog5K8*Ü5MgE3۟ @MaV;m&UY _ImB FtjdqYn[=!g- %W_jOF2$oQ=sXRqnhW:"=h. YQ/B$WQ/jACf)ثpItJf2&h!?ri+JҭVAI%VGA.YpJgZ>}vy4, ʥ`)WU8E0zQ4%V.`5ʥ|gX**WmS%MS{g udE5 _d6ޡXc=oOnV竫G#8q2 ɵ䂸tZtBwެKnQ'z}iьN ]Rsz+nVzz Q6f-/Gs?0B1Ո AŦ =3 c0FM!1Du;f~S&'b?IU) ,!S?mҪCD7H-HHЩC;+]Ee9Ybb<_~@EШMsHKME/=ࢗi#u%gRz NO}^mΏUT5ӨB'JdHw(ѭ* }4ol;BsZke6J<] ЃCJdU۟/$ˆ֪9| K!xrJ: Qr|9ؑ$ȠDEe:[f1e3s٩O (W7}A(ra.n㾠=[us:g$1,9oAnB>/tɬ@1FcQHCHfUμXBQHvA7*F&7r, Ҳ卺!O^GtN?i8YU8q>@ZИ?_~ڪPkެ_mV xGkr<ⴚ`8Õ9>79xHw9ѭ*@q, f[(ЫƟv=iԇcZ'FWY_q۷W7cU[+Qʙ32}!edYd+ݨ ICFƽedD*`Z29П{ٷ66jzݭwx)zCO"Ь訿S7b)ڊJz=[cY9򁤛T#a$x$4Gr+`R])ҙ}IFU~]j@`nxfLv&XNDlwI4/ьӐ`֔a%Y;blcm w#UhcG|4sNO)hlj*`l%f1R\z>$6-5cyV v8%r8*LMl1gd8 k{n-*i/;K#p9+J9G>{!@ WElU4T<*UƠU|k QNM [E]:arVyEpو3kCyW}E nn ިUNYdfŨA;VڂAQYB0v ٨PZaZHǾ4$~hV9 3yJ%YŦ)o:\lZ45I: 6zg ud Hs.p8ﱈ6 c9z3MUN H7 ɨI1j;5jlQ]F3 cF]J `G{ \#q|3Tc8 Ɇ M{}!E_D ܢN4K` |}PP/"q2/ 'b/`( oU;y^Hw Ԃ$0؋{g0T{-`@l4'i2TF=鵜kcv͈ V9˱26cHuDflmlƯ =f5 ]lF4\pi}\c qˈU93(y]ޖkBa܅eD7Q ƒ$=e;K]XF4#S \ +⥚8TS~Gȍ8-`#7$dX]Au-`XCƽEnD `Ts&EPudIM `JyS޳cca8 `^ k॰- kHq]%|WXי k5 kD3Z k uz(=8k7'5]?ވӢ%7R{7p}/X3޸w-*Ȇ; 00)Gpƃ?q̜I :p}@ t;K tD3f t uz})cx9!fcu8 Vs,msHsl]u_zm_a ,q>ܡPcb}ЁɡPٷSdoQ$zY9oop4cu8-Rg #m[WpX}i`P^#9}uG6a7N>'{CN˖E^۷c+J`"qPYBECEn@1}%=/Ȇ3(|uϖ8Ctdq~8XЌ5>y!łfy_#\8},h|K3U!0tJ|{ ^OtSMOw>=P{>=P{>=PCjJ:t@I<^7dj>啜^2C= l/jv}"{5CW3M!t5Cj0 afC! af!Pp>o"t>gI<gf !~šy,]$[q>ܝw;6>y3de˕ԺttTEύ'w)*u{T8@aL&p-h*}"F#lP%- d L|P$F6loh|WeڬG50- P9d_![`0A3FtI& D|Il;\q|CϢpD`H^ ۔G NR}0 G4/I.,)0rB'S-9)&t:>k:LՈ8gg/>q*g%XX3XP3cD7Q $-;3#Έ}͚;xh8۷'w%ޘG NA,oy1װZcSv1Il;ႯƌJytĠx%+?44T~,dIfB[mr䛫79_.Qo./i syWyhnBq~Ke@Q Ku w// J-hpM.:645fpsendstream endobj 33 0 obj 4863 endobj 37 0 obj <> stream xZo^Gc DcGf) B< O-BuQ>ss|i owvfgg_OZY?GOLӷZ^[&gNU$|7hU5_foږՖh|h14{}.΅/>,t>[yy/wgS.!ڒW0)FONg VR:)bwv>?ֿ?[h4^z|^4`z:;u,u'_m}NVrkVlc%a mt)]1QiS/uۣ'/yq4ږ6lf,-ֻLoz)bKBhOA6*hi*>0.\.[QjdhLqZhCq[x(KF ΐ#Yuj )hPc)>G)q J:Q_be:WǓ\p4m1xl hhVsAa@1K}PӾ7:Gud@ڀuC re rj9aI<\|q$>LȤTlɰp Uʅ"גi#C(H^ր a7^! Mu S #ldm0gHNmEIl[bZxigbDKQ@8{Gq$Kq - 2' Nȳ5:(ʜ$ɷ/R0K5B2C$*cq0)Z^ -tL`:~n(Zrk`tl_4}t-|gR&sol+=zoo@GP3Gm@|n8Q<PԂ` ,}zPDPrERwxf蒔[xf0"n"P{!H{7$P"ZP>kpt-|T|RuW,do\ R@_=8x2Jw7L^9ҩ,3{oRb K5s,2sp++dP?NRw8kph6n-gmng\u$\.*Mb[ JĊok*on9u3鰘gxe&f<Jq.a F-EGg w?,/ؓpْrW9vpSl4슚+4DpvPHv5u z7ˮ(XQ B,Efٕ<[Xsɚ]ӟIqghAEv Z!8.ED(ȇ7.vtѮiA@a$Y=.xug%p\46It^Sg/d2s>V㷶wv0;OCMQ礒.MMFC0K(a F-Fg w JI=4+bA'o?pf5mu©H8uNjAMD^N-9D(͈E|l n|pQ?SjF8?mAa>3mO?.l?NykE8TJK,Tп==ڪ1eEFYX[W٘D ijld]J;FM d8NeFkP1&;ʃqhZ8N+8Y;T] 1 4=iž P[lFwt*OHQ k9c'R1*Fb8.bHS2SL?UD93<>3NrXM 9$ptxFWhJ򮕢KG -+#sy\> nSH.KG_E'N֧,"ڍ =<6[{xkN#^zv?O^uXm|UZLxW~)i5S\Ҽ;>hc5\ ޕI=Z6&I\qcG߬vv7 YiUjK"[@;@]4)2kt7eFr2 J?$&_<{zj况& g(wh5볙6=^ e]c,6FtWͭǧǛrY{i *=r Eѭ8e. A"ƀݘ^-ߋ~٣} endstream endobj 38 0 obj 3174 endobj 44 0 obj <> stream xVk75w#w@mJ!+k4Y<B飝mR?#i%9 {~|3ߌn΄ n;!Ԁ6bo+׳+Vfov ;=s ݇p\p/NW aΟnwJSHn] Q0h>}^?>Mpo л߻ml>þWACbqMi2̑3xB$+`DHfĄ()Gf@+=!)aSD4/ՓQt\*ySC f5VuToZo,ݏmw$(9Z7FnT&􎴑82lشy!< 9sDY,O!BܯۋB (Ő. }ԊRf\a)ٟ)?7 hkI$:r@tfoe caR"1/gYF̝_?+JG'ASfK׼[?Wu휢&08&Lz]^7qśÐ,g |N#Ghbp,mzm*A橷Ӥv1)cqN sf@hh& "7AE',sV$1IINd= «.b1FiJF-~*9fc[|>Kwn VNb/*:j" \ZtlQW,Uu:w*ͦ>[2-QRE{gd!(f0C9#ery\rl.<HyPH5^6/U)/h̏a/PGog:endstream endobj 45 0 obj 1040 endobj 4 0 obj <> /Contents 5 0 R >> endobj 18 0 obj <> /Contents 19 0 R >> endobj 25 0 obj <> /Contents 26 0 R >> endobj 31 0 obj <> /Contents 32 0 R >> endobj 36 0 obj <> /Contents 37 0 R >> endobj 43 0 obj <> /Contents 44 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 18 0 R 25 0 R 31 0 R 36 0 R 43 0 R ] /Count 6 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 16 0 obj <> endobj 17 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 28 0 obj <>/Length 139846>>stream xݱ+9P \~!KW? V܎gd?rZ M5?yd@J %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(#ѿ?plyӸ %`(Q7{k)e7_NoQ/hɾ Ow.?nY@7 -E 9} Y%r=_v;ɧgؖ@tj[T DI!t/}ɱ؀(?Wsy'N-u6()9E ;;9@t ˏ-> SKwKZTCF^r'ޏz7kـýnR<sD](Y9nD 8 @t(rMʕ`R+%+ЍDq'eBI!Z_w{E 9מux+=k7ٓ6!{ݧ\yW@b΍ D?KzXE}Ǖ6;C^Chvzpw׍[q!:]ԱoLJ^e߅@e#pW:d%|@~?)ثa.tG[|{kpRO^]"GСhgi\1R"rxtܭ[Ǣ(x.}  rxLp97=UzbV|)Lp5n|զh&!.')~9UCe٢RՇzщ/N\4+/Y]nu&?_n}ԝ?E},]<=&6{H]>KKcDηd|j{NVOK^p!esE܉''f0Η D7ЭWZ[ VCtϥzp@t ⛾WM^]co}ŌDWw@++#".d^2kae;nFrL#wDg:&זbAKdGa/X}f*KO9ҹXo d%8w{!7Owip;OD[CD;ZIXiSEU8SuFp▊Ɗ2o6"m<17~~k|rzYrN]Բns6W|Tqv;$poZ\|u^e9n}gRx#= DO D.G|厷WIjKKC㷖IˎaC(˧[ϫne?Xx:'//9mVs6gfG#n'պ-۟f>_Ldin˟y2>w@qhO?;V}j> 66$l7p*Z\ J{^eI.S|t=ilO:"W&`7fo DKZkd&gESVd}O"JΗ܁誛@;/ѢKG#JD&бB#7KsD1-e̤{2gnD\vUvB/+L+rԔhCp36^G/ D#}#hkHQ :ٵ)}ߏ0/q}> 6Rv7N͕½}KՓኊu5χ81bo6Y2fɫNRx'+XWrxh]Qm;[v79i46qY~Ejn-# D1^C[  BΧw$/|JEu@ցhch.-h_z` :&{xI Ah#Dh]hnE-#DK DK Z,w ZQ M`;XjIy/gɒjRaNVإ[U=%hQf/]ѷ6EWh] ̧=cQ7ꖑE7{H :hC dY=YR&DRKD\/"/7{Q˓J Dcx˾uFoW>"Ự@`h}3hi''}*TOc/mFᆁhcnu]C&hKB<ۻ] ZzRѢPmZ aRmڦh:|uYMedthYQ6PfHEO;G[-$#O p*Oˈ w@`d^EeKC""e "m` :"\R~\^|%qSq7w7#F;-eDmz?( } ,XSx"7}.n;h?16Dn/gIoQT0Kֈj~ċ ָW ZTj[m6D[xme꺌[?ߧ>lI8htt[^_z;E^@??T0o@4x[jgWċ [. D۟"/Hp_fk1'=%>x˥gb5nYEaĊ؄ݛ D{]BAha0YX"2nQ[-!I`Jq[ z-۟:>_q(l8MfGiVn'ц, 2n]pчGQ^C{ hxOv4ج׊|ڈ ӟe#F싷3/Jw^ťn!RU 6k:|MIiqZԥ4C ڧٜ@?.WP:ÓjXg)C .89SUi-9F쯭v̠hYyu9 NjF:v-s|QHװTa΍\|7ÖO#MNޖ?+YHpSO D?fF[_'臍n,]z}@2 v-ˏk9J+G>Qp_wZBܺiI:}/kl{mSڷ!aX| kvv-֖٫yXsP2W9.v.E E'(jƾ׮^"Rpfw~bqQ\nmjSVTyqٱ&sYBϼNt ұ|#=<%-+֋Wv⳴4o_[\^^x>ekNryInH^}6Wa FvWr>35Sumov[N`i/m܋Mu;WN틎my 2!iK #~/ɬA^.o^.<  Dz"l^] XJ؊@uio1C zP` e4nwvȎ[2씆;\0=wQNPڽs'c_o1pW%n=d 8`nG %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@_'lJ ʃߣ׿5z<@4(!A~-:Nd("@@'Dy(Dy(Dy(D@i po :4^rjT?j&-C ڳ Z"Ɠ+_--t֩pۈp:oJ&߮.$jюpc zw\ ?Ȕn^a. Dg D@W^-G'["n:u@nQ^hO@4^[:S-*@|opB cE݋ޞhTþ-lE ck DBZ~v-(pI i Dpxy;%eM@n' ѷWBXQ@iK ڕ@m3z/ D Dx,([?;XQFDQ9pN t= }sB(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %|̙ԹGQ:k~ʺoG~@wQdm=Z9|_]r Dw3mp Dy.3蛢3#dh'bT+G :b&Փ)wg#0@XLFr/"Ѿg#0@[˭nə%k@O{t]xGn$i@At+t/h}#}8{<]@/%-s$IчO Dy h}#I>=|Qnr :'Ye?E*6H5sżj-{8DExgptgtQw [i1<݄@qO*t<O:־}O2hiGWT0.:^v;uK:vnݍ9b;_o#FjJ[nD ӍDK'C__ Du.guyO'jGVdI q' DFgP1ƍ>/=l<ݸ@4G?_ 1u">;Np;xiRqցhűzR@}wz_9wt[ш`[QW zڸ~Ҿzuu~]ҔxW?ipvt]]>e]\ԲN}UL}e1OM/#(O+c;=cp|RN0-z-O2W s&i?aGG*Wo$^UӠMڲFavwr?Cw[#Pt]^iIC?d񵞢O4"*OQˊtE? Di?! }5q`yظ}ҥl-9YOMe DnJ Ӎ^fƷG YtmQ݅v?l<' }5āցe?( Dyw㺤Ez;wg0]mGﳃ·NKC_㏺^O@Ki(@Q%|W[˙Do}vpI@nWv/>CD؜@D-N^-ŋls洘D Z} X ;tψ`dSHCnM u_-'k@4ֵViAhEqOWChK:Q<@ѺO ZM z>e~ 13OO#!D &C֩Of2;msqW?5m͠k[<<!FWQmtm-DG?uhU|?Q*Dy?<'UgP ZIێNk-Omw!nNNPL<@4XgN Z D D;1~5Y N{oEDy:h@lR.O~T3^@@ڈѢjQL<@4XgD Z$ms6 D+ DGt$# D#@ttm-~U@2@tD?FՂ'(妁\gt z7J#ܞF*q D7&G3q@ Qn߄N:YHJ"hu)^zmq6(<&wzՙvl\1ADa.kl?"/RQ}Ti,>@Єf`!(O]Co"k v^$g9/۟ 6kɫ=b߶^_qĎ;KˎsbO>V-wV;&xB @'v+w ؟6_TieE.w܄l)b?qhDKw뎶gA;E^6!f;dBZA烞T+*,m*=G4vve|H SrH*}}ñjc.CMt  Dx4i(@nQ_Vh!@(":܂@ DnA ʃD  m$& @T @P@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@HK %i D@ZQ -(@?_ g>@(_?5m&wlCiϴ@]XRWJs #…{??0@uo޶&):M?`d!o^HlP5\+n!_μG^n?6p'_=:u;z3 DaGqI;ԭO%687)~iӅ@V_y<Vѓ?\%@RT\ߡn}+FV0OMyN[M>8D_zxOD/5.=0U7eqRpݮn,!Y;nn} {\  巻'8w cLDu)zþЙS \#]E%P7Gl5w8Nؐ@[ms}SaHH͊\zW/ v3@Wp'柪]. l :ս\~Yak@9I)G 6 6hGΠzOgMKiW<|1Rڂ)N: `sQ8p%b\okW%l_/ .Oi_*ZPE w#U|юKkrQٛc c 5i쒃dm ZQ'g^ot?$sĻT'f齩3'R3W3E ο!u oCǧwWId>.G^nշ˵<*}.kt@F>~-k̷*}5lC?KUאLqGŠKd2m&<^:wU ls y+iy Z'՟(? j΂D8z&hX(ju?_8Ye3Zao-3.}T ROKQ}.*=-3ly9dI㾗fe;6n4kxdVݔƄZUzԝ-yCuyzsy%m֠ªh7Z\5wz DAm}`.q:!Y}^'sG'k59hd̴$G 9ȋۗ4M79>T'f[XdHXOP?d-IC_o]wzgV\i_wrΊn^L'=oYQe>.ю{)8?}iI@tCQŔ=bM$w]o2QOQX[Dl\e\ j7 DuԴO Dim *Cŋ D_ GN|/uGv皫nsb,r2q8ثB*&Y|~+Rԛ@>QnaZMXK.v@._Qh|ŰPڽѽH m虁h)h/7 D#F?D?ͿW]TaGĢюݻ=A5&.^Fzd UP&-}71>%hCm"^"A}{@do5?'sE+ 2\sD__ʗ?Jm}Ʃۀ9ڠMюGڀyOh/./ˣ|JL`CE/dt#jw\~ZO& C C퐆^@tNy/lS4vD_Gw-.dꇍ;tS{r ZƋ?-} D DuZfUdȆ*Ҳߘ-Jףl@*zCA/ю '}m"e DڷЅ :^FhK2ю9'_,6x |Z}z \!Š@QN ᡁ_D :@d*z h%h|h.]F ߶ a}jVw~Z@'t_\H- D98m_;zf_p:Ղ j_ zۥ"}$)(ְH#b~:?=Kh7ͧլ>;i^ΘP@Q? f DNX82>NkuWJѡ#uZ Zw DZ{ D5V!H培 ks."8}F I ϪwA+K^+v!ؙ AƧQu$0Z&ъ76,H "Ν!hke[QAsbh v` :^?3t D>78M {'KPKQD%s- :uMJj-?>xcɞr_5'֙pVs&z] ;-=9 Wq/) npAoA^sG[ݾTE*YJz~+eWWv D;e1n"іsZ9'wG5iϱhز%>ȳgt8oLu'q/Ŧ>D+pῗu:t\rxorF\8SzE.~̵& e'mRWtOX} 19{ޚW=%޶E̫c@=\ߊDpI -n\ƞ$}ؾ?-u;롉"O.ih~nnhW KV!u>NnGMw/U5ʺSR3ה[V9%'I Z4f5jǺLl~7}m㊻JfL $*qڿ^]\ zۥ?&E{\x%T.݅@uFYԫGj3 #MDy${ $R]@t턞.5hK"㞦WF*:Fܢ7x@B ,uODo+|,_ќ6q-.B@4f,=:pl Sgy{%S[˷Օ;3&vA'i_VW7!G>=! KQx /N;Gz\oosNΙl=B5m_daY gŠ%z{PW /yBûwv{Qj~@ 4KKr }V Dh!D#f:{n/ih!D#f:{'^rX"ZDe~X\}QgKi zN }vZ T} '@_QrI } Da6oB %(%٬p(pK З@`W\5kP ʣmvVI! Q5$l}х# @(-(-(-(-(-(-(-(-(-(\ DsKQ*7QhpFS(cN-#tih&.=sZ1S r."R+z@Q+p2@rio5D (@r:Gw_h3Q*'rg(c"msɩ|>#>fN]1x:('Z^oBuRa1U D9N}=LsXfIv'yQR9dU3 D9N@ן630z Wμ}ژWK1(rhQ%+%bՁht= D2κE<@D''y틒ҞLwʟGs? @t\wq ò0-M (Yv CsA:Ӟ)0-ٽ8&8ъ D_ٱbުf0@D?_pa@ q D D?I,QMx:[#¹Cj D?~jp(ǙQ Z]W8go$lO qv?Б"dM ʉ3dΌ>o>Eؕ@=7 D=(V{}F ʉ1Sqs|G13V-wAL{8y QHDog2<wqzаs;bѷ$ofWԏ igƿ3+=>Jç] D9@ (`(G;កWYr*`~ -oXih$­;B3}l9}X%pg>|QӦa,m`E|. 󳜰 oX)wD}a(G; <'.(;[1,ă3]CG0Zִ4twAbӇsֱ@mG| D޸UG>! 9͡jE[W*&bpQsy'x֨}1`kE V!ǜ@t *^QAtr4OB,$'xH z+ڥMJ߰K҉ јLMR m<"O Ɲ@VKӵ3,@48Gigp2(G aEҽT ҄93~cӾ{q+6Pgv36su/:^zg&n¾Нy~(5bY~A'ّ#]#]-wZ # (G:> (M?醷o3?fŠ?E;)J-إx+4V]]uǜ5K m%Y֚XҸ9T׍]3sNfV~ʍ z>=qҟ;KW2}ti)'-¢@ (G[>F?6>bSQ3~>g~cсh>0#Ss_rNۗ NXwcf^Sјw%ȭ}E*zYd9;^齌_OQD/73}tѥ?weZx}S.?84Q0{ZaUwΤ;V1~ǃ%0F DÞ޽;nֲJv D;.&1Wz_]9e:zvwE{9xRcݠLNhG{Q|ݣ{]FQ [>.7+OUYMaĻ|~D9ێ{L}w 9}_[RIw __{ƋR>wa-JnU+1ggjK;P-xE`~;nh,b췺xRs\Whw/>iq3 {T{)ڋ飨I}Gv٤o ƽ,}S7}_rEqM~oac@4OQk__H}%F8|E.^͇[c7:xNwKfA+α]р `FONFW' O;la.k| b7ASaFma uL^ea]luhgO^c@55D5Iz%9|EtT{ͽ9^9./qݮ^UX"9\~Øh׍ h]VǽT^(R bܓD|Ei@4}fy jhM˽gewymXH V_H:u}Z ڱ7qMc@՜^Tsr ڲ&C @xfLwGAl E}9[~9h/rv^r|ʏB)jлzϩ6-#*߄C5ɈcZ .MaT(v"h1^͇(>cFMrZE.b.L~'t%9|Egθ5߯lҥGDfN:<y9hUa*p@4hBVĹQ=! [Uso_UV7^5K}S4(L D_%O-"3gll*0vS :v@5mpY7Z]wqo99^J&V[.ou@UYVĹQLXƝuWyYѷUNÓװL߽+>M!SU A@4ݰ7"l#>cuE.6DfUb_;^q_QپǺ<-jإ53;[@ۮ]7:m -<_ (fGKˆ&}W|BE?gI ջ6/h؅@f9E r%:|EeD?,*tnhHNhEhGhf6y9~V׏ssB6 CMu;~S,x\o@=4@@4T@v f%jջr%?|կ9UVqcR];_+AV[^6he Zmy :湁h5hRanGj;#5MaT%`(G{D 2ń3Qa"` :,٫WۡxJ  ZwUw€G y_DB?.GI }2q1_7*L{yJ лE]>mSmnGрL3f(G{h :a B :y4saGyK)Z~n ՝Ǻ{i#yYT4{'>yqucWU2Xvgo~7kǷmr^ 5}(~ >SQv7MaTm/<|rGGbBD1h]OD{jrD˛/dVw'v~}2LjEM"8/h'h]RCw1)hQZ^6 5}H @^)L[uD9@zwm#4;*o)_J)+ַ?9zDq'юׯˎ,*}hȄeq@+AѺ^ DvE飥ePGŎ&szUd@tܛ@%h]DQahk%@ZjSzs=j"l~[$sWg[hq#F0t1}[Dh/J;0g* %p'7"3gll*0v_ :⛘@4^zDm궏vEz`m_ڽB-u\Ξ^׼Ns,Šڳ:r :uG?: ԍ a bh);UEs%N_r-Q| qBPE@ck(պ4 D+zpbC1[GN"OmNڛW u_.ZXXj6uH&Q D']WyYm.;46yk8y bb`MQ`'Q} l$1| MB cNܠzfh EWԙǺ{>FKJ);[@r߻MYӶoE{ܭbMn5.ٙwgq3飱r]VmoA.[- DGiL{Sp MruEZQd~8mc/o3ъ׉.s 8|E=99-*dͪ~Sl{>+hEXdV][w 7%h'aӧ}EDw4 bm :MA C Dka{3^<3d_'Tl0ի\]7IN*\7onwۇ D뚤+<6/~=!s,}K}+m2Lh2i9jLGzWpk^ihHoG~.'&.AL^Ә0n*@\~R=bGEʷ3{Ѱc/6ެIЍ8glKΐ&,<|gcݸٷm+mN;nɼUohkz]CE]7̼UgΒ׍̽$vm_0~t`~K z[z1}Gg%eK9o 5/ 6,!8DK+G(2 oG,D.'pgl.+ S :YxJVEu;#7.eU$mo+-V[_9oeG_#Է#,XҸWoo W볎ף3ԟ+>k5mv^?{_ѧKqwAqJi6>^hǝ}hG @N[$g3|!7Ǘ_NW,'ݛߕ郿6-eEsdk@JUH,'=:~DoYd9!LTr%`ID =JAW4̓H#i;"D@@y֩]F< /՝ÖL@ (SA/k٬ L@5(kepQ?ӿ;'3C ʹ~3! PRi&a ގo'P]Q6W؟gPw]q>@@C ivi-4L<XB ʡ4@thD 79l"fPGJ]^/om,$(+k D1i킍|VBt괟yhߟFZQBFJ7No|>%GC `9(D!x#PWs~8}@ ݼHyK]nD'|PxCMr۠53l+Üu~M*F[yԺ׬^C]!ڵ]27 {Hscсhu;6.J#FPWvu!tv" (gҴRph ZVu|mD D3?uTZ.BOG@QUgi]–3]'~gcE-KS԰ɬj+DֺX:&"\]B_" DoגLvM)>hGuhZkC5\np(ji%hNff6=xuxPWvu$uvlL ʹC۷4V4DV9M49GkqD1( D;6mؘ&f̴13_;u"hF &(D[Z D3w]TsĿ)<|<@sE iќsBk D2 D9WF h(i(ܾ;J ʹ4{m5 DbN3З@ D9Wfa zjVUyU 6Z2_;u&t1(DDT :Ԫ@l1({^y?} !څ8@sE iD? Dl)+ x (D @]kN?Ko D9WF J Z]vBxhv9t7+ZH#mi0M`u/+9t7+ZH6d\oMvcx}{ګ@N1rrh!MO-;S-&o[ζS Z}}wSm&;?k D9W&?@n??E?gּ-[7ԥ^kzt!7{`-( dF}ku4O~֕Ml\=ԥ^kO!,k~ۿIU{e.l.6neKΚSKZ+KYڽN Y4{F].ezXfϬSW3섡؁ 7<@<"OŻ͌{ `] _dy.C]&EnuK D!?'?g[2#>Eў04\WwD@ (-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(0??3{2!s'cBwNA ,c4p܆qL~;ig m {0nro/7_zӻv}!sק1yk{~s13fzҗS @C=%׳ފYr,ק19Үc|~13f@r2.﫟׾7.vcYOe;2>?\hX؃6M D9#Gr,'˲.A ,c&hjB ټ@\sR b`aۼ/D (:i;h&+x}2&t\?y_@4Q5-,rYcڋ@4gq>sR b`aۼ/D (#7с`꒕-pIե'#>5e#. g]5aF{~чk"1oQ@ ʡfu W/)3+ڷϒE9r1&rU1BuYx8ƝK+Mf췽3a{Tշ]]Og59F|Bfω#fowLErvk-PQ-`Pu@ D9T@tMoU4 l~o?rK5(Zn.v〉;^}ϴKu?}՟ehr f.'UI z` d@}/(&0{cEAET9(xT:  jh z[.Z IjIknJ3oq IVo蕋^t"u13=qen?Pq D' n9}ȩYw[; W]TXZ DC59unz}Ď3Eߙ{ {ݸ29Q\ DU@4Tߥ՝l[v kC.4FsD`ՙ6lhU}9vC]]ԝ sA7rW }j;>_TjPb5FmWL7We;qqoyzXhBoU u+o-lY<'-p:Ge/ OՆ^ڗHMvrXͼrzc|y~3jmTA蠫#sKKAo@QI 2So۔N--"73b~%N+F[d(UѮ^z3A}x\v^HE ޙqqDǵ 5-Ъ})hKeh]o 5e[Zɶ D_US Z݇G5 DGl<.f ӱ@)(2ՙ D_KZenX:?%v~gvIk&ڶ(BXM>{{[8䔚v)>D XyġOO%5F/Gf糭@"BЅhNehNnSm@եɳ1@X DOkrJ D[ DK+:M]hQ@ wQ]>Kun8T4(}%_V;lX?xM;rSъ ߚZoDDۛW)^ go|jF~Mx&Wtu 2|(@"B+o/_Irzr Lv){0` N{oG;>@poq\s[@&m{'Bի˅UAhEh+29 O[VׯQA@ڈѾC涚@qі6@Qh%h̆MJjH63,D{0vEǚCO.g6"gQK D~!Xu^'ZUdm :GZugc]JXӺ@4]L8's~v)Lt_f{j6He-:{.C&]c=<׼ݸq svia 6xۇƴ@bi/<@j|^_]]dw\|8'vY:e5K~Y듎(_'lr41?ye9<z7H|qiǥowDO3OŠ ׈p;y&ͯ3mI[2C;7aҭF6{'S1K3cC?6xc7ʓ_. D A 5V,Stct"ejY\*\/uq4Q!T6np99-m3-mޮI$-Y|;yY3q}3Z5syPWAhf̂1amˉSׁ7@j<(,qe;Vhf.?Vp Ssop,sʸRZ:\zDo+BI*,炝9DX@rp_542狃286+usK gg~ }b5Ϲ*9$l^(qZgq2<`Aι/&9 1-&LI ʡ,''|Ƨ{7NUnGy a<˼sm|-]>Lj) d glKkmrĝ-䜖!ĴR'x0@):sD9ّ< vi9ְO+uN(_aZ00iya@Q퉖y.qScs#΁CqX&daaVpt ;0:rG=nV)q @yQGm^]?,ˑ\(5}V]zihh !=~?NBGQf/7}2;{hŝh[I;jp+|{3 {wd`!l_՗웨@4~4F,="\'Ď<31,3:CkX)%D;zU@t[@܍I[݁hkb{8'TˉWlM!,~Hdzg!l| R޳㊕"iy{efH+T$c@q`A 4r=-,D=3jNx{ D+{߃ZD %@4T+dؒ@scB\ST%r粝TЎ' D_@T i3û! )7´أW{I2u]`ʶ/=z'Yf{ D^{|/uⰣhS(Ojbw 4Qε~@Pk>d@i*[m D#Z~i {&?4)RC ZssW;0B4(]\yG+yoE:n}+}c2yN DvQ5{i]r]v㡁hȹvJ3/[k,b@tR͋&D ڳG ʻk<'y&D~1.}3vs6{0J DMz l}@PV {@n'\|c+5Sc eFRڝW s OiekQţe &Gԁ o .4vwNueƲ78 >+Ʉ!7*Y^Mp:-b@WG<祡5~ƈI#GTw+[FUrysL$Bֲʻj^#z.)ͼl9>@p@@4\׌u·;ן6kB/'ٞ2跂wQ @t}ܾ.`vt,5@EhT@+(4tH*ƐԼ@\SyZs|`ad~qAfs@tڄxNMCM_?xy1޲!cs֞$ DK,,yM٦+k! 9b@(x0Yvȹ0ޱ(T7%+[FUr' Dj^}TRHŁh_ Ѿڒ5LY~$rEzQihwmy+/Ӳ;iU󲆑ͳ0ҷT+lׂoo4~@n'\IT "!5,]y˝Lj[yث6^oC9;L_7[v~o D˕]]gM͕k7믯紵:z>l4T-jZ'76-c~k"D!Jrr?]MWpElڵӤ@,sY{ n D_-3]/ < T/\S'wx)h%./+kiѯ9>?5e_o֟\IfX~WOZ#L.yv}&Ugwf|1^{xI6Yt&pc7$yQ-19}<@jٗ3dTL˥y"i Das;}#lg 6fɨ 2D#YH]r`oz DGJ,C4<Qx? 2 Mx!;quG J! (l5i:ikj)@ ʹZ"D9`fY."@ ʹRQ K =(j K D2r.(K =(lO ʹr.(K =(JEN#\Q D9W_(x(皝A6U 0@s D:23}`'QC+}*D9ׯ[ol-ݎ2rr ΂?};?P@7@~ D9e zyث+_lo֗؛@ QOh(/Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q W4[89s bo7;-'٧©! r3y1 k w}: D89s b˷?r֜QFr} (5M3v_*C,CuFqrns~Xm |$,YTvYoM!=s=(N\ea y._ѓ+9J.Mz"=s=(N\ea y._ѓ+f0Y(eD?X]|;Ղ@^3؝CH'?FizFo]﷾3c+{OY؁ar] +۝ 3y`PyT.7xq09W`0sD9:+믩s{bkzVacߊto׹wjC ޥlCGi#<[ 7 2\6^kߕkkԾo~fFuQnY^6[3Fl}W[N㿕7XYy[!)@s)B__ -F[lZvH}/vRZ/O嗗⩆mIKw!!NXwC}Z>f`웰h>r~pkԑ:gOշuY!G \M5=}^6D\P&oOe;7Mz{7n*8HK ʹBv*Ww٣_v\88>B?"Pִ>{cHw z׍\TfnFS]ѩqrrr:N41rZFCH{3IjRm?5˙8|bk; Բe[xOZp8o%XC ʹV.o Dk"OuG 4qH+ysL߶g(8N1d%ﺶ;{`/rK wpy7?5Y 4r{Qm3ߪ{aV߇eK#|@HMHhp Na?&X(2@ss_߷vI,/5'aƢrβs>N pTsyѩ]yqT$OSk=Ѿ"O_ D[GNk_WWc]Hgؚd;L]3R4P@H^O(@ ʹ }')~YpբԼͦ3s9ifz}yh:~;6h`%IO}Bo ~EBy&fIdgagsIrbɩjR-@3d7Sd</;M56+ՆlI߾vnefSeMu/.+~LٌM}D_?o'<} DG$((m9$9K7%G Rs+{N Z_^6?9p%\6d;OR|5}M㝩m3<JAͧQi"-:1_ ]0OZz45 XtSƺMq=Py&R?$T'Gj~i‹q+I }|ⷯ][4#Yd^ 7Fo|+$}/r%?7nEF:P8^ :ҥѦQuflkTXSyI~P; DM}& O ʹ ')nUfeњEm@w?yn5Z4!-iI[mM9޼NwyF5u9Tg3}Cz BekIkW* (O m@ۙ{[l$ (JtX%lTwm6AoMtZswsyBEOzBMbwP5[ִ25 @e͵ Q/m?KP j9G>fPyeO&_g8 D9Wd]trj@uz3<{iDEǧ}BC:m((_]'g@4`:U&YfwT?+@GلD :^sf@4xx‹fcMB2@7(ʐ$g.oj2ͶCʞDEg~BC|݁=rW K͞_cOмuM#rN7/;5{ُ DGZ^3wcM Sp<mdT3tvZwSpd}_ ܛ3O{%<[ Dߏ^H?M:^)k|,;~_(tM5նs5U 9Pʡ`;]Ռ!5jšz|빊zBkͮnMIO7 "k:F ٦B*:KߊN:SoՆ\3ӂuE,j[Nx+ovzqxjSq| %,IvFrr}9j#5n6U_YO_M6 ߉tN> Jl6«KiZ|Θk :hW5֚QlU]gc|寧Th5?Lq hHUy9?#iu6훊SS !(gIcu][1EI l*__ɂ:G:gy7im5uv`^kmRMXO DCjq )xJ n_EVlZP$c]ҳyK9=u`YxDWW3$Y_2p8ivh'ǷO3Ҳq NOqW6f{t:5sot>YCǣ;?.wJhru|ʌ_V2<#<ë]3ܽ}b]-g8}tI{`s oMTwaI 9(`oQ3 D D3?Uy$eK N gvPۏXQ`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q`[Q13ߺ'lÊ8C$2x= (_Qsn[|a>ᤅŽCTRu7[S{{fbŎjK{aM!d{`3QoG^ Ϙ3lx~<@4V61fC M@t fDiq/&eOG Ѽ4n?r@tMA̯&lyDIqhwߞ~S= @ ؎XL ʹr&ω}?{>o'$&lyD65qDO{(،x1(x DQw6D?JuW; ٜv^L =k<@sE~LzvuqwG{"MGN!茁}-yTuΟkmQҽH+ Chym4*]6wgxj;?RQ*w!/!uVVʲ)髭'!"ݻݏN>  Ǜ(Dfnd?3Il1oƵ-ko'9o[_N.7ݫʓ9{%?>λ:3sHOjĎuOz+%N#P_1JQ[G+=:-=lAQXUw쓳= B(DfzѲ-jʵЂLbJ3⓮HG+/e#h@4#u@4z}'YM ʡ=j)[XkFюRܓN2;=,O²lh@4if0}<a- ZPx5Zo}:5[&FMe k e@4OT E *$A9uRS<ߎ/q|F c2doCՙ$|Ƈ DfnO DgR/4X˅D~w>V 7mI[ 7YLR#:.~X0O! ?yAQNI{3vVn LB;Sw D![;/>K;sɯl4[=wT[p Dߛ&B DtZ["F#Z4p'k DËgu} Vz~} &vED96"J>-'gF s3=ZwX[g9}o,<ۙ"ɑp@x 8EƁov`Mt"*}5`}'Sren\tn,4?3&Yn ;4znl褙e\@c[ee`)?mV_ᤵ\/M Dc>B4)]6 eo[_E::V[T5!(ɶ\vޛ@K#n|C>޻ ɹ[?,OjNm%Zg [66^*=|K F`5Mw :oJ@Esԍ_ G`o=dSǼCҴcڎ7ML4k@tlk5kIUeQ[6?}G D3ݬ?~WD_=h䅧=zˋ{AeAh¦5j!Ig}rvfpԥq D+Ԝ@Ɂ{Q!D/<*+l}lN a0M;i;ߟyf{|?p(!h:M4hkFDë}!Ug~z^$Rz3ޫaJ_wO Du--BѺ@'Sw|)~@nv,^_D QNfm D[4"]b>Ȃ|knY 9wKSEJ?goTs?[u7qc :o DSqWMh_5秦7M8lO ʡSh@K#n DyUشi2{[hǼCI3˸+"}D^˕ibF{-Z.m:l@ԕ Էk:# @CeD+)WXK{"MmALfKVNYf ⍦ʮkj^~c W|R :ޙIE2 Dkj(l@T5!jRdIm˷ʕF90m<+u3)7WlyeCbfAюWeoߐ}lCҍr5v?/zIaY8azuǀ5{?*I דnLHp>%.*Wfvkqte;,>ˆ',#6 Dqxo D_cTk[UVW@`e}uI׽}dQ5G9#bھ^jG`@ݱR!MtCδheCbS>G۝~2?#TGvZWע;aP.^Fǿ(9?ǯ[fDbo{(8(F*mT;L~<'#=uR r.u|}|kyk>ސQykB3oרɥO.-V9}+2uuNj5Wq뢕l> D D97k>-;+3+F@tjLSʥ{2hc~YOC!\ϸu6qEI{krѦI o*-)>j>h]46=򥟲;|/rMyIwU[+@6|îhT יJdǼ&e]t˷p&GrtrWI[u3omǼ~ >l{c~Hlu}e;nL!ֲgkjŶ~uIw7^ͽלXI Gϝ-C%Hp, O& }j8Sr_dС55ƒٴ3`(72r_r5Q_T@@uDw(@+(GD/Ku&Q-Of D9ZԿ #Q(2Q5G ѢrYhxym$/J`QQ&io!m0#R @- DڪyhGQQ6R lL q~ue_ +?5l!8hšQKQs{ Zه#$7_,QM tO~ؾ3-9dž-&pW"$8 \[I[Ee!/Tۧ%Q@ $ z$^f,Ʊh_V@~e_ D`oQV2H ڭ>*TYj4%ib1|f[L9?v̫-=}K4Ј_ȸt?=-li857cZ[?~]ڔ~;#h+_!x6O(\9ly: I-rx n9 #kj=ȥ܋[o}DaGa^ 6[fg8@-DHn"Dy=$QvzoIϋgv~[o;΂y^yɢ¼?$&%5;ThSI_/-d^_0!hNt{Nݼ&Qvq[L̈[@K^j% L %ޚ7[FVMњ`KQg fFe"Qv%ɤObe;LWPr[f D+ o@r5zSTN E z(@tyz`[o@)׌} :)|E:~,+-PF Oy.F[q8's;*Pyc}M<&|/YړCѿ= )˙go??v0X QF /!VP~]=]ymŎ"7165z_ZӺ~\K5~&3L79g[~ , ή7p#Lm}Gν㞎e3L:Q͋@c D9ښ@wAfS5e+ O_?k+^RQ@w*o=w7u/F^A;ijm埞kq2v~Qb|/{9tt[V_mg]w%h@4ng:/%V8u D̺G T֗&RRv%h 7r៱o DW PO x} ~^)<27l]@4jо̙.Z;ѩSt^R5ie rt[ Q}*ϖ[Cߛ&Qvu_:7 &5kvA ҾR~.y\ Fh)^YZ},n@^S篲'ߏhTΙƓAStS8c}-DkV;ݑpHD_owcx2]@t{Хo@4PS3G Z<ߐQ hS`NvaBv:BTc[i݋+ ?9=(3ѐ4pd_[emLj{b slN9sNZw9_11}0;,rњ_r'Q6[Z(8ca~"~fʤtDk+3"3>ԧ>8P\[Y t}ZMeCl/ O&W6q7u3$ר;ZY.OycjμF m@yϼ͖-v=Ub޻<@ uW Fn@H`*-]rG/)-2ǵ}ƿJèh4HlɌqyMG D*)ÚT${H)~+U0{=+M}c.oא;!hoe`K6[.|` $(2(G&.2{˾ϼ^eWTlSsE&?/ D ˮc[VrThw5>kߞ$[}el9oŻi5y2lk @4Ê⽹,~+v%_ D9ڌy%oVvԎlOG gH_nD;"" DO@gTihkCT+| GrʆF"z/}WC\ȧ D9=oR^8h`˳@h Uڨ@t]݁hMD(vt/I#\> D+[YΞqꭼ~x9i1jfKl=a * KQֱFh`˂7߷C]sؼw틵Ҧ#!ek֟+B ZĂ@Ppt`%nD&}ַ8*ؙGZL5n%DApJ"AqٮGEEQ/uIZ^HG>Ѯ-uVxЯlwJO D([H5㪖}ߤlO ʣ4t7ՌjQn~jQ śizDQM$=>5@tf9$ Y̢O^~u=3{3zThC w$2ZO__<*=ne٦jlxPj`/ D]`zB T.Rwc*魪[wU߆v}_ Y.s@Ww;jEB 3x?&*jB :PpZ*>fD{_ɨ!PW * U{p;]i.*ͨadԴ2ml+HCJcU5?7I;xLw} |Ob͟Z$L(:>\yw)2$x{,g OC&n:hFs@H tdtf# 5̮-.ye<ഄ_Wm {^S4]"_z;\pUkjbgͯr%[샩yS񯇵# l zZ[o헻x -@4H2$=|_TWyWZwugd-e]UVE :@K8_JC@Y[w<6j,vӷ'0m D`zR tm殫v@+h68IݹLV[V D[̙;Q{WW{AJN~x{inɦL?E KU ^b?ʿ<.?Y[A~p-8e󋇖ʓqN΋N; ؍kZ9$&t)2DD PN- w"(Ǿ*܈w] @qQZlxpp(@-U_MGpFPp훻v"VMU(ܑ- DC`@D.Pa_U wdK.Q.' D @oOrB wdK.Q <@D.æ* &MUƃnM pO6U n5(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(-(?=؀@ BPpQb@S{D~i[`Q(*6m~ Db<]W)IvJC@1Qn,{MFM(P@6, nJ 1G$tQ Dyҿ P@lL ]$/RneKy[t*)rLK!XO ӭD[Ж O3ӆ~? D<]<~FZ?dcNvr Q.*m)υN|\mсStQ]wTj`(p/Q.瘱ik?{pp @k3$h2@/(O7kR3K(p_Qn, +xK 5w@3g2S !Ŕ& Dt Ҿ(@/(O7pt@@ g{TD/([Qn,@`(OG wtQAYy~;.憇e_\Vݤ)X@;62)]u[._ xPT@GɌO1ZEQŷR'"Ԧz;O887Ì-= @'?uk\oeyTћj<>뙇Nɿ?nb }XSG}Q ODۋp#EĞiE&MbL~E`%(O+6,2},sJ zGy[AW>_=; њ&Ȼ fk,FO~DH sDyak\oeyTۙ#aWOԓ}s7$]3V=pvL5V Woμ!_M z|pGا[&O& 0>U8?u %W U|Aq[sz஁h"j$9/BC>3>_R>v@W7~{?Fߖj);F5[p+wxXÕg̍3pG|E;rn?ywY-rP1ǚpD}A8=mo+䞟'ERѐɩQ}jj-C ci ȳ2fg/6-?&5\^{>_{ޒY΁ʻ_mWm~g<䯹M׶ 8[x@q8JRCEШUF z{uf&H#)%e咵3]g|dYb^y2]>d _7_ͽV9m)}5y[ıoSjW-iG'ZI _doGn~;}[]70'ml}4^먱42ecys3zxM:.ra 2TqM}\7Z0/- -gȵxWsw\P@͚읋OE*,T D:MwXL_ vRjJcE=kf>B#]өk9/\+9NhfuXTx@HHRwYM,m,U$ RrI3z^aer kSx(;!{C!M׬F* ?=?iygUd`R;]|.{4~%|F!FQJ9.8_PII-zE-׽jf(8.曈x lez|֯+f?@X$i} Wwޖ{jThWmu/Djk@tѤ].{y f}WOԿRcQLj)@<6m6 Do /Nf)ک$ uScŋ\# 79 o^uA Xycmѱ>,`mX7 D53ݞ!O-Ҙf D_ fLT RɁhc响5-™:eN1|aEZyNx} zQxT zXC-^6|K :ѐ>, D%][!f;}‹ɁhoYhKGGv2pA g.Oޕɟ4Pde6ǰ6ʲ5ؙO}hm=x]ec{[7Oe0hav>g5i't͎X`}QFcۗљj\/&=8յ &ԙ:5 DOn8< i(%7&g3_/g9nn20ﺾWA8WmV>@m5?~Zdr3wG'ڋ @tex *~@׊'5X-{j D'|-ǿc<_[De*,Y{O{j Kv\qUd㚇[vʯ Rc#UCѷZ;ne@2N,rp}ZTh}\D onsD9]_L>!oD ѷߪՓ3ՙ Lc5w?feRihW%hW.mlz_97 DۋZO_\6QdqJ)]ܟŋK[>@4<_[2D[]Q)HՉz<[ :\@4Ket‹ Դ,p=Qh,A=Dԙz_ D竍rgnI(!7U!TAѐ>^+x3'm˼-X$wE :ye' o/@4kȯ]6!]S@tq]oý"M<_[w DKu#'c[u0OWDk+.ޤ>]9KhjU0 h+Fh{[DnT"jۄ@tMȹmk8ͻܗ@Xte^"`TOZv*/ D\SQ0iB Xj ,z f\e@4o;U @rR/Ҳn-X6m9T@ty;xq?=(!7o|Q ~ x|wAlVI)X|0L61vn\|Χ3=) ĎKU|RY?=-$)Kq~|Q5TD|}@HqUoy}䝶5P(+7zNW]] _S9VE^\$ͨگ{ښvEz94]"䯩?l.iGIoEL詁hKu:5G/)ojhH-gLzp!I[_dti[w_jњ0p Y(W` ^^U_l\x?|&$"Wڨ@ppdԚ@ґ3Vqio:y{O|*ٓmFR/z$sSea;]k֝ ˧&+uOs Dqzp &+s#<؝n~5K ⫎L̍3P@x,(< ,vLWFxLv .XQx Wgv'07z]Rc D)7LS7{#q y3YcBrw\rw1ѯO} k rEэX<@t1(l`@"|">@t߿79 dxp"F\,yQ*p2;-}cvXƉJun&;pO]>Y%iwBjkocoryf 7dt޶x*%afUڥv{pzYVjNV2<ꌱ4k1_gD{ƺbqQT jH|[65IIj] bکS+>3\{r\As_BT~3zԠZ?L/Dk wOnޚQh}2^o&|KCi^i gf~xT~VNZ6d Ds@4vOw D >9?wzLj{ZORWZ jn4 xy[6߬/ Q˅W|rx43TAuU :0-;-UQOz 2TY:OC 92BDʾg:6cԾT-Ӄ_?(x\P$pz:~7:PpA{=wifߪEQll+h!>(H^;s\3A]97Z$ mYF!o_#$)R<*Q.Gcc_RC,Nwps϶￷,d~Zp=-VݛcU Duu`xڎbcw|Kz-ٍf3nK ZP |:o֖;vRa@s p-U5]7わTN?D7(YQ=f5 Dy"WeK+D Z݆435N7o(yKm"1>Y w|{M_yw\0uT~%KuuSW0 *h“Mߌ;B ҄@4' D <@ (O} ژ,vU{Fŋlijt}"3>xԓ?֥ >vPe'i5r@4 ki,DeѷM@JO3H tfS1-ǷwR za>3f*0ʞϳg1?(;xɐnb5 vQQ6 QAm;y3QzP'o5`R{Q~ +K5<іhQ $]-WmunH!Nȧ}"O<_9hyxT@ڐc o-֬ ʆW/[fm _U{3.OjD ۥ:T;V+Q}@jW1i2W ؁Nc5wY33^Q)?]@4% D\;e穃1l8w'Cz4j1k&D}[0)=.uSq@uތ+Y.>غtIcwGȊb#`P{ ,ѪhǗzcmz^т[3bUD+ {s}ѱotѯ{/J D-ftyFV߽ѤեK;EV>ƞ@ (5 / ._*>է}-FW}Φo;v6P鐃ov0Vxg.;2cObo bgCz@O~kB X?x`nϨn=#m,XM}w(.mχ+x :vy ~5O ڷtVh@tcŋLeGfy,Q[sH(Nj zlpO-^Tp- }w(fA r|o)A⃭KI^roSO+ۼ%p@ ʣņ|-Y.]Ύچ_ŮX RWV"-Q<+a=0eGf:|ײc68{YT;\0oe p=]]{[u-OބY$knۀ[u(w\<{p (OzՒڛ@K%I@6M2.%m6psf{:kziǵ }QwfIzo)UpH.m?/|Up0o-!Eьw"oF2[-R$ ?>oOsv;^KϽcQZWwg>]Cc7^ ]#2TLiEN+<ѷ sPgзx-L]w_ƀL=VY9H͕*ulIL S zZT:iߌ /O{~Wv^+ޛ DBQXqkzXIn|б]5:Z']"Q*+r\CT z0tj9>@ }ӇA='ۮO ZK+-r$ 5e/];8~xi=~gW3 Z*ʻ\fdP{~Wv%VxrZD>AtA w|r5kXw\鶜5Sârܚi3}>u۷e-Fo댝</J{r;<9~.UACዱ f\!)띊c7_*\[g~XƘhr3?Ňaj`q' Dݪ(\QΨu2B q=ËuK&j.#F D[Z9-ͅkBjgL.-ŋlt`~QW3%mܫTD{kIWƢzՖ *c_WTrȮT[{*9g޵oF!/ fpj@s- df{nXsE1DKd@xj-u%Aw秗 gq'b/1y&i ~OΣ%*,i*njft,v 紿@#(0"v7z D+s~&`+r6ЮmT gC${iYl{ #,@2g g#6- P6N ̲’Bx'*owe .\K Z3[2m^m-}Bx'*owT{%Fpr.xs~f`+x6pmD z vBw`V|S"@(0† @oφ@mDo]Rd3I~s݂D .[!co$[|Lk2$#K$1VlDX6@)߅+E67-LIIL<'X6@LwJ$ͽv .@(J^Y[ӳџ_`X\-2n|i@Fߎ/n~Yvh/뫕&<"/n1BDKMV* 9$ g\"g>uXV%K9tcЧ/?pjWܱ2vQ Z1 ,[ |.ݶ|u&HK-/]}6sJ ׹!=6|<75t[& @m!AN%xřjznꚿycN+.ص9]Wj3:'Eіq2_Zρ+ bokt@t 3Rh׃ݟwOo;9wI[?g@q^]OiR~:޿-xpώ҇:Ϛplo/ DᙱZ65W!1Ǣ@tr w܇)ny@~7,;3aG*ojf+_x?iL&[\T>: V_*>+^2E!tI D\kB Dy]|mEʆN|y;=尖j]ƓeKVmCZ29?SDKvf\钺QpXVbѐ46 \uߖ:(OO%_#kf/0#-ML^xW͓}W\ 'Pams@+ ;I^{/wP0u$=|jov34Q+|׸X.5fv3]N]vi~)gc۲:T;:g>JJ}ȇ.8Vi%M{R/t8xlIj_X^;aVGJm'='w oו*2d khxW[I-p kE (3`m)2nP!}-rmp^տ*ȻD;[8'c{~o"~j9V}-oWa\^%kR]>~5_"K5c|G:G²!]6_;_15cgL_ˬxZd+dB@w_-yPcUN(M>{B^{5#m\׾m_䖙l\1TXG :hw'FX}}35"*v_yֹK~lqk)~5_ۭ:ԅ[0O## іRI#+l3; 'qKzun&fIihKcu@F x\u51f?ؙzžŗvϯ.I+Y6o -a3@A%45)vˬxZN awD[mF y@ D/+4WdR z׃3nn&?@OMC:;Ui8~KssB5Fjg+z }FF%&-5g_ Dy"mUk 竽o Zajn?@D oO.O zm9Y@tȌj={EOEQ- DZlX|ÞVGN/؇ǯ~?.󾱄@'n=+VD_j(@D+W]ZKڐiH :vdHs~OhK7O D D?J D^ sJ :D%ߘ5o V6Dʖz=>M-'R6Nv]V|V,폼@4݃fi=75%u hzϊkpWN 7yD[/]:m/{<*}[iEj{ooiD :.e"ނODzl@t-zȄY9=`/]!kd D[ ^Kֻ0S@tD A DWjyOu 9?ف&>]W?l{5}3IcMԼ{=a¬_|?o Δ @tobWFժvU<@' y.Upe ^j :!~@4h=2;GEOcAX?o9iZ{̟%ߌR{ѨNJ`T1 Δz-;yd khcRѫn4+̛D^((5I v{_~MǮLֳrgсNJs~NT|'i9VX?v~GʲpMT["&ȒoFmUj,~lk8sS7`co7];z<-(75kl@t[<Dye3q|HC :\Iƥ:2R{MD?|@jƀ:[yH g@tنoogb(p/>N?=8-//(r ._}:]|TH@̊Eb_=P`Q+|zMۮk hW.ѷGV><9?-*wX=Zsx'\mahrXy&"ydٯ={|xBm)RsR2J ϜB><34QkȮ&勀?'Mt\h}-&XEog]]J5Bl<6VLJH!scT@4D-WKmý={~zDGBוۍS7@4%@RYD_aܝ@G)Z=ao9y|ʏ_BE>|Wzrw=>=նx.z+'wq 2O/D5Vd8d٧kg~l Dۯd푟mD 2d8m %_*qm:aNm#o{ZS7,=goj#:ntp7N=;0cWzuU%m^cdo }*<@"]U]7 DZ_=tWh{+YfH%m-(  Dʁ}\ɧ 36?@z͟@Ot}&p/&̤|]z|M 4wZI` :YXǾGBoQӪf ',xJFCn7+$$aL@434QggfhKvY<-m-ؗ䗴n@ő*fcc?_Dr_ӟ(;je@"}' Dk[]ޯʣ"O:>%hc%j.8+$j.(>` XgiW. 4?Vcm+X֣Wt7'[< GH16¥Q3֯yGRE-_3 ۵vgܱ`Q&]\bgz oܔ dwѽ^'c=1=6gK.M _Ef౶{92tlQ.z/b X{?m ] @jX/cA#77e]^Qɶ n92tlQ.z/x8x؞ۜ2tlQdR+x؞ۜ2tx+"li;vOUO?a-+pXgT<u#HX|OɧX߹pjTzȧBe? YĚ-fuv5Q72ߌ޹9A/OFO)vsWЗ?BT'Ɵ@.8fV}3"}G [2;=eqW|qf3oD z jӧh'&W mDw"j#ZµܧԼ=RTX,_MO5l\|9|FŒjTy\fVD JAFBjt1*bi`0Vȩw_G[jTy\ŷQ,ӻ4;+~J_tqb`R~*ܹ k!SkOh$zZ WNӕǩ,`^\DkvOUO?Dy.|ՄS{?tqx5W;1?l$̨vOUO?Dy.|ՄS{?tqx5W;1˷h$̨vOUO?Dy.|ՄS{?tqx5W;1LT =U?t|"干w='.Q/B|ezgϮҍn+R|L3[SG}јqOPHZhO&? eW9d~W^í;?ܥep QYګa󚉖 DoPesA>T+UKs&E[O#$(rOeyïl3yv[Ueec W2#o~ȁ=m39ٟsW-OwcQsXU|5P`-f<&˖OuFM>MLΫ{?D][v+o }8TupWj~liUS]wE6\>(\K ʳdo?5udڛjь v'pMT^[MW,U2R#!L;Qy2X Nz\ /y~_ XX]x;QWy:0|uJT^'$XՌL&nʐ2kAyV=Nlw6^^QԼ|My<Ƨ'\v``zwaGv\=i/j=Bw{g]KcݏӲ/kk?G!$0WM  lo^R#ګ=Iqi" #_zx4Fٟ~Ϟvଅcq);o>{5:v߂(ELgi5;(#{㖷OOGW?yA>1Nѫѽ}5Ă Q3t(܏nj?AtP }zNu, u#;HO˺0w0]U~+E>aܸV>z/!|NDSW9\5q4u5w3-LJ韸-o18OW?eτ ffJ|]C@,p.%7վ#'l&fQ6s-af /rn &FÙmD_d̘QSֽvwhwwPYM*Jv`?]إs{Gk="ݳδ3!v:&OO<+'N|oj .wxAΥnb .v7M5ݾˢA^\[dI!:Q$ce@E6>]GK:QjA "aܬձrt QADAmtL:mּR>jW} :btAO^#QD?+҅1y ¹W=D2F"W7|4Ѳoy9Y" >#EQsHhfj^قh #DW/* ]4(}x28vD;&hW.A`:p.U5kR" .?TP}7Br,GΓHFV9HsѮm7 ׇf0vlEu_=hww+*x:K&*.dP{|?݈ :qb4ATgD "^Ph?R|LJ.WӗfWmEF"*f/ :쯞?40"֧ůT#ӯ_jyrOW͓҂Z_-#{@*p.%0%N}b;ӛ0ATM29 ӟ% 6~bDATesQGC;A4@5 :ҾXAt3RҰ/~ju j/ǵ}XWr[]Z+# (` L{S7gRzT#v ޮ8]lg^Y`-ffHeGpq8Dǽ@DM>4c¹;HqX2Bl1^J_:.b-_gqdAaDY]<D\ī"2Oou?5 #7DKѶێs_j3ߋH$P7 \A4J" J-h #UAD-׿RWlhBO _]HqY{q#g ˧y)(xCH*xzS|HBPHh<" >#(" :hA¹;W/>AtmGYq=3 vC-sWD\ī"fѫ^K9tv>L[WDH/;S }(nDDGg_0Aa!{z&tx ypAt'Zav3тѬ1y ¹W=Dפ:AtЦ}?vDy\-,^׾ hþ? B 1hRhL EhsY'x[D0;+ru^th^]6fEAE>UB 1ki8>^քD}]Fo Qpo7[_iO剽q4ҽnR]&%tQ8W_vwgQwb OǼ ^bGy ŌtjyVb܈{d nլ۾@ 7ۅ jya`T-XLm&qX^t"H=v 3^ ѓ@xu폂 Zs6|+pr2Kul)/C8dcl[O2gмq,A'h).FA.A`:p4xW{ц]·^e\^n^|Dµ}w(gkyT=A::DR${6:ru!eJc>LՍUѮ}>bVpxg;ˇ 0Q8c]#It{{v:D{zb'~} !vȽdGεgT$|Nw(_d׆ 2S@DA&^`c @ez| j1w&Rہk _5<O08 1Rܾ%5A`:p4{&lR0xk68~7cE: g a #r*gBz5:hzeg9vmUbX $_UlᛱY,o ^۰I4ܓP|[޿mw_gZҙJ{'mM!1m3dxMہz̺D#(ԝ]}; ]FtS, F9jϒ#!J!ܙOXƖs@*ЯşOݰXSFy+yaRY0h?^MRp7|2d?f{)'/&}V:kd}'R|XXD:HT cBYtpǸ^wuum<̬9xO{gXtf_sIp|C$nmք\cG3vx`'vI |lM\ E)ŔJ?vqUb3w,,li{EbAJW_di#e0빥lOop Xsw0~jv7BTgڟLq}ӻ7/>#ȱf~~`; 7lnB׸{X"_M:I,. .BrNy-K]+fg`#msиСYk t$nXOѮ~X )ZMgOa ]%{!#<߲iE3ƻAs;PqǠ7rxmۼf6w lyd,܋˔f)iAj8ىэA4UBX.>6ۖMqwon \ofyH ><)[ٵqï{G>*Tx0힄zK9Q^gvߧ`q۷k{`{25weQ7kیZ`M{k⾸3_yfCцv/ egJ㕵;F#E+sA1^#iqs~|~H,$wiٕKFlFCROoHh mX9,Or!{{apܰ kw-6^˻!d\ަr.Ly!bS *hݾk?6l"*xW iOϙ<"B AsIJ>-ѮKz!A(>7%3~cl9,03BAew5=g{;QMߧ=Zھݫ&}k:Pi4& M1Wou9`HYX)u, J݋rpoh ]O,DP/ M!ݘ.fHW'a ! 5xz~u?G.y.3O> /̝Ҽ΍pfcI2Q}1cv !W)\jn,d !,!V l[{]ƯDWY.D]*QNKYfb ACO{XA4}2(< v#Eokail^ӧ{_!/z|jצKޏ} Al弥\]/uMf"'r[GWbA(DD 9 8tTx!80T`10q#*2p alOeկ`K5*Zx~wz= ,U_)8Տm8^C4k..!>DuN]! ȓ׾WYQ´!j ;Ke#>[,ێ~͍^!F񣝃3ڿfZFIz}wdZl`>ھ./.',.QƯ]FDo|:7ŬO<_uk^f7DƯꦥɚwQw{kDJm׾E&A#[ grg U*(OB[*ChxTm5v4W#l_*6s86~b,A4FD AbM1Wh5h".53ѥ3U2H6rLG}PDD|f?]h&^_F-{5Wla)p´kX=Uo"r#b w#g;'*ξ"^A!hk`&p :U8 @]hFˆc"^q AޞY?WW{f#j_Ě /^~Ԩ^ާNբ""DNWu,A:J!v.'v ,WAp Hq"^M A"7ȸ>7vh*\*ʟ^㚂#fMY#:/5v5*#yTکZAtpP_}t)ξ(^G5 Ziur8؇o/ (x?(<nt # nD ‰eogC^&R^ ׬tIO!:;FAFՅ<#X HBFE z# pqh)ξ+^ m2(vy(BruN7Ќǒ.֥kANd&gN ߫ڱf|m68Jv{\jr9E Ìv ji۫N4 ZGe>j MY`u[PZ]m'{{g ꈢo|hU iԶX |.;YoSԟxK䫽C?ґE>h'.G #esӏPk/L`zeG6] p(:F(~zRW$%.FvD_H9e?*cjqL6^D0|}2XgsL`blSԟxK䫎}nQDnlGdN\uxf"'ÓwFB" 璭EŊmGx`hLii׿bq!-}bo㼂](ƶŸþu< wWاS]]&Bȃ LDpOWcE WY^8,]Hf'^':l$))a` p4ƛ}=o7biǾC7m4M z=nߪG 87ƍuWm#q¸_vlḪ=2fp)x&S)T۽e`{mޒNҍ7mZZPl Q!׶^|Fپxo1㢚xjRaddr 5"ԻB݋rY& -RNwCًx oX(@߃Q5(voUbRuuyݻ>5vczQ Ahɚ{B;S^vɼ-?=uKT6ztET %JA>SƬ*}^?kuefn#"Znd}#~v[p NW^OD7`;FҠ^L{rbQF6"h'<1]YAK"~ n69]bR*S:0ۤhyÇndg=b<2jMi1f::jٮqn%Jtf3ttD z(l(_fHBg G"@0@kE"XQoDPڢB          ?<ғ`ba"0>7X`vԉ==3< B,=8 Q`bpor1 3x[a ˰ N QAHh!`(@dI0mf};9ح0 Ey}f7L8,' ߾Mw?( G {cTx6pLkycAVslDp9 ;t3m4W ۃ kLl*s_;ID \2Cce-_B| !dA5 &6O Csa~^^t/D8! |m<F*`vA 2$l&4Ȧw7oe؀ep//J5D7e-_3PF*`QD!sMݘ> | Xq(s@bkƐT : C1ݛ} vQǵ'9 AkcHE*`QD!sMݘ> | Xq(8ꮝ!2vז!ADt@5 &vc6K7(-6`/5QѓPn 1"B0(Gş+MĚ}NOo~NQSKgBNH26zbnzc`eu & z #5[I`wl:Ic)Q N?]GAtׄfe|fjԌuxR' W~(26m^eTMos=Ͻ kr|GY:\ krz?'5hȮҙ[jΜ qR r}-w`ν6RcDv3 Q"%Fm[pۡ08~}ϰ(O Zh^c<+y\{AO򲔐k޷ҙWܟDeW(^>d^f]~Z_>gSuAIז!!>'cSTWɸ{ɉݭ?q;܀wÓ@A7ROȏҿڟvC>O]*oҲ\I4SŲP(5a돥ro[Y,Wf.nH ¡U2A5 酙7Q#}zR5bAԽЩnv5VP(~s4)Fgy}j~@#+ -m#'d|&mpΒݰ{Nn?M#f:ًedEAܻFgΜvr"6p(*mLcDjħc--{(C5gj{Ft{j U_.^P6N K *]vh N.]<^o،NAj9O"%֤:eg9AܻFd++]?b:!)ACֵ3*.IUPt@}nEQGm-FlqqG.h`{5qľڷ(Ʃ.Y jbW6D]anU!C KD_AsN0ٟ)A0 զB&ԛ*PrYX$QDE6ebxSO9<8_- O]DcJOO2Rܹ#/KuDѥ_s,iW;sD6lX'EQW əB!;j]~ 5At[g1 ݾ|:kWiThDc:A]eÎr0=F dKK&D 1I(MSuvw7>aLAԍ#vK]觹Ǝ oiq(v"` VzE=)H|vLD?Af5`n]/>EE okbbuBAu ]d ¹<ǯOuFzDj'?b?P Dmv_ϸcahf "|lI^:0n(f>(kg5w"6Ô Z+I(dYO{} A]d ¡mDJ/7gJ| vw j j,\Gɨ&w9`1onDg6ϔ) 6h q,]D{/fLTx[EARANq -Y{A17146As&&Dyq-Ћlzp;D YF8 x9v U e?e?,nLٰ٦T&yySǧ"ϓq,]D{/VvȆkAN$} ł蟾{OYG??Fw j/A @/ьrqM Η44Q De7l) v }DM15ܱ QȆkANA42epbdX3@w j/AD+:dVs'?O U  4=9h^!Zdf}R q}C"Z- Z+K_!U&?Fw L/!{(.s>OD?3 U х6Sy#?.~M =D6lX'EpO}tD$i]Z~7ݵc{3l6}/v~`{ёٖ R\5Wt+~ Ug 6v7lFkG!F < ho_YjhFJdf}R '^r4e]zX҈)߈QbiVW>UiOϵ ;h?h4j" b {!z+rREd2>[jfq`ʆHqLIGR Aq>\`_Yֈ})At%elH ‰HQF^_eЫq+Ո۔{Аu7KZj=/Gb94ُ.R[Oy"eӃ[uq 5ύ.B,ߦULeQ&M8hFN +5K#cY ϲFy^P]1Z+wIDD2W{f A!=Z_sĚB|cSH$.E+)a/!a?ƃO9۸.71dLBɂh>h| =xpz@ j'Ox$ɝZ\a.!8\Db3h<AB!)AC1qn]6Jףh?v^{ivưwAԺ'1u.PM,{Q59GtT|zBth|m۱]Jؼ7#y ;On&{JRRs=uɸFvwYAcR'mcC=߰I{H蕱}= ɬO22D9?:K ,ki72|gufRǂ ҕnW"herg_]2_YA{I[V}Ags{/4lZL^pcw^Ӄb,%5^,;*W$G2CLYAOK6u5m!𧫦 jhdV5!eNLN!)cA1L FoQCmR_$'} || j=C>*J~諅ԟ'灖.5%RSvߠ<'!|*ZhTx*M߰]{Y[^xu j*+j&,i/ހy;kd,0Z LRdh^>>qe:yZ`2&uDΊEQ^yjaЎ:_IMh\g!Fl/, nع+']d pN(5R,zgV,]  YЋS pz 5A@ ~|P˜4&VA5t3(Ja[ A VF ?iF&`KHhVAv4HmexMl(FX(ab3 k`D`7*p.jɓ?X#6l][8? FAۀ =3Q}߬5gn9tuٮ9AAsQKu{s/OޓPATϾo֚3SхhK""YJzsAD@Q8_WX_ % 9z+RJ,Q~3B;̔At F~Qp:VGp9AAPadn﯃+/PJ/T?pcL D cgpXzsAx>*upg*%Qjs?P)}ӻn̙)2:wikÜ  w2VR Jm*S~z93%@%{]s. _WX~=標6_שl?Ɯ jpԮ9CAWFiE,u˽WM=_7n2At8jtͮe|G (p)O4tkAxؔm>f_RCf\+%Xb+Ŏ5%隕g;2Wjg[>\ *nG\ ɶ|;ApWAFhen?fW6'ƿ.2xؙB }jOOn4:HC=2z9 B mX Ϥ3#Cw $}e$Fgeߠ]v,x]5ï-;)v=ʖ()vϺy3xgĝ0=WՅP pMY&yAz$WP>*l8Ogz~ Hq5rvm.-6-{ܨ.vFޮ㞴7D+1u*~5^MM9QT)ԅx],1ÍQ-(P^_EnJ8eH̤i; {T Rj3:J@: (yۖ'W' Ll|v{ 8ͦ[ P?% +Y eAe}7DBL2].#S^٬Q$B$A3>ica)ׅ _{z7}_%v:vI2xN#+W303~| ƃd0" G3.hF$ձhx,Ke\ћ$FGeWvrvA7]}ּgOfž@jw/ {y x]poIվonD$mu/OESQ&f& gͻ1jʍ̊۽ GZ*{!x jtgܢoeP\3˨DT16x/q<^0Wk^i.D-] v3v$~44AAޓ{YBer;`Ÿ 1ŸH8q͛'~rϚwAFn,v4kf TP YG(~2sWgkjyy^ϟhɦQnMjfn|{KAjgŃ.Oi5hEJ>:6fmݷLCM˂'^3lw,c, Q s"4hY ] (*1M/R-Q8;l+&.t!Z'z^<-RMA4[ީ6W`ߍAQJ ?˪̷fW弎S2$A4Dĩ9:ef F(?͋@'-7wAR.^{}f* G#uڽD9Z^^IqmM^%A~ԈA :nYEչ6ξ- i!,tV}'R%Ny7qA2/ʐQpN яFHD? ݲ{1p4Rԉh#h׸]6g9Vy}\[ 2ATy,0A`wAtp.˂gZm7NB|<*qjΰȻ-{SY -5m4+3QGnr[j !Й Et G QDM h}_w  ]wDA˂gZn^*qjΰȻ)CD:юҏ]L7=#WV ZvAY @Q8Q7'LD ~.s6&iTO}5ksזnD_;6"[Nɬα~?AT?,x0r\ވTSsEMw Iؘ_݈"7H}E#r=qnDTZ~B*[8Q8Ѩ1\A}?,Aٞrr/-.tZ9ve#qòȱ>jד˷ zmNpHO.gXݤ,~7qQw0G}"[.0:SG"5 (~hM9Q:Atd%sx&$Үn^AEqøȱ~3At8h0eGv+x]ΰN/.^xb֫Zv{Iݼ!9- y]`t'JmZr!:+qm ZRDїDr3{@IџfK-#꼛zϮRHژK_*脓7'<. "+3 &A@ Q8 ѐ՜HEJJq 개m|{ (U9.Y yױHEO7{g_n5O.4gxıl?PRzM㍞-:, o}m):~:p;ouӱ޲>(@6p4k O9x潁 ZV |ٓf'ĵ; ޙ O(DRP->Htщ^=e_^dcܥ.hf/{)ǎ%u|BgfyY\enb ӟ]6Mx v.Wn> H 5SSy L쯈|&xR91¸ Pg.*ǵ˺e!]zekT{^k]( 1cqƁ 7|j,QZHH}t!OFo\Q4>ދc-#:wAۂÎFH}FI= z ѨA tu Aݥ,Jzj%'/ݵizH ~&Sqv1әq?hn|K->,t,?7bŏW˾^[,G7#O^gx)>)[fLBu^ދcU޼=I}]nDg#>teOQK{Ajh)Q)YZnVWa^k٘g;v2%n=i*ƀ1eA@Q]~oD$[,Kye HjFEF(GE]6Nu~N%:K^~mG }~g_-9dgWLߘ5욝7]^Lf& sA@pQ Hh .P1Q]y4z(A\:p& DDA0Q([@cVNA@^#@o @?Oҿ QEx̂1f3MWR!3 !P]eGb @[Y:@fpA$a_X.Y 3 Gc/wR!'^Ģo0Fd&WDhD!~t 3(@#GQQQQQQQQQQQ8?ᅰBfga˹ 0%^]8 wS@ಁC83zoͿa;Ey mxJ>c`|lrB/_Q}D,l ?gp ^ !ۮ5Vƻ @CR09!j&F[B3 dz" Gq N95OEIY%kšݎ_MAgrO[AlSaW5Q԰k6cDgHGeQ;&]n|sV,F]1tld$(T!3C]=%Q8JcqW.< `,%|ꞰLH4S dz>55Ճ,ĈCK#qP4g,u؏Oj+vF_*>"]C+H_>j3SQ>Y.H2*H3kpS>F (p4ł諵٫] >u k!4uf=)f݃~TLHެ!N_X]S9!#V,oEF>ˎѧK_nDoѨntyqfC難fog﬌ RLƦŏArrWA@Q8JA4VZvmfD3P2 'ԟ"}\O ~2!F^ u@-[6O-{=>))k\:oeĭpb٠v۾6W0ܺh,-FQpge#S8؛WfRy{Yj -y[ёg#(p4fK|P~l8X&HimbntܧA囐}nʺԃ+^]ErS<]j=.듣H!kEoz"Rq.Sm+.Q$Dc5]rAj4J]ȷ$S;[b F*~ocp GHkF!Q_W$At &H?:_dO?OWQ3AtL*o(ꬋCG])s%rqYE]V!*c I-+8OjAt^Ş(v| gTHeGjIcd2]oS3A@Q8zeCI?3nΤA*FjFƟ"i5!vAH^P%Y^T-^.>}u. _w9ό.knj Ո,_ɻIuIKmTHq9$$=j^h ڕIhfAT=cBE+a~Ζ y (Mxrҷe] 8+uEkH}ivOSh3uBÈT>99nM *.c;+e͚+(mg'LB j4R nWDA4jeD{S>3mv{*1b'K5S)PL"ڻ GA}ٌ\E.bg .!wQ 0nJdgj(i"jKH߆ʣ  !}5)難|O>R/%T  GӸlBkGD3Jy E]Z,;+~ ASXvGyƇlѾ2!A 4b9ܸ(uڻd f5/DeWk GG?0OLN S l(e3T{&ꦽaQG.ˁ}H9x(FT _3캸p--{\O?tNHO7b9IW隨L8oBQoq"Zcp時赣cJ\v=[O*{*Q @lH:G`1z-+(L"d}:>`GQ!Euk ) fW"=>=tw+a]{ kF7D-F ,!^ ﮐ-*)#A`QDhRmmnA4 n&A5J} 'RXig|q:7]}3uWkK7RtqnYMkeE -FCbYyM5jH.\a2;*~PDG\ZK4(FAuPT(8ܬuA0WRQp#)`ӝWVC?q԰ JvDƲ{JA t`+ʠ4>b2 ( Ѵ/ʷD IljskIo xOBthD=rp"h`A^se}`9c$~\t3=}5e AtcAΫAѹfIv4<O:kaYyOGQ8e3WZBi]\bǛW!/%ЈK{D"[ǹW>qYE7@u _͐ONDo5l nA4}vkSyOGQ8WZBy C ~(Fd_S, e:εAf(r NBbFpݫAM,Zsr9GD`6dG3Qɳ ჈5%{D6ArԼCk.mu}WD, hcND{k :3>d8^z m]F K0[j9Ȕt]F-O}ASSgHؾA{jA4{3SLd*qkQ()x&!O)o#YQuT2o+O?os"u uqu3r":εpqYEO3iuA7ZggQC((t羧D jm}z 38eOGQ8 n|eEAڱ׷n O!$UcMg z ` 1rm z۠_o.f{\gF?F ֈ ^Mbo AL{ j1jQ"ș<= =I)AApHfTvVSQTQDhܯsb#^HRs(D{+uJ>'?9T"8߁茻},5AqA]VY|MyO>#u|LIti6}I  GS"Cui[ʐOk|%ZTB-Q;C_זE"k7ū?ƲHMT{lg e_7lg:J.. {L,c-] I9.s>R *SxO--fO`cJ1|u2]o[bOX qXb1MOSQ{J1U\AIf>4cUo}zȷ.Q8=. m#mz 6vK]E34Ц kxAggvu 9D-s5Avq-M D^Í/XqLaoA{z kr/)5;#}LM EdْwRBF|=DAI5;=mǎcIu/t}eS\5ϫYGj5xTA=v_uc(22¸ zsHE7Vbjص)l&vu`V#-Ī{j (i'>fU?9vEt5=ՋrGQ}sr_f0Sۚ˔Q0#}i,Ή@;Q I7B[O_MQs V:d_Τu}=0-A_DA@ Q4Q@ (6 #", (#(             ?<W~ ۊ0(SAeQT;ya 0(RNAEpZj0k:zjHFwH &,SJ%%~E洜 [  зqA%< ТG~WR⯄>[r;Ul_FBpA%'")Wl - -I m(AD2ԪLd{Ԗ*Ae-9-+=0OIA`"!YaOAE݆ncc 7A-Q_Aq a.AdDoYm('65 jQ@dDoYm(ظ,Ak a] ޲0%NQQEA3 #j3l}8vjD'm<޲Gyv'5Y3ۙ'Ѯ SS _A+O}_E6_|`Ia ѱ3_6cҢ6۾C< ie0%HGA,q-R~žfokGUUoT['-FۇȰ9v't0Z 4g @Q8ⵈTlWdȧ |W3{:{$c]OHP4"UlFm;QiYvZZ@M>p2Zd}K,jV]TX}B{'-ESF ®F֝MQඝ(}m|miid O3(5D\|[ĶNd 3#N;j$ܿjv4}ꩃq }OC7AXO|m-XD/eTAto_YgtS/vI]p ؖ2.bӲf8:¯~V(ADPb5ޖ}\mՑkO u5ArqO=OAW!X8z2rc)ߤXQ8?0إD+LJnwDuZ",J{~$˜cj ''"5 ji%(g̶ƞRiڿvTӒbӲs (H '^{u%zF^] 7BkG5A78-kΈQ+eDD,)Ǡt=)D}3Wr%LܤM]'!8-_9PTC?s ( 1{KFqѧqȜezw=De,{&ʪAND\:Ĭaj_S^}7ˈWRIISol{ӑЏ{ ‰D-iۓ[DrzECqLxD&M־}.Ś`qZNGOqQgAN7uz]v.FmJyQnˎ&M־}.T%_qZNGOq5#3Qk Z D}=1%<D-n]wdG2;WX=N(~4& `9DPѧ6>nJe t^ژjhMd4:PL/yit?;"p(pnsmyR9%gihF:LIMkߐ$ep|? p(ٵl WoP]f >k"iOǨ Zɟ^Xe#2 8@sqhז%ky4 ޸Y)ގ@hY NO^Dt%WS?SDFS8Q8_Ѽ{e[N4%m Dk) ܶ :h|Ӳ=Ƞ#5*hfXQ8wO֫(!K >p |qor|;iS'&>$l ^)`KDhbeq/}+m7}۷fQ޼?iEFuݿǷXq%iڕ'2t_71{N[g,8Q/I{(N/X<1\Bۈf^| \ׄ<5 4ڏBvҌCd۷jas(,qZA(Q8_3^/EMntV3Ԛ.'>D!,zm=q,N@/R RKrf KWN(ef̿¼0U{j|d>w_G HTzZQ{|7uB R}pAd`hػ,ő Ѣwh}ЏUarJ]!  A;D6QA.a gfy(|E_gW!K*ErB,UK6u%] ؍o!‰,%[ioz(U G7FNyۡ^Q|DḌJT%e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e pׯ_]wҖK(} G"U@%B7A.Q&܅ QD p(tDBn(]-0=UlX͛FQ6D h,a pS(t -r`ԙKncA=XlM̚((tCzoYHnek&7(@n3l}əQ7%BɏZ˱`73M -gQ5܅ QD_΃)܅ DP /ACnD9 p#(˷W$¿| D,*܅ %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %ׯo`=vDDμw X]s~V!qܲM/ 1A': /$Fc?_.FB^I?;>N~pj_hvi\+{wهDˊُC?*c~\(u3㻹+ CKg>].Ctؙ[{g;ߌ]l_iyM_s"ꪡn$tQR^y  yvllQ[y)Y|s;úDf/,efgFM۲ܣ? ޡm!2N} Qnո#h At̮۹5Azkөe1ւ;*{O>X7zp,~CqU[uA=?W ,5VAk3D<][Dw+ܰ]gs_( llH;5ׄ.}.ьtC{ߖ }OrD[n,&t!_5p+ :IDg ѢιXWҤ~־hƁ{ ޡ<]+~w1\#pG(Ok>x H64QnJ?W{q Ѣι(DB-n]~Y=1.Բc> w$tyǻDC Q/%:R $&vʞl;>{1q,q=)>Pa>jy"Qnۭ!kΖSlشvUmܼڇ ׁA Oxv]ѾIvxtm|㊍۰#!ǖ)Gv> ΟǞ6ېv~UE D |L= E Ǘ5?;Ѯu __WѮ\t}E%Q.Vł3_s ڵyWx8n0<N*μK/pzo o|㺧ېDNt ?cD_hs~H- Ak'n ڼuD'rXDof'`#D P 彅xѲv l7t݅׎Ѯ^OmfktkZTCZnsmA]~oq p3ޤ B>c7-?WqnD_oGcxZ}m?DLmq$v 8%|wKbQ.}u{˱K!_&`d> :?rw9D.nQiC&}o4pnf+k5eA4cX!KyGQ?nɞ]о k2 ʟx pI$Z(\sgA -SDc*O7ADyk|3ލt]M IoU2 w˂|59^уChѐOO h/^t %A4#DCNǞ^PU}z7#`x["^/t*sIz/|Y>~<~t  _6D.f_3Vm CV6˃w=?n[Ht lL[vKyDdžVAt&pgh/-o4|oʜ_q^/QlDf;M^Q/A(p0&o6;V֌ C3tmQ6:pz z:d]3~lc6|l\}~=6<`k m>At~K3DQ.2n^bOoGZ1]R7,y AtUA ;ge !{=1YKJ> |B+x3}lmb矤_D +9B&oYqK;DyWz䢁^gɟD? 6FـyA"2&Ͼbvc7|RxW 7.$tw n.}LV ĤKh/7DO{A4ʂ zsAtAǶAb-v|߿ĞCvx)6LmQr(K/уlEI!OWYyAtw |D^C% A4i΃%D~0^vMEWf[=O'DC>%˟6 [vrׂ ޺c <ݶAt`KaD'?n/N `U kA4-,#5XcIkm/T& Pf'T=}-x}HTb <Wb۶+Ah猪\D ѐhA4u-S]y)揺4q /Zg(O-IhC_]e7o6N5PR } qK8DǮ_DMs =ݶĀ؝30 ]|_y4fL8n ncǘuޟQnwȍ_zfewKbc{ CDDCDS?&ݾq+_%@&9.pm\k{Q?lDǶG1A4d}vkQ;v`I8 :Vv|I2uyɻ 􅯒3Kc蒴s^j<a ]?h%JQvA4p–}{=Ae {շm&eAڶE`cIBb̶I2oVqy=s` JAt,ǺWm|~C1X;?ۺ۝Dgn5jg' @ (Oex{M\rj .xC>AU/ \P?*ft3,DSSl8Df,-C,:^͟Ns^w6[οg}W $BVo{6$Lgjc;~0 ŘC`S]k-eצ%֚_+ܾ}z,} 8V C*WIpw#>O["z]z xr \n=^+u{m-3Ure[cn}͕9̟&mFwϮ-];u9 VlDP(C6{Šɦx˯IAfK| z:+YnAkduӣ ڸpW:^›ѕZя1LmY75 _hOr/{j_5?ьBXtrMΖD A ֲ uQӆQ6zm"ɸ 얤/|5{rWWә3&t픅O;هA_=: ywpљeC9H;DsU [P-a7JDJUzTFQDmTKKuޮ}NFc;5 D,O@= -Pp{d> pT_L+B$*JVOAjD.pyN$WD xI7(tqIrɫ$p(&\!:;oɸc 7rɫ$P pK GszH;^}D.R0[UCvJQ,A(KDQ,A(KDQ,A(KDQ,A(KDQ,A(KDQ,A(KDQ,A(KDQ,A(KDQ,A(KDQ,A(KDQ,A(KDQ,A(KDQ,A(KDQ,A(KDQ,A(KDQ{ٖQx5Ɗ8*?A' ?-Aַlv~KzLO@À^bٞXJT(O'w Q6g%@*A[Dÿdu\^֯'/gc;cvؘ}fQX(O d욳elT2ꗤ=p0ɟ-i^nϸ-M(OD;GI0Dy RL{ek6TFms}=\Cܘd9ݶݾ`wM;?<]T=,sfj6O޵zhvُ3%y='$Ak `EhoTD3o?5s -Vv=Dy3SCۇf–(mҵ f;z6Wmn]3O>S5QA=|}9XwGS?zƤ@mO t`8R#Ϛ2p2ܒAt`3z 7"tс-NڨE[ "?At p#(OW)~xOSdcQDyzAkeA&홙e*ADCnDDmOT Â3r*\H27~r :J^۞ID}`R> KnD'lYH̎j 6x%O>7nϵA/׊/A[FR5NiwߘW-k'tw vݸ1Dn9٘oDOkhr deC.-}t}<` Dy5Awr2gZxo7^-ƶ$xتAn1h8?5xOcRjڙ,XDqA4pAx< K ;JfXSKn>+=nADQ,A(KDQ,A(KDQ,A(KDQ,A(KDQ,Anׯ_+kw=<8 WWW_.{ЁR]{_lý|e܅ ?5^KUTޏrCDzGB[D \y)܂{<ħR pG(nr͝1jYA忲u(ޝ Da.3FM{h 'v2N/lGcTvy"Q.䢛A8tJ]c J6 NѢ)s91NG5чQ+r/#DS k < \f J]C}8 N~\k{]DVi?51 v{Q16CT؀ݾIJ܌{+W]vH腿t %%O#P_|/N`?c[n26ݞq7[&0>?^ڽԵ[2:2v]0aYW<(;Nn&2FvO/]U{ 4 |Y;Wzz]IC¤ts ۋnA45qrO_Cku? mD|tf>l1ݾlL>V3>Jzvk&߆[NTD6)߲DԓS/>jsK޹nWmOC6$DWљ+c׬>݃ݘݞk >9mcRf +2¤,E^\6 _V9!LKhA;Q(S_Q]Vػ%[mn $yjlW :6xeE/ ]!ݖ!aҾJ= ~2b?D_'s݆cJ!Q A4xI+wK J&8%ٲ{с vAtI7 '!N%@m(O>x877 K Q' wR=M%6|q h+`IP؟  rCv]̨ "FôUyl@At6|>0 Dy"AxV^\<{ox9ǨcX7uw.76p4~<(D'q ?j < 꼬/̿rK𽓄8ؒی-Ծ@AT]sNwp (O~2V`ʈs DǾ[|7ZD c¤L{q Q&݂i 2 DrQۗr7+/ğf یA7 ~*Qw KJAD5ߧRC.QH}u^֯D/䣼2A nnX+㨏.?‡WP <+~a :v|<ۻ¯ ã<+s[̓|e ίy/?RCFQA4.X,Oިl'' h wh og~o3XT0 7"P_(w||kւ輝/wmI8Ϸ Do5[Ɯ;V: P s^/;jkւ輝/Ⱦ/^w mD7|VnQA4cλ?N9mǍv_H1pX^D3&lհ!{w 26$MwY 8m-ƂhWR rc5_žvCb 4 2Œ=ot5NG-x8~׏7XskOcso󆯀k k@;A|i5M7fL^m$度;, i쐃Ǽo$~[D{Ʌ_cF ^<(+7XerKZ6]r 5nlϷ+yk8- <$f ll}x9YS ?ÇG~ɋ&M=fN旟'6ئ~s+V[D_/1p+V rrpxhA;XK.s‹fIzjslS9m ;Ae3Nၢ8;9h>?.0O&/E-u[ dno^D'_p;н3ols;gѸCmmYX׾7 ]? O˝j(\N .ijv?<{Ǘa}-69C wÃ6=Es[a(O8I'Q/A &DQS DQ(K>ϗ %}SCQ  _ w'e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P %e @Y(P ~u^%Qx#jvULA`+(5B2*,&¿DLAe'D_}mo_vAE d'D|/At\NsD_%O | {wzU'vobԙFAluF|h:%TZ#%/x'[F1#:ACjqt5H^ze5gk>j%^sBf@A;A7DOJb` \;`t&7 @ %vQ5;AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ`igϞ?… O>uD4-?Q&SDifF;n(07AFe]+vD 4jD\MB&ҢC7'*vD H=(07Aib7 A JjNd;,ֽ~-뮹# DiW欐Rܢ욿]?](IE%>̢9e̼Ǵ.FE6. ؞:݌uqϧQZ4e淜YzepG?;wםAtќ{RQ` JFߛ8˜ 2AY'(fbDi^YƵhEwAt(O]7ѐA~ J&|v^;q(07A7ոhFz (l 3ht:bQ $AȹhN/q!°n7m/SDiQJk9- Q`n(-DO9A4n(0 Jڂ(07AfqhND hDͩ[QwPoԃ Di 97AmN6|QZ'bzP`>(Da1F=0Aň"1zP`>(;(RsW/ܷˋ[q^y׸3|p&yEW8FDi݈(_zcJ`s_u)rLr-.8ﴢNƦmos|j2q.9Ec!ҺsNis+g.UZ3[-zo,~@eSM6X JD+o0l.,7yO_*z.}enh_quփ? 79 Guў0mR֢Urܩy1W=Ջ3n3g'slrOA3էfDG0-A7f.6k q\}<ӋSt#Rq^]D#^OMͫ]tpR@&ҺL*T7n.ʛ>z63㦔nf \|s63F94{/U>b!Һ}i D{^ʙ2IݺNF$h>5W o %_Ңeg~n;AtTW}8DDiݾCxIIc</θlc̴QAX JYEDkN|-\SfxAt?! JYE =@^ɱK,k3M DO JzD7OiDS-ũ_pʂ贋ވDEugC SEd^]fQz/] jDi Z4~IN =V z:+b>A`Z(k6U@ɈηEm Z9wj3^_N-UЪIj Sf'. Di Z:aVYtmo船/~P(@Guh"\M6} z(@GuY?" 3]ut\L/N IAtW)\9@T(k9N2q3a9`pS%bњsJS#Q k`+q^>pAts ,Ihun |͢oܣc8@M a @X( %a @X( %a @X( %Ҩwÿi74~챿]tOpL?4>uԢ{ JQ#" 4J8"(0 JQ#" 4J8"(0 J+?Oɏo4/JK.͹;֝>}:/~?K?I?XfcqDi p\Q`(D LB(qDI_j/sO^gΜI.^>i|i4~?'i_D(qDIB8.(0 AVE&!Ҋ +"s4>uԌ NJ_4',' BABABAgտȟY} p{o??ߚW^)Di  Di  Di  Di  DiZ4_4>g.'[ޗ $(DDA(DDA(DDA(D? Ra駧Nw*_t=i BG BG BG B>~Nkl :mɭrs=X7xb:{SԞ[ BG BG B>w}iҗ7.ynpW 6>ٖ?7.]ZJ/~q7x8paBG BG B>~k_K㗿G.꙾E7/ RL_y3ob6h/hַu]7teQZ!#QZ!#QZ!SD4~_ {o7px3_ wW^ n׼f BG BG B>~K_J7 G>/W >w<][g?Y?CkΝOzғAl/hK7u0wQZ!#QZ!#QZ!#QZ!SDSݼo~s7H'?_?/\[v5~_?я7 R"Mg\ԩS.Di  Di  Di O};o{7H%w}Ї^nw\uUҥK ˾ovn\wuছn[hhjQZ!#QZ!#QZ!SD4~;߹ӯi|7ij wDϟ? RIMU)~_o{v_BG BG B>~ӟNw ~7[oys- ' _B7W 7v믿A AV AV AV~iַ gusD7s6CG BG B>~NŜ)f=}ښ[Kj}?~ך.(DDA(DDA(DG=yO7oI-ox+= J+QxQ` J+QxQ` J+Qxߟ>`7xGK)U^xqp:׿IR鰭;w9s&rM(DDA(DDA(D@x(DDA(DDA(DDA(DDA(D?{{YqۚPIXD1` JR!숉bY`5 ea-I?QUi)&$X[C!I8sfyfg^vyf9y<(Ke/Q<(Ke/Q<(Ke/Q<(Ke/Q<(Ke/Q<(Ke/Q<(Ke/Q<(Ke/Q<(Ke/Q<(Ke/Q<(Ke/Q<(Ke/Q<(Ke/ZAYfo]`_f?ffY({!dDAQB  AD A "GY_fo|rp_noY~߃/]w ({!dDAQB  ADًz>䗛/ɟj9_|Y~Yׯϼwf -(P ^"U -(P ^.~׾f {9~?i_z9cYomg^, 6$ADED A`[Q ADED/7\q]q48IA`Q`4AQDQDNFDX(Kb @,A%Q mo7sܓ?m_ m(@ AQ( 1QhS_o/~ޓׯMf_{K|?>l m(@ AQ( 1Qh;'^q=f|g~oǫ=7fY8G6A m(@ AQ( 1Qh;oo~cgy駛wSO=,ߺux~fYDDM!B C6A m3o{^hzf=y&7~weA m(@ AQ.{=y%dvx&wx'}gAvD;nZvx&Uǩ1l m͏~xOq}ի^,?so޼9tǪ۪.lhyoۄgqVB,ps\'7\ɯ}J]Ƶ郜~[7^9a]G zi)weܞLCߌe[;Y\z'V< : ђgz;|{MD-8jr^ Zɸ9p/\y7D9a3Y2jaQvE z#n/pz*߇=bůo!хG Zn7zn%6J z\=Ocmճo1-jаsGYrr%At1n :t9}JtwѪ>~`QhIbrWAtM_CuDl m -@3+'ݙg Z8x]">ƞADes`3L/Atʃh&he" Z2 @0AFcqo?Lܱehch) >e At8aǶK*‚mQ&B z.kГwO[ggo5)Ǹ Z2|5d/9sKGFD&B Rr}.; ZqgюOnuҬ FD&B zUIcG_,N߼2p*hz 6j_{nCA`(O}~ޡo5˯~ /p??j?AP|AzDƈ 7D[ /gSъ(;!B[j}VDkm^wpApAtVe̓ 6D&B[v=} :Ѻ; znky|  :}`sQhD7?7”{%?8hMђ\C2 :EFl.`Ab&vl=RAt%J踑m zuLTmɫu^&Bq}_l<^^{O_~7ꛛK<4f++ӟRD9AtG7Π?DGo"@Aю {rSR_[ LtAt+|6DC Z>l3G >Kܻ>l m{`ٻ!a>˿|y2Apdʤs͏V3=awgȥՕ;oL'F;6^k wc|W7]pǺg=3ӻcCןV^| ښ䅴Szn?s۱pWͧmu %BB\wڵf.٤9Shwȃ DDk :hIWR'"H8?z3<(ѫ.m[)fUkas2 /*|QhaJHM`'Q("dm|Q视F`?Q'r/(q.)ЫT`?QCe]j("'t&_~=DV(jэXWﹴrH%AT7b~KDs=I:b[< Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kݰk׮^SmA\Jl̽[??{zoVw{{']y/#˼1oWtet!5zOjWr>zO)RnsOيs~?(Q='c_o&jxu aFM CǿȤ˿1o i-v~ ĿF|Cd뽓<7kȹ I/rl !hjk.o}zrvfX_8L5cA7L8oxh3Mc:KAeAth̸OʹcB ۸oBr:K*х_7]k޶S4ǎ`ؖ5fkłhyu,3E^7+[m#DX9:ЩWDn;oYN :n} A~sQ ]E 'D{7cc [$0tS۹FP`֟Dzr=Q ',% ~1G'D m5|gs.{AtST45A1= GjZ<ઘ#|&S+&վAhAtzu*~DGtlxZ]3M:emc [$ݰ.9-%aMs.{xM]NZu< E{-Kv\]Lqso 'Z&^䈪|qD5A_\8;@{LM>jaiYWz\8 v-p5 FDD{wиH# dChrnDϺl&-S%{ϬnACVxh zV Z2 C^oփhR =,rļA6gGAtk_4E1QY# - %zјcҘ ЫvD~sФ%lڒg{ԂhYw^4iXq =+?}5gz7c{m6DGG|Kmd[DC_ʵ]IĈ=hV Lþ1omi=]d䀋PJtO^9*f=*#3zVC)W8giz6ِ3pfǤ%0p'Qry/k2oX zoQtO]E#6dN@KJ\fuDGXm 5=o ~ W]oN~17c~pm%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DX(Kb @,A%Q DڳAJ#(k endstream endobj 34 0 obj <> endobj 35 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 39 0 obj <>/Length 2152>>stream x}hUekz766\5E7?t]l3u)#K9G+ *G9%) BC;=s58yQZǰ x:֣{=qϻau ṗu X&+rZL573wͫՌONWSoqQ= +5s}gv|p{\jURby_VJJ2џR[ Vb֭ufa׮%')}䑕VT-o?~9r9jj2hb". 2F%X@…Nm-a1b0;7WC}dtчyu%2w'l [2xrHGXl@%aGa ,Bt`ܴF0-lfY gxX,cn|se٘ KNZn(|B-/q{t/_sV+}Eݕ݄Dg%؛#JiAװ$' Y,d.c U?Ơ !/3XHGq-zK`Q>h54sSïA la"C@O{gFade w$f>[*%{q%':3T$3iV6ϿEan֨,.h?tZ@,^rQ}9$c/M%RG<ipFq@KMRNVJCۃиN8ltbBBкUٲ|>6Xg!&}?BIP[2A)`-UQ⤖F\GSO YHشqiBtSU0fU|YSV YDžkD[Q cv=2bD WEWF,KۖSOkg9hn\fJRAnV}CƦi6GH]8‚/d1q/CBksd[NSi,,AH8@\ [5yp ḭl˩pJ%M"ocM|5%. IC2^ C ḭl˩e_x/:w&^LM͍E o'>*-t>b-`0 V:2)N=p9Yq/G\9W:}u#`JIOmOJX*h `9)\3R]/TGNly)fUPE1ZXJEνHу3tҡ:9Yhҁ+{0Q'$o>#scL͙5[Sjڪ֮u ]n7HߏB;PXԏд`a [gRXWX]Rr * eUT3D$'Ooo&x> endobj 46 0 obj <> endobj 47 0 obj <> endobj 21 0 obj <> endobj 8 0 obj <> endobj 10 0 obj <> endobj 12 0 obj <> endobj 14 0 obj <> endobj 22 0 obj <> endobj 48 0 obj <>stream xV{L?}wfa08CDB]X]AJYXMRW].&mR55i4%4d&M_޹~qKA%s5)qǙ\mcD`mkW2Ye~_}ˆЖF"enhY?jo9 ugD֩,Df>!mޠԼv / -l>ȷ6T7fo5u(ou- WogǩC9H[YN44άhH`C+^zr[m<⩲FiSNPZ#.ЯMnK'J(Rs72S8 (}PKmFEJi.[/=&5Oyt+MROFQH`i'թ9f_*#;}ÕUxY"["?_)s+*|[ec^jJY? ,/+_yMķwq8maGD>ֽhH.L<; N\$IU:nÍ>| >|4|U WqK^ބK.\tC>A<Ο;"8K=wZ;s3j giIS i{S'S pr>d&]‰!|G|ۏo8!q-zy!;8)m 8tOqZy;o偵8Pc>ܟ}v :=:vdG]x3 mM.6إa;X#7tlױ5^cr-ږv4{9'75>:Ԧ~ٴMu&42؇a?xLCD=#է΁:mGXktv+sdUJJ X1~12;H/ Κz\4vKCD.x^g4:?>>,lwo\ endstream endobj 9 0 obj <> endobj 49 0 obj <>stream xz XW޵Uoh!؈(@2Q4J ؄@l_cI21cE'$3I31=BL(gU5w{]w=z׿V0BȈAi33H7hJZ<7%#[@V^B c~4\^gEױp71 [#€qn*B$ ?4r}F.yhn D]b{x|gI-}"6_=z|Ahs<f aj3QJt˨ J,<zmAx9nkY.}+=x%lǞ3#? OAՠUYtF3`KkWw9RPRP;\a ̻7qZ3{1y26PUXkkiU :?2̪vQZ0p+TMýSaY>(R] [MU}pEQtz&]#t\ m tHkC'9 Wu͜Cܽp&B L@Yq QW^=_HQ+sTܡ{O 1LyA:u)eގ'N| 06  `qBB>YpJkdDh. >}j v_T{SȻ yG  |}uytm!Q9Ĝm ș,rZ$rR!R #9.lX"yU 飯8W㈓p#N.=r.y v/\K:hbA9DFow3ffL<{ 4Sdn'G!d<Ŵ)d f)b/^L ۷nDZ%<'E͛3 ~b|lM42|_AqۈF8ԮRU^`Er%"b/bYL(Rp$_ԓe1L >F}$ e gw)*h+" ]a^.HM`GzGu_{%эѝi\0dGdËL2i-YydS(^2s"o+[:O<Oj+jXu6Pq+#hAlnSqkmn1׵ͩu\FWFFĈ݉ZЃ̚UE9iM4vʹA ,hf!A0`~#NkA.^jh6~%9Xr@ "@ ⾥t00Zh0X^a4-ȼ ^ޫtσrc#R*N`-bJ3ʡW)ƸauBV1sh[^*yŏT*?ϧCKF~TyJ7-M`\B XS<k  G <+$ գ &Eh2zqy9J[+PkyGN#͜\VnviLer81\hi0iرG LSt&#ӽɬ1" QݹӭZ@p~o#wkǑǃ*$ A{ .o(GWþ@9bWetյ8'cQ69REd_{_?XM l)ʽk B|9forl&H[FVg5XB~Ɖ!(BJ|P*,1<}'R A = kf3tEz=Sm3\oAV)Cpِl2(kqF4tҫ&bWk눋_>`^,5CmϪV|=P߿CgF9 > >(Z5:"Q0F`hyK2RE7YB /VYVMTse whF,TT-4( F()NSM\r ꁆ^: U8_E^?GW,ӔaXj̙ >'Υ. |u]S$%jSbPPԛ='1TJLU$_xNR>H ^<߫mPͯk.m0`hXHcUKdYK'+ d2YӢ4Dd.=%F|QVS:m&K|$Ѳ%nrWNI{V4"iV^JJtPY5 d@(PY?й]õڿ񮙳6n;cRS㱻[Ns/R|텛~ݝG$'!or`93[RMa0S1t=_?rtGpkZMdɴ!z0qgJ/Yݬ[SA9;2 ^o1 %rɒ۪pw&GANqR? 4`55,+9PU0CϨ̗G=@ 3it ̨OӘ)AA6#@/(y+KpreEn">˴kp;00smr!95vq-H+4+rf#r:?ZdiCӂ)Msͤ SkH̆ZS͂Iip#^ hWJ:ftxT>BAwI&/onV~P|g?Y *`FVKEABu\Z+]כ&$`V]Zj0zԠY\̂P&srdž˾YtJ%F͎?_4?CwGCڶ7^k>0psJtcuFkQLF$W.tA෴Vv&/2̡[ݚ}k[qP9|Kٍ{fƢ'3ʉʿ_\MNŅ=濼f8*o2EC%4ѫb0"=j>Rc, Jq1 aׯξYs#9qA3غM0~V$vaiyR t7p*C:>ɇdp ~g [ Dj}?Q&LPR/1PIn1awT1Fgˊ_HK^# o<sZ݈.h㘜8+lOspm#6`/fULRQ1%Y&1w~w\W9̪8'v_~}qP|Td xD=&I*OXB֋[z[IOYK3$Gv.bX&ڐ,y㣭rr7߮= Vՠ) ाkB⪚0I̍ 2 LASUPM.(_6;qn]*=$%1~z֧WSgݯTO u-"Ѓflahs;unhnBIP^Arlo'tz ,r7K=wL6[fز6AA|$ |Ce??q Gi|03^@ÕaOQO͵6@ Fv%ޡR|ҭvZrP>(j}D ܑ /p+B1x0pDW%N-z8s{tP?x Ar$ CV-1lC+餾A{kQa`j^`?AP.rh+%[+lZMTxYx"5`I[-xQX7⒅d1YJ'=d_r\?O<}!ϓ˄2L*ӗWrG}HOWooybWA|` ƙ(}ڢF-SgL5:-t;onUבW5j[oPLS75bگmrD僿+~Z!]~71L]yiӳl}`"A2 f ɏYJX[)T#~0iY%E*iB0-l 7隄&Q"Pڷo:eC͌A[.[DhcѷVHJ2RMr}V:jyrX5b䭥W_$s}(?SPl-iLz.}4|/=x{w+~}JT^!WTߥD7,nnlccSmfXR3vYRd&GMK6E,U{ uEjwV 8jeުXf(s-< +EXcMdDK-vVY+=[!irr[ LoWQ_3g>L=ُ(3#gB ]{tscbA+FUGxR/0&\o@dΜ,A2(:[|\fzw<©ؠض ֱM]6\" e::;3Щ[@8|c/7.8(:8 L Ϙ3Yv!ssK 3%]Uw]!,JגUʓI_ꫵ!`n`l5U(QchWR _V=ͰDIo0&j;1.' 1, U\8b8-+JH|Z!;]Z,n#G گ%P:@P|ߵ`4aAҺ *cܒGBU? 2~v?!]Tҹh JOQ P!@% Tɔ/ ,W28dGUT |Iբ7os\ d |CdZ? gT>/d^goB=ωگfCߜoLm2JrQ)*?WuI,{9!OD  /bKko) endstream endobj 11 0 obj <> endobj 50 0 obj <
>stream x|y|UukZzMwN:i!@E@ cH ka%Ae 2QEFg\ a| $ߩ|?/Eu-]]ug~Ϲ!D-09/{ݳ v<.Yh.x2-U fj忷!D=ϞPoG{*6od9pB%!ǡ9-? oܺ{|0e > ǁ̫_ynY?\/C{ <Qo ^,BG[{T֠]jοNg1#8}(t S}W.Tn}c-Ow"ao]Hj-4;h+\7 e(},zmD iXd>Ԡrke= OANtehBaZ1KÀZV[CHWR:$tNOܜ['ZO눲pnr)GpΏ *7HF?бVgouJ@h;2DC;-1}ZMr7B("091_N^Qy%B^v#K6Ky  rus*iEdr NW&?*Ry Y+Vm o3 |fL2Un@9EeMľyf&E3 3zPO*u,$_[9̈́_x#Јh8\Z܁ᄔlJ"tg0]|11{#pNT+웑,,v1., r)夃*>/mmK>06ܿv[kTUO~Yc EvQ#sP#9L]ntt\?,a<RN DX \X}555L4U]5l}\@|OJI\6eqQ(RxfzL¾ \NDٲmۖ-۶?%^W#~B{_#o xTUF1}G9*ZTВ$5&gnqOqr3ŻQF?3WRrIjf"wV.k/Z% G[뽢wko;ٴԌpaA JDܞ  w]B2l\ygcc6m޼icՎ_##9elk^fU56ͧ'1]ufs[`YJSɁ,@v.9~ڵ#. Hr0互|52DhDvV?ct|g<).g}NK=U- Áp0N.NmӃSKVWVWNܚ5mO`OpOꞴh ǝ]={hfQ\y7.ϔ+7ԏM0忰}ڱj]ӇMyzEKyt۪ޚ6%3'7UzIݞn/rb^]T#Ɣ{]:`C v%uF^I&̩%O] +'Lȕ&U`ڣ<򱎫Lkzc :~%sh6.Y[E;Ӄ N{ iny 95'avg7q 镓r2i~b hًK]JC""uG"憫c>\Eԑ'Iywww=&3`Q+uЁ)R:{A*kz`ǷԞV<੊K})Mr^N˚RZ͂ rP;f9tTID Qpo,fO0H&H&wԻw `Ƌ Lwa=gjK7_0SgkW}^Xbڇg}"0o]wL귷1^:nW[եVg!n:QMfiEwͿ+m9.!&ĬT3ĵwXbxG"5 \H{ G Z7>\u;J̚koUǃ56E0bq4գIl*)(ÄIha9T%KA)\m}uu,bݽ(4⟞F}KOӉ/W>y/Mx u&GZLLovpU۫o2EtqLR? .[gP-ʤ@v~+LSnmuLqks о,KPV-%fJr-ӟ fyX)N,N6F#FǤNIiiii5\q4WV5MRdkPM`SjCZѮlDxfycf[=~h7>܏slO;[0b|5O{ݸfrOm|hk->۸*B :-o)6 9 P`8f9DLxQNw:MDP32 4R xK݉yg@ܦ.unXqNnG@mnqlF3<'"'2tXA&b5k&E g3 1MҲtGsPCz3 (p;Gx?B)ȣmhhHh"HM$Dv"7(LHΉrT˨ RA1elWƗ bT(weZN L5QDKlK%RmԾȱN<^6"`G:L3X mqcKg/\v!'M{1>qK_D{s6I#3ѮaAVqmF9T~JTU7'<:< 0R`XAO=4Ţ@mݳ۠[MТCW6'L<!^h^bP"MƍfGpSƔ 2p AT[OEa񥺳2pˍ ƥᄡRխHH˪ZD>A mtƶm ''|6^b`I0\f굋n<=hW]:VPU?}MjꮟӰlfG~4G2JCwDs0ғ4- ΐ?q>OaPIPؖҬl8sBЊt XMwPl6lܼyǎ&rPO?}jz8=Hz݀+Qho>" 9_&e)f$GSL ϯY0ԥCo6͖dPC,kvT2/=zxL#vԧr}ן!ي{C.|W0~i1~./|9ް U)e:Uje:NX%iAQRz-M@ˀ9iK]h/A2#wÅZβtnXUTb{z)9zD 9B$H ?AKQ:?۳sT2uZr S{<8)8GM2:pĔ-|7J TK蒟z]GXL=5Z{hMdlݺeb;P=5xq\s\ʆ>IHS.u *(d泔xص|%0֖#k{<N]ӯMy<6tb I"y!+P A)F 2h(1%ms1کH>v ؅  nřFvZlC-43[K@#`+Ih\4(;jC _%Sm[;ma M0,fqE%3G:G,W5 ˉY[ɺB ss.`mlw ol];z,|~#]|w=m𶽛Lyi9Ul̙{XU37Q1P b~Rwl߾\f5ۑx" xj&z/ގ:ݘcl65ZmoCM %JPVfUd;\&X6`p[rݍp{0HX)#-5ԓr$|_M=oK l,Bv D tIVR2:+Ab1H\컛mEfh+ (4cDZ\;GcL[ S蔃#^ 鞐Km!!$!!*h%ϴuUln,\.ns_hhVxjr v=ϞtÍOuurYjn^v.V, M牃w9' .gxBHn? gWW8u. +}-ħ@YJpHɔy1m4U(v[ekkf0lxDhO?$JӃxfJKݕJ\OcA"`2WWbނ'|ocvcq_k^ 5Ͼh|VW~oO1RgAh^4Wl&J IRt#EjDӞ\=۞ݖ=)`OeO.˞\of#RZc>Ŀ{?2ŵWǩ"õ ]DA(BT뚦Ѭ&ɠ:s &=ltF:J#m8p&9׹"KmZ?a0u0M暣5j.(&㳱 '.Kqnmw;\,1]J3lJX )f(G呶mUQ=j:ΨoX*wP&Z^-U˕JJ-e2gBjWY֠ h5^z\ ꝽO;K╯B|z1}6cVKѽT*t4U&V2bv L}rOt ,> `Xæ)0n0~fBl|`|~SH,PY8x(IQOmܾ}c/a'.t8}¾Oɓ7?uqx-ޗ]eG}GI4 JfO'H構J:8ʂONm# Ycf=ɸ{!.ť oy/lGpI>yJ7@{F)\d:r85, ѹp'?-@kҬo~TByЮ}YKBN5Stݤi&MNuxjwưxvTt 3sO T%vױꡏI>]>&zMnt;fP¨CL?V@ԳKSzd̒$/P`}u{ u/[=:~x?V<ཞ~$h}J) _IQXL푣h q8H#ƎND@< \`nݥo}sU}u,5ZC{B4@ͪpS@5|MfJ'4MUWY7m%ܘsyMѦ{'[Ech7w6uN uPơQC;{F1>hlSPu45EDܨtb11H4R (%SX,gKNEH,61}s]!|ULʵ=yƲ`gd3F l[Hԉ;La01YoWի0^{q>7Xa4K^b?8-rf|ЅLC\@ePpg鷝Mpq[|:4>\k5e_sB\Z)6l kbU+ȩT&K4C%j CS$ *NrfjND>6E_7j ;)S~GhDQ|K>%ʔBD*TnF*]eT/-R>19]*q%UIг*J-Ζ sF\L-$KbaXZ*/5i ΩfFU@pzw{-T\<c׆25Я\+節I+wh*/J 'ew .VT5έBD7 NPFiaeݜ]G(ÅӬ!ډbpyaal?qE{8ŬG?r n}ϝgj3Zߩgs83y /Crrn4&љ{ ^RjYz=ۙt%M:S:]CG ap+#ӄR 1wS9B\eT{{Jg,*J2}}ѵޱ޹εݜUݪ,""qO͌{2́ՎsW;g6eG{L(!'kk;߫/1ދըbFItn$&Q>Ԣ$RB,7Kq) )Շ( ٬DJNɔK1 8}Ud ج˜[4a4~Y7u`ON1vG=\iNuiL&%fIa Z)LLd`'TiB_-˨"f ,bmķ$qIR/-Sts۪uCHcMoo.lqIѰ_ _r M}kAȚ- *qiQ.B(s3N0"7be38p$m _pߟPb83$Y~3 FBJ:RF1ʝNnRBUeAipBdR U/c}GW>Kz>Wb/sbfzJ h!T1BFTG%NӨid ݩܡNuONMM5T ͑s,3J\QReH[/r.s-q/.-N\q ::eƹڵڻڷ:q=LmAMhǷ7\kacFnh-5's >f:SNxX޲J8\-0t~@et ZfEu P5M!L޶ظ6WFwu^|ydKh5gYTb>.Ѩ81^}}Ț3h2!THbQa0Yʕc"b)LǔEGA,+,Xz#oX9M <8P3he:8 Y:O7<t&/U"Yx)*:% +JC J2 ZF8Vo0Qu04uO &_Zj0/ ʨʩT&jlWG<+ 0SdA=*49/? >ޟL_W8`1%2.i~u0) ߳иh\w,Wz*j"TQIղ@)4SDv*;6{WܣFnNBK_\fgsٻ?n#o_W2ΊȚ50[szܚl9DKU}hc"]Z-yM4J"tRPU:iO!^7 (,UBr@:Pojwϼ4VcRykB9~_f1qJoLrE%^. [Po~وydq1c1흇j?q yM9.429uSUNkvGbȿdXʳX)eTS`l45_oα ЖOʋɔTP&PA1ABr;C.9h(8BΠ͚gUDzCŌŌh'G3tJ\F<'xMlY\ X"ۆ؆(C!Ha4U&͐gت!\ApKeϚݙ&Q=QY||Qއ!k(/ Μ35-jfTMqXIȔfOq&8TН>^8`jC[Mik:O?Ѽ]Jvk6Zٵ3mmV:rG[~~\;WGGJm@+4uD+~)pg HI_~Oc WZ!tWiL o.'3?x9 ^" !_8<*U 3iJfn֬/]7ߌΏ&?g)~?Soqe~ko|bE:Ѱo džg {.tb8f|sBhx'Ω~tCa!N}L*sg5oRC['H?IMe[Ƕö{jV=]OsLu꤁uz{B&Nvh)ߩD_':)ZN4y|{ʒ%k`VܡͰ/lSTM;.'KLJNip̬y}"} /0d!Q [?a&htM|; >ibC bmD2AtR <(tX3 l5DAK{ F@Qgz<*@}CE?*F@Thh7 G#`; 1j&v4 Mi24枩'WjV~7_o>}uӉ{; Sh {*:-C3zn+K Q=y5g¨nBU 1 @֠z 5c7 dh!f}f"@O15 |:bBRum0߼׌6ڱ!49 mo*hG 8'_6! ix d:u֝, }_Gw\9*W7{ =Io{SG)Z2K-;zwvo:SC92 endstream endobj 13 0 obj <> endobj 51 0 obj <
>stream xz tTEn٧wtM'@HI K *0!3At0$ " #>`"Ï!tuZw;}NUU_+)&@f>2,5h/ytB6>5cPZ/LvBLq<7}bPo9cֳoV|fn #xDСƮxsVԒ#g}kRakI=^j݃h\vR~7_2Af@f>r&.=AY{@8 "n3Px[^M6XVg"+H3Y+\ pb A5i](ao:4Y"k]h! Us#Wj%E+T6}4MLN0t L 0L%X eIq'<'NqxbBv C`6m.Ķ ڱ,tl(D_8'2OH֒DD XiM;B9A3dPHWl!3cDKd1݅&|25 AcZT͏hT|r_Ulr\5Rm~!!b$U͢}s;WK]{v{B/lE޻vM/oBuܤ)qm˽ݖ&wK&rX8~kmS[xQ%Y0$2H%6RItT!bܱfEH,@ôhevchee=}LcD|x4t<]:tRV{VvZFqZC-7ᗽpc>\V®s~@vuV׊ū (+p%eNKpMjo.^(`B#8r^8 xl9_v9v©rK'×FwF4vN|f`'8|f>plŽE(O ;cG>C̬C=p;&^VoƱ텿ؾq/ ˡ'{C jn».; `Gcj;a;_9M;lumM-xchx}S2{}>lJp5Ul ^5q֙rm 6*pr(e/+ +{bq*[3eV ( +ڕ(5B 6 m+erXXaK8,V?8,%a,P<,|x< 9f?kb0)Y<{@eYOsaalF9L/jǦvi0Ó0&< 9LPa1llj=9L;Gx +qh#G;`$a8arxt> sD €v?w, zY?}ַ`^^Ы ġn=v9$X|X d?!v19D!Q"qU"==@3acdp so砠J.pvVY` ag1vfl3bK4V8Ag]K` (N&Ki=W4Mug@rq ۄZ&ID5T "Im8ٔFl'N6ÔxOIpDƕgjoG (k j+5XA]ݨU,n;ݔ`ϟ6..)YY~g+)ffwV2^!ӫ;_GuweJOl/~!4ߢG=`IDmI[.ǯ]Ҷ^6S$S8Qr`knj6+,R7[dٳ{?mH UƍU*w*2zHNG8δKfśiN)59HwPktvɭ%S7š qB3'< ~ƽйSmbСC+VzHjhr=D& .*0+dHeb-.Y~j$tӨ6;Q5 Xd"SD >AGDžei짽i ֭*K=C=$5aZa>`#+<KVʈ0H}"l Gpy%K~GGl)(:i={ߚgVRJڡ=}sP1Al TB[& +R#/3ߔެ:2:1e(xjv:c96q7iXSt/;a!MDI?PB0H>8 nҖtxXO!fxSDR/UĐsYa>[)x滐cw:o)SY9mӿ ^^迆Yf%˖]{|,`~Φ/ӹ4=6y۫5 Y(J DؠE¢Ms#(z'ف$X^ ؘ+: z@tpp(bNlm0FHɒ'K6ۡW4ce8@w]Zi~jIqeqTzSbi u:$A*P < 68HհƾҦφL}bKz>Yڕ 7z23'*N,v/4Nqo L*!z؝=S;n}$.L)Ytժ ׯ]p=yӍ? LURHkLEIp-8JJ=h2%c>mt-, %4<Ziv?,߽;mom[+{Sx- ΅||*"S!*,uAy!4'*/>QGh' 6 - !C>K"HP\ܼjvNٿלBJ/?i9!N8܂6mC\>8IH [/k3}SVg!ʦH^/ZãAqj(ٚ/ٳxoC,ݿ=@ѓc-~]zoل>O &8qkq#` R3 9Q`@btd5؂A5);-F=$zL;L|Gh 1%=ؠa*) 0e0eָE)s.w(`_41 jYmn9^ ^)Bg:Ek}*J7I7unq' uKV[zzK˵A$ 4F{O=4t]Jy';^5J!zrPjDhHd Mk2iMEEFUB_47Jg.r}&IoFMw'+ ʗ氬ێ ?‘ʔZ!uCaԿJǁ|ثOƳI#iJPk#`kŽq!jK; 6,fQЛ\S\vT.'f.Ŝk 3DW,Ռ[yaV\+*+Sy(E)mslN=&9`)yQf82J [hhЅ"F&e5Eiz:e~~7kP<;jK (6g1I @&]Io`m=$t7X!ݐ-C'Z[T1jsT3:k.ES$PGgGԱG^)^wg6~E^͜I?E#:'tV! =1z]fv6E؟_01T͆ K mEDGJTu=6(V i2:8=(<4|@2|Lnq@QlU jL ;5@_g~/u~7r9Ȝ蜘b(YT,ņbcYx])(,*.qZ23͓ؒgC[eFRٖ焅?͚]aY0!;r `їDLGDAEךC4 aYcK~pEL<'@n! h*GK|zdHze8ZкIfA "MV]鱊,&x?ZD8T$.Xgw13ߴorsHj%.).CGQ$C'3JG1}̈^=~24(u76|Fi~3˟){gք!3@xVU(kr=^`!2\X?lk6|B4*N#;M;lrKII7s1m1'94zA8p(k^fΤieǺ(;4sE8jUp@zD%dN'ϪLxr LHQg2/F~=ưbjݓvX S^4ƒX-D@aQHC1֔@h{!^]GSЙeIYr.[co׏42 OB$l#e^?cLǭ:@hjԺ_W ;7Xb'jHDf%pŤooĶo'bNKL4KLDJrsdJNɴ}lۥa 7TpWyᴇִV(vJBg{8-K! uNRB_(QXq:|]$ErP\1~j? m !jS7M ~p`fS)?Z@d&jSag퉈omKHl׾CRG?%絣sx" XbDBEC1ϚPZw U' '.ƜA"qMbH,#񨪼}iO:$we&طBHS'=lYfL;_t=XL.~w.8BŤy%B HLt*G &;\OHywSNѱŋHJWc!S)}s]O>Κ}ĆfsxwηPV{܇ ? endstream endobj 15 0 obj <> endobj 52 0 obj <>stream xW{PT?~.b"]e!<xA(>0 <) D[#M&6YcjHX:d4v$iڎi4rwwD۴9s=;~{.!:%@:V;N`#0&-_mw 7q|S/Cڮ  a u6}77#AO@[O<2n/ֺEZ&7achK5 =_!-\xB xko3et X&d9OH~)3]2%!/W.5ĹO* #0Ư#G #{H͈T &F#47ɍv:-ZhBn%nZ~6|/OK$jGC$mDMKesr BP)>g{QDZKPB9r=D!9`x>V򉋪̿XaIMkh+>Rl0MLTTѩlE6G7QjJYEVQԢBUVaW!E([hB4\/ƫI$.b$-Zh`L9KD$JBZ^ßK.]g\pIgxゝ v8_ F0|N`8'^?/IpWN_1( } ~S!!#empiHOha@ vPc68_'t>ۯCK>;OX}H`H`o,ؽk`jkvy6vt۷>4q^ `K<Cj\+=<ӲЧM::8 ^֚ٺ'5COt`)A:Dmyy a-zhROxDFH Xk/j zA;hQϫ-m sME֒3>/J7"X9gJI 'defO'f?ڃR,~~n{}ntj?n^T;+ĞÞ#E8X Wa6N,J SY\qqgN>ST tYq󥳞if}Қ'W8-).q6[u F۞˳O ͺиZ҆Z_vm U= *eȋ/~iMϳ]xmZ)PI{`yN,GՂx.~{fcĶǛ%W{9{5n۞C q+ڬsm^wsq.Sr}o 6GUK-x s nsJ=)[EN9d=&KlKh߯D(v9Ő}Vΐyދ+qzZ=/Μ{Bcap']5G_z^\^]>P^֭=3}tCDlqBYZ$}%2@=Z.c^ щjALH8H HUa\X`n㡰[ɢzp6|awͲ=Ej99#Ϟ 5ǖMKM̏9prgBi CL{RӋi]^%|ON%gyApnۍ!vc,Q9 6`hX^_h74q5N7G 9Ms3=7ƕM$xvD|wi9??dWM5A•SugYgZa\YN/L1ans2 pmox37H r"$wxL VC4P2R?4rrcJ# ̟ LTDMB?"8g"]a5%5rm_~6Y٤C9QiX,IwHJ~t,oe|~Ӿkt9%o~z,MbЇpnz endstream endobj 53 0 obj <>stream 2012-01-07T21:07:23+01:00 2012-01-07T21:07:23+01:00 cairo 1.10.2 (http://cairographics.org) (How to cross-compile for older platform versions (Joseph D. Darcy's Oracle Weblog))(ferry) endstream endobj 2 0 obj <>endobj xref 0 54 0000000000 65535 f 0000023140 00000 n 0000204402 00000 n 0000023046 00000 n 0000022047 00000 n 0000000015 00000 n 0000005705 00000 n 0000023205 00000 n 0000166315 00000 n 0000169916 00000 n 0000166641 00000 n 0000178670 00000 n 0000167098 00000 n 0000192395 00000 n 0000167413 00000 n 0000199747 00000 n 0000023259 00000 n 0000023289 00000 n 0000022207 00000 n 0000005725 00000 n 0000012513 00000 n 0000166160 00000 n 0000167608 00000 n 0000023352 00000 n 0000023382 00000 n 0000022369 00000 n 0000012534 00000 n 0000012672 00000 n 0000023518 00000 n 0000023456 00000 n 0000023486 00000 n 0000022536 00000 n 0000012691 00000 n 0000017626 00000 n 0000163571 00000 n 0000163601 00000 n 0000022698 00000 n 0000017647 00000 n 0000020893 00000 n 0000163704 00000 n 0000163642 00000 n 0000163672 00000 n 0000166057 00000 n 0000022884 00000 n 0000020914 00000 n 0000022026 00000 n 0000166098 00000 n 0000166128 00000 n 0000167824 00000 n 0000170131 00000 n 0000178881 00000 n 0000192605 00000 n 0000199962 00000 n 0000202826 00000 n trailer << /Size 54 /Root 1 0 R /Info 2 0 R /ID [<7B028A9D5650DC769C8E022BAC50AEE6><7B028A9D5650DC769C8E022BAC50AEE6>] >> startxref 204693 %%EOF New_javac_warning_for_setting_an_older_source_without_bootclassp.pdf000066400000000000000000004451051234304727700373760ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/resources%PDF-1.4 %쏢 5 0 obj <> stream x\oGrvCZZk2mRYRqwO|1ON2`!~zvI;zL>U]?]^ _鿏:V^h%{34C1T??cy4YN 5jp8'ۜs#̓v0X{xTf}ЊF~8@O?;x=p%\^63 .<(qGoW| e]?xpw~zA35 W¸!Mhx N`҄Dg,iTުq ZcK.I`FG#!ЈeKz.x'{sylkQ1-yuI]{ 565 >Xaqƨ.C (IhasWLdF Y| ,z%Y.dNByFu^i}oe{gi(0xv@yLd"mՏ1ھBesu=N?xw֥?Y=Be M h?fÇ'dU|zBs H/l *-W"zDvA*)@-&9 9DB ` ǨpRF5a{OYiFR5Z )ɬ2ނc 7ayj+[QȬ6Ofwr_A,0aQtж$zk qS#ޗH3iHz;`DnȓL5(}xhWVn,Wgd5ʩjΚ !L]y)ĕFF`+?+;Sr+,SWNoe{fWF,4tѯ 3ٗĴ^语2:$Vm-&. "\pvN삔O FZi}q"ISIR# #BwKuгzYoxrߥBidwwwVO]/$gd~?w=I,. 2*]>-0>;oƼCy$D D "Un R |_H!<+"{JJXyxV 9"MPs<փ^l.9l+-g`- Q 6_93kNO#w/大`-{`-%XK([6&g2'Sapˀ"k;Zv1D#rH$,Sig#.9SvTrRWh@̌`6br" %ac +NC[5:Ft)@NUk?sJQ͕_dB̏L5ֵ5ɛK)hXXr`Dj`ɞMVs@&PE\Bx~'%O*b=y߅ L;n!/UvKc1nyo/ YVte:Ylwv.owSy FRqR#.*tշFZz[AeA|/2ץ ..!Ƨ(!1T:QrToF vC%D _΀ N̆K`݉Su>k6,€SGjLogF//+ec=B_/ 7Qbc7K:BAI{3lM06@AI_F Sw $Aw(7_վLݺj0q$̋AS!UASi\R'bS[=2 yyr"RJc\"CK3F\oTYQ}{G@L `j8 .S^8g5h{HAW8#P E0+Ήpiʛ <,a ATB3;t?g,uQ1yr; p,ʙ9;ΉT =PZ]Z^"`h:ᤢfiB(WRpI}7* asqUmFToeraW6*!:LEEӽs=Hũtu~Ωs2=|smx :^賹O%yyFܜr^$2k|^QK#R0%z敃 &>3v syj: AOTA$\R_8 $~Զ9N&a02*(1+\N~,voė6%b2HA|y8TN?`{іWAFf%4,=8|/~5(kt)ՍXJ>t) K{^]:la4cnTr.V2s_?z#kP׋/epIz?aPAE/~jگ>*ڛ`Id7deg([`V^7-> &byU\^9mc@@ . fhk6T5UhG)\m,NU{ح_5 iXIK>3c!nhJ +R h(՚RR2`M3ʆEپ4)kIbR}!]{NWT_rE/x\wN\qeb!O:lEJa{n @EsPat){ǜ`Ċ3SQ`S& "E}{YC‚ Hri)knzyuuXH^-`f@|>@ 9%)@[h =_ѣŮ `N`ד&`kWU?_xt{c Vstv'v=mnoۧ/6/SЫn Ͷ=]VK˻u{|D $A:av [i uLk/B&'x{"!I (^2&h D!TlkhdӰ!ٲ(і=Zt<IˤsսVݖiӢ Ji8eLXe9I ȫmOӯ?᧕tw`iIJS OV^ss( Ւ&fq Qʶtbc?;8_Hf!H, eX@ءEIٛ o%EԳ\L-76,X%?o0!(G"D04owt*Kx ;׽Gcʫ< %"F ~JW?)`>C.s4ɣ:Pܻ@R:h ~FLLi%}).~Qa갲fOX͒oi :ɠgSJbՏ'ӝ*{Uxg4xX[slʝqp̈́.ipv4NkG/G-1+z27E ]1KMhö+Gm&T #qkqa/בw'@/|O &^v=3$ "\w. rIe:tlT.9+vqm_(D$C"/RrBRE*aEfR{hoՊ&B"p탌h{bR@xPTvg*sJT*gg )[m4eqS-T̫2 V jۦ#Lxq:?GN =SS'|ѝxلT@MS}aw&wPꆸa\v&C^c =IlFJYqB"=ۈcU i]^(b,d .(th;94vA݂8bvr#Dŏphp nm,~*tcуù2x9MiRtm$4 5x0np|JSLܦ(/H&:2F!. ~EXVJƙJ*!W,"$"-afrZ?A idd'@vv(<{_&XPg zX/NAL?2cN,Ȥ}"ͅ䫸rS8~t6}N&w,Y(dP{!'^>|٬vE7m*z:E%@^lP:!Lnu* ?!Qp_{!'CB!Nȝyt459pr.'Li".vE=!a lz ,RXO2h;Z%# 'Qhv\`%L(v z5sOlR$BZsKlc.kzMNt>d¿Wo~D!Q$3\sܼ} =_OHendstream endobj 6 0 obj 5774 endobj 19 0 obj <> stream x\[oGvNsz iHC_lŎ<,d7,fsuNкXւΰ\i6,/sӑz#-Hqb鿎moŸLn'R e J OW!dC?AE` 7 PQt/cF*QD|N>0m6k h,;bqZx5^8MU>` 1e3|s8jyF@aJESrcyӋE^tS)t1@% Hƫ2 !U֍֥܏G)p T:s4à"^Nlr,Ը!pru@."kMn# є̳Jgejb@@ AzʹfQ6b˴#Bk(xluPUYN3MӲUsi,$GFS fu;_.g늓C?'y0q VOnE}^I-4 Q/ZB+Rm˽I'%K$,ZNQH+<:׆OT ^< '9 '%Ƹ#Jӑ#Fz/9AmV;Ӊʿ.scӋu?{^,т@VdU 1z=.l1[ X2%(*';Ţ.bvdH])#@er)9lZr..Gz2uR"m¹ @(bgZ3s{_?z)bh4"ˊM3[#L,$iNFu0`U/(Ny7'<9uۉ `1NUj)>!IZQ8|O#7PN]X)K,{2,%Ò$.w^X܈CwRҬ.aLI 4SI$6h- ЮitA6M2w 255zQS 9?[)YJ2@Jqkr1!6#^*a'}UwJM4])n5HKjC,ۡo}Lmn9VV2֞Q[b}*d*'Idۋ=@:ڵ'8Ԟw=QH ŌK6cH7]n]V| Ω]E5e{_,WYΎELH!Q %;mSz7f;eoRNesDAHY|)CkeDoRI@)jkmNA\< =Qn a_>X#6a9O ysrO,AAu3À<ЎysbFrx.-quiMhĸ]A2q~:~p .wI2Zɘ`豭mBj[""sLW8 5*w}C+΅\=tچ8aE"˻ݜ 7KU@az洺MN4;O#J;[*JM`&LqZXΠ3-rg0܅Xl&\,Cnvj~}Đ; /}7 c8÷L DLd {V{q>*}؃Ïw%eL<'@& ox@Ep,'3L"txŒ^^wBj2LU='InEȠ<dU^'c"SVMSUwf깠z 菜T04| pgu,d7% N4x3|<_b6U,~?oeJoT;|y 5I%xyIG4/e*]0 ZXb\jCF cy~QS7 _/SZo(>5h!ФA6^`5endstream endobj 20 0 obj 4786 endobj 24 0 obj <> stream x+T032Q0A#9K?\!P@,nlj`g f DK>W 'endstream endobj 25 0 obj 66 endobj 30 0 obj <> stream xZ[o[FE5)CVte&t:/Is) ˅݇~{=Ř[vsf7;;3{^/ŠR?[_sR+98W2yqbt]e{H*GUtr~Z9bsF\C0954/cyu_31!T" K?}\F qyq5_?:GyJ++3RFŤjpv|IIeLb 3ؽ$Nj7s1Hńxm9&VH:%8v10G[;Ȕe{ʨ!$&ji`7N5Tl3',@  *05TaQ%ЄV*V=1 zp ! 64He0 m+AJi`7N-fNxnyqlB/`sY 8D瀟C$/OMDT“~VDC6 }n0β Z|I S:lѡm2H\b( "H FΟ4s֑ 4 wvi`|kF%SY4GdUT0/cr):(HSO=IAxv$hF; T|Nn;U5뜶?!r46ymԂ]eXCI?s쬡Zf;]\tz;Q{l^݌ 5`W8BXct`F^fMSBl & &)bjnTȽQpe-~y 5NB @!m[BT ^᪁颼e^~ڴf5c,φ {b؂^VښXH"й']AE鰪 JJt=es蕲>zU$4o7^dٚ팘D/<#m3iöcY=< վp=j=_:K] 3+R;="3+a" bZ=$P՗"Zӿ]i^ŧWOίNw~zH(W.Mr>Y}[a0XNY-M-*HhGr{gu\Hs"WlW*T^6|Mm>l7ߓMKj==o=-m6p%W^1[H4E*-L9I靅Y$W[a#)Я6o(ntm>\ol8`c[4p ׷*1\i<ׯ'8{'O&wfG]6/|Hȫۧ:?6NZϭo=q׷it=ƮǦy[nrh Rlm|2]BgL d!gUnnu.FNd8-&NʚF,U* K>g|4҅Vi 3k o2;i lG)uTPʺ?ݰa.(gN4,zl]Lâ~[ZHv0u8 $.Ebuy]d(\c`uGiOt7<ҝבih4gN5Tl:z/®IeJ-(*z$B'X1;Bpz `}9ƠBhŨ>by^Z,Q` L~FhUlgd{-Yp"%D7 $#֥Ѷp>ͨ9E A-]kV\ZC#rL[H'$4'NȲ5UHGA 1]B ! ti4 r5M>ܐSzVnPrfKUM\VxghS'*G,S/ebZ4- 5\zdBRuNI~lDu. !O֌%y8KTe D7̩lv HV<{ܚNP<~K.X6򶉢*V.gt\jBٕAݵ:q/ r+5Z:_ Ni;h*O.i`f' z}G% |c5ez,cBW4y3=.~ 9JӰ"NĤ)'q98VoelBVAEWqY9qhjR@f_>XQhG *%ѐejaJ``SH5pR8F!U8 Dw4@k!g'Ȳ5)-jHM 2 ?BZ*YX8|:Վ[Yxq (.J&>Jj}$C$4@t;dg/$e#"qdR/o]$dXiGmgHD)c$Lv'ݽit z/Pq*]3{cTyݥf&nbjٚsZG-LILwn>\-}~g7ǓMYTtUAl8:SH 8Achֻ-l~ɶBIWQȶF&M8ἳ:N]Ht|>\C]eᏅ/~ėҊȢf']|PRS.-;vWCėGNX9)S"A|2MY̥$u> stream xYnڅfXbUl:A,!Ѥ    ߘA [ub6ښ>UէG1I=>\^~~-:9^EIOXx9߭i?|7s' U,M7jZ71L]+_Ub Z&]knX޳K|y5|JLB( r<đ b;ъ F_|xy#M|MJ?as]F߬DB 1vM`}[hg2Mi,iKc{KG2SBELl2o:{(~ 0d$bej Wx>|C@fX$EER'Wdu1߀ '!ZcXfMgrX 0ĐdK]@;о`ӧѽ4XMFC8E DL?~KYXaMYSVg%#"wcN"P[u[YΠ~R Z՞ =WRkZ_/bcT' ~rppϜAYE˘iGUW|!|e/*|a ~^uqvÚ]Wzrh ⵞ'AIG%F :9Y펎'fjs!"^ ]L/mFzLYyRTla<>yr_ vQ5E@vg3}<_-*iL.89/DŽREp({Wp°A~҄2lfwj|aHfTZT@H1^! Ɖ[Dw`^bPӂ% 3Sp\av $yV)+2"id{ȊR<4ɺ:{P{iOxB,£M~ꄈwbfEEV6)=DkBcբs}YgnF1(hb<ڄhOj)_`P|Zsgn/rSeڧ|uu@sWgB.>fDj%mH$p5\|vn.3i ApՏ&%eu{- TГm:m1D 79)--se ӃœKGz%nxTZ>'`.Ͱ::],w7 whC{VNi+IcyJHFpuXak֑A&x_,HW4 >$v6 ukLME?ohюyُFΧmsduuj:4CcR0eH)i &&RDE_,ɇjip0| MTadvR".5+p17&RӷY3F9{EMnF'%2N7Oقt>sWe<7e7RL_~}e|T m Mwܑ̫V_%#b}[h ?*PxxX\|جfH`E&.޵ŠM*??l589HfߎvZ@=vp$m &=<3L觇f&7]LDP9 }tqmuGZ^oV9br]_kG9SVng &JU rA K4`2!?`TU?R.6ל1ҷw-uṰ;|G-sjԢvB(g_>bS;OpX I8mv]E(^ VwGsj9DJ*Eb ޗވ[pdjVl\.F[CWah^ ]$ ֒kmyt㧪`W4/~ůZ:u٣o6/_ۋwas9&@֭m;WvMS ެendstream endobj 38 0 obj 2137 endobj 4 0 obj <> /Contents 5 0 R >> endobj 18 0 obj <> /Contents 19 0 R >> endobj 23 0 obj <> /Contents 24 0 R >> endobj 29 0 obj <> /Contents 30 0 R >> endobj 36 0 obj <> /Contents 37 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 18 0 R 23 0 R 29 0 R 36 0 R ] /Count 5 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 16 0 obj <> endobj 17 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 26 0 obj <>/Length 94537>>stream xkv븱Pe=8rorzPŽ%}ϒPѿ@UQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e Dn_zwvG&? wO Mez/`M؍@xx8џ-'oQ.-u-4N-Ѕ[S/~nH @7( D@\B"Eog_ *E @KK]wA JU. 7N/"M Aѥ.Ő6J3uux+׽k~?d7$E @o#hǘ;vmW{3w}e^ڹc!zt`nב>+G]>t~W$ILz1x`䎧Bn [Y6OľN_$9U&(O 'uH:5|-=FJ\Z]D.= lBhG.cI?NbvILޘݥVH_ƃCL9M6wuI"9u Gx;fƴ36 Rvd_Kpx_gomtd;n$u$%PP)mO{wp|q%,-8|zu<f?g>!;6Wֲif 1+jҢvӱ+C䲷yJvK /kwނd{ ۖףl!ZNz-N4lF̛O-ߎ<+nH W'=lF :xcnfSƃ:~I|j7>q&=a#'qe[:ۤwq2~E|=ʭ&5J/ D9eYD|~Z D'Rp!MG;}y^-joUO-уaK("՝{ҏ7Sus=Xm}ECaFft iY^g-\#*F차 Dd24.~!%oa `㕁hk[m`wk2!-+r@4l}V5|R;!s~M~2. aQ?%k} DDͮ6U;eʤdR`qѹh/{`)ē_D4.3c#4وtղ@1<. C|{demt;g8h*? 43!??uT<.wjwq`Fm~yhRܽl`S \DKdx<:2)"Cs3>V>M:YMaYnzfѩ-gኁkO!Cʍ$;3z?RSh!t r68xHh:nnIKGӁ)? "h\ן߶ D%Vwۗ7NpF}lK D##E Dg,&-i<#=x DpIHr.D_oC#]I ZN+J .x'btemv ?jFI6 D~>&ߋOܰhmO/I݂Z4Y'=1w@֚.<=!sxܧm0=QПtzQ`Ğp`Lo^f7<Mbdv$2!)yO S/^lM1_[~j|ƭsպ/YY7΁k?דws^$g/`k-7Dsck.F&@:h~CD m="O? f/R-Fz3QM &7oSeZtG:3`T[? Dg=r[єu Dsul'륥鐃&`.k=}y458*rcD}5uo6{w~@˺1M T6rԌsrکoW+. oTi1! Fp ]T]}@4}$xe|{d7z`|K lM ߳ױc:ƒjkiCb 4;qq*35 ߉ #e`wM-_"u-WM]oRՎv,2890\D]l~ĬcŒ{hyRS22*Gx8 O_oï՚8v[P,w D_Y~`Oe##A~*ѷy-)G}@&ȨF`ʑWݽqwuPN_csO]z>u|i)b2zȧ:/~yt&VKy? lv|mFf |;=o14r;LzhyJ-8n=2R`T_+?Z.H^뤼}tsH$ĭ}nvtM>=qu䭿Z7ZZ$4ĝđ?UzRvDG?n^ĭ_|h^v2aD;3vꛢuryH\s`<]YoA 8mёNgOI#"Zgw, DJy 4qw D:v;vuڱKx uITo&ǩ;XF:|~#RWϼ%^:YK>dsѸþCv۪PJ׋;<{ TyE&gm2w0cWt(S};7%DM{f2l7 \BF|_.O&}_.L P@>z >z \@ (p غ4ioA2`7j+! N6@ʹSK(C ߉[NYP`Ilcy $ݔݨm}=5?#D+KT(I )Q;8Gpki6y IW޺r&8"ہ@7(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ믿^6`@;:Nct\؟@;J D0~= `[Q) ;H>f/suJ^lw%@:(wב=thۺs2r+]w% Q/{(Xy!_m\Z]J ?p7^R^":f] 0@j5^EW-e{ޕD@}0z}?0uqû`*(w'Z D J@4KVs؃/Kǵ=cH; f [ K -D_[ 2jF 0c6{?%jJ"?FDj^k0O)WQnv 9]'D/=YkG[ 歔i}M D#i7FF1fF>8 `w<ul_}7o-(w,1Hxjfcd śzϝ˾zv#t̎OAQ/{hfJOZ@tQ#M8SG>~W6n Dg$ FB!Mc-;pm~t N{7U~->SeQnF#Cj&ʏ6Nꉃ:+Bm͘@ }[A)ihJWe^롻{`R *s~plGzH sDFtzEùM2Wc;*#:IaFk ZӳD3{ڷ DG ݥSo;d_ D$j0wDW<m دilΎOxR X9i n DM f#[wI˧a}r=DxQ D+ڿJ:;d[ f\@WFYtH|en@c" D;FYFt" D D.D U D9v@tq DO@Q^ TmAҗAN D_3R+U^>eNK_#}'~-8dͯhnsf0ƛ_`w D'Y|[j$)g0zjf=у.!x iԧ_6')mHZЃ.C  D[jM.Sj+Ӫ}js#Fu=lAn5Rnhxj+nN  Dݍ|pq4x_ä`KV:.M,8=0QrRYżsaM$:妽\v\@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e DOIINޝWnDᣃՇ V`rΚК1\3ӗ (< nCfK8@tSmw,;SO9 B{"[0_6@ݘʞ;}eS-D?uQ+[@ՙd @zДc`D=_ :I DM7vຢ@tMvD7OF DM7 lr4@tQfstQn-kMA:M%]C zs N }n=r@t*ћstQK lG :@t 9@:(785]`%^jĻ`L{UWaFK {7*ҧb50_? D]K@a:}A~}łY{lp7QnDQ96&RZd|gH)XsgitG3*565 _Ff.:m#{q<:v0>/#5(7un ߒ vLg2/3^ZndF0fipQ(rsx{kul_}7y@ro$y];{i:_]}E8}-4=\v Dg?G-^7O5߷DMDB6#<漣x_;㣄3zo[upq3k$]?YqT3)=?EMd֛8^h2o 82 !(wtV :S߷g9`}¦.(!_4wb%ΘS6)=;<\6 D?VY#eW8%mhGOPؓ@;Nm7d N{n@2/1a;;T4 ct#_jmCz#{Am {rGwD%y_o5ӾrZJi9`NjFW 1IJD;nyXzv@!>@mQh} EùM3)0=@4c|AD-JSɕ0ņ D-7|fQD rGl.6NQ'D 6Ѧ}E(n₼` uxG(O  D⳧}ৣ=ю~V;(C Z7ƏGᒢd ,b r}9i D#q[_ Rv-")F@4ku(iւq@@.A nPJ fs7 D]+}= >h} M جp){(6~B&%DŁHwY.vdFlv @EK?=ᒢR ]] bUD#q[F ~w~[yi\) D?.6+oN»{ (^ D;~a@cv>]Y𕹑#u&͕l|I^pv~{>Dbx,p DӋ/D;t Dsw(o3^S][-p!Qn* w7ܳy;i$Y]Dw: Dsw(oTmF][-QA }%}-឵@t *hVw DgԼR4E }M DsQ :R|GvNIw ܋p) DgAm:  g z|~ D#;0d{l}hS(L%oz첀}@#}D=69 f\3Nkh5b}=j}c|oiW3> }EkV N 1Djz d;?ukc8%Ma]i씋c^.OC~8-m5ɅŹ@Ђg0@ug<ظ-SR|`4:evNz?uI%1c/b<LS>^ifHOyiP8{qXO__7ONy.hpiQڏm2ȭVa;8rAx ;:%S.qfEZKk=jvD#X(N D[Ou\s}X_`@"k[ Xdvq }S vs?Za| }Zk+ ^;j˂q 0m:}qopW݁4N'/li5;gaW>>&3>v87\#6St/0V\Kğa(O &,A @K pD &8"K7|<puQ(%x|LJ@.K 4K pJCQi(\@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ,(P@(K %e D@YQ_l$<)lJ1[³P#| D?dчI6 1,a DLp:(ϧ4!b DGc' |`Q4!mg D῾0kԠ;&9tylMDwOhJ J#qnsplD?~2فhP[-(@ >3HQȗж~QmDM?ODǓK(P@G, D-4韞t`rX  Dc_;##@&*hN ʭrQ0(5}fюק0H z<` D?q]$\hG{tQn*C_?\ :s DrS)юQStȓyhw655D@S?o9\ıe;@@;µ&p|ϒ D+r; \V ^+$uT9D &FZQEmpA DQ[7xze #A},#DQ[$+D~ j(0AD.W)L-Y\!тhZseA&AFʁ:>2owP`4('6 0A -hAM/1 I%G#Ѧ6,N]B$#A/!cDQ"Xv_,. L%GhӻoRF&j[~ʊdn6tQ2RAt{YQ{t'l/*B%_gq#[3 v=e ڢνJ:DZe ny,?q1{J%WYfl]C_` (W?_yKij4j(02A*dkD- Zs-SH4ݭK}Q`X)Q`X(D(0 5X.A , tUT䩆K'] D[Q`yQ9K H* j(\(բ K'a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X(0;vo߾qv'BuK^hQV?NQz}DlF;Ů(04ALլWz!CDT9yb A J:{b A J!CDQ Uz!CDQ ˍnxޚ~-s[|+@"U] 5W\8QvE+\(P JK^(d6Ka Z#kcڴV.0E%Gomlxg\eA]q|ni@%Ap5[ʦs ZD+n ZTA$&N-?l Z,o'QU^@%SC|{eǼ׮DTwD,Q{ D+K$?;w)vskQ`h(-Cb.O/vO{^Ǽz'|7N/OTHVnxQr"ԯSϽPc.nk\^ˠ pO{WZNކx\۹Yt, A-7VvKv/1tyu,+\jioFq^%cF_| KDhzL;K|iR hRuojnѲ?6谹w4o_`8(4\䊍 S|pkhsx}=96YyJN/]T׻=DG/A-7ּ]l 6viQ+jzr=i]T7xtye)#D]L:Ѿn"]:gN֏)ѹtXԴ Z~J_.W . :Y# c>D~mW9(\([woҤ-1vONͬlbL' (0A Mjtrh_j).k3 A?! , JѦg5:q R#rl~h ͌vb 9Dɝ Jًj[t_pʂhڈDE%woU }E-|t5TM/1>2wvWhY]Dɝ 謦[M괫YrXkMDWa3sϪb}(@Qrmm}V#+RMZ|p;oQF }LG^_(NmzV#VMPhAiD' PDɝ FV͢S{D[+' PDɝ FVmJAt6đD (kV`AtGQq^@ON ZgRkYGD]AX;=:T<֧yI]YkAJ%wE~k њ(V>9#D* ji^ #A7kDktD["ZkmW*X"ADwU\{"^\|9Z.+ w-ξ\/(9{Q~eYM/֢ŭsnKȠ}d-{ه*ɒO?yV櫫|W]Muy̞"h*YM_f5_ɂ(0A uN%T.:A=X4PYbl׬|aDk=/+_^_GX :{ Iʿ Y!Hk6%Z}]%w<-@X( %a @X( %a @X( %W? Ϳ/ӼoF l;d['8" X(Dֈ &)A`@k(Dֈ &)A`@k(z}wޑo4wi>x`fii~q/L1i~c?" A`@/Qr!A J.Q"DŃ??~J _旽i޾}{'#8p@'7|?|ߜ棟47 DɅ ^Q(D֋ B%(zD^bD{L?g? ipsvۏ~k&o;Ӽu! Xa(DbDFQr! BADw9i~M?iAVI{4y6Ax J.QQA\1@#(DbDFQr! b*^Mi'sߞCiDD%(@<(PI%(@<(PI%(@<(PI%(@<݃7ߜ|OI5\*?,Ƣ_I=4?/'=I* BG* BG* BG* B{ַc=f`9{/nb8裋O|bɅQr!#Qr!#Qr!=xi~K^R կaǥ 777a֭S[SäTm_c J.QxQ J.QxQ J.Qx뮻.'xb1b~V )g/|_bfhh7tS1p U x J.QxQ J.QxQ J.QxQ J.Qxk6ͯx+anM/ 7P :)OyJ:}n1vi'?;hm۶__ |+(A\@%A\@%A\t_|)?\ >|>GQ GuԲw}wb8aΝpaClhK7կx`BG* BG* B{Mu{!u;C~C~:ӋcZv2~_,o>bH4]qb,ykj=<@%(@<(PI%(@<(PI%(@<݃W^׿Ő~J^x򗿼7áZ ,2o~S 'pB1ڵ$VS* BG* BG* B{+7qwկ/A_N~ zk1wyŐݻ!4LJA|1y晋Qr!#Qr!#Qr!#Qr!=~HbH?%};I{ób8s/W_] \sM1zpiCs@KAӟt1( TDɅ  TDɅ  TDɅ O O}*gqF1V v[1wqp'Cv:qH sN1{SW++:묒I(DDJ(DDJ(DD?9}1oX ;ASMRܺukōbx衇E/zQ12NL/^ve7Q!#Qr!#Qr!3fMbw;+'r}ėŰk׮b89;OIuϞ=Ű{LDɅ  TDɅ  TDɅ O z嗧*CKwgK s޽{+([n^Wg=~ZK.)%& BG* BG* BG* B{ݳgOwU ,?.͖gO~b'?Y Gyd1ܹBGsΩ1` J>QxQ J.QxQ J.Qxы.(9SG 9ܒ\zŰ{EkBG* BG* B{SdˋᤓN*g>K9A\@%A\@%A\t7|s[ ?p1LR*_L]4-sΝ;a50K%(@<(PI%(@<݃( J.QxQ J.QxQ J.QxQ J.QxQ J.QxQ J.QxQ J.QxQ J.QxQ J.QxQ J.QxQ J.QxQ J.QxQ J.QxQ J.QxQ J.QxQ J.QxQ J.QxQ J.pw?Ѷ@ &y^fAHQr! BADɅ  4" A AhD%33i^@sikIu x`di>죎N% A`@/Qr!A J.Q"Dbo{`b^n19oMd4KA` @k(NZDAXu(К %a @X( %a @X(LOOyS|a]NV Q0Q&!4A A}םio|㆑w9ǿi>񤗥y۶CZDa  Q0Q&!´ .I{;K_R';}MiDDa  Q0Q&!4A AM=~$8r=3L]wݕ櫯z|?fAc]ÎNc 5j@. 5.T !ᚐ_RS iY2p` &ŷq#,p X/;gΏ9sU;s>b[Qx&,Cg(2Qx&,Cg/wO[''<ς(@A D A [˗/#grvܓ|o3 2aӟꫯ??GM\xZK ɑ/ w <Dn}˅1(ܓ^ӆf۟(HgkѺ&N3'<:2{W;tQxp}ko#+;MtժDQ8Am/b??'?|__?ϟ>}ښXxͼp;?骕 ED٪A%`seɝ09>?DQxv RV\I tx z"(\ ϖ iDwD tj%FDQxDϏW47/LL M+骕 ED 4@VhA.Ngh=U݃_k!TAtժw=7C9GNgW!_7Tzz[L2=P9s=Bވw!6N׽dKO3![utU~;$IcL u:JѰ`wjW<%.nAqVS[W o/]+dEAl+OcwwWя~T: zDs6TQm,g[]8sn1[Tɴ ӛfmߥu,0ZurDuޙm&3E-jus˙C~oĀW|$ߒ{Qgz0s2}u V wn" [+LZ_i-(ܷ˧ת{]\x 4s9 t|» l z:R ē6{/]hA4sS]#ކɜ=*i \ 2裭8??nBK .琘I ow ^<ѮGYh*pR(<[>~ϢO1_hWNND_S{49>IS ߁T0!A]$~̢!/D{ .f"[~&NGg w-:Dc's |z[4f.=#³ 1g?Dvh}`f :~+ND'1NY`a(C<2wkEA L}Uqh iTx Z|87@ DAD?.|GE A4jU2ѭQ&³QA\9nmw ng8h|tQx&Wz4| 3U˰h5hѽS(,CgA_??co?o?hQ]tn?2zwd Z7r*3UӲQAȣ78_kSDA֭ߥDG~qN45hMr) Z (<D+rQƆT">v z+Ih#w:+~tȻ AV{9T\DO&f~p -M$ϙoofS|?C 'N;f#³_l}o?Y-nEe1|bZ9^W]2sb=;[*ƾˇѧ-=&٥[e 61tJ\<*ZmNJg EZ>rQ}i 5Ahݲw!(?, ZztM/3CӧPKDAD l3 fޞI -}v8 ۵l]ϸW{,hA2 ڽ#³ n˳\?<[tҩn4Df;fgo}IA,# EEe%ݧ O e1(!>A}ǧp(VRRC_Q*p( yj("MJPF_{ EOt#fJoU k 1t:Q$q.uG(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q.-%j&Lp<Q.1)a9$0'Aˉ 7 loYο!{ Q.-?m53h.s[zCB Q.(iG0n-X~B(W ri)DN,?A+D tvR U"p(& ډ \ :Bc lZsK߲ӊV/2&v}G `r(6,&Y f2u?V qw|]h+nؖ H(D+X¶cu4\1Atkʞhwl`$AK _-)sx\2eVϭ{Du|v+-Q.~nQ/\Bn6.-TDuPO >'\ZfЖU781-FR|Tݝ ri-zl2chѰu˷h|;^݇ukm riA4 DUA41`ZT rik7?B60Dx މ 9Wl.s (ҟ>2uIA4EA4g.?`zA40 ʥgնD]-Vo+<&c=hzD~)n- |T~('"riAU1CՍ)6!Ij ʥ~e+ |UrFy-Q.=./n-,o=(q4 -Q.(7 0yX Mbŋ ri!enk4`1s+Zx Z4`>D ʥDD7[x];@Z`ZՏ ;7A}LAzDCۅsjhbĀ_Z]jUjhꆭ{b @o(*ʜ[oz疹ͅ[i\wWN\1Tр[A}Л -Fcf2aA4g6&o[l+q Bp؊ ['sI?7, $De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%De Q`Y(,AX ,K%>b?}FN B{}u񣎞D>0@ A5_yYIKxZשQAO$g eK[Qw^dpJD:\yD= J Ͼ 09AG{,W;D%i³o)LNfi.˕NJ}yoAA|}>J ,9މ w, PJfq믿D{'ܱ2@)A ѩމ w, PJp={W;es^>J o}7w.nza[^ WǴ!=Ano3_=?8c'{Du_YĦ9ꗙ3ɢ+ QCŻҹl7p>-?}MS''UeQ/-G=tvlLN(zK=.&טA4eP ޖO/ڟUu}̼;-hoU_ZahM{4A.!~D;R)V΢sjbz׉u=:)ך+=}4UZ[p>FG# zKJ~bi5hUϗʀzkќU߾Uo}Zk9h^z;"}[OI+],Atw~C׭rכoDo>Jhr3pc_mg!*mT͹,L-;5ft} u&L Lv=>?u+Vig'W;; ((,n yj,V(X^-PǺn"Oq_mGDaeu56$?5Q +(W*rW*gvϹ*u3JΎj8 +Dj$!+J ! mW _?u+Vtzvv `f(:7>.ӣ{_5. X/VD{//n(=NO Z^upW;;f0?AV6>-w  O̙كhT Q/ϐ@f{cOȉCOk͜嫷eggTNA5aAŹ^+x=K2Y)zK=Mm[39ώy~ 0x8ֶj\qRAtV<$3dy-sFh?ChxWh]G'j\1 z&@f{vOl VL/_)nΎI~ +m}wG].%FMf&@f{vϩhSb oQg?;&p"((N[Coﮧ"*1rכiXb՛k g$trc_m"%d65|QiW 9~Z}%,/m[l7Eڰ+g1oss DNt(-Qs1ɹ_8;DNOerlqv  `\:DNtrǛCpvLHzz 0-X %Q`m(З D @_(LN&peIQ`Y(,AX ,K%De Q`Y(1>}7:z"[f61 ʰ ~kQ P.>^_œSBܧ!DG$qې_cx>>Mr7E9QA5sQ>xRrhn(p{\!7(jsD_W Qw|.Xx7>Mᡔy ;v[X;a F3.DpDCD%r5z8>p5(phuf2Kͩ%sH<:6xq8r|y\m9lg6 8±W#D_S2iW]}w=2ZѰ[#g;NïrH4䃿ҵzQ[[Da~0z<{9 :f|jQѢ鍖;N`,)tط_0uH;[ ѺqڏA4,D_ cFk˗D:A293Lϭb&u&o5`yb2ꎢsXSMu g J3>p5(\V D{_ݺƝj__+&|~V61' {~nFѐ3}EӨ]9@]> ,OKحwch݅vN? it :!|zKQIʏ=gh|p~F}n~i$Ae._N#;>p5(/&ϟ|]8rNNr :a X=?IYe Ll*EK1):O[UAAWDoCAtkƛtقe%P-D3w\1._W.{ȓZFŕۧ}QWϜ!~]^-sH [Aq[~gwc`ChȘuF8v|jQXzAe' 4fo%dhz&N{ zއg [e1cU~[D3}sc6OBAAVъ/1'͙aT,ykM\2sH\Hѽwyd[ߝIݍݟ*DDaehԯNO+s s{Q6Rm7A kW-~dnԎ:#sGnqsъ%oh2[7{/-1Ũ(A'V? z 5n.|aD3 RC;fi]A` +mkm ԯy"#7Ծt|&AeA4gom7p9l4MzWDX((/SXu[_(3sh$x5B3W/Y=e;isd&Q&*>Uawxڇ}]hz+7}k9g};ƛ{Y-#iFmcR/< /?2@Ѱ&iCb<2qN'xζZ6bH z1K5?qFkʢ#k R_rkNЋ=&:D,?Uqa:=xW!ZDw:eN{Np ԯh-KVr֚|XoÏ[1N'xζG7Ec1frމ9pw(0Hu܆ s䬒önm7ޮ8z/_'sN"t׭QW VyYǘ˼u\Ej8s@9c7rc9'>fujWqUm [WZnaN#ҍ Z:~mEzDAD3~34lb=Lҙ!oѺ 큐1۷% eAiA\":ud̳:5ۋz& pD (QC5 D 0 Aٰ=#` %AKD-(З [Q`Wl`AX ,K%De Q`Y(,AX ,K8ƧO[GOdY{xl{>&g#԰ že[q0 tiOb5#!qƻSh'i#wfζBޯޟ>cA$$~8LWf;i?Ǝz/D>+W9׾]ng1ֿ8CBg}]&6v8)A8 *AXk flǫvI˰.: :!{禞"0$ -+pQ=*Z&=􊻫ҲZF+vkuw)rCƃ|WV#*1g n&=19):}   { {kyZs3 Gh{~w ~RtD3>0?A|2~hTc[&gṲV7l9d=$dEE0gڃhD߯aK;9ܕ :f|`~(\c}5u<}VL,d5lc.:OD9$+]I*?n73 9U۽|b]A NwÚhݥvNxt`pvx]>V%3Y/ݕ3N6FcbvaI['2k1M][N{!Daq5C&MozG/<[ux :!1l~ -wzRky sW' n͙~$0m7v[ -z~QAzs8sM QX2AtyW̐.Jo9#ƪ$;aAt. QXY] ]~ n%d$hȟOE mwuhFEMA +MtKQ]v-xH [Tݱz7iϧ(϶Y9a6O7 Dae?pbݜF]kM\2sH\ֱ{`/D)ЖٮD;}RC_G(D'ъ_3+^2D;vϫ1AtΖ^Co O5+і{?2.Ph {կGÁBj-N&$ъ\DϲͅÖthPu zzAoc'*hz_-/$KݽV@}]hz-AT j {gAtU: rQ&:pE~u·{I}E9$,#s=2J0ۨl Z73|[?!y Nqs(2\͡e*Ͱ|XoGQ-otz=8َE.xw{)_pj(0Hѕܨ'g̭ 1tz&6xg[dTD$n2cgO޿Bpெ"Q`t61B`[&lnwVxkv[~faÆLp ݺ) eB8 aD_V}g銮3G]髨8Izm%1ѭUJXݷ^z6T>>I5X((pAEl]Xƻ\gSuOREX c|}]vłpi3wN!AjQGhgݓЛ {8I[ƹ8A`A8QAuA; _'v'=:!] 0 c :VЧQ&tңN=/{  :H8۝F>~`}#D5঱سndĆQNҨ~˶m1*~sFkDc,DOqA$X7uM3 Xi1sFkLq&Ƭ{z3g¿B;=TO?G#86V^)Y۾kJ^\BfM7A*F4l+M5Z8FO"Ѣ]qLT J ș Ce^C/7.#oRtX3C̷ndoUhE4ɐ5t&Dc"A4/-v3Ə QD E 'Dַ򾷗ݵ?9JrT&du˗ΧhF9lj?f*PwzND[z !k80A.!~D窡̛2ɤZڃk쭟E["~Vkt`˧5Ãhэ3|4Љ ˯4v~*nѫXg:sfdE?-DOҊ^jAw|)~SzL-*hz xQNkyl**=Ɵ-WDF0n:X&*mH],6dW -390Z wIȱ}[~DKc X D MmYn&hzt-vw[Ee3늂hP e`I(ѼK&@. #.:cϩ2!Atn-lANNDX+ZX +DvDvъ;3X7HN'igiD?{w$+s 5~_,¢Ͻ猺+ѕ? D؉@v3+!:=J2>M?zN cœzEQX%"]$m&-)` ly= ,{7nz~{'yx 0O"0@g2:86%xNcsdkg6AXgzBC\?@4s DY4L4c<0,u=/] +,阑ځe6UysյQn@CMzh[v^mDc 2) 0c|#0kNP7@4{$N,er49)R}N=@:VDuOɼ[ Hz,5#cɾl_{'l}L '7?/.pڢRͱb48xV Zۼ-M:Uy[OeK"48/pцC%us DǬwxk<Kg_05Veb zY]TKYX.!~ Hk; ]TjXR*@&]ed>F%bų:R6?}rsQ`k[ǽ D9W%%(佑Xؒ@W] UV~}*- Dx`&|ܾ @_y'|B CDxQ`}Qx(E, L !AA$lL lK lK lK lK lK lK lK lK lK lK {_?Fr;߇Qڜ܁Xj 8;(%c2dN ,|# ?:ۨ9 #|n,+|e D_&/h;ڏ۴R_u6R@av̋H sQjdlҶ$/_0d?=߉x_]Dկ`F}ǮUg*P^80@ `o.NIWaj&g<>GQ`ڥg`N$ J ,mfH )gȸɀ@4mH %@fIwj4H Ml Z#(0@$;i&]M6(2>@׊kj :捻 -fKZ|ϛT#kj!n: _> iXan}(0wo,ضd!ݾ‚VlQG=yګᑌ;e9 D],Y"R$d*I_2w5fmSU^zy@4vannQfQ؜@\ o~=6%T}(@yVKe' D7>+<"goߓJg9O.fp2 f 7ns$'c+g_Ug g.@b@ zR3ؤ-ZdTOVxéjBhKs>nTKB=l}wQ`ѨX6lKU1hxbc+MNk;z.f;~cGs+\֩581֋@O {-B zT? s\}͇oW.HQ`Q6vMy@p0D97"=؉@cd aUې~Sk&ͷ@U?͜$v"w@Y ȋh-3#-x4sL DߛWh^^/A"" R7%i+@cV ^HU";%M DGZh&8]?kYg_ A ziN κq D9&EJ{eq4LŐa ]pv10shsÕqE{M@(0ǖlIlSR3a'ύj=?]ΐᕨ݅ys[GgxIԚ s`s DoTxniFSc}e™pY9pe̐ c@QXB[²QrD;e NcZfyQf'*Iڮe_32o 'I ?CBK D۾QrZ;sԤ7 Ea~ƒA NF DO,x7Fu\h뗛cm=1wUt6?y>*3sx坾~+<9wT{}&G8BDDoH&c!گp,)F=WX|9C[ev Zuj@gT}%_e[OCۚ7tq$6ը}odC]I@4<mmMj]I͒&P(p_Q_U NDkK%@mε`߮k@^\|'>aR|9CW[NIԩ"v"զ_d# ж"IvS=>.VvWzj4 DQJtz$)`F D 3.hy+lQ؜@4S6  KJ Dûheh[SމY e1hU[<QY[zF #wY$[+ D-,)͞!MzDۚw>|immG!@~3$@KE[ecfHa: M*=;XQؙ'D\:wLt4[1_*=J >6.D͐&ͥf DГ~ʘ$x&`eQؙ@4+g[Hrgѐ.DGΐ&ͥ:U=g&(l-6lf&k'6$.VDϐ&mO,ƎrIQw[~H%EJ`&@Q DW8gI[5hH+O DʆH kDaL4; 5O D% DCF_y@c.~j3Ѷuy'janxh ϽxgHas?ʂ_eh&G(DǤ =?WYQ@@|HѪ'gv@(0@$" }'kNM DkoN S|\(&(Uj_~d`Mj D9oJ2 Hy'c}@M /.yc{&cs֪RU|!^w/OvmyVYmebȣtwڗq<. Dgޘ& /j 7F_噐I''Y3_cۭle/=F~A2O$/'n)^R_3 D_Z~ӿ!-uc}(?]_.?*qKpƧL*w;ĝ嗤@t DL_m?ڷ* cȳ%%RW͏u:|+]m*^/Gvhi6>euwKD\*/9BWа~jUƐg{D/v7c)_ O@td1ym8hSN Ygg{>T!X ΧGۯDL?#y%OCʗ⏆m6*>eNȟX$w(VQ` oanZg^ŝhϢmj: pKD@Ug~Lm?u Wy31;|@!OR'ф,7hOCY~;oV?\6wq\̫x@^n?I4! ~IahU[)~2q >j%b@5ц^F>:l,.8LYO9>"*cH,%NPv4/~wTvㄜ5:n)iRXP M ̷} _C(/XNm͞"'}#/e DWIMړj=KրBDVDҥfbUw DV5?QxwݚG fS)8UӾa׎ɏ/oY|BtXy }+k(p;Q`Mղhg\'ȉꯖplOŬ#?f%qP\F iJ Zx/鴶BOOHTx |? *UcfϖXe yK`aDV ȑtDK*v`%)?wG< DKm۬pTu'˻h$U 3İ@4hϑmpSM?vB/X[UԥR%5?VLAD̖Xe yRcaTu47Y\o(Qx4۔X$O "U-bVCsI1}߬9"BI/QvUS}ivϮKMH Z޶րN#̸N/Zo!Gy; ,qˍ߷?i)9`T N JϺkhْ}hBa恁4X@$ 28=!V3udd4l dM,++JMOȋ%o3hun(QGçm>n|Q#@sӓZUm<3)Oe}M-'2{nZfRD/#3 A6um _(?8 sц&KI[ʛƖZ˾4Dݻt|G.-p@hl᥎ʖTkHOQǪ "%$VYvB.Rڝ[o(Q\mF-F,r=-xX _7:jI1o/}tiLr[9of :#} :Oa7 xjWؤU\vBW * K kD_2ђehVF--(%L?Uؤ`ntDY?X\S/I5J^pاޔ#v7K$IвSQ|"knp.֚(@9(ln@tkpJ@ l@!⟷*٬9~U5t}|!=U8F`-S>@4BkNaVY';g"9EOC_oZ)URnXҹh6伥[OIuU7 ?&rD2-m0憟$T~-~esl+4bΰ"-~̟U&~b9(ң϶Ek cÏm2rZmBp ÿ)uR&GD6@.hy!Q4KiHt~\#['}u}=SR! R(VxR9hj\d7]ÅпQd*ͳђR%MVDWܻr@"Q__7Q`Q @ͨuEw>U^*uݳ|L P$dyN2regJԥ1@tsxGU.{RjЮyS_ac>y9Oٲx z Q꟠b~3 D'vZ7oYl3I:8pid/,\(-(-(-(-(-(-(-(-(-(?=O#]. D NJ= fqR^.@Vv9%wFC ,pKBjU_;cU_9:)HܨO \y'CdU6oXy5y^55sMYi!xߋ_n;kٝ]^?7Q zT}|3CLQPBmW*쮡ǣNyH*4XpRfy p̓樖RwEy@1@y%4ajڎ?G|,(ɘ p̓Qx|5ߏm#w̧Gsx'&F$ km ?) }lzOz1%' D_i {+jܒel?@UR D8G'ޏMixRβDahRJx]mTCy3j:fmGѐӾl% l@>MiYdyN@4/ ذ7>'uHߛ4tq\ "qڗ/\G !hL;o2=# oBa9#g7 Dޭןǔ?]U_BVN0ށh[PRp p@4 D;vVh~lmG ~$imD).3([@teO)UȞ6 `ц N pW4ͳkN @4$%ށ=DYbai x%t@4ΚǑdGmjZ3hO.=&Ɓ D9쫳as=j u>sϑy_SѶQt/+Oy[zf3*S>}jE[ܝ@f2_Z,gLͭޛD箄f<0 F'bw4lTo_]shnx-|󲯼n@i[3 !UIk7>iQsZXa2h᎗ JOvẠ/ODK8/`0:xNņLӵͰ ߁RQt~6<| qa[vwߥW歏7i3l[:Gb؃cxN 2ɰϻ4)些~7K*b^{:-Q=H ?Gi E9'RU…@gT%c+)dcC9mQG'Ɓ9"V42q_[{Uk+т֙` kE"(wo Wk:MΟFm~esx'E0@+yh Dsh#j")ѭ=TF ]Ec3?D\`$0Q @D\Q& r DH @ؖ@ؖ@ؖ@ؖ@ؖ@ؖ@ؖ@ؖ@ؖ@ؖ@?=O#)W;;#pQ`-#COJ=Zbᾯ\ C ,2sa챪 pkO֯M"?2!k<Z rǰP C L֜4,NIw}HOAG Dk D;m+XMav{Q`UEڶ;w!=PcuVgA oK͖SN L$hzo8CzԼǂ묀DǶ@ oK͖SN L$&_|2;vVշR/#я چq{' lv_{ L9(0@`n^8!U DSDf; {X0%޷2ȥSN L$FZmu0&c~t!=iה@yy(|fVT` DP˸FI;vV9߿\g|V ^HUR,A.5rQ`"(0@4ߥ Z*q ~|ࣽoKeK @H =`acyAvj@HI sYp>;ڹ9޷c;'3]B L$X/ f~$R)ȗ-[ <5r1ɰ[Aa?jR{k-#0vv D8[),uRphCo3d?K[ zeج.[]nq`Qx?|iR*ܨw1ڲGEs"sYe IC D CY7+E d< SK L$NFW DP5@K]V;/863ۓ7S9,{+Bngꜞj#|`Qx([j&:=;0ѹ)ȘGjZ*]p@,-r+hk6wFê7^g!_2Ѽlr-G2Ƕ5gs{ 65H >! 1}r DasL>9x*+ p[Dz ˦#)& ZEix~Y ;wD!2<#ShFoe Dfd ZX_ &[U+/M Z{HˣVm)R4e%x+-Xj޾M1V$T@@v2r|I#9! ->6#XgTIjФa|{+X6}o D D Dag+?!Z;=*~R_ IeR'.>Dφ㽋)G]ГD3Qh`:ۯ D d&cNeI蘱mhQ`0(l-D_9+bm^jQ׺Y AalOMцj@z+E zT]#=ۏ|ó@L wqҋ@EJ4!s1̽+=*[X_ PK kDWjRwpK{_h[X?ÔC hধc.L4/}%ud8; )K=AKCWI"3pSS)Z T6w!%G(DS׌h ;uH[ `@Z$zH }Ѫ:-`Q`"(~[|c3@mQ`0(0ӰeE\k7>iQ竉/+,Be؃<>۷)gs[Aj{r8ƅFêhdڛRM @!@_a$Ǽ?w& ›J D%{ޞ"'i8&sx<|O*&>VcmׁÞ )^|_F'w>4Em {Q8{ێIårmN%EB"U(M hXWvw;ݲfU yFGCsOn:l/Q /(\ܗ@G+y@v}@t\V& \t: ϱY9S"0M=ݱ!٘'߻`nD D+ Sl2;k.5Ҷgn뫡HKƓ] 6 DuD VwZxA|ʮ̍ESRH ~Ҧ/ dԯ-_Ӷ"Q@X@`d,ݹ^2ȼ:Q6#֐Ь&HvR!5DK6؆@X@`ـNw D_+?Pg Z{ V,=yossk & ,hf `LSO*<-}REunQ@ Ll@El_2Y6D;ۖ)թ@ D_P'&J J-H1۲ D VDuUF ͛;']gJtw| Zk@4c0'@DxB[Ԥ]F #&DS68oxHVUra:USD$_3 DKt&?"-#|\8! D  G( aH~,@t֔ț DY9= Gۇ\w r'݂wB @ϟ?G߿#G2>m{ܤ$z)gzц.͟$%^oU0)?O3K޼+3E.K 6`3Qx4۰X4*`͙ΗVkkB/_s*[^yLzH Δ8oT,.$-o ~5]=]y7Uۏ (㞺RT Iw:$0@6ז Dۚg!J :;襑k;ha1~B)huL :[\0Q؜@:GM:PweȎ:^ZT"sxy vwE.$2#}@  DG_uv>%m?SYcH Z0ۯ@tQ^L4; }-"\ : ;:__gJ ~Ty5jt@x2(*__'6hTm/fUmˋ'߲OHw+\mS ܗ@0Cѓ,Ydc _KsѼo[XY H Z^y@vHc DAcaik@BUa`w1z&+d$S Dc`=9i]-n)lܶj= X@g2:2&D3y,Yڮzly=ױ'b@t@0 nLUe "{Hv ЊNERWsat睈E2ۚ4.=7/)۶# mT Yxa}`'Q`Qhۃ>'hIOJZ3%o_ت9yxϮ_H }s@^8W{Qt46#B,/4)e@ٞEC='ꋝyc[3lذ/j!8/ׯDCIݭy!t DAUz-c05Wզ)m͌ʁhy@PA'1Qhm:54Q`aHʆ?Uz.R){E^zҶĬ/]Zt7ђ旽u:$ YT]yaEأ9#-mo_/`0(GhPŵdL / @`!OP]M 2Zw \m Z2D DUy!lC x,w2`cQ @X@6&r D D`cQ @X@6&H1 Dm Dm Dm Dm Dm Dm Dm Dm Dm Dm Dm Dm Dm Dm Dm Dm Dm Dm Dm Dm D{In\(Jmhnnd> jT ´ %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X(5hɓE@0(r`Q.D\Ƚsr0-Do[#r!j.FBԾ]n ʅ}" A~־Q}%.}NrCFI_݄ 5C]-ʼ33'ޱ*:8 +DWc}Tht%AKͼA4} } J[ښvE%8=v/}0e(L_̙nxaf>~Jp)jEDDW]x3hbrŃhѻ7zAV&¯Ch:hh|y'_.{[cAV&¯WI]0 ]n{Gw/I_Gїќ; {-`)(Dw\">ܢKD B9w4QX ]uj|A41M%/AtE*FDQA4,ъc98*Q%Do+|-"Q5o#* * :F[,Dg,}&Xe , efDv~BgI  Z|ۘ-%o׸>7fhucV ruW¬~t*\[s/-lA4 DA4`#.ۨ-=vu뭛DPX |&޿^ 'ny3 ¢|\e/- D{q'QX+lI2A%n#\ DwoQⶸpq(e{&mOូn\ kDeޫ;7 .Hvo%a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a @X( %a ǿ<$p ~d2Apq('@?2\ ܚ-Tk~E,?2\ ܚ-Dipq(@pkSݷ/pe(@p!(dD[3=y*D[3=y*D[3=y*DM c ĠOw״h-ʹ^x].1}f ?/&,A8/_xb}{ΚW\7sx΄_9c._F_KzM.>g6*}7ބ<pQ___ߓ/ڷҥ6^V~ l/"]mIZ^'\^wer#3G.,B zGsos~)_uFwϫܟ{׵eھDV'i|a߽9_wpŮ-}רAxx D*5nt{qUm߯bU߯e Ki⊇|2gV58/?(\BN DѮ@Ew7 /D'|ѡk o'{t^r^-߂@k͸&Zrt]o(2?lD'#^x[:Kbn33׼\Dӣލ͙<=$LJkL 73mzRONX_nA![fl D;g(WD&"A=X7Nk skܾqDw3K+f:.BzQN] n +^mh^\qTXAHQnh AϹ,?hTb칂V7(Dr}K ^?#weԻ("BdAtDK͉g^޾+S ˍ{'j/CG(p)(D~˿[N8燷-aiW 6$֯DW?+&<퐿z`QJ \]DK.] OI>D3' / ZNˬ գVO((NUhwnx̝yEB 4(pվ_uGۊKcwn9CݨED8 69{x`[g FAt-O(WD]'  ~ :cjb p MtP ݖ lD3WlDs֗DÖ/6iNQu+D8 ΢jjofٽx>V̟DG'̉g/׷wXAtI_(\2:ޭD_Oy9[-( [FTwUrzAQ`u~`}Ehݩ.wYsޒeȁ/DKO;t=<DI~]u~?a FN[~? ?8C,sr略_E<Ͽ2Kl]9==>lId߯S޾v e}rfzU3gv|q9ooA+v TE%egc-;tlKP_jAqZyCLΟ;hTzQvA(pw۾lD3T$ؖؓj<մ 93û1o}gv]F7^X wuw3[QWگ8Ev?Di;?f;yr9h, %B|5tDK, OsΖ#flY\-qQ(n# bl9h, "Bp5fD0;ˎ\Ңc\+  ZtHA41[ #Y] V [^5?5K4D!2AJD+.:s,t'BdAtD'j' {_ޙr9h,%Bdsؒ_Txw, "µˢjj-z37O^oo4DvC|3\֘3+&dr[ҋn4D䔳-qk΅JU?]V \ #KLHDGD%A8XǬyjwQ ,AKDQ`G|}EDK`2AK/AQ`,AQ&DQ ,AKDQ ,AKDQ ,AKD ||Kӗ5"Kwue12()S?pO+w5Q"DRza"֕]'I}e8LHMmI˖_& @H(@=V] r +DR [pXDRJ݃ DR-2AEh]DF0+D.D[6Q07hlQ8 #'[Ac Q|fKaE~tmm DBvghf,r櫛bs癉-]je/>oTCJ5S]M+r`5HQ09nP+;(]%X" ,a[qALDQ ,AKD>>}z<P@DD8AK F\Q`,A4AsDQ ,AKDQ ,AKDQ ,AK|9}[/$IeBAfDc??=X&D`&A8C|΄J(p x_; 0 ̶xòؙPQ` z( %  0 &%P(0 C l_( %u kX{rZ/aBU]"xiQ`и+QrFF3ng9aW;S((\ s2 \r&gμͩ ]nܽʻ[qD zGh{}P&>.? Zq*2i$0 Wwsp?nf3DORTkfm} 9Drj̈́&ZDT<Y {eȊX8>;LbKbAQ/L~ܾ0K߈7MlXgzMQn̎B{tg[Q$BpAtDGW̍ArV?QN}o[-X(pA(DVWCK8:&6oz  ^(rQNȪ6DM4Ѣ+NQFhflܛ'9QF襂 ڽ) D%Bpֽ!Zq(g!Bphwңю#A+mCkv rλihБ 5t;[͜VwSD D'm z[Ы\Ds @T(\H:Ω[[{YowΖ;WADin :b`߱-r) ̶H8DKϙs[׷ ̶Z9CsWO(Q ϥ~ne34=0 )1qgZC{5}/TFDڃh9EgMM+ EHDAarl?6.uYQĺ8ЁwQ ,AKDQ`G<$c DDD!0 %C`AKDQ ,AKDQ ,AKDQ`^'yjgp(pDJo]_kCwPA|>Qax | `7L]xM\"d<{uQ9ͬ{nhG} ̖Y%:(0ۄ*sAD`)(0[&RQ`QMl KDbG5A"jCC]*At6X vݪUb=k'ٕ9"ܜQuC޻]7ݖPF.BfDwv Vzx=IDwe<Mkz߿^wDO-AyÖDw߃71S?C|bD*ޥлMs(Y:I]=YWVѢct\rc~xtЗG%8)A.aMȢ}hz{ZKooz`|UMkv cK-= ?b~ \N6DWukD;rw x\ ЛMtBms!w ~iVtQN#E Mmܸ,~Gv"H9vu,hU8#A"&*&.Im p(D Ѻ9ϑrP}WCwOМݷ4D!2AnΜ ZzAUQD!&z r̘W\?aWi QNHѺ9L ZzHJ /D<QD! :nhuAݩ*jQ}%%7QArhAQ&:!ޜ"]q/9vSDLkyEMDӻꞝ8 p(0IE 9+G\n=%%>/NO3R{LA]WOTIJzVbc [%s6V[a~IGFDBQD APIAkDNG<@D9/A AKQQ`,ADDHgmkDxDP.KDQ ,AKDQ ,AKDQ??GN;MJDQ` iH(0'DQ, @X( %a |||u:-$3y.AD! luoW[ :@A";-oB{.5i (Dv %D' BpuM ZĘ5 t$Bp1h;чAtiR(WDM}"8(WD@5$Ɨ~ ػIu,j_Zk _ ):~sNٙϮp Mtt .AD.Jh@ N܏\8-AndƤЧA!Inl|[ D;a]N#i @ a! @# \{9U2@!AV|>w@gzڕ(!~qsAt(DhAkDhA DD0(M@g޹V:}\# y@g :{A.b8N:=*6D8ALEQ3AADQ>Q$i @Z( %i @Z( %i @Z( |߿?߾ zMJB @$A5 & $|R/ /psMQhC¬zޱwK ?׵]j"-Ч&ZD;VŅwipD ->UA+Ow4qAtwˑ6̯Z?(]\m DPwێ_~ 5ipߚ6veqٲ%c ($' ڰQD!: QCNC Z>D!4AteWU6юDQD! :lm ޘ L A2kQ㖆oOޤK mmysۖ\Wؽl{[>Dhߐ?p۪#D&Z(;Zgv]XݾllmKb!S Z8D ;Ark}`2}uo@41 #Q DD0(٫wk} 4AlDgσB3(Й ( QqQzDh ) "@:+ CFXFP %i @Z( %i @Z( %]ѿ"oD/xʰ)m @Y鑂(ܖ Jݸ @ÚIRDP" Q)$i @Z( %i @Z( %i ]ѿ.MY%HA f=xD ({ݘ_2v=p-(jf )Q 'DH( 9"@ ;AHE @*(NRDw( Dy%̏R @8S! 'tV| D8DKk DDggES p#t)NĸQwkl ڰ8Ana;|i zY]7QCBQȯ>4YUCKLeS D! :o-UCrQH> m%ٲ!mj(\ [f_?BQHVAtsm 9Y[ nDOF̚4<Ύ:8A2G < Z{Fω@($D ._QHN=rMN:8}y/p(WDDvTM.M[(okt | Q&PCxn6lXE p#M4&>%DhmAtceDhq7~Z8G\AVwh./7nxJ3DhYVHAx'^<$ 7$ю| @#A DD0(M@g޹V:}# y@g :{Anz/ t6{TH:[DTQ3AWOFXFB %i @Z( %i @Z( %i ]ѿ.MY%HA f=xw/2N5Kjkt z|7DG4KAD! : n%ٲ!mj(\ [fj Y[ .Dg:GС ڶ*(dDMAtvtUQ Bf}BH<DG^ 1QH3o 1QHAp %Q5 z2 aQȯӉhߗ%B~UAtt Fц]y{x(DD h@ D/{ Q,SCxn6lX߫L;z/a%A-1G(-nl[5b j(Dhq7~Z8G?\A @DgEs~qcSJ//6S[j.Q ZsU=AT H(ųI0^~1z<ETDhG(@A&aQ D^st(F:Q t& @AlF\A A@g (DJDQ>Q)$i @Z( %i @Z( %i ]ѿ.MY%ȫQ!BBͺx qbQ T 1dx˼{(%o!z$I ˣk/0u Z{^wD!&zovuym ($'L5Q8AmCkt 彂( U5tD>Yrݱ( PDcWv\&юQ*(M@4A#zZw@ DfAt<(mch# #F:WB6(Й: mQ *1Q`eT " @Z( %i @Z( %i @Z( |߿?߾@qo6|HCBJ^zQ+_G@2(*}]>|HIBv߫f%\mK04D/xFLnhD:(|(vjCW2N2#3 Q:rj2%C۞"Dg d" 741] APf̾c _(@Yc{6 )9zEoDDz<aǵђ;mSѵGKQ2DFڏFц ZckOwN/DDب/1όOcܾC~^. d"-Ч&ZgGFnm(%6;>|/& ЧSqJUA#Q2D!:).NDw(\C7A]&/9? @&($ ttG'hc(Y[ D7Vv?S5nQ2D!岒-k#* 5id-m?w&ZXC%٥xMa;I{t—~(pi($DD?naNdC叇L D!Atmiy ڋJ U\ 6p ڋ U_mZCicx i](WDGi@o+x誏q=tw p M4N5i0 (DFhL nDD 7D4A轌uЗJ^.:Q Z Z Ρ d"Ѫڂ}hv ^N AVDִ4`9tx$R.DsF5^x @O~n=ɣ<ˉF5߶9π D;sDh(F @A;J{UCQY=JV6$ $pN(썸M tޓ 9 @g%AT<b(˨ DDQ -AHKDQ -AHKDQh??~ߟț@z("x'@A5k(DPDPˇ#%@ADP]D`AgQG2ADLqQ/D`AQG{6*m9`}|:1b&Dhm,ds} /{nmkm9}P($Dw>~5Aܪk(36lD^w'*rq#AՍ,%v?S']ЗM$5䛔寺x/Ѫtz~]$MЗ,Z|Y=%ר]<. 7\`Fkt 㖎*.-AdKm /kQȯ*Nzyhp _A6($W[C6Ֆ.]fo.3($'| uY[ NDqYv~Ki_D!dAtc QI̚4 G/($pO(d ђU5DjǍgxe‚(QL~ڸ( ɵ5Si3І $63ц7 D!|AtAtxQrD!&:Nh|ApD! :Ny㮆p3Ѷ/q^:6gTx'-7QAt{ ڰ^Q&B@mBDNn_{ Ej$,GDAv$t}l׾$цN#v\q[+i_>Dh_ k]V]koҼ~b @(!"Y ZwAv q(M=DK& ;d*F t2ܽ;NB D8N ]@4= Aձ {?qЅ t6 (Й J A(M(DPbDJuOUܿ$t!|_*^/  @Z( %i @Z( %i @Z( @??߿?߽ $0ʫ>i{uK0B>-c%Y6TYo`w_DEt(N`A nj(DQ ,AKDwIΟ^FRs>AB}z1ՋgN)4 iWn20 v?ܑ pX{U"V]!{l E˖.^ D~ϟ?vLgOEzbKb/=\Q)A䳃)KI(UY].v>|mIMt4v&D"#SۉOf>y Zh)۸xz{pc[O>YA *Aˬ/h飐Y+g|-ҳz>{kp_Q'+D"B|EAtD/DS:~[p;ɳhւ(c \i }DDKgnlOk:QBD!8A 2)!  :E {i\]D;nq敹{ɢ ZtA׹M'(WDbA1n!^*nn= %B|MT;EY z0 DGExK<]hr^  OD'e| /xXש1q9( hsR A40Lջp (0 k8u[AEDߧZ,sL D/zPHQ`uQ[5޷ EiM h {"Oθ $Ep5nJfDӋ.+d.0]xqj܎ Nb)^>Q ,AKDQ ,AGJwh%c ܗ  %r_(@(0 } @X( %a @X( %a @X( %P_xH${GAD"] -r/-QOgvo(W&D QN GA+Dh"pe(MQL 4D2A9K-&|ı;@Q4alO:%V9,ߜ%W.A ϟ^eRT.r.bz)A+DA~hf]u9s^xۜU OlZke~XA+D)5mNgqqo?'s.Xqo~CԯNGȩ/hKkqadbJ=iM9.- Qk)^:!ZU8 +8f+DhrY{  @QbDhr :R#A& j(o(p sjֈ_p2}A+D|tSl%V9,ߜ%W.Az_.{Q9%].E"'+D2Awϴ3s:_9~/mΪ˄'[6 -52n-< OBߦ54UfO +]6=̥}{hWA[Dk,mvRnؙ'D:zp7 epr{ K zV Kʫ&B|EAtD/tcє'o̐ǏSkeoLDBJkˈ&ZݟY^ї9%}ΐ?]xADrrAtsɢaMLDBD!}[ѥKC]DD!2AhA%L $Yu]4^Y11wN&,.'BdyBcJD{đD{}@At - Za̞D?'  5+hb~C?啹_&l߹\ hhcxB=(WDGEm8û]f攖A+ j"6`if~Lwp (90V>>oosשj(@T(0[Nra"SKmz-_zw>M9.W xA8GfZJbպt]Wr-jA4zzbDӔFZEk?Ń᎙  (p ]^az㔥vYie;j<ማ6?#D8@LD7 < !nDx2AA}{/(0p#1@(0 } X(% c ܗ  X~m \rnB4A 2*p( %a @X( %a @X( %a @X( %a @X( %a @X(p ??߿Fq 'xvYp츏o[=D|ŹMXsb|sNfM)ʇsV[S("ȌIKmz:+Y.~3矶h97!Juϥ7v] ONΘa89W.9ɼE||׍_sǫ+j_- tmZeSY9JMOl;$[$Wq}XQxt }DFƇ/28={c+|;RD׀Hs7 Q/ mpJCCsݠ>{᠛rJ9Oe]9N2N׿T 8 ZE T˚("Bp5eD8CZάAV?(vٴzՂh :"Bxh]N~nY˦kzk.@>A{lZ`ݲ7nZ=Q-ZCQ.h& EToZ7Q-ZS'BdAtD{9A M؜+DQ:OG͖#hd8 Iӧі;f5A Aъh4:nڔs k BpuMʿ!{u{W^7D'Bph]} ^kE* z,& 5sJ 6QAu k (M MtP ]-ќF;~w`W Eij5nֱD+Y:+CZ,(̠@aA=>%9?NxDX8$tG#{*^?=t|1ߜRw{7'nz78qQ5`D.UfVEi#>̕ :n._-irOu̯bah͹i?s>9A4sUDKo1ش㲃 :e/~W_- D8FD)Q A"qAC@(E8%M(0 sQ`,AD6 X(!lDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,A}fepM(pf4u_3gk.X=7g &Cd%;/r9Guᇱp#M'DA~hf]u9h_0DG< w$S$jۜ,Zf篹9>14 95et-J}Cce.A _~ }D+R\py n!Gy8 Â( \i ]Ѫ(F)Oj&BpAtD#Ď;g;;^x(!BpO E+W5sMA Y] ]nDK/k暂(D!2*%Q:.h.77DwrMD` ] 2No/\ o(WDoDƯe>c* E2ͱ\FъzWFDQ#B|MtD ]N l&@0(WDA4g5AD2삯u?,+~Nfz {QxtZC_*:\ΔA',Zh {Qx2: l< "S|}h! Z)(0 z`COAzDپjܒ1{G<7MɿM A8Gf[Bc+w^k CNƊeK#b5Q!W-GLf r+,"a @X( %c=￳}X !c w$ %ޑ @( %a @X( %a @X( %a ߽?￙'QM AQQB죂((|DE @((QBD$ 'APQ> "I.:֬9䟧ʟUu.6s5Q> p_ge̕ses ZzO9szYAA0儱0ne^_joM].6NҲ((<ϟq3^ڜUֳ2_КİMs_:>M,^z |D)R&W1??_'{A4?sy8x=>1%=s< pXC&dƇ /28==x7Oi]hfLǕ7 W&m?p~bVki.ۘyrx]Of[кKh5+/zp{Qrl{VEd]:,ZWm9wD!߀lAW?GfSiQ`6AFfDiQ`6AF̟pJ<sX($< %rA(sX($< De*/AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,AKDQ ,A~~~6{)<4ķߖ?\q}ҿ"Ӡ'>YFo:JߟgѢIQN·| Br= h?߫S>{ynݻu|)pߴ=Aׅ$&֭P}߯6)2zGwDA4avPDvg=|S@խҮ7~ZoWMO8|b< 8 v8rAgDc)jhbp5Gt7wA^3ndHO 3Dy :H}Y/N8Lhj˥n e]!N{ z8}āG|L膡1!\!AF'ѳ>ѥΦh`߉5smADK ^jSA40AZWo { }k"d1f{x ]ѷƟ\gozMD-=C zھ8}#EAwystP :!"Aڴei_{xD[$'>Ԝ-4QN ] />t.cb z/_ߕs I`ωA?֍ohN=劺{tӃh"ou/_7%n̥Qk~oWCr+s_@vʳ9:ApYgorZԡ?w͙^U·7QAt pMhQ D_5ta-zϼ :> } [&^3̓_)At pMQ-.hhsepM3w E}E M7,"pk< s.A4R ]|}Whq(Z |y;i(zFBE7ޖ`eO #6wDAdd} a 9 >DGl :A}+Q>Ӻ-_DOnä{qz⇀^1{ҹ.8 ѹSs=ywRy]4ce;Ǐ729罉fƹt҉JYqkq Ź?!#)~{*)xۛ{usBA^,?og;9z֍'|~@ss ?'9+{gΙa{sJzCQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KQ KBR endstream endobj 33 0 obj <> endobj 34 0 obj <> endobj 32 0 obj <>/Length 2152>>stream x}hUekz766\5E7?t]l3u)#K9G+ *G9%) BC;=s58yQZǰ x:֣{=qϻau ṗu X&+rZL573wͫՌONWSoqQ= +5s}gv|p{\jURby_VJJ2џR[ Vb֭ufa׮%')}䑕VT-o?~9r9jj2hb". 2F%X@…Nm-a1b0;7WC}dtчyu%2w'l [2xrHGXl@%aGa ,Bt`ܴF0-lfY gxX,cn|se٘ KNZn(|B-/q{t/_sV+}Eݕ݄Dg%؛#JiAװ$' Y,d.c U?Ơ !/3XHGq-zK`Q>h54sSïA la"C@O{gFade w$f>[*%{q%':3T$3iV6ϿEan֨,.h?tZ@,^rQ}9$c/M%RG<ipFq@KMRNVJCۃиN8ltbBBкUٲ|>6Xg!&}?BIP[2A)`-UQ⤖F\GSO YHشqiBtSU0fU|YSV YDžkD[Q cv=2bD WEWF,KۖSOkg9hn\fJRAnV}CƦi6GH]8‚/d1q/CBksd[NSi,,AH8@\ [5yp ḭl˩pJ%M"ocM|5%. IC2^ C ḭl˩e_x/:w&^LM͍E o'>*-t>b-`0 V:2)N=p9Yq/G\9W:}u#`JIOmOJX*h `9)\3R]/TGNly)fUPE1ZXJEνHу3tҡ:9Yhҁ+{0Q'$o>#scL͙5[Sjڪ֮u ]n7HߏB;PXԏд`a [gRXWX]Rr * eUT3D$'Ooo&x> endobj 39 0 obj <> endobj 40 0 obj <> endobj 8 0 obj <> endobj 10 0 obj <> endobj 12 0 obj <> endobj 14 0 obj <> endobj 9 0 obj <> endobj 41 0 obj <>stream xz tU޵tԙ$I1  ȉȁ 5J+SkH3!ЦUmX}n}_G{!0}{﮻[J {״?|BԂ*ˋ 36.v"7p'k>hﮍ޷䏏! Σ=_; /Z8oyl B=9rtXF!Dr=dђ'w6GXz&fΒyˣ ځ-Y~lҢKsчF7U<]øFx8!wI_.ҟ(D=VP U9x>ö x+\;C~cOAϩ Tjx^Ix#=ѹdµa] ǸLT&L=ڎ}xpZ nbrT-ZWsf r P:a^Kנ P{gBO>+|Q!2 ͇+b9j>U@կ2~ 5]耱EZ.d 0݆L +zj$ԀePN*;Uܜ4)ЉJ;ͱJ:dR;IIN~32IN}ep'OGȴF"$/*ߣ5zr)e}t"H.6}jQ{i}'2y'B>A:A~uto&ʜn"]Sɩ|r!9_h䘅kNr$*WU+aft'xl/i}icpcM'"Y#k6Bt<ONhkǴ1ymY[XD3 v'iex;f,VfwX*@DHdrOo|3].*11Vۘ|yJ<`^Wґ_qL:w8{kRJ;2 aU }ZAa-F2 HGc~m`g9J%wIRIϬ,!ۙs7Kfo4Cb>9}R2/pȱpD:L.h\*m)|+ZW[w;PO֗z%WyסO/O'{^#< A._y+~A\YE `6; ~CT܈<`ma/mw@F0JA֝˰[} 1Gt R Nkab6g⠦,Vl;yK+ϴ5zeM[ױ'bWcXO6~w뎝  q+WVm59gu9ns:pUdHQ:9s?jg Icj-ۧmggc+CJ\a&e3ef@q@0%J /1oj)^yc*uqЭIo_q;DjL7&̷Iᾍ徭 F 21s2#;q qIt۬tBG88SR:%iJrQT8. 01B %pƎjad6Z،'pK滜ozo]oћ!zAV u|V-s o'u`R>LI,_`GRe_ixJ3 %Av OFdj ȡXdȍ.^γ8mF`eW|X5精D>IB<"Q2Rp)[LW:N7J:O4*Ǖ;RWr5<% |PӴaѴ'T< %W0-_=q|4ǁh:$dI\nw!Gv[8N:]Vg{ XD%aljA(DJ|:Pj,2<~#R. tnG\dbYM Ki+nae("l\r$:^F5.e]$Uu:QzŹi2\t((eV_81zuWW Yw+}KNt3(nzT߄8vk3Snq.;fL1֚8^0Ǚ3%JfR]YBu5+rM͖Lqe̶lRu-(LXNM# R$Lg)Y (]^K\:n?At+&H)n-i-k(2L_8˄$ѣ<ًd3A\SkzyMMe09t63MͰ "|V[2Ci#n[7D\CEϙ7\=ND7`"5&)8#"Z! D!c$0[cF-x-|o;s׸ܝnfjoDgZ[^(6:̨% ƠW M.d:8nMMn82.@l^4)BdwZ{=}F*w1r1/El7V!A/&$x$ "ٸkeU'EKaQE[ۿG3a挆խwa{u]>2{TMASF#R{Bhȱ{#փ4и0Z\%CNBIJ<79TXV}ȉGnx>}S?s`6hIw\:"q a0O҄s#i@.4C Dqq?%n7$`Mm0 ,̕-DDl3[Fdtv)(wqnDrQI\B)B"Lt|̀ kB1AAiKLn* :ᐾEcK W&T.w5=Qٱ $8\B)R͖yg%J^F1+ut9bEfSaF(/n1gB8l5z ,5W nМοi5ԛW;Shkm|^'_?.NĶ_zw2Eģja xz##"Ժwݺ[)e|_zC{̒xTZ&usw[?_+:YNgWU-W=p6_V~_G>X2܆)-Rs:_@Ej ae,5ndW"ޔZyAڐ1^;Z 0'NIYxX{+1xt\Iحv- }Wo*YN'XL4JL H2qQmn6Ʌ KV.wDPchfu:H-*[oVnY$iuڜv#GHӥ,siTZ(ӄɢ*NTiy<2MoUm]u)eRL.ܥĄfYZ/ra}]뻶wx݊ӕB~2+F1r  eNtr7꣟jl}u^ bZAߟbԅqN>p l_Ab3连(>P6Fe)Pޕe#bbT4,z2c~^MY!3 ^*0 I6 *UdM+5?Ę9p\ Scu[~24Ԓp$秼?lu*4Եճi[iԤs!gw#K~3XSKDi?/F:Az~S(C3 sd3B"H,Er(P, +JR4Wʕ@e2T^,,K͋Łšt|@>?8<:>)OJ''ٝ4 FVM׮u춃a8_0gotIՊ܏i΋Urc߼-[_C}dsVo>~{c}xׂ[xbnnຟ>TM,M3nDlL/2XJ4J *vt0 V1jҊ4*[εX6m3p-|"FӳE#8q[};oeޫ[~=)*bn5e-5e 89?ui2jeJώT҉"53?t~i?npbjϟݳ'?~wᅸRkOqB^}1"u$+uϚXg9m&bH#aA2rY,VwgX"gAbu}=x^BSxހR$~<ɜfL>rC;q!GxTT,DMHfCvahQ-).e@p`~@aM/Y(Vt=)^? ̬Fˍ-RlՋ!(,"uٜɀ T؝bX*$>GB( 1- 2P&B(.J &-WlCNX~ nn^BnH>e*Qh,P9ƍʩ07Q Sʙv`1Uq!*a/fgTzN?g*Ew_ |G}=p?\;E&G%0? Q+ܟXQ [8gmǰ2Up eT=`j?8ˍ*_Js-Ehv:cpҾ{LP'Ou endstream endobj 11 0 obj <> endobj 42 0 obj <>stream x|y|Uuk߫;Y;$d#1!@5 b$ &KDm"Ad"Na͸0.3.ąy0>&$y=sn @  cFGy^'ʅs6ΝPbvƦ0v>ٿ PǡGׂW7gvx3c҇<|}̞_>D-Z9>Q% R=ϑ-1C,8 {x.P:8 __2NAP&⽉/hMw"`p ";`nac#8?+f&݈"nK (c>ɹօT2y'RT Kp)xk@ ]T{a/jϏCOѩ~y;`JbR؇dB/*ˍeer+mʃ{xP V)`\Ј 3Qc~5-w mJCKXfZ׆6:9/2M, 9"zב#%xYX%[(] :r涿2.@D-c$:zÉ^o1t{RAʼV^MEf+:-S/S%:~azB/X蘅fv舅D[9={HfuC2y.z,EO/gry*[.2Q8WGOE- d$]*;RѮ0p \MPю0D2f=d%Ƿ*NI Df <~LDV2ͧі$fxo@iif6>:xm\M?!yt&z4Loڐ֯3 h7uZ8=F@Ihuy9B*/zpLg;Ѱ;%f ̝ (L8 !"3x*$2E.Th`80B`P~?o~yN L!0"ʍɎarF&}Dr&kp1PD etr'I 듃R&B)Q$D$ϒ()L'(a3Qo08GDPbCa|՛b,Xȭ#bZr: ´Ӊ:id`F4~mRw|%)aZZ$kĕH(G_)Iϳw2 3nr tA 3ց;Xֲ3g/u׭o 5-~oXٹ/\ApLL@ᰃmiHLʡL&GԯvvuVv]9,A8k3 D%Hݗ555Lp$a'hf&4OKJduYs tvZ?|s.q}Mď R di$>1ͩ}><I,3~ƧBTFW/q'%Q2FWHs0;t;ٟ SԤti<]Xֿ666qmI&Ň3Veq1xu5ϺzƜ3̂Trdþ0_"U3/y/7?Ylh),^6};|Aז-9m;2\o.4i=Yٛv>A ll߱p_jA8kb w}lw!h41q9]`] cɋ&Uoi>Xy3]gIvwQtmuPSC=` iXN:~3s*4Ai-p}Ѧ$Nq3Tvg7t퓙H eAt?jGW:^&^]]jǺʭ},-wPq^"PvfR';]]]ϻ1rpQp:})?;pТ5=[`[ *YvEY>ٺ.TR)OS\x'(lnYi?!@ B Ub~;b u c~G >* ޅR23/#0VT ?oKWA}vU/|j6f]uWμl<#k/:SUTsMk'mz 6oP0ע12uc}aa*taaO8$Μ\yKy>hDa WL~1kfpzԥVgt ;uvſ3+U6QLSG؝D:lqry؎#IOZԖ!vi!.6k-/qV55o*[Q`Mn't*Œp`eEbF 40(T3T9 1{xCxI@9Xm}w-bbٲ"=K'2"H>%=yk 5q}tjk_ kx_~c4#e,lBj.GiEԜcuqD#|{1S:>mUUE'vܱl=t "αߴv>7*4h4T4 )`ɂlsx]ڍD"[1 &*Ѱp or&¥UfoWLºa_RKpuߨaF~kXDmuw;k?':E =~\BU(MKzDPOKOzzztYfln柗P Z+_'f%r~`S ,-7EO\2fBg@WSJͫ"׋glF bA0/ n ۳ѓOwUH`m(挿^¢zuG̣wGs&?P^<觷Lk0tbe.>/U>e/~<+,4fs2]2]EVrfA{Y[ਾE4fr4Q]{R#cʤ@FNČ3b)ڜSfksM/־tޣ}iRiB8P(T „Ic1XyR8M&M)ӂky*YARB3<'"'2rڬˉu:u^KN+iB$F35 Ch(=0N (Q`$ɏF1rRŎb(=`"HMDDv"7(LH%ɮ2P KrTN2l)Wʗ ebT,s封ZV L5aTKRmXX\zT s/6"@g:D >jmuZf ~<5=b/$cOCp_Nqh,5"jdZb*M:0;2Y-ә 3}l*ȤrAU$ lDǣ~"ۿG ,6D ,7uO;zz^Zڀ1W-v8~ F §6~x0@aw nIڜМYA2 d4*1Dwz"ln]k;E uKsngv9s{Χڞ9{E '#t= k/^}GGڶf8ዥuo/wfQ/1 k.} k*}[Ip&F<6>Lv&_ia%ϓT3ut;A^OB(&?*-݉fx즧 tQ$96x`ۦ[n޴QXMkw_:JW;/bjo:?܊zWăXUZk\J MKOUHN D8_iWr:?i KP /b)CwRfxpL#t'v?>n aqx?|6|Ǭ_X'[U`,<!ŲàrS:pJ5p"`P^⅌ " B֕G(3+7<@So\aj;ɨMᘀ>GcĄ|v6"#&GOwRKNMO!UؗcVDb[{iy6 v"T` \UcO8Tǔ a`C4|u6f]ZH:dgF"`3L'?a`8ND49 2"0bDn S]E8N%\Fn4h|gdC'[`Iggxdc6I##mv ZOcܘku=]qDp^ُ<_YC ;;sg(?2dwEVcOJ7=D3`a ٚP`1`ybSF0»(LOڣ#։aX'4 qe V QiUClK]D[U  i"*tGc~c;t[z:2vHFl3L;ړ%9ug1ML&k%Xjt]`uLS쒍KIN哛dq~ \< w`힒"xH/*v85TfH"6UX0aBA]PL# !oCl<@8 ,Mzv4 xh? ;u!:ãMXqxh(:)s2u*! O4 %$$:| ɿ;p(E^hRl{r]M96zk>wh/;8i4PG!fcbݎα119UU9j2nϲf kk;ǧ=u&mc}#rCDA(\5nkiƛ**̀uN *rÆLޠ{ , L0J0z[lG7cLl^ m n!$QBy0MfVzH"EUYY#F4S55v+]L%EMJ~aiG)aeVia#;îoX"*Ĩ BʌRG UѸAo02<,x\F=~L*CO|Nw^ zOkl/PөE )@c8B'V%cKupc\XF0H _a a o}͑$?=Jo\dX{pz@X6:*sPQC0`첽&d{qli,{eQr}$9NXϞg38~/ejpe}0x[Yk'oJmX`Y(z+mĆe^ *֕=qw:&{֭s5ղf‡j[VSNb@A%u| (a ʑ]ܘLTJjUaNRR&Cfm`B%VwnZuxUxrC0.iCT6ǻ5Q(эl}KGTAd5ܜ å2(ǧ%&9G]m?>h fc4{ܼOS4-=@+tz}\~6]YƯwN1ĐDx):%T!-cz}>b)EMӲt#ݑ4ٱemz;J!PF#ӄ hiS*RT\}1QpUKcԨ/7;:͍΍ wsmpJ<%tO0aF9rF5 V;ܾ.뵭 ֧ݿEV玃(< R8|UTIVUSVLJdXBQp<Oi>@M_3v$)-')S%L+&{Lc'Ye ]{kĠQŤbI+wpq84*n׻q "6LX`͙iR&fzr"u\W؎z[$UaAeBB-nds$Dk=|\YjlڽzNηNLcX8-˻fW :k¶\[Zt9:DSH2gORl|,!/MBPT1$>7Ġ o4Xi'}8 A O֪O{ A?^ <%h9 Dj2HWG1}>nZbVJJ2s بDL$(x>ʇW)z}fl3LDQ%UMJby|P E` FNӨihܧޫMuONM5T UIUr % ZV 2uX_l,v-7xĮM&yA]s5z 4H&jԔϚExF\ͷZ6dG' 0#2#5!#%=GeCP4a /G |ծR?UوOYՓ'iɎv;_~HMΉ@ 'p_lIBIV2?aYd̴kwXj N[ = quxPm{ßY tP׮b=~Į9(JH˸2(-H;|W/S;[22b6>1Ijvz~TV%S׹$Ý8*8LQ9ˌG,aOI8I8H\~=0; n*-d̞ \k_CD'L n/m= G.w6Fs'vƁS ZYfDayUԡC!c;$dl'ha<5$3ɒ m AyBvaGUj&FQuKw~E_w:0C['Qwa0yl61.;(ӛEPR#kɧ's9.x, @f삘j4XAu$} +9'f%%KDd,|'(&ࢰsD?1{ ˺xg=Eu$^|/,cM~lNdD<+\qg9dNQB0\jtY(Qgz*Q851u̕!"-K"yuGsjW5N;EpNQwc%FQ~/d*M C")_KPKSRXuxA$NU^bG5i/\(^5%!SP\=F#ј3 XB݇f%4y:K2f9f9gf+A*P=+\R.1nVU%"Y/KebA[0\SIeVvYuհ p~8>o\FbGS F@zÅ: T(m{6շr9`}eGcB>v|9bWB.ĉ:|"݀χWꋵ W+eL. <`.L V0W&05'5Xo 6E5IѐFkj]iZ%Ȥ~ ]2#\2ʈֺyp:J2V+I`s ehKs  *su/qe, _:=xnBO.Fk/55Y]֒O[Zlj^1aI2Y`+4Pa%4$UV)1X)#V]ڻkp a$U]u &'&cz=)1Bz&Sͻvmnޱ "ҥn{8 &}xFΌz+o~H}?n,Xp=VvAeDfЅ^l2Y0)|56s̀%C-'߲-lBGO=ruP2;2̺ 3bm?ʭ?qv= 7?/?^`SCJ eX 24t b(C!06eL{'l5QPAg A{Mrk~^i_T }sN}xPT51Κ [{c2=εZ:f?`~xа;ǍL}BH(khE1CXӘQ0!C-eq%@ʷuEdFISEWXߚiWSoN <&v)!2V,e7M过LUE9P<:`nͨϋuf8| hThW!`Iq&1:,AX8]!`lb'?OyNSe/ꨃ7Jx3/~xsjS v:e-[v7^o-&%$\D rn{!lRKd^G4£A< W'=3 XΛ/t@u2^5$TKɆkzGϬm2-I쑴Te2q[Ll< C0zV/9FU脵e}|w#Lc;3&Y#k'}NR=GSwBJ9;pNvvx2D i!9B4u]蔖WȻYM[l'&IF s̻ͅjdnՠ`e}ϟЪ_Qo%][@5=s=WaI{FoA^I @es G˩0ƕs Mez!˞ٌ9Xp7v0(3J^|zkK?2;Hߧ178ν&eN2;crOXLQ̃11bI_DZ9?W!r0 Dyw]1e%;QU e=1^_l\|?LL %IKꛝsGn^ *}䓼l"#p1T{k<VY7gb_aØiv$a R@*0 1_< ` `0s0 0A1nX0np>`׃[FT̞drŏ+g>p߃ov">dT3DA% Qq3:A=_@=z%3n `ܸ1G Kno7o3A=K5(E{:y`,ʿq/@c3~݊>K?l9~> endobj 43 0 obj <>stream x9yxEU933=$ 9 C7"B"@,p%\5@,Fe@0`P@E",+#.L란}og9C(!J s! c[-x*iΌBX挹Nd'Rqo#/|!ʘӧ~%ĩ:7~§L҆J]NY4yGfO)8ΙTpTL=?#D%DGMU| s?9}wg'2~Rk~@ji7R"ڛe )r74]z$mXW8.ZȧNZH7R9,cxeGI9J 5 8O#=X8h#vl>wm& HI =!SV7k#wCB.Thg61<hB)c&YoL"e XKUBi2ET ׉HVcBQ|. YukdW*p$?y!-u?v<Su۸? Obn \0mfZZW=ZPġ/ת;TI`fB#2ZT=!|U'>|KH9:XjqTMhX@-<~nBpe&nMăQgОңisY{ksImi;;^Z7k"~_ptx~-$WjI?ހ2?\7\vЌ$6 h:%}7.5rhk F_ck.9_/|~..\-΄Ygg"4⢱pc#?%c#''*D,1>a9/q 8Zx_7';䀃f} x@].qp+ոa}/ K #탷,Pe xSx[ n]^iy`~C;xu{olʗx^~_l ؂HyMo,jxж^Kop yx70zv֙7J}PB+qZX-` _)XB\`ٯ2*xxZR ,P2V{Vz OaWzR 3{4S ;٣<.1fހGj`|ML%6>5,a&$ `".&:` Т0NXD=0Fhk`X:$CH< 0W|0Wk`@$F^7蟫vg^Ag U?B??=+o_3Zql}O^G@o$ %g! yaM@4* {tɌ]A^xAxs4dFC2"!k -59 T6BJnSt';#; Y@=[% HLHEa E ADA("B@K4p  u߷ Ps%l-(;̭Veg 1r,AمB# `Vmd`DN ᠷNe L0i4 6~+^GS}M#?gSLQ.۱-w"SG5L" ;͙JNTgJ$0b_r;/Ƃ +8U[VvU-n;ݫ`A/mmL$f'*9fgy*Ya./w^&LuS[Wxo}Rb"lo'D'#:R+'$+m_k R($9O'[KsCQT*2.ZPr9='LLlWI*i%4VWFTFVFUF[ GJewS\Hҵ'NW,OxDz aT2vALH}z؎47"2ҜL{!ff1E83F;s#xFJ!Qv(TJݵJE8#Ȗ!:n@9| %'h*WUh|Dq|;z['a%9;kv Nx`+G-}h5?]=coCٓaC]E;j\iwfs^}k_D7T.R5a}".Us9Bvd]1W;lf 6lXtڥkOϝkV N42N"FDBI7`j.U*bMCN:4&[Q49^ zR^o_מؽdխC7:[|s) OY+O܏\LhRke1414PLFlԦ$dLeTKۼH2T4,Ņq(ҊK޷/]aqz3&[]` 4kMiӫ_m=]߀c1h6m7GtQTzSA%]̃wcsmrG *|ǿ، zeUPֵ֫elj#8zMQƠZ#EAUjnK4)H1f=Ly_SݒUٺJvn<ꗘ״3e[5h5+BS\) P^ H >oC{)P.i١,QYm^ʉI ]|t#<^Ͷˈ툧5t#.+7)m"+jS,C]NHhA[vfm59%+Zֱ=}tѩ>8vꠏ޿m̃㙦,O|/Js' I<ۼk $IoKhtn_h Y/m /Uœv:9:ݶ@ssb[F:Xd3 ds0W &ڻ;CG2w>}"uQ<3+W{y1q5:>Kuo߾7ެlj `ވ1$odoIdQAIG2>*^;Ъ|oףx=N&4PZ4f@b } l7EX'pKx}mJ2gcS-== ]L]c:8i,(Oԍҏ3 ̏giaU@ ~eeN.;|cy9sg Q3UL `>R9BUTDPQAEEܥn+ 5e5k IX4JMb&9$ю,w;\Tss]y~aiy>04<= 3G,t/?mxҔf5F14އὌ㍳أ|q)[eq1kz^+_V_-nTv Ynk-Yfn+>c\/;6C[2`MF髉ɬZ&*dQ9f-yV j5bMءQB?ٴP\N(+\ֿI`֟ &Gc `/ 7ƇZxk}NQD6ŵjQ 9X:etovGdgUϬZ_z*o= S76\xy'>;+@lLuz*}Ѥh1v³Z3)Yc!l-m9^g$ܔHX2בxUj=[hP h@B t+봲4 ^ e&!`%D+/dIAb|5q6Jl#_# zEM%HaϳYکoґhCo4 ڰjwq@ڤ^ z:}[[0xSIϙdZ: ƉS =j#C'_hkimm."y2y)ߴ- M&'ުwh}"s۔dln ԅ:3:L?\@[ZTrt:l0n&KyRp~FNBѕ^$RƁ֦ 6:a qY7MզCaQ1qN~Hd6J|8o‘#%M pƱ=6#ڢ#X1k*h(0]q$"$si'N`H+M5eSfϻo9gfj9n@C r랍䤓d&OSiTqv)yJR&_b"&П q_YV?lu8X|g͵$w_ endstream endobj 15 0 obj <> endobj 44 0 obj <>stream xVip~3_JYXZ"nHH@@AFB] ׬ 9Ma;@%D$"ǔKUI\q#v*U$5ʛ]TW&)JU~T7ZjRZ~g_x򡆶ƖJg}maS}meӬ ;DrNSڍњ[j1-D1,{Vֶ'S>&u;m-f"z#53Ll9QlTϣUm믈$iھO]pSͪ2J?ea}1HE%*ǩ @O{G"ucCl7nr-et>P)Ehfhwiiԅ L!J|ԠAYJ'fvD x-AU73|G]J'=I9t??>H+4:ӒXZPYQ EnQn2 it"TFz1W{]?DQe\,%190_RLɏGΪ\]//{Z^Sƺ<4%V,_a"k1{a$c I5ot3 ѥFn]ׂ͑9o_ɕoq%VRН4yя ~d8.Gl:4gi8ә*hLw8ķpʏ'Aё&F/p]t`~<`ǁ. ߆žֈ׍/ȽN홀vw˗ U-wwcwT铻K;9>;+;b:B [H|ޏHۜ.sas:6u݉6lXcrb-; jUhEk+[ȕaLAs8U6;Tub}h+ 45V˦n4EEcO6VQ >ԳQ}scZ5 dex@1 |n,4P| .+#9%z)f`fCdEf19݅i(WmʦdYSKr %)ԁ=Y@OncxSD4&OY4&'i6L!'Tc8qNcњ,60:56p?*Ym'gT2 3eQ ܲ0EAMQA߁y9 yD<]G1|X^aذ"rk`Wo̩ݼbH=2NɄdY6db1 UǨi/5Iw%5 .\.d]F7NH;si `τ]RXHDžac[A$Y2I KKD>TAP=Jޗ:[d;$C4S|v wk_2ܴ{:|{\ޱيXWA:B~[٢Żn5}}񿽮$4p~k!f?HH)J߷[2RkLܡ!+_iJSΌ>zJ3NnCڣ5I S>z''{gt{]bQ-9MGXַO!CGC8ԴCFj_s78I飔ʯZg2LvӼ}zV_Ww4||Ih[-L̼sȶf#Ni7dp/3n[[ӭi39^sbL|Qce>=2Pط>4ViM<ĞjfaVsWr-˂>(D epDrՇj_!bmmeEEoG$=)ޥO(oV)si%-Xj{Ql:{I o[9ǿC endstream endobj 45 0 obj <>stream 2012-01-07T21:08:13+01:00 2012-01-07T21:08:13+01:00 cairo 1.10.2 (http://cairographics.org) (New javac warning for setting an older source without bootclasspath (Joseph D. Darcy's Oracle Weblog))(ferry) endstream endobj 2 0 obj <>endobj xref 0 46 0000000000 65535 f 0000017498 00000 n 0000148700 00000 n 0000017411 00000 n 0000016574 00000 n 0000000015 00000 n 0000005859 00000 n 0000017563 00000 n 0000115124 00000 n 0000116310 00000 n 0000115440 00000 n 0000124956 00000 n 0000115889 00000 n 0000138809 00000 n 0000116152 00000 n 0000144712 00000 n 0000017617 00000 n 0000017647 00000 n 0000016734 00000 n 0000005879 00000 n 0000010737 00000 n 0000017710 00000 n 0000017740 00000 n 0000016896 00000 n 0000010758 00000 n 0000010896 00000 n 0000017854 00000 n 0000017792 00000 n 0000017822 00000 n 0000017063 00000 n 0000010915 00000 n 0000014323 00000 n 0000112659 00000 n 0000112597 00000 n 0000112627 00000 n 0000115012 00000 n 0000017249 00000 n 0000014344 00000 n 0000016553 00000 n 0000115053 00000 n 0000115083 00000 n 0000116525 00000 n 0000125167 00000 n 0000139019 00000 n 0000144929 00000 n 0000147110 00000 n trailer << /Size 46 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 149010 %%EOF olsrd-0.6.6.2/lib/pud/wireformat-java/resources/WireFormatConstants.java.h000066400000000000000000000051531234304727700265360ustar00rootroot00000000000000#include "library.h" #include "wireFormat.h" #ifndef GIT_SHA #define GIT_SHA "" #endif /* GIT_SHA */ package org.olsr.plugin.pud; public class WireFormatConstants { public static final String LibraryName = PUD_WIRE_FORMAT_LIBRARYNAME; public static final String PLUGINVERSION = PLUGIN_VER; public static final String GITSHA = GIT_SHA; public static final int VERSION = PUD_WIRE_FORMAT_VERSION; public static final int FLAGS_ID = PUD_FLAGS_ID; public static final int FLAGS_GATEWAY = PUD_FLAGS_GATEWAY; public static final int TIME_BITS = PUD_TIME_BITS; public static final int LATITUDE_BITS = PUD_LATITUDE_BITS; public static final int TX_LATITUDE_DIGITS = PUD_TX_LATITUDE_DIGITS; public static final String TX_LATITUDE_DECIMALS = PUD_TX_LATITUDE_DECIMALS; public static final int LONGITUDE_BITS = PUD_LONGITUDE_BITS; public static final int TX_LONGITUDE_DIGITS = PUD_TX_LONGITUDE_DIGITS; public static final String TX_LONGITUDE_DECIMALS = PUD_TX_LONGITUDE_DECIMALS; public static final int ALTITUDE_BITS = PUD_ALTITUDE_BITS; public static final long ALTITUDE_MIN = PUD_ALTITUDE_MIN; public static final long ALTITUDE_MAX = PUD_ALTITUDE_MAX; public static final int TX_ALTITUDE_DIGITS = PUD_TX_ALTITUDE_DIGITS; public static final int SPEED_BITS = PUD_SPEED_BITS; public static final long SPEED_MAX = PUD_SPEED_MAX; public static final int TX_SPEED_DIGITS = PUD_TX_SPEED_DIGITS; public static final int TRACK_BITS = PUD_TRACK_BITS; public static final int TX_TRACK_DIGITS = PUD_TX_TRACK_DIGITS; public static final int HDOP_BITS = PUD_HDOP_BITS; public static final double HDOP_RESOLUTION = PUD_HDOP_RESOLUTION; public static final double HDOP_MAX = PUD_HDOP_MAX; public static final int TX_HDOP_DIGITS = PUD_TX_HDOP_DIGITS; public static final String TX_HDOP_DECIMALS = PUD_TX_HDOP_DECIMALS; public static final int NODEIDTYPE_MAC_BYTES = PUD_NODEIDTYPE_MAC_BYTES; public static final int NODEIDTYPE_MSISDN_BYTES = PUD_NODEIDTYPE_MSISDN_BYTES; public static final int NODEIDTYPE_TETRA_BYTES = PUD_NODEIDTYPE_TETRA_BYTES; public static final int NODEIDTYPE_MMSI_BYTES = PUD_NODEIDTYPE_MMSI_BYTES; public static final int NODEIDTYPE_URN_BYTES = PUD_NODEIDTYPE_URN_BYTES; public static final int NODEIDTYPE_192_BYTES = PUD_NODEIDTYPE_192_BYTES; public static final int NODEIDTYPE_193_BYTES = PUD_NODEIDTYPE_193_BYTES; public static final int NODEIDTYPE_194_BYTES = PUD_NODEIDTYPE_194_BYTES; public static final int NODEIDTYPE_IPV4_BYTES = PUD_NODEIDTYPE_IPV4_BYTES; public static final int NODEIDTYPE_IPV6_BYTES = PUD_NODEIDTYPE_IPV6_BYTES; public static final int TX_NODEIDTYPE_DIGITS = PUD_TX_NODEIDTYPE_DIGITS; } olsrd-0.6.6.2/lib/pud/wireformat-java/resources/build.xml000066400000000000000000000066521234304727700233170ustar00rootroot00000000000000 Build file for distribution of Olsrd Pud Plugin Wireformat Library Java Bindings olsrd-0.6.6.2/lib/pud/wireformat-java/resources/ee.j2se/000077500000000000000000000000001234304727700227205ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/resources/ee.j2se/1.6/000077500000000000000000000000001234304727700232245ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/resources/ee.j2se/1.6/LICENSE000066400000000000000000000261361234304727700242410ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. olsrd-0.6.6.2/lib/pud/wireformat-java/resources/ee.j2se/1.6/ee.j2se.jar000066400000000000000000255353251234304727700252010ustar00rootroot00000000000000PKIG@ META-INF/PKPKE9@META-INF/MANIFEST.MFZ[o~/` ̥tq:A;b_$ؖWRRg!KĶhEȏ<\XZ,./>Һ'nyop.ORFћm*KS%7bs\\/ sVE*llT9:wR6r['2z~@?FPB5{etA"v)M8ւdDVL >v{e?dxYZh)Cq[o <NUU1 tl!fN5!,l9 W+Faf,H"d"Bߒ:*aG$0JIc *2r yǻygfڨ)h/{F(CT˄UMSUם].uw:bނ-riS?l:񵁔afˉmnи1,^/,(2Veq?P_)Leoü5 XX聚=|#0ENxAҔJkN/ ?Un XIFQXrN#85/ch@dp)l\([k lڲȞdf;n~yjFIB$PITVC6m2pDgƧ̴WJF.L& F2ڪzJFqYt܃S&(XNx#҂x gl-y¸sEX9_?uS<%^LFm]Fu͝fDÿ;t>yV*UaC j!rFGf_w2;.BrrP3b"TXiWfS1~z 8"VI%ջĠ^*9'Ok̊WΜ*\k&ULiqā}lg<8-08Ο,}VhW֏XJߙi=y ;砓f&)9OGAyfwP#Fl#jOz ?~#?yey}1tSWd`40h)1֍g}FWDg'u-K'| nkf <{#?3XjADh)pkOtϺC v 01hިr!@8u# T9 z{O{DOJ[~{،*\RBlyr(yQ/&;Og9]fD*ߝP3br޹Ut8xPlJ]6o*'tY v@cu.uqL9臼E CwK̰IeF3<|->'PKeYS,PKK>LICENSEZ[s~rSi4i牱䆭CiDn&% . =dwVM5Iٳ E/˝u:^ qw}{ws-~]SW j.T;=rnk3' M#Z%;1Ie['dWtbtVTc_^>[i7X{!pKUAUB֌۝N>hxΔcX/cO+Mzw P  8s+lv[z!S@me#Ic$핐%I ZY/^Ao i ! RcWҴ$arxùxg,я71ɪG3/eFGqB_RWY*;w!#J N,`E+;U<׍+VN$ٹe \hЄvGI%/i;aA:d AFu`R+'3=6L\Z]^&Qy|x[<'$ְ[ )GZoUkM[p4IY3htqw3r!8#A^ ?Pv;Q|lpcl(?jkZ Q9|RoRyH\1=qtLH^cBRs g' NPn*-pc4 (KҘp#-1bZYdąn`x8[ dV9 X[BA[/eΰœⓋW#$Sc Wh7; $AP|#:Tp~*܊܅r8kiՃ&Wbi|66|y6yaX唃H!K4LouNՓ/ı0HVRT)h:Fj'2㤓 ND%"Ѩ'Ju"9S6/'\Q6 pHd6 ~J"KQMm7n;h#ZLjDe}5ie^f^˰H5腍l(uD>[_`FWPhd!R+K:"7@)AZV"r75wTXBJ v?V>f+kF/2DAfmprtTiǖȏx4`YC ʾo48U+lv8" ɭquNZMY[@(j_`)_DVOˎq-$obn.5?B c::e[VAn%L T"ƹd0)Y"(Ifb<2Aŗ5sgJ2%S/I 6}ԔAddITgu>Iy=@ ]'MTũezٔgTe Y V/s0#Pwa_fM[8"5P":LflȪ[w̤ս$ Gg~ UjlmDL;1 `D*虘80O[5Q*Ұ +s UƑF:ag|흹2b1]hSY<<ъӹJ$ΦyI۪IgD1&cةu|K͎ ^5@7:aRcK 88l]%;rmӚyEjf"Vׯ̀ ՗ vKR͍P_ad.1)X1D[(>C#S 7Ī|t{?3]B΁)wv#jL_5lqn N}:CC6ժFo; tr)~4jVQ+bӁړlȦ7_ ΔԟJ;jҶ]1 7yc`HKa>]Rušq?ˉs/q?[r=?,u07bu^ZX~_h~K'ф+U6&MDsRpM."{ `z\[z?]߽\|B~u^N~Y_so@6t@73NOB˝1<I䲝fjExPGʮT|ǠwՒ4c6Awa6Boy̗ZcsmhJЮ `ՙѹ-!Q ъ)Gkm&CW*QӹF:-l>ƌ6F]8WWXWϽG/no?ߠ iZz/o>%.(kiBB>F:Zr $;o)D_gh2!Nz..L@A.uԦ: @;vv7"zVp6/i?' (Nr@!c嶋hfqZݨ ݐM.r4F a|_PM<½kϤ!o9e/UBzG>HgO*.("#\$OSGI-OPT/src/java/applet/Applet.javaTMo@=ǿb "jHnMNI[D4{l]v5;kLd{ЃC|yЍ{0sL0L])+L|bp$qDي<^^D#mA$ebWLG b켩qL3qZPQw3{fkе=x'Fb+QGW' -M7TcN)iI!dhwP-YqfqK#: rTEn W# }V%KX1=t)|˖"s%x 9WqDi?sG.'KݗOOZlu5Bww;Ωt.m\)?M[q+OSGI-OPT/src/java/applet/AppletContext.javaSn0}^'X}ZUʀmQ+]G\R4w-]U=s$h2,oBticXz%:;Bf$2E0Jeh)t!@Vp{{PrFx! R]NZ-iX87m |DhTu(šhntOfdUw]7@JZvރ0*kZ[iʇjadґ늎B{PЋ|8zx}qhxb |Ŝw_!U<92z,S8[HFTndT^!;A[Jձ$9z;S9D΋nD/L4 >ö9R7E/1L86ֶv/HLU%FK'2l|TԓBi*,¸lBjoce*b(JѮc*&oIۋ'+ܷvZfަkr:૴vOŬkr[]OuA+z;`gN~doBPKh SPKK>(OSGI-OPT/src/java/applet/AppletStub.javamRr0= g(89mzpfrbjA;{W6ēr}zzFRu'-a7`#]~?6di Cz2$GzY{@;3U%>\4?8e'Bo8J4xYjI(|ġ @G5D݇(1dgšu\&$uߑ^6h h MTqVֆ4Z#լrG-uFUvdM)բUh5I9$ <G>o;x,Nw:mmJv6Gg"{id 祋#^IE鐋Jp&PKrVVCKGӈVXf[o|"ϣ8l` HyYn\!}A.X>>!a`zwGt30,Q-h6pI}q*oqxߢKS(}eH&7U+j*Ḽ\=PK& PKK>'OSGI-OPT/src/java/applet/AudioClip.javaeAo@WJ Өw^I Fe!{)Iaՙ8ֶIKK*/Vzе,ĻR턵Uj,I@=X5s8]AY 2;oyWc_m$-ܦEṼc~1l| 7Xls>#͟- Lгa`e(^! \s)uMBd;]X*ȴ|`\QE CU#~'&_ldi_^l;zw\LoDUܟ( PKPKIG@OSGI-OPT/src/java/awt/PKPKK>#OSGI-OPT/src/java/awt/AWTError.javaen0DW |WrsksRȀȑV2[dIʊ߳4Au@rv0p6g+Ǵa]|HV U׋ŧ9x<16A!GDUNUTE@H(7񋬓Z:^`j2 g(Pڣsҡ-K2RG3.}F@C`ûЗ$}Bk$u]\#SU%`o'-O?C*ŞY[C[y{+TN׾M%rw2oPbi`˶?[&ͷ٪z:Ͷ:7~fđqz46L29" wRֲTӉY=J1`lZy^sFIqoqMd=' +ku *7Bx8>?I1I OxFE/PKl#PKK>#OSGI-OPT/src/java/awt/AWTEvent.javasHǟϿ+OϺg/\")5hftS[߯FI LힱhQ탂vǜ&!1 NO?OGJdbϢ*hkD$b3!T+]eB478:3-氣 rPKLO LwYeCRNH׊b8E ûq PU.>JeáG ǽTlq+׶E+jLJ[V~kL [pMApœmdQ*TsuҴgXq&pf`gmEVvp.Xg:M|p=\gng0;y MY"Xؤ%ox%ۜnl= V;.J4i︢x.jaB_AZY]c4TYвbI$K W<W?ZT'4n=%Np0+E.OSGI-OPT/src/java/awt/AWTEventMulticaster.java͚Qs8ǟOÑ4owua f:7 '.~+C8W >꧵WZpoC:OA E!aUyNa>$ [+XN'phˡ3b9@#1 eFdDK4tKߖ> 2p],ccߏgYC GB_[7_zi% 0A߉ԴDDTk f4F3Rϴ42!VC3_FAb2A{a (l"fڽ{uݿ|]m=tչ9o۝7sH!y1v)m8OzZ zr(=ZZ8JaCZD'25&@ߺ Daүrj^LECY-JAA`ͻCs\ℾWV Fӳ]Q0D] IlSҢJŊоPKbD-7P:FF3V[cpn׊xZF;܍@W`.4 \-jDZl2 e(UbdHߵTm@<Xoɼ҇.?SOYhM 5S%}iܢfI* uی3 ʑiR~&Z IrIU<N78ebe mlT<ҦȁȪ#e X:c \R@d)`!1X,p S%ZQ6Sa}%TȜBVB$[bdK'̆̍n G\Y+N^qJb,։GWqsbiǒ֎b_/[^VT9J6}tq{Cٖ1]%׍Tl*.]hF* ]#\}Icۋil]} E/2tGЎI#KC/t[ʛReeۙQuZ!oV[k1bTž[?֘݌J:pIkS.iV{ntxN؟{ow{E O& 3Y^![s.<ŏkR OL~0ED߭㺖8nm;uxWg"-}c =):g4I&J_۟I N-oݹHaZd^ĜkU.q/6җS\^ @1זJQ켄s PcѶI7}w:2Ems/PKd%PKK>'OSGI-OPT/src/java/awt/AWTException.javaeQo0_qT,a}QEDҡ>۳{ J<$=NrsmNV6;q5."ogOS$XÊ1;YrTS5Y!5PY'm<8FCi4 'a/NPڣsa+[+2R{3 .Oxr Wk!{%Iř8ֶIڋ%|L=t=<afmEm!K\:PVz)^X 6tM߅GplBaȊEVL:+,K*lQ`|gey iY~?qd| 0 q^n; 9CʊGSM'BdOCv/]Vǀui^z[Js~E"m8AT`t].W~:zRhBV{> -7i 2AxAEPK PKK>'OSGI-OPT/src/java/awt/AWTKeyStroke.javaUQo0~&ԗSIKy!P:6Z&$[jIVwil0Fᄏ8Ca,@7,KSD @oz݆EjFU`%9 1"Ffe,_Qi.!t-SuzGb#sX i H\Òxaf :ܬ<5U5 #8V6EW1,KU]A?LKR]Gsp,#U IkJ XΌK I\)41F07{i xA>z-Ʌ<;_7{Ӆ? `6lz/ٔV'M/ԟ2ʃ7Lnu= K3GTHr $@%"Pm$04)_sL.h8%bsYi,ARF¼)n5Vqs8K[EԎhL #cjJ"N N 6n%Z+JWQ@&W#6,ں5{U'hby3a]hǼg>&s5v>&ڰc8jRtw4ڥKj\Yƃ)ʚm|< xc?dEtsнn< 2GZy(OSGI-OPT/src/java/awt/AWTPermission.javaAo@x#&B[T؃캻kw P[y曷U+Lts0: DZR0#]c,bA̞ʘɽ,HY*Ѫ ܖ6O_𕌕Z&a4[J;CZldMP]ӣumszOC`6BCs$.GX*OZg,eAd- h fZt25=ug`u)uF[w/F^\ A#M,*[~?,Jț9 L泻lg]x=5oyED}B r# ^MUޓQ2;iZ,M-w w&OSGI-OPT/src/java/awt/ActiveEvent.javaeAo0 rJzzl3V8@Qi#im7G%b>ؐuװ=0lyב2a~\~X?^qQ`u*45F|@ȝ* >5p.a4'QX>xP:|ȀG7ćs%aD䀓UZ's`vlTS۬hCv_e~/өawO^&ޟ@9j/zPGԣ'&. ؆G1Ӿ7c_ $6e`WPT3WE&avb]f MyWM)/O(gI1-BPSCZF3mZLB uH\Q$hS *U#&Ko\o\h$KuL)և0/IPKʺPKK>%OSGI-OPT/src/java/awt/Adjustable.javaRn@=_1ɉ\F=mP]I^5 xإ;d'n/ڙ7o{lg0SVS0JO!JeIB| x2i Fz dA)J42C v"OjCJ…7 QlU؂TAr*9IHUUZ)C`O>EwdҶ':ŞŤada2[Y1WC jVk-E J(4r*dIc0*h22VӪjdMH $HƎ>XDK<(Y^ #{$n HN1R&FڠjV3GSREVخΗh2pOQl'Z{9'aYԹcclo$E wXG.|߁asF\|<^aE,IP%ѫ7\#`#[*UTC:3UMuP"i.${N W鑝=ÎǼ} yzכ>;y {s`|{0PK[Y PKK>)OSGI-OPT/src/java/awt/AlphaComposite.javaVMs0=_P gxB&_P+$W!L{WCmB8"mk{Uɵ擩z OdP?h@߇M! hP1n#9J12F v%,bg Wm;Nq*,sW&H͒Bڂi`qJP#hCBָ f gjmZ,M)n*=ikZ'~{IuT 44MGRilJh5IhbnVvR/lLŽ/Æ#9ǃ!{A~/AA>Y__wQJˀdrW!DH\I0cQjr DQK3nܱ;g2j5GY-l# d"H')ҁ+-fRqn[MU8 B;cl+ܡnrxd*Dn< ;\@򆃟N:Yw8O@>M+gRTG<*lA*/ +c:)-]L9\70a&h3z ne! _}[5i{ c.t+vme" N# 4UF;htc7Z8fP/VPKwI PKK>)OSGI-OPT/src/java/awt/AttributeValue.javaen0DW |UrrksRȀ$hz-IA=K[T g,{tBѶJhI_M)x41Q$O@ɭ=m 9Bo'ѸʦGh(&h:tCylUK'I6@iHZgp$x<: `y}+ۅ`?y8g5y{ͫz[w%o'^!,SIfV0qĵ`"uTPI6Q(Zw1r5z/E]i4y(Ww+<eQyEuSEŻ(G(#>d]L*!l[j$GM'Bc4'%W>>gMi^NG劍$9FAd׉XsX!d+C{vu&x_+pn"dVB7?xA$PKt5PKK>&OSGI-OPT/src/java/awt/BasicStroke.javaQo0ǟǧ8 mClKGC@j*\lUCcm5-;;ݣkATA+l4L2JXzm,oH >J+,`D&4D&1E(@vNB#8G!)gзz2@5#,WPHTBL3 1W@|J*Obeh UTC[E*I7۰;qG8zלe(%UP+^UHkFJH"P7KAeI$UIJ%PKt4ahn1"t> mo:L}M;s}ۻ7G k.6}G'] sgԝ93+ǽp wp0g(X{ԩrnz݋{$SR#MZj="  Y6S&Ddzg)O^OR5hDjBprF*}*> F7PK3([-PKK>'OSGI-OPT/src/java/awt/BorderLayout.javaVMsF=[K'٥ oYWIȦv|rA2 [X? m*:Hy랁`.ӭQt eat>~}zjd >v[`HVN&bbKt5rr86Ȱ,A?WTXA"!ۃTRQW\s3&V|S'=jһ fvcCrW!ؾo{an=Z﮷e e* t'H* x#*MKRC%"(P4m-I`lh2st}E]&d0 6D_؎Yl/E!! IEq+Fk{[L:7 \Z*2ķI˚p2(Rew+;Vo4Ë)7Y}n KR"fΥ2fH=$4T Gw&9ƶGÎ BHoW&ΓJo{i_5uAq] hkZZo7$WwWN|׸аcj:߇g18ns:VCzdrvb#)b樣ӏa_/T=o9_(L[RDeF\u`.&$QM)vSay1,Ԛ&}njįN߰tX{4ԣŎ1X1Yhjla"D9y7{4M;\#Tk2 ye뗐PK0} PKK>-OSGI-OPT/src/java/awt/BufferCapabilities.javaTMs0=_d! ԓg|LӃF\Ia2Caڴ ,8hz \FAm뷃'1F`fo fq"xS.]}N!B5so)!gZ]&[֣ =4uN1c̭,q/lo4d#/&8^E ?+z"cBwvQm峴hZ4?'_.95AɩRir38-foeLܟ U͢W^R7ejPKo;PKK>!OSGI-OPT/src/java/awt/Button.javaTMo@=׿bTڜB[T &=m]wwAQ{gmA؝7o޼}{|x0Fm_9iʙ܋^cS۳0H SԨ{`IF!OSGI-OPT/src/java/awt/Canvas.javaAo@q[j&E9.Lkv5E.RUz޾<b] }9YH % ahp7y"*FnBOW74p }/u[t[qTك,dT ^bH-;ܦӹxx< P);pt8W~ECjVkGOI<LzVZ VdxDTR5h"75=umȑʇ`uja۬:C]G?plBA/J!I{pI:&dee4GE2Ia6x6}HlʧM_k2}rd0&8-Bxɖ()#ɣ9BwhO%-YVˀkoSЖpͣ?FA9FNvwAY8A`XPIƼ}PC!%D+*¨;>^hڿU⟽K Ϝ+!:2B;޻SG# IkQ^&L 3~wqg2(WY&u,'<]-V;фJhf4>K4/%OSGI-OPT/src/java/awt/CardLayout.javaTr@ =p 54K( f0IbF1$M`IC_e+MB#hFK2@ht:[ߟ{ 40Az CeH PRN4^ͮXR, D 2ITU NMšfV0\pBO.Dv( O=vƚŰ6>*R&h hg+ Č&A9fS]h$Bht4!i=6]&${> :|CH{Io40@< 񈟾Bot߇A -:̴es=E$Dj-dPD&\ZdS2n&'}BZ}nBxZAB1E+{!BRDBwkG#[ EHZXiA_؅DXJVUSexvi}| !˞>& ʗI>/ OdUiׅt'Ιy,I6:L(QB{ ҍK%6D^':?*W/i/  j3L}|= vX4 OS4Or}yt_%nڲOmyF5_T RyÈ4|x7i!WA{CPK'^ PKK>#OSGI-OPT/src/java/awt/Checkbox.javaUn@}_1ʓ!yk4JA$QTam(;kp ̙3gfLgЕRԀ5ap3!8y kӵ0Q0v xBc Q"x諲R:V楅XR!  kfHYEmʹSX&Pa0rgi\wf*kjLݞ.+RMI={*V$5(sEK`XH\6MHzb-fZkx9Ru 8S~в vpGu!t+t^~ IFyp)[Vβ 0%%a<$gTdRm[5-LSn)겉ڍdٌln.Y%u=rAL Xo._ `)Y}i FƶU." 3<n S90LF~Q5m:+Խyڽ{[Eo3k?u]t n-ܥTq}qmw>Q/.~?-RF=bAH2gƸ{5Z}e98ۧy:o]So”>ѹE /=X{FVPKz< PKK>(OSGI-OPT/src/java/awt/CheckboxGroup.javaQo0_q m}iVD>;RV: ]+JC"DCLtu0:D\R??Ooc+-d)Y\ˌm q%2t'# cV8^w\x(P[b i%2BwUHmt*w^;*^m^B}UiPġ6ET>:Sw]7$kaW- ;^ *ĚYK@9#TVo\# y\ZgvoB;2P)/q#/r-nVxJf)KLiJs^}E82CS8o)~Fer#3ZB(vNZs/Sʝtµ['(8{/SE(wTDV l)_+e)zÔ&uo< Y42' %]JP8}9y9bGA&1 rQPuY^JXOgk:ffps^SPKj(PKK>+OSGI-OPT/src/java/awt/CheckboxMenuItem.javaAs0אڜ\B[OS$LY^#a2]qҐvZf}zޮ<<ƪi,fga &9Bt4:ۆSA4 gr!8J)2E v_[ Ji0Rop,v5ہTJ! ,E[!uѢU®.nZXFrF Z-B`+kaUUah"OQ.eƀƟД8+XsV2TQWZX!3Zڊit60VϚHѻj c| (u2\u8E4a6lz-ٔV hzR=-K@µ"ĈA2rɬdB6%%Z7VCZXfr =|nنg^Q&A9# ]P5[}5J)B9r&ׅm8" lW4{ʒ!OSGI-OPT/src/java/awt/Choice.javaUMo@=_1d"jHom.qV#0iU=,65ELhSyشkp ,x苀 I{n4>?4|w C40DzO ^pcd !H2҄嗀Pm^[GV$a`"\qL- \RRY^dqJPc(!I̖c\.}+kZa׏zHu 44΄k`)lLZM5R*zr&v4:X8m5RU$ԃ¨(1}<1(E0BgpЧ[62THpvS@DL\L4cSZ¸;D̅e6?:jj/GgK{[K19 OSGI-OPT/src/java/awt/Color.javas6ǟ_'rC!KC(4t:,F=!Bowe"@"J·|VsFqC g2Ah^~:mjgq& x2)r!XB:JE n:9*`V "Gbf\ S.!Qf^SSxjb3ꐑ5sZt77&Y.mV*n+vDwa7{?םkxMH`KPXڌ.jfLLyn4f+ik@icN8[roFwc(^ u8GC~`H)q)6m:YqKLU > &ӂzD-)"P/xn5'S| 3ewqف:Y-e#+&AH#a]%jm@ImBjZU;F̸͙dr"y[QArN]o q$tC':nGyv0GzlO ߌwCz}8pPu'gDvUIEgMOBԻvdy nx {RUxR&v)moF[= ɊI`MO”}Ve]IJ)1D ۓ!;ЦΓ]Ot3]UxR2.gMO~sn0JۓB!ҁTPJL(flN )|Awt 8؂t).PM鰐LH[vuĚUczx+؁o+;'B)3w"kzlE7RHwWZ~nK*i@Dr+g5EQ+޴G6 )Kuv{0c:rz.`IOnD0@ r;6Vf/ٙK"澥P;]Mg݀YMvQI5Տ!J~!kfiZ["}l߾DW,r>a ާ܎]ȑp/i;F_PKI3?-PKK>$OSGI-OPT/src/java/awt/Component.java\ms6\ L>)lw*%ږRf:DBdAʲ@Q5w×],uBYbt:+Q'z4"S= F$-HiL*gr?՛c􉰂f)z=ENzhW(J(`MhByH^"(hKZD; }0qCwZ7+''岋݌MOI[/W+iB1ۂ2xpREx &x2xWf\%%MǨ&3abZuԆS7D t?08Bݨ5Dt1;F1"2h<Ĥ\rѐMI&E*r ktM'R ӂk&sZRDQA ,%i)%s*j-IYGs:nҬ;$.돣or$:6E(Yq<$]\ф [a͂> ?8$Y5F[ހН@W'rО2)hjߢ'Nl,)plMl,ZC%ȂIt ф糥ݢ ~e V>{ҕ]Z16ќsZV:PY̷/Z*jc\MpR7*@SR*)[E~1I A4MVFҋlQib=ayqx̞'2M !i+,MaC2KF 9+[\B6)¸39&p[KTێb3FBu(iҽ",5%z Nݙ0_0> de[+J?ilŊ5b\3}POTL ?XbÆ*[ E);6BmyPzYdprDdMxkw(a{g"gqAp`_wNff10mtzx5: APKoi.gч7%c;OdBLWT g4cˑo/ :%pnPQ7:Mh "4Wɾq974P^tT' \ɠd^;WZl3"oqX#|T jdxwpb3*+pG^'4?^M-le L uwS)[q9cR W"#ŗ 7jd,[{i;|0äF=U 3Y'4I2\h4ww :NxP9~繹-<m'hpomV]3?y }qA{1D<#ٽ GIRTSD ƿB՘tF*@EγԍD3dsm0@>P0f+Ѻd!`4_q.8 KyqAh/@n3n^( qFH(FZ J4G?j<o}.XMb}v)n_l> Hؾ.{)2]D[= '\Y_?kd©L`!qfSy꽹 FU%q!vXE>+{i$ҞA8lT]l"Q,wF"qCi}ӻ>`RWE@&!fdP+2Z"p7τGnǵ{(ÙnrIV|-[9[8e OfWi:}1_~V.Fc4%CKZmf %I ^ڤ9fx.n>nd!C)rC9]ۚirA bzv + o( h!|ߎK~ގ V͛@> <6]B~1agL&2޻8_>_bW/1WpV`V_"CW췣h)ڎWfflЄ揭Xқ1jTfi2GeMFo5o;zی3۫{[s3{~?wbn~D׊9V0k+[Jh7i}? -G4j*_iT99gQPKjiVFyߤkjj]l[{~cUTzHdEђ <2gH#c.N4mt 〻-`ytPK SPKK>/OSGI-OPT/src/java/awt/ComponentOrientation.javaTQo0~. mhR)mTH$]է$ؙҪ}viCw}A0UVbe!8LL93,ߤh Kq`M݅{5Ε›G}JVZp! YROΚh7ACHU:sjs-Hk"<ϙ0x<`MT ;:M *DnIX]=5ˆܛ-G{HWa*a%Eھt:PK@˟PKK>$OSGI-OPT/src/java/awt/Composite.java}Ao@W6RXsL`2&;gqT=vVYCT!СB(Ԯi{FGCV\WյŽЧgkm1 aĉ8PքrdL=zj2~Rs1U!rfm!jM\QZZ> 49Re7M{enh12,|goOtF?^bw^An%] '޻W]p]*V, MⲚ^trnJjz۫zJ>0q+OSGI-OPT/src/java/awt/CompositeContext.javauRM0=_1)YQfuE$6ڣLKl6!Q1a]{oCZBt Y!Wm|~XD> Es:b@J5FhQoʄ%%a-a fSjQ\@*E uxP; :@0ΙP<x0T n|k^p;8?0 GʴqwCd=eւ_=޸̪%sʀh r)z0H!XոA05Yg+ў9/ X6!a3iz}}>$ۥ9}K>C=4Y2gmLW@|EQWJVcE Ul{"FFz[-=LGGr7{Aq?=q]dFkvZYrV;;;)',Ο{#:2T ˭pfsor{f:GqOPKo.PKK>$OSGI-OPT/src/java/awt/Container.javaQs8ǟ˧ɓ./uIz. ioA g$$2|[Ʊ O]VbxՃ+xjm .aFg"@pG}/5̬jT[ D{B"BT`nW/TK׃8L`v D#1%G. r)(V |-ra3riY5f ژ0MZ VĿT^_DZ(XL KA*`+4fU*nXA˥IB 6/SK^#^51]?Mѝܻa:trͽ鄞>; z> Lnә"5 KK1| MBX-*AAjõ]VMCfWqى_ ζlRsӋev2EK @ ~J l~r?7(.N>λ@ $#̳ŕ[/Mi1ъ \Oxu*Ze>*yk^Xoh*CeZ{9nqbq:/uP;z_?4 Zt9| YVyEEoii>-~F1oe*8+o"RoPKPKK>=OSGI-OPT/src/java/awt/ContainerOrderFocusTraversalPolicy.javaQo0ǟOq *h߶>n*]ùolU|i`T6U;gp L\zL$jA=Ow8l,D:# B_q16<wBGvj9ʈ-Cp܆kswP ъo3C5eΰƓSY"eķh5aȳk@gRJERxǺ-N\6Z] /?9XJZ*HY+ ~l=E }Hu\k#spڣ6~PKN\ePKK>!OSGI-OPT/src/java/awt/Cursor.javan@S.8T^VU5ơQ޽ 'ʅߞ9s#w_6% t#ba> H8Dhzi275,R0""X xNyHJP*pbefl&`7'2!E!D aJKkˢNbuL5'ӆ p].~Kn/[\t-sD]8B@LHxOksH$DZӉqKEJ:L(-4=xд l沎h} \ȇ; lްHQMl !X'[K*PEHŋ/eLAr%9VEgF&+.U2kn\i6!8dRp1n(</ms)RsocQ$_Y0ܱGu9΍0N{I z9W}UzUI[W54zySW+i 8.uYWL4fWٌhibT{k;?~ "v-Sze wpj%P){@o. C,ҥ&Qg28>?JTf|ٯ ?ҸdJ'TR&iؓ)AlecݞaPKg:[}nPKK>6OSGI-OPT/src/java/awt/DefaultFocusTraversalPolicy.java}Ao0 x))2;mKXaqGEmIrݠxC AǏdrKjS9CQ~RHV - |tؐ#@UFIҎ*" '#s|#Ѹd MfWhzxC9Ԫ%УCiHsFAHp?z,~)#{}Habq"muM\-SY%`g,w;BtL%ŎY[1XǼ ԃU^fgj?KR[f_ xlBc >eV΃]\nqn6i% EʶYi~/Yxd\;:`Ly"JW9#tӋИ;BG\Xc*ش꠼𧧿 (9FŃ௢![`+Ek#{9~5,82']?kbyތqgDQ PK:ƖPKK>6OSGI-OPT/src/java/awt/DefaultKeyboardFocusManager.javaSMs0=_ :Ԑڜ\BZORey jJ&ޕ1~L9v÷x cF,z䓀(w> 0C, Or#8J2Cnj鯭 ++`=mKXVl R9(-9jBW+J[6sZZ:FN~#0׊n~Kᰮ5ebk7x'wE?JaqIg)i-X [S^umr1rW3& F@1 0(0'柧wsg0G3OhMc:]A?u_)2x$S87[@B6F.rɚ\lPI@Y jI`i ȗ4t(XjweJ / Ĝuɮ/& ;}':oZWz}xgVrsDmK$ȤBlPdbf4؍ӛ$}a:&ih(N*Mh_6477/H4rVXxg+cGlKjل8^IQ@)ރ?u5X E`V?_ xʩJ}zS;PKD-} PKK>"OSGI-OPT/src/java/awt/Desktop.javaTR0=aR'd RCvTId ÿw8`zҾo߮<=Τj^-992}nRi E" Grs hD!T,e8/ԆK' |0F㹣6l BZh 7PsT\n vX82 gPVV}N X8ֻX3qDԵ*^m)RiYR4ҙNu墚FGSpc5_5i{Ta laeGr-'K 4"$$>Q- YFy^iW]!C|!;IFaKSijXP@pjH`hj~M].;G,`{Y׌Rw4h6Mӂ*u0tkrzFr=>qS }b6N#hI;I2E?u}Fxł>8'>[14F M]ߢWRHC̀i96x~=ǿ N7Wņ}=- Zs(QYn=:(P3wcsܺ[$)(l<( w ,YS[.ʣPKPV;PKK>!OSGI-OPT/src/java/awt/Dialog.javaW]s8}.N542' 6)#la+84+P؝@xtu9~֒% ~pISFxD}뽳wlcT0mD0 #Qh 9d$zǂT*&8\=hz7kÒ YJ>F48Db %Ob}!f; W#]._ nQ6)B&ݴUݑ7pǁ B6d$ Ԕꇗ}x, xjɤ42"(Œ6 ;[vZoJy}!\grnoqpӃh:t-4*'/ܘ^ [ ~qGn4I9$ezmTkP+g:1!uЧgI.i:K *e3v猗wE3!RWS9ӟ~%ɒp|g21FSԫ'jf(:7'븎%;y-Rx jKnk:E2 sJ뜤?웹G)ރ#%`1:v'W^?mJsǿr*E@3ϭwPKUSPKK>$OSGI-OPT/src/java/awt/Dimension.java}RMs0=׿bd\C\L^̶Fr%C2GKmi{J;`lmt`#L^~nfi`Ӏ#%( P55BX?MŇ ) mh5Vg$؃TJAV#.IHԦhUduF9FC-``B%mLs[UU jǁY7?bM1'#nXO2Gc@4'^A*K iUuɒ|0je+ɤdei#G؄VCKGDa4E8y4a:t2t«N{4<2Bl81╅:Z2&ɬB%';VS'ӆ\9b+QفWK $`c#0Y9 &8:6 RADN/yzmjԮ['v^7 Cw&d1t^3F[j pPd^L/xɒe_.{ R0d;=/oSޘm{PKAR*8PKK>&OSGI-OPT/src/java/awt/DisplayMode.javaSr0=_ 2Đ2=p'ئLNF\Ia2{WġdN|W۷ʃ .`"@7<+KDн@k!H jT;\b$a_6k!J"=TlMZKրT tfU(n(end\׵yӴWd@mc:^ A܁qߒ,d6_$ adN$/| eT*eLn2EH$]as5QԬ@( GPrmǪI`fiJ写?lPYl\֘Sk [Ғ)U2Cxv>Ah[!jOf}WVExΗ! ڌS>)>E{ 8,Ej=7dImBS+9q.Ќtϰwp3Gs&b?.yNՃPK`B4PKK> OSGI-OPT/src/java/awt/Event.javaR8ϛSlH`'0vr`8G ;k+ -gfr_ݲ,|j'嫗B.&G'M%V} 娩oC"Qb#fMT"LDV(@= pV<ՓcE) :jztpt%^5, du)PC0񜈕A/WT&NCOGc^ pU6J:9nMn7bqZ<0Ot]g(K(?kY/W*S-E!ʵm!Ps23YBNj/ioqu38pxc-r8{' \a0{x5'x/a*ЦU&Ğyn-+ȹLphbFVXRD3-ʥT\[?K:i40OZ&ߪj= Br4nD7Vi97($O&T2):jV'7q_Onvgrz76rz`nLNBMq}wcݹ>='(7̜U"] 6Ae6-dڴRB_(2-9:Tg298 UA2sa3l/0'7f6MTֵ(Ⱦ܍0o/g-*$aBy]F˘!iJw*CX< E{55]c)~'ϯ@ʆlT)ny[ކcNtZ34(.BdY+Ao;נxd@*S#gl:xF~bC탊"/ԋ\jv4\bܹGȡO+c +w&IZlQ vsK&$KN7|7~9ÚjF;TfȤ_{ݞ2;WHP_9Fex;Oo7ׁQhqe_Gy}:d*U%o4Nmo"QS;S/_g^m}ب>r$^o,nD8QhEԄGK=_s?nx:6,+s~OZjg:ݵv]? /~>Tp}T|jj]d0i).'~)'"Wxي|i:M|sM.TZLU j7n6PKPKK>%OSGI-OPT/src/java/awt/EventQueue.javaSMs0=_ :ڜ\B[OSbL^l5FRawe;$>`,[i~a.A0Jǰq˒3"fO/# Ѡ0 H\ P-BRzu;p),p|%@H ip;^"mʽMN;NCn-#8#]vV}NX8:-L/b/>u%J44u\S0ER%%Aj`Fڳһ5\0rgkdXͷZ(6&`CQ<"(J`210_-/$Z-+k-/&[}d8)Bxda'[KFawPnK BZ22P_]8hi1Tg>0lZ4уvnf*g Qx)Bss5m[xUmemZ?Eͭ75oM:\TCmiN⤷qWWɴ{4ѷKF y+et&YyJ/Go^K4;S'㣩-R)н PK+APKK>%OSGI-OPT/src/java/awt/FileDialog.javaUr0=_ g\2=@ROS$6jJ2'ʸB޾}'H@?qa_p3 ςz s0GjO '(4PBX>Qi.-ܡhdkր*5d@K\@"e'fX803j()32|?uV/U>(X=FiGӱH+u@2sE$dr+I'dMrA%\۵jZa-C9D_ن6C $#a1gIA_H;o V# ,OCzBd7xԆ]T.(%OSGI-OPT/src/java/awt/FlowLayout.javaTr0/OSGI-OPT/src/java/awt/FocusTraversalPolicy.javaOo@q[OkAIQm]ww"{fD9}7K&bgDvL[0MR]{ gyY2[ZM"%eiZ& LUWZ]؅4R;]w{ R@(H*ևœcYUv.t5Y;W|t @jwQk;?$ÏL]zPCKa`*msC\sSWF86X yΈe 핑[?PA#J Np%q&xu0E4EyOSGI-OPT/src/java/awt/Font.javaXmsF~ K붉̋)H z:\+tɄd߻'@!$glKg]q^shh%l柁00ЧPl6/>3cjI C*4H4tq8ԜmV xFjZY]iaAVr$LY@~iEdj٠h&pcEPBwӬ !̕~i4˥AFn'dѺ *%)fw<^O5 KLP\S\^ X8S$j Jq[ HU˭µZn]|έд=3c-rliݮE9zHiw.{|MIFgSYLffw &uX%h-"*yd_PRA?! KuU1z .UB.hɖ1nT0/V^m,$HmGw+vzm .E0^g8BOvz9"[7\ m=5mdgG=V*CS}o7}zyDLyi3usFC潦,VQ[ޔr=s*A/i؎;0[>ĔcnL.v6yOjF. Ni٩SmǻtF]tu~V0~}UPp). SmmkNAv_ح~ߘbIf2 Ȫ#H**ESHzXyjZfrys22KkoH/(Q4YItĠϰ].Du{Nr҇;.aF')J?U 5E(&XEx0pkj'}Ym{Hun?Q2]8t|Y2}YNf|B B6 ݯ{]쟫}[C "39ŶH=-'ų QеQH-秇ftw/kEybk{=䗳1^)ծz|B,{2K,Xn=u:VN:H9Ef%c#ӓ;5r:·Q gќfh" _jm%ҭtJ%̗EOJ_93#!NDe['<ƣVj8bOs_ gɠ)ճ nl"'\9HPFջF;]y׈R8k_b}7~ZeTe8}\N߫6Bz?:lsQQ9~rRTOoNXs"{d/݆L[ɖ2L^`RRtݏK ’q*oAoz̦uz@*PKDPKK>.OSGI-OPT/src/java/awt/FontFormatException.javamAo0 x))<;mKXqGfmIr/xhǏN"\af1&X$BUt)?OpUtX#{:a r'+Rjt& #dFT"1~uR+\'SCh&7A; J{tXC:leKcEC*Tzo^ݹϠH8h.i6g}'Lhۤ%ץwl^L=Tݫ?<afmEm!K:PVzNo}/,Z:oLȣM`ۄ(+#|ʼC_![bK,W-|/ >-1->t46L2y"Jw[}Ar*N4F*^Vǀui^zWQ>BA$76 V0B+v/ѓݥ$$PkE~2AOxFE/PKɂPKK>&OSGI-OPT/src/java/awt/FontMetrics.javaVMS0=_S`R'S)$3q(tz퍭֑\IG{W!M e&D޾}]׀=lxh08iʙZ~]n"5Pa%! "B&Ap3Wu҆4.,Y5w-R0eK@8 Opbf 4͹I ?U7 #8#&u 0S.c|>wXؑ*%Vw.?yC++֠[E,e*diM+3#↋ ZN̜)4F 7kIH6&M8v}o[ko|>õ;wpသNooR.2e# ܦE$Ld)Ig )4,F C5^&IfⲎ:%fass2,Yh L)<\"e!ԅT+̸t|T{Nر  ok:c p/5q5LҲO `8+4=50a$_ἦ)^PbtUǧai%]GW OSGI-OPT/src/java/awt/Frame.javaWaoF~( @+t8`K wWUb/kw6ā$W͇{߼yft/pl[,48GF1WeVGW#%TRa4- h,iiRjIHH6Q!ӃK签Vd 1WJLœEC@,Bچe`Jsg `@O2*Dg?K_f!nceg~IQ)AпS&H2C@ZF0E$ TӄL*f:0mK/6ùõY^[L-L|kؾez0p[O7`؟7e>$BW23"xH\Lh,EJ|MEABŊIVCMSDe*uDF}KI֤C6H:ADP؍ +uEP>:S|i+ҘǺqh) vȘ';"'2(d<4Ξg݋ R8 }Ȓh;TW=g1@jaaG~-CƘ{^=kz$&#Xǡuc¯cMZ_}J}g>DžsWzXj~:Qc㶾jb\Wuǚf4;^}=ľ\C:5iM^{LHk6_ -(jGA% $:sHEvV?; O>3+K6 5㲠j ɅM]P7>xz4{ =bg>&>r.eUVMa.[( }55YxTXaiC*#>SɊfGoL? 쫾qsI:~- Э~='eYr7*M]uz,)؁4e^?{8-6t^ (7*PKYyPKK>(OSGI-OPT/src/java/awt/GradientPaint.javaTr0=_ 2!4LK240kV\Ia2CM`2ow%GHkͳn҃I|!3 tc:)+\DxJ@ v,&wԆ+ `]4NIU 9[TJ \ }.!QyX]y 56mLןŧ~Վ`M*aHƀ_%T| W W*PXbV9וR[1Nf|^ڝ=yj c|(m46N,:a2d|͢ɘv_ h|R(U@6kf#XHƒ)0)O4,C @sjsl}WKltT[w!<#>̕H݇-l7uBm`ʄA~PKPKK>#OSGI-OPT/src/java/awt/Graphics.javaWr6}bOGd;~ -;)N j%${Y7b+gLٳe'TLЂC;|3!xgiyq\sq:hPOW#r#{0=`~"F;jÕZbd艺TKsw¼S4 d~ת> mv*3u?Rp$>wӼ@ - 9\Jf'bS2WE[q(kWCnGÇ҈hP|PKePKK>%OSGI-OPT/src/java/awt/Graphics2D.javaVn8}b'IB[{a-HI#--$e(;d.'˜3g3 9Zif%L#!8#KYA#GGc`3b}57pÍw}gp\]\t+Y  $\ C$VrU~>72mC`]d֪ò,=V)N5w~Aԇ\1[5E)R VRtgS]jnyĖLIZ#m@ic9\ ~0p$9|fܿ`:trva4 oRF~.]:WqGB"kIFaQhyZ!K9E ƎFVGq9G^}aKҾ"  )fY#GD[cB=SZZ\6%@{Kc`q oyq[$ Rgrd-vy]kg<}þ/kGsRz#X9[>S-Ӛ )[24g % @3c'<-t54vf~MQv\Z~~w&ٻ{nTNkh_wB,DY[pTkdgҟ!F"g6i&b4iNo5Nj G.ͽ=zZ\2~?V~-mlɐ+UPKR2˦j PKK>1OSGI-OPT/src/java/awt/GraphicsConfigTemplate.javaAs0Wtd8[c4: R5/7589Bb<>| SHР'grsP5j@>6\ w^L^ְe{Bmk}QuКM4 4|M]RTh hYsM=0ET9ˈb H H{V:FsE9# 0f͍<ЎACgr->̗ $Q<FlH#>xK@܍p" d9EeJRP J wΦ[nmrFGsጾYc'3 2B^1"LmxnR\ 2-5nQ=lSԜUW{ޫίU`ON'aS^I=\LK ;ApiH<պ$h/ؓ5_`Y&et9LkPKby=BPKK>0OSGI-OPT/src/java/awt/GraphicsConfiguration.javaTQo0~T,iSXV}49vf;9 ZTb?ݝG-8Hk#$9J)x3L=-.b$R-Ѐ["iNzp $@Q{)ֺAiER!c@(:/ipOMáхvS 0׈KO~UUd}E=nn]*ւ0| UIdh,3HgN{ՕNVb=BXgļt;IjП(mLA;L Np&q$rtg(xɘv!x<RG@2O禊 HHF-Tp Me%2B("(Z4R1W'V,`;m2lN13KF +HTdi0!9tpn"'YH5A0'F$TA1=-?{Xx]iRSӕDpy9=yzt5$ IFW^Fo?)5 u0ͨ ݙ޴COyw$ { 5}"-(=WE ui* S[yRJf+h~u0%ui|.1}h(rjPKoPKK>)OSGI-OPT/src/java/awt/GraphicsDevice.javaTn0}_qT h6h*IWUTs;RTwk;\s9vzG 8Z$ -ކix.KS$GhO+C: hPp%Gr!8Js51N?J6BI8R=pkÒA* Ab"=̂2.9SYF=F`]~f{(TU:饛^ӻI8H+ԵL'2Rٌ%i* tL c F^oؘ6 Hn:/IC0NF~O'tQ"9xid f!D<$!dM&9KB-d¸m5$phRٲ̗k4(ߎ[.+접3J،<3nk-7#\XHqs8%l!l8l=~5B x퀡Hr]HO؃bii$.OSGI-OPT/src/java/awt/GraphicsEnvironment.javaTn@=q[XM!¤QT0cz](Yc"Rr07yum H#N܅Yt%`(@t=nadɬ) ܈J"__Xx@y{.! (B*$=T8 bJU]aJK G>P*Ft[9W| Vhk7h2&XusNI ,a `b\VhwN{ՕNVBC&,ݫv>cCaaԆaF=Or.gw "D0h6p6% ){@סx,S8]蕄To%قbČ k2AA&ַղH : [-'k r筢\rKX"+2XDl'j-V9)O7юb@ O rW,:Cl6:/LS~k4ӼZ #/l$gD_5G( s!7SP 偕ZpL5 :OC4 T)9^DWGm{K% 0ߏ)JKEb&ñ 6B!n.W1NEd-OSGI-OPT/src/java/awt/GridBagConstraints.javaVMsF=G'{E[+,6[ڵFhf =#$!2%м~C &e,[8M 8yHR8-kd~ߜ DњW:3A,EMg3A,(8I=1ئp=:9%YAQ hj9)зVXi:i- cJ{QNA8A } щVa۶&Q͒g|7q;oEN8a3T*%SԚJ$Rn9 ˹h fjٴ{Eh,)ĉOΉؐ$^~Kى"'H<70I{x;P,ơoL&˹"ĔIkIuES6g)Vd (d+fKV˶(p&irde:KX$JLҊAL=p6#)>ItIQ9Ҍ)g$gɲkThN򲠪?usVj+Ŏp' ^0c/{q|~qI{#k{źFqsKם0y4'nANH̹ŋE)t{)N''JT2cyA!ف":xVaQW T}F.yN>kn:\unF\I'g].e51Uat-SMatfɍoP7FqG/Joe[2|/KqhoL,oδ(F uwa"M=Y*eocw!dW-h{sco.7-r{2 ], ?h*pUip*^@`}>PK'~9 PKK>(OSGI-OPT/src/java/awt/GridBagLayout.javaVMs6=Wb'9PgzhveS[ʐND`Pd}rA2ݷo~7-x}Y,˦)!sFDL}u9kjf4ܰ M(EB) 1'HfR׃58NN/,Bi1q )& yQS33uqjj 91 :15iSs8ƞTYW{hY^Z_J0Hb2AA* xfe=W0u@̉&a(6)͆hKF Xz0Gw q2 #|P ЧB &rVU (,e1&d29J`FPP3m˪`ba8˙!ƽZg Hf#ss* *1'HlXd7[84niUGD :TLzUpՕ[BICc`-kb4 (kg6=k6|a8X";*D/J^➺Yz>GC, 5ScsmH'C TzUJ`n.~HhJJn^5V D*_nz;8xxwXg1,?y,jȌE)Q3qkW Mk.6; y~:q=䤨)Qr~q %Qq{oWzUE"$I*Uwr=]!x7>ӹFqlux䕛UM3>o4mN%1,v~jVc^z r3B[nໝUZx?bb?[ŎMyrן\&f2!;u^)em/s{K,~lpT#'O,/J׀ū]JKZ/zG.=bPKQ$ PKK>,OSGI-OPT/src/java/awt/GridBagLayoutInfo.javaeAo0 rJzzrӬ3$@葱i#i7+G9.>ؐE>}UW0d{X i0`|=}N6#(%Ъ,=Ajϰ3_dk ơ`4l&7A[8 : vPqC@3u9J ACU pN =_$$?A71DIP4(`[(#3U鞓dqN}/'c>6'\AM,< -|A8x?^2pr}eTaxxQPK,BPKK>%OSGI-OPT/src/java/awt/GridLayout.javaOs0SpkHzj9Q&0I29 {1ڒ+ɸ$ޕ?dtlv%G8*^҇Y|N0s2A ~ahPo0 4B%S`R$pڐpv9VUP-He2 2$XZ *ZMvi) ܶ z.a[2u 8T: .4>ȮUW2Gc@4'^nA*Ki9Z%`Bädee_#G. q Q܅8܌t0d6=lo`<4>.$WΦ#R%SbB+J8*!djZr"(Qd\[ L&~h/hp9OSVK $`cKzX#(B2B80FM";߆·6BhE{:=}z~( c%9Uϛw cn6W!OvLU ˫BNh_v=\rq|̼(D{)_ىN( TTESu#<__`TcW͞5U^,OSGI-OPT/src/java/awt/HeadlessException.java}Qo0ǯ8SRemK RHVс؞mB}ׄ*s1U+̵9[Y=y]"m)TI_fI J9Gbv&$B*{BjDɟdd  GM8q#;T >~\  v~Kt]8ֶN%|,zڨ?< a[fmDm!jK|uRS8l*鼕ֿ #Z QZ +FY1 &.߬Vr- +m%!]>G82C'c)C[DAa/HP)wT݊P#Y=H1`ly^~\QE`KE,:v lݑBƋ?C'Orokіəo> <4)xʣ9PKB\6PKK>9OSGI-OPT/src/java/awt/IllegalComponentStateException.javao0Ɵ_OT7S DLtL{tkjpmc;ͪimH<8wsvscNq=,+% X'w&ehr#kҞt!#VnFKq0p5\EGhyb鱕@5Qzv8«b_ mBcW(>UQM]]._r],*,W/b],K}B^kQ^OA2C Sv֜Zneͥ-5r+%>3`m 诺b,I?wqUb w V(EPsѤC~8=!n9:BC`oxx>܄p)IPK dUPKK> OSGI-OPT/src/java/awt/Image.javaTQo0~'Xj=d4:RڪO\gEUI(tC!ľ}9Hk%ҹ6@Y&X' q6L-R5%1X 1CǨ܂qk"]FCQgh)ֲ[C. ChHD ".E#m%̼ӰX%pp03:P*377V+U^VcuyHSWyZ?PTqV*"ҚH,UH1#FiL̊)4F4/Lhwd aגj7tNfB0Q09g~0[ONdB Hv]D֒t\$SiyZ!KT9UжƖ& a겉zݳ%s [E"qLj8/lOĮ!$3TU.4뭈vHys)=]yJS4+V)U} wnTFt"MAmvgXb.<iY'%SD۲=h Ongo+CXŵ  ^oӣ6eeYp(`'K-{YlЗmkiɻ\C%'16,}7"6wWM~c4jPKhPKK>,OSGI-OPT/src/java/awt/ImageCapabilities.javamRr0=θDe$TH$L<{W$`}۷$\JÔϠ( HLqbe:5lbR"ׂrNЂ#q9ܢuB+0 X̖A;h9$ 9B׭>Jp<#8#S}Gó|Kc68muuZ3Y7Js`o',M\rYE^%A[`Ey\Vx98]Y 2;U߄F?PlL$-!+'=-rDf wfl]BU_e۬~g">hllD|cϖA.ji4tAhm kudpdhg~z7WhD'=Y*Jdd,kmTBRrآ?o+JjCOѧQuZi-;0_{jOӀ;@uR.x.%ZF9'L:jIHrPKrjPKK>!OSGI-OPT/src/java/awt/Insets.javaAs0x 2!䒴434lTH$L{W%azj۵.03j1,GX_%R%ax5\QXÒ=v&$hFo i-J;1~uh\% `o F`q0 vm<G!6R詤CjfWhۮNH{ >PjV{z_۶MDG[QƷf߼gԝV,j压DT(UBTxϛ@Z饮b8ly+Ɵ /#Vc4G9ͳ<&ntL&bb~ŜW_=_ סچSq"r39"J%FTj5ٝt:\%w ߥ+Gg0z{O)x(`|Hs IrR(;:>fU2SFS7]%Ga7YNƟg~My!v.O)03^p:ʸ("ʒontbo\E/QPKĕPKK>)OSGI-OPT/src/java/awt/ItemSelectable.javaAo@W|# nnmNq[T $4KwwQOڝoyKx5ltw2>, QH z~XnNiàed' TKUu\;+` K'X̥Yt8E* sTP趛FIǩHq9 >zzD01qM6g wfdwL=W Z  DTș#h65Ҏz4}Qt6ddӛ^yK&, l,|gx(9 =l.>i«%-N|@sg)][ BHBVT݋A]e4$hg.(<3zH^ Eh*6Xw5hY(KWq6,_PQpYA5ZWiĆ?~Bt6gN90|PKOPKK>(OSGI-OPT/src/java/awt/JobAttributes.javaW]O8}bSm/yC ݒ&BnM\iAmhP3ggΌKGЏ'M}@ FBBՑ0 hBzD C0G9 ZL\NpMy¢;=hJCut:OQ Sa$ M(b&,@] `!4VL\i2EDa-(%1uلxOOfx#)D5A ؔ "7? HI#NǘA,wHpƚPH2tJC^%tA,ύe46 +9O8tVIf%V xe_YCO~rA :VL/gw`C/T+GlF]f /IQ,^yl w P=){E$x )P3T@6p.`yT E/TK6Mq(ßbr/Gک(Ts׈ ?<9rߺ( }wurdSsbl%\\/SArԟ GT6_j#VB7o 3̖&}+++s'ojħV<|tr`{BW{V=wn2A_s!skT̏תfy$R2zƀ G|[B/5v?u/mP<]}v\>J\A2 쮇/`c V;NE\yCeʰWڥzPW[Xj#Lu}d6 =eL [lK؊ TSTV6'uap"ABN{f9ꌜHEs՛qV/v l6[M UU>f6XV`U{>;$B^ f!t ՖJ4PK hPKK>-OSGI-OPT/src/java/awt/KeyEventDispatcher.javaeAo@W|#ڜ((<-.&VYK4o~&Xjs=Ll i1`zX|?ІmP:ؒ#{:`)G5& ~O3'YZmiLƥ.Xt<zG"T`F|HyХGl0R5o~>?{͗$!3qmtK:/z:r, Uv8%Y:P=vN7~@Kf-ڕQF+P$- +&5-bLݏ6wٺ|M.7HgH"s0`rrPChJFSm-AdL]V'u\$$1E/%A ˓mPN#)bgWoԺ#IWS(kh{F?PK6-PKK>0OSGI-OPT/src/java/awt/KeyEventPostProcessor.javaeAs0WPpsks2qQŒ* O+O)>=}Dz mV;i=ê*u&L1qeaM쁶 ;{YrEdẅ?c'wNjdiLdv,^G=C#;d/OSGI-OPT/src/java/awt/KeyboardFocusManager.javaWsF~.ŎpvZP )ct:CZN;LI$g~'^] AWKuFGLv˦} ka &!X;A(`kR(f@4-gEp32tXl+T2 ׶z/0=ej5g XM-gTA`3ʙ\[$S&'/(H[&Wu 5Q5cXIrԾ~Jι`>hKڥvo*{N:ӹ{?9;\ݔ{FShR]t?. u**_7٬$y^ŠvT v+یr8!MwI;z'Pl͐ ,x#xӡmtU_r +ɗG*"G_Θg[퐡]]ڽGD qb]e@>RqkԻ+h_III6BtѓC=˵RnlfMS4C~V+ie5Zh uXYI'Y*Eo֏6EܶafWaC]Yeh,(( OSGI-OPT/src/java/awt/Label.javar0Sp 5$6ӃKH)3LBr%]@vW.aA` Lqx|5z~E"$o2jUB*ӝ +p }/uGl J;-_8VUjt.;;FrFB`nsէѨiġ6Hv4'y:@]ԣh-Y C[`Qqd h4HgN{'T9aM!3"Ic)E)iDiS=,3x$g4E6ŜVw͟k<R(TW@·s?EHOzd+b)8ʚޠQTThZ,kkFA@}፾ YnΩ%#QCUߢpB kqMӗqN\HaԭhEeCw?FOٿR'^t~]&Z $XNWݪlgy_4e$E^s}М2l9)-+mJ#o")Jf7j}8j)c6Z`;={`PK5/dPKK>(OSGI-OPT/src/java/awt/LayoutManager.javaRn@=dGڜ.(5 xZإ[; rZ v޼}̈́W\B5'M4&DU !Loknc:-Gfp$kP̡9jƊ ) 70K٭8jq, T!Sud=#S#[p @v?kau] zŁeX X*IWoYu'+44hI Dê2g@iFYTw, &'c5[,%c&Q q:Q#yw7w;x(ū6[Xle7 }(y/q92LrqSB L5YD(dGРɸ;jG/|B㜿;o([i eQǻ{sTEPNZr\(?Sg+\ LH#ݢ^ǣϥ%lpMP7^ƚs PKbPKK>)OSGI-OPT/src/java/awt/LayoutManager2.java}Sn@=D.vrksۢd9a.]LYVJڙ޼W\\G8u!*KFof eðH dE8%e)Fed S |'cY+ g0ѐ]zn#($l!璀STW`e * <zP(ZNk Lw޹tڶmPbZX;U|'ֽ*Z0a#Jq'^KlA[ÎU1sע!/uw{3*E >FILCCDmL`zz%OkZLddRk;"$Do,亷dkJ9TZSEAdt5V+3/Sr]/_h2^ bneXLrw(ྡώTfOM~`,V8f6|OzDiUK rTTr*xIeuxyfu3tSNx;UUS܄_ OPKwPKK>.OSGI-OPT/src/java/awt/LinearGradientPaint.javaՔMo@W85ڜ\B"LEU=m]ww΂K JCr013zܭ.tL24" Bjw;_t0Dvi ^T&P-!EN:i44|@ڪz)`& A5Tx`N 5$fWhNI0c.8!d3Uߔ(le%qhlTXDq/eot2e4FQ`A7 <Q >G [u:Ɣ)B01+$c"'2tV !3s;L:S/L҃|f>B\Z^A>n-$J0ީ(DM|:uP$sa7W#"2`.l+xocW/_ +1[Ug|;DԤ> 0׊Yxnx}Ta?~wV]3zWG@KhGVhǷ;NXv&X9[*|fRTbBQQXM]~WAH-Ra5BC}qeH].g?IIXz2V PKβ#PKK>OSGI-OPT/src/java/awt/List.javaWs6~>< 5{kr-np27>{!%W!&{W!26!i&?oMg0TZŽnt w!8BO %!8k4C&c`)O҃/ W>u'酃X ,d sH%iIm}OC,#sF)=}C`$[V}Qؚhx5~"֥g)O5E<[KUfU( l֬rW[.=0jnWL2[mÑB H6&d(<_(9Ϸp7NU) 'h2`0 Ɨ=@T&wrYBa J&ňyDE D-)"HQ'ܸ";n_r;Ɩ,`+{I)`D"'el6r$JƄ>y#I#E)q:OwVIbק3q;3\Nuowѯ.'_Jx>=cixl޾6vy*#~#x  ,^vFi 2 ^Z,~BMEGOǒcBqCʺ%tӎ3ӼsM4U&+WgJyI}ˉ|@6l?gEMJZPǩj]{ or+ZR@ߥK*[Ym `qtPdSc5jSj>U|C='ەڎ.wq7ߦ6l2΄P+s SnceGJGsuzE]^GQYکסZcQ߻{=u+L]ǐk-{3t)' y'KNsB>ܓ <ɒ I5ׇ”M VlMmƅ s|qڷ./΁}֓7rZJqkkxb|"RyHw,}j8Ɂ&\ztӏ786l]I𸙧Icf*J*XG5W]ia+ͣ=do?v:PKvn~aPKK>'OSGI-OPT/src/java/awt/MediaTracker.javaUr0OSGI-OPT/src/java/awt/Menu.javaUr0= {(8:i4gL2,X-HT&+Lb>أ۷=I`f)o WaQp&l:=?}[EjXF'KrSE !XB?ݎ?Qi.Sp-`mb'k(4Pk$!'XYVM;cJkΨU31MUKhv5>F5(SsE;`Jؚ iHQp{efҤ\׵yڣFPlL(!G9س$frWU %h-GK"9x_)dr!F|&!I„g+kHLMZE0N8QQ9o%OJ`cbF*&Hnclft5N.O;OT\zҵ0Vv{}uC;9-%xǚt[z;}%~mW">2VhxQX~xJ |"OSGI-OPT/src/java/awt/MenuBar.javaSr0= 546NBOSJ2߻2@{rA*_i,,xwA &9Bz~j. 40AzO Npc(d!:Ӆ_P.>YKGRdlRY( 00)>q- \ey-vQYx923*4귰6eJtK7Xӻ Q4@{1o!49夊iMY JK4R* t-FG c`h[d}@ccAaԄ #y)<I0G74 #G7]@\;$Sqn⁄H29r1ɤ` B%9u&[!IE&,Uȗk<G-J{Ō&ѲFEf '?yHZ"o5$f3י:|X#KD-Y%.]HY1_mȽFӁFp$zW[x⪐55v1h1Z(myan;3N}g0RYKB+1r4feH>8A)2{;}c^Y,H,2Շ夥`7sj-kPK$`PKK>(OSGI-OPT/src/java/awt/MenuComponent.javaWs8.NH3\RBH\ L飰Pk$$N[l&LlKvWM n` ˕vp #~q&^߿= S+aC,#Ph !!*0+~zd;Js)׃ʶo-^&f{@8p`l :Lrrz2k |80gkf2ʘnwzYIF>ñ?P_DZXLVlNFl R[*=#[ h0[҄\)`#1W}F߱$ϣ٧ɗi{y+D XHm>D@/(vV+sU(2N2q#Ho&\=He .XL36N(VnTYVVN1[W4:n(OSGI-OPT/src/java/awt/MenuContainer.javaeRr0=psks i 3i&G V *  ԙpFڧ%\yT'룅E4!jD^?@eahPXHy` (Q="DM~6\ ְpT/oIvвi3H@|.PY ٪Iq38%4q23zT]IUp9cMxovI"ӫѠ1w59O*XNZ6jTҩ4\>Yفit4%7VoB{H/029|8c|>12HIm|ӄNw%O-N> EF}Yidry!Pɳ$/Ț;V#ԲG-(-7n-̎W|FQοOֳ S]N RXuhQt)7{wt 5Z/יܖH ¢׊7˥lT]DJ;gz8{KqKNCΚZ%PK?%HPKK>#OSGI-OPT/src/java/awt/MenuItem.javaVnF}b'P)%o B Aч%9]KB,/II0l3s̙= LTv|װW!ϟ} &>!8{4@.`AbUYJ+ sLW׷rH$ n`>ƘYbf="O CE;MG`"]|m^Fgc_Hft?L'b]E}\SXFbW4FYX5\n`Fpc5rH7H6&*a^/A8 a}arWi%Ljӯ?$8RH)4-81=v!m%0x OxA \Z9nE CZ whbͳ>*2sMaNrIPsa޳Gp\=D- lS~ViE_vv'l=2c'OSGI-OPT/src/java/awt/MenuShortcut.java}As0d2ԐZN.' `L^ ɕdweLN9޾-A a~!$2f2F1 -;x{PY̡Q9pB\?|CcI+&z b؊=(d /HAu֒>'Co`OŹ롻W\q}x wvȑq|1y">"3*(Tو;4'͖_eHڒ{\88؉Hn͆L {@դ6.k\[T䤣 I]o,$`'dopkFZ"'̧?*NWn!mxB. O ((XS86JtwdhrSR޼W=~?S'Dش=7&!~PKm0+PKK>$OSGI-OPT/src/java/awt/MouseInfo.javaer0Sp4Chij24F\idxLI=JanڃU`(G,(HF -7 (a2СcBW.mVH @pOa}h0І;d R Hl ivm)ڞ*{ ! Z>U׉ >=[St]qll4\gE^,3u_t,ě0k#:0Dmcdug)]O:a1ȔʑUOoL0 l0H ȊܦEVLS|\SZ:[\|el33| [}aT@|P3kQJIM^٣<hwʅ:,Lv~7WhD+{fQ7 F0wte5zG\Д&ADh8W^ya:U>a'm:^Kh4g/)ɘ5Zv#2)UW,U%V7IؒcPK5}FPKK>0OSGI-OPT/src/java/awt/MultipleGradientPaint.javaQO0ǟɧ8E])%aMrK-3i}4@a D}w39t*^ ,3^Yr&Rty eal5 f.9XOQh̠*0kf)=1@pNah`4[@Ŷ F#yp 9/6ʪZn:%C tF|?须ژdҶ:bWbRrd0?u%j 6\Qū-R"֒ B!i[ MZk1ϚH'PۘC؋xlM2+/0 ̗IːSk'c@j&"ĈrC5<)&ܠTԨ*j̬M+n.4qkmZ3sfEYj -7ugeM54VGw7sF(Nv)ULa,xLQLϙspBMK)OSGI-OPT/src/java/awt/PageAttributes.java͛]S8˯p6Xf/l%:t:IDꮱSہ2d'eL{GsΑJl]#o OI0&q'10#mfJ\䁍[ `Ģ,d1SlKANkl E@<3r?(,e.aFl "~Zd""!#|^ NHZe?['0n,ڷ?xE(diJu$<'OyT#$N?I/bcdA4"i|= qfIp;J6VGdkNLch :`a{VHPY1ke]oDd DwHB)wMfIgD,R1)p,0apd~&M5 otv{wd@u2~Kt2F:#A:#AG:q"@.ɢ0J0}!'r(A!'9v-|k 35fB_ '[W -ɫV@NNsPlQJP5rZ*[#9گGr.wYxjbAsPc]?5fըA3,Y;(Fj̢ B߭!SrPc,;;Ԙ:^h؆ D󧕾Ϧd!sQgSOokX~ (r['#rP%h]$ut4Gvu2~Dt2Au2bߖK%dĞ#AG: snOJ/5yZ Wߎތ5[/x:w2ڧJ_}} nI+6} JE0ozƛM(-l}qfݛ#rߦiQ-m rߦիZ$J1«S@\5_|꺩Rp= =yַ=aK:~ߕ9I ˾Xd?3kt40ސyՉKvܳ]4N3 YsMM}|~ezz$oy\nsX{[?~_dZ:_؈e$ZNų} OSGI-OPT/src/java/awt/Paint.javaeRr0=); \'8Q׎$0;+Ǥ `޾}M7PhDs0Xu-lv;z2ϴE"$/ 8J@nk3 S %a` MQа#H堵HB)j"O~8trXgXdS:}8}IRd Ȧq9╅R,Y\hjYP=IFj`ej\\Q/Y:wvK RXMh_i:=ÍajP# ^PTp 2i|戆 U+EXÞE'OSGI-OPT/src/java/awt/PaintContext.javamRr0=x㓝ว6'-L2,X-F$={W6Ii9۷ė.1WhduOIHl: w#H,=3x[YPkDזd඄D?MdT-fc Wɵ8;qD:K!-*Pv- Ӄ^aP'.@sVBA:q8)挵m:_,V=Tݵ Y C:ixBBlXk#z(Q;H':U!OSJtiOyM%9|I'OןWwk'Y,"*|IjG$|I7!->tO2ED$T,j*d% ;Qj'DdvZXzFt\QOOCE$zwnYL%xxn8?8<{%KoV\ OSGI-OPT/src/java/awt/Panel.javar@ Sh8A46'Sj:Q^ uw&ûW&`J$na룑P`}WD%w1(aXz%Y2{*Bv&s)HY*Qp[F>3d `Ч{oq J;h,wuJ=]< <:wr 56B@Cs(j63qMUFd:K;o=CiX3Y+lAԭNr Vo\M!32o1r*$>Y:Y}]<`/qJf,0]*Y| qߒa #:t1gEȈ6C5 [Se%Adw5~ oSɝtΡ7}BQ{_[wMQ!@Ec:R}SVæ)e! \Vø?:hGOsJWW0~k93 91@u*Rwx:h&PK^sPKK> OSGI-OPT/src/java/awt/Point.javaAs0j;\`Ҕ-C3@SJo~o\xpcU5[ tAT$dп !ahP0\S`P"DHԆ+?`,RA* A *.IHUYuh m;sq$< nڜ AlA4h}8jMpdY1GM *JŚY р r|gn4YFht6i]۳f^Ћ8:xq~hfx|l/V)M2wv : FL)m(h2EjɉB]qj0s6dm{EcG^Uy>+1-<UwWK$ پýt^wrX~:Npݿge|GlDDVivF[k .2U z* 0{^l(XJsM8<j9/-j!M!A PK9PKK>&OSGI-OPT/src/java/awt/PointerInfo.javamRr0<θD4e;i&GYa2L޾>%WpcUc,'X i]+%a|=}ߟ'q: !,$@ ;Bɟ2/Nxqh2Gb/ƣuʡT5%5JC}3H ,A ^@?͗$.*X,e~U]&`o,;!V%Ŗ֢%yTwVy))}',B9oնoB{/9|i@m6xLtrָY-oMZ~d)#s蹱T!P$אTlMW9 ٽraV{ %Q9 DAĢi d-XO'%0^NIwKfEE7[ۺ= #{ <]*q'$WܬɊ0&mQpbpK-(RAhkW])PK8; PKK>"OSGI-OPT/src/java/awt/Polygon.javaUQo@ ~.  =m4-Uմ#qm.X>_HҪe*$>۟?li@dQ<^hm9I™Z~ cZK SԨV:`A.xBcQY ) Qj RC4KU=m@HF" :eZR˹YqJnJ 979$EuC`$]Ƥ{<V0v{V.X^W"AA+x͉kr XtFZֹ↋ ZF&g -LȵQ|sT6&M8u}Zkoer5kw:u3܇&7&c>;xQ\f@4-Gܡ-%b#Pj"X*AAjɵVMC %7GzVa6lN aDR&Rp,f*d.g Sq*i0%<$s%CF€H%=vj p^+]ޏw6xඒ<6J4WDžye=2AfBn׭Pf [BdJ@C@ .^^jQ0r 2/LaA:8 F/`?iN ;WΨTQtp61ީ\jD$u8=ʬr^p3mBuA(g Mgoq{څx`ߓ-}5j.kbE8vT} c!^OF/PK=ePKK>$OSGI-OPT/src/java/awt/PopupMenu.javaOs0&ڜ\B[OSLB^Z#d]3Oo6[*}0:Lrd< G_WZXE""o(8JԲ@nhWB %aa4{a "y Q! G@Hj{Fmۧw${c$gA\uNi"GʔqimNgY>{G'Y`w- M>DٚX+ր2JTsS7F8!ڸ6Έu.B{c0HrH|L4*]~?-a,ILg90g2g CHQ|O@ٝ"!Y\ldYT{4&f'?VKN8ڥ|8(_'۳5>^1t ա,I6!t[i$A'],m6+!9RvUh;䢜N"33KWU9]IՇowIPKد| PKK>(OSGI-OPT/src/java/awt/PrintGraphics.javaeAs0WθD78(bI'ޕg)OO>\ERcZϰ.$ҮBՄba~aEP:hC05)G[jK~GH3VIIp/0 XnQ؋#thdG皌Tތh9K +/X.xYZGӳ|Jabq"mu}\=STGҟ^Z:BEŬ-Dkk^J/U;Ӎ`[YMhFnc DVN9-rLiQ&[XXls}A?{ACƆS8Ϸ BHP-YskEKh` pl:^}(_ b1'ayay|g%zwƧ7]%OEPK˖PKK>#OSGI-OPT/src/java/awt/PrintJob.javauSn0Ci8Ran ]TڒăʪfŅCEZ=ג.nH?yԭ27&y~|PKŎ PKK>.OSGI-OPT/src/java/awt/RadialGradientPaint.javaMo@W8AI6'JP0iU=,l캻kwUHUTx?fyffnU`*kL,: 3!8!Bl{@[40DzO N䂇( F5 B'e!=6\IhM9jU9` ip1xbjK4-rn'8#RC-#sF)UC`^&֦<} N5^%Z 44̸s`)QlL4D#Ys-F6gLč|ٵfW lLB@/§N <'rGp;Q$qoiv -|=@*T r]q !VI11)5d,AH E=Ƶ`drbI^.PR:pBٌ,G4Sݒ #!8g(E Sf7Z,0cr2n+rz]%.yy(DE} rގvz^ZЖ huv7џwp8yZi& ]]%YI=F{iwyZk#c^YºBb9{S*BQb.l=v8Q5qY9e5LKG4'hTԋ03Ϻ]3j3}T~PKZ;3 PKK>$OSGI-OPT/src/java/awt/Rectangle.javaVMs0=_0zj4L(Ũ5+8$ޕq $o?vMJpn7`}Џ"΄Pv:-calƨQ-1pHUr}HD 3Du:Pѳ*V2[k} p\9yf'b]CN #8#Vm 0~sc/v;Rhkr]~$ֹԍPkP7q\aBP.Q bT mZ5 /a&z5Ԯ(l^-NA#mqle7(])λ\0[ ob*lͥ,Y~kr[\-^3ݺ]6˂J{ĒN [}*/0٬?*7X_dxѥ (k`#{詔2;m#B(3iU/K*K<.:e:{W Єm*z9DQ+7])Z8`/uIZd'HxHj֎C6_L˻lYtitpiogP*74M7lS|oinj -rU}/z,F}s]_RHv`;!Dr#ǖ펣Fs.鳢P-Uqe,S< n'4J3n/J|4|ؕ0 Q&4'ĉO?PKHmd PKK>)OSGI-OPT/src/java/awt/RenderingHints.java]sH8+3jfv3)DTdޤZlghtTVLSWIQ9oӇV@ufsM @r]FZRWSJy EBl'rE+UF.s UwrD^z9`&dDne0E"ŲY!vV~f-偝=rwa_L,)>y;1{niŊe0x(4wAaKt5R~(*꣎ֹ먶}%59E)ӰYQniYE]16u[ld2)s>&=q) @ξ#ղ9'#q w_I4(k[x>`PbYPoYX,: OSGI-OPT/src/java/awt/Robot.javaTMs0=׿bd!99@ROSؤL^5Br%a]9!I>جăbyMz08Bp&pxz"4A'GrS(e !(XB?Q$C:@Vf[Bi8 |H%$j]4*nWN]áQBAQv f:TUڱt>X3Gi%OSGI-OPT/src/java/awt/ScrollPane.javaUKs0>_PCrk3=86R`&l/TH$L{W؀ɓr|V |!8 B9m}9kH#4zH/OSGI-OPT/src/java/awt/ScrollPaneAdjustable.javaUMs0=_ 2ڜ$La/,C3]&@`l}uGpA'(LJIB%C70H chI.(Ae1Bh-\$ %}0vStX Af$>)Ht7Jr꜆+CO`f@],Q)e|eMԥh-Uጧ+9JĔJQ6 yi4H{`̕ I:CmmSpلvC$Iɗ8NFc8 ϢI4'75d|g2ɗvb- 3]K9&4SSBzFqFz[- L=pN^~uDb)QV^LHh) az[XWK 7:,ݫI1~WA7 RS "MsEDK^vfЅx|;'ێ'2 @Ror>D.R <&)+0R ܫU^ Y֕ی i9rv.(W,STvhPQνi=![Koh)>; *sy Og7\LzlDXzlPKiPKK>$OSGI-OPT/src/java/awt/Scrollbar.javaUMo6= ''pe'XqB]ۢJ;ܕHRl_6F`S㛙7E ./Go4L^g_"5LPZ`% ,j4-:;+Y@V B#qp 3"S. Y^I[rXTq03:lTј}\.={Rͻia:u'R[pEG+`9YDZSҞVRqżZ̒)4 F05RJpgpAر$n d⏦ m0 #z'=v)et>F@2MgYEfsl0 T"UƵ-&Iy 3N\nEyb>\" B2JiĬT"5@ath' ml:BOYy~Duz+i0-RQ ^AiUܳpRW> YfʩFEQhRt ~wT)Q5<=7 KI"]eS-K5:NXg\5eLhx5M!drYeg^+; @WWz $) o6iU).EwaF[zo9+VNݤ2X>s|HfRlЀxaSz% <W> +M{ 6VtS fܼz к@ [9{zg[=,]Уw7Iިi޼mv?4 TmY0M4qlW`mnG+͛ [oPKm3X PKK> OSGI-OPT/src/java/awt/Shape.javaAo@qBOmNjM8c{[qPYp)octLU"/,,(d<1DNi "CzKF$$ P˔4؂ 0dI$L1WbjPba %=&TYZFbőCY|) m VFi|J5p:_L޺%B`T 5U 6٤X-ֵ= 퉑W 86 b\q}[}EbcXF0].f*\.xz>#c)\!&:ATL$k r%-y#HoqLM)6¢?:˽hyWgcc^s%!X|^* ]uj][!._rqwt7<9s2ۻ@Qb9:W!d'f'3n2{Fy9D\Ko\A I+pכsaNJU_K5PK?{)PKK>'OSGI-OPT/src/java/awt/SplashScreen.javaTr0=θn4cπLXX{WdpIAҾ8+] ;c9uzM0/KJ"gSoC#-$h4InHA24vJH~'SCcI+8g0h4]^@iE 9SbHzi-]gJ['8\0U> zo\)ڶ E8Ԧcn*]g=Vh-QaUIehAA>sګn 9R]+ z3Iў5aM(S\8zxe}yWx:joWazj1qYe/籋"HQPRNB4AfOַղӔ''\ʗO'&]U r(A?vB*x !#,6ڑ `p (PuY^ tl[Yl8.Mn<"޳1~\ sU`dJ-UO[<[Ki"{Gxf(-rہÍ0 7TuqG^Zg%RhL-I < *}-8ft'x잂7PK,Gm~PKK>!OSGI-OPT/src/java/awt/Stroke.javaeAo@WcelA0KM8:cPj\PJ}0#ڠgt $x=ΓIYկ ?BS ә8ֶIڋ%wrB=ZvĻUI;amiƲԼԃU^uN~ R[^e:LY1Ȋy0yȶ[ll@0Ur( V5=5Fv2 ۃrZVUɟ+4JHr~ F?H1 &2N<ۚz owE{22yőB~?QPKPKK>&OSGI-OPT/src/java/awt/SystemColor.javaXmoF\~( @v.=UZ5lc=1EJ"<3/ްi<X* `$t)Ի]FKaTR^ 4ɘ4ԃ8`D_ mu7Êl bIIY@~riUIKZy2>f| D@T&:Z*n'I"v'{TE='f+oD%s}kՉ`&Hi<&`Xӈ6aiavS=1d-Ju\,-\dAaTXDTc(4[1ETj:K'jjM7YITs ;$AyF*kɊf-h2- Fo:ϵ R sq$ c~{(zgt0b8?D؜5Z~l8GzִF7BLsA̫YW~-cGXY~sr4:ӟ&*SĩQoHٻIol&Of}klMmn?ݲߥ-[G)bYk}]eMJCE՗Fe=9nw nTrg,rD*}鳶~.ڑ4_2s9,rh_ .A7\6x1s ?^#1u Xd9q?w`KrJ/G9R gϷ`?z+OEV+Iܚ*8ǥ+ڙ*I7=JNUUO*α܂r3 'x+%,,[\GI|Aկ`khWooծ#mM'ϿvϝVo 5oaAC*= JǮ့5&$/I(*GKPKQ|0PKK>%OSGI-OPT/src/java/awt/SystemTray.javaTMo@=׿b "jHn-'j&=m]wwmF`zyfƣN`˭A?" !s)T?O@7_Ò#-,Ѣ1I.db Jр H读4Vjgz Slu؂*!-e7 De'nӱ8t tZpo\v4j{ž6(oc"5P*GkJ8ނ(IU"bҚ;Yuc*kLJ댌+F*8l zAaԃwAFC& W+ ` g,0]U=kχdp$Sm!B| a[IDeBBk4*M!-ՒirYH'Փ8L]xe䂄E[XjLAi9 LȚZ;N?ZCw 'L&n;PaxAvBs~DSL?lyc9t _1_A;`UF|rβɽG>RS;,caVGh #OSGI-OPT/src/java/awt/TextArea.javaTMs0=׿b n`3i\E٤[27tY9&I?i!G޾}W\镅=q^@Iwv}4A=ñO d(8Jc5+dڝ6BI8{ 6,TC9V {iYl923 (mf[u[׵žn0tTQeƀTh$UHkjPT#YTZX!0jbkьZ*{i5Rjpaq$av"H A q8: 0%| u]$Sv.) dJb"8&"L D]jHӃ\Q;ol|VcFA9#a^@##,qDi)]TIٖ<;)r<ʾ7p -Y1`\8BO$Hү'qvow,N/qïq48vAUU؃2wT3{hWMMqaOr,WGL\G5Sb6yڽ#*ΜM;oW˝ǘ?!NɚyUHLC$+?8wRG!EQr*NI5]~O'lHTr|3'raC afs糇ȱyh!#=/<|fi,s19Ѓ(OSGI-OPT/src/java/awt/TextComponent.javaVMs0=_zd:={1jJ2w%c>9zzRgГJtfOa}dg"Fum} #0BjO (4&PBU3mJs)N K 4Ph$a3\Ƙb9+i%73bJhANiT̘CSϜb_sTW  ( XNb6!+A*`B3Ҫ.7\mrjJ$\'2mRo6&$ N2¨mIn1Q0# W8h-| Wm@2W6ɭ*B%a*גt1RiRT.P rTsmY5 L,M0^=ZoK-Jsʋ 9qHG!Ek0e㜞ֳK1e'Cg_H^#g|gYdH1v졾}$>fp ̒ i~Q;/)?ꘚ&!ؼч&RfH 5Si\:~xV4ˮpNG+*Xx'l'.PG=K'lƾЭ9a]<~a9 ?;~`T{ːTR绻ѕOٝi)"34VE PK.* PKK>$OSGI-OPT/src/java/awt/TextField.javaTr0=`!zBf2mB^@-C3 &4{߾}N-t|a0 X0I0vHc4yH.Gi0LF.q+#m%Be(/򬻲("ɒP=0'3tijytP9sSstpybLX޶0!3^  $ٺI<^TT{8R2}PKb(PKK>'OSGI-OPT/src/java/awt/TexturePaint.javaSKs0>׿bd!4ii LQQ+K$c +Py?}UW0ֈl;0M> Lq߿1< -5.Cb$R-р[!DL Z CZͨz.!g[PAi8THp,\EcnU4, <7z](tZ9W| Y8&=${K[J`g) %^l䊳ymeiw]ʺ`u*f,uF,JwRګG~ ژV@6JIqOlM]q<:}h ɸ Hn Mo [r NTV !k4A&֯Ւ"E./ ',dEKFqBW[^~i_hP"'LS=kfD"OSGI-OPT/src/java/awt/Toolkit.javaݓ6BS`Rq҆)C$ɕޕ%;v9Zh%vv%yJDld>!W[FFq( NON gƴT5D dB "$K _^3$TLprꝐi8zAlEJVtK$U Ȝ@.DI(VInچՓS%S؜bKs!:7[j||l!gWlru7dt\eiFf2lP3a.2T!)]Y5H#" SfZLVLSmE;2ϷG7QAB3 5 c΄o&_%Rh/8j{4yiK>G+U"[-k)h@ _w8~Au rgKT~$BjrYCI!Ɇu{|#x-XDh>Wpw׬'k*O$8KP㨳wNJ*d}q%.jp7m\A3 WM֚VY9_ שւ_OJ2AeFVvQf E"K^O'V-jWMQs:q\)뜩IB0]&q8B!qeJЩ;J%JbXe5Y E<۶i6CG5HGRY OĘX,\8D[^0yNTŋx%]ł/ _Yov̙ /g>-оHe*9=-@ S?Y N3q9gktöA16Z7xڙJXd%]Җ)6.*Ɲ茙#J&AԜ@wPƙ!P܋2WNǨ0iU5Ϲ:f HD-Oo;foUqYGG6YoD6QvKBU֦\(`MrՉiY=ҾPt\Qx6"E{u,9ʹawmGu/aQU-]:N"U0sQ&h%A2.n {na8Ywl<~ro qw4|4)>?(>7fW, <6`uGZ,ݟNow\ <+WsVdW-Ri.{o@85[_eʽ"@%fI ,aNZ"3ðIRU{vIqURKнGCdgq%wP,5SxCDB4-+NVzpѳ4NElV^ Pxj]fͶlxm;sgCUS{oF>5M|d \B~s]v(WdE ORsZ[,cT>xm 0*+a@JA_Z>3dKC;ժzڇs![xPJǸUpH{?-Mvt/PKz QPKK>'OSGI-OPT/src/java/awt/Transparency.java}A0W<ԮJ-viIYM'!4[!;6H]!!7߼It svb4 ׵ ~+X%smA,mѪ-!nDdd p h-^Ck=E)k=8HBnwӻx<z_hxU^ !\}zv5oPCm>kml[kU0;!*ĆYkA9;#TVVZgu/Bȭ_ 8603$qdcouxyȐ0OwIK^G|}82Cύ0qBHBTՊP!֏2r/p {o BѹYдNrdJ͍PTqU/(5/pR6?=a:*Y/XtQfkw7K!7PKYA;PKK>#OSGI-OPT/src/java/awt/TrayIcon.javaUMs0=ǿbd!\BROLa/֖\Iơ $t}v%N8OQ/I8B>klvS5.!XkC.bT`^"zT&|GpnjX!es@01O!4Ly*+ 92do:3ojL*e ƮTVRֵanEZ?9WTh,#Vׄ BiY.&Mrl \GmɑJt ٘aӂ/!y ^t?. \4I2ʃMn,!,) #>&&9 L Crm۪`larbY]6QqH1d(aDl܏G2S!6ghM'?hҋ\3=$9?8'O+%h}SaTG6KV 7}vJ J18"5 TD8Camg07!-k 7%B{\g WݮS-p7f*3 RLSWhr%@I >$k>  ^~KaۆpcM(Q<~=(4_eC)!^  -Bv/7r7Ә%;0 =c#nRr`9LJ.+}9쿞W聰LPȓPKK^% PKK>!OSGI-OPT/src/java/awt/Window.javaWsF~6Ŏ 'o;mdlL R&qZĵN;!k2߻' 08Iy0H{ܿ% Tk--t8Lr۫7=?^x5L k =Bp 4B*C`~8}U%w]p^/DRX$ a`!b|XZ%LeBqLs斑:#uE`"]|&,zs IE,lǗYEXl/@5 O9{" ex`^š髍Ŋ4{h>h,7D!Ta sxj"5e;#xd ۱*u%Z3wrTg WVZ-cnC%¶8̕_\ipo ܆gtb-rȕ,IoU}T!xԍiz9 7ˁ8O xiCR_ kV~Bb//NtNKˡZzdC6mqB7m%ϭXQyX58c˩JZZi(MSU.Cq";ŋM{,]Vw7ނJV|GwpoBI-8ED (W"׸1TG[R d:yf5 femnSLLwojG;E/MlhMUn=n`mYuS^-=u:PKUwg:PKIG@OSGI-OPT/src/java/awt/color/PKPKK>-OSGI-OPT/src/java/awt/color/CMMException.javaeAs0x 2Ԧ9&f&(Ũ5+&2Io~*=ZUo=re]!m%$gOS$(ҡ GvOUNIҎ*t" %NE)q0p4Gh9bQ Z!ͮz巧>K a^\pA˫ͥЧg}%Iʼn86N%w|L=T=膜<2kfmDc!jK|MJS8l*Uο #~)؄(-#|MˬlccZi%6[e˜WߐOSG}0cQCؘ3kI<;Qj'y"dwʅku XF\QE`[E,zK{ݚsl? <ʝ+H\tګICe8y/lg zWPKʙXhPKK>+OSGI-OPT/src/java/awt/color/ColorSpace.javar0S*acpạ& a:#G240}wV(P,EݕWQ3!2**7t顂rEP%(% #o][؉ d\hE gzR㐉uimױ* $VC N0_>D[J`n=R;\ UiLfQxAIULbH2ׂlAH +IV2JzK$52KdiGL}~ a|~}#>\-ElNbGg'"kg g'}X2\^d6)gE)c!%UҌ,"+ +cFPRfʴU)ؚiKet:XF lBqR#3' 307c_w`˄SHy`5rI8ɰ2' qW[Oq;8 g?NI;6 Vq.Q0 ڦX-ؖR >`[25ԂO]3 >s- xd#7Yc  ,Lp^6yAg*'vag'tvOg1g ĜaJRS@'VmL.y6Ĺ] $f$;VHif&5܆aUy!r)dzLo|wp{{zEuȑ{MIu%9(pftN/HQ4AsPma^*]?#riWnZ]IʤBOt'sR(O$-ZӛN'PKN PKK>/OSGI-OPT/src/java/awt/color/ICC_ColorSpace.javao0Ɵ_OTҲ7S1!䦗ԐvUwmPE|w;{xF+0c]JU% hj~G>ϴ%eJ,-Ѩ%!EΟngd Ou[k%tS r;VծNIpy.XP8LpY9W۶Ď8ҦV\;J$dNu*~6pNj-DTX0k%ZhQ==ukµYJ\4PҬ8K7IsijY< " "}:xd\j;`Lǹ?EdDO G5岐9FRo(5X-.M% ї/4 o]lD$Z,y%/Mog/#4A}3x* IwWk#̨6K8`?~[WFtsk&(XWX?`KroxD]#hPK; :>PKK>,OSGI-OPT/src/java/awt/color/ICC_Profile.javaYo_1S2}i'!*K$-bDICҊR3\eT b|g>3 $ϣdKN皢v_Ld)% d,d#,&U3AFK򞉂& y._={J8IdyI^ Oa#+ Hִ=/uZ-r%q ~ ZF?e~I.WI#[\MvVԻ,aEA<^݁U] ݓ\ +si^gKRrOjb^I:c3/$A\{a^J%-l܆d$|v ~{M=9\!u睐\" {b&oL*v,kٶ[F#xDvLi-XIxKZ_r '#}/'QŮZCIP0/"+@RA '!&K?/~h hB iA/?w:\-=E~"+L؟OpB 7\gq \L{UQ`x'WPəww{S*hΈ[yLAiF<+~^/?%8oXxeL9'kq?M`#( <4+-Msye7TCma,~cb:[)i$RNu> ~GM8ѬШ0py:ԻE$}.ZJp3V94lK& +Y; tk-mX{0c1KᏧ乡ãr׭h]C R [ʊnZUĵz=@@Bkثt14i W96-@cN ܼj Ce-uM[SDQ(ϠJWK,WLևS,9sWP 5WET@Ŋ-|vM4t]G?<y15Ǡaq>xc54T3G>=,PPQ%3z beW)_uPWu%( f*8aV~Q;uO;)1CVʫG1b(͋]B}rtMSWeдk놡;^oֵL[WT$4GQ,ǁF1Ʋfi ae}jLu2׀0u&EΟ0$S<FqP&vUy4`[TŦt/娆Ph͑7Ԉhex-,or[\Ԯ/r>l)XdG(rNY3򩏩6CrLͲ4 ?̫|2 WUFrKV2.tBldU*ɩ'ڼ-p#쬯)r ;>K1hxBGŠ0‚a| f SOi'O0tXŵmTNO5訆e0 pi+Ϸ6[ZwCQ-])V!:*z{U|W᧠He}5[LVkHo! fc!lˁ6^5d@0!*~! pi!Cwuį5䶐تj[5\ W?n)7Qp2›ymPێ4ȖnK뎲k62#5ԆoEz۟0GN=4 a ,>ni67~;+a Ja!;'@=ڦx?Sӈm")dWpܝU隉_"/Y$=0OSGI-OPT/src/java/awt/color/ICC_ProfileGray.javamRn@|_SR; dP,JR)Qkrgq^Ji7373{Yg0z0,FȯZ+4|2y7y7,Ò<=(kUTBkJr[B>8'0 A5]ma0$C40(5NxN]a7G!4Nܛ>>[Ct]ql]'Olފuk4yIWnīsm: 2Ԧ={ |/nWNtf9,0]/U;/@RC Ħ u>Mr*d7TJ-ݓ3r;X,V;_ %Q$=Bp1vV[w5FzB˦ӟ7ΆpdtdJ!zKT"CM|G ē_"دT*\oӍUOYrS{dz}LRPϞ o6eh [\ KZ}PK:/OSGI-OPT/src/java/awt/color/ICC_ProfileRGB.java}Oo@dG.Zǡ.j#pEQTa]XQ{g4X{ohG0W^rcaa.̪JF'Ap<~{1$Ni !CzG .\d$ Ȝ4 ƌ7N% `pj*`L8EH!ԔBd\,, J#-"Ioqc5 JlE{xO] 0>rA?qTtP7k#d2^4m@8ejK27/<^Ow]B!$V`Gpz~Η.qL]$ao/ zJ[9u0{h Sxxuoӿ䲩W16҅rҝk_b^LGH3i[dޯq\ğCuɩ4瞋a0PK'nPKK>5OSGI-OPT/src/java/awt/color/ProfileDataException.javamQo0_qT,a}ۢUaJ>;{ j˃#U+M{yB4JhI_f$(BCA쁪ȭUtE~GH[!7LSF:a Fhr$N^G5V5:Jj=4v@ߝT  7<۾.y~Jcq&Rl{tCҟNYv9AL%ņYXy{l}/,J9oզoB_plBc>eVN}[>-4_gU*gb :68`L"J7[sAr-IU56%W.\c*4j|(_ bX؛6#d#5‹CGOrjO/%ѻA Βeag< S=PKUSPKIG@#OSGI-OPT/src/java/awt/datatransfer/PKPKK>1OSGI-OPT/src/java/awt/datatransfer/Clipboard.javaTMs0=_Ét!\BZO3xf2d{1JJ2v L}۷+Fo{J / ' ap6O ia<%PZ̡9pkP>\I8 02;U†@*EV\ ]nUܭ<-W7-JpFMa 0׊shTUUjŁ2H4vtMgdT+)Z0*Nw4XJZ@`A:sʫ w\Cj*f:[#~@1 0(0'%\E8_FLy9. h~>$(i+ t# +H3&ڢTh4n}[- ='zOt˶,` rFä]t F*T1}6ay,u+2%Jg'/$q%Iokt} ef|]VX_U撺6x =m>zPKPKK>6OSGI-OPT/src/java/awt/datatransfer/ClipboardOwner.javamRn@=D.89QmQ#(<-.&VMD `g޼yf.ar0/(0}ϨjryyC6`C쁚Xפ50,AjϔYwx MM8x= SM+LFS%(ljCWR`ԾIyo>&81vIƺ.[r^TOU'үL\=-`gIr^գeϪ[ӭRiy_W YZBVSZf"U2{vaN6={sFI?<`ʵdo"3Tb8ɶ(^l*)F%w S$rvx;V(+QPKT!PKK>2OSGI-OPT/src/java/awt/datatransfer/DataFlavor.javaXKsF>/0`Y6^p![[HL# H '~ nD|6а0~<q^~l06 ƨP.i6 %9B/d6IOZ"vF՛Wb%" !RH\=|1Ԗ\c;)a_S 1Ռ) )guc\.,frYչVXZJot,$V6W-AH`3ta\`%\d Õ|靠9Y  ޳``g 2|=NKo< '1܌`4Ow~ s(Dp&Y q+J*D&ׂYf3@G2iUD10f:~j [6[HE@(ja4p1byKGw[lǀ/DyoVmx"8%kRD((C.61G竵[D F*R3?,e/vޢʡ?6F''d"AӪ5<sKtWKhj %7G!뜝{Hɉ =?|Χu5d_4$E'fV_`dO (6i.HTge(яY`rPZd3.Og+3M=[B4: 4+ C!4u$\BxHvTh1%1^~)2S;]PP3ԷccU>=h4c1%*^O%R!~|\+gzee]8T) Vu:}3|0r <~|JƦRW#\;f[1Ai2tdxE봘T gڞO Vk_ Wfw^#ځѶܡ3欿5փ?i vf i^#"ר4v=Wׁ/Wi sMvє]/\_$x2]PKhFIPKK>3OSGI-OPT/src/java/awt/datatransfer/FlavorEvent.javamn0DW |Wrsk}R؀4ȑ2STIJ߻U AoU+,M{9xLD"LO39N1A%G:a`r'+Ҏjt&  d7𓬓F:cj/t8tKEZQc; }F@Ô^\pA˻[!KÐ3qbl֥wr.Vz׊ߝ6OSGI-OPT/src/java/awt/datatransfer/FlavorListener.javamn0 S9%Efgm=yi+ NWش͑4I {Q7| 񗓫`rs0/->1m˨Jjn _v!ٞX=UЩ,#Ajm,+YZuyHM&Hu'<:Gjn $d&q3x49/=~G͇$!Ƒ8ֶIKK&/6ozzP-9~tleUamqmK:P=f N~@KAb-:ʴ?2 b"+A1>1|m `o}ti_v $Iz66L 켼"Dj}ArJTaC螬=  2-أ+4JH|a1>PJ,*WLw;9OFy{mRWRynMO+2> 8Uv/ڣhW3PKz^^PKK>1OSGI-OPT/src/java/awt/datatransfer/FlavorMap.javaOo@SrJ+cޠXGS qcg]vv#wg1-gwg~[\8uN@4eA0^/" _iaCLGeIK%$nOh,5JE4/GK8x!,T!!P=Z:#;ۑvA_FówN#GqsU:_f9eCւ0<U;`ֆ)7 Y`Uz41Έ]#~cC $4$OCnn&ɶ2lnuƫ$-|HEđi'`yEȉXɒTJ<[ jՑ<h2aZ6XzL#¡ A9aJVd.8NNΑz`G#x64N4oVYsZh NJvd9@fƟSI(Â?~/PKPKK>3OSGI-OPT/src/java/awt/datatransfer/FlavorTable.javaO0ͧqMڭ*i =$ k;w8JR9sn`ň`O`}׵@ogwS?WZؒ%s"dENR,Ȁ;svJm8#.#^@*%f 蜓v $kpP{,Gм*n0}QԶmP*{|f˷z5Y ~7pP SukUkѐ:#{QڳG~-P( F9Βl!~vdf MHv& %b ĕ9t'`"dD/,d59GUANd$'M(V Q8tݣr yO)xI'p]~|}b~TvL!N4|0'43~c__:Z;g PK5GPKK>>OSGI-OPT/src/java/awt/datatransfer/MimeTypeParseException.javaQo0ɯ8S; #inrRNj &C"{$.0he,iJJr6{7OⰍUP:ȑSC0%)G:UR#J )uR+\3`4F`qv=:G!jP ޙ~{:gp $x< n0_ !}zޛI},NıMҞ.拼XeN,ě#aRl=h,q@[jpl*鼕οFRc @V1-bLjlQ`|_gl_z 9t06$`LyEDj}FrJY˒ {I1`lZ^_AIb/bbr5٫t'V07Э?!Et*wds1z3Xy<#?ճuiΆ֧( PK >PKK>7OSGI-OPT/src/java/awt/datatransfer/StringSelection.javaQo0ǟOq *h߶>en*"$؞퐢}$+SyLN8;ëa>$!3# Ϧ1Qa3-,Ѣb9JԲ@niO4+ g>aЇs/S5lrP[$ ns\mtpn*n{ 9F 4=/ӟ'iBTU^dKe]R~vOB PKy38hPKK>7OSGI-OPT/src/java/awt/datatransfer/SystemFlavorMap.javaVn@}._1 "$yk*Q.H4>,ۚ]wwmENB ܢxw3q'ЕR@#l0¡ǜq~zz}hvFR5 #,%Qh *0sNBvJs)=5W[fB,e !  kBL p\$ySX%p[aȉad@BOUC`]|$[<]V(vV.nIuuZĨ5(rEOR iYR)=#\q-&g -LĵQ|A{HPؘz'/N_cF;{4 =RȈe= ܆"/$Le)I')51K a&3T<ՂkVM# 7K~YVFqc~,7nbBOQkI:pR!i bL+qJUi0.v_{WqfGHu-P2'2l`6n@١dLnCdΚpTk YiHhJۄEFh4OSGI-OPT/src/java/awt/datatransfer/Transferable.javaAo@W|# nnOvZ$c7xwXU{gIUbgBx%,:i^-LQp& |n6 #)8[^0XB+J`b=ƊQ.\sXN$[8i5H@|*PY yP#ZgTq$p?j2jg4z̎VîRa36^lǩh'` k:XjV:NsE탑F'Src5["3#Y@1(8uřDthm 2MV6Nz(Oq)2v8S B%$/Ț[V#Z#Pܸc5X:e_˗(<zdG%̈́P/<'%gQWz;{  5sϊ tӰ#;2=y# *%5? ϐAZ\XßúpK 27+ٙ?-PKPPKK>BOSGI-OPT/src/java/awt/datatransfer/UnsupportedFlavorException.javauQo0_qT,a}ݢUA"& ނ){ j['p6'+Ǹ`U|HV U׳ه)qmaM쑪ɝ,I9Щ,QgL񝬓Z:a4p'(9bP˖@%Pz>K w^\ëg$}Lk$E뒻l̋{NmUKүNZxw0LU%y{+TN׾M%r7f_ 860J d"+>|]m7O4d5|mUΫ[eb ȸ=&`L" 7 9Ceɣ G'!{.\c*ش 筿 ((b| j7v'V0Vm9V]'ѣ'UMԞw /xqQ(l'<#zPKi0PKIG@OSGI-OPT/src/java/awt/dnd/PKPKK>)OSGI-OPT/src/java/awt/dnd/Autoscroll.javaeRr0=_&cd:tzT#p$!q3 *1|Go߾}:5lwjUI":)TEocn0&G@u ^VUM~GȌ7fb|#VIdLMf{J{C:4#sEC*TzoFiS%(ȡ^0\p[Gѧoy0$8ѶM3֥bY7zzP9K?{iy°JlYk'h ZA`ta)y+e_Kr*ȊGSm/ZBdOCv/]Xcu^zO (b 1Vmd-Ȇyg׮ݯe q M/_5 %s?~-<ؔqPKVPKK>+OSGI-OPT/src/java/awt/dnd/DnDConstants.javaSn@=dG.8Nz(T$)Z/c-ޥ;P)V.2o޼y3xpjvZTk C>. k$GN'1w!wH9[,}bp$sQ,%jka>}d wP0Cѥة6lRYh 05>ql, \m^Z'z_gqJPK(-E͗ g{žUPbM0O8-⏤Ϻ5BSTq$5@i`FYTwZX!1hJaO#@1 H#O?܇y$. !YHNWp1 YFuѮ)S@JJ2 rZU*JmQKaX ,M-62/W(<#ŶgKY^zM$ikFgrevp1 '-k1~>W8/c?dw1eϘ'\]~OɧǑi:82/OSGI-OPT/src/java/awt/dnd/DragGestureEvent.javaTQo0~&ԧ+&PʈZtLMGjiVwIVڮt>}wwwNϡ/@;vaq3#{|v6R5%&>1XsИ@!T`AbkN-V5* "0,e88e0I8`4hxNѐV ^pxR(: ܖ"D[fsdMKRD%\۶jX/az&8%fKHR!;U,=Cm % C Dט̯Gk :.8c,S%S]:eY6=o#9uݶ"60U]Pڵ[G(=;XXiإS4E%:@T`®&ض`3;š Bml_<q<$^X KQcIРbF=M!ƥ hTU#/ r<6U]5ń'K]vQԃW?'9m߽{_9P=G;PK |nflPKK>2OSGI-OPT/src/java/awt/dnd/DragGestureListener.javaer0)v|3ڜL=xfrabIݻ´uvop+φy]qO- Y"ow!~k}-ȖJ+d!Ѣm%%6Z'̦lq%Ϊ8T:AjjD$'q3xx4 N\T_'pxHđ2M^rmMWؼeAh-ёgJq`V ǜԃ!G  :Cν2#~ ǤHЋ<ϻ=<&ydtS..[t$|IuȖq|O"juAKdӉQ=Fs"2`eZ:no.(&zEE6̡?ڈ n #<vhӣt/^QտKHat%?j@/̒_APKJ_PKK>4OSGI-OPT/src/java/awt/dnd/DragGestureRecognizer.javaUMs0=_'-'ÌiCP&NGHF㦝wV:[!۷ou^Év'kN4YxOSDFG.ﻁganQm1rF3ѫq*ͥco`l)v2 ہr5xfHnZZͺSX%pUsȥagt ٪ fj6&{?ER'U2L+'i8yCS"EA+x-Ik X  ZLZk27{k !a>a2X|],ҟ"0lz,ٔf^`ze3e3 YUB= +YIF|#JM$9KE%(#Pme$04)pLt 4_'2ƋE)OSGI-OPT/src/java/awt/dnd/DragSource.javaVQsF~.bO8CNgZPpRMm L׈;q2$a-}}}ւg0@;80I8B]txeL 3ԨV:`AnxBcQY SW4N6,ĝ`@HF" S\@ iAm"?@L}!Q: )=ED` Ƥ?ua9cGlru]OuHPkP1*`s⚰5H,VH1#-↋ZFfZk<3{Er$*p6z p6N|ڃ F鄞^p~s' O &t<= P)<IqbXP R)%׶&Knɗ*AVVak"lNU aDnXLQ-I\koPqyɿ+F\=>؁2I#%^`0?Ȓdx"7'pz &ֻoCo#_z]9mJX2nȀ(PԩaT/G;v+%Ϫ{d gXϴ)P ŨMٝ>y*Y+?C*E#2妐E/|38K?˂o!ӄ\ Q``oCFRXbQU^fxhK Ѷ%ΥL;ڪTd2ˈ%CR2|{nMU*̡Y{f3kά$>iYe;MGԽyJ. OF}7PK0OSGI-OPT/src/java/awt/dnd/DragSourceAdapter.javaQo0_qTY`}ۢ]Gǹol'UftBDε3 J(7|iY@\UIпޅ@O+-,ѢiGiZhmb8}BIF^xa "y kQ!v $pZ+Ps$py13ڠi>s8? mF@)SgxȦou++ &*rbX + ҚS5 Y`ڵ̠)uF{ѴgF~*1 8$8KЛ%/ 2^ibtAO/k2;m|S ZF.ւS4Y֬D(UFR"hcXxJlc0u7E,n]E`9fQN +3Uq#4nQ5<5~+g:hK2xtϪK(Q@AQz* aft09J_ ^u wsEٜ)!m+117 xPK⊪%PKK>0OSGI-OPT/src/java/awt/dnd/DragSourceContext.javaUMs0=_t!cx@vrbɕd6Ĕi%}zyـЗJxn`\pp3"4{icalƨQ-1r\23GpSҟM\ 9]hZIuf)V2[25xw!P.JZͼSX%p[qȩagiV3gnLabGXݹ0^*F$5(qEOWRR)iMXR;#\qE-g&g -MĵQ|-:lcN>-7r97wR- PKK>2OSGI-OPT/src/java/awt/dnd/DragSourceDragEvent.javaAs0W)'-pLHfNqd$9n*1:fye}ve{p#],<,HJ gi_WZɒR7(sR 4 &$֭DLJp^ ϽN7؈vh,XɊ@79R!כCk[\< ;tj !\omc')AkdM3uu*5pDTX2k%ZhQ5=uk`ʵ)uF.i?nP%ҬIf7Jg \%y2] 9F8])!^C:G nC70<"2+}@5r%s.M( ޒQ\j2iZ,M%7 []~Apz/b+bѺPyP7K"J0؈2ӍG-)Ta?m3EԑVݱfctv^-lÅ0 w`1z/`WInltX!rQWY^OෆOnXIKQ=~PK2}65PKK>2OSGI-OPT/src/java/awt/dnd/DragSourceDropEvent.java͓o0SBZ)"Vj:]55vfմ6qQ{y瘘`UBVJhI/Mi,aIʔɅhuI~K!կ$L)q1 A4σ؉hrب@7!ͮ:i"SQ&`[,W>@4L%ŚYkXy;Ug6Mj'Mg mBcȋeE^$*_}\\p-| ,,|/ՏQ; !wQPK?Xx+PKK>.OSGI-OPT/src/java/awt/dnd/DragSourceEvent.javaRMs0=_&7$Xyxc],,"}'*#F*|KX%@T*kZ@i1IU `5ɥuFklh=rSM(IÛ8Mҁ'MV7+e<_%%Ƌ$Y%9"C2 @<2֡lSqo)3 }d+FfM(ޓQZ-=M)w זryax{h\:5OY)Ĉ"յh'ش#cKd2EK_T"y81%ŒB,#!T]5? տE wV,aFwNQ{G>Y{oꠟO1OA PK#1#pPKK>1OSGI-OPT/src/java/awt/dnd/DragSourceListener.javaR0=ԮJR{ m*.=$5g *rHdϼ7It ,>QL ⣀iazXB iaMeH d-8J%Dnk3VJmoST vCXDGځAzÜ+ǑCvFME9.٠8Ts2Ɋ5QAkVr;ӤimX R)7 Y̠)uFZ"_e$Lb"-!~o6qM ,ln<Gf9 EFsw@2E(_HYE%8YujZuh$9 _%iA8憫|AQP7OSGI-OPT/src/java/awt/dnd/DragSourceMotionListener.javaer0)vrJ:AO& !ufNvIHLwgHlK﷿DpKmΖ꣇i9m mD.8l.d:ءCۡY!lDPB$ZGԈ?cd: nLCd MfwA[83(u䠢K4HAOfD>J QCtWu"?B{!I@k['%%l΋[T΁ş-YpafmDڂ-r@[98]^X 2th+0 lP0I Ȋ |LletK}.`6_el|->ll1)y9E(_!T TQɣ5B;'D.c@d:~o("G.:Rɻȴv h+G.tkKApÎ&tS;To%zi Y^egb9nC=t.2PK PKK>)OSGI-OPT/src/java/awt/dnd/DropTarget.javaVr6}bOtd/XIi5u$$G\Jh)@J&/e^4i@={ǯF 2=*pkXp3"8ɍ g"5Q12GS_{TK ,Qfp`G@8'bj !K?5Uk5 RZm 0S.?{cҟ(6ቷ-0AP.+EJS\2>Rs:1*S/j&SD$wJatTϝ^V6#vsVnfϧFᑛ!W?NjX/Wsqk=4/S2kv1S)m]/byZ+.ަx:\t嚨4Skbh4\|A7J^&Ygv10&˾5'e4 PK)$ PKK>0OSGI-OPT/src/java/awt/dnd/DropTargetAdapter.javaA0WzjW%){=@DHM'45j;6@W !rHd7o]psF;rYQ@4eI0Lo'߆WZX%Q2CV$iVVdb%BIg0PMn0OSGI-OPT/src/java/awt/dnd/DropTargetContext.javaUߏ8~.h`ڷޞNuaN`Im}ClH /d{oz0jy`a`g"AN_ߎw +gi`ӀOPL)jb 4/c R` Cgp<]n^e{Bi0$rj>NCn,#sFNYmHσɤyƁm.._uu/ 44[rMoJ؆JǺrVLIoJBGJm@1Wa Q|qȧh~ *\+-h-tz3|1 IFqQiNκ#ɚQ'K#rZPFPoqe5D0u0rˬ: WX*"rC*BR0"7RΤh=Wܢ~\1j WbA֚ v|ܟ6AA07RHeN&yxmst7'a?{zWUitD2kY}/{aJ&ӭ)f<^7o[j,x&Pߛ>{Ɨ*pXa|,k+w 5eb]K1QC{:M]קphؖuv#$O%N׹fށ :1cViga{N|l9Wr|+^տVJgna˱#1gz\ZֹE?HhwQkOgZ6LnL/E[ga FNOg4n~Uds2?m< PKE1s PKK>2OSGI-OPT/src/java/awt/dnd/DropTargetDragEvent.javaێ0S +FEPU `CxCaOp|vWzcDtL<Lr}~h~>-5!2OSGI-OPT/src/java/awt/dnd/DropTargetDropEvent.javaTMo1=_1Dti/-U-vUKEU;,NlP /͛7c:' 87FdKo$" R0nM}+0H Sh֘IFBR4Q87m 4By.`6"q !c@(zJU+˚C#8v} 0W>KNY!d(5ΕDkBx*U;'Td=M*3b^4R)hF I>GI=E<:9E4FYK /m}p](h9{  qOqP^TIĵ)]Ä9y s;`y*x)*WȷF/PK {tPKK>.OSGI-OPT/src/java/awt/dnd/DropTargetEvent.javar0)v| nnOv[1OSGI-OPT/src/java/awt/dnd/DropTargetListener.javaRn@=dG.9QmQ-(5 xZ]VMG@ޛ7onGC@%,Ʒه)$װH kh:,CV"+*PZ,%p;X?Ce ?XRn=`4F;/qT-rZd PQPv>w:pͧ O9)qL5gV|z`[2<BBlk#zPDmkNy׽!GUA/Su{?<%cFqI>qS/lex8$5̳tl,G) G}𠍟mE_XْXPE&VH4=YVK/ОpWsFQpοOщP.,eyv)r`M%x F݊@yҞ&\v(wJ#_ 3?w wvuIPG;.|s˧ PKDzPKK>;OSGI-OPT/src/java/awt/dnd/InvalidDnDOperationException.javaQo0_qT,a}ۢUD>;{ jҴ<8}|w\Eܴ'+Ǹ(JJI+z60'qX*(V!ʊi+* ;S ѸghMnt؋tJEcEԨ̾zw:K a6^\gB?@$>g&QKn2/z8u9K;i eJlUB4xϛ@[npf{a)y+7FncDV9-rLntJu,Q0/EΊg_)#:tlm1er( lɵTɭ5t!4@VsGh 6JW_PE`SD,z׺n)R2}J (oy~ ѓ|3{ O'dɷ OQ PKwSPKK>9OSGI-OPT/src/java/awt/dnd/MouseDragGestureRecognizer.javaTMo@<׿≓\CS%4@eF9.lcvݵ J*TR|߼ُٙޙg0ZlaM08yΙH܋~}g,RCUO '(4PBP^mŃo4.>iKRe K! kW D.VZ͢eJ3Ψ|̴gaL׫gb_owGxT]"GAᏒ+r<[+HUf5g5H,SH5#ZqE恖sS3&(>+ͳж>bc:A a܁Aƞ% 'S (OQ e8 'c}`|_H<*u@2s#>0IyBDV !*A@.&fO/|ىzC9?Xb>tR6#,1TH eWM0Dfl~FZDaXo)kil1)4ؕ9.}!+[1<.)? s~ׇ YR ;'کWgȣxּgg %*SX 4|=tHGUk#<e'wAuzo=O0G0(쪪j0ǐO PK0C[PKIG@OSGI-OPT/src/java/awt/dnd/peer/PKPKK>9OSGI-OPT/src/java/awt/dnd/peer/DragSourceContextPeer.javamRr0=PpSN43i&GKt% L+vSVo߾ڃku'Ym- ,Btz?LWCXAZU "D3 H`Laak4u{NAi AJY#K ׻fK=Xx8 nhxUAAZ| þqPh5}/lU]Fcg+o V kE@TgSݓRU>]^:BKrڋhdM(E$>EY)YY>)Zt,2X ^d,S^A>$)]S BBL,eTՊ bG qjX`hjVC/7(<#.:*npE*Dr5_ջ:5-Z=>]uZ`N_dݜ7]>欚5.ΊTKB]sWN1/ PKBس PKK>9OSGI-OPT/src/java/awt/dnd/peer/DropTargetContextPeer.java}Rr0=ezL҂$La8l䵣HBf 3ݷO=i:0fge3%u-Q |<~;~;KB`A얊ɵШ,5AjP ᖬZy28}kpv(v @i#JYУ A*zczin%(C<2y<^t7Gm'Vzulr9/߰~FXHˎW;@êXk-h XYAukӥoR)VA#[?pl`Y> $wf wbΖeLi3^]A:/l:xz468`2Ĺ?EȉN$z/[!.cEFz]酯(8矁`B!iV%ɖ<,V'wje(՘Zb-1ߦӞ6/{W'2xuMq"y*TtS 0,*WMq\xotXwc>~ɼ^8Q/PK6t;?PKK>2OSGI-OPT/src/java/awt/dnd/peer/DropTargetPeer.javaAs0WθDme$ V%U&L{W6ēK9H'Wksy VWmP%a|=}'q:(!ʒ %d  &Xu8Bi{HZz*xHR̀K;3<z7^կ~>=;ͧ$>'X&iZfe^,3uZr~w#aRl=h,q@[jpl*鼕_G-؄(-#|NlmuC^&[X1_lr^}A?{/ ϡ'c)C[DAtP33TZ1OSGI-OPT/src/java/awt/event/AWTEventListener.javae0)F9%+ =$mQ#"l=ȴvmUڨl3C\.J- Y"!qkL {hz"V"[*QZp'D)4h s0BŃR9,YEPrΤIiP.S60Db$ikmd=SOeւLUY[12 sS&j7^" 1핑[ $4$OЋ÷~dtn]N.H'f-:1y"7"Y%TrkDШ@9c Xy}~^Dbp(C}dZaC[{e/;GmtU0 jx_WEYPK$PKK>6OSGI-OPT/src/java/awt/event/AWTEventListenerProxy.javaOo@S<ڜ]Qkm.]L(߽XI@;,g`duDRUR^CC0bI̞ȕIY*Ш ܖ"O'+E,OSGI-OPT/src/java/awt/event/ActionEvent.javaŔMo@W8ABrhzp 4VWSS؃캻kw8(RJ33Km H;ųN҅ sD'k!5-.)X)OPhL)*0k` 4\ }X݄ݡ6lB(5װ9%X)k7Nbu!(14ژcWUjǮTY/߳7Gy4~G+֠Gu+U–5gH,SH1#JqE怖+S1V&(,ͳ=z֏"6|"?r/^zG0 ~sz7K~Ȩv@6~!B|fa%t _ZY2LnQ  Tj2Zoa^zї-kh߭-2U- 3lIȞXe"O "G[o,mk'4ufQ 8l|fEDƱȝEPp;P[NNOtN$m;-K: ]e;aprxz` Hn6t:]ThJ%j>$ۺdJS1X{%rF ZPKf͈PKK>/OSGI-OPT/src/java/awt/event/ActionListener.javae0)F9%ҽ{ٴEHٮh` ӂ6Z;&ڨl37ngC\!L- Y",o7wk*אL Z4V!+x=(-V BEYw4pKC՝8:qY,"sI(Ugi3xx5T .|_'p3hPLġ2M^rmO4߽eAh-Փቋ3T(#(110OSGI-OPT/src/java/awt/event/AdjustmentEvent.javaS]o@|.bT!$Ԣ>8$nl(Oas9wgw8|iVygfg| x ,_K,46sNr&bV=۶y A*P\&#21 3( %W(. YXg,DPH\xc e^[+^T}jnjlrtm-?u:eYڬrlg2ꌼ;r]&"E@KJ<]U̦5e%dX"j:3K5*I423B #Eؘ6 2"^t1DpG8z7iw?idsiMnƹ9E,̳%c<nl4RE\njD]HQ){K6.`%Z3+=yzjNu3gB{l4~PK̨ PKK>3OSGI-OPT/src/java/awt/event/AdjustmentListener.javaen0 S9%Efgm=yi  N[شΑ6#Z0U< <zPQ 9nsͧ(>ā8ԦsrfB=V=C?[62U{am+CsSjVGC^` [weF2AlC8$8KyJv6;x8% 6[XndlR9}8}Iz?ˤ6O <"dDW>#نr.9TbEP鎌!sd `ej>C7\7o `!. v/>eLqZwZ 5^smWeW\-}ĺA詘^ 5TC-~PKOPKK>1OSGI-OPT/src/java/awt/event/ComponentAdapter.javao0x)2zzbiuU=BVTiR9l?~~'`dsүqUIrt60?NB?WZɒi!2'e@ 2p;B\?XN^0F38{q%fHtS rkt~f` ~ k\) E8ԦF|L֕ZHÉDͮrJt4kN{םNr <5Yi=rM(I:8Mҩ\'z/7"jjylՒG_/o-YOA\C ئuO)3 [}dkVM( n(N^Z SɽtSEA=򠟢\H-)wM=Bd\y%]+ą]Ӟ' B(H>x7P_b뭖E YƯ~VYOy*?M޽tiPKП]PKK>/OSGI-OPT/src/java/awt/event/ComponentEvent.javaRn@=d"{JMT* Kc)^bbEb$j.y͛.,YU$/ q_a8{i A*HP%#9 kh%-_^}ǁ;W&C=5;44 I+s5py{k-nNb}Q4#8#BMk 0ݛѨm[uJUE8 4xO{֭(Q)6^*g+Z* H=]׭䚋Umt$5WZU߄#@1?0g? SLj,:`'eaB,ak@c-d8) hI՘ i5Q4@(=JAArǕVEF;Je,ri؞.QU7+򒑽u%&(/cz7\S𚒸GA 4O09p>,σw?$A~u<.0y ux T=Iѿ {#pє=g8ftڤ(Q7Rt|ZϖPK%IdGPKK>2OSGI-OPT/src/java/awt/event/ComponentListener.javaSr0=);=4PS:=*Yp$!vSg& Sv۷o*+X(}4TLIӐz>" iaMe dEJ%DnhQ2FBƒpa&ch2GAA*E 5Tv@ uУ~3x%8r.yW'p;qGqsʵ*],|U{٠`{K;AhVUkmDʀ r)7H!XU^4%Ygh׺ ~k6!axizt{C$6]bݦt$#|J-:e4E/$T$j,[u+jZuh$ẃei@N蟾|8oD$zaݱlCS $VlA<=A[GM?Wr)Tx@C'̜o_g"$?z~!6߫? _PK;PKK>1OSGI-OPT/src/java/awt/event/ContainerAdapter.javan0SURe$+fZD'=@cªSq};]DBc\LοJ$u-*846aClKēYɂ*)~uR+\sChXM J{4!&}AC*hNC@ &z `x^9xo>f]Ţ7fVbl=Q59Ki °U!vZBTx`Y饪pz;a)`J鼕ƿ#c $G9| fdIm̱`ήmxIviv=qd|:`M<"r {}Vr FTJdwC(]Vǂe(?}fQ9 |L-)f9BsQx`υV6&0t!~*]qx_/OSGI-OPT/src/java/awt/event/ContainerEvent.javaSn@=d"IzjMZ* r0]XQDIkU{oޛى'^zc`Z_9MÙ(gAp?} EjPa哂% tBfx5*ͥ3?Lƣ;{AHFּA[\@)hf3U503"[3~ؗ5]ċ(ɣzd];(j%W%[׆ Z!i].j\)2FUg^5#E 1080sϊŷ0¤ i8Mhwar dR˨޷& ܶ0E_YX˃%b׼hXP*AEڎU4| 3ërB3ǡ>B?َ7>Pv+# #{ )QE\/苐VԃnYsJIC0ԕi%]\FK `|]#$,/P Os?'S7(ъ~3tGQqAtMAѪ,6.)4xh9F}t?PKnsHPKK>2OSGI-OPT/src/java/awt/event/ContainerListener.javaRr0=Ppsks2pQo%UO'8i}IUWRd98 _ %!Kr!\Dri!G*bO :Yw@H(y*!@cII0 4[x(N "sZ|,Q; :I@0ΙXx8 n м_6p;8?0 G4q{&]bUO;٢`wGO 4*Şbe@4W=r$ z3Eh4 0K H|N=}}IKlsXmtn3}${ivrd<X&8Ϸ⅄Z%Y%T5tAhTF#hdZXy y\=Jwn9rdM-WJD0Py9j>zERJRUX/'Eϼ#za_!s<>_PKFOPKK>-OSGI-OPT/src/java/awt/event/FocusAdapter.javaAs0Wdg\psks24"X-TI@<08mH{ Epza*f.$M#Q ba|86lَJ R*hUE 5(1VZeiLdv,Ai#v!'AƃT h%K,Gn0ڝ =\{ͧ$>Ɓ8ֶN%zL=vݫK?[i9qy4L%d{5uo;ߣ`SI,[jh9dž &iY1i`mn6i͖7pomyu i_f#sؐ1e+BA aOHΐ;)8[ jݑU كt:M#ңJ#}c}L)9 sjѺBDLVA⡑bsnt;o^OӲ,[ FJ;_/Q PK74uPKK>+OSGI-OPT/src/java/awt/event/FocusEvent.javaQo0ǯ8 ,n{2 ]Hd%x vf;5ݐ:ayHb\w :YIz!*#t~ 4^i1%KfCɥHYZR 2p+BT?Jd ga/h7K[luBi{H,tQ 2.ZծNIpx,5лg\׫:;PW쵶wGt]W kag% 'o!JĜY QC9k#TyBZgrO mB6>Ei:}Nfh2G))<ɄGcD|'[u4>cJ)"%z{$[R&2h*DND(ɬjpm N_|^}፾EBڐrVY͹ xcUvؑZ?oVWݵ^5KD12>q2Ji:Goω/x2:WeymrD;ma΂Nlwp0׺ r<:EGrrIYj+&;]6*v>qxvF,7l˗/PK?URPKK>.OSGI-OPT/src/java/awt/event/FocusListener.java0)F9%ҽ{5)dڣLKl6Q1U˞f&X+}2d#Aܶ$d0]>,?ϴC*do :Yw@(y"Kƒp`fSh'Q@*E 5Zv@Ju@0֙\< Lp 4DnsS 8TszL=dւ8LUY[12 sSf VnME*:w5?eMH9$ >y/s=9tlrvdd) N_k/yd\_0&qor+Zƒj*5tAhTFrGk Xy}BQ@wϑGԂ/A PV,zEVh8f/BU_PKXk9PKK>7OSGI-OPT/src/java/awt/event/HierarchyBoundsAdapter.javaAs0Wdg\psks"0uqqkK$ n&+v4=߾@r̵9XY<V' iHT`|>O t&G*fB, 娂VUdRuR+8g0p4\A(u `+d:RSpz{0tʲφ#G*ౡQZ@V2-b zutNM(`*6*GH;WS {cC)8Oo gdr+GSu5A;!.Vi^zǭrFI70ԑiK#`Qx kI.5]ZtN{s/8%W8OSGI-OPT/src/java/awt/event/HierarchyBoundsListener.javar0)v|3.9m0cfrabIv]ar@#Rt GbY n@_VgZءEa2CTXB+K4/Sd _XR}l 71NbA*j@$'i=gx%41 N\yWN&wtNC1*kmޤ-dւ-0ЬڈQS^uoȑ`UzacJСuȣN`ۄYC6Γ|!>{c>`w>R}8}Izd˸>k'`<"*ud5TQɺ5B:4'D_e4t"'x\Qw&:ޅءt7n#[T/S[,eKP#Z3uԄOx tJ/:er~.| xY~o PKDSPKK>/OSGI-OPT/src/java/awt/event/HierarchyEvent.javaTn@=qҢԎl'^ fSvw; &5Eiz{ff xnQn$Zi眉ճ3 1!2H*+uHxB *1C z,G⅀^dž4P7%ۀ(4T I+R,5pi,kkku#rT $`%Jٔl I.䚋UI423J5mJ?Pۘ7‰2"c?7 (rb#p`'~`_``R(>T@6in#Y;KĔyJbBVP JKX/fz鷺LnA}aيuZwpBe5>B37(LɵF1S/g"w5qA)5^S'at- GĹG~2sNp" }/r"wx<(~'C9{)ONɡx}>\y`.BuH( ̉DmGPNlN8TATynGS z=[n]/sVT$J sB?_LL?_gּ~wxhPKItgPKK>2OSGI-OPT/src/java/awt/event/HierarchyListener.javaeQo0ǟǧ8)(d}DlEU}tۈM;Z5& VJ Սym i[@,C"װvhXFE6TXB'K4D)O4h s0Bŭ8R9,YEPrgR$+OSGI-OPT/src/java/awt/event/InputEvent.javaQo0ǟǧ8 *u2h-L$]$fvHi}Zi@ys0TvҁIt!3 }w<40EzG N'( P5B~.|Am0|h;:\8GU=T d\ C.!Q˼VrUZke3 )tYXʲXSzknh^:N 44,grry5ҘUur2[2N&j>+lh6@ec>Qu}_Ob`&SNƗaNW/T2r2 ܕs!6,djm'l0W+Ԓ2 NF%VMk?wb++3#e `3yaG ej -kWUq'.'oA Ûb7}5 >_7b }Fw.'~G?hpӛf]T&(xp6?6~|3R<&Mv~!6G{R:sah:v x&:g۩d!ĶPƔ j@z^fL/}YxAp]pj%^0-ZNU.1]fFq{"+j+.4u b aEwPKZx+DPKK>1OSGI-OPT/src/java/awt/event/InputMethodEvent.javaT]o@|.b'\㐶RXM N<^åν;CP=$*!j"ݶ,VOgI 1?9 Byk?fjF%KrS(E /XB:%*ͥA&աVRd s! kx D΋ZڒYUfJ(l3EW1ŗv{\RJ5m\> '5B5(UrEOV R i6UH1#↋ZffZk4[=h76&`Ϗ cIdxÕ?8G0A085|=,:x[(*B%!kIg<ĴdS\\e$049sL鏾lvA>D7l\4..Pn('#$9#y(Jsf&Ӿ n"O(*^GjhA[ Yo Gx|>*C?8+xݗq"(Es?@\&nT{nGцևSS\cYfB7*1*Zo=|$/6"z^K9 s\TG W3&RH`e\Mo4~PKFpPKK>4OSGI-OPT/src/java/awt/event/InputMethodListener.java0 )4=;%){=n %e.;{t%d; h9cKwn`PU; e !!sjj ^>-Ȗr he\k6E%%6\'̦lq%Ϊ8TZAJj9G$'\=T< qL5czfL=U=[2< B3U.ڈQS7HVKt0e бuWf/6!agd3xgI"~dn]z]ʧwO1IlgmI!CB(Ոd5TRΣɪB:4'D?e4t"'p\Q7/Ut" CG̡)?r"u>Ue;Pv,n5W^t hYY,᱘_w /Y8*聻 PK??taPKK>0OSGI-OPT/src/java/awt/event/InvocationEvent.javaTr0=_ 2!$%Lbɕd;L&ޕqI(PFҾ}zvg0TV$ƟY&~w=uw 340CU@ d,8J+( 5!&-j#~ЃP3p[UmA* A"C!MHM{rڭ_FtKwUUV(ttp4GoIuu#344~/[`9lIZ3VʩB&>hVX-=0F*%lcZa Q܂až#YDӛ9,,̣Q  hM'pr_ɕH=kW]!F)ѫQOPKHZPKK>*OSGI-OPT/src/java/awt/event/ItemEvent.javaAs0W{贞M.LNR,$L<0uMm>}3 `R;ɋ;w`^rʒ3##?w?8)Cb T(xBD z,~Džo(<l#[gl,vUQihW%>XkjSh-ŐmQ-4#9Vc!0Cwm[u^%aת,q%ZHpI/vjقXKB%iOW\sQnDcJKhIhic t4J]creW n$ , S'0(1. oKO]@Z 8) ª#s9&EE)h"Qn2תpilJb.sв(mZ[u!/E7FT&YOPKR>aPKK>-OSGI-OPT/src/java/awt/event/ItemListener.javaen0 S9%Efgm=yi+ NWش͑4 {Q74$??rr =;j r3Aڶt0]-A8\.dzءGcBy :]>"VM%|ChW0 )4[Π CQ4CM-hHCiNvBcI%a$]IS:OwddXıqM^r}7yy+Sգn{p#'ΠP 8PC ԃ#&,0Tѡ+26a3Y "OqOnlSvm~m.O5bI+BxP XRMN5i,^ ҉Xx\QE ]*VأvQ,ctGO[_:6ބ_ћP$E (XͯAt^|PK4M PKK>+OSGI-OPT/src/java/awt/event/KeyAdapter.javaQr0AM^ρ2> ئunrWvdj*NM-HNAX V^r w0ޅԑtWn X:(d74jG't`2hͅdSfTC S*˭thG3A9~PKPKK>)OSGI-OPT/src/java/awt/event/KeyEvent.javaZ]o}\'pmQ_kj%1H( 2VUc\wfHJn#E(3gfgg<{w);_R*?fJ/YhX'=Uȵ uZee(5eLo# 7" JQCQ4ǩv9Fj"ИLC9jo|]=%e `@sX IkMh)0,VKndXuj dحy [ V49,M;h6k Xf?uP3?hH궠A!Bڝ w!(ZO7ׯ*nJ'k,H+nAumwxs&GxtD u: Oԓ#Z oX7pXTup7ȅgش vXz\4 s fvd`):#.!ܫh ۋ&QnMԧvs0qM6 tH٨>ltPtM$t8a`~Zr@ǛhWԁ7B>7ҕ=91r|oTKnRU7cSArVH2z3ArWnR:t^A={J& FJKJ)HM!sVExwf@* @@ͦڡJ]B(Mȼ@OzLX$}Jym&͕O׻{F $ 8o›'>GB."rg JqAdɘUmS*PPugB Ov"fl/!7v9tCyb?hzs.5? "d>>04l?4  TG+1 t%4ft=;G={Nvt$Ύ~M^9N_6/^o_/|oZ<%EDO։Z~~jUooz>vSl0 Ғ&1\cT{m e 52KwܜbȨ,j$Xر|\,7w<_Rek=g4tׁdNwOyv֯ n49~cv|o2|cp+&PK`'PKK>,OSGI-OPT/src/java/awt/event/KeyListener.javaAs0Wdg\psks28(Â*  L<=tFڷO>]pkCX.L7 Y ̯WwKE!J Z4!;x-(- #BEoh,) ^0JōT '1TZA*j@$'q-OSGI-OPT/src/java/awt/event/MouseAdapter.javaOs0jڜ\`R&ǵ5Fr%w8#{O]) ƪ]#.C%Yl(y=}v֖i[b_<(Z̢tO3u纓~UBsdf-sM\Q7ZX!! jr10Vȭ xl(=QP?+OSGI-OPT/src/java/awt/event/MouseEvent.javaŖR0Sp L&i8ugcɕLw!@搬OWu/;FU6ͷ!N9eə`n۳ӐXRCyNTbF'U/Q+Rvk(-TlBZK iHz聖3` )FIm%^#Pژ-?0݂C? Ӟurf'y~Q) (8G+FG=@J?*e# ܦsy">0KIœxNfB!Ej8nJ~ 3ԳAN:c 9TyHީ*)6( ͒y6ϸ`%h+!8<ϲ8ځsF RDnN427G|7teAe9x&iǾC[О$HSGo%7]8 q(^^5kix(GԒ58gjkvE]9\M+koeYY+m&RHO?=lO'mMc-sM%3?+:w/PK %PKK>.OSGI-OPT/src/java/awt/event/MouseListener.javaR0=ԮJR{ %EIdv8 C,{{M7Th;3 !! bf; 1di!C2d/ZYG(x+sƒp.`4yj "k|)P; :ZOn?Ux5 &hU@n4=|{(>P:jNX*Wz Z dxfWرF ל{Cd=* ^$ Zw<9c&qI>qs/l?mgYnU >&w Ns92/ &8O9ⅅJ,YUThnEP@9j`e:n8g.(  }EBP@;Α#sh*EKXs(㼖Dk5:E%3OSGI-OPT/src/java/awt/event/MouseMotionAdapter.javaAs0Wdg\psks2qq5V * 'M;NC9޾At̕>Q l( la |8 6l–,ʐJ$-ʒ Ap2dP`4&7ZhR9h-5= j w8\< *wrͫ ЧE}߇x"*/l[Y`w+ O5S3k=(X34OSGI-OPT/src/java/awt/event/MouseMotionListener.javaR0=ԮBR{ m6.=$Hmc;V+qP+.˞yo{v|,> giHaz? g?ﴰC2bOZYwDH(x+!|CcII0 4=xj$ "s|)P; :QZO8Yx9 n мAQH #e긹x.VYz˪GԣlZ0%ÎgUZу2 j\sʫ 9uVU=MI:&?u&$L|0OSGI-OPT/src/java/awt/event/MouseWheelEvent.javaS]o0}'Re!eCJP*.3!EU!!eZ%smOp=Ul4ϗZIC$g2ChuyCAy@ d3P9jK`~6\I!Y/5بVlRY( 7o3,,p ZNu͡fQBA1EoŗvmJmÚ i-&R1O59m*c3*XJ5ҚUNu2FG3j>+=h$jЌR&Gid/h q?ddxdHo *^2vH&w"$,N)0 5,G$GP^qՐ|-۩g\vA}~5 Xe\FQΨ F~(:%UmQ͓` !ojLq:2 ~ps>HzW7io N%L'Z{Q=:J:5kCE]"av}a}GgfJ @QCM$z K!|= &ܝ .v}::v9mi%DR%yF[jI/cǛ_CN$fv MEzo4PK^LJPKK>3OSGI-OPT/src/java/awt/event/MouseWheelListener.javaer0)v|3.9Qm:0czraۂJݻ4H﷿pkφ꓃y,L7 Y oWwKEa3-Т Yl@iNhb- ^$܆+-YuЊ3H堳d HBZ= NcIœӤNpͻu"7A9!aH*SG%FdI[eւxGfmʀ r)O=r$%XUA2%Ygع+26!a3I"d%{!tlrvdd)>A>$_e0&y;/9B.HVcA<;Q#ԪG#y"hZZ-^psFQ?wыP . twd2|_l #=vp_⿂7ڗ-׽c9¬?PK"\>PKK>+OSGI-OPT/src/java/awt/event/PaintEvent.javaOo@S<#=`Q9UP6Ypfw7ݙMЖ v޼zkLfe>f'P9axE'2Ni0'CzGEB hUAvCJZ40tAcg[lh 4Xˊ@795R!MI9ӻ8\ NhkXa{õy?u]qXrTk"LlhJ SbŬPkRl;-TeSm'49B媵Oȥ?pۄ ΐd|$ U<[.pqHfsLfYHf)#N%IF SvOu}dZ\*[QzGZqEhHoqc5 X8JnG]nq8b'Bِvky%'h.ĖTa Zу{yq.ohշd"'./wycYǂ: Q2qnaZ?;U]6䖆>jVN>jY*OSGI-OPT/src/java/awt/event/TextEvent.javaAs0WPLrK==P$L=xƐ9edJ0d߻i4 o'N0bX0Ϯ$BY(pX8 vp&3Y2BVa7΂C'GY[-ZC! ֲ"SAT(mӣun}zGޣ^Zr ֯><kOqu8.QkƳdYU1'^!*ĒY+ѡ&>R>LlVX-}/Fc (C %ʒw&wI~=q-Q'qyz<%_qd܇&`L<"27d*Z<*[QzGZDhHoqjpl*Vֻ\qߝѣ؉@t6);v9dcGw׬\py-LY8?&~^GU|woe̗TX gڪ&xy?PK&IlPKK>-OSGI-OPT/src/java/awt/event/TextListener.javaeQo0ǟǧ8)2نV}tۈM;65*& J Սy,F- Y oWOK"װvhXETXB'K4X)'4ps0Bŝ8 R9,YESI(QOhf3xx4 N\TM&k_hPġ2u^rmM֛4|dQh-ݑg q`V ǜԃ!G^UA/Su2#6mfqI>8OyN߳=<ǻ]MY,WK@I?c#^!Td5TQɺ5Bz4'H?e˴t$'xn.( )zأtw#[Ty'ePܼR9jÍ/|$ c9nzѱzaV_PKb> PKK>.OSGI-OPT/src/java/awt/event/WindowAdapter.javaQo0ǟOq ,m}ʀvP]G9`{U;t*&C*+*7:,;qU &9z2?"? +B""ojYE5#!|CcpM`>4xa "y Q!G@Hj{VmNIPc$giy+z:?mF#)AkNjd:O{eւ0TqX+ւ2JsSF8!ڸ6ΈvGM{e mL 9Β,&~ jdre:K2-#|MYH-uI_a .BxQ$T,kV"A#"hvmXxJc.8?wְ. tST9xňABq2HnH[kޡD#?j9xs G /;(QС܉,IIgqaZ){a:m3d0Cs]b,=#ba$Н閮/PKeg2PKK>,OSGI-OPT/src/java/awt/event/WindowEvent.javaœ]o0ǯ8 *(>: B %IzUނ)w2 Ҵ\~96@?֒Q$tN[@ML(Q\alQ r@3ѫZi JS] #WKfDl "Ր+ `0D2 >U!*#jFrFfB`.هv( V*dUwyMԕZ$HsIO2ؔXV@*%ҚN u!bt$+-4{MH mL@ ܠeB&nx_0c ]' }{5ۻϮ7hRhϤ0i!@C$ag<4OSGI-OPT/src/java/awt/event/WindowFocusListener.javaRn0 =_Aig,p8]Уb7G$n0G^`A"#n`Put0g &!sbi< 3l}-Z4-!3x5(- #BE4pS0Cٝ8N R9h,2Y(Fu}+Ctͷ2E9% E8T!FdJGV=dւ pYU.(21ΐ#Yu ):C]O#~ 8$8K''o6Nw*>%o=Ilm|,!CPA՘SI9&FTjH4Y?V OSӉpӻ|(_hE(:b9lCS d7vvY8ÕGZE/>`3L˅yV%r_kPKȒ|MPKK>/OSGI-OPT/src/java/awt/event/WindowListener.javaA0ͯqM=@ۨH-ڣI&a`,w Kbٞͳ`Pup0'f &!sln ? 2l| Z4-!;x(- BEð3oh,) ƾ`4l&8H報dsHBz@sOO;ge!7@9! EO*SEFd\g˷L=eւ x*{fEʀ S3HVSt0m оqWa/ 86!agd#gI6&d%}.l6Yfn`6I< &#sYc|!^!d5TRέɪBZ4;H_et$'\O_(8hE(:b=sCS Bu+NeOcaϺQ.MeqKfR7IĉR@q#)WF]9oPK)ZPKK>4OSGI-OPT/src/java/awt/event/WindowStateListener.javaeQo0ǟǧ8)2نE}tۈM;V5*Xw; J Սy,F- Y oWOKEa3-Т Yl@iNh5/Sd ?XRn}l w^:83H堳d HBNzB5cIœӤNpͻm"7A_E0b$kmޤ#SOUEk O|1OSGI-OPT/src/java/awt/font/FontRenderContext.javaTr0=_ 2Ԑڜ\40I39bm Id&ÿg %Ms(@o{kDp#mV ]ރIU@"`#tφ>^0 HSthW8!*5G ~飽Nhgi:@,P9$9BKJ_l,A ܷ: } 0ߊ޾ޛσA]1*-M:gIuu$:U’| ̐*r*Y +-ҝAumӅ@3[W d}@1$4$K~ Kgד%i2L0/Y: =|K}@ࣱ!f!H(t#b%BWh9v)\X#@#Rx淥#_a (矁聭XjZT9\2RwE)}GOcG9 6@V^IQ3˔#KX1;7x?ФP>}|_ZK6sNҿ\cǤDE_Y9lvtGJ"^ DJ_Yr.D[,4;[/1 s[IMxgL^D3PK_ePKK>6OSGI-OPT/src/java/awt/font/GlyphJustificationInfo.javaTMs0<׿ 'PCH\BdlLNFIa2}`}O,86%K B{w_;)o |\Ӆ Fd"]@T^Rp2 TLp}h@k{ F"BC(j01K)лfHegbVC !]\[ou+&c[ȤVX՛ߣ-뒧T)6g H^SR@IL 㺐L3tAXDR#`JK1G^A׈\rW;0a4Nݹ;p] G}]&M8[҆XTTF#$' D2*WLkUhpadRb$iԳ,K&cLjwI QJYɖrR局{]Lgwg;z?8>| s'o{3oؓ`&|\8#8>dB7pB%d891I3N%rJc=5QOơA^H& 옻}9WZFʋMwYR2~󘶾_ H|Pz5snV^]!k/6$ jX?ַ+~w?Gՠ {Ima>_:PKx$PKK>,OSGI-OPT/src/java/awt/font/GlyphMetrics.javaMs0Wp 52=&YBr%w6kjpU5i&_dv:-^CH+{DUUylS:o-k`0 {rN 44,gk`Jٌ Vrfs]in[`Tf+̹J{ڳGj}ؘCסAr" %0`$$I0 3=| a ":Ph.!F<%S`3Rk2/YjIAzɍ!s'#[f7jj'*eJ^(g#\2`J Rڻĸ:) "| Oo'(L8+?Fĝ~4$s^(No ,^Q-SKuڕU6uRJ?߻K?Jm5r|veík:Yd| ~= ;V\E9.7T.g@-gm}6c|$J{"?9#OcJoD| j_PK;gPKK>+OSGI-OPT/src/java/awt/font/GlyphVector.javaVێF}_Q'X3Ci/v 3EjLtҸ6߷cdahۧN:uPPP:LC-Ay` Y"e,s` N-b0$bp q0 K2` jCGwXl +$W.x%׳d(הCN4#8<NE'3?*riD%#"6XU͞TUρ@ o1XH\6!-AF陖F2~Ehh\ObgV#m,;ہsl Q_fJ@>ge f<Z!'d# 5\ `$Q :Ջs (IdՅ 01{᧔Fձ~wi5~>֮Tʹ5s$7oa.ۢqܢ2d{~QE_l{&U|)10Š[xmpFv6ݍ?s AlYB|*{)XxfN|j~:4cHy%|Xv8tOi PK[:= PKK>0OSGI-OPT/src/java/awt/font/GraphicAttribute.java}Sr0=d:n-Ӄ(qK4SFkH$0{WƥLX{O|kY/ta%g"Ep&Y5-f.1X%OQh̠*0kb)t!D0qX@+SK5l4Pk$!%>XR:i 7vNbC!WQCEO1D1Ѩi]QҿTw]wDA៚+rHUVd HPH5#FqE1-s0&(Ih4cW^CKr'7]^yAc#a@O_ ̆JY$81≄\% S󔬉fB!9 Նk{fniFb[ƸfګlEYj -\(Vy. x}9mǥ0IGo/yL&/`N3/X~< o<>N[!JL=[x8JAXB8dv!/%kY.Oӷlj˶sX=^BlP Shj%7i @q#VDN+IkE]GvEjm즷\7&H5ж)@ԒSj(&4fM}PK#EPKK>5OSGI-OPT/src/java/awt/font/ImageGraphicAttribute.javaAo@q2kzj9@SH4qf[qP,"U*X{|2ƪiQ-Y靀ʌFmװpJ 2Lp{4C#s`qt;|'m0 #m#ة6,4! "j BB6ugv}Qxje5?B@ۙ>|֟mC<8.Qkx:KuW +24jW;]eb4`r[-eFEM cX5"?ysdžzq Iڃq<&˯%<ƋE<[& gdg|Kf#>\k7.)BJtaPGKL"d`IP-iAMz#;VsFXWr9t[JڑW7+\bY1ٰNcYl '?Ja=<[xVr_p 'Ĺ?qVJUwo+VƿLz l%\G3UI6η蟉0*k _O {oPKn?PKK>*OSGI-OPT/src/java/awt/font/LayoutPath.java}As0x 2!ڜ\`LYZ#d߻&I9۷߮4p6+G`HZ U2? 2(iC0%)Gk4jM~KH(II0NFAKWJ{4C:ldMT(thc%Ѕ,\`y)|۶Mđ8Ѷ'^g<}dV,i剋aRZBT8unRU1VX 6k鼕E_-홑G) ^#{Yl}q]\U6˱XbOU+=~di qz06L2tȉ^!l *F<Q*'x";µ:\Zz3Wh4"`KE"ZlWi ^#Dңc^ ~Fu?F:Ϳ`G<9W\ðboTV%x5]嘟Fϵ&Y_wsEPKqPKK>1OSGI-OPT/src/java/awt/font/LineBreakMeasurer.javan@S8A'C* F9.lcv15NjEJ afFfރ0bC0LGH>KR " O~NiaL,fP !D?]ćh NN0BYu [ j!-D+ ۪Ck$m:#CI\pBOy_:!>M%)Akdzxz1O.>0uuJ {Sbͬh@Avԍ$U95 ɤ%#5 푑[ xlB J Np%q;xeqh"ys~h~_#:xWcJ7!AxoPK8kAiPKK>+OSGI-OPT/src/java/awt/font/LineMetrics.javaSr0=_ 2Ԥ599@OL"ֶ#a2dҤH{O,3jgd^8LӏA]myY2ZI&RZȀ+ JR+ϡ]ya;PAm9LT9 ^WFb?eJK Gnx]+zUA4!򀵃I<'-n$kЏZvVJ؀6!9U7F:>X ye힄K#[?pl8{x~3]6͢dS`8MF<&Qrdxm+L<"DO$d V$d&[Sy9A7d;ZZ.OSGI-OPT/src/java/awt/font/MultipleMaster.javaRn@=dG76'j;-j%pEUcw$aQF*gLaLf*^&A<8@lϡ},S8;O :I2 9&KRHKҵ0Z 8J¢=z}٠PzMf1K@E[YT@G{qbGKE~ ;c1sE<\7_̨@kÝaAƗ(? tB+ξnZ~PKԍPKK>-OSGI-OPT/src/java/awt/font/NumericShaper.javaUa6\~h?+B`[M!ݐp'TU'pv`Nor[h%Z p7o8U`RV/o %sNAױAiI&,A2o`I. Pl#'Zy拧 M< DGlF67&F 4'>YwgL`^3v#s5YߌMa-*!sׁMK\1]#;0%̈Ⱦ3ynr<I-u_ SeϪq9TؗۡEE1 14I"lOLvOW2gؔKi5%;ݰ/yRw- Ff/Fo b] +̷`%nD*Ka]n,tֹؚV.l믝WPK ^RPKK>(OSGI-OPT/src/java/awt/font/OpenType.javamoF_O1ʫD^z׍CF]TU! qKlmѪ߽rzDJyMC> ͎y},|}~0(Yk8gav;5,+.tzh22:)C͢5iGp"N`=+:L= UjEHsƱ2T򸌓mtS\Wfվ|Ft5a8sgp[4 >˥;'^|8 'd>Ɛ:kW̸ gE~#a6LMFג>jئ:O#tUZ POqU-t0T~^t({4)/;~aĈ:Dc?Ix4IZ&!tǿy?i[ca.^\&x WRrӢB?hxI 'P|0LaSQ-)[*s ڼpT8pJLHE .- a0mʱ{Wھi. )t3ePo<g4lxiJ%ky&Y=Y#-Ƴ9ӦWaq(=c7GZ[$wx5L|Qc_6c&U4m΅`T~U=LX 甿Y/l>&3O<֛E -oKUJx[Ҡ13n;Rdx4lC2Let_acv-*l݆w0ڿ0Up$\׿4(=٨?slpw6 '޴#˰c w0Y})܊RI! _\ }?`na3 rX |BII?];ciXzX?dy.7^*FҽxG`/00u4׶.`z~aa)m+D~u,/V#⟣ܸ ƻ>/O9w .jA[ qߝ?PKX/T` PKK>5OSGI-OPT/src/java/awt/font/ShapeGraphicAttribute.javaAs0d2ԸZH 34bZ#d߳CaB;o>n`ڂva RL A~?wNi`A 2)IC2# vMUF(  :T;ta;Bm@.JzN $jSa:-9VYQ~.7Mqt/Zӟƣ,|dY1w-4wV*{- Mx>-D'gGuҮ)\]BLEEʭɢƂP[Ғ;F fSh =s@?q66ȕCW#cƊ4VkF̓;$3s>x'{>\ J8x:cihoi\',>^u\a:1#G. c^*Ak e#x=qrebupdk-|ΐR(ۺ_?A_>cPK MVPKK>-OSGI-OPT/src/java/awt/font/TextAttribute.java]s6˯8BwL/cS,x#[Ǧo!y#Y(?tH.0#M?rnO#KxɋW>!AB$YgfXT |E|µpUIW;xW!Jyro1_ H2eemM"cȟ x5&*ӛg!zcǽXزoS8>]WYa򲄂J w`Kt'5EQt.d(XK,)E<ҴGlW00|HȔ#7 `jxz`E:xuԱnc˰[f"۹E9W,rdxkb+/2#X%)崖hp&1i&6o [<]gz6g,8e1oUй٬  ^P|1 v~Rإ4{ja> =7t *M[ 4hDbYS^䑉mdLVX)soXoZHWq+/p9CPMIDcOpd$'MTr?@{jr?UR?T@n4gBMCn"oD=*-:u@挟=Q[_%]}&%-xIS|'%G~88.7V[$2]k-bBGө:ϲ ]Q"u}rZcs*h648Vۘ㘲idX5Y+u =㱱u ./n[*Qj?B:uJm'v \:am-Н>Xj&_p#9oz/頣5%~DϏM%1h8>en-GmUhׯ~Cq%}ZAثLwTwPځqrwB;왥PN'TYDcOU)Pfe\ʊ. \-yq}2av oοPK4'qcPKK>+OSGI-OPT/src/java/awt/font/TextHitInfo.javaAs0Wp2jڜ({m ɕ3m`ӧo%%=NUk(<`BDѻ! ðJ TB[T@c rkqu_We<(ݧ* XƓ0RiT3(ԝVNG NcQ&V 3}IҶmDZuUZܦ,ݬ;{pQN*^kqJjl:ʑ|c\N2-EGS(N~oR@bCqiև,͆r.owK/2f0_d>N|&o`<{/z$:]@l籋=Pڣ%_SJKij"얜&Q>Ջ"`(F> UWX($ cqi _f%1J j5%FqjJ ?{o: OǧR,ܼ,=q h?i8 HҠ+k5Id?8֪'ktNģS م_V?oH2eJ_&@gD-a!jZTɫG<;TUS[d:ݭ ! 9 839, r $p5'FlCA%6x:Kc PK%>~qPKK>*OSGI-OPT/src/java/awt/font/TextLayout.javaWmo6 |D?Im붃lYR$i0vtS,O}8N涹+ֶȇ)+2Z( TS?sp,Y ϧ =+G!X60883Fp#ѿl4!; ZlB,d P5ss#<ONڌqb'CL1ÐCHBDo~QH'?cc_l氄#UP[N'bi݇\XylH\Tfe=S01fĵQ|-9E  CnկY/m~_^ Z}\nn<ŸU BFvp)6.Bq/SJ:B# fB B"Tj"80Oa&5TT(Zol63/CsQ!bU~V,sO_e\|!rg(@j@[~'ŧ*rGSċN.u}ÅA+y4 e}QY.RRU&:3{:+8=GQ8ܣ^p!nN4xP<>hBr?!Ϫ3f׹,eWlRź\SYV 6GY{c-MS;F*w"lD])ye@s!]A=-WH&gfGzoz> ¢#W{1ulfo?b/VBr;,OSGI-OPT/src/java/awt/font/TextMeasurer.javaOO@唠 ZN&@k&R8N챳캻83T%}7oI'01ΪbO0K)RN gea{99Bq&7*%(ZgdWQܺ!"pn78;Sw CH<\MbPR:F]s$py%Q *yANJ:5MbK[ʽ֍n4,]խ.9VV:^+Jq)%6`,`aIx*V397hdʱU˚B{ejE I.$N.^|..ϣ"J`6lz/Tޮ!Ïxz9dVw ǹEHrGr*W lj*k:̼M֊ۡ}FA 9?z` |TRb=XBZ0.h? ]miOKk(FSSs8R0@'+2XNdtv<< 2'DN kYÔ3[>Ȑ S -qm5, pcTQQ7Ǽ4PG wwu8XoP~wwmz/U.,c,Yn,>˱A= PKR}GkPKK>2OSGI-OPT/src/java/awt/font/TransformAttribute.java}A0ͯq to-!F]D]q4auvȲ+{!@T!7oy.;`9gX&")I ??B +Bfېe,nV[4vQ%2t'CƒVp7xPAm=BN3LU֐۵}:OCo`Wg\i4j&-qM1'="gQI ě2aV)DaϜԍ!GչkAo% mjw#~)؄^@KЛ/OSGI-OPT/src/java/awt/geom/AffineTransform.javaWms6\~N>jIo 99Ltn-@W#$9we&K.3I,gݕVM@K &S U{v0= fqV۩e^  2.(WԇTRCdTLphZ I2urzi("Y"E)}hq,L͙~1 B@ :L"bKI=XbU:=3Nny@IELbģUydZ2!L$9-dI 9LiF%I#`=?lqk3;``NDžZ^:׮ŔJd&*KiNX,%zl< O"20TrB*gL*͘&:~".^`5D_=\[*f0a cPP,Jg͘\* &[jӸ+?%HFPF50|:7;,:e&ht۲(etk4:oY9~xFv?dhj-"( 6+1"8n"m1IEeha/"Jlyp4";8D's3|y<9'ku?e}-;2:xZ a=)߲]n{"RFJ1W+F=g"4ƵQ|JNIHg)SElh6ΝaInMm#ˉf:q>]+ mMhX _kfLNk>FDZ/Ojw[9a)s+>3۫bq~\J#hp==Sm{`aK0D)CU6=J 8p? KJcN^(l mIB!gO}$FBpL9>a^d+7&/_D1Ƿ\?urg \ڮtBЋ}v8W9*wѮp\r vjNReۈ-BýPKCUиlt׻n׉vH_~~)K2ΚoO&փ'[p;9 c?PK"=ْPKK>%OSGI-OPT/src/java/awt/geom/Arc2D.javaWQs6~.b'OpC\gZH d04^@=c llupyHv_ /n oY"Tۭeϵ1 LP\נ&GbЃ(P^"tCҟI~GhA.G !RH19P0zI&3!)guKl,frj~#g#N>>*϶BbqHϴ07k,\oDJK>^^9mpu`\M:ua8Cw2鎦Á ƣp:hw #|u@*PMnʙt= sPR!|]:Za!(:(W\*"0>_qtlʜ$jV*T&Пll N%fTF`3:8s5>#]DZc}]mXL:K"T[@lmsio\ۛuڬ~:7EN#s[#4Ց)~kQٞiu$h5Zz8k%Η?Qx7GPom Sz@Sܘ7[qA{ׂ{ee0EQ%fC'|נ[_0$h̖Ĝ|?P~SbO|cړǤȻn[+k}mˉN$SS|yW1x҇_SFihĮYfY#A]7^/ R'M=g%`;'霿M)unC,;ss2#ԗ;^Pyx ^5Jc"VT@їIe;Is<QTwyvk췒;tJNd5#K\-uab{,9rNI)YߑJf<|g?vuټ}ľЌ/}TSmsY? V9IJPKm<PKK>$OSGI-OPT/src/java/awt/geom/Area.javaUr0=j=99@[O3e{mʒ+&8ҒqҖ޾}z'-8*6gK _d=ǮahP0\JD _Ӄ W:Ю3GQ%lRY( 7rw1XE-mS8%pSs23J((Jl--->cbO/XӿFi8yO+)Nm*fil J4ҞUNZseRfM<*iIh!a0{:X|]-ڟ"0h6`63L=@] H&wvn!⁄Tm%c&eZt"(Pܸ8sn~;+o薭PgF#uFV%M.YATN7Jbe}];]8\;Ӄg $*=;$cblI=Jk K!2"27 $tw= o"WzqΎ7/rN`?4#ŅfЬ6x LS.0 mYMDi gS@;K C{f鸟9%f>1g?sZ_PK1q PKK>,OSGI-OPT/src/java/awt/geom/CubicCurve2D.javaWsF~Ŏ  ~"id L'iKŝrwӌI@n|{ORu^C+A3 _(t v 3lhJD I !a! P3nL/?io($ \ F$?:92+qDA%Lhw (<%UOb"q}E:&"͔n˥C҈.(ӕAG[}bJ &TXG_%pd*P)n^ (6AZ&R 'Pu:u[A08zNm{M-|Fmƃzu?htcx\7uɴ@IM9.Xa³d@Ʀ "LAbNi&sJv2Z_ Y,3E>jĉ׉@Af/iKmsӀqL_7#_lbtzgv[U*MLAy?W Y(a8(w<D﵃0 :WnBU_][Yˊpzvs&<[pm.l΋at?#ӈ)\'^! T`(*2Yt=?v͓֭ʕ/8j;N=By| 2\ksp]diRsNA}9Y8QOUsmt{U.-,+`PTg٬;ڵZ_Z7^酙T3 `F+=o5ئ +حO_L[`is `kAV˜H@s| 7޾Ʀ}PˍU{VqKmvyo!HCwQL|Nz_b|C3N7h{tvA*6f1l5+D/~k[DѝL([Ap1&R?U\I4ŇzC_5(I?yxZ}͗:LdbD*ܚHjf c%Vܦ3]+;UHY o >} !ATX5wsp^<\fPK)KPKK>+OSGI-OPT/src/java/awt/geom/Dimension2D.java}Sr0<_ 2nmN. `L0JJ2y2nN}IU+Luu0:7,P?A藱HY2{CV"w2#e)Gr2p[BT??X&}u[8;q%֐Y9A*dzWumN;cS'.Pq9Btl>FMӄujS֎|?uJ~bWHk)hQ=H'U1C^&"?ys&zQ8KЋ<j-\?۔>)"!'KLndƣ{2'BEf'?Vs/SʝtµKs酞^qaAzwTu1B<R͙1&/q7zKԊ_ю2? Sw2}K(C6 .or]N[B/@2wbZa/xx.)OSGI-OPT/src/java/awt/geom/Ellipse2D.javaUr0=ɉt!Di<@9ڨ%W14ÿwe;I&dz*OO>Fwxg2(/ t#y93 tqc0H sԨV:`I.yBcQY"2OPi. t-~uxtb)62m@HF" :4,sjnjFpF2ZEM 0S.?KcO~Q+;R{6zu%ʹ"XFք X!3Ҫ.7\=22ShiB~nvv76&ps%v\tN6OSGI-OPT/src/java/awt/geom/FlatteningPathIterator.javan@)F99qޠ'`Q%N*acͮlj;wE01zIC%$JI jOI0 ,:z,Qu#uк}:淯z ?ZiDTX0 gdFZĢFvmB S}O) 5Dl] ;4'/. ; W/vZX2Cؗ{/H0ݹJAj$_KKq2 K3L~~9$V?J]rV_ cY%c4nyw.~PKg6IPKK>+OSGI-OPT/src/java/awt/geom/GeneralPath.javaAo@x5[ $AI3mͮAQ{f@`{w޼ffp cS*ݼyv"3ytXcu,^Q5[-#(O[(6rب9WJ#7Ek.OYy9IB%͹[84Mӑ86'ܧ,6A,WP%T9Ƃ &P7Vy>,rުU/QZ?HdH>%Yc<X1Y,2f/0&2td/lȤ?W6t *EdsBrjriM5j۝raNT;+DG0N{qfwUJ(;T"/IX+ɲٳ^ˬ8F4kM= )';I?Ŀٲ-U|nEoPKE,pPKK>9OSGI-OPT/src/java/awt/geom/IllegalPathStateException.javaQo0ǯ8SR1نV U}tx&${0-4iK$M#* ]~E~WZd쩊ɒ I'J'!R+\GsL`2Mf7{zK!-!СA*FAݩI8z,\j{)p#9}a"q"欵]Xf-SU!kaW/ '!:*ņY1@9#TunM%3rӻWC/<60I "-Bo򐮿xH<*bݦt_6ȸ:0<" W[}Fr+K^ԄZ(NL+Vˀid+prFqzb/"1&]1lӥMCh +؏@tp*{PQ+' Sf4t'&OSGI-OPT/src/java/awt/geom/Line2D.javaWMsF=/'{P*Ă7-8FFh3#0⿧GX@Ȁ/գׯ|+Bí{C7,pnfU202 FPpfy. g3/}S?Q*.&]@lDK@hW0>>jb\/<)aCL5#wF!Y#0Z6b1cKH'u9Q)5*neS5 ̓H0גkxuPbLq%F:'ڎ#u X7 |8}n@߇:qށA?d}`: IFy)ɍ,0 %ܥ/b'V(BK̴*"830>_rtVUa.Uzڗ^R9󪯮ڶVPKA.0EPKK>?OSGI-OPT/src/java/awt/geom/NoninvertibleTransformException.javaAs0WθDe34 k$UƞL{W6$C9Hz'WXjs{LWmPazX|gq&t:lȑ=PB)G5zUR#*9~uR+\ LCd,Mf7A{t=zG!v%б"!*ݙm~3<z >`x{G|Jabq&m뒻lʋ{Oݫ߽x{0LU-b%y+TN ,Z:ooB_7plBaȊ >EṼCV~[ߗxH74/Uu~:#gđ:0 q^n 9CɊ  20("W)"Md-LjLksXK+cnuoDGOvԞwT/ ]gDQPK[F3"PKK>&OSGI-OPT/src/java/awt/geom/Path2D.javaXK7>_ѵ'vCB'T\-%f#]Ӛ`fxeI.î_4[+Uln`Iܨ+@e:IC4W J>G v G |@mШ֡nۦxR!,He!4H a`K"HGv>&jb3Rh6M  gnmKZ,b\UzV뵻QGbhCē'`؄ 4ҞUJsFMit0>7VIh3N[smLMk izyCk8lǽCh޸7-^S$hwɝ;(1CabJ&@OGGfjZ҉ @ƅAhi\PT"?>%P- M̳ F4dvDTqo62+;vնP8|+K:*DeQ&KZ`5g]Cc-|g[’ $yAHVvٚNıfPvI X*&OճLH9Ei0Qt)V4PK}ňR/ܧ'Uz:=C"JRZоQѦ9"=/LDXܓF uЭŊC_bH>~!*+/V^ǫE%-X/^gw4ʓf|7RW{*; 'Q<Vy^*] 8I+t-}Ӂ_<"${+/ҍ(G>.9}K :#,XdmS}9)Ҕ ˡg[$b{Vzju_Ǝ<|,/d./LB 42HGE}*qν\@;Ԛ^!:U>w>}CyՋ3Qrו{[p!R=9c+WZ寭\A{{G&ʙ/g=S| z=p< K\;b㔅B&uW+=JPK) iRPKK>,OSGI-OPT/src/java/awt/geom/PathIterator.javaߏ@ǟ寘T;}œXA?rlatw;KN2wf]9pSY/v䎃W3_ޯMClI 1jT\R"sИA-2T`v^Rt'CX\ qз@; &V$kسiH\CK 6.""_\ AC: ৥7kk_&.l~Z)&bO~&>~ ƃ3y))Ьhq]bߦRH"3)Ω<rPK[WBCWPKK>'OSGI-OPT/src/java/awt/geom/Point2D.javaTr0=_ 2zj9fISFr$C3{%IL L'r}Jsa$ҝdJCv`|e% #"Ek0 fPn0r f2BRBOӅ(n6Um:C А)4L%j`XUѧBL`QaPNLAjVz"].>+Ͻ^.)BƽUkt9 .?U OP)x1i; aEIh&$!͞u.f<K&bJKfGFz=F8_֛֟ͼܿ `:t2tbVWMݟ2 Mf,O KQRR)RdHqFbXlPrRk*C00 [3Mt:eݑ qIzYhlj 14`\p5r3}E09mOb4Hvt_f P2?؏QvPٵ݁Q*ezU@Iԙwy"P-s?mU"~?G\2Rhydg-K O;/_k_}*ol/4ژ;Q'ϳ$)j}J8oE/dž/OOv6`^Oσ6/N}ğj%읽PKsNWPKK>+OSGI-OPT/src/java/awt/geom/QuadCurve2D.javaWQs6~>~NjIx i@s0>[FI2we"c8J/Z~jw4-tEl6p_A' >KlrFFS**4p|d>Js '۩T*&8N.Euq6k LYH>48beVL?a CL4Au"N~ZGj各#߽x?!R טIx!+LkHV $aL3>S")-$ֹm8bpx.C{u|FCփApu~zu2C"i"@̤3=E(QϦ,&3 3cDQ`B قiQ!.Qa6@_Ȓ8dv-'F   ctc,6 ʱޜDX^Pt49o72 'IRV@Y81xT26Ak>KU"suK#o qf$YE^^؋w]7#MfTX%$ձ0ls½`\]Lڽk˔mݦ Vro˽{d#xtT8ޏ,3qy.ֻP}f&"]NDnA.j4 Х4UOnY߮}m}X?G{V{;:c٦@ Uo-ccr'_hR+3!%PU&˜Pѓ@]j{Zn^ƾlo_pGhSuƶ]H4LJnioswЉ+-]"K{pQRO{/vR5}M%ѵ;MיNpV-vojU6m}!qa30T*:5c-m8x&nWTsJr#ٯM,4q29b6PF'`ώ1t|s4UOd~ygp`=A1n77ۍ%\ PKes3PKK>+OSGI-OPT/src/java/awt/geom/Rectangle2D.javaVMsF=/'E&9dCmV&3L# #!u>`M͛=GXp%ⓩzp3nq&zպh~:wlaC,Ph !!*0Sni4N p:;XL`Ɩ D#qp c!s. 8fX%sȑag4!ѸfrԘfsX8,UH5iFV7ܫ^@Y"BA Wh ,&Uֈ-@*`Hzb-fZk(15RE 8zzgp\aI]vcw8}`W뻃>nuJFsl$rfbIXftRM&rJPFqmUD| 3i]YQD9s8N-NFTF`#JikIAD'G$Sޔ_jr.m9ӵLFز A\:*"_Ŀ^ 8hS/xhs5,2s+ sZ .vq6̠+ 5+iVVh%@$Qԁۅ/ QEʅWiO:7+먾Ql{u5ot*ZRxrBWWPKk9TPKK>0OSGI-OPT/src/java/awt/geom/RectangularShape.javaTMs0=_t!͉ilixo93=fp$""i(BƤN :9F4'i## u8Xǎb pRY( 100)E["kisae5S7kZd8rAѤ kgjm՚=Všֹ'V)~B0gU59( hUN\ +d&vM,",iy*mC N:4ɕ?>^3ucpဣS n?52CwvL\"D[&j%x4$jFZD΄qjX`hR \QVc9[s%Z^l#`ȃcd!JѸU뜢S)22\NMDkr,O %0d`RyJ&[h HcXn*BRB휩o ](!Qf @֝TM$dO5Ip׎wov_O5f;c3rPz~ݞSv)侜B SC˗ L&BX4|3r 98|W"Ӫ/`Xm0|YM g](hD aٶUmor9G\˳X+Tj.ۿ Wru=^jPKнyl PKK>0OSGI-OPT/src/java/awt/geom/RoundRectangle2D.javaVs8>śH5fܐvfs֖\Iơ}b$۝OޯA+oOVz9̂w4Lpxܵ0H sԨ`I> BrOs҇?Pi.!,9:;[, c@8xbn e7JnV*C. #8 9Yq4ʘ,KU]AZcu= !ͭ"EAׂ+x-IkJ XΌK IMZk0{I{H6& Aߒ soj6 6%|> }l$tUqOB,kI:ǐR(}1qwGIN'){s8{'fVA =wFC8 Mo kTPt^F7r< #xH:PKHՅH PKIG@OSGI-OPT/src/java/awt/im/PKPKK>*OSGI-OPT/src/java/awt/im/InputContext.java}Rr0=d2ZN.)`LӃ,/F\id]8! [o9EUATJh_g:XC,dOr$jT:C AJ!FSFy8'P0{SVA!s(kU Ē@if[jENMaR.PiMAFC(G!׍.l޳u t,=UIB`,"xյUt>gT &SJ+zfQ#M`ۄ~@sГ\ǫo\Ge4_ųK.*^ |C@]i},Sy;S񙄵9Hr%JV[y%rjJ[X 2OSGI-OPT/src/java/awt/im/InputMethodHighlight.java]o0ǯ8 ,jchF ]*N7cgCC_[F"$<^B+m(>LZt~c;1 LFQN(DH#H=A;ScZqb>ojQ%`\pI#O{\<7#-2A8}Woqtt<_X]]K 7/ٴ4}Ջ NIԯId*OxXk@DLw"6̼:x oViOX6LI'xe[5ޗnʻ;eS6а4RK~yVRݍz4_(VMS2PKRPKK>1OSGI-OPT/src/java/awt/im/InputMethodRequests.javaAo@Wrrޠ'jdTٌgDάB "%3ov=> >XU2{ *%D'#ߗ?W:Hѡ&b/2W 4zDk!ү#Zh/Kᅗ84YC9U{5 ͶZEe7W$pk5 .P]~ZzSկm#GXd:[dLw] ef*)ZQX52.FLNe6ʑUvO 86agdxgI6"7jy8M*eLa\\&d7/n]rd<S8=\RJ5]4@(fGP*1TjHP/?hW/ED$Z"5y\'n=Ri6)YD(Brc_AL.!悸mje+ {g ;3>Ȏ:'s5. O߉e;yn4EJqun|HqRRȰBR)䗌;=ngSȏ PKILPKK>)OSGI-OPT/src/java/awt/im/InputSubset.javaTMs0=_ 2ԤL*tS&dFv%we =Q0vžE.`{-Ӎ^܇yx-e*F]]^~}{. &!8_ƨ &P5 +DL?MdQ+.M9}^VAJ! eO18JMӠ8%`++(]PAAu;mDןŧᰪ*OԊ\k>OpT7U*Cc@RjxQXHk&*5T#lTWZZ|m+$X-W=ګFj@c ,v y8p K#Xł0_xLxfdH##|*dJ7+Bx$a$c1RiC#(PoqjH``2V/G4thοO'NQhJdgrU6,W-sqRFh[^ywbgq¯y^ OBTe#x9gPG%as"v8 O#\0r[`\siŧ!3><~:"Z3$vDNXl[TeJZ^ʅH*ץ}P R1els@.Cek&'SLg EYhzkW9t:PK5jPKIG@OSGI-OPT/src/java/awt/im/spi/PKPKK>-OSGI-OPT/src/java/awt/im/spi/InputMethod.javamSMo@=_1D"jڜ\B[)HEUk{'5U>D9y7aj`W?eIJۛwcW/#,ѡa'y j.Jw#6 SM [mjA6T"KiHͶ5E;gJ0 ++9P{`>L&MUO&t6goEuQX]T%RR5`,ܢxՍ%& 7ʢȱ^5SĦ4 x8Ǟd,Wpf1,0]U'O5ߏ%2/D&8-Bx&ac:I”65*GGPݒku"04%m _~d0ygSj8m*Tu"AJfvdˑj\ eRbɽ*j1%JV;eo}rⴘP05\%ظvTq],gLrlM Lrw$/(54-'w2sʎ~*ܝޖ"B*2̜hNJ[e4OSGI-OPT/src/java/awt/im/spi/InputMethodContext.javaRMo@=׿bSZ'-\'P)Nzc{]vq"gqKJm|}L86{+`" !n)T0NCȇa+,ѡb19*@ T#F2!|AVpMa FCjtz!؃CƐJ .GC zcjg@Lak\.<.A̻ɤH#mIsud6O+f=tݩ[iYz0\k#:Des=J :aґ떞ȑmB( F>Β, fqxU2`"JV"5|Jҫ-{pgW40EQ(3R,MU*EXX,7OSGI-OPT/src/java/awt/im/spi/InputMethodDescriptor.javamRM0=7b V4{k9 m U0mbCUTb?rH7*+d2OSGI-OPT/src/java/awt/image/AffineTransformOp.javao0ǟ_q &({:O -ؙ@Q}$c MC sw]L7  $tZ@} F¹C V䖇(4!sT`nB|Au:аToFfd@4'bj 2-,<%RC #wF)]G` czvXNHWohuu/ȸg`)QlF [Tbd3R7\-22k̹62״_T xAn-+Mo&Sxp}OQЛz1>;~OxQ|J0mg1E"Y CJqbXP RTKX5έL—0:&jjV[1×lF}0aF8ULhBYNҜ(ۏtY! óIڪ} *x*8K@[Ԑd`x7tx;zGOsoL]'6wA-~rTb (Όf{m$8z2ڦC&4NU L,l1L YOHf,~0UKs"[1бuD/j>p9UQJIv =@\Ɛb>ΊC%;<ߎ璩MERT&96ݤ؉㺓$S0Wmm)ƅ$]z~PKϲ?NPKK>9OSGI-OPT/src/java/awt/image/AreaAveragingScaleFilter.javauQo0ǯ8SR1H剥V U}tx#6MhT0)4*=Y D4R0ϯC,Ƚ"'KHU^,UTEnOHZQg< 񃌕Z&ch2[xp'(Ybi KjBK.O:r-vB7B޹s}8ҦrL=V=ߝ4x{h[fmDm jC|洧tR!޹^6m #G؄$)|Ic~1$ۤuvnuƫ;$mqznOҏ|(!ɶTʝ,9;Qj}$8Z2iZM# 7l7GEEv[#F0^bH$Hܩ(ECwq#UٿKpt} >Jpfb/|+ xPK00PKK>.OSGI-OPT/src/java/awt/image/BandCombineOp.javaSKs0>׿bɸpksr mǮ<8ƪj^,YfG  ~J k\@.xjD vU,W jÕQ8T mA* Ar.paeKTYunW;)C-,rF l'zMӄl8T .4={K+)/*Ri)gShn,0* `XڣF$Q糫9\GIMY Ƴ$dz)>@4OtȈ7vH&wl)➄\LyFdQPkԒAƭՐ]_hy4o+[56%O^!X .qVb~W0cQSɽks5?A|sK>:E-id"mQ1h k!NS3rGaϹd @U҄2K[8@TFhZmgFW|Rե}S9̽bW#/YxPK%(abPKK>2OSGI-OPT/src/java/awt/image/BandedSampleModel.javaAo@x5Chk51&(̶f](FZ˲go|3Y3Lt3X;tf,P;^?csdMdFRZdքڕ>R+!^i:%+Y1A*dzSht}œK'X.xCXZv44M=qM1(Z;'$ev׍*ZUK/wSebɬh DaלԍNWM.3rYa֏<6ЉRiQ}or/n(Y9&2^ijψ;|>Gu2Ɣ~SDJt$[Q&W2TQP-"e۔r#pOAs~EBtTȇD yAZT2#ۿ65"厵OOW*0>%Dzl͍vYy|{T]Yogw}tG'zPKv5PKK>/OSGI-OPT/src/java/awt/image/BufferStrategy.javan0 S9%Edm=I+ NWH۴͑4I}Q$h_)ή#8:5@/SIa6d܋ZYWDs2SE %: FCj4 { h9'@HNhpuIiPC#hs!_6u]bO*S͚*IWzz Y pP3U6؁2!9;#*]M!3"ks %tQSoom6QW)7X'xC<8YNxd|=k;`Ly|EH.JuDrQ[UAd$wNX oӈpw}fAs~C\(vxwAm˒LGeb<xS)呎ʺ1NJitϩ#* Yȝr Z}`XՓZu>PK'qPKK>.OSGI-OPT/src/java/awt/image/BufferedImage.javaW]s8}^~ŝ<M'agؤ +!L'W!#ؤ}HmsK]f>t6+8 =ayPan>c T(ѯ= >Jc+b+JE&T `/?33Ä b yOFxD)$Nb@?Έ03ɿџt:q]Q#Hžhu{rn\Ҍ3`؀l BI1-䚇(1S&\i^J#M=,lw-vkF]uo{pg9-\t;vvo:}\)e"if@6Ig".YԒCQF#2Ar•YVE}# L'e5*w#=::Y%GF)#C_Pf8PFz*4ެ~GkaAm[{C23h47~pv/89+'`+EG?8-b^HX Y Mۥuߺ4"ŭ^P,}NBslBf 4uqPuN$c|(83(ɘ/P #dO}X<]@kc`@G[W)M!u3"@*p9GAq&/|GDwIrR~,1h,KxLj rTU8cB٦mɢ1%xj#VYNnQIm IL\:i5FL2!'lZ=M"sC]e~ \BN<7U `;0I%7ZDúZ = PQfqw[xktP*^*62[n UyKf0ib=2=/,N\=\fEȽ ُԆ+b؅ =vW+KK]nRD<%nB} -9_^V 0732.oĢ&ըww܌JV<@& WIp#q'?K硌S^I3$Dֈ͡Z=N뤢z6nU\PK9xlPKK>4OSGI-OPT/src/java/awt/image/BufferedImageFilter.javaAo@xin-'j%L帘uw8(w hr0ڝ7o7L7{#˭0!>KU% 8 5^i$KfGɣIYڠU2p[B܈Xn ^0K[uZ존Ck=E!+8H\MI=]< ^zv>BC[OQu](ġ6eT6zLfE6}דZJÉ{rfJt45=uguH\bi9&q$.ΒlM՗ixd!]b.U.x~ zmOүȈ. }B 岐9GSe+JBwd'BC?ed-pǫrAQxb'BѹP|M="ݵEAd^5jRWypViEy S?򽐤 vLFx\QzC5 )!~PK`PKK>0OSGI-OPT/src/java/awt/image/BufferedImageOp.javaOs0S3ڜ6LS耓L2,X- U&N{W6 v&}z'W\Rȃ΀O!>s뚳6GpٵamHRC ϱX@Br*<\0gZd(M7 :hZaH\Ck|Q-䢑Zgp$4xa$gt@Ҫ|)fgg}H UIh{Nݷ5j v\0IT9kz XjFX^q-J3֦((4KZDae5y64 M Iaīh%1>A?(^ygm[ qP4Z[uBUKDpmU`amjpqb.(p5gyCGv[ʑ"3JF) w3HBfpI:Vͱyl;(kzoJB2UhsC8_Af!(Z=_ۥ7Al3ژ2E{&nIx%oPK%sPKK>0OSGI-OPT/src/java/awt/image/ByteLookupTable.javaMs0xd!5B[O`LӃ0Q#$W1L&+pAۙ`[Ϯzg04b;f$9}w8lc"fni3!@2'hJ/¯ I)r4']|#ѸhVs bo*lxT!VRhS!5r)ZNC &kf N(yzó꺎86ch޳uu9K*id\,UB̛`][.pfka)`y+5?h%Ҭ$Knܦӛ9n,Q : >"K:xd\v  <"2W +sTr%r%snM(ْJµ:\?lW(ԋ"}[rATV #r%Xjil}U't'Iː]8InKGXwhA3#Lx c%P#9|e5t<4zPܑj?²'Α/cPKTe PKK>/OSGI-OPT/src/java/awt/image/ColorConvertOp.javaQo@ ǟǧx'5ZUBWU4 %w݅U󅴂1m<9l?i 2[+/ t.LFI™:c5.R"W+OSGI-OPT/src/java/awt/image/ColorModel.javaVs6~.N 5L'BҔn0i{]eɕd~+7~KRM P[͗+ &v~6L)k =Bp x` Q]! bп\ҁ?P$U.q[@Ķ ap .9(Ωm]~r>jn32i(+9oemsl<2^vEkF=έ@c@ | ,&VW64FYXo4\.;`nFrc5' i;zY$\ |Wp;G~ǁ9M;j91n#@lL~ِ!Qzj{w{DPrpSs?[z)Nn96vUθgPm`M]ͦ64~9[JS+?tz|p5VEb&K & 7GFaRogT c/WPK4J PKK>4OSGI-OPT/src/java/awt/image/ComponentColorModel.javaQo0ǟǧ8 *Fh=lyi֡D jڃͱmB}FIJ>YO<87WK ~$,A@AahP\YDHjVЧ; jÕA F5bBc<xW`mK(ԪZn:#C-#9šS߶mĶđU_촦Y>~K]ֵh hpM7j*؜XkAi`F:Q[.Zؖit6%7VycH hlLB/!{pi:ter=d:MY:a2$;Og$3$-|MFFu֮n[avHƂ/xAɪaB֨%u57Z Fn{3,b¡W7s#ވZIvWDAei$F{ML+./'5qsҤ):=!]uwLCC)ק?XQ`݇ `O[gWBzdPEbR?_MV5OSGI-OPT/src/java/awt/image/ComponentSampleModel.javaMo@W8AD IJ-' ik5 FQM]ww Q{g BA֞g}T#lx<50p% g"@ht:-ߏMކ0FjCl B.BT`WZZRӁuzkS,d)[rkxwf@Y6fSf$p]搾a( h)1٧v{>;lIHW/;KeԥHPkP':2 O Tbd3R7\-22sЦ 6푑Z_w ٘z׫C^&r'_Gǽ=`4hxNѐ>Cox Y $:x)ar+g1E7"Y ZqbXP 2T)vC&)7,oUڵ|kݰs8ȿSub vjt[}kqҽPf+nػ2lX=/³tۑ<ژg!mvJ0<UuޫwEZPK8k PKK>+OSGI-OPT/src/java/awt/image/ConvolveOp.javaMs0Wp5IXfœV/80JSDz׶c_o35Q1rH\rDe,*ҁ4NZ6YVlB5C p\eZr{NbIҐ (цVn"0SAo?KconQ;R%ݴKw</D])j \XFT![k XbFZBqE-cS0V&(^ўn hp&7Xw~]fܝ0fwz3Zhv l9x)0-gEbY" C󐬉$g B"ר9 ՊkVMIf^u + -,_P!L፥Xt^ x[<ڕuqi$* !utr6yw|_S߻;u//)L۪!\P05S6<#=;|s[jo Bѭ6Hc[SKT2*qCɕ_C#S SCU ieC.?E[&1&pCrEw(44)&94z0y眏uLiޭ|5Z$R>s%R='VѮڴoYxl4PKPKK>0OSGI-OPT/src/java/awt/image/CropImageFilter.javaeAs0x 2M%4cf0i&Ga/FTIa2]IRdӷ"lvjeM"k[)TEϦ~$!UP:ȑ=PC0)G5:U2#* '1~uR+̒)A0F`q=:G!%cEC*Tzo^%a/X.p}-yoi8'6i{ֺ6/r񑩇;Ւs;! SUbì-DcϼԽ^&[ K[c_ xlBafe^>__ޭqVY%+̗uΗG7Ȋȋ#{c0+$zg$g[YqkDCh` 6K/)__4xο/q}"^EQV+OSGI-OPT/src/java/awt/image/DataBuffer.javaTn0}_qT (6 % 4M&qgCʪ!P6 ={:5k ~3#I| ^{lmh ThFM2f>M$ K*@-()񧨴z.44^;X d WILBb ާϗia-gj)X| 6 @TazY(~t/OSGI-OPT/src/java/awt/image/DataBufferByte.javaQO0_qԧfS  RSMnRlB]FU%}w=x=ze>,P)8G?tӘ9 5e!'S2Qi%!Eʯn%wFV }'uK=El+,C! rY&B*ժZi}G.ZXrGv`жm(aAӚi|<$LݹTI@Fjx* f-EJCxVJU0Un[dX-}Դߌ\&zQ8a%qxuz6y4Ey1OSGI-OPT/src/java/awt/image/DataBufferDouble.javao0ş_qX}D ۢU `5ؙ"}אKS>w;h\/:IIYbPR9A1J)Y2+JCN!g2!e)ER2p   .R+}t,cb *K!-2Y6A*$zY6ht>M'eN\Q/p pu-qM+vZ;NGx׹*ZQI%S%bά DnלԵN 3W C>&9ܣb6Ĉ6Nqw}E429b0Ƴhc2d+Q )C'Uj Tjx6wMSsG*0Vw{uUEp;>2n{9n3 ʨ-^f={%,|>)쫶ݰ PK'^?PKK>0OSGI-OPT/src/java/awt/image/DataBufferFloat.java_O0şOqԧeim)@٢VjB&',P)0?tӘ: e!'32Qi!Eʯn%WFV }'uK=EK,C! rY6B*ղZi}G.[rGvЛkamq0h6Šj,>{\$c{#5W<_CL9E! Mf+Gji**b2i>iOF.}Wm (Ap%qxyr>E4FYgḍSDK|'[m])]; B^mLMeʥVWRw3Sʥn~m4< &V" 咇^̹|JHK'Š&I oIe5|{GhV ;U|Tş8u*j=;{PK<<>PKK>.OSGI-OPT/src/java/awt/image/DataBufferInt.javaQo0ǯ8SIنV%RHWUU0ۄFU&[`^3x-Nze>&',P)8{?tӘ: e!'32Qi!Eʯn%WFV }'uK=EK,C! rY6B*ղZi}G.[rGvЛkama0h6Šj,>;\$c{#5W<_CL9E! Mf+Gji**b2i5큑KpۄB/J'=GI."}pMxL8OY<#%-}֮ƔSDBW[$SS*srihDA(i&aŔr)_r <|ゾEkCW7s#%R0䩰sұnIe'c$Ks%WB}a0vW>TS+Ӯs᫓=>dq}d6˝e§O'|wy4w]Jf0=PKOȓ8PKK>0OSGI-OPT/src/java/awt/image/DataBufferShort.java_O0şOqԧeim)@ECԔ!xp#u2iߝ6@ڟ(Jb߽`ze>&g,P)0?tӘ: e!'S2Qi!Eʯn%7FV }'uK=EK,C! rY&B*ղZi}G.[rGvЛkamq0h6Šj4>{\g$cG#5W<_CL9E! Mf+Gji**b2i>iOF.}Wm (Ap%qxer6y4FYgḍOOZ SvnO "R˔KSE# BQH+54X f.KiLRhyk]D(Z%sЕ(!OGMN oIe5|{|2v܏#ݖ}#4F NVIX>*iO`V`^-<PKC>PKK>1OSGI-OPT/src/java/awt/image/DataBufferUShort.java_O0şOqԧeim)@ECԔ!xp#u2iߝ6@ڟ(Jb߽`ze>&g,P)0?tӘ: e!'S2Qi!Eʯn%7FV }'uK=EK,C! rY&B*ղZi}G.[rGvЛkamq0h6Šj4>{\g$cG#5W<_CL9E! Mf+Gji**b2i>iOF.}Wm (Ap%qxer6y4FYgḍOOZ SvnO "R˔KSE# BQH+54X f.KiLRhyk]D(Z%sЕ(!OGM>KLoIe7|{=7X =[-^^PMYct_h>|D2v䏉#ݞ}#4F NVIX>*i`V`^-<PK?PKK>1OSGI-OPT/src/java/awt/image/DirectColorModel.javao0ǟ_q)LY/m}Jiס0%tUU$GpkvHQ}!]6}{ۯ*kM,xI  Pdw:{>S+p9K3L"8)OPL)j0g ;>@mtsz:p*` 11x`nKH4N85)˚F9#fUC`]&,V)bakڧq?>~Cks)2́*a#*X J4ҞUNu2-FI V)U* cM8 ^;Eoup>0w }} z#JFq..]91⚄ZH29&|JMf25C-)#QOqjH`0OeZz n4ηtf,` Q!QuUB3 ej6tm"<.-̘Pm LAy2X(AŊI?@B@,^Y3:FaK.gz[w <_];{W%QZ^]mY{ʂ:|G?^VeG'#LwvxRC PK>'PKK>4OSGI-OPT/src/java/awt/image/FilteredImageSource.javaMo@W|# NnOvZWiv~XQ{f1lժp-3;@xeWX_9Du͙Wt4 kXL kԨvXDpX*0[e9=?Qi.\SMf! XJ^#c. M;H}SCfQ:Nq"0310.`@*:$]~$CխQkP`=T,#5@*`BTw.*,M:LQ<ĴW4qt_4N}7V(VkEW !J{,|@c$;;[DB)t9/yNʲ ;T&Uõ[&ԼᆙsFϿ۱u& g^k3򚑼k^$cKUt}% S':Ct?K?\ޚ$/Ŝ ^}VIY#-#(4V (Yqv(lhO4 ,jBvKŻ0e^O_ϞPK7C1PKK>.OSGI-OPT/src/java/awt/image/ImageConsumer.javaTMs0=_ :!$M?4NLaPk,WqN{Wd\o߾}+zYZBC#iB98iY 4:ic RA 61!O0S8"@prЫX"݆ԫPyb(֢%[C&4 +o5 +i%׋M(CL4#8v@`yZ[,mQl 9o[j G+R]e]f)*\RǓ5T%lBZSV)Q]Jy6@.DC3JK>)=n5RwdˠDEu8w"/ ɕ0ts#B~ϋ85|HQɥdrcv!ޓ0[I*DŽxBeb2 GʌUIk7G2Z}g+fR|IۓZ^LGL1gλDU,WE񌥠L ZnF]z>p G'{#:A@0$cO`&#w=)x{:# wDȘv0vb鯢=܃q/IGzA\X >&0mXTȑbڸ?uoAR/֘㴠ZP=Zwo0},}VvdǮ7yK;ޭʄ|na)B0Ùu֦ߵPK֧PKK>,OSGI-OPT/src/java/awt/image/ImageFilter.javao0ǟ_q ,6Utk*BWULrw)dXξ}lZpC5O:q&gs{@߷]mEA''rc(d!YLǃo WN>t\@q'Vdl RY( 7b-p vYiT 4jn3Jif귴6e鳊W::.8:{NM֕h hUpMrٜX+Ai`FYK-F-l4:;CHoؘvAcDjtgY) 'Q8 'cZ}`|_Q˵0g}! ,TdrԚL "jZRGθqj0q2g2[m՗+kh?-[1-!B 5'f(UԐj:P(H[r,nƀ2j-N6R-6U4BKxث4Pw B+uvHe2SHzO\jA;TB*A9>tՅ {XOjb.$7z.K޼?&z_('k9p ˅Һ;5ćV7PK7#PKK>.OSGI-OPT/src/java/awt/image/ImageObserver.java}SMo@=_1Ɏ\4jk@bi-fbbUJT 0͛7‚ Q|a 98EY" l 26 D[ ɆX*B]nQ!8Kӝ;JE s{ CtGPE {vRhW_S4R:i ׻NbK!(ULwguu2ifb[|Rjn]?r?.,P):N*R!L \2nDCJKi4Rod+aDEq"/g/^O1<;aFp+/Vw/1 YFu𵒦ɍ)BNB&NT)xJyr\PT(\*54st__IJ矆;05{Z.NGL 3A5 "%+@:- a Ejpz@wf=ݯaW6 U:}V(#L"Dt}Z-8<;: &69stu>DzPKT 4FPKK>.OSGI-OPT/src/java/awt/image/ImageProducer.javan@)F>ّ nnmNv[T Wiv7;@3?uװTd>83f_!! b~0 6|Z4G,C&xȆ Kd!֢4pS0C٭GT8T: 5Tv@ QZO0)^ < ; 4׉ (zxQ}(š2uԜsmI4[cc՝lZ0ؑͪ F ǜ{Cd=* Su]G 8$8K'ۻ=ǻ]u,*'۔W!N[l'm,S BBΒƂ**x4YwF@ic,Zr [EA>(BѻZ^G̡rUvDY.ߵhp(x Q\WR dV7t3Uءu{WpyՑ8 &x[wPK_XPKK>3OSGI-OPT/src/java/awt/image/ImagingOpException.javaeQo0ǯ8SRemK  guVds{Lr KmNV6{i5C^~HV U׋ŧ9ymAP#{:f`r'+Rj& 'FTOEIp/0 x4щtɖ@NJTtgFAH8z,\`x{-#{o$0 86I{Ѻ.[#SU%`o/-O=AĖY[1@[y+TN ,Z:ooBȣplBa eV΃CoEdye6Y7GַsG}hl1er( NV./u%Ga3<sPKzPKK>0OSGI-OPT/src/java/awt/image/IndexColorModel.javaՖMO@ͯqr Vj99RTq!acm7:E:Ƅ!ZxxmoĂ7arLN2 ]!3L|rp&G'OSGI-OPT/src/java/awt/image/Kernel.javaQo0ǟOq *oO5jE$Bд.:cgC*!iC*+h9f=Hү$T O+-,Т96dorK*[ BT?J!t.uzcoqvPYdD K E<'u7N\p@ɣRµͳs4u8Ԧȳnl3uu$Z WdDT05h0kN{ڐ#U ْu6{Ѵ'F.Rm :Q qځQ}oVb͗,dd>q2k> Ci|I]BHČrʸ4UT@(⊠D'2HړzUO4/ot/" iqPV#dR0 @ F)‰ ~?ڨKAa?>G< z&{'gWtQ*)pzI ٘߇K)=ϐSDjt+ں _jRo!>PKg@&%PKK>)OSGI-OPT/src/java/awt/image/LookupOp.javar0Sp 5[ii;6i&GaF-dxl'Mgv3`*@?@}eg"FO!k!BԨ6rIb +XL?mdQi.L1mB Vb+K4Pj$ !>Xb-ZͺӪXo50JgtU̴gmLq4e5+U:ʚ\=W=QnEZŸ%WxVU̖Ě *RpATLYqm_iόd}?^GC+r/yaUA`>~0'şφ2v6B"$]`5,EH GPʹת pee2sLʗ-4r6eqyN (G3Fx7R>EPԐgwx,| a72mPē~VwRE}{Z!Zd[ v"z b^.ugM"@4)SIU0{PhJ%@Yv!ޚejB]9Q-e@|D/=:PKP#PKK>,OSGI-OPT/src/java/awt/image/LookupTable.javauQo0_qT,@߶>emP]UM{0&x g;TnZ']ET֣_ ?I$u-*x2 P2(iC0˂ ! %$FVFIp^nG(8bPʚ@T(th9K C^\óR;ӳ޼ڶʼn8ֶg,goujr~5r#aB-,ׁKU t[a)lV*?c $G!|L rdtctݦt#_v::`L2OSGI-OPT/src/java/awt/image/MemoryImageSource.javaUO0~^S)K1 #)Chڃ\ZolB;kˀ }Hcw}w[/k*k>XhMG_8Bp&cF~=?4} i` !QL j c1U6\Imh8ze7\0esBn0 1%jU n'e 1 C,#wFUG`"]&f[(|V2״^/{E)xsM2bq5*Ǻr9LIr&5G*}ՁdcAaT #ρÃN ý{0hA ]$ˌJ'MYg'K+n \K&%2~@pm%LZ+H, XOaE e[mYi|Dž4n3|h+lWS[^:Ƀ @?]SoqυIP72m_vw+ūZ7PK;PKK><OSGI-OPT/src/java/awt/image/MultiPixelPackedSampleModel.javaTKo@>_15$MmNj&M( ph}|'58^,~g]!8>B9m~h:F6R59!Xk@*T`݄W޴*c gN6^^՛b0cKT#ap !11%,)eLs*#FڅL):LI>Y9,W*j"V^ߒ2N J"Ǔ%TlBZ V"tgb:Sp@ǡɘB pmfh5*Pzzuzײ n Ѩ;}# Wh ZT2Em9.&! I:A'k2JYsTAjƵm&| 3і/KԮը?-#3e3^ԒtBu_0w o-c17q,pVCjoJ=@ . ̙괠\Vj :% , xHRΫ#W 虡~p$*&Ud*q LÐz[P4GVfC=@撛a@m%#!W]% 'W}3FVRXL!tF}F9vzW^>T?b)u`ȏv@8< ؚ1OSGI-OPT/src/java/awt/image/PackedColorModel.javaSMo@=_1 "Iڦ9Q'mQ2N(a fKw+M̾yެxp#U5zGB+%>`ڕO>onUd=݇}aqΞ.:vJ.̪^0swsjS:PK=IDyRPKK>-OSGI-OPT/src/java/awt/image/PixelGrabber.javaU]o0}'@/mLe%ZiNr L)w4e4p{p:/2]+/ 6L#}!8KB~=?]a #,11AD,) q*enZ,힥X l 4i$a^ rrnE*CCJy̔˜c ŮTqGls cT^@A៌+:qU+=#\qÓ-&g -MĵQíOv!/AI G)NfpGL/(}:p>La;'uPKY漎?PKK><OSGI-OPT/src/java/awt/image/PixelInterleavedSampleModel.java}Qo0ɯ8S;{ ݀EM4!65vմu$(>>Gg01re%91߷8 csrdTLndNQZdׄ9!uh\cMbojlxԎC:".CjfSuhv%0K/X.xAT;Y{_EKF7z]dn՝V,劗{rdV% QZ9ouc™o`SH\Y0rn%ҬIf`r.>OdH3̦W"M9dj>l1eh=CX(+siEI(͖PH1`lH/|;O]aQqb+bXn8z}D};Rd j`X5).._񄯇Ѥ1zDZ/V]t~.ѫc}Ws3tlp'DOQPK PKK>/OSGI-OPT/src/java/awt/image/RGBImageFilter.javaSMo@=׿b "אCj99V0iU=l캻k 5DMUff͛fN`B7$ Lg 1L f184A)3`aRk*>|Emp FdBi89N%jY4*n)C%QCA|6c_UUjŁy_찦.kRtIƀ_%8+HU*XJ5R*r`VLɸ'=Xd}@kc:a Q܁0bߑGO܇i8E1L0/Y4Sv>G VFsp]hdr-Bx avL)ɼd9BV%9wfF%G|A}ϣ=tD?؊_R:2=K9K-yW\ZE`*%J LZPVe(#'HWZ֡na mΡHKihK-AB aێl̥mƮ\MtFg';+ų/|¼FowmOߵz5LIbwG)MzoPKTpc/_PKK>'OSGI-OPT/src/java/awt/image/Raster.javaX[s6~.L5lۙ6O]lL>Fv%6Ǝ1$S@|#k?XI>ih:0<΄мt޶90 !* t-B0 B pQ!tO2ӂ?P* :4gX! !TH\{` pyP[r=$( <$X3g $+L'Lv{\Z,blrbYԻ۷?dR ߐKx+ǖK`S4}z)bOI40.WZqsN[s$ӳ6&kC>ݳ[782pz6 p=FAz{ c DwQ1GaǔTpLӐM @9ʄUAx|5P.h1@_قYl->e#GpmŻZm)e2{y.O”d#drĞD_9m]we"u(%]P믿#2?eeOĽ<1b3r&ڃB߮`%'p~y,ܢէTci//#lq<\P7n {]APK$3/PKK>6OSGI-OPT/src/java/awt/image/RasterFormatException.javamQo0ǯ8SRemK " gШuVF=αXjs{L7mPazX|ϳ8,9cV""Fj{BjDſqgd P0& q=:q#֐;"!*ݙm~:gT $x5 .`x{[Gӷ|Iabq"m\lGTKҟ^Zv=BĖY[1@[y+TN ,Z:oBplBa eV΃}>-4du~muγ~dđ9hlp2yEDv Ur'+^4F*vC.\c:ȴ^?AIqο/q|,;^ErZxp썶 =ڝ[Q\ˎ^K%%..fx3(zPK PPKK>)OSGI-OPT/src/java/awt/image/RasterOp.javaRr0=d(89mfN=9R%a߻2t&}ka)I`Wu-X|~]. CѠ>>$G 8е{`b>c&/-,90S[Gq4$a5>sTD \6j {8Yx923*Pt*_Q9XGQ!;+z!YbTUmƀ4L*vf=H H9+^ +*#K3f/bىi5/dka36gyd]@2KW&R:}8}OI 2J Hpv[q"$Rp:V!T򈺥@nqk5$phj9\Qy7GYzv#YfQ3Cޛ)8ܒ\#A)BcQ8-ݿ)x076&̑[r *w2J=s|P?\ȼMvF'qӈO蟞 PK>$;PKK>.OSGI-OPT/src/java/awt/image/RenderedImage.javaSn@=_1D.vrkRUN&'UoYXU3رZ;70VFli`]I\"FpNG#2@FXL*`^)bzܣ6Rpa@MΙb*X Be8TciAUJ]6,-ZXApA%.mE7l8bWl?c_{RV9URSNj TbAZsQ 2UZZYd0*44VEewL{Hwd(EG}E~4`?Ma慡L&!'?'\ 2JLv>O" zdJe*cj*!djDjH`4\I+lz_4L(u劎署ZdE r̀y{[Y=Ji_+Bh*WV%Cv{r`[&5 1d$ʋ jaȟӉbJp 6ߋcvAz"o<;Y5OSGI-OPT/src/java/awt/image/ReplicateScaleFilter.javauQo0_qT,оm\6TL TEwB]viuP&(={;$UAnEK`j%7gЬY3HTL*(.p!t_x7ޢPKuPKK>*OSGI-OPT/src/java/awt/image/RescaleOp.javaTr0=d:!ڜ$)`LӃ0kV\Ia2l'r(ciw߾r}Xœ'A~0,Bp 6ljTk\z`Anx%(g5\f0؄n-F d@0 |073d7JnVU2C. tF9D`!]V,=V1J|9 /?65(SpE`9؂ VT3Ҳ.7* Y";bYS9F<I˒%\HRj"00Sm鲍bkx,OSGI-OPT/src/java/awt/image/SampleModel.javaV]6}.>AI:iLAנH$㥙イ^׋tuιGW ^u\hre`a {>}s4ljTB BQY!"O҇?Pi.;Cڀ|wa!25ۂb5\QƋ-TylAZCT iH:Qp샖IB sm_fǴz9lcF.3coAnsf||tWx>NhF/xr$ˈ"e3 ڙ";Iz<&1[", B& fҩJ^h[lixщlA3π22R!|)iгpagͷm[XʴחTW4Hvy԰xzӃop@nN9O!3xEEMQ1OSGI-OPT/src/java/awt/image/ShortLookupTable.javaAo@x5[%¤QTl캻k ; NDj}=;3߼7ۻp)Vv,,(% ~?tpyt#ŪȜ*" !$dNIq& `*lxT!RhS!5r-i㜆a\.h}^g}yuآN7IGi6~Ϫ9X]IˎUbZa,Dasյ^ g־f%rYK{ xmBdH>&Yu6]|,pt3ͦ"M9dz ڗ68`2tȈ^HX$WR.2gkDA(̎fG(n X*`J/药0E%v"aTVK#r%X^1OqWUW|^kR{-ԏ!t}9 ` e-Pg M|e5t7= TTtr? 9==FPK/۪!PKK>=OSGI-OPT/src/java/awt/image/SinglePixelPackedSampleModel.javaTKs0>_ 2Ԑǥ!4Ltz(eWqh&+$C0 Y~]0˗'s ~+g2D =O]^EjF!KrC#(d YHI~

Z`+SbF}P0 ~y e7u}CAiuZeG]{ePU#JpBfpH f]Rh %AB[̰"i,Nbl:1h@ nΙM&~^#|?Jv$0EIMr]FꎋZxyЯU9˦BJ#YmM!dRp=#|QG@v+Q⨒xhPKk2PKK>-OSGI-OPT/src/java/awt/image/TileObserver.javaeR0=唬(dS'M[H4ڣLKl6aqBxo޼q|>3A$d0_-!~4i@M jd!Ѣt74U̦SGq ,#KIQOFrK+CUN0\QM/9!qEqLW&+7oYtk'{ pfUXk/FPDgϜGCdUAOӐuݘW# ǤLГ|}RIM7%1ݦy'Hgf! [uE$ouP"HhUXSK5&At:h4G~6#9. `x$"1>zG̡iyϫS3+xsRĦrrp~Kh?}alR0Г*JX#PK%Kj~PKK>.OSGI-OPT/src/java/awt/image/VolatileImage.javaTr0=jxBpdrڨ5+8L&ޕqg0Ҿ}ޓkT{-C]\0zlmX9;L`HNc!/濃4b?a:e^$vر\$tJ"+uGPKDPKK>/OSGI-OPT/src/java/awt/image/WritableRaster.javaTMo1=_1]I*9B["4,85BPB .a{oƮ*i>Y(e84LzvX/{nz.@ !8 4B"C`GTjÕW ([򩃘lRYH 7qw@ڔQzNMQ8fr 0N#kt:XSzXY^zK+)+fbbql Jj=ait0!7VAb6Hҗ6&n?wp~Cnow;4 |iw+dwv &wvfUHeLx@0aCbcn\Y  cnMrU e汩8F5gi(C7VJH4~U! 0]T\ZxXҖ2D 3Β(B4GHO7afb)<^Můsߑ+:zsoؙj|9",N x1:IG2Y&ZNI#h!Dn烆h+K[5Q<%pLN< uTἉw_f|wr. HJH(fw]4ܶWjYdž qI~7'd/mLO޿\N%u s_A6H'_ꩽc/+G~(~PKk PKK>6OSGI-OPT/src/java/awt/image/WritableRenderedImage.javaSn@=# NnmNv[ȮU= 0mU;Idr0ޝ޾y\\%ʝ7:y/ *MFf7o!H 1iR{}V""FS]#[5VFđ9*6!!:Pȣ%R& qkMaIP=;T-fD- a돾Ap߭7ܣE;RΑ#3 !o99kLVk}AA?9`o*tZ=_ƫ ̋ l J2;݁L/_/iQs&ڵTʊx;ԶdaK ̡aELGx&@1q~PK&;2iPKIG@'OSGI-OPT/src/java/awt/image/renderable/PKPKK>JOSGI-OPT/src/java/awt/image/renderable/ContextualRenderedImageFactory.javaRr0=d\츧6'b'- LE^c%$L+vO0VUe&%y.h8<ߟnfi`F38k)4\"+NQ0zQQ[(sHKFPeA TQuiW{:;Zd8rAū>v`4M[Ł a:_[VUݖ9RX؀Ҁ&>ʩn`6,Z=Fذ^@"LH,e$GӘWW9'} M)].BBt avLEB.`keVcF5AEƵհe!-3_qΏ`cY2.sSӳ+F]Jl?eϲ'_0Вk nPcAl"WxHHL),Gh 1ii]ׂiF+nm_yr%<{__3.U*'bi&m#Xl<G~֛ft& PKMvcWPKK>:OSGI-OPT/src/java/awt/image/renderable/ParameterBlock.javaVQ8~.b/e+.}۪nQWp"VUL2N)W X`}gIU ^@f 㙁vx o}!8KC^gal-5Qc%!#B?c!=|BL׃5..-B搰@8)3O!IVI+9?U_*912z J͌vSIwEinA+T֠GEH-sAlo_/x}G83ksL8dxmo޼L(jOW\B\yጩF # ir*$32Y>:qە(I(cy`c47\ؕ^jPzDjntإ׋j NPkB@?}VǸ$==W9OSGI-OPT/src/java/awt/image/renderable/RenderContext.javaSMO@=_1)R;pkZXCǍ=vڻ:&Bwf78ڝ7{}0Rln >s3#tO}ϵ0&Q-0q \*3GK_WTK'6ӆ:S l B4אc, p,ʖZͼӢX&pbșaΨS̴gnLvYؕ*U8xG۪k֠{)-*f3⚳)u"B pmUfǴIvt(&^S'< ."'0 4t YF}TV!Bܡ%]bS4U,C EP*cD009/aeyC>@wl\Vtt|kSV3im60iHcְQ.6xp❲Yp4 MB X05<›=Rr[={ќ08yq8мh ]TJ *E v>ΑY$utar7771,C+daQC_@vo^S)M1Ϣ{ꞙ~`_}ꏎPK+8ۊuPKK>;OSGI-OPT/src/java/awt/image/renderable/RenderableImage.javaS]o@|ƿb N$b#;mBڹ9n&T!ٓ3`& B# ϧc#ז!H jT[L]b$Wc1LQY#xwpJ Y¹; `ta)v A) ChD+.7U/fY9db TtʎL/^M&MӸUJO'Wlċ示. "XE8KHk XzFZՍFLZThDRh$0b\z-ɭZ+ V"0Ytz^p`>h>T: "Ĉ'2Ir Nʼf9B.JrZ5 L-M!60Ӗ&C9Dl\Wl*xS EJTM߂ddhwVSz$q[x/2p[i+d瘱0]xiI``1gV;>{=lIMmvMVHf GDjOjEQ :LOJavGpb\6{CR_z%exO~+RnK %|Wq~PK/KPKK>=OSGI-OPT/src/java/awt/image/renderable/RenderableImageOp.javaTMs0=_ 2Ԑt:C iܽ-.fęPXStoCDj EwjN'$/Bs[&֓'7/\0\!/M-y UIojɝ93e׉tn f_M7=Z"} / NOf w_PKAU_PKK>COSGI-OPT/src/java/awt/image/renderable/RenderableImageProducer.javaMo0 rJ I{zn3V$CQiG-7(K9n ^>$8nFka6yMB\UR ax2Oo+-,Т`7*98Z#čGBJ$ }h0:[[PYdifH.{"r^BCwϚ<m8ҦW;_$YzSBk+^mA4LVm@9FSFTeV &\9:h##/ 8$8MЛ\%%\ŋE<[&)0Βe2+ijkB@n Sv)BwHL2TDP A֏2`m*YKm'7-6"-Eed}OƭUHѹp5*Ϭt.S]M 3 ߮O"%>FDĺe.cK<_i]!i 9=`̓~/RoqR7gUXPѩ+0^KcI>PKBAzTUPKK>@OSGI-OPT/src/java/awt/image/renderable/RenderedImageFactory.javauAs0Wdg(89ifpfr\ĂR%aweiN9H'.`f`.)>IHVb/We6^i!'KfOUA -U0p;DT ++UW^0Jŵ8:<@ CZeK@كPFv>'CY|@~+t9?8#e=imY~өǾ%kA<jX2k#(Sz4ɾ ڍhT:#G+ذYR@Z&)"&O~󸅧$ϓl d6d${ivqd܇^0qn 3Z&!k)x!hԞL&I2`mZI\Q7{ptxzu#cKP8e#xǙ !t4o {ܴJ2u2A%?PK):PKIG@OSGI-OPT/src/java/awt/peer/PKPKK>*OSGI-OPT/src/java/awt/peer/ButtonPeer.javaeA0WrJVҽ{bi ]@۵h1F`d7ώo6g+#Z"!:)T]?U!J9:;xP9W5Z#BbDſy'h n5,`1o-Vw{83(M;d頑ThJ̌6J:N.g]`ów$2xHLđm].ޥmVl3\:t,3T(#h {=h%IՆtCmjʲ1roPH H'EZ)=|?)$;9lCzH>C=÷4{92>_0q^n +F_J6TۋZA{_ct$Iд__88_D$F L_rm}Ow UK PѤy Zvn9=vTp;'PK#PKK>*OSGI-OPT/src/java/awt/peer/CanvasPeer.javaeA0QNɊBvOM[Tj -]ۄ*mT {yC| Jꋀdʆ`}ݾ6߆+-dɜ<Fْw H46Y*! cpmaygh=N Ґv $4I|IyPC#м =?8)™8RY˫;^N=ʁCGa Y@לԓN>:7!o 댨Gw?FncC ZʪЛC?÷,82^0q^B.HVS#:pk'Չ@9 j68 n/Q/oO"Md=#'t3NQ~ڑl(AIn ^/PK4IಽPKK>4OSGI-OPT/src/java/awt/peer/CheckboxMenuItemPeer.javaeA0WzjW%){=n%EMdƞ4q!=߼Ir ,=9jw j3Aut0],Agq؆MPzؠGw:`@j5FCH3V'6^4&ci2 '^@ޣx:EṼS~S٤6[rgl3|9D&ѺЁ`R2E(sA+jt۫5tZ:nO> `l:+>oW("%Tc"ۗ$%3^z)>c3>J;zs0TG.1JPK4PKK>,OSGI-OPT/src/java/awt/peer/CheckboxPeer.javaeRr0=Ppsks"2qQ`IcO& FڷOU|,9Y mP%z>g?G:ؠC{*bO%*tB CH(7VBI:&ci2'^@i!sHlX! J7^ngdJi n0A(zvDK}AqmgWbˏzzP-:wҲ°R=h 5^uo%IՄtMi*ʢ^4M($9nKrKY˒ Bh;v/ci^/Q'%"=E+8FNւga\d]6E ~Z'pв{ougMpvίi% l`6ylXqZh"e PKQPKK>*OSGI-OPT/src/java/awt/peer/ChoicePeer.javaOs0S3ڜL3cfrajARēw ӌ^ʁ?>*+Xjs' iJJf/+lС=`7%*B GH(1D ZM fl~-NAi!{HlDC 3 i?3xx<O0U A=^{">IaHk$Ilʋ[f=?{iaR옵h c=`%IDtMm*]OaP0K Ȋ|Hc~c٤6[relGH'w GೱƔ>.BxP3XZܚjz 4VqG`vmu XyVv %A9FAb ;#=^5#4xA+T4j^7-+U:O"]Dۿ]{f-v}8 _K[,\+~PKrʖltPKK>-OSGI-OPT/src/java/awt/peer/ComponentPeer.javaVs6~> M 5G;m3} ƹd/a/Ft G;߻ pyi~|iWݏ-x\l%K8QOӔ,\z]L5.z0N,LAL,IH_;R1+G(.ڷŖdE$ SdR = HWazi^ "٢$TRk{l\j\&ݴ0QK,o9xP":G). M$F2ͲC_ `Lin$m^`hF.! rc<yO,C2o<`<=鏾/h!)8]HsL:*Aa JJ@,£eIN _DD\1eʪ`lܤl4v\&P<G5uF@޶D>4b4{XnA'Oi}( є(?g/?훓?}/כ36S?~>6ػhz^OHp\ZzBؚ^mgU &BbsMeÜE46e`T!342R'jLk{%(·;37ByCx*}b:l7U"G˥2X f8MoPK-OSGI-OPT/src/java/awt/peer/ContainerPeer.javamSMs@ =׿B 2ڜ\B[O3$׶lԚt߫@Z!}zz'W\ؽz0,F>$MCJ~0 =0;*P{,%: BbU!>3Gtx &PM [mZA*j@@ xsӳ%sUAq/pmɤXՓt6_d󷢺?hIUEk:0TPrlMŝrhJ(o´?sئ4 l,Ɓ)]Y>)Y:g\lMr!_ YՋ24%V|W(4"{ v*VDFqUJf<3:=t3_gFgfgH5;%;CYjTFJd*MǷfʍiPFG^^gbq$k5N}᎙EPK){PKK>+OSGI-OPT/src/java/awt/peer/DesktopPeer.javan@)F>7'8-j帆OwU;q@37_pKOB^|"Hږ, ~kXL khXEEDiNVh-J|CcIIL^:8H堳dJHBzD>'QCtODnsC}8Rs*+Voz?:2<B3U)vڊS7H63v0e*Юs/L06!ai1"s}^'&]ag7&3>B=4e0&y;[BHVcI5?z("ѻH#EȎ94ߠ}tJ( FáŢLJ΢4_ ,ZȅrT>٢ZG|$g.T9Jmؽז PKGzs  PKK>*OSGI-OPT/src/java/awt/peer/DialogPeer.javaeR0=唬RH&i"d@%kشwLj`dϛ8 J 5Gr3Aܶ$d0]-C2hzBf$TXA'+4%$܆+{l*w:83H堳dJHBNz6;L,^ `K7>٥q_t|;`Lr+ HKdkDШdGќZXyN^EA9D?D/B1P#@wȉ94oHh-d'x+I4R-rr0+~eψ=9\Uslg PK0}PKK>.OSGI-OPT/src/java/awt/peer/FileDialogPeer.javaA0ͯqM=QWP=$LlvȢ㐭@4D<&M70d{XҦaTv6{7ya6A`CXЪ,=Ajp2odk A0F`q-J{h;!VP:%wER`dU] ?{͇$.ƞ8ֶN%|ʗozzT 9~l U;ammkKru,{V|M[޵*WFiR QCcg4#9CW\Hkn&= cuX[.JHrc|l]dڝ(yʌe F_Jw]_~EoKp2k{璧@+ J+xg=zwPKin:]PKK>(OSGI-OPT/src/java/awt/peer/FontPeer.javaeQo0GyJ* Y߶>4*2tU \7b{ ]'LjU{}wӫWXis{6P5a~\~E [rd$DdMQA5d̈S%NjdyhM6H8AikHVzxHZ̄6J?ϙT ' ]y/޵!}ޛOi:c"ĉ]_z]Ef֣9X=HˎaZTڋBtuRu1n(,F:oe57gd860J 2/ nwxʶ۬-V.囂wȊg|ˋđz168`L⼼"J7 9CleT7#YŎ`  2)OSGI-OPT/src/java/awt/peer/FramePeer.javamr0Spk=9BZOSؤL^̶Fr%C2},k_{p cU5k ݴ AX$d7>^!vJ1[vp&4A%3`a)R~~6$ tӆ:[gWlPd2w)HB6eV]7.[JZ Ay֖J5h<&Lf=+\rdT,5( "1uɒ}0jekddee/vd6!&%IdͿΞ8ΣIƳ]4fSp ߢ-spWjWcka ^ ɔҊR.MrE-"(Qoȸ̜MA6[r=[%jmY+3b0[$3U7W1юSGM[aW] Ǎ [mЮnNi8OSGI-OPT/src/java/awt/peer/KeyboardFocusManagerPeer.javaur0)v|3.9QI1N=9.`X0t]a[տ~Rp5UעXHa] 9f6{?~. K4$CzGI$ ʂ4 A`Οag H$3;hMn^=He5@)jzͩ $j hHePE#'4*Ov ǞW O|wL=d=˚M?[l0U؁Ҁ&޳QwZX!)U59BEڳ1rJ)D>iN:Z}NW0^E%̓.ZEI̫{x)k])8)BH\"dbEPiACz+;VÀVX}蟾\x?wܡ"}5mcY%?>S{ J_Y 5~UuI:Iz|] Yvg|Ǯ9_#%IZ[$L;x%=t̥:yPKL,ePKK>)OSGI-OPT/src/java/awt/peer/LabelPeer.javaeA0Wr"ҽ{ٴEHٮh` ӂ&ljr'CN\ok!7CO9!qD)Ek]f-Sϫdւ_N\AhDɬAA9GCd7 ަ& */#G-ڄER@Z,cRʛ>O>OdO5W\I)BxШ XQCG ZVHNMOetԓn_.QOoCD$FiDs1|;Qb 'f+ Jt%xsRTEtʞ!I5cv '')*f2~PKgF%PKK>/OSGI-OPT/src/java/awt/peer/LightweightPeer.javaeQo0GyJ m}biU0tU \7b{ ]'Lj4l{c'7nde P5a~Z_8,c[rdLdMQA5dԈ?:nA0f`q=G!Z&!j}0(|HeV.SZ(OSGI-OPT/src/java/awt/peer/ListPeer.javaR0Sd ZNn0qa:=(bK$I;}7@)9$߮pʕ0;Y *2C!o+-ѢYc79 B?5KJq4 [lU؂TA pv@2U%.n{t4B>+ѨmHtđ2iϮpt0d6=MlʫOoK2=r8n0&vnRG!YqilDP5FSj06붞|獾D"hN,1;d2 O(w_DF)AŒ?Ba2ʇ۰>Raj-Jt$n~+ԗ 4+OSGI-OPT/src/java/awt/peer/MenuBarPeer.javaAs0Wdg\psks"0MN39ajJwI&FڷO>]pkF4{rYE@ܶeI0\>,߆+-dTMDIRȀKL% cp`4[\yGAg=ZTv $'AxIqP;,Gnм =>{(!đ8TړFwzL=u˖C;axP3U;fmqeC\sSF8!%XU yJXgĮsg0oJ$ ")!f[x=PKK>1OSGI-OPT/src/java/awt/peer/MenuComponentPeer.javaeAs0WθDe8(ÂbI'ޕM2ɔJOO߾%p6G+۝Ǵa]~HN UŇ9qeAP#{:f`r++Rj& #FTwIIp/0 ɸ5]G(;bȎ@Pw{F@Co`Чg$0Dk&Yl{Oݩ?a[fm!ZKuRs8AX 6tm߄ȭplBa >eV΃}>-4du~mu ߲zz46t2y"J7>#9Cldŭ-;!.1`l:^}(_ b1٫[d3N_ȵ"OѻuhGSu V~b*]oPK?$*PKK>,OSGI-OPT/src/java/awt/peer/MenuItemPeer.javaeRn@=#ڜ㶨.Inw+wV9vp+mNV{ö*!:)T.ȗ!H9:G#f$YrXCj@{Ĉ?Sgh n%0Z8JC:hd/3I$9W.I0\ç&'2xH#m۸;c]IWXgӭաs`O/-;.O DZ;1 Z#UVTnh=M-YYtڛF~ ؄YR@ZsR“@$gؚj{"V#0h:X{N$ K {_("1Pd]`cm#x?P)' U/EB+T4^wG-kH׹cK;䄏./Qb 7PK&CPKK>(OSGI-OPT/src/java/awt/peer/MenuPeer.javaer0)v|3.9Qmװ` 0t]a쉧`߮nG#y, n[$߮VЇ!J 9Y2Bv&$i^Vd b%~BI W0ٔ-Qr[ba- 6L.'srͧMwNaBCe=im7iySգlZ0'5ScP19<`YUАuFzw3#ZkC ǸH7yJ_-1_ B j*E-JM6=6:<h2Z-VަpsFQyxj"s~k925#ّuAӉn Y4+.4t/ъڱAPKٷr5(PKK>-OSGI-OPT/src/java/awt/peer/MouseInfoPeer.javaeRr0=Ppsks2M!czrmJwIL9}ziaP{p0#!+r6~[D~6-3x{PZ5pD?74h s_0SUGq,4!SIQOr+ljCNpͫe!7s}QqLwZߧuV߰k'; ɰ BJ(5ȘS^`ȑlCq0ijPٻW=kd/ 86!a3iz}ﶰO6$ۦ .ݦyƫd%B@'mI>-BJB.Ɗؚl{"F#hdZX{sቾ"hnݗ#'4AHe_C~${Rvh$̒TCd3 -PK21 PKK>)OSGI-OPT/src/java/awt/peer/PanelPeer.javaeA0toh6mQWd]с%kQ1F`d7oқ7Xis=x̫6Pa~\E J-9'v&"FjBfDſ&wNjdy̦.Xu8Ci{HFvzxHJ̈́6Hߙ\ ^& B?A{1MaHHhۦE҇|.;TGү^Zx0LU=vb%:PVzN7~M-r1roPe%rOYq0yw_7O;-OSGI-OPT/src/java/awt/peer/PopupMenuPeer.javaeAs0W);=4tNv$$nῳJL|GڷO>9p6G+Ǵa]|HV U׋Ż9~mlaClOUNUTE~OH(3VNIp/0 XnQw8#teK璌T(h9K w^\pUZGӳ|Habq"mu]\-S]%`W'-O;B*ŎY[1@[׼ԃ^fk?K[EhyM(LY1ǴȊy0y̶_[)OSGI-OPT/src/java/awt/peer/RobotPeer.java}Rr0= g(89MN=NK$={WdR޾}܃sKuԼZ),[qr&Jr6李ۆ1 dhP I :QE+3"|EmpwMWN(;ر#i3H@[<,pܩZv38'0j23:hUlU C}./|\EƀƟqqU ڲh$Jr`dm{TX͋ξGj@18$u'yD6~ 8t,rXf0_7:Yq&ȨvM|"/,ɒQXԚh: 4rZPGPqc5dr2-q/W(< `{ކ Q_y+(FJ̢8+wr(iЧ+sF.OSGI-OPT/src/java/awt/peer/ScrollPanePeer.javaRMo@=ǿb "jHnmN.jC9.`&5T5N"{{33FLKiI)Bx!akN\)m)k:TZ-D'D`i +n~'zVe6JVɌԚxTΨ3wF`~WC;*2RzŬ+pPv؇t#+w9Terwbؚ25!#oo&ujqr,ǹ+UT9/PKPKK>-OSGI-OPT/src/java/awt/peer/ScrollbarPeer.java}Qo0ǟǧ8)'fZEFl6Q3aQIؾ`шf`Z`@YLu<~E~6^iaĆɝ(IZp;Dcɿ1#+E4Ldv-=A*%jKIځPzv9'CYyUzvOq}qL'*Wzz-Y ~upP3U؃2!9{#MVծGCަQtinJ$9>'y)~[?l)llrXo`nmxm-sE_c -BNtPTZ\l:lu #"dk XyVC7lS?(Ooa"MdnF#S#q^ն{^fEK~Jt5xwPKNHJeih)͜Yq W.OSGI-OPT/src/java/awt/peer/SystemTrayPeer.javaeAs0Wdg(9QmfN39ʰmAR%aB;]4L8'W\FP{tV #!+z.߯" WZ(Т9a7 YwDH7%%:Z bu-&5@/&`=BC>VJzF.fup 4ϚBn>G81gH6.Zߦ]V2\u'; pLJ fJ#(5{Nyѐ#ن`UFad^[.؄ERBZ.cReMnIQ$>ݕɳmOg kmC@Gm|I>-BQ$*nMhZuB##hzZ-ަpW} z$"1H#@shw\Na7byRφ=",7.5 PKI*PKK>,OSGI-OPT/src/java/awt/peer/TextAreaPeer.javaSMs0=׿bd!ڜ\)d0i&GaͶJ2t߻2n&#e?o{+.CA?2yG% "'jeXyZ4;Bf$הA-34)?!|BcIIc{@ EBh]o8FN̡x{7v(3{ZzȔO(]x̨>z>0!to|Rwc0Gã~r()\ea Sz Sm1KŠU>M~-?I PKъT#PKK>1OSGI-OPT/src/java/awt/peer/TextComponentPeer.javauSr0=_d!99I39bI8)v޾_p SmVVk"$!k)T^O&W#ȇ!H):[,#f$@射FhuR+&zO 7b؈=(M8d`%khBoL/,^ <:'p V@ԋ50mNqm5X7Oy6{Ǫ[FFZvAVU֢mAT9Gګn$8VX4tdeI^4cM($n,F)Y~^<.)NxLf,R.w2Y3|Iw#@n˔)Bx"aBdTՈ [AΏձr#IP: }["hoF] w4kNJwz3: .jxwh V /W iʣW+m]ǭsjvB UNw15? D2 }EZ2=BǟTrdX,:S? KE/[gfjY.Gkxӡc/Ysk%} 語QPK4E]PKK>-OSGI-OPT/src/java/awt/peer/TextFieldPeer.javaRn0 =_A%fs8]ѣb67[$9N:G9`PdH||||*+X(}4TV'I a|='GZؠE,OSGI-OPT/src/java/awt/peer/TrayIconPeer.javam[s0˯P|ykDe!q V%U&L+2 \V9bvhr mʒ \a2l}-Y2GbV"ע$iNVd %?ƕBIXs}d\L/Ġ:8R9,PKR ?U< <jۑ7h_6tgc<4kgjL=-Y ~u°؃2!^sSF8!]L%3b׹Wcd/860IrH |J4}Z|plIV6[XmH7}${oivqd<S8ϧ9+ZRԢdk!hԑdGj28Tϗ4 Gw&2v#'g\R[^E8ܰO-9.f:GVyvy߳>,B9ύ{*]Fm ?APK1SPKK>*OSGI-OPT/src/java/awt/peer/WindowPeer.javamr@ )4>ڜL1N=9A`5]LN߽ZL')3~}'g\齡j O!>uMBtz>xkXL KhvXDEn)GiVhmb-r~ 1|GcII^zj{Ak5BI5>\5z@m>'ACmtOq"7@9i2.=qL5vr̯eւ-x*fEʀ r)Or$1XUN2YghӺW=3 l03H,^d+XeX%Kd >@xj Ȗq|O?zb'"ѹH#@shJ;^,T {hK~hNQʒG0oZ!i'jd7ѺC ]\wboSR:|. 3=ιSg]U'4e,,k%;a2:5c£a^.Z]D< NmN+4 6rG׻˸Y[^OPK_adPKIG@OSGI-OPT/src/java/awt/print/PKPKK>%OSGI-OPT/src/java/awt/print/Book.javaOs0n-'ӌ`L^5J2w8;}ƒ K׼Zf#X8DUřx=ߍ +4Bzy@ 94"G v)_ԆK` C'G!AH Abp1Ce dzk-ۮOOqNgȍe$gThU tZއa۶RauК&/t\UBc@㷆kxU6b-H HgV:׭斋# 2sc54,4bcQ q:(SA*J" *^˄V%)N|@n][B!ŒtFAܹ8L.'M_*#xg8$ȇ?ܳCjp-uͬ;tަ n6i eL7Fhى-c5[O8?8_@]BiXGyPKh).PKK>+OSGI-OPT/src/java/awt/print/PageFormat.javaAo@dG.&V! jj,pFUUa7][Q{g1m%Mr0}G0Fli!?q3 N\xY59X ИB%RT`^+Bpгn포FVP iH\ÂN4$([eObIsHΨžikiL~8a #U6̷Z=$u[u)r`%Q%lN9A*`BZ3R׊.h05ShmRZPlL@׋!ыx`Myx9k/,c#`z:or"}p]*ar!F<@X-.1 Pk"X*AA&գFNrinي96N0NY)GHrFxSRIU0`b)$8:o,mO(y4{S>;nF f$;~FW~?mOvrwp+;p~Q)4 <CE*+[7u7}Z`Ck+kRw[Ȟ Ci4;ޗN3e4ob8+SЇ<qŔی#v'vEoPKk@|PKK>)OSGI-OPT/src/java/awt/print/Pageable.javamRn0 =_A;iNhs$M}b)6dP||||Tp̥:i^-1$9v:ƾ! hPq#y ;h5=BXA>3 n)`ا㙣8BZh 7P_ TBT/vYx9dn(K 0ۋsmN/ug "פZiL夵f-H H9+VsE5#K2fǍtD?ؑ\ؙ|$,ђ dclmvHr>_f B7uR:F37wF#Gpdzwv\{pYPK߽"fPKK>&OSGI-OPT/src/java/awt/print/Paper.javaAs0x 2ԐrrIx&Fr%f߻2nB&ӷ+N`˽ơ0M>JDE!J ݳ~~3%,r%SR2T*#!DH񅌕Z,v{(PY inS*BeVKiiS< m^9rµͳq|7u8&\Ir[׵*Z^I%SbŬ DnԵN׮|L&3rU'Cȭ xlB%GI}"_NXDY4 3xO'\}@4YS<9xd|ݖwҏpH ɖʵL5W"'zGFqG(lj01J'\/ x|Ѝ؉P.,TnՊ爴YpzCH[R5j ]55nweq4;!WULW>7'wIW?a{mv<2szP7_QvZfG!mv x,NMsQRvOPKb*',PKK>*OSGI-OPT/src/java/awt/print/Printable.javauSr0=Pp|k==P8L31iN/X-TIx20$͔ݧ=Ax,:k^, dC4a)L⼜"䈯$T"(,yK&<#7X ;e/G9pDى\عHYC^znV\C!Ͷfq]E>Pߒ 9%,5S^81=HGf]~@o ղ3o6OyPK {PKK>6OSGI-OPT/src/java/awt/print/PrinterAbortException.javaQo0ɯ8S; SiNrRNj: b$~:E ,9Y= DڶR0\,ﷳ8lcrdTLndEQNdԈ?_:.A0&`q=:G!v%CEC*T`F^gt $=t^ !=<{ͻ$>qmgKn*/VzU-9K?:i9qy0LUY[C[y{+TN|/,Z:oeCџ xlBaȊ ާEṼ].l| 7Xls^}@s_A<2CƆ)8ϷNJdTӉ#Yʼn` 61OSGI-OPT/src/java/awt/print/PrinterException.javauAs0WPpsks2qQ5V%UƞL{W6$̈́O{"p6G+Ǹ`Q~V UƗ8I6aIȍH9ѩ,QgIIpL1 4\G(9b 鰑-Pz鷧s@ACvW~>=[ͧ4>'D&mϽ.g󢜿gaV,e#aJ=h,q@[jb8dj鼕ο#[ QV"/Gy|mq]\f*X,1[*_ACcƔ!-$zg$gY5t!4zOV#;µ:L+w z+F;{'J"ӭ9GT`atǡ'UTIjѻax'fS{acPK.ӌ%PKK>0OSGI-OPT/src/java/awt/print/PrinterGraphics.javaeAs0W);=4CaNv$$9ng|-۷J"\av1gXwiIjzx70"( rd!˚-z% #FWNIp/0 ɸ4G(;bȎ@5PwsF@CW^\ãЧg$0Dk&Yl[w=_\qu0LUY;1@[y+TN7~V:oe2rP%ri`m>6xL"7٪ĺrfl _vz66T2y"J FZ6TۋYKpl:^u( b1XMds3OSGI-OPT/src/java/awt/print/PrinterIOException.javamr0S 2Ԧ\B[O3vfrbɕd&ûgeܖ4`ҿ]9 pnFV;q1AZ U׳ٻ)~e|bÉʐ r+ RJ$#č(oؙ;+u8Fh2nG(Zbʚ@5RfP o7Np\pAo ιCu]8ԦsFb˷l=Tݩ_4ѰU!6Z@Txio餪z:acJiֽoGn2c 8G1Γ|!Kv}Z:YVXdMN>!N5Io C<"r [}V r+ nMU>Q2{iZ,={^Ӄ~EHAnx(jz$[?ztJO]8$枂75dK^&x *]|!PKCfVPKK>+OSGI-OPT/src/java/awt/print/PrinterJob.javaUr0=jHnmN.! d0i&AFX$0{Wpiva(ӵ@'$D'=].fjF! rCL4F%*0 7e!@L@&P{f!2%[C" d ks!x\%EObm!(QAJOj"0S.> cO~+;R}p4GuYuɸ5X, X!Ōs Oh979Sha"AfDp֫ $Km߳ 7z7tgȇ7&czw| ߽y$}>UɭO>|S Zg,F UBAjɵ=VM# #fFVt@ي9,7NxbZi꜅B &xh+sv.<#l#,C7uȅTKf 9˄+BL3x<ܠR}֊A FC/&G9Q`p|cfRx_&1S)$Qwcɻ^*ZӨ/6<:l` Nf4Ş-HDj^n!]VuÞ7ٲpA̤Zo3tWS{Ιqs?7F TR,uFBjGROgV銚Rop΄z v٩T76t܁/Zs󘻊{:OjۏeoD7[m{IPS!x 6[PK1 PKIG@OSGI-OPT/src/java/beans/PKPKK>.OSGI-OPT/src/java/beans/AppletInitializer.javauOs0Sdg(89mfqqŒ* w hǙN9yz`و`Y`@Y,o}4ž,Ƀ(IZpGDcɿy%/dPn5,`1/-V:8rYba- :m83xx=T4K!~0D8G4q;imnY}Gْ`{' W\5SX0k(5<` hT:#ν #~)P"!pizixdOCa.O.Hgf!GЋ6>!'zP j*E-J.M66H4Z-Vަ'ЍSs捾bQA(m3K~tK. JT=:ZqEz4k~OP?ix0bq3=oPK/R2PKK>+OSGI-OPT/src/java/beans/BeanDescriptor.javaAo@xIn-U+jd$L؃캻k; m>ڝ7o7.\`띑ڡ0>JU% r~s%"dor'sR 4 &ĵUBJp^W blJ;4CZdEjMݡҭs:OC/`OS!ڹmmqMUGMݼf^Ud- }oDTX2k%ZhQӞ5IUaʵ)uF.w_Tk 8CpgI6&~x>Era6dNE2Kt8}$A2CO Su"23>"ٚr9GSe#JBd'BMf# oSɍtEA{捾$u"]ݔlnd'v {oIЉ9xyw]>xwc+hgMC\UI8^n(uX7'PKPKK>%OSGI-OPT/src/java/beans/BeanInfo.javaR]o@|ƿb磨T(X3bY^vFh hY M;%JgS]ka`TfkѤX-}A#Y ظN;p,;[,6σpf1DsD-X{;i"=-s@2sEH^)1HȚ+#jZ#(Qqg5$0u4X mS: "OSGI-OPT/src/java/beans/Beans.javaTMo@=_15$=Z9V#[¤Qk3Iͮ(APZUj{(㝏޼G0VVSKŗ~)Bd4:?=40Ezs( Ρs`~!Rk3ڐp⍠ m?u[UJlA* A  pba$jU*˚EqJP\.bmE׿Żᰪ*OԊ=aԚU05neƀo%i8ق(XU*֚ iUNuɒ`VBG-`ۄCw̏x@n٧z7tꇳ`C4q yu~x |Ȗ1n &`lvb= H2GY)2LQK +2n[ ;VdCs9a>u@wb-4LCHs\ ;h)hMڀ8m^aj!CHN)Z`kǎB-Y)2OSGI-OPT/src/java/beans/ConstructorProperties.java}Qo0ǯSR1UʒlC`ȅx#gPT0>|cyp+͛y4!j[D0?_._@׋MC24 WBapءG1Ry̦! 1xWT&k=DqNvb23@Ѩ~,f'㵷V þ6:n5U$%ڊ?;rUJڲh5+^sEパFqc5/;$ E9 Eyrm7QEIorH3X:.4{['k":xlri!G|b'KFak^QkX#jAB}m!;i[fǩrBϣ8wvdAL rtFDUw@A<#(nΏ?%M^dUfgZDZA?oJKNu褮( J}%Ef9^Ӣ Ɗs!<PKabPKK>'OSGI-OPT/src/java/beans/Customizer.javaAs0Wdg\psks2@8(`Jwe$X0޾" X+}2dgmIa~Z[/B ;CUdK%JBkQg:Yw4ps/MGŕ8:qك,"CI(U'gr$p7y .м A hPCe6&Mo2Tu#[ fRڊ3<`ȑl`UaTdw/B{dџ 86!a3I&Kvx}!:K}qz_z ȑq|Oorƒj*y4Ah@k Xy:r^EA9F(W ΐrhjSb DU}34P?9VQhg?^]VcBR8n<_PKKkPKK>7OSGI-OPT/src/java/beans/DefaultPersistenceDelegate.java0)F=t=mU.8ԋkiZ$rH7*+f`g$R 8f>of kiar'8*tBngZM4Ol@iEb ̱u pkGipۡHJqd1JgTҩ>OFóu}}GlPikvפzW?:ah%UU^uo ̠T:#]K#~@1HC~zdtU@<[4>2$˨>O@2E(/$$ɶE-85ޣQ4hvZXy;~1o݃؞E%2eAە!pHkI_D s2йg^W#߬ ^9tD-E5_oԙg煲)'.QyDE((T\{(p;tQ:)p APK "PKK>'OSGI-OPT/src/java/beans/DesignMode.javaeAs0Wp3.LҌ-$L# +X.@ǫZŽgom1 aę8P ۋքwjdwL=z-ycRڊh=ɒl`TmTdoB{eѯGę,)οmsx4Jx66YyMxdd=ȸ>wM"dojuA2TSɣɦ B%Ow+gҁsFqοOqABgqYԵ ^Fޫ ś5Iтq qGd<ۇM~9_zB{q){ ګ(%$OSGI-OPT/src/java/beans/Encoder.javaQo0ǟOq *оL2`[*L]3!E}:lk(o;Fh/-tyaQ&9Bj0|40CzO NFp3d!,O҇Pt]B]Nb*X He2HBȱ $p*[ZeӧUq$pj2JgTP0mgimyu]!΃bkh4[nneƀ_4qVg)i*G]ka`LɄZ=2mH&mLB'L J:)LD,$ FxͣiL![dR S8;w BL\,d^!WkԒ&J3'S6\N聭"fUJ/M$W{HOpiB{\3=pm%Ȫ(=i0IsGI$xL; ̙E'w&|)OSGI-OPT/src/java/beans/EventHandler.java͓Qo0ǟɧ8J ^)tEt)j2 [jiVMu<$xpCUڼ }vo: eA™O Nd,8J3( 5BP0Nf _Q$}hV ZdkBi4caAHjY4hmFőER(QAAD`> k^UU>Jg5q8E%Q7Ug2Gc@RhrDYJ9@i`FZQWZX!.5dfX--#YM1 0n 9YtDI8a2$:pG F]@B;)8]\H@.悓5,C $GP^ b),_QhWN蒭"feJ33BPṞ%L]8|CR|6{hJ'%UŠ~wG1i%  lWWsxFfqskzіZ,| 'ghPUE+v%>W`Lw%S 5{fZ0MgU 2W q{j[SW}xOPK/OSGI-OPT/src/java/beans/EventSetDescriptor.javaVn@|&_SE Ţ$RRUv;swUw8حJ%T Dޝ>mStx<7 0O9I™ZAU۱eX jTK b$g<@1LܔSt:RӃ4V}l)V2[25D➄Hn$񀬉8c1B,9Ղk& nY*BFrn%sfȄ>nٌ2 a$mDa|4ԁ⩑VAҌsd KƓZOZN.[X2SdrX&J{=a8؞kGZj=Q}?knY w\{F )*ǶV뿯;|~ɼ4F=xP[mVHD$ps/S4HtNȫ'ѯ/LW)>4 .azfR&xbcK4ϝ zSwTSa3[* PK kVr PKK>.OSGI-OPT/src/java/beans/ExceptionListener.javaeA0W<ԮJR{ U*5]V{tIjHmc;V8 hWȞo8p6+ۣǼZ`W|HN U淫ջ%x}1!aOVVUMHH7EFIp0 )4[q(;b Ȏ@P铙=J ӤK/8]p]2Ow|Hab1ڶIwu6[ob󖩧Ցs;./*Q2k'h ZׁzK.ta)y+޿2/#2m @V1-bD×~lS`zgl _~ bz66t2y" W"9Cldŭ-g;!{.1`d:y^迾EI?wqqIB%{vyoƩΖ B7g-=ppzPQ&jpvwPKͰPKK>'OSGI-OPT/src/java/beans/Expression.javaAo@xdGzjsrZ@$QTYkw8 )饇ryщWNbmgg,PǧC te,`AɥHѨ4"㟾35i#+I85ΜŮj;ʢ1`%KgT[H=Z+;wq$= iu(=tY[[ڶ EGV{]Y2}ԕ*hH͉DTH-* Qh➭uT+ M&j6Ҟ9&Q8cЙ/%n"-iE3~hvb9t_k1[@XU{$SS&W2hhDA(-iʼnPH0`lJVخt4<gt'"LI(sM;DV F߅-hÄiC{=O2!^+^7gXk sGPMYiJt |7`>-^!?Uk$}vm߶9̓ǫkx{_PK7PKK>.OSGI-OPT/src/java/beans/FeatureDescriptor.javaOo@q[Hc52&r\c鲻](߽iA47o~oƌN^-o"!89Bx<>}^iaQZ,pKH~!\\I8^wxa6 "yp %xv%j;eۧs$py13*T ,ӟFiBT#E|:M.@k௚JmiYF5 9*] z[gxV=2R]IE)iFiu8].:ϣdOStLExO@܏sEHJEs^ɪfBh$%fŭ_%⎹ o4 Oot,̐I{:B.!s p>x)#h]kE8 M =”*/tM mb%Zxwܩ ݄[-׾jҥ213y],+&j8?)%h=:NhnkɄyQ| կ/4ecק·E :><oPKSePKK>7OSGI-OPT/src/java/beans/IndexedPropertyChangeEvent.javauQMs0=_'P줽9QmfqQ+łJؓiv߾ usвXyEM"*)TN&DC,ɐQ1#9)CZUF:!~6V8&`4F8-U[CeE}NTm3X:sہά`Oc Lxu]$zQq5d:zVM[9qvhU.2Z(5qu a&GSHcZli=rcM(I:—8MБ$n2Y"Y%9"G2A2֡}]):o)3 ђi(ks4U$DhHoqj`h*Vؾ"{#;e$96"[KxpOŕYَeTaf`޻m.pEvGNIr71|z\~B^em^VUWoN7s<_rg$/؆&j PKM*PKK>6OSGI-OPT/src/java/beans/IndexedPropertyDescriptor.javaT_o0&ԧd i׍(@hQ1M!4}wiк5+BLB!ο=r(- 09 }K/eI SԨ֘`AyBc HQY"Kt|Js)b#KX iH\Âx`a HhU,k*C qF Z-vFt,)^uUUVHuG8='ͮ ֠G9o*asҚ )Vu"A˅B rm^h4 1Dqޅq2}\2N,0p2>fdLS4>)2BY$81= L'dMd%2F%V\c$009_qL]eC9@ؚsdBS䌤E/JٜN/ Tl Zng ޣHn`=1LfL|+oƱG6G(inG%n@Qx <'ٶ“km',t,e~}r}/i6q*45 3OSGI-OPT/src/java/beans/IntrospectionException.javamAo@WgI:d:ɑ=PB5)G zՐ2#j?:9!a2& q==zG!#б&!j7# gT $x5t .0|ھN#yo>0 8'ڶiwu]X=SU#`w/-O\ SբbN 1`RiVVc_Fu&&YsVeDͷz|YbbU|U 6e܇Ɔ S;/[DIa/HP-TۋYK 2K/ꟹB4_A8"Md=D F˕:4:ïCGOqĞw/E%a3<sPKmh PKK>)OSGI-OPT/src/java/beans/Introspector.javaTMo@=_1) ┪Bc{5븡gqKJ|̼yfv؇,֊^-79Bp8<ݟ97̬jT+B C)bT`2`=K>\ 8tгY,a R#ap *eP< e \F JڎLC2cAUU;R|X7Qg"GA᷒+xV-k* XlFZ֕↋Z&b -L̵Q|Q;r$uC.-ȹ?7=ù;B`< ? q$"a o̻t'# d ;ݹ׎;| ,IsuozLNH#}bXAr;v+{pMdJ%@y>_AWǐv0pdi+f9% @ފh Uǘv!RNk27$aenvh]t:?PK'PKK>-OSGI-OPT/src/java/beans/MethodDescriptor.javaAs0Wt9$)A׎$tY%fHJ%U|LQ {I&9j< oF߆WZXE2r#8J%DnhӟJU4 h#v ہTZ!,TAGځFhpC>œC HȠiU o뺈#e9jm|NY>MԽN6h- C;`8+a(6HgNy'dUAS (Zw6_$ |,Vp,IJ9,0]dt.2Z]C=442Sqor3JF.*5YF@`c}BqМolˢ@x*gh)P]#sSOy|` wQ[f#x=90OSGI-OPT/src/java/beans/ParameterDescriptor.javamQo0_qT,a}ݢUa"tU۳RT2j̓#*lvjUU"m[)TE_f$XÚ1;{YrTS5Y!5p3ONjxq&Xu8Bi{Hl \ ޛ~w3<  ﶗB?@K}qmgK2/zzP-9K:i9qy0LUY[C[y{+TNo}/,Z:oe7C/<60J di`m6xL4d5|mUλ;gb qz66$`Ly~EDo Ur++N4F*NCv/]xVǀui^zOG (9FA% n"ӕ0OSGI-OPT/src/java/beans/PersistenceDelegate.javaSn@>TI @& `Q%(Nzo&gㆪάc  lyg{xLuy429,⢐A|4wZX%sMB R6P p;D2Vjזz8 xTCZʂne+n(^ \:s%m\;Wa]6#maqËd:_笺TY UҰX*k-msC\sګtR!Xu50iYS#[6pl=xIzdqyxdrbCObqdCXq)# [}dKr+[Sy9Ad;^ZV7{5GD z<`*; * 3v(5~uQA9:YD?;n1ڑxXoXh9^}4 g#>+S.huN+T֡bmi716L[`_qdh (baix8a: & PK$DoPKK>0OSGI-OPT/src/java/beans/PropertyChangeEvent.javaAo@W|2Ŏ{j}ۢF'Q ]X{g1mڊr1;7oG\L;ͫaC} ,2zCW4@zeH( 55BT>Iw W&a ة6lRYh 7 -p =Zӻ8x=Tn3:nf{Y[[ڶ YG*]ġ׌<WJƀƟ ״qVUrbU*Gjn0je[ٔXƾ 7#~@1 (8(o"J3OSGI-OPT/src/java/beans/PropertyChangeListener.javaeQ0ǟSPM {U;@ϛ{ U$uzyH&n`P{tV #!+ff ]ri!Gf:d/ zYwDx#kƒpn`shgIA*E u\v@*u3H8U< <th>5/AzwQ4c(&P6.6']Z^3\ ; fJډSz4Hkq0ejPٻ+0/6!a xI"Sp8 rf}rHO Nsޯ2 W Q$*MhZ5<h4'Y-^9ᦫ `{obaBڻ@%{v94b˻}qnywԅՠʗZS5 l7PK;PKK>8OSGI-OPT/src/java/beans/PropertyChangeListenerProxy.javaAo@xdGԐڜ\B[0ibf[qPYDAir0ٙ7;9 pnFV[ȿH$u-*tz>?D/c;-d쩌Y\˂*m I# nAJpOp5.A؉vh-Ț@5Rлf@>'ݠNpOn[皏IucmI}쵓t6{nTMVN>@4LU5֢6!sSwF:1޸N2uN_6ڄ(ɑ#|J4{tuqm\&*X,1[dW*]d|$÷4xeC Su_9 FlCȂ{2!?er'p}U.o4 //SE&eдk!Z0wYf[k)2\?0>J{n;mhe$,w?|^ ]8^?<`[7#K2OSGI-OPT/src/java/beans/PropertyChangeSupport.javaAs0j=\B[O3L^Fr%f߻r4ƶV{֣މ'0Ztau`|eg"Bh.}ǵaf+5PZaByBc QY x9^7TKm[ЪZEeK! 5$r(eFYւ[Ot1^0~ ה_%^ʻg? EӼJ(lx/OSGI-OPT/src/java/beans/PropertyDescriptor.javan@S8AD 6U+j &r\cuw8(ʻw.4i9yoY{peQ<]F=8xYƙc[9jTk]"XPh1*0K/g#}Js)`k:XFb@\C307DrJnUbu͐a$gS3oiLn0(ecWtmzp'`\Y"CAς+8UB*u"탖)B6i mZo hlL@ :p~з+yv+o> l_)=7/H#:x+v-Bزȭ%cQk"-X5*AAjŵ]&d| 3^_qh?,膭"ɋfQ7% m6g#s#k"֍)6DwΫOV 75S><m?q|+Y (iaۛT;+ wٿsd鹄+ӈPʌL_SIjSLa^mg%AٲwܧՇu1^*^νPKPKK>+OSGI-OPT/src/java/beans/PropertyEditor.javaRMs0=ǿbd!9n`LӃl/FTiC:]CGO>=vHŊ`\IR !tχó>}/e{9:Cf$rCr@+Ȉ?mh !t=Ӷ: O&2t%>fhLM+jiYo9tJ[AP+yVD`Pu(šŠa`dUnT΁ş8݂0*)k-E ڂ(,rW][IR}pzIirʴg5c&t$N.^|,.ϣ"'0h6l xz|4;`ǹ"$$,N3ɥؚ**Q zV#0h:{R% jJ|A9Db#rRΐ"Ki;%_FD;+ m/[66yN&1("Gڢp*QHwjbµXE)v7|,D^gfͥZ7W5&K;Af%3׸á>gjwg kGpC2z;}l}ۻv1ڒ{9APK`fPKK>2OSGI-OPT/src/java/beans/PropertyEditorManager.javaя@Ɵ_'`M1ʡ6paiZv;[z">7frgdv=̒QQHRBj8zWZɒR7))K*[Rh#}|%cV zA uz#o6b*K!-V cJTHljMœK'X.8XZZ;W ECjndL^2uu ~UpDTX2k!jhӞ6IaɤuF.+w2gFnXc (At>JMŧ|M$llz/ٔOM9^A<2C02OSGI-OPT/src/java/beans/PropertyEditorSupport.javaTMo@=_15$Kh6DQMvwCNW#w߼yfHB'4<9g"F =秮afhP0 @鯹jå#oh7WQeK!-Hy71* \@,Vr4,N \52@`]֪~Y{Rgƚi0OGRD h LE5g%H ,HwV:ե斋FdM<*im _0{2ҟ<0h:9tBo_\`r$((* YwB %1OyL`B&WU VCG%VGOr]"d [CsFδ$j'JJIm+DAvpP=KMk-E$O%hAx<@yF.bùKTFtvQq! u!C9i <Gz#!)E7*˺7r~@hV1xBYߓ/7gyo ̩ign) [~D3౩?#%>tqL5.iTyʗ#μ O"Lx=gSoyi oPK$PKK>2OSGI-OPT/src/java/beans/PropertyVetoException.javaQo0ǯ8SR1H剥نV%SH[ FlfШuBT4@=.0j0,FXd$Bx|ߟF+-d쨌8Ȃ*mI# wd WC/h#V존Ck3Zz,q 6=Z'xNIg 64Z !\}|65H#m>im|Ngl{׭ZJ{ 3k-:hQӞ3IUz:aǔ:#ֽ #~. A!dit}q}\&U:˰Xb_t1W$H!Gcc|)8O ZlC\˂[SU+*BwdwVZKS˭t%v"I(; 64o9Hd4k)'z2*gыoav]Q{g{C ('8 xPK$dwPKK>+OSGI-OPT/src/java/beans/SimpleBeanInfo.javaAs0jhnmN:4 Q+$WZ0I!i}O>$rke"=%$DJISp29:Bv&2E0JghVQ)Rh;}I4BtVw-؂6Cr&Œ@jHͺljIœua$x\pkET EC[ n .dL^3u *iyDTX25 =2.LNm2eEGyMhD IΣ$N*^|].*ϣ"$0h6Njx6MS<92>oJ7`L !fJLe.S^M( Ay#(Ѯ?c($)=47!6"\,(%gx0&OSGI-OPT/src/java/beans/Statement.javaAo@x5[% FQ̦f](Rr<37]L{#ˍC?`~J zX%"dor+sR 4 !DuFJ0 ^ blJ;4CZeEjmݡmt.Μq>\Q۶8ڔ8kGlLݩTEЯF8CLY+BԭNr׮M!32kܫ0PE)ⴇQCor>/V(Y%f&^ŋ>"J%Nn ϡ S8_)+>"ٚr9FR(5Z,M% w(?hOo(v"H(; & WRv-)M9 #;aC-q|7&<''C90ѭ=YvR].El+W%~PKoҩPKK>3OSGI-OPT/src/java/beans/VetoableChangeListener.javam0)F=AO[ JQdd+Ļ3Nl9زgo~' J 5Gr#AҶ$d0].߄Ea3-Ѣ鱊XlDiNVh-JަHh,) >a6f8N R9,YEPrDZϤIiP.@~MwtNa"1G4q{ɵ6]o|󚩧{٢`{G'. 4S`V ǜԃ!G  :CELȣL`ۄYC}yEç>&ֻ.=O ɞs݅lgmI+BxP XRM%&N4H4Y+/҉p?sFq߼Wы@!*]]M-)o}qny쥶sFU_| \0Qz`gPK7A=PKK>8OSGI-OPT/src/java/beans/VetoableChangeListenerProxy.javaA0Wrڜh6mQ#Rh`B܂MmJmU 3o,n`.΀{Jp3#wvֶR5Ȓ(4ЊB԰>4)`2M8jv! Ik 96\͈s*G FZm/ zxv4ð āTeXju$]'AT5(rErkz XΌԽ↋-g LQC<÷8)2FYm[ a+OHoyNDٲ*AAUsmU`ae*^s̰Ɨ: ` 2dBϜ(C+Fhhs$P@(5  s]daMbHgY8::6 {!SS?8n)/ *o/ffhHV둬B*1tSko'y{{9 $#K*s5~F#i؋PK'k:FPKK>2OSGI-OPT/src/java/beans/VetoableChangeSupport.javaTr0=_ 2@n-' t0I&A׶R#C2@ihiw{Vȁ#bxF=8xyΙmXL Ԩ`ANyBc QEj"}8Gpk:M[,a6 R#ap :UHj*CQ:Vn"0ӈ̘`PUjŮT ?΂[RT?Kp U Ik* XbFZՕ↋Z&b -L̵Q<,͞i xA>x-ȅS/}G|8PKPKK>'OSGI-OPT/src/java/beans/Visibility.javaeAs0Wdgpsks"2Q* ޕ߾%Ji9,$ۖ,ŗ9,۰J khXMDiNVhb-J'sxFcII 0x4yAuH堳dKHBzDuFO*` Wg!7Bs[}#qL'*W7L=;2q1LUY[у2 |攧 9]/ z3Tt"3#Y 8$}'ܛ$v/zdCe>$$Ky~&#:1y":!Y%TrkDШF'j6- w/_( ( tWpCS 3Y*%7Pe!K?v4/Rm-Z#BQAPKЉ6PKK>'OSGI-OPT/src/java/beans/XMLDecoder.javaRn@=_1kzJ9@[Ԗ0i̦f](Yi!RE̼7アduPf#OLdx|}_<[԰BjG d3sE !XF?}Džo4&v`з8vB5װ%fX2zi 7vObu!Sh 0Ӌn?[c4ZŞT_v_E,ޒu)J"XE2֒5 B!  ZnLZkxZ4  >I*\/pVA +<\qDO!K]@mm!A<$]a7<#kYP=*ABڞUҔ| 3m/w%a{Ȅ:UR}c&-yӷ-K/Um`xwpA͋̌-3"Ȥh_dfIEAhd?w#g6dy{H^!5ƋK 4O-^Q1ٱ"ׂ(uƧ <uBEw_PK(Jm:ePKK>'OSGI-OPT/src/java/beans/XMLEncoder.java}As0Wdg\psk}2ua8MsbJJē NfF۷>#ꭃ1@7`#gSI_+-Ѣc7Y b ,р"Ěqz )Dcp`4̽AcAkqSorle8$5,&$YJ/=IoGm)|ǯ9BHV#ച[V#jFF`m՛((YX v趠 7~X-%WeOPLJO~ ^ZJ4MYBմv;¬x@FufzA mk7{xl %yPK/  PKIG@$OSGI-OPT/src/java/beans/beancontext/PKPKK>4OSGI-OPT/src/java/beans/beancontext/BeanContext.javaTN@=唠 Zԃ X ǵ=q6:&B:Ѫ=98Λ7ozt1Lt7Tl,/$T?OϏ#-,Ѣa2'Qbр D %4Czm78{]VAiE kadz[jrN}ˡS'.8uµƹhTu(š6Hv4'y2۬%Z0"{%DZAA9U׆bV]- z3Vi/.m zQq҃('WWEe4_K,*^=|C@Si|,)BFZ$3ZSƭBwhw%-Y?VsO#iKN]_(GO v"LQ(<3>Rshւ}!v/Ruk9%K)IroJɆd+G2h)1spjZ0;`-"}`(RB^a~G ,8iAy5nS*g vŒ5 ]xALJ^*kW<䕟tr̄b-?-; ׅrFxi Q;CHa\K͋x- PKӆPKK>9OSGI-OPT/src/java/beans/beancontext/BeanContextChild.javaA0WrJV{ksbٴEHڣ;&4J@d<~77xYf3X'9u͙w 0kJ Ԩ:=R"+ИC+rT`*a;.<\ 0qk2[Xla V#ip pac znϨbIeԐaT@C_eL@IUV(\=QEZŸ-W8=k*c)֬ iHK+n(]в0=Sherik.BH (6&`$%(qs~s6Z&@mi F HQ7: Lnt/ PKz&PKK>GOSGI-OPT/src/java/beans/beancontext/BeanContextChildComponentProxy.javaer0)v|3.9L3N39 X@-Ti1d]aIĬv﷿]p6g+ێ`Y`W|BX^o6U!rthXEea u~uR+79Xx Π45FxH>mM}fOO.Ipu!#2hPLġm_j]t&۬ؾgԃ9{'. SUd^-"H{J] ¢#+ˁޘG] Xm\ڋ<=x2OyE( 4 VA>U<:L/M[EA>B?Q% 妵ҊD7J#˾lr&߁Vէ3<&)1R%XPK~PKK>@OSGI-OPT/src/java/beans/beancontext/BeanContextChildSupport.javaUS@~.OС}kyHLpxIpһK:K<oa$Ӎ@'MD9 z@_=0C*! rC#D MYH?M.Qi.;Xvu-Ffb@0O.UZQ[s,T( \W2095f*giL_+;R3o4/ĺ j g\QXJBׄA*`B3Ҳ^+n{¬B qm2SmˑR5 ٘=gA̝̽SoM'5&=@]lD[9*X%%bBOSGI-OPT/src/java/beans/beancontext/BeanContextContainerProxy.javaeRr0<);=iS:=γ#p$!q2'@; }9p6g+Ǵa]|HV U׋Ż9x}?56!GHȽH9ڡS;{BjDۈ񍬓Z:^`nYw83teKSEC*T`FkΨiХL~I{o>$I6I{>[b]TKNZ"͟% ۔!QP%g5t!4HVqG0d҅:6 29OSGI-OPT/src/java/beans/beancontext/BeanContextEvent.javaAs0Wd2.vsk}"245V*K$=NqIo}`|̔>^n gax=|?߆WZXE""*YE5ѝ;˕hC/tGpGUA*Ebp .v%j;k5wۦOGNc13*д\gOq]kGʔcj>=@kϊ8;*gye)6qYA)ug; G/ؘAB&Nt!a j/< fmN ZAxvHQ¨ԪllpDOط˔TK~Ä~^gw"KPK:PKK>COSGI-OPT/src/java/beans/beancontext/BeanContextMembershipEvent.javaMs0Wdw9i%S:loE'tY9R?Jpka<!3Y"gi t%~^ia%/QZpkT}$h,WΒ^0Ch- ۃT-@]PZ]œM H(AXݵvN۶MXG(SAkd:˧ϺnbLU be)攧n w\1Xr-3m*nE #~,1 4,ygyM"-iL泋lg |f1 Nar?.BaHVcWdݰV[4:fíVK|sң|aМy[eIL^*pƁn '9E&'t\O(uPV( ^i~]RH&JZ\sQcR /,lOip1lp/w7D J Rhÿ+u1#ańEgrCÜ?KxKqlfaNưSAPKPY,PKK>FOSGI-OPT/src/java/beans/beancontext/BeanContextMembershipListener.javar0)v|3.9mxfr QI@<{WvinAiWKWUISU[X+8¦!!sfn <_i Azg)Gi^a'r^6$\XZnzh d(A; $!Wm7KSP.Bǻe";Fmm!qŤW s vzu/44Is DǪrF4J#ǬrGMdJ; S^G#2ma Q0ҵ9OSGI-OPT/src/java/beans/beancontext/BeanContextProxy.javamAs0W);=iS:=8:UbfR{}퓓WXjsyL'PazXgq&(6>SC0)G5zUR#*9uR+\ L`2&`q==zG!P ޛm~w:gt $x=t7^5B?BC qmtgK*/VozzP9K?{iya%vb%y+TN7~M-0M(LY1mZd<IOSGI-OPT/src/java/beans/beancontext/BeanContextServiceAvailableEvent.javaAo@q5$Chk5 F9.f0.,E T̼޳W\TG+-Aa*%.7)N5,B:{\'De^"( Z'dJx$NA5Tx(" :ZҶөx4̊ 9mAtUú'ƖC}6GBo/-;^ATLU*Q J\#k+IrlZ:r,lcziYރ4Ay̖KxLț90e6 'CeƔ!-Bx1-Y5]zQ"fV# 1:($z+,F+{Ph< 4*COSGI-OPT/src/java/beans/beancontext/BeanContextServiceProvider.javar0)v|3D2@8(ĂbJݻdL|딃ەs!VAzga_DM#ry UؠAc:YCZ7e|%a,a fSjt@* A* #ւվawϤH~PeT@Ku!0;As8Pc oxD= wBSXKTڰVkUz Y`TeɔX-ξ3#$̢|WQK߲-EMnu,NI D=|OkFF>ja 7-BRG$"Ԛ;V#ԪG-#hQqjt2 zח3 = =2iƕ+i^zmW9ei@?R惸af^Г={g;还LbtG+Ql(/PKl 7IPKK>KOSGI-OPT/src/java/beans/beancontext/BeanContextServiceProviderBeanInfo.javamR0=唬RHͦ- *vz00i&$'j߼*+X*}0nLd'H azXg/C;-hSb р ZT9|CcII0 nGOSGI-OPT/src/java/beans/beancontext/BeanContextServiceRevokedEvent.javaSOo0?/X`mRʶhU]գr`CXe_R 8b68z~ # kiaMED ZpT U!a2h .h¹8J;-8V`n , :w*:mt9W}N۶X8Ҧ~N2͖Qja(q~V+r*Y + i5 UNkAOSkwRڳG~@18$e%ē&o une5,VUIV)@$Re Ȧuo2 [[rf%B4Af/ FpuW/ryiP'kX#S{r>yP9 \2yIE?7GDkl=4Ua]eC{@>Wl/xBlBnOk- O!#ؚ>UK x[gyAWՁ { }[Ϫk1gƯ<vQC5D5L"1zˤTgy PKJabLPKK>JOSGI-OPT/src/java/beans/beancontext/BeanContextServiceRevokedListener.javau0)F=U*%]V{tI:ljIZ!ޝqVoG7Z鳡`^.`"ۖ,淫ջ%~c| -ȖJ+d!֢e,+KJmOMKUGqtY,"D$'a3xx4T yWN&qhPġ2M^rmM֛4߼e֣lZ0#gJQ0k+PDccNy#,  :CELȭN`ۄYC>Γ|E,}az>$d#3|I҇% [u1yyEjuAKdӉQ=Fs$2`eZ:n<OSGI-OPT/src/java/beans/beancontext/BeanContextServices.javaTn@=_1kqhk5 F9lbvݵ 5&5jJp07;p,g+d?9 B<]@"5Q0JB W[q;*ͥ7Ropi)5ۂJ5,y \@"E+fiYo9dl](m320uF'U6wX= 4![֠G9 Re fU]+n\rijҤ\Hֻ Q(\Kr.>nptN"!ME8G%^Mm)Bx a)wt _򄬉dB&+TAj͵&f|FCǡ-#y&RܘK(cʓ3}E`WhL " :W`7: R9$OX?+Fg9lc9{AhD ߔxkqa[47Ks/(fhR)KM'#1~VKs>k9xvwS෯Ho|Ĵ;w^%v˚dR~ebIDc#!5˥(KD9w:{n;O.m-rPK겎PKK>DOSGI-OPT/src/java/beans/beancontext/BeanContextServicesListener.javaQo0ǟǧ8)2ن U}4p[M;V&#~]pkφy] n[D_VE!2hzB&xȖJ+d!֢Yw4ps0BōGUGqtAjjTv@Juԓagx%81T .м_&p;8?E0 4Q{ɵ6Yo|UOUEkώ w\AhVUbe@49W=r$%XUA3Tti5r/6!a3$_zCCeqO692XһdR}8}oIzdCOSGI-OPT/src/java/beans/beancontext/BeanContextServicesSupport.javaXs8>MN$e-)tpFJ '[&́`Y{-ѽh eQ|4aaE}]v>82LN SԨR =B 7<@1D,1 {ӁQi.\y=h gyBld+! $ k p\ŎښeǡX&așa@LOF`ƑvccOE7hx=#N꣈PkP_Y<Uf5bk B!3Ҳ^+nXt@˹Y3&(>KLiG2 |gf4}7x `|;a2dvt;/?? ]D[wQBa.sJ:ƀy@E dĨV\۰j"Za&[:*Z K7C&tHa[q2#B1 7>i?c YbP,$Bar{U±pɣ9 dsQ%`2;9|{^*$oD/%rt C, +I_כAɻGEʯP[cs32bf(EZtA4SzMioyV/D I~N2BJ-jtUcTSCz!|wWYו \g nlKR/T76T>?.=YĿe"/qq-OۥqőUr! b3`wԕ[al+,ѥjhczE2p$c';:?C⿟ӵXɵ.9VLlgɃ)xc=;dlWᴫD#O#W2gN }?PKw 3 RPKK>;OSGI-OPT/src/java/beans/beancontext/BeanContextSupport.javaYKsH>_N`gO>Lb6TjkbFٔ#!Ǝ7wz[БR@?C; 9>ByMR59M`\sb3EhĢ_I\ x<%8ɎNN/aƖ X#Mi9F2% 1'mz o{=a|^ nk{8lo{]C ޠOOz C[wQa,SH:BOI&9G%"P͸a0bB>㆙Ն]VQV#?[Aٜ5GȄN~R|0(?|O'ċH*Ct8:S9g(LFI2,;S(P5\/h-3.*Bo%?ko"% 6/MN\?0X"'x_ikWbK50gyj+YBQ qgEʵFɯJVis{ڳYjvQ/3ubf_-={]mK#JFߨMf5 C`>IّǴ8QOydZ'&`J򷺍TUŪ'|ꫲFy>lr%}=Щ{"gYL\yoMvbo8 c[j_&"  6#ԓ9UEs5V%[Xvjy@ͦk|)qߞ-Pzu1Yh_\M,.2$7kTiWkٮ)>ߍ%'`=}*HKr* kD}Kz'dc*OI,c0ا#+gjqݓ|yAT{RP^cBy>\fhP:ݗ/ijsEpGiTIlq\_^QtHU嘍 ](ywTƫ^[ mGZx#|hvbvVz>qXvUT':6*|;k*յkBPGAaVfᓫ ϼD֛?BpK{'Z?PK"6PKIG@OSGI-OPT/src/java/io/PKPKK>-OSGI-OPT/src/java/io/BufferedInputStream.javaOo@q5$CHk5 FQbfݝAQ{fȥf߾[/"6{+ A<&!k)Tп.cAʰJ thwN!5xF AH(ѭZU2~`,VAi=R\! 5Z#i\ &`L<"J}@r YʂGSBwhOVp[I\08`GD"82~BQ el,-3;HneMhO/'c5aA +_OR^Yu+SK ;aGpu=+}?4z7PKcI PKK>.OSGI-OPT/src/java/io/BufferedOutputStream.javaOo@qȵIn-'$$LEU=6ۚ,3 F5}of^DpSmvV6ka9yEBֶRax5_O$anJ! 2#J~+1|GVpa~i0;P;d頖->hRoLIZsz@O^` S!ך|NӮ'Nmu}>Zt,rǫTX1k+:DcHJ:a1Tґ+OgC;2rP0 ȋ\gE^1_~?,1[,2-`|v/ =|v8 0 <"g> 9eɭƋ[;v#]8VǀUiF}鯾BPE<؊DIde+5d瞌, C$w%g胱 +_ONR^QBߋcŽG/<7>|W4v4WτxoEoPKr ]PKK>(OSGI-OPT/src/java/io/BufferedReader.javan@)F>ሂ[q FQĊ$CT73\9pKb IC4fԷېZ5=>9X5/Ph,%*0[e}\ 3p`2M kq4i$ > kGgt$0z03 h:3#li?A>}9ju8['1N45(qE`-Q,'ֆ Z!i{ ZVg MɵQ rj  #:"+\/b~rލQzBgj6'xhlƮ/B)5S*L/Xj/9X+Ene M'փ@l5oҍfk8PKvPt PKK>(OSGI-OPT/src/java/io/BufferedWriter.javao0xʉT ܶhmhH!]TM;x7b3ۄFU>5a 0}gW\BūڀO!I?s3#zvVa lȊ(4Љ!lYNqŃo4 \+K鍍8vB4RPsl pܵ#ZM=3Xx3dfZ+ zxjcڏAb_*hZ2Nzt݋;%eڰV)5#-u@L)6g9i+#V@mc&a Q:0Rφl͗~pML!Y"M FH-}U䶝SG$bKSiXP=*AAjǵ=VMifC}e~=q.B0[jۀkPUOλuwt{fSxgѱ;>%/SjtT_(Y^r2zʦKw ݼfb|vPKٹsPKK>.OSGI-OPT/src/java/io/ByteArrayInputStream.javaMo0 rJI{rr?+ NW8\IA>qt-`䫗)N"8 cw5C?,LT)#! a9zt[,bq&הX@ tkĪ\>]fy21ץzIؙ6j0ŃA2r(#:`]@0)s!>CX=ӊriM*JE#6ñz,MEbmE_(dڪ$Ry|ǘ8v5gPmQ%>=F39,8L2Ԛ_D7ݿZClPUn/OSGI-OPT/src/java/io/ByteArrayOutputStream.javaTn@=_1[%NB[H4{mvwC{gm@Bƞy͛p加v`|*Eh =N0HSth7Iea"#Rk2=I,@ZMz.`-4A9>EC zmiUէaJs \`iA"2_,CQ)]h>FXWHϷ JŜmA,-rW]ZIR-{JadґL{ȣ6%'-8yx}r3h:Ƴxd U<'c~ ~ [}X?˔z HXZ3ʅLy4,a7hOZ:V3O˵$AU\Q?翞؈Pa`9i.XŖ0Vl'(֬Pe&'j” b1KE| E>Z;ک݁Gx@m#xeG!4;U"V`hTۇ"+tۅ yS''~=.#~It4 |X&S3eK7h˂F*Gv\o | 1=hЧf}$"~ ?PK4ow<PKK>)OSGI-OPT/src/java/io/CharArrayReader.javar0)v|3L3vf2,K$L<{WN|h9׷+^xp Wq>uC4aCƇ fN0RYe [!-Ƀ(y9* \@.j@븭}G,#9fV]au9jMx/tUAc@k8SDXց*Qw[.*,m4:yWM{fO6&`#q;xe}(I&^N`^]Ǜx'V5^]2v&w<"JyD2 s^JU*JP -7X Φ[nCguBϣ>?8_l.j3j #Et5'Ȋע(̳:bӚ?!ki K@+Ytߤ9˨cHe)OSGI-OPT/src/java/io/CharArrayWriter.javan@S8[%Ia1c{[qHw$@Ӵ=wf߱'D;#܁a*AFM?eXpZ4[\"2Aeq Z#H诋 3+`>'P?f`#v"iH ,&ҁTM١MNI+'(]ІDn~sᰮ@4ā6ٰhs"Lg5Qw.Uւ4j$D5h"3H16I ˬuF*w`#@ 0(0\Eˏ%\E8[F g2=kdp)!F<@HudKLd*jMe2E#(lcfBnY/.4<; }[H=jEBR„ƈ:Tktwޫh О/_aUe@5>=6 [aFGi,Ǭ4 362 TUc[&̖7 1M7t>ޝPh%^hl\QYy uFu+Od=GL KN<б뾥ƹtӨGi& {OPK"MfoPKK>1OSGI-OPT/src/java/io/CharConversionException.javaQo0ǯ8SRemK ) Fl6QkBV4@;$.deV3WmPazX|gq:t:ɑ=RB)G5:UR#*9~uR+\ LCd,MfWA; J{tXC:dKThQ%~[/]u#g$}b m뒛l{nUKNZv=AĖY[C[׼Խ^fwL-r70 P%ri rmܥuoUbe_gyi~Y~=qd|=0 qo%>#9CɊ G=H1`dZy^a/_$8_A8Xt[U+kv?=xR{O1z7jcz:#߶A<8KN-]OQ PK#xw3PKK>#OSGI-OPT/src/java/io/Closeable.javaeMo@W|# nnOq[$4qY<-.&VYLDxwIo"6KRd}OBIz!~\%! P`=ITT!3Bg#6Y2,b =I\@iC -,x Ř6?Nsf@Or OB~S㘈8ѶKkKvzzP=:dy05bmAt9u-yR] N~LC[ƴF^u&, j* x8 =l.?e/O=/b@ೱaƤ`B|+3(%ɫnBho\VǀMD^)^aPE SEBzf+|^; ;kj@rjV5wM7PK݉PKK>!OSGI-OPT/src/java/io/Console.javaTn0 =_AfH8]Q ;02s$OE}l)Vt"X${pS]m,b,%*A0fWRގXC斵dQz)۰`x:-t }nrU-/W٠\ #(HAK7G Ps=Ze^bF9֥-U|9PK%AqPKK>#OSGI-OPT/src/java/io/DataInput.javaRMo@=_1Ɏ\DlEl؍5 x]L3=Z&^$ZlǛx[%^ǀ2ʃOrdSr;)BB[K`*sRiDP#ZEA{`2)OSGI-OPT/src/java/io/DataInputStream.javaQo0ǟǧ8ҀX}R tVD`U$5ؙ퐢}$PZj\$5(qE/6RRiMXRҚVu"əB 6/2h[ h}&\}Xȍ7>?3od xͼɘޮ?xQÒdr[G|&!$b#Pj"X5*AAjŵ=VMCIfOy@F|gAٚ\7lA ak D(d+kPz^Ġi yrA¿;[}Ԛ^ tF9|Z $i#,6,tT0T2RMFE?ۻ@&SzD_:Yg2Aj+䲴z%IhI#&ꈮ`TQswrH efe (ҢDHU֒%Zi~zGւmj݆i̎/.}vʋxO.t|{n^:[u8KzzMs>Pu`?Gv\h I`-NԊNoƏPK׶e PKK>$OSGI-OPT/src/java/io/DataOutput.javaRM0=_1ʉ(dDZ(H!jU`` nMm6;&lQ/%`7ϊn68!*D>L&n߰Q0yBcQ9 5hOEHQ|u@22EH$"IטgdM +JyB%Ԩ\۱j[a/(p%NrMJRVUh fXܘ1ys*OSGI-OPT/src/java/io/DataOutputStream.javaOs0S0 ANiN2tzT-P$#N;+ǥMa8 ߾ox SS,J0*$a:E/FC?˰JkthEL+vA3@%¤)OuhFzAq05!2C:ȥB+!5H*:;ێa$X.Bԙn86Mqdl1TG^2cWZs`G--'@T*[DƂ(,ﺱ.LN1td嶦=z67I Nzp9Id!7z7zVkx[u>۔SBn\etQ0{Av'?V3Qr'IPG._hME$8-7R%LXTՔEcÄ:sh!= CMO' o*kSK=fyXerRe/p_E}еR1&OSGI-OPT/src/java/io/EOFException.javamQo0ǯ8SRemK  U}tx#6MHTP-Ⱦ*=Y YM"n)TI^/Y跑N,U!+x{YTS!nEɟ2O2VjpoKt8AikHlt,u ޷#Z/n8gT$x5 n(OSGI-OPT/src/java/io/Externalizable.javaRn@=dGZ㴨Hi<).n,iR9Λ7! J 5;ry i[D^B_#-Ѣ9`1' :YCH(5VBƒpa4-H&nXߥUV޲^h-ޑaͪJeAA9U&j " m;*F ǤHГ<:6骀| OSGI-OPT/src/java/io/File.javaWQ6~b^7{k/r\) zi ɕd8ޕRK~vZ56AFBp&msr0vHc4W x` Q] t#O:ӄQ$ܶ:Pwtq(6*%ۀTb ̸@# \BQ*m"Y'eqJSʡADO<ME'OznDqKy[l=zTVR1kxMI`kP\#YT5\Λ`̮FGrc5v'hFr=1 W]< ~t$OqO;x}Fc荆 O7oRh|dr.#aL\jZG^rՐd/PV8vDkquW)H׃s ()RTG͙87NRGI}A*%q+Y` U.} c!क़5X0kѣcln_y}@)hgh3%\<ŠNP" 4 lsh[chR,L1Uw6fL;UOtOsijF`C3Y:qAgLIt|eo'.؎**фX^+tKrxFU&C*|nNR툟N6U{G*<5{L*Iי8#ʛ W-]>]#;AJaHGTsdʶ*s,%gGpdYSqsO=P@Ǧ"~?*'y< N|~P!(CFt3| LI!)R3WORc/󦠶cI4X~0 tu͠:=jmn[w[7!tSkO$ZnBۋ\vե* m.n__û5+`y^V(>0A/eK i]RPKJPKK>(OSGI-OPT/src/java/io/FileDescriptor.javaM0ͯq to-!壍 aڣq0S!c+h{isHdgޙwT{KCW`&H"%B~8|~aA` @j]AH*!F #>B7:m԰{C`M _$VH4۪֐ߜ[Yyr*^ |kl> M86 4˧ou{Q+t,rū=]IbJ4`,"Ǽ Ktg־ -jӴG.Zm:IiށOIyJ_KxJ$[ ϳILfd5&}@nʆ &v9⍅9[rJZtY4;+ \cE(ڒG]! ?؉(7'褥ʳCFBy!ĿEr+Vj␾$bj_8G=53Tkqrޝ >]LO$\xeByvBQqZհap_PKX  PKK>$OSGI-OPT/src/java/io/FileFilter.javaeQo0ǯ8SRQV)hB۳Mh4:aR!}|s^EJc^/)Hd}/ c ~Z$a۠tؒ#{&a`(kR ! 'dFVb|'VIlZ-nI8theOךTLh9K +/X.xQV'|Nqq&NucZ]O'` -W\ Sբb^k^J/U֏RiVV?F.c D^py|usf._l.)OSGI-OPT/src/java/io/FileInputStream.javaMs0jhnmN.3I39 y1Id8-i&>JEpmʭ"BT %!Aa2,ѡcB$a*Ђ"$FH~u!|GH+8 .\a'!k Ux+x RL֐߶}:@7^{ 6 |>[ͧѨiXı:e:e=SwUWB⯚,O>0L%ŚY+р J:P7'yuZu\&*XdMUx5$oi6eo 0&;9>"96$y4U֢D(ݑ 2 n=+4E3{LfAV|2ϽEc^pi.zSv<`:!i?׌9kXwpogWc?e {MJTDœ?Hm\q rmq%o?bVD /kPKE@PKK>/OSGI-OPT/src/java/io/FileNotFoundException.javaRn@<dGڜcHix.V[LDT7o<WXldw3iP%az=_ckdTEIdIRNUd%Jd SSu8CisHlt*u >^0gdJ8r iFów}GbPiSkt̊{V=vݫ_4x{hYU)= qi7IUzzaT:#{ڋF IR -&izt5!Yl. k,6ݤyƧ6qdv>oPKZi-PKK>*OSGI-OPT/src/java/io/FileOutputStream.javaMs0d2Ԑڜ\>ZO3 &(Ũ+84qZ ʹ ϻ+8vFk!CK)ht>~׏cL shXDEGeZhq" "Az]׿;]Æ@iEVB"ʁPmNœmQ:ND`n?ka4k#mʡU2-QwUJ`{- 9^UDْX%k@`A9#P^2Έe펆HhlLA/!{!Γ|Enŧz7|dC6qNEtA$ id*or## X NTY[4Af#_%H3_0h߼WeЗAU/i%#<]Udv 7]i]ef'_J>j7D:mo:iAt:܈:ԯ*~GkTբW]1)~`L$ɎJqE |͔BivJt̠UKyyvMɟx^n=7Cpj!PK&WPKK>(OSGI-OPT/src/java/io/FilePermission.javauAs03ԐZN.!ey1JJ2we cKo~o`fR 8f2=?WZXE""or/8*Ԫ@nW_w3h n `] ©lJ;-_8VUit.:;FrFB`n窯q4k#mʱ3QwUJ`o- %*,'VXiԍNrV] zBXgD^)z_@cc qI6oqd#o~+xxJKd zx?FF}2>a ?!C$OSGI-OPT/src/java/io/FileReader.javaŒMo0 r zr+NWȌ͑4Ibmm>XCRUW0WdDwY &9Bx=~CJhX'MnGiNh28-c$hP)^0Ch-N;T:!,D!z<'Cm#9 vB`n>{4>agD&mMozu+[ ꄡ'`8kzPXcbNy'dU;3ަܛ]j0*ȫ |Ϊ]]VYɗKEV-/1 6B|SNp*M6kuD#"hZM+1w>.( OoY",ݖeĵ3CYۋ0ɥ\ èx ލ_?#3ӈ _|Pnqy~^i#؎j ?$@vm{f,d> 䊲hO7ZnvY&d?PKBQ*QPKK>$OSGI-OPT/src/java/io/FileWriter.java͒n0)<ف*;LB iZf+*IY1{.-IhAO"`jUc(Gȋ iU)%ax6QJ9{Z'L$hFo i-$/}$7Nda `t,NG=FUT{( ivu*=ӻf_yy)=z_۶Mđ81W֍l^3uZW,lWX1k%Z QZ7+]pf[a)جVhOKMh Y1Ȋ8d/7bΗ٬@4_d,_E ;tWېcPή(^!lLjj$Fj5ٝrR;?WxhE\؋DnV\@J0%KvDI䍯_xKbKw{'}8^Ɉ)i|v0k8O5GVXG>vLKyv9WH1VT} '=@WG,a0^osb=D#PK&PKK>(OSGI-OPT/src/java/io/FilenameFilter.javaeAo0 x))<;mKXqG٦mIr`x@`AQU+9Y=DR0Y.c" alCÖ#5 +Yr`P Y=!3e:񃬓Z&Ybflq$NzA5C+{d{41gD./.}W\dQ,厫aZTڋBt@=Zb8QX 2tjLȭM`ۄ,+3|ʼSy)nbKlXm|o #+=/b[ЋƔQChe+knMu>U كta ˃ŸC.J}~HP' =]!>TZ&:+OSGI-OPT/src/java/io/FilterInputStream.javamAo@q4KHk52&r\LkvcG"J|;o~M7032 ,iӐ%v22yaAaX=V !O_otx h,:6 G jD@J=ZG=ӻx=̚ȕ4XYm>?[f-Iՙ86N'lBw=Zr2 UڨU;@9bp<;Z&WFZ ) Ȋq0yV?+xJ4_eK-l-rYC?ï,JdrX&L q^n 7sAKP)U5BmLݎ|V/UihGnpPE`GULfv-B(ầeڶ\CbF]W}|];F3e#𣦽r{#rd"g+(nN)PK[ePKK>,OSGI-OPT/src/java/io/FilterOutputStream.javamn0 S9%Efgm9yi+l NW،͑4}Qh}!Ϗ.`aQcW(oiےr64Y?Op Bu,*ktxZUoL':OFe\:ش'V|:zW(Dw0*&3lB*ẦێKv̨k >F3UԻ \D"o&M_P}MA;ghY<=%9zPK$4hPKK>&OSGI-OPT/src/java/io/FilterReader.javan0 S9%礹m9yi+b NW8IAw]-5-U;C9L5 %2~%V!  +Ш-BjOZGZ40$ `4 G^AiC [A@ ޛ%*{ mA{vޛq۶mq}ulXLWݪxsaJ ֢mAT9un-yRU No}+,i=3P0H Ȋ|J]߮.]:[`/u/yw f˫G}1)@|'$gPҖ$[SU#*J*v\ SӞ?Bq ҳ4 [҃^SѮPGU皤?~=071RMA sT2v8ۿͳ|p襆!ʡ G'w|YM#h7VdOQPKdPKK>&OSGI-OPT/src/java/io/FilterWriter.javar0)v| oOqZ3cz2X@-F$L<{WvzH_lt,:jQ|>4( nZgncظL4XD`][[#Ċq6B0gໄLN(;س#Bg4R4QY-pW#Z/l=38x5dn3*P+zxjk(>dq(u5\%:[%m:ΏQqkzXbV:^ +*#K3Njw´Fj#OSGI-OPT/src/java/io/Flushable.javaeMo@W|#nnOqZ$4qŻĪ;@;<.UWUl,7I ay^_VWZأEs:b/@J5 FCH3gBƒpa sjx( "kz|P; :m$MsfOϳ*r OBn95qD)vkeւ?޸鮀|!OSGI-OPT/src/java/io/IOError.javaeAo0 x))2;mKXaqGŦmmIrܠxX CG2p6'+c^-P_%ҾBUja >?.6(!ɊwԈSfd M&X8Ai{HFzxHJ̄6JߝL.{r ߚB?A{)Iqř8ֶM%wzL=W=9Ki 0U%ڋB8uRK8QX 6t /#Zc DV9-rLݷ~tM])Ql.l9߾ =o ס'cC)8/[DI$g5%HVqG0d҅:M/ W(DW0)"&2Þ̕kujwQ%rOϋ8 Z/^PK/PKK>%OSGI-OPT/src/java/io/IOException.javaAo@WB4LU5֢6!9;#TU7M)3rݺ2rP%9|OI7yLW_+<&eyEvEƧH'|K#:th1iȉ.6d*FܚZQ*'#4dvZ,M-w _ї/7!"6h5E-+]TiOJŞwCYxg௡7'{aXV[~'/APKk&PKK>%OSGI-OPT/src/java/io/InputStream.javaA0ͯqUؽRQW UՃ ű]!Rh[03oUW0Qzgxv0OqL:~5߰hlHjYF5駫JM4ou`%v@*EV\ SJwh wvOIPch@9z8l&b-qL9^;K&Y:}IԽh-ZsC0MT9ˈUVS1qY`5̠)ug;#Y?oؘ^BM&iE"-i Ldg#|Hf! EF{I0x"^ jdM5+JE#h4X-^F;ڿ~ rx/l"Ɓ3 XFY k:jIBIw&BYlC/:pSK4Ʌ[PK+u0$U 2Zf*f6}~hpQϔHG[Zke[`ńsSF^|_o۳O;g;:sק͗n&W(vu}z)WPKRPKK>+OSGI-OPT/src/java/io/InputStreamReader.javaM0ͯq 4aRmU"jU`! k;dj{!lAT6|;;Nt L:h^m-9?na°phP IQE+gp)`w>5NA6cBc4 @e (Nh-nNHאk˨Qy!0CwZ6ڶ YGJ]EDwtDwDƀ x}`kbY R4RJGjn0rc[ɔX׍XډژAC]'yDlxe2![4Kg2Rzqth>*&w<"yD2 YU*JQ r wK'Sv+_nPyN۳ˉ5-W"Tcsʎآ(ͩ>Oޫ?e`hO %v)|;${ZV4JIM6,pقRŖi6=ם!ӊ#+Ivjuv|6ZhzrDž+}km^}䤟='PKaXFPKK>0OSGI-OPT/src/java/io/InterruptedIOException.javaRn@<dG.>QmQ#(5y=}mqo6qM9 VYzl,'đzlw2EDo$T,ɶTJlM՝ >Q-~EA9D?QR/q(ȘeIvztJ^֞w#T7nPb"*g5 !9/YAPKNPKK>/OSGI-OPT/src/java/io/InvalidClassException.javar0)v|3ZL30cfrbJؓɻgIs i].`шz`g?$M#ӫ2zE^iaɍ(-V B 7+hS/l-A*EAG@H#Z/n3x=T%h:m_ zxvq}H:nNZߤUV>u+ 턡#0MTڰVS7 Y`̠uF{3Fj$Lbߒ"-Born~K$ۤ5,:ݤyFd+ͮC@6~-BaNHV#[5YwF@ikXyF17\ A@s؞EB-ݕ4@ #TY#?ee_r|@ gUky4u0?ͻg{f3x'HfxBחS<PKPKK>0OSGI-OPT/src/java/io/InvalidObjectException.javamQo0ǯ8SRemM )h#6MHTPȾ"=Y YC"n)TI^._Y跱J5Y2Bv&$eB*2p;B܊?ced S/[t8Ai{Hlt,u ޷#Z/n8gt$x=t7ھBzxvεߢP ġ6uԜ6M4_}fN5d- eRڈ@Ԇ洧tRsXu0m*iE 핑؄$Α\yϽ}mpqIV95Yzl,w~%#s1C3m[Yr4Uw&@Fq"dk XyFn/?( o("*h̕hdTp#Uצ\ϝ!z >fLv%V b'<#xPKsPKK>/OSGI-OPT/src/java/io/LineNumberInputStream.javamAo@xin- iFF¤Q=mͮA(ठ[(7YmEyM"k)TA^M&0Xxł,;x{YTU% !iD2O2Vjh zn{(Zbi5 jBMI9]< zr>υ>>/qu]$đ6U\6OofY>}׃ZJÉW{ bZt25=ug!oSJ\bi\k $G5|Mbdtc*OSGI-OPT/src/java/io/LineNumberReader.javaAs0Wd(&>'mfqQ'ޕC$= ۷aaZX_%ҶBEG0XyŊ,=U1;xYTW-!Dɟ1+E`14 {J;CZԲ%CIT(鶧:'7N\pBǧЧg\y6!'Xf>i&[\GnUK^xs蘪fmm CsSF:VnM%3rӻWC{f_ xlBaȊ ."+"or-o׸KW4_g+,UΖ9 =˯"Cg|)8BlGeɭ {2;BGf'_e۴r'pfAs~]lsHEyېYNTee_ģÏ1m9cTIBgpշm$wFfmrLCv0zreJ:VM|18PKn%PKK>,OSGI-OPT/src/java/io/NotActiveException.java}Qo0ǯ8SRemK "RHWј6QkBV~"=YU=ru]!m%$L/Os,Æ#U1;%I;,Bg<Ye4&dv,NAG=N5zz( i+.)`WB?BK}86N%7rL=Vꆜ?F-3<S !d!QXEPKh.PKK>2OSGI-OPT/src/java/io/NotSerializableException.javao0Ɵ_qSRemK )h̅\Gl6!YgBV4@I."6'KTΠ(mKBIba861;Щ-Bjx2hiA0&`q 9drR ތh=gt $p?z .0ھ#7X ıMҞ.ɖ\gVXՑ a*)*fmEڂh,ׁI5spz{a1伥o_ xlB$-!+'9-rLͷvwzlUBe_gygG}hlHyE( l%TӉA'1`lZړ~+WhDg0zLWArK$ZFn?9xjRJ_zbGe4#%OSGI-OPT/src/java/io/ObjectInput.javaRn@=dGZHiU=,0Mvw1{g1iUr7o޼!R4i8x6^@ahP ZQE+3R,Fh2wŽ@H A* SPȝun>S-#8Egk]WH]k›xJ;R=T݊?ZiL夵aH HwV:՝斋#+1ji/iS l,|Gro>(ī 5,do45D=|HQ|RM@2EHQQX4[V#rZDPqk5$t4 qlc.(<== {@ʢm7P%Ei^Yvy.(xBʹ^q3.P4ҜE:Zg\~;왞GFwhvϺGzcW>V.fL"M7k~z/PK0 NPKK>+OSGI-OPT/src/java/io/ObjectInputStream.javaWs8~N^d8ysW I\n0isw^@| a:߻ 1շ~Zu +⳹/C'8wj}zհad=5PZb  rCHD e:|Dphg.3UBe ! $ k p\7s'CLs!'; 1}lVsR͚QꫛXgDZ(XL6![Tf feRp1Sb -LȵQ|=6)\v|>Sg4 [#?з; >ßAHQ|̀hr+gz#Qʔ1SPjbL.Q bT j"Z/a=:jjW -Yv-N&$ #^ L_ĉB E7ͦ fgD0["-؄TgɸGs1 s̻o;vDB$ +`XLH%WI)ص!ќFvZQ`TWeb/EtQ|IfS*\[sHDWe^ȷJ@=0JPzsy =s,a?pw=h6]_ۮzc#Ô:ΌH(L~mȞ[U 8'FoRc;Am [6iw|.MK\ g+OC &fKGpNtӝ;XZtnd':K|v(߉;\0&r\.P|\݋V(Z;PKpZPKK>/OSGI-OPT/src/java/io/ObjectInputValidation.javaeAo@W|#nnOq[$$qOwUw@7oCZA^|'H7em{=Z4g#v&TXC/k4Jh,) 7^K[\T'qك,4!kIIhgv$<{ >yռp3_xHđ2mMZߧ]V쮙z> ; fJډSz0H!XոA65Yg݇yMHX$n"-Bo~xJ$;=l.=yƫod3B@6~$tP ~@hԄd5VPţɶ-Bh$O͉VˀDNq뿹|88_EEDj9+|yKݣ O鬨󴅓jF /J娘ʻoPK&OSGI-OPT/src/java/io/ObjectOutput.javaA0WrJV){ksٴE]]ј̖خmFU{DŽUwU*=oy& 6ڜ-sLv %׫ջ%"۰ J;thOXLnIrXCj?Se : ̃`6fu8 J{9hC')h&a3xۖP`S7>+r^}4Y~ȸ>&`L q^nJW 9,OSGI-OPT/src/java/io/ObjectOutputStream.javaVQs8~b'O&]n\=&飐נVH>I0[L M0-}~էUWڈA0ГR0Ͷ c?-%mb$wCb4qW_4Vh]ry):[2!,$B"#ԁP"-qJzMgH-NJܹNgZYͬ#sooD+ւ2ah5Tq6%@`34W2 5kՉ[1&1^6i 6A]§^F-ON>'{Ixh pNѐn7 A RFq15~$StUqOB I6E.iijL/(ZhZ{)1:Xi4(=7dmi6tߐQE [d*@{o/\eBz@IcqQ^763J9_2w+P~f[Є-vE =ȃԵ)ْnvC6h>g>:֙ߪՇ uXz \3S%+#93xzz)?e08ԕAT&C=Z UA}T "-ZW+OSGI-OPT/src/java/io/ObjectStreamClass.javaT]o0}*OIA-K )ilU&MժsupLTռ\YgHB!8Bhj~34]9}bp$'_: a>Wcd ddyMF3N&QRu?E͙[ӯC%`6ȿ8yNx}}7AB斸rw?8q@XqcDw̴L0=JjO 5>jkhzC/OSGI-OPT/src/java/io/ObjectStreamConstants.javaUr@}ӧ֡PjLJ ]lKf $.Etw8*assnO[(9_8NO W,"5B u'T"LEVT(0 nSߴPZ9838ɥ+X 䅁!5d&@|KEi@˲fQSX'p[kΑP>MW1nw^wxSy7bu7=Rrk8τ֠וTXdDW)׌PJ;SXk%m̬Vf*Qr2By06ÑKGwOVg1k7ݐBQwo o 02\G|+mJ綋@x`aVl-Rr&S,-\*NJj)mFS+ɥ4T.m0/V3Y\ĬP3ݍ&EjQ/=2<ǩzR#g2hPEQȋ#) . Cl% >$~&xhMh0nrA%d:IGep (b{{>uz΋0s^wC<~ &p! kg8xZ;_eS?iV2/fۗ{T]a(Փz,:+p,+sC*cv;g6p Ȉm{s5m8z~G{(8տx);M%1 ,5eJ*+ξͽCIld nPǏu3l~PK`Ŵ"7PKK>/OSGI-OPT/src/java/io/ObjectStreamException.javaQo0ǯ8SRemK )h qGgШuBV4@;$.hUBڶJt0\,>8lc:Y!(I}WR#$?:;\ LCd,MfWA{rت@ ތh9J +/]u#O{)Iaʼn8ֶIsKn*/WzZr~ʲaJY[1@[׼ԃU^uNo ,Z9oU70 0IKd2+A.|+n7K4d"6Y ߳zz468`L<"J7[}Fr*ֺ ;!W.\c:ȴj𧭿|(qW+bBzV0`Q=$?ze8Ί?蝱 OxNr̕ b~PK <PKK>+OSGI-OPT/src/java/io/ObjectStreamField.javaQO0_qRԥ Ĕآdj^&5Kv*46xYZ>Ca*€!p˒3"Ǔг0J 3Ԩy`MxBcPY 5K?TK\+GትX*! 4Ƀky)TVur.n{FrF5]!0Cw1m[uĞTŸh*^{EZ W4qVUb-Y R+ҙUpQ@ܴLɸ6' mH (6&`A<&7kt=6ypC4i iu ~x ߂|HQ0ss#!rkLySM + D%h"QU\kYW0m6;ݱ%/OSGI-OPT/src/java/io/OptionalDataException.javamRn@=dG.9QmQ##Q2M.L(YZ f߼y&\vGT /jHVQӫsYʰ HTHn"㩂TwiJ>~/ah2G`,CI8ZcwA4gd J~%Q:_y}zvݧ$!Ɠغ&i_>uz/Ǯ[ӒW8.RXq$gli֦5(TڳeoB;kd>EV]n.l6[o`6=|9D&ss!Η-BAFBm_$k!h쁜GБkE`hZ׌|*+ JHrQח EWޅnlȸ:>\zd2?y@ vUZےFSԆ%.Ԝ> Mgϐ\@C-(ĮW )Håk*KJE5-ԫ.1EPKeM xPKK>&OSGI-OPT/src/java/io/OutputStream.javaQo0ǟǧ8)ytC@ jڃlU=%wgW\J{4A|5g"C.kamL Ԩv{`MxBcQe#.|C0 14-^vа=iH\Ck|ʰ5diGj3Xx=dj3*Nzx*cڏbOүڿ W(Y'Qu/j=2kz XbFZ^qE邖BksmO;s6?i  >I!~l6A XM VD5n\@VqN3Bt/xFc%B)wu-k{skSfl!qhοOcKR ZffwLbf@]QjN=n֝xvލ6< c;sF>1_0^^Zk [58傖Le,OSGI-OPT/src/java/io/OutputStreamWriter.java]@8ljaS*ڸ x12ZfK6L*F#=y;*+HuмZ>d;I]s& p4^G@WA2&/r KpD v(VХDR(B z]{tc҂3Hx_r:m;S$piȵeTΨAZz0h&f-q,u5fpN|qMQlM5k@j`FY-UFnl4z3Ӟi %9y$yG^d.g<-i&&]ٌB2&$h+7 L<"gyD2 &**JQ 7X ^;nmC{A z/lb.ǁrk2Wr6nEֵEi.:/{Z#w"}QRtvSQȒ K?.(Wl6hQŀ%4^fgljgsaya}4ZWgoCԧݪ\~7-c<PK6H-PKK>*OSGI-OPT/src/java/io/PipedInputStream.java]o0ɯ8U;BqNRCjiVMPD9ykyt LQ􃀨6ޯWZXE<$/r!8J92GnieJY8/u`%v ہTj!,BځFwhpvNIPcTΨA_qXuvN YK*S}]<$RVh-U Cg;`8ˈb (4H9&+hg)$K&x's{>! YFsFa o!E|P=E!8&˚ڢh4aZ̽L%61׆|~- @#ИR.uنޗ6!6B xx1_fNg&oEQƷ $jc{ֿ);w+l߲M$ۭjHfW9COV34=u#]m$'m9H9-X~d]PK\P PKK>+OSGI-OPT/src/java/io/PipedOutputStream.javan0 S9%Efgm=yi+!NWȌ͑4I}R6(0 6$fr̵9XrE mJ"/gSIa!ܐD専VUhoR#$~u\3h&W[؉(u`C >H4H;3u}%^\pg$]Ţ'uM6_=SYA⟖,w>0L%ŚYс j:PweVN]Vܮ.].|-J(0/l9@,ȸ>:`L > >F7 <Epr#zq ;0KݬXx]S ?s˰98&-)PK:U)QPKK>%OSGI-OPT/src/java/io/PipedReader.javaOs0St94)A7$tY9NI CGzV<8jZa׵`#yt52dNi CzEHJp hel7c j#px,-ۃTZ! lD BWf@넭>#C-#96B`vuu]8TDWlD=T][)z!*ZVj=u FgScXЎT@ccFqI>7q3Y%%,e2al^&d[ m]nSFL\lhlYPjIA!b+,/\hߜWcPSi4@5#"CVeapX^ %'b wpŽ$ڊJlU!Yr;% 2?WFIw7Ǭ)+?yC&SPK"PKK>%OSGI-OPT/src/java/io/PipedWriter.javaߏ@ǟ寘^z 5г0*]wrwg)VM.Ώ|fƒ K׼n,;qr& j6 ޯ3C" dhP I:Q Ċ=|Bmpw5^;` ipo@e (Vh=PgTq$p?jȍe(Aѭ: fGiU ġubMtixIc֝h:)*؆X[փjQ[.l4:gC;2R46&`xI8uz[:β8]%̗MJ)BÇ$ idTv&w%OSGI-OPT/src/java/io/PrintStream.javaVMo@=_1 "$9T46Yv5E5&W&*>v߾y3rck'`(B {mEWkku['+ 2D3emsTPKbZB PKK>%OSGI-OPT/src/java/io/PrintWriter.javaVn@=kHnmN4!-jNEU=M]ww AQƀ$$x޾yyDp棱z؀~C[dP?o<ߟ{ 40@zO 䆇( F51B;a!+Dmp'yq(* TR \ s.!T$6vYx923:Чfss9|)5k7N/|$;)'&΁%*dC* 6H5ˑFv4:0-5E$'tϑwon={N\{WnG{ޕHQ|Ndrg!@ܐ$`chrHMQKnܵ9'2=g.רYOME-Id K{OeZ-,~!b٪^PyX/q.SS[ l*=e ds}WF-Q~@Gj}UN4I:2T$$3 H[ p!7bN[+&}k\(&v %U6d*V9䒈Yzl=MN+7|ht0^dz _UepW!ovI[o\$Ul$\7*dwHi}g'fv""B1|9@ջ[؞*zc/ ˦{fefG7NL$F]Ѳt0N(B cE-W WnV6wA[ܗIgPUt>PƔsjPK >UD PKK>-OSGI-OPT/src/java/io/PushbackInputStream.javaOo@S͛z'=\cH?JU% t~FaˠtX#"b`r%sR Ԫ !FvFJIpM0~N^؊=tXˊ@w97m%Й,`x>B}6ޛq4h#mquкUr>LE]_\q0LY+@[y+TN}#,B:oeVgM{dҏ6ЏS$i4IG&Y}Z\p/|R,8_/U-(OSGI-OPT/src/java/io/PushbackReader.javaAo@x5$KHk5 FQbf] ,&Hy͌=pFC7aR We| k̽bN̆ɭLIYP \A*񙌕Z*6鍼VX-v-Xɒ@)UR!Ek+.^:r Vυ>\siPCmAym^F6eΚvbҟ mB%EI}0[>ϣ"$1ME<u-s2Ɣ)"!:CX#(+ri*ENPYKj06\K'uA}U"-s}mdŜDvu2{7td.xguOVfv53w 썰 <[W/shGnXmF7OUƳ&0_Z~PKCPKK>*OSGI-OPT/src/java/io/RandomAccessFile.javaߓ0ǟع9 ޛ¡o>v[Ⅴ&)Iy8 <@f?lh |yЎa3#/zW灛[i` rc(d~7p%"A-8^_:FdBa@1%jW.>)/C- rzJ.f+6yŁYWkM:\? XNb6'Ai`FzgSruԮFI (h[6&A~FOnf?dz*01=?H!}W$pYTL1OyLɬ`BV%y9%7.&#[fԞ_nnEqul.[y1B,I-qL"G.N%.QRU@(.!,yaOM KspzVmooWVL*7((M:'OZ ʎyklC>+#EgNۤ\2Q,^0)Qݠ| m5$U-YqyT5-!FX(ҢIs.%u7~?g]܏.͕Hmt7e -i4hCu= n='%pڱ~XWTKiPLȍ}?E`JjP+m [#^sY7{?DFG䘅ҥ͛(/ g OSGI-OPT/src/java/io/Reader.javaSn0}^⊧Pem)lVUմ'`{C{CJn<>sϵ'X҂!Is3#gi2 .BRp"UQͣC!lr[*7Xb[K}F^>[QA̡gQAh[ZW-5O8%wd >t|?_qP$(C=Mb(Yr׭ȱ9?KPKjdNPKK>0OSGI-OPT/src/java/io/SerializablePermission.javaAs0Wd(8>'mfp8(ʦg^Z0hw~)9 pnFqb^|HF Uy~ cX%*f/r#KR*t"!(3T"|%cV'PS/b:K!-ֲ!CIT(z6='WNp֧n><I},ı6u{mrͮ-SS!kaG' ;^!Z*ŊYCלԽN:k C^ܳ~3M(Y1eZdEEwb|<ʖ<H{|đzhwyEDd[*ZlM՝ ޑQ-Z-V^[;%A9BNRO[q|J4(t)ӧw*{Tv>V']Aua 섙#lǦ/Bi"NZfy _PK^PKK>2OSGI-OPT/src/java/io/StreamCorruptedException.javaQo0ǯ8SRemK "RHW qGl6QkBV4@=;$.deV3iJ*r0?ⰍMP:lȑ=RC0)G5:UR#*'s Vd<̮Iw8tɖ@PzC%~Х,\`x{-#7X ıMҞ.ɖXgV, 0U%JfmEm!K|uR5s8lj鼕e 텑؄$-|Nlm}]٤6[Xo\6[4,xd܇ Sqo>#9CɊ G=H1`lZy^a\QE)OSGI-OPT/src/java/io/StreamTokenizer.javaTn@=q2HO-ɆF9U=ۘ]gwQH{on7kЄ׊''j8ʡet-džk!H jTK]b$N-GZrB_,f%t 8V{*sX °1M+ e>^a_ʔt?r))ZPK \PKK>1OSGI-OPT/src/java/io/StringBufferInputStream.javaRKo@>_1ɶ\prk| yEl8< .&VYGQT;60Kwa>E k2GN'Q˰H KhXIn(GiFhb-r DcII8 0Afb؈H報dsHB6֒[w:=w=ʜ`w1Mw9}Emۆs*SEkz^f[Y`oCg;]"chAA9]jV=MAfhcq I:8M҉'KV+xJSX,r1JVbλG2X &q"o,joj̩ɪBh$'fCV OSӆp]]./[x \ :^3zixҐׂ<Y]4e&q\@eaq)r{W=dC-j{W^$LGr֓1ji5FtoPLY)M*N^V**auZo@zح 'yPKc@OPKK>&OSGI-OPT/src/java/io/StringReader.javaen@)F>ሂ[u5 FQxZKwʻwQ92Ͽnt ,U{T, A4$dga0Ni GUJ+d!nEɟ1wԆy8 &cj2]8`/ {-5\bk$jߎh=ݰHiP+X.ggm1@*]GYkdJ{dƀ?ixs2U)6ڈQkUdIl*2VӦoȭ_ xlB$. )&)."p&k8t rXf]N>C>$ yd>uy>E( lɴXҖJnM֝ju@-#hQɸc5 X9dB6<ZxmB*mY(֢̫4'Xs a8= ^RpPTNʠ?d. OUT~ϡ6SHSn-l%lyPKGG/ePKK>&OSGI-OPT/src/java/io/StringWriter.java0S8* ZNYQWD"lѪ$mS!q@iT!o{xLdU< {~Qp&bht= < sa=QhL *09_ Pi.x#ۄ^ Vb++X-iH\C |4r]vh57yӧS$iȕaΨ8頛_nLv8c 'U6,\=&Y4}M]Ճ(PkP&^mDe )f7\d.h)2 FUeNL;0 d#QVd,> X?[9L]}ٝ HQ|*0EOR"cFY2LnP JTkjLL0,2m4t6rՊ `"[i AC-W]qv;6Lr']iCk?ΙzQh*%@TE1_71k7!N ڣ]&~~C .5k&WirN+g&-*N"7X-mi/+[t)?dΦ |Bq~PKwj#HJPKK>-OSGI-OPT/src/java/io/SyncFailedException.javamAo@W|/6O4d"6YiY~=e܇ 0 vNJdţ G'!{.1`dZy^ꟹB$A8Xt[6U+0OSGI-OPT/src/java/io/UTFDataFormatException.javaO0S<唬RHO)$]с qKljh߽cªjr3{D7n00.&/q]K v60?NBX%s2d/r/ RJ$w č(3TNJp0 4ynq(Zb i55Rf@; *9^_7B5Pġ6UT_{mt̗i|Vd- jaǻ DT1k-:hQӞ3IUMau)uFZ&Fc 8G9Γ|ElC^&Y֘g"$Yʫߒt1qd|0q^o9"ن [SU+*BOd;BC(VˀQ:| z$Bq(j\j!Xisn߽oHe(L? Oxzio39zwf6>oPKo0PKK>6OSGI-OPT/src/java/io/UnsupportedEncodingException.javaQo0_qT,a}QE>۳{ jҴ<$߹Nr smNV6;q5AQ~HV U׳ه)qm,aIɝH9ѩ,QgL񃬓Z:a4'(9b鰕-Pzw>K 7^\ëk!{)Iř8ֶIڋ%w|L=Zߝxs0LU %y{+TNo}/,Z:oo_ xlBa>eVN}VWO4_e"VY ߳v q:0 "J7[}Ar*GSM'Bd'!.\c:شr/筿rFI bo"mxZ\k:c U-@{Ihjѻ_ Ӟۄqɗ(zPK[RBPKK>/OSGI-OPT/src/java/io/WriteAbortedException.javamAs0Wdg(8>Qmf`8(ĂbI'&u2 i>}oE|,>L ⇀maz3_@/o+-Ѣ9`7 :YCH4+!Fcpa4-Iug'Ag OSGI-OPT/src/java/io/Writer.javaQo0ǟOq ,оm8. ,K$G蟍F>Aa" Ѡ^c j[ v|%,A`$6ۀTj! ,E+ BWCk-<#NCQ8}-} ka4ka5h2%Dݝ%Bt"*Rb-YJ5ҞU `6LɄZ}QgF~@eczaQ҃oa%?\y8[D9Ly}]@8Qs@•s{ @X-dM5rF-TW¸k59Re]z%z ݲ5 {URdq dxMu-$PRuI z6 ªB}]=qzKKP*~7>+5ӣ]3Z烵0}^0EBf*m)y { 'ԛ?*},ZwBoy8zvϚQS=*{ޣ=PK;8c PKIG@OSGI-OPT/src/java/lang/PKPKK>/OSGI-OPT/src/java/lang/AbstractMethodError.java}Qo0ɯ8S; #isR;Nj &yHdss";ZU7S9úZŻ9~mlaC쁪ɍUuE!ON)q/0 x4]Gh;bS-$uJC}7 7>K aJ/X.Ч$0D['Y뒛lʋ[nuKү^YN\!:dV 0g*t=3;?KR[U0rИbi`rmoK74f :fWsCgCTa[DA agH#vJr4]&@Vs"tdʅku XVW("`CDl/y`BoS5ړsM;p+2-ަ1z3Zl:#_s]uOQPKqaH"<PKK>1OSGI-OPT/src/java/lang/AbstractStringBuilder.javaQ6˯ع r}jɐk d0i&AF\Il&!ܙi+J o;p nAf/$Lݻu6JjFp@ y !d"Df,\ knʮ޽Ele+! d5DNI!}HBJoQU)?Kcҟf3`aR;yzߓե;֠+Uքm@*`B3ZQpAlB 69rFzU8 ]:{|L9Lf7Mgp7wH.q)Uvd&, ,L)<MMbF%hFZqmêb↙d^vaC~ۂ>5X}4[F9G.8%Ysq^u):_i,(DhʧwiSj# HLz"m2%@dIr/E2XHfZbq)A5>xks}+gQmm_)Cڇ]eLdo%eY"n݊ܨ*'2_9zuQ2j#Lg"lNmR>4uॱ)F'~[KհLd15F?Cl+4@|UTU5rx@U쾄JmaA0weUhs 9dЇ{vUTjeCڹZ:dcPfXn"f܄0MXPWWK$ {颀9yTpc}Ul:wM_n6dz4xEE Ut KQY`\BjcV)Oy3 !F,K N-}tPKPKK>&OSGI-OPT/src/java/lang/Appendable.javar0)v|3ZL30N39bXR%aݻ4u&3o*+(}2i򋀤aZ.C"PL Z4G""xȭ(-V !ьoJ*Z'̦lN "1ZtQ;:I \;֙(^ j; yE(IYE-8&5:h4aZXyL'17n|A?ؑEt' -f?={ʌ.882\P){ v|:$f:lC#{;j[J/PKgxPKK>/OSGI-OPT/src/java/lang/ArithmeticException.java}Qo0ǯ8SR1نV U}tx&${0զ}=& pF;i9ê*4$L!qm^i%*bor'KR*"#$(3AJp1x4xъ#v-ʆ@:Pv>'7N\pAǫk!OιSqM7g2+zW Y C{ixcRl Ӟz0IUzaT:#7{Fc @ZL9)"&~$ϓl. r,VmNW =nCG}?cJQA3[YhEMБij6l\Q/oSEmop(d kryz&{dKSnt'<㿒w|{acsPKeg0PKK>:OSGI-OPT/src/java/lang/ArrayIndexOutOfBoundsException.javan0T,azlV%ziIlv2jڴq?s"n9Xl<EI"m[)TE_fII9;ZL;YrFd7Ԉ)uR+\3C`4l&Wq=:G̐l xHJo͠K93P ^yq C}qmKy^߲PuZr~trǫaJص=h,KLt{a)`y+W5_y&Fi:-r sqCX2()l9}D?KNA<2>ƆXSqn%+ZJֲTӉYJձ:`Z^o}(9ob'‽Lj֊CE}ǯ |A /Oћwx'<_Ry석_ՋpW;C/OSGI-OPT/src/java/lang/ArrayStoreException.java}Qo0_qT,a}QEU}4%x g;T2j=8U+̵9Zl=DڶR0>L8lJ=1NVTM~KH3L񃬓Z:ah4 G(9btȖ@T z鷧>%8k/X.js)ӳ|Jcqrk$Y뒻l{v=Tݫߝ<aU%=h,uoV;&?yK&FisZf4@շ iQ*[X/l-s^}A?{NAa)C[DIF-9CȊGSM'BdOCv']ViNzO[%Q9 b/‽LQ֊c鵥oCOv5q)/w݀`<_+y9^PKvzZ0PKK>*OSGI-OPT/src/java/lang/AssertionError.javaQo0ǯ8SRemK RHW#6MhT:ajiky]\{#ø ;JM#*8 6V^i"KfGeF,TInC[QgL񃌕Z2a4\y{(YbiQɆ@Rv@\< ;r -S!ƹS}qM5Gnb-3u~ueBڈ@Ԇ洧tRSX]^6ȼsgaOPlqdSorkūU\' tytɫ/, ϡ S8 G$R!+YhDMВJ2`mN_s z .Q4bX=#Uyx m U0 3ԝׅU{N͹.{"xsuC(7PKOdPKK>#OSGI-OPT/src/java/lang/Boolean.javaQo0ǟOq *X6I)[ & ؙҊ3G,3ry1Z0JqLfnCm;1 Dpk48JNQ!D%Opp%dXZ25/:8'pjb7~f֖:Cv*]tFk:q0Lɵ*XI26!ՠ4B#Y\ך[.6ۚit)7VIeH mLB#J Np%qv8>I.a?^i< =m@jR &w"$rdJx3*M+ @-"(QϹqjasz.-X谽&Bod R$Qح Ԝ Za>nnsS q>38RUt zꭘt|Oq˷CHPiy i+[0mQ d{俷LTtr& Ү4jfwc}mۜWy3186?AŁYW3c PKo PKK> OSGI-OPT/src/java/lang/Byte.javaS]o0}'hxۤ-Z&Bu/InSہ}!màs> T|6Ј0>rL^m[CA#GrceXLr Wz^P/;Xl RY 7r71fX-RڊyQdqJPS@F fKonm^V+{Jb5`0 1.OKƀkr<]HU̦U( lrW[.g-0*+$Xͧ ^#Y(6&GDu8 j9`it>K(OSGI-OPT/src/java/lang/CharSequence.javaeRr0=x㓝De34 &xAJOU|+lZy*t"o˛~\D~ɒ9.b +RvԎ \KHzQo: 񃌕Z6Zb flq!z^`1E-;T;HJ(]{gBLoPKؓ-PKK>%OSGI-OPT/src/java/lang/Character.java\ms\ }}^N pH/á%f:("!Kә^, 9St8>BۋNp6f?p1r9llrČl`MXG<ct͒E: o7G8sD_g4S\0>2~y_kOQ(4*04 t/*0-󿝞>=='qp:u&5ʟMb2Jw(W|O(NP0(KcS-)LD4h+4[8CouKcrC{;-РP+E)] h&܈ș@0ȟG%s8݃'4Lʁ|G.j^n`a 65CH2.Z 2ףIT!ig<)\4/д]ȗ܁G-_y~{- sIʺXS*'jh6SؚѠm .Eq{8/7m/ڶc(щ?kKH!P],,9ܨQf|-z`3d8-d9N1+bQl4e 'Nv.)*!ZAm=[MvEl.U^xŊ zzJ~Ց3`t!zŷ`҆:P:NS|Vڪm;ouyls]IjCm.P}xvXr <;խϣGӬ]"qhl˶vkvj\|K>p|@e;w.țڒ)76(BsFLTx"w. \R+{}] o03 , Ze ƷEJ,ao{bN96׃Om7\(#s~nonTNNӾ!]ROnIX2\.T֦Y|~~qTe!*|nûM5_yS[M=W4Ʀϕ?~NHԒssdl?+V]ck!OSGI-OPT/src/java/lang/Class.javaX[s6~.L 5Id4 Lvga- Kw{$;`6N7>ΡuـKhtdj<^ǜ ӅgowjF5ÑG G(4 #T`~"WiGTK7 gū[K$lB401~05D2I L9>rhmgHi\B1ϭ|>ؓjҊ;ݰ#I]^DZ¿2HXJRElHlR(wFZ.&MrlLqmffho2 d6&!? ¦% ~ A ׇv ^~߂CLFTY HLn͙{B52I1H51a"gi)kVM,MnqK[zكZOK͘gioi6$!׶w{'%&((K/DY6ox<#ˆ:9rמ(%z@:N9w,Ro ^KrߑI zt 팩 Fc2%@dq| KDL7BB dچ)9>! %Pm}mtoe )0f\orGe*P`Z9IJ9.nY,ʾsr躖 e$' Ub}|GDCp'nUP#̨:1x?%Ց/՘Eu W4aF]pT?rYNb5[+d)#0p^f71ŸAQ(m=+iH3ÃLLiI6֎ 4KbipՇh D K|N-B>X>\$tZ'msnn>#Uw;m1/zq/AsD1RShxIv\ῃJHdC آ^'QdGWCX{T<6pZ잋ruO:vUij?YU…0S/-q9zY7E6{@3+_uIiFѪ g g<SƳVY(T(.[FPK}PKK>.OSGI-OPT/src/java/lang/ClassCastException.java}Qo0_qT,a}QEU}4%x g;T2Ѫ=vr smV6[q5."gOSyeAP#:f`r'+Rjt& %FTvEIp0Ѱ5G(9b鰑-Pz鷧s@C`ók!O{%Iʼn8ֶIڳ%w|L=TݫakfmEm!KuR5S8lj鼕ο #Z QZ"+GY9 &~(|-J, ̗mʖ9Ͼ!3o ϡƔ!-$zg$gYqkDCh` 6I/i]_$8?؋8D[sZd0΅͇WCOv蔗;HOxsΆ(zPKbXW-PKK>1OSGI-OPT/src/java/lang/ClassCircularityError.javan0DW |WrsksRȀ4ȑ2[dIʊ߳U$A T  {tB޶JhI_f$XNyrSV"7JT59!BoLWF2aFCi4Ga/&cZ=HJCzv{HAlvw׍a>},>'Ը&kϽ>)拲ZgaV=cǛ#e*)6ڊA4L J7Sx pejS. #[ Q^FWE5"wv|u\a,u,yyyEy=qd|=X0q_9#yKRmdkDCh́fGg XGVUtxQ$(SDem8BV0,OSGI-OPT/src/java/lang/ClassFormatError.javaun0S |UrsksRjȀ4ȑ2[dIʊݻUՁoE ̴9Z<DֶR0N?$ XN9V" YrTS5Y!3P񓬓Z2bFCi4 Ga/Pڣsa+[=Td/\a,u,xwǏAC)CWDI aHP%bkDChbG0d҅gu XVtW("w%" W6!V0,7['Ud!U8xϊ%͖N( PK'6#PKK>'OSGI-OPT/src/java/lang/ClassLoader.javaWQo6~!OqNuRtUbgj؅(=PIa'I5%őܠH~wҁJq؅7M9!`p0L 3Ԩ9`AGU\ oo78Z6i;寴wC{qB/z.B06VP5 " -A6㹺DxJnm;pz5--j^G}&{P'yz+6IuC}Jߖ),QQN_GZݺ5bv+*&!,O6^m4B>OK˔z1 >Ba_;PK..Qu?PKK>2OSGI-OPT/src/java/lang/ClassNotFoundException.javaA0ͯx+{k9,F]]ф! vj;wRJ=4GyMLtu08fg,P97A1J9Y2;ZMeN ZJ"C|#cV G{A coq5jK!-ֲ$>A*z[uhtNIy,Pn})ptm>FQ4hCma woFAe918/PK:PKK>6OSGI-OPT/src/java/lang/CloneNotSupportedException.javaRAn0PKK>%OSGI-OPT/src/java/lang/Cloneable.javaeA0U =lڢ@lW{40vm6;Nr0g{Ml9[< EE")TCXn6*(CCIژȃlH9j1,o񝬓Z6`si g=(Pctҡ^2RG3M.sf@YC^p wF?C_cL qm ^+r}F?[߯AϡcƔ!+"z+3N6lM >UQ 3ȣ_%Q9 B?IA.2crZl'}Vtw'PK+PKK>&OSGI-OPT/src/java/lang/Comparable.javaeQo0ǯ8SRem4نV)U}4p!ވ&4w0x\EZc^/-J}/ ~6vA#GHMN֤5TC~OH3UAIp0T-nI8theOTLh=K +/X.UR'|Hqcq&u]-SOUOAZ:AEŬ-Dgk^J/Uӭ`H筬*K&fisZd2$OSGI-OPT/src/java/lang/Compiler.javan0 S9%Efgm6xi+ NWH˴N l}ytJ" yΖ >}tq?Gu讱)8.BNDBe\CBVRpkn&MGVsGАJlu, %ң_+J+n8`Ϣ-xFB!뛳lv,- b/-Z U  ca&OSGI-OPT/src/java/lang/Deprecated.java}R0+F= iC[ bIQҲԙ6lwm@BcO~}ޛI2 CgűM^.˖\`㭝j9;ޟ g--`cs^Ճ^fN~@K[3~k֟6T0IK Mˬla}Zi%l XnU69A?,_́2CƆX v^%3 HrTcC#Y!IX`hZIP("[ GMtg'pfWZ)k).vlէ,2p+_Պ(PK. #PKK>"OSGI-OPT/src/java/lang/Double.javaT]s8}^~ŝ<1Ɛewgm=K vf_:–vL'}l Ζ,d{ιoςtc 4e$(t-dž~ S0GȠI&,1YL vN"\Q!2LjQ}tt<ϼy+($E&!a)\ ⋼dԩY9L q4@Tm<(/K .Ľr9AumR)A &03]Ed^S.3ŵ`eH%TL*f(#`HGvnpo z~oCdON| ];{{@dCr3@L"nXHxeI4b 0l^99"Ì bnDIق)W;yi~uGMiǝa I!J Ŭ쾢Y,`+3Z N_VL/:RE >ڟ8o|B5ʖ'Fgptqf мrה;A=Fx=AeX֩y>82# q!@缷Cz\ KCL\Do;F{0У23^[$̊4+i~0ۀ5w/J a?*v@G ٴӈ yw;WѶZ=hR 7oCS!S-w$-h=oU=۰vekfWt36 I%mɸ%=u$^ߩyҺ!GlvW*]bc~m3PKJzQܹuS{OWt?ySX?I,ʴ{tPKmi PKK> OSGI-OPT/src/java/lang/Enum.javaSn@=q25$6Q$Jhk5 ;r\cqʿwƸ Izg{o|V+A6E]D))t'Cσaən0 Adaт_!L*ѫ Z'p 'Pp[SZlAC >ʃԐuQk_}:fItA} |G}VW_FiB2-GjFWt6guWu:Ғt "VH  H1ouc3oEɥVf?$0l_'q&J~,,ybX,a_FI7og4e+ d;S) 3YȌ%Bi6h5) Z:#9(^H7zo2YSDJE!S(t>c:wO>pq*5jE cR(Liy[]Cenje)3&IFt2XB퓯]+ufoȾsZ`2<+RcЖ #/ J= y#|`UVihlnilc{ #q%jjr hPZ}fǫy%s j\KE4+ {PK?XPKK>;OSGI-OPT/src/java/lang/EnumConstantNotPresentException.javan0T,ޭL2ʶhU]K[bgC@cHU+ؿ .\`ڡ0MIDE!ݫ~~~3%e)KKjInM*_/2VjptڭNo;];(P[bXɂ@ی*jև:-śe|yµ҇ڹz0h&P|Pvp'I:y;U0;^ *Ă] @9#TyV\# yRZgvφȭxlBDi=>qfQ2')3M< }E*ي2Z\o(RZSR:K/AsAF; z#DV63 ~.)79|#VNt<Z 2?~~f?[M~x|#_E&{%u}ؐb+ߒ!~wի}PKAjb PKK>!OSGI-OPT/src/java/lang/Error.javaAo@Wqu#m>jm|Y>C׍ZJ Sbͬ DekN{H'U!oSJ\$gF^c $G%<&fdLU:ϱXbȮUIviv82C0q"r>"ن VTJ( Z,M-w _{yˠi!Z09Ҿ讏!0tx_/9'ɸ{aW̕7%OSGI-OPT/src/java/lang/Exception.javaAs0WPprks24 kKTƞL{W44o}"pnFV[q1""Ե 06^i$KfOeV,hUInKHQgNJpM1PMQ؉#vh-Ț@P]3umsOC`WB7@ֹcw]8ҦƷlL=tݩ_4<0U!Z@T洧tRU!޸N6uB{f_ 860Jr)~PK caPKK>7OSGI-OPT/src/java/lang/ExceptionInInitializerError.javaOo@SQmQ-,Qkm.]L߽UUA-7of.\`룑a>KU% |? gbÉ 9)KUZ#c|#cV 'z FS8{q%fHtS r{ktNONp3 N}*p9WmC9)ꬵ"l]Yת"kag# w9B*Z@8w*ǰzZac i=SM( I68K$/5n*NxӣpIX'upa&v?+d%rgِkjjSp PKP!OSGI-OPT/src/java/lang/Float.javaTmoH|Q>Ck%7uZRa'mK1ٞuw!QY&ɩ}тp,[gW>,L$:@} c0F)XS8BLQBrmҁ TK}Dž-VV0g B#ip )&yY$pԐΈSZ3ʘMX,V&vu F^EZWTXN6[Tf iHzb-S` ̔k0H6&`ϋ QNJ| OxƁh ǣCN / V@1mg5EDHeI'Tl0רU99vNL0Sڪu[-V;fbB-y A1wIf(A1k Vq׎i0e'e)~xm̄dla o9le& N}:xJwJ [>Ap4@N\v۬p=g 'G/.oAxA|Ysq2 >}6Mlg{?\',ݽf nOea5S>a`c*f;LǤY+-),T;pgy M5f,;61U خCwZGׂbх&m-O)f`UQxejgn!ݶ&RfH\67)46Dj`5_7'KxI&ivҦ^|N[4#?M9I-[*CSZݵZPK)]V PKK>.OSGI-OPT/src/java/lang/IllegalAccessError.java}n0DW |WrsksRȀ4ȑ2[TIʊ߳U$A 웥T  w\k%$/gOS$XENJ<);D%xљŽBg89e:8 Fhr-^al@=Vi=Hjv@U؝ .r-a>=/Y}*NĩuMZEY->2Puk4yG;82fբu#> 6RNe)݆^86M #G- Q^FWE5&wv|u\a,u,y yyEy=ȸ=.&`LyETDo[j$G3M'Bc 'BKn|Vπujwb,IxoqiJn#Ԃ :9$-L};ަ108O'Oҥ;fCS<PKZ"39PKK>2OSGI-OPT/src/java/lang/IllegalAccessException.javaQo0_qTY)lVU}4%x vf;T2jD;I"\afڣUc,'X_QBKz:'I2t:,ɑSBS o Y+$Jd20JM8;q6#P PW~{:gP $x4 nge^A!_}[ܯ-Y%Km +=/ncGСcQAؘ3kIlMם ٓ-ٝrZVAQ;?m+F+{ٛ!d#,oEIɜ?t.cɥ$=< _E^0E/PK 2PKK>4OSGI-OPT/src/java/lang/IllegalArgumentException.javaQo0ǟǧ8)}lCtUolU=$i _p 7[j Dd0ϯCY!J 9Z4;#r&BiNhm*\I0nAuвH堳H† Wp js.Fv46B`nsc}8RQkt̊{@k௎x}bkbe5)攧 w\6!Xq=3mjn] 퍑Z?ؘIR@ZLSREMꡄ$ϓLrXLW>C=4 idTqFƊoxEɦc Bvh$uM˭_%rp[_P4۱[R!a"1MעtaCYSbwO' ;U)h%g֨~g(roX/A PK3PKK>8OSGI-OPT/src/java/lang/IllegalMonitorStateException.javaQo0ɯ8S; #inr\;Nj Z'$D>9N"\anڣc\M,?KJI+z6{7'qXF9{c&ȝH;,߰3wNxq& NGa#R2vK=( Y{rZm.~0}޷X6:k]ryxˮSZs-Ě*Xy\Vz)^X Z:o#Gpۄ(-#|LˬC_!-4_ee~eγOHG|)[uڐm-$zeacΖ\KȊ 1{%.\cu(^_B$?؋8`o[s Q)2[27<ڽN{1OSGI-OPT/src/java/lang/IllegalStateException.javaQo0ǟǧ+OI 'fZH6!Q3jM6@3E ts4: Pa|5^I䷑L,=]}]ޭpdYX &]>#Y<[ A<2>|EDg d*FܚZQ*'#4dvk,XzL-w o֗?(O!"i7OSGI-OPT/src/java/lang/IllegalThreadStateException.javaQo0_qT,a}QEDU}4%x g;T2jҴ<$}߹Nr smV6[q5*"gS$XÊ=1;;YrTS5Y-!5p2Njxq&Xu8Bi{Hl txHJ̀K=\  6~>=[ͧ$>'X&iZeE^,3PuZr~wr0U%ڊB4@[jpz{a)y+ם3?&FisZd48OSGI-OPT/src/java/lang/IncompatibleClassChangeError.javaAo@W ( i; t5OSGI-OPT/src/java/lang/IndexOutOfBoundsException.javaQo0ǯ8SR1نV>:B&$w04i2OSGI-OPT/src/java/lang/InheritableThreadLocal.javamQo0ɯ8S; 6 bj&۴G׹M lY5 b(Ҷ{&`,'X_200>M4~*&=VJ!7JT39BcX⎜W8«~;/\0ebYoj-r*/߾ [<{2>['`M.OSGI-OPT/src/java/lang/InstantiationError.java}Qo0ǯ8SRemنV)x#gШuV~"2mV;i5ê.v"L/Os,XÚ1;YrTW5Y!5x2/NjxiLƣ*Xu8Bi{HFvzxHJ͈6H;] G B?BK qmtgKnlYˏL=Vݪx{0LU-vb%>:PVz9n ,Z:oo؄$-|M˼|cu]^&_X| ^}CZg^\A<2CƆ)8Ϸ BHP%Yq4%@Vq"{µ:M' z+4J'۫[!N0Y˓Z=ڽĹ KxY(vMgcat|5OKwA.Ʋ(zPK6a@9PKK>2OSGI-OPT/src/java/lang/InstantiationException.javaQo0_qT,a}QED>۳{2jD;I"\az1.'X_%ҦBla ~a"G@U ANUhUE~GH(3TAIp0 4n'(:b 鰕 %P:w9J 㠡7^pëF?@{)IEOk['͹%w|L=Lݫ߭xs0LU 6%y;+TNo}',J:ooB_7plBaȊ>EVLC_!]|- ,W/l-s^}A?{NACGcƔ!- zg$g[Y5U&@V#{µ:L# o+D+ٛȴe#,S e/o?9t*w/ Ox.Ά(zPK2PKK>#OSGI-OPT/src/java/lang/Integer.javaos8_OWCwnơ&i77^ ɕdw8Sp)3d=ӳϡB=: 3!ԏæ C40DzqJ12F ve,r Wm;A9upqa 1 0%DjNuJs%C-#9FIU̖Vk>7YḩtKino^2\ 44~Ϲ `ؘ 6i*z2mQ3sc5^n=NQ\ӮonGٽQ,|s{>yΖp6͖/7h*Y K`t׹(D[ttװ2}iQ?h+vU.=Fk n>*#U_bkJ)nbT=_K=ˏ &rWn:u6i op7eS~}mwX˹oH 2ď4b=Fnkw&F: >~r[ZWRvR[Nl׋ptWO "S~`3w ^~e<ٙ5Z'PK~: PKK>)OSGI-OPT/src/java/lang/InternalError.javauAo@WL!8*(V!pIQNWdwU|wdxqhr,^GHV':iZdE^, ur~wleRmQ=-I͛@[)^Y 6;oy7e_ $61J d"+>[[ޮqVi+̗uΖ =˯ Lck!- z5g$R[.e5]w&@VFhمkuX?g0("W0*WQm$BL{&zҕ{Qwl}r]z o<)X,tPv6t0OSGI-OPT/src/java/lang/InterruptedException.java}Qo0_qTY)lVU}4%x g;T2jȾ8U+̴9Zl=DֶR0N?I KrdT'DdEQNd᷄̈?C%Njdqh &Hu8BikHl txHJ̀K=3<z 0ڼnzo>i8'6i{u]>=SS%`w'-;^! SUbͬ-Dck^J/U SK\wMhM(y98#9CȊ {I1`dZ^_AiqοOILQrΰCOvR{ Og"[rm/t|PK,PKK>$OSGI-OPT/src/java/lang/Iterable.javaeQo0ɯ8S; BW bJcڣޤR;NjsiyHl'piϖǴa]|eMJbnyatؐ#{},KҎ,XYF:^`4pTgh9v!SIk؎h=pH8zW"WYRG9x~Hc5IsѺ.[bV]!`wV:ޝZ*NXXڒԼ ԽeϺÙRٳw?Fi@bS@VL9-bLflU`rfl ߳vzjm@09yED*sAr-\q)S56'Z:BK.\}i^a鿾AIIοOuRqn'JZl~3D?n?9z3H;M<x*П( PK apPKK>(OSGI-OPT/src/java/lang/LinkageError.javamQo0_qT,a}QECAJ>۳RT2̓#{*lvjU]"m[)TE_f$(ҡ G@ud)+Rjt& #FT*S"Vgh(&7;J{tC:leKNJT h=K 7^\pRӷ|Icq"mu2/r񑩇;Ւs'! SUbì-Dck^J/U3[ K[3M(Y9״i0?VwkܧElQbU`ouy iY~;qd|=&`L<"JW[}Fr*N4F*^`ʽŸ.Js~Md GL*IEϟCӥ|<~Ţh lhxPKЗbPKK> OSGI-OPT/src/java/lang/Long.javaas8?b'H%mw7Pz;~NH>I0 ILdr`w+ Zj z*[jN-ԣc9xBp&#z~~8n0rJ#47 4C.c`^"gpp%lC SG]Xfl RY H@3 \BfڂiΚ՚&Q@F,fצVkX4Yḩt+i ^_uԅh h/2,e*b*j9˴F%v4:L̍|ۍz*pGp~psp1h ~?``F^cJFu]dr!ↅD, #RiRTQK23n\[ Fr j5vkY>R% FVk260Mpeg(myGi׈_:oƙ"z} .+|tNNN;gޞ;kXxz;*K ͅ[)%*K{+^ 's!pstzut79y ilO\MFk N=oU""HXmwMzXX\.ȱ^^َD(fW]q)e Zn{:`͔~#@9$.vˢ.۲J#B-⣴eqYL%ZǷX3.L(t OSGI-OPT/src/java/lang/Math.javaW]s8}.NH m> z ;8N-meɕd>W@ $stu-[oK9LÏ F3"" ~{ 3;SÌj4 %"*41U`F9~Ti&;=h gKddB(4E!a]G47D2ki+f:5U_j97xlObjgaL[Z:Tܑ*j~ nǓp QSAoSh|$GUVNV TQ|fUR0zebVDQK3mfiO 6"lB0=K9spGhrCv: >h &wPtC׹LfYEBJw$$sEhH RH*ANUƴ F,cOvم%,I޴b.x !M0[viA, 1޿_`ػ7G1W`up9^nvX mi7DN|K<\-46آƱmbElU{lPKc23X&PKK>6OSGI-OPT/src/java/lang/NegativeArraySizeException.javaQo0ɯ8S; S*%65e Z'D>\'p6G+Ǹ`Y~HV U׳ٻ)~mAP#:fBɊo )uR+\3`4&7qv=:G̐P ޙZ/g'xz^m.~0}zޛI},Ncm=k]ryxˮ{Ւs]Ub^[C[y\Vz)^X Z:o#G؄(-#|LˬC_!-4_ee~eΫOHG|)G}`lH6eQgKP%7hDChD0dw҅kulVW("."؛tk!V&)VK? =tjRrw!y s<|T}p轰9~PKEPKK>0OSGI-OPT/src/java/lang/NoClassDefFoundError.java}Qo0ǟOOPmStD>۳RT j˾wN"\af1.'X_$ҶBla !GHŪYɒ %/Cdd 0BM@t8Ai3C-[=d,OSGI-OPT/src/java/lang/NoSuchFieldError.javauOo@S^BޛOI2 C,NıMҝk]r-Wyzcם9XKo*eN 9` SKiylP%ri rm6O"7٪ĺr_glioY~=e< 0 vo%>#9CɊWSM/BdoCv/]Vǀu^zO (b {~FRWٓKC/6}-\Vg?2dyŃ9~PKk1P3PKK>0OSGI-OPT/src/java/lang/NoSuchFieldException.java}Qo0_qTY)tVU}4%x vf;T2jȾ8U+L{zB4JhI_Ob$ XN%9{V"JvTY-!kPSF:bFCi4 Ga'ƣsa$JC];oO *OY{Z^m^7Blo?i8'isu}>=SS!`W,;^!Zbͬa,Dmk*tÙ S)ZwMhMhy98<櫯2+Vb٢W 6qd|Z0 qo%9#(t݉P=Y͎В)1`dS^_Aiq?InB6 Svr{槻 <]K9z7kt<3^lɱa%~PKaj,PKK>-OSGI-OPT/src/java/lang/NoSuchMethodError.java}Qo0ǯ8SR1ن)FlfШuV~";ZU7S9êZ8K6A&G@UFIҎ*" NH'1~uh\&sL`2MfWhzxC9TKIҐfߍhͩHp?z,\jRGx}Jaq"NuMX=SU%`O,'!:bˬ`,Dmϼ ԃU^:3;?KR[c/<61J2/`ron75:䫂W_1G}衳!c0-$z3g$בT;%9{Qjs 9:{µ:M z+4J;۫1OSGI-OPT/src/java/lang/NoSuchMethodException.javaQo0ɯ8S; #isR;Nj &C"{$W07Ѫ giВ0M8lc:VY!)IQNdkB ɟ2wNxqh &HM8Bk(jtz( iv+_T  ھl驽o?$I8VIsu]6_-SS!`W,;!Zbìa,Dek*t53[ KAT[0 bi 򐭿,xHW4_g6[g˜WSGСcQBؚ3kIlMWٓ-ٝrZAQ;?m+D3{ٛ6!d#,7E'okS.N~:xҥLŗSfPx'0OSGI-OPT/src/java/lang/NullPointerException.java}Qo0ɯ8S; SinrRNj &yHd{*ljeY"m[)TE_fIQCA r'+Rjt& %FTNNIp0p4Qw؉#1C:ldKCEC*TzgkSq`,\`xy)ӳ|Hcqrk$Y뒻l[v=Tݫ_<aU%=h,uoV;*?yM(Y9Ǵi[r*N4F*Np ʝŸ+4Js@?^{nj;˻d <]S^"y <\%# QPK&Y3PKK>"OSGI-OPT/src/java/lang/Number.javauQo0ǟǧ8)2剥نV)h lU=ZeE,+`roa`|'׋ŧ9p<1l >;8[P̡9j{/QRL`2^MfKgqT-RYh (B  $!Su3ud}őR+X.8]ZŽ]'.jК6ZdǬ;Y1OK;N Dʬ@iFQw,rFMNjJ[fh0  | (;hcsp ]N`&v&7G7s@F8 B H ʸ5YD(䎠A]q0`l* ] s~kڔG"Ef!#m 5JR~DE?{!a:g84=ZýZo5VKX,tu2,/eEAp!1{~PK 9PKK>1OSGI-OPT/src/java/lang/NumberFormatException.javaAo@W!ɞ-nCС3Ɣ~-"'zg$Q)T݋P=#Jj6ltW_P<؋]_Q6ɲ-i <-8tp*MChS- sn4tg?:9/ 33_7PKMܺ>PKK>"OSGI-OPT/src/java/lang/Object.javaSMo@=_1)A @T=n챽eㆨY۴>ػ͛$+7 ,"!8l:=ߌBoBfyHPZ̡9pBYF3h,W) }w F3W5lrP[$ no2LmuOj( \j3Jt+tT鷓I4!kʔɷxHkbg]Hւ57fLm` (4H>$OSGI-OPT/src/java/lang/Override.java}]o0GJ mդmhT@Vx۳M(w>0x=\xp[&ۃe4!:Dl^7+MC24XDp^0X j`b5|Empo`yirIг 0$7*TJj6r{83S6(5υlUo`GRAw֚&FI"c*.'`\U$Aj`FZҹ5\k0#057Vr/BJ.ؘEC/}AS/.̲0)(4m"N}0q[Rdt>(* yE_XhْQXWTh"ZPEPܸk5dv2{.wPywƎw+wgLhG 񯒨-&=AВz3[Iw:y϶SCIc¢nRмFx<'PK.sJMPKK>#OSGI-OPT/src/java/lang/Package.javaUQo0~T,a}Zu(ۢU"U5$ؙ퐢}Zh2ZB}}g0PR|ftaL:}sa" Ѡ^`9 J)2E v,f W>t\@YjwR0gKBi0 I%$j^4*ngu1CM-pF =elCͬ->~UU{JX, xX7YR1w5u<]+U¦U k5Jse2[1&j>-b6| 09put1`<I8a4(: '(D-N{427vMƹRb- ZQ2&< &Z8Y Lsn_=[-/-`ZE9B"1;o= wi& $FbA9I2cx"N G0p\X0-InK-AB}%خ`::Em1cPAn⒦k1j$bg^v_+UOl!LG;%*%܉xNC>>wH /;C}vJ RL`+.'zgJi Z;[]D\*I_&s5w!HGJnRX), s#PKy:PKK>#OSGI-OPT/src/java/lang/Process.javaAo@q[% D9.`51; n J[>`߼5.`jQaOI]Br<~7}?2,=8*P{,%: BbU!ngw< AzI؛j04Ńj&Pw]FᏆLڃBU֪@UeMn1jެUMI> ~*ؔ^Cc0ܧ"/Y*]\kH%_ %29 &89łThjTP:-E% `lj+>,+4"{0v*6+JVCQ+ALP7[ eog2|XY SuTĩ PmB9gܱmYg}_iqoiDѹ3;F&sPKnuPKK>*OSGI-OPT/src/java/lang/ProcessBuilder.javas@Ɵ_t0`Ǚ!N]ܻ2wҴԊCv}; M!L")B1L})Z5.B&xH-. $p+)5+]dp ZR3)!AiR*Mp 5&/itzNCJa\.n!׈+7^UUQ|>'× $v<߀(XU*U y"κ`Uc:plBC+J NZp%qxar5h:Ƴxd E<'ch|E#9x[w2~!Aܓ4l\ʔBfHAKղ(K'\ }kz (9GT L:J<.x/kJ GGhp~:{kAEaT'smGJҠKgM{= ҄8.O?ٽ=F@'Qd= Z9j̹1 hAu 1E۶Q= ۍynEOMh PKBx`PKK>$OSGI-OPT/src/java/lang/Readable.javaeMo@W|# nnOq[$p8bbUTJTwy&+}1 05v?n"WZ(Ȓ9Sy5IK !'H4Y2!|'cpma VKjyh5V Rv $I~xx^4Tˑ4ׅn9)ip&Zkt{^@ւ_0quLUcŬN `gsNy'dUАiuFT{c?F^uۆVI iLЋ<ǯHcz(!/`g13>}${oive<^0v^oJ7"YMhEͫnĎSg27M$VˀI8ts追8^1@[n92-Gols*hƶe3톇5٫"04 _PK)PKK>$OSGI-OPT/src/java/lang/Runnable.javaeQo0ǯ8SRemM "x#gh5aR=&p6g+ۃǼZ`[~HN U׫է%ymAP#{:f`r/+Rj&  FT*K$VWl*7{J{C:4#sEC*Th&Agr $x< >`xռB z|ޛ/I2 C,FX6.ZgM^n>2tAu,gT3k'h ZׁzK.ta)y+Fc DVpY &aǴ(|mJl ]˶9"͟# гaƔ!-$z 3TFV#OSGI-OPT/src/java/lang/Runtime.javaVMsH=_L UH!T*fH 3ڙ2OXqrm*t~A]83,c&K)%Q d8|a$ȑ]Sgr)iG):% >'(GN '!DAਹ::> S 7cHKJPAjfU4*N,<8BO˶ oHן>֌fulzW04t8W\c?vr!J9_i>5~c̷hޟ051\^Oj,%UH{k;n%_Z Ӗ-d#"ѲpN%[S4x:+5T^J=B'\{{7䗲ٚnlpJ(t^QsVnCLDۅ)Pw׷ΜoF&EYd/@%uqLKJ":(Ƃ ð] VXKZ} ͨ—raS*VxXe5=mN7@KT8mK}!uBM_mMTC7?7ՓZ[k^ۥoޑMzJr@Vn`d `M\,e' {36%nն87wPKZmI PKK>,OSGI-OPT/src/java/lang/RuntimeException.javaQo0_qT,}QEU}4%x vf;TR&MC"sDW0j0,F_$⺖Bdr=?BwZddl ˂* q# 1R+܄ }à/ Fb[lJ;CZdM]AT(:ևszOC/vWFCs(.P*6O4g^j~=DTX2k-:hQӞ3IUau)uF.[w#~ A#I>&a8tr3L]H)>#N-I ϡ]c)}[DNtG$P!WTՊP-!_er#p?EA9F?V6h%GL 9R= S9x׋ Gx ^?5ϳf_bmtwrv7 xPKhPKK>-OSGI-OPT/src/java/lang/RuntimePermission.javaAo@W|2''-j+p帆g-^bbEykȑCU vg}3]xiZVqcZ UWe~C) 22wTLneAPNa7I(\`4l7bXtCeMǂZ P4v@ .G>Blm?FQ85m2=STM@ӯNjNCLU֢G!*MgGkifm{ٔX-W}SoF~*ڄ(Α#\y>Y~Y-qgY.yE"I"O|MқĕzlKyEDoɴTȵ,8:QfGZq"Ҹk5 X:Znt <{~kWD̗u-}{Ti ʼn{79_'9 vBO| 03ulS<_c<{ PK~MvPKK>-OSGI-OPT/src/java/lang/SecurityException.javaQo0_qT,}QEU}4;{R4iC"{DW0r0,F$⪒Bdr=?B+-2dv ˂"!ĵ(WIJpN0A_nA7؊vh,Xˊ@jPmݣmszOC/`Ws!롻g\9ڶ EGjSFQkd:KGTEПFxyKfD m JC\sSF:1^V6+i]ȣ 860s$_<1Y|?,gY.Yy+OSGI-OPT/src/java/lang/SecurityManager.javaV_s6b'O$C N{-+暹AH$07ݻ !'`iv%ܼ5tUb6PW0 >ı`#oZw <7 ci`#@p#He0N?LFmp㵠.˩˫XlRYH 001>rL, \-Z&<)Y\r2 gHi̖f32=g͸5́D}1K\qטe4FʹδB`fLZ}VGJ};$\vKAÑG&p;É`4h'hHO~?aH%#|Lˀl Wb!@|fa K&A.SjrL-QK aܲ29X,e6 5k5#–sZTB1#gjc4|]4}3Wx{L""wAR1RΑ?iy!P 6K%"n՟ZJ|tA{+l's,Gb>h&3_bRURRN@xiQnu;`X^==~*Lae.A!йF&.B;!/ϿrJݥdʵh=:Q-T'-cvR>%S!=G7m=xOg?!q?jE} 4NzPʻ[kX%Y*ߺɟnqJnUY`ExэE*__@9`.12RY}_.6,6+}Oi)IBMv^_fjRqCz~c -R}y+r2)^JQ>Wa[->|'_M_۫;pql=o^󊿵=PK~̉ PKK>!OSGI-OPT/src/java/lang/Short.javaS]o0}O-nHP@ʺ#EM1^ܤӮ߹N-بT'=\/a @+l(MSD:;@㛶calƨQ-0rr3Cp3ң9*ͥ- hV[vRds! kyW!fPγJڒYQbJS@Ff*ofL].+;R%ݴ7pTWDZ?9WxMIkʖ D!iU/7\$26KD\ŧyڭF^PlL@ p^б$lxoh MOO:LY$8.B@B,KI:Ð<$k"Y*A C5ڶUҤ| 3҆/[hPο-/`7|JRK!L fRRkPD|v0]l'/DAme2_?ӳ!WGGGў޳;\SSo}o \~oŔD},a=ԢS65dd˶9DPhr%Wa<a(#-Z7~Q㜥9ꅝ^TGǩda::&J%I&,bBN.OSGI-OPT/src/java/lang/StackOverflowError.java}n0DW |WrsksRJ$ȑV2[dIʊ߳U$A@ar lj.v"LOsycaEɵH9ѫ,Qo㖬Z<^`j2c'Pڣwҡ*2R;3 o}F@Co`ûo$0Hk&IrˏL=Vݨ<afm!ZK|uRs8AX 6tM߄G-؄$-|MˬlY.]|-K+\UΊwߐWsG}0cQAh d#+Mh ޓU< ٝtY;?+4Js~Ed GLVzܤVhOv/%񭴾/~3z>F-3< S=Ϸv1=E3PKj0PKK>-OSGI-OPT/src/java/lang/StackTraceElement.javaOs0zj9ffrb%Wqh&߽+fȐi|齷]y|u}0T ,/$T0N&!(˰J +h8PAnעG4i4 h#J@iE [P`{ܮӧx3tjڞ Av՟m#GڔcyM2_=S[%Z0!5S"gV)ZDiԭ!G kA! {1& l,Br.opVqN,W0_W:Yu qzߒ*q|1ɏx!@#-ܚ*Q"zFqGPc 1*ruKg}B 9A?^D>vM#VBB!eek# \HP{G+(CCBҟn>;|e&OSGI-OPT/src/java/lang/StrictMath.javaW]s8}.NH m> z ;8N,mmɕd>W@ $ș!s?t۽h|x0Ц0 ?r)'2h{=?<؟af-5̘fjɢ2XO2Y`0 ů2m Gg7b# 4Ph\CSlMYn 2ki+n:5U_j97 r Zt0&]VR*HtVw?I8Uר2AoW|$GUQkJV D1|fURpxelVD1Kqmf'hOm p6 !Q%9}ϣl4!Lgp;tw`4; a\YP&ᬲ!c;bYI9<]IA\2%#șʸi(04)ϸ!'BV GcioZy1bI>5ֻmW| cUs5Q?.;?\[]`<+aQG%Q=^nsua %E7x68ĔgTE?"Sjˋw<џ' h;wZ.76݌7wt lmFi.}aA# 2=X/yʫ^%[^MfÍm?Lx<ۗk[O^)I绁WrRQl~#-2zB[Ys< ;f2c3.R`aKbְTG^iB0EHq3tp[qq58Z6 ǶVPK7 PѨ2PKK>"OSGI-OPT/src/java/lang/String.javaWr"7}^/]Ij1f*_j+ImYI&[0WLVԺteR|:3Pwa¡ ~n_6?o0FQ-p$ r]' *03N\ټi#*ͥfVlBds!  k𸏀.W΃ %72 96)f6̘Vk\6Yĸ)մeu 7z |~Wb1q6UH. 3KL6Cs-G 88wy:|h{ Gn6edew@4uA<5%=4dS\#P͹Ǫ| 3ѣ}YCZiakA8&y 3Ɇsuz43:9xNaÔ1~ז Fn}S rcpt]oQdO B߿5bt^ 4iLˉބGPE\..)\f#ͻv&Abl,[]}*1nI2>D23%qp?TD'\9!^Tm<ݮ hC~%;cF8XDf ˡ-c-D_S߈D\P xW~[ !iΔAXM+C9̯le[^fBT.X HؕR$YKR =" 1_cu$XjR Vq%$W$PLG6U!Jjdo8i6*}Chq']c^ʹueV '1qQi@\ѓ2Z!V-%ݐc2dH4?S:Ir{Ut*>R##F^"e5Owӯ4rN׬BPLZflG儮iQyFw;.wSJ7LC#ۧ,L3gh.g.F=pcr89C]T[/j3}e%ZiFj@U+Q#PNĊu~:1!ݥSKشR#:JU^9j\SRj`ApX$YR{3w-DbE(/Ya"_W"4Z^>RRPKW4PKK>(OSGI-OPT/src/java/lang/StringBuffer.javar0)v8AڜfI3N6JJ2f]!m .oݕwp}/4&Zquw߶=F &( &P5 ~ʕ|Amp R} U-@* Abp)xcnK4/͹,nJ,#sF9ݥUC`LucKŞYWlM2_ ‹פ? )h,'U1H`sPX֬r[.90 7V󨰏HW lLB!pAq`qx5k4"y0{> ]]$r!# ZI29<1&e䨧ܸ8Sn]>z m4͘簧oĂҗYKeb.Q}Xlf\`.#)W^3t*鐺n;7^a[mؽƥӽ?<nǻ~) E{ Պ)K-Yq /$$p F*!U T~{ĺ(s>\gb|`-ݗՃRiVqu6rHP `+o_!87h[Q_{Hz:hVl?A\oMCLneՁێiKc.XkS#l'.v9=4PK#= PKK>)OSGI-OPT/src/java/lang/StringBuilder.javaMs0Wp 5$=99$mfI3N6JJ2f߻@`J'58暧c _d8tN[@o{ Cgi`cr#ceXD?J 6\I8:pbݽz C]$r.⎄D-% #RiRTMQK2n\[ F .=jjTtϦsZTBd"H_@""^(c "kR J[r9kPk 3PګBфGx\Z2с/[>ͪ #Z4\KXn_$B1[]Bm8_zY9Eڧ뫳* {w' ݾRivs[uJU1~V)sDbhqM<_J m416zUB+QgثvxVo椬Tr3+e3+oʹJxT5iMU>fjZbS PK~` PKK>;OSGI-OPT/src/java/lang/StringIndexOutOfBoundsException.javan0SURenm )zFl6!QwqTӴ >@r7l6j$"/gwS$XÂc&ȝH9ZSkBjDŏagd  [U@t8@i3C-[+2R[3o `ǁW^p\p<|Hcq4mu]v3[UKҏNZxu0lU%:XVz)}/,Z:oˑ[?؄(-#\eVN![~.xH4_f7E~-"総HG|)Gk0WDIJ'%g5t!4zGVqG0d҅Xp0J/q鷾AI7q^E[QJn\5Wf />Eo_ Kve/Χ99~PKlHPKK>,OSGI-OPT/src/java/lang/SuppressWarnings.javaS]o0}&OTҲ7DJUBMoSCjiVM\6{=: &R5/w8B|<~5_| CHѠ>'G2 5BXAd7 1(kس#i6HWx[r:i 6Nk肢!DZf4jgb_rTf4&a/Iuwk!*44~G`TlMZ+րJtfShn(`6Lpc5_i?5Rd 2\Y 2'Aq$)LxQxx:$(*2 y"d$lIQX-/(5Q֬D(@sjHT|-y@##9|G{]LP ~t`Uo +ܣQIuΦO>3p OC0Y.&y ,/7AW~RtfK%5ϒE: ״K.,-gժ%k+l{2ýPKԷ/GPKK>"OSGI-OPT/src/java/lang/System.javaVsF~Ŏ0CqҺ`hb "8-RN;I&{0 S?ݏoiAXJO,SBKE O0A$`r$j :A@BO҅2.>zCM X6J,U J4yQS[)( |1 .ؠѼIW _{jq`(ewGx> JEl `VR̘k&V`DJkx+RN JzDYGjV{m9r ,p6! NEi0 pC4a4 a4[?p|d#`˹"Ĉ(͆-PNK"f9"(re}Z-L{A|Q N$5+/ͥ/Bkl0| n{w=AhTkN"OSGI-OPT/src/java/lang/Thread.javaWs8~N {t \!dtwe0` )`K~SzV3hppd$8v犃#g2@8@V2V2#W\e}e5~2:JE'V8:>[af 8B @C\BaFm(X&paa$H!A^H'1t:qEaUQmNδn(\ǽXG\i(zrXH ̔i0}{Y ڜ#1 N1\:S wnc w;^muC5ݮ8=|rfBFv)m8,Bq@>&1" $ D=MkDF17$K~YCRh؄U,l= !H#'pm!Yc)H/eJ(1thxtyn|j5yu>w[9T޴ wezyϥA=`Tt2`15@+H#y-GkwMɒzքZV4qvOWLd"Є8}mp^u^ۿMYwxՂXǢC%OubRttJ8ܰ拁}e*}gLmBdX`*&)&juX/ߤ1hNIktT=;}i0;h4_h.vH#,R4cxuXk*δe,DuH[H%qP/a7r.*7,kO2jkt~ )܊ Y\b5ؾV̎{h(O& fK*[-Yhle.pWr_uQBO5m"Iݙ \~Y"Хao^x,~ re5SJ ݄FJ۽ z 0ar84}87ÕZLЊA &1v,݃h%?(nэjoS9E:V"1?_jo VN:&=o=|N8zy:t,V<"{Mw/o}̒Ek1<֊KJ ?W;^Y+A0L_Q7*|;-Gjob ^4(ϥPK>PKK>'OSGI-OPT/src/java/lang/ThreadDeath.javaeAo0 x))2;mKXGfmIrxh CG2p6'+Ǹ`U|HV UƷ٧)<3A&G@u^VTM~GH7DEIp0MIw؋tʖ@NJT hs%i/X.8m{-yo$I86I{Ѻ>/bՒs;ޜ SUbì-Dcc^J/U3[ K[g֯<60J d_"+1+J'OSGI-OPT/src/java/lang/ThreadGroup.javaUMo@=_1[K\ j &`ew6Bڦ@yf:1tT|6P0 9Bp&#vaFhP/1n'J18;GOqҀo W7PjqTzr`+ʂ3H 0%DjRnY+ۂCM,#8e 0[>skVM)n*=kkZNoޑ"Z 44r\SœTElBZKAi`3tfWjn5MFOsc58ikTz@mcA 6&gfjZRE^pjH`i_plj.UPN"˗QNښ?h>=, 1H5IFws(%|ÄPi^Bh>]7H6e`YݔK&`x t; =ɷj5t $qliЫ (UtoTY$gyگJsE c]R-&"˶+ZMϝ 3 F]b:a]87] r!w0> ZS'Y5k7߳RWhb{f پ~/ˎ&)ߤX QR⭚#wfMJB'OSGI-OPT/src/java/lang/ThreadLocal.javamQ0<7_1+JZJ)Kۨ hGpkvȢgHUPCxf7n07z1,GX_%%ax;GpU`:ȑS5a r/KҎ*" %$(#c=[quDOcu>/|]"`W+-'^ vU5{U%Ƽ ;+l|',J:oW/ \$9|I ߖ*Ɋtc|ݥE n x46$`2y"r+ s*FM׭ ٓ՜ ٝta VAFɝŸQ= B?^L,j5WR vVl-ޔB},>5zpWBMthɷVCJpd5PcU(TK'FV8y5xT3xPKܠMPKK>%OSGI-OPT/src/java/lang/Throwable.javaTMs0=׿bd\Crk9La/f[#C3B}o{+=XkI'0I}:;40Azi S(e!,D?MŇo ) 'AڮՔZXb RY( 2S HBE#"4,N \5jf 46}[UU jŁY7Y4[Vݠ.dƀ%iv<[(XU"f5( "5J%`VBIXMvo؄VCCGH..$Ma ƣhG|F> Gs$v#I$S`BsJؚJ!djZ#(P/ɸ:dr9rD?J#$lЪtq\L*QO]4;L7' w゘e+{u;N%W_x86y$cqMH4RKea">C;.dЙJ\˜~{‹: p?&I헢p(<y=(- ~g||6PK/XPKK>3OSGI-OPT/src/java/lang/TypeNotPresentException.javauAo@xkZN.T6ibuw; n!ꃭy7n0j0,G_$Bx|FF9Y2;ZEMdI ZF#!~R+Ec `Ї8[q%kYh_R JmzNͩNI{,i}-p=8|"q"C:e=SY&kaw+ w<@4LU%֢6!9;#TU׮JZgu[؄ )|JS:\)$[yv.yƧHg|K#:o1y(^!6Tʵ,5U"TzGFqGhlk 6J'M_P<_؉N]Qւ23&)7;:wVrrKK\|0s1;-##o/#4BC5 1PK5dPKK>(OSGI-OPT/src/java/lang/UnknownError.javamAs0x 2Ԧ9fC29 {1jJ2 y}SrSmV[a9¼)6$ /'/cuc,aA잪ɍ,I9Ъ,Q򯯌qKIpO0 A_A؉htȆ@%P:{z@C`û͹o$]Hk['I뒛l:ˋgV!`_+-O>@*ŚYA[׼ԝ^z 7M%r7gPbi`r-WKܥE/Yy~-yλH{1#{0cQA3Tʍ,y4U&zOVD0dw҅gu XFxnpQEC0+"Wi!F0J=(ݩ:zR{ǷV4)[7Gx3>4Ov70OSGI-OPT/src/java/lang/UnsatisfiedLinkError.java}Qo0ǟOOPmSF >۳RT jȾwN"\af1.'X_%ҶBla ^?NputX#{*fB,eIQNUdԈCdd 0BM@t8Ai3C-[=d8OSGI-OPT/src/java/lang/UnsupportedClassVersionError.javaQo0ǯ8SR1V)$ Fl6Q넩*UdssMz3mV6;q5&"/O1ym,aIɭH9ѩ,Qg8񓬓Z2bh4 Ga/Pڣsa+[=Td:PVzNo}/,Z:o؄(+#|ʼ]Xp-Y%Kun1G}ؐ1eQB33Tɭ8j:} 8 ٽtZ{?mQs~HUd U+l\g}6_gnT힋F۽gca{i<#n% G?; /PK9˜ KPKK>9OSGI-OPT/src/java/lang/UnsupportedOperationException.javaQo0ǯSR1HنVɪ>:plU&TI4iZ@kW\BUmaZ Ϳq3Q Lokiߐ9 ( Љ5!RX'jå`S'!@H Abp[ @e (dFk=g8'8223ڠh=ᩭUð 9jMx/IH]kѠ1O5%)rU ymXR4RJrQ`LÔX7ګG~.1(8(sAt(ˢd/sH3X]ӄV_!JG42{]89ⅅ'OSGI-OPT/src/java/lang/VerifyError.javamQo0_qT,a}QECA"tUMr۳RT2C"{$W0heiJJz64?OⰍuP:ɑ=PC0Yʒ %:A0JM8{q#l X ޛ~w:gp $x< n0/~>=;͗$>'X&iZ,"/zS-9K;iy0U)ڊB4uR5S8]^X 6tm_GplBaȊEVL}>]|- ֘lr^}C?gNACƆ S8ϷBHP)kYhDCh`  6K/i\$8?88Dr([dVZOr/x)U>CEx'<ҋO ag9PK8 \PKK>/OSGI-OPT/src/java/lang/VirtualMachineError.java}Qo0ǯ8SRemK #RH[ј6Q넩V9N"anڃUc,'XҦQBK|64?OⰌUP:ȑSC0R o i+$)n:e4A0F`q0vm<:G6!нCiHk^%n0,<g}%Iő86N%W|L=L]놜<@L%Eɬa,Dm ԽU^z g6M1rMhY1״Ȋi0?kܦUE e~eߐwSW}kCT- z1'$גT%9;Qj'9Z;µ:Mv \/W8("O0-"Qە\!Dɡ`e}'_|/JZ==ǧ`x<]ɳasa1PK.PKK> OSGI-OPT/src/java/lang/Void.javaeRn@|bDԦykh+V#0I㼘k͝{wA=Q[{;;;3"f>ZU$vtJlclr7cG{豶T![DNF6OQPKSbPKIG@"OSGI-OPT/src/java/lang/annotation/PKPKK>1OSGI-OPT/src/java/lang/annotation/Annotation.javamRr0=θ֦uܖifL ,K$LN+ɴi>VeVz4idgq %jz~Y~iaḰ<ɭ(IZp-ATY72V( W 0JŵU{A*%jSIځP µs&&U8d8rU&ǧuNaB<*imޤdGւ05*` `ckNyՃNf Vn@CQEh4 %|<ɗ>}vpoqK69d[XgMKW Nk,82>Xq9 :IJQɦdžQ2&֏ղtb/?AQp=#0!J:}irpL<OSGI-OPT/src/java/lang/annotation/AnnotationFormatError.javaAs0WPprks24 kKT&L{V"pnFV[q1",Ե 06bI̞ʈɝ,HY*Ѫ ܖ4P 񍌕Z*bFCi4b'Pڡb#k=8HBn۟3x<z 4ڜ6B5Hđ6U\{m|Y>ԃ^d- lDTX3k-:hQӞ3IUz:a۔:#׭;#G?m Q#GizteqC\&*X,1[d7*]dE=k݄ CO Sqo9FlCȂ{2!_er'pAqxb/"o ޫ]4QԂ!_[mv͍>#UsnPU7ݟl9^x(rg7 xPK CPKK>FOSGI-OPT/src/java/lang/annotation/AnnotationTypeMismatchException.javar0)v|3ZL<N39bB0d]4q~.Eވq03X_$R 8j> f+-h찌!7XBJ4c>c$h 9L`2&Gu-ۃz*!c@(FkpͱHNadc$gѩ:s8}a"vtiSM\e=Dk^x֑+ζUV` ̠ǔ:#{5?s)$>%EZrn6pymU:ݤN![]42My",TdvE%8ޡQthZaZ-,=FV8W A@sA?؎E1Ek?f-4KF&f᭰-sY7CU3T+'Z|<F`J"w-Fcf(h3>]_ \آrS7z@R.Fȯ4M[}+PK PKK>1OSGI-OPT/src/java/lang/annotation/Documented.java}_o0Wy UY߶jRY6* 49B۳M({0U=̃3XH5h,L++m9|>? SѠ>6 gr+Љ-j;H nP.s:dܚbBZ 7P*TJՈs;] G( xUð=iMx,ⴈxj%Z44鸦70ETkzXtԽ斋fFֶg͖BH?PlL$* )&9*bLn[*6(-,E.2RQIRdTv&wq3ZŠ׼DӱԂ:zύ!i[fK/rBϣ;_g0Ac?._[((79Zڦ遵~ZĆ _Qj?b ϒhx$na JӬ\?u{PkF>{GPK,PKK>2OSGI-OPT/src/java/lang/annotation/ElementType.javaeQMs0=_㓝`2q!822^c TIx:]a:L9}ڃk:u֢>YW Ȋ{if,w CѠ~C@ d#*j'xET ` sMb(]-?,C8*Tk$m4ΙXMrsjPt:;Y0 5&ⴈ?k+44&3pE*' kTS=ha}0\9cCh4KbH ߑ<'l[3sI\@CLNw<$h)L⼼"$$GQ5YFWԒB ՐiD+,ܠ(矎偣 gV&[lQ~{W,M9k/1+Z6*NwIYӺ"yybyn7=\E>w99PKYٝ@PKK>DOSGI-OPT/src/java/lang/annotation/IncompleteAnnotationException.javaAo@xkHn U+jd$L帘lk5E7Rloxx km,DRп} pa̝`NV^ Pi !DʟwF 7}'uW!eBJ3ZڥTYH,Z#QBT(.<7PK: PKK>0OSGI-OPT/src/java/lang/annotation/Inherited.java}_o0WyJ mդmhT@Vi2B۳M(wMjx}|Kp4o3m9rz[n24A}½OW( {`b=%|Gmp`ikrBg<x_T&Xgrq$C(x+jM4kyB-#Pܸ;ev\/W(<3Nw>4ԕwҲUwDAi"6OE&6ٖR-^,nN/JV1($I%F Ou%ՁkNfƂfPGPKgoSPKK>0OSGI-OPT/src/java/lang/annotation/Retention.javaQo0ǟǧ8)2VuPY!Fl6wߙi<Ap,5 #i8%|x3n24A}ĝO䚗( ;`b%=6\ 80u.E/[8$n ޕ,p<v?] lF(ZU=\{kEt]糁ؗ2J5Q֢Ac@ϖkxSDU-6)f4\s0lvXͷ}ҴߌTc 9އyϝm\|J܆Y&EfLU\iB&'9 Ү䮝)B'$/4QF@>pjpl~a믺\?wvd., -mzdM-4Ե/ςhx$jaB?L]avKy}{?0dOyPK0 RPKK>6OSGI-OPT/src/java/lang/annotation/RetentionPolicy.javaeAs0x 2Ԧ\B[Oݱ!YZ#t߻w&`[*p6g+ǸHm+ 0Cet(ɑ=.f 5)G;tjG@H3dx VgѐMA;J{tXC:eK皌T h9J Ӡ^p W~<$>X&i.Yee^-1kZr~wҲ0U-ڊB48uR5S8dvy+մleM( Y5§ʪiy_iY:[V(J,>[gEΫH'|)[гcQB+3T˽ٚj:}" ٣tawAG酿 %Q}~l,kn̓ cgnb7 __UlrPK\pPKK>-OSGI-OPT/src/java/lang/annotation/Target.javaQo0ǟǧ8)2UuPYM䐃x#gPTLj`gR^zoaZ ?p3Q"LWs!sJGLxZC v*Vc jåsS'YAH A* mPʃ:nCőf[H耢UP̎õV |6RAsҚ*^FI$Z4h hrMo{`J%ֆu 5Z#Ŭtԝ斋zFVc͎J(10803麀0¤ i8Mhdd5QUU@ܵ4E!Td%&<T(nX M2;lUKx3w>4ԅwԶe{@AxF0MiEג&ٚ9=Y0] D :WIbs6OSGI-OPT/src/java/lang/instrument/ClassDefinition.javamOo@xkZV.jd$LEU̶f]㠈Ypvo8> pF~1,"T /~7|s%U)K+4jEnCHjQ˄NJp ^ F bK̐kY讠A*z[wZ6{:wێN\pAͧS!Ls8n6GǑ6e\6J,e]յZH/5*ĒV6!9]F:V]+ yJZgqφ#Tc $G9]"n-&!G]m|lSq虅>Y5r- nM( ޑQj2[iZ-\yL% w _;yl$7lIQP7K&^ E%ؿ'!ɸt2G1G&G?~8JIIy}!T@~Ytk PK |PKK>;OSGI-OPT/src/java/lang/instrument/ClassFileTransformer.javamM0WzjW!.P m"5]V+aNRCbiBwiVt=|cW\B5'-ʃq>MA@TUeN0M>$paغJ[2XENZ' @5ߐ i#Y0+ d$NO k!Ƃ:aAő2\,t;Xۼî˰:ךp/VIzC׭g'r̘,5q*Gia,}0jr2{aYk,푑_P(J!NG>Jw"wvwv%xf Mw& D=|+9h1[!%zP3i(ٚ,[, Ju$-4kaܵ;J¢CrB=pB񈁓 dmMνx8K@EKijV=N~[ #1+2;/}˛wo]b6$ -_)ܹZ=-.z@Ugk*JN,8~{PKE{PKK>BOSGI-OPT/src/java/lang/instrument/IllegalClassFormatException.javaQo0_qT,a}QED>9vf;T2jҴ<$߹Nr swreE"UJ ]׳ه)qmaE잪ɽ,I;,P;Y'u<8FCi4 GӡGh9b鰕@ZQzw>K a6^\WK!OS}qll%|L=zЊ_xshfU%y{+l}/,J:oo_ xlBcȊ>EVLc|X1]|- ,W/l-s^!͟-o CkCƔa[DAakHRnet݉P=Y͉Вm  6J6 +WhDg0!"kH66OSGI-OPT/src/java/lang/instrument/Instrumentation.javaTMo@=_1)E4M:(N*am-YWӊJw߼yo>;l! Zh,t9 3#t.́a&hP1\J;C(_sӅo >t\NBPi4H@sQYbYFZӰ8%pp23 PnFtYzUUyVI%.(GIuu%r44*&"U1Hk*Xt+-YLm4:yTڭk$*m8~u$j ׃dLQ ? /~pQS9 ܕsE$r)(yc&eVCG[f\^Eunٜy̖ {ReDդY)V˚^%O%T3aHi̘s $̙нK")sњS)TJiB2GLdzeܻe̴Qְ cx.Hdhik>Cy ZfR*[.i(lblC7+}ɸ [s7ǻ4sD;W) K&mXxfۺY7Cos=1'gݤzO;ee`_ %8 ] JۅZlX^Bӗ':A^5>o&Mb[PK6UyPKK>AOSGI-OPT/src/java/lang/instrument/UnmodifiableClassException.javaQo0_qT,a}QED`UMr ۳RT2j<$w9Nr smV{q9*6$gS$XN9b&ȝ,I9Щ,QgL񃬓Z:aFCi4 Њ#1C:dCǒT(ukiӜa`.O{)IIqm4^eE^,޳F5,e#aUزF5J/U=; KSIvMh4M(Y1ȊigojlQ`|fl ߳v x=L<" 7v,*NlM՝ >Ul+]Vid+𧭿|AIqο88`clג7鶜&FȍjuC8 GGOrSn0  ?;?G PKbIPKIG@"OSGI-OPT/src/java/lang/management/PKPKK>9OSGI-OPT/src/java/lang/management/ClassLoadingMXBean.java}Rn@=dG.9mQ],4-nwwc)Qro޼!JhvGq %fz~[ {ϴ'KHU ^d+J*eE܁ XgBJM'&h'C'Ao5Z\v $ӓAgRNiPC#_|_dz|Q4 CP&j\m&6otAd- '@ͮJ,k(b)z0 , hT:#޽ GIP, fpgI"Iicil2aK<٥|q~ đqzO6EȈ^YْTZo[(KcDܥvaѬPKםSPKK>8OSGI-OPT/src/java/lang/management/CompilationMXBean.javaeMs0Wdg\psks"2M!Msx IޕM'NFwI.#6KôLJIBӫa0lB :{L;Q9BhR#j9|CH+0 15]AЉ(w rАDRPΌ=#%(+/\pSs^{1IaQqmSK*/VX$:dy°ZTUZA`ɓjta1`伥LG?/`ۄIZ@VL&-b YePc٤y Xo`o2[|i_vȖ=lleRE(_IhI3XSC5^ޣU<V##/1\$CEq':T:2}nqm#xK:# ނmb--\t8BS^ȳƂJk@d"і /PK2qI.PKK>=OSGI-OPT/src/java/lang/management/GarbageCollectorMXBean.javamMo@W|# nnmNqSKivw&Rhg%lvrVBҶRaz9 _gW:ؠC*b/r'KT+UhQḡ Ze4/Ku8C֐j"DC 3# iw3xx5tA7>կ A}zvD[qmZߥe/?3uZt,卋#T(h 9ҞzjBpAX2tde^ylP0IrH \'y^!Xo!ll.sXo`nm ~MȖ<7`L<"oj}FrKY˒WSM/F* N:+/NS^~P/[EeN(t*0}nq|շ]Œ]=^#ہBUUvWKsL ZLн)䶲CPK,m,PKK>/OSGI-OPT/src/java/lang/management/LockInfo.javaeAs0WpZOgJ0qQՀD%awq4Io~o5v"|;99w;@n*5Qa5Y:QE[g<*ͥ`;[a{@<ck eӎh=7ۡbIia$gTҪ3#li?M}l I8Z$QUFA៎+J큵DXkփT*tf7\T>hY)6F3ovf)ĩ _4N}koWx 0ċVkV]W A<8id_Ze&<"oJyB-9EU*JP J-k{ kSfwlМoc &hAaNe4MkFK?Ǣpp ADFu꧒a8jo?ܡ6a rf6ljs58{HR:%15ZN]-=+Vh:%@tu=k#meꏎPK8mPKK>8OSGI-OPT/src/java/lang/management/ManagementFactory.javaVo8~>OPq۷,]~$= |9!E;i mxyf}ߌ=fW=K{6[dA4e`)#<00chh3:T@ Ⲅ򂮠+*Am)9I/* &80j(!#{BAYP`YJ>$4W8$"iSۚAJ``"NpCu;jDןR*Ԋ !7[]DzU7yJ$d3^*!KԚ }JhՕd VTìX$[hO1vp8QȉF cnǎA'vW_OF@dCr3@LpQz"a-&lLoJ;*9f9+(paR1ETm:K{=#52ѐQn{yjB=;D ߚ5$B%-ˆ,׌ǟ.l_gg?GT~4+ 7oqM]ڲ.JgޙS{ak[q>qLtE<]ĂY"MWg>pLY;y49ۙ~Y[1gAEL3G0Cfi{ld~=,b ms he[h "S|6T[C*%^-;OSGI-OPT/src/java/lang/management/ManagementPermission.javaAs0Wd(8>mcfraՂ0d߻iLK=Eg0kڽbXd%⪒BdrЕtK2wTDeNPNa9Nol. n`4FIC5!֐Y>B*MhÞAőnhV-mN!}xֶPFQu5u2-SnTE@NjvCL5VG!JMܳRLd i> 7#[?؄(ΐd#\YN6Y}Zܬp/qJKUJ)}@s^ }Ɣ.-"#ziH\ndTىP6;Ҋ%]K0`d*YK+—[y };:ٰ 5);ni+Q!~yj}>,U Ǽ/ԃf|Md!N3OSGI-OPT/src/java/lang/management/MemoryMXBean.javaAs0Wd\psks"0M c9 X QI0q9<}ƒ XvZ琤_º&!s|qt2 >;8{Q,j[9|CmHI0uؚ_9{Bg=@I5Z j'] <*Z~+O =ֶ{_ ľUP&8]~`qj#k44HDTȘ=( =uɒf`Ti{doB;2MH)D4Jg)Z%5:OSGI-OPT/src/java/lang/management/MemoryManagerMXBean.javaeAs0Wdg\psks"2q8I3,x[TIx:]a2I&`YgTh;3d_!! ba8 }^iaː5(- =BE3;4pS/[U8T:A*j@$#ZOn?3xx=Toм^ AzxOQ}(P:jNZ]'U3V6h-ӑ#Tș=(6=-B R'$ M֝ju@#y"hZZ-ަpC\(88ۆ\hQ@w994^cq=H%rwϻ3J?~B$QIEv?YމJ_PKPKK>=OSGI-OPT/src/java/lang/management/MemoryNotificationInfo.javaQo0_qT,mhYh4]ק$7cgEUCQQu*@s{L<8P5{ͫa>4!3# ϧwc#-) ,Ѡbᓃ3YZYAOg Q$S:5͜^P=He5H@XrU7=ڎMӻ8=23Uy,f{0v;uľDf(ɢDﺒ[iXCT9[`;PXYw[.1Ul n>)/#~,ژAA Sؙ\ǫjr$8 ]B&x ]} q2Rewv&wuN2': s^FU*JmQK57X F[f\_'25P3i&%JeBgR\2EGuGe " ]%e]m#y406.ϕTnG,^/exez:~e`qe1^r;Gpv2ՉZݱX5(52+-Ιeh[-AB1Іvx$> O[)%VC>ݟL<PKr7EPKK>7OSGI-OPT/src/java/lang/management/MemoryPoolMXBean.javaSMs0=ǿbd599&&!iӃFTIa:]wA`}zVp #7+ݬ Hd=?z#-LѢYc'J9T2Gnifpr%,B:mӻUA6 "qp K.)CKT[i5w朖+C-#8MK 0׊ns|0:dPb X;G$ m\  `TelAZA`A9U׆;.>Xt53irnʽ2Fj%lc:Q qځ(Ӿ'g_'Giq )&U<' >C<8et>i; ۹"$,V՘%Ϩ5YT@(@)c$041ׄv |~Dؚ6,@]ZdCd4,*%n_"'8y4nKiB]g'BlEȏT%]|Ұd㧯ih{ϾIos+*fh]XϐMɏ}5cZ?8;&6V1OSGI-OPT/src/java/lang/management/MemoryType.javaeAs0xS1v r2i)8[7Y%f|Xjs9xLDֶR0YXÚ#v&&h^5Ɲ:n9A0&E88Ai{Hl \ ̈6H8] F^_ !}~ޛi: C"ĉM^.ϗZaԃj9XKˉ'T2k+h X=`RI1rPdjYWq0y7wz|U\cY&/ ^}DV2OSGI-OPT/src/java/lang/management/MemoryUsage.javar0)v| {j}2MQJؓwIB vƁx7fcX%9eədr?}UjXFuOg(4;T`a2~\ p`ԧF㙵8*v! 4Ƀky k\@&GkwuzKL #95须goL%ڶYGKUEhGOmEZ¿ WqzVURb-Y R+RHK*n(<27-Shmv\Ƽ3#>ؘQ@kDgM͏vzƛhj U6*7G FFuX+ar;-B!$]csQkhXP*AA^&)y 3]迾lqhov`+&(P03nR&d%#{:m?9 ꖒ@LM2OSGI-OPT/src/java/lang/management/MonitorInfo.java}As0WDme3i&G!$* cO&=+B]<ɔƒ E7qU &95]@-) lРc3ZC6 JU4 &$vGB͎ y $pU7Z'38x<OSGI-OPT/src/java/lang/management/OperatingSystemMXBean.javauRMs0=׿b'<7ؒ1C;h?޾Ve`dut0 ⺖jz>,B#KDEd+)Kt H(7e𙌕ZU/MC PAg1R$u ݴ^8gBLq\|^&wt}E}߇82\kmޤUMւ40J؃6!9YF:%X] yBZgs/L͑?/`P,!gpI Cvx}!:Ko}|{qv ĖzjW4Eȉ^P(mIR +J(V-FZV SF:tc/]~P7OzذAŁnqLǠw0ӗb7~sTb#s~Q?O(k;ƎИ,tɡȭ"fA PKy=\PKK>4OSGI-OPT/src/java/lang/management/RuntimeMXBean.javaS]s0|ƿ&Oi'8o 3nZCt4sqlIH)5_~Ǻ4܏`Fnk~3ARUt?<8x7yߋ2 =\HTF/ t,y2@+4P hx o 0>KPY \IC (Do5=۶Vql\9~8NGg쭨.uރß 9qo@YQU\V@&n1rެU͒<; F ) $4I \/9\%Y2gLg0NNy:'H&5%2o D&8N2 +s'[,hEXeJܠ,|8V/Xv鑯0$軺QqkeFǑmrISct+%G=k4SNPR$"Q"ãJyxݗzaⱄ#նĕM%Sۼ?d݇gU@*`zi+{Y9CmF>hdf3|0ߡL/_/Zԯ {O1U;5'7+~GPK_oP PKK>1OSGI-OPT/src/java/lang/management/ThreadInfo.javaUr0=jhnmN`LӃF,C3lS`JR{zxց3bcDr}şLqhne{9Z4kLb$ׂ@4Vqiw Zy0tۭnSlt 9ۀJ!,B"Pu^*Vu+C/#8} 0׊?+aUUdC`:LxTQ7J`W) 9^n%imeii2 U̠IuF,KwPF1q a܅qOr.>np;"0d]pGGw%T2ʃHlNb n$H'k*+Y5E@ ՒH \/hP=Of rh!G.:EjD.VYTcMe}~4< H{|L&m+֕F*9&K=&]*Ï^B/Dσl^з#m>.b屳J S&ͯZ wǖvپo[}xo<1vԢ 8NeMO)iۊguz1Wp_?"8ݼZ2i8<.iHw=Q1?)9gJ@nMW8UB9I|LY)lg^ NPKPKK>3OSGI-OPT/src/java/lang/management/ThreadMXBean.javaTMs0=_Éd\Crks"@[O`h kĖTIN{W` 9}Cj :R5&) /yΙֹx;3  )&>18k0@)`'mb<|GmpᷠU?tsYB qp))Fe e*i3n'<S,#8EtVS9|PK5%4N>*j,r44.90Eb֜@j`FYT4\dhnQiHomL@BHxwC ` t =| ]ZFyIiW䮝)B%!KIFaSSi"+Y)jAB]pjH`hr^p.YQ2d(P˚*#&5΢Nz4ȒWHM[;/AH_m]L#2wS[liNr)2IHe*tp#Reh׹ stJIQx0KFP?˰"[d\Um) khwzPM}=op,tlo#-C˴]4W۰TJ zV;=6T!d8D @JeeGI?<+ y,|RDnPKg2{PKIG@OSGI-OPT/src/java/lang/ref/PKPKK>0OSGI-OPT/src/java/lang/ref/PhantomReference.javaun0SU;ln@ĔB1MNRCjiVM{w r>8: pF6i9*$$L/9f|"#KfGU%)KzUNwNJp.0ɸ5]z^؊=v-1CZԲ%cIT(6sF7k'8.U2Fóq{E0`jD1kdy7zS-Y CzicRٵh z0Iauac*iޝ #2c 8GO!Γ|!IyuW>β8- Uz*G$#s3֔~[DNtP룒,5!4zGFqGljYVn럾AQzdžˠ)OSGI-OPT/src/java/lang/ref/Reference.javamR]o@|.b';r![u5%4 ߑ04rvnvfv`duiJJ81i&KfOU F,U"%(3TEJp_b4A{J;xK!-j豤A*z z>KPCN0\s Dsݧ$>Gű6MҞ6exϪ[%kaKÎDǪJQV15H'U3յ녡@SI,{?l Q#GY> $wvtNlc|6jߐ.3[^OA,S8OSDNJBOlGeTEChbG c, 4I'?_QE@[EhcC,|1Bl\e+lX ?o)z7ZV a.OSGI-OPT/src/java/lang/ref/ReferenceQueue.javaRn@<T V T=nggaFUqჭ7ofގ؝:_0+>IdJIKB|<~3'U V=95!OW9/y:F?z]7;`#v&ң@%Q2s:Yp O1"t:{1mԸz~t_O5"g#;^ ,*Œ*8ׂ['T"J '֏eYHr/>l'fs\Ϧ7"M_đz.:`2ED'*,[*e%KFԄlivKn#}\gHFsH#m꨺LlQ* okC ]-)y!NkK5}^gʃɬQ(4NC7J]bw$6ӄ3?ju ˛noe2V?O'/PK¬PKK>-OSGI-OPT/src/java/lang/ref/SoftReference.java}Qo0ɯ8S; ݀)IƴG7I lY5si<8}=aaZΰ?Km+* Ӌ|^B+-2dvTMdIR^Ud6%ƛ9R+\ L`2^MfWb{lJ;CZԲ%SIT(6>'N\pAǻЇo\wE0@jDQkdyozW-Y CzixcRh Ӟz0IauaT:#׽; #Z I#'I>&Ieu_!β8- Uz*'#&đqzꌟ1ȉNj}D%^4F(Y-Vަ[;5o;zP}tcD 9j2į}]glGE9x3zTO YW2zV> _7PK 2SJPKK>-OSGI-OPT/src/java/lang/ref/WeakReference.java}Qo0ǯ8SR1HlCtQ0ۄFU&56l{w XAzk1-fXe_$B|~w#uJ =;8;Y2TW%i-!DF WS'Wٵ8=vZCT!SAT(]7 n}FGѣXrB;B0!Gu؜&$[e^5d 4ěDT0k#wuԃVڇi+;MΦj0rPDlOQg3Y}uQ Ur*gDɭqzKҍȈd:*d% ^ԄݓV4Y Φ;i=5 =~m~cD[xL"M7ƶJs^I7Y4^ x%ܿG#[r4|PKբqJPKIG@OSGI-OPT/src/java/lang/reflect/PKPKK>4OSGI-OPT/src/java/lang/reflect/AccessibleObject.javaQo0ǟOq *h6Ne[ &=8% vf;wߙB*-~op U"_X̢Lrpx}1]9+L}"8ȕ( P5BP2N6҇嗀P!t]B uz#X l RY CDK BW˲V i)N ܶ XF JVYX[ Ft>(\3 Ǔi4yK۪kY1w%4M)fS]ka`TfkaRaIeH'mLB' :1¨ 7aevM08D0x6 p6OLok8eK& "D$ddJ"Fyr\PKJKaܵ:L!29:5xˁ؊k vUBV/) 8'|%w%JZ?:49)# Y<#PJ<&c,t$ !G; Ny|+F[i *<>uG?w0e]"YJJfTr|Xa/Oњ=NxvD ک*ٖX2 }ß6GPK_l dJPKK>4OSGI-OPT/src/java/lang/reflect/AnnotatedElement.javaRMs0=׿b'S$3h,W. }O FbZX-H堵HB>p ZZj7GLPcTΨAө>.zһg~E]ׅl8TľF7tfWĺﺕZnHqU *Xk R)Ϻ3qٌu̠u;1#I?. ۘAA }%؃%mwry2`"%yH>'l H|+ ۹"d'jd5%IMFmHR͚[VK+#;vg(۰Æk t[CS3s,B02a.p*'ee ؾkȡAw  Sʯā}?7ͰB)Yn/軗k GPKGdZ PKK>)OSGI-OPT/src/java/lang/reflect/Array.java]o0ǯ8Pen)Uvcؙ@QVt%ٸsN^qaB/$!3#NwaVA'\ @rSSxJ‰?[ЭSبlRY( H@s \By%m<8%p[12ZhCN݅l%,? gb_l k*]u-\S TlNZ[24gSry`TjL$X}'J ".QyrξNgpLx^D0h2>gdL.!·p|Rϵdrm!B|!!U[I&ǘ/OSGI-OPT/src/java/lang/reflect/Constructor.javaU]O0}^UZԥo)+BU!F|!a+I6C.Sh*YEAf)/%b)sѫ~Ey؊60A+JbdsHTis8;"Ub_!2LwtPKTnRpo sV zu^Qb.7Z"a㵢r7 &-nǓФM  [, `̠KSmtќHJLpӀ͙X(H4/a3fñKry{FX1SGE!s/+犖J6m$\\:5h=ZPKqPKK>)OSGI-OPT/src/java/lang/reflect/Field.javaVߏ8~>ѾV@vݪ'ʲ ڪҽg;g;PT~c'lGՃ@gfoƓ/ӿ5t5X:LӷR 8B`<myK 3h֘ *Dӥy4Vh/tUwClu+T) _9WeCm#24Q< ȜCIwykHҹelb}Y}2Oĺz$Z [`%lA\%ۀ6 izcmA&ܓ8Rm*Sp5L!I0Ml6̓q dL'tw';FT2MY"O(亦dK"RSE B(J4+aZ"0Rc.lYstjAsWLx v29tUL!+\rjAu~k4暙AR1zӎH5qSߨ=\eJxx[h-0ˋALZ|uz1A/#^ ?gm#|!oPnx3]J6P.5 scm{ TA ,uAR2=]/p(w:#eJ;bwإ6!|FG'SaǪZHbSGtH'Zd`)`guR .tTZ,χ8QCRhvÜAjP^kPT'T"jӍˆ5vSx5 92?NrΏxh\Ӵkiz2a*`oyPKӌPfA PKK>4OSGI-OPT/src/java/lang/reflect/GenericArrayType.javaun0 S9%Efgm=yi+l vW(˴͑4Ik {Q( ԯ?\Ep[m&KR(Ҿ'$z^?}tGM A$* A !7g#:2,bu$&=QL!kz|h<fF*f ]{޵/ A7dXcmԺ>rSG⯁,w\O SIQ3k/FDgs^ђ'խ֏biyK_[Y \uy̪C~U+öo*+r}4oY~d|66tLJW 9Zܚ!tVqG`Ʌ:lLOGŸCo %Q> B?IA6(MddGb[~FZ!'PK(l. PKK>6OSGI-OPT/src/java/lang/reflect/GenericDeclaration.javaeQo0ǟɧ8BRCЖ16M׽mlY mZ|/Ef=L 5Aֶ$D^obY° 6q0!@nHrNЂ#dFH71ܡu\&sx5]Ġ;89d9EG)`Fi=H Jad.~O{.MOIqm\UQ^VXݑ剷êزV-"yT<&k #-m;̴y lP0J |ʼ>o+6U ,2uϐ5/1 [}0ˤ`yP">P$gPRMGSM'F* VwҁЋB4_SEźE"mJvͣZK'.^L?A߸쀌sSF?PKPKK>?OSGI-OPT/src/java/lang/reflect/GenericSignatureFormatError.java}n0SUR1ziV)zFlfШ8aRI?N"\aaUc*gX Y*%az=YkrdT%L%I;,uBo܉SF:c &dvGc/ƣw P@/:!;w{FJ00[/\ge!OKÐqblZ>eQ.?xQ,#DVRlٵh,7z+p0rުm5#G, IV"/'ySz)[b/KX| !+=/ncΆB;ϯBmJ#j%9nzs 9:{³:U{?-+\FWlbnIJV=iJ քt.p507DoQPKo/gzPKK>5OSGI-OPT/src/java/lang/reflect/InvocationHandler.javaeQn@=dGZ6)HIU=,ˀ7bUDud yM|>L ⛀maϯCY˰L hz"R"wXA'+4vf>#+E4'LFh2[z` "i hv $pףAqΨӨJLjΨA_}NFg0D8Rwjz캗-Z w&We(1HS` ̠uF{ڛGZ@1 HЋ<~ fdt]@Uݤ4+$|O"9߀l P P%ZpZM6kգh4{aY-L+1w,]A@9xgֳF[+)JJ͡9G[ВޟƼ|>yx9'n*_ç=OSGI-OPT/src/java/lang/reflect/InvocationTargetException.javaAs0Wdg(8>Qmf`ƐfrłbI'MN#ӷoG#)A^|`#LoamX{5Z4{""xȝ(-V -BX ;+hS/lGA*Eb hQ;Z/v3Rxjд/hzxq}Ǒ2Mܞ6KX'{٢`W' M9䊳 ymYk R)7 ل`Uzfc*aνGR@1 HCk~_C^'Y װ̳۴LV![݆6~)|[Z-Y\ԂhXШ=IF_%Ǵb's?sFqP?=۳c#u-m(J-#+>JftG?^kO;m#%&b:'8i>(F57 _]S}ӄm3d׶ 8 PKP"gPKK>GOSGI-OPT/src/java/lang/reflect/MalformedParameterizedTypeException.javar0)vrJ:AO& 8Q΂- Iv3|GүO߮\EpKmL- %׋Ż9,P=V1$*B ~!3ZGZuiLƥ& NAiCfZ*OSGI-OPT/src/java/lang/reflect/Member.javauR]s0|Ov'o1v[L8Z!QIx:=a:IS`t# V=QL v')0^,@׳З!H Z4G,Cb$[QY,S%pe>cgX\ zdlMfKOq4J;,P [BM;J; sFF]8FpFZ:Uρ(zxεo CmH6&Mo^֝h- CTqVVzXmzN{սNzVWg=M)3܋j$S0sH y=}}eqO692XuOv)>B>$])2Hq9 >K-rQ NTݱG4A֯ՒHPǗ}gGz`%evEI94=bSɯblUB1 pެqY;ZI&$P[#̐8ߤέ.)yGYh-%l~R PKx pPKK>*OSGI-OPT/src/java/lang/reflect/Method.javaUQO0~^ũO- cF;5sM NK;'5C@>ku2"9h6 3):;@? #0BfI@ ,& B1N\B+8zflzaV"q S!c@(zUҖ͊s*+=q2nJt3s..ˀmҮ,3ӏPsa( XF8Vɖ 9U/pBz̠IuFLrʴg&lc a Q܄0'߇c Gp0Nc?Dh8oG48et>dg@2E_IR͐Js"zFQF ՒH1bi+/P =[;ld{WLtd;T B)A'wPsT} 'HکA|B*E/Wu JXl Fʥh `pӟ!%Ke%Eѡy'ըoU8zU4^yu7Lx*&ܖ~16r7ꍿj쨮%|V=v _^g o1zё2Y|9#yq!cf6'ZK+I)JѼs'C7[%twF,jz'Q$ t&z (,hdo,%?,)Tb6h?5PKY"GPKK>,OSGI-OPT/src/java/lang/reflect/Modifier.javaTr0= &LqM&ɕd߻2NL{zou ^D{-Vk / Bg4w CѠO Nd*P%jk/ T;=6BIqv^{Ba4Tdx`nAHH&]T* Vja99rZOme? ݮK}W5)A!Zfh hQM{9Jf|J_i=VUJkt2Ka>kڣG@m^,jÙDnX|9 C/,,8g1/,8R˵K@6ka!>%c"RP4* a%%F7VCN&a-Kr Z-w'oy5&vʋ/jI'}U 30zk;Л xS; ohT ltR'xZ,'N WgD5(&kkq-6\}-ͽKA"0Fuٔ5OSGI-OPT/src/java/lang/reflect/ParameterizedType.javaRn@=TAO& `QN*a; ;lJ ‡f͛7o69 jsz :%DVE H%ztwXHDASf ye4+lJ`!<2Ш%ZANFEc%(ۉH0\py A'odXƵIw*[ojUOU׺CA9xwaY;ډ:ztnMCphjɩ@OL{ȣ?mB, f6jHnz 7iY6TP.l9G oc_.2օ X v 9Ijt;5w4O]|XguTH\QE@M܉8%]DvرkpGO{WhRIBvQGM(F.b|@?PKʙ}]PKK>)OSGI-OPT/src/java/lang/reflect/Proxy.java_o0şɧS;B7XԢc{zvfew #b{\'Ã`A`J)0$~- .R"gF-р[!5vb (A`%5ۂ!,B"5ځPZVS$pi1*gP[_uZ9W۶MX NrWkgd$\I hXMT*Y ҞӞ5 U`uZf,uF3ߌ}5OSGI-OPT/src/java/lang/reflect/ReflectPermission.javaRn@<d"Z㶨( ]L(6m=T͛etӺUn2(OSGI-OPT/src/java/lang/reflect/Type.javaen0DOvJnnmNB9RJf+,IY1{ $]ξ7 n2Tw6В0].ߧ"N-yr'gE$iA!S%wr^lylM.J̀8Ck(Vzd4G;*.s&HI4Ap wF0A_Cc㘉 qf\^?uU1tQ=c2 bq#G] o0 GQf|p›1 И5zOE]iy*w_7;<mQuMu_MŻ(g|+đz.:`L㼾"j7"yKRJ5 #tDN#XrGzG^Ur8(Og!N"';4%ȵywɟ$ PKgdPKK>0OSGI-OPT/src/java/lang/reflect/TypeVariable.java}o0Ɵԧv*I !emS*5ݦ : ,&wiC">I#86KXN`U\MCBIlv ~76G,cv&7$Q9,U%Z;ɟ2;x  2Xt {q=كT DH7ZG~\ < z0^ AvޛIu],zX:iZde^,0pV5Xْ剷2k#:Dmk^Β'UOwb)yKֿ #R UZd4gϫ ܧuoe5W"dW K/'cI!-B G$gPREGSu+jZ?U<{rZ=yB$8xq-V JvQrjm%7wRHÂ=ҝQ%@|:stoP<y}EƩ4{ _QPK}SfPKK>@OSGI-OPT/src/java/lang/reflect/UndeclaredThrowableException.javaAs0x 2Mrk9f`C39 {mɕd gEܖ^miw}*9YmDRR0C(XL%Y2{*"&xȝIY*Ъ ܖ4"O 񕌕Z&c}h0xQ؉#vh-1CZ&!A*z:>=+C'8]pAë2ֹ}w]H*sm|NglUUkU0'!V kEm *CsګtRU!.]' yL!3rӺȣ_&mBadH>$Yr>/+'e2_ %mJs^}D2t~2C Xv>"2J,6R0OSGI-OPT/src/java/lang/reflect/WildcardType.java}A0WzjW%){=e"TjZ:t 4[ uͳn`R}0XҦ!$v6{7O tFedIZU@H*S֑Vp`4n(Π!{|h<f@s@{r Ϫk!?@{!IEOk['Ee6_-SA⯖,w?0L%ŞYс j\:Pw 0&8/ J_AIInMխj}B#0hµ:,MCGK %Q9 F?I6X5(]d=Gɩy{QSJaلQƸ/?Go]jKݡLsEPKH.PKIG@OSGI-OPT/src/java/math/PKPKK>&OSGI-OPT/src/java/math/BigDecimal.javaXo6yO}$J;4.m՛$&xsq}!iZoˋ5dP,jhzt9gDxy pm~A01U3귑 GEL}HO)nD6zPǶ.Wf@$_s1 Ν}wG,^;6K7ޗ"?u7+C[At?blY>"rhdٹR樐5tr4fZh21}FTCO ;۬&0ٯb% AiXLkYB+4GkڋDZŹG.*W7%ϿJ"Ͼ1Dp$=ƒNqՉ['|N|YP;YYv(/4M{j=OCcM^KG :>l|Z_60oұ %v^X??KJ{պ^:v2,#Ku]iؠֶ׎d?#> L_ѳaZ~,UKGou\ q@^ams>$Oe1dF2| VKzP&E|Q{u_AѭI&V_w)9c#|Vcg(ԮjBY>TZ-&nGZ1Z9UdDETT՚x*^1 D|ێF0f}J_d_X_Qk|V ZZ"`R3[v-"q@&<:DjKv&/^qUhPKϾeAPKK>&OSGI-OPT/src/java/math/BigInteger.javaWQoF~.b'r ^zHV#wkՇ=6ڻN |̺oV+#9A7W ,BEݫ]^IZEcr'#Tc(Uh0,DķzX\y:zAt XEƐ!CT鼨-%vj:$ % &͉rĚM*YۿoGtYZTւKip`Vk& ϑvFTiNh) :XZ22,I6]Pp1?ԟ 'a0GSOv|g8/0 ~!c;PӔ.* DWlLdĮ)Bh{\Z &$AW{~9CN[, _w2B fv#S_k*cebEsT;w![c{[[R":4 8]o|Uf5<@h2ށqBW*0O%̛bܽdGxI1Ͽoo Yt[o|^qK!:9Tf86NlS 4"Jե݈ P4V|07.zLa\jN q ܇MֶDuZJu,}K2Y$ӂk䠭4:-_N/})OpW(ԚSJq7:tn˾Û,۱Tgg% +>my62#YdW BiFZGVu ^#JK'qphϼ6ت@u\&%W"?ÎmV5e[dDtډaS 3+ ? {$]=6쏓<-cPKh"PKK>'OSGI-OPT/src/java/math/MathContext.javan@S8AB-ZSahbuw55"!`;촯'k͸?M91B\@߷-^fjFťG %b XLUąo4^6QEe! 5x3\@,7Yef]֩( .=(OSGI-OPT/src/java/math/RoundingMode.javae0 )49%;ҽ9ф2Maq@`SۄWNhr-$wBgūI>${5g"Gf]g!RԨNXx`E/ј} 'UXEgFAᯎ+pUZV)7#-urAL)6:s3?021| (s.<& 4 MfHeFQ|i0u! [ysjMT*yB%#hQ5\۵j,Ln\ח-;Nk9Ν;E@*)-h3Z&:IR:pw}"k"̲ [iJB'Vw. j6Wڸޜ7 PK,eAPKIG@OSGI-OPT/src/java/net/PKPKK>(OSGI-OPT/src/java/net/Authenticator.javaTMo@=ǿb *אK-'7M؃:k;k4V\Ar0xͬ/x2(. tL,Lݓzy F# rc(D YLDž+TK'6S:VlB(4װŘbkj%7˪NbM!Q8NLM-?eYzbI]_q4zIK֠:o*fs⚱*$u"uA˅)B pm!Gjit(\ r'3ςQN'`Lt3$:x+V!BlPX%c(OSGI-OPT/src/java/net/BindException.javauQo0_qT,a}RED>;whZ\'piNVU;`Y|QHZ - 86VA"G@e^IҎJ$ #*S|'Ѹgh(&7dZ xC9lUMCiHoN]H4x,jVy|JbVI}ֺ>/b񞩇]sUoN SIaZt05ougW™`S*ڴbh9[MhY1mZd4'OSGI-OPT/src/java/net/CacheRequest.javaeQo0ǯ8SRemM  U}4pC&4{*Uy\]J飑aZ͐?$ⶕ: 6rɒ9P7uj]MnG3VMJ:\`4-Q؋#:[bi-*CzD۝.*`WK!O9-aʼn8TڳFwjL=Zp%b2!9#9ںA6Ȳw_ xl$.ER̽Coynu,*KoM8}į$xd܇ Sqo;:#YMʊuM/Bd:NMf/Vˀi^:N[rFQz? Ž2}(9V0G΃&|UڛAɚWʰd|j-UNp U*֧S- xPKl:PKK>(OSGI-OPT/src/java/net/CacheResponse.javan0 S9%Efgm il NWHی͑4I}Q6( C"OEgB@7@YgS$ǰdSY ZY#5"SA %<'h2 k [CIځP:v}Aœݠ |An: sNBCe9h,i|íِ`w+ w\5SX0k(XS3 YOАuF;1/#:mC 8$e'ԋ&fzdCE^%$Ky%-:18EȉNd5b+JnM-'##dZL#¡ EA>B?CIn` KeL০z i' <<5zuD&wq;:-WHN4wԟw#dU?ؗ&~q^?PKPKK>+OSGI-OPT/src/java/net/ConnectException.javauQo0_qT,a}QED>;{nZ\'piNVU;`Y|UHZ - 86VA"G@eNIҎJ$ #*S Ѹgh(&7dZ xC9lUMCiHoN]H8x,j{)to>%Iucc>k]ryxC׽9X*ˉ7'0k-: QY7+]MwR)VmZfh9&4FisZd4)OSGI-OPT/src/java/net/ContentHandler.javaOo@x5$Khca Camuw8(gC}zpc],6ݼ$&*'t>0bN̎V!+xIYZV+2pBT?md w]_iSKuCikH, S rZFqNIj .Pi}YZq<4M#qM1(Ov0ǓY:mRd- ab\dZ@8紧ntR}Xv0eV:#]-흑_ڄB'J|8{x,xh')9>^ɌO_͞=A2C/Sun)ZlE\˜;2"_e)V:Ꭱ|A =Bb'BEnTuسR0X+G=tB:g8Pk[|1iwƞdr`tƱwk(3j PKK PKK>0OSGI-OPT/src/java/net/ContentHandlerFactory.javaeQo0_qT4a}QFD>s۳R4RhyHb;JpG]XN+mly ~qX'wmQIҞŽ[!3LWF&aai4Ga/&ʣV-$!h >K$a6A\pQQӳ ~ͲSq"Nkc1_⚩'ݒpS;!,SIaV0qkDީt37u腣hU>8EhG&4Fy[^4<jbQa|YbYyEy7qdY;`L<"* ڜ%j%5t!4@NsGc 6ګ i꿾FYpοѫ8TSMl9@|sÿ:#wZq |noPK%ͿPKK>(OSGI-OPT/src/java/net/CookieHandler.java͒Qo0_qL,оmL2hH 5؞퐢}!E՞<$w}kxtf7,P9{>8lc:hB9)G+TjE~CHVIIp 鍂^W؊=tX˒@9ij7=J ]^pW׍n`Pu,XbPz:OSnTIJZvCŒYKQC[׼Ե^׾J:o'=3 P$Ҭ/If r.f7 &y2] 9ƳeHgS^}E2tzqd|=0 qaHP.2gkDA(bG0d҅:\Rnz+\4">;+TKNbɞE ZKbuwm~G#7;aebujRlŅ$cNi wIkQry\Tƽ8ǀ 8z?PK^~3PKK>(OSGI-OPT/src/java/net/CookieManager.javaœAo@x5$6U$j&r\lcv5;kr>Z̛o؃c˭ʡ0MIDE!J 5f>bF̆ȕLIYP ܊"G'+i8D'tPw%ZlCe5RzHt ^-Z-ݪӪxܵz .(Op-ts+? u]!.x?0u[u ~Wċ-DTX0k!jhӞ6IaɤuF.*w`3# N N:%q"rz3m4Ey*8HǶ0ޱMuDbw;<^ff PKO,?FPKK>'OSGI-OPT/src/java/net/CookiePolicy.javaSn@=D;VՂD9E x.]LY&zk9v͛7oٹny0 +9Bp&+|~?. CѠa#Y zYA;Vgpp%2&cjrp{ÖA* A.Pm7J,N < ::5(l>f08P#̖IETUk)&.:RU 6Zʩ4\>؁it457V'HmL$, )&5,w$&[>0]%qYQ^%$K 'HQ|drgqP HhQ h4EhCƭՐC诹\O۱@]x]_dE0Zo[E=xF@%`\<8Q߮XCugyr8c*H4Ջ:ŞRvL7.sA/ PKi PKK>&OSGI-OPT/src/java/net/CookieStore.javaSn@=dGT6-(< ޥU; R87o 9i 6WIaz=_mC4XDV4X@+ `Q#r~6$\s:d,Mf7NZ8He5drl,\ZGvߟ38'0j &4*_Atm>auJWa=`Mu|ǮGNh hْ掳]"c@iFY\w,J N c5e= # (8(S߉ۻn QDmLabfͫ/[92>:`)♅R L9skjEP#jA@ƍհt +l/wPy!"ho8Aˢ.w#ajF] bL vI G_G9\?ZOP}-jl̔gis6NPKPKK>)OSGI-OPT/src/java/net/DatagramPacket.javaSr0=)'M@O& wNkGHFf:wV -۷オ'Hkųn܃0zsD.uϳ0H SԨVx`I.yBcHPY 9q*ͥ7tNRe K! kHyw1X.FZ͢ӰX%ppȹagTP[ foaL߯cbO?`u2'%nEZ%WxVIk* XΌ+  Zb -MµQ|^~j$ QQ&}gpOd#0 ','-| &. EF}P6·)B'!t1OyLDV !+TAjɵ&f_Qq(o+[1O9wrN Ҹ!ɻ`Rd+{E??S6vuڃ{J?[W^@?Il z:DQJVw̸C=st,G>OlZy M2a-m؊> v"3]Tu%U;%*8&y%ymz~eu";;T:ll@-uF!yVMq~PKdzsPKK>)OSGI-OPT/src/java/net/DatagramSocket.javaUr0= $6' 4LQkPc$W!4ʘ`@`liۧUs >CG - ^]@+rl^Ԁ_u gi` :!8[Q jV8e;5%ބ3(g[ꕃXlRYH 09qFm.$8&aed!0of[1,e\Wz܈qu=Xg^2Bc@Dhx+F5bsPX#YXϵBk`ThL Z[mőRlLB痡=@ZA7> z]I2ϱvM\" ZR21r Nqc5C-)#QOqj``"1ti+/Q*O7D{U)a02oY.Pk%ImlGSogVwJۼmsg9| + G1v}9pJ}}0\ 镔e ΐ M UrTjqdl´];yXv9xO^c镶={ͽc0?vRkqbvu˵麬6:c 1BZ*PKV&t05 PKK>-OSGI-OPT/src/java/net/DatagramSocketImpl.javaTMo@=_15$K@R"4qY캻kw֘"R937<)\tdj0I"VZgLC4{@z4C&c`~8BmpeZo;`Ζ ac #Ԃ<-N>%c%YF Rzo&%76lyrM\va .neƀߙФx+F5a9( lbV9ֹVIۜit00VQfL[s$ dPC*| l8 1~tC rQ0{; @c))BEaVL\'ir D-PKR)0n&sa->r Cق1QUx>UNR,rg\#wE{AõH-,!-$Fi"+6kuxgج}PAȸLzq\N:U'[:heVXZ;ԕtAA#Tk5Ah3-AfIކqfzmEt 8s'Ew^%WFKAv "1Hbŏ`N>(!k35z JiQ] 2rAs8LAkLw1⮯Tm=|A=Ȗ#[ߣl]6sPK+m PKK>4OSGI-OPT/src/java/net/DatagramSocketImplFactory.javaeAo0 rJzzt3V8@QhG#i]7G%.">ؐUW0ug hz62yqQ`M3Rq&wZ  rJ>Ce m \3Gh(&7h;8eP떀^9m@كz9K$nEdU}z[}8ڳ6dw|YVB=tݛBO;e ­؃'Խ׬M3`kS^o;^ Q^AQ{^4< &OSGI-OPT/src/java/net/FileNameMap.javaeQo0ǯ8SRmM #RHWс ghu¤VdKr KmNV6i9æ"$Los,Ö#U1;YrTWY!5x2NjxiLƣ6XtNG=C-[d}ge +7䗚NNI.EPK*PKK>%OSGI-OPT/src/java/net/HttpCookie.javaT]o0}'X}:Mʀ(LI.cgÇ]PZ҅${|YΠB+j$3!.zKsahP0Hx` Q]"|Ӂ[Ԇ+ ^Z,_5ۗNbrH$ n`n",p JښeN}!k 0[.~KkzXS:tGA8uɺsiXF"6'Ai`Fzgsrt]3N&j>Qh{4k$4 ?0;N.]MnfpOx CL?Y0O;:L &wqvB# d2G4Lr $jZDNqj`dOexf.PѠ[1OldL@$ٻ+ȱ)J*^AqNP̟J:CumxgxQ9`&,ZZ̅qG0WJ mTR5T'SIƂ yCHUrVAq0&b:n7(Z-l'G!>cmyemVqϰBre"K[vңsdf7JQnF4G;dL'J̡'')5X@YCiӨd5T_ VS!w/hPKJ6M1PKK>-OSGI-OPT/src/java/net/HttpRetryException.javaAs0WPprk}034 kKT&L{WNK9B=}K|svbUE"k)TA_M!aȼ"#K@e >V,hUInGHQc 񍌕Z*bak4nG(Z i5 jB̀IR<  q B7@ιcw]8ҦƷ|zpݩ4\0U!6Z@TxiO餪BXu0cJiֽhoF.\m $G)8HMH2rztJ{rH?{O8 <ʹ|fT \JSEߦrQPm]/#avy6p#.\; PKl{ PKK>,OSGI-OPT/src/java/net/HttpURLConnection.javaVr8}._q'OifvScI}a-@[rm9$ɿlm!s=: i Na B qZe1~ NWF@yɋ{t.≘g%O^Zspr2>5ytҹ%ew2*9%,Eʁ?;:~ i?O?<a(Sh;!|OR֒ʜb)b"[o<&/,CB8WqQ)N8u#'rok6 ~}/i;xdfI`\xwL}9"aNa jġxlut)>9 ϴ͆GAk%!~̃P)|L8b_yx|NwZno&}!oͅ}~8L=_MV!S3&Yx_FR{Ԑx]e_XڻܳeJ{a*M;Ͼ>R$z΋]7+9W(dQlwcUUdxf7mE+3wK|CsObk,/ؤ3:4 j]MbJ@̮nvm]^G}-dVr5ЃΓ: 0Jz}2_1&g)ߏ³3:0&}E25pݫK!QSPK!(PKK>OSGI-OPT/src/java/net/IDN.javaM0ͯqUSFEA՞q6ةE+{!UYJms̼~8 ƺ:YNBR+пCAgZXEs<"/2jCH*.EBJ&B'Po0G]ÞAiEҐDG@}ա5u:O8N *^&wt{휫q4o#m'OSGI-OPT/src/java/net/Inet4Address.javaeA0ͯx+U/RQWA"lW{4;Z8d+PsHdD4'XN,)ula ~a"G@e AAIҎJ$ #*S$ѸgPMɴ؋hrت@GIҐf hA%y0/]@ëe#g}9IEO[%%|L=L=ꚜ?xshJ ֢%y;l}',R9oզW1MhY1—Ȋiyߗk'OSGI-OPT/src/java/net/Inet6Address.javaTn@=_1iTUjsrmF&¤QTcuw8(ʿwjZr{3<8vFka:yIBXRax>1,--f>38A24@k)t1|AcVpO`.4]8a#v4Am9\bE zSuINCǡW$.8SNtYUi_}mcmpMgq2{ͪ;U`G- ;^@T*+ZQi1*`uN0h2iUM'M;hd}M( D.$JƎ>Z^p.af 0W2|aj -:TeJ-Bx"!{IT2ekEP-ŎB]e)F\Ϗ _!]xUu+QBZ q]eV|"T=f.z>{|*#Gt wl2 ~s{;^;tY;ny&6 T]TibFH\J 3KJxq0ʆ_IwO{%hKnNyUGRsQZ'"_ 8c p[ Sr~lϽDKe. :I, PK1~(PKK>&OSGI-OPT/src/java/net/InetAddress.javaV_S@.b'ph@Z"Z͔uN.w݅:~8REdvo6@B;(: LڇASsa" Ѡ^b# ;CsO Q$z}h^QT@* A\ u.!QVr;u[F9]M7tYʲXS:U i~$ B 44. XNWJPXY\[..5%hRnqa#@ech(2.&p~8 N#a0 OI0 | “. t:.]9W SdrL' !djZRF^pՐ֣Pբ:/dD{ʋ*`d,[~&C\"Ԝ MC+?~Bƶ;pCd -AB:8ڀ!pq\l:E~Ҫ4 r.U)ϕu^S?rت޽K.{O*L*IX8ZFp;tݿI>SjZX)tp˪ݒՔ QC.篁)t& mp&Tkw;#B# q2BP/l4܉nHt-B@ZSFSzuZ5o_2ll:zc$jjBC"n)ISe{M4u4)ݐ@4mPKQI PKK>,OSGI-OPT/src/java/net/InetSocketAddress.javaSr0$Ǚ8`]`xu6Z8L_b)S1@oo#-LѢYaU@kMB "Azݨ7kAiEJ!c@(zYwZs:; ;FpFV>LosmۈmGTCm2Nc͕DkFJ䊳Jւ6*4sڻnpBU!X]2Έqx)$Y~Y^.L38%L0W, qz*|O@6s!C԰'` s8WВ~Ϙ4@5R^R(&!Z"}J2y? k) *Fު8i(ou)[iOK?ڸ}}XxҌ{uW&PK8VN9PKK>+OSGI-OPT/src/java/net/InterfaceAddress.javaR0=7_1+н,mP=g vjOhſ8JmNyG7G-P`}SWZ" o'Oc(aV1Y,D0Fhq-$~uh '0A_^h؉#hC8d P$J4*v* <fC 5k MwϖEmۆs[FE2#YBFYxsQ+)6- 52uk)]ZaʑUބvȭ_86agd${d}xu2`2O2W'c@Cm}lS8S œ-*tو4{;N9?Vs/S"Aݯw} oFuAV%BbӗC0„K9 OA7U5wֈ\ G")RkO:,PM$]# +iVrPdI>n<=jn:}IyαMEp ʼnPK55݊PKK>+OSGI-OPT/src/java/net/JarURLConnection.javaTKo@>׿b *jhn-'m&e=Mͮ;AQ{gCpF}`c{̌uh8 y)a#v A1VbA4H)iuӠx%p`% Pnu&*UUV }4bM֥9T/w V%ŒcAdW]YEJg}pfEaRȪeI=hd\6%'x%q WrW|M$ƳigSޝA4O%c-w2/羋 $^+PlMg2Eh7:z\m D :@7b+B4 rdB\^Fk]𢰆x5E̍g0OSGI-OPT/src/java/net/MalformedURLException.javaRn@<dG.9QmQ]nx.&V[LDT7o<WXld}p3dgiP%azXgF9Y2'Bf$kYTS!nEɟ2w2VjpLdv)κQCg9^6z(u >^0gdJp?r iFspE}߇bPjSGku\-!kaW' ;ޝ!ZVUkmDm jC\sګtRsXw0i*iν F I\ )&I1$wK.8$Ye&$K qzIz;qd<ZLl+ {}d[*^lM՝ >Q-~VGEA9D?IMv;Ne#X7#U|vzp*{i:L? x@7<; ;PK˴.PKK>*OSGI-OPT/src/java/net/MulticastSocket.javaTMs0=ǿb0Ԑ\zJI39 {1JJ&ޕqiLoU@.eP< W$LNp5jT9F.!X>Qh *03/e!UBpvnj8 -@HF熙j.8 tr 4NM&]gvj 6("rwPټ?9'UVdAɕ,P.]+dH. LuGX](*~ 1_TSVL Y |"e+KNh*2:r똫BQe(f."$  䢌u+k S)JY/JF9e۴%^rqdߜ>pWmwBRbrE?8\8%=MoO}ʧgɬ{g3ޑ]~Yv6a艔7Vywyv?PK Pw0 PKK>(OSGI-OPT/src/java/net/NetPermission.javaAo@WX:iZeۼ}C׽jZI-SbŬ DmkN{H'U!oSI\u,_c @VpYyli~CX2-0_`6oe6&qd"ٖJ%NԄZ(-Z-Vަ[;Jsiv+N[e#/'=C;R=X*;t_ +sfp:<\p fϰ0~%B8 eV?_7KPKD(PKK>+OSGI-OPT/src/java/net/NetworkInterface.javaUMo@=_1546U%jDQ6ˮ8(q!M8`yw͛ƻgS |jn~> 9!xc4)jSnzT;-8CmtV!-@* ap.*Y^Q+u*.* [Frz76nEqtX>zXWYc)qM `9JXL\+@i`Fڳʳ.4\f-0jb äXcgDHlLBAaQ˃xC8Q8w/g?ldTr; ˹t"5 drL'Ԛ25G-#Qϸ"zg2[.m k5asH{Ť -D0G[(}Jzڇ*]z_MSk.teLwDO܃E*D+g5Ym {pJ}6ey_$KoQCnrS_}ө[Y.t3ԥ_)5V/> ͥI'k1OSGI-OPT/src/java/net/NoRouteToHostException.javaQo0ǯ8SR1يV U}tx%6MHT)&ss/U+,t{29LVWiP%az=o#J,U;x{YTS!iEɟ$w2VjhLƣ[t8Ai{Hlt,u ޷#Z/ngt$x= .hyBzxvεH đ6uܜ6OˬXgA5d- ěDT0k#zhQ3=uoauFn:i9&&IsREMa$ϓl. r,VmNW ɞ-nCck|Ɣ) zg$R)hDMDhc XyFn+(7!"RnpQ62kwں0|ё쟪3]^wϿ3S >lT8AXPKR6PKK>1OSGI-OPT/src/java/net/PasswordAuthentication.javamQo0ǯ8SR1H扥نV)$iof ]'j=E Lus0: WPax5_Q䷱JY2{*#v& eDJ2p[B҈?}%O2Vjh `4b'Pڡb#k=8HBn{:w$= nhxy)p=:\qu8GTq}6β|ZJ Sbͬ DekN{H'U!oSJ\UhO'`L<"rW}F r# MUޓQ<2;iZ,M-w wz3?(7#"R&AӮ9An%j`) |)}dYcȽ0V_rGW*rOC0Zں~c}+2APK*ErhPKK>3OSGI-OPT/src/java/net/PortUnreachableException.javaRn@<TAO& `Q9(Nzܬ_ή]Ǎ{:Z!v߼y3\D4'XN,>+uln ~tX#{2f@r$iG%Z]FH )uh\3`4F@q2-m,OSGI-OPT/src/java/net/ProtocolException.java}Qo0ǯ8SRemK )6Qk´VȾ"=YU=r6ZŇ9qmCÚ#U1+%I;,BgSF2^`&ci2 ' Nƣsa=Hj=4vD*zZ^^6Bzx޷X ıuҜ{]r-Wyzԭn9X)ˎ'2k#z Q[7+]RVm;*le&4&isZf OSGI-OPT/src/java/net/Proxy.javaur0)v|;;6L24+'w LRvJO|lW|Q_לazX@/3φ!J 1jT;,(OSGI-OPT/src/java/net/ProxySelector.javauo0ƟOP@uQE`"tUslUwNSZG}E8T{G_0Ͼ+$ex|>q8"d:,ȑQBQoI%$:e4.1!ׅz 75bm??b'bM2wbŞ`_<3*Izy>tiGC3*КӮR-.R qf$p *i;a~9rZM昹 EkQŴk벼)rR{U7_Eµ.NqZˡ}sPK :3PKK>(OSGI-OPT/src/java/net/ResponseCache.java_o0şOqTY}ۘ*emH 1-خҲDwݿFJ(7⫀{5\@$!rhvJH!LGiq^Ѐ q~BIJ  ^yز=H[$ aa-*| \muV iiU ܵj3Zorkgu8QWY۟d'vBVh-&*ΖZVS6 Y``Y Xzw#Y9@1 Ȋ8fon.OSGI-OPT/src/java/net/SecureCacheResponse.javaQo0ǟOq *m&emTqp[=i@U!CT]*-lwK2:K }5JUI4n"FzXGwE QdJ j]AȬTN'"=~ uGe؛r=yXS;6iPfk;¦өD4*H`y> :ڄ`?FMӤ%N+G!֏x2Le krj2+fdƁ,Y0qHCf0䃣U[? `ۤ^& =\ m6YmXde>0_x>ʗ|ƫ/{>e\w)@|6$oQњZG#X=Q-ڭg}B$aE^eb;r=K@U 8N_8k"sӧɛN<#CZ_*sn0&n]S)Oc&}1ߢs2২85JV' /kŮIQkDw̳q9kJƸcfT,&#/6p}x=cPK>GPKK>'OSGI-OPT/src/java/net/ServerSocket.javaUr0=jHnmN!`LB^5Fr%B3C܄`di۷uc>B_e+-o(*OS$Ghz'a, Ѡ^`r;C3<F( ^ZΠY5gbrHe!7H@,R|Yg%"N]9#!0[.~3k/rXS:k[ӽ a8DK1W.4e<]ˈgS⚲%( ,HgV9K-Iit00VinDpԫ$C&avm06?I0a4hxLѐ.`x$(>de@4s]E(jMdE,8&%Zd¸"9T̅ez m4H{-'ў5|J O ]kP{PV[mjiByhPkGxz7!-,{lzQTN(cܙ&Fk 2O3xڂ-2jV*Ўu=q SU_oB]_UV^_rw,VVm{qUp8Cvj:eTi:4wƋYjd&b*?K^ZYnlBt!npxIƛl9W4ުJ?bgwqҠFMwq8H+S;0i0u~ëwv}->2U8gzɸUzuX _WFPK Hܫ PKK>!OSGI-OPT/src/java/net/Socket.javaWM6=/kN0E,k` 3ڣPH$Ði `Iݯ_[y[[ddjkЎc$G޵Z@߿n 9F Bp O4A*#`q+u J]UgpnjbR%He!5HX1 $p5K<,GqLP#ȜCBqfsX4XƸ綦t{/{BSƣ%Xq6"1[&i*zrRv4:H([8REIi7@?/C ڽaB~ ~F_^HQ|Mˀh 'g^E(UN$XpJMNR6A9jIAz&+!LXf\fB:w@9kH$cFBſ~: qk3ݪ=}Q|&&T#?f3k֍QIKwk_Km§.>mbw+')#mG$wc?T=:>k̰Z+ݵޡtcFԟv Kd`D%%wEo5tF|?6a~:Fj 2=DQwGR&,^jĤn'7f2>)̟E@U^n;@X+(@SUjyq #!Qߓr*)gԡQzt۸/6D]!z8C1Cڳ yS] 5nVAѥXێ;+J=}B/f1^2˪D92ņ[A;6rgt˟SBz2(OSGI-OPT/src/java/net/SocketAddress.javaeQo0ǯ8SRemK "RHWј6Yk¤FdssLr KӞS9ú6Z׋ŧ9ymlBÆ#U1+;%I;,Bg<Yu4Lƣ&HL8Ak(j,PW~?U G SzZ^Bzx޷_X ıuҜk]r-Wyc׽n9X)ˎDTRڈBԖ̛@[啮pf{a)Ty_/؄$-|Mlc}C٤6[Xo\6[4,82Cϭ S8ϷagH%vJ5]w&HV#dʅku XF~WD~5JNdBzF0aaK Y%w%0\Mgx+(zPKKiwPKK>*OSGI-OPT/src/java/net/SocketException.javauQo0ǯ8SRemK ) Jl6Qk´vx\DRcZP_%ҶBUba~a&GHu AFVTM~OH3VAIp/0 4]p'(9b 鰓-+2R3sF@QCovW׍~S}8ֶIsKn*/WzU-9K:ia[fmEm!K\:PVz9^X 2tm߄n؄$-|Nˬl.]|Jk,:dEΫ/H{|9#s1e|( NVlM5h>UAp ʃ[ %Q9?(bE*2ݖD +u@~5zcѓݹ]8+Ԟw_S`).9frv1%OSGI-OPT/src/java/net/SocketImpl.javaUMS0=7bäNz$L e8*QQ$UcޕmCsp,i{!w; X/6 5gh럜oHG];h=T]1;R.ݚd29FE lVЋPYl^ ϥvƵR_ 4$ԉC?PccXdت19͝-*PC{u|a-iXS-kK'aOih~A{57G**S*jBPe6;y=ZOҷa§hoEkQL)|ѽ.V .oJK(s&u:PKL , PKK>,OSGI-OPT/src/java/net/SocketImplFactory.javaen0DW |GrsksRȀ4ȑW2dIʊQ߻$Au@pPE ̍=:re]!o[%$fS$XENJ<mSv&wJEv ɟ2/r^tqhr-^M@=GZHJCzv>K$a6A\˫" Чge}ߧDdY볻b(%SuKN9xsL%ņY[8ׂԽSAf o Gf|pjӅ2joyUThP,xW\ X˒WG,ʛ)#>b]1U|> -IU+ɣ 1r'%W>^gmi^N[eI9?G'qpn rX\-z+#)w+d0?ɧW}Vt$mo$PKpPKK>(OSGI-OPT/src/java/net/SocketOptions.java[o0_1 *6\{VBڍJcV}B& mgmCVwҪUsxBG0^tctE,:vBKjQ!+2 WWl܂'S23V{j%r |4HBZd`a@ȇV * ri8~ 71eʱ#UODgr]j l{Jf iHTˆ<큖kSrVf%Qb5B{H(6CۍpF~Գ"7~cq bߋ0fď}9-\HQ|,l !B|ea-tXZ-ORCSGPz^&++ae [- wr4b),jz#ܣaAoSME3жB?[\ͧ?vx/~;0>"-@"+ElqFWN&2wb XQ3{y3w_{6$t^U%܊NNp|}6??<(<~oFcʳoAS^xě6"&ҧ!;]h%K+OSGI-OPT/src/java/net/SocketPermission.javauAs0W;>QmfqQ+%* 7&R>Az{L.FT[!`}H)tz9z~b kFfELFpT hT!f X\S`_8vJ;h,P OkB׻Gkv}zO#9ʡ롻ֹdҶm:Xj"Z;IeH}խh-C8ˉUV;=ukեkAoSfh}(1$4$K7K7WKdI0_-MZWH#]^idj"(hjXP=EF֯`m \wt7==YP79M֭.e?y@UaUyCc=O;TghOC_qFCd{fcx2xP.HNr%aJVr׵ҠkDH3 ]» :xX&-۹.pEl{o| PK;=<GPKK>1OSGI-OPT/src/java/net/SocketTimeoutException.javaRn@<dG.9QmQ#(5OSGI-OPT/src/java/net/URI.javaVMs0=_ :ԐLNg\BOSH140Q+$Gqh&+p3!|ri%B%B'3!TuhPOq#9JCH51~'5p%k@%G걣&lRYH 70o"L,p $|)C ,tFFb"0&,<6W)"σfސ՗)T`,!UV2PXYTg[.5hX]2^#^L ۘBa͑\N~{A+NI :m߾oAHȑ|?ԿHF@)tstGL\Iu>yiK'=N{&چ_h$;6pi=$(Nh6`1sB S3A/^5ޕJPK4_ PKK>-OSGI-OPT/src/java/net/URISyntaxException.javaOo@xkKhk52 r\`5kwwA=mHK}yo3ፇLeg/aQH2B<AH\AB;8{2F֤a?懶,}WRY;q*-jC! 6 !B*di9#cQr6ni@Aaq5h:{TKU1;^!*ĊY Ѡ&Q7ZZrFhr6kiھoFn&za(SFLr0IxRL]1}F?[ CJSq¦<#2Z䄼ܓV*;iZ M!w ۆr ={(WOSGI-OPT/src/java/net/URL.javaVKs0>_S'=4JRpPuHFZ1iJM98jo_+&]X9TZJIcv|U ^A)!dzhJEJ>uhP [VmכX &bdنtHS!664V<8-l V H+YWA7&J_7,9QC-u]0lwQ .P'Zs`[&-Gc[A^w/<{]ڇVޅݽ: <>)}:U,)cȘCӣLFfVsDHЛQr"IP.wԨT8_31Fڭـ3BA;p;.ו&J&- ԉW n%7);6l8=q=D-<|c$c󮽲묥8 Qaj҃w<\\\W;eWa O7BaU cC3'? { ''d?WF Mb+PKJ PKK>)OSGI-OPT/src/java/net/URLClassLoader.javaT]o0}&Ono0E5ӄxp#4wlKc AZ{ιbEy.~51, -&18( &P55BX0N?͍Q$#;@ Na;Bi8Txͱ $p)kZaqNP+(]x=VUqt6X3F,$MԹ2^䊳yYJ4ҝUu2VLIZJ)ڝGJ 1 0(0bߑ\D˳."-I 糓hg;pv ىH%#.ˀl W}!FXHޒ)TpJMf%2E-)#(Poqm5d0q4l}(/'4<7GtŶ,h\Q猌/c*~-yI[`whh;ο|-ӣ-Ew5ڢtwO|hV#ۜQmsԧ[wvtEfdD,I(o`SӌS!ɂkuwiE\1|dRh/ߛhK-Ay~\[%^UjsL,7{0O)صVU3fB|R;4ZZoG@bIȻJ>PKK>(OSGI-OPT/src/java/net/URLConnection.javaVsH .&O$ҷtrBC;=, 35??y~VU ` m&așo{/VS5 !XQh *0I:R[mp..o,Nưf;@0%u!Hk!:#N˲"0=n[%;Ra#w0{(j.BsE;`E-HldFڨ.VriL 6/bSIZ#Q/+Pژw=X/~2tܡ) &[wNt+|pǷ@JHY&Lb%LC|}&V1[! FZsm˪)„| 3ɧ^Qբ@J>O#"۽\p!y~WOp.)竧c~^c2qGo阭#,Dx r|0hn|"OA<6yJIxz>3ݨ[sn\ YlxP}cv քw5V㝵v#ub__8HFL _^۔s#6B'{{_;K+ ϩJ3{5u鱻Srm'޳ !BhiSAo5n7 t}l8ZY~S?.Vs#:駲PK&TPKK>%OSGI-OPT/src/java/net/URLDecoder.javaO0ϛO1(Mؽ\6FEAJ=gnY8GC"%OSGI-OPT/src/java/net/URLEncoder.javaAs0x j\&43QȋQk$WqL{Wi餷`o}q1nM}y BZUJhI^M(XL%9*bV"JvTY!OYU<0$ `t$^G5VUzT{( iu**x j^m!|=;IҶm,:2N.ng|9X(o5SIaJ01oukWo S(4/^yMh Y>4IyV_2Y]s^}B:l~7e܇j&`L<"rjj$Fj5ٽrXAR{%Q>BAĚuT7v ^ϴ49HcR/X⦫ @Htѫ_ONF2-u7a#+OSGI-OPT/src/java/net/URLStreamHandler.javaTMo@=_1~K\ "L؃uwwBr0xg;/ӵQl4a& g"@hv'm秦c0&Q-1t\2#) ;*ͥS P/]fBe ! d kW@.ҒZM\)Q,-10 gi̔_lLacGlbuG5.EZ_Wl ,%Vׄ H!s Q)0!FYfHlL@=mAnz 7d⎦Їz7o4hdTWMnL|GrCI95e,B EڎU$| 3/[S?-d@ӫٌ6Y` H1\F![\xBPwWe䡫ф;+i0ͤLdAD7J%S6N,B)s#ra B39s%ietw=0,D cR{x"K 1q_l!1C+ȿc7ľveXEJzϥ㍇ŮStRʗutj]tg_JBʔF>M\jx4[9]y?Ng!҆"Ӻ:{ 6y:h^WyꀷwG;2r2t\] oPKDPKK>2OSGI-OPT/src/java/net/URLStreamHandlerFactory.javaeQo0ǯ8SRmK-"$86ѴJm*=YU=rU]!m%$ofS$eAP#{]d$iG;tzG~OH[!3LSF&aak4 ' NƣsʡR ^$JCC; .Ozr -B?@$>g:i.Z,"/L=tmtCNYx{hJ-6%&PVy)|/,rުm߅ȣplBceVNc~XmxL"٢Ī|eliY~7qd|6L*yED*sAr-IU)ɣ56G'BK\Vǀ`ӨŸKJsQĚmv[Nd+׻)$ې{ŸkWQ OsCEPKQ PKK>/OSGI-OPT/src/java/net/UnknownHostException.java}Qo0ǯ8SR1يVU}tx%6MHT0զ9& pnF{i9C^|HF U86VbȆȽ,IYЩ ܞX 񝌕Z:c&ci2g Pڡb'JjBKU< G uڽnp#k?q#m긹>],bǩjZIÎgJeF65=uoauFn;&ߌlu&&IsREE]Y!Yl. +,6]yƫ/HG|Kđ9tjwyEDovd[*NlM՝ >Q-Z-V^s~B?QDMv[Ne#l՝n9\mHU2#ujQ_ aTpl(|| _PKtX +PKK>2OSGI-OPT/src/java/net/UnknownServiceException.javaQo0ǯ8SR1نVU}tx%6MHT04}=1U+,t{6;LD4R0?Y䷱+dTEEdIRNUd%Jd S0Kٍ8q%֐;TR J}hG^pΨI0j.xu#g\)@iSͥwbL=NmTCЯNv=CLU-66!9{#TuwL%3r۹7fd860I "-B/r5*@"nug${4 ACx)}[DAa/HRdT݉P#ŎВ9H2`eyNa/_88G/SEmQ66Q^r}ɑeL(Ԟw?3<mĽըQ8/PKXD14PKIG@OSGI-OPT/src/java/nio/PKPKK>!OSGI-OPT/src/java/nio/Buffer.javaTMS0=7bS`R'r2m=e8Ḗ׎@\It]9k>}hGpf굕PB+%Q deze9+*"f$RvT@ q?}d:i4GA:8< kנsHTt/ 5{in%(P_ Yx_۶S[Ɨ4̪+9+׀5V- XY7Auk3oR)VfڣF.}8$;8KQ N?ӫ9\dzY<'38K2OSGI-OPT/src/java/nio/BufferOverflowException.javauAo@W3OSGI-OPT/src/java/nio/BufferUnderflowException.javauAo@W}F?[A<2COƆSq^ B/HP%YqkEKh` ku XN|O_PE<8XI}~D 훆6$7V_<]N\%OSGI-OPT/src/java/nio/ByteBuffer.javaWnF}._1\ ykSU"$E@n>,5:\tmlCc's&:>:0_&aER(7z@?]1,ia R`g飲@4X/O4VjwpO]]߳A'PAb4PF؁T][KM*zbU N?~ Rm6(t4[>Hsg`DZ"&WXHA44x`u :#׉;ٴGZz@&\0]^x9]z,e}y_Ƌx>-a|8]M3}+1=zeņW@6%ogvD<̒їiij FQ"cd0`H.}f]h>B1PRdM;bMk?! ԴC؂2ȟ pSlr04_h {?-["/r"ө(PIkGJߵ ÿa8/Y6ТFUtVU[T5+a3S+xQ3mJRզfRE0Wѡ qզXǭx>ב2QWAv,:{Ayp^(Efh#7c}hm#VrZ7xp W}:?k2]$OSGI-OPT/src/java/nio/ByteOrder.javaQo0ǟǧ8)2E{ i֡E Oc6Шw5Q7i<ʃ+XE0H[aU &9z60zn6Ni`uOY `Q!5"S%ڟ FCh4;A5gBc@!*|X[׃N]@qNa`e$gQq.f]w+]Iku\=V )XM8ے׊u4R#Ŭr;-*l4:L.b؋xT6&a#XiN>ʾ&w܇Mg*d$(iEJFc]dSr)ⅅB,(dٰT-jIAz/k!Tb/,ԛFQ9O2_ 5fKvKV[,&wqjUn(0&3Ȧpo:ʲ-b/%xB$ E,߫\A5sSynuMR@ mQ~Ѝ?9, WQ PKu!v$PKK>%OSGI-OPT/src/java/nio/CharBuffer.javaVQo0~`)"P#57Pw˶P"w;_ntԃ#87|ᡟB(%N'p0eKSthW AJ@ W3h4NcAupxkSRAC2g!1ˢVI4(>5f r(_6g}l4j(jCc󑺲uw$xBZs`G)-)A*sDƂ-Ҟ7̺KW"äy+祿uhIzۀMh8b8 00p&z?tLfE ΣpF 'xN^(,,+ *#ޢ+JDf2!i:/EZM@`0J.^z=: MPKs+9 9iD bx̲G˰YgD-&9 9*Ŕ5NE%,[?ߠD~6aWQCٱ:aXjͰie}aܶޔRǙZ_-'U?ߕ_Ə0dlqf]Nw>\[Z͈ʮb͍ӭM(;{w'aw)Թ_P;gknfyz]ҷN Bmzg4m^vfE_XS5'zahx6i7PeE Pw'OSGI-OPT/src/java/nio/DoubleBuffer.javaUQo0~'X}:MJiEtU5H.3ہ}ҴeCH>}XB)}t:GZ%4`OM$,P AX`LB+8 zs)V9@i%2! 6PyQK[ 7֩Y9!Ñ ʚ@@W~3r Rhk{ߢp|UQWJ`O) g<]*)kmsCDpUSvp9c /4yelG*9М`ȇ ZoEV:AGm,;pǵwQJ)~C *O@cpމ42Ko7C@O՞Tl3‹ Mt{{37Ձa[\;9]ӛ<¶/( ]W?ټ,TkI|gh#CiuWbj\G]x8鹏kljW[ r__¼^9i,XQ|m}yc K(L81hKdAu[;P;! K݌jPKPwPKK>&OSGI-OPT/src/java/nio/FloatBuffer.javaUQo0~X}:MJiMD"tU5H.3ہ}琲!!$w>N[p ]g: D'UB9Ϻw'GZ%4`OU$,P AX`LB+8v=>+]Ws P@(H-U,^ zeM EWs^o\X){r(~˪[%Z03 VJ\6!sګ^ʻ`uhӤ:#{aڳFN `PA;a2qד ' ܅q8 c0FW0 {2]u2^ 3`۹"D/$dz-L$K r 8#(̅e,04R̅CW _jϿPEē/64ѝQ[NBiZV%2rrf7ڹ>@B`ZK;Cno ]E#Ǘ(kV{ C^c6ngێed Ѭƾ>4XʫxNɈfCNy+2诙3e|Ăv074]? KV܌jPKpYPKK>$OSGI-OPT/src/java/nio/IntBuffer.javaUQo@ ~V h߶NRm*"`'vew( -l<8?>;P+#NrQY@ @tN.Q#-ɒYP>ȕHHYJT)p3jKB+8 >:!V9@i%!,dB]B 󢦶nV婣x&p[S Gv(_ t53sx/V{}U8ŗouu$Y ~p`2WK076=N Vgn|TXgĴtODˑKlm80 7Kt=`<F2h htNh>A0 Ēq+i /纋=5%[P"2pi*/1'⊠ 3ַ2ԇb.E]>Qb@?q=%Y( kA"ʝYVqvRrs oB}֛:Dx R'#s]iR3xDɄB}vNe%0FoEю HcNulh;;|)ИcZV:"6?bv䩑܀:ۅ:vN:C<JK:_9MY;iX~m+[)WcbͰ4X4+qƅYz\={1_bE"L85_P=.嵑~sa)\xC?ZPKgsPKK>/OSGI-OPT/src/java/nio/InvalidMarkException.javamAo0 x))2;mKXqGfIrܠ/xX?.\`nv0'XV_%r5a|9}'i**=VI!Țn!5?yi4.Q0BU8{q6'[X aw3Df'X>m_ !}zv!OY}*NĩqmZEY-3uyG;2U-6̪D ZG &RN)ن^86M #ZcBQ9jMwjbQa|Y^bY ߋz qz.v2ETDo-r+knMh 9,qh^NW eIs~FAZv j%dCi@眈JQ+T)y7f<<' PK 2PKK>%OSGI-OPT/src/java/nio/LongBuffer.javaUQo0~T,m&ۢUDp$ؙ퐢}R!!$ww};OZpC]:IUB9 ﻁ_GZ%4`ɕHHYJT)ps|'cVp f=.V@i%!,dB]B ыV 74^<m|C#m]C͝+>UUX3rhx9\e֍յd-S VJp\%V `n+#Py\TXgĬtD{ȩoX6T'MpNI;_)܄q8F0G4G-|F= ]a|LSx9U 3 ^S%" s\/( 2 a}Y-L)¡Zo.1PBr 8gL$Vye5iG*YЂk<` 'oiZO5(@)u:B9XtឫJ@RM&Jl'1D{542Kn`hB{(CIeCSeBie ,.~^7ܔ +68P#{D}y;=Xؙ֒]h×G!Ciil+GFlkiG E{aʢU`{Fe82Wx9:#`[3>w?SȠHΔ]_KjڞoZ'izJACwۊCPK,܇;PKK>+OSGI-OPT/src/java/nio/MappedByteBuffer.javauSr0=);=9i%S:=#P$#q3{WHzVr,Lsy OR$jA0M'q؆M@:ؐ#{2f@r#iG%$ ~G6(3LY'x GU8xm2OSGI-OPT/src/java/nio/ReadOnlyBufferException.javauQo0ɯ8S; u"FjZ=MjHmc;ͪi4M<8}|w\ERcZΐ_$ҶBba?ⰌMP:lȑ=QC0%)G:U?R#J;s|'VdܚnYw83teKT(ьhH8z,|~-#7X ıM^.ϖuz㩝j9XIJgV{^J/U3ӵ`SIwMhM(LY1mZd<-%8'c SCK W5 HPKmPKK>>OSGI-OPT/src/java/nio/channels/AsynchronousCloseException.javaun0SURenK "RHW1'6!Qw1aZj\lcWXlUU{L B4JhI^/Y I 9G*c&ȝtI&WA)q/0 ɸ4t831C9UCCiHshG^z8g< 7<ڿ BQzxjOI},*i.YeU^޳^7,wgرk#z QY5ouoWÙ)V:inИbiyȶ[/OSGI-OPT/src/java/nio/channels/ByteChannel.javamA0QNɊBvOl6mQW A 0-]ۄ*e`d7on`P;X+05v~V?+-h+uٞ' ~PKxs PKK>9OSGI-OPT/src/java/nio/channels/CancelledKeyException.javamAo0 x))2;mKhqGEfmIrxX?Rʮ\anۓS.`,'XV_r00>LIJyrSv&JT359!o;9u:8 FCh4'a/N06c4e zv:K$a7A\pB˻k!D.S}3qj]g|QVL=d=MѯN9xshJ j:ǂԽSAf oM|pjӅ7Cȭ؄(PT#|ΫFbmcZXTX0_źX|]QNA<2CSq^n *ɭ r;BKn|Vπuj$9F?AFT1Mv%L875wtZA|@t djɎPiF_snpxg yIPK PKK>+OSGI-OPT/src/java/nio/channels/Channel.javaen@)F>ّ nnmNq[$4qY<-.&Vw,P)Q8vgo! \,GKFv %כͧ5*װОY!ܓD将^hR#$~u\XZnEpPC5AC>K4H'3 cY%Ӭ+/8]pS:$0b$mnu}#SUC⟞,O\]@bN -"Ǽԃ%O]Ӎ S޿1?#:m i Y۴uyߋ<}] E~"WH'wk@ೱaƤ`E( 4zBr%5$y4Eh= ku XN%Q>BYĊt,B)Mdd,OSGI-OPT/src/java/nio/channels/Channels.javaUQo0~^~ʼn'mSJU}4;RT{G4K|LXyL TBKpxD| 3t0CvyD r$j9:G ~TBң SFE4>;:Sop[SZlACPDAuIk_y:VYxA*-ANMDb827h>OSGI-OPT/src/java/nio/channels/ClosedByInterruptException.javauQo0ǟǧ+OIAַO46H!]G\mB߽g´Vx0}N."\`iړUU13o i(%azX|ϳ8,c"6 JvT%YBoܙ'Ye4Lƭ* NAGa=Jj=4vT땯sFJ00;/8\pB˳@?J_}%I`[%9%rl=f醜?\Ѳ;vmDc!*KMJWs80rު]4#:&4&i:-b ntIm*`omyiY~3qzlm5UhQQ؛kI\:Q*s$"dʅku,XL ?,+DwGkebY qWQ`ecM]2ڮ%WDt#ԝѦs_Sa< ψPKzs PKK>:OSGI-OPT/src/java/nio/channels/ClosedChannelException.javamAo0 x))2;mKXavGfmIr/xXǏOJ"\av1g(iIjz0gq8F2JrdĬDdMQ^5dwԈcdd Ӑ0CM8{q#֐[X ޛm~w3<z .0۾N#yo>%0 8ڶIwu]\=SU#`w/-O9AņY;1@[Ǽԃ^v~L#r7a_'mBaVȪ >UV̓CVܯeUIJouV4,2CGc)[DEa/HP-TۋYK1`d:^?sFIϿOq:wB)Md [L4%:I5RY7%_< ψPKLPKK>;OSGI-OPT/src/java/nio/channels/ClosedSelectorException.javauAo0 x))2;mKXqGEfmIr/xXa>ȐRv s۞jvc9kla ^?NxUTzȓ;PC4S!y+$?ye Q0BM8{q'P[ t(i֫;\"  Zm_ !}v!TSL_>+拲Zg!h~wqǛDTRlUA48l 4Sx pmjS.Fn& Fys^4<o5*/Ţr-Ų##:tl]1UQA oIܚi:{ g#k XG*p>X(KhSDjMNC$mQBjsmMUIg_#VZhMWOxF$/PK?Y PKK>>OSGI-OPT/src/java/nio/channels/ConnectionPendingException.javauQo0ǟɧOT7S DL)j:=55vմι b"|>wdW 0ɩf0, JI_fIXLyrS&Dȝd3OSGI-OPT/src/java/nio/channels/DatagramChannel.javaTKs0>_ 2ԐN`LӃנFH$0)G&Z}=Vnz:[19h& +)8tN[@ #_ia<ȵ,& B1NKӂh ΂4|Aڪ7bs%( HB*$>p\ϳZ!lէBLǨсB`"͜(bh3m˲ֶ^?ԍh- C'K`lB\%+@`Sg]ᄚ̠IuFLr̴5G]@10(EGq˃F/Û1܆Q8G# 83; .[dxDSx;!F|F!%%!$MMs6EE C3j`a ՞.ߨ][@ S ֲ|BVxpɈ%s(:P%v py8GXuabΜ-ڇhG|(92J|3z! f:MG9x&\f8ػk5״pW5CĚߣ d5D%'73<%h_]Y[z'DktU4:'P7`F%s娆%@\i7hKbv 6|; Gwjx扥{umiinHalE'`R$Rǎf+ߣpoVPKuPKK>/OSGI-OPT/src/java/nio/channels/FileChannel.javaVQs8~.b'Oە'!(tlLss#55N~+ivӷ2…# mށIZ@I>} 2>B Ӏ߸:{`5QO%9} |k:^^*E]gBڇo(C8o ~< /G7 kY:v.V1b;z SDp3w +:4ibƊAŻE>}AŴQl*ޟ[WJ~p8gJHCbߡ0j]&N)vU;,HϐG1,beFnS"Y<.ԏh4scҘ8/`ṯǧ~,OSGI-OPT/src/java/nio/channels/FileLock.java}Ms0Wdg(vSuiƞ1N29 X@,QI87@>JLO<8q:uC(g2Ef>$p˰q6hP1 H\ j["Kpp%,d$;Tj \ }.!UGk-:#^C%Q8f0ۧ66M8P.L/r/?uu%\SXET)KUVh=u6Lɸ'}aڑZmL(!G=w"7j 7f2y+]@_$˨Wu@ٝ"Ĉ/r! SZE BQK*;nܱ̜;nm M=|sBٞ -(ܫꄬP, Ft .UzާJ+s:~E7=3"^>|HH @s[إj k!JX 3r& S5u@ڰdJm6r(Jp[j՘*r*Z/^  lw.'${V?y_PK=cPKK>AOSGI-OPT/src/java/nio/channels/FileLockInterruptionException.java}Qo0ǟOOPmSF %h#x vf;T jȾϿ;;piOV;()Mli ?OⰌUtX#{*fB,$B+;B ɿ!2ONxqH & N^Ga%JC}; `ǁa6^p -϶o! }v޷_Xcc뤹dyî{ݐsS+ޜ Zbîa,Dmc*t=3[ KS)t]8romBceVN![/xHW4_g "YiY~;q:6T*r()lEɵ$VI.Mם 9\Z{µ:Q{?/SW8("SkebZSnp+!w|K#2ڮ 1DGOr Co90OD/Q PK2{ PKK>8OSGI-OPT/src/java/nio/channels/GatheringByteChannel.javaOo@S|# oOqS$Ԋ0mvw1~4r*?o UWhe0.'wBtz?L"^+С=` :UCH(3Z,˜ak4QwGPC@OSGI-OPT/src/java/nio/channels/IllegalBlockingModeException.java}Qo0_qT,a}RE@"tUs ^UfL<8}|w]%6GmP()Z+a$ax=|ϣ4.cKTM$Bk*r[Bɿ~g_伲([M8;q'P t(iwM֩=]" z4<\ !B}!4_TSL>/y9{8* SIfV-:XQ;`#uTPM脣hS)Z]hK& y6/rM rWŬbb~WŜg_ϟߍAסCbb[DIacH!6JrknEM힜А)3`mک i韾b,I8h[EjMVC$M(!`BkV>s-wD@gȖ_^#kPK3PKK><OSGI-OPT/src/java/nio/channels/IllegalSelectorException.javaun0T,azQED^;=Lk5-ldW 0ɩf0, JI_fIIyrS&Dȝd8›q_m`W(>UQM#X[ޯVy.+̗m.% /(o nC XSv^n(*ɥ r+BKn|VςuhWA?uŃ$> Rl*w&i R 6,F4`L/5ݞL}J <sPK-zPKK>8OSGI-OPT/src/java/nio/channels/InterruptibleChannel.javaeQo0WyJ m}biU A\vlMNԪ<s\Ep[mNR@BIfy 4ADM$* A GHW #:2bu,Nz8FAZE@ >m"ߟϙ] <7o }~z$)gX..Zg]^>1A X3 a*)jfڂ,ׁzIukplrR=w2rM(XdUVcQ<1-4g E~"5 W!cRrP!ChԒhE#Zʼn=  6 +D;=XB)Mdƚ@OSGI-OPT/src/java/nio/channels/NoConnectionPendingException.java}Qo0ǟɧOT7S DL)j:=55vմι byHw;'JpmON5`Y}VȵVHz6{7O*fzȓ;P2!B$Fgjr;B ɟag伲 0F8{q'f(:JjvPU؝ hǁa7Ap-/! }~v!TSL_r}vWexé{{8)oN-[IaW-zX8`uTPm腣Nmjh <6a0+󪨦P,xW\ X˒WZSбuTq[DEJak/J%JrkDCh쁜В+ճ`1ZUX(K!"5ʦr'!o(!`-e}#Ss_Bkj<{J <sPKxT$PKK>?OSGI-OPT/src/java/nio/channels/NonReadableChannelException.java}Qo0ɯ8S; S*%65vմ4MHs{*=[= D"LsqeAP#{:f`r'+Ҏjt& '7񃬓F:^`qk2 g ƣsa'NR2vDuF@l`-v~$>qll%wrL=׊ߝ 2U%̪Dc!KMR7s8lj鼕ο #Z IZ"+'Y9&~(|J ,m9Ͼ =o ЩƔ!-$z3$R%wtӉИ#Y%{.\c:(y^a韾B$8_8XKW{5)wݖDF$X O!<#:yҵx8SJNuOѻ?n9^PK:وPKK>?OSGI-OPT/src/java/nio/channels/NonWritableChannelException.java}Qo0_qT,a}QEDPMr ތ){ j=vv scONq=*+% <~qX'w&ehr'kҞt!'VvAKq0Ѱ5Dp'hyb鱓@5Qz:K$aA\˳k!D>)Oř85E볻b({NkEN:x{LU-*8{'B/EF oBȭplBcW(>UQMɦX[ޯW\ X˒g_^SGuѺcQAؙ T˝5v%HNsGk D%2p^X(KW4)"Ҥ^hM$r` g_Sψ_<"ZZ(EPWOxF$/PK/ǘPKK>8OSGI-OPT/src/java/nio/channels/NotYetBoundException.javamAo0 x))2;mMXq"GEfmIrܠxX?Rʮ\anۓS>`,'XV_r00>LIJyrGSv&JT359=!o;9u:8 FCh4' N06c4$@C;*uHaA\pB˻k!D>S}3qj]g|QVL=d=MѯN9x{hJ-j:ǂԽSAf owM|pjۅ7Cȭ؄(PT#UQMc|X1_r],*,W/˻b],K}F^n( סSq^n )ɭ Gr;BK|Vπuꠂ$9F?QFT1Mv[%LXڰpkgq~S SKrdJ Wg3/H^7PKĿPKK><OSGI-OPT/src/java/nio/channels/NotYetConnectedException.javauQo0_qT,a}QED*s ތ){ jZ'JpmON5`Y}UȵVHz60?NҸUTzȓ;RC4S! y+$?ye Q0JM8q'P; ( PWa3Dl ڽBCh?eY85h}vWexé{{8)oO-SIeV-zX8Zw*(L.QNm&?@OSGI-OPT/src/java/nio/channels/OverlappingFileLockException.java}Qo0_qT,a}QECD>;{ j=vr sӞlvj&*%<~atX#{:f`iG5:]VTvIIq0Ѱ5'h9b鰕@NJZQ};u@l`-϶o~>;/I},ıM.Z,"/z8u9K;i eJlUB4xϛ@[npf{a)y+7FncDV5-rL~tJu(Q0/l9SGucQCؚ k[YqkDCh́ВK1`lK/y韾B$8`KDКnQR 8\.uai-wDGOvgJQ#T90n<3^D+PKPPKK>(OSGI-OPT/src/java/nio/channels/Pipe.java͔Mo0 rzzrӬ3VEQG#i7(G9n/` XId/48FJo(BAHJ0‹sK0hѬI b,Ѐ["$qvJE<^t%6ۀTj!,,D!mNœcQ8Mn 0As`4MZXrPmc6'QwYBkZx9Vei)O,`5̠)uFkg#@1 $4Uyߋ< 4qF:لV <tr$˨>k; LNr="Y\,dYTk4:f%%Tb%s|AO^[X %+{zNVS;#;^nGAOPBl.1 s{ ;züƽeO=мN?F9GA O#nє3j-kf ؚ\?*W[B2jU:DiF$lF׿j=EVx3r.;?ct(2Ҩsbl^}ےt{,p{bە ?PKfPKK>7OSGI-OPT/src/java/nio/channels/ReadableByteChannel.javaeAs0Wdg>amf`fr\JJ&dFڧo_pOFy. {",CE䷡J Y2G#v&w"iAduƊ?S%_dPn%̽`6f8x CXhDO@iBBzBL.'wrW[!O8Fx&i]fS'kПAxLUY{AלԣN67!oS ]h[džfI i9uReMݏ~IQ$.ݖɳtA=4 820q^%;F]J4d;`KЪ#&s֏2`mzqyC_88 IC)@{Ssd9Ov}rȸGG'!a=if`2Ɇi=i̾ ^PKۚ PKK>9OSGI-OPT/src/java/nio/channels/ScatteringByteChannel.javaQo0ǟǧ8)yDlC@tU5b6ѴsªT*+Xhds03ˏt1_wC dTEM e^UdH_X,9L`2&8xCZeK@O:RnD۝.Gur K!Oι}8Ҧ۳wjL=޺W-Y ~p#`T68洧tR5!X] yJZgw/KpP$)!-'pizt)CRII%6ݤyƻd9nC n硧 Sv% ZlGBRpi!h⊠#֏2`mZU]>Q;0RRGbJQkAo5GFs)Bk $.տ7f\ñop@31ʊ4_~=.f'߶PK-'PKK>5OSGI-OPT/src/java/nio/channels/SelectableChannel.javaTr0=אڜBZO2I39b1JJ2ɿw&B'o{Zwւ3h{.d7)й#/8,8 ѡ]4&@r'8*S-9BbKONhq:n@, P9$`&$p4V ?_iXxl8tzF7|꺎Zqmٓݥ(~&MսXU K0C8+Hd5h H{^յ^2gfT8oEQж.bc Iiކ$O(<8Ma:وn =m:)2/$S879➄Hr NTYKA.#@#BxKB^E9?'d:sJw2UAQ+<d$5G܇$"vFIS*VƋ`-X+оӅWx%wMj?STwtРؓphk5eeaZKX2RV׍bJ38p[*;1]`c,if$Wm;Bѐ=q8m"inv̈́b#eaޟ{4%}eJKx;9EFCH'k?r"RL3BooPKjDPKK>0OSGI-OPT/src/java/nio/channels/SelectionKey.javaTQo0~SXTmC{REHТ>Ms;cgEUΐLE I|}wvzG-8XWk#fs@I)I 2di!CfeH BpTKU![5+P3k]ÂAiEB"ʁPjo4,^ 4p*zF7wVmzr${Rd])ւߵ0qV* * 63H1NY3iJaE힙W# ۘvCk'yדLj (ˢ8fd#zΓY,:xW!G|&al\LԬf3^QThZXz)1YZ/Ot˖,TB|ΔBi.J`5ϸ.IQ"縆ֻ5I'?8^ ɥ0ȏ0:|Q, Ìv+<=< 0-n K6 ֗=AWrc[rGZAgߛXxM,6K+w=Ɨ)HGF؈׷kI=ŚJe&=wͤ(}L#zbo!)뷚L6>PK3&PKK>,OSGI-OPT/src/java/nio/channels/Selector.javao0ƟT,mLX˶U2slU;8}I'p֊jLLqxaq0nI!\ a *т_!L Z'x PzIl J{p8Bkӡ5¯9J NCQ9Ca!0Ah4MZXj$nt|+%9[`8+UVY;ucK0A[QIhdbc z_yu]-z:OE2!Y'$K \$"9xglp@"Ĺ"Oz rfB7h9v-\X#2Hё0hEm6,VB|ŔB& XA%#%rO@;c?{]=khQvH%~eu3id׊@'ǝ)r2?xqxOGu2.dďv+dڢUK9?;#Gz#†LEBypm[C<蔚ޖ Huo~ 6Jj-&t/PK7_WPKK>7OSGI-OPT/src/java/nio/channels/ServerSocketChannel.javaAs0dg\B[O3I39 y1jJ28i(S쑴'ktL[Qo<<, R0>I4,B:;R"ȵVШ - BfO2h .1ġ`/ I@u[=4!DƃPZ7]]+ϨCB`=͇Ѩm۔uSm<Ժu>[RQ?aj̐*VUV[5 /T=׾e[jQh)d%>fe^6_~)np-|J(0-W2/4! EF}dD<I kɚV#zV#0h…cu$ )3M FQD9c:J7L(<d$ ?-5G?=Ԓ rf=D܇y1V{`πHoVDcv-ƪN?zG 8-l-t/1OSGI-OPT/src/java/nio/channels/SocketChannel.javaTr0=jhn-' d0i&AkP#$UqL+$$6eo{vG0fm|0NR 8B؎c :+"b$炣rA2a.IuB+8z f}lZdkPC8\Hh<\/M-~S%p]sggT`.oeHyWVX=OQ:|OK%9 lFZ%+A[`stuP]ZᅚwܗbɄV ,d}@18$mI&i'\%/)\œI<&G43ģkN;[c)B!E|&!ו$g\p# "G`. cu$0 4R,g~蕯ШhP7'[H S 7L1(<d$5B*s#gDץ)J> .%*dg,dGK9%՞0i6Q!zemP>)xLk,TD}M>YY_X]ֹQd<ܼ4~\(@jZFwa)=-mPQ)/DK7C(O=mHXē"-c1 RKۭE UB"GyݛA a/)7PKO[{PKK>>OSGI-OPT/src/java/nio/channels/UnresolvedAddressException.javaun0T,azQED`U/sތ)=Lk5-lgW 0ɩf0, JI_fIIyrGS&Dȝd8›q_m`W(>UQM#X[nָW\ X˒G_^Sϡ XSv^"*7 ;{Q-ISK3M'Bc WA[= ASʒ+~H cHJH-pcXjgy]G&[DL/hZS#t@&>%y 9I^PKPKK>COSGI-OPT/src/java/nio/channels/UnsupportedAddressTypeException.javaQo0_qT,a}QED`UMr ތ){ j˃#~U+̍=9D&gSqecEܑɝI{jž[Qoؙ9/u:8 Fhr-NAM@=N*=dFmv@e؟ .r,va>,>gԸ6Sz8ъߝta[fUq# &RN)م^86mބ[-؄(PT#|ΫFbmY>_r],*,W/b],K}A^>{QNAסGb)c[DEag.HR-wtۉК#9;H3`m< y韾b,I8_8TK{5)nQV 7wM'KsO_|"^Z(EPkWc: HPKyu1 PKK>7OSGI-OPT/src/java/nio/channels/WritableByteChannel.javaeAs0Wdg\psk}Ž2qQŒ* &dFڷO>p[Cu`^, ˿mKBym{=Z4,Cv&TXB'K4X?Se ?XRn̽`6fTg1T:A*j@$'\33xx< nм^ A z|(>#qLW.wzz-Z tdxB3U!NڊQS7HKr0mJЩsoB{a_ 86!a3y/19|p8=$=l.9$Yʫ#IO |[ BHVcA<;Q#FDќk Xzs~%huGɩ94{>rx>p{ei/tUPaV F3|dWcuPKܦ@!PKIG@#OSGI-OPT/src/java/nio/channels/spi/PKPKK>DOSGI-OPT/src/java/nio/channels/spi/AbstractInterruptibleChannel.java}Sr0=_ 2ZN.k#Bk7~'PKVEPKK>AOSGI-OPT/src/java/nio/channels/spi/AbstractSelectableChannel.javar0)v8A[!$LQF\Ia2yCC! O2Hk#4. R0:na#-ТYaCGe1Rh-‚qi+`nCXl J;(-CXȄDeH[li(^ 6 8F ^sg\߯*`Ł6y_ֱƓxT7YJ`w) UJV6ri2 U̠Ǥ:#J@10(nYGqCnn,̣q hM'tw.y,}0)u!FܑZ-Lp*M%rB"(,m$0)1Yګoo{c+(`J-İU ,!w%#asD٣: rR{Thl}9i𥭘tL(&k)ް`Q$R{~:>Š+UJ9CG*Ze"/ 5NDZ[]5)7o=H71n]9lڷ= 2%O-U2&-wO s:HH{$p mLm?Ggm +_;%|۶ffpVPKUvPKK><OSGI-OPT/src/java/nio/channels/spi/AbstractSelectionKey.javamAo0 rJzrl3Z8@Qi"i7(G%lħǏO]%pKc]N)EBK|i 8OSGI-OPT/src/java/nio/channels/spi/AbstractSelector.javaTn0}^'X`}ۘ&emQ+2wlU]BsYg0fkE=)S{>=f`11+Q9\@h83} <B7:T7 []mAiCB"=GA(zmZiNmˡ h̷{a0:fXr wX7JǓi>yKUJs`W%,9. ՠ-"yTVx>85hy+? F~ؘNCwsy?ܤon,I "ٔF_ e:RdT Hq9 K rb%B7h9v-\h#@#ZxOGBAQ?۰X S T %#I;Q":1V{P 'z# <#-b6ZRn9F4E*/$/i.q xRF+@UR]8 WVmT!&͹ gf1$Kq{1~PK.PKK>8OSGI-OPT/src/java/nio/channels/spi/SelectorProvider.javaTn@=_154 AIe0Ә{gH;;ޛ7#z\P|-;0;$EABIe 0B:[\ƌ@HrR-т_#$FH~57]֑VpZU3;]F@iC +*A@ ޘFZE~]4(A 5z .0|Z&Y{o>zUUŢVkC]$gMՍ*9$/v bZ Q r|uP]Y.8`伥E韙vȭ&mBA+ Z9Ҭ@nn,q Q:O>}drɨ Ȗ1>:`[+ұ\ p34L`;A,!=B ^kp;c ;݁=<ΩBүܡK{/UԞ3}#6^H:k2X# ⤹>z[o?ʹGj+@vN.lk:[Ps/1~PKJLPKIG@OSGI-OPT/src/java/nio/charset/PKPKK>;OSGI-OPT/src/java/nio/charset/CharacterCodingException.javauAo0 x))2;mKXavGEfmIr/xXa>ȐH>~|Rr KӝjvS9CQ}UHV - ~et(ɑ=PBSi'$?:e4!a2& q2=m*OSGI-OPT/src/java/nio/charset/Charset.javaUMo1=_1ʉTt")H,mU= f{k{CPW?8g~ހ3CS0~'D-:-קQXQt0"G#)H;Bd ) )#-LIUԁfH8)C'gbe2X 9b aiIm)<ߧD L0\[RM%3>}n/sƑ*r]߻/uYI+r,Ȥ'+Y 0WK0pfcK+Գ8%Z 0S鼕&Gnn .q?n/1|Fp?[\X2އR:`2Y"DQHLAɥ$d"gf枬 %.cBzV_av:@wx&sY#&${GA(d"ӥi6`^E= y/* /gYj',WvvZP_-^Ox)(&R*r3/U?W^[FPlgVΔ:5 j*#[x r@ Brpˉ1PfJjvѩ>?4%u@S]otSwl!;d]fI&R:tTj鿋”̔2-? W\?m|qc sDHo$kGO6=W!6AyH{oD&_88R%M]i>Gϭ2}ta'U>Q4-feK^^>6wr7.⏍/PKrNPKK>1OSGI-OPT/src/java/nio/charset/CharsetDecoder.javaTMs0=_t!99$i=MI39 { jeɕd&ޕm!|%`{oW؀S\B3j 3!4Ϻ6^Н40DzGG( Ɛ5)~H~6\I8tNIAU)Tr $\ C.!RiVS+ujk 53J)Y=֤KSJƞғΚMлWuu+\XF"6&4FYX[.'m0*`bnܾ0m ۘ? < ? ¶ F#C? B 7_`Чk=_2v &wvV]DULOxD$g2)7F[fWtBF|~$W^4eڠ=od6&, FL{U#2,FΚ:Wat PZUOd3JTK/Fk ]ZV*̅؁2/$!q)YRUa6W'3QTL]*X9c(2~@H,(-m{s6MDn-| n3d 0A?8Yn7ܪjVڏYZoC)I#x<3"V兴7i9K]tyϭ,NHN0x1gR;PhArU[+egc-V:b"xS 98GUׇ Y5d]{dߞutQkSPK!8v96 PKK>1OSGI-OPT/src/java/nio/charset/CharsetEncoder.javaTMs0=_Ét!͉zBf2XZYr%d߻ >Rw6V-u:7b hI)f$;-Ѣ( r-8*# B+e~JB+8 P ղT=9sA栴"a x1u p%p|3CvF RzWt8~l4fYrƁ6,zm:lwQ.W(ւ?0x8+ΆUhlljN{3#P:X3aF:#[3m6mLAAUQ݃܆ϽܶVwv"^ץ+huKؽeާ+ Y"Dkb]P)r N8ccQR4X-y)_m5*Ŧ,PB|ŒEw^I!9 lHw%#Q\{ʛh[^= :Li!OW|_x۟n|d lONܲ׬mz=X_PK:)& PKK>8OSGI-OPT/src/java/nio/charset/CoderMalfunctionError.javamAo0 x))<;mKXqGEmIrܠ/x@?RJ"\aaUc*gX_UBKz>׏$J59v&wJvTY!x'Yu24&dv,^G=CZ=I<4nDߝ.zr K!OSÐqblgKŲ(z̺-9Kzec*)ڊB4̛@=Xnb8SAX 6rުm /#~) IV"/'y|muC^g&_XX&_xA<2CO 0 <"J79#tӋИY#W.\c*شj?}Bi_ L"w:7Qoy`{-Z=ʝSr?GM/A xAEPKSPKK>.OSGI-OPT/src/java/nio/charset/CoderResult.javaTMo@=_154@ iR,aH.E&H}7o|W0ވ,w}&R 8Bz40z KDfI@ d.8* *A.Gӧ9+`=6GSu [CXHDGmH8 W 8FpFm 0׈ܹpXUUjŁ6Pv8E<{Oh-] Co RنJV62tW]`u*f$:#6{VFJ 1I a܅/8>\}+,*-a-nU-&.nT2Ly"Ĉ$(E*8eޡQhZx)1W^ ;/OXxΌE7* \28NVJOwY*`} !hDw<Og|UJ97/϶W7ZK ;3F^]iLZ|Ij 5%y~KcgB92a6oOj3?y3߅iA;]+TJ<2P` Mly.ͅj1ud0Vș;hiwH[ˆSUVEvtPKϚOPKK>4OSGI-OPT/src/java/nio/charset/CodingErrorAction.javaAo@x5in-%4&r\փ캻k;K ĭ*#Ͼzr 3쭪6C9¢SHZ - Ûc(aA鐓#2fB+IQVd71~uh?7-bm>OSGI-OPT/src/java/nio/charset/IllegalCharsetNameException.java}n0T,a۸(ۢUA"tU/MrތU![*-l$7n03z1,GX_%R%ax;|Gq2$ $B+[Bڈ??:i4n !0i@M8B3F*Jj?[OIu],Ʊu.Ygy^߳uA+r~r#DVX-7K]wRTy+׭մ\u&4isZd8@շ rl^`lel ߳n 9thl5ehQRؘkYrinEM͞АIձ`0J:OSGI-OPT/src/java/nio/charset/MalformedInputException.javau0S8&to-mT$vG `V{!mwj+HF -Ʒٻ)$a ztG,cv&+%Q{,%:!B2L;:x  G#;Hj M<9k0r<6a#Y1 &~ flYzu~muλO5呂<2'B8 "yRtՊ 2Gt;|VπeiA>P("`CEe-GG$A6!Xfڶ_AxAx"ԥ/x-Lx27?OSGI-OPT/src/java/nio/charset/UnmappableCharacterException.java}A0ͯx+нRQHڣqmS!V!jȞ7<'piNVPʿ*uda ~atX#{"f`P.W?}ed2 h,NAG=^zx( iM)_]] z^_ !|}y*OIu],.ıeR_.Yd2gkkr~ĻDTR옵(-q͛@Y.pf;a)yv_Fc4G9ͳ|LͷvtNlcl6jɫ/H- ϡƆ S8\\CRtيP#Y!{P.\c"꠼7s((bL,+aiԴ;N N6:㺐+߈=½񈟵3S0㿎]o?Ga'#<瞰]tWà[1PK SPKK>>OSGI-OPT/src/java/nio/charset/UnsupportedCharsetException.java}o0_ *Xo-Z$z4#x3g;T3d[J!{& ƞwjyU"SJ ]!qi,cA܁6);D{YA7v̊??yi4n1QzI8{q6'[tHmʰӹD6OSGI-OPT/src/java/nio/charset/spi/CharsetProvider.javauOo0 rrz: v3V8EVci7(G%.?6$>$i\oD՞Tϫb<xQBi8a}m[7)$T~;M{_XHQPK95PKIG@OSGI-OPT/src/java/rmi/PKPKK>*OSGI-OPT/src/java/rmi/AccessException.javaAs0WPprks2pQ5V%* cO&=+B=v߾vE| ݞwrUE"i)TI^!a0rɒ9P7%)K:UV3!R+\EsL`2&koq:K!-!бA*zߎhtI0z,\iZF9~#1GqmXf=SUw!kaW' O9ALU 66!9{#TuM%3rӹ7Kȣڄ$)|J}[>$[UvUƧH|K+>tl1_- z/HRneɣ52'BKf/Vˀi^:?sFqz "vnDKʒí?TeȣY *%<*xL|f>#5!sc\nOA PKTPPKK>0OSGI-OPT/src/java/rmi/AlreadyBoundException.javaQo0ǯ8SR1نV) Fl6!Q넩Zi<{wI/"\`f1&X$BUt)?OetX#:a r++Rjt& %dFT*1~uR+\&SCh(&WA;J{tXC:ldKCEC*Tzg^A%ak/]e#O{%MOĉ8ѶIsKoټ(zS-9K:iakfmEm!K\:PVzNo|/,Z:oB_6plBa2/ r/VϖˬX%f&_勂W_71#s`lp2yED6 Ur#+N4F*vCv']VǀuiNzO[o|(_b/VLQ֒ך移 <ڝK\{> Ύ'x,\rn/t|PKBN.PKK>+OSGI-OPT/src/java/rmi/ConnectException.javaAs0WPprks2pQ5V%* cO&=+B=v߾vE| ݞwrUE"i)TI^!a0rɒ9P7%)K:UV3!R+\EsL`2&koq:K!-!бA*zߎhtI0z,\iZF9~#1GqmXf=SUw!kaW' O9ALU 66!9{#TuM%3rӹ7Kȣڄ$)|J}[>$[UvUƧH|K+>tl1_- z/HRneɣ52'BKf/Vˀi^:?sFqz "vnD[ht/CGGQN{,x ލNNf>3OϢ5g.G xPKU.SPKK>-OSGI-OPT/src/java/rmi/ConnectIOException.javaAo@W+OSGI-OPT/src/java/rmi/MarshalException.javaAs0WPprks2M 8('uҞFo~"pnF;i9ê$4$L~7|WZdʒ I+JX9^0Sٵ8{q%[豤A*zߎhtI0z,\iRF9׾#1Gqs6],bǪ;Ր0'!Z*ņYCԽN:[ Cަܫf_ xmBaH >$EZ>]^ݭqyeU*I*G$Mqzl1_QBm[YhDMВK2`mN!\Q8Q6 cwYzt*G׎΂wtQd0, q[sr{_PKL5^SPKK>+OSGI-OPT/src/java/rmi/MarshalledObject.java}Qo0ɯ8SJZCH b$R1MoSӬL\6ȃ#س^bac\M%a|678,c+rd!\Ɋ Z! #$7L񕬓F,cak49Gb/ƣua++j!OSGI-OPT/src/java/rmi/Naming.javaMo@WrJ`AOn8RUƞ8K׻f?FU;B?h33x6:NUռXX9Bp& lv8z~2i C2$/r KpD v7!2 W}h&^bl RYpIXs76B̀qT< \ je3z?}u]8T.D',sѾ]!GavHyAʱ R-jIAƷ`ee_zT?(  `- I8h܊vK&RV#n7CxZt.qS99E-ӳja, Qhՙ]P 0AX^d#ͱ퉢"#p wI}N4 hNKNgp|J]Ѥʾ-M&,N>Vy"[FEFb<@5DAf+Z4-Jߗt}T5sP.˻ PK]wouPKK>0OSGI-OPT/src/java/rmi/NoSuchObjectException.javamAs0WθDepQ5V'm2-Io~oEtkݝs@V|UFV旫Շ%qm^i%s*dor$*mEnO;!3,Ue flq-NAj{(j(sP->tڠ~3xOt :^^ !=>{OQ4 C(FP:jZ$MZl3Tu6d- c*)Jfmm jC|洧rzaT:޽oFZc-fqs\$қ%owq6r:&Yʫ/{|O%G}3>c*?- zg$ۑT;%9Z[&HDj6:('ܸO.( Oo "dK d#,E/Y@mƻ =:j+(<&B",xLf< PK{2PKK>,OSGI-OPT/src/java/rmi/NotBoundException.java}Qo0ǯ8SRQنV) Fl6!Q넩*}95E ̴9Zl=DֶR0N?I KrdT'LdEQNd᷄̈?C%/Njdqh :Xu8Bi{Hl txHJ̀K=3<z ^m^7Bl7_ӴDm=.͋r~ԃ^,#aJ=h,q@[jb8lj鼕οF&FY&+2&~l̊U>/Xb(nU(x Yyqxd| Sqo%>#9CȊ {I1`lZ^ֻ\4xo ;\G[Q o4k{ <ڝ#y=E;x'<テÒ͉NsPKٶk"PKK>/OSGI-OPT/src/java/rmi/RMISecurityException.javaRMo0>_($bRdZHс716Qׄm8e‰ fU}ԲY1Vg,Pat=^qඑ8ABɝHѨ4"O?񝴑u0h8qǪ^*sH, Qm!j_ZiwN6V0\Ws MwCmqP",OXų2]c{U1o5ĆE! M.m_/PK+PKK>-OSGI-OPT/src/java/rmi/RMISecurityManager.javaen0DW |UrsksRȀ4ȑ2[TIʊ߳U it@rv0pV5;aU}WV - S ^?ϒp2(JrdT'Ln$Fk;B ɿ&/NdiLƫ*XM8B{(j (PmP~w3<ft۾Bᄂ0 8'6i{ֺ&_,jǪ;ݒsW'!:bì`,Dc ԃU^&3[?KV[1ИdjYWq0?Vwkge|YaUb*u*x Yyq82C 0 q_9#*ɣ 1'BGv\xVǀui^yOG ( v~ Bۼ"sj[Y=ڝ+H)0/gDQPKDPKK>!OSGI-OPT/src/java/rmi/Remote.javaeA0toh6mQWDlW{40vm6;Nr0g{Ml9[< D6 R]* (CCIڄȃlH9j1,oNIp Xqg(1:b Ɂ@/ 裙&9J k/]ûu#/{1MiJą8ѶOkKͶzr~Ҳ a5b%y'+T} ;? KA[YMhM(, yʫ8<=̊}+>xƷAϡcƔ!+"z+3N6lM >UQ 3ȣ_Q9 B?I$p9,O%'D_PKȨPKK>*OSGI-OPT/src/java/rmi/RemoteException.javaOs0SPprk}24 kKTƞL{V6I\Ao~"9YDRR0N/CncbÉʈɍ,HY*Ѫ ܎4 񕌕Z*b!4̼I؋vh-ʚ@ǂP}3u{OCo`wۗB7@ι}w]8Ҧ7|勷L=dݪ4\0U!6Z@T8洧tRU!޺N6M^5'#Rm $G!<&wvdJuȱ\a̮uxIv/ive|+`Ly"rW[}F r+ .MU>Q\2{iX-ަ{_7&"bYд ZXѢ1ttJ{KCf1Zi<g2Qpa#c<PKL+PKK>&OSGI-OPT/src/java/rmi/ServerError.javaeAs0WPprks2pQ'3ۧo\aa^-)H$m+:?,"_F9Y2G#v&"eFj2p{B҉?Nd 7s/M[ŭ8q%;蹢A*TMhtœiХ,jw)p>0 #m=km|Y~S׃jZK'*Q2k+h==` a uF{FR YR -fiztucIM69V.ݦWdOfw!#s3~Ɣ>_DAaHJdţ G2'BG koʃtA9F?QDpt} jj1:R+r:hGJ/GȤGa!\^^7PKF@NPKK>*OSGI-OPT/src/java/rmi/ServerException.javaAs0WPprks2pQ5V%* cO&=+B=i߾v"=Y D4R0/Cac^i%s*bor+KR*t"#$(7FB|'cVzd Mf; J;tCZleCcIT(zvCœa'X.8÷s}Gb Ekt̊{TCЯNxshfmDm jCsSF:Vo]/ yJZgso[- IR -&iztuu}INV9&]wdf7!GucJ?Η[DAa_lKʒ[Su'jBdw^Z+oȽt G As~:h Oe#O,[/TeȣY J)<*xL|f>#9!ݞPKOPPKK>1OSGI-OPT/src/java/rmi/ServerRuntimeException.javamR]o0}&'@,} )hKv5d-՚D=>_v4 0TG#˭ b}J ד< 2RHɒS2'9)KUZ&c"cV'x@7J;4CZldECNTmO:wǎC` 5m.3}z_mPڔQu.vݫ4x}U.-( i5IUaƵ)uF9%k 8C5ΒlIՏ qƋU2ϰL1].f*Y.#~&ĕjM<"2w6l֔ˍ9*QJ'8j2;iZ6XxJ_./{2MF-fiE 5W wФrrG-7Ta_Ôv]{b=wf2,Ox3 xPKG~PKK>0OSGI-OPT/src/java/rmi/StubNotFoundException.javaAs0WPprks245V%* O&+LdS9H{+Xhds3IHJj> ockdTEMdIRNUdv%Jod WS/[u8Bi{HlTR JoG^pI8z nhy}-p#k?q#m9im|.Y|c׽jZIÉ#DT(= qiO餪CXu0m*iE 7#G- I#'izteuC^'&]XXe7&]eE=k݄ CO Sqn9>!ٖJ%GSu'jBd'BKf/Vˀi^:ᆭr 9FADp]D]Wdj_wzr*)Z^;: w? C.OSGI-OPT/src/java/rmi/UnexpectedException.javaAs0WPprks2Q5V%* cO&=+ɴrVW0z0.'X_$Btz&F9Y2{"v&$eB*2p[BҊ?C%w2Vjhhr-NCg=F6::HRn{:gp$x< nhyy-p:~#q"欵}:g=S]+Ր0-Sbͬ DmkN{H'U!oSI\w~3rP%bOI7yH_% Sqo>#ٖJ%GSu'jBd'BKf'VˀiN:N[As~6h5Oe#lJ>?ݼkHUOKN;w?ǧ6 *xLf:}!.\APKpSy\PKK>/OSGI-OPT/src/java/rmi/UnknownHostException.javaAs0WPprks03`7 kKTƞL{VɴrV.0j0.&X$Btzߟ&FY2*#v&w eDJ2p;B҈?C%2Vjhhr-N^Ck=V:8HBnן3x< z74ھBv5Hđ6U\jm||ZJÉ7' aZt25=ug au)uFnZnh9[M(i>—$OЛܧz$˒*Xf-7*].xM9tlOҏCW$P!hjEEDhj6K'\W.P PK>}Gr_PKK>-OSGI-OPT/src/java/rmi/UnmarshalException.javaAo@W'H*ZߧyV?2PR5Y C:ixeR= qiO餪BXu0m6:#ם{}E=G݅ ^Ck):Ϸ VlKʒGSU'*BdOL#VˀoSF:NwsFq{_b/"v nDY [Ft#*"x > ǧ*R 3 =g xPKBYPKIG@!OSGI-OPT/src/java/rmi/activation/PKPKK>1OSGI-OPT/src/java/rmi/activation/Activatable.javaV]o0}'@i;i)+U}4;(NRJ[s=6iT`d2W<u?9xq̙jfs\wmJ =Ԩ8t !b KXH?\ hMقjZ?s„AHFF݇0fD+2ƠYÉ4d|H CZ6jqDLj:`gL1cvW4o@4j9Xc$P qZze!ފԾ3 L k4'DV-_[- yozwKYbۘw[1,ә ɓS{G-`AhLT iMDȧ0jSKvҦ&yo۴rL+:TFo% i5r8b 0'T%LۨWZbf*6Hٱ#4[5ܾsnktsQYT*PK@ PKK>=OSGI-OPT/src/java/rmi/activation/ActivateFailedException.javaAo@WQ-ZXyL# 7l˃~0t݆D֘ t+"T"KDOTeτѹ90STpl |gfCBr9R_PKesPKK>4OSGI-OPT/src/java/rmi/activation/ActivationDesc.java͕Mo@W8AB{iSrV H4q0tuw844!߇ݝyygGrg{ֈl堕a RVߵC SiaJ̆!+xHIYZ@dS~'|'cV >[]k K! <܁Pu^­:'ZCr8rBΫ@@WCWʹ}SeqM֑W3q2|uֱd-YÎ[R3 Ӟ4 `ҕh,uF ӴkF~;ۆ Qq҄Q'9g_'38h< LП,y)|ǃ[u<7c Ϋ[halNX 2ANf-Vˀ /#Z8t=_P>BgBLTIs3JH%2ix@6iMR:LWuWnb6„[4nJIRGk5K_?p -֒xjx>qhtǃ=}`;~{hF{kj`C0 T!\&>VEEO6j11iTu_8?;ҋK|ePKe; wPKK>9OSGI-OPT/src/java/rmi/activation/ActivationException.javaAo0 x))<;mKXqGfmIrܠxM;>/\`a\L̿H$u-*2&?+-VdȂ*I# X)^0B[u8Bi{H PP  oN]Ip?x,nR9|"GTq}&/|񞩇[U0+!*ĆYkAǜԝN*[ Cަiݫa_ mBaH>%y.]]ޮqVIN9+̗uN>#-ͮC SvVlCʂKSU+*BdW^Z?Vˀ^:A}~!>i4톛̘<#Ҟ=Tt=st3S?zy}<#O: qL7/|#SPK-PKK>5OSGI-OPT/src/java/rmi/activation/ActivationGroup.javaTr0=אZ:0ey1JJ2ɿwe; $LI-iZp*h.-tx&љ s{@ۆ40EzO( &P5%B3NăߨPN>t\@9jwb X He0HBdx1 $pj*OEb(хV@`!]=Kk^Y>J5h\fh hSM Xq׌4T#YXZX!SZؒit00V;q$d"6| 0y8>VKV^d&>>L"'eb ~\R!JYėHN%PZ/JcY~zkwSńCX3~ʭ5Qn nsHm$2b,YaR|ԯgw Gq;bHˣ^QױFf]pS;D+d>O=Xdej<_#q40Ͳ}%l1W:o!kw`6\^IU.X .KMǬc2{Qyb~Vys|߶ZPKYLPKK>9OSGI-OPT/src/java/rmi/activation/ActivationGroupDesc.javaTn0}_qTY^N2`]T]UM{09vf;PVNӖL6@sϱ`X-txH@$`#tM70&h,q'9j!*74Vha:]CO%l J;(-08󢖶nQͩY91jg(4njg\[V!d=yk{`4NG/Iu:SJahXA8VV ՜WF83if:#{`ڭFZ}lc Q qچQ'9O?'gpM&4L`i |,9xUΛ!E| ao$ NdBhm\X%3O#E.sգ^E>DlBbwbY[E9%3)y$pHitW>2,hy%sT+`RnksR:RKa0R=Fw*&L).dL??|a װ{† ]=&)*;dЕF*< '-;k}B:}_ &%Β%r{rPNhz1NWA4 [7ڦax o ?1˱1mɸzE>gVSZ6d=YXJ铸[ 1ƷiPKfPKK>7OSGI-OPT/src/java/rmi/activation/ActivationGroupID.javaAs0x 2Ԧ\HSO3ffrf1jJ2߳2nLz}ەisy ŵDZR0L>8lcKrd!Ȓ ! #F#c|'V' F`q =G!&CIC*zozV]Ww $= N0ھB{vޛOIҶm,:X*Zdz}֭9XHJfZ1uko`[na_ xlBaȊ>EV]].].|]X,1[l-r^}A[ סcC)8ϧVRneɭ;!.cM^zử7}BI bvEKFY0QւՍ2I%ҥ RwwѻM⿪:OSGI-OPT/src/java/rmi/activation/ActivationGroup_Stub.javaAO@唠 ZN.IUHv(TgfDάH`k=o|o֞Dp;UmrRAF" Ϧ1(! Jzt;,cv&WJXBcJt@}e ye S/ Fbo؊=Kxda4K iu*t}z@-H\WBCw׆:m8Oҋ"f~׵=8(lj=(UQ9@:ETcvMplJɩWC_ xl !-|LnՏ n,Kt2bW!Yt1ȸ.$`Ly8E_!(ZIfFTݡ3jt[ñz,V[EWorF(9 Fwb'bv$6GuS0 `XtД٤"]vhP;~OSx>P p ;#xG8:ſ5%UYQz#>g7Cw+?r: 9Cjh}c=PKC3GPKK>2OSGI-OPT/src/java/rmi/activation/ActivationID.javamAs0Wdg(>QmfqQ5VHT&n+L] ~R| us4T $T0N߅WZXEsm >JTЪ-p{%FS{hMf>[vZ #O%6HAf@:C'!CN\Z w]E'by./|׽h-ْᎋ#JQ0h2{N{ΐ#U`u ْuֽFnZc FIi>IyH7_VxH$ۤVkEIW>A=4[<2O0&qOr;}F [SU+*J(45Y>FRMN}Bq "NDЛfA<OSGI-OPT/src/java/rmi/activation/ActivationInstantiator.javaQo0ǯSR1HeĒlCkAtUwf ]j}=&=hQo-L iaz5_@7mC24XLGiNnq'>|Cmpah2[8` yhckAHj׎hۡH~Pe$gTҪ:#lm߆a9jMx/I~Mcխl&.Z ֆ4Z#Y{-FUgM)բ0ID9>Fy.|Io7peYlui4Yś8Mh Ȩ>M@yE TdZFujZQKZ;aܵ,M#v2;l=5 =r؞0n~(ZxmWPE]1tKcYư(K$Ý?W͖5 iܾ ?sa`LBÝrFh?kR$\x<7PK wPKK>7OSGI-OPT/src/java/rmi/activation/ActivationMonitor.javaRn@=dGZW Hnc .&V,q$hw޼y '0jy0,FfLózi`ˀ/P,%jH>}Ň ΂1 `ЗlBZh 75,pܪ^Zӳ8%ps23jPtZ?Xއa۶RWa}"ΓlT]+Q1G59*XNZkւ*Tҩn5\T>-hJnyc[#Y ؘAA sřHthe< ]4Mf2N:}(oq2)2wJ;$8[ 񉄵

6OSGI-OPT/src/java/rmi/activation/ActivationSystem.javaœR0)vrJ J\RO!ء bQGr%9&ݻr $-CK~j5u`dR<=c^s&bp=vB!DjK V(4&P9W^N\ wеf;+Y‚@HFR#U. AuKF J7~\VRe|'xuu&r("dzb6#֜U L!i+ YLMZk4[Ma$6&EGE~Է"Sp6s/ GpLF&|'> U䶝Sq !k$]`S5,C GPZpmU`berz/[h8V-K . _INQΨ7*etfdH]z i&9-GE4~Sx{ÃݻbRpcҮ౒esF`԰X_0@,Qߣ)Y38%!C⳱ug.?`^*.z N_v3]blZ@_nZ(nX6'Id%7xx+ˣf8~:/PKr PKK>/OSGI-OPT/src/java/rmi/activation/Activator.javauQo0ǟǧ8)}2mbIu A؞mBi߽gBTxy0-g_9Dm˙(Wnk\ =V)8k^0XA'*`b%ƈ?Q.\sN ;رi3H@[|(QYJS#Zv385da3*Ptzx֪a}@&l&$_%Fh hqM0ET%+e=H H1+uL}6'F~@cc&Qq>Q7қ FY%xC2MV&N:}(qidvq93Z’׼$kX=jA@qjr2-qp—kzg{BJCS]AäY5MGǠtEeetiemUZci?|_G :WgzC!e:]ȗ R3SyPK>݃PKK>;OSGI-OPT/src/java/rmi/activation/UnknownGroupException.javamAs0WθD7e3n&GX TI{2Y&p$JE ̵9[Y=F"m)TI_fI J9Gb&ȭ,I9Ъ,QgX'Y'e<8Fhrg Pڣu 鰓 N%Pu}Jp^\pg$]Ţwk['͋%|zڨ߭x{0[ڈBԖxຳKUOwRTy+Ӵ?9kM(Y1״ȊiewjlQ`|_gl?z >t26$`2Q/RdT݊P#Yʼn` `0 wysM'DOQ PK-((PKK><OSGI-OPT/src/java/rmi/activation/UnknownObjectException.javamAs0WθDec75V%* O&=+Ld[)pnOF{i9CF Uŧ9yibM̑ r#KR*t"'ĭ(3񋌕Z2\`qi2p'(YbɆ@%RԇvK) F.`GB7s(>P:jZ$U>j~wpѲR= uo!uF{Ӵ?9kM(LI>8O&vxMʑdd)!N3I nC ئ<"r7vlɶTʝ,9;Qj}$8Z2iZ6XyL# 7LoQLEq( ڮfl{ܪ{TpGG?Saľ 0̹(b'<#xPKU*PKIG@OSGI-OPT/src/java/rmi/dgc/PKPKK>"OSGI-OPT/src/java/rmi/dgc/DGC.java0SrJVDt]Ħ U} mKU==װRIzoag7Lrb> 4A}2 ':YGZ3F|Cm0u 14-Iup`'Bg4J4ı $puhG^PgTq$0j2JgtUu̎ó}}l km$Qneƀqqg6)fB>Uٞit20VLH_&mL$!'>w"cz(ˢdorH3X:iB%)N> YFuծ-B Rg$"Ԛ;V#ZRGТ>`dqaE_Py7'Ȏ, k\$,oVkQoje~xWG%J 29Ri|#sEK|Y1‡B)'VofDUfCjl]="#J?I _PK PKK>$OSGI-OPT/src/java/rmi/dgc/Lease.javaeAs0x 2!\f0I&GaVH$ +f˒>}MLLu{7T))tAߍF1ieaE쑶 ;,H;ڢ[{BZn'Y']2B?zVo0'S Nƣva' ]սV,7' aV% QZ=ouc7RJMhk&4zi,KgyLj.,rr1rHO-1#s蹲Ɣ!-"'z3$WQ!wtYP#Y"{.\cmQ һA(_(vHe1z)kP(s! i iJm3>tm<̦8 ; #/8꽾$~ZеRc_ZkᨕPK$_PKK>#OSGI-OPT/src/java/rmi/dgc/VMID.javaeAs0Wp4K\)`H&GY^mH2߻2n&`ݷ{r4 ` ] #9M *J"nfSqa+-lѢ9a#bр; ĵOpƒVp` p<gQAiE U,v@ >=ZKU< <:s7Լ*p=t?GQ۶Cmʨ.YS]{U`!Î3Ș-h4gN{֐#UNµ :CYޅ-؄aBK&ԋ<$6^U -,6eK6k^}x?r ȑ|w" }E5J*H5U6D( bGP9j02 ms~Y!K9&ʕ@V&H)" }/. nsdR yFk2+=5)tQP.%PKA?PKIG@OSGI-OPT/src/java/rmi/registry/PKPKK>2OSGI-OPT/src/java/rmi/registry/LocateRegistry.javaUMs0=_S1vdt[F٧tהyt.$gOy |W)By1G/RCwCpj[ m;XF+<<]6ޝ<϶;[^+T}6x 7PKτGmPKK>,OSGI-OPT/src/java/rmi/registry/Registry.javaAo@W|#\)j80m.]LPYL[U|bg2tj/䖃_ax5L]lcm5=f,䎧(4fP -_ Qi.\yچA_v! 5D+\@*wU/f)V {F*zˏ^tSXؓ^= 0Y"Խ(QkPoZ`Jن fU(n(\27 Sh1FMmK#Y?nؘ@ Oĵ`._~ D1,&XQHoo>o\@Sm[\$ S󔬉fB!9 Վk{fS7tG'좱PΏGOaaݶs7%fP9K$۠w |w. V; Y/xo`:^r6.aDz&C{& :ȇ~TȲZeZO).m3GJ)Ny4 H#:y pPK;:PKK>3OSGI-OPT/src/java/rmi/registry/RegistryHandler.javaAs0Wd{(8n4gI&G V%U&L{W7$,pܫv\ < 26(^ v֪/au]z@:lNZu?V4h hrM#0ETˉaH H5+uvL)}53#E)1(8(3ߙ4m`rmIDH#>K@܍t!B (,x &<=7X Φ{nrBϣ9rF?فh] g3* 撓_SmN3Z P'o}畘5~p`z>XZv9C{iqUJ3]:@u?PKq PKIG@OSGI-OPT/src/java/rmi/server/PKPKK>1OSGI-OPT/src/java/rmi/server/ExportException.javaAs0WPprks2pQ5V* cO&+LI{*1Ҿ}JU+,>Y D4R%az3_,Ƚ"'K@U^Zе!Ѣ 񝌕M4 &ch2'a/NhCg=V6:dRK.O8r wB7B91@)SYkt̊{چ_4fmDe jCsSF:!ں^6M #Zc-&ISREMI':]XXt2}F=[݅ ס6Ɣ~[DAaHVS)ں5V2-wMf/Vˀi^:ᆣ 9F?AD  Q6G[dW.hWtHQ3e0 q9PKI;3WPKK>/OSGI-OPT/src/java/rmi/server/LoaderHandler.javaMs0Wd{(8G4L\1N39bJD%awi49uFW>+‘#jE0C_De)znNi`Lp3e!O;j#` 'wYU ,CE;!Mա5®<#C,#9B`nջ0l&`-qt gd7Dݝ%BSū=8[kPXbV9F +dQmFg cXI2R6&}q;xy5YmXD20_d\xQUU@µ0EH d*"JE BmQK*aX fΦamG}ٖIyhgn";xxUSs-u)F^ȅd%GhRk\M-ϼ Hzm'PwvpLJfL5z#d. m$j s4QRѨoF 6JnkDBχD'PKBt oXPKK>+OSGI-OPT/src/java/rmi/server/LogStream.javaT]o0}^~OXBI%ݢ!mGol'Uaۤ<>>J;n҃yXd=@w=M! ,Р0Ly` LQ]# _2[Ԇ+ i:ة6lRY( 7q DmږuӰ8'ppegQxgc_<{ U8÷u#\SXA"mAi`FZʹjn`TfLIJh 1 q Q܁qGr-?op7^,Ƴe0_|6|Fks4 dv &wwbg2d Lx&PKJ 7 F SrBQ9b>1a#/"E05i ^QFA*Fhej\_4Y{42.\& (p6Gp$@r:wyޜt`lNN0ch&=xchK-AB%yiT;ܱB#MCV1=|U}רiSPSpj)_{wddo[2o5VLI{rw2& 2HԵτeb㡀\VHv6.pqk%}PK \jPKK>'OSGI-OPT/src/java/rmi/server/ObjID.javaA0ͯq ,VWDJTd;,wBwj~ͳ=&ko,t\@P;o@= C"4wLD`P %OJB :T7v{UA* A֢@K BBeV ii] ,[ J[-tl-?u]!Ikwl2[ijDV?+xIT)_kkPxrԵVȼFm5:LŪK1}gȒ}Ab#)KX/,-}@RS8O1ZLXZys\PKJ[a̜ܶM!r ї[hygw'9LzՊ]Dش-J:zMP~ZB4w!` nN瓓hQ48'Uِv{p#\ ë*ԲFuɲ:ٍVk,5ݰJKUQ{Ys8:PK.>9PKK>+OSGI-OPT/src/java/rmi/server/Operation.javaOo@S0OSGI-OPT/src/java/rmi/server/RMIClassLoader.javaUQo0~.,}:m̀n(L=U;'iZ:>ݝuЁ6'  3?M9B=t߶] a c,ȐG(4Ɛ~jQi.]hYfmj-Fd@09Opaf 2,sj.k 93d:350&{yEQdJxi嫽ab]Gs(XF"6#)+@*`BiY.)01FYnvˑRu ٘B6cA..MA ƣ~0 #Z?dt3e3 YUB{沢3GHr $rJPFZrm˪`laR䆙rQ^ Y+b.!e3FHHRF&gAJfaY[ܐ"6 2C%֧VLupM4 4=nOG *lP@㞱\b|>^s$[qrl8gyj) h-AӁME88٦пb<؃CrjMO kPZ}ZztTxJ9#iN%5]A)س9{CΞ!kJbVyyV ~EP|E.:t]TG*Gƾ-hW(LCOf,V`'nFPK|sPKK>3OSGI-OPT/src/java/rmi/server/RMIClassLoaderSpi.java_o0şOqTYBvڔQEaJ`U5I.[3!}! G߹dUXg&o9eə bmRCsɄg(4P%BP~ Qi.\xC[A+Wb+kX-iH\Âɰ2drUuh 7˶ObIa$gtPtgiLuMx%*r$dSsQ֠[%N*XJ%k@*`Bi  Z.LZkxZ`  0q]8{7. 1u8 n }]42ꃛJ8w Bt_fB!ר% Պk{skS7̴['l#qh_f9xcRWNU4H`)Egd߆#g"%Y'=f6\ @ =i+/_5SCz;-'=[7Y4-+i+d>vsOWRv^il>wOc'I$͍,%7ۿJ8PKdAB,PKK>8OSGI-OPT/src/java/rmi/server/RMIClientSocketFactory.javaer0)v|3ZLS`5Xbݻ:L9]_W\t#R /*HV -7u2A+x{%Q;<@hI'$L?:e4DkXŜZ6^bz8 hC;d V-HiN݌6(:*f Sr:귅 h#Q9aHTtGw={ec*)*fmƂh,r"iA9ilаHJH|Iʴ c?1)$ۧyv< mȖ9Yc*o4E(!fBrJU+ɭ Bch5wړr~^U'EƥA>?{_,"Vd7AWl${FhkS.~[&Tt'${øW#ESEA81y=dг3Y3 @(wcM'PKlPKK>3OSGI-OPT/src/java/rmi/server/RMIFailureHandler.javaen0 S9%ggm=yilNW(;M4I {Q2$R??bzl9[ A&% ",1qcB V"ԢrAт? dF#1|GH+Nְ 9X(Π!k$h8OSGI-OPT/src/java/rmi/server/RMIServerSocketFactory.javaeAo0 x))2;mKXvGEIr`x@ C"IML{>xL yE!m%$Losqc!ӡ GDȃ=Y!mYm4$Ld g(ƣsʡR ^%JCc;>J av^pwu"})I@['%%j)zz 9K:eye*)vڈBԖ8MJs8S^X 2{Uο1#~ IZ"+'Y9"OkSZfKV.fwH7m kk[DI2$גT<;Qjs"y"dʅku 2:*/p\QEK)N"fxxLvݎd2OSGI-OPT/src/java/rmi/server/RMISocketFactory.javaAo0˧xUXo  zt#x5vf;9d)-B+Ë.`˽A`}K)CqaXJ hv!7JЀ %tkgB 2Aک`{]AiEb k!c@(z[jpfMe1*gi!0J7ƹpXuHb(vxLfi6{O[%Z0{`%Yqd5h0HsN{'TkW3WӴ_ ,BK%ŋE.YL4Y&󔞮 NkNC@j탏 HSv"d>*X NTQ;4Af+W#V8暡\~aP<۱Qs8( ,;[iƴ7ڸEE" ER"|.kuO<~[ tS\JsAWr @_1!+kI-,OSGI-OPT/src/java/rmi/server/RemoteCall.javaTMo0>_*$ m˥,6 $HWh#6MHT5)zԍ|J'˝I6(*D0Z,΁瑩} EjQ:`% 94"Gf,034L,`I-]nΏc?VQAG{9 UF:xM@6_EH/,kx3&ʆ<jT{j2[a{G.+9=s6Z:l9@V]p&Ʃ\`bK+F[=3zht<\ LɩmqѦyerN.OSGI-OPT/src/java/rmi/server/RemoteObject.javauSr0=θDepQ V w4q1@oە+`” ɾ J0׋ŧ9waH@>18[QB+†q;s%_&dtB qccAHnFiȡr(Uq fG]W+]Հ5mZ#dƀ?8?kHg9iXJ+5ҞUNuQFGjMk$j0 3 | (;h#}a$)&DILo3o2OvHp $('klYP=jIA] jHT>t <==^zMS#dq bZYLG5J:}P~ZJui}h4pwGLͳX"ONg G}u%y0w\O_LmV/uY*m>}۝Vy͉Uݠ|,w+J=PK;' PKK>?OSGI-OPT/src/java/rmi/server/RemoteObjectInvocationHandler.java}Mo@W|# NnOq$pEU xإew֩r|<\R;ūi>8!kD0/]gÐJ jT[,<"X-Qh,*0e9}ƌ Qi.\ysڂɘ4lB4k(y9\6(f3)V < FZ:(zx6ƴ}{ =*>j6\tT]wFAᯎ+r퀵*giYRRHWpQeizb Yg^-E#Y?-1 0 SBM| IhRXuN!k]2ϭH&PohN=0( /;aŒuւ)3λQgOߞ` [3~E'moh6KM\hJ660=]V)PK` wPKK>+OSGI-OPT/src/java/rmi/server/RemoteRef.javaTo0'>bu&[ud"tU5I.6ĩ퐲iqҦC}޽{m;Іȶ/Wa #ap~ziff` # )1UAF(A SE:"ۃ4Pud("5B*4 +y7!fx XgUYb1J (!U\ӕYivpYrM,VuOdL^*,MP)xsI/2RiMXB[JFu!Jĺ` Mĕ|n5RuRh ^1$?p6N$#:?N/7w274Ln촧⎄XXI*Ð.OSGI-OPT/src/java/rmi/server/RemoteServer.java}SMs0=_㓝q[u܆:i&G!X)x2Y$MZf޾/ɳ`aU`,'fDU$aDFhvQ-$)Bpaak4G^A!s([U!Ě@if_ZENg`Nv09 y} A_fmC9-gUuUX&#u΁?8?ٕ9{D Ƃ(-ﺵ.̖ZaʑUyCJ;y/\02|8zxs^o&Zd/3HװHx A8re ئu+ [[r5JU%Bih5'^9 R{EOoryYpϿ=ѝ82ًnr.Dх$p aa=.߳aJ;乇Cmy)}y/xGkApow 3>0nDZp#V5[ǽdb(n ͉9hOPKa_5#PKK>,OSGI-OPT/src/java/rmi/server/RemoteStub.javauAs0x j\⒴434,/F\Ia2Y%m#=;cQa(GX_Ttz>~1bI̎ȭTYT9 ![_tpoKuأ%PkUIR*H{VMW$x5t >np=twm?EQ۶Cm<6ӛLOU%Y CeqJYKBלԭQNUV]+ y\YgTָw1MT)tq/r-VxJnR,-*YߓđzwyxH!$ZIV(ޑj2[ek {Rm{/( z;B}L2غl[(uM쎪=Z#spV>JݟxNh4*'P /nήQNxr<$vZryb[gѯ0w8KPKڱ2 PKK>6OSGI-OPT/src/java/rmi/server/ServerCloneException.javaAs0x 2ԐZN.3I39 {1jJ2weܒLsX\E\cX̿H$u-*Ûz ~tX#{2f`r' RJ4$ #$F#c|'V F`q =G!&б ! 7=Z+ӻ<z'۾B{vޛI۶cmI}ֺ]:_d=SY&`W#-w9A*ĆYkB[Ǽԭ^j M)rWCȭ؄ ɑ|J4tuyCZ%:]X0_f:]fIoiv;ȸ 0 <"rW[}Fr FTJ*^p`S˽wG M3C-E QԂp^kEnѓ*95ŝ >oіu?EzNj-ռUoxI6僰H ‘9~PKPKK>:OSGI-OPT/src/java/rmi/server/ServerNotActiveException.javaQo0ǯ8SRemK "RHW17mBׄ<=;N."\`nUc,'XҺVBKr64?OⰌUP:ȑ=PC0Q.i#$:e4.A0JU8{q6#P[U(PS~3f74})to$Iucc>k]ryC׭9X*ˉ7'0k-: QY7+]MwR)VmZjh9KMhY1״Ȋi0?kܥUE e~eߐSccCTaSDA akH!Jr4]"T@Vs"4dʅcu XZ_/W("`[DqUԴ$d-sSՁ-7t*~=D< >N{v64?FPK~>PKK>+OSGI-OPT/src/java/rmi/server/ServerRef.javamOo@S|#;QqK4qĪ; rro؃cjod!f#X&$e)g=nbEõAf,Vk4@1|GcVpOa~k0q{]VAi"{H ,5Ê@*IOH) ./?}6Dէɤi_ľ6ŤvQ8aQh-YK{Se"eR4 vԍ$U1sjAgLkz#~(؄A@ Kؙ< 8UH`|݆pWg1 G}2nƔ.!A|V\f<*jQ zFDPJ2ٔr+IPa.hyg"vgLƫꔃM.v#Ɯ [ǸՄN;sD a0fPKQW1prqyyuu9]gӳ;% -hW `'tṤNOG|Wh/6m >vF.|8GK(d$w=PK9PKK>*OSGI-OPT/src/java/rmi/server/Skeleton.javaAs0Wd{(%v[LY,X F$L<0u4xC g`%Ijoa§Du-X&t}; cȜ@ɵ,m `b_P!Xs8x(Kgq- i5H@)j|,<v\ rghU>t[ޅau>kMx6IyE[7Mƀ4Lg;bYR4RJGiaES`di;X-v}Fbc | <}gro?7[,J&4Um&QrdRdvpq"OJyF2 (њeB%0,M-2?g.(<}gGCo& $>$Ew<(q ע.mkOoeQ%Ʌ'ÃGsʡbtH@ǃ(‡ZR(tfJSkvbe_ϻyoP,̈́/ PKPKK>;OSGI-OPT/src/java/rmi/server/SkeletonMismatchException.javauRo0>)$bRdZG$HWl6!Q}τ-qedzfPdDw0SX_$u-}0o=Bˈ<ɭ(- =B0 +hST ;TZ!,DGځUkp^g`NaP[h%L91X8R3Ʒbwzu'k j0M8ےךu ͜;#UV\ zRXgĶuJ㑢PmL8) -))"$nI'&]aΖ&]g IlReGm|)|S񕅝:[ Ndղ R4FՒԢ?P',"L:g3)qsyhwvK)Fwa~P"c^O ۢAz˶Ύ :03;OSGI-OPT/src/java/rmi/server/SkeletonNotFoundException.javaAs0x j\i=͘LQ؋Qc$WqL{V-tzX{+Ect}49 WP9ax9^LO/c+dTMneNRFdv9?X.)^0Kѕ8{q%[Y)A*z_htOI{,[!롻g\9ڶ EGjSFIkdHGwݩ_4xs*fD m JC\sSF: ޺V6M 7#G+ A!gI6&nxuȰ\aL:Yw8}$O@<2CO SqN;>!ٚr9GSe#JBd'BMf/?Vˀ^:ấrFQOq!;e2WA4 ˅N{?n6p} WPKcPKK>9OSGI-OPT/src/java/rmi/server/SocketSecurityException.javaAs0x g\Crk9f &(bɕd ʸ-iK>#5pF[abHJ UWe~ cX%u)Kk4jMnKHjQDJJp1 4'q vK̐YPP  {itnNOJp3 n|g\~4j6XrTz&β|UnUEFv:BԬ+Z@W*#Xq01kiƽF~ A#iy]<].Y,lrγt3^}DK]G С6˔>_DNBF$ٚ [Se#JBd;BMf'=;^FA9?x712IP7+E%X_r9 wu_ :8Rkxvq7=/aG✣f?{a!۰᫆gS- 68r?$=3PK|PKK>%OSGI-OPT/src/java/rmi/server/UID.java0 Sh8MZN)62C;{4H;+.KsH&֯_dEwLGCe` >RP9~2y7~V^ia,Ш !EΟ>2oh,i^0C[u{q4ك,H"sR}ݣ䪮NI['X.8K!CwO\!ڶ EGjSFC2[,[6J`gC;AL-Jт6 JsSr V\+ z3mЮKM($>YcnVr,2HW0KdK &Gu6$?-Bx$[cN;ʹ5U6D(⎠F'2`m$ ӗ/7."d[&3 f˃[WBB.Sny{Tx] 0CCBүnMNp#[i Uz5HZn.HT\M\et&Iݎ>qkH9ZME xc6?}9~PK PKK>5OSGI-OPT/src/java/rmi/server/UnicastRemoteObject.javaTn@=_1k=9VS#a(2&fwAY۩HBVXy7#'H˕.$" . $Gc/ahlp'9r !֌ӫJ0@:m;[UšmA*E@{ځZ*Vu+CM>kE9߯*bHehi6~O[W@kRroiRYNZ V2W]\`U̠ K$Gd}@1 8$8KГ\'\iΒq)&y2K&). No[{m)|!C|"aIV# ɚ\lT4F֏Ւ)Z8O/|F <-۰zY˜^0w%)S릸V'-rGʹ}~3j@Y}6t>,i2ڣiz>^ce _zhJeߡ`)Ӄ&:!(?͞JRRke>AW ,3f~Gܯ)<|tGvoY_mB;-;2|ˎ|{[RҟU)0>hPKnxPKK>.OSGI-OPT/src/java/rmi/server/Unreferenced.javaeA0W<ԮJR{ TJZV{tIjHmc;V8 bWo8p6+ۣǼZ`[~HN U淫ջ%x}CEt(ȑ=SBy)G5zU?R#*M'K|#VWt4[q(;b Ȏ@P铙cI%i/8]ûe"$0b$m뒇l[nUG^Zp0LUvb%>:PVz%n ,Z:oLȭL`ۄ,-3|Lˬ\le1-4em~mλOH'|%-:ll1e:ED}Er*Ȋ[Sm/ZBdwC$]c:t$c迾B$A81ٻ6=dS+K Y9kEPK(PKIG@OSGI-OPT/src/java/security/PKPKK>4OSGI-OPT/src/java/security/AccessControlContext.javaQo0ɯ8B S:5ӄxpkjvV;6uLH!};'Qm ')0/CQa3-,ѢbCGeVhmqB+0 >4MK[%Z0:. W:XebN{'Tk1S (Zw6ߎS0HrH|H4=.]}^ܮ.Y.lsX,af*]dIv_lȨ; MyEdb-8UޢQ4hjaZ,=FZ8[ A@s~l"'A4Fs$p1TZ9cO}-<6OSGI-OPT/src/java/security/AccessControlException.javaOs0x 2&\B[O3I39 Fr%ݻ{}''W01ުrї̊ iU)%3]78lc:hBS" !*C|!ѸG臆^W Abolx4XC9UE'IҐf[wh9J ca^pWFA$i6G2N.&Ӽfn^W,}oe=DTR,-(-q͛@Z.pf[a)ȬV-OF~ ^Z +zxY1 "~t>OE6-0c2oE6yiOY~;qd|=68`L<" 9!Z+tوPY͎P*1*Tjǭ?|(✿b'bGn#d%.!'F{k=y+w DqͿ0OSGI-OPT/src/java/security/AccessController.javaQo0ǟOq *о&em*qؙ$sNS'偐;>`A`~K)ݓ0hTE.Ge1Rehq+} $@tڥNKlu kICXX uѢ­:'VC/pF -s-tY9WFQ]!kCmH"=QYWJ`W) u+JV6r洧pB}zjfd:#;0힑Z@18$8MҾ'o4ϒQ ) 'dLt5|O}@0λ]al\,T^!EAf-VKb-sͣ'}BQ7^'Xhd,(H{.1ƜP+g$vkì¡"6~sbfЃ[=83s9fE 1{54 T) J 8x >¿o:PBy7Yej~kT9|r̛DG$@2?9MgJ\@3B嚿'2?2\R:hQfoPKpxPKK>;OSGI-OPT/src/java/security/AlgorithmParameterGenerator.javaTr0=_d!9fLfrbڒ+vL=+p IW] U"[Xyɹ0? {@Oa2 LР1 \` LQ] %׮j#`KKX ,T Co9XiQi12Jgf"0ے^֖ib(u_DQ>vוϖJbٌei*Ǻ mF cUv˴G$}3lc:aQҁ/a%=rMpN&ar@?Y"^YF9#va) /KY9J;CE9od&AoSpU-Z|VZn>an\K-&H.:j>Ճ.U`* y:CjtwGa8S|JqHҶSs]{ 0h='>4ȑY.җ7|/o7$=PKaPKK>>OSGI-OPT/src/java/security/AlgorithmParameterGeneratorSpi.javaSr@ =_jHn-' t0i&GFqLZ!d:JOOOO,3zoz,+,"_CA° HKrdwHYvCsIJ]f:6.1ץzI؛*܃6G6\нkP;i-O]aRPi;чk}q4j6ƃbT>a:콨ntI΁_ [xEµh-c K&n-{-ni4bj%Y>%Y mYm\&U:`b~\N!t~9ˤ6L 29EȈ$l̓$W +M ّ2d+vaN恦=CdhE@w;RDu28*D+dHEolV33OSGI-OPT/src/java/security/AlgorithmParameters.javaTMO@=7bSR'pkAHnH[A)BUuw1w66){v{ýXk-Ba}`#FMsf9O34Wx@NGi0R&f~85'%A9tnAU K, CX8EC6iPl02rgP#0ې2kaUU0NykxFĺ:9BXA8לU4T#YXWZX!`an#I@ec~Aԅw~Dr1\$ $iH_/S d MYw"- US2rɴd)BV%)RVCnLtDN}c+%h})9xΈiDKםWVICo k +GޙV+~szpD=Swy{.D-Y!<-~& Vd3nw^&d{)*gKiKw?2}8UlAPQLwE<tWG ;[{J85/@X.-?Q"ǫy~WJ$t YzCs;aB?°~iMPK}vPKK>6OSGI-OPT/src/java/security/AlgorithmParametersSpi.javaQo0ǟɧ8J 6M ]SiB<85=H`;ͪiߝs*CNνZװkPAm5œJ|X9 R/!iU< ܷ:sx5MZͳpz=4M qM1(vpƓdSDkේ wATL%EƬh@A9CTLNjgFn}7m :Qqҁ7Q'}/r醴)EY4Iq8^hrU-:Pcs;EHzd+4'ɭBWhw%Y?Vˀ)iINֳ|A_EYA3Dƍ @1_,?#%c?#<gPz gk>^+s[-07w9?Ji# ";fxErrU>owPK@{D]PKK>-OSGI-OPT/src/java/security/AllPermission.javaAs0W;>Q'mfcfrb'&$rAz+8nF[! / HLqb>??E_WZXE*r-8*Bn4gؙ/4VhB/ [h#;Z!,lD]3um:C'!CX u !'0xnfK\|UjuZ>Jl61iGGREtQ!RD.ÑۄrevuxKSPKo-dPKK>,OSGI-OPT/src/java/security/AuthProvider.javaMs03qsk96fI39b q|ꃍW.09f=ly \JGfه1NkXJ +hXD.Gej4y8=~B+8M3Ѱ5A=v-o9w T \r5<-:~LKYOjLc\'RI %**bm5i@jz:f0:#*?-ؘQ^BQs^eDr Wj/ż fY. Z}|q ߊYH9xۚ0EqP">CG$"ɚjLlEZq%J{fjhA_c51XONǯDbP^4xc;= s{-jwZCYy3)+ 2 iBfbJOM/}hXӷ wgѽ=j_2PK{"NPKK>/OSGI-OPT/src/java/security/BasicPermission.javaAS0)aR'pk9@[O2U$Wc +0>c49f[Yn< W R McQa!\KAQ.Ȃ$ t;cII,0`t,-A#RЃʃ ̶7m%]ar,G.o}6W'iblccˉ:j:]ͳLUhE΁ߵ8VL%0gV  XZ=ouc3kߠ`SHkbhO/ౡAA "lLnշ n2ҫ K-*] $;/@<2C SqO2ksDr ƒ4;AEv+]8VǀEQr+=vUhE<_w;5hUuc98 B!c^s# 8 B(ڒF8#+Q?]<Č3=ۡj:|%#t o-Wn"|Q^"'VÚE Jhoث eR{ؠLA}ݴ/zb;ޱcPKAAPKK>+OSGI-OPT/src/java/security/Certificate.javaAs0 in-dpfrQk$UqL{Wvr}z޳qc+78ٝax5~}1 -!9xQZ,pX3N?dX$\Sz F3oW lrX$a5pGkt.{;FrF4s!0CwsSm8TF|(k l&*rbY )Oᄬ&`UZf:#]vdI$>YMS>)^:Yd`.ou.iu *sE0!C@(jɪaBvh$%f+ oSpuz፾ - ςh<3םğޜnrꛪuhJFayFknDrU3*Ln\ -옙˨I.{FK٬Gya6e&?_sV-sq|\hV{] N O vos2R5ς_APKّK<^PKK>*OSGI-OPT/src/java/security/CodeSigner.java}Ms0Wdg(8>Qmfp8(o+$* 7&~p#ϾR|us0T ,O$T0N/C$ǰVh챌XPb *р!$(7DBƒVpMaFCh4ynPAk5–$>8 # * q4۾N9׼"GT<&/|񖩇[%Z0%o *ĆY@A9;CT[ ^$ mZwf#:m FIi>IKןkKV$[+/t.3}$/ive'`Lvnr3>! RBhO VˀT?c.(."Xla4m;WBB!3u9U OXבr4$$ /EQEs^ ~<{a9Cu㣗x#*OSGI-OPT/src/java/security/CodeSource.javao0ƟT,оm&-yE}-,̚YhOS&4t Ҭ,r.>Ζ MdHo2a<^t6{Hw)^92K:`uqB5.{/D1BPĜP,ПlnXՠ+FpxxW`Z+S.ʕ1 y>c8ǐ 'a'PKF6PKK>/OSGI-OPT/src/java/security/DigestException.javaQo0ǯ8SR1H%YV) FlfШ5ji4@;.0j0.&X7I]K j: oc;-VdXʂ*I# X)ƾa4Fk/q-ZK!-&cAT(:v9'à7NpW۷ns8.=qMק^ߦE/30uj~ҰaBl qiO餪BXu0eJi֝6plBaH>%y^>]YޭqVIN9+̖<]ˌWdfđ91tȉd*VlMU>Q Z-^{sᅾ,-tv1eE- =:R=nHu>_۟woB {}o59~xf?3!^;?@</PK:ErPKK>1OSGI-OPT/src/java/security/DigestInputStream.javaAs0W NnOvZ)1N39 XcJē&;Hzҋ.`v #X_9dBp&kj2OSGI-OPT/src/java/security/DigestOutputStream.javaAs0dgMrk90I39 {1jJ+&8tR'egD͆ _%m+|aA` r-+TkF AȍxwZE:8 ^{؊=(M2C:X+4RAIz^`gBԛ>|"9˺KqmGˮ嬼ȮS7E/-wڃ0+ڊX=ug%I 5ubґ+O'=y_ 86`PE9 bm~|gⲄ&ٴXϮ b6rd\ M<"'hZVܚjhC#0h҅kulVn% :,+ʢs@N+Ǒ+VlܓTEeㄪvcRW%'胱 3=r90Y~,\TN]2+pI@Mc6H' q|:iLҺE~5qR3/PK;@'7PKK>.OSGI-OPT/src/java/security/DomainCombiner.javaA0WzjW! 5]V+q'@biZAڊo$ -5{S9u k[J"Lofm :%LHr^Ђ#dFH'1|AH+I0 x4GPC=AM->I4HԝS%+/X.URЧgy0$DhۤYһ|*koݫ?{quaJY[1 |u,yRM N~͎T"?K&Lr2/`o?m6YW%7X| ^xOy92OƆB)BxP33(&ɭ BhwmG.1.شԑW_PE`]DP62}1rbm-xKHsFj2:+~ HO)<;dPK_vJ.PKK>8OSGI-OPT/src/java/security/GeneralSecurityException.javaQo0ǯ8SR1HYV) FlfШ5ji2;pnFV[q1"HZ UWe~D7^i$KfOeN,hUInKHQgFJpM1PMA؉vh-Ț@O5Rлf@ .^;r 6B7@ֹcw]8ҦwlL=tݫ4<0U!Z@T洧tRU!޸N6uB{eOP%9|OI7yHW_+<$eyEvEƫHG|Mđ>?cJ!l6Tȍ,x4U"TzOFDhj6I'\뷹Fqp?wAӮ9F`[RdDy'Gf՞wɟ<׽| <^5'ȫ]argX/A PKHPKK>%OSGI-OPT/src/java/security/Guard.javaeAo@W-OSGI-OPT/src/java/security/GuardedObject.javaeAs0Wdg(8>QMf`8(o%* 7xF۷>_pK ;S9#Hӛ:~E~^ia=IT+T!ix/4hS/G[u{qtك,lAR zrIiХ,\j^ós}Gb 欵}\e3SUAk O\AL%EɬAA>sS:ME*;w?Fc &Ii1oI7yL7? <&umUyvnQ<hdZMC{r [ {gqEq@Ev%Lw Sa({T E ꋺ htf^6r=W85+ (P], PK5vRPKK>(OSGI-OPT/src/java/security/Identity.javaSr0=_ jHo-PB[OR`LӃ,/F\Iơ{WCBt۷nۃ6 U"YXhLi*7Imw0uHS4WH.Gi0\ƨ.St+j#7~ШXl RY 00)r, \-Z!ԩX8Td]h5tYXvYW:^8&խK1g.4Ue䊳%* t-FG cr#^PlLBcB6 Ž# f&3L,0p2> fdL0_y0>RdvMtB= sd2b.8&%ZTd¸2;T,ezTzݰ Zn 1;\=-!N?xYQ"Jq -OSGI-OPT/src/java/security/IdentityScope.javaS_o0^>ʼn'@,оmLSY˶-Lq-3!eUI M)Z;i<ɝzЅSmWڼQ&9Bx08}5\k|Bp 4A.#`Wq+=%@5R3tC6 aK -̂U aW%OMQ;=-76{ERtO^ӿNǓpTקdƀ_x*5a( ,H5B +d`L$bFhIhB|As jףl438N΂y0gMn<)2L;$S8)BؐT$!Kɚs#jZ#P¸9D2[G9t@?ؚyNm^ۅIg5-?,_PxOݥ(#z{ie;v^4;=!M"X3=x]v8PnZO I /r1R5Ez@W @h{^ mF(\d,NA͵']厢5\PÍՋV$X)r>BOSGI-OPT/src/java/security/InvalidAlgorithmParameterException.javaAo0 rJ N{zҬ3V8C葱[,y'(K.`arp `ۣU`Z`_ H |~?" k&KfOeF,Щ i࿱w2Vh^0K٥8<:K!,$CAM;Cœ衷Y|Ѝïv}G8GT|&],|SJ`W' O=LUY% `ekN{'T;ף!oS v$FcC$4$OЛܥ/ %ume5,VUIW>C4 82C S8or~F-b' MUVޓQ<daZ,p膭 zRq@ˠ#.U{LdZ7`Crx %*MtM |\wc?{Og7' Qq8{4d6W c<PK8 PKK>3OSGI-OPT/src/java/security/InvalidKeyException.javaQo0ǯ8SR1mK "RHWс6!5ZM6@;L/\`r0'Xf_$⪒Blv&wZȒ9P9)KUZ*!R+\E3}h(&^ %֐[YS rV]ΠI8h.xm#g\q:m6=qM9NvzixԽZHÎ7DT0k%ZhQӞ5IUzZa:#7; 핑m؄(ΐd#|$ C_!^t,2,W/ӛd,S^}F>6IoBGб6cJ!l ֔˭ٚ*QJ} j2{iZ,L% o4 ."7Pw͆cD^ KATn_uH|.:ky 2OgVgaf;zgt#\'ųW xPKPKK>9OSGI-OPT/src/java/security/InvalidParameterException.javaAo0 rJzzl3V8C葑G,i'(G%b(PlHz|" {t ,r$jA0>L'i܆UTzX':ehr#iO5t&aG[N𓜗Fe:q*ZM-A'RA 5aw3D<& ˑ ,υa>=,>qj\g7|QVL=TjEރ?t<hJY``ςԽAf lCM-}prӅcџ 860+(|ΫFbmy|u`.Ų{^S 8c"z5g$oIȭ#OSGI-OPT/src/java/security/Key.javamMo@W|#vZ=PiQ",QT]ЪJZwy X˪U\ SقaWV5! Ikx VDUps*z F*:e/ {T,OSGI-OPT/src/java/security/KeyException.javaRAn0bm|Y>ȪU0 *Ě֢6!9UwF:Vo\' yRZgugidM(i>—$OГ \, ^zf09uf !ޏW[MpߨzƿoPKCU:PKK>*OSGI-OPT/src/java/security/KeyFactory.javaŔo0ǟ_q *h߶V2JTqؙ$EUCXKM6H;?߯5:[xFg):;@ځϴ0F$ ȵ,& 9B1N:ҁh N|B5ۧR`KPAnj 3!c@(zhpj':F&d5{o\-2`qMڕ\۽a_Q$:΢UlY RY 0>r,- \mv] <je(i=tX[~ XG(֌oI>J?/R0Ny%eFVWpŗ> EF}n.-BxV;$S"ki4W,GUZDP `l ٮ\(Y`WP;jE1[[#lhtw><mje^l_E: (s!%jC> qB_hGtY!^>-1n#T]A<,Uq kAqO'6OSGI-OPT/src/java/security/KeyManagementException.javaQo0ǯ8SR1Hن) Flf5jM>\;> pnFV[q1""Ե /02^i$KfOeF,hUInKHQg 񝌕Z"bak4Gb'Pڡb#k jBẁI .^;r m !?[皏qu]$zH*6Ig,gVd- j#DTX3k-:hQ==ug au)uF[w2FVc $G)<&wvdLU:ϱXbȮU3ivxd܇ Sq>"r~F r# VTJ(NNZKoS˝tK 9F?^Dt vcDQ 7X# TiOK#Jwӟ=<S|(s{aQuy5 I c<PKr$qPKK>'OSGI-OPT/src/java/security/KeyPair.javauAs0x 2Ԑڜ\B[O2Y̶Fr%f]7H'"abbg_IY91!8lc:iC0᜴5j& %$UFֱѸ臆^W .ة;l$cNkfWuh m{NHyWҮDPjw85M86^7I'Y6}/ԝN,īT%TZ k UX7YC8lU_QF )^!zdi6 &ndHftad>J|&HfNgWCD&ce!-"#z1'$WQe4]Ԫ fOVD؅ku6%+n3W8hE`]U(%eT+Q\yO#-^+bgdY)zש;Ew|!Z+O]|'foA[ĒǷ A.'>FoPK'YPKK>0OSGI-OPT/src/java/security/KeyPairGenerator.javaOs0אڜ܄dLfrb%Wqh8HfZFw~YRo\U -B`\ B0t} cJc4DGi0Za8o|%4@tWޙXJ,IC8VʪEkW*[ 55Tt7.f[/7Mqt/ֵdۮ[Y1{-49.UDٔX ր2*Gha|0jfɤX- 퉑oPlLB'L J:1Lw"wvwxƓhh "D>AU_̓vS8_Z# NdV !SsԒA}VC)D),G/|G9sB_ٜyM-μRdq `y&%J*oQf;/K*ޛJ+e_];SABA9Ӄ<o2vu]m%Ⱥ(`Q8(w13a)c}iZ$ԡDlUwjy?_j.hw7'teǖ\N3:X!~`WHc~Y3qӡ1fw$7L-ҖG~lFrNj~PKnʞPKK>3OSGI-OPT/src/java/security/KeyPairGeneratorSpi.javaSr@ =_jHnmN.'`Lb-Z{]LZp3!Plkd"8w`AX-+ҎrhtN Qɣ ;YFE<~Top(v wƑp5NZ~ӱ%qG}'zm?FmƸW[֍ntM?^XհW;ZT)\[0$9oֲg] oRy˫W ^AK0T0`aIX$W5+M ْ2d+vaN恦=\(矁n1v1hwJl\<E 5ijCG?gxW+QPJ]ܗrk8Mg-ghwYxXa8C2'ea$Twh"O2$>[ӺwTo]~&OSGI-OPT/src/java/security/KeyRep.javamSr0=P츧'ЖII&Ak$U& hLj{oمռ8XSؤ9eə&z. 4A}]@( ;`b9}Q.,9L\xO5T!- sT\Vjp{ ( <rk3*PڿNfsV}͚ X8}ƫhFPu'J44&"V9ג5 5B#YX7[. ۆit0;nھ1G:lca q:0S߁<ٗ]a,R$ڬ,ެi #k,>S@4"o(eO($M5+ yD-H(7nL+nBrfG>p@OyMKO[lTCPЙ벹 RԜW e( Vu$wwW4EF$ʖo3y$AvdzAJC!xӑ[ @YlOvtdyɔҲy:*C'* \;{oPKN@PKK>(OSGI-OPT/src/java/security/KeyStore.javaXsFŎp yJI`atp: qNT_LHC;;sxիsǼG# `s}>J#FN#v߷mBz |T $qIfBBa6HkZS55PbLQJKދt#*@.3p[n(~ #6D ʀ<+sf:~1TTل9 ]W¨G43B g.YPFG0O'_"3$.BgKV^,u,6gl; kCߴW8,;sI6FMɤu5`8w\"{ 8m$Je\i nveȅsg^]K) IIԑ |^[:xބ҆5Fi2Q:~Q.5Ƶ`YrP:yEzxۖ}6wR@{U-'ɀQ lc"~B=%fq#[9uUoYf"xsMZ`Q/JQԖ2L%(Z%WrО0?eY H`3ŋ@YpUQt՚J4]3}i˂Mq/Kih>9j+!>m]d>ìjyrj,JӚ(9xš6+簷g" \7Vb|[`vܐosCU@p,iWe<~ nt-z4+OƢFael&̩`)43(M~Ơ_Οx$RvG: {L)_ MzD<63gMz8㔽9NC|ݝ WjT>ymFި=ƅrOD|0c | :KHy {{9봁|{(ۗ㢠lݑ2#u36|FV*PKlŸGvPKK>1OSGI-OPT/src/java/security/KeyStoreException.javaRn@<dGڜ((5+OSGI-OPT/src/java/security/KeyStoreSpi.javaVQ@~_1'`IϜxCò e-h|ͷ x ]f[~ &9Byz~eH#48\ R9A v'GӂPμ4]Iurz V*9[TR! LE?8&INm),˓8&)Pc(с@`6'f&/r鱌tԎױ}tX秮eƀTx,!Vk̖4H#YX/BF-0jjLcvG;Tz1dcN^aMpnx}7h~t^p 'x z-@D pr!ZS2 r1JQ"H-PKsa\[ 8X̅e6[ګ%j77-g$꼑cؘ g|*a"WQTXm/|Z{}Qg^f/$}et(#!'cQǛ=R1R֑]%LvyLw@JLrh/^U'մZ]ٍjiv)fЁ4ݕ($tOZ_]+뾁^mǿJ@;ܙ GӲQVnj>lNG~(9K-_B-ٟ$^=;^RrI[N%ԄwO,3Td6CbzJc PKm PKK>-OSGI-OPT/src/java/security/MessageDigest.javaTr0=אڜL^Fr$߻ 1ȴ)#y}o'p)@/$2D;O绾k_fjF%Kr#c(D YDMāo4!lB ub% XiH\C3|07Dr7JnU*CQ:#@N4ܘ`P*ŮT sڿ[RݠnDZ+r*b!iX RKRHTp:ebJ\l5mmL@ p~X[ir3[o:3d ?'c}o|H-:+drz nIHd-IGdMKRD%\۱j[/az—-4tϿ,Odƨ;yRdE/xڐx"Pw+'9u:PK{PKK>0OSGI-OPT/src/java/security/MessageDigestSpi.javaSr0=_ 2ԐZNL^FR%a] Bv}[1: Rm5V599Bb<>}5, !180X@# `Wb9t!|CmpLV6f[Bc8r:i-+?cqJ㐙egԠTNUGmCRWz5x:K{Ru݊qHU2ZViNumFGSpc5{ڳF~ ؘ^B2JtH"J,*^N JK\ )2J;$8[DB)œ<'kjXP jA@^sjH`hjY/7hOG6,47v&ed̯WBcSa/K ud=H(Ҳ5G+$ҦRRS3}Ѫm'DZZbf[NO {ZZ6LJO燧S!7ԍ_H3vCKFkwfݪYӎ@Kp^ReStU| W)~PKKjPKK>8OSGI-OPT/src/java/security/NoSuchAlgorithmException.javaQo0_qTY}QED>x vf;T:j4Mx="9YV|ev+׵*'f06V^i"KfOEN,hUA"čoFJp0PMQ؉#vh-ʚ@]3uU9'7N\pCë[!_\q:.=qM9OZ;K4[g^d- l7GraZt45=ug au)uFnZw #V Q!FgIzdeyCZ:YdX0_7:Y8}$ AC S8O aOH\neΣ%{2'BCf'VˀN:Ms፾,-tv1"ӥ:k*Kj߀?tp {ݒ"#lXʟw<'o 3C\w۳ PK "aPKK>7OSGI-OPT/src/java/security/NoSuchProviderException.javaQo0ɯ8S; 2"5]65vմu*C"$W07ɪj1,;В0M8lc+rdTL$DK;Bɟdod2  GM8{q6#P[U(PS~\  ^m_ !?;Iu],z*ZgE^,2Pkr~ěDTRl,7+]MwR)VmZoFc@V1-bLjlQ`|fl _v ȸ&`L<" 9#*ɣ2'BCv\Vǀe^y ( bGN7Qn8FZ0]nVZsPlѓ.em|GaGla8/"  l}_PKqLPKK>*OSGI-OPT/src/java/security/Permission.javauAs0d2ZN.ISO3I39(+84ޕq(i3>}I`AX a]  |24~~F~^iaA̖ʈɵ(HY*Q%pkƂ/#E <@`8;w{ +! 豠ځPPMݣ­}zOwyձo\eYmX2`2$(;ӷso*rqѵWB<)NqC2@5RNO `v=%P^"Hѩ=LKI]PԞZ?PKLPKK>4OSGI-OPT/src/java/security/PermissionCollection.javao0ƟT,mL2ʶhL97cgCJ+CƊIC"}]DpSS,7b쳄D)Z/7CAa!\KAQ.Ȃ$ t'CNI2C?zQo0 {S{Hk^PAjf[uhOH0G#TZ?}6WFiblccˑ:j:5SwU7Zs`W--'S ̙Ua̛@X.7h)y+ڟ #G*ౡ^Ac0ܦ/&e2_ K.W*]y |MWC ʆ)8\EBh$(͎DPJ1`lJz+4Eg0;DUsƒPȘN=F)-i[i⌬D%kx^un/8iNwFE?#zgmAgޒm'_6:Kf1PwT疄B}Ԓ5*G8mZGL|QPKOR&)PKK>+OSGI-OPT/src/java/security/Permissions.javaAo@WrJ` ɤ,)Uk{ w:NZ3똒 U`kof&9vgXJ*G_fo﷓WZؠE"dorM9*@n7"p3h,i ^0F8jqك,$cnܮ\< :s >Bnsͻ(.=qMɓFbJzQZ2qv0U.2fm@TiOr)X]N6Yg(kݳa<6`#I:&f f2UM+>}xu_G9xh1ɏEH!d̩[SU+*J(45YVˀTO_>( OoCEh1oy@yдw\ fvϫ¿s5*7I)-= E1~)^:R5~_28`]kVgDe >cPKL/PKK>&OSGI-OPT/src/java/security/Policy.javaUM0=7b V4{kQ)6* @W{Z0 nCYwϥ˶R@fӺ "]K-4ԃ 8, 7uM606HcT(W8)I2& %sNzU+MRq݆ԪZcREKDhR 1>j bVrE*awU1ӌR@`"]< ӷV6+BFĪ=XWQ$F@⏌KR<[KUf5f9 ,HkZֹ'Qu$4sLHdK5x4Inɧtxxp ݡs'Уp;z& YFu!FrG<J1!HZe,B eB El"s&K.2ZE>7Xi6#H8 41##Akx^U<(CF=0b-F,ov',ehEюqW1(L=: Ǔ~e4~xy| {%z"7=ϪvP 8B]7r)ru ' ~qGjf䉂BZ%n$ŊSWJݟKLH~T;6&Gt}I:ƣX%'ڿP^ۗ_>l!S|.f&D(vUwĮXbVi1ĢN+jY+6PKkPKK>)OSGI-OPT/src/java/security/PolicySpi.javaSr0=_ 2!\ؤey1jJ2߳t:>#{oë`Ίz(nR 8Bf4I؆< nJ! aЂ_#qtuB+IF^W Ɓbذ(qHJH|h<\oLg~}Xx8t0ZY{o>m&8Ѷ# l^ޓԃXK;`\qVWZXmj^׭^:WeM%lEhos"+@-,y:_f9LisZ}t_4H M<"Vhb%8ޢUµ:2X)63 4"G ζ,q h7LSRJjq\2yisW/ѻr@=irr8R" Z(E&B7&m(XU)ǰG>L&߅OQZKdo2Z?P_LnEI丢!ZQ PK|M'MPKK>)OSGI-OPT/src/java/security/Principal.javaeAs0Wdg\psks"2@8丈bIޕMɄ ӷOJ.#6G+\,(JH^ii-9cv&wRrTàj;ԠTYY'x M:X{<G!4'AƃT Lhi%+,G^`xԼ tޛI2c'X6ZeM^n>0^X5HWG@T+fqm[K\:PVz%8-Z:oe57c_ 86T0KKܤeV.cV1n|mJ(.l9@?,]qd:`L<"Do}FrlT;`KY!.c:r/=ԻFIq?30v$x91OA>V*! ;Sܱwڀ3 +I %ǐ-4E]yOPKy+$PKK>*OSGI-OPT/src/java/security/PrivateKey.javae0S8&aanQ)6UtGL´NmlT;TZ37xp Uwʃa6u *2Cކd ޏ|w i` s#e( 5BT}d QRn.aЇTGсTA %IԱZs^ősVpwD>kAж/ľeP]rM/VIz}NVh hՐ2gJ4R#Ǭrԭ&KQmF'2#:mQ q:OQc'ow[x6(ƫXe >Cqj0w2 {>o.(<!N75lP7f6cu!i: 1EE~{o‚L)yx ]8t2{7Φa5x_PKQ>PKK>0OSGI-OPT/src/java/security/PrivilegedAction.javaeA0W<ԮBRB@*EM]gR;N3n+rpd7o^E'ڽ\.)?+d]r&oI86d:lɑ=RBS Y/$Hd20BM8q6#P$P mT~39OSGI-OPT/src/java/security/PrivilegedActionException.javauAs0x 2Ԧ\B[O3I39 y1jJ2߻IH''W03Ѫj1#, i]+%ax=Gq2(!*IQVd᷄?}ed2 h,NG=F:Hj<4Gߞ] z^m !|}~7Xcch]ry1}ם9X* SIfZt05ougWÙ`S*ZEhyMh Y1ǴȊq0V_w+ܧeyE~EΫOH|1#s0cQ@ؘ kH9OSGI-OPT/src/java/security/PrivilegedExceptionAction.javaeQo0ɯ8S; BW bJQ1unRCjiVMwۀ6GWXdU6gmВ0^,Y J-9Gbv&JvTY=!߸3wNxiLƭl,NAG=CZ=J<4nDߟ.yr:υ~>{wI2 C,ıM^.VXfԝn9X+NSIcV 0{*t33`S)EhMhLY1ǴȊy0/ve.bo2<4,82C 0 q^n \\GRJrkECh̑Б=(1`lZuP^}BIq?q#s@e;dkwͪ#? i*U +X3]ɗ(PKP*PKK>0OSGI-OPT/src/java/security/ProtectionDomain.javaQo0ǟOq *hnVAEjڃ1ؙ퐢;H;h>,wvz'ЖkE8 Z #gi2L=c"0RI4P9: >M ye }hsAI:FmKcT^]ױ*+zzW{b]%ͮk{pR&AJiբ@), ]6pȘYL{Hm@+ Z1Ҭːte|=d2IF"y:M#>A2 HQ+O@2۹;E$v'ɗ(U$fJ]34z8gVKD.=|Šb%b"փfd#H-Hݕ%s>z(OSGI-OPT/src/java/security/Provider.javaVےF}_ѵOKx<$Z$Qy. 5bь2dʵ!X v(L9 ^U<[['003 o×ס_40GziH'( daTAmp꭫[Ur,8 @/ DE-v](^ |12 gPзU3EWoAY!Jg5h<ƓIu^ 44븦[`Jؒ V2gW]jn0jeKäX͗5mJoPۘQ Q|(<ȇh>tMba<lJ#o@jB H&Mb# +d L'T2A-"(PzsnZuyAG}> &nImYb!djJE]\E ,G_{?Ƴ'urL.%j߯Ge0qØ@埂{嫧Qw>f߬hEi\WxǪV\2LQs4Z%H'-<\ok~OgrTT{P-I'$GJ,#IIvUi%$&Յ/Kҡ7(.KŞ >@0XaѳR !fu1T9=cݩ|;.G]WO QZVIٟBz ZD# ,S{d-= Heď9'O@3epmj=ms8Iv( #7}Ƌ&|/ '( 3}(z1OSGI-OPT/src/java/security/ProviderException.javaQo0ǯ8SR1HنV% FlfШ5jJ6@=.0j0.&X_$Btz&FY2{*#v& eDJ2p[B҈?C%2Vjhhr-NCk=Fz,q 5Z'ݶ?gp$x< nhx9B5Hđ6U\6MgE>CםZJ Sbͬ DekN{H'U!oSJ\,FT Q#Giztuy}ebs,3̖t.do&qd|=6OyEDg}D r# MUޓQ<2;iZ,M-w o{Y*Zp4cDQ n^r|У#UcV9WSn0y> 7y0 O W[?5<PKPKK>)OSGI-OPT/src/java/security/PublicKey.javae0S8&RC v*]$0mS!U}!v37xpKUwʣa6M *2CN'p G;4E N2shd!Eƿ>2 ) SC0CIt@* A Uam$dTh-OHP+8]pAͻe"C_ hb_2&x$]ej/+44jHćDT80k%ZPDcV9V%Y¶BXMƾ2#2mQ q:OQc'n;x(6[XnU7 >C<}ƀlZ [BHƌ x4Y6D(䉠F}"0`d*:r\QyO'Co0kؠńmd,Bcen^W.{$E5gXxFIT+|z; ûyxNfjPK"v PKK>1OSGI-OPT/src/java/security/SecureClassLoader.javaM0WzjW!.\v DT)jVLRkiZ3nҥ'rȇgg^[_xpcUn5/Vif{5\@W-eA, '2)JT2C v,G jÕ`]iCIlUk,TIȹ@K \BeVsiU ܵji3*(+?Lf[|u=qtMO$N&ω?+iXIT)[`5( H1uLɸ/+{doF0lc:aQҁQDDnn<$Ƴ:ZDC(2v&wv6 B$SbshXP jIAz͍VC|-\?wa"Cd#]qާe{n23M ޳R+뤸ۃ7LNs.ͻ!rZ~S% F[*ϛ.!XeJih+-AVB a[ݷ{|{qyϏf G(Yo!lDPK6~FPKK>,OSGI-OPT/src/java/security/SecureRandom.javaSMo@=_1)F{2mAqJU!^pv:nT3k;Q>Cỹ3VZ,$E!}31L 18[QL)j9BX2N.gF( BX l RY 0>r,- \-NZ-lXx823J(k f;͓[[^u]Q( k8NƯIuu' 44k`%lNZ V2ʩBf>5hRaH6&&%=x&Q;har7p: Y4N`2I|͢IL_ cdRHpvSqOBL\,dV !S+Ԓ:R7VCSGS6GG}BC#;ol"W^YF#u;)%I(S&TVAx^uY(E vCI)`|j%\3<߲Pykq"J"ٝ[F[i *+xަ5:ABׁ<ІEHV6z"Ѹ)p8ݫc$hGeZY6ת6$J*oEt/N#smqNNݭdBHVD7 mo.\[a%mKIR+%R0]%='PK"xPKK>/OSGI-OPT/src/java/security/SecureRandomSpi.javaAo@W|#9MQ#,(zX1vbLbZm曷,.nzCT`DUEBIrf|; gH}-!;x;,Ъ =Bɏ2Oh,ia2&+ojуZAvT!QbH]7#ZGn?]< <:w ~۽lF;׼[, @jS.S]ūu_3WZ dx09Vm@洧 9R޹N6Yg(oYhy P02 \GYͽCCQlRXmxo~{Qfȑ<6o<"dg;}B JڑTي47MMeTTn^~"8o8Тl9*hڜcB:`1e{]g XpГ34$*1Sj4C9<v(}G_UI oQ9bJA%4,f;O'PK PKK>(OSGI-OPT/src/java/security/Security.javaUMO@=_1)\;pk*\UTq(BUuw6w1/C"̼y^f=é*Zds ]ރQY@I= }﷽eA]aJ;G 駍JQ0K贡NA,U , Co8EKviQn12JgTPl=mI7Ż0:` @,W&OχbV]KiXA8לՠ4L#Ŭrk-Fl4:TŴsH6&%'%q;xet9h<<NGóx 5|g> IF}n)+!Aܠ0S+J@.fh2+Y @j``rhg.(<*% 2OSGI-OPT/src/java/security/SecurityPermission.javaAo@x#&B[T4qYf[vw8(,P[ޙyU+LfoTqBZUJhIތF.1bA̎Ƚ-huAnCH!W"|%cUq0 4^b_؊=tZb eV%5JCۦG*OFr4>mp=8׼Obq kS&ձ&d:˧ozY C?Zej0+fD@jO.#z:a:V; #[?m؄ ͑ܦyG^1[~?,.lMsgw2>gđznwyEDgdj$[e+JBYhvVY /Sr.|EIp߽7%r@qд+\ ̘/1#]VX%O^7ܥ09G>vŒBeKË)cFsOPK';PKK>)OSGI-OPT/src/java/security/Signature.javaVMoF=Gbl(Z@h[IT ܢ96v%! 0DqDμy YJ+#~| ?ϥP1B|4z1er)Z4&!0ȍQYLT ps1;xJANڭ XbJ;(-?X8 b(ZjKu}gNP@%] 5cOl7vx\hXYw*Gk࿥4xQẌk. 9ͬF:X00Y6L̑mBAрALn?m0`2Ix^Û eT?Mv6T7lLeLTV !E@arNziKz? AT³dW3ČA L W*i^>F;ٵT*e61(xp~q0. BϿ _Sp4xuOqlGjG_`K'xJhhjmEf<Ӥ~sAT<.%. 4cF/ꨌq=Pˆ:4tIk~k7C] sQcTZ\Jg(+ ~*˄❅b4λ/~55ՎlAcۈ~ahAv!g+ mn'\ZEoU:?hTEBgW5PK)} PKK>2OSGI-OPT/src/java/security/SignatureException.javaRn@<dGڜ㦨(5_O=x',OSGI-OPT/src/java/security/SignatureSpi.javaUr0= 5$K'`LӃF\I0{W@Md{oWӪA 2Y+ 4& 8Ln 0&Q-1p|> "@fOO?E ?Pi.8]h؄z7{b-SX5i H\Cc11rV̳:eF6$Vt|tV2ƎTQ'su;'b]1j \XB|6#1[T"3Ҳ^)nڠehVL 6RaG^M ۘz׫YsqSO&z0`<:wxDO_?Kwt$˨'* ڙw< )}r(eB$)ՂkVM 7dtBZ|mؒ9 ZjI:#H8 1#3B/P;J4[W6;]hȅHцhg<ìHYfJWII"fif4{X;Zp 3K>cR)x)@ѰPGLu]Ǒ|Qb:3襜~Wpc=nlR|I/qs۰rŒ< \tPD".8_]oz*伽̣zXjŎ)lo߆_OdRv Rؘu\\ u8EI@-͊e)ۀvsFgiŜ0RHowa|>jmb_PK} W PKK>,OSGI-OPT/src/java/security/SignedObject.javaRMo@<_DE2NatKw-R}73o''BU0A|t6z3 >)8K4C-s`7A2OJܟ`t$ZUÖ ipxaeKԶ5n9s7J-#8#BEo!Mwɤiu}ˉxĚeXF-YWR1G5%N[`XJ^k@i`F:ʹn4\c0 drnimJ푢6&a$&$a2v"S|` uL ^"uGvAtat6hU% EH,ђ0(,kV"jZR"Poqk5d0w2oe,4<e;j*=:i # /%qz%ݿɕL]ޛ^6|cz:>6|,^`gO(Ҫc%=O_'n~B/TDl#k$Y q /:­"R\B22m-~Sa@tx+y̎w݂ PKSOq2PKK>&OSGI-OPT/src/java/security/Signer.javaSr0<_ j\BzBfrè5+8L&'&m۷a!.Lx¤,В?OFAH9;cf$Jv9Y aR ɏ2wNx~Rop(V졍G9ZzTy( iU'Q~Xwf7TZBNt{m>&I4hIy:β{Vu꒜_xX+ZBMPX.Fpfa)yV? F $Ci(ܥ˯%&dL \g2x=đzlp2UpȈ$AHlM(ّ٭rX M n+ Js~ɚڟEpX5C[H_>^q+NHHY B<iN w5dph'p N@GoH8p64k79-7Lۏ?8G;nq2܈˪ufVCeygҢΨ)OSGI-OPT/src/java/security/Timestamp.java}Os0&\`L,f[YR%d]9 ~RzL9ZLJD^Ǘ1aeX:&BDp ڢGȌ(#*0`4 G@-!gI/x M֒w) gBcm8ѶJ֥t(w(΁ YxsafmATy@ZVX 1[rҦgM{f mB + /)+"!f j- ,_>Cobr76TtP !3XҎJ.MU*}@"0hkrZnC_u(> A?A$ˆtDpΕPJkyQkT:@KBC] ;aI&3ŽCO<|Xq9G8K*ye}cF ΃^a )PK  PKK>,OSGI-OPT/src/java/security/URIParameter.javaeA0ͯx4{k9,m`E=0 nl jyqwdds#,IUIr~<׏_cKd<ʜ-%#$y#!~R+Gc `Ї8{q%t̩v =Z+ݮӻxz'|*s8n6qMWl3uVY Ci f\l-( qiO*CX]V6[i 퍑[؄ ɐf|N4 sX,|2,.*]Cq:wҏȈn }A5岐9FR(5Y-nM% ]ח/7)"7<$ y%nL{rt=)nr')m qҥTTBrk_Wvoqf<++xz!TPKLnjPKK>;OSGI-OPT/src/java/security/UnrecoverableEntryException.javaQo0_qT,a}QED`Us ނ){2hҴ<$}=Nr sӜc9SHZ - 86VA"GHe^IҎJ$ 'NN)q0p4iq'h:bS5$5JCC3u>K a^\pAë[!g})IEO[%Ylȋ{6&`W,O=A4L%ŖYkXy;|',R9oնf 861J d"+![]nxHW4_g6[g˜W_SG}話aT!- @ؙ3kH9OSGI-OPT/src/java/security/UnrecoverableKeyException.javaA0ͯx+н{JYF@W{4;j{!@U7<'p;ʃXNʿ*Ula ~atX#{"f`$iG]?ZH 'S|'Ѹgh8MEgEm<G"ЋCiHsVCgp $x< .yBןmXıeR.yexCVW,jwDTR옵-(-7+]N޷R)VFR Q#GY> &OjS^MȱZcZglgR0c]!$^IM( 9<jGµ:,M o5WhD3'; Eu!+t[mIF!O~ z w]_ۋOx!8NΆ( PKUPKK>4OSGI-OPT/src/java/security/UnresolvedPermission.javaSr0=)fd:t: Y8*d$9nY9nIh( `޾}+&Q- yDJGGUmyZ4k,cR"炣XBJ4I8}>B+80A4OF7bPAc4xñv p{kpˮNU ΈPj zݳt~=mqM5[,?{A{օh-C`5 9]F8^2Έq{{wS0HrHI4e:?e2%<=a:4;M4[H+f EFu6)|)Bgal\,Tհ k4:JX?VKK/#J8溭G}B zkfEP@n f.yPdUKiJQUi+Th{7Y_n&@mGphq9z$_'OSGI-OPT/src/java/security/acl/Acl.javaRn@=TI{J& `Q9URYO]ǍάcT)rۻ7ovt Lt5fG(H(?O7o#-Ѣ`2'"bЀ[#DN%,CzQop)RlAiE +*AbH]VܺX8 .x:pY;W E8&;]œiN_Fh-V᎗[b^ р6 r|wr!Xr0i2вvOB[?plBA/J!N{>JtInŧn,OSGI-OPT/src/java/security/acl/AclEntry.javaQo0ǟOq *X߶N2ʶhU]G9µlM;CJP'5Iw,3zkZyR$D蟏8lk:`L v9 #%-IrkjDP ZAvM.1`d :+4"!݋ʆ Bn ]hH5nۣ.ݾ(e4\+Q&>PONvwP×o-~ƙ(=@?זZ(crV樾nhw~՗㉼橽'WqG}Xo7 7PK!<PKK>8OSGI-OPT/src/java/security/acl/AclNotFoundException.javamAo0 x))2;mKXqGEfmIrxXǏOʮ\anɩf0,/ y*%a|=}׏4c3=VNY!+ISNv ɿ!2wr^tqL &JL8Ak(j td4{;*}HAltw׉a>,>gԸ&k/>/拲ZgA=7'TRl=hq,H;nfz(6]xcFu&4Fys^4<ˇ5*/Ţr-Ų ߊv b˸0v^n yKRmtӉИ9+3`eZWA?sFY?q'ٱAT&݆l-M38~HRҿ xA$PK{tPKK>)OSGI-OPT/src/java/security/acl/Group.javan@)F9%UCoP2i(┪ǵ=vew7B;A)Ql?,3X*}0TL+iHazX_B iaː5(- BE12h,) >a2& /qPR9,YAPVh=gT$p?j N\T&p#ӯP ġ2usmt,WizcխlZ0# 3k#zPDmcNyސ#Y ):CyG?M`ۄIAM]%܋%-śMnU ,eM)C$e0&y;[ BHVcA<;Q#jFDѴdZ-^p_sFQ_Ţc(@w9[ɮ94=_ifv(KG'C -<˕j]eymf0 ~W}b5Jv-aoGANOlǧu?PK fPKK>6OSGI-OPT/src/java/security/acl/LastOwnerException.javaeAo0 x))R;mMX`qGEfmIr/xX C"IU+M{yE]!m%$ofSecBÊU1+UtE~GH[!7DE)q0 !4'h9b U Z!;zw>J Ӡa6^pw۷~>;ۯI},ıu\r]拼\\3PrvěDTRl=-q̛@[啮pf{a)Ty6g?Fm&4Fi.-rDatJu(Q0/l9!͟3 бaT-$z5$גT[%y4]w&@VDh  2+/\QE [DHvl)nVB6 d^=]JQ?}?'x (zPKfOPKK>5OSGI-OPT/src/java/security/acl/NotOwnerException.javaeAo0 x))2;mKXaqGEfmIr/xX C"IU+,M;XU=r6Z׋ŧ9x<1!aM쑪ȝUtE~OH[!7FE)q/0 14t8xtXC9TCCiHshG^ϨH8j.u"K}3qll4\eU^>2Xurve*)ڈBԖ8MJs8d*Uο1#:mDVN5-rD͏~tNM*Q,l9!3o ЩaT-$z3$גT;%y4]w&HVDh  2:(/\QE [EHvl Dme+!Eɮ <:yҕT)0VgDQPKb(\@PKK>)OSGI-OPT/src/java/security/acl/Owner.javaAs0Wdg(8>QmzcdrbjJē I4rAz'/G#)A^|`#LaeN hXEEւXA'+4vfc%[4V( Wa2&8R9,P8jBW{=9'QCQ; =\;8>bqL^*+Vzu#[ !&*JbmYk R)OlBv=3e*aeBH֟7PlL$) -&))""wk~dIm* 2ϮmguH|; L<"g:!Y\Ԃ5tAh$Gj 2 ܰʗ `YtoJRshjF4wR-R FH.4k<T/gdTo_Drjir-:̾R-DaƣwPKPKK>.OSGI-OPT/src/java/security/acl/Permission.javaeAs0WθDeqQ V%* O+6Ʉ o\FtGTP_ҶUBKjx??ⰍutX#{m AVIҎ,vBgSF*^`&ch2Gc/ƣwʡV-$uJC}7 NuF@QT^pꗉ~>=;ﻏI2 C,NıMҞs]r-Wyz;ݒsW;SIQ1k+ X7z+La)lVUe?Fne&4&iSZf(OSGI-OPT/src/java/security/cert/CRL.javae_o0şOqSX`}xhE@J>:۳RTyp=~L cN5T~(mj6<_YF%yrdMn$iNo!ye4( G>gMi^N[}ŋI9?F? 2O『$j `Eyu&Fz*TYI1AxK>[E eCa}F9 ݵ/1-qʗt0I/1%141OSGI-OPT/src/java/security/cert/CRLException.javaRr0<_ 2!92ffrè5+&q& ]i| S],|Ev/W*' o&~EKX%"bO29)KUZ+!R+D =`З[Oq vK!-6"!A*zWZݜ+SϡN0\pCͻ9o\qI5r#sFR(vNZ;sቾ, tr265g,qϺTa'EFTY?zsxke= 3oǫm0roT=_PK a!PKK>0OSGI-OPT/src/java/security/cert/CRLSelector.javaeMo@W|#ڜ㶨H4qY)&VY3\Gp kcONu{\@Q}SZ"oVKEPJ%ztGlbV"[%Q{l` :=BjϔYOt^ 7 `6f q2 !<Ъ%ZAFEI%aj\.}]&'dXc㺤d7yS׽{p{P7O ,SIQ3k/F0Dsd)-F04ʓS@oLȫ.`ۄYZAVKZe2}4Y~dx>[6`L"ToZsAjt73Gt7|VπMAs^aPE $"(6Ktt١f/6B uGI&_OƳ~!;6G H<­%PKd$PKK>-OSGI-OPT/src/java/security/cert/CertPath.javaTMo1=gňDt!DFPQT`[ˆFMGREU9~͛1A`|I)n c{1Z4KLCb$BR4Q87m 4BU+]@iEfB"܁P"ͫ:5W75:FpF 9Em 0W>swNY!de R]g])ւ_0t,'UMId%h,3HwN{եN V\ zTXgĴp;=hַdSЈ|8i{xyt5h}e4qhl`RrroBװlle6+w"Lh:dn>8i=a)i4#Zrdtd!zdAS+UHكupMV ^ҶpRdB_sx6 מtN1kE N O^ sڜ<C)8Y~=欃PK PKK>4OSGI-OPT/src/java/security/cert/CertPathBuilder.javaTQo0~^~ʼn'X}REBE>sI;RT )imR`ΗI'0ֈpDR 8Bl<>~~>- BB WJЀ+qz5!|CcVpzM78[]mAiE2!c@(z]6j]3C/tFJZelj\CzΕGCcj>׎4IusFI !-Xq$ՠ Ŝk#P\ zΈe垙đ'mLA/J!N{pq: f|%xlYr/YBO%w5N.dxDSx;]L)'i*X EDַb-s|Q?FLoKtH&I]eJsxwlDP?qDČ/m#*cƊMtZ /yCNW[{EQdY P8>ZA PK^YЌPKK>=OSGI-OPT/src/java/security/cert/CertPathBuilderException.javaOo@xkڜBS0ibuwg8JhUUU9͛8D#ˍðaH$U%*Ë<?"WZɒ*bʂ"!$(τFJp1>5]zA7؊vh,1CZeE}AT(m9=+CK'\pCͧB׋~qܶm$:ő6e\km|NY>}Ϫ;U07^ jVU%kD m JCsګntR!^V򘕴eNL{ȫ-`ۄ ɑ\%yr.>O$[9&:]Odf!-9߀eJoHX$[S!ײTوP&_e+V:o{Aq?<؉RѰA .Y(*'*檑CB!EFTy~- ?#< &z+= 3{H9wI xPKhFhPKK>:OSGI-OPT/src/java/security/cert/CertPathBuilderResult.javaeRr0=8DeqQ+Œ*-&N+O @Ur%,=8n rEUAuJh0^,>́ߟgq(: =ѣc3C yPz]"VH;s+:^4&dv(86GP!DK4HAgd Jy0 >`yռQ/I2 C,cڤ;a}-WybGݡw; ,b8C#TNihM<9U.F mZf<j]p2U4E(IhI(U$[m/ZivN0V@ө"A_QE@""({Kttپ,96B?mo{1߼#6Akeg4g'_.2N]|l[@tؿQPKY+$PKK>7OSGI-OPT/src/java/security/cert/CertPathBuilderSpi.javaRn0-0_`2]|>d;|gCD&svс1Χ[DB>I5+JQ=;#PiՋuN ǣ7QHο"OSY5!UyR7+TEu"k ۋFWYɻ8!Nlo'e7UR>tMvicOn<ζ՜*췻S%(;ϓ$PK/Ř PKK>7OSGI-OPT/src/java/security/cert/CertPathParameters.javaeMo@W|# nnmNq["$qY)&VY3^Dp+cNu;\@Y}WZ"/O1" a؄J$DnDA7v?S&{t^ `6f q4!<Ъ%ZAFE=J I$\pSMЧgGd88'uiMZ#SO]wGA9>L%Eͬ8CΑ ԣSt7-ai'ޘG] ׬ʫ8<&+rηyYd#̋-{ٺ0c`yP!Ah[UG :i,a ӫ"AлEiϿГ8ģؠc"Udd]+x+ 'QƟV^e@?QPKslLPKK>6OSGI-OPT/src/java/security/cert/CertPathValidator.javaUQo0~^~ʼn'X}QEBEh>sI;RTҊ4my w}g+N`˵y{0ILqpx 6L})Z4+\A.GeqZW D%j#}AcVp:m;k]AiE2!c@(zYjኦO]Q:Vv"0גn¹`Puơ6@nr2tXUJ`g% )Ċ9qm)g]`ujf,uF+ʴg$};lc :Q qځOQ}rϾNgpMQ2)L0$,$ QrHQ/W@4s3EH_Q-Lp^QJ4KaX-\x)1lA@>@يyECƝe5'/KFGu\qäX0Gwe/G Ra+ S zaJs }փxa ~f.&b%]eJsx).~3VI7[x g 5VT@w{HG3;pN+^7wj0Ё%]ȃʸb-ч%jxR˱~ xPK~m-PKK>?OSGI-OPT/src/java/security/cert/CertPathValidatorException.javaRMs0=׿bd\S%44c2$[\I0{W4~L`[Oo߾ƒ jyQZg"!8B4^@ﷃahPo0 j["De|Gm0 w^ ƎbjXHe6H fXY2:i e[cqJPKBE)DOim. X8Pk›x2MkRݺ_kXE2$54B#r-Fl4:g5RIE)iGi!^|-!ϣdOSa2KEɕHQVu@20EH$A0+QkYP jIAz͍!|-m臾\/3۰`VA Cm^U/K# 2[3sfen^p\DDڝOޫל<Vu) 0=><VMPoOFb[oDU{JhT4ZKcpӞmOqC{7PKՄ/PKK><OSGI-OPT/src/java/security/cert/CertPathValidatorResult.javaen0 S9%ggm=yi+!N[(˴Α4{Q2DR>Tz=:re]AJh0\.?E° 6IX!(cn2+$L w2.%ClJWAh؋#hC0xd U=>IJ4{;v{&@IpwB4A8&Dץ֧7j]TL==z qe*)jfƁrL"iiL<9UƴMhe fU^A>(opm6YXu˂w +g^\ǀl߃OօS;S BkHޢTܚ!tNsG`c ^ :.J}A$";%FZ^qݝU#8~{COnY$%h9OSGI-OPT/src/java/security/cert/CertPathValidatorSpi.java}Sr0=Pprk}2$"֠$* O&ޕM=I1i߾} \\{#XL`}ԵD%We46=š,3x)HY*SpAҢP ឌZU4h2{A{PAg9 IP@*iitas Gnhy} tS9~#<()M:_,GV=tݩC;iqlY؃6!9UF:޺ yBZgd޹7_86T0J2H|I4 =CC^'M`jynՒW_!Y>tyqd x8aNFjJhإNءo`Co^N8{OKv~ZRUsZ.zv > ^PK<PKK>1OSGI-OPT/src/java/security/cert/CertSelector.javaeMo@W|# nnmNq[$4qY)&VY*3^Fp +cNu;\@Y}WZ"̯1" a؄J$DDA7v?S&_2%ClJAh؋#hC0xd U=>KJ4{;v9J I$\pSMЧgGd88'ui]ZSO]GA9޸>L%Eͬ8CΑ ԣSt7-ai'ޙW[ MVUD~ f|]AUYۼ, ~m Ȗ|.l*yE!-J*ɫnBg4o^p ӫ"AЇ 4AIDQl1:C^m|+Wأ$ uϝ(YFkdM IpnM/QPKp$PKK>.OSGI-OPT/src/java/security/cert/CertStore.java͔Qo0ǟǧ8 {:u(ۢ!3!EUеC@WgK#ҙo0* R0gi i}-NR"}QY@&hŒqz+- ,@˥zK,usICX w3BD+)U< ܖz3Jh4 Jo\."`+@-ױݏA{Keֵh- C2lL 9 #Pi 2a=2mHmLA=L J9LEnѷn80ppF_ hp$hˌ0s!A|0k$!S4,EH C3VK/#\8VSuڵ d X9 8w^1y \2BTAɌvȽơB]L2 f:}^F墯-Ho*s+_1訡}&}* tM|D;T[)/ EGo[YXO+zI]TkmP{=ˍKyUN7ϒ}^l-xBd8eteOpƫEkT5A3?՘GԂI1 eijPKv PKK>7OSGI-OPT/src/java/security/cert/CertStoreException.javaRAn0m! mk>quGTq}&ͳ|US&kaw+ ;^ VU5kEm *CsګtRU!޸N4uNB{860Jr_ < C[(`{a9⵼;Bx2")PK: PKK>8OSGI-OPT/src/java/security/cert/CertStoreParameters.javaen@)F>ّ nnmN-j8r\owU;kS5Q9vfo! 2cON{\AYVZ",7wkUPJztGlcV"wJ¨[t@{ ɟ92 ,CbN-V7AdF8hC0zd S>KJ4;M>J Y4$\˧e!Ϟ~Hibq&R듻<-SϷރßrl]1UE_!t-J)ɣ~=Bo4OAVπmAs迹B$AIEQl)&c^m5߄u/+_ћyBI Cv(PKs\SePKK>1OSGI-OPT/src/java/security/cert/CertStoreSpi.javaMs0jhn v\BSOؤy1jJ2 \J>yC>Yg06r+z0ϯ$$JIԂ{>o{qpC2dnY!L Zd Huh8 6鍂԰hvJ*TyT-Z#z_U $pjGNGP:M-[{_] Mĸ'-t)_PKG9)5PKK>0OSGI-OPT/src/java/security/cert/Certificate.javaTr0=_ 2!\B[O2L!/F\I6q3{WI @Yo߾}0PyEǟY&^~ c8 %&18+QL j 0g~6BI8zvVsE X P$a`.2|[Z捴:O]áfQ@N6mDןnwZV(v tpߑ&Ffh hYM*`9lFZ3*z2]1&j1+iOm$8}GrMopN&h cO`0]Dh<'Gwp.|@C]$S8;7]qG\m$ Nɴ`)BJԒ*RVCG֏rG>pDdA^AUQ۾3،giН,֢qư&*Q _u \+9g2-D[L:Y&d4X:kx MKhTVbCNiz=?d -AYևw[ij8?K2\׷Xlχv%p.$`O?Uw``6AOSGI-OPT/src/java/security/cert/CertificateEncodingException.javaQo0ɯ8S;)t"Vj:=mjH`;ͪi4V r}s=pV[aPHJ - ë2ߌP2(H JvTY-!O3YU20`t`'ƣq Q%JC][kv}zJpa^\6BߛmDtcquԺm6kv9KeyfWRk%Z QZ5o*tÙo)VڋGT A#xY}[>].*X,1]oU{|71#>X0T!)"':1GK&6JhlDI(͞P)ձ"`*S^\88EEH6!duT7klqʥ[xii 9.CHI7tS ; ;m:|V^b,ִC1^=GwPKOPKK>9OSGI-OPT/src/java/security/cert/CertificateException.javaRAn0m! mk>quGTq}&ͳ|US&kag+ ;^ VU5kEm *CsګtRU!޸N4uNB{860Jr@OSGI-OPT/src/java/security/cert/CertificateExpiredException.javaQo0_qT,a}QED>۳{RhӴ<$}=Nr smNV;q9*6$gS$XÊU1;;YrTUY!5p2Njxq&Xt8Ai{Hlt,xHR̀I .xrW۷B?@{)IEOk['Y뒻lȋ{UCVZxs0LU 6%>:PwVz)NX 6tM/B{e 860J d"+![[ޯVi+̗mΖ9 =o 0cQ] l*V<[Qj} x"{µ:M# o1WhD+;*[dMd g8[xZM{ ?'UeOxI!4Ά(zPKdg^PKK>7OSGI-OPT/src/java/security/cert/CertificateFactory.java͕Qo0ǟOq *h߶V[4h۳RT %jױ|wq h+0":/Zi*գfz3 Z4sE8Lр"4S;+ UP)*c/PrY$ aa"R \t 7])T< \j3ڠd+scyȖġ2I#]F7jwzq=Q.eւ_0hLg#bMYK ҚS:7 ˙A/31ܣ)M*Pi܊EZA7:1΢aѿsh[;R(h3 L˹:E!L jb"8&%h43aZ{T̄cnij,3*"hqxM&9:OSGI-OPT/src/java/security/cert/CertificateFactorySpi.javaŔMo@q[C%$¤Qz0ۚE5NQ[Ǻs^-4y Ʌ(yZ7GZE4$/2 @4=m %(B4jWkUA*E"GځRhp*OIP3(N,ːUġ2Y'0F#Q_] a&*fĚ$S4 +A/ 댘I6&%' %q"Wr Wd Y<#z;ht YZFyF_a !A|0W$T !djFRE,cz\,c2'V, j:h\/Ōz lF3X9YY'Zml-CЃ˼a2x 鐥Y R.qVt[TQݡ4Zۑp"*ϑ42%x@}gtĞ%KMȠ+YyT{#8$\2jt[=w3UzڳMYyܩ<;oBoYc)s|D~ \W=]PKfTPKK>DOSGI-OPT/src/java/security/cert/CertificateNotYetValidException.javaQo0ɯ8S; S*5ݦ>mjH`;ͪi4N A>>N"\anUc,'XҺVBKz6{7'qX*(V!)IQVdd2  [M8q6#P;UIR494Z3l4<] !{Iu],z*ZeE^,2p^,h厷'2k-: QY=ougW™`S*ڶUhK&4FicZd4@OSGI-OPT/src/java/security/cert/CertificateParsingException.javaRn@=_ "&9V#0ibf[1(ʿg8 UU>3o޼y;E Lt}08 'P9ax5_(a,5]{n(Xbi9R!ۺJ,^ zr jO}qܶm$:ő6e\6M'Y6}˪;U0'^ jVkD m JCsګntR!^V4UL{ȣ60H2,BOr.?OdL L泛tg|d/&e܇L<"23 k}dkZ<*QJ#x"dg,4J'\e.('.v"7l!ɸnV%J |oQGw :O+h؛ePNևx /7FVq(^=3PKuKp]PKK>BOSGI-OPT/src/java/security/cert/CollectionCertStoreParameters.javaQo0ɯ8S; @1躷kiVM\A[لC"~N`bS&/_20? ﷃ4ncsvJ!JBmV6??ye N1Qz['f(T(iUgQa( n:]rO3>wQ4h֕#}e>uWue4yGjxbWR,٫ (YuTPuhY)Z(?yMyçȋa\狯<.9&ygS^}F6|z>qd܇*'`*yEDG`W$ZI͔( ݑ3<*r[z6*n=+6% 3nNdSI.%U,!`5a‰-Z%sRR}OqۻJ?`'/P+9-+yLkm(ZxIq%CPK ž` PKK><OSGI-OPT/src/java/security/cert/LDAPCertStoreParameters.javaOs0jZN.Sd0i&G!Ԗ\id]%%Ho~$GW\TA_`}RZ"oF! ðJKth ̕Dpޠ!ĕfSFM8`-R@!{([U Ċ@i:FѮ]s$y5 .k{.At{툪Q4M(Z<*NZ͓,fo:rX3k!0Dnx*R:3[jEoQZ"czqIփqdCor>/Vp/qJf,0Yd,Rq_t:x|1󴋐!@ؚPܚk#fVsGP-pm U*]s^eBAU9K`4pF⭰DcrcOGZssgp|aO퐏?\~Gę-E]*Qtk,F .lS|?PK;*PKK>:OSGI-OPT/src/java/security/cert/PKIXBuilderParameters.javaAS0)N i&LJ9*VH0́C>#=|[zTYe Tk%DFG8 amH JX@c t@BZ ɏngye '#A' %h<2CyX)ke@uYkU9%8a$X.@ͫS!Lﮊ0mĺrZ?Ɠi>yǮSWFw'^nAJ%{բ@ylp:EʔvEp0Բg=xO\0Ksy:[|]-:"0x6=lʫϐNo< 2 ئ u",ޒQ͔(JAg8ʇ`0Z ڽ+W4"Wx M$::f]Ԃ-^g?Ns)X#OMO'ʻM;H?'6'6cQ,bNlKf6B"եu~9\KG ]6t#}<`kOub0 k¿?:!(KA~R X(XU:PKhZ0PKK>>OSGI-OPT/src/java/security/cert/PKIXCertPathBuilderResult.java}Os03!!$cL(Ũ5?8L{Wतu>yt LTjQn, yax6F@ߟ+ ,Рa7,P $5U"Empa4ϽElY RYpCX 8u\< wje5>25M=qt9Z3N',~$FVh h턦W-8[kPXjVyF +dQk0ަjrUhόbcIi>$Oțܥﳛ%%E-iLfeLg=}$4)2qnrWku@25rVc%Bv%m50Z ަ[a4 7v,6=j,WW ϙ\8QyEYU`V=qvz >tPo 1oR;c74N{EsEL5gj{+l}Sѵ  ]UE'; C=<'x (J!jN˽ yOAPKߣ;PKK>8OSGI-OPT/src/java/security/cert/PKIXCertPathChecker.javaOS0aR'p+t5$LeyI w ={l[yxdlWbއYC@*`#G0nJH! aЂ_!qzWp (A z^$5ۂ!,D{ƃPZW]J .=rF -_{Zyoöm'CuSVb^IwIl:+oKvN,*Pcx|ꅲ@^hі{Va# K% Ag'QNߥF|1PK@uPKK>@OSGI-OPT/src/java/security/cert/PKIXCertPathValidatorResult.javaAs0jHn-'Cf0I[\Id]tZY]xpSU6Zd>@|`#!w˰tJK4wLnGi0JA8}!ܡ6BIw^LE*زP$a`# |XZږZ-l\ k}QqКM8E=Qwneƀ4Vgkb-X J4ҞU Fg cXW$FX@1 0 3W_eYqt83zHQ|*0!A3OSGI-OPT/src/java/security/cert/PKIXParameters.javaUێ0}._1 V4}kZ)ei(a{y4ɐ5vj;h8d)pi+ sΜ95ʖ'FԄA/g2Bh\v:/Z@ϗMϽ40BzG G( Ɛ5XDN >6\I:pr޼rKÌ-A* A\ C.!R6-,N |-92 gh5 fK/6{n/ =XŚ]sR]@c@㏜kxMH` PXr[.5 X'2I#@1 u? ? –#80Awп Omпie2* ٹ"nI$aħ'n|\9ȔO)~{ϣ9}L#=㸢 ڊB(訿lʾO[ە0ӁpZ? ?C1`oPUwqqoM[YPK\j PKK>/OSGI-OPT/src/java/security/cert/PolicyNode.javaRn@=_1)z@& `Q9%N[^ͮ]DZάcDf͛7o&f6G)0N_OoCGZXE"$Or+8*4@n׌24Vh0Fמ lYJ;h,P {m=Hk};FpF5E)DsUm^qMFlfWzWahV*r*Y қ^ukեkAOS̴iS l,&1YZޯ1^t,2X`L:Y}8}I:eLD_َyCu!G㮃K͡)-NSܥ@%2L67h"/Pm, 19צO3t7}3ZzŞ정_}}-]z/ ?DGDÉZ| Aicr%! ;'əA PK*2 PKK>8OSGI-OPT/src/java/security/cert/PolicyQualifierInfo.javaAs0W)'96NqJpP#p$#q=wVaZZlK'M"ԝUc(GXfRBK|:}5_ⰍUtX#z<n:O_a/tĝiݩ2qoR8PЗZ,j親f8/q^>I%8D/PK PKK>0OSGI-OPT/src/java/security/cert/TrustAnchor.javaQo0_q *H}QEBEjڃ1G̾}4[N}w$8E r(ϕ? !w0sfhlq3A.Dmq ^Z#Dӝ # #? uGC4Eр.*PV*GĒ@iŦjENGq&p1 Pj4ugMT }ɂ!xle]+eEd+)욋 "3gT8(R:-VT TZT7ЋR8:M<0M4E<0xxD-\GupWk*7·[qOaU<(Z)ɭBVlhJ4eݵZ\:L6[ s@_Vej|μZ,A禲if;Uwd"Xi+L8|]`Ny^4hwpGN1q]G3#OTw'aKU?WJ3ㅥ2qwT 3?@q 0@-yN1c~N_^#cۛ¥=PKWxQ.PKK>,OSGI-OPT/src/java/security/cert/X509CRL.javaUn0}_q'XuDmQP`Kؙ@hCmOs98C_eB`~K$GhvmahP/0 `P#2U3j#C MثZ'P9,Co9fҬv^S8%p]qegTh f+36{,K=Nšι5.eƀxZHgSҚ%( ,HkV9K-q%h"anK#YPlL^/?܃^mGrO>.'p{0C ? hz5 H>xid !Dܒ0S+I&C.f5,F$GNqjH`h l9ėۨhP7;[0 )I#˧%)gOir=IEJ-;?G2te5^eZY.fdpB-yNia7%WFDeZ-wiMMBNmW\\d,q19Alvg{Gݮ3ܭޚ&w6ײGvʭH:,ѦwՅcB`ԧ5^J?/-> %sM珲Ѿ}\Kn {Wo\m(^,}&ڒ?X w4KlA%Eqй1OSGI-OPT/src/java/security/cert/X509CRLEntry.javauAo@W8AD C!AeQz=ۚ]ww&J7=lg0UkU^'aY*%|6{7b_ FvYV j*JHo& SFy0/W#ZSN AVxX( ^ZzIIp AP/DՇi@tciyuh\%˷%:ʲQ*)RZ[;2^uc)O-5¢dʑUiMOB?.؄a@ 2Ld!faML`b6zO!\hu5x*L4OSGI-OPT/src/java/security/cert/X509CRLSelector.javaT]o@|.bDԸRrmPa4ps}ޝ1(q )vfg=heT<hEm9xiʙZvkJ cԨ;`IyBc Q!x9Rt*ͥCDž-hKvR,e[ 5Lys\@$Vr3Y9dh34]/fjofL-abGju5Q"EAᯂ+8\IUBҚ(5#RqE-d -M̵Q<,̆i4Rd&zt,ɥ?47{É?`4hxOѐ>7H>ȕdrk*E7$LJ1SQk")X9*AA*ƪI`liRqLQ_vnA>Xk6gƨ Ny$~?rSL34zmUʹj-\XZZv 3sGUq0gʭv Yc]sJZLɲnK gca4<9+V.(4 4m#6<;Y{0YM`'<ۯej#m7ub /"6q:4/BrJ"}$ZO9,۞9tBo5 A>)nݫEG[<]PK@ 6PKK>5OSGI-OPT/src/java/security/cert/X509CertSelector.javaVےF}_ѵO*?8唖%BW*Ԉq23R.{z$"xXV3o+@3;Wyұ0;5 QcCH)7-Js;Mxuqye!V2[A,  kp<@ΒڂivNbC z7335&^,;REm;u rEWb1qlR;#-Q ShaBm͑R/o.\<n\[7c0/pG^χ7}z Wo[T2:Mn˙w| S |J-R!Dr* A5ڶU>㆙l /{PѠ:k9s4)hU#ITK#|ҲS$`ggO>JؼK {f#g3lN+?Ʀʙ^RRJ. \:ޠ AWi~:FɸP+s|gyJ[j -c̺Ф*8QqS3p$&S+0̓.( FC:Wvu̠+=:<K ag&xX/Gsя4H,r-,B>>N{u ~\CljOv-Rp jv8M+"5;ج̵vsRf+ bSa܁?=w##FC=XqS/pvH*mݣ*X+:r!C umUo/c*GDla/2ڳdz(UruΎ2G@@ ihPKN`OPKK>4OSGI-OPT/src/java/security/cert/X509Certificate.javaVێ6}bOvn</m,&]}̄&^|APV|ul:sx!ޓo]33(/e>Q_iQxˤ(hor ׏oq~}je_s{;!Q0mL(݀Y$Z%wtN^Ug[`voT+tިz4 *ZJ_IU-&֣Cc)[%M<%|CpQ1y2J ZKd{%>zLFwhaejNfxAY NAd҅%LÒn5&S̿Q*"QƲ ƒɩwpC)oHsĹsM? tC76N^nűo}w6B[?PKUY PKK>2OSGI-OPT/src/java/security/cert/X509Extension.javaRM0=o~ŨvMJEH-J!;I mliӰe%D͛78ҝO ? Z0Ɨ٫)y5 5< -nCb$7Fnр!Ěq )ܢBI g0ѐM=EسrX$a59jBW{=Hk}U8FpF)D9&ڶ Y8TF7| R=Tmdւ04qӤ֬eU)Wᄬ`UZfluF{f4S$|<ɧ.Y6kW8]'̳t,|N,>xO@2EI(IE)8&U:4h4{aZ- zZcz1o}cZ ԅtSdCS2ZܿY_8Q9}䥅9%wP{9daΊᗯeuyWGTtTFގٍJ_=WPKmx PKIG@&OSGI-OPT/src/java/security/interfaces/PKPKK>1OSGI-OPT/src/java/security/interfaces/DSAKey.javauQo0ɯ8S; Ѧ5&5f h"Il{cWf9xLgmPaz=$LcrdOO!Ɋ=:'  dFTWb|#VNd\nŠ;=:G!j"!*}4#Z/H8z,\`xTB7ҴDmh]z/VEzcսj9XIT1k+zh X5uot{a)V:*?K&&YcVeLf|Ubb],m.x YۼX 'cC)CSDI $g5t!4DVqG0d҅cu 6>OSGI-OPT/src/java/security/interfaces/DSAKeyPairGenerator.java}As0Wdg(89QMdpfr\`jA0!lډ'r$=IRݨE0/nDM#P~XnR4!}2`gr' JeI ϴWF( WN0fkg1ZA* !*sA!Pm7 u&GO-yCǣNgom1 aH(]Ik»xI{v=ȆM?z|옪Y@iZY-FUv@MΦj,?kdžfQq6OQg3yw_;x4Jv&m mw6g'đqz1t!Td:*D% nM=:t[aܱ,M#Za 9wF@HK‚̵9' `E4ޣ7$Ie޻%8_l yP/}ȕjCJUW|X .`{ؚ/PKdylPKK>4OSGI-OPT/src/java/security/interfaces/DSAParams.java}As0W);=I(:NS:=*ؒ丙Ubvi~"rUq#6$/gwS$XÚbv&$hN %_:.A0JU88Bi{HJ6z*xHRf@ߟ .zr B?@C}qm4gKn2/oz8ur~t#aRl=-q@[饪plvy+oFc @VpY1 &~tNM,Zc&[4,_LA'c)C[DA g$g,y4Uw&@VD0d[µ:F k("{0&"vTv1ʓDI*2ݖş-,NX:8OSGI-OPT/src/java/security/interfaces/DSAPrivateKey.javauAs0);2ܤPO;'{,8*1PxZvmm@2N&gIzUwֲBc@㷆4;@Ԭ*ZQj=V%Y`Ta[ar2VӦB?-؄^B*JwxuX>Z.d_XlUHxndrdkLrqnRg udj̨ɲ%B%;VshGV?\8EE`0k8C@Ң.Df͆K0O-؂E 9wQ=*vODսu7OSGI-OPT/src/java/security/interfaces/DSAPublicKey.javauQo0ǟOq ,[ա=LVh%vHi}gȪvwg\DUbo `~"˒pxo UXA}] N2wPj{_QR`}WRIhA* A 9ae$dPuh OH`i\.xCūe!A0l&'@",ϵ&|H&y:{ݮ,&͎-2eR44B#rԍ&K6Bّ}5?leMH)$i4I}'>/+xxJf),0Y̧*Yyq|sy>EH_!d*(ɢB%; ;VÀ;'Sҁ?\xߝ7qI:W[(<`_N{lفE3X .9IQqP'$)|ht6z7E77(r]wT$ܤ`Mo/ PK+`PKK>0OSGI-OPT/src/java/security/interfaces/ECKey.javaeAs0W);=4S:=*8*1L3`Vo}rv KcCTΰ>+mbn~MTzlȓ{}^IҞ[!3WF:]`qk2p 7OSGI-OPT/src/java/security/interfaces/ECPrivateKey.javauAs0bиLƓ t040k\It߻MکHzzsaFSM{H>DEAB`pÞahPp볃3y-Tr!*EʿvQRNi:hT{рT*A2*9IHվljcőS6V\gK!B Gb_<(NZ<ē<]0u{j- 44~HsMdTl5( "{V9Z%Bْ6}մ_&$tQ'}guF_Aӊ$-Lh^Ym{ fO=6ܚ&wVH#愊3&QuO=\ Go«zG{g*{aw-19n6y?PK̛ aPKK>6OSGI-OPT/src/java/security/interfaces/ECPublicKey.javauRMo@=ǿb "&Q(ZL(mͮƱ΂Ta7ځkɲQ<&=X_9EH~:'=φae+5P:by )T"Ef,_q;*ׇͥ-贩Noj!Y5 J#ap /9CRٟ( <rg3j(閽-fZҧooL؉'UZ?E/nu۵j U\]$V ׂ \!匴k  Zff -LʵQ|W ^8d b|0v-6\[nְ V Z+-yݾ@=}]@sɭWB&ϔt xBD^!GTA}VMS S7̜B貃|!ZIh9+]݄s7d< &p0su9DAfۥ8PKMyz$ePKK>1OSGI-OPT/src/java/security/interfaces/RSAKey.javaeAs0WθDepQŒ*&ޕM;ɔo}"p6c^--H]'6t(ȑ}:f`r'+Rj&  FTNNIp0t4[\Q8J{C:4#sEC*Th&AéH8y,\`xռB 7dXcmۤ;k]r7yySս9XKGT3k'h Z3`]RV{&"D SB1[i!RTmQKv9 wMFV|A8b+|q|u"b4C//(<`ҵ G^X+_6{ Iqjٝb?IdK]N{N zGլkҐGl4E˒F Pfk}t**3Los*>W\y ؞aOt_PKKlPKK>;OSGI-OPT/src/java/security/interfaces/RSAPrivateCrtKey.javaAo@qBJmD&I36Ӛ]wwAU{giUm-}g=8*wvځY ( 2Eh.mw; .}vp&74J.Q]!Ht jCJC ZV3r;UZ@* A M@R.j?qq$x,|m]W׵/ľy8hM&Odzͩ;Y1{E/v JJłY Q rg5Yyl-4:%iQg=2rMHh I $L>> f1g$>@=uM\m]$W+B !S$SbJMrA-9dg5 t6 _+<3*67V\'iQg"E3j%VFXk{;NaQ.?=?'wxf$E1r&)W&Q4]8p2< N gEv~Y+0GPcD(m)Cq-d륟_}EPK%%.'PKK>8OSGI-OPT/src/java/security/interfaces/RSAPrivateKey.javauAs0j6x (lk$W1L+pۤ =)+8JQB%Rkv!%a ZV3q'U^@* A xL@R/ܧQq$h\.@ɳy!@ gb_<(.&xE2ͩ,"͎7'%SbìAiF޳Qך,ɼ Fe̖մ~1 ܆Itc[WqXE1LY }pbȸK0&8/ L]L)e5W"GdGPޓqjpd ړ/(<"7V'iQg"E3jÉ%𓦃x'`Qn_ Y)|IQqQ+~$潮Qm8 ǯߌƣ`PLs;7Gې̏(m_ PKWpPKK>7OSGI-OPT/src/java/security/interfaces/RSAPublicKey.javauQo0ǟ˧8)($Y.@lCɪ>:pof AӾ΄U`~ka)V```|%g"EN G Cl+5ĨQ0H< js@*үϸR `Z@4xN2Xh 7ObIא{èсvB`1{oc'UᗗZ?uo?%j \} "퉵d HPH9#-upA4Lɸ6kjh0IV1~qmuhnMDDOpF+FF}\)0!A| 09Oɚ(jV J#Pת 02%?rLǗm;NӘ4 YzT& !KǖsG2Vswȹ`%hKL%yYٿ]pvz;{3Ngx2ʅsյ92sxRh.$s% 3q~PK=nPKIG@ OSGI-OPT/src/java/security/spec/PKPKK>;OSGI-OPT/src/java/security/spec/AlgorithmParameterSpec.javaeQo0GyJ m}iU0Ao`{ ]'LjU{|wWXks=xDuR0^>.EQCI1;{YrǠdԈSed M&X^=C#;=d5OSGI-OPT/src/java/security/spec/DSAParameterSpec.javaAo@W|# oOvS'iz=Kw+,&UTe޼@xT"/, 鵀,a8/}Q^) Р6 gr#8J[h5!G_;j#I0 `4u{@ y(cmAHપ{Vآ] <jc5t^  kaضm:@<,ZijE.>uu/K44j7{`5Qq!֒4\#լrԭV22f+bؓ06&a8C_CZE:^\luLQ>M@­!EpASn6K%#y2*S*wX_YHd ^& \ѩN}agR1[W")'vL{3˿&#x;^PmٔlsM PK}2PKK>6OSGI-OPT/src/java/security/spec/DSAPrivateKeySpec.javaAo@xkrrV"H1ibYk;k*A⃭y7LbX-}5gFn&:Q82Jw!nh6&x`:p:x:WD\Ǔ9XjcJ7-"!z*HTdʭ!+wFw.&imrs~ h^Y-xHs$r+,].zCLRgՓ9J6Rf1V辏SӥӥO=PKK>5OSGI-OPT/src/java/security/spec/DSAPublicKeySpec.javaAo@x5ڜRLq\`NJ5N4A⃭y7y88/j-E7a]Ii* px?|S,Ȑr#cR6(Ն4"O[i#s?D :mӻpu^"5TnQ i)b*,BgEVIkiS VmF υnŗ*_4~AzԚM8΢Gn]w*%cw)5w! ŚYSQ!&QWZZ>Lb6X-ץ}1'Fn&:A02¨Bb̖4||6 |ƫf+\I#sЮƔn[DDaLAʘ[SI)BI+Lw7.&6[r <{KP.\,'Qp۬SFfI}hc 6L؝)PYJp/Sӥҧq_7u ٫jVPe^_{LcZe:xPKOPU<PKK>,OSGI-OPT/src/java/security/spec/ECField.javaeOo@S%0 :6I{u}\PtKүl;AuBUjP%y˞u33 Swc?FYuئ4&isZd</OSGI-OPT/src/java/security/spec/ECFieldF2m.javaRr0=_ 2ԐZN:4 V\Iơ+NIҾ}ޓFgTW{CA?2@IIB|~76< -f!3xkJQY̠Vp[)\c{@+O5bJ;-2YI"}R5휎+Co`W)Dֹh4M(Zš6HvtOgdUw]7J`WMo *V km@Wr!XF4YghSGOPЋ\FI =mYmZEuJSTQ;4A$ղH* n=s~-5IPR)Xl:'lb/ӶC#'`'xp#w)6"V v4߷ϡ=@׶$nFx_le¬N}_+]YLJCPKAC&8PKK>.OSGI-OPT/src/java/security/spec/ECFieldFp.javamAs0x 2Ԧ`L^Z[V%d]7C&Iv*f>YD\R0L>ϣockdCdFRFdX??XY+\ ` FSqTU;48CZdITJhtNIg['X.ؠyB{/QԶm(:6ET6Kfe:Խ^d- iᎷGT2k)Z0gԭNb [\+ \Zgqo[؄ Ni}C!^&X1[-oMZjxv qzwҏ|H 3Քɝ̸5U4 ⎠Tk RV mZ1􅦁nПrQLqz7?.)Ko:_PK"gPKK>7OSGI-OPT/src/java/security/spec/ECGenParameterSpec.javaeAs0WPpsk}2qQk$* O=+L;o}" pnF{q12HJ UƷ<6V^i"K@ۈɃ,HYڢU[2p{B҈?I_d c/ G[uZCk=NVz)q n\< q ^ !?{/qu]$zH2Z?E/>2P*ě#DT0k%:hQ3=ug auJܴ"<{&FI4kyMOjdtc|ݥt?.qd܇^'`L<"r >#ن VR( ZZަt[WsFqpoq倎o4 vY#.~ #jrdrT4OSGI-OPT/src/java/security/spec/ECParameterSpec.javaAS0xS¸N )I8(G-a]!|-۷߮4"ryFr5IV[E# Bad5wl\8Vǀ`SJy[ Qs~HɆKBn$ &絃n#ӯHo Z퐓gOXSPKM~i6_PKK>,OSGI-OPT/src/java/security/spec/ECPoint.java}As0Wdg(8㴚f cHS:`X0d߻rp&ir-Yg0j`(F%$u-Ë<zE^iaW9x)PY\AVh R+0A_&b[(HB)k|8 4=Z'0w$=qsjhTw=Y;|"~ Ik6=Q]wFkVJoJ%ּmW洧tRU!X]6+iֽZڑڸAp,=+dw'ylC6i^e)!IW! Cc|”~OrW~B YJAT [4Af#Wަ;\A@{~-,IдK%lzrKx O'cmKYʊW>jz `n]ʊ)er3_ óI].))~zAS PK rPKK>5OSGI-OPT/src/java/security/spec/ECPrivateKeySpec.javaAs0WPprk}"2qQk ϊNP0{Ui-DTR0N}$pX9 mNp!72#ehFmI Q-2 '>~6R;h8Mf.,C! v CFTȪZi}!ő~Ȩ6V\m'*ųք7|L=nUA@FjxAL E!rM|f+Gji}jg[lZn{2Fn&FQ82Jw!wvhuH\aLuLx Qr8A<2Cv0t|ED'Ԕɝ̸57"'ՁP.qjpb YJ+l/W(<[D`(kx@] ͼ,ZkR>$ſ{sz> 1oƽv\4OSGI-OPT/src/java/security/spec/ECPublicKeySpec.javaQo0_qTYBQE`"tUMo)ԮH[>^'pF;a>""*' 06^i$KfO|ȭIYڠQ2p;BR?Id WC/GGtJCc3Vz̩v nS<  v 5/s8n6qM'ol3uS%Y Cif\-( Ӟ5IUzZaluFjhόKM( i6$KЇܧ2Y:]9>#?&_ סSqn+>!ٚr9FB(5JZ7>tu[o 9A?^Dt|IP7k%R0l[!ӎ*RFϪ]x-^qx.ˆ.#2OSGI-OPT/src/java/security/spec/EllipticCurve.javaRn@=_ "&diFF¤QT؃֬5΂+6`{v޼yov TNbm%Bepx;! dHo)ʌIî Q-2t_HY)\CץzU 6bUY4CdInjj UJ>XaXT,N]=u5}^%K_djVPMYhjyk\zWygOg{PKf|hyPKK>3OSGI-OPT/src/java/security/spec/EncodedKeySpec.javaeQO0_qԧuI֧ Z)ChڃܦR;s]D=I"4Uc,'X?ҺVBK|62NⰍuP:ɑ=PC0Q.i#$)~uh3`4&`ћ{C{( PS~w3 ^m !}zv7ߒXcc~ֺ&X,gnuMVY!`Zt0g*t53[ KT[U]h/<[&4Fi,{g4e :]nEeVK^]!]:[^NAƆ S8o9;yFr IUGU+*Bed5O^p`SŸ>%Q9 FAĎdqh4,! ^HY f]hiJ*Yu=i?z/|\~A8U8T䇒qXm]q|2B<OSGI-OPT/src/java/security/spec/InvalidKeySpecException.javaQo0_qT,}QED>;ҨuHղids{,,w|ev-W*'/f)ambÉɭIY*Ш ܎"翡2W2Vjphr-:`/:(XbisBJ .8rj^m !vmPġ6eT6M4[gԝZHo:raJ45=ukk!oSH4$Fc 8C)ΒlMjda|^%d37Iz5qd܇k'`L<"2>"ٚr9FR(5Z-ަ{~7s- ԅeP7y%1QQ↺7DTa1&EFTٰ~??'x3*Œ83SnwF#?zPK_\2PKK>BOSGI-OPT/src/java/security/spec/InvalidParameterSpecException.javaQo0ɯS; 2"oԐvV 6ypd;HƞwrKq oZ/gwS$˰J+TMn$VW rhLg0Ѱ5\Eia'&@=j(PSa\" < f,϶/a]Cu]bOWgYb(-StCރrhJY8;نEJԦ Bȭpla (>hr_?/pVy.+/b],K}|/Ey=ȸ0qo+9#yKRmtbMP9%W>^g*4j~鯾b,I8;0$[BWm7%lT),Y!$:ҕ49l0-L O?}L*8$PKOcPKK>,OSGI-OPT/src/java/security/spec/KeySpec.javaeQo0GyJ m}iV Aol^'Lj5{|wWXk3Z<EM":)TM_V"(ҡ$GDɣI9ڣW{BjDͿNjxy̦lq,F(F(;bȎ@5P룙>K w^\ûO$0Lk&Elɫ'n=߽U< ٣tYM' >o("W0)N"vTF7w%6Ɗ+7PKlPKK>6OSGI-OPT/src/java/security/spec/MGF1ParameterSpec.javaMo@q@-|XIMI3m׻E"|=gD;ͳnڃYr!3"tG. -|"8-OQ\A)Wn‚D J@%tP7v*!g;Bi |L%*/iOCqJaeΨ k2mD׿ gb_,\F8xO;)&^*eK*XJ4R*rFYqc5_g4Z |(;}->x]$0dOE4ɺ0~(ie & ܭ $A)0kh2+Y-jIA:=!+8OSGI-OPT/src/java/security/spec/PKCS8EncodedKeySpec.javamQo0ɯ8S2 S:6S1M7I lY4s~xr sFV;0>K$u- tn ^?D?+-d\˜*I#r 7c|%cV8`4\u衴Ck=E)k=8H\nw3xz4+ !}v5'bq$&Ik'|ozU5Y CZixm0U.Z@TiO餪ưt0m iֽ#\ Q!Fdi6&wvdNta|H7jɻK${\ˋ1#>?cJ@( 6R5OSGI-OPT/src/java/security/spec/PSSParameterSpec.javaTr0=_ 2!i/-Ӄ @A39 J2߻ vRlkV/k]lVi F@,*Eh^u:!S+ex Z4k\DE"EeqZB ң +Mh[VKlt 9߀J!,,D BAV Ux5qs"ZwݵrnWUH-X&'5k$Z PxAR>'W 9]WF8^2 a #E qA5f }26M>L43Oz<%d<|OFFF}0>~SxdalXBh%M.?VK^F\8v\Q;hοOŴm"ߨf d;nx aQ'xJbiZcSV] %X/='pүijyzP]_B9Xsim FNI!+_W!.>>s'CZwmzAWufvE5/UK7DKp rj8g@\`APK5X)PKK>;OSGI-OPT/src/java/security/spec/RSAKeyGenParameterSpec.javan@S5$ʥE=8 IDa( f[{]chĻwL `k=3|3v"nu12[:ɃDRо/N_c3-&dɬh2CdJ[Rh"] cV hVju %fH Nt .FnP 9 J>-!\#Ε_{C3z>(~fEd- gR1c\"31um*ꅫ!K댜UdiG8&ZQ8i&J!eh2Fx`-ӢS^H%rXopFfr}pߠ<`?cR9ws9ta@"#0+PG (q.<\ZN PK2E!/-PKK>COSGI-OPT/src/java/security/spec/RSAMultiPrimePrivateCrtKeySpec.java_o0şOq@RE#tU5-ةPVbyHd=8N` @;va}dg"FhS6Ll jT+DK8BQY 9S+|GжZj}lB(4kHxs\@,ymfQ) 93i<.fjճ0&eʱ/Uɶsh\קEZ»+xkJ X4#RqEꁖ)Bsmf/Gq¨gAF܄/)I0G4h -\s">Εlr!Bܳȭ%ch"-X*AAjɵVM%7T[eurmA؊Qɋe q$ W/^+fpn"*I >d]+w^짩튶df4SbT׃&Y5KқfmkHil*P$O[](̃'D7R4@bBGa.Uh %*! ϻ'޳u.o· >g%l"<8PK c6PKK>6OSGI-OPT/src/java/security/spec/RSAOtherPrimeInfo.javaAo@WmQ#Qk}Bdy82C0q"2g>#نrYȜWSe+JBdoL-ަt^s~,-tYдy%1gfdM*4wEmxEWLxtvi:#;JTKrs IrCkȵFAU5}VpcPK[r"PKK>9OSGI-OPT/src/java/security/spec/RSAPrivateCrtKeySpec.javaOo@q‘kChk%2)&r\lkﺻk ;kL([gD;ų~,!sD {׷anQm0`!6OSGI-OPT/src/java/security/spec/RSAPrivateKeySpec.javaOo@S|# NnOq[G4q c-nw*Shw޼[.`.Azka\N`Y|4 gD_M!$ې{ V9x;^0Xj[D>C% )`4F8H-;A6A}PV hœ!זQgk]E'5]:_d#Q]Ac@o5M>SDU56f4\!m*nkg߄HPlL() -Fpiztm$ϓl. X0_f7*]fIivRdt&qn 7yB2 K%&jjZP +o[fAqPοOcQ@4 [SP6"|,⡠zO- ϻsa9sm-שXi*]N]]\5Z438u\4{ PKlsPKK>5OSGI-OPT/src/java/security/spec/RSAPublicKeySpec.javaMo@W|# NnOq[W4q c-nEŤJTwyf,3XJk^-LLӋ<zEr4A}*"orK+pB v(VḡRE4Ldtв 7 >,plՈq.G EB`vcw]87rD=V݊4d[bmXR5RJOinC0rg;TXͷξX#\@kc&Ii1ˤHЛܥ/ %ydtU::J7:$=\UH+>0_@|'$;^hvF@nj6 oev8z5o7,2X:ZPF@-ʆb^$߆0(|]=wӡev]:k"<0=_<x~kzFfWJ -cPKSPKK>7OSGI-OPT/src/java/security/spec/X509EncodedKeySpec.javamQo0ɯ8S2La)tDZMnRCjiM\m<8}=8\7!#OI]KrBx>׋(X{Ś,1;xTU!iDοf/d Q4n=vh-(eM}3u}OCo`ws!ιdu],ı6դ>i&/-SU&kaW+ O!ŖYkA9;#TVM!3rۺaџ 860J2,.|^npr.2֘&]-ywdyty9qd܇'`L<"2>!نrYʜGSU+*BdO^Z oS˽t^Ms~--Ǿ,h-gbr]PqM}w cf0{mn{G߾ 4a[%#ףJԧ>8*rW #v1Z\<oPK*IdPKIG@OSGI-OPT/src/java/sql/PKPKK> OSGI-OPT/src/java/sql/Array.javaMo@W|#ZG㶨iĪ;iR 㝝y1EiWnVmNŒM!ȝQSt2FXK U ˝΃,goJ\Q$%ZV(;#,uUiB+qmOji}j=8 vu]-_,pb0‹`D!> pe沈&Mb'!i)yJUE BlPUTHTkX5fVkniMe  ݲ ]9qdPYUhR4F rf@JJ4!̋gnPs-%(д:05r-wܝLmx]2yim Ӓi}xY_3ښ(9Ӹglz?:dUv$ե%x8.x+`^i~8OPK.>aPKK>/OSGI-OPT/src/java/sql/BatchUpdateException.javaS@=[1E9eYԔڲ< Ī@m$A-]sH&ӯ_&^8pCOR-?8B]@Wn"5P`% "9T\Js)m ,Nf;@8pan :oܤ՜*ۆC. #8V@`]]1n,KU=nVcuw GpT7] ֠/wrR%iX RKRHTpʔL6/ swd@1-? lkInb7lO( u0z{k"9͕u@2>EO$d-IȚH $rJ#QǪI`li2憙j_vPq(篖 0Oe'/ D#aWD"QuAC~;=S[^H S=ڦ_ cWj]?STɲISO}$z'$g5>2ޟ4<}Vρ- k( at(4 ,;7PKṵ93PKK>OSGI-OPT/src/java/sql/Blob.javaOo@qڜLB[(4fl51;kBV>g4Sfce$f=&%De)YeJ3th׸!2CpZZ"DFdiwZy8/[ޅGlt+ *̐rY"c@*ʴjI朖}) .`xVt,P4CmAurTҲt°L5h {J9¢,#+ӊ^plBA'J N:08{]<4]4Ey@4ȑ9hw2s{ $g0ؚ**Q zV#0hWku,p1\I,4}k"0U rX6|R38Ykduv]ars=n~ >"8i֥ce*JȢXA4Jv fka}x¯>]hzJT-;ivϻ&׊jlݿ=󩹿#9ߍ6-JexO7PKLvCPKK>,OSGI-OPT/src/java/sql/CallableStatement.javaXMs6=Wb'J{jI+N#4"! )E0hE>-R@o. :-OMg ΃ 2F#q@Nj)aD%4l#y`% !C*@(t`STHcn_pVtvq!<9YB"0a-CIAm,Sh&cEp:A&t7S*Y,m1ns1D\yȺz#*%5e#/$* cpd*(fLx jI%8U;I[qз'`H g]vi߆O;u{# wpOo;wPL#@L3_E)ݡ09%ЀMXӔL)L31F s&J$j͙"*zvi0k/䙴覕c &KQ1!=E:>b9V4ڨ^nnkW,)UYᙈ #b >+0|S}\>ڜYM0siS}fK%xE4jC:m"kcnGeyDqSi[[KKE3l o[;y"|o:%@ތGJ5Q XzvcH [ *ͽ.U X" NMx˞pSY~ _XE98Qwgg\{C~lxiq&"<`[US'̠#cVpm!WZdlXbl+HzED?ycpPvxF'MDƢz7҈/a;6Tv_4\޳ ŽqՉ;y5w4q+zͳWn-y&ClVD*2OVˌVjYDLUi x.gBt$ނz9ž`]7 {(.>JֽAn$CG}8KRՕcU^q|A|[cWxWxb"'^%'bJǚȝIXfSV2f(Z85F+9sOk +$Ʌvrqf^cpOB}-1?E–]fgJV_"J=U#R F'tMeG'Fm6Bt;bkFJ8|!7Oқqs!xnKF--ޝN^ֽj4 3W@ULz;Z4.=I3nZ;!r+xd=R^)cY},λcZPK)r'PKK>+OSGI-OPT/src/java/sql/ClientInfoStatus.javaeO0SrJVҽ9фh#QNCجmF~3Ͽ7o 4(,҇\ho~ylf^h;œMdr2 <{8S];8+6/h 5Y/يͣ"^̼PKn8I9PKK>OSGI-OPT/src/java/sql/Clob.javaAs0jHzjsr m=29fm5"8L+dҩ%>}p#nփi *K2C^}^a+-Т2dP*Dni]74p]_i:+ت b R9,2,T"CIZjr朖]P\.xQkE79~0:PbPj&' nw8݂Ь*)k-E ʀ( S^umȑ,`UjacdrL{ȭ?-`ۄN@tCICvh6&xt: >B4/Ȗ9es"$$j'j([E% BmH45YeK)iMNf/ ]lDh˫@W);f94xGJgpQdTm͸4ଙ'RW.q t͈v3^:oRua}x|8 #gpRS${xS,xWMV{ ݼUM >ܟL[Oٿw`aF/w_#͙Jf PK8`MPKK>%OSGI-OPT/src/java/sql/Connection.javaWsF~.Ŏpvi: \㦝N$-N; L&{@Gj <i[;/|5Zh&0~ LY m cgi`618OPLa!S`o%xӂ7 W]h:酣X0H `fKH<+\[q{,x[p22gioN?f?t:ժrJ:bck:Qk@]Kƀ XF^%,&_[fUY hRn G:I8" j9`zt=o Ml0SKԒN97.Lsnͷ u ߎ=[ ."R,)JJL kQfgݾp"MdI`B<]8 #t/^?ɤ#yu= {rYmEd a di2SJVF eS6{ZL42z4m/]Y#*u%ۣ=gյ. )_"zpA7PK;PKK>)OSGI-OPT/src/java/sql/DataTruncation.javaw@寘I(ڜhR_# -EyUiS9|o>ypWjQ.-̒Oª(3x4: b4!<`g2IC942' vI֘J8A z]7t[ {hQmAHԪZa9#C-,Sq,ZZ[۶ pO(] '4y]׭t/5Se` [P5u¶X-= 푑W?pl(&%=&Q;y~ݦ08Mf(fS>}pz_đmyx djD!2^M ZԤW¸j0w6X v菽ܠq?\c`Kn d25ZLu# ZyRɷޫ/5 *t~rЩ<x`.j W>Jnl"~Qߕ5FK].7/X5Ȓ>Xz!&RJPK,dPKK>+OSGI-OPT/src/java/sql/DatabaseMetaData.java[Ks8>*'gk;٭lj$'%ǔD$L(@ک)zXA89$Fw @?H[Kɦ3MNd~`$Wg~<&wFR;P !>GCcp1x VJ#|%95/^|o("#s$\h)@Ȅ%@!TI$iڂ}Ob4!b)SiR$TJ?3]\,sj5>rzwԺ@xJ 2&q%)j1ЩN B2(1 *Liƙ^3JGzUF9y I W0 ɗ`q0/VtC2#A A?]VWK@{!f&3̽HB5&"WI ph|)qD$9gʸUI؜iq]==Wߒ'i6F 4 Evc45G5X/͎@O QQ3!5a_$Q'r ֣?W#G'8L2Ģ/,{S/eCq< U%F:wP(#ds~Wnv$vm  tS|Z/8c  C?nnB}:FZ |NL/LMUDc8Pp\?h,;0i֜N spEk5EB* )4SFJAIp[$)z_l`&N rKrNu[n) K?A.) ټd0g$SXrٔHRh0e)oF/~z:Ft [-*l{F"F/ˆ@e4+/3}X(5SXOc!~ץR-L;47KXT}]":]| :"]isX)KLKv}s c3k.b*r"_`FC+utChkxjD;uCLkS5J1vУ|^LAV:<F3ݏ_~Sq b_Q32+~zc 5lc$bBJ%B:za7[y_7aN9{z+OQݳc`~WV'oKxw?~Gcf%_:߄,6,bx )bgӹÚ@T{DyUYq% + Şm` 痭>Q&HZRcSE_pH^>rNڏL`7fw0VôYf=+Lݺ?w^Ik%,rc8h>ճ:1Sy|YzBd yUrȭX&~F+[h\H`N^gwQ@kyzO|k'F juAq 1=sƆKYx+U(Y´C~} h6W}(2v2}KM3xOFj7{]Qo5N1a̳3\ ¥%=)DܦMt'!&BV? dLM,2eUkգ&W=*㨻nv,T 0RYㄇ;' Qc˛X%m~~&Pzp{f0ZcpMS?CU w0GתS}fNvDAn r7#Zck1?ˆ P_mq90ݰjSr4fdn6ԦhM}P]/5N<.$0=kq5%H2]Q͊yU: 9E\vVC# h|= F&fZYFq6Cvʾ卅Ý64s郤9u/C0@:] d]ix3.TbWٕlbie55F,59zazY0[8H:Az ǮOx25L/|f~eïic_!>j'涚Ü@8g<7E& nY H|"nr4Kr&ķn ñjks[k{Fu/T>It'dL~TRjY&V(BM >C9m2in-Q2݆1L:\W9P2Rɔu+DF#hħ˩&ё]w9֋iVZWV`7艈&טnm*TmPKNa APKK>OSGI-OPT/src/java/sql/Date.javaeQr0<_ &\zLQVH$0Of[~o߾U:0ƭiV;a9²&)%. Û:?P* VJ!ɒ Y#J?:i4n 0[4PM8BsHTz.7NyO0/.x[ Eͧ4.gʼnu.XE1{9XzjeǛ#DêJaJt0=oJ/uÙ@SIܴ]h5Mh y1ȋ8<5*[y ,_}Exď|1A,S8/蝄Hr r+KVԄjv^pVFɽŸK (_ Qn8AJ=]0*9_t!OSGI-OPT/src/java/sql/Driver.javaA0ϛ_14arJQ) tzpI0 vvȢEVo섷TG-ʭ!*}/ *$Gޏw>QʐN Rp" Q̡9j[f~6BI0t ~i08j`ώ icmAHj_hnNHPehCMOe#0Cw0l6`qtV^.|_uk#+44>5B&*2bX J+5ҚU Y`Ta[X-^H/(6&axq;xaYC$rSX%0]-g:^-DG/g> EFsa !EB( E!8YeJRPKr50X N{aJrBϣ8;qhV9ż:3n]?I5VTgȬh?(~b;?]ԅuNqXwq_B/u`<7PK̟)'PKK>(OSGI-OPT/src/java/sql/DriverManager.javaUr0=); 04@Q7\IYnSz(Cά[:0Z$ =އyQ@I;@W}-yXA#2rA2wF( zΡ[ou'brز=He!7HZx1 $pjj2OEV;uIk/c%cOO+_OdM^:Lh h̅W{`lE\SVgc]haL`LZr{ -G*@1 0 9gK8` '0Ne8|gC@U]DS89.Bx@a*J&C.ւSi2YjIAz+k!IVXf˥rNt~ez)-OSGI-OPT/src/java/sql/DriverPropertyInfo.java}Ao@xIn-'hk5 FQòͶf](Q[y曷Y3LL}zBZUJhI_FC  J%9{L.$hFoo i-$?:e4.AJ8XL8@{(BUT{( ivu*=\ n:j>BA$i6G2.&y>{]ו9XmX3k%Z QZ7+]L[a)lV,'F^T ^#{Y> &jtLlcd1fl1g|!#9tW۰c-"'zPG$WT.QJ'y#dwʅku 6)/׋ $8?؋Vn֜ d%ljn C ]'98xtְW 9iUPi1qOF^TIK+-v4|ɞpDQPKT6PKK> OSGI-OPT/src/java/sql/NClob.javaeQo0GyJm}biUDtU \7b ]'ljU{|sWXks{WP5a~Z}X׏8J#51;{Yr`P Y=!5TYY'M<fSi '= NPcpҡ=^j2R3L.O` wk!{)Iqř8ֶK%zkn=AZ:AEŬ-Dgk^J/Uӭ`H筬&k&fisZf2D_PKePKK>,OSGI-OPT/src/java/sql/ParameterMetaData.javaTr0=)'pPS:=n#H$0;+-08!޾}+yr t78f#XDR Tl:=1,=’,!+xKCr26Qt;cA ,`t%-Ai% ! >ʁPmYk۴u:n: vpdBū)uƹd4MPr"X;g$fJI p=`Ů2\W hX='T9 נ!/ XYh  t4N^:^}^\:Z.dSX,aH.UHx#:t_>!%zfKL"TYcIPAEf+eb+?}B oOahyPkNrd ~C[Wrxٶ#GRxm8wP(T*:X{8=^Ԏ g} +ut-MPRpg|m~aG]{L zGmtdDy{y8>еrãi>]#K,w_iz>L?o$~RQޛ;PKjhWPKK>,OSGI-OPT/src/java/sql/PreparedStatement.javasFǟ_'PO_i5% 4"-ptܝ L'{@Ʋ: ~IN-||a(]@7Mʘyyq y0vdH/) 4@!`cSzi#.t_9ZPb00)}) $*Ki+a:%)%CM-r8rBwj -Eo~v:*@y'ƚ Yuu+S24}-O׀9qZS\ҀsMʩ^ia]&IZL iwynJ8FFgpݍ¨  |$`4h'hw; ~[ Xp"DD$V)39\-IK^3aܶ8L*2anLO u U#/An%=CrT12e[%?-HmhsQV2 dhۯ3B^Z]သjzԦK wvOۇbvìVa?<"ZOgdLi0ٞ|aÃz"X]x{` w~dRi+`~+T-l ~:ߥ m1s~PVUw%n9~CvxēUu4.~G`7Euy4}=_V_({Wu; ]RĘff~=U%9m=w8lُLz+̡,/& ?%I6`s=ѝV ~K(WOSaKN{PK: PKK>OSGI-OPT/src/java/sql/Ref.javaOs0Stztʸi=)e{8*q3 ߝc hgjy0-g9Dm˙(+zeȜ@ /QjHcŇϨ ΃9L`2&lBZ 7PKTRnՈs.FYXFrF}B`vM}8 ۃք7r䫗D=-:ibLU bmYRk4RJGknh|0=l*nEgOBH (6&`8}ޭ>ʲ(Yǫ ir4w%1N}@n.)BxPQX4h: 4rZDPoqjr6-r\Qygv,0OS]A RXux3bPANaP3+L3ײ7?jaaqXZpxC nl1o//a-wW`N7PKLPKK>$OSGI-OPT/src/java/sql/ResultSet.javaZm4EMRy% 0YsN-@cqӲ`R~XQͻ+tj+|up҉"N】[۶yMƦ"c|aa ɐ,V,$8d# E>3ɇ-6 dz؊5Y-&kŀ+2#kVbʤm^$v2|8TShNY!:[hfiDq[MU7A߂ GL)"ٯk.-+P)hI\2FFry(1* ҒO׺ഝFzM' eHO yo2d4&ݑL#IB~xa2þƝ(H% еxsFzDVL.2ê@`hh"Q+ /կǫz gi&g&:> W8TO MFD G~8Gc3yW=hՈ{InO:OGc^?3ѓ6?OaK#9+/?w]9wU; XOs֣[`TҠS%"X*B[vRlr簟|<$tmHk?e*=ֈh,6jla+DUfY Y4YGaX.8x_'L(h Xy{7N3;׽H |trc?e8{.ڃxdtPQy"T/w|ރ'{7ޑ  dwPs 'xx mCs@Vcw&pE,^h0,魽Xf e)yGl"ۘQl4m;Y˩jNn6׺ZAZJ[˭,oңK}\? ow6qWsbm~ޅGZ`у_yo?3f b̍}?pzID!k%a'4ZlUs}`”xwo k0vq쬷 2|ԐsQR I]Y/ czQUʑtݡE7J}w No#.יQ́kU_{b33 .Ԍ_CC!Q$?}scWs,'eA~ 3'||,+bON-6ņS FRIm˶Ndu]n? 9\Tzu|V@mzjp+&Wtú>tA8pIdX69}dbա#0Q_Xf ")6$0(u#(M3Y`?LA׉bZy~Dwn}"ۓ2&#>\FrQȹAh_f; ʓ'j 0}\WCfN$~Gjܐ;AsU&.&KE3 ͎A$UQR/9uRt`nݧD&v[% fG.,:PH3eR%ƅHGdiYV=OXwU5( XYfkfЪkNPDR"c.:HVɀ)ш$-'HZ}c)Q̗!80H*kD֠vppcFr5UY5)@SҐUH3;(sk#CIU.,kg%)c}[4 ݅׏|uMnқWͥ6uys_s7yIq |Y%NmVcnUjIsp,% S6 YՐOE6lN7T%RWWPKz=PKK>,OSGI-OPT/src/java/sql/ResultSetMetaData.javaTr0=)' :=$@Q7,0;+ׅv{d{T ’J)Jgj߰Vh0 ,Db Jр#O +`osOQr^J!,D BAV o,^ \z8s= Zͳwx=WUFqM6wv_u$Z oJam U ߒV+xf+#P޹4ΈmvJ@qA&dyM~\&\x,W0]Ƴh-cZ0Q<eo + yE`$$[`"v"TV !4*M.o%"uD^|D_FrKY͎S{逕1twd;T 6|'-|'`}/\:.pRd 8KutsFF7+`@r)C7 bLՃż9߈Sɭ=Rq5ߞߢ|'ذgth$K|vF.O?kj-&at9҉@0N 1 v4CYoh{k#Ktd' I]33)L GPK?|PKK> OSGI-OPT/src/java/sql/RowId.javaeRMo@<_1Ɏ\psks"ۢF (zXb.&V޷vǼy.UI˺X+$gm jy?|F* R2T@dACWma/ ̙56Ru7XŜZI 8:e1b iPɖ@/CLm( g [zU !LzzkA0/&ƾuОkMpmwq{Ǭ%cy'Y"g4DsV9֣VvFUvL)2rd 6afn,!Ix4.Cbķ>Jb}B?k߮Alϡ^;LS:;[DFBΔLOdҺz5VG+BO [aiAZaܠIokrvͲ+M]JnњIDQ @,]lUIS_w޲yPK6~uPKK>(OSGI-OPT/src/java/sql/RowIdLifetime.javaeO0SrJVҽ9фF$ў*جmFU{ +Fsx ,Uw֢9X3Q .K|ZWuѠ>aY zY{@:^otfB6>Uہkt20V}o߄H_7Pl\$b |X|'KlS.(-A2KWId) Jg|@s.+C|P+(ɚlz 4Z#Pqjr28 z 'vur5$Zh)v&e,/RFkZ1OSGI-OPT/src/java/sql/SQLClientInfoException.java͕M@WtqXXVEՔnqH:a4dg&jnORLw!t8,6g -?91B@/:=0EjG Vdc(E /XLMąϨ4^6ՄZlB(5א1X.fQiT, \4rn3*(*4kaLۭc5'Uw;0=%L5(,`QlN9@*`Bi+  Zb LµQ|^;}go'mL@ˏ ZƏȵ"ltꇳ`d Ix̂IHW>O\@Pv!B.0)i4,C @ڮU`ber䆙臹l_bNQAsF`ѧ񐰄 D*G퍃k"UD'\~UIܧWL\x~\$V^3ȥR3U}Sߠ-#P^?~ewv{'om24J#pM)QqPK4RPKK>"OSGI-OPT/src/java/sql/SQLData.javaRr0=Pprk}28丆Œ" OޕM:Nsh9h齷oG#q9, i[$N7!$eX{5Y2"f$+QTA'+2vƒ?C'dPn)=`4F8xtCXEK@O%iBBz ; , < j4K LsC}qLgW|wzu'[ =v#fW%nk=(Suo hT:#{ڋGQR@ZcREI͗nzdtY@y-Mg|I_lqdCO ئq+ :[JQGM Ad$O^XV+OӊpN7sy88矞0,ݖyŷspuBy@X!QS{OX<3b\x_Xq}| JLCxνWPKxPKK>+OSGI-OPT/src/java/sql/SQLDataException.javaRr0=); '$hvH&wqOR3 D"E0^T? Gpt#wr's;/˧{emwy=1]Ag}yPK)ۯr ,PKK>'OSGI-OPT/src/java/sql/SQLException.javaSMo@=׿b "&RUr mFFŤQ=mͮƠYp'Kwf޼fֿpX+ Oq.|N.hca0I8#=| k,>*U@4s7EfrGIOHJ!drJ"(P-cD009_p.wΖy))9IΈXf]\Z !f9Żddeãuܥ݁G'%S.pp\Z4cΏxFޜ/:_Zݨy>fHfTvoR aO|lT>7׮.e@8G?֕绋`:}xRsҧr6PKWRaZPKK>:OSGI-OPT/src/java/sql/SQLFeatureNotSupportedException.javaSMo@=_1)d,"G]Ypv8QάB"@ ?v޼yfypSWk b9p2@! ,Ѡb#QF+G|p)`a>4]8l` qp+^#@e (FZn])CQ1EwZ. ۶ X8 քx:KkRg݈ qHUrZViNuȕmFGSrc5{bړFj@1(8(SߑMr%Y#OSGI-OPT/src/java/sql/SQLInput.javaTMs0<׿OvinmN#-SOi "tL`VjJb~63X y0 ?rp2F\:fS @ȆX*L.nbztof ⢄ &`ܽO/APBC4c5\u:n; iFtg>M8us[o[rݱ5qtVE5g  ,H05/(I42 WZ/B{H?/X c7/ pfDnݧn par민it =5h|lrE_XH*ycjj!deIAl"y5}ݱrT%Hai) n5y*s\)is%E)iKѨCu{ZhˎɅJs;)R0w<[Q[;Y +f~ EBH'eX܃thy$Dsb=,C08S"^WҀӼD暷`e\t@-Ź{h7$f -Fw-`:%sK4^by `/ji i zeb5;^Si@ҬvSD\6 z5Lu~g4 PKêfPKK>COSGI-OPT/src/java/sql/SQLIntegrityConstraintViolationException.javaSMo@=_1)d#bU{,8ugq! T?v޼yf^xpSZˍa>ECTUa8/}QahPy`(P D#>ܢ6\ c: FW5lY BZ 7sT\nU/vY923JP>Xޅa4RaupOgI:{MQ1:^يV)fShn(}0rmXW=1Y#~ ۘAB}ƩH&h,Xt\YHD=|k,:Wu@20EHO$AQ5ϩ5Q֬D(@rjH`h*藾\o+۱?OSGI-OPT/src/java/sql/SQLInvalidAuthorizationSpecException.javaM0@WzjW!)t DT&ĐYiZVYhH (9y3v .`Eia` Jp! 't9 0,]%["8\d( 5!yF~ƇP&.`O FWW l$02- ԽZ+l)zZYN>n{*_a۶:ĚpOg ='~ՍxMk\+ނ 4gnB>-00VUcOHP۸A fxr7)Feb Er"7%w>N}@j]])\; DaJLEFɢB%U50n[ SvC?G}@澺fE$>cȣƖJ/Ȭ; ΢7F@%Sͥ(Ypp 5f|>]&/q@Zjv?ͼ8/2'cy_PKxPKK>=OSGI-OPT/src/java/sql/SQLNonTransientConnectionException.javaKo@SrJ*c=4Eإq; ήU:.$<ؙ/EV@TUI0Ǘ>(pǰthPo1 sQ̡9jkfŇP&aЛ+ث6lRYh C(D;!MKk]wyzSw=C,#wF5}ǎl/֯°mۀu˰:pOgI:{NY1*^դiX J+5* Y`Ta[araƞ4I#~@mcQ q:QٻMr%Y ֮)\;SDBL\SilXP-jIAz#!Tb#,uDQ?;'eYQW扒fvDn΢WB]7Y=v8x?)MZez0>t6ֺs쐭j,/έyQI i= PKrt{:PKK>3OSGI-OPT/src/java/sql/SQLNonTransientException.javaSr0=); 'ɤVh h|h&ǫ=0Er"5kAj`FYT[.*,m4:'M{H֏6&`xq;8.Z.$g),0]$q/Z}(qrR˨vH&w.OPK$OSGI-OPT/src/java/sql/SQLOutput.javar0)vrrޠ'7ICp8tvTlɕwgemi_5LeW<3X8EHh}wmXL +Ԩv`! иZlP"Kџ+*ͥsMGó J! 5d@+\@*˪/fSl%p3db3TeL_tSY[/U>.\=^yPսZ5(=JYB H[u"iBpmOjsdca xA# k V Z+.YEWD)f#@JLn1Q J<)&ܡTJX50nӗh<?-혯AU' ePeY,kS~ ^$ߴ.b{: a䌮QOLšR.:<6 YّCAWu{Kȡdf?oS,ɳa6r&HY ^={^B)B*pNL^\!+ f#gOMp_/4ƣU" Z\ѱ)nG4u{(o6\9S&+f3gl :yq ΔTvuHHU])k^|6: +cLʺ^h| K{0PKƳ PKK>(OSGI-OPT/src/java/sql/SQLPermission.javaAo@x#&B[4qvv8(,(7oj0,BRR0.#]c,bA̎ʘɭ,H[* ܆6O_U< }ižn{ڡb- jFQonsӻx< nho}*p=8׼Obq kS%ꨵm6["ka豕7^!*ĊYP\;#U[]' yRZgugbO9|4țgO%"-i&[f}@:{lv82CO0qo9º>"ن VTޑѼ2[iZ,[;Js፾MP(` HoL񵰲8Q=oz9g;aF! WU*_ /Yt|/APK,PKK>2OSGI-OPT/src/java/sql/SQLRecoverableException.javaRn@=dGDEQeŻdw1{g1imQUΛ7LxLUע\[,Lrdzz#x'#wf@.L%ׇ]_ҧuorVc@֪V"oRb ߏ$yQ<;PKn_PKK>2OSGI-OPT/src/java/sql/SQLSyntaxErrorException.javaSr0=); 'ɤ Rp! '~; 6, 18P̡9j}_P$L1 `Ї+GѪ,CXVLm^Z#즫ӳ8%psPj} n{ݳzMS(]ky<%lTYDc@C-49^+Ri-yJ/4R* Y`6\ɅZj{Ҵgd@m }b;8M.Z.$g K.8 >@8eTvHp.OSGI-OPT/src/java/sql/SQLTimeoutException.javaRn@=dGDEjH0]XQTVjrv͛f&k*7GHa8/}QahP)GiFnZ#>|EmHIc: FWb؊=He1d`M>X[ ֽ즫ӳ8%ps Pi} a{ݳ~mS(]ky<%5ndƀ4;^AԬ*+ZQjUNuɒ,}0jm[dUcOmB J!N>Jw$qiqm\FIRX,aH,^$|Qrq|s2ɵ0EHO$A15lM(JC-ԨdX ,ME[vWrB>wDN澺f,,2hnnk,ϔPW= $<;Ag;KחgyǬ7c@Ѫv#o^7pOPKi.8 DPKK>:OSGI-OPT/src/java/sql/SQLTransactionRollbackException.javaMo@WrJ*c=4Eۥqmg]ljwf3̎ .`.8*y!kD0M.ij[5-,ds hE !hXNaDžϨ4fV0F+6lBh5k(y\@.7`f( FrF }B`f0_kc7uzǞT__E,^!FԨ5(o=\,#5@*`B3Һ7\T.hY)kx֚=Rj0  0q-6L?nR 8p**p;;F. Qm; ♅R,s^JU*JnQ Tj2XXL70/TM;}a[iڌ:yXi*&4-&uQ;A3( =;py1`O}^ /6l>Å_-_>#ڥ4m_ ҵ]ΫgMO^ߏ sGPKƝPKK>:OSGI-OPT/src/java/sql/SQLTransientConnectionException.javaMs0Wtd2tzT#p$Uf:iWϾ+gT`Ե`# 'yt=2,-4]x^5e{AcZxQ;Z+ܦSjm>s8q۶GTq}xNgY>{I]WFkm# U䊳yY R)5 Y`ڵ̠ǔ:#V;iڣG*X@mcIi>I桇\ŇUrdE:a"Lt;Hf! 6)|;SZ,Y\dհ R;4*f+%b+sOuDqPzc/ݬkFO0iJ7UR"Yw ;߷G~=Z݈ra)!j!O&%ɱv E^=k$}O>zoPK &PKK>0OSGI-OPT/src/java/sql/SQLTransientException.javaRn@=_ "zjsr m"P1ibuv8(ʿw8-Vw͛f #]7ݬYQ". )TF~ۋ5i1'KfGN4$jx>db6h6Llʧ7L/C]i)};SDJt"alI\ˌ9!;2$֏ղ)V:ᚫ|B >DNDjDV~,PVrf~oΑZٟI~EW-Ǔ񀿀jo3Jo'3C,6Fͺs Cgw8I~\ PK=,MPKK>%OSGI-OPT/src/java/sql/SQLWarning.javaAo@xkHzjsrZI{0ۚ]gw"{gIMV OB#˥C?`}J gi};1^i1%KfME9)KU[Z"!R+E#ׅzs+%fHtS r;kt]c,PP:ӻg\n8l6;Ǒ6k*5UE]# w<@*sZ@8w*CXp01y㎆[?؄B/ΐd=$ =&}\pOq:K&S\LdLR8$ A<2CMǹEdDGzo֔˅̹5U6$zMFqGɬj`1\I'跾|a{7΃We_nľ;R}RFCK[<A|QƓeZ?CAPK!&bPKK>!OSGI-OPT/src/java/sql/SQLXML.javan@S8AD ͭ%Zbi=6ڻ{gm7M fvgە'\UG-a2uQ@PeB0Nߎߍ| i`CRR$$ P˔4APa¯~g H$\SA5͜QPPb a , *Z#ӫ8'pkENG.8ʞ&t쬭O&M:'Ek&pXE7캯jybW nk ( k=F +d>2۠&' cy % hAFc'rƟַ1ME ׫0+>@f ȸ*&`N"g2Y2%" &s\IK*ҥ0X LL!JaѶK/r&ǜ:G<3LaYF_߿,wW"qG,Uc|Zͼv](?Um# K^ ŧl{PcN%v)P( C-H:+x [)G؟he|{ܶull>麶x[μwy<2zߞPKܫO;PKK>$OSGI-OPT/src/java/sql/Savepoint.javar0)v|3ZL=0EN29 XZ,)0d]aq&rfWE|5>̫움fOC+-hHlEb р#$WM'!ܣBI0hXyO "i B@HAOhpϤIqPT邦,&;?0 #eڸ;x7| ֝Z0 C'*^kPxkΜԃN67p^QiiK% R6/ KYEnIQ$.0 XmK󌢯d#nC@6~+C|Ш3XFT4l{"FDj 28ݘz7o G٧n$,Q+%[55WnZ1#F6@_?APK7"PKK>$OSGI-OPT/src/java/sql/Statement.javaVQs6~.b'O䆃$}f󄚜mf:F 5O!ޕ1\r$x[OZ ux*kZ[&0n Lp t...{@nBi DziD$( P550 TOz+j#t]YQU,CX - 䕴2OCšS8'@Nw˧m% v]J! &ǂ'j&344~)/sRiHϬrwZX!W=0jiw\IZ, hGT6.laG=Grǟa8 bE0 #?ݍa<zT2ʃv; •"D$,A1K+ڢ#Qoq:Ll\z/hPrD-/u'/TA*EdoDAiIESp^Sl)$%xidh6#~~+ޛ! CW 7b6 Q2vD0߰Ø!z#>d, ^b^C4<EsۄKU"Mݲ~DHo8'W=q%!OSGI-OPT/src/java/sql/Struct.javaAo@WrJ` UIX[)U8Fάch+vo8: rYNB4Ra|:_NB +tBvɥ,Q9@6h%)|FVp`h4{na'4A=J6x_! J3Z'i\<  r B4@ϖȼBQsԺ2Y,|[WA]+-w\@*E@[E>#;+Iz NW f#YY$_c&|o<ɧ:YϮpVqN9d+XdENWo!NoC^L92S8S BH`)+YrknEP=ZAΏ14r'IPG_P7ot+"tw<0m rX<ޜl[|"_;̊[,Wbq Wsgb%ل9{3ƢΝ>?(|teY>LJ#~PK.ڗPKK>OSGI-OPT/src/java/sql/Time.javaeAs0x j\m= &(Ũ#8L&+p)i}%va!&>XYm=D oqXÒ=1;{YvT%Y-!E2Nx~Rop,NG=F*T{H~{s $x< >Pns)z_Jmcq$uҺ>Sw"`鹑5SbͬJ05ouko`SJ\7]0rKMhY4Q0yV+ F?^YFuPVrIiTTxkt +C"4@Oϕ誳 }=ŽGVx{20BiB5b< KQo[PK5~PKK>$OSGI-OPT/src/java/sql/Timestamp.javao0ǟ_q2H֗P+"tU ěcSۄFUBӵs߻3ȃzyC9DBp&sd29?Ni`rs hd!YNne ?Q$`- Q $7Pr9\Zr8'p1Tfm<ml8P Nk«"I/ޑn׵h hk \,#4J#Y\[.1UږitygM{6&aq:vxcvh>E|ld/YBo Jn2Nc@jZ &wMRgJdjys*MV *F-"Qqc5dpW2.(zGc}<+p/"SJ  OSGI-OPT/src/java/sql/Types.javaR0 z酒8vk;P:6axlsNp_v`FEjyca;݁0>UL<}?^vz1D4I#J{D|9T\j7X)RktRjz퀭α܊ 䅅HP* SYZP9mZ[+{SӪ8'pj3+Aw ۚ7֖_z^aM#/=t~53i hyW)6 Jtz b%sʪ|S,ZhdXf}'k&rb1x ,q׉\,&pŢ b#'< Xp <wAbpy_jT.M!EX2LBZR²XIcDPJ}+As'[e[`;_b%z.; 3i&X)λB"TŞ5|u}ؐ An#I,rj{$U RS(* }>E,a>.<ܧ9#jű7#F}FӡVL@'~Ȝ-,w깄Q?gg8uO?&N =ب|iHJ樂ڟV+aes o"OSGI-OPT/src/java/sql/Wrapper.javaAo@W|#ZG㴨V <-.&VYLDhwg|-ePd;Xg_!!Kl~ 0 6l| Z4G܅EVTVЀ#ZN%%*d%N8TZA*jD$ܾ3xx4T nм^ptPġ2uԜkmJ4[c^6h-|lɰB3U) fmDʀ S3HSr0evduB_plB( F9ΒlEIu}6l4O7XIS^A>$rd<|[ BHVcIlM֭juD#h4Z-LCr[o|AQpοOq}ln Nrh*׻5*7?R }2FX{&<ͨe0&OSGI-OPT/src/java/text/Annotation.javaeAo@WmQ#(x.VYLDڙ7o% pnNFV;q9AZ U׳ٗ)u0V^i"K@ɝ,IYڠU2p;B܈?Cf2Vjph2'b/NPڡb+kKjB̀I .O.`O۷B7@ι[u]8ԦFwbL=Tݫ?47OSGI-OPT/src/java/text/AttributedCharacterIterator.javan@S6 .BLQ`S!4ʻw֘36盃~^shtdjUv8I™*cзQ1vHtyBc Q")8wTKN*֡\M+4i$ a|05Drh nyBŒm!G;w:MIa9#դ|u뷼 u5 j f\Qţ%"6"ք-@*`tf^(n@˱Y0V&(>^֌T (!a>֬ȍ?`{!m]Q|H0mj"! I141a"U)vc+7䦣lzD}aٜ9Lf#j!uˠ3kշL>}"xtVhjA0*z#׎3 Qq_$I`0%km? n wM}zk/4b'#,IJ ]7 ݎwmz\}mAg'UaϤ&g[d3ըL zYw"{{D*40&'ZS2=mxϽ|L!bN\ֳ71 |x.mto Wώ^ ,})lrjm'B~&:iW::qCwt^T PKaHPKK>,OSGI-OPT/src/java/text/AttributedString.java͒N@*Aથ*rmB"šUgc"Ļw1$P!BHI֞3ߜ;lFN:0?H\ z]U'pa2-ТY`9 *)*E4C _3+mjB΁Xb JYCZ,Dϋ44*. =! ~n&̈nUUmnʵݓ<_2uSur ~/'KS%b¬@Avԕ$USA'JKFNJg-# 0(n0b߉Gó1Q8G1 Gq4{)l¸ S:;W[TlʄGSY)2L/( 4siZ-N&sIW?u=}.BWt-$L1ϵIxj-hr:p 7"S̃SQ9dUjלZ?F$& m1݊)J I5iϵWWje "MҶZ6w\~8Ą֛76iNO?{1w ۭ OSGI-OPT/src/java/text/Bidi.javaT]o0}'(P=lh)6ZR p wG* ps=i|,Gtx<5P0n88I™*fZ[59`E<8LQ"8)8=*ͥV  (GjJd3! dIkHڂiPNА#ΈdԘ[X,,w\*n$knxnz`݉3( XJ"6" [TbtfuPp@ˉY0Vf̵Q|WExT6&er7Y7܅^:~ A?߭R(.Se3 ܖsE_Yȵ%b'oW_4GR&HC;b]Ą2yT,Pɔ K4eڥw?R z\`nuPBKdI/e!1+#@ElQ$嘭p? sJpkzN7mglɗ8>yQܝcHE/{3$n4_M FO77X^u;UX /?PK=bPKK>)OSGI-OPT/src/java/text/BreakIterator.javao0ǟ_q *h6-ZiNr n)R~T @}sg5 *_j,6|!81B׻}n{n& &)84@!`g~b-p%A94kSwKU-A* AR.)y^Ϊ<#ZCE;V#0[CWn,KUĞYW|M& G[)*rYD4L#٬rԥˬFdL<*N^mjC&\av]01?i0 a-OSGI-OPT/src/java/text/CharacterIterator.javaeQo@ ǟOaD+X'&mh)-ZHqqp]w/og| u}4Tn 5H(0L>_CBfy ^$*94*GnB_2h,i` g^؉#(d k@]ݣ='^Cor 5Ge!Cwֹxܶm(:Pr\j>/lU`oCo jbìhAA>sSrVLN4^eM(D,F^1^LVQ+"^iw'' Cm$?!C|PQRA%Bh;͎_eT#'\z_4/,"txpn6(OSGI-OPT/src/java/text/ChoiceFormat.javaTR0=_Sqd22L^;JrL߻  Ck߾}vG>\U;˵q6EC(g2Cf{>IahPo1 jF+OjÕ`cQT ,(@ + \B6U/vY9Tj%TT l/LMU(]NE5h~'ǟHuu.\SXE2VPXbV9Ս 0&jiw!lcFaQ20ߑ\Do\eK/h-bz:0Q|eT+: MG I2f&˚ڢT7ܸ;72ӗ+4<#b[X^Ud!dZD $ע8MxaָE;AB.-ӳ -<+:ğZOy;Ly}Sa]dS1CN8Llw}WQY qBwEz%[KԭثK&=KIbڿC$`IޒC@&ƻ텊iϯ3ζoͻZoڠnyxqexwIiPK*^ٖPKK>4OSGI-OPT/src/java/text/CollationElementIterator.javaTr0=8zz2uafrłbJؓɿgIƩ4ۧޮ<8Zk C>$" *$G^N&c!uH)[}bp$ Q̡9jkf1@mpO`~k0:j` qpDZ $p{i)۞C,#8ފc 0ۋ~kkAж:žeP&XDyIu_u-+44n&ǫ=Tq"kAi`FڳʩnBc0-hra> Q#Y?PlL )̢lHnz 7a2g0Kh%1}0oQ|59 y"d$ E!8YeJRmQKr50掦aN|ϣ9l|;;fER%WTUuD 7(mdQ3KwƝ)i bW> JntnmdwMh )YA;| %« |+Tc^0O4%O[%rxY+m W2?j1t9tMug44$o!gk.?u/l ie_CtQӥ[{GQ%lBwٵ*}scvx\E~yPK~8םjPKK>(OSGI-OPT/src/java/text/CollationKey.javamQo0ǟOq)T,a}[&ۢV #x3g;!K/"6Ċ0/> ȤLqr<~7z&a!R"rZЂ dq'# 2C`8 aZPC4h<\oM*z ]zF ֧|=U6M8ѶJ1֥vVܾ%>AIt,!*JbmU@XᅪF7bY (kʴ?i bY /-l0_t>ɗ|FO͞.݌2{cC)[ZA.ւSkYPZEA.\#Ub+$OSGI-OPT/src/java/text/Collator.javaTn@|._TԐM[5JFQUUY̵ǝ{w(='$-x 7g q/g2Eh]7! Ѡ^#G2)J3( 5~7]p%CWGSGQ,P$n`ޤ[Rkikne)CM-#8M 0[.? kzXS: kz0F.@c@kr<IUʦU5( ,Hrך[..5k̸O {d ؘ#?09~&]GrN>Ǘc?1q4'a5| A">xkdrg5EHHJ1s5,C $G^rjHhϗkk(_'[1=mŔ"6%, F%P\+/JK[ /a!OLm͹dSҌ,~Ga~ A|~'eO:(C!(ޣ_s|T2tQ Ǔ^<;2Ti>OTOQfv{`f݅R|q}nvjPK6cPKK>&OSGI-OPT/src/java/text/DateFormat.javaX[s8~^~řI; &hLjPv:&o-1"|M-ŀ$CP_DrO8O҄(,Ձ:nF)^V@B$`\Q %0`&m|$, <&\' T#7"')?f"qĭ/+CN7'*j{TKĸx$TQ9dbdɩZFL2rC8Ey$ EKcTlćmicD}oMmǚi1Yf߰ Th#|0~*CC0s0lC!uȒ2XS |nP.c+&BGZM_$L֤%hJd&#*>t*jIlZ@Nb:`[jmmj2x)E"HLaK_cz}qf f#˴s+8{%aʡ|w6>U#U*dV;9x\GحJeS4~t1.ǞFnNm(nFp{mc>Yf>\5 C~ !$uOzLݲ5Q\5ᝦzm"h#m(^D%wS𭓆"TF܇N!n* %Z;Z-4;l`C-OSGI-OPT/src/java/text/DateFormatSymbols.javaSr0=D:ڜ\BZOS`La1Q"K$Ch&ޕq( >أվo[k::_N4#R T A~~; |>€,f$"!ei 7%sLS4++ PG'b pJ;(,10J\iYbJ# 4YMt:oy@%uuUWK%Z0;-sVJ6!sګJ`ѐ nmh4r <6TPc:|(nzh9p0{èC~4F ]wqˍe ?ΥI$S"&"TZ`JAN&jYH m j5'I-/FAjPK PKK>)OSGI-OPT/src/java/text/DecimalFormat.javaVMs0=_ 2Ԑڜg`L6JJ2w`Lȴ`}zM'pҹB#l3"4:n! Рa䑂!Jd2B vMYH?E?Q$yh8@՛Nb29He!3H@>ZB5M k9EB9BC! f Ӌk=XbMwy?u/g\SXJBWrPXbV9׹ˤF6gLčŭ\vF}儞،yy-j!+8eF)ע i>5Z / { -WSӝ5?J:ݐ)-&f~B&Zh#H,`eeن:pPE\F6d& <撉VA߽?/ ]\ZG*KɤOUwv`drȭ"Zzg8*OUlx<{ߏ~c(%v-792ͬ]'*e LITZ^.7HY(iEqaMkv6kss?4A}Z5[CzsW1Zgʪ kPK& [ PKK>0OSGI-OPT/src/java/text/DecimalFormatSymbols.javaTr@=KA|K|";Bv\rD#fK\fݯvT#htf(:84$bzCahь0'>d7UƒVpW{'b3( da@1HAGi!mBn)X+8t Hi g\VL&$59El{V]D(ւ?7XXDb9UO 9RI0id^^5I# {h>70zKnn}"tiaOghװ}ZqW2ɷs>E_I$bL4d"AH E3"jY`H.?Z'U*ߞ^EpN*iB,+;#!ϴ F=-mG}y BCB_ԋ R+PyW0<8x͘6s$   Sӻq 72@eRs=*]c,HzC腡*y舍\): #E #61?+c(! JZkrO[is *kml$#|5Q`sJ?(ךuz+,$و.yN..Z-h׶Y\[B'w4t ƚ`yŲ?Fk-m}4ry!%Ad{l24/ PqKwгd'×r^XPKm PKK>)OSGI-OPT/src/java/text/FieldPosition.javaAo@x5$CAI{0ۚ]wwA=DR}3o|3U+ u32_97(P)}_w/Ї1JY2Bv&2%e)C22p+BT?M_d 7am/h5Vg-vZ젴Ce=RڦT:HTnuӸx<5z|Z !\}xVΕ_{Cq {Qk{p4IFzPY C+ixdT,5 qiO]ʻzjad:#;[+#~* V NZ8zx}0c4Ey-1_!,ɖʥLy4W"'zCFD(ɬj06\K'!a.ߨ?؈ Z ƒ짶9dm6;xDo-±6k.|8'wKT1m{!WʑIw}Qt.rotj8h \PKJ5VPKK>"OSGI-OPT/src/java/text/Format.javaQS@ǟS)8DZ0Ɩ8!񀅜ѻ#:~hƶf&!o{p Um5/W+Hd0<O~eXA<$'r3se !XF>Ԇ+ .aЇتl RY 7PpVLvU *TtW'=tYY[} YK*]DkFWd:Kjit "*XJ+5R*Ghn,0 drnim_H'mL J Np%q8xm~hfx|"^]B4"$˨>TM@mWL/xFɲf%B6%M57ns'#[fGsF##:{a{UuJKihY#K̶FI-*LPs&ogz=u|D(&^8Y27;0nOV!ˬһ=Z]ȕ cLM |)OSGI-OPT/src/java/text/MessageFormat.javaUMs0=ǿbd!LNBRO`LӃ0kH$1!`MS`K޾}CTK㉁z؀~pKDP?n@]0@jc,%QhC&ƨLS4*ͥc uP+jX l B4!PNBڜI`J#( h;)D矉1Vk>,WJUn]^@ ԍHPkP+*-*d#Қ9H,VH{FZs q̜)4c옶HomL@ jp~д$Kf`~7N3{v^& YFyp*[U!@ܑɕ$b#Ri"X*AAjʵm&cK)7Kl?-=1t4&],FzO) I_ʳ=bIJzzQʔ}g&Jη֥wJ,gnKsQ&OSGI-OPT/src/java/text/Normalizer.javaMS0W09 g&e8n쵣V\II;+@iW>핑S?uಡQC{yE*U̗"]ˌwאdpfKq1>.BNG$P!*Qpjn&⌠!ַ2`e ?{=Yд.![B"eP, \şe_f,f% h-(t9|j|&箒=iD}t_LFA >|WϹ\1Vc\#jc 9ԤȠL[8\ <{RWxnSTa+ ɜ= PK7IJ;PKK>(OSGI-OPT/src/java/text/NumberFormat.javaW]s6}<jHz>8POLFnJ2we0&$p=gϮV+_`әjP20Ð(Pk6o뀿z<)ȠIz,cH1f̘'O*$MjtSkiO`NVq$LXH4V"<Υ-qrr>R b|\t3S*h,K .0󕍞ݶUaR)A&0 H2B!Y@Mqz)bѴOԒiL*F)Z#^tnLlM=y3-\ڮ`la;uX2C_b3@L3E)ݑ0$ӀMXEӄL)L39z[% k͙"*]:KjT*X5 /U& $(I#*:\̉B݊FcE%K9Fq)̈]',"b^ԐCϳSkY J°o!~{+D8]:3(DX/]ٷtZ! 0lcT_/]FavGxY0X]!_oyW.}{=k7]xPpE=lSjJGY Y^Ր *_*GHmZc[p*wηjԾ45CPd1ɜ<ѷU+^f*Ѷx>Lp\x[/a]>LzW/CovR>lkuG?p/\~@$F$Sa~YeіA`Bq2Tv^wdxm}?_S*u룒(CGɼO&v2~rP.L >(MȞ{T?kTu:|룒SO |L5s!/'&'1"ZDLH(qHInppuY 買5|Y&IcYwޏWTFnOܻ=Rg*@y: ʑf$=][ݙ9 0~vNMڢ*PKڿ.=!PKK>*OSGI-OPT/src/java/text/ParseException.javaeAs0WPprk}2͘qQ'ޕMxӷo`ۣa\L_$Btz&+-Vd쩌<Ȃ*m I+ ?X)^0B[u8Bi{HJ6::HBn{>gp$x< NhyUBlk?q8Gqs!/=SY!kaw' W9BLU 66!9{#Tu+ CަU2ro60Jr)OSGI-OPT/src/java/text/ParsePosition.java}As0x 2Ԧ܄fLfrbId wn'4`v~o\E6+ǰa^|HF Uדɻ1~2A GvGUNUhUE~CH(wFIpO0 A[lJ{C:eC}IC*zkzNiNH{,|iR{ӳ|Hbq"u]v3ˋ[o=xu0LU6%y;+TN}',J:oK_ xmBaȊ>EVc2X1],| 2|4,xe<Ɔ):ZReT݊PYʼn`n 1`l^SU0("`]Di六iWB`{ak' 7}>c'dgG5f %Zǿ..Ks_PK@mPKK>-OSGI-OPT/src/java/text/RuleBasedCollator.javaMo@q[!AI{]v15.|TjUF3,3rke^t̒")Bb8<?B s`ȍLQ;̠Z!*Em:i4\CNF^bk*X-hCP9d `%>XH Y-Z-h*[ $ J>AP `Pu(|np'd۪[9/ JJŒYXEԵ$ugVT ^&\Vt2_l8&4tQ'}/r/nptOa<^ŋx6'pO<2Sq \\ɔ9Bn6h5;Z:VǀQr-IPs—o4/]lDH@*I}T^k=H07(\6rboY:ҕRݾV|׸=3tς~"Bbl2>.PK.@ PKK>,OSGI-OPT/src/java/text/SimpleDateFormat.javaTn@=_15[j&r\캻c;k\ ԖȞ޼73bp \bcd$=F_$y.0sH 3h֘DebJ-BTZB:M;s]Jl@i"kH !Ƃ@*hUuF9FC/H0\0৴ A$*>UUvk -ËIt]7[`W) '^l@* i2`uJ0diEI#GoxlBA' :pDaw"wvwlLe\L'pN'tqG}0.۔n-BBlLeTV !k4Af%[eJN.hy3OSGI-OPT/src/java/text/StringCharacterIterator.javaQo0ǟOqP-ZE$BWUڋ]3!3iݝӻ\k-y䓀(.}wa&hP/1 `P#%jVJBf8` y3Q ciAHjQ6h>#CQ@I١mCW׵϶ľyiM6-Q7Qw@c@Jh8]+X VrfB]0jfkdX-ʾ(3#~(1 0(iuDIיG$OQ&Ff!?h|>*ˀ0+箋 @)+#jZRFP^j0s6XQ^nQ;GdŕxeR ߒ F| /i-nfh\c7eOޛ6ed:lbmFWe?G~s-NIl;F[i *l(WZSu߂#LhsRrט QWʑJwZSr>I㬈~P9+4`M;K%20u5oy?PKYXPKIG@OSGI-OPT/src/java/text/spi/PKPKK>5OSGI-OPT/src/java/text/spi/BreakIteratorProvider.javaQo0ǟOq *X߶>ۢ!]9`{U=CۤiR?I'0nua̋OhAt<~7yq1`AT2ՊLSd|!|#5pn78m`{0 $ `kSeSk5oth7î%h<ȝ0Q۶)SQ}̆4\Ί˷b25~4Kū=++q+O6Z^6]s"ԁ^5i?ieEγ"/r/?ϯp-l_0_d>ȗ|&nK>Is>V : zGHVR*#o"p:DZo5#+4Jm}Lw׬+)Q4=m䑭N"Lu*)'oL*$“}PO6#s8^vr:Ն^XNׅ^[_$PK@bPKK>0OSGI-OPT/src/java/text/spi/CollatorProvider.javaeOs0StzLCaNq$uLߝU?`v" [wVWJ0>L'i܆uTXc@&ehTM:Ӡ!NH 'S>(k28 Fhr-8]@PJ#DG HwZhw\" &rWۗB4@e}ߧDZf ٲ/j񞩇1S; SIQ3=Xgd#u)N!-ciT ^ 퉑[) *i4-6V7 VkbSJ^}Ey=q;;`LyP!B3Rp(VInʹhZ{@o#p*6Z :mW ʒ;SJ\WAܸR Ɯ[YۃjN ꎔJ[Q;-S|4<K?s=@T@ꍟϡp~Ɨ1IPK/SPKK>2OSGI-OPT/src/java/text/spi/DateFormatProvider.javaOs0jHnmNnfI39 y1I8L&=+p$߮5:JάzV }=i kRF#O!AafoL!\FƔWSZ^~d cGA; N6V[0 (`I5it d@۵Z.s$py++)pZ Aq{VhԶmvĩըk*?654*ZUy3d!Vy6%h2J2 ȋ|ɊF|mz=l6& Φ|O'lr PF&9x|@0)s@|{PӒfFUݠ78k ,MMkbŻ}ŠQȜG_jR;N5 #44`+K׊xr)þac}ze{)a-s|=< b{* 9r8^>#n~֯yw_O9yO o?$#PKF%PKK>9OSGI-OPT/src/java/text/spi/DateFormatSymbolsProvider.javauAs0jڜ\ `LJk&ML}Gﭔ\DpscN{ m%D_fIa6!DNW~hg0Ѱ5\GІN5x/( Ҵv@Ou@w)I\˳K!Oߞ~Jcq"*/bS7AN9N\AXdF`! ԽSt=ov R*;zմ?&4b"+6~]l6l|- Xo`6[<4oYr˸[0 <"v-JS5Bm4'U>\g*4U$&W(DW0)"&[uٮ6(9Ƶc[w株SB]MG 6H`ϓk>D32 <#g7gFʴ*(g 87EOPKX!nPKK><OSGI-OPT/src/java/text/spi/DecimalFormatSymbolsProvider.java}As0WtzL)eylIH븙N{W-0 [)c9uIA4Jh0M8,&(=lУ;`C0Y)cR+$)|Cp`ak4 GA+ A=j^%Pi+ڟ .S`gB4@=$}DW'YU6_-SntރßrEVLmm٤6[|/myv i~_|1q.$`LyE(_![j$Gu'jiN]|VπUiTHi\PE8boUdBF0˷6T43Uʟ:RMpWF ~\!zc!sO=8H f PK wPKK>4OSGI-OPT/src/java/text/spi/NumberFormatProvider.javaQo0ǟɧ8JZ{ ]U:5RؗfմsXHiyHw,3{p 'I]+%|:}7~7B ==1d$j%4DEHgWFyg2`jS$돺F(>ob/b{Um n# @ւ5fW2n'ڙ*5wTHQc7}Xgeh<#p7geP!PC=8|$`/ܔ/0SMX{Md7~M5:>I'1PKR_PKIG@OSGI-OPT/src/java/util/PKPKK>.OSGI-OPT/src/java/util/AbstractCollection.javaQo0ɯS: 6 @JM4!6plc;ͪi&E6 CS~pc7+aއYC,g2GG7߷O+-ѢYc79JԲ@nkӫ[W4+ B/uKب*Ƀ[Xr9j\B*ݡ5ܭu:Oם#9 F}!0Aosp4MĶđ2PZ;HƓi:yMݮK)Z0:64Q,#VPXi֜ԍrV-] z[gxVvbczq Iڃqor,>.ptLRa<'d6G%)28SaZ$1KSkYP5IFSq`mcn;/_hot,'3XFMA.!pܛNζX{!:Q&(.aHԖ͔H 'ff]m$,xOdxO1;ypxA#3-أJB۶?hP <΋I&|`E)qzķư(d-,J-A PK;"]PKK>(OSGI-OPT/src/java/util/AbstractList.javaSo0~)OHڷ-& RHWA&iTߙvUUiyH0Ιxp 56| IC(g2Gf q^! Рb#9J@ v6,2_ W΂0KQU 5ۃTZ \ m.!Wu[qtz{YFpF !Mwts(]Mk"Z{rw]Jƀ?-ה8kU2*ViUNse5JcM'OSGI-OPT/src/java/util/AbstractMap.javaUMs0=_ :!dq m=0 YYr%B2!@h>=طo߾ |ʖ'3 @dP;m6O)OSGI-OPT/src/java/util/AbstractQueue.javamQo0_qT,a}ۘ&em*]G'ol)ﻆtm<9$W03z1,GX%R%ax=oGqxUP:ȑ}*f`r+KҎ*" %(񝬓F:`~4M޴؉=htHEQ]ӣuo{z@^\Os!ͻ$.G:Q'Kn|_3uN+r~rb0U) fU%y;+l|',J:oe^9k4G1ͳ|Lj.2OSGI-OPT/src/java/util/AbstractSequentialList.javamOo@x54j&r\`]v13 ?>ؚo~<:Kp W~9- 8H1Q@~OTɕ.Zk-!U)3/A;t~Vo0`ц@w% mQ]ݡ9K$mVDB-;e?FmۦH:_IFWtVL uw 6ƫT-TZ Q-n :y( l )T.e5[5"TnOFt5:Ӭx^q(I$?ګam&Iݬ$B,JFi f]YHdY+s%|~%:XO'}ߨ?= )*⾶č1<< 1_G+v>7I$PKww7xPKK>'OSGI-OPT/src/java/util/AbstractSet.javaeQo0_qT,a}:M(ۢU s ނNSTRjyHdd .07T  VwmВ0>L4nckN!(ISNv ɟd_2 ( GU8{q6'P[Q P֫;\" Sr,B0@]S}#qj\'nbY.3pV=2q#> &RN)ن^86 oJ{eMhE9׼,i4+6?Vu5u)VK^}Cby=qe< S:O%9!yKRmhDCh9͉`핏3`mZWA,I?xiT{خ !*-dl#òy mIƩQcўt8O;L`1z? HPK$}PKK>&OSGI-OPT/src/java/util/ArrayDeque.javao0ǟ_qN,m6e4ݢU Nr nVwN-}/6-xU,5ϧ: |!8 Bte; 9epI.y` LQ"KoԆ+ ^:h7[3bJ%He4H9 O%$jV4N:Mn*pF=e 0ۈ>SkϽbXS:5p n@c@㟒k8^+HUb*k=˼ Fev44)7V=kIhQQu]pst5k<0`4hxNѐ.px$˨u@2"D2UK2&< &gܸ4ϸeZzӗ+k;͙WZ.ZEF| /WkQfE{~LְZs mP5g?tUׅ7Jbc]#g%sv0gXXS1*%~x ,M/67%9hگ:hK-ABm -jfva)bJ^ݗ#DZ.Y3?Bi@:_*PwsTЫ ~gq; Qz&)G1}@~n} MDT<5|$H51o1:! 6: GxjPK8,PKK>%OSGI-OPT/src/java/util/ArrayList.javauQo0_qT,m6em*]Gǹ;RZw )!(9,3jc\zLR$DϽ8,,(С]cC0&a.Ђ_"$ZGFy Ws!cRs! ,U(iA%Bih5' \VǀEQ"/nU0hE`t/"=sLX+6לrq=½$fϊW}+"ghI(z w߯xƣŝ_s44fHz>xn` olve(2Tuq%43\QXՠk.`{86Tw^[CXǓW3]MF(PKJjPKK>"OSGI-OPT/src/java/util/Arrays.javao6''4˖bfleE1쁖h"$e(dâHjYKHf70ɑN0w("(0 noߌ@SaFrXb$(# pqibba@)O81y0TGW q)<#T@ʱda/Nez > HGR W@@0: 4e{mQ>gӇ{iu!Gs`KJ(Vh-m(eX>TY}`Dx;N7Vp:E;(^ p5YluNVHA>'>Nܟ=`b~syL\2$L@IroVL$lH oSŰ{b9#H0{&\V. &"D ݺR4 :@y Ir !l:r:1wϥ(HA\}k*ߎHY qE!5;0bn> ߙԅu rtWߺbge_f߉l_Hre/6+K"qgWsڌUX-]a"WT% \jK՝ onn!p=\.i9[ 졥v#{w)k-iIYQ42X31X^Nz Ug8sZ+38czz"9s$1Gɿfn ː!4悥P_HSHcH$C a~4Ai$MrEf<6 PK0"OSGI-OPT/src/java/util/BitSet.javaMs0WpkHn-'Bhif0i&Ga\IƐL{Wơ|7i_U t4a'JIB%v: 6-%NCv&8\Mр#t3O KZM؆ԫPkBAiE 3J0s@ *ܼSxx< >j+*3w.jE8&mɍֶ^?3uuAI pœ51aV) DjcN{#` u&k;#+ n Q\nŁ7y?cxF80Ao8poB"ݒѕt@[$hHHz6+IkSqi4p0RWآV|hϘ3%ueFAshHq"&GI@z_s3&Lˤr)fKrOfF3!-vYw{{p?,kIJ씽DT'N`֏qhމss 툯/|{V PK6ZzPKK>$OSGI-OPT/src/java/util/Calendar.javaWmsF\~Ŏ? $mS( l%D`8v pR,C9{(L8x S.k <0/ i+.2?R7G< i & ϝVUeq2;96=ϤE E<~ U!VV'f ҚU%f-H\̈́2㥬$mBPX'o [ .Q׆N`>]g`Ч! A RF~"QLҙW|ĊiKJ))hd3Y|ID9OUYS8Q4Ϲd2{rthP?+O잵^cS )hJ#}&0\(1ˌx1LT[[q{/qX޾.·O)TER$}764Z{yü,0u40 /[wx{:Ӡצoziͫ7u:7U:F3j64x#ûQL:eڃ۾;r2 =B uN¨lڌ5"ۑ]ȩ+u.r\^!,۶|S;ꌲ պ$k (F%n lj˕o*xZn  Ձˑ0][#@ԓCosѵ9p֌F֜| e:Dcnͱ,9I,1TWq K]'$QVDY"3Z4s]u*oh#\#pϒNkshqHh[\ c>64Uvr{csvpǟ0픃2`D=x3#݀2fRC"*r|yK6Tךh)Ķ_f -gWx'7.kKRlX.EP8<"Uٛ[ERjg(+WUpF(L\|dTl݆mLuؔΧ <t!؃( {xWlzckŠ$ΐUQQyȓT؃;F&OSGI-OPT/src/java/util/Collection.javaOo@qr"jhnM"*jvEUk{0]wwC~΂ F8;.sabi`'˒UYa* Ѡ^c jD+OӇO ) |WkzgWNbjX He6d`A%>eXY ZU-ZCvӪ8xh5Tj nm-a[gimu94M-qt1(wfp'xۮ;Y1[MSe"eR44B#YMdLNjJk{ڞw 86!=xQw"Qav}8$0x6h6wNc4rd<*0&8w1BL-(ckEP5jɎB"0`dJZvt x =jKW)GiY ;Veӹ٢ͮÁETsk||yyAGͳ8+׊rȸW]LIw,t2q_Q6Kacɪa6!K6+>ɿ{t8OぽC Bu2[ PK8.SPKK>'OSGI-OPT/src/java/util/Collections.javaXKsF>_C ؾ%8lBن z˧ `bF-@Ne^_wuNpW2Z(>hz0t~ C΄*0SnYq[I'\՝Uo~"S_DZ¿cXDZylLlR(5#s h9Sha|H[Hg7mLQׁsNiY}vGj8F;xH|ΥA̩ȥJ:B#$f|B%"P͸nդoaB>㆙d`i4o=vlxxш1Q^H+-17~H.Xڂ{[ zw݇n{=3 ^ݱ(=w\PrzEh*!יS57v>:&mbnݶ?ώIB+ 5V٠cv[dzM,[9pa`LԨLyfg<>^jaËlELLض6n۲7Kv-Ҝbڢ|K(S}񾡿,koVY HވmNAM2J˩T*%Ro.,|PJ 4j|G*#a=۬?ݢe5WP( $\Ťܪe{6Wt{>Ju(J~& "H2m1yJlFrcun=GmDb1>}VY}+U`VV17nZoˬb\m[!'Bnc6_?&4/9 P@ڨ3vTd{Rfo?84ܛ9ui4PK߁!>PKK>&OSGI-OPT/src/java/util/Comparator.javaeQo0˯8SZ1HulC@ tU w{ ]& \WX+}2;,KWkf+-di75v=!Ѣ\ 񃌕M siqy-NjA+{HFvzI;:mn?3x<rh^5nsC8RzwL=z;~ p B3U-*fe ZC\sSF:ٷ!j( yjpoBȭpl") |NcZ~J<&m@:23^}A={݅ m|)}) zШ3TFZ%H玠c 6;4oY(*R#Έ":=pWTIϺ?APK~UGPKK>;OSGI-OPT/src/java/util/ConcurrentModificationException.javaAs0W);=4){IHrLcp'%.deV3iJ*rx7gqXF9Gcv&7"Fj{BjDſqgd  [U8q#;"!*}0#Z/~3܏z0<۽BzޛI},X&iZdU^2xV,厷'T2k+zh X=uo`SKvUhM(LY9Ǵy06_ַܥElUb]`ίMy i~Y~=qd\ 0 qo%+>#9CɊ[SM'BdwC ]VǀuiAzᇥ ((*2ݖ#D &[jUu֒tj~'DTV\t=K7?̦3< -YpGaSPKAcTPKK>$OSGI-OPT/src/java/util/Currency.javan@S8ADm[ I`]v5xJ[F?c'\T{KC_`"H"%Br4z71,B:;,bV"7$Q;,Zud4\#臄^ ԰{C5>H<iU֐ߴt*; T|>O;$MĢ%-uuM6[nB⏚,wڃJ*р J&P7y]<]]Xe6a|6ɖ|wאK6 2>*:`L v939" %IrkEPZAvK.1`dm >zW8("{&v"=Wl![ R ֢y 2qћ 8gD$36ȓՠkp%CעV PIޝ׍΋\hUn$>AT9̻v #?+^啪Om;@rb+.yakgWtoxU8ΫxQ PKtI^PKK> OSGI-OPT/src/java/util/Date.javaQo0ǟ˧8 NSt-Z IWфKpgvw9nSl<;ޯ>TNR{]JƀƟ)הd,!U!V4X#ʩ^jn[`TdLLORSFJ}ۀ$Ի> :| WltUw<1F k6[T2vLʹ>Ew$Dj-$򈇔S#jZRFsՐ>lY^.PV:p`^j8%J`,fp-Qs&tkDy=$>ۤ^a~*xk{y`hih6[.2;b]6a6+d-*ܪBڙJw%ݕ y>JN_Pe#Bv(+GQdV52]n0ʖdL>(ֽ\nN i''VY) 5[5Uz]Is2PPK3^7W  PKK>!OSGI-OPT/src/java/util/Deque.javaS]s0|ƿ&On'8oPqJ}v:丁sr:dnR&LʂA~5g"G/7cgk! ,Р`#9 4@ v*O?7ԆK|٥l BZh 7PrT\U/vY9dfPT@`}V֪wI۶RWz5x5O݊qHU2ZViNumFGSpc5;m(6&`#q:v$wsrp8J!Y,_8Su 1 EF{Iidr!EH(NQdMT *A-(knܵX8ek-x؆",^Q>@r-wޫX? SzO 3)kd! B߱:gA=`n㺘$1+X!#yw}Bp(/3{Y,Q?2>fWVS)z0z0V!.՘_j\ӅT#k'~H y\h ?QPK%XPKK>&OSGI-OPT/src/java/util/Dictionary.javaQO0ǟOqS𶁐mQQ+5ģ^Ӄl! !c :iye]2> J02A% #'ecXyZ4{DM.)GiqܠCy##FcII8&z ޢU5Tك,lDJh ]w$p{ y}+z9MD#)֎/l>3uJh-Uኳf\dZQS1H#jal:CY5#Vmq I:oq#or.pVbRX`\\$dw0O#@nm|I/SV Y9m)dQP{4+"jpmJ }'݉jGi["E /#^Pisx >¿pO WWh& Mu.Xbِ?@vw}2C> 39$ϔ*gCvVi< 2?{lkλ`^,=OPK$PKK>9OSGI-OPT/src/java/util/DuplicateFormatFlagsException.java}]o0_qT,m\e|l*]Kol*{_lmUiHd9DTg+˽G?`}HBxi~atX#{"fBɜ. I%rt+C$ѸA[ &q65 m/OSGI-OPT/src/java/util/EmptyStackException.javamAo@W}A?{A<2CGcC)8/[DIa/HP%wTӋY ku XVv P("`SD{DQVҳju^}mIPW^vWmc0 ψPK<"PKK>#OSGI-OPT/src/java/util/EnumMap.javaAo@q5$%HA„(ǵ=mF7Uƞ7o7+W\XA7p ni]< <*s4O\ \~5đ2e_'tۮ)Z0g{`r`5(4H5ar)BxVG$1kS4YVD(Dlj 6ocO.?۱r\ ]eB#ߙMա,Q"_MoyDqF;ck-JתR4 Wxb<Jbs/鞪ÎA^ k+ꍽo4Z2d%Rt̾$ ty}A~?PKvS;rPKK>#OSGI-OPT/src/java/util/EnumSet.javaŖQo0ǟ8BR/R DLtL{tKjp`;ʴ9F h>J|wv}:p#]n(zXJG/п0CfYH ^\pT3T!. +p=m/vPY$ a!9WeV l|ZOW^8Fs-tY:WC<'9Q.DkJxVg bmiiO]*:w53e2a펑R 18$8M\&Ӌ9\ƳY<'3M'gz0.x|Xv|\Փat[i(f@sBt*4DNƙ;ߧ4PO[eZpa*E]EPKhE̥ PKK>'OSGI-OPT/src/java/util/Enumeration.javaeAo@Wؐ%s] ^^V,0=!Eş)2Vjp/MKN`5E-[+B~B۟L*O.rz>/ !}~hPCm>]'YaփjZ=H'*Q2k+FhӞz4I,auFauF{e?Fe&fqS\ҋ<ۯfg4)oγt>#Ξ- б7~ƔQBTZV9*nm ]JZH9;*B>'PKWhaPKK>)OSGI-OPT/src/java/util/EventListener.javaen0DOvJnnmNB9JV&Yb.mHP(}3n`iq{3/X0],!YNOE!{(Z֣{8ճǻ3Z턵SjI-H=89i E=xׇ7c$61+Q~]?no6y-V,}-֥>#/( LЋuс`r 4-p-t۫К9-`g29p9W%3 P';P %:iIPK PKK>.OSGI-OPT/src/java/util/EventListenerProxy.javauAs0x 2Msk92I39f1jJ2߻7 %}U|SrEU"k)TIގB(XzŒ,=#v&sYFd඄%?Xn1^08;q%YPR JkzNOI{ .hxy)p=:|"q&<β|{U0GJQ0k-:hQ3=ug auYK,Zw5&I4syMշ rdtctݥt .ȸ0"r+ نJ%GSU+*Bd'BCf'VˀkoS˝t^ 9F^D$hڂGQphQ:`ٞ HaxFoѕOu𭢽0ps[ҊĐkjzSp PKkaZPKK>'OSGI-OPT/src/java/util/EventObject.javaer0Sp in-'ӌ=I39b1Idݳ2n M7hy wiH(0>M'qx @:XC{M !$*h-Bjag : n0Fy8J{hr9R/R j]ϐLiЕ >`xAA7_XƱuҜYge^.?pA5XӒ剫#VRTڈQ[=ugɓwbֿِ+#~ pmB(-!+G5-rBa jlYBEey ~f+{0kRD|g%gPҖ$V>U<{r:܄_].J{Aĭf A6͖TQ^vgt\%߾胱3=DNV✙sE >;+?>sH T4s8E(zPKiTPKK>BOSGI-OPT/src/java/util/FormatFlagsConversionMismatchException.javaAs0ȸ6-h=M &d!/Z!a2RlKz齕ae`GȿHLqx|FWZXE""<b*Ѐq+!@cVpa~i0xA7ePAcFHs\oZ+\Sxz4\ tT՟mۈu#mX6~H,}$}գh-C`5lM^%kA`AZsڻnpB!Xq-31Έu4G~)1$4$OC 2V,>]FsHgf! }m|)|;O9 }dkb#8ESeJR(J5X-,_lǢ 9 fM-.9ken.YiZN绰4ɫYwM½CU3&JĒSY|GvD7 (莙qbތJKtg+ (9UN"H鋎APKk]ڲPKK>'OSGI-OPT/src/java/util/Formattable.javaeOo@S|# {jsӢFX2$Q xZ.&VYZ7yK|>j7H aZ.CEavhSb р#$ZTvBxDcIIXEK{lښ-nQ Ћ#H`d_*HBz=:'CN\ͳO9%qĉ8Rz囏L=zZ dB3U%Jfʀh Sz4H!XոQ65Ygܛ3r0KrH|M4SZ|>vIV;Xo۴H ɞG݆m|I>-BQg$*nMhZu@##hzZ-ަpw}BqpοOq਻ PrC;ez)?#Z旃$2a7hu}oPKPKK>,OSGI-OPT/src/java/util/FormattableFlags.java}o0x)Vt,%* z f PUq??޳3ge/A]Ko$Ni!bd)sj 蚂4"03Fs`4L&: 4(eMZ Wv@\ <*_ !}|ֶ}8ϔ52qgaպhI͉7raZPsV9^K+j J MΦjҞ9K&Q: ҩ3u I8U|e*A|Q|3qe=%`L<"RW:!rYʜ5U'*BNNw gS˝6={~uV^mB`;a+tQ{7Jوs2 8B|‡"mf➥ood Ko< *jH wR9綺˭kO[W/FQ *EW[<~ zPKIPKK>%OSGI-OPT/src/java/util/Formatter.javaUMs@ =ǿB :!ZNw0i&b !L&ZBB2 i2 Wӓ9(. 4'~q&bf9u?<{ Sa ,Ș(4&P%_~j Qi.t4C65Z= %lB(5װ^Xb557*Obe!熑;wtYS|l*ƞTi;8'=EZ_%WT| V1׌A*`BiY7\.h0k$\祹'T] hQ(\ r>3S2 S臓A0 \—`2pI2ʃׅMnv"{rKI4,EH @sm۪`ba2sLu.8O tV+ zNQIB`#~#rf nib gRUR/&8'523ecFSf,9 Wc4KQ?sNnw(;&-4OSGI-OPT/src/java/util/FormatterClosedException.javauAo0 x))2;mKXqGfmIrxXa>ȐRv scONq="+% ~X'w&ehr/kҞt!#V"S|'ѸNgGh&7d: tCzl"б& 5jZ/\gp$x<& N۾BBTSL]>/拲Zg!A+~uqǛeZlUA8L RSx pm郓.Fn&4Fys^4<ˇ5*/Ţr-Ų ߊv q:Z;`LyETDo-r+knMh 9,Z=6Fɽ "+ʒ3vAv!j%θ\~TǷC@ȓJQ+T%9y7j<3^$oPK3PKK>-OSGI-OPT/src/java/util/GregorianCalendar.javaTr0<_d=L$f0i& a ɕdɿ8 iL}+ɝ#`B3n$:n 4L 5&>)8QL jK c1+mp%BRw[ÊmA* A\ u.!VvY)U*523"dt[Z}t6 ǾiG찦3 -.YR1w5u<UU ( ,HkV9-iZ dn #^PlLB# pDav"btgi) &a8 'cz;`|_ HQδlrn!BgavL1_ZiRTQK2+nܶ28W2[L u#OSGI-OPT/src/java/util/HashMap.javaOS0)a\'pkaqCZ<@2qDɕ1)wqgSlyON`hʍŒ`+%giԋ|^`;xv8J-RiwBGp v;SJl@!{H 9ǒ@jͪljI˦OI0 >PPZY#G}պM2GnOi΁_#OSGI-OPT/src/java/util/HashSet.javaOo@q5$6Q+j&r\L캻k;kMPg߼I'0Pv/0˿RP%Bl4:/+-Ѣ2aorM%*Kh 5BZI X Βzso lvXd"%HA7u@kɭ9œ]Ѕ,P o\~8l6qM5^g4eu$Z 4d8qQ3U) fm@TiOr^V6KPѸb/6=Y{lq5Ym:E6a6lz-ٔ>C:2|OyEVdk,iE%GSU#*Jo(N5 YF҆p]U.?hE^lE8QB(`+a9uYE.|ܠrAC:ѐ/$>T={2Zbgl7!  LVcXI-ӿHZJ,.>NPfVsoCu]cFswtc2F8mu,G^PK'5<PKK>%OSGI-OPT/src/java/util/Hashtable.javaUMs0<_d\CrkIxHa29 0JdɕdL9,LGUiyЈ0 r'i9KHx 29C vIYD?ՊԆ+ '~PSG T2 ̹@S \BvQԩX823ڐ|VkZ|V([ĚU gR]34MI`+PX֬rW[.chfXͧ E#YPlLBB{' Bϑn:Qg0z! G.q0 n .<@C])B#aJI&ňyDd!VKԒA:!3G#x-+_PV[2?\lJB$)dfa]g}orN-ʙ  L%@\!jt4^9 ]$nM|XZ=>UJMxgس%w̅bMok}o3&{ .Qrtuq=ad D Fi 2tkT)qMd(^Ws& bc$&28&ҞE[P!ڳ!:[q1AqM &{: nzIjƿYujpڟN`2H3W=Y=i}|ɉD+KYKѸWOh:҇vǝ+ޟQW K-]C VPKiXPKK>+OSGI-OPT/src/java/util/IdentityHashMap.javaAs0dq m<0I29b ɕ84ޕqhө,}$jge&_%JIsh.~D~^`ɕQ;,Z5B\?I7h4Ngbgj؈hCP;d`%>XH TZ#i\< u&#r n5Qa8l&-qdl9T{^%,eZ+t,DTȘUQZ32.CpfEm ʬfЋSH|$ m_/6^,20_x>H|_ 4]<2 SqoR## s9Ge-JljNڍtZFɍ$A_|a{{QMRU!Wɒ5I] &ix u^8 %>nSIhP򧿜psDce4lF y,5Vd-?=g/kx%<ǜxbŲHՠk鸢"u&쮍kPKh2-PKK>;OSGI-OPT/src/java/util/IllegalFormatCodePointException.javaAs0x 2Ԧ\BZO3Br%dY[PYۧoWJn"`bꃕƣ_ 0ϿHJI Bv40q"(!<Ȃ.oi- u!~uh#ץzq8[q6#k/Z+tNHy,\Ps~+x_Jmcq"uֺ!Lg=SwUZs;^ j*ĊYha,DesJ/u53k K[j0ro<6Ksdy<ˇ)[~?..lMsgw28G:{Ʒlv76t2|ȉj*ZܚQ*##d҅ku X% pPE<_؉RYQ(dRT uoV)黑OO <OSGI-OPT/src/java/util/IllegalFormatConversionException.javao0Ɵ/ڷӦ-Z*ń#x3vf;T9djG}G8Ȕ{+G7a}HBpxW8c3rd!ɜ%*$ &$FFIq NT؈=tXIE]NͦljM%0 /X.8T[[{_ 꺎EC[ AwhYZX 6K鼕ʿFnTc$Cu)ҬLlL8ttrwH&Nn ס]iC)8\I\ɜ[E% Bad5wFpFɍ7G 3[W^먬2OSGI-OPT/src/java/util/IllegalFormatException.javamQo0_q m}(ݢUA"tUMr ;w D!ssi)=YY=D$oO3$J59bv&$B+{Bڊ? ?:i4n9A0F`q2q6#;t,i~>gp $x< .hyBo$I8։h]-yCգV,DT2=-7K]RVn;ioZm@V5-bLOzlY`beliY~7q:6$`Ly" w;sAr-r'KNԄjNl#]c*(H/?AIq_ Kuݖ[R &˔Z{c釛CGOr@]CJ}x"&MVmW؀s`eìUzPKփPPKK>7OSGI-OPT/src/java/util/IllegalFormatFlagsException.java}Qo0_qT,mt6!Ys9A8_;MI~ZеRsPK+XPKK>;OSGI-OPT/src/java/util/IllegalFormatPrecisionException.javaAs0x 2Ԧ\BZO3Br%dY[PoWJn"`bꃕƣ_ 0ϿHJI Bv40q8"(!<Ȃ.oi- u!~uh#ׅzq8[q6#k/Z+Ts $x< Ny~+x_Jmcq"uֺ!Lg=SwYZs;^ j*ĊYha,DecJ/u53k K[j0ro<6Ksdy<ˇ)[~?..lMsgw2xwtonq6t2|ȉj*ZܚQ*##d҅ku X% :P("`SDxQݬx(`L)7v+wC'D{Ot*"|uKv4 +$CܒohctWPKn*GPKK>7OSGI-OPT/src/java/util/IllegalFormatWidthException.java}A0ͯx+нRmDآ=dnYw iwQȞ7o;piV;a9¢"*%. ~ˠtX#{*f` KҎ*" #(GNIqO0 AhZxC:l"sI(;:w:K Sa6^\pBû[!St]3qll%lLg=jEүVZxshfU%y;+l}',J:oWCȭ؄ -|Nux\a.iK]9OwcscC)8/ ak.HRneɭ56;BCv/]VǀUQr/ (9 F?Aĭj5GR &˔Z{c¯ewχ=ʽWWK7Pj^pߔp\E< 1K)N)~PKl;PKK>2OSGI-OPT/src/java/util/InputMismatchException.javaQo0ɯ8S; #inrNj: &C"$.de}3iHJrx7ⰍMP:lȑ=RC0%)G:U?R#J's|'Vd<̮Iwh J{tC:eCT(ukF^gt $= .0ڿBzxޛI},X:iZdU^2Xur~ur 0U)vڈBԖ@[饪pz{a)Ty+w5?&&icZd`lH2|(^!*^M՝ >Ul+]VǀUid+_B$x?qqesn#D&˔7ZjЃ'U8ENJZRY4OjR= K7PKݮ?PKK><OSGI-OPT/src/java/util/InvalidPropertiesFormatException.javaAo@x546'j&r\Lkv5E5JC`kwfyy'W03r#,OX0Nߍ!8lc:V vTY!U.27u<04 `t'`Nƣq$ vrEcNkf_ZnNO J3+iWrg}a2i6VrR{>O=芜 [q9Aբ*WZBMPZ1VY i~k $lIfyLןk<&UX fmN Y!Y+?ACt ws 3[q&Qwִ-D/PKL]MhPKK>$OSGI-OPT/src/java/util/Iterator.javaeo0Ɵ_)OIAַ$fZEꣁx#gsBV|}GrKmNV;i5ú&v"Los,؄L 9cV""Fj;BjDşdd 7Ӑ0& q==zG!X ޛm~w3<_05!}~vޛI2 C,ım]r]r-WyzՑs;.O*Q2k'h Z3`RVc #:m @VL%-bDflU`relsiY~7e\ƆS;/SDA$g5%@VqG0d҅:L' P("w%"n#ӗl!6Bxm?>9*= OZA,Z<=oPKVPKK>)OSGI-OPT/src/java/util/LinkedHashMap.javaR]o0}&O- i7hn&5K`;ͪi6ؾ{qoũwFka6<&W*# '~?1i KfKy Rf,hTNnMk񧫄&cV8&z+ F'blJ;4CZ"}FTҭs:^9p 5@׉?kq۶+)kǗtN߱JUd- laǫDͪ2bh DikN{խN2Յk!OK\5ړF A"IIzdy>Z&^,2/p:%d>Wij[\$đw2pHz }dkd!3FRo(vFZ枦|~'nV!JK(?v]/O,ڑKK+{#!^#<CQ*0(*-nҺ"aos,˚ t(CiuS̮O=rQ(DecPK?&>PKK>)OSGI-OPT/src/java/util/LinkedHashSet.javaMo@W|# NnmVqT KiFWZXE2b/2ZUFHQτ %" `t%v؁ZA*X`zh~NI+'\pCçڹ}w]=qMCgdӷLw*ւ-x0U!V*Eڀ riOr\' z3j݉iyM($9>%y^.]op,IL90g2g| Iv_:dx>6o<"'>  T݊[47͆Vˀ!'>^~P."jˠiWl!R0ٌ7®stWP!:J%pyQ'%!飉 {^9xC^/IRŒ(Jj?g+DKwohKPK PKK>&OSGI-OPT/src/java/util/LinkedList.javaU]o@|.bTмZVH4^K; !Q{ & Ryt?6#U OSGI-OPT/src/java/util/List.javaRQo0~^~ũOTno0 ]iNrI=8N ߹k- Db0jǐ$JIQlv1%#-,Ѣbku!lDNKW4V. )CCZ(B]YC7M/n}ӳ9t4t*@}5oӮqPhSMk7BPKK>(OSGI-OPT/src/java/util/ListIterator.javaen@)F>ّ nnmJԡ-jdWinw;@;?]p Kꝃi1u n@,owЇa6htXM@iVhb- 9@cII 0ɘnQGAk=BE  HBzD>'CN\pSu)F9GQCe9imt.UaA6h-ݒ#Tș=(69}xW}𠍟1ɯt!B j,Gu+jZuh$O͞VˀihON!\Q_D:jnBޖCSWXA8e>$ڡ,&>WDYNYOu+ /n'wN}dÔC$%p ,s?APK-ΐEPKK>.OSGI-OPT/src/java/util/ListResourceBundle.javamQo0_qT,m&uQH>8;RT:-C"~kN`˝ڡ0K.%Bep~7^i1'KfKː 2)KKTjInMJ7+i8D :Vw;]a#vPڡ i3*B7ekni) n[N`WBךnsP4CmA$3nUAJN Jv6!sڻtR}Xr01Kii #G+ N N:88{M5^&ϣ"'1M/E<'-E#>XmJ?)"!zgalI\Ɍ9![2$eK)F:_G|AxЃ؊r8 *BZdY!gWMW&s5ZCmA|ja V(}}p>=rr#]/C6dON?|l֐ ϯT8j~/ݏllPKHƮ;'PKK>"OSGI-OPT/src/java/util/Locale.javas8ǟb'OCM{5N 36itD| :oehgZ+dV|dCppӔS0^^\ܱfil B &93%S+X5 ZLPS겉}K䆧W,` M!I)ʄbGF`҉4ڎJx8ovJJ ;p6*<7|=U[숳V?8hiL!UƤkW.45eo8%g|7&;$;*K+x\_bݎ;Sc]QQ}L#UcB.3b~H?tx7G.yVihΉrGm|k#cw^㣸$5yqxN>㋏hz)fr%Nsf%}K~ t = -<5/E~,,}n3me __-u˅tVT}P8'D7u IdCO9e!ˈ2="6Ҽ| z{{l? #%}tPKͤ|-PKK>OSGI-OPT/src/java/util/Map.javaTn@=qr*jHnmP*r &D9lbvkZ;k Di}=;o޼0jygg0Ms˒3!y,p0sH347Hnx`Q]!eh3=X6\ ;@Mu.VVf[Be8%/)Ce ZjnWM)CK 0ۊns_uŁEaM&'#n%U\S"UKIkjXrV:յ斋F.m4:yZ DII]41]8y4N`:trͣ鄢oN!&=@Үɝ)Bx"a)wŒ/yFbB!7u 7VCsGS56GorG>?:aAeyy*% -zh?ƽ:ocaRHHXi֩ f6Lh: 1n&Zh w1ÊHG=bq`y:sȨnpnGAvxȟh{'ȉ8~!{^nkew6 :* !ܝ7Q(IK/En iG״Vmo|n$˒`Æ\7yPKO "} PKK>:OSGI-OPT/src/java/util/MissingFormatArgumentException.java}Qo0_qT,a}x(ݢu &ol*I<$r|sN\E'+ǰaHBda 5VA"G@ēiG%]ZwAIqO0 A5Md x4!RXP!5 {k9=%8c0/X.x/Sm*Q%wlu?u9Ki9QBlث-,7ukÙo)Vn9K&4i,sg8@j.Ez )s3!h*/"; #|c5tEPKhPKK>7OSGI-OPT/src/java/util/MissingFormatWidthException.java}Qo0_qT,a}x(ݢu :G\7cgC*C<$r|sN\E'+ǰaHBda 5VA"GHēiG%]ZwAIqO0 A5Md x4!vR豠CjPZ9=%8C0[/X.xk})IڶE86JE뒻l6_캟׊ߍx{U!UBTxϛີK]ηRy+U_k4G9ͳ| luy&]:X0[.nu\߲ĕ9XېmP+"'zeag.\Mɂ2G&{.|VˀQ ݫ7AIqϿ8RMr(`gSW/~zK<gJQ%E,|&$sn#3ͿT/ a8G(PKJbPKK>4OSGI-OPT/src/java/util/MissingResourceException.java}As0x 2&ZN.'I39 Fr%߳%ZV\a뽑ơ_ 0ϿHU%*ht=? B+-2dv ɂ"!ĵ(ӝ 񝌕Za^wL^7؊=vh,Xˊ@ORۺCkt.^:r5BAs(j6GP2NZ%Y3uWu*~5pfB,-( Ӟ5IUaڵYI\6~3rsM(Iç8O7yH_ (OSGI-OPT/src/java/util/NavigableMap.javaTN@=zjAH) u88f]DUI  G7o,<8 U5/!LFBp&Spx=cA, 'rS3daT WN!וzNb*X5He2H@>XZR,;k5O}ˈBI)L75hfp^x\wn@c@㟊k8Y+U*X J+4R*rY`TnkdX͓> #@1 Q a܃o8}'rLop7F<04 4{ѥHQ|(lrgEYUkɔ4,*V jZDP^rj`d_rl5x b+TSҲsF؊.ҟ<ۢV+Mlm`,^ ҟ!v[244I 1@{cε÷yB)r~w2]!QJ et:~>Jg`GD*TZՍ4,W܃^eަJC(OSGI-OPT/src/java/util/NavigableSet.java}n@S8ABOmJ.qZ0iiAU߽`I8?|3k/=ja>y D# ɕ0 \Ni`X, `Wa#rO|ڐaL`h0v[ZlVZAJccjպ:]őc2+X.<=8w]qt5{ų(IwLW[UNht6)k<&j)i!^~/!\,dG)0'72'B<8ye&`Lr"g#s*)B6kk2Z FҚsFc=rF?F%y5m+mYԥMĆ*3S[ s Ry7"I20~.꘍Uډ 4S7?pb^jzaZ2$}rtZW/r)mRugE4J[;ч6{χ]vz}{yz?PKW7zPKK>2OSGI-OPT/src/java/util/NoSuchElementException.javaAo@W={ͧ$!'X&iZdU^3uZr~r#aJlh,q@=Xjpza)y+3?kM(LY9y06ַܥElUb]`ίMi~Y~=ȸ=:`Ly"J7;}Fr*^4F*l']Xc:ش^_}BI *2GL벯:R~u~s9-EE1OB;F.ԧ(zPKd9PKK>&OSGI-OPT/src/java/util/Observable.javaAs0Wθͭ:i4c,X)$L<0N ڷO>,YnDTUR0$OSGI-OPT/src/java/util/Observer.javaeAo0WQD75i4Nڮm cUr0gW\N鋡`]m /$]GBV:?l" p@f:borOJ5FhQo%%& VKiY\@*E uRv@*u H4xxZ+z ; pfJډSz4H!XոQ65Ygݛ2rJ H|Jcz?19 ˳>C=4 92>_0&8[ Bf$*nMhZ5h4gZ-ަ39ᦥA9FbQ層 t_rC߼^_AkpoO4+al)~PKYPKK>)OSGI-OPT/src/java/util/PriorityQueue.javaOs0jHn-v\B[O3bLYmJ2ݻ'iK:޾{'PkCA;$DIIBe~ | 0L-C&x%e,ΡRs4Q)2~43]ƒVpfxZWkPAed!'wHAec&Pi:u AZ8WqMѓ;]8fͪ+%Z0"k%D^AAsڻ 9RE]- z̜3V G\c ZQq҂Q']g'W3h@J| x,8qRm&^$T}4 ݠUI9(wy?2Z"&:ѴGOy.}/#pL{o5}//PK>ͮb_PKK>&OSGI-OPT/src/java/util/Properties.javaTS@~.OЀ8VX3!X,lr]޽ QkcoqjЂc.fA<~s&~j: #0BjC (4B?e=JO~\ wаz7{b!3H4i$ac 052IKi97"Obu!'Q@J_u 0S.1N'sNι{<1j d\QœTlBZcT"3Ҫ7\Dmrjr҄\'hڃF*}@mc}\_-ɕ;>.pñ;7D7lΜWK  %p$֠uuΘfU96]Cwbű )b{\j&=3 $4MjYX49L Y d1d{"\򐆨͒K* CȒW4% WxW&)3oPip,J&~]W%prVC˵=NG! ]Y:-<5JMO,Z[H/f]c+X6b}4\s }_PK@`fPKK>.OSGI-OPT/src/java/util/PropertyPermission.javauAo@W@LU566!9{#Tu7L%3rݹ7ad PbȊȋ2OSGI-OPT/src/java/util/PropertyResourceBundle.javaQo0ǯ8TeDӬC`tUr!shTLڴ{xپq`Ն ,W⺖Bda86>BW!OSGI-OPT/src/java/util/Queue.javaen0)F{b# T膶iucl6KVQ߽]&*x|2K*}4|;5!lF@woC+-ThI&١GH5kd"r%*@ VKjG5Ȏ "ip =Ԣv%j gQ$h1*gt@SԿ,ӳwNOycv"qm͊:{C˩;)Z0k&n4Q!VfP`rNypUA/q o&ʴ4IX5 >u^G^>}-vpVUZ򬆲mY仼,( i&$˨>i' L<"ԈzuF[FAH4[;/#s Ov`丸ԐC3N!Heg[%? WhHvGfp`f3pYƲ48@>PKؕiPKK>"OSGI-OPT/src/java/util/Random.javaO0ͧq +ҽuaZU=8$5vj;vw8 V&od|\jygC%"!8F@Ϗ-) Ѡ^c3yJ92G vU,~g_Q$\!N0ÉتVl RY 7Pp + \BVUpl] <*TV ->M%.ǢӚC|};MnuQ 44-2` ( H{V9Fse9 0&j$=#~,ؘA@ *JdL<.fsMoE<DgOoF݃J8)BxPTgԚ,kV"jZRGP^qj0w6e]zӗhyOgYP[.&^U!dٜԪJZ%WA3_ڬ_w?WPDf:(OSGI-OPT/src/java/util/RandomAccess.javaeA0QNɊBvO4+ ȴ` U'TU93~&is= A6 $DXnc& PN:'lV"$Q9laR-ZGɿwd аZJ]8 Fq=LYt4 DH=m&YT <ω'puCS/Հ΁_YvܜAaA̠-"׼Գ%ObiyK߄n؄UVC^SVuDOYUe!PV+>CV<÷92/I!+BW$gPRG~=BOh;v$1`d 9WF3'LL GiyXOw'PKSPKK>*OSGI-OPT/src/java/util/ResourceBundle.javaVmo6مk;aV@uVg[TIʮQ(om%0l<>s#/jz*]j>PODo8xBp&Esr:K!s x29F KYBL~Gmp@SgX fl RY 70$Z5KKj nr?%cJ 5-Hmm̖ϝbhqKi[={aIU7R1s5EZEӉkiͪ;wݯweߎPGT@RhXFp>AXɏ:?x+{sjPK (PKK>#OSGI-OPT/src/java/util/Scanner.javaWMsH=/'b[ި@ 9q8HΌH*}{F2Kd`ׯ[=oFf+œvt 4LDwK."5Pc% 1"FfXDN\ xжrRd3! kfHβRڂSX%c( &)E1nwXx)JivI˨"EA9WTx,#U֔-@*`B3Ҫ^(nH:,BKsmfiOM p cIïz6n~ tuw @jel$vwB- YHF|#*M$9K9G%"P͸UҤ| 3ni.jQXٜyU+B߂ 8CAcvKVRD~(Jpi3_(%%a3N[7nvTo8Mց] vkDD6+uׂW*fqM;GFSubu+y.yLS&5zy&0C& F7$EWi@sju@dG.>JJqXe<̬B gK".歘T1Gpxy'?| aTZJZ 07֗\+]*YՅ7(:x)©T/ɴ>r~_[㼐~f&kzP\y/~QQSya#:^SGj~`h_kK+xǐj[yۏ&xbaM+ ǯœypzv}f|vH\[Sp=?Nh=)ыJ Sٱix蝹~J}}WYxw{̛pq߭PKKPKK>5OSGI-OPT/src/java/util/ServiceConfigurationError.javaAo@WqM7^ߦe/?2S Y C:ixeBl= qiO餪CX]^6m^G?o؄$ɑ|I4}>Yl.sXt2^}E=G݄ ϡ S8OBOHBVT݉P%_e4r/p֛Aqpο/qQdsݖ#D&bBJ֝ܖhH@i)0:,g:<+sPKfPKK>)OSGI-OPT/src/java/util/ServiceLoader.javaMo@WrJ`AI XTT=ngakvv3iSzCċ̼Dps[*wrTk%DfSIǰbO+,bR`+%x,6:;8g0f`MY`k؋HViXPWZ®30 v i{" oB>IڶEG[W&U6\oz6jDETRlUQ:$[L:)6!6uxѴߌTM9d>yOY&[]^&]:arq傞>Cob H-z3<)`{~<{`Sk}O%+Mwg9y#쿊OCƶ835MyU:~vcSr(Hh%-Lp vhEt7ި+p+j`xEEPK!cKPKK>OSGI-OPT/src/java/util/Set.javaeo0Ɵ_qSRemk5نVU}4pu&40Uy}&-uyJJIBam-:lbv&wTr{Ԉ?Se ?: ̃`6f`q08drВDRP뽙FHqЕ,|})'{o>&88vll1)yE(_! RͣnBhO\VǀM'/i\QE`$"< Giy-l>1Gոx:4ED/DH7?)k\TO,+.znp/PKx~PKK>*OSGI-OPT/src/java/util/SimpleTimeZone.javaUMo@=_1k>F=@[$i^m](` iC8x͛ڦsԀ#dJda)g"Dhݞ}ܶ2xCrM dC #(DYH?ՎP* ]h@jO *+`V 2 B b"E. y%zS%p^qd3Ψ!xLWןN,KۙL::cw0示:)*\ XNB6#)+!3\sXXLҒ }V#YPlL@]2$gnyzy$pG>L=L'C7pHȥq@2ss#H$cc5,AH%JA G"IkK7|AFre~% ӓF^(BSF| 0QDjƳ3悥Bdxuwr74la{`gxuwC-\2ٵ6MlOGIyr plE]Wuۺ:~Rb}vnJMYOPOX?T )n+wgY"8Uj&92kq{ 1K,3ϖ=D)Udq}ͤ~<nFPKgjeuPKK>%OSGI-OPT/src/java/util/SortedMap.javaRMo@=_1Ɏ(8RQm,'Q x[Kw,uJU9Gx9TעXXDu-P +i`E􎊀ɝI*i!#i#` c0Bɕث,C(EM@/95\mAZ'즯38%Di)^^>)ZdSX`LnuLQ 8xd\^:`EHN$ 4RܚZ*#-#hHoqk5,p4 w՗+z#; Z++i3!O˒.*͝csoX%Y#$3h~e- G 3 ء5дC^Zy?PKBPKK>%OSGI-OPT/src/java/util/SortedSet.java}RMo@=_1Ɏ(8ZQ(-ޥUwVp`wg޼y^zp 7 WQz>g3! ȐQ0#IC%t$ vCX1z|A%:&k2q{ sh蹠ւPm;J yFF[d8r@˯hG÷}8(5},~ǪǨِ1w'4W[VU`ZAiZr{-FUGMjwi/S %L l,|G򘬿-VQN +X,ӻd,S~}(}Izq8=U2kaIAi(4YwXjGZrEВ jX`h`.(!OSGI-OPT/src/java/util/Stack.javaQO0_qԧui4)nZ) 65g; s2L*drjE]"SJ ]1qc,cIܞ);DsYF̊4($ZL8@{HTHlʰ]" {Sr 6/~ɤmTtĩqD=i?2 S:" W-Ur#+FԄiNKn'}Fɝ "tGM{F7b/&Huئ Q)dE`F 0*gɻ~GKcqi iltgcKnz0?o3셛C'u'+M z:{IPKinPKK>+OSGI-OPT/src/java/util/StringTokenizer.javaRn@|_1SR'!6EI88:w'TwiA[w;3;Q#rkdtf=LOQQH2Bd8kvݲ.UAJNn!Jv6!9]F:>^Z2sii #G؄B'J'|8{xyr9U4FYgḑ Mi|)8w[DBB,ْ2GSy%rBd'BIf%_es/Sȕt5WrF 9zadqU#DVvpp-)v6iEGJ8RՊL]s2wV@ `-̰;8}t}H.Wϧaޕr!W)qKajCv(,3h^DU˼65HOPKqn=9PKK>$OSGI-OPT/src/java/util/TimeZone.javaMo@Wr@CXIa0c!41|,;ϼkwp':_4D})y_F>ˆ,MV""!ei 7#Ou X]hA%V9@i%R! :܁Py^-u*OW8p䄜.?37r $:rk;0>}Uօd-QOV9S%8aVK03K#PYN yΈIaw6TpЏ!]? g.Q8OcFp 8=W1@lסSx;SBH6D"TV`FANf.eb.҃|N>BpA5bNiL$q,Y+*AiN^$t(Oo{{}'Y4UP(z'<~p{:$>Fcnc68-׷ţ7*7Q\aBUmb̳Vٗ/PHA8G@#C8mc\ʝݧ|>XH{}2Y\j\'7DkI|X*_`?:`YF%W]ju\^ԫUw7U|wpYhw|oƾ6y ~7qO&Ei6B p%kHUrz[h1=E{87I<'s~JwFPK/)T JPKK>!OSGI-OPT/src/java/util/Timer.javaMs@ p 5 434b fuw&^qHs>^իG{W\XCA;p t}m+>zUU&{򨵽x<%LT*ւ%xuQ0U*V*Eڀ riO]r.Xv0m2ЪtgKȣ xmBA+J NZ)JM"-iI3>]C4lqOy !ҚRMrCx"(lj06䄫CKGrWL-=h}nwUdab0˕]Xi-˧u';MwG )Eir]iG'ϛKa>\:;D87.51[p2K'PK=Fu*RPKK>%OSGI-OPT/src/java/util/TimerTask.javaeAs0Wdg\psk}23@Q* O+L3ΔO{(6ڜh|⻀TJG߮V@ϋ8lC:I! a т? qL%BVp`fSiXc'PC4FH|h<\wfB?L*& ]yF F`~K 8ֶM%f+zzPzaqufX%@[`Ey+Pn,Z8oEwc$ S0K Ȋ|MXǬ(1tWf9l;Z}t?"s0E@| 3E#8YSmZV*rm'\ #E'<AIQA7;B#W!L3KFЖ=ء7N8S>=|p]+%R<\ 9V-*ht[m{y,빕 C( PKkKPKK>5OSGI-OPT/src/java/util/TooManyListenersException.javaA0W<ԮJR{ %.=45j;6hw=o|3vr smNV6;q5,"gwS~cAP#{:f`)G5:UR#* )uR+\3`4F`q=:G!%б"!*7Z/\gp $x< N0۾B7Xcmh]拼\e!N,7'T0k+zh XׁKLRVn:jhP%ri`rָO"٢Ī|fl_v q::`LyED Ur++nM5h>U ٽtZ{?W(Dg0!"lo"mxZdk uZHY@x#OSGI-OPT/src/java/util/TreeMap.javaVMs0=_Éd\CSL2!LQ6 (+6ߓ`(Oo[TOKp 5-T?8ԅLFZz0@ )|bp$w&G ! F=jH>4SKT-Ͽ32?\\$B$)S~=\\r`V`RgXdWNPŕL/:~C(kæ|Kҧ\Qr;IfifPk}Sk{B C4I&~SZ=ϊ r5T˭m%D x[Ҵ6@YrAge%dP@娬xc)xxw]XЖCл;*PJ]|Hv! Fmx*%:; czb6dEucjv@Q)\9[c%mHߝR.>Yúŵ>9F1OcIXJPK$Nx PKK>#OSGI-OPT/src/java/util/TreeSet.javaU]s0|.'PCҧ6v\ⴞf &QTH$L{O4aB'(3"t0vHc4yH.x`P!K^/Ԇ+ :ЮGT%P$n`ަXXR5/ji>5S5J,#8@`zͬ->UUylS:5/aR]w]Jƀ?%4qV%U k5JsebMƍ<)ii]$¸ 8{*]Nh10Eg$Et~t ?H>x[h7u#I$S`ʧ OSGI-OPT/src/java/util/UUID.javaO0ǟ׿ԧeim0M hvM{pkzñ3ii`C:C]n +Aփq `?~E~&^ia;xsPY\@hRdמ% @;]A!6"{%Iΰt@ 2]-ZMni]< \zZ>p-t[9Wu]G!rdx:JO2u5S?+2\|dL̙U3=umȑCzja,:C4펑K( 8$q&iM.l di ǣdG:xt I-<OSGI-OPT/src/java/util/UnknownFormatConversionException.javao0_ *6N[ $z4GjvgVC"?& &>ZYm=D oGOC XÂ=1AhtI~KHkQ['Y'm?[/IҶm,ΎccD].y&Y>Ȯ]+9XHˉG]b^ha,De׼ [+l|+,L)r7ѯ\9iy̖%"-i.[fΞ# A\CچlS:/9 sj*FMWٓ՜5ٝt:6X;?OJ{~_b/K5fP67v'L !:xҥ{ęRT u*|>t1gV; ;'Tt%X (5):EPK gPKK>7OSGI-OPT/src/java/util/UnknownFormatFlagsException.java}Qo0_qT,mG:[,ι(xg\M?-jZ .%PK;XPKK>"OSGI-OPT/src/java/util/Vector.javaMo@W8[K%nk5 DQbae]CHYCHC9}=;v0TFB'>q/g2F']G ) LР^aQ( &5~.\6\I8qv>Òm@* A \ ].!VˬB[s(TY T923!)f+⳰6kĞ(wQ'K)':meD 5ҚUzrRf],;ՌzS@1 m?0j? KrN/pO&h'0i8WG7#w2wv&wvSq!U%0)59aV%u%7nF%g}BV|ݲrŠ3b cYX-l?#[Xl/p-D\yjwQ <ЄZQK?KwVh\Z6vX ,*[ܢg֞3˜tsQWat.TN}~=Pcx,IlEOEEm% Ѿ4wMS.s!wiUF>' js}c 2_.pOND:qQV4SJ =*K] wbNʄjОmRq˯ZA/TEjPK*sPKK>'OSGI-OPT/src/java/util/WeakHashMap.java_O0şOqԧeimmʠJM覷GjgP~]44-{|OR#C7aB gi~E%yVf,Q9%!.EƟ⁌Z,{(PYbi^2*BWeVKl.O9rJ-ns~H4đ6yxmr9ÏL޺WY C*i8lQ2U&fZ@䆸洧tR!^Z6si #G?؄B'N|$ c2OO&h S'i2;nUqz)Oҏ/"%:BX7$[R&2h*DND(ɬ2r%p_|~𜟽OQdqՌGLHZ(/n‡/HBx:"s;B+RP^Ż% CbQhѬO!?tLN͔őO4Tl<%fIː`PKbVUPKIG@"OSGI-OPT/src/java/util/concurrent/PKPKK>>OSGI-OPT/src/java/util/concurrent/AbstractExecutorService.javaT]o0}'X`}Z(ݢU tUWcg }!mVZ$>>s=hu1bpmR 8B{~ߎk1Z4+FH.Geq ^Mр[ 9St++èhVKQhKx!,̄D5܁P2-:KP8FpFrzJtY8vX8fޕ[^$0%ծK%Z0 C'`9lBZ%+@`stP]ᄚw+@31Ih.bc q Iڄq@rdG\q<̒A 1Gó$KFCz:xx _Y":Mp@2EsEHH$#3ɚ{6GE G6Ւib)s_|BFr D؊E q7;j~BipHm\=Ƚ&#.i}.xSj-8;a?[;o'A:.Gd_K13ZW_6y{ ﰌR"c\֣{XGV~5i~B>c5{< E5^]PKPKK>9OSGI-OPT/src/java/util/concurrent/ArrayBlockingQueue.javaT]s0|.'q MbL}!!RR[{{G-8֚3Xdz]'ahP|9J8Y;G+OԆ+ Qh7KΉX+K,8 \ u.!W˪Vs;iXj823*gnmۭ:bőҳǚt -n.@c@/59U*gS*X Ji5Zs,J[3j>uIh6bcqiֆ8KГ\/ \q] RK29Y3f3B-Tm5$4/ev/ߨjQ OX,QdFiOZR F"cL|A;tx| ea)rpI (C͙7~¿6umi ''+4 G[ڔoliNKݫyBhl1aI-jfla?*NʇXTY]%A(db—x!mRsfRIR&_tE$tpp-BP PoMWP9|OG㒦|\nKf $`/]PKXPKK>4OSGI-OPT/src/java/util/concurrent/BlockingDeque.javaRKo@>_1Ɏ(~ZWHBZV(zwXU{g1>23k_pWJ 7'a8L!(a;-ТaJ%4DnkVУ J,7 `4{A*E*.@K(VZ6OCrǨрSuk~?mNqL=^;ME%ԝh-pC=0M VZPXmjNyխ:*27YhGdbcqi68KЃܧ˻5ǫUXI\-:].t"#|; y"d$T j,x &ڡ4-~F-wuA@9?zlǢqJ1(aZ qvbz.EgvwO>ǜcx >w#|Я PK! =PKK>4OSGI-OPT/src/java/util/concurrent/BlockingQueue.javaS]o@|b'QMԊ8El؍x/w0:j+Ynvvfvp 37 a9ECҶ!Ww,,#8EO!DZn2.fXf>c&<}ChqM=0EJV֖u 5F#YUw[.m4zy^4C|WI'V&e2_ei%l-| EF}Qidr!G|%ϒ’׼$kqAh GPoc5$4-rl_$(Otv,vq)EFa/ JkFje@:tx'Ee='-2,o {W/{,-옞ҝP 4aV25mK(rp#@[y#ߙ~&uVR5xŷ9SZvVNѪB:Y d/#ώgI^rvpq|C"G>=OSGI-OPT/src/java/util/concurrent/BrokenBarrierException.javaQo0_qT,a}(ۢUA"tUs ^UfLmJC"{$.03Ѫj1#, i]+%ax9|_Gq2(!(IQVd᷄?}ed2 *XM8B{( tx( ivM)=ӻf74ڼBlo%Iu8VI}ֺ&b[]sU SIfZt05ougWÙ`S*Z1rbiZd8e2Wټb"V"w=~e#sؐ1UQAؘ3kHMWٓ՜ ٝrZV;?m+D!{^ձ4Z֒WQӮy`ȩ5ZEv~ODOtgOT/ ;[PKUA=PKK>/OSGI-OPT/src/java/util/concurrent/Callable.javaeA0W<ԮJREH[ bJM=$5f+giW37߼Iv cN5`U}UV - ~?IcX&ODȽ==9!BgL%ѸMgǂѐMQl:tXCyԪ%г$49Wp3D< f `T,9`?dY5Y{}X-StKѯN9xwL%ŎY[8炉ԽSAf o GQf|pjׅWc_mBcW(>UQMcz1_rS,+XʻbSJ>}A^>{QMAlg-"zP+$U$N4ƜiQVπ(Ӫ "\BeI>B?I]Pm*s<ݎdZm;yxGOPK9-PKK><OSGI-OPT/src/java/util/concurrent/CancellationException.javan0DW |WrsksRȀ4ȑ2[TIʊ߳U$A T $ov]$ܶG]XN*Z+a$a|9}'i**=VN!(ISv??ye .Q0Fhqc:O8›a6a0+󪨦X[ޮqVy.+̗u.% /( nסb;SDEakH%Jr4t!4@p"DZzV{D8m+ʒ+vATZ#;Ȅ6MH-rpq?DL+-FKӋ1y7g<#K©͆OI PK!FPKK>8OSGI-OPT/src/java/util/concurrent/CompletionService.java_o0şɧS; !)&5sm?ͪuyH߹Yg0Sdxw0&(?sȄLV<z$7,-#r&7Biq^Ѐ#dUvbؠ\IH0Ѱ5\p`'ʁHB>Tp :n\ jд {iڶm:D&֦7l^D=ZKւJ=DU- ւ2Tn w\61XU 6;n[5#E*1 8/ n2+Vf*_勂Vאw5/b@jmB䡝D|Pjx+&FHJ́0VK`#;_ (>oH*%+o JwinRѨga,Kta7/OSh%Ę֫tBQ#3Ed2^xMӚwוh]-ukfQџ"x]}c8~uQPK L KPKK>8OSGI-OPT/src/java/util/concurrent/ConcurrentHashMap.javaSr0=nm2鸄6LX! {W4ؖ޾}:tu6b6wM&?DR 8Bn@__GZEiH RpTP)ps(gN4Vh W[执Xl J;(, sB׋n^X8tJt;mVUJš6`m2I3DkBr夊Jm Ҟ^',3b=TXgDZ=k$)G IGI&_ pF`;x8 n@Cn)|)BBB7l\d55+ ah9BX?VKFp̕K|FZrDwl rxa *wRˋ.n7._LȃC5{ QJq1 TX4IO*8==>U^i4 P̴ * Z|7mj?ؽSZKdB*ʟp!ߙ6 c <OSGI-OPT/src/java/util/concurrent/ConcurrentLinkedQueue.javaRr0=)'4N2)ey,U$#qNUjmy߾}G'[KC_`}&H"%Bt<~33, 13K-BR ɏ2h JYؚb xh29(I!if]wZ%(^0\pCͧwhԶm,cczĺe:βkVu]i΁ş YvoAԬJ*т *\&n-y)}+,7Yh5c&4 Ҭ,͆:]~_-:Y,2f0_d>H|ƧOnk:rd<jL q>n2gJ(($tՈ 2AvM.ձ"(Z~/_a(8@ClDxR4Z6֢gQ&H%XP$}ŷ4OSGI-OPT/src/java/util/concurrent/ConcurrentMap.java}Rn0}._qbm4نځT}4B۳Mh4wMXjxs2KX*}49WI &9t1_@#-Ѣ9`' :YCH4㴌hP0Kٵ8R9,P9jBW{=J sFGU:FpF v9E9!ؠ8Rwrwz캗-Z vL*JڲS^uo ̠uF{_d@1 HГ=OSGI-OPT/src/java/util/concurrent/ConcurrentNavigableMap.javaQo0ǟǧ8)֪K %RH[A۳Mh4.Q*M7"< Rm4fgQ]s&rh8< eA" QDpp)` zVopm@H Abp%9Ge JuZn>)ǎ!3(QUvZ! ۶ Vq uֻ\INޒNh hpMg`T,#5kAj`Fڳҩn5\T>Yږity~i6&=q;C2[C4G"0x\NjxD#L$˨>+& ٹ;EH$r'(ysMT *F-h"PWܸc5$pev:5 =|~rl͂:ȥQ O5IY%l&l+-SS( :_{oz,@C)=bpSX3=2)kOV pCo 7MtJH; .SCđ?<'PKR+VPKK><OSGI-OPT/src/java/util/concurrent/ConcurrentSkipListMap.javaVMs0=_&MOm2P(LX@\IL{W|& ^޾}dQ{]̈AC'*.`#TOON@CϴEfp#z8O衱B+8 OGGgb3( H@H: py3C'Q:) 3r.PMӐ k2ϵVԸlǗouZI ̄XqWɦ Azg=5 5 ꁛ2/3"܆h zc#T8 7շԻz*ӅF9:m-4$:x^|#nP蜒MԚfl04:XX?VKFpCOj |~ 3'dȵ1Y%RdD|߉E|gy3]PU߮UǴ:&/? † ׂ[6\y*H?Kz ;VUrf#،DL9ԩ{ڐwam/3\,BwjsԠˌIyK"%wLzCh9wbt紾6F?bPJr0NdOOKܚ@8yAE֦XO!#h-N{{d#:ѱfymnoѥS|ڡ&z C-y lN_J!ZeAh@-Yt..jpL!÷@ &-n1J&-,~O_*Ym7a EӍYoD{T~PK V PKK><OSGI-OPT/src/java/util/concurrent/ConcurrentSkipListSet.javaQo0ǟǧ8D'hڔt@"tUslV;CAw$5x ύ&W)8i@ϴ0@fj!j ?XmhzU?:.`栴"1x1w p=+ip=+늡S(сVD`L?ZeYl8&kemuNKw:u$Z PXN8KId%h,3H{N{եN V] zHXgDZ-V) II4=*~_* 0øߣkΛd݃L\v- cdsb,8eQThZ8)1QU7XP8!/ANky%#Fr#.y;>Qn0” c|k)r4Iq;\F}QAGjf"w_{S)۩q{-%ru1t͌QӜ!-)%дU8G!hmF*VXq5ܶEivIm'[^lwjPK<YPKK>;OSGI-OPT/src/java/util/concurrent/CopyOnWriteArrayList.javaUMs0=_PCrkI%nif0i&ATH$CH&+`۷u}CWs7;t[@| 40@zO 䜧( fP 5k g)T;-p%jyp(檀 T @s \B&y%muyNUš( QVϵv{6T+=nִϣn؋ )d,'U)KH`3PX#YT4\[`ΘFGqc5O bڣFJ ۘfC7KGqˑ\F!\AFa th{zg-@\ H&wv.1⊄ZH29|SJM 6F)jIAz+!|-ҳAF|nؔOL QF^$&Hם}yIb5+'i'7 5g߹:NJbm:OSGI-OPT/src/java/util/concurrent/CopyOnWriteArraySet.java}As0Wtzv`LC'S:=*YP$#㦝wViS`o$2gRV#O7CA?"*,0:hrIm5vxUJˣ7􁜅t (u[Y8v1Ńl Ɗ,h:x\" tnJJ *Ymn-sn4j&U-q|920'Y1}-]Օ5xYīJZ Q 8({"uɖCnÍmӪC(я26e=y1&j b͖&E3Y}lv_PF&}1`R)BaB6%-kU"nJ"(c 6vĊO劍FI"sJk&jgu=Z>Kz%m@ƿsneyd`p䐭d\Js'p'~\Z'e=U:&>&{=^-k޶ȵ`kcᩒ,C;<֌!I~PK?GPKK>5OSGI-OPT/src/java/util/concurrent/CountDownLatch.javaAs0jHnmN. `LB,f[!ge L{Hz'C_`Q|#Ȍ!e5Bf<? Ҹ `7(D;hn;RZ>]e?rn1cC+Qjث#XP %O+ݾ];S$i5+iWrwc>FMӤ%N/GFwd6/f;uo *jT΃*=J]n<1rmQ̆{Z|X?oؔ^V@^KV0<4OSGI-OPT/src/java/util/concurrent/CyclicBarrier.javaAs0אڜB[O3emd&ʸHӴr0#Yg06ՎX; $sht< " s0Ge$rP%25B\\J_- ^Jؙ6j8-YXQ9VHCn6U֐[}:OɜVBPnka4j#ŰnptLRa<^'d69^22郏I~[aeHœVK4]Ԫ@(YK"7dZ\z6k~ @jGęePՙLR xJ1X=o~`>N4nM N{j@2iD;d+IzJ@/bt5k]>]o5_&CS.?2cJXRcR]+ PKOPPKK>1OSGI-OPT/src/java/util/concurrent/DelayQueue.javaTMo@=׿b "אDV+P1iba˲;8Ec޼yfQG0TFB78!3#tO]/a&hP|9J8Y@+ӭJI4tPw)6m@* qp%xceKժj.:-W7-YFpF @`\ k~]kGJk_a2ʒͺ?l"U9VjP\#Ŭk-*m4zg=jwdЉ3H\Y:~_M:L4M2O`8]t<nK: 2L|"d$A0%ϩ59wl0WkԒ: ?VC O#[fO |^zl"gr%s5J{TnFnB.D6:5J7ݝ4|t@%WxP^`S+ɛ&N^Ohq`BQ@p+8-Пyn/ ˖>7PK-PKK>.OSGI-OPT/src/java/util/concurrent/Delayed.javamA0WzjW%){EH-JeGיIjgiWllyM70Qg iӐ2a|;'qXuPzXGw2`rO:S#v'k68Fhr,ζ: G 5x2m/ .c%r%̪BP<@_=s!IՅ8N'|˷B=TmMރ9xw V;amTց@;b2WMI:~?Fi@bSFiY1i`mxH4dVkEV̾@?,_L%29O &8 ^|*Қ;U#HGТ; 6 _+D+TGwLMѝsh.j)1JU/QgIOײ@=(W0OSGI-OPT/src/java/util/concurrent/Exchanger.java_o0şOqT,0޶Nm*1-ؙw5dUmľε=Hp+S*7]ôUZ]~K4f1aFV)+D%I;Z!Y !OcA)1JƄN.lxG֪"^R4-ZTU$o5 Ny"oO`4M*Nĩ:M~5Lݮ9KxyJ%V%yeά}#,Erުe/?O NV /:yя"wvl6&|\`:trG_M=\A2CFb;ϻڜ\MRdk $fGV#dmu 2*/i_ I?iJ2XK_&uXr7!+p]pL޴nG<).v4\,zHsPsgǧwCU]ߊ}T/_YHjKZ3OWLp>$#PKyPKK>9OSGI-OPT/src/java/util/concurrent/ExecutionException.javaAs0Wdg(89mfqQk-TI{2]aؓC[0b=}o" `x /YӐPa|5^$Et@vU$*B ~!3Tb֑VpLaFCi4V@iC kjp/x Rò֑ . ֧ ?4.=qm6^7gAut,jra*)VڈQ[ׁI18l*rҪgC{a <6`#y|u~lȊe>+ayq/yϐ-/nc@{cCƤ0)BxG$gPҚ$GSu+jZ*N\8VǀUihK^כ\a4x?IIVLilC(6/A@*wT3V{ajo <3ո;aG'ˍ]Kr?g( PKPKK>/OSGI-OPT/src/java/util/concurrent/Executor.javaeOo@S|#ڜ㶨izxw*߽J3o-M7b;xlyߓPa~Z}X?.X*N:С=aBy aA5hr#$~uܦ+ǁԚ-E8 (!8d rRg)h&a)}+%@^>_rd|b[ BHΠ$[S]BOh;H.^c&t$/XW<(KW)N" Tj%]bž@OSGI-OPT/src/java/util/concurrent/ExecutorCompletionService.javaMo@q25$6Q$j*D9.`Yv(ƴIC#5;3=Q,ļ TJGOzC; 0hѬqB9x5Gnӣ +qh5[ij+x!,,D ҁPl*uF%]gQ8OΕݪV']?DdMDkw/ u<+JV6 tpBz*f0̅uF̼{fڞZ@14,oEgy'fϣn8NA1Glvd YFupSa`!G|;$[" 5UxV zFQGPY 536<#a =գdz!Wy:Bǿ12)iIR_KMCJ©sK4%rh/iG~o%~FR{rGxӤ1iLP*mUV=FPK0S_PKK>6OSGI-OPT/src/java/util/concurrent/ExecutorService.javaTMo@=ǿbD!V#(6f ;kLK MC*w߾}͌{@Vkŋ?8!*KD'm7t0qH ԨHnxBcVeRi:V{(‚AHV#qp 3^"*EJ7,N ܷrjm fZonL׫:dPWnwdTnEZ¯+r<]HUƦd5HPH{F:յ↋"-gf MεQ|jͣж.bc:QqҁQ'#ӏ$0U]C4O*\U9 Ź"$$F035QXV rJ#P-ve$0w4%_pL]<}aKZ0"J0g^e&gPzj9!E`M,c5&uZE/%_2|9%>B;mVTaӜDz;|7TX K4Y/@%fiV* '(ˬ[bOMW|Tm;5u2&𻏖y< =Ծ…r?oG[vJ_/i{cshNBPɛɞVwPK(PKK>0OSGI-OPT/src/java/util/concurrent/Executors.javaVMSA=_ -D1bb,lg6GY,R n~g؅gFd#5䇀XJGׁD3􂧅Z4cL#B gW)p#8gXD{P T9 3@i"a C!p1w p}&8%J`W%8F6|̕ȹk1L"V0rkgf>rՅh-녡3`9l@\%62ds:`M x$ڂ#؁dc q 㤝e{ч˸׋;v+nIvjwN$inBDS9UqP) N̳ !c42͍F+>=+jT*t,NȈkŽ1a%RdD5E6n+J |ɤ 8*r\#wKSJe3TU<oD;$5,:7bL(4.GߎwZN&ad)3HqȼtKkD^t]Bu.(4ِϵۄ^#ȶ.uJi ӽms7ܶeXEp z%vUy޴pcBu%ps~mV_XR9wm{L36j u8mCy?N)662V{E$1s0Ac2ThXl)>eL<4Hi4U4PU*PK] PKK>-OSGI-OPT/src/java/util/concurrent/Future.javaM0ϛ_1Vi`nU) V{4fnCXq* _kn#FT[1ô$ R0. 0Cfɓ,5p[fh !Az`qvJ;CX]ݡ5m>K C#956B`n[wA4)kSmϧ!+^K^@6a!-Bx'$[#i4UyV!TzFDP :H\ (o+۳;!SƠrQW&l]wݬHa d|^;YB.SS{<_S=aGtr@Xj:ѹB 4w=wT1I\X+ Q PK PKK>1OSGI-OPT/src/java/util/concurrent/FutureTask.javaTMo@=_1d"jHn-U%j&D9.l"{g!_3͛zg-8.F+$. R0~ 0 hl0!\ b^hqz4.X\}BC);@l J;CXX KB벑V 4,A 5z3tZ>og\׫*fX'wGlT7%Z0 C/JRقJV6 Ts:pB]z*f0:#޽0V@1$4k÷$Kn Mg?&73Md:OSGI-OPT/src/java/util/concurrent/LinkedBlockingDeque.javaVM8=/kN"fR" I\;l*G!7AH^IT@Of+Sڭg5x]-Mg-AG)Z"ԯ&(n oltGH3u#s,sfQRӄc=߸sB*::lUglBa39>9| -NSU;ϚUY{XTg|K5\EX_{Pr `*Qb[l| V;wnSʊِnv|rd}Tby>~:OSGI-OPT/src/java/util/concurrent/LinkedBlockingQueue.java_S@ş˧8i@Zv"mL qe7?DtQ${߹{^ `KޅQU@"`#tC7ah,! b^h]"$ӬDZA܇Nv0X[EJ!c@(zQ5hp:K CO#9 ]B`^.>zu]lMk3;ftu$Z {a(t"*Φ*Y 5umjե`S댘zi}S@mc IYކ$(go 'q2di1 FÓlt|φ' UeBw9R! (hj ah% Bp`#B8ַ zy~%2Zqo *wت \2<jű|Nxx~ Ua7)q pAJ8G#ᤢ*ݴ5@/tpD(Kf;HZJ䡋G F04z:7 pfd]29mllS^͝S%DI./}Rӈ-g= <OSGI-OPT/src/java/util/concurrent/PriorityBlockingQueue.java[s0˯ 2!yki!niZLɣנFH$L{W<~{t`X1;.")Ss@ﺡWZE,$or*8**CnO=4Vha:^ЮCo%, vPZ$a!8EV 7_ש]< \zPSs53wxUU5qͬ'7Z;M0u֙h-U COW lJU AsSWF8fX6ΈivH7SЎRH6Gi<|M<$Sa0$d4O /k2< )2WqnVR Ԭd3^Qhey)1zҗ/k(Ko-YX:!C/A[E94KFߌXj~I%XQp2^y*`R\ >tzS#= ",I8 s}[R@leHJ~.ōcu]iRCwdDohoX':m\iD::t9_ 5!e+NϔX7q>IAABqFWD(ϔ][w֢K-2(J׈\Њ6ۙug bpO#mPKht2PKK>AOSGI-OPT/src/java/util/concurrent/RejectedExecutionException.javaMo0 @ rJ N{zl3V8QG#iM0 (:lȤ)\LO`Q}`#iPL %Z4;"ȭ(-e!ӌgJU2qH : Ö@*"1hpQ;An(Z9F6hZOA6iu]zD&m6g$aםlZ0 C4Yq"זu Ŝ ֝N&֮clh/iIedU^r//peV,yf&_拂V_!+G^Ā42{mB)8ZF.ւSkAh@ Ւ`0 \믾B4hοXh$Ơtב+&p{>Pe em ^:ה@7g<'xdVh3/7Fu5{g(PK-rDPKK>?OSGI-OPT/src/java/util/concurrent/RejectedExecutionHandler.javamOo@S|# NnmNqW4q xRKwS)io EPw0 T_#$jI؆2(-hN!ܑDej4Y/$\%Kl:-I{8([dP{@C? c%wN\Wk!7A޹cÐ8ѦM֦wj]TL=ݺWZ z2g*)vډ3`ȑjcq0ljλ7a_ 86`UW3Uy|{CVYlJXm|o ^}xyqrd\{:`L qFlܚjhZ}D#ȆZMGr[ Q9FO(KV]GqCuO(93JoV/ѻg`>:J9 [2 ف;g%7PK&PKK>5OSGI-OPT/src/java/util/concurrent/RunnableFuture.javamQo0WyJ*Y߶NXnh mG؞}UNjwӋ.`~G0oJȆA /1ae(AۄɭlP9l-!3ߴ=Z'd M[U8j{q C:9 S@*hLh%k,|{-Ai:c"Nĉ}:.WZcԝ9Kˉ#Tu#h {h%ItGlZӛ^9k&̲ j_*`omeVluV:曂g7=/c@'cCƔ+Bg$gl8z}@8{³:l .J{~H>OSGI-OPT/src/java/util/concurrent/RunnableScheduledFuture.javamR]o@|ƿb2v!4*AvڪYp}čEl̬Ӌ.`v`*g.d]GBI|.~%PE:a@rKр"d+1ܣ\&sd,MfW=v-2YhC'R  9#KP#`OK 7>>[i: C"mڴ;amz/rU]wCk/OW=b@A9T67& U޽ Y#[ ؄IVB^NsVeHV|YºzuoO7[92O X&8O[F$%5$ٚjhZGhvdZ- MG;rQ9 D?^$QH7z_qC^u ᖼwXx ~^ڞeJ37rd!]'PK7PKK>?OSGI-OPT/src/java/util/concurrent/ScheduledExecutorService.java[o@_1 "j(}jrV#l.bfe U5NPHݳg3*[ 3Hdo@;_+ $hP1 Q"D%J C ZVs-A* yp.aiKԮl*nuœC֖с6Ol]֖zBVJ=qҚ}<OnN-@c@5%^D5 V g4\]0jc+X>k##E*1 (8m(Ӯ7Y/VQDyw8)wA(JOh:;\Hnf@vywYy^~y^ I0ڇNٗqwZMF(0 PK^#7 PKK>6OSGI-OPT/src/java/util/concurrent/ScheduledFuture.javamn0zOvJnnmB9JV&YD1{&ht@rl~,9Zr+A$D^S,ǰ6>bB!aA5h #$J whia2&(qJ{Y#DH}0#@~zgT$0j.]O{1χaĉ8ӶsoŪWzuzt, d0;fڂ,rH=Xn ,F UhM(5uYQ~[nlj[jXo`\WzeL92~b)B g$gPRK.ӏh;@.1`ez:tP$(C<,x3 ֢W ;Nh[y*M豹>Xt=xT{S![b/ؤoW<'PKQWNPKK>BOSGI-OPT/src/java/util/concurrent/ScheduledThreadPoolExecutor.javaMo@WrTBZRLduEM46QC3>,vu ^CGgk#3uހAI@,`#&FN0DZE4" r&8*)x7C3髼҄oh 6C^yiq$ÜAi"i !p1s p=Jp|R%RCpF Ms%t9oerHiKutI QYJ`*eD٘X%[6Ӂzij'n TXgػ{mdS'K8NzI3\F#ø?u 3FAN!/I,upPa`gEH!Ltd3b"8MzFQE j 0 2R̅c.?PV#[;!#ƠȑMdBIt43sew; qRU&9]H]kЌ8^P;pB9X0n܀M݄MosP5@yYu,5&z! ^0tG S r;tWgDSd5'<ʊv 9/ɾ{D/=ѳ'.ߎ*)n{q7S0#fkPZ pi YO0)Cr4i|nSt cwE7}s4B:Od]\S~Gv¤ ݢٷ'(ٚvSTw1ˢ?-OUcnvN*lVܧsT0d9/Q2'G꟢.H>alEvEZPKS 5U PKK>0OSGI-OPT/src/java/util/concurrent/Semaphore.javaAs0WpkHnm:fŤ ɕdwe 4i߾y݀P;h%mşzRP B= oۡ_WZE4dorN *)*E.G"z'h,iaZ^Ьo% vPZd0# HAE$Wϩ]< \z|7p5t˝+u:2qM֑kG0aBI *p1eV) 9,gn) z34-^hFn}W ^ Q܄8orM>.&p{I4a4hxMѐΠ7/49x]cs=Efzd LhF Rd^QhdX-FҜp҃: dhƠr'rH1Ek+Yau IomM06-ETk2ݓ/4 jޭ6c𙄑rhLYQǜ1OTZg+RVU&!lejЕFA85=%g辕X9 v~w,ZJ^ߥ4 0]/1Rʇ>Z9n馈 t^Ο2fx8Znuz̪=O#}AYR-8ܟJ~,3^NphPK *PKK>7OSGI-OPT/src/java/util/concurrent/SynchronousQueue.java_S@ş˧SpҀ:DLL;0%X%n{7EZH:pCU5/,yg!8 Cw?WA""o( d!XN?J?P$E.u{b, 7Pr9V\-vӺxl=23*-tYX[뺎XC)={K(Ku[u.9)l "͈U6HkVyZs<J[3ަj>sI6}[@mcqiօ8KЛ\/)\ēIP0[zr pIv(C͙7¿n _QΛf#-RVLv\Z(4 TC%q'8j-\uZ^6tu%Uif{lI'v&*KA]2a_{hʗx.yGUݞ(]Eyi~E j  |wӕT>4~OG㒦~_}ܮF+H+dwoPKPKK>4OSGI-OPT/src/java/util/concurrent/ThreadFactory.javaeAs0WθDe34,KT&N{WN)@ݧo*pV5\`[~QHV - 6P#{*f r$iGz]?NHL%uh\+Cl 7AlzxXC9Ԫ%гCiHs&AxΤH4i.U:Os$0b$ml{tKү^YxJ=b%y~Lj7e_'mBc>eV.c}1-4em~mΫ;eĖ9c`e( :V[M/BcNd5wQ0VǀUiQyǭ %Q> B?IĽWm,M{vdk,NHowc]/!h.zI_(PKwPKK>9OSGI-OPT/src/java/util/concurrent/ThreadPoolExecutor.javaWsF~Ŏ ⦝i錂 )S2Ϟja$?~{wlKt|a!Oa!3#gޫ6/ &B W(%.o1vVyebj;Tc-#ڦ^Ƴ+é\ \H?cL@S(eA v ^ N+J 팝&Z1kדу_Z/3A< >]-otR ES5K<7P M:m7߽Rʯ4 Ϸ4^*oZjөlfQo@ DFeJِ֧Ҹ9LIfۊ*WrG5Z%̘0x^1n'!KFPqTFYX9$vig;jm5H#ܕsюUu)=9H` 7m[¾rrK^U\<{5]q ;** j;y~_n-5?hObW:!B7;!6 Rj1r>lϻ[Ok۽%wVPKN!PKK>/OSGI-OPT/src/java/util/concurrent/TimeUnit.javaTr0=_ :ԐZN.-13i&G^@-0{WIH[aZf}'Yw,i^s&Rpxz~5!DjK dS3D +YJmQi.\CZ@-uz#Kl B4װ9>XRYuӲX'pr03j(i<368uƱ+jz0 'mB5(YqE'[`%JYB^sVTV fu]+nXA˥BKqmO*"G41bc:^~ԁO^G}KrE ^zAO#0?>7?)2R &qv"`I%Oi4 a%7M%k f&74 raنṛJVJ0#JPTļvĻ`3Ȫv{þ\Pڍ?Ԇr2oAE<=U W#9)EAn055')\HS)|'FM3aDZx0TUa6_Rw̾J.ϝZ!Z&q˸9'!49a[}ljZ*yn۳3&!味w_PKlSPKK>7OSGI-OPT/src/java/util/concurrent/TimeoutException.javaun0DW |WrsksRȀ4ȑ2[dIʊ߳U$iQ$;|3TvscN5`Y}UV - 8I6VcE܁ȍ=tMaGȭ*S ѸLgdžPMt؋# <ت@lҐfo^A%~0 ]u#DO.)Oʼn85snz-yG;aJ q#{lC/EZԦ oB_7plBcW(>UQM]]._r],*,W/b],K^}A^{Q^OACEb[DEakHޒT[%ٚn:s ,Z=QU{D8m+% + vA4ZvΑW6&d+rd8@وwc _*N COI PKU+PKIG@)OSGI-OPT/src/java/util/concurrent/atomic/PKPKK>;OSGI-OPT/src/java/util/concurrent/atomic/AtomicBoolean.javaRn@=_15$Chk5 F9.뱙fuw8$; -iU[ޛ7o<ƦZ*W3A -Wek9:cV"$Q;̡9Z+?m:2!tӖ:Qؚb x9(H!if]}V%8V,``Bŧ·`4M,ccˁ:`6O=nYwZs`GM'^nATJ%{UcAMpX>8SFX 299oiY^=Mh$Y,A>]|->ϓ"d0x6IlʧOLk:rd*&`;OSGI-OPT/src/java/util/concurrent/atomic/AtomicInteger.javaSr0=jHnmN.ISO30I29ڨ+8$v&8-k߾}I !+ap6/o#-,Т \Eh‚h+#EcVpL`{.aͶ"q b@(HhU­9-W-N#8޲] 0׊+犯qUUc`:^ϤQKaqV%U ^ue*ՙAOÅuF$(6}Q<$wf wbΖe L糋hg=f#@ca)|)BؑF-0HɚK#zF#(ЬjI 4Rc{=bN *-AZ罢L(TH%#a)yYNkbikB1xO /p( 3wL(&W:P4 &'Z"kn3wzG;aɘSS{n5u#hL؁ᗚf}%[ūףD_;ѣ:.A-8}lOJހR}>y$^ ?.KPKUPPKK>@OSGI-OPT/src/java/util/concurrent/atomic/AtomicIntegerArray.javaMs0jHnmN.ISO30I3N^mJ2߻2N|>J ؃.׆nڃIrBIIB݃pez)Z4+B&x),fP BTڝ>|CcI+8NzZWkPAed!'W)HAe&h.Z;rB |ΕC$)rxtc[0ACBus7%`%̰7g椄YӾ7tQ0<#\kb{^0%I{:˅ͣ\NUk\!ʲWw}tucV)?&4e^bU틹Fq9K PKJIg@PKK>GOSGI-OPT/src/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.javaSn0ՄZc%, vPZ$ ia&sX8 ^ JyݧALЩcΨn"0אs^ՌCm^εxp>L?jr .! XA8Kk*XfbN{֕N V\ z!32-ݞiOInߢ$N:|M'pp'0`4<'hH oG<<e M\"${fzMLre^Q 4 iZ"(PKtMPKK>8OSGI-OPT/src/java/util/concurrent/atomic/AtomicLong.javaR0S0@L2vTdɕl3$t9ȱ]) ! ap2oo+-,Т \Eh‚%h##FcVpL`6z.!g[PAiWU8&FkǗ|%6JI -W[`Q%lEU ŜԕNlVb *]gh/?8G&Z_-&\,2:a|v-~B8lH#:x_a ?!F A&" eޠQhraZF\8ꭽ|qGsF؆2HJJcP9W+*$kXo^jMg fe¦ɢ h>ޗm0GxCmB1 uq*~+6J`"OMJkt(;I^cb[ws]!4k&Kh Tf=MߡEov'JE9'ε F Nͫ˾Ѿֽ]֧^PKeaPKK>=OSGI-OPT/src/java/util/concurrent/atomic/AtomicLongArray.javaMs0jHnMN.ISO30I3N^mJ2we|)w}w%{HkCA7$9%$Rp 6L-f!XZ34ܣ{ַ<6%'%qxyr>h:Ƴ$Fq<'c> ui|l87 # X%SʭBWhw%%Y f#iINfY_ xWCDX9aUZʅ%GAYyJ^fL"2%B:LАtm%`%̰p$}I# ,R)^O0*`(!5'%$̵(6/s9[\Hϩ44cyb/\%ʲF8CX ӔW2ݬPiIT[tFq5ϋxPK`^nKPKK>DOSGI-OPT/src/java/util/concurrent/atomic/AtomicLongFieldUpdater.javaS]o@|Ŋ'!ykErGF ahy1wFݳ M`ٙx10ƈ|{0IDR 8Bx8<]?B Sia<ȵ,fP %BT0Nm?XCN[Nvj$Z t VU Ӟue* W1&nϴ'$}lc :QqҁQ'}rϾM3hyl rxi *2WERq\2"kK2shNgg|(vȽaۺ=xG[RXE*Bםa9#nЕFP3Tk &XJmo){3W$|ۛ|;,U0ʲw<bX[ (ÿ7wn>Ng4GiJa8WBB_K᪔ȰoHx =} ?PK̈́PKK>EOSGI-OPT/src/java/util/concurrent/atomic/AtomicMarkableReference.java_o0şOqT,iRF-Z$Biƹ ^)NCBiyHts>8.`˭A`~I)p8B 30CfYH *BJa `vӻ􈭮`Ͷ"1\H|X: ^ZUsNKNec$gPR t+? u]qjS nu^%m׭h-S C/JrْJV6 w]*`ujfc2aH (6qxmz;h6y|tiriB{'W}@ Ȧq>"GrlɖE.8ޠQ4hkd0)1,Aن2ZT.dN jIFf|3̑?.>S𦕾".`̰K%RTz;xio1p]:x͠I;a.9RY|GGQ{Z_ @*)O8όY؃N=&1]PKW^<PKK>=OSGI-OPT/src/java/util/concurrent/atomic/AtomicReference.javaRn0}^'X}[;MhE@"ƹ w5vf;wRt!s=^N"8vʵ,J(EBKx|:`5Isu!䥻#,C?zUop$v؁6jA R @Tө'pi LxW[{_FMĢu[Fj]gF+t,rDŮXW%0Di Kt9g A&'-jԴg%&4 Ҭ,͆A6]|,6ϓ"`6lz.ٔw_ tz9q|lH6)0E,`U( tY4[AvC.ձ<(ڐ=-W(4"}!"=X-kkQXx!yU R s,1?.?q w!ghI(zl'$^x=yWP2F8Cc }G@k_,d zvT⟔; yNڠg}PK&,[PKK>BOSGI-OPT/src/java/util/concurrent/atomic/AtomicReferenceArray.javao0Ɵ_qS;B ]iB<%=vuwi"bwetLt5Tҏ$T?7o+-Ѣ`2C.(Ce1ZhJdt'CƒVp78󈭮a-"3BAo3LZCnQzTU AtNGiB:)GrdO5.Dk w܂U&UQ3Ɛ#U5 de힄[plBA/J!I{>Jt!WrW|MIl!E|b;KŒ ʸ5U֢D(⎠B&j`1k~_4 ƃkG2̴jcPP8,% 5j7X k2۷\sH)q:K>)a6%mAJHXj-Q~Pp/bwGtQPi b(-hywC F*ݪ >FؠwAPKzqFPKK>IOSGI-OPT/src/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.javaRMo0=o~ňT@{mnHzt!xkҊn?Pseϛ7oL$rkDr=?R 8Bl08 zGZE<"Or#8*9T*GnFBEcVp 6{`Ͷ"q K!c@(z]jVM+CgQBIk 0׊ns~5#mcm&]ӫ͚+ւ0qV*2*Y + Ri6 U`̠ɅuFd{cڳFj5lc :q Iځq'Y$_ tgU )&dLtx|eHQ|(d o~"{ID.SkXP EAf-%b-sA_P?{OmXT9!#A"Z22XF60KF&:%@˜94vOhvdZKd]Y*Ougaf@[<=ȿ?Uy 1*@URtENx~Rz9\1dO }4aK 5ilXSݏ>7]PK8r^PKK>DOSGI-OPT/src/java/util/concurrent/atomic/AtomicStampedReference.javaRMo@=׿b "jHzjSUrIZ@„(zXczwAƥDD9{?޼yGgDC`}H)|~?1 11Q9̡V9Zk0NfKNhz@5Tl J{pPtm%(C<#8Cwg05MVqm9{ݤivTwUJs`w-,9^mRيJրJtuPX*tf1y+V_d@1$4$Ka Kf KdH3a2^t6H=^ )2ꃏ$S8S B%9\5U֬D("G`V…:)*oN|F(/aq테VוW*pHkfU9HP)z!_avHOSGI-OPT/src/java/util/concurrent/locks/AbstractOwnableSynchronizer.java}n0 S9%Edm=ym+ NWȌUlֶm:q53}]痋e(_7֠!'PXiWZp buVSnZ1%m›: $6ea#y1|culΖ|Qj UWKY}ly?P">Ps@4)"ovW5jڑlը rGd+A| Ջ`1T͒Dr&IaFRHf+J JFs6,Wq',=b? {0@&e豻C.4<YezjL!U Ń6# a 1ÎJtT<ﴒ$yPK3PKK>KOSGI-OPT/src/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.javaV]oH}^~Ub n$ݢ@F}싙vΌqi;CQ ؾs?ǃ7x#l5Wa_|!8!Bpx[sa, Р`!J2B v',IEmB\z7bRX-He!5H bbK:)eܮr)%ZXFZ Rt6}0ȲcbOx [3&ݯz\Sċ-TlAZ@i`FzfSin`fL/RJ#^71 W~ qw ̟wLg0NntBW|Ǔ> xK]$tUqORL!_BqbXmPKkn\Y kno6K-^djzBM'IS`  -f'{%`+ÕVC(#ULtlK5g͋K)P3R2.mKEs@7x%LFXƸ3MVyciQ4>)瀧CR A |[gs}>Fj K& kYs&٩ah%W|!Eb[3 )].nˤՃR]i F1G;elW*fǝ㻝J#it;-S!ѫDq~g~7f@GKeC?CC|=;(G?i9  X_&rEH]Uxd-_vV\O?7PD#\ieݣI>- Ge\#}\ȣ;[;OkH}g'7G۱ic-^Ytvv^7 OwPKY8PKK>GOSGI-OPT/src/java/util/concurrent/locks/AbstractQueuedSynchronizer.javaV]oF}.*OdE ٷ6U%J]4fܙ1^v; ؄l{ιJvk fBp&CjK݆40GzG䎇( F558a!}OjÕ|tqy v* ہTR @!&PmRZ:)QTbed!U-Ekk_,<+5;r; n&ե׽h h7"^%*dK*XJ53Lse<V6cLč|ڽU)I8yg x¿ `6lz/ٔ>x 7@JDH&w,➄*$C!&ڢ$7ܸ972: {=mZ.P0 ^.)Z#S ZI-ˢ Pekݥ7d["p9[^⦅JIwaΖ=?8 ˱T4KP?_qle;Kd%KZ m>D9<,HV E2=:Y5TKX1aXCΚ 2L #_'W|)vEbOf^Ru.nIkt$ bėwخsuU\펵oZ#~il; -S!ѫDqě~]̳mxL0cO=OR0_}͢B9p F;XӮΖRA%t'Qe hIi@몵{7%R÷XT34m<SNized , ΀oEUOGٱh87';<FI>XWo"^GY]5&6:#ihˣ<ݼ4pT&>6beyl9opWLV-y2k^՛y:ܚ;+-XjMPKHSQyPKK>6OSGI-OPT/src/java/util/concurrent/locks/Condition.javaSo0>7Pq(ۢUA"G'y;R4sHv!_Naz ,ǰ?$RP%Bx;LǑ߆GZXEs*bOrO%*Bn4dX n)0F㙧8J;h-2YؒDf֑:w.`WK 7;qu]$zǑ6u,OXߧE/ޱaj$Z d8qqѰRUQ3ΐ#UOAOSuֽ*#GpmB(!G1|If jdtreveƫOd5&\sc|I-BV,KRT݊4AfO_e''\W./䉾ZG2**[cPH΂-Sϡ Vy^\4U :A.ѝ=yQLpuYpUh-{1OSGI-OPT/src/java/util/concurrent/locks/Lock.javaOo@S|# NnmNq[T Kn xKww,&i?R9f߼%=rA4$D^!,˰J hXFMV$QY,S%p{?N_X 9L`2nMf;8(d$HԇvD>'CN\g\>@iSYkUXf-SvAk O\@L%EAAsS:+ ަ$ {#R $4$OЛܦn&ɶ2&ݦ댫dw%nB@CkI>-B g$ۢ$N>Q<hdZ,MCr KA9{o(QIdg *5Z Δsh*u9j*R/4]hNw58OSGI-OPT/src/java/util/concurrent/locks/LockSupport.javaTMO@=׿bSR;pk9V#šf=q6Q[y͛\Ð`Z}K)Óx t2J1" "ɕT !7ӣZ't4Rlt5ۀCB"GA(zmzim%*۞C/<#8CoC 0ߋ^+,.e[ũM&wX]euTYJs`w:^lRقJց:B5cpz;f1y+0mZ?mL pWE5$7z7lⲂ ΧE1/%}Ey1$˨>; "ڹ"T/$,N3RpjM55n* ڵpq֑Fo eIB>G;ֲ4x!S֢ޝ&&,S+:1zxL>1KNw=4" |e2;#@)O5eE aľ~S{)R}s\+rw/+_^hálfвjmi=)'Vqk\ = V)IPKyсVPKK>:OSGI-OPT/src/java/util/concurrent/locks/ReadWriteLock.javaQo0ǯSR1ن E}t̅ܕ؞mB} ZMUyl{cW\Bva*gd]GBI|)~%aʠtPC{:a`"a т#dFH+1BH+N0 ɸ4 N!{:|h<fD.G B~>?{͗4!gD6.ZŲzS:d a*)vډZ5`ɓjcpljrҮB{f_ 86`UWUym6+ˬ %,mAVϼ92 0&8/+F_AI InMhZ}D#0h±:MGŸ+lF~HzO]"|in"8Sϣmxrb>]% ϔ׻9PKA|(PKK>:OSGI-OPT/src/java/util/concurrent/locks/ReentrantLock.javaUn@=q[!I{0,F 4@y> t44& o])Iq霶?5GZE$`OrC1* *AnD?U?X ΂4<^sO9v[d0%1fHAY% 7+T,^ Wzd4p3s.nERqMږ+m߄ dUխh-'KńJQ6 Rsګ. 9Ri B4 Yghym&ԻQ.Q<]8ގ;up2?]Awpe ->?$oj!H$aLSy4"EH C3'jY`i$ Wڵ~rG2scP@ײ|žB,gPjsĮH%SCECh<+ɉy a:/讵Lz:W$2rs 4aWYjVAal\Uݪ6?rUfo6*Mi)9+ a C2*wvDUBƶV󻷖wێ46m*ţv +*sߐDJ9JkŲj\Yr\?6xДܜxg&r 73[h_Ox;Oay8t9oJ7_+Ԙxy6W[>jPK\PKK>COSGI-OPT/src/java/util/concurrent/locks/ReentrantReadWriteLock.javaVMsH=_NVUKArFt2hgF($=B˲:K|ׯ lKtc(Y:hG0AЗگ{W_/&-5#x!E,Ɛ %B?+W:KZm_pQ.]\^y`%6"cIaDzrr˂DJcNp )[po\<@+; ף/u$Z p UEbZAA^sګ 9RI^\01Ygh#*a&\N/mN;.݌ogpןLYx=ѻpG=GpȖ1~Ies;E"IX$bD 5d"AH E"jY`a$ W *UUgهqxqZ[2-H YCQ%n0y'D-%?cC~;e}&lz1oP ˛Xaá}XyV񝠣u||<;QTF< l*Ka~<_+' okxBYB.|oqOӗyM^LN͏VPKtN PKIG@OSGI-OPT/src/java/util/jar/PKPKK>*OSGI-OPT/src/java/util/jar/Attributes.javaWr:}._'q [KKSc2Ioaخ$C]S 6ɥY| ,/plK'p}˻wiRHBW@6nj#nY$+K2ŐOxHӌMELAbƥ$cMWLKPѠ>DlL|`Hˆ;K%0}gh#f7Jb-7J4=@ p/ -%=6C[''KS+P8Rg90()mf+j ۖkZ8Y);V:WN0DOW9\u+V:Zl3'̙h#4^8G/]e~XXT\W# 2صJ *WE(IG_cc}?_q٬-I|ENiTL;Vb?fsDTkS?w?IdgL{3piRl-iQ' O|>#lj3*;H0HmD1kL|8Y7F?PK,XVPKK>(OSGI-OPT/src/java/util/jar/JarEntry.javaQo0ɯ8)S} ]JM4nrM=RNfCB<$}pwFTka,/ keF@0hldDKQXB#K4}!|FcpFA4S lrX$5 ^n)nzZ:N6h^{7qܶ-1SC/4˧/ɺu%k h; $ך 9[#ZRXgIJq'M{tҏm\ !6|!j|dtlYv.YFwd7).2ʃw HSvNr:(YXJU+JmH4X- SpuSA@}A|YDnYR9}f*ّCYڣ{EqGEz[SIs(؃m8 GE `>'J>ɧo ݯQitO5Fvx- +86 o>фO󗬉*1DSB'PK q ?PKK>,OSGI-OPT/src/java/util/jar/JarException.javamAs0W);=4)rS썣HB㦝wVv{ON."\`z1.'X%ҦBln ~a"G@U AFUhUE~GH(3TNIp0 4\nG(:b 鰕 K2R{3us@ACovWF?@{!IEOk['ͩ%7|L=Lݪ_xs0LU 6%y;+TNo}',J:oB860J d"+A.[YޮqVi+̗uΖ9>!-˯ ϡGcƔ!- z'$g[Y5U&@V#{µ:L# o+D3=[/Aثȴe#?CTH9z3̟O'x _ՂA0EPKPKK>'OSGI-OPT/src/java/util/jar/JarFile.javaSMs0=׿b'prkv&qI//X)$LL{WvүK$꽷oGp&Ҁ0Ir˒3!8~6S55.|B kRAE|%itL[DAך+xVIk XbFZՍ↋-s0fQ|^v )iބiz*\*NdG)Lp6IYy2gNg$xy0>)Q׀HZ 4G1.OSGI-OPT/src/java/util/jar/JarInputStream.javaQo0ɯS2)t#imzGjiVwTj5@B"Ilsk/{CAXF0+>uMBhtDWZEU >JWpT?J _XR^0GU[49,FPZrn>œ}N\Ah}*z8m&#NAk7dLݻneւ xKfE ʀ S5HV1Xv0cVdeΚvdO6!axYlqvt>OE6-`6,,{H{1 Gm|IS aHVcIk*4Y5B@ْjpcjڒzQh>AD8aƁnF(ktɤn\ -C;+{bI:FT3a"wŒ"3c`6. #M]Gcx4R5"u4"$:ÈC ?tf98"9~PK.-)iPKK>/OSGI-OPT/src/java/util/jar/JarOutputStream.javaAs0Ww943qJglq$!qN;+$|G۷[9J [2@4 Y" MmXz%Z4{DMnDiqܠEH(3L+KJU4Q8N@*E 5Xv@JZGn\< jh^UBnsmw]8R7|L=T?Z2x}kfmDʀ S3Hr0m6duΆ xlB() -F.)bMvwrdtQ@y]4x>G}Q1ɏxP !Td5TQd݊V{4F#24#'\G.(wo "j5у0@k#`Oӭ+AcjrcOjHGHWo㾎Tt& 3 ШnpfE/ և ۦ gwr?"$Uh?OP/APKJ6&PKK>(OSGI-OPT/src/java/util/jar/Manifest.javaQo0ǟOq *XVIe[HI.؞}!EU!j<$pcmV+nփ$&!*K)T=?{߆W:CFb#Šd ; L6BV J.QÈkT|ǥV4>x#=x߄KTE#Z]^L++V{s; hsI(pXLŌX55"TY*C҈@z\uF?=?m/<}ډ%|#%O_qi'OSGI-OPT/src/java/util/jar/Pack200.javaWKsH>/prxU Gk\XoN `b1 HaǮC7_E .` K ~x2Dpyk2!0XZcbE "Az`,f*1h7Kx%,0x){. zYӠ&sȜCNCC`!]Zfc%բնE/tk*2, Pwx,'V1׌m@*` aQ\sA!Sa L ODrlL@ ݰg@?ۋ\'? =5 77d~ϕ9F:">ʚRcSĢd \t"QxaZd|5գe6Z*5ϬoL]rN2Y!Ѽ%cJ@1BJ%Yhir2( 7$3;4rf bj_@ega&/L3F0KRx(g4=S܃rQ)1~)˨ȏs9SYr7sk`Ӽf#w`;2&a 0L*tY^Cwl/f;q21u_ղR8EqW F H8[DɅizC؝)pB˝FAϴ/ U<*OPxϕR D@ג'VIja$0ASϑzL]vwHfΓnLrcث siKM. %7jS +@e=vH {q!XtZ(\Ѱ|/̾O~gJ)0Um5Ânh^?UÜj:T^%t^9>:|>? Z]PRJ( Am g{Cl f.1])bm.Ӓk2g2Jޡݗ[PKgj PKIG@OSGI-OPT/src/java/util/logging/PKPKK>2OSGI-OPT/src/java/util/logging/ConsoleHandler.javaen0T,azQFD^۳RTw T\8wW{t O\))tM_f_$XŤNJ<5)"^֤=5tCaGȭ7L񛜗F:aak4GhybJElԨj =%i`M|l>ӷ ~˲Sq2Nk3u쾘/j񙭇SZp+!,[bîJ0u{D u;7 GHtio\Mh E5*i<jbQa|YbY v =l]5elQ](lY[V\n;Zs "Xr{zl"Fɽ ">/ʒ7H UL2&݆[Z 63(c:ҍx,#˽$%`< ^&PKDPKK>0OSGI-OPT/src/java/util/logging/ErrorManager.java}Qo0ǯ8S2e$ͶKiɪ>Mq7b3ۄFU)[|?=O^{xZ;a>B] e)9l 02RGp}B\A-7\8t*c|%1:`Еs'qT5,jIClEs^Y\Z#ө8'42PӶt{>N&Mu+]L'L< ZɒB#XEr&%k4X9լr-Fmm4w2aھGPlLbd>YmNVKi(̐'E.wcpJ Ȧpq>"2_Xت'K؊FE B4*¸m5dpdJv韹\Q?v`~mE闪(Hܫ5Ed0Z&x^uŭq]rbHe-ViOx{rʮ{7?_qF==A'_ø;ަѲ?3h8vPba>?Ot=atRkKfyPKM%3+PKK>/OSGI-OPT/src/java/util/logging/FileHandler.javaQo0ǟǧ8)$'+ZRHWxsl6Q3SVK`f`\M /~pHLVt: _' +BfuDJ5FnhVg8 ˕y4#;TZ6\ }Pum<;JH(@ns*uN";ibq:],b\Q7R`o U\irU ց2twlBj:fcjne^4#~*1 HCnU~dJu, _".ug$ivR(k+ ܷxP QGKVc7dӲQ{4*fǭVKk|sWuDqPxogQ븈j-P F/+zem_D3vϺ8OȅQU~D>#Ջ}>wQ!Mٿ?C(HD/<{OPK=?GPKK>*OSGI-OPT/src/java/util/logging/Filter.javaeAs0Wdg9iz 8(`ʒ* O'+$OO>) Vڜ,{fA&% o1" P# ; 50-=BfDßOd M6Xq= كt$A4`&Hyе,{+'|Mqq&NSyѺtEfiգX3TU[ׁzI18QX 6-9o3roP0*ȫeU^)}>)+ˬ %}˷ +G^ǀ/ƆBS B/H`C5ܚ#VqG`ȅcu IŸ>6Js~HO262CQrjm'H/>ZKmXҞ0HTbm Ga|^PKvBPKK>-OSGI-OPT/src/java/util/logging/Formatter.javaQo0_qT,m}(]u ƹolU]tjUӖD9$8{M@_0/>)dZ+a$:i"Vz,ȓQ2!B$DcJrBV ɟd伲Xz['f(T(iu'UasQv 7ԼZ?- 0mԺjj*Lg-&G;^!jV%Ŋj:UNe!]V8RԪ B{֟pl ȋ>fE^ #&_^ίļ L|g@6|v>qd+OSGI-OPT/src/java/util/logging/Handler.javaTr0=_t܄4Re{m ɕd&6iH2v݇=k^l,w?L> w +i`ɜ( fP 5 BX~~6\I8 &ໄA b*ز=He2H@ޥXZR-;i5枎)ێC%Q:#@Ivx\uŁXf9t8Í$WiSL*usF[i b Ǹ~)Lk2Iꆥ%hWD+e@pؼc;,^&J $r3'K'TT vLOzl9tji^o2N>iKf0g̓+ǥui^ӳI!_ڴ\TtIq١Y:Wy\/[ϼd'܃PKsGPKK>)OSGI-OPT/src/java/util/logging/Level.javaQo0ǟǧ8 oCB %RB[ф#x3vf;w9IPR$Hξι0<\|yK%7|!8)Bb4:~{nbi FzK2)JK(55.P$\x#9nb ذHe0H n`>[Ri%*OCqJae( 'kvfgmm}8,cbOl(j_3W0|%Mԭh h[pM/vrRiei*r -FYrc5_viI I.$HrFs$((A5?|_Ax=Q|̵dr!AܓR$cW.OSGI-OPT/src/java/util/logging/LogManager.javaT_o0T,RX4T&vf;wߙJaTi<9;ݓ@kœV؆i0)g"Dhz:@ێ} 3[a #,Ș(4FP%N~\ 8uzвz[, ck@0xbn eJn*C. rF 9B`-Ϻݲ,QHtӪVw`)j \XNB )+A*`B3Ҫ.7\$26%Sha"< mPlL@ p^б jlsotͽO/7/;}m!@|&!$cc5,AH Gʸc$00)ϸafȗ%6V) OT& y(!L)dU*xhb.X r)OG#N~^ ]w'C8әYx>>+i0a?^H" E#\ڀS=ۭJ@R}xA$,w%)D,i( +vt;7 i*ަ9p_Ewf4 9Ejs>|~bY59O:#v5?}x30,H,Y*YꊌKǛ77=~ܿkyaH V6܌>}-OSGI-OPT/src/java/util/logging/LogRecord.javaTMs0=_ 2ԐڜLa/F\IơIۧ'Ojp]5O'qWq霶?5= Wi` I( &5 ~@mpu Vy(*)Tr @3 \BY%vRX82*giZVs]JŞi[,jMt#PR1O5M<HUFUj=Bseƶ`M|5ӖiIQ.(Z.~ p\E@^à{-@c$;;⚄ZH2|cM9KR5C-i"POqjH`hrlf.ר]Ͽ1/\xB)ײ|DVB,)tI)()z%+/B͙K۟j* ̘4n$/"iZ>m< .m5\K]w bA)#J9^ZA=`lrI;zPZiTc3&a}ч,Z%Dzt=3v~]9D%\ZN4$\ӹL L2_&-52@,owJu7n#;^c و)7xL}IK2m|=jPKFEPKK>*OSGI-OPT/src/java/util/logging/Logger.java͘o8ǟ_1⩭=ܡ6m.:N@o:V&(ZqZ( PPx;OƱyZsͣ [U g3CyA=#'J!$2D v,|6\I.9TYIU6,$Iq@Mm8͓8ke( Ѳ#0Col6XJ)EkuoDyԝh h/f<*`CblJ4ҘUz2Q#;cLȍ|ؕ-iT6&կ•okNCk{7~wf=vnZVCWo|?Z } rfw+#!>MMF "5E-iFpn!>Դ6/^PuBٔy*HQ!MVR9#.,Ay}*ܶW~S{{};T#LT9 f0WUB9yr8!2e /DY$jx, QBj+I5@ QZt/g :3Й/&OeCf*Pw9bo]0h}|'&Z.-JKRkfٯM z 26NQǁٳ,*oXʰO:l/,#ݟJ[4iTJrѫ*ϸWb@)`]8#& 6/M.GjӅ,GyZ8/lƯ`0j]mPI 0P:,{vc|(ړK\gkiJ"=~9jΕ;nn,"8νvWqlR/6zo]cu*PK3Ŷ}PKK>1OSGI-OPT/src/java/util/logging/LoggingMXBean.javao0Ɵԧn I7Bʺ%EMأ\҃6B $Ⱦs`Pq0.Na#H,y~ymXz%Z4;x9(- BEg4hc/ 饷ةbR9h-YAPzr}œN\ͫX g~}GbO)SAky:eSndւ-xkfmDʀ r)Or$\/ z3nݣ~3MH%9~BGp?YacYf¿C9G̓Q&h5OSGI-OPT/src/java/util/logging/LoggingPermission.javauAs0x g\Crk99fLfrf1jJ2 ZvFW05z1bRR0Cc,BÂ=SV""hVo Y#*:i4n1aЗ$HL8@kHTz5=Z'W $x5 n<g}q4.GzNntOgE9{ԃV,jeǫDTX1-q͛@Y饮8dy+WF~ AV"/ʼLc2X1[,bJ΋| x׼K@)C[DIacNHJndt݊P=Y͎АI1:(^хhE CEzRe'QӮ8Jw-*%Tw;4j9Cz+κ^wڅ8 %NŽ:^Z:[O5~PKkkPKK>1OSGI-OPT/src/java/util/logging/MemoryHandler.java}Ms0Wdg(>QmvfrajeJwɌ?rIﮆƃjy0FJsLfxz4A`ABm0 0tAW5P$7PpVLZSxjc%T+lo{V_°mۀuP&\ij2$}փh h[sMo*r y)fsjn,}0-097VMmOZ?ؘABkƩ n(I:J`Zx7O#^42ϕvMyEHO,`TgԚ,kV"A-#Pqj`0e; =ǁ~", 8zCL0rwJ,:en.7ŋ?^J:azZRNJ4Ԅ2x(~(Dmgk=MZ5߁2LOեzPKK WPKK>3OSGI-OPT/src/java/util/logging/SimpleFormatter.javaeAs0x 2Ԧ\BZO3I39 {mɕd&ʸmR|GڷO[E7nj0'Xg_$⺖Bla ^?NBWZlȒ9R7Yɜ* q#r )R+܆3`4F8q% S r}hN}I4x,|-ptk>EQuCmhmJ4[gAd- jĻDT1k-:hQӞ3IUMau:a:#w{3?&Fq$s%ԛ<&ۯ-&N2z:K:= ߒn =1A(6RMU>Q Y-ަ돮r 9F?QuXbyд;%Z0a^p'w {Ӽg 33){| 8 36\kT[ssPK<MLPKK>1OSGI-OPT/src/java/util/logging/SocketHandler.javaQo0ǯSR1HيVU}tձ=ۄFU Uxl{k\BvaZϠ~dRP5j>_fIUP:XC{&a`rG5* tA ~Qg\ZGZU2iLƥ:Xu{q=tكlI"s)ތh=ݰHq/X.h^ó|MӾ1'ڶllHy:E ִ-Bh'vO.c&Hړ~+lF)td"u۲ud j)[vGոUI-%4OgLbu?Nr9ܬp+_Q7COH}vw( PK-DkPKK>1OSGI-OPT/src/java/util/logging/StreamHandler.javauOo@S|# NnmNqT $4q X;XQ{fKvp߼7WPAbG0Mg'?%e)E"LokmװJk4y`CV2`m!H2V\HUÍ7Ldvk#JVAΐrY"K !UU3uv}1Œ󘡶$X.S~*A#t숚u'zbO/Wb%˯L=ZyDT2k):PDk,u%ɺp:dҐۖΖvdO6Q$H L&#Hĵ!O!~S^&\&aGw&#~ z_atʸ4NҮs !j@2 2)V( G]DР0`fcJYIԿ6{$KTENny (N.{n:3.xu3t8{b{%3&W煼lBϥn+U1U:yVSWntJ8qPKtgHPKK>0OSGI-OPT/src/java/util/logging/XMLFormatter.javaeAs0x 2ZN.!ؤi^Z#dY%H{Mu}49 VP9ax;~׏#J,!M9ƶSK]kS c (f8 xPKb"FPKIG@OSGI-OPT/src/java/util/prefs/PKPKK>5OSGI-OPT/src/java/util/prefs/AbstractPreferences.javaWMsF=_l-K1-dgk+ `Ì23S[d,!8ǼizZF*jXZhq ]t<f 5F!8[4A*#`Ät)tOԆ+ >U3p[ŠmA* Ab.1URPp( |-022g l^ox,c)nx&Ū{)O5E<KUU ( lYXo4\.`Tl7LSgzـ$\ +~u _ߧwe8 'w8 FɍO' ?R>&E@4Kg^E(*d yC M.R@X5jIAzō+!|-٫J\QբPgWd* J KLTfCFuL%2UIw<ʍ]FjYb/\+"y$B°j̘T^xp ;]/Ra oו4ű*L؊Cmզڠ J86'Gpĩ#~~yCjt}>&!}Qںȕ7MmZblUԿ,{ ;YU xII+=@[GA]E &g {[Zm#dnHqS<9̔a_"逜dwMv~TFbց}r7MXU*.CqY[떮M!:Џrf+SўY8)1}zM@ҡql86[ɝW̫i0o+AB8uk#gfL8Sg OuRS]|T,*GRw7GS#Is?ՙzr0uߐyP9=37[hToPKR"P3PKK>7OSGI-OPT/src/java/util/prefs/BackingStoreException.javaAs0WPpsks"24 V%* cO&+L'δr#߮_B'#ôaHF U~Eki&K@e^,TInGHZQoNJp1 14x'(YbiQɆ@ǂZP};:'衷Np`A˻2÷s}Gb kt{U!kaW' w=ALU-66!9{#Tu+ Cަܛa/xlBaH nCOSGI-OPT/src/java/util/prefs/InvalidPreferencesFormatException.javan0)~xUrTiva9 2If+*IY1{!(wݑE ts0: WP9a|5^$XLY2{*"&xȝIY*Ъ ܖ4" 񓌕Z*bFCh4n(Zb(eM]3ums7'8]gi"o\9DoiS1wlzujpśDVذk-:hQ޺3IUt01MΚȥ&pۄ(ɐf#|I4 =!][ޯVb3,W-7:].xvd&qzj5o)de)s.MUޓQ\2;iZ,<;{N:h 7y-/U{Q߹f'ܼ)ѓ#U#Eo@/g?s]{a<籠'r]J8rU%PK}uPKK>1OSGI-OPT/src/java/util/prefs/NodeChangeEvent.javaQo0ǟOOSF h# vf;wiZž]T7{#ð1ϿH$u-*ë2?_GZ,ȒQ3CndARVd6X1>`o ‰GuCi3Zz*q 6Z'Px< r'4> p8|8֦X;I,g>Nd- lW{ bZt2{N{H'U!)uFZfhP$9|OI摇ܧ˯%"ɖ,|4OSGI-OPT/src/java/util/prefs/NodeChangeListener.javar0)v|3.9Qmz 8(ɻwiⴗrFEtu{2TvgiHa~Z[gZТQET(S !nEY74ps0Bō8J;,Y(A[vBcIœäNpOe"7A_\!aHjSE9FdI[Tւp2U!ڈQӞz0HUKt0e$YgйWa/6`3I"nq>`Ko}K &->?c#B(ɶXPINT(Z4GY-J/Бp?sFQ?wыsԄLTڛl${Д_957-ہj]ڋM=ozMKrWEu,^uy| PK/MPKK>7OSGI-OPT/src/java/util/prefs/PreferenceChangeEvent.javaAs0W 2.vrk}2qQ5V%* O&+6I`X{$ Ym"<"Ե gžX%2for) RJ$!$(ӟ qMJpA4&b[lJ;CZeMPmӣumszOCv!\}x65Gbq F׎.,gW]4xh+fEm *C|洧tRUCXv0mJiֽX/F&I4SЛܤ˯%n"ɖ,|<;O_Q=TL,vŒG_5y˧o"-S%j:^T.hFlcȵFD$Z-WBo'PKPKK>:OSGI-OPT/src/java/util/prefs/PreferenceChangeListener.javaer0)v|3.9Qmzp8(`mJݻ´vpkOX.L- Y oWwK"װhXETXB'K4X)h,) >a6f;/qR rYd PQj$PG= 䚱ΤIiP.SuM8?D0 Ce=h7iyӫ٢`WG;O 4S"gV ǜԃ!G^UA/Suν2/#~ 8$8KyL_vx8=$ v{XR>}8}Izd˸>k;`Lv+JƂ**5YwFUFrGZ,LKGrW EA>B?D/Q2Qel${T |pyܲ)(&x/ĦG_7fx]a^PKW%PKK>-OSGI-OPT/src/java/util/prefs/Preferences.javaVsF~.Ŏ CSScdM dikĝzw3ݓM:Ly!}{{//f܂Q􊃟yힷ_<{a ,ɐ(4&~'mxJs)BΪGglB50)ǘb*iknE*CN #8@`]|d?w:cbOy'-3 0H[֠+xMIk BzfUVp1o3f -MµQ|GMjjpGDgpGAԶ$NA1GU0 F!?7AxQϔdrr!B|$a&KI:ØxLysB%"P-˪I`biR䆙^]6QѠ>DrStSj$)bqH =D?T,mseo?>}W+FW:免P`lWق;]EEɶ^DK-'2Eafl#V'$ C OC`Tg:3<Ͽ ^4!-kt K T8(>M8ENE;C*cXϥ7Mٲ,Q&Bo|J4׋㛹7s4ͽ>niRR uY^(H' M%+_)qRPS"sktU\h*fJf,˵p(5)b3"\ѩ,WiHrbxeB[7݀c&8+SkBպ[:67'p. r=/ZP☪C{F ɡ#$9$gt¡)tuh6-ёN95PKcPKK>4OSGI-OPT/src/java/util/prefs/PreferencesFactory.java}Qo0ɯ8S; "%&5fsfRypd:p6cZͰ.?Im+6xL"7٪ĺrfli/Y~;qd|=*`L-OSGI-OPT/src/java/util/regex/MatchResult.java}Ms0WtzLCqfNv$U gNJg%ǻϮ^Ep mNV;i5UYBuR az=gI0:D:XC{:a r'+TkF CȌx=1|GVpa&k2 'a/N4wA#;im۴;Ǻ._,rǬ{աs`񗗖;ޞ@ĖY;у Z#{+I6 SKGVn==?Fn2&Lr2/ o7Yɗ%ְX&_|Y_6q<:`LyE(!4 VZ/ZV* ڽtZA{IӋB4x?q'%[)OSGI-OPT/src/java/util/regex/Matcher.javaVMS0=7bS¤NdBh3I'e8*QQ$#ޕcJck]Z58ɟ&軄P))tPn5m3 !:3LF 2F0B'h&a.b~T+MIKІ78N0O A1T*|1'b3+jsIr 3 ÌI`eCT.&DVk>dֵ{n?~f֕׍VX|(O rf1sUbƂ,zn%I5¢I#+ʑC_6`ل0^taԋ71m8Q`A7 va~M@r. ,(cʘCY!2jrS|ZL(Ny1*wYO"Ob "W} qs0ZPv5#I?M~0o臅UD.H"LvEJZq^s^MC[bt w:L t{u8tb;,$4OWݏ,iF:G<r&_h N!CVE̳lv0c/]I5Tx+^<_jPK6P PKK>)OSGI-OPT/src/java/util/regex/Pattern.javaTn@=VI I X$6NKP'ά UM!o޼y3;HgKdW? {@߯waS,ɘ'kLST`nOzpJsþ3G;RbKF\ EC"WE-mͲSX%pZsȹagPӢ fjgiLl6;Re}yA='u,5(8OSGI-OPT/src/java/util/regex/PatternSyntaxException.javamAs0צ\Br56gnB&`[ӷ&`e%#X%$JI x)E~^`ˈ r' KhthԢGoN ^0GL;qm̐6R!`W`M 5fWZISc0k,RzӧkKTm#qr[u]:g#wk΁x}QB٫- kdJ ¢ǔґ4G~) $4$OCՏ 2V<lEƣod3f! `W[mJW񍅍9[r5r# FT٣՜j;gul%w >?b/,VMYs#PD\'?htP{R*UCMҧCO2r5 ;4RN]!VxEj(5VOdu}.uK5~PK+qPKIG@OSGI-OPT/src/java/util/spi/PKPKK>4OSGI-OPT/src/java/util/spi/CurrencyNameProvider.javamAs0Wdg(89QmzpfrbՂJ„ginFڧ[_p+#ꃃ9_" i$G,!"ې{-#V9x(-V BT +h s/M[ "y { G@HZ/a3xxO@tP ^ jb/8EujZHJM+VKiD+s֛\Q4_';sJ#370W1(u՘CQ5XПIjw(On< ǎ [+TM2<9k_PKO:nPKK>2OSGI-OPT/src/java/util/spi/LocaleNameProvider.javaSo0>/'XB{zʀmPmyolU S!/;UW0he0#X_$u-Q dr=~aV`EʘB RJhTI 5(ӯឬZM5OSGI-OPT/src/java/util/spi/LocaleServiceProvider.javamQo0_qT,}(ۢ!]UM{0bvHQkȴv[>>]$أr,X՚п !AJ%yrڤMfASo!UZ~_y65.1Qzhq4 4ă=\A mr؝t.Y%r%̶υP>}hԶmNĩq:khObZSuEφt>BYj-jaTHԭu97*Gf>8^7EhMewYhr>.nW˖lʧKL|/2{l~OfȤ=X;Lqo 9#yKlTI(́\-۳pm*sPO_(I$: \ubƕЕ̙ѪBx|v1ye c<xDퟪs_W ϋ/)I~PKH$PKK>4OSGI-OPT/src/java/util/spi/TimeZoneNameProvider.javamQ0ǟ njA|{ڑ)9t)%IJ}h濿n;f-;C9U mJ" ɛnmXLkthX%D$Q9UZ;ɏ>7i2aH6Hu {q=YlAG)zozTW $k N|j{Чky?w]qm=nιnfXfԝj9%ˎ#TRڈQ[ׁI18d*rRad 6`YlyutNM(`*gl#|y -:hlpy"W[}Fr%mI5UFbG`Ʌ:LC{Ÿ^ Q}~HZOM F- J6.kWT'OSGI-OPT/src/java/util/zip/Adler32.javao0ƟOP@֧v[ $B[ULrlUw*&-Iߝ=:Kp{'M@`^|ȔBd<>i"*=J!\˒ !l%4t~Pop-VM@=Z*=dFiCket.Yr WBAMhԶm*ĩqH~tOf[n"g#wCX*ŊYhaDcD u=7 GѦ>8j0r<6 E"/._~,q-l_/0.e>=!GuѺc8) :AX#Tʵ,5]7&fGNsGc XE%2pXh$'oPK PKK>%OSGI-OPT/src/java/util/zip/CRC32.javao0ƟOP@SFVմk=!eUCVM$}]DLΣ>K$U% x|9ⰍUP:ȑ=PC09)GjU#rt!n:& u`,^G=VVzxH\MHkt.xr WBA{a4j&-qm9NZ7NgE6]֍9XYKoraJ41uco`SHlhP%ҬIf`r,oָKVdN+̖t.dqjqz46t2tȈ r+snM( >U ٽtX{o+E!^V/i72OSGI-OPT/src/java/util/zip/CheckedInputStream.javauOs03Mrk9f &(Ũ?84ޕ1>ؖ߮`v`\ǰrȅL:zӰ ˠDfMJ !(-6e!׬p4+ 7A0F4D;TE6\ KP:}!%Ӑ֎Ajs.:?gYu)SeL6/f$ Z yn&U3ugMp _{w1#~.1 *$<o3OSGI-OPT/src/java/util/zip/CheckedOutputStream.javauOs0Sd2ZL30cfraȒ?&n&߽+;4HzoWEP`xu0mbr!8 j6Lޟ4l2(-,ѢcRB J-x٢E5k3$JU:iLƣI<a o2 ܠv%4jGPgL $8fc$gdдڼs#lӟ ĩ2]&ZHԣ^  P0MT [`=(3HgNpeU3!lh'Fj$Lz_򺨓PU+xȗ˼\75TKXTu*V(@gmB85FƆoxCγS{4:fmVKm|s?}BYќBOgw\GگiFt-6OVijgܡlUz˅Cs&y>1LO3˞YrΒff& ^ouNӘR :o'{EPKL=PKK>(OSGI-OPT/src/java/util/zip/Checksum.javaeRMo@=_1Ɏ(89QmQ#,'QT0qڴMZ̼}ͦB郡n`Z`U~$E ~;KBia (-6e!ӢX%%24&ci2 a' o9BK=>ըZ(m =Yx9T/ (ltD'ti&_,rUneւ O\@hVUbe@tTP=r$j 3TyʴyMHd%ge^Ɓ>|Zn>[b/KXa*M*8Y:d˸>i&`3OSGI-OPT/src/java/util/zip/DataFormatException.java}Qo0_qT,a}ݢUA"tUMr ނUfLmyHd{s"rEU"m)TI^N&Q KrdTŬDneIQVUd᷄Ԉ?}ed 0KU8;q#֐P ޙ~{:W $x5 n<`xy{ӳ|Ibq"l:ϋGTCVZv>B*ŚYA[׼ԝ^z 7L%r7ed860H di r-VO4_e%|EΫgl :0 qo>#9CȒ5{I1`d^?AIqοOqe*2cD /n ??]uIU<pcpG<ݖтsgs{a'S=PKvr0-PKK>(OSGI-OPT/src/java/util/zip/Deflater.javaO0ǟ׿SA-<=B$ iBnrM;wnJC>]lwp窜i^-4}  yOnbGѠ`&'2J9T2G v,:҂ W]h:`:@* AF\ c.!Semmx^VqNPCgPhfk[3Nlt t&!n@c@㿊kx8V ɫ`SPXbV9S-E )drnʮ # ؘ=/ ك3/  &[/0 ΣAS~aH#:Xjn ⊅ZX2%f|3jM+ 5A-#(Q?p^![fK}BF a֮,'^6jHcL0rÑ`ҟ_K&8jO:prO}G`{7uϤ$iݏq~0Hx˛~ p ZWK._G܇gxu'0a+ނRi|,VZ%xم.vxDP拾hY+;W|F KYfymnąn]xĄuZ/`s(&ΨA#[슭-,v*D _Ƣn^;t@F]rg`z>n ;l`0 C$VN.fkKPKؽPKK>3OSGI-OPT/src/java/util/zip/DeflaterInputStream.javaœn0 S9%礽m^nƊŰb7E$9nVG%.aHóRz_ ` H$ ht p t@ve TKhT!5ो#"A?z]7n`#v!{$heI #:xol1)p# T TQ5Bhw\Vǀe!/Y_0x߃7II&?Ɍ#ӬxPHth3e{bUy+)WjEZEJH_ªxr 'DO$im+hl[%`o>`w'O p֎?/(PK >"PKK>4OSGI-OPT/src/java/util/zip/DeflaterOutputStream.javaŔMo@Wr+㤽ANM8=vew7T:iI;̬<: ΕWEY i@ǧUeH sh6XƬE@iVh- ~w"ƒpaA8[ZlA*E 5xWv@ {ܪ٫xk.8AWuk~=u]8V5X;Jϧ|YײAkז W܂LU%6e@y)Or$\' z3lQn0HrHI4Mx]/&ϓ"<]4%$[x."@n6$!GxrX~6?~e[M|G'(Q/OSGI-OPT/src/java/util/zip/GZIPInputStream.javao0x꩝BuTBWJ֢c/4+w rHb{s?(7|* R04%aA` 9KQ9\ChoR8=ڕ>uB+&A]Fb+ز=(rHA!$q4E4.n[ C!0B7{߯:a qmٗZ׿ƓY>yImյXQ K Qq"VjXiּԵ^2 _3f-bUОCt<`r-?̯p.lMr/`<]dl>{Hg1]ĀwƆS8Or#B?"9\SkXPZEA.#ub+<_}QD9F؎%2)(2Պb.Md2e*{lK$*$hы֩IpAU:_HlGb>/gCiVZK@F7 b( 붋 O;pDϕ@UR}Ao\q/‡(PKb>PKK>0OSGI-OPT/src/java/util/zip/GZIPOutputStream.javar0)v|3;n4pIoXcXR%af]a2ڜz(@vETdDw0Ȋ+q] &9x>]@oCrhXFMGiFhb8}H_X$̣`ԇF8R9h,5>pGkwuzO:FrF VB`stڶm:HjZvz,i~K}֭Z0:ޞilK5kA`A9[#UV\ zRXgĶq=3R/46&a#Izd9]qId9,tl,'{FFuAa ?)B8@ة3NpjMV *uD##hcXzZc/_h4;;q~ t1]}Kn ;CYaR]1xre|7n4zVwBE#3 bT3"64M]0~9<, -| PKşuBPKK>(OSGI-OPT/src/java/util/zip/Inflater.javaTn@=q[Hk5 FQbfe(YDBy͛][.L2[t.LB Bt08> St0Evi J&P-!E?M:i4x@Igbc X hCP8d`!%H Y却RҲӰx%pp9 .m A$?eYRUub4GXuSu: U%bZ(XEΑK+I,=M*Y9/hϴF} 0(nyGqϓD/܄i8E&S,-| [}.~)!Fܓ0$c"2tV !3k'J:VSOJ*t0oo_X {b6BB ֻ& upZ ;xY괮5,JSrZ%Xj )LU#vAʰm:)=ʁ: 3DS\Ug`^z9+֔nP4v%hT]jO*O'OOkfw en^^M})kU ݳؗy6[?PKmKNPKK>3OSGI-OPT/src/java/util/zip/InflaterInputStream.javaŔ0xÉrSNeP֝Ch_K4$1I"K) b&_{߃;ë~<{!3#Gu*2,--19x;X@- 4f9ݺ>\IC{AcoS5lrP[$nr\mtpnt.;rhz*υ\^kiı2@vpNlSR`k uD ր2*甧n w\VXU6U.B;1RI%Y$YE!]/!Y,2f0_d>I|FO}:)2O8S TG$1%ϩ5YլB@pj 6oc]/_homY\;.o\](F#T94Ե˜A!rs\ŷ\/QsNOETu)ҁ@׎\O$ [f!lMӄ k!1?5AvFFE#Ӌ~HN=!{8 PKbB3PKK>4OSGI-OPT/src/java/util/zip/InflaterOutputStream.javaŔn@)F98ioq0m U,)U8l3]vqCwgIEC˥|ޙg^Ù6;Kð(?dRPt<>Io4|yt0Gv%UU+/ucakON;PC5AMo+4HA7֑_u*nz N0V?޼KEOjی>֍.鬜aC֕Xْ厗;*dV):Dcԝ%OIwbY󖖭?2큑[ $\O<-i Ίyȋ]@6<d˸:`L v%BH`E5UܚjZ 4zVqG`nȅ:\I }H[O2Efv6B%媖£-ZoZ_zbI$^=V,OSGI-OPT/src/java/util/zip/ZipConstants.java[o@˯D!$iKBm ;7vw!Jq̙:g 8Q4ħ$,98nyuڦ۰ R+._ $21O_C,ƯI T"KiwᄀfyzMǬ=;Bi(G `#5BA]yNBNV!9^mނtm|οt:áJLn;IŪMp]׿OH+^*f+dVr|3r}BtmIN2kB G,-n^؄74VK[ DX (ls])[@T5zy@Űk 襥y0TR&jM"TbS dy":TaCvxw).g^QKa4PK`[PKK>(OSGI-OPT/src/java/util/zip/ZipEntry.javaAo@W8AE ͩ-ZMFi̦]ww !Q{g #{y݂0RZ|ava} L:}saH34yDx`P] %K9wԆ+ :h7GIU[T* ̹@K \BvQiTm4Tb Jlc--?ccO/6_IMސZ 445\,!@i`F:ʹ^in{`ܮF'qc5O*{#PlLBۏ ɏDn:68D0h8tw ~x _pȨޗM@6sE,ƒ)1sh2X%jIAƭՐ^pl迹\~E9vBwlɼr=r*bT0riJzjFBItE<*Qkzhιd3J,'W~<Gx77\ȊllgD)q3=ϙ0/p-9V YAXK,I(OSGI-OPT/src/java/util/zip/ZipError.javaeAo@x546'j&bfZ](ਉꃭyE ̌=:wre5 +]1qkcE܁T =UhuEaGȬ*WAγѸLF/ FWhZă=$;]" { JJP>=ɤTSIsM>/{nuCџl9BY*FX8ڑԂԝÛm蔣hS7mx Z )AV /y1&wvl|^`lr!// LЃuq/ z5g$o-[Ujs e#Xr{zM{*+$;RUbۍĈQB9qʟő!u9ןw}K🴐t'<#yNPKܥ-PKK>,OSGI-OPT/src/java/util/zip/ZipException.javamAs0Wdg(9Qmf`8ͤ7 K$L{WNi9H'`Ps0 #!+r.~_D~6-+x;PZ5p;D?S%oh,) a6f/qR= r[d P PrIœ㤡J']UsMsNa"1Gʴqw]Zg-SOSCk௞ ;.O 4SUdN לԃ!G  :Ce^_6plB,) -f1)""K~dIm. *nmgI_6'OSGI-OPT/src/java/util/zip/ZipFile.javaMo@WrJ2 ┪\ƞ8 V:MEK9$^;<с0jy8eəGwahPo0 jF觻ԆKGNz*!-ɃX/2TLVCk]y:G睇\ZFrFN}!0Ah4Zb_bTftM8 uu*J44[`2$֒5 5B#Y-\نit697Vem47#/1 ( ҡ39y/0d$E(t A|x6QPU@ܵs7EH (gT(jV rZPEPWܸ̝M+nm_QK4<gm_[^\MP+Z uYNZk--fn[v*IPI@><ԧ{H\>jK!*gw?0f߱]ԍfמ PKbPKK>.OSGI-OPT/src/java/util/zip/ZipInputStream.javan@S854Khk52&bf[PĻw8$T3,`jCBxn>gXL thwXƬEnea *m# ~!|CVp! >4&^b؊=(M8d `-k|,Hޚ*z " 0m8ֶէ\7M,eNXHˎW{ bZ-"H{JkjE/SJGV#[?O $4$OO_wKO$[ γt3>}${iv3q|4;`Ly"k}Br [SU#*J*vV:VǀV _(x?qCK3 L1BQ .MLC9Y[&T,S=p'┩H!xӷlv5R;a\Îr"PM]!|)<&pwZW;)0aY|]~9 &,xai'9N^|Út'VH()PKA)SHiPKK>/OSGI-OPT/src/java/util/zip/ZipOutputStream.javaOs0S3.vsjڤeŒqIo2,X$LL{Wq>̃3XycHOB!89>ߍ k4FzE@ds he!lXNagP$3`4lsgqP-RYh 7Pr796\̀q . z+ v6ӮJWSqԚ*^DI&R 44j` QlKu4J#Y;-*m4:'30 3| 88x9U^&2HװHeӄ. LK,'F 8 BHFisA\[а 0:󲰌.V&Zx;Ymu/={=ӳ1-ABL~xw^T#iSZuC"Nor-ܝRr>>_ՠ]ڝ}G >s%+ܣ]/kݩPK ;lPKIG@OSGI-OPT/src/javax/PKPKIG@!OSGI-OPT/src/javax/accessibility/PKPKK>0OSGI-OPT/src/javax/accessibility/Accessible.javamAs0Wdg\psks"2 8(o%UL+NI8H'`h{H(0^>,q؆2(qC0'zC ~!3U#:^<fSi  FPC=AC$@ꃙ9K C^\pU\Og$0Lk&Elɫ{T΁_=YAfN -"׼ԃ%O]Ӎ`#-ս?Fc fiY5۴ʪe0y̶_-6OSGI-OPT/src/javax/accessibility/AccessibleAction.javaMs0);F;Lb)'FV֎@$0wVꃿϾa /b)Sax1ߌBV^ia7!9x,nU4q8]1|BcVpN`~i0Ž@iE*!c@(zhpcœ]KHΨ롏ֹ2 ّ8ԦIkE:M"yE}Սh- C` QqVdh6HkN{'T=+1f#3lݣ~3S0 H{t!YmZ:M W0ͳYNCuƀ S8O#Jl\ThnYP=EAf'VKo#N8掯EA@9F_ٞ݇s-)L͡tܯKY/bǏn 覴yT+?̒*dKխ||I>/leY)-H_F? nHž pgFT3խrC/x/ZnDgPK3^&\PKK>AOSGI-OPT/src/javax/accessibility/AccessibleAttributeSequence.java}0)F9%+ inmN4+"lW{4fBCHwqVVZgқn`aU͎`,'**V -ƳC |8I|^`ɝ-!GSF, F!5̽'ІwVx( 컀6(ڝ .H\pAǫ#>0 8'6i{Ѻ._,rCսn9W;N :bV `,"x*R- ¢#^ #~- ؛pJs<:A15a17_alO sPKax>PKK>6OSGI-OPT/src/javax/accessibility/AccessibleBundle.javaOo@q[jd$L^3Ͳ]㠈Yp$>ڝ7o~<:O:WrA -ykEzt\MHF/AX!dVHt!DhLЏ^W &bkX-haI %AZ %ca X.iV"tg2m=qj\=R׷Ey{{p!W[UQ;Z0uHCfZ0,GUޅW+؄^VB^*+rM,+m \O|O >}xyq3x>[7`Lq"-JZt݈6t7nM>VπhhMA^q(I8hKls*dHQNT&2TaN]9:P|QҒ3c'dco/`n[%^04Nn? 6&J__ ' wI PKB<\PKK>9OSGI-OPT/src/javax/accessibility/AccessibleComponent.javaTr0=_Éd99ZO)t0I&GY^Z#9C:!L9`}zz0TVtea}d`#t/=OۆCA'G2 BrQWzp%@:us~(5ۂT ! ,EOs BW뼖V Yx9Tli| fkgem/gb_鴟? i4@S2Cc@c!4uo夊ffS]jaL{`ҖLIZąm mZ 1 0uQϑ܇y0]fsΦ7"Mi5`MFFS]$Sq\!avL\,dZ!UԒ:Zg!ZXfW}Gs~ {$G"v{ELäYKFNu=!ٯ$J  $+^ %ꮣYi}oav+!sq.'xꇢ{HWK=T͔N]SV4n0Gni;kW7MfGլWsוHqf5Sw`xe;噌8-؍XS>A#ݗ> 3JZ ([hJJikNT~UU4)cV#iܚf98}"mdz;m~Z* ?Bv*WOiyPKEPKK>7OSGI-OPT/src/javax/accessibility/AccessibleContext.javaW]oF}.'&1*6I{ٚCj{2! qν~̥_&aNpEBko7ZWL)MV4A Y@yJCxH zLSt&)[r}Wl YJ0cXe\fr(x)1T<뮫۾ez`8-O/e@Q2oq<@3"xVL¤4])Ŋ&=&Kh``"d|"Z ;Y7æ,bro2EI !"j.雄_ʣ3Ib rLMy(ڨy| uƦ&[\=PFNM |Qa+L+:)j.pk70Ś>Z1Fh&qL쁇,T7\ ̚X mħwq-(p7!x|Q_~qԙfa'}h tkU," ,F~<OSGI-OPT/src/javax/accessibility/AccessibleEditableText.javauRMs0=׿bd!9f`&(Ũ5*1L'+Rhh߾}G7ؽS嚠/0Ͽ(HJ -wacCɣ=P!B ;:x u>PM mj̡PKK>AOSGI-OPT/src/javax/accessibility/AccessibleExtendedComponent.java}Rr0=8e34o%ULޕM&4 1}zzﭢ.``93d_ %!Kbq~ [EU J+d!ؙ֢w4pSS @*E 5x,Q; QZOnwgdJqP |@~ FѧoE}߇8T3FwjfKV=-Z udq1ЬkmEʀh r)7H6sv0i*PѹW=id/03H ,,!ɿmsx8͓u-6M'w_ N6Io߃GmI>!C|%VgIVcI5lM6hu@#h4{~V=9N| z (KC@wɹ94Ic!SV+~JtW[Lg[$+oAV}D@ŒtZʰ霅T~ PKǧPKK>=OSGI-OPT/src/javax/accessibility/AccessibleExtendedTable.javamAs0Wdg(89Qmf 8(Ă3 ci~D|tw26mI(0Y.CoCrhXEMIXA*4vI'$JX n%̽`6f[oq= v[dPSGR rIiХ,|U})&9}a"1G4q{>]bSEk௞ O\@tL%Eɬ@A9CTյAoSu޽#~)؄YR@ZSREMx쌟1yE(_ d;TTӋ4'͞VˀiiONq\QOoC1R2Ԓ;]_rCS d>:dj;Fʾ=9ktϕn0K _kRnw/ aw8å۟ PK[ bPKK><OSGI-OPT/src/javax/accessibility/AccessibleExtendedText.javaR0=唬(dWz ٴE=U -mBUㄨ~7uI@4I0N}I!uH){,bp$+Q,%j[e>É_Q$S;h8Mf:ر#He3H@% Iqt6g Wbdפz?;qq֒* ڰVk3^ +dQFGS c(:$F@1 (89OSGI-OPT/src/javax/accessibility/AccessibleHyperlink.javaAS0)aR'rrCZ}ZN`fza(G Hh09OSGI-OPT/src/javax/accessibility/AccessibleHypertext.java}Rn@=dG.9QmP#,Q xKwcT;kSir`ٙo{Kt5,M;Xw bA4t0Y,Af/#lС=` 'y:]!ĭ*d;s֑p.`5ztWh9rPQ[P};Jw9#W#Y \ɁVv%Oώ}E}߇843Erf7z<t,~Ȋ|ՊB墵Q= (=6^uoIsp^Y4%9w*_%@bS&qI6qdsOl׏[x78& XӻdS}8}Iz7d[Lqo2W*sZ,BS5Bmh8힜V'KOОX/?( }Uu UQʩ!n%LɍVJn: 2Q_ oCWGX/P#?:pPv!?KiQLď PK'PYPKK>4OSGI-OPT/src/javax/accessibility/AccessibleIcon.java}A0ϛ_1+н{JvDآ=:$LlvRijsHdϛoGpsmNB- %)$۰JkthXLIrXA*w?Ce : `4F`q 9drPSG)zo|HuХ,`xUyo>&I86I{Ѻ9/bբs`gG'.O SIQ2k+zDck^ޒ'LbyKeBȣplB(- +F)-bLim^&[Z|/Myfb ȑ9x46L"W 9j:OSGI-OPT/src/javax/accessibility/AccessibleKeyBinding.javauAs0Wdg\psks"2qQo%U&L'+$Ӗ O$\ZR0 (ʯiבPa~Z}\?-A`=ITkU!5Bc,;ZGZUy̦lq,FA!{:|h<fBO}&@O` W[!?As qmtgK&/7z:t,0vbmAu,yRn ,T]hyM(%d n2+1}+vni6%[XmˊW_ ͟.ocI!)Bg$gPRCGSm/ZV* p`сO%Q9F(^b!%PE:2}arnm#ө7Wtv*.gZ ®?ѭuEQPK EPKK>8OSGI-OPT/src/javax/accessibility/AccessibleRelation.javaQo8ǟ/bt%}4m Ћ)2$s0gh~cBPӂ.Do6|QN(?9#YBaeLUThj1YfPd)w$WO*|nadfj,=9B&4Sa}Nhe}^LyjCO5t6@t ]vZM&eYZ"N)WMGUJLbHT Ǵ0ԥde1(%ؤLiB7ʈ_&`HC;7plLVn`eE=|[=WכbpKSb2*BHia#NH* ۰K˶R؊V9{̲*L g{BD1N"I8,ft16NѮ8 (\_,U[ 1۰pP- Xw9_{Yc~acvxz/LX]ު>ˮ| +`xԲ>y{e P?NmŸ7o]kTǑIT2km+(Ιת=gj`/PK1l F PKK>;OSGI-OPT/src/javax/accessibility/AccessibleRelationSet.javao0_qS: 6 bj4!v`ιͦUl &wߝQGpbꍥj!] RHhz$,$d:C2aBDFhZHk#=Dh8NNt1 ,8d9BifQj+mLe NBO |+ͽ*[تvlݾu:4dbf+) vUbƂ,r̛`IW=pfWb伥{Cs&؄NCw}gy/@$M8Ni6HG9yd\׵ &qvr=)%HrkjDP%ZAvA.lc2`- ]zW(ԏ"&b)Y R7èn &H%1mc '=D/jk<0IO*c&9xwwnȸ]у.-<_Ro,ɹX0nKCe7jr6)KçEpD- hOl(5< gqGG?1~4xޤ֊M|(PKTtWPKK>>OSGI-OPT/src/javax/accessibility/AccessibleResourceBundle.javauQo0_q m4ECD說\;cgC@}!MC"D0Ɉj`G_R 8j:0z~^iaːJpTKhT!O_w4VhW^0K[t{v4CX G}ݣ>'CсVB`s(j6dqMɋFdL{O*ւ08X%kA`A9[#P޺6ΈqoؘAC&Γ|MvwzdCy.M qzߒt1Q<' LyE lVpU>Qj4{aZ,{EA@s፞؁C9BHN Dbg^MAS.{kpP6NpEK33E(+LJG͵~vz1 T# 9~PKrb sPKK>4OSGI-OPT/src/javax/accessibility/AccessibleRole.java]o8_qԫvԅV{aQ%a^E!4&BMVT~m?W/zx4@\E&o>jBݲP4~"h/3Q4bb#jh*Կe_wp\UW7V9}laŐ le.@fjAUAOOOёc(mCJ[!mtԶp]òލcf{",r4PV#^AZtb5ZQjbw Mmi-4f#}k%@--DEW0&jʋ|Ê!aG#!L8zǙ*}c[*eGV Stg"!1L ӝ]"B*Q?FOkhL.et1.m4 T֠җuf Ge.۷A_dB*F",Њb|qxn:V/=k+4FGΆ4O~'<]Ʉ/(3!; AC2?LIsdyDCq| )>gg1nNJbP۹9 CC̃SibȈ.a-cx3 (NT/F`U 8s{'ϔq\|9?ߐQ\xA\<];I+,b8|8'݇8yb1pz h{49i|F:=6#~.N'c]HC:u׿)cxPHċAwA@"5/Ewr!yߞb$&c$!gQZ:vlWFd`n{ E+Nc>=!N=$ zH UE=02s+]$!Ֆ> .[;??? ֿ;ݍb}0PK}HBcPKK>9OSGI-OPT/src/javax/accessibility/AccessibleSelection.javaQo0ǟǧ8)2نV)hAnslfhwߙ0U3m<Ar,M{EṼ]]٤6[r_gl=|9 CkCI)B6'$ע$N49\hXVFў֫B$?wqq$Ex]yIc\a e_ћ DU O0]uIžSI eKi?d)aͣ}-w* !CRcPK^4PKK>5OSGI-OPT/src/javax/accessibility/AccessibleState.javaAs0Wjhnm8AN-4dخ, L&+0&'{oƘi N͋vҁ]I i*yh__;!2+KD)JL$/bl"R?. U<3mच:&_‚o 5,K YTs" 2$_UOE1Ibcq9 uzk]|÷\znm],e JYJ7 L1fMr|ܤ^+e6BO+a0Yj%K8}F,gpBPvQ5{Q $HSA0%i0#C\(SƔ8w]&D#4E* ȩLl3|%TA!B%L*RsezoWIqXRo[r I1#Rj.-INmc/^Z*Tf lE-1w mWRlD:pl|c'= b;6k ]fq4[plyQLƭh/YSFWh4*"1c(}UWhZPKl+PKK>8OSGI-OPT/src/javax/accessibility/AccessibleStateSet.javaQo0_q *XVIe[ $B[U;w*4uR(wߝI'06RЕ=e_Hh={qXyt0GvĒ a.Ђ_!$h#}Bh8 6bgjXhv r$[ ͺj}Le ND_+﫳iXccˁ:E:L[nw]j΁5Y8߁J]hXEyKtg -?ڽ#8&4t Ҭ,r..ptN2a:OSGI-OPT/src/javax/accessibility/AccessibleStreamable.javan@)F9UpBoГIR(T0v΀Xwg66R+`{wfߝ_Gp Kmzôm!kFULo73۫8l.d:ؑ#{C, A RЪYG`!12/dk7!a2&WA-4؃ZGJ \ ݘcU <:((FVD@?B_|u]Xj^n~.כlZǪUs`gV&{@#TZcV$u,{V .}́ie b*$'Y͂c}c%}`vJv#;H6O)ݬf@ba`p@( \r!Ŋ'J&Ca !ܰGghE Ox(sis1S|dKNxM_ѫPcJCʕd,j5OSGI-OPT/src/javax/accessibility/AccessibleTable.javaSMo@=׿bĉD!96V#0iU=lkﺻk ; F|4$)7o{;9zXj, /,Lre{}8 k9sHnGip;C 駮 JeЅRQ,U 9[TJ! LE !UVsjjXFpF =Mwl-zY[|t JqtXӹzAO;1w)49N RYBZ3VRTʩB>5h&X-Hw c| (}4ލ>80Ao8p@O!@OSGI-OPT/src/javax/accessibility/AccessibleTableModelChange.java}O0ͧq ZC l* ] 0m]!߽J <&X(}6T la]~6_& WZHТ9ndMJ;h =BE}g _XR'3zo FsoqV rXdPRPZrnNIP,|Ap=t;LmNDG4OSGI-OPT/src/javax/accessibility/AccessibleText.javaRn@=+;驍z 64q /tw0{g1춉T0{ov5MײZ' ~]Krr?M={ EHРb1%9*t@ F[XWF6 .0K镥7lTCdi5rl ٴ^z3X%8r4+ <Q[=1(] UƀxѲ\Xk-zh4J#ר{-Ij)-M! i,'l ?(F̒?I8 &ʢȩǏ9of])m-Bx&lL,eTՉ j;FV KSˍ$A_젹p-7;O9ˑ+YK_9m097B] ޴?kpGy5BJD Nday\Y!޾{X&7 dU+$d[ܹz1b\o5&.,iwO kS>ygz8Pϧ;K9{;sEO^9TOyPa:F= s?HIX:ܳPOIPKEqPKK><OSGI-OPT/src/javax/accessibility/AccessibleTextSequence.javamAo@qȵ)Khk52&r\31(,jh37{+7Bfa,'*dmKBIl:~$ 0`ITkT!3Bm#`LaFCk4`/N!k-xh<f@{@q/~ھ|JӾq&Nm2һ|,{޺W-:wdquaJY[у :P<&LM[:Fzc FY y9Yqy7VxVkX| ~Y6x BS a/HΠ-IN4>U =p Ҟ_aQE S1R2UԒ?#U&V0c6Zї9 c5OSGI-OPT/src/javax/accessibility/AccessibleValue.javan0 S9%ggm=yi N[(+͖4I{Q H:-5;S9U k[J"L/w1, װJkthM!ܐDp ڢCȌ#1ܡu\&sd MfW{;drPS)3#@~w3x=t'>O }zvޛi: C"NĉMڞ.ˢ\e1VXٓ厫#TRTڊXׁzI518]AX 6[rRgCȭ?؄IVB^NcVeL͗:+6:䫂O +k^\ǀ<2cCIa-B g$gPRM[SM/F* ڎ\Xcmi#/E_PE<؋C"d%L_0ynm-xoN=c&$&') Eo-*z??āo9-zܫ / 9WPKE>PKIG@OSGI-OPT/src/javax/activation/PKPKK>7OSGI-OPT/src/javax/activation/ActivationDataFlavor.javaMo@W|# oOvZKi-ޥ Ċ;i9R9v>yY+`8:( *2#Ϧkn0l\ -+8[4C#s`Q_H$̂)]hH&s'qT RYh 0P3- :Z'쾟38x4"#7|*. ?{kau]=qtVZƋU2u'+24}ofǻ#`T,5q*Gia,}0jr20V]c_,'#[,ൡQBCƩD&J*dou§'KWsc -BJPg$SS& 5Y6X%-Ԥ¸k5 ;JEۇ{愾bfV}ܫo 0Xś [-v69g5JS. 7k:Y ԇhgɽ۔ƿ$!#<_W.MdSUs8y'PK64Q~ *PKK>.OSGI-OPT/src/javax/activation/CommandInfo.javaAo@x5$6'jdK4q1uw8(Ϭq#z#ϼy[yr 3],|4)*' /1m2^i KfGɭIYZQk2p[BTX.)^0[ѥCi{H, S r]=Z+ݶ;w$x= ms,p=t:WLڶ EGjSLʃNn<_S%Y Cixf\-( qiO*ưzZa۬uF.c (C #lMMz}XD2gHUӄ߮%'WcGSm)}[DFaH\ndΫ;27BM_e)e%p]d/$8?QS(r'weP7+Ny)p]cx+8+ 37MAӇ^o5FA5ey&ύG0Jx%~Y~ܯCb}nktk8w_%]k7)KPKKS#&PKK>-OSGI-OPT/src/javax/activation/CommandMap.javaR0StR'pk9 -B҉CY;jmI ûw RhhW{x WF 䣀(ʔuo;gZ%y ^X$-͡s2Ɣ?LBI f9+UA+Ae5Ltv $ Z-bNIP3\yNt Y8zu]&{&(9|Mթ,Z0VR1k5(9L`=oԐY\=tӨXf7=nb.myf a;D+G;[waU6fNDIӕ&볡 _=QNZsuvVPpPKXFyXPKK>0OSGI-OPT/src/javax/activation/CommandObject.javaeAo@W|#NnmNv$4qY<)tw[U{g1hw߼-WQYSu+HQ]h%v_WۆSأA=`3y$@ uBg>jC` K'XG՝8qVY (F Uh#gvq$2{ .xU38hMovIfꩭ'gSI3k-FPDϬrԣ&KmQFgS~?#^Qq(3ߙ<LJ~%xAMlC&Q?drdOv0&8/R]LJ9vFb@HKTqu}Irhu)7i9_QZ}`ғ]:hkS`+xບXrb5OSGI-OPT/src/javax/activation/DataContentHandler.java}n0S,|UvrksRX4Jf*,II1{6]~3\8@}׵@g$۰VdɴTDEnDNR,Ȁs*!|#cp`FCi4{ k 1'@HNhp~ΠI~P܎|@|uNN'Nob->0pVd-Î7{@T9n q)OᄬBt2ΈM^lP( F9Β,"w:]]Zu ]<]^&$] =|M!GsQ1pB(jE)r&+Jd$;Mf'VˀN8t֑/?hO/->F;'.l8I͑)/ 5='`yt@5~+yL5Z4 ~z$T^$z;rCrUcˡ!ᑷ7g1nmVo 1|?Z91NZ%Z2xte{8itDPKLPKK><OSGI-OPT/src/javax/activation/DataContentHandlerFactory.javaeRn@=dGڜ4Hix=mvw[U6hv޼y-M7de03(ov>?ϒp t&G] Q RvЩY{̠؉Y'd.Pt<:G!Բ% A*`Fi%(Co=2ypUQ{o0 '6i{1_jUSO%NZv=V%pZ[@[+TM N~@Kf'rw86T0*ȫ |ͪsy(6YWkX2e=d |ϋe đ:L"TD$"Æ=YŎ=Hձ]iAz+_aQE@{<&(w鶜$׼D ͥ%{xmO'|ra =]7a8 sf3=9QPKNPKK>.OSGI-OPT/src/javax/activation/DataHandler.javaUMs0=_Ét!9BOSLӃ0 (%Uq +S2i9H]z_ЕjlnA~ЉcDиhϛ@?y N)MYtB- SYP2 #>IfrZ"Pn\[ 8'2_rZzd EqYS* Q̈5`c,bޞXf ٭fLQ{ ϵw%R:^0~‚v6!T< hpC*1'tǽ+|1?~ -`yg.XM%R2KaXJP z o]),u4ڹYu.=?W 6åS;1BٜNߑ*DY+(ϒW RŦz:74'j_&f ZXKJ *%5"h^!Sʿ?Z1)lտF`~!zT2up#m K]VnIͷuOlP6FmU[jPK~9PKK>-OSGI-OPT/src/javax/activation/DataSource.java0)F=B[ bHM$5'M+Ļ3Nj9${v,=;U⣂i`|?N &OHXɣ*I{AwR>h0Ѱ5<igІ$C:d)u@/2%JT] y=}7u]cOWϚ*+Vzz yI3`֎dMb)xSqNyvj~3Jj%'EZLs?m9Yl װȳeILd/9͖S ԡuTaS2$oT*5]XHNKG`pluP/W(4"`xdu3"ne24&W : q #b͛ܤF8նe*OəmX*noEPK{PKK>1OSGI-OPT/src/javax/activation/FileDataSource.javaAo@q[ZMm F9f0ڻ5Ê@l{o`Έb ; R >s/0J 3d6 9܊%rIܚ Ҙ=/2V( ^i:ة*܁TjK!,DI@ۜ!!Wnև{OmZ8d9Aju*t-vN @*S ʣn4ɦuɒCkaP3U f-e C|攧npB}j4c:#;k3#~*ඡNAukY߇,J4t48MxuQ?d=W·8EȈVd5b%r.M5ڐ\h2~>p[uA}~!NlQw?A ORE~1Ц mؠf<. MAncNS HuY`n}aGK];%ڨƾhjHzLZ3lX='ŸO_ PK=PKK>.OSGI-OPT/src/javax/activation/FileTypeMap.javaAo@x54 I3mvw"{fRPlyg=p6+G7a}HR >c,BÂ=cV"2'hJo 9?J?:!Ӗ:Q8 ;q#֐Y1'!r3-Z-Ӫ<z 09o-tsm7cx:˦S%9K+ia*+f-E m! K\:PVz>ZX 2k鼕ʿ #[?o؄B'ɐf|N4tu~}X$e:0_`4OSGI-OPT/src/javax/activation/MailcapCommandMap.javaOo@SrJऽAN& Ԣu8=vewm7ݙ J98yygr ̥k, L$ót t}36]55>'( P5BXB>6\ 80th09^VP=i2H n %,p,Uov)  B`7v֪I4>kR瓢5pkrݫEƀ4vLmkXάt-l4:Lʍ|[GHPlL !.x 7|u`Ma*Zp=-| ">xlrgw!F|d!%0Oh4W,GeZDPܸj`0/e:5x́,n3OU[JKƋ,K_2E- {UO9GpB\PFVBτ.!T.NewZ6Zϲ{kS`iڃÑ(l.%dUA'4m(f/5GE&?-}=O/ߴ;ue 5}2ǃPKJ\PKK>+OSGI-OPT/src/javax/activation/MimeType.javaUMs0=׿bt!99I39bڒ+ʘ␏6cio[HkӅn܃ 2D=@{=0EjK(4&PW~>|Cpk :Uwb!ֲAHF8OSGI-OPT/src/javax/activation/MimeTypeParameterList.javaRr0=)' z2maNqdIHr鿳r |Gڷo{EpR/0$RPBj<_ p t0Gvɔ TWPZĈ?]e: 1וz@5TbJ{29XDRPtvNCǡ^0\pwgy=5MVqm9{MӛIO^NIt,~ɲaUXV)Dik^Ս%OkfE[Z(!c zIiރ7I@r.pIH'9p3nE:>#9hlp2)Ĺ#IX$g5lM(JE[ \Iy۫_a(8篁؊Xmud%' ,#U$Уr$PPCq!Kq'v* :,'^_[IjO2BێLwt.KBnR;tZմ,~ii-V' Υ59OSGI-OPT/src/javax/activation/MimeTypeParseException.javaQo0ɯ8S; #inrRNj: &C"{$.0de,iHJr6{7OⰍUP:ȑ=PC0%)GZUR#J )uR+\3`4F`q-=ZG!!б$!J7Z'?gp $x< n0ھBvޛIu],zX:iZdE^,2ur~r 0U)6ڈBԖuRS8l*鼕ֿFRc @V1-bLjlQ`|_gl_z 9t46$`LyED r+KVԄZ*NCv/]VǀUi^zr(9 F?AcQzy;"nx('C:Z?AIUT\{ nO'Ol]pЃ)~PKO}X9PKK>7OSGI-OPT/src/javax/activation/MimetypesFileTypeMap.javaQs@˯f,ؼ>QcZΈi&+\q[^D'޻HiA=s]pmV~6yIB\R =6,-!i=1Y~?,1^,20_d>I|WϞK2repL<0OSGI-OPT/src/javax/activation/URLDataSource.javaA0ͯq to-h%h&kOh8d[VU{ߌ]w0de'HBviXz%:܆C2Gp ڢ#DFVZ}8`#NJ@i!gH;Y"1GC 2Z#iӥxx2 vBAϞȼ EKj[ʋ֍tdLݹ֪DZZxsa*f-Eڂ(,iOXIRCpzGcґnȥ_ mBA/ z>lCէthU< ]4Mf*N}(yq2rx<+`Ly9Eov r's.M( }@"0h+:RVS7*uLSoLtm=+VWUrc{OB<~u_bq۹i񆫓[*PuYN|k:(*V76~`ҚnhBϟHAPKH)ZPKK>?OSGI-OPT/src/javax/activation/UnsupportedDataTypeException.javaA0ͯx+н{JQWA"M2vmV;JUsHdD\c\N*>KM#* ~?6֡aM쉪 r/KR*"  F*S|#VgPM[J{!!й$!J}4NC?g%xz >`xs|Hb+l̋[V=ڪxw0;ڈBԖuPY饪pz;a)`*鼕ֿ Fc @V1-b jC^&[X1_lr^}B?k/ eQWIP)dknEMbG0d҅ku, FWD#8ǢԟL$Q6nkіX/6CW=X8[=Eoп DŽo (PKcKPKIG@OSGI-OPT/src/javax/activity/PKPKK>;OSGI-OPT/src/javax/activity/ActivityCompletedException.javaAo@WB4LU5֢6!9;#TU7M)3rݺ0o60Jr#Y<[ A2C SuN9FlCȂGSU+*BdONZKoS˝t =F?^"Q8x4 ?s-kDWcnxG:OSGI-OPT/src/javax/activity/ActivityRequiredException.javaAo@WB4LU5֢6!9;#TU7M)3rݺ0o60Jr#Y<[ A2C SuN9FlCȂGSU+*BdONZKoS˝t =F?^"Q8x4 lX*m_1@N;z<?'xBwG9f!^ë]u8sg/`OA PKDqKPKK>9OSGI-OPT/src/javax/activity/InvalidActivityException.javan0 S9%gm=yi+NW،͑4I}R6a2$R|,>w ViHaz5_Y!J 9Z4V;x[*QZp;Dc$h,) W^0Cٵ8R9h-YRPzrIaP'X.8AnV÷sN#1Gqs6],bǬ;٠`WK;Ah*ņYу2 jsS:MEڴlh/[MH$>%EZ>]]ݭ>$[V9,VMNW>C=4 yd\8OVƒTrknEP@ٓj6 7֗/7!:qD#wt9BKe'1@xp(+;dG\?q wӟ<3x'n f_!wFó۞`=3PKKPKIG@OSGI-OPT/src/javax/annotation/PKPKK>,OSGI-OPT/src/javax/annotation/Generated.javaTo0~)OIo[5.jV4U16Q}i.aO8nJ+lQr)U2C?\k"5ĨQm0wDRcQY!g=cFE-= z`tj)u kYh5P 3l  Ynzi0]*۞^NpNZρM/zi>M&]׹|حU9z2 0OSGI-OPT/src/javax/annotation/PostConstruct.java}Mo0 DNIYo[1^mZ=* hs$ME{Rt _|H:JF[c>e]@4I0>N&Crh ZAnk1d Je8hr-zŽ "y hQ;n{3xx<13::s:?GQu!;Qs&'Y| J6h- C{`8[k:PXmrNy'd=*1f#3bݺWC{a46&a#i1&ic*>8+ӤeeHt7f) Aa ?@|PE%8&ڣh4;aZ-nM#v1w f{vO\>JgpxCIxG4iEwՇ&vL, $ z&$Zwʺ9Ù;x PKmwn{PKK>-OSGI-OPT/src/javax/annotation/PreDestroy.java}Mo@Ov䂛[U ipxw(=6)>f} .`)ՠy0-gξsۖ3Q"L/s: =V>98^0XA'*`b%=~6\ 0uɘ̮ ;ر$n-JTRԈs=] <(υ}֪AώľMО&QEz<-v\SLU bmYRk4RJGknh`dm{TX͋ξ #~.10803MaIGSXU넾A<8YidTJq+Z’׼Dӱ{Ԃ:zǍ[!ٴ|-Л\hog ZĕwBtWv(hR鞵~NҶ?n;9 񟒨E ۈVzy+9ѯzqL9yPK=xPKK>+OSGI-OPT/src/javax/annotation/Resource.javaSr0=8ͭt&&-{4+JēɿweS @owsl/Fw^Uq&2٧ صa,RCs,Ph̡9*0ka} Bpp<[BͶ V#qp !ɺuܬw,V 254*L/ziL]׹lؕV{^s??u#*i-Te,%@*`B3Ҫ7\в0Shirik^R?mLЋ!͋xbIn&[/0 ̗"HeHK; YFCl$[;UB%3^ReJRnP T5׶斦57BGyًC>Dl\&3†\{AM*ь6jI_a$nOE]}صO/!$$֍nViڔpAU0jk,*yt.%#1Ze1V+P{BK|͜3_=AǎB1X2Gz=TGLL-ov5 !]8JFitjϼb482̸E͜' PK'E=PKK>,OSGI-OPT/src/javax/annotation/Resources.java}Qo0ǟǧ8)2Vu*x#gTLnx|~wƒ Ki^, ,ºLv0Ni E[-/PB#B z )|Emp`!5\;N6gi1H@k<,pܫv\ 6(ZB`v*ڶYOK]Ikx%Y]+Q1W5u)*؆Xkւ*Q[.)Yږit6[n>#~.10803OUaIG,S/E˄V L9NS@ҮnS B)OHFaK^PkjXPjAB![f_}Bќ:>tkƅ|W,/dQ$^h)Mo|ѝtEM^̙D5:SqfCpÉV>TUd 4c);3TPKIG@)OSGI-OPT/src/javax/annotation/processing/PKPKK>?OSGI-OPT/src/javax/annotation/processing/AbstractProcessor.javaTMs0=_S NZNIxh&NGHBARfVo߾}Q'0foE]R 8Bl08_vY@:C,"@r)8**C ~S3Z'hh[0Puk=C8X ;ƃPҶ¯:5KP5^xFpF V&E{n+G}Ya]2'9DBXxfHg *[=^N/Y 4pފEL{H7dSЎSH6$daz=x6'dt"' A<HQ: "Y" rZSyr\o* ڵpX k/CO 5}a#/3"c5'iD=lbA[ {^~uFESy/zLk=GZ*`a뉶NSE(hüGa1D_Cq:UZI+7q ,x%%{z?!/|(pklPEߢ/UH9C/ /d?5l3-і}8tD;5;!Յp5vqnZ-Hp &w̚ L: [PK@ǣPKK>8OSGI-OPT/src/javax/annotation/processing/Completion.javamAo@WgI:d:ɑ=.a r/+RvԎ,Qgx$VN昆nYw83teKSEC*T`F^gT $x5 N\`TL#7ҴD ĉM^r]z/E|cՃj9XIo*eV1uot{a)Vn;ʴ<M(Ly9mVeDOz|YbbU|U3.e܇NƆ S;/[DI $gx4t!4HVD0d҅:V~o("g!+*cuh,}n˦l-x㋰| y I@JJY߹uCm7DD_PKP PKK>9OSGI-OPT/src/javax/annotation/processing/Completions.javaS0=7_ MؽRQW =gn!ꪧ(3o޼7c'CLM}zBZUJhIߎ7# a,aI잊ɽhtA~KHk!eFN)q^ &hx4C9lTECiH;is%(Sa^0\pAk D$i6gűeR].Ϧy>{Ϫ]sQ5bZ+X [l|+,B9oպ_xlB>ycxX1].*X,1]Ug'|w#СTa-"'z%ac.\MRmdklDI(͞fG ku,4)/9("@C!W~kk$KcIT7k*d%X4,.ѻ.BMA? #yl`/xgަonjn0[7Zd4Y΃丷aG=i|aERF4(x ( PK]PKK>3OSGI-OPT/src/javax/annotation/processing/Filer.javaœAs0*=\BZԞXFr%d߻2 4L{i9`}ޓF[}14 !*Kɕ@OFeXN KhaERZmЀ"D*CJ`F LQװGPAm4\xX9 UZ#ݶݧS$piiֹ]6MxK̴)kE<'5QwSDkZr>J5m洧ntRC:w 7e6:#׵#Y?oظ^A}Ћū 2JVPPKK><OSGI-OPT/src/javax/annotation/processing/FilerException.javaeQo0ǯ8SRemK ) Fl6!Qk´Vd߹vr KmV6{i5CQ~HV U׋ŧ9yXÚ#1;{YrTS5Y=!5X'Y'u4&ci2 g Pڣsa'[*2R3}F@Co`ë[!g$}b mu}\#S]%`O'-'ޞ! SUbˬ-Dck^J/U3; K[eo<60IKd_2+1|/6xL4d"6YiY~;x:0 㼜"Jw;}Ar*GSM'Bd'!{.c:ش ïr(9FQbȇX]1[DPQYp'U :Ίi:C2Q xAEPKT~PKK>6OSGI-OPT/src/javax/annotation/processing/Messager.javaR0=Ԯ-\`O-n+5]M&@jiZ!qЮ$D<{3_Dp3mNa>U k*GN'f$B` rT hT!12p֑V0O FW(q䠤9 {Kk>=KP=zpoS Hߋxܶbm5X7Igexɪ;Us`KCoO 喵ֲmAV9uPZ.}+-m֟xlR .,$nz,7"f<ݤ%C|t9yd,8[ R%995U5BbG`Ʌ:XB Qs>Ƀ< x]0V,"lyCOSGI-OPT/src/javax/annotation/processing/ProcessingEnvironment.javaSM0=/bSJ![U%ͶP=:0` Dɶj9x>޼ycka.ArkaM I?r3!ofSܰthP0 < E3DR?K Ad5; B}Z Zn]1Cn,tFNy"0;mm볎/uT} "NP4\ě0E2!kAj`FYX[.)Yؖit097VMc/D;rH6&`#Q:u OS^S\*Z,aw*Jb:C?(dJ &wr[B!{JFa hlXPjAB]sj``*^slc.(<vl3A+*|eFS͆D%,ƿ ZU̱+QK0P5͘?:t紫Sz 3Fkho푾4kx_`>2;u#u,/@:aϚMFgx(꠰'~yoPKo-!PKK>7OSGI-OPT/src/javax/annotation/processing/Processor.javaSr0=%-'hIx(q'NGHBdI)!־48 FJo(,Bx>ߞ0 S0Ef9#/r#2sd!Di}<>N,LaLYL#DOm|dS8)BxdaZKVc&"dQPk4:f%%)J8 rᅾ50.i i2F*,8M-_+Oe|O9}IBzOFtr,Bظ}ša ~ƐOŸo0~yKh)%i(Y)'ṾV 6糖TU&ݍ>UZ(\XncF}^cTt:Bx?Ϡ hϻ*:OAPKsz5PKK>>OSGI-OPT/src/javax/annotation/processing/RoundEnvironment.javaRMs0=׿b')c:Q׎$0wV[R>X .=T'뽅y$!lD0Z^.eHѠ>` %tD v*V2ERKMAd-;: TAcPVMznC 1 CQ:E<HZ:ؗ1wzgz u\Lĵa=H H1+^sE#+3jwiIy l,ʖdm?&[؅ihA:omtzav HQ<*M3 )xADݱԂBrj``rp.(<3A#*|eAS]Nuh$8p-Ew"A:eӅC;?C-i(J3utJVؠ7z5io‘;2n>@9>mo?kp*7S)8 ?zkh y?PK/.(,\PKK>FOSGI-OPT/src/javax/annotation/processing/SupportedAnnotationTypes.java}o0ǟ_qS;MH mNIT!RNh9 F>w\\Njga\L`5g@_f@-CR4-4b!Tǰ3Ϩ .`4l&΢ YBZh 7P* \@!j@kyGCn,#9E_kg m}RWA}Қ6GI$!j%j44h70ETkZXtԭ斋j Fe͖OJ?PۘQAmԙ*0M$ )̗"eB_ L1NS@jҮ䮝)B'$%/4Q5B@sjplj~鯺\ߝ7v`G y+- B#k.b!f gB;>7D5:SqWt6_t't~A|&j67hufRR{;Ax^hc;='PKI-wPKK>>OSGI-OPT/src/javax/annotation/processing/SupportedOptions.java}o0ǟ_qS; &6@H$enzI mli4 F>w\R^zgaZ ?p3Q"L/Ws!sJLnxZE v*Vc jåKS'Y=AH A* De (^h!H~Hh\̎õV |6RAsҚ&^FI$qZ4h hrMoz`J!ֆu 5Z#Ŭtԝ斋zFVc͖OJ?PۘICO]ܙt]]eaRQi4YE&>jH-DOSGI-OPT/src/javax/annotation/processing/SupportedSourceVersion.java}Qo0ǟǧ8)2Uu*؞mB}gBT[``铃3 %tD v*Vg\ԆKN0&gqBZ 7P* \@![58#!wER̎óV}}6RAs֚.^FI%qF4h hqMNQlG Aj`FZQ[.9Yٞit6%7V]g_홑RP٘IAMSܙ<&0M$ ),*uB&['9 QiarWs!C|P3QX;V#ZPFPܸ,M[n <dv;|eAhd}ݺUTdѵ((rkk:OIԠO |{=^JђF%nߣM-'Z]1:YĞN|#7J ֭,_*S'OPKmRPKIG@OSGI-OPT/src/javax/crypto/PKPKK>2OSGI-OPT/src/javax/crypto/BadPaddingException.java}Rn@=dGڜ㦨(2b{f1U*yҋ.`Moe03Xr>?Βp t&GHU N R*hUE 3(3𝬓Ze2iLƫ*PsH;I }0N0gd Jq[ Gn0\^(zxޛOiu]D:mXeQ.߳^5XJˎ=aU-AugRVn[&kdž &Y y98%OSGI-OPT/src/javax/crypto/Cipher.javaXr8}^+O0ŘNjxv]I$֔cyeL߷eRl!y Xj>}ݒ|(hp.7RPtJб}XVke_K !h` q5Bh̡LQF\P7PERCE c6@(#$ 8s0Tp8LM%~RS 1P-iiLRJe:,alUmTZf6?t]cb.)XH6 ><4f=\+C$j$jGJAD[r7 H6E˾föyteAӾVMO_~k}U$B# \˹"؈[bA) CPh3E!1tZ#"jb*ĥU MpΧ|v!e{h\,='bkso+ [tF,XCeGHqt'$U zi ;vF+ega䛿N cnu].}Knٌ.b5o0E+IjPI6FIlݚza;J'Vaֲ-ҨmbO)iq.E*J8TV0a>)nvtʜ2t `_G41.9]Grj<wU2yTF>/LQr}nfSxg Si;Zы]O!4n;[gW_- t;۩Hj7g;TS.O¿PKtCPKK>0OSGI-OPT/src/javax/crypto/CipherInputStream.javaAo@x#jZN.!$L؃nw8(,8(=>ڝ7o7N"\az1,c,YHJf<ߟ$\cKrdT%LeIQVUd᷄̈?}ed 7 A< b'Pڣua#=d1OSGI-OPT/src/javax/crypto/CipherOutputStream.javaAo@x#jZN.!K4q1nw8(,8Rhzv͛Ӌjsz E]"k)TE^Ǘ#Kk,aA ;[YrFd᷄̈?}e_d W A< b'Pڣua#=Vd3uurr0U%VڈBԖuR#8ly+W?[+#G+ AV"/y9 &Gq}Xde>+Q,0-2/|A6|~=x=0 (OSGI-OPT/src/javax/crypto/CipherSpi.javaUKs0>_S1NZ@OI_x(I'n0 8E70y4PY{ho>+=7IIDHR͔ZS"2Oer@F| }e3vGf:jlD.nY#\PsxQTf ~ЁQ#gP&\:㒉C%W~oniLǃ-'-lT=_8&ݧECD =o!‰2vW63:Gpw_QeȈX~ .9N@tR6R[w}/ .Eh ǕZ8/bр-y< SSz;Ȭl]٢6EK|YtfL$ 8Xo_P=/t8AE_=zٕy#uUr DA/?JY_Y4= R&nuojx-st}nB޶vm,ḡXCscfvslВҮk=<̓-UqOWcu5PKMZI PKK>6OSGI-OPT/src/javax/crypto/EncryptedPrivateKeyInfo.javaQo0ǟOq ,>mSF Uմ`gC~CJ2߿)#`(Z43Ѝ{0>s3#tOc}ϳaL SԨVx`E.xBcHPjw\Js)@&tڭNJԲ%AHFUUy!J&W/(Fo=u)r*"XAT1k* Xԕ↋-b LµQ|^1 T6&GDGAZ`e|9+:Y0`<8< f8'k83JFPar[M!BAX .0 5,EH GPZrm۪ 029_rLz^wO+ڋU]y圪qn$0&W9ցXHq޴ydtgYG+.vq#$%+iKjP2*SIl9jN an* +qv3bj!л=JUhJ%@y~ zt_ 3p#v0zׂPm#YnbrneMafq ?Xy:ogow/bzC^dG{n7PK`7PKK>1OSGI-OPT/src/javax/crypto/ExemptionMechanism.javaVr0=אڜ&I3N^jJ2f]'@H4X}oY,O3 /9B?pw] #a c" :OSGI-OPT/src/javax/crypto/ExemptionMechanismException.javaQo0ɯ8S; 2"F+5]65$մu&$D>'HpkcONU`Y*uln ~qX'wmNIҞhž[!3LWF2ah4'Ӣ'hzbS5lҐZ¾3D<fX^^ !?,.=qj\ge^=l7'TRlY0s*(]M.tQ*ڴUhyMhE9Ǽ,i4y(֟k4OSGI-OPT/src/javax/crypto/ExemptionMechanismSpi.java͔Os0אڜLY,Z[R%fݻ7 4p0 Δn }>iz! .K$GFG! 0J 3hV\ j@@5Jq4[ "y KQ"v $pU\< v*s 4]- z+æi"!ɇVkWxuWu-K Y Lgei)OCjf,uFd_FX@cczq Iڃ8MЛ$O9ijY<'38NΓy2G'pLC@6>a ?]qaHV#K)k#jFR"h*am6cn77VlqjN]g4E`f/QXioyUo:HdCG`}xT¨EMƛgVN6=סbfnttv2-qrdnZ;]T~G2.[))\w,6v[8ƿDX)z? H\N 3BGqW= @ܔ_U PKcRrPKK>8OSGI-OPT/src/javax/crypto/IllegalBlockSizeException.javan0DW,|UrsksR7Ȁ4ȑ2dIʲ߻U4AQ:H 9;v" X;L VVBZ L/),۰JkXgM@V  }Ɠh0x4]E޴p=hHN*< avDd}FHNrNVBa}Sw]83Yr=QUZG+M[|Kw`!;'M BFZ oBHPl\ä`P \di4y(7_Vx(ڔK5,VM)W>CQ=ײI)2')c[agHޢ;)h4ݴAh;H`m<ð\Q$S4Ώ `n)E\6\]+#řGR}vWl\?'FZNg /¡g!ct7X$PKa>]QPKK>+OSGI-OPT/src/javax/crypto/KeyAgreement.javaUMs0=_ 2nmNNB[O2L!mJ2ē  =QLIj0 ? L0Z^eLc4gy@.Gi0RF~8ԑ|Fmzr :l8J P$ a q,, \EMm.lS8&p[cehCAoj"0[^|Rk|>؂t͖{ -w] ?JIV+Φ5csPXbV9s-Iit00ViiL{HW6&M8 8`it=<`h gy0 FCz.y,:xWhh g!D\%%S $M&%K5C-Isaܱ"9L2Xz6w؝uUXu().OSGI-OPT/src/javax/crypto/KeyAgreementSpi.javaOs0jHnmNNBSO2&H3NXlJ2'tz{oAp,ws QQHBh<>}~f -.BR"RZ-Ѐ NZQ8/uGhu %oAiEҐ@;@uNœmSǩӅV]UGiB&FŦ֎.I&u  !i "*Sb-x ҙӞ1I kA/Eh+E bփlEnn,Jt,ӄV Jn"NΆx)})C|$[K)Țj!dzF#ДZ\xBqrᅾ i+N)E)(8Q^`0KTUw]ItlCc{BI!]TTxrn{f}KbMG2zlh63JjGEioxLoU;I>˵q'rn+-]XI^3g 0>z /ѡaz ػʯxч PKs<ǐPKK>+OSGI-OPT/src/javax/crypto/KeyGenerator.javaTMS0=׿b''IBJ=02y㨵%Wm<{Waݷu4<NTj--L@IF~a2 LѠ1 \` LQ]"%EJQ0%P ZUAZBe0ciAH(;ju1C-tF%}-َ<6M5@lor":#dƀ_Фx+gs⚳iUu2Q 0&j1iIv$_$J:}\:NxLdFhW8 YF}N!AܡPJD.4U,CTZ"(Q¸":\2^z5z`5 nKsFα=CY>ZY΋툿lGR@hnM .cE. Mh+!;\FK 4Dz]-WZ`tІyٲx8_90ϛ; !Cݏٿg:wTDJ7!7d=֙NK0/aNyL-GҎdr>-ܶ8!yyPKIPKK>.OSGI-OPT/src/javax/crypto/KeyGeneratorSpi.javao0ƟT,оmw,3kY*wr *J" /1(ې =1$*4@ ~!ZGZECty9|06t6)y",lђ3(iK[Se#JR* ښ\cETTp$8]C,mgEp 6ܷd%5vW mnwEe8Gx.[QN/s=T%)!;C~v~թ"?${NrP6<.G 8#ߔQ*5vWaE9)oΓu/tڋ3Ϣ(PKhD2]PKK>"OSGI-OPT/src/javax/crypto/Mac.javaUMs0=_t!9&I3N^J2'ޕq(_)Oo߮TIj ;0 >sdg"Dp.ǎkal91G=%KrC9FP5aXH?IιpvsXJ0ciȑ8x1!De L5Jn*CN #8Ex4OjeZ+uؼw nnDy\S "U!֌ 5D#iU..26%hi"ͧY3Y# ۘ /h %&_F70pyo\zY,{AiE!@\˅\acRj")X9jAB=-kN#K7[[yًzݳ9{pC])#OZf}eag(,ҵa&V?)- !;t.mÜ~wcXP%*Z9mwnX` r4{I+q:J_PJjx^GjShȲxڸcZ"yaNfi>:<إ59k- RJ鴈cԫimodÉ嶋B,epv^e}aݝuFyͻ=b󏭶mGHĤM߆ wYpvվfĜe<"Ծ7vԺKۮf34gw#f;&z|@SP3XOu.SX̐Wm̵WBLbZPK}tBPKK>%OSGI-OPT/src/javax/crypto/MacSpi.javaTn@=_15$6'J &=Mvw{gBӪy͛G'DbM0O%De)g aXx:[Cf$2C0Jh>uR+8 ^ =E+؈&2t%24RA7VKZt,^ ^~->Z,2&0_d>|Ƨ+fp.l߃;c},Sz;SHJ%9\Ɍ[SE% Bo* ڍt~枦IЫE `yG0!}*eAܷRʏ"KMxg8D=UjQv/iJ*cewz|Re,٭&fd ᗯ /T +uk$~Z 2౒o5;*ޟ&Žp |Zo> +6Hh{XmE)ׅ;~`_ ~L.۶V:j=kVe<Ƚ~Rޭÿ3?PKR$PKK>5OSGI-OPT/src/javax/crypto/NoSuchPaddingException.javaQo0ɯ8S; 2"5]65vѴu&C"$.pmުj13[В0\,8lckrdTL$DK{Bɟdod2 GUM衍G=N:Ij<4fD}F@l`WB?BCt]86J%w2/oz59K?[e9hJ-֢%>&PwVy9NX 6rުm_ 7#G) IZ +&Y1&~tNM,Zzdl_fq:56$`LyEDvj$GU+*Bed5'BC\VǀeAyᇭrFI(N}UԴ["d-.7E+_EYrNtؑly}|KqG]7 j_ > KPK_wHPKK>)OSGI-OPT/src/javax/crypto/NullCipher.javamA0ͯxVi{k9,mBEخh! k;16D{& ڜlvq5Ʋ,"ķ~?NoaEBȽH9ѩ,QgP|'VMa4H,Dt8AigHl txHJ̀K;3< z>m_!}~vޛI86u|([TKүNZxs0LU %ּԽ^&[ K![0r <60J2/򘯿,xVX._˂OOw Gc0Q]!lVVܚj:} #{Z!{?p$x?CqǴ',2݆ Wtm;Iʝsf([g?Ec('8˩oV$#_ˡ]"gxAEPK͗hAPKK>+OSGI-OPT/src/javax/crypto/SealedObject.javaS]o0}'@REBEjڃq.3!UCʠ4UC"su0ڈ|û0NLqQ?uC&ia <ɹ,fP BT0Nf'oh >taJ3Ψ|5g\׫*dP'7X;$}$Mեh-Y Cgk`lFZ%@`AsګpBX=w3i2a(6m88 (OSGI-OPT/src/javax/crypto/SecretKey.javaeQo0ǟOq *PTFClZ>۳BT jypd~n`tkDypXgU%ht7ZggZؠEs<$/$8J92GkEJ8A'Po0ZAm4BTx \uwT< tj3*д+&s;8?EQ4!ʔQu͵SXꖨZ0&޷4Qq'֊5 ŜԍNrVaL.3b_wc&mLB/ z%ΒlEn fdzuL:WxL,>xO@yE!d5rQNɲf%BNh$MQXs/Sp]7|~;ܴکy=H94+ΐtCKAhhk+dXߛX.Yg&Ӈh6M?&j PK'q^[ PKK>/OSGI-OPT/src/javax/crypto/SecretKeyFactory.javaSr0=_t!9dLfrb1jJ2'ʘ6$@ifȗBޅqI@,`#I}70&hѬq9j!.GW4VhBiCu +VJ!,,D;UR[6uZn[ =s](k8kI7sŇ~5#mU2no]+ւ0xV+g3*Y RiϺ2 ꅫA31+ݎi[$qt ,z&~_O&Lt2O`8Nϓi2N.HQ+W@4sEw(,-$M%rFHhVZ"80Rc9z}ckvqSNE9#KF2%;mjF;ޏ1R4 zM"/#u )x(#Ivjo-bWps6Fѳa%c,KԚI1oGݹsQJ)a9X暀u E>JuV/6uH_r}:@Ipd=6 ~?sO=8cZ-舘 PKgPKK>2OSGI-OPT/src/javax/crypto/SecretKeyFactorySpi.javaAs0x 2ԐZN.!'XZ#gNJ`VOo},Ʀl7],VHB - ݋~šyP:ɑ*f`r$iG+TzE~CHJ!SF"vT؊xTC9UAGIҐf[h}%0K/X.@ɫ·g}u0:{|Pnp'lSw `w,Ol Jbɬa,Dn ԵU^g־J9oղB{eя$ҬoIf`r.OdH'fsgtΦB2}M:82C 0 qn;9 Z+ɣ9!7;'BIv\Vǀ`SK s~xmJoFQY-9E%-,Sf$-jfl OѧVn'<%x!7YΕkdC#Y5qH!fm_x.kjtމBZdr L'r=xpIxW+VhWpt\ ? GQPK 3PKK>3OSGI-OPT/src/javax/crypto/ShortBufferException.java}Rn@<dG.9MQ#[2Nowb{b&jU;o<1MoUBZJhI^.Y H 9G*bf$JvTY=!mx37NxiLƫ*PAƣuʡT5N!͡u9#KP`5g})IŠ86J3%r/߳A,leǻaURXk-: QY;o*t53@S(ڵMh5MhLY>ug<#]=k82C,S8[DNFBiΒ\CRJ5]"THV#4dʅ:XZ~8WD#}Gqoq`qXݖ%ɓ.;-wɊ:?/ x1ä`/OSGI-OPT/src/javax/crypto/interfaces/DHKey.javaeAs0x 2Ԧ9@'YFR%Ǔ N`Ϯ޾v& Vq9*6$ogS$ilaC1;YrGdԈ?:nA0F`GCi{HJ6z)xHR̀I8\  G[!{)Iř8ֶN%|L=T=_<0LU6%>:PwVz)|',t]믖G+ QZ +FY1 &Ov~)l|- 7E9G_ϸ+>bl1eXQ]!T %VԄZ*QpG?+4J3'7^Ry(EB/zFJZX}VǨɟn(PKˏPKK>6OSGI-OPT/src/javax/crypto/interfaces/DHPrivateKey.javauOo@T!&Z'7pv:&Z!|ox\L|o`|$L`'m) Р>.`g@)J;5=BX?QRFNi:hTрT*A2*bi$Ph5OHP[+X.U\¶gom߯:g@_\qxmFh h^DT2k!jPDϬrԵ&K2Bّ}1ߌ&$ta%3yw*" fxe̫OpsG}Tj1ɍ!A| )1R&J:J29d=o5{3*) HZԙHL@>i: prg6_?`~xWm(8^Χ8_kE{W7h4 `5OSGI-OPT/src/javax/crypto/interfaces/DHPublicKey.javau]@_qnX#Z Vm%F/G<8Cg4=t\@|y;psYԊg'ݤ 9 Bw\0ll jT0OSGI-OPT/src/javax/crypto/interfaces/PBEKey.javaeM0W8 誇,6tzpIpvQqHEg3l|(a0L#s>. >)8'QL)jd~g_P$ \@sNQYRY 0K BWDzC=u:GJ,pF %ݲl~kq]>k}qq5hZǫ[@c@Jh8iDYBAi`FYk-l4:TER٫eؘ~C!xD^~/vw*2E5>B~hȨK: LyyE2uA2%r Nɼb9BN%u%0Y NGamM = }g'vnJ|!-q4^Y%4Pg#6nQ:1F:/efB!pE%|]@n>]ٴzTroYJmi91ikNs̊6PK9^PKIG@OSGI-OPT/src/javax/crypto/spec/PKPKK>.OSGI-OPT/src/javax/crypto/spec/DESKeySpec.javaAo@WrJ=9(N*=vu\guK H|căռ[f#X'8Bp&3tz:}=k8 G}rp&+4C-s`A2'cp%̟ `4sZBm< ɰ%dPh .wq$p{23*x*f{[[LYG+]NĽLV<%QUR1[5u*XJ54R#Y-*l4:yZgC{`֟ hlL H J.HdLv| ` m&|/m=,x1QTu@܍+B PHŒ1OSGI-OPT/src/javax/crypto/spec/DESedeKeySpec.javan@)F>ّƴEpeFVUY x.]Qw,!Q*U,? 3Tj^- O!8p6^oG k4FOd3se!XF>2 WfN0CYkA* A .aeKԡn]őPe$gPѩx.f{[[LYG+]NăLU'kn@c@Ϛk8mUDXk@i`FY-*l4:yZC{d֟ hlL H J!HdLnn:7Qj WxmUL[FFuTiar7· B= 3^ZeJRQK*no5;2}/Why4t[Y:sS%d"L0klux@I}YMmLQu= .`(YZg :a af$Ql}#uU{H9%~ݾ3pZf%Z Ghk-AB$OH*]mhU_` |_PK9=EXPKK>6OSGI-OPT/src/javax/crypto/spec/DHGenParameterSpec.javamAs0x 2ԐZN. d0i&Ga֖TIƐ +p;%}W0`e=̳[,P9{3^O8lc rdw!˜5j& %$FhONIp N{鍂AרJ{ԎC:ldI}NC*2-Z#ԧu $xn= .0ڼBtm7ibq"-Yx:˦zT%9Kjiy0U.VZB@X*pza)جVjFc $Cu%ҬLqdHftax>t>W$g|Kg>#>76L2yȈ.6 r#sM(ޑU< JYM)+?m+4D3;s{0^ǡ(2D^ &ݒzVTf,8SEP;kp*мVEчcW*>ڷ^qߚ]V8/ K jcPKҊjwPKK>3OSGI-OPT/src/javax/crypto/spec/DHParameterSpec.javar0)v|3Z&L=8cfrԂJ„ݳ´cɭiߕ+`&Uy^Xf#XLdx| k4F ;5!R,OjåI0 `4uVPP$7%>g,pTozZFrF Vs!0ۛZ5 X8:˓քxHgrg=km LmkXbV:׍斋#afǍ|[ۋH hlL J!Npq;c[=l1Zd/RXaJ&^%QdȨ>+: ܍t"^X˓%0{Qk"YjAB]qՐÔn럾\hο'; ӭ2pu4JJFwL -ꔢ]Ptٶ]nUQ]&xzܰcT ca1'>| "}#MPQ4s\=^PKc&PKK>4OSGI-OPT/src/javax/crypto/spec/DHPrivateKeySpec.javaAo@W|# oOvGiz=vw1A{g16Qr-ޛo`tkDw0#XLrd<>F +Bۈ|ȍ(-n[4f}%hP&^0KG "e ;Q"#G@H=Z#ܾӧxx3132h:^ q4M:H".OZߤE/>uﺓ%Z ě&*6ZVS1 Y`5̠ ҞiZ0HrH\$y>>]_-pVIN9,W0[ft.3:}${42ꃏ Su"䈯vd5rFE BH4JXY-n}L)*^5o1NE4V dD85^cS %Y5-ѳ)0\sBtXq/MFGM]r]m$Ⱥ,pL2PK4PKK>3OSGI-OPT/src/javax/crypto/spec/DHPublicKeySpec.javaAo@qȵ 4AI#2mcEJDꃭ曱.`tcDwXdLrh8 _ KDۈ|ȝ(-n[4f]%hPF^JG45 "e ;Q v $pUnR< q NB`nsku8R&wd6fs=*ahMLgb-X R)O]CjjfluFl*fi/4kI%Y,Bn+xLdJg,0Y̧*] n4Q;cM|q xpzsoɨb~@o,v۴E|R[S>y*w`fGˏK< ~w{W{AW *1i=)PKPKK>3OSGI-OPT/src/javax/crypto/spec/IvParameterSpec.javaAs0x 2!\B[O3$L,F-d] >ؒoW_LםaL?Ie) Û:ߍ"WZȒ&bor'sR6hԆ ܎"O @JpM0Aޢ *Ai{H, tȩv nwӻx<:sjm_ !\}zvm#q")YkwlHoϺW%Y Ci㬃*6!9[#TEFZgdָa_ xlBaH>i1Y^ޯVbS,W-:Y.x _mq:wҏ|H.dkVܚ*Q '#d*iZxRV w:/_h<؋Cv:uAd5OSGI-OPT/src/javax/crypto/spec/OAEPParameterSpec.javaM0ͯqUXzڢR>QtGc6S!"́yyf ;B`? T0N|h. 3Wi`W98'Q\A!Wnœqz~6BIhFjzb P$a`-Rq- \eyV .^j r:5tl?eY"Nִp?uZ iXNT-5e%( ,H9u2-Fgj,N4Zc| (s46Y9<0A2Dh2 |VF}pk7a -BxVG$#ki4,AH G ٤"*t5k=//J)#I8NfZ1+`POЉ+u&zj۵,u`8 OIzEp6R7+D }mp+|@ToOcUhoPSXpꙠ=h:F[hy5-hzޞ\꯷ PK1 LPKK>.OSGI-OPT/src/javax/crypto/spec/PBEKeySpec.javaRr0=_ 2PzJ990L!/F\id] I;9[gUٖ+{H>)\ -]} oXz%:{LCV"3%Q;L)Z-BTɟ҇/h2FiKKԦA!k(#AbA4H+ZkmӧUN0k L(xy AB8x2'ӷe?Ke9Q+)5 "52ue) U¢I#% #G (8EIߋƫϋFe4_K,*^y\> ࡰ>T~S-(tV !3{Av?VS/"Aͯ|Axb/uA&}AQy s/WX'\h5= ʒZ7uiPr+ov؃{xW@}>R/W^QZ7*(5ǮM kdH1m<1iJa8Pg}FaƉ<i3'9 PKd)8lPKK>4OSGI-OPT/src/javax/crypto/spec/PBEParameterSpec.javaeAs0&B[O3LY,F,d]7Z0{UW0צ{ 2)Sa|3^@&I؆uP:XC{mB !^pTШ-Z{0N$oh n)`4&jց!D#GA(6Z+3x2t vo?{4m6a=qmʳ֥|,zp=*΁ߍq3DYI-"y[+PU N|,pފCHؘQV@^6+"!OqOz-7]WKZ}l _] H#:x46t@"|P ^ b'8U>UpZnC[ QDs~;&v$ԙE)i%#‡FkTo74ܮ7'4%z77.;iL7ÿ ^MaBokAd7VtWH j SPKzh yPKK>+OSGI-OPT/src/javax/crypto/spec/PSource.javauQo0_qSR=d-ݢU0ڪ`%x3g;w fPE((9ؽFC3WR 8BzgyXIt0Avr/8*sh-%BaӅGNhyPЉ[l[mAiCb !px ^h~׉#C4OSGI-OPT/src/javax/crypto/spec/RC2ParameterSpec.javaRn@=dG(IU=vb"{g1P@3ޛ73W\B՝˜O`}`#g0 \R4Am@ NAp-j;f>CŇ'F( ` c d$:@:Bc4\xX[Z+38'2hegD)ρ`v7aضmzǁEX&|$['Qh hMo:`5lC^Kւ TʹnB>ۖit2[a^,G@kcFQq6(3߉<ϫ5xl !C%S#4,V jZDPqg5dpdJQ lk.(<'!ຫ \W7Z%t14ТΨ % -AT]uIz oBZ3=+8m7\ɇ!={Cw2ϑ[{n5ch-a:I$tPK ͍PKK>4OSGI-OPT/src/javax/crypto/spec/RC5ParameterSpec.javaSn@=x)rLZJ3q]; ჽޛ7Q#u5X9,P92A䷑zEJ̚+xK@dV9Lk2VjhTop%A%Pڡb)KmrBJTvzj@י=+a۶9)kb]dJd- h[]b^KB[#TEBZgq#~ ^!zxgIzdqz5Md\dO',N8zxrO<ȸmj;`ҏsȈYX%[S.2TшP5&SIղ)e%pg}B 9BZllk#_,9y)a:~YQ#qz*R|=77<e9ZUIwN^_*0au2oܐo/_} =l>0s\cTSgy:Rc?omIpA PKho*aPKK>1OSGI-OPT/src/javax/crypto/spec/SecretKeySpec.java_o0şɧS;a JM4!\658vfѴuM>}{I'pƈ|{H? Lqh0@ϳ^ah0\ bЀ"%Z(@ :V7` (HFHX: .nӺxk=13*(k\̵ֹC_uđ6y_-QU7J`W% MnDٚX%A`AsSF8޸6ΈuBH?PlLA'N!I;)N4&frW,d,u EHQ/0p"!lɖFpMrCh"(cy) /7`;vqӔNG4(5E \2"LtWؤ]?_Y%+V>9C4bM&`=%Mî$޿LFp2LFgg㱜ǁn~;f!oçс)E))5q_/49X]/&(PSx|*l;|0.̽VPKϵ\dPKIG@OSGI-OPT/src/javax/imageio/PKPKK>,OSGI-OPT/src/javax/imageio/IIOException.javaAs0WPprks2qQ5V%* cO&+L'ToU| ݞwr&4$Lo46V^i"K@U^,UTEnGHZQgIJp1nIw؋v,ʆ@ǒZP};sFOCo`WK!g\9@iSYkt̊GTCПNxshfmDm jCsSF:Vo]/ yJZgsoKpۄ$)|Ic?VINyv(OSGI-OPT/src/javax/imageio/IIOImage.javaTMs0=_ 2!tq>z &(kV\I00&RX޾}QL+^҇IC g2A ahP/0\*;GJХ9jÕ=6GQT[T* d\ 2l}n[FpF%em 0ۈ^֖}V+k8xO+)+`%JXLZAi`F:ʩ5\ٚit4)7V{m56bcAaԅ #ϑ\\i0Lp6p2oG8>)2R;$87SqOB6L xBd^!W ԒAƍՐ^pzk4t(?7[ Zs5UL1B" Ibp>ȟ݇Z2|٬ayPnÌ%#z}9V kIpZeNg*bɸ0mc{kpC{I<-o^Pݮ{ZY 1AU1ۍ7(OSGI-OPT/src/javax/imageio/IIOParam.javaSMs0=_ 2Ԑr"$m=@&L٬Z#d߻7ā>5LG3 C^s&UstkYjT :`ExBR1EfKX@?e?Qi.\9hX@,՛]+)4j$ !1>9OJk7R:I!}ΈS fJgfLβacGXݾs#.Y"FA῔+_KU| )u"jɘB+3(fgh+6{^{뵬ȣ;>|co4 wz p7-@݃ωMnYl< ,,ZQ"H.P TsZ5ZϹa&uЗ]ќZ?l>3Z4F`>5AȦbsx}H4؉P/Q2`}śbO^raiy0h޺ z@t[!ߔTxM}B+#Hm_,>yݹN@&oB6#A&G 7@b羔1Ri| nƟ#T Y kZ6#4ǥD*GJp+)9}/,g9ή%W8&Prך\D |;tۤIA$`L*TΘ~g OA2Y :@01{z5FeNKmGQLȑU17jr}Z>jPKPKK>2OSGI-OPT/src/javax/imageio/IIOParamController.javaen@)F>76'-jq8O tw1{gm"*`wg柍oOyʐ-qmH dD'EZ^)~l6IMX}MLV_ ɞ{݇@bԡco| BTq͕F(z2[?V+;/ry뿾|8^q'~(Fq̑Qf4حrFJ[;r|@G+5 hr?PKY0PKK>'OSGI-OPT/src/javax/imageio/ImageIO.javaWQsF~.bO[Nf[MAL/w wW no;N;p W:_>8F=_$ L !t^y< 0AfG r+#Tc(T043}Zw]68iNz vPX$ i!>F; "=jtUCϜ sA9=%mC!]}_eYzbin8H;`BxḦk&JDjf֥NV'&9+ܚh+zۀd N! \C?3Ƚ?5p2(`Wڟn`8~> IFq17є,g"QHtMDFJ "zFQFKj`0K'\5Y^h3{/:y1#i͕ qyCf2xR(^m…Dps9Xs#FFUq~vQ, O{ o5lYv{ߘQEyדZ-TdX'Iw~RE^.o 7sl=qo2‡EǗ >5BHx)PfVOuY_BPrl*FXkjl.՞".OSGI-OPT/src/javax/imageio/ImageReadParam.javaSr0<_d!La?J2f}Blat\|x60>rҔ3"/!kaaQm0rI FrO3WTKkFJdہ 5*{p+lr[gE;bY[9%QW\:yaYChO[9rPKV~PKK>+OSGI-OPT/src/javax/imageio/ImageReader.javaYs8>LM WބRs0qssIe$9i8L40@my*g:J\{JF+Fh^=~je2֔AXg!y\%x$=D́ "K B2 O$trz!V<&]+K@ &ɔ@ޅHQڒhMȇOEr M󄄪TioTrbv'}}3tn~FSRc&ɊrupAL~S\kLp#OՒ 0JI N[눦 m4$' y>plAףn0CFcr=o^@dڝIPPad.2M g1-"IV zgST]ZY~>Xό_vxn$tSWק?j/")ۊ7ܥ>8$+2O?t#\[Pԣ^V h0zQ$97 4,T$`W3-1+g1 ty'rtLgE3tT,B2KÕvȃMm.RF.ot{FaLR4x1GS'"*h/yXnChT=OE%ЉTR r&DA)pxaO%O*ᴞ)`2qdJO>< ,VK?M}NʡƺtS0j.R&RISugEo95~>}GzS*[*Gl T4aHn̴1Y *',>}z\tuJꠃ=z4B@Ր:mXV_%[ehVVsmߺkc=E=DB$PaLt$rAiD/U4nvBL64uަU-׆q`̓uhovOvjmg?F>p_ 9Þ87E9<nZm|č461~ n[v|YVԍ_H28ڿg4JhW!~8*ej7Xэ`yN'ZeDɦkiS;Z }O16<.@7T]sU+b 7Y: TH\7P3PWHѡaXӓiyݪ;*e條*Z{gL˙Vt!4a:7:zv ݖi+ *`1(aW6?NM/jF W z8B@Uz,GVzۯvPM-)va?6ZTtT'{W(yB3D>4YXNid.**֠rpHjG:[ 8Xb׍H8띷6 [s[f*^ȷb)]o?>QHYAo*c Hz$wuu@E=XzWhPKwaD PKK>/OSGI-OPT/src/javax/imageio/ImageTranscoder.java0)F=B@ĒKi2I mliYi+8D73o'#꽃q1UA@4eA0OfcX{5Y2*#v& iNd H_X$̣)`4F[oqRxtCXDC@ǂ!Pz{O9d9r]RwN#<Gqs>],|ِ`G' W;j*pǬ `mcNy'dUѐ)uF:wմgF.ۆFIi>wI7٦ l:62.ݤw!S݅@2 Sv^9B.HVS!*Qpi&Ձ@ic XzF¡;V(wo xDkn1GBq#;=R0Ja3χ;Lх)t!X6lc/h9@;Cks _PKTPKK>2OSGI-OPT/src/javax/imageio/ImageTypeSpecifier.javaVn@}._1D\Vjyr"LEU{0Ơ(Y. <{3gvKp]-$'*[ ,t*zQ2a`2 Pg. =C% B;b.}o"UI(g-1LB!VH\8w1Cp4ʥ%\OR(C4tFED`:~&ZGk$I,*kAjwv\'yCR O%u/f(C"SX L\3>J%fln)hxD60RgENO@ϥw]cXr+! 벵a;fj6%Mݜ3&}8gx#h D/L9@([+iЈ[Fe]84̻3nkHiCRtY>}u,C hR:x-՗̍=9q#Ŵ@f')VrY̚]LMnimK VAc=hKվ|,U<~'yOwa6ԭ.M j?Qk |=JsUm;m%yW`VQ2{HT;Vy]E{~7c-ܧp.֗R/PKk PKK>/OSGI-OPT/src/javax/imageio/ImageWriteParam.javaVMsF=_b6=ȀwU yT*DhlG!F_~Yt?E|\}`1gIо:@?_Z5L R10QB(A?#) 裴t;JEVpQ..o FddHL!qp%TO ˴9S%0+9\33rH[K߳zXrэ ꎜp ?!Q)O%e<KIU5fkB"ٴ0גk,:DL Ғ3])V#.lnm:><ө=x;ow`g3td_Ri2 ܔ"x ($RK[ , eBArɕi"kWLnEuVKz⦕fs*#1#uyH lI5&X柭_J',e4T} `w'{t?>ݜ 쇑OЫPdzoGa{+^1RQP4$NV´FD6 B]a! ~X2]Y 5MߤC3ck$f0cZ[I$b%%- үM!ʑ81@HGx/&wg^[*Yׄ~aFɿxz܋@x~̖ MjI֜WO[᳷Ëd~,Iv_kH(e~s5JT}MjBo.aځ:P>]힮wO(ʒjZSRQa~mPKR@A PKK>+OSGI-OPT/src/javax/imageio/ImageWriter.javaXo6~CSte&&, ]P {NUw[-ð<6uǏQg D(^? qrË#ߟ:ffR 5![c04PG'̧@918^GB!R,y>&x چ{'G1Lm!9#~-tNkpvlf;BVݺW7kb{CT $O/%g   l%iaXo$<^@0&JKHuI'4b8{z'jȀܹ_op7Ɠ{tWɵ;w3'o7wr=$(>$̀hr#g!(,EFI%%ij*e+XiF2˪```Bqʹ: H ;f;$]4qkCF4]$Č/F,:h.Y|ab~|H7S'Ad;g-x@GH=O !B$gHk'Q2% ^Z"\i<U}lF;’O^^Zqw^a\tlp&wnjߢ\4%-PK7PKIG@!OSGI-OPT/src/javax/imageio/event/PKPKK>=OSGI-OPT/src/javax/imageio/event/IIOReadProgressListener.javaS0=7_1+=,m"=:$LvȢU--dy n<ʍa6U *2CN'1^C: hP0,(Ci0FnZd1|CmHIA_^5{Bc9@A>gX[ ֽ즛ӳ8%s n 8oa{ocm>ڶEW C lLoYuz6qQL-( 5V%Y¶BXMic/B;jd 0|(;hy0:'aZGh䧏.Krd<kLrqN :H25fTPdوT;ԒAzKahKVܠ8؉g'&097|QQ_*炲kn:TspxovrgȭwBO*#_n{IX^ųKj /$q#MM'|"Vi7e_PK+PKK>;OSGI-OPT/src/javax/imageio/event/IIOReadUpdateListener.javaS]o0}&OT2>Ǟ@EM4!nԐvUuU4P;Nab`2y/ *K2%M&F' +ϴ"KfOY ^d.R2dFܖ Ҙ͌+pCOtS /qPR9,STtgnөx'piC#/?$t:ߎu]8)e˵y<-Svݭ%Y WpP7, SumUѐɄuFl*wTo!kC (8eȋ˛5FUXdz+.W:^.D;W# {m|)|)BBtd!W%)H9,*, '#9h2;aZ6yRC׼#h7/xcBړt6\&'av3t4VH6)xlVN̯OJdШk~ޣZ-]K /<'>))-zG/zGzAxo|NSo;M; tAާVDQ~7=W<3~PK9?2PKK><OSGI-OPT/src/javax/imageio/event/IIOReadWarningListener.javaeRM0=_1)YQͦ-jdсLKljHThQ9`<o{CxlT{T,,iHa^!s24{,Fp ;*P,%j'sƇ ) `1GqUd 2PQ[ $Pv6=sf^f u7|39Y~ a12f5.l|Y]ϲAc@㯎4+>^A̪GڈQkUɒ}0`J2Vӱ7mB"!)w x5}!ʲ( 6i4g'O> [sjis"7*5Q2-TQd݉V=jɊE}&j``:v =}~^\:7{k#ɾYԕMq(bc[P2,t`{zE% S_Z}-ot '<5{E_=PKRl4f1PKK>>OSGI-OPT/src/javax/imageio/event/IIOWriteProgressListener.javaMo@W|#ڜ㶨S+<-Ī;e4*kg7PQS0&N>UEBflvM i`Ȋ2she!lDp7Ԇy0  Gɝ8jq,Y T!S:ΠHqP.8Uqy?v]8PVX3]Ee,2 +44lIsDTH( gV9N%Y`Ta;dW=3rl0 |(.~^?lan6a 7X6ZǼa_d˸>5u<"$W:!3*(dيTԒ;uM]aTT/Why']S@5Ix@iFML͢.tw ~ժt+6eeR,(=8.pzo" I>o+4_uݷu*U>'Y^?yPK\ PKK>=OSGI-OPT/src/javax/imageio/event/IIOWriteWarningListener.javaeRM0=_1)YQHskDi@%kHTwLhQ9y$mKBr._Dv>-<ȖJ+d !Ѣe %%a-afShxWY\A*E 5x)Q; :@4P<x0 N\TN&wrNa"12ikmd-eւV|̪GڊS`ȑlBv0a*бsw_'mB,) -f1)" t%!ln wγt>A4{ 2mI@P%J&N4HV͙eiLN?]Q]љ"Q@wG6}shjNAM QQQm<¿MVegx`_G|0w;~#< +~PK>)<PKIG@$OSGI-OPT/src/javax/imageio/metadata/PKPKK>@OSGI-OPT/src/javax/imageio/metadata/IIOInvalidTreeException.javaSr0= 2DeCQJؓɿwĩK}z^9p+wƒ4!jD.kmX jT{,b$@^*>|CZl*ͼ8Zv! kx;\@!n6pu&&5t΁dz|vtp9auxI~KSwAAϞ+x{֑mk XjFZ׃↋-+30(͋~{02|8-}Ir6(uVirqD|"#4OSGI-OPT/src/javax/imageio/metadata/IIOMetadata.javaVMF=_ѵ'pa׹$&8 a\cf,!01uOOzZ F-L m K'bzK SdVA^J$O2VhAVtbKqJ;(-1*΋ZeFL]١CC@W>K_{z`8&ɭ G(?gֵk%Z0o) g<*9sm3Csڳ^ʺ`­ѐIuFKwTGNЀˆ n1 6øAކ?&gv8Y8a2$ g$0atqz(πi _)BLtDalAXSSYAWdg\X F\8t$/jq?x‡@,tZE9zι8H$20UOю_0H+g&?KFP/V^aN _gx͵MiG1.j>=OMR2g5eqC~-?4RO{!s炡key%м[^}ZEλjuR2 gu:-F% P^tN\%7QIr| 낭H!'Q"螮:dOBB)bwd|fZI2hcf =ϨnEPKj^ PKK>>OSGI-OPT/src/javax/imageio/metadata/IIOMetadataController.javamn@)F>ّ nnmNq[$4qO tw1{gm*9j93?lt u2dgmUI0]-A߆ϴ%K@U(y U'{,3Ee6\'̦lq'=@'P`Il斀%XA~6۟L'.J:ʁ^Vu"Ds(1ijP&j/6zH֛4߼өGՒ`F:.N*- `cHbN{գaǪYյѐTlbpLQZNP,!g1Γ|!OKx]!:K]q _~ $I:w 2y"D$"TrͥF(z2[?V++icO_PO:OSGI-OPT/src/javax/imageio/metadata/IIOMetadataFormat.javaWkoF|"+ IжC8ƦUU4 ̮qۛةR>s\Cm B_kK\E%!BiW/x|YCL2APZ") 飺Ӂ; \tϠ'խK-9l PgH<91TO qZY[q,TTbRotZ*V.+w\lo: X$,\R5\lJ^#!-$=%'dbVLLI>VҾx76[~G|[w 'L\3u g-g>J:eGܲ0,ŐyH%-eBA2.kFgZ&1WLKZ-'-=.;1.[i>|R9b[;^ 3[o*Ԝ',LYPkكK eCx֥ۦ s8 &D8kJpFo>6"sܡ_&#umpj+vh l9yczMg9753yoxWVޤ&m:i .똍+R!o}NnM+=5%[֮鱆%? WBDH5d#fh)2S]קLSɳΰgN/#9ӣ~Pc»˅гyXrJ"j9W<"d4}֎f(ˇƋcMM!{1Y?3Gf_GuF@q*]_/y4k桀aƘS)Q 3(1ŝ~PRuM 4#e?Wb %֏}c>OSGI-OPT/src/javax/imageio/metadata/IIOMetadataFormatImpl.javaXmo61Cp-~ ;bjꨋK}R,̗6BN)٘ɳv8OSGI-OPT/src/javax/imageio/metadata/IIOMetadataNode.javaWAw8>/b^N4{͉[ yGaF- awdLb089$o4ҨN&kÅ c(L뫫]:v&v jTK B C@*T`'TK킋|Be 1[R5y>&_INm"X&-ǐ3h9#ŅLN:YV+enYCn0un "Lgk` ٌFlR ҜJqE-fZk,5;m9R$p.^ǂ|uSڛLz;`Bo uG IF~1Q6ɭ,Ca.7t>sBaBP.Q T16&17dCnE:@ْ=:go`*ۛ}EP^*s)TYFJ-ȩkTýK;|㜥9z͹L锴YbUx";#M:0x̗b0n iI#Mv f~5E[JГS,寁I1wN(jWbEeEM_7z(L"pZtյO$-a5L뚼9I;Ha4JG,4V~]~TShtpֳ~nXېJkG:eEe"TBrIPK QIPKIG@#OSGI-OPT/src/javax/imageio/plugins/PKPKIG@'OSGI-OPT/src/javax/imageio/plugins/bmp/PKPKK>>OSGI-OPT/src/javax/imageio/plugins/bmp/BMPImageWriteParam.java}As0jhn-'h) &er֖TIa2d2SlKzM70U`9gX%"!3xi<6-=!=OSGI-OPT/src/javax/imageio/plugins/jpeg/JPEGHuffmanTable.javaOo@q[zp&nT$37]n;K4)MN7Xe堛`pHLt~ߋcX%Z4[DQZ܀4*D.mh,W!tӖ:Q@씇@*"1 Q;rUZ]Rljmд* ibw+Sĝfx:ϦuL  P&W9[WPXijN׍˲Vafí3|ݓ{46&dfditu8[E\&U:`b>IWbNϐ/k:id &{!>P;KVc S4YzV"jFR"hjnkdp01t+4Dg]-yM\ZK_i,Gk)䂑/ߦ'(j&W1DoZA%`C`|&+j"5#H/n_?-''ǤN^L7k+eefHџQxT,]eAay#?OSGI-OPT/src/javax/imageio/plugins/jpeg/JPEGImageReadParam.javaOs0אڜ\BH0i&AkTTI0{W͐d:߾;< Jo /Wf9Xd?C7+-ѢYcC.ybр[!ĚenBr%$A zUop[UCŶ "1 dp tgn( u t 4}B`3>+i#eʡk2O5n@kේJ*cK*X+ ҝSuc 5̠:×{2)$4ICMy<]$fsϦg"M=;LB@6>~-BBƌ@OSGI-OPT/src/javax/imageio/plugins/jpeg/JPEGImageWriteParam.javaRMS0<׿MN :[ )eC3L~vDeI8)Sb` vW;J /i)Hd>@/#-LТYb9)JT2Cniң74+ GajZc/Vl R9,s.!Un-64* \7j4}@`1鏽^]!8)zbx0%a]Iւ_7xUUV=perW3^&>ܣ=R]$$N^dOWSEI4G'43DkNT+m|})BBƔ7OSGI-OPT/src/javax/imageio/plugins/jpeg/JPEGQTable.javaMo@q[zpn"H1iU=,fl&]v5; NKZUj|;3̬9 Wi )A$% "4n | 6|Z4\E)Eeq ZB 򣎴 KZA?B'4P5[]ZlAiE IMp@ R.jjSx5 N\P*;LjݵrxTUqMޑ\9I2~uեh-Q[SbRT ǜԕ!G*oՙA/$ -JhhaM(hD IGIU<8U4EybtRV~L{;b[I}a-._9FKR!q+&`f&p;6,ȿ z^ޠ+zg`=ґ PK!?'PKIG@OSGI-OPT/src/javax/imageio/spi/PKPKK>/OSGI-OPT/src/javax/imageio/spi/IIORegistry.javamMo0 rJzZtl3V$@Q#i'(G9^"yI9U[a1E kR@^N& 8,2dzXG2 rGj%4DEH*G'20$ `t$:6 G Pe %v*{ f%J |mAq][f)IڶUGW%)'wt6g5z4 UZU9@:bp<;Z7iyMi9dyC_C\U6ab~\B:v (-}`]p y"䈯6-BQBe8nG> `dj+ %Q$}~:Ĵw2tf-kUCQ+̲Ѝ3ҿs9KSOɹp|Ԝi)6LA7u}/{CB-4`ymnw^1|#X0q&jBNͨ $CBͮ)8ˀv?E9e&UAoJ&EPK'aT PKK>6OSGI-OPT/src/javax/imageio/spi/IIOServiceProvider.javaRMo@=׿b "jHn U+jd*$qY3qPY(7yQG0PqЗg $Bd<>? BREU $*+ BT ɏdh,i'zJ,@R uYurOuǡN0\pA_@^ѨiPCmQy<=KPZ drbUR,Yk!DnϜCT>׮=͊3ݓidPЋ2|8zx}~(Mde0Oa:Of"'~lȑqw2ǹ"dO$^PҚ$[Sy-r\o(ve+OSPINׁ/hoOKlMH%mE%%ҁ,Ky$?ޒgұDx@szhHB UF;>P_zCa!-6(qb+=-kCZa s>pnV|"7OSGI-OPT/src/javax/imageio/spi/ImageInputStreamSpi.javar0SpkHn-v\BZM3I39f1JJ2ɻwe[}-iJó`Έb IRp#/FniH shH\%Tr!.c/SlrPY$ aa%J|Q;r-Z-ܺӪxk5T8sڠiw-tú#Grkl2ӷD%Z UP&gZ^5g 6M!$]Kf4xv2$(>h+ LwR+Gs9&ڢTh4a}[-.L)6qL' -Ć@WY 8OSGI-OPT/src/javax/imageio/spi/ImageOutputStreamSpi.javaAs0א:fpfrbId&ޕq[9,~IQ,ty쫀,{1@WZEyD ^FpP9pKX3N_L?X$\DN; FUbAe4(v $p-Z-ܲӪxo5T3Zm_̵g霾뺎XC)Sm$$'vխ,Z0`8ˉd5(0HsNy'dU W3^f.3"Ah/d}bc:qIց/qdKfi<% )U2K ]C<*Ȩ>jqnw2"Y\,'kXP5I@Y ˔b%s_Q?(_^聭c$V[j1 tSr2ϸ^2BM|IZ9]dL P[(IҌ'aZx6!qϟ@5pTnl { B85|"FR%ALZzM1*#aJCxޭ9J;Ju9IJqңm5ަrkFVeD"ڋ@=2OSGI-OPT/src/javax/imageio/spi/ImageReaderSpi.javaTn@}._1 *j.m.jd"L3MͮAQ nT;gϜ37_W5dV8OSGI-OPT/src/javax/imageio/spi/ImageReaderWriterSpi.javaUMs0=_SҦm%41Ltzbڒ*|L&+p Zo{VZRM5O脟94Ӕ3!*Ɂ禡2 tѠa 1"F vT,"Ro :컄"wp 2MAH AIIDP R uƍ[VCc[fgSK\ZB>r@?وM<.=iE}XijB2껔.2!3Q"6(wBڞJw$*#g/$E\T9}!j6s̲s3f[h6/AlT-^LGΣ7-]Ϯ/ת4Oج9iOٗ2E:&WJjkBKčʔ1+;Wp>gIzun,Ox  Yx[(FʓޗOXdUQ_h(7/7_Q"?[m{2[V6Dp {b{szbPy뿏AVv/¢YbUޚkNWv[ۢ]-nkm 瑯/ՈS\Up=}PK2\ PKK>6OSGI-OPT/src/javax/imageio/spi/ImageTranscoderSpi.javaOs0jHnmN.I[O3I39.b1Id&Й?o[ɣ`bqW_fԊ1AiYTz'e*aE$aMYTfg"C? zTop;wMƓ0ÊkzPde6rXt;Y9+_BЙ_ѨmSQ}M>.[uknIЊ+ Zc Vd.uXWCfZt1K GMQHPC/+!/{)+r!wvwl &*B>CV÷Iˤ=XM<"DGV`[Rb%t`EP-9-۰2bjpz+%W->w6|f!\HxTTb5CdiYRK);h1yg b3x'ѡ E,Dߢ+,V_Ë\Oz_~a4{$PK.^!1PKK>2OSGI-OPT/src/javax/imageio/spi/ImageWriterSpi.javaUMo@=_156MSԃj#LEU-f0]ww&#3oޛoL&kţV?cD:Ӷc0ƨQp! 3H ~JO~\ 8rzвl,Zdk@09!eRR˸YyJnK 95]H4̔˜serƎTQ7.bu;;b]޺1j \XBB6%1@*`BiYg.h97Shaf\ŧ)چ#I@ecn^Єn rMqcw4c8GGtwt ?yJFy!QV䶜E!@ܡ0%`<$i"JY*A AڶUfrӁ.hPX{b_.A#ITJ`SBägCnb;y݆?6ޔs.X ێ$~C0qGjzu=^ J7|(CۯCh$5uzPPED*OGl[VH==>4u2ZsLDqTx_PSQ9TiFN__!0J5p?db(B9üE#YfIwh g3oQhR%`b4m+mvJbi}gb 555 %bW{s*xf]=m[gzO+SV®Eh^qMj̥ھiZuw{DQ5FPK؋V) PKK>7OSGI-OPT/src/javax/imageio/spi/RegisterableService.javaQo0ǟǧ8)}:mbIUDtUrl} Zu<; VJꣃym iD,!"ېL 9Z4'k6w; 9)ьq3vFSɅb8 Ƒ'Z5>5_'pPK=M+nPKK>3OSGI-OPT/src/javax/imageio/spi/ServiceRegistry.javaS@ǟ 4o-Dm3uCbdN\zw!R{!b}In^h52[(L C8, Z'αеal#5Qc䒂!#)B?c!T+BL@4aJ,d3T5s!fx eZʹT, Vrb3J.3t}ipYIJ2VпDUu*PkP;*,eD VTf.7jYuBLuhV2k˔pzT/*t[ #(X+A3`8V#ͅFnSBw66nu l^܎iVg*ϳ7 _IUc_N;:d;tWַIR)ʦݭ q.$hPK &PKIG@"OSGI-OPT/src/javax/imageio/stream/PKPKK>@OSGI-OPT/src/javax/imageio/stream/FileCacheImageInputStream.javaRn@=dGZ㴫F QTo tw1"{g1UU̼yW\B5-ʭq>$( *e0M>$paX9;,bp$w"GiVn2>|Am0 0vѐMZ$a`#*XrU7Nmg`qJqPTgkm> x8P քwl[R=T ?[qvސg( H9N +dQqjО5KKE)t#y`O*lBE߰5Kb(~,idvHp<"/$lIi05YD($GРqjH`h*Q mz5 =};DMg{M4!8XkadڴǑ 0$ ~G32 OޛceS3օ'LΜ3,Y pn'}%m%Lp|],~6qQ|~PK< PKK>AOSGI-OPT/src/javax/imageio/stream/FileCacheImageOutputStream.javaRn@=# ķ'8-jqEUkma.V,&V,re͛f'r f+^n 389; ka0,,R5->1X;X@+ T`6Qr \ !0RRe 5ۃZ5y\@.fq ,V <re4~ f1]WKUx6O{R=T݋ [j!U9[֊u R!匴; ZMZk5gC{H_hlL( F)̳$Kzhe< ],Mne&w Q_Q5: ܎x!IXˣ$`<'klYP-*AAUsmUT憙>t6 d[yMg.}:MiB^1yK 0[Tښ5Y$E_e/1Y'w^tlTsV)S&NMrahgXQдJ@8ejoAZ ;oyzPKY)PKK>;OSGI-OPT/src/javax/imageio/stream/FileImageInputStream.javaA0WrJV9lE]] L[]ۄDZ%ݕ@W\B¸@}5g@ϦknmX9;,"8/P,%j[H_P.̂)`4FCd ;Z6F}PF :n}e$gt@\Z> X8 քwbd˷z8u/j44l"Wk:XjV:ם斋#7cjbhDY?kxV(Y ,&^iBo%9Nn|@.nⅅ<OSGI-OPT/src/javax/imageio/stream/FileImageOutputStream.java0)F9lnmN4mQW lWljhw*Q"mr3柟 nln>$!*DN'[ncXL KԨXDX@+ T`6ar \ pmh3j! 5y\@.fq  tFڭOAtliAu>RAuC4_-n= ?[l!U9Hk: XbFZ՝↋-צc -(̴ )D>iz>%+x 0^E%̓.ZEIL{gw YFup(_LZ%s9&ʖܢ4jo$0]e C>lv>iͥO"gNf&#4MHZӴ&sWEzD]‹f_EFadL•El$J !~%pI:s~F@}B*.f{_x?[ɋ~z(r ;8PK '-PKK>4OSGI-OPT/src/javax/imageio/stream/IIOByteBuffer.javaun0S |Uvrk}R~ ,rEʤJRV6 7Y3\vgdv#WiP%ax1Q1J9Y2[Z%MneI Z[V ?X. ^0h-vF젴Cg=E%=:HRoڀK> .C/` -c! Їg\y<>Dzܼh67:ܺS Y C;i8r2U)ڈ@Ԇ洧tR1\/ yeN xlBaȊ."+bor-w ܧy:[d79u ={6A<2C SqED'~A-%GSu'jBd'BKf#Wަ;[ N8.4j%Oe#2˝ˮ)'%/VIw~u { ܵpb諆\gT4S_ހej>Nʫʒ{WrzިBːQx*G3PKZ*PKK>7OSGI-OPT/src/javax/imageio/stream/ImageInputStream.javaTMs0=_d!9w0i&Akb$WqN{Wfۄo߾}ZwڂSbx4yΙ~ |2,R 5 &>1X+И@)T`WGRuݹ[YšmAHFR#]. 뢖Vqtujnk0 JZ-)zUU)z{Wh. YFuPɭ]qOB*wt1OyLdB&7u5v[5 L,M0Z}gv5sS\dA2Q&rH)u<8Vzi^esrIoI& C3&LSX!*hy5*kM訜ڴ:z0,5{QW]H# #{Gu8l>QdkV.DcYY[-8Logo ih+t.Xd:?\sGFe`7Ҕ~R֋Ldk\2jlj\vc_L/z!g@ZA{!5MWgPKK>;OSGI-OPT/src/javax/imageio/stream/ImageInputStreamImpl.javaVQs6~.b'/Gn Hh=MIon>{mɕdss+Lsv%ya*@?Eqr&Bhaõg_FjXF# C#E a3R7 *o-Ae@0bf 6+ٸuJ>rm3J)3%i1&q8s=aZ?2Q5('2b5qM(9#-↋dZfZk:7'UIz=lcLƁ ,GqxX,a+1~7$h|ΔU@4"'bYPQwq: {{eJ \Xsc>cZK"m,VNdz~ŭT7SEb6moO ID}[M4ղ NB q`Ÿ%ץ G tQ<tvv1U=Rֻ10Ҡ%wF2EsöQTljSɊ^Q{ѺMWXk`j\ؕT{.\Vo&tco@ѽ#{Zt4t9gD`GLjQSe<0>zSQ7 u6l_O/r4So2m8~5|/~Yqy*WK/PKyHwGPKK>8OSGI-OPT/src/javax/imageio/stream/ImageOutputStream.javaO0Sr"+ ڜ$ۢF lWp 6Mh1?aU=\8pK/+n6$!kDgKneJ [ԨD Ph̡9*0BزqǃϨ4 \[0&ӅEe ;: ^#}. M;J빩sFUw#C rF -͊(zx*cAžTePju8]%c׍QkPZR=iYR+ҞVu@L\yodiLtWaFn6w:d $^E(iv a|xRdt޷: yEHI(In1Ț(;V"J#hQ5\k$0703,8݂yC\dYpnOiRpU#[tL:Ԑ"3TH<7nS)UdGzEvkI)6Fˊ)fմP0x]KF ; Q9X9hi%ivoOPK5v8QPKK><OSGI-OPT/src/javax/imageio/stream/ImageOutputStreamImpl.javao0ǟ_q2mM RHWU  lfШ3Ъ=6>wgg~ ,eW-32V&(7M2R lLď &pGA4"kx[`Ae A+w-X_dke3 Lnw"7t xBa9B.we5kVM)y 3?y@sǡ:B؎{5:w&ji%m`ԍ:À)"*yK zؔBa:<8w)<#ۮ VNrZ..df %>Gp]l(H9Jg cj1º\ܵ[Jj u:FJp~MD8(#ngo/GMCz#ԖSXh7q0/ {^нnMcz≠u8.\ z䮭qM<_qB hWh7۫OqPKmi PKK>BOSGI-OPT/src/javax/imageio/stream/MemoryCacheImageInputStream.javaA0WrJV{ksٴE݂] L[]ۄ(cBWnUo>7vx,5v 9f>ofSXA2 ZQC+3RM0Lƥlla=i5H n`k<,plhv73Rx2 m/hzxv֪au]ǁUX&$[&cս=0E ךu 5J#Y\w[.*ڎitygM푢_ mL$ &.wx1C^G&^ea&&N{Q>xP% ܵ|!>gKFahjYP=jA@nqj`05oevzmz}g{vxCc.YxͩPԌL~F~&vXfX+&SST8zF?S tמ p'n+3ew62ʺ~$mN/kofit4~PKT< PKK>COSGI-OPT/src/javax/imageio/stream/MemoryCacheImageOutputStream.javaA0Wr"+ ڜh6mQA ٮVU&-6!(FYR{cW\\6րO!I?p3#7axL}; +԰BjO 9 @f5,ϸTK7~Lƥtflf=iH a+rY7HNqd03*ho\̌gkL6ؗ Vw|LXu/*lY!W9k: X֌; ZnLZLQl>i̥Oq3i3&#ۃ.iMӚtR/r yLa"lSp'n+)T;yqҘV gpz_ xo;ɋڡ;R¿P^?cG8PK &dPKIG@OSGI-OPT/src/javax/jws/PKPKK>(OSGI-OPT/src/javax/jws/HandlerChain.java_s@şSI 6oif|\ႛ.]D'޻J[3Mߞ{90[l 8j2y?:5V!FjK  94"Gf,K2o4 -S8vBh4k(x k\@&wugf{ڧX'rc}PSq)f:ӧckLڶuɱ+UUgny%;r}j 4\Qś#\elC^+ւTJfu*n(ǠeaZbrƼG*R@1}?0g? 1 PKK>"OSGI-OPT/src/javax/jws/Oneway.java}Qo0WyJd}۪Ie ZC.=ۄ} Z`{" X*=LdWQ .+b~0c7^i!G[FJ[ ByEqewhP.^0&+T{>T:j"B@H^zv:#;6MMsc}1S ۳ֆ72Nweւ_0fU7=(1HkNy׽NfVծ=f+3bӹWHPl\$* )&9*b!I-[pyI\@2KWId);@>$])2Gm|dS8ϧ+ :[+QZMFH4X-zL+qwW_POz~d K'ѡ遷~臢SX$n?%7 $nqOrncx< t!<\ Ԝ`&<oPKKLPKK>%OSGI-OPT/src/javax/jws/WebMethod.java}Qo0ǟ˧8)2m&ن֒ U}< &$wLkn<͝yv),ts4:XeDR TnߐL )Y2{*C&xȵ(HY*U%p[?Cd Xg0 !4=[vZbP I@BAw n(^ ;t 牀n?[皋٬{š6L>uX& Nm$kЏV8?6J@ǜ;#P\<i4r6T02|8zmڬ6J(Y V),VUW >B8e\L|"dD/$TIm(5UXzOFqGА jY`1RC/_hw=΃K}_HxOy 0ݰ7?k45jRҎcC͒-zM3.rd*+xK .!8 xl  Ta+F$ZϒlKzPZr+{ PK%"PKK>$OSGI-OPT/src/javax/jws/WebParam.javaRMo@=_1ɮ\FBڢ&8Q xSإwi{دy͛] vE0JZ fGG!qH [*|fp$"'iNns^6BI8`148He3@)jϩ $iGi!ȡ2 G~<Q06ֶ˾}JWz5ˋ,-_]˚M?;lز3ZcJV8fSka`Ti{h aYgK?m(aSQp$7z 7A: SX%pϣuE-%OSGI-OPT/src/javax/jws/WebResult.javaS]o@|*OI7j섨kg\qsg/1"}s3e0Q`Dq/0> Z,WW7/CRdv܊54rM܆ XW2V( =mcOqP lR9h,1PiBB 9X8T4s DshԶmGš2ը>a6̒lUw&kFv5*0g5 `e[#*]&OSGI-OPT/src/javax/jws/WebService.java_o0şɧS; *@H$꣓ܤmli5sfbC??{L.eCPלax9ߎ|7 SѠcAnx`(P"g R? hGAH Abp%𐣲rzk-ng23ZW>ZM&msK]MLn"Juj%j44h#0Erך 5J#Y\[.1Yږityg=zҟ (6&`$&$a2vu~^RXqDiH`|]ih_z H>xPU@6t >Pʓ%0%ϩ4Q5B@qՐajn菺Fϣ;۳ךwھg@Gc(\kgu-t G?^Q_0S+=Eɢ!ӣB?.Fj2u1K{ЩQ4( %I>.5` v)mtМ]$Nj9N[S72My?PK $.WPKIG@OSGI-OPT/src/javax/jws/soap/PKPKK>*OSGI-OPT/src/javax/jws/soap/InitParam.javaeAs0Wd{(n4;i&$UƞN{W6m i~D<`+F4rmʒ`zX g߆WZؑ%s*bor'J*eE܁ XgJMLdv-Ϊ { h Tv $# gt$8z!ˑh^υn<8! qLW&7oz&y!!lnr`>fI_lqd܇N S89 Z]RԢdcCШ#& 2`mZ j.(7z#FV 1^~l.&BL;Roh_gr9%v4um)?PKqEPKK>,OSGI-OPT/src/javax/jws/soap/SOAPBinding.javaQo0˯SReN׷T -Ȫ>:p!a AU6֕{ler)LSX#/ܲ\cY5-f2)J42CfGaΛ쩡W9xnI~8PKwt1PKK>3OSGI-OPT/src/javax/jws/soap/SOAPMessageHandler.javamMs0 inM.@OS;I3N6JJ2wM|->R0`SU(ʌ6?| 4 CzKJd$ Ȝ45AXcƟ.2P1ׅz gW lpRYh 0PvLmv}ӹ8<"ˑj^>_7_aM̦? l* ԏרqݤPYϠ߰=PK,}PKK>4OSGI-OPT/src/javax/jws/soap/SOAPMessageHandlers.java}_o0şOq 氾$2`k$BLwl~]C6u[>9w@J(E쳀Bj8|71? WZHѢ㚑7Jk -ByAvf_X$\!tNuz7j#H堶HFTx(P; -Z#Tu$l=qsAkO9}M0~"fʔau.Og-Q-dւ0\UWZ^90OSGI-OPT/src/javax/lang/model/SourceVersion.javaM0ϛ_14t[唲]2:k;1dЏKq<~3 J /?BAgZXE""yb,Ѐ"ĚiwBr%azVo0񈃪bAm† p t+n{Rxhj3:i&suNQqL9\;'Y^ԝh-VsC4ٚ ր2JW,Cjfc nڝZ&mLB/ z.Β,dqqxU2`"IV"{Mқ,:w@2t!Iب$1SkYPIFSqՒcc뗾|a_= ۱}Q @krPd69>cpgq6< Wx܉_vNmA%VJ 9mRt6Wy92ѽ3< H0aqOFQoU/ :\0; Y 񷜬Z;PK Dk+PKIG@&OSGI-OPT/src/javax/lang/model/element/PKPKK>;OSGI-OPT/src/javax/lang/model/element/AnnotationMirror.javaQo0ǟɧ8SCR6M.4ߝsMyH~$\Bô" RpU"L/71팅0lB :)kQrXA*%}ƛ:\9LCd̮Iw(sHA-$K4RfD}F@yN ꧉=<{ͻ$i$lʋknDNXxwn;bm7@[jbp=d*?3/#4l &iY1Oiq϶_׷[O74fXe9>C?,_ƀda@|P33XZ4j: 4VD`ж…:sFI?w~GtY+ %Ud9Jy5uAFXKhW/ [b)jKh?VȔ~u^HvGU·Α?q3X~GPK;PKK>:OSGI-OPT/src/javax/lang/model/element/AnnotationValue.javauQo0ǟ˧8)}:MbiUPAڪ6!Q304~^zp ՝|iU@4I^|U!s24XDp;Q,%j{c>sćGF( .a18Zv,! TA#΂Ua93)癡 (QAGm"0;݇0!`@:l\śmoߑA6h h M'` @i`FYTZX!k4:L)բi4Ro6&a q;S>)ʲ( 6ir4g'> YFӮ)!GAOSGI-OPT/src/javax/lang/model/element/AnnotationValueVisitor.java]o0ǯ8I{DtC˒ T4p ^f AIcTոe|0>v/6gAYr&Rt29G݆*5DQm1`!sИA#2T`6AR'Qi.p`t8YD'XBh4kyk\@*`fӿsX'p`03P*,focLqLKQ% Cx#q%`~cHj|],AM]8PKOO^~PKK>2OSGI-OPT/src/javax/lang/model/element/Element.javaSQS@~_P}fҡ1m8u|<`C;N{4o]FGLV[az3(8)d<>v="5DQm0\ jF+ҫqR7 ᙥJ! kXS p,^ZͺӳX%ps03Jz fzomLu:5MV'U>*:]yߑ>F5(VsE'[`JYBZ րTrtgU(n]red\œZ ۘCkI(e0al`=\ HQ|drkg7E$d'IWO5,GBUrmǪI`fi ^rLz՗-4r%z`Y^X0gNU'(gP{w`Sv-ox}-HempmǴvͶBoI+&RHcBuEi-nEaaN.tV0' /Kڌɇ"5`53/{w[ιH I_Q)sH)&/c47ӯdF{ Oh Y/^š6q~PK/ǜMPKK>6OSGI-OPT/src/javax/lang/model/element/ElementKind.javaRR@=WtXYz[s(e]O 4vf0,}{Za90t09l- $ٵVׂax~v} 1]R4AO d. Khe5J¹Ch(?TZ! TF BBvM/m/춛ӳ8%sPT}Z\L&b_ͤ>bdaHuߵ5BxC &5߃7fS Qsjni$6.a2\,Ǝ!oe,MYGaI A_EỳŏpWc@ZF;$Suo2O*ud,D% &7- ljIA]!NXn?ܠў;_?ߩkkܡSi״Q@ <&o,;aq[友pse$y $(w*  E׽`) ЁgQ83pA(bX̓W,%&q]I~ӱ,Xpˮ;sj7F};魮.Y GBmv&.I~PKOTPKK>9OSGI-OPT/src/javax/lang/model/element/ElementVisitor.javaQo0_qTY}:M(ۢU%@GMﻆmyHds?{W0jy0Mp3!oFknmH@r3shD!T,OWap)&A z]7ulf;Bc@+f,pUgv?8'123jP*lgzUömwH] $N'ou׵4\ī0E2"kAj`FY\[.J,l4:L΍|W={я S| (!.&IϣI .GӘV![[d8)+ <OSGI-OPT/src/javax/lang/model/element/ExecutableElement.javaR0=ԮJZ@-QZtڣLRc{ҴB;4jA+98͛= &:ZY RR=//#Сc2' j!DHם aI:CzQop)RA!sHTxH"RSVFҮӱx%pq- nxAP'vDիѨiPCc:ahOfdUw]Zs`{--;AT*[֪DƂ(,.LNi2mM=hdMhE IEI =]]]ZEu3OSGI-OPT/src/javax/lang/model/element/Modifier.javae0ϛq to-B*MVI`Eo&Nm{ǐJj?3G!TUda\L ɾZpY S!uJ)g,}"8F( 5Bf ;F( ON0FC\U T:FK!PM;X= C,'9-o`m?f}WwmXY\Fc@Nhpޒk{Pxr{-:ڞktRš#V@mFA,2X6uW?'^4 E$)Ib9Kbڭ!ū) ծ)\;S 񝅣[2-( *MV*uF-"hQ7¸2X:L-aWK4/OSGI-OPT/src/javax/lang/model/element/Name.javauMs0Wdg\psks2qqHʦ|L9g?.`шu0/]'Px1l–,=U!;xQT +2ZXcɿf X$\+{l-Q r0XbaJRzBkOL.'U8d9r]R&:D8!Ce;kmt7iSԭZ08G@T%6)O=l`UF4m*a^#ReC 8$8O7Kv?mMYz,7{K .Cm|)|9]BHVS)jQrj!hԞ@m XyN¡;?7z=B.z*C925rS 8=ŝ-;A~$ :B?()qߣY=[uVx PKtCPKK>6OSGI-OPT/src/javax/lang/model/element/NestingKind.javaeAo0SsHLuiHm5#.,$ %DwϸgTKwf`:.M+8Zv! 5TAS.m7 .k!sèцFB`f<co7 .ƮT\k ΂[wDZ?=Wq~֑UrrmRҚzPpQ/@ LŔ\| #bc~a6{? ۟n /~6 2HRX'C F @Slm[ B%JÂWDݳGT:U˵VM4写}ك<ǡ[/vd'rVظ`¬)Q@ѷ=rQ›3$o%0wl~k<ʙ\)=-LTѸwqPKFPKK>9OSGI-OPT/src/javax/lang/model/element/PackageElement.javauRn@=dG.9QmQ#Q xew[Q6Uڙ7o{Kr5,9Yj TJB,8a6!Sa т#FT;s֑Vp/`5'PC9ACҝ =#KP#.`ç%Ec X6K*/VX8Sz<0%kbmAuP=X98AX 459oО5M(d>EVCm!l| Xo`me#=x468`"$4"-Bh;#ձ:H .+,Js~8Ɓ7t2F*D9<|/# =xT{!~>EWobrѱ?z!!֡0Z"'NnPEPK*B2PKK>6OSGI-OPT/src/javax/lang/model/element/TypeElement.javaRO0?o?N-Mѩ,jgwR֝=D$&)q2(]p SwWk|=Xd0L_B ia<QZ,pkX~>\I '0 ~4]{jf;Ac8 p uon, <j3h:Nj\o/mېuCeHwmtLgi6{F{ԃh-pCW;`\lE^kA`A9];.1XU4UNJ;x T03H${daxe2`t?'PK.YL/PKK>?OSGI-OPT/src/javax/lang/model/element/TypeParameterElement.javaRn@=_1):E 7 ŢuPR΀Dg6qV[;{oGpsmꭇq1e~C4 IU /fSeX:;,3[*P9,S%Z[Ȃ?Cg : . 0Ze8Zy=tT @5g` Jq/.yzgy} yT,um:_d U΁_Yv94Y[Auoɓt{i1Д伥M_?plR(!Gpi> $~ jdtreveƧϐd5ͮˤ!G|!'I`AlM՝jC-p?¢88矁ɽ%6lQtNh+׽>&l+xT{G<Gg#:O`?|z}*ݑ~f/n1Z*JEPK|<oPKK>JOSGI-OPT/src/javax/lang/model/element/UnknownAnnotationValueException.javaQo0ǟǧ8)}lCI>f | Ӗ"W0WAjka\L ɾqLz~nR4A2 ZYEV߰=jÕ` c [!@* Abp.p_`cK(T j۾@q&80Tnhmsf]7Bqʚ./#YR1g5u5dU\@i`FڳYw[.+؎ityڋr46&aeg#eq;CWi\ŋ 6^ɒ޾B|Q7u@܍!CPبi^PkjYPjIA}VC^sl/W(<=ԪDyMDDYNFFOgE+܍½EYw>x?`9Sf?aa^KTh#];vYd+ KxyPKOaPKK>BOSGI-OPT/src/javax/lang/model/element/UnknownElementException.java}r0)v|3ZhL30v39 Xc%B0dYaړ`~}Bxܪy0-g8DBp&K|~? KРaAy`P"D-+1JM0 LƭlA 1 /%iGPg8x9pmm?aP&oIH㩵h hqM`-Y WzPXrֽ6gj^tbhID9Dy:OSGI-OPT/src/javax/lang/model/element/VariableElement.javauQo0ǯSRmM )hB܁ٗhuRi$_re| S:[BG$g,9jz 4Vq"0h;:M+;I.SEA=F/(N ;]ab* L_p\_^X ތ A*_M'5$+^$hGB^=| PK<ҬPKIG@#OSGI-OPT/src/javax/lang/model/type/PKPKK>1OSGI-OPT/src/javax/lang/model/type/ArrayType.javamAs0WtzLCqfNv$V*13P{+%W\ںt{`W ؖ5]׫ջ%~e(Cu,NWh<Л :Uo,;uy̦lq,FQ`,CQgr $8y=++d< ݇$!VgRtO&/7ozuo:$~優R{a@RcҬMoag_4D.)Ǵe0yv_;xH"w٦mm~m.O5o29C;/% ^J7hUDڇkXN5+>/+Dg0N)<:\vJQr)wRvFSw6H(y]4lAay.oOPKPKK>4OSGI-OPT/src/javax/lang/model/type/DeclaredType.javaA0WzjW){EXR)ڣLRciZ!;4DIlUWdE0-g)>H\r4A G#B܊ :UGH /3 Z'kiLƥ& N@iCbx,x JݚZ/~g'02ss*04 7{L&go:+Xu$:wRǻpCJ#-"y\Vx98][ J8oŮOBZ,ظIR@ZL]R<@jH>x46t@6E|P >P%g(5tAhm `0Rs?L]6r@_YVW(?L8)9t+,%Vmi{Tw1˱FtAم %<[7{x)YXK4תQaO뼐N{xaئ &\_PK#jPKK>1OSGI-OPT/src/javax/lang/model/type/ErrorType.javamn0DOvJnnmNB9Jf+,IY6{ $ht@0p6+ǴaS|HV U9x41A%GDUAUTE@H(7VAIp/0 XEw8 teKsIC*hF^pH6OSGI-OPT/src/javax/lang/model/type/ExecutableType.javaO0ϛO1] B@Ң$=$5$'M+wg $7ϿyNt%̵[YoV[ qH lt ~6 }RtC2dor+ TKThQgؙ=Z'pc/ [ɵZ :!TA]@*(tk^pIqk,`xU A}x6Dy}qm5Gnb-0ut,~{ fF-"Խ$U=+EoSJGV;: #~*؄QAu%ԛ<$]q +Zd _wcQ/x(HUս:G{aOwR88~ PKl, PKK>=OSGI-OPT/src/javax/lang/model/type/MirroredTypeException.javaAs0W);94){lHrL'@;toW\aۣa\L?Ku-*WZdd ! eDJ2p;B܊Cdd c/ dGݡG(Ybʚ@ZPuw7N\pB˻s!Ls(>gǡ6UT_6M4_eC֝ZIo-*Ć֢6!9]F:)޺^RZgs/#\c 8G1Γ|!n8t,s2,VMNV)>!N5Io סCk|lSq^n9 [}d[*Vܚ:Q*'#diZ6XzL-;ӗ/{q=7ltIu-̓8QԂ]~hCCTiτ 딓3cfZ<{afې댂zSp 'PK K+wPKK>>OSGI-OPT/src/javax/lang/model/type/MirroredTypesException.javaA0ͯx+ZV)Kۨ,H M2NmVC]5G|٣Whdug,/QYJ2Bz<~3o?F3-dLHYQ ܖU"_;+u8F'Po0񈣮G(P[bȒ@*]Ik۶}:WNpw~[wQ4hkGx:[׬S%Y CjixbUXR401H'U1CK\´?y lPE)ⴇOQCW_w+GI-V,2tWrψ/n С2~)[DJt!aϒlEȌGSE- BdONZSʝtµG/FA>b/;ScEl'R[ifW%WDG*-LHj䎞RWߌ~[[;Ys ]>>`/xG rO[`C6 . N)~PK.xPKK>.OSGI-OPT/src/javax/lang/model/type/NoType.javamA0QN*toh6mQ  dZ]ۄJj9&+=A$dnwCrhN؄MFiQ6hb-j--|CcII wRZmŬF R9-YhGsIՠrIyP,ܠy׾p ;:G4MtQ!G٣`H'fjQ1k/&PDgkNyɐ#mM i:C^G)؄U\@RC\$֛<%채8Ld9>),Gg[@6~$@|Ъ+XSK5&Qt:<h4Yo@N?s x$Ρ `Y]NJV[;[%_?PKDPKK>0OSGI-OPT/src/javax/lang/model/type/NullType.javamA0toh6mQWDlW{t` n&$wPiW-=oy&p6g+Ǽ^`S}^ UH6ʠt(ɑ=RC0y5)G Ր2#jL:n%A0J]8q# txHZ̄6J3uQ1zr~ Ļ3aZ옵#,q@=Zb8QX 6t߄G-؄,W3|ʪSy)+ˬ MqoMȊg|ˋđ9t26L2yETDoZ}ErjʚGS :BdOC ]VǀMAz/[Js~8%79ğ Efq' b-ݓjZ?E;E/PKWD2PKK>5OSGI-OPT/src/javax/lang/model/type/PrimitiveType.javamAs0 nnmNq[)t4 $UL+$r#ۧo`d=8XV+Ȋqבzy^?B WZѢ9b7 Yw@7W%%: siH`dOj$RFr='C`ͻ91q ř8TFvwL=w=2<~{fʀh r)O=r$5XոQ65Ygh?Wc_ 86!a X{Ǥ=yɮ,m%eq_n ȑ=xO㼼"uA+jd;UG4''2`m: w>z3( 7)z߰W5v4zsC~ƛK3CYw^aOPK\PKK>5OSGI-OPT/src/javax/lang/model/type/ReferenceType.javamA0QN*toh6mQ  dZ]ۄJj9͛&+=A$dnwCrhN؄MFiQ6hb-j--|CcII wRZmŬF R9-YhGsIՠIyP,|A})wtNiBq!C? S/eւ#AhEŬ@A9'CdZ7 ަ! U{_FncVqIq[o򔔟<29Lw!NKo92~|)B UW$jnMv:uB##h~o@N?} x$Ρ `Y]NJVsl O:;K1L+PK0kYPKK>0OSGI-OPT/src/javax/lang/model/type/TypeKind.javaeRr0=θ8ͭI$f  >ʰjD%aǓɿgeәdA+[}:ktw29WŃֶR a|{s} > Es:$O zUC`( X܆70M{؋(HVZa@*۝ ,^ q]\ ιlv<CqVjKIgETVEk^xsёJlHk+ aN{G#T޺0iji}1Fs&XI1;V$ԓ$咯Jxayβ2 9D<[$e3:d) YF}3~)W񋄭HVr++M5h}@h"jI`iZNs꿹|Y{yp5(h"=O!837 8=>PK/6PKK>2OSGI-OPT/src/javax/lang/model/type/TypeMirror.javauQo0˯}:MbivPAڪ.=ۄDJ!Kt9:i,+8Z]@ۆ) hP zQChOx@mpw|X^9aN yp XTrfxHie$gTy-fgV}aB6RQ7iMt7iyGsս:.OQU$֎ 5V#Y-mF6v`M͍ռ^ X$>ER1~ynMY,NI'I"{0s"o9!oxEg-B+u 7VC[fǭrEG9pF .'WKFw5>'ȁUinz^p J);Pi3dXQtᢆ[}'%`1[J %eN{PKJPKK>4OSGI-OPT/src/javax/lang/model/type/TypeVariable.javaRM0=_1)YM[ԔHj dZ],V*ey޳n`P}p0-fɿMCBqmsʫ 9\/ z3ܛjdMH9$<)~gYnU !&W!N[>92GmI>-BFBΒƂ**ؚ;Q#dGѴdZXzZr [W|(8矞x* I]=9404$G.3 ?_+6آtzd GR[ͽbw]wPKf=|PKK>3OSGI-OPT/src/javax/lang/model/type/TypeVisitor.javaAo@W|r"T)IxKwc,&K-}fvGDU{M0;y ,K2C^>Y!q4LpkP̡9jk:Ň;Ԇ` CW0ٕCU ,AVT".IԦ5d>%Vp`CB >kkQ4hJPkFds?krTXrR44B#kVԍ&KmFXMھSFn&$ t4J}_ $,yy<<-> ]]8)+ud*hE&ZڢT7dܱ;LI¶K6yс~lTe`^yUq,^JH{֭ _eB82Z}<Ŭ{O)̅IںGx.8S{ZeSm6~OA;$4qIV>JET}I~ߞPKXCPKK><OSGI-OPT/src/javax/lang/model/type/UnknownTypeException.java}Qo0ǟǧ8)}lC@dU \[=ۄDU΄MZ߿Ax ,:j^,L7Qp&J|~? KРcAx`P!Dw|p).&dpeGBg7x(QYJ٪Qv7)F,,8޶A`vs}8sքr䫏d=ڈ;LU rmXR5ҞκrQ`LTX͋^ #~1(8(sAt(ˢdrH3X}ӄ޾B<8idTJHq"W [yV2 K%&ܣ(-7-KorBϣ983۳CA++l{TTW8lYnċXj?2|>E0r#L-O5gz_Hg,[+MFkQةj YsyPK^` PKK>4OSGI-OPT/src/javax/lang/model/type/WildcardType.javaA0WzjW!){=e"TJT{tI:vV+;6]9$7I"6'KT`U} ȺM ~;K6ADu$*5F ~!3Vb֑Vpa4a/N!{:GOSGI-OPT/src/javax/lang/model/util/AbstractAnnotationValueVisitor6.javao0ǟ_qS;$ V ZNIiOukhVM97mX?ApΊz0ȥLqht etPCeFZF 4t:e#DŽ^ N"blC8X w5¯u:JT7C/FwewYfD/I]gž9IYіLt[23Oy5v?OSGI-OPT/src/javax/lang/model/util/AbstractElementVisitor6.javaQo0ǟɧ8Ba a j۴'̵4}wIVMȾog|kxoR)Sax2@w$lC2p!@rZЂ qn:$Abkز=(vH `-$>p4iz^zF ^tl7i*NƲui~-DZXxfHgK*Y,R렺 U7bV,k`4)%e^r/ϯpE:[Y 糋|g .E HQ|06L@2E;E($u'b-8UޡU4[±: )3n+4G|@?َ=$l eR{!Ϣ>StZRb$Z&emdJk˱U5~|<OSGI-OPT/src/javax/lang/model/util/AbstractTypeVisitor6.javao0Ɵ_OnH0nմsM^XD8Xڣ_0˿Ju-* 4pyt#e„%)GK4jI~MH(y"1n:Β!ׅz#fH +xHRoL'~}Qu ]x VO!|'7ömqPh[ c^f4e]յ9XH{êJQZ1J/UoYJ,̴?y lP9iqfon<.I"[d) {6Ala)[DNLJ%9C\ɒGSU#*BdOCv#]VSˍ^ }b+vI&:i#l'DңMboF:}q_}:LAR._=g'OJc27p<ӎZVR ~؆x]~Hkٷ@>kh1zjǻVJ( PKn!PKK>5OSGI-OPT/src/javax/lang/model/util/ElementFilter.java͖Qo0ǟOq *m6e-ݢU0ڪ&oU;ЁXׇmRxr||N<8 Un4ϗ':=|f. >)8k4B%S`akgpp%AکIlTۀT* d\ :ljn:#VC-,pF %@`n~KkwAP׵b_<X\GI<~Mm֍h hQqM/6JJ؂XAi`FQך[.!ٚit2)7VEeL1Rd c| (:hyz3p6 'hte4]A8/rH:.0s# djdJLx*MrB-"(Qܸm5: nm^ <|[N/T¯,g^Y-NH#ʱ’փ5nhkHxIeېpXM$RJ.yeQIwbz4.l%J3x|7ƿ}i~qi|>f K9+_퀛_̓z{t˗0;|S4蚇[4_1"!8%Z9?77 M]L1cu{Y!='PKF T PKK>;OSGI-OPT/src/javax/lang/model/util/ElementKindVisitor6.javaUMO@=7bSR'p@jiiTm֓d[{ݏ|;J>ݙ޼{ ؃*ZZ 0uwځ߆GHР^``Nf’q'@mpQ}!A g0pű $pUFJP(QBI@`]=skr X8Pz7;0ޒ:\h h턦'k`%lBZs4ҙU^R +FMi00V[jmLB3L!N%LA..$ 8Ja@4|wtciQO߉?LM}Eb?QϘfR<?q^f8o{yo?PKxٚZ PKK>7OSGI-OPT/src/javax/lang/model/util/ElementScanner6.java_o0şOqL,>ThemECSe;w5 u@wνi=ܨltfkM T0Ycw; }"8H[pǐ1j3 cNP&TRnUj-Xl RY CW3 BW󬌶v)). < 5d6eofmX.>$6Bk&$J]sXF8Q֔-Ai`SgK 9Qdf,bMf6&$%$QRw;}A tcvn~un2U]SvSE*" NiΦS@-"Pυqc5p0 fU]Ψy_-w\ƘiR3IWaC38E&K?ɳLijJrͱUKsz|!IxQ|D#2DM8YkjE96#<:FX=佣DHF ܆wA؂ p2O<+XFǞ"͝r)ʉ,jwi/?. _\ou癳hs-Qܸܺ!4y~ؠFﯳ#h{:4#ݐ;iNC lo?{PKd2PKK>0OSGI-OPT/src/javax/lang/model/util/Elements.javaUMs0=_ÉtHrkiz@09(%WN{Wi IdF۷o?nkbE:ЉN`|e2B蜟uߞ0w gi`cFJD( P59W~.ܢ6BI8gq}r ֪A* A!*‚h-Wq ZN :%ۆmC̭-z1S:e](!֍׍2 bf| JO5қUR +dL,",6)mKh{A.dOo0&o4' |G. IFqpUhNκ >)0(5I_ ڝ\rTWS-vXw k61?PQ_.KdQ0*~YUIhN2{*>ǗOj뀶 v[=;'ϫ#!¡R9tfg =nOw>oU2}ld; %b(h&7^3dB+>R/F_oPK4 9PKK>EOSGI-OPT/src/javax/lang/model/util/SimpleAnnotationValueVisitor6.javaT_O0^?ʼnu)B [EI[rkkڙTs P"ye~.vwWF‚a|m] >18P̡9j `MۓLQ$เ^(6%ۀTJ ̸@ \BښEeqNfˡR(y 05]} kzYWzu~8LzHƀ%הqVU5( lάrך[.0jfLɹ}Q)T6&a/H JP3n\d0I؃p ϱoDa.*g6s׉; `rk %&~'$.QZ)'ךZMʀnɗ[+[U次RznXR EKjj eŶL׻8e0 5.b֛!2"S@ɹ'hhK yƍM}77Үw[?PKPKK>=OSGI-OPT/src/javax/lang/model/util/SimpleElementVisitor6.java_o0şOqT,>TXemECSe fv}אV :6Q=\u\bmA7}I)v eHBJӣiZE؆ԪZk]œAiEb S!pűp p=/*kK7u*wCO#9Mw\ez{tj-ːmZrnr=NDkRxV+&U%hlfF8fMz̠:#& #+ؘZAk%YChwQFagO߻IIGoGһiRdTWMN2= Sd b*8f%!@3֏Ւc f/_/lzn89ʰtBv/u*lHaa4'T2ʢІBti8V`ī(Lnee#( dDsX +63Pma41<#T(F_ķѨ;|GQ܁UJفݳoګ73[‚:.>Api?=Π+1 y7q9`{^F#h{:w CsJcf (PKΖ5PKK>:OSGI-OPT/src/javax/lang/model/util/SimpleTypeVisitor6.javao0ǟT,>TXemEcP%ЪOqv!@,Jw}s \|ln[0LL0gie] %>/8J)2E vӣJ™߅KhTFUm@* AbS!cnAHjWV>)&Q:ަl%;jRmsM]$|K&l夊 i 6H1VY00VIaL{H&mLB#H J9H wp< ( p9\Eh8k-\2\ Hpvnw= Sdrb*8&g! Gm!db!,\Q-w\RŠ}ڮ3IG$V$SK?)\i2%QXe^8A>Ж98pVa>o>Sej&AúG )MdUx۠?{ ,nf*I1,Ɛ y0%P߅t 7ypmԭϵfhsW2sr&cku:KrE5mDZQv??]q_My%Nd)g=GPKy]PKK>8OSGI-OPT/src/javax/lang/model/util/TypeKindVisitor6.javaQo0_qT,>TںMK)ݢڪOI.=!}אUe]Q|sQG0Pzcxp;0ξpL~ eHB 29JT@niӣtJI؇RsUm@*Ebp s.pv%jh5wOCIac$gAkBo ^mʔ=( lR7@kϊx)UfUVS>umUsW3Sp Unoh3RO46&eg-88zm<:mQ2Sxz(8(&ܝ"d{jjԚ,+V"jFRG,j)`1/cn/o VlznTr\wLUؒBmTN2*d296bπ{0Q6v t5#\0t[9v'hNea2usn$3G.'-z<~Q-I.Lس Hgw;Co/^;1ϕ GlKsy%:\(K;E,l0R-OSGI-OPT/src/javax/lang/model/util/Types.javaUr0}&_ N7(ct(W KFsg8\۔<ĺ={vew^75T1"^rkjy%O:[O|vXrbqeH)R_=noZ:<)\ ӫZ]cI%| s!ʸJcIi]5n8 w>/Ozi4PK_/&p= PKIG@OSGI-OPT/src/javax/management/PKPKK>,OSGI-OPT/src/javax/management/Attribute.javamAs0x 2ԐZN.{drf1Jmɕd ߳2nLF,mШ !Eοd;2Vjp h#A%Pڡb+KrBGku)}^;rwBCwιdҶm(:PbRvrIԽVd- iGrfR0gN{H'U1[ C>f#3rݸ7Cȭ؄ g|8x3]>Z.d/2K:^i»1GС6Ɣ~WDFaH\neέ{2;BM?e)e%p]]_IG7)7 f͓D^ \?SJfd(nOvBf\bؽ01#Η/Gx /!DT4:C1 )Nx\܉t gPK>o}PKK>>OSGI-OPT/src/javax/management/AttributeChangeNotification.javaOo@S|b'8ndH5؊;Ibiyo~oYpH/5ةQ|/ D`F.2L*+DOSGI-OPT/src/javax/management/AttributeChangeNotificationFilter.javaQo0ǯ2etCV}4p!ތlU&4Jh@ds{ 0W^jcǰLqLta86 -984X@+ `7QrN&pp%2h49jf{Bk< XrU7Z38x0OSGI-OPT/src/javax/management/AttributeList.javaQo0ǟOq *h6Ne[4$Gpgvw9dy }|w U<[Zh'F9Bp&E6\kL}Rp"c4B!S`Az']p%CVg$ۂT ,@M.!QF+]V>#ZCŖQ8V@`^,KUľYObMoGh)*rJXL4L#YK-YZؒit2)7VOJ? 1 0j  ?7s f`2GLg0Ny8;N2M]];w! &eZTWܸk5:W2[m< ݳ5+&iBi^^IH# S+ۢLM ?Кmei|CD݁x#\ZX3?o}XzVsrUrCZXYx}^lݐ+%&I4Um%,08h2?m?jI;˭?TB嗫=1/='NvA qLCèd! 7h2Gyx)0>z_PK0pPnPKK>=OSGI-OPT/src/javax/management/AttributeNotFoundException.javaQo0ɯ8S; "Dj:=mjHlc;Mi6Mypd;pkmV6;i5CQ~HV UŇ9x82VA"GvOuNVUM~GH7񝬓Z2^`qk2 GݣG(;b鰕-PΌhS%q/X.Чo$0Dk$Y뒻zL=W-9Kzi0U%6ڊB4x@=Xjpza)y+7Fnc DVN9-rL~tJu,Qp]7:+r"-o cQB33Tɭ5!4zOVqG0d;µ:M+;?-+Js~8ĝP4OSGI-OPT/src/javax/management/AttributeValueExp.javaTr0=_ j\bz3$ԖTI0{V PL8 JB?@~%g"C蟏ǟG@/݆CA'Gr3sE !T,2;ԆKJ*!-X7* \@&+Ik]s::@`V֪A4ZžEP&q:D[Q1O59^l)Ri-YR+4RJrQȥmFGsc5_(!bcza QڃIFȑG,4dWI|ͣ$7#@Fidrn"IXʝ$0K5QԬ@( GPWܸ;W2:G9vDl6~*Sd$0]wqQiNzWГw p#̘ˏ]ߙ_+Y7dVO |)(5=3I=Y@OSGI-OPT/src/javax/management/BadAttributeValueExpException.java}o0Ɵ_)OIAַO46*H!mGg3ajI|wE ,[}2;LD\R0\,Y跱dTEneARNdXcf{2V S_0Sٕ8qj:K!-v&б #Z/~8gT$x5 .ܠ9ڽ/p#ߢP ak>6Y3S]w&kaO' O 4S"gZh DesԽNj\/ yRZgd޹emBagH ,^!Lx7xMV &&隣׏o ϡ6~Ɣ-"#kHVS!wTՉP2'&H2`ejH'ܰ\(^I1l!$Z0(c7zp/VGނGttJ;-|=FjLz 0%^PKLx!PKK>?OSGI-OPT/src/javax/management/BadBinaryOpValueExpException.java}As0x 2Ԧ 5MűiQ#TZbi9i7:v:'cl`k!9) ř8lLUnb-3uNUd- l7GT0k%:449xH'U9mM!3rӺ7C{a_ xlBagHfqdco򐬿wk<īU\' tytgG|K7cAcJ?-"#zm.HVS.2TيP6{2;&SK2`m*YK'y믾|(x?w$WgI%1jiqЋSψTaG 瞂w,_$ 3 'r$ (8 xPK~hwdPKK>>OSGI-OPT/src/javax/management/BadStringOperationException.java}Qo0ǯ8SRmM ) 6MHT0դ=&pnOFV{i1CZ UW9embḾʐɝ,HY*ѩ ܞX+U &ci2'ݡ'(Ybi5RM;>'衷N\WB7B޹k}8ԦFwrKOݫ4<2U!Z@T洧tRUsXs0mJiν #V I#'${d#!^trdk,6$YʫoGL9#>tl1|ȉ!ɶTȝ,x4Uu"T@FDh4k XzZ6 7l7oq xѐrAm9I`Q23X?EttJ;X,|=F'YgAPKPKK>:OSGI-OPT/src/javax/management/DefaultLoaderRepository.java_o0şOq оm}itVU}4;RT{&MZ=>w  1bg%ⲔBx|6~3^i KfOɵIYZVk2p[B\_]eod }/u[t8@i{H, tS r:Fmۧs$< PjR::W}iBQy:l]7$kag- '^ *ŊYK@לԍNb7ZZgv؄B/ΐd=|$yde~mX2e/0dS^]!N5I#}e|Ɣ~SDF aOH\ndTQP=ʼnPI2۔r'prFQxb/ÝPؑrA4rM ՗^TGdJQZ J[9!x#d֓x8iK?W2>^#طR4`_ڸ(,/pƷ|tv7Sb?1PKc"("PKK>-OSGI-OPT/src/javax/management/Descriptor.javaRn@=D";9QiQ#,'QTO tw1q{g(vJڙ޾yƒ zZsX&²$!3j:ߟ +4Bzy N2shd!EƟ3{Ԇ` IU؃TA6T"sd=sJ``Bͧ!LwdҶm :ǁŤfrqxǮ֝,!{5D^Kт ܳʹn5YVht29)mQh/yC&$d$JN!Z^ޭ!\x-X`:Z|0~/Q<rd|>M6o# GE# BPKjVs'SREVخt2hyw'$v9C^{urE9LSmmQc5~}Y f-wZ^OY\_,UD)J wBOBdho<4_ l[ w 1 5 a+vɰ<]m(vfm&^3OSGI-OPT/src/javax/management/DescriptorAccess.java}o0Ɵ_qSRemM "蘃ghsVȾ>3UWd{loiےPazX|? EP:(С=`C0#aЂ#FH9DH+0 XnIЉ(w䠦R ugF|Hq;/X.~)G|Iabq&mu]\#S]E⟞,O;0L%ŎY[1 \:P4U?WtAOQPK;1WPKK>0OSGI-OPT/src/javax/management/DescriptorKey.java}Qo0ǟǧ8)2Vd؞mBP3aZ~wg3`%ՠy0/>s3Q /-ۆ) hP:QG+1E Rs'MY ypoXUZ~38x<23@Ѫz.f'[.{ľuМ&WQEozj+44츦w0ETkzXbV:^sE#+3Φj싦fҟ mL, f1lLf}aQVd&'ZFy𨴫0ki!@ (,x *Mjy@-"P[nX Φ-̎[G}ጾ;-hQ+m._ˢsq,_h)Lok:WItKxLh'Jf]DX?-<9Q])4WV{,S$s<PK3p PKK>1OSGI-OPT/src/javax/management/DescriptorRead.javaeA0W<ԮJR{ mU*%]V{tIjHmc;M+g.h7<'p6g+۽ǴaS~HN UŻ9~eAP#{:f`r/+Rj& 'FTwFIp/0 ɸ5qg(;bȎ@Th9K w^\py)#{o>$0 ڶIwպ>[rǮՑs'ޝ! SUbǬ-Dkԃ^v?K[2/P%ri`mlxL"ͷٺĦrmɹ4,_AC'c)C[DI W$gx4%HVD0d҅ku XN\$88S|)~Irhl#W*+׶ QWߦYs5wPKѸNPKK>/OSGI-OPT/src/javax/management/DynamicMBean.javao0x)2DtCijq 6 $h,mӴ{ٓNB[ųaO7ɾz_9{=п̨<EڿR_,-+o@7{8PK76SPKK>6OSGI-OPT/src/javax/management/ImmutableDescriptor.javaTn@}._1 "jHZzZMLI̦]wwEQ!3̙3jp}5OQFg=!8B9niz3]1 =bp$g &%R 44ʹk`ؔ %)fSr]2&j>4R dPu Hɗ{q/Fc菂?GNW?2LH&wvn! 3d2GԚLr $jZRGNqc5$0v42[| k5#e R&鐢ZOI#~ֹ:@iRqk*ho'q')B_Ln~ a_LF s!pz;gٻB0`Ӥoy/~^ [Mo1̎p6ײf{$hO98`)0lnWLXiqkͳHwd/`S҅x7uƄj1t3 {iJUayܐClUk鶔ϹƁ-=0Z7PKψ PKK>AOSGI-OPT/src/javax/management/InstanceAlreadyExistsException.javaQo0ǯ8SRemk ) gu´V}|w%pkmV6;i5CQ~HV UŇ9qmaEɭH9ѫ,Qg<Y'e4&dv,G'Pڣwa+[*2Rҝw:K 7^\ëK!O{)Iaʼn8ֶIڳ%2/zuZr~rǛ#aJlh,ׁzKRVnz*?K&&isZf<OSGI-OPT/src/javax/management/InstanceNotFoundException.javaQo0ǯ8SRemk ) gu´Vդ}|w%pkmV6;i5CQ~HV UŇ9qmaEɝH9ѫ,Qg<;Y'e4&dv,G'Pڣwa+[*2Rҝw:K 7^\ëK!O{)Iaʼn8ֶIڳ%w2/zuZr~rǛ#aJlh,ׁzKRVnz*?K&&isZf<9OSGI-OPT/src/javax/management/IntrospectionException.javaQo0ǯ8SRemk ) gu´V4@=$.pf1f(ʯiJ*r0?ⰍUP:ȑSC0)G5zUR#*'s Vd<̮QJ{C:leKCEC*T3# gt $x= .0ھB7dXcm=k]r]/rǪ;Ւs'! SUbì-Dcϼԃ^f~M-rWa_ 860IKd2+>[+ָOW4_g E~"gđq:&`L<"JW[}Fr*^4F*l']Vǀuie'7sFIqοO)~Ijf['?<ڽ 9w+~ލv'Oz!K.ҧ(zPK,j>JPKK>>OSGI-OPT/src/javax/management/InvalidApplicationException.java}Qo0ǟǧ+OIAַO6 ꣁ q6MHTLjx0Ύ.\Zw'#ü\ ˿KM#* <~^~i!K@U%)KzUN"K"cV W-<{zK̐;XR Jv ~78&Yzl,7~&-s_kJ-"'zg%Q)wT݋P#Jղ`1ln\.P(B%宂/(:FV_Ett*;"Boƞ?άx j'<#xPKPKK>AOSGI-OPT/src/javax/management/InvalidAttributeValueException.javaQo0ɯ8S; S"5ݦ=mjHlc;Mi6Mypd;pkmV6;i5CQ~HV UŇ9x82VA"GvOuVVUM~GH7qOIp/0 ɸ5]щ#tʖ@TtgFAݩH8z,|lRGӷ|Jabq"mumv{Oݩ_afmm!KuR5s8lj鼕޿ #R IZ"+'Y9&[qCZ:[(V.l9Ͼ =o cQB33Tɭ5!4zOVqG0d;µ:M+;?-+Js~8ĝP.OSGI-OPT/src/javax/management/JMException.javamAs0WθDMa8(Jؓ Ӊ3-i>}oEt Kݞb,,׵ Lws,X{Ś,!;x;YTS%=!nE22VjpLdv-NC#NPڡb'k jBvD.:r -vB7B޹C}8ԦFwr櫷L=vݫߝ4x{h[fEm *C\sSF:9޹^6m^ /#G؄$Α|${d%!^trdk,6$YʫOG|K9Gб5>cJ?-"'zg$R!whDEDh4k XzZ6 7l7)6B!n$QԂ~_ 7::RZBOԞ7cEt'<㿥G9,FsPKPKK>5OSGI-OPT/src/javax/management/JMRuntimeException.java}Qo0ɯ8S; JIǴG7M li5sypd; pnOFV{i1:,׵ Lws~ed^i%s2dor' RJt$'ĭ(7񃌕Z:\`qk2'ݡ'(Ybi5RM;sFOCo`gB7B޹C}8ԦFwr櫷L=Vݫߝ42U!Z@TxiO餪zza۔:#{_Fnc 8GO1Γ|M͗q&YXgXdS}B>[ACS8ϷNlKɂ[SU'*BdwL#Vˀe#pE_(8_8cœ nI~uɆVTirY? ssacsPK*f4PKK>&OSGI-OPT/src/javax/management/JMX.java͕Ms6կIZ22HH9IQK)0wAӵ"_K&:Hx bwtڃSzy`a@^sLwC?O<f. 5 5駛-jÕs .MO.N5PHe1H@ns-p mCOHPK(тF~ 0AkFf㱖SX3qDݭKƀo הr&-U ( HsV9rFv4:7Vec0홑R ۘBOtD?zh:lͶ^$ *W7Krr~\2iJy)D$WğG֏b Gj@7Sxv78/^;JJJݽkw\^Jspp{pb5x ݯlO;G̢+7S(Qf#T߭nr뺄(kڿmԲV:u*jPKPSPKK><OSGI-OPT/src/javax/management/ListenerNotFoundException.javaQo0ǯ8SR1U}tx&$w0U5i<{|w\aaZΐ_$B|!?"WZɒ9P7Yɒ I'JX9^0Kٍ88Ai{Hlt,s nmn3x<zx{)p#;}a"q&梵*],bS!kaW/ O=AtLU-6b6!9#TuwnM%3rۻWa_ 860I "-Bon<$ume|Eݦ4xu${ķ4 Acg)}[DA a/HRdɣ52'BG_e4N֛|888c ŋ ~Il8Rd24{-ȅʾ1r&4+~ ލ4gw|Q7PK 9SPKK>5OSGI-OPT/src/javax/management/MBeanAttributeInfo.javaTQo0~^~ʼn'ReۤO)[$BWI.3!EU!UA0i!σN`B?a| ginfi`  P̡9j bu;|Gmpn_8a qpaeKԲ5.:SJ-#8bv`4MZš@lfpƓdTwYR1g5uU*c)ii*rY`TaXZmLB/J Nzp%q8xez;h6&xt* EMk< 2vLܜ"$; d*x3jM5+JB-#P/qjH`h_rlח+4<#z`+.`^xU F]"\eHḚ^# ]k:H(9=yoZU -S+Z>=|@ fDv>ABp|cLj+4Uz/f{W;43h*l9}dẖZsc4n_?rEc^y頉$A#͘ls(@FgPv nb+0x8CC=?{/PK`iƊPKK>7OSGI-OPT/src/javax/management/MBeanConstructorInfo.javaՓn@S85$= "LEU26ڻ{g+@֪v{\P[-.a`#t5̜ 5.Crp&4J.Q]!D%F%*C :mVUP-He2H@*rp,- \eV j.[J:B`n~+kw^]!kC^Ӛm<Okneƀb $*ĚiU `Tjk,Z,*{4$tQ'3ysxfh2 Lg0NFƓQH#:)0n !jdJ"ZY2LQKJԅ0n&6W'}B=ϣ9sFOl6a$ vՂ& 1OSGI-OPT/src/javax/management/MBeanException.javaRr0+W^bc1F%Bex|F! dHo)XˌInQ#2IY+c `З-*-ZC! ֲ$.B*du:i7>s^^YpO@ۛ>>kau] Zayš>Βt]GU1'^!v{-EZCfkJU0vBɥZZ{Y2 er-3M(E%x"4+iZ ̝L)+i=^5 =s~P|Hى״+NY)- 5;.8r|}8^w%{X!8BGxq&΂ &ɶZAe9;xoPKpPKK>3OSGI-OPT/src/javax/management/MBeanFeatureInfo.javaAs0Wt9I 3tzG`KBN;+ mHzzYg0S`Ds0G>J y~76Š,=;xkT@# 2vƜ?I_X$\Dz?R9h, u .zqr WۧB@Cw9~Q&馁n6$2KByECܪj$TX0͍NamܗYPQEs3UĚsxߣ6}>xj~x1ĥ$7] 1T]ۤ'.ӝ PK1q0PKK>,OSGI-OPT/src/javax/management/MBeanInfo.javaSMo@=׿b "jH!V[¤QTljﺻkw8IBQz-ξyޛepeV8OSGI-OPT/src/javax/management/MBeanNotificationInfo.javaRN@<_1)Fr2ZԑP6΋uw q 4Q`k͛73σGzkdt!'P2GikL]!%."Gs6˔>;IB.dTوP5ŎPYIjYTr%p՞/?hOOt/!^ Ň)w͌DQ ʴ[T-4wv9nW$\cEzwmixTiEwݸ=9/B`-0¿}|$aGB5UW/FN&<GNyƳ{*1~ n97\t[=PKXHC$PKK>5OSGI-OPT/src/javax/management/MBeanOperationInfo.java͔Qo0ǯTYt{RnQd"tU5MInl]lP؞>qG8Vsā(~/ D.dz0J Ԩz`MxBc HQ#K]q3*ͥ7tۥ3+YCV Z#yp />Ȳjі̛}ZKFrFm!0B71~\z!ZW<_u[u- g+`Q%lF[Trf^*n]23Kڤ\gy/Fj}[@1]? ©kMnz 7dAIW'Ԛk#rJPGP*Ǫ 06/ant(-ؽW2AuzFIBR0xLDGcLAJ^ 3Fi[kb{B l+-sBe&)dp@r^эdi$G_05pa>1J4㗯V;oq6p&. /<9C(^g,c>Y f.&ʼfwB.a!t]ESC%+l9U;SɤMWA{>.h(;PKS2YAPKK>5OSGI-OPT/src/javax/management/MBeanParameterInfo.javaAs0x g\CSC:40QjK$0;Io$ &YlyYY")K)TNǧck̽bN̖V1;xBVd69/~R+c `? so *%kY1A*亪{VMקw$= .~-p=t8WڶEGkSʽ֎n4z}խ*ZHÉ;rdR0oN{H'Uk!olܛa<60H2If7K_f %y2]WfsLftΦ|F2tzxd܇k0o#ٚr9GSE# Bd'BM֯2۔N o4 Oo 1CEʝuI"/~ #*rdRHAeiIPѺ8Ԋ==^]/snG8v}z,`.j2Ļ$Y;m)`xŇg|񟄗9 ]u5\rOU[5APKU?,:PKK>2OSGI-OPT/src/javax/management/MBeanPermission.javaAs0Wd2;͉8i44k$* cO&+L2v)Iṽ3zE0>,/Lrl:=m) ,ѠbR AjӟJ, Fȿp{@ ekQ"cmAHપ{VMWOq$g232ԴZl=kOI۶!CIyКMؘQB2J4p!nr%:*^ŋV!J[\42ZSqnR7ku@25rZE BmQKjԕ0Z .v[G}Bϣ9tAlva$-*«& d}-Aen:[h74}84OSGI-OPT/src/javax/management/MBeanRegistration.java}Ms0Wdg(vrksm0N39 XRTI{2]a2rw]7y0-fd_9MÙ(wŭ4 \R4A2 g KD!TϘ'jå`S'Ye-;: TACPVh=Hye$gAѪ#U6R5hGw=;LUrbmXR5RJGkn}0=lJnygH_ hlL$ & (S%/AIcר)]s<} R6d{gK Bղ7p޵IYn!s"Ix_PK^M PKK>=OSGI-OPT/src/javax/management/MBeanRegistrationException.javaAs0x 2!B[OSI39 {1jJ2we iS=Ҿhdu#,qUIrj2 wo#J,=۔~[DFF,ٚr9GSe#JBd'BMf'V N:ậWA 9ob/N(^HiP7k$J/$TJDGw?H!zuwC".zn 3 I3j*Y-S0 r|~z PKu9PKK>.OSGI-OPT/src/javax/management/MBeanServer.javaXr6}bOGl/;(rJSI&Dh$.߻ rmsⲋe .%W3fr&!pad (ʠMyHd^,ȜрL:y0&^L&5 IVVv!٨"DA+b<5d XiQO7\Urh&Lusm&'#Q_5 ٘ {oV/7NDž^Zn۹wz]zftU@4RV4" e IG!b rJ#PiзnB>↙/^*Οl̦0BanJQ< %I4j(ͿA&\;,pkj+F-)z6<]z5]i,UyMovaUu=&?z-MjH-kV,}mdRr#3JRrzS<ŹXm5Bf0Izy֥BS0f5C:SS/me@[پeqk(P/뻾3YEҘȗgd]6^ԮQ>iO5Utz^|IqP9 1G6Vz/<^`&v {TM˥$yqDvWrVi4MVXFRs#r%$d!CӖ#jD7ZQv]bY8l|Yʅ}8jטQ6yU!OoN>m'Ɔ3$ A(9X4STl/Pu(=>̿ i p=_ڋثmoq|Q-Mri2=4y)27{3\MK‘o8Ys[/39n6/IrZo,";bB/caS#zN_'tl1sSTPKB(fPKK>5OSGI-OPT/src/javax/management/MBeanServerBuilder.javaOo@xd"&ZNO[)H4q1֬5E|̂ASE}{n<`TV-󍅟u1KJE!~׻ O-cs2w Ɍj" !ĕv$md{Ӷ:݁85UZԆCeA}FTmբ5nN.G7T\/>=kQ4M(Na8kMt&t] cO-5'^ *ĒY Ѡ&Q7ZZ\Fhr6+i^ 텑_ xlBHq3yHf 8OSGI-OPT/src/javax/management/MBeanServerConnection.javaWsF.Ŏpu&3 ƭLL&ӇCZɗHw݉$1j0@oWfǷ) _8I™W-N{VR51YFxBcQEp3Ou҂4:4IutrznMd)rdkx3\@ Ӭ6SYHSeC #qF ]E t5&ݞL&+;R+Һ j \QģPlDX6 Hz"n0LȵQ|%)Dp'=e|\Gw8t^χw tu n/ZDil[:,!%$a#Ph"Y1*AA*ڦUКIx 3ŭvA<1:)t0,DA1JwȄokMuXgㇱ!0Kc2 ;RaYkŵΎ}E'씒rhoxJ (9)7Mk{B zYB}\`Q;,>=2Tp֛zBnݭ:*<()4mGL#!P,^=i5 ǒk?GO`OG5K{b.`Is2U Ug\ 崠5PK:%;\PKK>6OSGI-OPT/src/javax/management/MBeanServerDelegate.javaUMo@=_15$'JI̦AQ{gI!DA(y{Ѐ8RdnaspӔ3!zK۱a[1jT b$CC!bT`n"t RӃ4WvR,e[ 5xwHfy-f^թY903Ji5377&?v˲tXؑ*+S/Ϥκ)j \XN"6%)+A*`BzgU]*nH:̔L6O մF 1M7?l‰aǒ\o \L|/NGVg7@j\Y$vvB- 3sGdM$K@%2j[g0Sv|BFݲs2&h0F^L^ 35fR\aN uv4S#t7>g\掦eo蝻W^xuv(ҴQjSd= i8i4zK*FۗʋBS(c}?XrTkI6ŏ%fg}1?~Zҧ׊ nO(6^6J5R$]5^XѴe_6Pв<4PKPKK>;OSGI-OPT/src/javax/management/MBeanServerDelegateMBean.javaQo0_qT,a}ۢuA´U/MؙдMjy}|cGW\\7G#˝q6$!**#_fO+-ɒS7)K9*'nG7߰22Vj ^0Foq-xCZ(dE@RAf@ .ur s!ιCu]bOjSFIkdL-SUEւ4x{l*-V؁6!^sSwF:)X] y\Zgua bm,1&~zd)`*]$d#|I+s1t . }B eGSe%Ad'L-Vˀd-~\(֨xPr7AnI.͑)-UT~ ~oSb\‰z!Ś^!} kjqUQ'*142AoPKNPKK>5OSGI-OPT/src/javax/management/MBeanServerFactory.javaTn0 =_Auf,K8]##36E$9NPG.E7tDQdrM\{R$jA? qyt0'GvKEd"iGԺ ~MV( ;Y'xLI؛6m<ԎC:XIE@;AAMQk_y:; V#Wi[Ʊe|]2-."үZZx%sU؀%yX7Vz!8 Z 0tevϑK?t`PC/!{pY> WrW|Ny9gӳlͦ|tz _%
  • O.^)$`8H>9UV2! Y"t_hVn?OSGI-OPT/src/javax/management/MBeanServerInvocationHandler.javaŔQo0_qTYiRJ5Z IUp;wR5vä}|wmX~:i_4@oUjF¹G䂧(4ΡsT`~RiW\Js)A zRopl-6%ۀ*5d@u. ˲EY4uZK׭L #9 %i˜pX׵bO|Xlzx5Q.EZŸWqVUb-X RҚVpefj̹6' 큑Z (6&GD=8 rUO/cg3?3O !>^ :OSGI-OPT/src/javax/management/MBeanServerNotification.javaSn@=nzJ㤴 H4ͩZo tw1{g1캭y[8p3l/ƒ$Vg@pO'w> 1!Ejˀ,5/Ph\B+†7t|Js)4k5b+[4j$a+|,1ni7~b!shjfomLa<.`@r\z|q6K[Q֠g9ηRUV gU)n(}re:,69E#YPlL( FpfQ[h)]]a$)̒"ZDIL%=| "=(dr!C<;IxADٲTA^&KKSf#_vq(mcP3AEL)I(*FoΑ̾g*jyɀAGy3`hk%(^ίl6q.Y_G}9t!H7>6~%w+Ѣ So?`a1}!Nvh='-ݪ{Vk^7gm*J4k[QhZ%z"qPKxYPKK>8OSGI-OPT/src/javax/management/MBeanServerPermission.javaAs0Wd(8>amcfraՂ0d߻iǙݷ{"py,w2(W*'&~n+Wi"CzOE NF TAvG[g8 U8?uC-PEg5VVzȩ ySZ/8gPq$4\.ggm>ő8ltUZ$E-2u*2~vRe\l= Qj38^K+U4[ MNj~3M( I6,Β,p"wvxuȰ\aLuLyqzIz82CvS8O¶9!r9[Se'JBI+vt-VÀd-ǭܠ8N؋5);nI"~P?ߒ*̱94w! #G͠VBO|cW>TWUrOFy_PK̀TPKK>7OSGI-OPT/src/javax/management/MBeanTrustPermission.javaAo@W>;kQ}(a˨:&/l񖩇[U1o-SbìhRl{-Telm/49B妳B8603$8K%O5*N"r2N2=>'ux=9`L)OSGI-OPT/src/javax/management/MXBean.java}Qo0ǟǧ8)2EJ. lfTLjxwe;(^ lLwKk!J 1jTG,\r&F?ؑ܆ Z4(ʹ[2A7a4r72lW1 ?_t/iZcwϔ dOIPТv5'ZU2woɤh9_@%jFur7PKT0 PKK>?OSGI-OPT/src/javax/management/MalformedObjectNameException.javaQo0ǯ8SRemK )h&${0Ui<>>ǎ.\`aZΐ_%⦑Bba?BWZɒS7%)KzUNwIJp.0ɸ5]yъ#v-ʆ@:Pv:' 'X.@dzK!OιS qM5gn*Wz&w[v]^&YXfuIg_sGucJB3[YrkEMБij6l/_( 7z{q[xҒrWA$F00DKUV`\PKK>=OSGI-OPT/src/javax/management/NotCompliantMBeanException.javaQo0ǯ8SR1نցU}tx&${0U5i/OSGI-OPT/src/javax/management/Notification.javaTn0}_q'2u{ن)h۳MHTwMh.YI`s=`<8 6K ~4a\ ?M! Р^a 9"G v0V,G҇ !zIld ۀj ,x . 5.:sL-#8#bvki04Mq(u1(X3.&q2yM;ֵ(:N7XJ^Kր fshn(`6Lɹ}ڣGj}@1qQ҃$JN&^f|PKK>:OSGI-OPT/src/javax/management/NotificationBroadcaster.javaSn@=dGZc.HiU=,0Ma.V,&Vv͛ނ-,dsTgLdz~x ԰AjG d3shE !hXFCDž4)-`4F8jv! k(x \@&fq ,V <25:@`fv4|:=J:a(Y~ ԣPkPG` XJZ+ցTJ3Ҫ7\.hY)49F5i$  A&%y _-<Mmeqn8 у H<4: yEH/$$I7gdM-+JG%4jj[0ӗ|EPο, ۳W3A9MRAU0H'+is<5=/왚W2.+^l^`fl^ߛ+osd'J4cKЛQXSgB+k[o0]Ie]8PK߯zPKK>AOSGI-OPT/src/javax/management/NotificationBroadcasterSupport.javaTQo0~^~ʼn'}[tցDjڃq.3!}ni&<$ww(#t+z0KLr%'q6L=-&<ɵ,&P %BXpAX!t=uzgbKvPZ$ia!3\ ,HBE#nYiXk8qs (hhFt,+N3mAut1ǣQZ ҐxA֌W 9UWF:>Xp7ii=+ړFPٸNCwF> 0ɔ[񙄅J )BWh9M.VKO\:_> <=_5˹EʝE9J8 kdFDpeQhju!b 0x4&a_J'3&1>htT7Cw~:GđZhƘ}_z[iO6]Ps^m[$&{oԲ~җ{[wAW̲hGh2kK ۑZߣ5ze`ziG?JbQ%PK TnePKK>6OSGI-OPT/src/javax/management/NotificationEmitter.java}A0WrJV9٤E@ ٮh@&$;&Dj7τwJg-)A}յ`#L2 6 #d+8Jt@ g<'j#E0LƣlgA 1RxZjZ/a3Rx* ZZB`v4=<kۯa}ǁUX_&ƫu?Ih h Mg`-,'5Ai`F:ʹBV>UڞitBE7]=ID,|yӧ=5OSGI-OPT/src/javax/management/NotificationFilter.javaen@)F>76'8-j%pbV}b*9-Ϳ7F鳡`Y`W|"H~c}-#+xGPZa5pD?s&h,) `1;/qV R9,YhCSITga3xx5T n5ׅ ==81qLwZ?mVl2$; fJډSz4H!XոQ25Yg+2lH H|Ls{sIOrt2 ^K݇l6~$o@|Ш XQC&A:h4=Yk/QON追8^8S Az(I6͡i_s> >P&~SwD**АMTlz¬wPK$PKK><OSGI-OPT/src/javax/management/NotificationFilterSupport.javaQo0ǯ2etCV}tB۳MhT.]IdK|̕^o!7OSGI-OPT/src/javax/management/NotificationListener.javaeAs0Wdg(89Qmz`8(`D%t߻´`]7QYS},Vf_!! z}? {i`e NdGJ%D u\;jCJ]kX̥IU8TzA*jT`g$fq38x5Tn >nag9Z} q1Jas5.llSAc@Ϟ4; :*DάAiFYGMdQF'S޾ #[n؄EA-SřDO~%xAM<ć8MxɃȑ$94|͉n$DPN[|[jyE%k#* Bs mOyPKX3PKK>1OSGI-OPT/src/javax/management/ObjectInstance.java}As0Wdg(8>Qm0cfrJD%ad߻ti8Hz' .`´A} ,W4 6 =98^4XB+K`wQ '>Bmpah2[8jfBk<-X`cK(T hH~Pe$gTjZ]'BqҚ&^l[)&*XNu4J#Y;-Fmm4:yQhiIDDY.|Oo7pQWkXuӄV_!JG\F 8OaNHoyAɪeB%M wKg#x-\Qyog1E.)I(#4l/3}aUL>gP>.jGd(ap[ 䞰W~g8{GN/L4ڥLXm ePK|Jv&PKK>-OSGI-OPT/src/javax/management/ObjectName.javaVMSA=_ SdAo U$n`X8, Ygf(aETP;5_惡BxpT.x@ 'i3d_B;i1 ܎ף:۸YK¶-:mof"wp}m 62w(Z{U#{`^֛3\N(QzPK،! PKK>6OSGI-OPT/src/javax/management/OperationsException.java}Qo0ɯ8S; HMǴG7M li5: bypd\;pnOFV{i1CZ UŻ9x|? 2^i&K@e)K%:UVwAJp.0ɸ5]yIwh J;t!-v&бA*iGktᜑ~d,\l\F÷wE}߇bpjSEYkdJ[v=Vݪߝ4x{hU!= uo!)uFn;iopЃ01PKK9PKK>2OSGI-OPT/src/javax/management/PersistentMBean.javaAs0Wdg(>icdrajAR L2>ا>) ڜbiPz>?"6^`ˈɽ,P9,S%Z=BbD#Z'hS/l-NV@i!{HlX! ݚ.G#r B4BϞ|#1Gqsֺ>]|]ANZxwa;fmDڂ-r$M)YMhyM($9n(OSGI-OPT/src/javax/management/Query.javaWMo1=_1 " F=ЄhX(z.kol/E/[@n8߼yи~XC8QLhlVqh F RswH}4'8#!r~*\6\IhPv|r(f*@* AF\ ].!TqKr;,N *&$=36y_Oהb5wפ:u)oS)`,!U! H`SPXƬr[.*5S ]2FJ1lcZ>x|l_u$sr׭~xmz}8uOR7V2wvL윯"KFj.$)5,B AsՐ<٬k-/^*?6awIj(q)IrBHEzWyK&8|p]xs4}Agm47hlt[4t׽`v2&!/g9X=<3j~-G'L7fѦZL8>/u-+&RܠgNpz2Y5w0L?q{/SD6sl2|_!3gːOLvurBWT+-08} ,y{Oʼh]z]E0QEnp\/\@;履ه]_T-ID.[c'OyRDq!WFB1L\z&v/FWT4#%L_B(%^O=JPKj5PKK>,OSGI-OPT/src/javax/management/QueryEval.java}Ao@x546'j *&r`5D5nTlΛ7ztS*|yE!)KE:g/C XÂ=cq&*gxZoIE|?:e4.1ARU8;:@ڱx(*s4r:Fmۧs $x<ʓI *6Bg}i4j&86Gݦ,N,WP%T9Ƃ ˒&P7Vy!,rުUϖQF?HdH,͆>]~-q,lN3g72$dofI~l@0UX1!lUe4]T0 ge"Tlwʅku6)O=z3Wh4"`HKc^&A+r$!Q=LTԵű2qVQ?G:ךxkM5_mQ? [˾.+ZÝk';n( PK PKK>+OSGI-OPT/src/javax/management/QueryExp.javaSr0=_S'99mⴝe{l%!q ÿrLK{oū^ҽ`Z >DuMBvmz-Z4G,Cf$7TXB+K4XR.%L=`2&U A*E {Tv@ QZG0Yx9Tм?p98-]ׅbP*S-3.nMm^ԭZ0%ÎfUYk-:PDekNy՝!GU{ $ {ol)c&Qq6uܓǻ6Jv&t Wir4{'s@Ie6OSGI-OPT/src/javax/management/ReflectionException.javaRr0#9ks2tH^H($R& 5Uv$͖bGhIҸk5,0w4xʗz[ jxS3֜$JȊ2G5?zhgI4ޠ;hgV8࿠>ΕoBdWBzPlTWU3=PK,PKK>8OSGI-OPT/src/javax/management/RuntimeErrorException.javaRMs0=_&c7ɤ %S:=*ؒ8N;+Dž~pyv۷O/\`룑a>I$e) ë2FOcKdȜ !#$WB|'cVz/ FOq *q%[YS r]սV]7gJps Ps} p9Wm#))M:ͳ[Vwݪ_4Q\Yk)ZhQ^ukaֵH\7iyM( i6$KГܥϋ2Y:]9G5_ С6~)[DFLV%ٚr9FB(5JZn8OSGI-OPT/src/javax/management/RuntimeMBeanException.javaAs0x 2!B[I39 {1jmٕd g4^<+J ^bc1FX%²Bedrm#qJ -Vf hUNvC?񝴑U0 `4u}ݢ{ڢ5 i%v5R!I9) {F/7}66qtԺ'Fy߳>^d 4jW{]eb^Kѡ&>sii*|zm;ari־oKM( Q:uF ~0IxS,M1GƏ7>Guhh۔n[DJº>Y2 er-3nM(E%#4+iܵ6;L)+i=n{[ *8H٩״+$RUVVtwMB͏oYRy|']O+k+xz2? @ Ky=tɚlT[S=PK PKK>=OSGI-OPT/src/javax/management/RuntimeOperationsException.javaAs0x 2ԐZN.ؤYZ[r%dY;$eS}g߾]it S],6|yI"*K)TNߌCnm^i%U9)K+4jEnCj;;+M8F zQo0nP=vh,1CZeI]NTuUwZ6:;cK'X.8hR:o\~4j6Gǡ6Ũx4J,;OSGI-OPT/src/javax/management/ServiceNotFoundException.javaQo0ǯ8SRemk ) gu´V4@k'.pf1f(/iJ*r0?tX#:f`r'+Rj& #FTwNIp/0 ɸ5]щ#tʖ@TtgFAݩH8z,\`x})#yo>%0 86I{ֺ.^=SU%`W/-'! SUbì-Dcԃ^f~M-rWC_ xlBa >eV΃CZܯViΖ%&[gEΫ[#e#>t06$`Ly>ED Ur++^4F*NC.c:ش^ӯ7B$x?)~ÓD ,q]f+DOvoめνw3<ׅ~qC\p9~PKtәPPKK>7OSGI-OPT/src/javax/management/StandardEmitterMBean.javaՕQo0ǯLYiD)ݢuA"tU5$7]3! tE꺇}}w}݂0Fta90 ?rfg"B{iJ SԨV{`ExBc QY sOWTK}[ЮJldK! IkHxs\@$yVr*nk 97mi4 ,weYz"JٮVw8ou-2," "6'֌ T!iK  Z&d L̵Q|^zbc ]+r>Mgp3N0h\3-| ">Εu@ƹ;E $rsx#&҂\rTKjLƗ0SM=eu[-c+L` Zy1$!4ǤhP}9G Eջ2묚?PHc U6l[r% F6C;VƳx#Kw VL؂.(5De.$, 42)خ;aY#?`k?IW)|E z'g}2'z U5}o!ElJ)4ACrpI_vQ0OSGI-OPT/src/javax/management/StandardMBean.javaWQs8~>~N]:!$47ӹ0kG\I07`$-0v[it4 dRp0`4&hHOw~w HQ|L̀hr+纊#(rMI'R!DrJPFsm˪| 3U%/h_-`90Ga.I:%%! a25){Y_f%؜ΰ]]vYE5K[Ӵkg`Y LZ= }iĭۯ. |#a*elSdU e9&WO YHUQa! {'B_3O 9m aBoӲ#Oh._HzIڲ u;Ø⮚ M4/KyrO[\ |.Y }`k0i}Ks@=Ĩ40RYJFܾ5A~m:.ԁ⮴5QJi8uGh3-paF#Bݕ􃣼|tS[c{ AVef@{]s r6IOyߟwve.b!֌ b}s+ .ꇊHM'])U8vRXIi_ OZ2[m YQƷU]w*#l!ty0?n,_a|+c(jNhPKTQTPKK>1OSGI-OPT/src/javax/management/StringValueExp.javaTr0=θͭ 'n4$X)H$={WqtFڷO09 .Qn QU 9|:0~~iaA̖<ɵIZ*pHcΟ2[2V( 0Kхثj܃TK!,EE@!!Wmsz{rpͫK Ew9i2i6NqL9X;/I6ϪY`g# ;^5qZ+lAל[#Z yBXgĪqG=kd/JDfQgcOr/7K(Y \UӄW!J[\82>vx,S8SHZ$YMXɲT[2&S jY`i*Q :=wa5IwfIB^! ؿ,ojhӝfOߠ]q=#<[UOz[4ӿZ>?<]5tncTL:.=8~?> ?Jy^h+QD;}< HMU]Q6G:i]o4m(>#_ %x _PKIwEPKK>+OSGI-OPT/src/javax/management/ValueExp.javaSr0=-fLkXc QI;{Wd)i>V&p(C~@.fSaVdH)܈#kWpG%Ÿ}i8;j#He1VtȨ $d{i)Cm,25ggm1ڶS+] kjwﺕ%~4BfUnXk-( XhUNuQ[ۢ&G c4Mhkdža Q:EFԑG/*2dWI|$'S ϡC)\)BJFV$2[EA%;t%a)E%,n̗;(<#z= %/*v͆,-lhyY%OI ,SOo'sՓ#e6Ɗ`z6fZL<(IݕdӿB>&SfEiv =Ӎ{{`2˜x\{a.뗊7+!mA(S3^O!ͽ_PKN 6?8PKIG@&OSGI-OPT/src/javax/management/loading/PKPKK>@OSGI-OPT/src/javax/management/loading/ClassLoaderRepository.javan@)F>'Q+8-8r\ÀblU}b&iS4;|y0-f8DMÙ(W~3 1d@ˀȚ( Љ5=BXA1jå`SW0SId-;: TAcPVh=ϨHqԐ;˨EQgoz}l \ku\%5QEƀƯ4LUvڰVkrQ`de{ɔXw}fOFiL|7QƛQE&^fLx Ew%)Nn}@Qi7argy#>C(,x Mjy@-h"P[nZ N-GG>qBف Z6h$+IwnGyuhˆ4 4J}o+8`(~L%sLgDeoD;IȫwWA/JΌC#_:eg+wPKm_tS &PKK>BOSGI-OPT/src/javax/management/loading/DefaultLoaderRepository.javaOo@xڤ6@Z0ibf[qPY_[R}ߛq1f>YD\UR0|7MGWZȒ9P79)KUZ|+|%cVxN1A_νQ7؋#vh,ʊ@w9R!Gku}zOCo` 5υs(j6qMU'"ou*~4pf\l-( qiO*'zZa:#7{1_&q$c%ě$5n*N"r2'dqz/I:xd܇j0<"2[}B5r+sFR(N^Z oSɽtu~EAs BbOʅx4~«C Alx+M؅̊jmMb8=(>AuO'qf:FTKͳXtqQPMU _ Ny: vlAPKCo-*PKK>/OSGI-OPT/src/javax/management/loading/MLet.javaVQo6~!OvNԦ8N+̱)YQ {V"5;R"MN6(}w#/{&) ,Yƙ'ѱzZK !jTL|B 3И@)T`wTK':Z,!g;@0&˼mY85ej 49Z5 [Sۭc_tUz8 &y4X^"CA_%Wr V1[׌mA*`B3Ҳ*nH=reLI6/KmϑRolL8 :qD\}X\_qW4E< sZ]x ~  IFqP6ɭU!BlQXɊ.0+Sj"-Y *AA*ږUd< 4H/3۰?g9 g%{+%) qƈ 6(||ƿg=#Rq \`jKu]!!ViGMMɷ$=^tIRMr9Qfg+`ޭ"H Tpp wЎ܎FJN,wHgǃmwZkފҠFXK,ƇY+1uO3|.ͅ>uWoa_]*i0Z˂.aRm6,O)1uG729)4NF)_*vpgy{X~&w1Byu}f6-w` j%o ~(3L]9Gt`-}I0:䥰VmR*h![< [jOFUO >EiMe ?V>Ƌ<PKmer PKK>6OSGI-OPT/src/javax/management/loading/MLetContent.javaTr0<_t!M3IZt0I&LJ0JJ28t`Fjwa60ƈb頛`~I)Pe 6L=”,5!+xHYʡR9pKČړ>\B+8 N{y`PAe5tQ@(l-{Z[ =wpdBɫ6еҹ`PuPb v0GIz] %Z07%p^%֠ `aϜk#PE^ y\XgļrOJ{ѷ\*D)i4N^*}\*Nd0hijx I+{4>·)BJB?X%eb!2 B(N%~ ^Fp蚭E z\mBŋ)J9e5F!FFZ9F]=zP /cXrBX~jV>@r<=`6_n={kxoGȵz5C2 T%?UޢzH*籲v/Ή*?x}Cs?s%zM5~aGf)wp%j@)R|2oWE?PK@_PKK>4OSGI-OPT/src/javax/management/loading/MLetMBean.javaQO0ǟOqSm-ZI iNrM;/ մs"@~)\[#50A|*CNGۆ@f Nd.3TshTh"W2h ) ]?V7P-(MXd ia%Kϰ& 2]=Z+iU :%j^AP=kh2iM1)wv2gQ2{}ֵ*Z0[5Se"eR vԭ$U1W N&LzԴFm Aa2  %E-Y"\qīK[Fc@n8)];w #!3[SE# Bo(v5JZws'SJn/WhyoNNlĽ_ ŋ 9{urGyf%HWg]h|4|'.f3qQ[Bc,KxnUbOJHsa< ilH\NG΋4&^WW}P}ЍgR3~b`w{TSfdt_C;%__:=cK>3/_PKqMmrPKK>=OSGI-OPT/src/javax/management/loading/PrivateClassLoader.javaeAo0 DNIYo[Onmg=26p%MCZ>>&7RaZ`S|eHۖQd41l#U85UЫ,AjXOx .XuAi#`5t*x`̈6?\] <zQ(B@?B_s 8ֶIګ%lʋo=Kz hĽ8%y˞U3k?`SFi@bC}Zd<5PKK>6OSGI-OPT/src/javax/management/loading/PrivateMLet.javan@)F9%pLRTvBU!k{,ػfw': Dfo |I`ӐX5#,ds hE !jXNgTK` c+hrmgB V#1=cc e8k7~X'23C!0L1ͻ0.`@2.Zr._k׵j \XCr׊u R!Ռ; ZMZLQ. [B d+=6 \5F!8[V6!BzVL p\PKx)PKIG@)OSGI-OPT/src/javax/management/modelmbean/PKPKK>?OSGI-OPT/src/javax/management/modelmbean/DescriptorSupport.javaTMS0=7b'Id Btz#*K$d{W)|4$}Zʗs _d9 {@ߟ{ i`QL js?g14ܠ6\I8q &;* cKBa0cnKU7JnU1CEQ:ND`!]},=V1N5t8 uSu-\h ,'V1`%( ,H1RsefdL<*+Ӟ9Ih!aN0{6~_O֟L40xtLN[0:erM쬧!+ 3US29|c&ӂZr7n&F[fGk\~E>r@lI:d(E!ǭT#ghbstXҶ^ulxl}h :]x'ؑӃ.iЪtNOSGI-OPT/src/javax/management/modelmbean/InvalidTargetObjectTypeException.javaQo0ǯ8)}lC@ tUw`{ SSmҦwg.`шf`_$m+2zXD~6>-=;8!bqL\ߦuVߓtNh- CWG`8ȵe(1H1` AuFT{3_yI% >%EZr_&t]@Uݤeg I&Q8OSGI-OPT/src/javax/management/modelmbean/ModelMBean.javaAs0Wdw\Deqq V 3I:{ùnF[c1UYBTU 'SIa;-ɒQZ%7T𝌕Zi8o d%kH AP@*nNm?gP$p7h!#hxU7mk>f]ׅڔkgW2Iz8u* laa*V؁6!9;#T.\L.32kݳ2 tgQS/ron6pQ)pJ.MJxu Qr_b đzhwyEH!dŒ;2AC_eT]—4 >5*^Ԥ\X뜪:#Ti3sd 3.G*/. k)7Z>x"%zWgFc.E %r.tkp W= ;4üvʗ Ʉ#2{No;\jNs L yO#ka% poc *㷭=]PKNSPKK>EOSGI-OPT/src/javax/management/modelmbean/ModelMBeanAttributeInfo.javaTo0~&ũO i$SZ:vUwmx ws7xK8ʈrCd$R 8Bp8GOSGI-OPT/src/javax/management/modelmbean/ModelMBeanConstructorInfo.javaՒAo@q‘kHzjsrHZM¤QT^ͶƠY*DTet LTѢXZrfQY &9l<> ;SA,$gr-8J42C vՌO? j#p C',6m@* ArQ"cmAHપ{Vewq$p{23z|_gimn4j6dqt1*wZ3'W5Qo?)qVg)ifnBۖit60VOJHT0\DI.^|..ϣ"J`6lz/ٔC4O2hkpun'!hhXPjIF] `lJQ lwt-y}g++&BiJeXV)2yMJ/޸ &dluíұ(3suTw#/\Z$8w=xzgK -d8cǧ3fZ~s3LCv `o1/poa 1cNKzdC}?Z)Al'_PK (sMPKK><OSGI-OPT/src/javax/management/modelmbean/ModelMBeanInfo.javaTo0?7'Xm=m vpKpؙ퐢jC*[ՖϿ/?;vX( /,L~ 2m1jTs`A.yBJ1Ef,f Qi.}hۆVY,!g @0gxca e^4*nf5Obm!#èсVv#0ӈ?3cO^UU.Rl٫{`9u-2."XAb֌U T!iUW..h)0SQivB[i$ B{v-ȍ?:7{0`\3x-|. EFCOSGI-OPT/src/javax/management/modelmbean/ModelMBeanInfoSupport.javaVMo@=_15$ڜV0iU=,ڻE5n04IɁhgg޼y3 #L Ԃ:tO(LVkX3jT B '<@1T܄iWTKN j֡ZlUb*S4j$ a# 012N j74Y9,gH5jF3_<XQg"BAᯔ+x0 k2 H!iYg.F rh2„\YG*}сdc_C9g}8w{=>t{p{}ۡGp;7I2ʃMnu|% C9 Tl0T*U̵m&x 3TMԬTHK'f1 2( $DڍCPiHe"eϼܶkYƇʋ"5 X=zDBLj5`ycb}Fjz.1<ͮip\N V"l(sE-%IŻ\Ǩ"25<lM\gy?;^v8U80BscX9U21lP>]LDΌݑ׊ʖقѸ-vb0_nݔKi,Xzb-EӞR1<!ҬnxCnJ7埽w)ju{dוoPKy DAPKK>OOSGI-OPT/src/javax/management/modelmbean/ModelMBeanNotificationBroadcaster.javaAo@q5[Z%F¤Qk{0ڻRP[Eξ,wgkݤ?9 Bw8\@=nVjXF#+2 )T"Ef,O{WTKCo][i: ! TIkX DeVsn*[ F.Z3-t)?u]{!VgdFD޺9j W\x$Ě)3#-u"sA˕B+rm+*#Y?.ؘAu`GAZ`y~e0`< <-#| ">-u@ƹ"DVrKL'dMd2A% X5V&74['lP߬۰W0A b^)B û1XXI&LƙASswS`i6ɚ|MECl g#"hx{?abG)Y;mj1jq4B|po%MSu)K osZ I_G6glq~PK`` RGPKK>HOSGI-OPT/src/javax/management/modelmbean/ModelMBeanNotificationInfo.javaOo@SrJqr?EHqJU!Yw:iT1m#98}{:kfkdr#LqUIrp29woc3dTDMeNRVdV9_X ^0GёBi{HtS r]7=FUwOIp{,|o\~'iiO׹{Ȉ ,6˥9*[QJ&82Z,M%k{፾jxQrQ  u4KE^ fcyD-5q i͟8qJ67qy+ ^ p[ؖkv68T[U!^6x&N3:^!VG>xzZ>c]pPKoC>8PKK>EOSGI-OPT/src/javax/management/modelmbean/ModelMBeanOperationInfo.java͓Oo@q5*LEUzlw55KUfw? T"[XL<Lrp08~ S40EzI@Vpd!,[[+j#a0tR7r+UAV yciAH([ZEӧuq$ze$g@It[̶͵|u8P:FW75QO*i XIT͉5g5( ,H5u2LIZ+F}[@1 0(eGL٧ 4Ϣ&SY4G}@S)\Sq!U$S"4*!djZDP.qj0q6(eڛ5{`KLҢ@iB%sdr՜B3bsK*LgcT,ebhݰM עJpW-]LΉX2= Ӭ@9~o|zwxSLws 95DPFNwf/oO']&k}nT"%}ݐ~PKj+^eEPKK>@OSGI-OPT/src/javax/management/modelmbean/RequiredModelMBean.javaWMs8=/+'bMnN]&PښЌ ov L$=~!Ђ0V@C? 9>B GDZ0H Ԩ8`IBcPY"#ӿl Pi.\;жlsc)2ۂb5yO>F_Lچeb'cJK!gцF<D'Kc?{fD#բX{pÑ7Tg>\dz-TlFZC-ҚVFqŢ Z͆)4FYl A{H6&]ms%NdMݡ ƣ;wG4 2OLnÙf<ĂL%}>>&1[ , BڦU҄| 3T/kjQ[ol͞4X0JfM+gTCm~[$ړ]̓ &!Lt˘4֭dyH ^[&,!&lO MD㊹5S]K ɪm:FʂP4-#bOg7v%gQZIJ]hUAin#)tvP] U`rT́Zl ^[~WҐJB  FRs#Z\hWZqb`n78"_!&ٗx uZ~r*t'eB['".wʺCt;Ո>:R~] 9_՚J -eAGO϶PPʦMMQ\UU:FNNJ (9Q4K>]Y|tTR}ċ~meAkҐ35)X1CWFFpmSS c?od+?hgM)S¤_*5~ZPKi PKK>?OSGI-OPT/src/javax/management/modelmbean/XMLParseException.javaQo0ǟǧ8)}lCH>p!f ~ SSu4vx,T{ԢY3XgDu-Pӫ^w 4!2`'IC%t$ vGXoJU0KIU A* !&CA!PM;>#QC9<Ў÷}}8JWa}5*^,lǪ;Y1W'4;Ώ-S3k=( XiU Y`ɔX-ξF~cC (8(3߉Ǜ Gi%x::7:G'7>Сc 7-BFaNHBlEdaEP=iɎ%0`djv8z5 = =%o6hTIukr*52[ԆSpψdiϱGXn:Gx$Mpzf>_s|zPK#PKIG@&OSGI-OPT/src/javax/management/monitor/PKPKK>9OSGI-OPT/src/javax/management/monitor/CounterMonitor.javaTS@~6O@}k}L5%ل2{ ())0w#w1 U@nn '0`C:}Ax?p$h>) ٹN"L)ɼb9B%)u^pjG[<gsLҡ@iBIn>*&G!U%-u[ys4:uʞ&9ϏQYmw;Ydc\<̭G R "&Sr#Ԝ^KV市h+-AVBӿؐsa.A( S^`dYQn7;z6VJ22H *m81a=+v:7bDzh74Tg˃̠}uy?,e#` >OSGI-OPT/src/javax/management/monitor/CounterMonitorMBean.javaQs@ïq,ؼy 4ef7]Nw&>g=c `,@?=(%g"E_F@ߟ]{Va3OQh̠*0sf)t+CJs)A zRZd[5De. UEkt.6 7OSGI-OPT/src/javax/management/monitor/GaugeMonitor.javaQS@ǟS)ɤ}k}UJfB 9 wf{bb BV+~2it/ D?G@ϯ^fjF%+rSE XBmd?Qi.cۄ^ NJPiH\C |J2$ZźObIՐaΨS̴˜5M5+U\at۪;Q֠wMUDX րTr3R7.h)2)F6{mi Q(FV>_Opf~8.#bNy0 ~dHQ|0sE2A&< &\4TJZ5V%7̬:sFϿ#['d% Rp#թS19 I9nBDoP6ζU=G9j{xpR$fCYy׺N^#2a]dGf˳Vhj%@Eq / 611!+LUzK +]ORvSVg*LX=+[6_лE=C;4<[ٮQ;`RtǎnG-~;[5ZJoL̀PK(PKK><OSGI-OPT/src/javax/management/monitor/GaugeMonitorMBean.javaAs0Dj\M2OSGI-OPT/src/javax/management/monitor/Monitor.javaUaOF|#>&UU{Qsn!>N=1{uvuB߬m8|wޛ73oǃ7w1%'81Bl8<vܷ!ԨV\ s,I>\ 8k꣣㑥lB(4װǘbkikn<5U5F9=-L-3&?>+JYW޹; ݟHuj +`9ٜfl RKҙVZqE-fZk0[M{H7mL gI>{M ppO'^Szgz yIZFy>Wm;)B%a!+I:ǘ/xL`)B*WU9%v&&Kn)_겉_K}=,QR nubN6@1R|]SE4Vj~$Kb sLYnz=F&LmK|~C]j@4z8tOdDQo"w̦~]x~[)ۏ{x~N{/7tŕsΜu&M z_ 789 /iv&`߷ON),+dSFUvpDʙ۶ Ct_ytW%`sY3%h4WA.K1:TZ#m݈}9_'"K\ډ _mjpi\j3AU7=Ҏϟ[2S=Qnњ;%׺1!x5Rn8x=[z{h:8Z_]0z7ϛ|PKl= PKK>7OSGI-OPT/src/javax/management/monitor/MonitorMBean.javaRr0=x\psks qܔi4 `D%a߻:qsH|ڷOoߓ?v` 3Yo/CP =NO={ ԰@jG g(4Ј5BP\ 8ZhhO-V6P-iH\Êam dUZn=UL #8>Dw1GocbO/{A×0et>n@2O'Vkg(V rJFPj[W0e/|a؆=zTT(WITNݤ(gP}wϑm$ρy1N03c aԔQ*eiY2)+o(%-_TL4%|7]۵ uK($0C,G#c6g2NO=a&}?9\^fgŠrYݴYaNy}_0eܽRֶ8PKGN&`FPKK>>OSGI-OPT/src/javax/management/monitor/MonitorNotification.javaQs8ǟOd횹+$#QjK$0~[3$13vߕ;dQ<_%}[nQp&?@Ͽ݆ZjQz!LyBc HQY!K==*ͥ%A=,b#k(4Pk$א_ p,VښUX%202gP*7fZoeLi8\k;RbkS"n@A+xV-Ik \!iU7\23kbRmR71]7?µBxcxpНžA(fwxH%8R)䶜[@B&t xBf9B.Q *T%Z5 L-%74[o򲁆=gLТDaR nT* IHvw&Ѱ) "oV?: Vʒɱ8#/ 7Cz{ / C|rP)z2^L|~hx\"'9UwGZ^5 nqw_[ܻӹ77^_Gэ,ax4(%3NOB/ѫ\EzvNZבJY|BOSGI-OPT/src/javax/management/monitor/MonitorSettingException.javaQo0ɯ8S; -inr;Nj bӄȃ#~E ,uw49LD4R0\,Y藑{EN̞ɍ,IYЫ ܎w߸3w2VjpLƭ[uVCo=V6:9HR݈6H;]< Fqt<>B>D0 8Qs&YbSw!kaW/ w9BtLU 6b6!sSF:9޺A6M^[.؄$.|{d%[>8]'Ye^'$Ky qoIz=qd\0qo >#َJ%^ԄZ(VZ+oV:NK zb/a+OZR.lN7(F0y c\^Itp*m+'[} ތp'W担> ,ƳOAPK:@TPKK>8OSGI-OPT/src/javax/management/monitor/StringMonitor.javar0Sp468&ffrQjK$0{Wؤpw a"@?,g"A蟎ǟG@_0GjK V'(4P%_~~\ 8uз .Ydk@4`e HdYuh 7MNŒ}!c(QAEl771WkebW+\]0D]խ(PkPk`Q%,&ւ5 \!Ōԍ↋|Zfa LʵQ<жd}7~D#+r,np~.#a2 "t~x?p:Q|u@܎"D{lt xBD^!+TAڮU`je ^rm9z`+LСDaR n:s:BR0h"icoPbwhm"Gro.t<38'p) fwCNmȝD^t[ELQqz~XFZQ<큵Y Ybj-VV=e@ߗ,H9g)2T+4a&Y-ykЛc[I~{/wkJ Sf@VPKy#PKK>=OSGI-OPT/src/javax/management/monitor/StringMonitorMBean.javaOs0Dj\B M=M &(k-a:]a Oo,#F0SNS0LOa_L˒Lg1Sm) ,Ѡ`泃3 F"埾2Ϩ ) gN0KsgS TbRYh ȩDmZ}őC+X.@ͫ h{b_"(; nU_aԝ,!';5S"aR4B#׬rԭ&KQmFgȣ?plB`Crؙ܇Oi bX,a*\D>| ȑqM"ĈL)hhDP jA"aٔTvu4kx=PZR^$(gQwYⶫ^"ǁ[23oI0E<}*\rrNn4Cv_!ٿ#6F3RXQU'_pJDRSv+l~5JKme`^x?>1&i^69|PK:t,PPKIG@(OSGI-OPT/src/javax/management/openmbean/PKPKK>6OSGI-OPT/src/javax/management/openmbean/ArrayType.javaTr0=d2Ԑdඞvp;d:=f1JJ2ɿw4-i{oWNZpCYa眉9O@o:݆0AjS,8RLQ#xKUt RvBd !  kR, p\5NbM!(QBAY3I1^*Re|{_?ĺκ9j \d V)Kk* XΌ+ Y)0SIiLr$ h{Q{Qu-u /c&o~xA879dBYD[;7]qLn(S>)IY2L.Q R׶N-L0M-k-ٝ` ƕEL2!O!QbxUE< TvCچ߷^X; Kݣ@ li(YG֎;܃.'DZi5э"( /=<#6bHy"eNg-Ci,׍0tPhJ%`FAH|m0 pHl߾ Cs5pGުorJTF rB#|m">u.>ҹx]૲w/qMφ"']{NPN񏢷~M8<&]ėәsV>ZPK_9`PKK>:OSGI-OPT/src/javax/management/openmbean/CompositeData.javauo0ƟX`}:mʀmQ ڪp Gp؞д}g6k}`x%YQ= $R T%Aj4z5|}m99ZLnEI$ ~M,UpO *A?z]wq,vw{+! h[ 6Z+zOHЅG#0Z }ޛ7a۶1cmOv<1^;iGZg´ 1q1_g{ gLCFם*C5ouv+LJR'P:Ӝѭzy8oBs|p\.H~F/PKѕu38PKK>KOSGI-OPT/src/javax/management/openmbean/CompositeDataInvocationHandler.javaMo@W|Ƿ'j j%4&Kwc+,-U9v>yYn`.րa|Vg"Cpɭ~7mֶR5>,g(4Њ-Bذ>Cƃ4\[0R"@HFbp pac d :nbaTΨSq^ gkL>Yؗ S2NoI *h"XC2֊u R!匴; Zc -&(bi4Z0 |(,1ܭ6a 0_ŋhb:}0~Qie4H&<"$ yx3&ʖܡT5Z5 -57+_vP8 zf;k&P0lP)21s6BV1:{\0"Y?fVxtR_aQafW@7>vLM GE UD[U38^@OV3k'_н[AV6}]Ѿ}nL|+iG PKAOSGI-OPT/src/javax/management/openmbean/CompositeDataSupport.javaQo0ǟOq)T,оm6emQ["ڪ#3g;w9d]Cyw?J /¢ iC,g@nGZEYD ^(-Π34f;=Bcp v=kUA*E\ ]PnjMVœMr(Q|;k9߯:b qLX?Oq6zOm֥h-]qCk` `5(4H{Nypef̌[gx^1RdЉ3H|$yd=uQژOU ;}͉*!frҜC2>PK kPKK>>OSGI-OPT/src/javax/management/openmbean/CompositeDataView.javaA0WzjW%){=@*8I'@biBwmBHho$ڜ,7j3Cڶ". 8,6(lɑ=>`r)G{՞,Ajϸ3Gx []8:<zGjn "T3#pgt $شܱG^pQE` wHXR]I"ӗ(_cO+4Ϳ+L⪞.EPKG/PKK>:OSGI-OPT/src/javax/management/openmbean/CompositeType.javaSn@=q2kHK( a DQ&Ʊ{g Ж̼yoa(FlaIzF8yΙHz~y6S5%!X ИB%RT`~k#.\\ 8؄nN,D#+(XB409'XY-ŪObM!c(QAIf"0Ӓ^Ɣ=bIu_$#mեQkP X%,&9A*`BiY׊.2)0)F2[H76&GD]GAZ`=?Y0 0YN  HQ/U@4s=E(嚒.1s4U,C EP*cD009/afu6w:eKvLС@afm=bTJ eBa|9X0C3B(2 !+9./&sa`b(St6<)9} s-]F_=v:PKoxUPKK>@OSGI-OPT/src/javax/management/openmbean/InvalidKeyException.java}n0DW,|WrsksRȀ4q%eɒe#ȿw)HՁ%.`ɊfaZ`]|J)PUx<2l1;[QrTCj~uB+0 ɸ5](sNH:Vd<n͈ .F]zd9óK!o$}86#9C؉Æ! 1`lhG?, %Q}~q'-)kC- Ud{ DFoBxGtj7ā-Τej.=K;F<W\;SPKIPKK>EOSGI-OPT/src/javax/management/openmbean/InvalidOpenTypeException.javao0Ɵ_qSRemk )xx3g3aji >$\6'+ڽy* R 旫Շ%"۰ JrdLnEMQjȂkL% Vp`4[\(wNH:d<̄6L.&]yd9ëk!g$08ڶFOSGI-OPT/src/javax/management/openmbean/KeyAlreadyExistsException.javaQo0ǯSRemk "RHW7ě=ۄ}ׄI=vr\k3X<̫lR)`~Z}XqXmP:ؒ#{:f`r'*RjTM 5XoYwNh A0f`1Z@i#BЩ"A(tk&^Xgr $8y#ˑ_ =~ͧ$>Ƒ8ֶIY뒻zL=WK:ar4LUaɬ{{^ /TGK[QvMh b"+!}!n| lzdl #f#:t26t"yE( ^Tܚj:l}$#0d[µ:ǥ (xSܢIKڐjKBuLȨ4ı"k'U*q&%5(StELi7_<_|Kj:EPK&G[PKK>>OSGI-OPT/src/javax/management/openmbean/OpenDataException.java}As0Wdg\psksҦ0cdr\`ՂJؓ i2 1~zo*+X*}2;3(Kba<~~6^iaĆ r+J*dEܞ Xoܙ=+pS/[ٍGT-@*%f ;б$@H(UGkpᜑPC#h^ hzOQ}P:jZ&u߳N6d- ÉfW% SuoU;ף!uF{մ9K %L|<lew[x78& ,tl,G9ϡ6>[蕅:[J%Gu5Ad$'M_e4ݰt%OZ.Td[ʛ@wj+t^Ett$+{)x7b.<3!gs{@/PKK=PKK>COSGI-OPT/src/javax/management/openmbean/OpenMBeanAttributeInfo.java}RMs0=_㓝q͉ͭ8n48JA0d߻I3h?޾VVA0/dm+Pa0@JJȍ(H*a%i Ac)P.]lJRY 10P - (ls38&p7a"#7|^ډi?8>JA{5MneKƀ_Ь8?̪8Ҁ&YXZX!%U59RE>W=qd/ 60 3\Y-.~In 4&$u_G( F-9ki giP%S!*Q4YXjOZ"Iw¸&X:Vt¢=>t@CɇUO 9{Y}\h'_"Y)VcI?Xsw;\dI~O=3f fJS0yH Kwބw| e㲿=PK9g5PKK>JOSGI-OPT/src/javax/management/openmbean/OpenMBeanAttributeInfoSupport.javaTn@}._1 *$齉R$$>`65{gs\HUU̜9sf=x-GjQzg$LDm}ݵзQMp9 B3eǁTK;l@tUb&3i H\Ð'805DrrnFE2CQ8@`$]FƤ<]V0vA{_n$ɨNSe; 9" rNI!5g,F E5ڎUIflFB:@l¦ 2(+SحYHB0ڣoRO T2(zn9pg%jٵr>yI S[vRowLc ֫utF-ѩȒā;,Q[j:R<5Rp ]9M {'h3eWlv܂oߋgSx[MG>{ހs h8dYbNXaNL"s3GcuCYRd;S"s#6_5\+πЮMhWoa:YئUm_xK/~Y.+_PK PKK>EOSGI-OPT/src/javax/management/openmbean/OpenMBeanConstructorInfo.javauQs@ǟ˧Sډ}IT NHtXU;ww/AmF8.UWP`Du0-/! V, e?GZX%*dor'J*eEܖ XcTfJu8[T@*%jо$@H(UGAIqPCGN|xmӯhġ2MԞbmt,VizcֽlZ0;.J,l 攧pB63v6ΈwgCȭ?ౡICO6Γ|Mͻ~zdCE.M|zqt9qk;`Ly"Dg:!YMEɭɦdžQ;2;M֯2`mZ 鯾|(x_pv(Бt$P/x<>GF^xڇ[lL_:eY+\J[; J;4s.9ϖh-ɖFhO<_LψDpz_|F.74h Uѿ8uz PK4aPKK>LOSGI-OPT/src/javax/management/openmbean/OpenMBeanConstructorInfoSupport.java͑Mo@WrJ*9IWqJU!Ywug1(U|3Ë.`ވbfe)2D> _ia)xQZ\C-hmb8u>BIF.^P=H堶HB.Jq*ݡ5m9'NCrF ^q!0Asp4MZHbXj&%Qw]wDkZrDيXKր2 sS7F8!] zΈU-'#Y?.1 8$u%YEn bϗ,tt>MI:[!OC@Z6a !C|E.8YE BmHrM%?%)E%smė4 7/m.GEJV8v dR5'$L͝2UVk#Kڞ kj]3 ̈́EWڢNI23 \2+[fX1Ϋ#ؚn?8YeG yEĠ?vs WPK44PKK>:OSGI-OPT/src/javax/management/openmbean/OpenMBeanInfo.java}Mo@q"546'hk5%LEUk36ڻ1E'!M0;ϼgT՚`XB}յ@O&GNCt@v r% TWЪZ5BdD>3h }O N/;۰ * A(E`ڜ=em)S}\J IuGzX5i~F Z'/)z܏P!=8rɴ%)N-H'Qu ]aO4{48f?C[kSK%}/PKSe7HPKK>AOSGI-OPT/src/javax/management/openmbean/OpenMBeanInfoSupport.javaRr0}b'ȸ'`La֖TIa2K Ξ=h'@B;(!sD>N}ahP/q#) 3( 5BXJ?͍P.=h;@jub%K( P$n`sKQYRYFZӰ8%ppȩegԠ4fgaVUZq uXӽqrT7]"Gc@kr<]S*eSҚ i;+JsE惑s[1fƍ|Zڍj$ I&|]O&x]$0`I4 Fh)L\"$r-(LdMd%2D-(7Y 92[v|A]ϣ9l :(l bL=UN)SHsFRGT:z$2)ڒbfvY8+`{U3{Զ \ABC,|55;1γ:ej~}s\/3=uYcciluDމs;j+L@wM"!kLIGnSeڃPK׋TcPKK>COSGI-OPT/src/javax/management/openmbean/OpenMBeanOperationInfo.javauMo@V AMX)U8]vq"g6qK#w>y݌/;#aqiA@TeA0L^_> _iaĂV!+xQVȀ[D ~|%cpN` }jp~%vw k h[v $=Z'z?W$pk!#7h> ]qu!Ceq}x:O neMւ0qLU`ά5v `esNy'd5Jס!/ȴGF^yۆQq6(%EE,yi2q=D=|-9oyEȈJu@ QWUA6d$oL#Vˀ+/SF8t?{A `x6lP!BI69 tl#S"_xʹלR,W8`m^5a?P`fe܌larC_|8n Ou%Sw[߲ <|(;*9; 1ށo}_&*JO[ѮjubSPK*G9 PKK>JOSGI-OPT/src/javax/management/openmbean/OpenMBeanOperationInfoSupport.javaݒMo@Wr+PrAqJU!{,ػ:NT3븨U"98xw=:Τj^, 3f{QUq&2d<>/Ѕa* Ѡ^c 94"G v)_ jåI8+$mAH A ^!&Ce dzU7Wq$pkȥeTΨAѩ_oez5m8UZ3ϦI:}J}ץ6^n)ؒX+ւJQ[.,l4:LcmL J!Npq8xavh>EpBٚmš :(l(zLxYUPgtJqzѝx, 6JImi!"7r-]@yp=4tʡ+L ɧ5Gq|fhQ1__;[߾q{{܀i{h*{ Eyv%]?xqMSŋ#9KswO u$z/PKEw\PKK>COSGI-OPT/src/javax/management/openmbean/OpenMBeanParameterInfo.javaRr0=ɸͭI-:I&/X)HTƞN+[;t{o5> hQ,- S(3dv~w2 -|fp$"#ih\$jwF@%ܟ}kpz(6 7 s( hQmAHTUZa9=SO=J-2yCͫ|h{ݳ۶S+]-֌oMܼa{Y1G#4;N750e%4`{V9խVbFEMf!"mAh;l}A@ *HdH~lD&x8a| Gк.!!:$SS&r5Y4XjEZ#IW¸p4Eە|ƞ9wDϸµ_EE&Yҫ3,y1 5VP ~z'R%ׁ':V߉2 +c'G5ؔˆgdZ_LcE'd0T`јJOSGI-OPT/src/javax/management/openmbean/OpenMBeanParameterInfoSupport.javaT]o0}O i76 umEMiB4}ι'ϡ#@#r`|NSDmv\7gahQp쑂9 c B;c=NQi.z-hX@:;{Vb!si H\CSG"9*k7Nby!G!U|TĘmYJǞTI3]buAX'"EA+xk XΌ  ZƦ` ̘k(7BHPlL@kE$p~/:~AV?O~RdT癲Mn\",riIgGԚHr $rJPGrmUIfʭlfF9Blޔ ZLQOf(#db#g *_2ȳL*C c*J);.o{eYekUl\^@WH9͘jn{}Gp݁:sR xpAuxfZb=Ã?@ >_:V)Y77<4qaҒ.q7йxHjmj#)S„M,ո!mumůd#%vͰ:ZPKǮ!= PKK>5OSGI-OPT/src/javax/management/openmbean/OpenType.javaTo0.ʼn'@,mtU3`[4$B[UT];(>J j<ljT]HgjIW~ A~P6\ x@"!ih;#sL9ii#S 5WPURqRY( 100'[57ҖJ S7 [r䆜WB@]>3krT)ui n?XRfd hS͎`ΪYkKP0gV9K-i%jr0aqa 86P#*| j:`mx9k4qЏ`80` |^#cϵs2s=EI$S""ak2-0%HՂdG jXdb.,r#jU*ot (y1'i=DŽSɋ39L,$!W9Ke)7OSGI-OPT/src/javax/management/openmbean/SimpleType.javaVQoH~>Qž]smpdH&XYV#7yӢX%bȝa("k fZ'74G5Yqճ@۬;Q֠ߚ+xwVHk L!iU7\dSroLI6jkړF*@mc.nGS ՏoûۭľAU o?XOeăLny"D= {y+L'Tj!dJPEP*c$00/aqF#?;Gdqd!WQO@T0(RүzڊL( 2ٚQbKf/ { AEq? UCwmԭs@j;ug)eA g'D{].2&ZLئnݭ{=} [^8kf \9tkI *[nzdchB2Mqx,OFl0pYs8^T XI y8pt(݆ {p.lcxZ{v Mw/y_wtݳB_@ΣS +4 sa g:_ǝHgE&A!KiI\tlcJYbDkG$n}Nd]=c<~?iȦKPbvJhK1Nu$^t U͚I'qijMq@ۏn3?FPK{J PKK>8OSGI-OPT/src/javax/management/openmbean/TabularData.javaTQo0~.SZv(ۢV ڪp Gp؞ٴ3[-wtZpmj+(?qI@_J*'{7q t0!GvIɅI9Afd/s~5;"Vp v>< P9b`.$s2\~Ӱ%pp#Ñ G@@߈< IZb(-ru݋d0WɺTK*a4*njJ\%:^Y*:ܯR *gN#v?$mÇ~@rL?/pݟLi2La=+Z] %%)kCiT{ysbVIg~Bn$r+(sxJ:;{<9Nxڰ-xZ 6 a5Щ0MUwُW(+w;/I{܋ ~q|Z ,?|4@&ܰ4vq兌So߿;ym*'ř_Rɳ}'f7.GV Lw$8 g PKE̓PKK>?OSGI-OPT/src/javax/management/openmbean/TabularDataSupport.java[O0ǟOqS@Y@]鶈B۳^@|2z]ssZ=4>qdN>s Z]~?:h C  B]~+!\\I8jxGLT9T \ 8CKTFݔL)^ \O*um4sS9ZF+G Vƍf+i%]R`g yNiR 6e ҚS^p n zL[gxZ=k$g (lL^=8ك$NB_]w:V7n&@:qEOPo]y: )dtLEH$Փ$1}krP@ H4[VK{#xsԒ_jBq[6d(g9J)2Oɣ.R)d.K s,)VƕMD\E f!ęq}cŤbʼnphFҙp- .7Km *V~/'ml|fMAr̵;b6p;X8\.}Tz _9w&k"c0WK_͖UUmu4Ĥwj{®JPK7C8  PKK>8OSGI-OPT/src/javax/management/openmbean/TabularType.javaSMo@=_1kHzjEV##a(zluww8`;o޼73[rkDr0MI)Pe(~~fiaF̚!3x J-Ȁ[JpE 8Bm?[]A[PAe9ɨt d([ipNMˡS GN(Vt[9W~ Qjkx'wͺTC*aq,YU)kX6!9UF8^ yΈrOm;J JiDIIG(G3OhMc>}Q|ߢ<qڔ;`·s7EHHX$[R&"ck*0'bGP)c,pi(C\ :OOtk܄*>\KREJN:erO!RV|[mp@r87==i)u޴*|v] O x(8gkp`K?|}etG{^.7w`+F>J5?{xJ;L[\Ә>0*` b&rBէKAN.eXQy-ϙ8u3tB9X] nzp/ʊ8{yM}PK1>وPKIG@'OSGI-OPT/src/javax/management/relation/PKPKK>FOSGI-OPT/src/javax/management/relation/InvalidRelationIdException.javao0Ɵ_)OIAַO,6H lf3ZRy0}vtKݞbu]"k)TA^.,|EF́ʐȍ,HY*ѩ ܞ+e'Ldv%NC#NPڡb'k jBvD}FOQCot-v!=|{/Q}(P*Ϲ6I4_}dVd- ቷ' eZ21=uo!/SJviO<M(LI>8OK6?ַYdcaNMNy qzIz=e܇0vo9 >#ٖ NTJ(-FZK/SF:ᆣWsFQoqǰ7 )ҫl)Z0ie6Fr5HmCa[x:L:9_rf1??PKfPKK>KOSGI-OPT/src/javax/management/relation/InvalidRelationServiceException.javao0Ɵ_)OIAַO,6H lf3Zjx0}vtKݞbuU"k)TA^.,|EF́ʐȍ,HY*ѩ ܞ+e'Ldv%NC#NPڡb'k jBvD}FOQCot-v!=|{OQ}(P*Ϲ6I4_gVd- ቷ' eZ21=uo!/SJviO<M(LI>8OK6ַYdcaNMNyqzIz=e܇0vo9 >#ٖ NTJ(-FZK/SF:ᆣWsFQϿOqǰ7 )ҫl)Z0ie6Fs~zRttJooCnt<=D s?6 bx ?PKq`uPKK>HOSGI-OPT/src/javax/management/relation/InvalidRelationTypeException.javao0Ɵ_OT7S DLtL{tkjHlc;Mi;,<8}vrKmVi9æ,6$L/ws~c!!'GHU AFUTE@H(7FFIp/0 14]Њ3tˆ@T(ukF^gT $5 N\`xG;xo>$IcmyuM\[nUCNZxw0LU6%y{+TN}/,J:oL{f_&mBaȊ >EṼ].tV69u6k}Bl}=e܇NƆ S;n+~BrJ%NԄZ*l+]VǀUid+sFI?wq7-)[jҫt;e#4SG*۳&{'Uuk7cIOgx#/7Eq]Q PK:lPKK>DOSGI-OPT/src/javax/management/relation/InvalidRoleInfoException.javaAo@WEOSGI-OPT/src/javax/management/relation/InvalidRoleValueException.javao0Ɵ_)OIAַO,6H6!Q}iJ}srKӝljuU"UJ ]Ň9qm!ҡ G@u AFVuM~OH;Qg<㎬F2^`&dv$NG+Nƣwa'uR2m7 uF@Qlp v/!}~wdXccD=Ǻ&[rǬ[9XKoOSUbˬJ 0gJ/u33;?KA[+0r/61IKd2+A>|[npEoUu:6:gĖq:v6t2%(BDGOvo+71z7;OP8%O-97PKk@cPKK>IOSGI-OPT/src/javax/management/relation/MBeanServerNotificationFilter.javaQo0ǟǧ8)2m4&)3gw.UUm<I'0U`xuHpLfqװJ KhvM.ybр"De"CFcp.LAUPH堲H† gp *uVsmt.n;v46O\\[hTuPb$Z]yuu%Z VP0MT[`5(0H1`o+W"&2^I Y\7AW b?s PK}s,PKK>4OSGI-OPT/src/javax/management/relation/Relation.javaUn@=_15$6U$BHk51MEU=MͮAUiH rμy 8V's3Ar&"Qzq16RCUKG(4Ɛ9 c}47]FpmZUsl!V2[r5x3\@$YCf^iP,m00 gl3iHW1^,KU]^Zޅ7=nDZŸ9Wt,#Vה D!iY..h93%Shab<m͑Z ٘ /l ®&_Wx 7>=$ɨ.3e; YOBf3GԚHr $@%#P-cD00)_pLu՗-sc[ &a¸ *)IJT3F+ۙ2EfHАanw]]k"K`B#@2`ū憧%>m፧w-{yA8Uk5tCHNN,gT _"Du]c#yߐ7ȓU(!6HxT>@)\fUG y:d*悥ܬ^v߾jħ<9mgŮT~HIc 艂m,qQ6_'\U~ JH7i7Ⱦ>?gvQo3C{nC;PKmB PKK>=OSGI-OPT/src/javax/management/relation/RelationException.java}Qo0ɯ8S; HMǴG7M li5sypd\; pnOFV{i1CZ U׋Ż9x|? 2^i&K@e)K%:UVwAJp.0ɸ5xIwh J;t!-v&бA*iGktᜑqd,\lRF÷wE}߇bpjSEYkdJ[v=Vݫߝ4x{hU!= uo!)uFn;i=rnP9|qsyH6_ :N7*G2KoM<8}ķ$e|[MyED,ْm;Yp4Uu"T@Fq"diZ6XzL-.r > a#OR.4T7Am(jak;/^~'z ތ t'EOSGI-OPT/src/javax/management/relation/RelationNotFoundException.javaQo0ǯ8SRemK " 6MHTPTiy }w=vtKݞbuM"k)TA^.Y跑yEF́ʐ r+ RJt$'ĭ(o<'+e &dv'ݡ'(Ybɚ@ǂZP>#;['X.޹K}qMgn*WXujtDˮ e DeϜ{#TV\/ yL)3r۹7x_ 860s$_<rl6,N7*:r^'dqIz=qd܇M<"r7vlɶTȝ,x4Uu"T@FDh4klZ6 7l3oۃ~8PhHP=^mHQvN ] ?&::R}y >wơO&80)PKwO[EcPKK>@OSGI-OPT/src/javax/management/relation/RelationNotification.javaݔMs0W0 qR2=1qUdHr g4-@}+E-U.5O-t.!8)Bg}v}eѠcAFw | 8&0q qtNqD7D'><@RH&wvN5 3dJLԚ+#jZRGP.qjH`02[6rZ-9; &iRFQjJB*qmuJ1aQffuA͸dӖEkOd$g'g Sx0?ոLi{o;|<< B͙A0n2cESdr[l׶\E_w:[̙{vO0.LPGަL ?>Soί6X.ϛpeG絫㊇.W0= ú +!<\bx:߸'r1u$5T@$SD"Vw؛&_6٭]amdYZOoj}PKoG PKK>;OSGI-OPT/src/javax/management/relation/RelationService.javaXr6}bORFlxFRGd+ (YɿwAQEC9gje4S<{ p!gC5ѲзQMo{(4 B'b~i'TKǭC[AĺlB5aC|02xrЦ܌uR/ |N}ȁadhBDL :32&ݞN- nIùn_;]WBκ!j "ƃPyl@XC6 雑TqE-fZ7>FAl2-0u 8pqi;nwΥ >έү+t?_N H:)ˀ`r+<"f C5,@ Fsmê o݄| 3P]]߭olZc&i) '(L6viϑ#b`P:?+)|iʍH*M 7L9C&XՓbd#KJ@ZL:l KӉ>0_L gl|3Rr:'ڲ#nnЌfƦ"%UGLXȗ'J4$¸ܤG yđYTM37xk0oDx)XVJb:DO__tLY`14aQ h6&VD'O" ɪ*7_N<`& kC,e+-!Yf新l_CkٜaE JCsei$NO~Gkqb'%K6%h5|ؑ&KvhdݛP،1 >60h_微?q[ds{#/ g+X(s`m'h߱ *dCj,N'8-HL~U2;]*'+mQ^|J+ij3E !*3{TU\D_-Mq|3!Uoޢ.$ ?˧|5t~b<7 >zEwSP+xnH6uBR_%FR Rd.LXp|HGf)̸ͽm6eG9F ŖQ6`G;0fU"{1YHXNv\l)\5.J>,{.;9 0, Y|nAȧK|YŏdGIUy'+Ej{*jw<󤧮Wtnk$e,\ige?ug/PKPKK>@OSGI-OPT/src/javax/management/relation/RelationServiceMBean.javaXsF~.Ŏ C`b'Бp[,El t¥۽۾{+v=F!*&\ǣPylDXC6!\rͣ JI4j|DH[a$6Y=km<8оua@okA6 QFv9 Sa,Ts\#QN2ǪoԄ|5R/ch_lƞ)a$֫FRbO3:o'{Rܑ$Fj2͒3zϦ3&[HJ[)/ě<6 6R.ó#M\4c!>hW^[EY!")R0\cp6\(.FsEٺ 0P}1d>%@3q)Y)#6lZjDO"SIU[_$L FG'i,i]v=Ej]/CR[^m9h,nlIDz`"%ͱ5M UJxVvY/_6B^1Cʊb &ÒGűX5 yf-RXy{(QOSGI-OPT/src/javax/management/relation/RelationServiceNotRegisteredException.javao0Ɵ_)OIAַO,6H lf3ZjRǃ}Xddw3q]K r0g?F#-2dTLYTS%=!nEfd S0&+88Ai3N::HB7(n?)^ G:ZBQk?EQTQ}M\=nUMNx{hYU!= ^uo!)uFn;´'M(LI>8O%o ,Mʱΰ\&Y8$2CXv_9 ;}d[*Nܚ:Q*} #diZXzL-^ EA> a#oR.4TWAmR~9R2bWp#US'ߜXM53<޽0e,FcPK)fPKK>;OSGI-OPT/src/javax/management/relation/RelationSupport.javaVn8]"+pe'4E5&iQ]ҵM$e(、T~+i tQ/ls} xg*[hN,4CGr ǝQ YA=$.QL jnb)ߴ=jÕMgpP:8λ"˅-m7w`5R?H{04\K'p)-5P)fUӷo)1-W1؝Z_ }ۚ^:~*",pDT\uh!m3S vt2RgzYjL&t 3p#u hYhgPkg'wauyKlSEtrĻ/Sƞ.Yy I^[ҸR;mMC!p k\{0=i6UJ +M~RꦲuYmlx_lH>k4PK˙CPKK>@OSGI-OPT/src/javax/management/relation/RelationSupportMBean.javauRr0=PpsksŽ2M 8(ÂI&r#۷=) J 5;r AҶ$d0?Y!H 9Z4{"f$wTXA/+4v%JXR9L=`2&kOqT=tR9-2YECI(UGiiȡN0\p]O99aIqLg*+VX [ ɰfUزV לCdUAOSu{ڳF ")"$aI'&]anMxw I&xX&8Ϸ :KKdkEШ=Ɏ@k,4-u;A9D?^NHt(]d=^rCS |,ʸr"xp(+ ~yBM 1?hV9xWTEOem+{0sPK|#\PKK>8OSGI-OPT/src/javax/management/relation/RelationType.javaQo0˯SRem4 U}tBgt5aS2KX*}4TLlqӐjx;~~2_i!Ce ^dMJ%tDnkQg\74pS_0&k/qTR9,YAPVh=pΨIaP;'\ͣg~E}߇b Tku\ Sdւv;LU6e@y)Or$9XU^2%Ygh׹ged0sH |${des8trdܤ76٤<8}Iz3|;`Lq93JƂ**ؚ;Q#F#hZK/PKNa/P/]c Ƀ 6@w;sh*ƥQPvI9 = -\ 79Cѝ )_W L5J [ ݃0;4'*w8p'Q/zPKXPKK>IOSGI-OPT/src/javax/management/relation/RelationTypeNotFoundException.javaQo0_qT,a}QED>%g;TRմi<>;p6G+Ǹ`Y|HF UƗه)qmaE잪 r+KR*t" #F7L񝬓Z2ah4 Њ#1C:leCCIC*5^ݩ@ N00 .0ھB|Jcqrk['Ylȋ{v=Tݩ_<aU)6=-uoVn:&ԜJ"m8RpᵝGC7ӣTN_?OSGI-OPT/src/javax/management/relation/RelationTypeSupport.javaQo0_qT,о&enѪ `K؞Ptʤ!{sN8;Ë~6YC$g2C蟍ǧCAa+-Ѣ`J9T2Gniѧ]W4+ g.^b*(rPY$ nan3LE[7*Z t5h\ ; Lܟ"OVjd5f|3&ڠ4[s/#xs3_~QP?a۰d%JME%E `mNcZikЛ&wm'deRdoxԺkXJ`,Ww_z:_3 <>mnQ-ࣷ90OSGI-OPT/src/javax/management/relation/Role.java_o0şOqT,оm&e-ۢ ڪ&\;RZwUQ $Pq0KDRPBl<> B s0Gf|Ȕ2TWPpu'CFcI+8 ^w;PAe3š$gX: .&iR< vzJ^ \6ΕGC#jh_Lt;וh-Q቗;%SebɬRԠ 9kCT>׮}̊3ܳҞyC&4N>&^|]-&ϣdORb\Ƌx3D-|! W}iI!E|--15e<+#zFDP)g 1 r5[/{V܇P(PРlAY-RȤ`ҹf=k/$hHHzh t&/7\#n[kHS 3?zaB ^eUF<GǑ?z59d +n5 }ezکh'PK?PKK>4OSGI-OPT/src/javax/management/relation/RoleInfo.javaT]o0}'@iC{HnhO 7k3!}!0Pix8+w^6%eV<hmG9xYƙZg}v2!Dj3,Ɉ(4Π3T`^bwJs)BVݳkYAHF!*E^K+W,V rj4KL-͍w:eYRJv VwF~DR]W]  t ,'U1֌ T!iU.RLLZFiaBj$ hzQνȏKrO>&p텡La`Oq@ "sp+dr!B<ȍ$c5,EH GZpmUfGAFrD_ْ4Y0¬*5bJB1R }JoU˥,߫/„ Jbx4{? ?|ޮp{V:zv#2d6T{}
    J8E3@+^9lՊ"K-=JvwžJűr7mmx\fi='khPK-|PKK>EOSGI-OPT/src/javax/management/relation/RoleInfoNotFoundException.javaAo@W"#K@e)K%zUNNNJp0hъv-1CZT!бA*&itDJ81 z&wE0bTjSG9Fw:Yu~pǻDǪ c DmϜ#TVWn<+h_mBaH>y/=!~ogYnuMMzlMʫ[#%Ėq:vw2 a+/ZR.4ԌWAR`n(QN ]_&::R}fߜD;_ @_8΄9O-97PK+cPKK>4OSGI-OPT/src/javax/management/relation/RoleList.javao0T,о2ʶh$BWIؙ퐢!ejyˉΙgWJln`LyKwa&hP/1 C4B!S`AOJ…߅Ш+XlRY( q D-Zv^թ)k-rzm_fk36tʲYe+u ` >uu+\S XNV Ui3u2kQ3[2rc5 jh/"| 0j;]89]0i8`deZŒ WN,KoۮfWBA6TUAţڃ9-vcf5QB7}NUxׂ>{?PKTiPKK>AOSGI-OPT/src/javax/management/relation/RoleNotFoundException.javaAs0WθDe34 k$* cO&+L'ɤr$~Xddw3/q]K r0?BGZdd ! eDJ2p{B܊?X.>`2MfWqq%fH t,u nQZ/~3R< u'ڽ p;~C1(kdJ{V=fݩ_4ѲBlYk-zhQ3H'U5; CSJvi4r/60s$<rl6,N7*:r^'dqoIz=e\LoPKa =WPKK>6OSGI-OPT/src/javax/management/relation/RoleResult.javaAs0x 2Ԑڜ$m=e`C39 Br%fY9!mӡ>ؖE8Õ)wVkn$$(% ݋aӠt#ed$sҎ,"G{WNxntڣN2XLA{HTϩٔ-Z-ӺܵfZ !| \kA]ױhcczҺ(g7okEҏJZx(* fU%>&PVz>YZX 6K鼕ʿȣ 86I2Y,6}gMd#>t_0cWDFae\I\ɜGE% Bad5OFY.o+4D=}[qoņ-2*G\ &EU7č5ձ4qFV %6?Do} q ;s3CyWûRKRm~8>ozkpb0͔8ᵶ(zPK`?PKK>6OSGI-OPT/src/javax/management/relation/RoleStatus.java[o@_1 "jHzS& vZ5kwwEQ{gmVƒz9ͬ'Z.WyRBPR{6{{ ) p47)Le@ v"҇C:A-uz#X=Bc2B˱ պnѶҮ}GmF5 5B>V֟v_0[!A|PTG$Sc. hjو%²ڠV4ԨҸk5p1\K+?sFϣ=pAFPtX`yu3B^ "U 6WmJ`\laʒ$K(Q)&3YY {/bw Y̜=gQ(N3.$eME" q9x$ Y?guxf$8:³ox7kO͘WUGRz,m48{~PKaPKK>:OSGI-OPT/src/javax/management/relation/RoleUnresolved.javaAo@qʭMUM*2D9.f0w5D5.F `f\.wnփI ]}/ahlprS*Dn"h,ip]/Wޥ T9,H"6)tQh5uSM$pf,l(:p-tZ;W~ ECj^k&Io2u+ւ_xQ2U&*E ڀ Ӟ6H}zja,:Cʝ #~, (8(Ӿg&Ei&S$,$|Qr#:-1ɏsEHOVzdKhEJޠQh ~>FRANY_ x?}Ѓ؈mXŇ zՂG L:犡\CmS4$$=6;x ޴ScQ6”Ga}HHc33?y!H9mԃ'xC{ k]2*@UR^rt?fb+Oc<|鮍z1si ɰə@߳Gyڼ PK«QPKK>>OSGI-OPT/src/javax/management/relation/RoleUnresolvedList.javaQo0_q *hV*v[ $$Gpgv9dJx>B̃3|y6LZ0qL&͋n mHc4Dp[4B!S`AOJ…߅ hGV!֪[T f\ *E^Ϋ<5ř}PeBNn 0[KWeS*c_#6snGoM@c@k8^*a1 V2tf.5\fm0jfKaRnqa5#@mcAaԀ/AFm 'G q070 I8+{ۀ2ʃ\ Hvn"DfjdrL'T !djZRE^p!a_plWKu=h=đ~?PK8rPKIG@%OSGI-OPT/src/javax/management/remote/PKPKK>8OSGI-OPT/src/javax/management/remote/JMXAddressable.javauA0W<ԮJR{ JI˲G7ӴZA"D߼9M,uw6>8L6GiPazXogFY2G*Cv&kYTW%!Ddod S/Gٝ88Ci{HJ6:9HB݈6Hw]< Gw :^Uυn<wQ4 C(.ġ6u\6Z'U^3XS Y CzixcB왵 Ӟz0IUaua۔:#{_Fc 8GO>Γ|Mn8trl2,7}M6)> N%I Щ3~Ɣ>-"'zP+,x4U&HFDȴk XzF wg.( 7!B%BCvttJm=.K}I)xڐ9oQ?PK5ePKK>:OSGI-OPT/src/javax/management/remote/JMXAuthenticator.javaeAs0WtzLP8(+kGŖa3H''W\'=\-(?jHVKv!6l=;;x`vi/J ym \%̃`6f`qt C{uG=6lOh%a+,~.IdG!º&i/Zeu^_3uoZ㉫Ȟ#Xq5ztibQ: 6;jeџ 86i`3xYlC٤6[Pl`U6+r^}4/Y~rd|{&`L"/j{A=*]kţf Bc O=Npw՝&I %Q9FO ;KxCŁrv|۟~O629^]== uQ*O ^A%tPK|n`PKK>COSGI-OPT/src/javax/management/remote/JMXConnectionNotification.javaMs0Wdw8@IS0SJOb[2Jܒҩ}yW8p#l/̃$!*D >mL SԨ`E&|Gp .Vb#[4j$ 3l pmbۧS$piȹaΨUtgaL_VRjh4K.EZ-WxUZHTH1#-JqE郖Y1V&(>o~ )Di>iV*}J.gpNa<)$S%y4V%}@uvS;$` 5QD( GРǪ 02afu6;aKj&hQ0Z:M;BV1H 0ĠA֭+`hm)Hidf4I9MPsUnxoL0<%W0ϗYt$55N8ei/{- S|{܂nFG|p UQ0BiVSs8PKwjPKK>6OSGI-OPT/src/javax/management/remote/JMXConnector.javaT]o0}n~OPem>ReD>%vf;4:IW(*m+ {ι6ca,˭@?@9g"A蟎F'.gaffQ1LyBc HQY!%K;q+*ͥSo} uG ! TkX7 De'fX803*(i32|3uF'U6[N$'HuWu-r"Nj-T%lAZsVT2tfU]+n\rijҤ\ ^#YPlL@Ϗ!{pAZ`)Í?<`=OSGI-OPT/src/javax/management/remote/JMXConnectorFactory.javaTMs0=_ 2TZ1. (%W1L&+̐6vH{ow?hT"ЉD',\|e5i Dz #G21J 2A +xLI.P$tCGU%| RY( 0nb,, ʋZ%MӰ8'pptj6ߍ~*kL鴟?GY4yM[ 1[)4E/U̗5( }))1Js}UY 30N2 "Ot~=zQt= $о7Kp̲Ze7`5-.|"IʪXen$4ϽѩwB^q==gOT:/# TE85׃.U^"d7l%2ˆu,4hu=ifL6w&CPK/PKK>>OSGI-OPT/src/javax/management/remote/JMXConnectorProvider.java}A0WzjW @[ MPe٣NRCbiZ!;4H]!!߼It,>QLd{q.K|~_̘_+-hpE:Cnk^g +6Lƭl-N@*E* D@H(UG^pIqP[I逦w#/{bL5grD= Z tPpMT%k{PxmԽN:*sf'3b۹'a/0 H Co!8$Yzl,#|J"{0hhkPKK><OSGI-OPT/src/javax/management/remote/JMXConnectorServer.javaUMs0=_ :!c !f0i (%WL{WPCH}۵zYГJxf6a|% g"Dhguӵ0FQ1r \r3C2_yTKn6^՛ 9lB50 .C pLڂYQDLĐ(QBFi5)I1ٛVkX`Jun] "e֭HPkP3OV2b qM+3#-↋-fZk$7;m8jԽ]/ǂ~ opHQ\f* ڹ";rMIg)Is#rJ"P\۶j"Y0Sl貅Z=9[)HQWa* vjY>!CMF?|I!04Rv"҇Hi,HWILTAeRBxx$L0sD]bEu6d<^R\u.,`\kOyc;? 6`aV-aF NE74{T{ vhgs.yDYCfI@@MvYu{8y }^:Q_* 3Һ߾CGB+"O^"L!6\*~3)o]);RkfJ.tEyaߙik,E y'+PSrFy)ѱx,;sU\7,{?=·e\j֧ZPKSPKK>COSGI-OPT/src/javax/management/remote/JMXConnectorServerFactory.javaTKs0>_ 2!1 IsbY[r%d߻2 )mi9=VcIN/@+nC})g"Fhu]۵H !jT\`AF 0м˶5+RVn*)o>Wej0`4oi^+id,S;pO9o|}x~sExZ#0uv Sws>qα92Qˠ6#rjL=P?0 4#YV| z[m:HPbj*N7$j{,F:grpcPKJHtPPKK>AOSGI-OPT/src/javax/management/remote/JMXConnectorServerMBean.javaSn@=T AMS0' qg]vq"Ŀ3 hv߼yfx [Yl¬,PBx:G`<ɕP9̡V9Z BlD?>uR+8Fz@<^P=(MP;d`-KehLWHڴs:n;"p 1uφȼD8Ҷ^%4!E'aLeTQ[A[IX`iJYI}[*PQd҄gW(gGhׂX+igϑ#<{$Hq{!?)Iѵ0ۋR7M@zP_zP'&Һڤ|VR+R[~ Pa+莑[ݸ6H(M Cj(o N_APKQPKK>DOSGI-OPT/src/javax/management/remote/JMXConnectorServerProvider.java}A0WzjW!El@MPҲM'!4q]UCyƃXHuּ:XHLtz_M SР>> g {h5BXAaLJ fN0F8v!-Ƀ(y.:n=#C,#9`z]'5*^,|S[Q1g5u;SDU֬UiJGin|0lXw}_FjbcFQq>(sߙ<ěvQE&^fHx U!Js݃']])B $%/5QB@nqc5w65oe_]z}gGv &hP@c#-=(P΢.MB :w;_ދק@`w:S6[CufM_dEC~nwĀAلѲ3G.8]:e7~{PKˍRPKK>6OSGI-OPT/src/javax/management/remote/JMXPrincipal.javaeAs0WtzLP&N)=*Y%!qN;+@:Io\Ep3ma9E *דɛ1(۰ JKth!RA ~Q?wx G4Xu8A$P@ J]%] <z^m/ |=;ͻ$i6qmȳ%lLO)΁ YN>0LU5Jт *|un-yRVX 6rҺJ/\P0H ȊOliqtLU6/`"V"H7c@!cR@|g$g-MU*G85[n֋\$_؋C\ ŋ-42͚ R 7K$#dGi]7 $$=]eåOѫoC9^^h*qt}cF)SPKQ[WPKK>>OSGI-OPT/src/javax/management/remote/JMXProviderException.javaAs0W); z2iC;qJQq6$tY9f rpFڷ[): pnF;q1AJ U}3 6^i$KfO r- R6hՆ ܎7࿡2W2VjphrGݢG(Zbʊ@PuswN\pCës!Ls(.P2NZ]'E/^VUd- l#Dî f DikN{םNr '#smJ?-"'zaaOlCʂ%{2!SKղTN~\(x?<؋CX ŋ eдk(JO_Z/":8R#B${=Z<X88^7NO+1~PK{2PKK>AOSGI-OPT/src/javax/management/remote/JMXServerErrorException.javauRr0Y&]Xdtf+}Dztu82>Xqo9+ ;}d[*NlMU>Q-FZt | y Q#oR.2hGAm9P`_c3KcY?$::RX"4{=oFLO)o)9frf<}rG7OSGI-OPT/src/javax/management/remote/JMXServiceURL.javaœAs0Wt r2m6 G8Y2:n俳r L3HzەpYYlf RR >~^`|ȵP;̡9Z B\_>uh8G^}PhCP; `->dXH )iR< wfE O n Q6 EK[Duur1LݹZs`{--Wځ*+fUcAyn$!8FX1td媦bҟ mBC/N!I{.NtClx>dleHfSxz[Ce})};)\\ˌKE- lj*tX>FRvY]~(|Wa)4JZ, 872%͗/',-r+v=&U)csؗVf ;05MsL{#orpj$;o'gIҕq"Vs#T5d2}6l PK?PKK>>OSGI-OPT/src/javax/management/remote/MBeanServerForwarder.java}RAn0VqN+̗CN)WW|O҇)#sheJ]H(Im)ٚ:Q*#Z2Z- ,<OSGI-OPT/src/javax/management/remote/NotificationResult.javaMo@W)zLr83qֻfw'ߙu] wgg>&gpiꃕcX0?J$JI |:}3ߎpEtX#u AZ5Y-!E2Nxap"HLJG5F* =FaGkvyz@^ì`w56ɤmXtıD=uz9kn"`g#-W:@LU*Xۼ ԭ^r g6Z:oϚȥ:pۄ ɑO4ti~mX$2/p9Ϯe:Iviv5q8k*`L8ED6Tȍ,4]6$fGVsEV҅:\%+^M#};+Pxf EsfƇ&]|EN#&J}7U/2x ;x)lIEOSGI-OPT/src/javax/management/remote/SubjectDelegationPermission.javaOs0St9S:=ʋbKFf:<9i|GzoWӓ'0r1, iU)%a|6I J9{$L$hVoi#$_:e4ΒA0Fy88@{( P̀) .w)`^m !?;iuciuԺuvqȯ2׍9X*ˉDTRZB̛@Y.c8l6yֿ('#G.ڄ(͑#y6[ZެqVb]Xp\\fl;|1+9ؐ1Uxȉ^ l5$VIVjNl\Vǀ`SZyW iq߂ѽ؋5iXyԴʷEY ➤˯ٜȓ޸/q$[. 3cf׸Q{agW t[U1p0 >9O)~PK15 PKK>>OSGI-OPT/src/javax/management/remote/TargetedNotification.javau0S+ؽRmT$vG6S!qHEl9ٞ曙];Luu22;(P0_c#-Vdh2C2#eiZm Q%2^NJ7xI( J;Ԗ!-v 1A*d:F}[xQ*2~SR:ګ|Qzqǰ%)*IP(BZx vޣemm)aJFBn oo*_Œo:;^p?m[Hg}nFAE1*2~t?PKTuPKIG@)OSGI-OPT/src/javax/management/remote/rmi/PKPKK>;OSGI-OPT/src/javax/management/remote/rmi/RMIConnection.javaXo6C“{2 pw؀(=If+*I1;JW$vj`CIH|YБThdCC;9>Bպhܱa`#5 PcP(4B;e>)4*ͥKupV>:;)2MAHF5?OSGI-OPT/src/javax/management/remote/rmi/RMIConnectionImpl.javaYQo6~!ONI=l):N MlJZhdIEȳ-XD;GϠ惡zx -!8!BǞ4CzG+4A*#`xӀw Wμ;s1U)$@ޅXB5J hnY‹C o3S\6f fs2x,C)=h4e'Pn@c@kbܟKUU ( lYPO4\`Tl'Lsqc5vAF^6 ٘V~p[4͟xZ2n΅w;Z\4I2wv &wrYqBrH&<$jr@QKb 7.F΍#n͆x@Zt}dcv獘Ji)9=%iDP0ڻJJ cPgгI&sxYMjVjQ#IԨ -/KY ؘ<"IEçuSޝ̀ SR;P8r]C4~^ s.c#`QQ֥1KJ˴YaHŌi3dB`ԝ>FyKcQTs['\{|iq׉dTib[VmvTM q^C(zU%VEP#x*Qq%U4"0U2Uvmٍ=E"KLŖ{9u/6}n5iڞ~dZn$Gh;7NRa!F.\e.mlRjDym֚Vq9#ft=.sܮ[/[6N[]P@hmjƌͅٹAĥ|YHEBfUۦT=F]^'<{K],T뾷Hgq cS:~3+%p3Ѝ̆EL\Mw1sqWN оܰ*_4K;}d66,Mʂnk\; ۙ7}?&w"·7{SٞV!g3wL-|#ypI.+´_S"ui4*%od4[?PK&|bPKK>DOSGI-OPT/src/javax/management/remote/rmi/RMIConnectionImpl_Stub.javaXo6~C“}:&,+mQ @K'-M$e(H˿f[vKww'YQTX^B5>vzqvv^4p, tРb( &5>B#c1+=jÕ xtrz\U6,7r1fX ڈ۾SxqHcCu-#sF/dt.h׷6^F{u15y݊&[@c@㗜kʸ;u `#PXO#=ʡinԎF&jiS$4"xӈ¨|~oNѺ #hwn]waEWo QFq>.!B\ $aSSjBO QK2n&΍nVr 9Ć>0I68PrzY.J X0Bܹ JJټK YܻMt7o!LY`)|TX>`S2}v _| O%IKYG4FDZlWmym-Ӧτdb_lyr`S~3WVg};Y/ƺN|*eƊ*-P&LKڜYN,K\1S6d.Bھb V˂P&it52oֈ>"ԩ{-W= AY%{*Sϻ̀iˇjL=,&ݾGb^V^ZC 2ZVk]Hˏ^1F-ܴKȅm_oBXlNoVhbmbqw_]g4yg8Dm\]bc8-Am{+L͕%=\d ef;XDVn#T^";ψ,\'.iKtŠ C;}6 %2ap}BɁ-A^MD2b-nBm픇c̓{!a{:OSGI-OPT/src/javax/management/remote/rmi/RMIConnector.javaŔr0Sp*Htqiri.Fr%ݻͱif{ ؃JZK /I!B}i3Ni`u#g2!Jd2B v<_Q$Y_5ۇb2X5He!3HB$xbjAH* aeőy斓S@JŶm[%1S:&t~0: dBS5B>'ք4X#Y -qZ؂kt60VyfwvHo m\B p~q>gtg ?'c:7>/H-@OSGI-OPT/src/javax/management/remote/rmi/RMIConnectorServer.javaTMo@=_1kHzj qZ'|H4'lbv5E5DR7oޛO0V@+i$2D:vm>"5Q1u yBc HQY"x9K觾qRۅ4fg)ۂ 5ys\@"Wy-fYY903 434&eJ+բ3 8?:\d5(SpEg[`9J،f-ҝVubဖsS2&(>+̃k$*"&(KrĿ&1\za``2>`2 x+8  &W䶜.B@\$> Y-rJ#Qm$04_qL/hPo,5[b+U]"5bFE$c5)&FNaPY!5 B܈*NN~Sզ^A<4W{kr?"mK.ai4ē,T 7--4YCwߓz9B,<šSY#}4:J\įV]#pVtF}d.zLv~z÷YVB Ev-T3)3DK _>v2}ifq_k4PKBތPKK>?OSGI-OPT/src/javax/management/remote/rmi/RMIIIOPServerImpl.javaOo@q2]Hn-U+j&r\ۃuB5DBUFy{oó`Ba|2C/F]װhPo0gE~ Q]#D5OF( l/u[KloA* i+Q"c!!SUݡ5®9'NCS9VBඃnkka4LbXkG<Β[ndƀ_NhrnDXKހ gnB0jeX-RgPl\B/J Nz9JdEnn"-iLxgdz EFsa !A|R{$Sc&V"#kp@($GPj02}u?KZT(-X)DAR *u/\X]?OSGI-OPT/src/javax/management/remote/rmi/RMIJRMPServerImpl.javaT]s0|.'O-v(!26i&BF-0L{OےI?uZ;jT"]YxW,Lr?3ľ@!!xsQ\ `WÂqz5;]%$C V3[ g[ʂ3HRdXXʋZ)쪚Ӡx&p`eTΨrmHWCWe*ơi/kM<'-ndƀ_NhR<+gs⚱j=T5%S KILKRF-Isa"0ȅetZek s&i\Y t*ܜL1_DćNGĚTX FH]{֛-š~«k1"MC{ƸUz닏,AObgE^c 3'_C~iUBh:82=^tY=nMp TU/7RRRyU{}Uc' E{IvtoӲ2gpNn߾hC6dήo HֹbF/uyvjPKx{PKK>7OSGI-OPT/src/javax/management/remote/rmi/RMIServer.javauA0WrJVIDi ڣx kP5js 7o'#y4* j[e0]>,oC2hX1r&Di^Vh"KN %ᖭ`hX{'Ao2t攧pB6Kv7m*aEBH_ (6.a3q&O[(ˢdosH3ؤ]ӄV_ J{-)2Gm)|[ Vg$(i4Ah@j 6nz5o?KZt(3)Lׁ shjN7seez/fXw'e9G bn;/Ro 1()Z8l(<{ u3X^PK~PKK>;OSGI-OPT/src/javax/management/remote/rmi/RMIServerImpl.javaU]o0}⊧P@2mmZ]G'\lU6)sZg58'3^܀aC7M91wn7?4| #[a'>!X8BLP!tsO ?Qi.\mlAzTot,BiH\Ôcn eWJnfObC!#èсVB`">3cV,K9ƾTI+]M{b])j \XNbה D!=3Ҳ.7\$MrjJL6G#Y@1nAXnM r pqa8ppV_;x HQ|Εhr+E(L咒1Sh")X9*AA*ڪ¤<3mԪH' ϘE 3i'N-/"XD2@2"= B<uߝRy_K]j sneCr L@c\ qxGxtލ%)Y' }wl5[ѭQ 3+~+A{9p)A (R*Hf3)+RY3B Ev6 "Dh0) d,Sou]2V98l*qA 3"zDkSr#ݱ;]@l:0%Qp;#4Et$᯵oPKPKK>@OSGI-OPT/src/javax/management/remote/rmi/RMIServerImpl_Stub.java}A0ͯquZN)Kۨ["%lW{dMvw-h+89ĿkQn, DWAU .3la 8a5Į@sF N^d( 5 B)Dmpf0vak4;j{Bk4BT˰ $dnNMgPq$4hr*tUq^ocmc'fJ~u5}X{N= ZqUSbxJ/5ҞU YNv\ɅZ/#Y?/ظQ@sԉDOSGI-OPT/src/javax/management/remote/rmi/_RMIConnectionImpl_Tie.javaOo@S|#w4' jj$pEUe-0ƛ.] VYL8T7o~<9jo, W~Q.Sl:=F]) DhP71rp&"Ei0ZfnF( 36 [ѱتJ,CXR, *v] \* *:[?=tX[}Lڶe#fJb5`~>u_u) 44-Rk[PxY[-Zۖkt60V{eџ (6.a8 ;`y^.ʏ" b#` :1 EF}n.!FCX0kh2yB] j0s6(嶻b.hy3 c%tRLc,22=:P!-8\Is{ɰ(37JTyn!,LnUtv}LߙJ3>=_6=amU[rA^l-CtE 9M!i_mijw%2ȐS }nq]rMt%ycp.}Nl9,xf=.ݟk`PKe<PKK>AOSGI-OPT/src/javax/management/remote/rmi/_RMIConnection_Stub.javaXQo9~>~(Owy"$[]N΂[com/U7]H(8+]g1jx M!8!B8}vuhP0ȃsrC#He~|@mp5 3bR He!5H>  1%j8>>T22g4!!0[>kx t.r[S[WB]z/\Sƽ PGXi*z_b;fy/sM1R 6&y3sѿ>6fƿ ӅV}6=f/jDD &wt*B8!V9$`cRj>B_PKCnF΍Cn^-+s؝7d(q,z="Bmo))1to(22: 2,7U~).W=op3sP@Mddfm%T3M)ь+%N3o!ˆFm1y"i3`B`۸5㯧 )cxA:xsLbj59e8)%|i[;E0uL.!җ$2hOK-NJmNiY1B[jIjdϑ"/VOSPVM.3 uZbw1@̽ Sb^ZZ+d.QOJ-zEcx禃B*,h*Ԍe.me)mr>ڦ- ;`m~^& k-VpI3Vl|1pFum^`h\!ckjl'."g!c Um;N|Yx l%*;U뮷Hgmˑ D zJ L1tP7( b]/hv\%h2rhkzƺ8_H56a:\}PG[b;n_$GVHxZ3p#eoqъ˗#&x4w o|39OŲ"L.;hMWUBjh}/PKW_fPKK>@OSGI-OPT/src/javax/management/remote/rmi/_RMIServerImpl_Tie.javaQo0ǟOq *f({n)iBNrNRT;&G\U[-a:0"/ e0Mc㈹c@u#gr)R3exJ_1|Gm0cS:48[Bm<(>ʂZa7]őMI)dҶ-1S:;\E|+Y1W-4UlWDX ނs*Gja`ڶ\ɄZ$kF*% x~cgr,/«%\Q/y apq,pA/nk8R(WU@µs7Ejd*LZTk#A-"P¸̜M!Jar&G}sF6%J4"#j*'U-ݍ! 2seL9ѩ>JiS"JJ9v!̙=x|#xGxRxbL'hk-AEqO!{j[Ֆ\!u×p=fȿ$<~UHolE3 SAS! F 2 }[:ukZ IV@4'H=OSGI-OPT/src/javax/management/remote/rmi/_RMIServer_Stub.java}Qo0ǟǧ8)2mن U4U.6!Q3a]id~3/8( *e0M'mC2 $hPo`DnE`,P  3DJ%%h2w{B ikQ!.Ƃ:a7}Aőà2)SACDv͕w]xO̔.k(\,[dƀƟ8o*V)fBS0jm;X-֞ 7#Y@cFA Q: ҩVI,W"80^D(^-o42ꃻF;)8) ZLXɲ%B%9u-;VCD-,?\#h?E2Ht5mFC|RԶy( 3(P> :`}й̹E7C' x ;9@4 wx4VKmU(WFyd.Y3B%%潄.Cv%Ξ( [g B(>yPKCN^86PKIG@$OSGI-OPT/src/javax/management/timer/PKPKK>.OSGI-OPT/src/javax/management/timer/Timer.javaVMs6=Wb'9Rz8l-'6!x|BJ,Jx߻8߾}}ՂWp!@;>a'~q&bqw}{a,RC,QhL *0~bt*ͥcm 8_Y,!gs@81>˼͸TyjjFpF=@`]]cwl6sXؑ*f ^y:Fd5(* RflRK;#↋Z͌)4 F4+-5RMC8^ر$nAG0?FЧKw@}l$[;!⊄\H|c*M%KR9E%"(P\i$04Ϲaڨ&Z?3{'gr13OSGI-OPT/src/javax/management/timer/TimerMBean.javaUMO@=7bS@RU2$VFqq\guwq'!z)9yo̬g؇Q,%Ofz7NrGg31*smb0$g<\a e=Cp ѣٱ "C{=m{Gb)JrTH\sDV4*gu(C;#@AinD׿~*Պm!~U3dA])*\RXA"֔U $D"iaTWk'(1hhba׊vRo;PX]'7±eHwrxxw?hu w?\ohR(. i2 ܔsE$LJ*0SQjyR!s9eʌ+VEcCkkV^&Pӡ:4DlvrZdk[ Q(C'N2jϏlv#,=:r#9 3~x6\jCI-H yx5Y sC k eKWHPӬkvy6YBSx4q¶tf(*%`Tωy>mٺfc|Nc>qɲx9KAEwż@E$|dy|nҝWN76<$qiM[)*=[\issɩ:OSGI-OPT/src/javax/management/timer/TimerNotification.javaeRr0< 2izhsI24R$L<{l5@۷0> p+naaZ|HZ UC _#-fdlh0'%)KKtjInMH[QcEJpLzhhKO%+Y詤A*iitݞ+N0\@˧! wڹx}"vmqmvu7Y0ujtҰeUXZ2=H'U!OQh!c @V5-"$nt6KyvS`:447~fu x=;`ǹ($^m+Y5Uu"TzCF#dig,pijH'ܮt/=xJАr ˠ'Z̹y ;^6H-9x70~2~3f#a&1#ΗqqqXΔsS6OSGI-OPT/src/javax/naming/AuthenticationException.javaRAn0BOSGI-OPT/src/javax/naming/AuthenticationNotSupportedException.javaAo0 x))2;mKXqGfmIrxh^6,H$?>)p6'+Ǹ`Y|HF U׳ه)qcBÊU1+;YrTUY!5eL񃬓Z:aFCh4 'b/NPڣua+K2R{3u>J 㠡7^pûD?@{)IEOk['9%w|L=Tݫ߭<afmDm!jK:PwVz)NX 2tM/LȣN`ۄ(-#|NlmyCZ:[X0_:[4,2CGc)[DAtg$g[YhnEM`  2K/|f("W)+gȴve#.mLyv5H1ڲ5DGOr2q/-~zI~ Az<_%"sv6,OSGI-OPT/src/javax/naming/BinaryRefAddr.javaAo@x#zJ99V#0iU=,`65΂`z޼ffp],7<<,T*'Ge~_WZ,ȒQ79)KUZ"R+!^Bp-VCc=ZVT;H\onsӹx'$|Mg7Guh_cJ?! ֔˵̹5U6$zGFqGlk XxJnM_ x?ѣ؉}ĖAݬx+pR sX:) H,!~ >Գ:xLf}/!p7pgw4s5jGJrx!uL9~PKݔ@PKK>&OSGI-OPT/src/javax/naming/Binding.java͑As0x 2!͉4c:4l/F\I0{W&aڙ{o] O`뭑ҡ0M?IJ gi~?|3%"r-sR 4 $kOw+Y4B zUop#JlCc3BVT;H\nӥxu:s 5υöm#')Ak*I2uQY C?ixl Q3U.2fD m JC|紧ntR!^V1ȬqGKȣ?ڄBo"N{qxyz3x6'*t44G;|+>1_!,֔˅y4U6$zMFDɬj1\I'ܾb.h>^&RbYAdE` ߁6TaQ"V4B<o:kg{qqW)kaF!r˧I/|Bb!*KsG !2+'?#z*?}Ѳ$wp'C1jogۣke|{`?PKH$.PKK>5OSGI-OPT/src/javax/naming/CannotProceedException.javaRn@=_154Khc52&r\lkv1ESI9Z7yޙg0lAN:0I\ ]}CZEgGr#TS(Uh"yO4Vj~jZbJCZ RAE#4,N 7zF ͟AP#-^*_Ԋ}m^M8E=nnUւ?4xQDXk.*DfH;Օ$UT &,F  0n # )IMQ U8 ߾B0rdׅqXtqn13 sd L\&lMe2BhҺZ:\.% ?rz9vDJ}%5r)B 7 8- UjUQ}A޻hEɝVčv!~I2]g@F%*:M^K0kNq<#11g%LE願 ):(Pex.})V̘aO^J!ῸN8G8]N|MPK5VjPKK>5OSGI-OPT/src/javax/naming/CommunicationException.javaR0<ԮJR{ Tj&!4V
    !5o eQIP)dkDMbG0d[µ:XF ?+ Js8Jun)l[VNT^u=EoFLgx3 3`:."QEPK'>PKK>,OSGI-OPT/src/javax/naming/CompositeName.javaos@_˧8jKE5cBl]N{!@N0vkK8QRdja|3"Zva" Рa䑂9!J2B vXH?I~6\I8ZPsZ:!eKBn4 \YBf%ڜiQTq$pYje(!x=-]9=V{J'M53?:rXFT!`sPXάrs-Iit27VIn7Le6& AÉ\1\F`d88p@O7oHQ\du@ٹ"Z! CZIDPK2)7n#'#x-_[}BJ|鄮،-cdOiM9ڇGGqm.ionC9W&EfLԯV{1#/ٽ VC7+OSGI-OPT/src/javax/naming/CompoundName.javaT]o0}'XE]ױMbm*]G.]bgC`UCZT[yJ|Ϲk'@-ʡEv亭0FQ-p%9 SH9B7a+ Js)qf Rޱ+BV T#qp 3!28)e>UF ʅL!:͍I7Y9,WH6un{!RD5(rE'+` ؄F, iH:Sp6@˙ɘBK3(>IFhzbc]< 7,ɕ76Uw4^߇z7z5|g @2Q6Gܐ0kI:x@D! TA*ڎUx 3_QRZ`KG:$PDhҒc.c'_J4ؠv=v9J QCW°e^P\C%9mYTK >Bn}zrvFjy_ln/Zu Ol˶',9c??X-Ea[ͧ]vg̳yT iu{}vtnY,yQޖ:vI)Vaw3mcY=2t"et+H~C4CO`L 35OSGI-OPT/src/javax/naming/ConfigurationException.javaQo0ɯ8S; S*5&5մu&C,~>U+,9[= DڶR0^,8,crdTL;YrTSY=!5aܙY'u4&dvg Pڣs P˖@T(z9#%8;/X.~){o>$I6I{Ѻ.[b]U%`g'-'ޝ! *Ŏ%:R5s8]^X J:o#G) IZ +&Y1le}C٤6[Xo\6[<4,e| ئ " Wj} %GSM'Bd'!{.\cU _AIqwqXn"([Zղ@Z  <:yR{UGYLgx3 g!t\Epڣ9~PK5>PKK>&OSGI-OPT/src/javax/naming/Context.java]s8_q+aMڻtqIel6i71W!=2\ $\`-Zj/$O443+v1 ߿YB3RAH3ZH0.K(W4TPseӄ*>X0ꫮمA,DS.4")OhqH4_I3=)(F ܮb '8!ǻ@ z%LoEJŖVZ]qUfyFI.Č 9JfdBK}Zs4&(1s"LiɆ~TFL}spxQ.ȋՋ~ _0s#Bp^]lx~ Kq}.M(r.W"JI$ӄXqAbF%nj rʔYVSؔi˦J^&PV:w2#'Sd]bUĂi*G^ÿ_V}#IreDY ؽ^׍]Kež>4b;n !fto;בW7$:( awre2;@xб8o Zȅ8U߾vޠOY3!P d5vß2bж3t;. LEG ]юm66WѤ@.JCRr ݶ cw+}S :<@/|UKqBcN[hиfbt٠ n*:e@@4.1)Q 3# Rգ'|{0L0|1}s =>Ʉ}T4 IϗGoGUJq1Th&ˆg{ZޔH,N BKEfuMDcϟ`L>ڤ17OSGI-OPT/src/javax/naming/ContextNotEmptyException.javaQo0ɯ8S; S*565$մu&C,U+,9[Y< D4R0^,8,crdTLdIQNUdԈqgod  [M88Ci{Hlt*xHRfD? .yrgB?B{!I@k['E뒻lʋ[UCNZN;C*ŎYC[y{+TN}/,J:opۄ$-|Lle}C٤6[Xo\6[<4,e| Sv^n+ 9C˒5Gm  6l~X+W8("`])Vet;"F0R+O'kj?'/ܫ8?/ Oxu8D |v1?G/PK`RDPKK>-OSGI-OPT/src/javax/naming/InitialContext.javaW]s:}<5i%% &Q؋QcK$12&qLHIbSX^s>oz2Y+ 4Sy9t3#4ߟk{fH cԨ8`AG1T i7TK3hڀiBe 1[R5x+\/$f(V 10 g!Y1Eg1rtXؑ*lGX%yk֠We<]KHϦ5bK XiU/7\-rfL 6OSFJ@1']\>v=kYz߻qw8q /݉;'Wwx$ˈWLnT<fr#I')5,D Asm˪I``a"sLִ%j7lVSr8Wg,Iape2Wln(iзn==RFH\n:e8'5£N#2v;RC(4 (흘Tj.ZH` D~$5>)M]Z AͯʮGe!iTv2^:јwͨbVH[\WA/^ۍƇL )oҤ g"Oo`!nw|;x?1>FWAS,[\a5_]DiV}z<`6KÆlDRщhoumHcT|'=^1.WPSsD}=7r׭گ؀c&wWaI.;0 cR2M?E]wL_*J\?J^m?PKb PKK>=OSGI-OPT/src/javax/naming/InsufficientResourcesException.javaQo0ɯ8S; S*5]&5vմu&$Db>N"\aiڳUc*gXҦQBKzx7ⰌMP:lȑ=R3!@$DK{B ø37NxiLƭ& ΦAGʡR NZ!͡:#%80;/X.@˳o}!I86N%wrz9OSGI-OPT/src/javax/naming/InterruptedNamingException.javaRAn03OSGI-OPT/src/javax/naming/InvalidNameException.java}Qo0ɯ8S; S*565$մu&yHdܛ*ڜruY"m)TI^/Y J 9Gbv&w$B*BjDɟdod  GM88Ci{Hlt*xHRfD? .yrWB?B{!I@k['E뒻lʋ[UCNZN;C*ŎYC[y{+TN}/,J:opۄ$-|Lle}C٤6[Xo\6[4,e| Sv^^_ReT݉P#Yʼn`ȶ҅:M#[.J#}Gqh&2ݎ hdVïC'Or|=EoFyLgx3 q<yv1>G/PKل48PKK>5OSGI-OPT/src/javax/naming/LimitExceededException.javaR0<ԮJR{ U*5]V{tԐvVw bٞ7of7ks{ VgiP%a|;'q8: !,eIQVUdԈfod  W]8q#;T >AZ'3%x8 .0۽BAt7Xcm뤹`]拼XeCՃj9XJˎgêJe-Dm;+TN|',J:oW_860J d"+1|Y=liVkW}V9>!͟5 ee($E3Tʝ,ٚ[Qj}$ كtaV%Q9DQb%uv)l[*NT*_7׿Y<Cq0<v{v6D/PK>PKK>,OSGI-OPT/src/javax/naming/LinkException.javaSr0kR5Yx3GrݲDƀה8S*e y-X R5Қu"+[3N&jTS_@1 0 ?wK Z G2G ~*}pK@6p#v,QO)+#rZP"PKnܱ292ی.rFG=?9Ga[_&j҂O7["35#wZ$E#hԘOeA/Fn_x# '^̓Gu4rCNa,^0=>c\`rn&m(&л1[~w*zKSo$\~ݼbd}/(H{PKMPKK>0OSGI-OPT/src/javax/naming/LinkLoopException.java}Qo0_qT,a}RECA"tUMr ^UfL+<$}߹Nr SmV[a9¢!6$ '/c(XÒ=U1;,I9Ъ,Q?7Y'u<0`t,NG=F6:d:PwVz1NX 6tu/؄ -ܦEVC_!].| ,.l-r^}G?WߍA<2CcCƔa[DAtg$gYr4U&zOVq";µ:M#w z+4J8J&2횧 7i>7t*wQs7yW>/@|1.xn/줯zWPKL-PKK>&OSGI-OPT/src/javax/naming/LinkRef.java͓As0W 2.vsks24 kKT&L{Vv⸽o~BhdsDRR^N(XyŊ,1;x,HY*Ѫ ܎4+eC֍ZJo Sbì DecN{H'U5[ Cަi~3r<60Jr<6][ެqVIN9+̖uN =ͮ סSq"r~A r+ nMU>Q2{iZ,M- o M|~xسUд"Z0Bm֑*4cnHB/=j 4a[ T[coK$eiN:DWx_TĞU< #>=7ϼJ?mpQ;OA PKG]PKK>5OSGI-OPT/src/javax/naming/MalformedLinkException.javaQo0_qT,a}QED>&g;T2hD=;I"\az1.'X_%ҦBla ~atX#*f`r'KR*t" #FNIIp0p4Њ#tʆ@T(uk^ݩH8x,\`x}+yo>%I8Isֺ./b񞩇{ՐsoJaFg^J/U=[ K[0rPbi`򐭿-xHW4_g6[g˜W_Sؐ1eQ] l*VM՝ ޓUl+]VǀUid+𧭿rFI񜟂/Xn"mx(p?D-UwR=-N?@yIU2#OSGI-OPT/src/javax/naming/Name.javaT]o0}n~O0Ubm*]GwNi j<sεiq dR< 93 Իv {pm&aC,Ph !!*0s~zU+MJs)붡nj8+CV \#qp Op`f dU ne*ۊC #8 }E@`]>scVQ.+Rŭdխ+o0CR] j \ XF6# +@*`BZ3Ҫ.7\M22ShiBlo(6&k{~Ӓx/)'h }O`0]zSo͓iP*Jz+ Zay.3ېvzC:XA9~lE ݲgKUhz'P)?vaY7_P8OSGI-OPT/src/javax/naming/NameAlreadyBoundException.javaQo0ǯ8SR1نV) 6MHT04i<`>9׎\aۓaZ̰ʿH$u-*CE~kX%s2b˂* I+ ƝX9^0&88Ai3N::HB7hn?3R< u Z !hzεH #m>km|.Y|ϮǪU0oO-*Ė֢6!sڻtRU!޹^RZgsM푣pۄ$ɑ&yn6xL$ۤ5.ݤgdOfw![б5>۔[DNtaaϖlKɂ2%HղcjH'ܰW.PC1RaMv["ZL4ԆDyYo::R(a#zލ3<!'E>}p0%^PKGPKK>,OSGI-OPT/src/javax/naming/NameClassPair.javaRr0<_d\Crk9$m=͘MQy,C3{Ӂ&fꃍ>gL;C'OSGI-OPT/src/javax/naming/NameImpl.javaUr0=_ 2Ԑڜ܄fI39(%Wmh&ޕq(aJ0w{v<8KU5ϗfWa<>}. S5OPL)jKd toJ }^b*(P$ n W De'vt(N u*%45MVt>X3/'hTwY7R1w5U*a1iUNu2QmFrc5+gړF*}7lczAaԃAFCr.nptN"r6 lJO_ pz5$ˈWvLt"= H2%&< &QKJ7F[fۣ_lKVօFdbjS`iBxfNIDUcpPLNArCρ_ +%zFtmU^Y. ԭU/VZBƄG^V16W4 CqC?ejni:O鸠h; 17QGUv"ēLҮ941X}>ƅkL۷6TYFgdtٴZ2VWuJ .3V ,FPK E PKK>4OSGI-OPT/src/javax/naming/NameNotFoundException.javaQo0ǯ8SR1V) 6MHT0&s{5U+,t{2;LVPaz=ockdTFL{YTS%=!iE$w2VjhLƣ#NC#NPڡ i5RM;Z}FwN\pA˫[!M޹S}qMg2˗Xj~up eWزZ2gN{׽N*; CSJvbh=rP$9|I桇< :62j*M7* 6ȸ[MyEDvlɶTȝ,8:Q*} 8Z2Z-,=t [ 9  nQԂeL;͌pߡ#Uڋ(>DOtg?"!򉣜o/A PKJ;PKK>)OSGI-OPT/src/javax/naming/NameParser.javaeAs0x 2Ԧ\B[O3I39 6jmId  `o}Rr mNV{q9*6$ogS$XL59ŬDeIڑR#J^?:n!a4Fy88AikHJ6:d0OSGI-OPT/src/javax/naming/NamingEnumeration.javaA0˯唬RMUfuKvGl6!Q1Ҧ,7oy&J 5{rAܶ$d0y~Y~v^ia=(-V =BEɟd XRn{l:-Vz r[dPSPNOhgr$4y .м A z|Q4 C(FP&jZ'Mm^1T [ fRڊ3<`ȑl`UaTdweџ 86!agd3gI&Iycil2`M<٦q_n ȑq.OSGI-OPT/src/javax/naming/NamingException.javaTMs0=׿bd\B[O3ffr(5*&ޕ1 I齷k18[0A)2`b)4']p)CVg(ֲ[J x. H4,N <42fl#̭U_z|V+{Ŧn(GIu\d L%`H ,HgV:Օ斋 Fl4:yRڣжa¸_8>M>LhbO`8ni8h ~M"{ps@2sE$FQOɚK#rZ#Pܸ9/e:.y=%[-k2!-Qy75(2SC|ߟ=yS!O,HZ0ҭoY\Xw<֮NZVPh)N8=<ë{_2?,%8RV!=4R.0Ys$ߊvΠF[j, [`i}}=d6&y`ݙ |ci'RHo-$g PK9PKK>6OSGI-OPT/src/javax/naming/NamingSecurityException.javaR0<ԮJR{ Tj8!4VT x^ O!<#:yҕ{_@Oћ4”8|)(b}_PK~\JPKK>8OSGI-OPT/src/javax/naming/NoInitialContextException.javaRAn0U^pV{ ( {溉LQ6:ShZy:ET._^@OѻD Iqp|#l l~?PK~GPKK>4OSGI-OPT/src/javax/naming/NoPermissionException.javaR0<ԮJR{ 5]V{tԐvVw[Dlϛ73/U+MsyBZJhI_fo$XÊ13;%I;*,6B6LSF:ai4 'b/Nƣuaj%5JC}3H}xp /~;wIu],zűUR.拼XfCս9X*ˎ7'UIa`,De߼ ;l}',R9oզ_861J d"+![ZޯVi+̗mΖ9> 9o бT!Q]Hؚ$אT[%ٚZQ*s {X ,M _+4Js8Z&j Y /ÿCGOtqoɖs>?E'x3 <.xl l|PK7WOCPKK>2OSGI-OPT/src/javax/naming/NotContextException.java}Qo0_qT,a}QED>۳w2`ϹNr smNV;q9*6$gSqmaE쁪 r'KR*" #F< 'S Vgh8Mn[ J{!!б$!J7N]@ N80 .0ھBt7Xcm9k]ryxϮ{ՐsoN]b^A[y\wVz)NX J:oM둣pۄ(-#|NC_!]|- ,W/l-s^}A?{NA2ƆlSv_х>[rJ%GSu+jBd'!.=OSGI-OPT/src/javax/naming/OperationNotSupportedException.javaQo0ɯ8S; S"565մu&$Db>N"\af1f(iJ*zx7ⰌuP:ɑ=R3!@dEQNdԈqgod  [M@u8Ci3N:UdeV!|)7xH4d"6Y_vȸ M"JWvbNVܚj:}$#µ:6XL+ ?,W(D#8Jun)j+=Prm9#'UW8?7m:P3a%_pv1"PKCVPKK>5OSGI-OPT/src/javax/naming/PartialResultException.javaQo0ɯ8S; SinrRNju*C,U+̵9YY<D4R0M8,c+rdTLdIQVUdwԈagd  [M8{q#[X ޛ~ן3<zm_ !;͇$.=qm4gK"/ozW 9KZi9afmDm!jKuRS8l*鼕_47#G- QZ +FY1 &~tJu(\aouy iY~;q:0 <" >#9Cʒ5K1`l^~\$?qX={DpQ6 h_ <:zR~#z ^vOgOΈCagCsPK'l(>PKK>&OSGI-OPT/src/javax/naming/RefAddr.javaer0EWajhv-+ `L0JJ2f<ےŒ=p6+G`}HZ U!qXÒ1^hTI~CH([Y'mVbˬId[ynQxpK['eyV-)¶X8#+E-=S"wȢeC;ag/ȟT+foɱ \K 1^PKR$ PKK>(OSGI-OPT/src/javax/naming/Reference.javaUn@=_1kHzj*V#0IbfƐ(Y!`7o޼G0PZlat` L'ޱ| \&i`Ӏ9OPL)j ` }5'>\6\I8 zvVsZ5He4H \%XXE]aqJP3(S 0ۈ? knUUJg]y4[Rd]Hƀ%l U V*PXάr+-Fm4:[=h֟6&-Q;hu|1p2 Ghx4FA8o$˨ : ٹ"Ĉ[j#9O5,C@sjH`hϹe u=|nؒr{E9#!̸F7hsupĨ99oN\0Jb=;MĹWJEpI?>P0M'`4Ě9QP3Hև#URr@ƈ`+MhL:pp(-I'~ni߈}9Y٥pK{} D _2dzѶ d)DYN cݻI!\,s&AOji: oU?ܱ8\C3A921vPK:PKK>,OSGI-OPT/src/javax/naming/Referenceable.javaeA0W<唬RHDi"dڣ!qKlj1D`˞oJg#ôaF UŇ9x8 52i%s] ^Q,Щ=!nE+}'Ldg PڡҢ N%RԇvDuFOQCNp-D7B޹S}8ԦK:z|~wpeRڈ@Ԇ8洧tRsX]^2;iEnLȭ_'mBaH >yϽsy9β8& MlMʧ/|O҇9-:tj12ED7 ٖJYɒ[Su'jBdwAZ?Vˀ;/ȃt W EA>B?QB% ڮ`0G<*2ߢɽ3gtootÏh5PK0OSGI-OPT/src/javax/naming/ReferralException.javaQo0ǟǧ8)fZlEU}4p[b{ ~ ْCy~w>gLeea`5g"CO&|QahPo0 [!eO|p)< `4u;@H A ^#6Ce Zh-Uwq$p{23 P*l=bVh hpM;`2kZXάtԭ斋# 2&j6iF*X@mcaQ2oa%3V׋܅ey%U1C(eJ voBŒ?:a@5yM=դE`)2 Y͌f7@(rs m\ABAn f&%J(l-Jl+-۷ʺr_~ߟ|߉E@:NBGm$/zw*K:OSGI-OPT/src/javax/naming/ServiceUnavailableException.javaR0<ԮJR{ TjZV{tԐvVw BBy3D\c\N,>KM#* ?1V"GHU AUhUE~OH(ynFIp0p5nqg(:b鰓 N%Pu>KPCo`ûk D{!IE8ֶN %|zڨx{0[ڈBԖ렺KUOwRVn[ol5c @V1-bHftJu(\auy iY~?qd܇N,S8/SDAt%a/RdT݊P#YŎ` cu, 49OSGI-OPT/src/javax/naming/SizeLimitExceededException.javaQo0_qT,a}RECA"tUMr ނUfL**5ls\ETcX(IM#* <6A$GvOŪ˒ o %1~uR+\ ` F7q-v=ZG̐P ޙZ'ԧ'xz^m^ !|ol7_XIsֺdMgy1Ȯ{Րs'^! *Ś6%>:Rc80tu/BG-؄ -ܦEV![}_ܯ.ifKL]9"# 0۔!- gKP)7T݊P=YIձ*`^sFIqο؋CĎY7iל"FBy@jv DOrڧC}8 x2Cqw셝QPKlQPKK>,OSGI-OPT/src/javax/naming/StringRefAddr.javamAo@W#ٖJ%GSu'jBd'BKf'+oȝtJrA =FOb/;m-l]9mȎTe/sa^ƾ9񹎽0+_3lyt!T4 /;_rDCMnSqV\gIȺ%PKD9mPKK>9OSGI-OPT/src/javax/naming/TimeLimitExceededException.javaA0ͯx+н{JYFEA"lW{4&k;1Ңjo<'p6'+Ǹ`U|HF UƷه)qmaM쁪 %)G:UR#J 'S Vgh8M;=:G̐;X n`~3P< v~0}~ޛOI},Ύcm뤹h]拼XgCՃj9XIoO]b^C[y\Vz)^X J:oWȣplBaȊ>EVL1|[=liVkW}V9 ͟= 0۔!- KP)wT݉PYm `0l\QE)+2.2ݖSD6--jOUO~ :zR>Gx(C8|7APEPKr8QPKIG@$OSGI-OPT/src/javax/naming/directory/PKPKK>2OSGI-OPT/src/javax/naming/directory/Attribute.javaTn@}bD85ZQ{0]ww!UƨPT3s̙;p =Oq G~q&bfN@W-fjF% rc(D YL:҆/4MШCֵXl B(40b p\5yէFLƐS(QANoD`&]:,]V1vJ;&Wwn /u]5j \5XlJ\3VTR3Ҳ.7\mrfJ$\ŧmˑFM ٘A5QۂOn zðaHosۀ$UD[97[qLn(c>1&҂\4\۵j"X/a::68ݳ%[-MHHvbJztՌѲ}SKA DW.n?XۛSeR`Q7e-;F]UΜ}xwvON/ٵs<$M"Kf=Q'壩ҾlcI^k Sj׃܅OcR4-@RVAuh>(*G~֢wY- pk>Ҏ-O 5`m6FE#Ԡ_ &BݯT֡YlS4lq~PKf#0PKK>@OSGI-OPT/src/javax/naming/directory/AttributeInUseException.javaA0W<ԮJR{ TjZV{tijHmc;Mwi[!Dl?M̵9[Y=D4R0M8,c+rdTLdIQVUdԈagod  []8q#;T >~\ ^ !{͇$.=qm4K"/oz8Q 9K?[i0U)ڈBԖx@Y饪pz;a)Ty+ 7#Z QZ +FY1 &rcZ:[X0_:[<4,82C'cC)C[DAt$g;YrknEM`  6GOSGI-OPT/src/javax/naming/directory/AttributeModificationException.java_o0şɧ8S;)l"F*5ӄxpԐvVS;Y<IJ};: pK],7|yN"*)TNO&Q藱JY2;*B&xȵIY*Ш ܆"+y8 `4n(XbXˊ@jm[ktuzwWN\gS!Mwƹ"ڶ E8ԦY^ԍZH5ŊV6!sڻntRcXv01U㞄#~*؄ ΐd${m|?Y6^,t2W2<{8Ç$82Cئq>"2')ksklDI(PJղc*Nn鏾|(8oU>Tbˬ4sa͊D^ >>:{9ޑ*SV Dp{\XŒuNoG_PQ_lrQPMUMq|,`} PK@vPKK>3OSGI-OPT/src/javax/naming/directory/Attributes.javan@S8[  F9Ljﺻk 5nD-,?0VVSOa"LW0whP1YP`P]!Hѝ +jCJ•?KuGk'U5b RY XR+ $!Ueա5dWmNő}+8]pAoDn+k7a4h}a5Ûp<+neƀ5i8ق* A*Gh$d22VSR~3 l b|08pyv`>E8a6,pG{F [}pSi7csEjd*LiI)&ZZ<TK2n3'SPIV6t4k4<zk(Y*:a?:z)xف0LoQfI1j=:Džخw%Rwwvr.Q}Rw`LǪӴĴRe!3\*6iU?3龯/Ny*Qcɗ}Cjz/PKԾ3^IPKK>7OSGI-OPT/src/javax/naming/directory/BasicAttribute.javaUr0}._dMKI!f`d( ɕd.߻2N-M2=g aM!8!BVTK@綡" Рb#9!J$2B vЌYH Wj^ .  GP L$n`C-p ę4OuơQ8#@Lj 0Nckl6XSzTXS>ڝTg )#*,Ť*d* 6HgV93-53DX]3^#@1 f~f%Grv/pۃnnVٹo~U$(c* ٹ| I$cȇ<(a#TĨ'ܸjH`hplUKTMܓlB\^DnVE#'BH)38OSGI-OPT/src/javax/naming/directory/BasicAttributes.javaTn@=_1kHnmJH4q fS{]ЈcTH U9`7oތ?\i-,tyWa &9Bl08?CAY@ JpgPj d?P$:@JUPHe2H\xϱ $pUZESeqJPegPi f[oam߯:`@鬟?bM*dTY2Gc@Jh8]+Ig)iY J4ҝUNu2FG3jVvǴFj}@1 0(EDHnn$(2FN_ o{_dRHpv>N s(ɔ\pjMf2D-#(Q¸8s4(e ={ݱ%$++*:*%?d^0#xh[/L -%{BkGbʹ!U*G6^!ނ@\Ilh+-AVy~띌C^Bv+o%HVfA>V+J_7_b[qC]C_2Q& s<ʼz+::fp58z!`M8PKqoPKK>3OSGI-OPT/src/javax/naming/directory/DirContext.javaW]o0}'XmR lDhj&\]gÇ]T +iVhs9Ie ^B[K'S  }#;8XrRV~촻=XgN?.Ih ,&V׀AH`4a=\hR%z$+-(k]q$EP]p2ٮ ȹ3?¹=ؽu?vqNG`.2ʃXD;WUqX(=>I& L eD Freʪo`rtuCIT/ŠXHXOnzZa)NF'YQe[PkWs^ds1U@:-r1MgFlqj?4l8JBo Ȥ7$A^>X!sAIj&[[h:OSGI-OPT/src/javax/naming/directory/InitialDirContext.javaݗo0ǟ_q &({ZbhH=w?T9j:>9s_-[hxhl䗡}C΄PjGʎCjC V(41B#f>}do*R@ݩAW򱕘"6! $Ikg>_Fq6fT, \gr`30dؘc:N;R"VW/fu6R5(pEbـXC6;#-TqŨZ͔)2FAbvH6&^Ŋ\e^wt{vZnv34:*dYlɭUP.t>rJFrJPE˪ 02!a&Z& /+t&lj~\ ~ [\5083TAӳ[F(^ d)į/NN6-"v:L픓)LmAICIRHmz"953֮Q2[ < w7a*m{o '?| A/u_䳄G*4 0LOSGI-OPT/src/javax/naming/directory/InvalidAttributeIdentifierException.javaQo0_qT,a}QED>;w2/[b>>N"\anUc,'X_ҺVBKz60?NⰌUP:ȑ=PC0S.i#$?:e4A0F`q2-m%Iucc>k]ryxé{]sU;ޜ bì`,De ԝU^j gMj2rbi`򐭿-xHW4_g6[g˜g_SGucQ] l5$VInMW9{µ:,M /+Js~8Z+.9M=DMZJҞ.w=]"z `9 #zR Vq<agsPKoPKK>GOSGI-OPT/src/javax/naming/directory/InvalidAttributeValueException.javaQo0_qT,a}QEDh>;{2hҴ<IJ}s\E4'XN,*ula atX#{2fB)IQVdwagNxq& N^Gaj%5JC}3XuJpa6^\g۷B?ͧ$.*ZeE^,޳Խ9X*oN b^kXy\wVy)NX R9oզȭplBcȊ>EVL1[[ޯVi+̗mΖ9Ͼ ͟=o бB[DAtaakΖ\CRmtՊPY!W.\cej_}BIq?8cŞYqiJo&j Y 部U!QDxNtKw9z70MO:ԌC,q l@D+PKs`PKK>COSGI-OPT/src/javax/naming/directory/InvalidAttributesException.javaQo0_qT,a}QED>۳w2<IJ}|w\E\c\N,JM#* 82VA"G@UNUhUE~GH(yvAIp0Ѱ5n'(:b鰕 %P:w}%q/X.|JbIsֺ./b񞩇S!`w+-w9A*ņYA[y;+TNo}',J:oe_ 860J d"+![[ޯVi+̗mΖ9Ͼ =o cQ] l*Vܚ[Qj} #{µ:M# /+Js~8J+8k{LGOSGI-OPT/src/javax/naming/directory/InvalidSearchControlsException.javaQo0_qT,a}QED>;w2Ҵ<IJ}s\E4'XN,*ula atX#{2fB)IQVdwagd2  [M@L8A3V:Jj<4f) l` ϶~0;OIu],zDZUR.拼Xgé{]sU;ޜ v%ņ֢%&JWS80rުM/B[-؄(-#|NC_!]|- ,W/l-s}A?{NAסccClS8Ϸ֜-*ɭ2;BCv\Vˀ^y7}BIqο8cŞYqiJo&j Y 部UYr77[SE$s']KV/7m<P3_qv6 PK뷓`PKK>EOSGI-OPT/src/javax/naming/directory/InvalidSearchFilterException.javaQo0_qT,a}QED>;{2hҴ<IJ}s\E4'XN,(ula atX#{2fB+IQVdwagd2  [M@L8A3V:Jj<4f) Ol` ϶o~0;OIu],zDZUR.拼Xgé]sU;ޜ v%ņ֢%&JWS80rުM/B[+؄(-#|Nc|X1]|- ,W/l-s!͟-o бB[DAtaakΖ\CRmtՊPY!W.\cej_}BIq?8cŞYqiJo&j Y 部UYrwjOv?Isn 5/?m@/8;/Q PK"iZPKK>9OSGI-OPT/src/javax/naming/directory/ModificationItem.javaAs0Wdg(8>Qmf8(o * 'N9Hz'`Ps0.&&! tzM" +Bfe Khe!Ѣp74h c/ G[T 8TZAT#SI(Tܮ3xx< .м^ Avqu]$zH*OZߥ2_e^h-ْ7 aZt 9;CdU[ ަ$ mZ*ߌI7yHן5<$U\̳mN%>B|/6ȸ>i'`LqnrW[uB RɪBh$OMC_eԐk.(7.)a4 avyBQ J߾L6=46(7(GC ^7cL7dex#[S;/ƾؠk g#KL_LPK;UPKK>AOSGI-OPT/src/javax/naming/directory/NoSuchAttributeException.javaRAn0AOSGI-OPT/src/javax/naming/directory/SchemaViolationException.javaQo0ǯ8SR1نV) 6MHT04,=U+,t{2;LVWPaz=/ckdTFL;YTS%=!iEø⁌Z:cqk2Јv,1CZdMcAT(tӎzCid,|o\)8Ҧwbz~ WPKNPKK>7OSGI-OPT/src/javax/naming/directory/SearchControls.javaSr0=jHZ8--;$t:¬! {W!޾}v=j T<]Xhm/|!81B;~l{&i` 18QC..*o:pp%AUwÒm@* A..eVJ[s(,N \jf%d%U 0[.٧nw^{P)vk G[R]f]Hƀ?9l,#U1V֠4T#YT5\0*k̹r[3mZ6&G0pGèHӯOAl8c_HQ˴drgv!$$j+dԚLs"jZRG^rjHI_P o [;O%qysr3Jo, F2#d:^ Z SH%JZBqE9o1ƛ2= 0NLLc~  g_Qpt{#.Ն{xn׊^"s/}{Igۮb/w3~P}^A\ڑTH͵!jLF\ޞ V3& VHIзF*s)ٚї@|OmWͦWY72g9<v^jn#PKdp>PKK>5OSGI-OPT/src/javax/naming/directory/SearchResult.javaݒKo@WeTI}U")Ucƙ̘qܨNFUǹ߹Q#zcdtLqUIrB<AØJY2k*"V"2'e@ 2pKB\?]&72Vjq4BTop%6JlCc5BV˩v ^Z+r7S$4t nxZ:ݳt8mqM9vx]LҋLu]48@LY+BԭN2 C^5`iliM(Ii&iElOE gy2O>}BW1S&_TvJUxMk#P[ 3 f<ه?0E.m/IG?$48$DuE{?1|{ Ww?`.C1jZZ/>`?PK JPKIG@ OSGI-OPT/src/javax/naming/event/PKPKK>1OSGI-OPT/src/javax/naming/event/EventContext.javaAs0j!j ڨ5+ޕq2LFۧoѕW0SAbc N>Rp"'wӰpJ 4wL"Ei0ZfnVp%a⏡n7:a y(pbeAHHնa7>#C-'9Fgcmv4j-t1*Z33%5QwU+Y1g-4u>*kb-yJ/4ҚU Y 6\ɄZk{##~*ظ^@&HdLx`e0pC=0Rd+: L<"$g:" SZE BPK*[aܱ̜M)rN=m4<3w|K%/w(ԫ5eIY9fn~hnQfq΅%ZA|͖ߒY;O/H#6gwl$ NV7cO iwJd,jt(Q2:W oxغ?e-n24OSGI-OPT/src/javax/naming/event/EventDirContext.javaՓAo@WrJ*c)$,*GS qXcgkvv"gqERg߼ތ_8p3Y/6[AYr&Rd<OSGI-OPT/src/javax/naming/event/NamespaceChangeListener.javaRAo0=_)blC |;=@} Ruq~g+`#I󺱰,V>sږ3Q ,w>*pː: ˀȎ( Ћ5!Rajå` KX[Ս8:v!-Ix.69s-#8#Yu fgX>8Ra{ƚpoI}Kg֝h'`\,'-Aj`Fڳҹ5\>Yّit2%7V/J푢_6&`eg eq;ew(Mo3ا'!'4Q_<*M<"d/,Tl(,x &P J uǍVCK'[fWAQߝ#1#S}N]Rmu֡!n2;A$H3fZQYb+ka`zM%/Ŏr|_PKhflPKK>0OSGI-OPT/src/javax/naming/event/NamingEvent.javaTr0=jezp M{dr{mɕd&84Ҿ}Q Fliw!8yΙ:tu6,R 55&1X)QhL *0K`1=HPi. t,݄ݑVlB(5אb, p\e]aJ (Uf4WUZ#UϷXݟ$&Iuu)r.`قe )fU])nzej*$\ybڣFj}@1m7?jéQϒ\rlsA8/ Z}7~0eT e; ڹ"DO$r+IԚJ!drJPGPZqmǪI`bir↙z/[jϿ,-[;Gq9FaF\$uhb#$۠Ht䔆N.n16pd\o'c ћP j"E ZӀ리NO"c\$v m̓V=;szIah,fjЫ9/Vߡޡ p<tAyd%OS0/_kJ :VzJ<ddh4:ДJG2_zݨ'; l;G8jPK6PKK>9OSGI-OPT/src/javax/naming/event/NamingExceptionEvent.javan@S#jHn-'jd$L؃캻k3k($hwgff| 3],<"!W*' /&%5>bI̞ r%sR 4 %ĵ7+E4 A8n(XbȊ@9R!׻Wkvuz7mk'8\pBͧ@KwsmHtƑ6:U23[Yת"kao# w>@l5V6!~s[F:޸VBZgq'C{v_؄ ΐd|$yM^&^.t3,-d,R>}GW^@<2CJ/y̞i0ѩ9؆v':*PMUS|y 'PK;;*8PKK>3OSGI-OPT/src/javax/naming/event/NamingListener.javaeQo0ǟǧ8)2lCU}tۈM;V5*Xw; J Սym n[@߮VϋgZءEcPb ,рkb- ^~$܆+-YupgAg5BE- HBzB5cIœNpͻm"7A_E0b$kMNJ&a}c ;u0+~/APKR]%PKK>9OSGI-OPT/src/javax/naming/event/ObjectChangeListener.javauR0=唬RHf5)dڣ̖خm Q1UVm9`gn`Psp0/ %!Kjn ~6<-<ɖJ+d!֢e,KJm̦lq)Ϊ8T:AjjTv@Juԓa3x%4q > $z|Q4 C(Fš2M^6&Mo޲ԃlZ0#Î3ͪJQV Cdj7" {ol 8$8O'yL_=<ƻ]MYz,|M% Gsw2yE_IEXRM%[M'Fh$;H_eiHNq/_~PwO,zq 82W=Jw,96|Y[x:n9^+0?ȟ^GxES{n㿡fKPKLq $PKIG@OSGI-OPT/src/javax/naming/ldap/PKPKK>0OSGI-OPT/src/javax/naming/ldap/BasicControl.javaAo@q[!Ia̶vw΂"U*yͳ=H7b⋄L)Z/CAo2*=,ɓQC4 ]!, *C#pL4=hZ*zdH lmʰ9\" >VπUQr+íQpοOcq^N۔%Lx^u`-i~S:HJcqn"/Pɰ֣MJ Nב՛zP5 GSxO 0|Eo_^]0TTE~T9 Ӡ&q6{uH?;UQy$PK4[&8APKK>+OSGI-OPT/src/javax/naming/ldap/Control.java}Ao@W|r"Q-j%$];U{g U*y[gAjva^º̐(Ũ+ia6>PC0抴z]#H:3UpKֱp<fSivz,=A#` +:Ty` w~732OSGI-OPT/src/javax/naming/ldap/ControlFactory.javaQo0_qTY}ۘVeѪ s ތU]l*&ayHb{|̴9XQo< g)0L.cQa:,ѡaB UAH +1|EVpL`}i0n`!ik!px ޚ~ӫx5t3Z`h~ݳ޼۶MXGh[׍768 L<"gk}BrX NTݰ;A.#*Hnꕯ8(A۱}ؖY13LSRJ2ϸ.δV[cG9 G G?^ Ffpo1;%[wwywW7 q }(]JILp+?\C)A T#1~PK u&-PKK>3OSGI-OPT/src/javax/naming/ldap/ExtendedRequest.javaeS0=obS*i)')"VtwB$5]Ŀ3Nli3~gr-,>Q (sl:}=~~־š,!#x;T@# 2vƜ?}f dPf`Ч8x4CX(EM@ǜ!!W{Sku}zz u4GB@דsdҶmPjRk.Yib{Y`G# +ޞ5q\klA[#*]P0##ϝ?++ fl<;y| ˯fWoFϨ^IO]\b0X>`АUc.J>+~PKgPKK>4OSGI-OPT/src/javax/naming/ldap/ExtendedResponse.javaeAo@TAO& `Q%R=vew]' ;ZჭݙyN#6gô6Đ-* 79,۰ v>SB㒔 :U H +sx X+0 4gPCH4A-J2XAfDsF@O.[rYelGH7O%۬@C'c!'zP 3TrͥXSM A*q]V'UipPE +yJ8 nY9YƖ ߠ!Vl;Ov5q. 4ePEPKPKK>/OSGI-OPT/src/javax/naming/ldap/HasControls.javaeA0ͯx+ZN)KQWA"lWL`C@U{!+-n"`z1.&X_%B|a ~atؐ#{2f` RJ$ '$F*S|'Vh(&`q- =ZG!*T >~\ ^U~lu],zXz\n.WYzéGՐs'ޝ! SbǬ-Dmk^J/U=ӕ`SJܵ*Fc $G9|LqdImʱ`mxIoiv7qd܇NƆ S8/ $g,x4U&HVD0d҅ku XFz3Wh4"w0%+q`)YDq'[ {Zyѻ7G'j/ZݹYY.QPK}PKK>6OSGI-OPT/src/javax/naming/ldap/InitialLdapContext.javaTn@=_1kHnmF.*2&̶ˮƠqTQi};3y7=h/,/B!8)B;:40AzY@dS3(e!,XJ&7Ԇ+ gA.ՄZsQ%,P$ n`S,,p ZEӠ8%p`eΨ|?mD}[UUjŁyWrMwq2|K+)x[rM6 Ri)fS]in}0jn+dXg=ڽFj}?$$J|rM/WS'0FA41>C(42u]$q\@\$S>)&Z8[ KnrD]ϣ9r@?يɖ^Qh F #IcbDז[9,Ȉ* E\.G4ǴuU#?z=jBqAi.YX0.b?j%p/q 9 |bLf־*-Zsh K!a?h <ۀ5}7^K"i|ك [OWgKw޽s1m=7PKPKK>/OSGI-OPT/src/javax/naming/ldap/LdapContext.javan08 *Xj[4H ]UMd-خдwqH2IL.{#!Aյ`# c7OC+-dhl! QZ,pkH3N>BI 0`t{A*Eb pQ;^nS < r-4*stY;N&mۆ3&NlWdݯ5Z a&+VZVwNy'd5J2SX5('Gjy$ |<r/?wK,J<4Y8Mht Qf H>w@y8EJuP(dհ R[4:f#?VKb#sI_~IP?<;۲](نXa]0}fEQRjM4=S492w( {SN}x#S'BW-5@Q-t6-]UO' lT=.Ny |vOP_LGQ_&cb0;} :Hʤ3a{c"%;Y}DA7=/֞|& PK,vfPKK>,OSGI-OPT/src/javax/naming/ldap/LdapName.javaUS@\?T-͔:~<^һ Hd}VD%s'&Bp&CnS?gH4y@UĐlʙȽw'i6{E wED{ L76IV2#~jj4B A$RKE,\,)EWM тR %A_d(˜Q3*Yyәf+ -0Jb z#ҁ22t辬kc& > P(l zfb ƨh9=8)nYG9!OMbgJ:fM'N켺ri WagiG9OSGI-OPT/src/javax/naming/ldap/LdapReferralException.javaQo0_qTY}[VeѪ pI.[=!}!J<IJ}|w=< &J(fWqU 9Ab4:_WZ%"bor+r eAܚ ֘JE4`- A*%V"]NځmœC硖Y|@lZ:[;/æi"l#eaum2=SwdEւ?0r*%V؀2!sS7F8!Z yBXgIJvG=3rJ$Y>Y>YpqH0"<qߒ:ȸ0qn2#: YMX[e%Ad$wFX oSpڥ|apο/.a*P]/9J%7BF9k/vdamNe;m'O "Cp[4oЏ&J:慒ܳmt0kǫSkzUبM i; PK#PKK>9OSGI-OPT/src/javax/naming/ldap/ManageReferralControl.javan0EW ~$BVHj (̖&Ulm]T $/;8FkaօEQ@$*CG~e~^iasF*9*GnU`삍:ߘ `kGAtnw vDy_PK$ &.PKK>7OSGI-OPT/src/javax/naming/ldap/PagedResultsControl.javao0x)Em 1*]W bjP1MӬfheC"۟?^TW{#aч4 `"@GaO+-,Тa\jUATO4Vh#6 zR?{]ÖAiEVB"]۪Ck۴t.n;;NrN* }6Uoio6%JF]e|.Bx$[a!Vhj]5Z(JKo#V8کgA :F1ŷdɫqP9BrLҒ~Z:;-)CU[Q<G֓.㰌JL9A/f#t5);{.A rfAD>692Y_[SO>ZV\;{_fcxEi$G\PK IPPKK>?OSGI-OPT/src/javax/naming/ldap/PagedResultsResponseControl.java}_o0şǧ)2!lZDjڃ\WcgCʪ~]CZ!-l|ε; u5\9fW!2? s0Gf#܈jUB+SDZ!n; G5vP[$s^WFn}Й$素kMユsէ^iw6eOw't\nDkZJmW*ymii1 UF`5ܠ:##E+q8$e&i!wvw|O$ƳUHfS}xz*>Xl _)Bx`alX%B7h% ZX #Z8vCGFNA?2bըS]q ;I pt8-)CUcV/λ*cJMyf| dz> N?;cKtM?Lktԣm;Ð dtflؚaCP,+lWn $AWSU+}T=PK?8f8PKK>'OSGI-OPT/src/javax/naming/ldap/Rdn.javaQo0ǟOq *hN2ʶhHq.=!UI֒Q6@>w`Έl0O \0' aXL hE.Gi1Rhm"87CBcpzUop%v@*E"G;ځU[JMݧU$pjcΨ@i̵g> YM*&׎.tLu[u)s ,W;`8[k*PXfԕNlV] zTXgĪt~3 dЋ|8zxm~hfx|<^@4|HQO@ټ"$jF.ւh2+Y-IFS`erQ\:7 ݲ- %+H+S]J9#E*kD,PP0A#X.& m3>98_"w!xjj>!i-3U.W,,"%~Gx[pTr.\+Ly?CIHZ4i]aЕF JLK|SPyy [4A5MWVwrFN=^kuSYʗ,cPKE~PKK>/OSGI-OPT/src/javax/naming/ldap/SortControl.java͓o0ǟTCJ"NrolUwt*eOȾ?; Lt5\9=Hү")W9Bt0@=a3-Ѣ`H\jUB*ӧZ)@'tP7[]ÚoAiEB"c Ek[iU< ܵ:s9TZNZݳr7MiS>tNu[u$Z l "g*y/ RiO*Czn:#4텑Nq(8EiEnŷf|4ddv/dF/*]2:+OR# s9YSeKRo(r~ /#Z8v[GA >B??2פdqP殸\rLqђW nE9(U1oZOK !;eF6cC6bgW# 72%Ґh5g=&tw'55{UK’Ktno W<p| 9~PKs<^GPKK>+OSGI-OPT/src/javax/naming/ldap/SortKey.javaA0ͯx+(S v aڣIةЊ1d%[́o3pV[n",(% p}ߋCˠtX#"f`r'sҎ Ժ %$񍬓Fc N鍃؉#tHECNͮjsZ@ì`Wk!o`4M,ı@]npNflۮ{9XYKSbͬJ40{J/uه3K[Оyk&4:I4cY?7OSGI-OPT/src/javax/naming/ldap/SortResponseControl.java}[0_1 \F]DخVUL2Nm,Z8d)<>sͱ}KboDqN;0O> \AwWZXEÌ7)**CntUU1^3m/TP!}pXNu^PK9{~PKK>3OSGI-OPT/src/javax/naming/ldap/StartTlsRequest.java}Qo0ǟOq *f:mhYa[*H=ތU;)j˶HcmN"8KS,싄X)ɵ@>}aHsth3R"WRvCsq5Ln:i4!tC@Abo*=hrHJ* ,=H l~ݬӪk5s PRo<og}a0[ c\%4%6Z+t,{%Q $Vk0xa Ե^ά|-\:o/L{bҟm\C' :)ΒDnn4OSGI-OPT/src/javax/naming/ldap/StartTlsResponse.javaAo@W8ADHT-iD a(zXlcv1E5J@$@g|@'00֪dIЈ0 *觩:Bhv:צa+Lѡ]c,XܨrZ"3Wwh2NE^=7{^bkrX-hC;d `RD( YeZhYΩT< ]MngpߟNY0 a2d< fdW?u092z|S \Z$ Bbh5; J9c/"I#_~PV劵DˬW9G reDQCfL 5⑈myr~}tJN]f;`ߡgBt9K*FDMxgX SҚb,dT6wη~C4ґaw2w)t=xw`^Ǟ I80 ;OSGI-OPT/src/javax/naming/ldap/UnsolicitedNotification.javaeRn0 =_Aj;YQ;06hs$M} On'#i9* n[$._CrdTIEIRȀK>BI 0ɘAqLg*-VYj#[ Ꮇ'@ͪJܲ{P19'd3jף!OS v´ %Lb"))Y?d5@OSGI-OPT/src/javax/naming/ldap/UnsolicitedNotificationEvent.javaN0իuin*nR)C\ijڞ4Twqml;;;p mV6;J,Idm+|~:JҰUtX#{:eB\Ɋ'S$V8KCd<$q=:G̐["!*7Z/n3R nGx/^m_BQz7gS16ͮEQ.>xZ,7GVذk+zh X3uoVn:*<M(Ly9i5n*+reqeȊ[ȋ)#>tol5eQR'%g[YhDCh` XV~z3Wh4"W݉O3+mka#m8JT`k4$GPh$@THy٦rsGCaD`x |V,%ԟ&\ao T׶9ltвkv{]nL|oC:Kje1PKo]!PKK>COSGI-OPT/src/javax/naming/ldap/UnsolicitedNotificationListener.javauA0WrJV){kf5"$]сLKl61V7opKφꃃi1M n@.ϳ/C2h:,C&xȚ Khe!֢aܙO4pS/[ٝGU GqA*jTv@ uԣa3Rxj<^ A_P Ce꨹hmN4_}d㩝lZ0% 4*Ğ6e@y)7Hsr01%Yghߺ{_ 86!a${cm1β8&6,7CM6)ϾB>$}rd\O&8/9╅J],YUTpknEP@9j`1  7,sAD'NGfM)]=Gɩ94{Ix8T9od9C7<JE7)*{dX ;Sx gPK4hۓEPKIG@OSGI-OPT/src/javax/naming/spi/PKPKK>3OSGI-OPT/src/javax/naming/spi/DirObjectFactory.javaeAo@W|# NK5’q帆ow`lU*1cv޼W\\'#8*.!*)T0N}O-)-Ѣ9`3y*94*GCjkZM0h2s'^@i"{H aM dz_h]Hy[,PWZ՟ðm@tā6eXZ>e.3* nቷ'5SebˬhAAvԭ$U ɥ%# G-؄QB[ƩLqOz%xj U7*;g' #}X7cJg"!G5fF>Q<hҺc ;J% .r9rF/ { l-g^l9Iy!j݉91=Eop.sA%(.Brf{'bn\3kKAC ݑ _nۯMg ": gets-iμPKEoPKK>2OSGI-OPT/src/javax/naming/spi/DirStateFactory.javaQo0ǟOq n/Ӫ h# vf;TwZʤ!}w?Yg0|+z0MHBr%y6|Z4͢dOR`4M<&(yq22:L;]Oc?6]PK3`PKK>3OSGI-OPT/src/javax/naming/spi/DirectoryManager.javaTr0=_ 2!i/m:8I39 {1JJ2ɿw6Cn`l۷Oypc]nW aQHRht=? ^#-Т`\ *BK_'+`}Pop[]ZlAiE@KRAe'nXX vzm(kuʹpXu Ł6hvx'q2yK]ת@kJxQT,Hk!jDnbNH'UKW LI\TnϴF*9l zaQ҃0Inn,$ "GӘ.!o[_dp$S)B'a[IT.eJ9B7hU%|fLSȵt5KuqϿNl}Ě[S$ o~ܡ n^wMcYIvr 9:~j?E{{BQ{0:ӝ4m-f4:_k=!o\e(NoJ6:.H& k"Eji׏_ʥI *'૰+?w\ ]זqnuܽ$ hќƅfyϥk ^sFn>#[<ROT B7x5F$ , Ra{l]GPKU>PKK>8OSGI-OPT/src/javax/naming/spi/InitialContextFactory.javaen0 S9%EfgmVxi+ NW8͑4I{Q4$>tr,9[V7iUI0>LA֏8\:d:X#{], AKRvЪY{`)x0BG_Wx("WG< ;ȴ[qRLd+1gJfڞ%zwQ;&Y0iq빉}8M]:icPKBa3+PKK>?OSGI-OPT/src/javax/naming/spi/InitialContextFactoryBuilder.javamo0Ɵ_qSR1eZEtEU}8Fl6!Q}g¤v+ Οw\\XL`Y~5D%ƗqmXN+rdMX!KAZ% ~G*1|'VpLaFCi4na'PC5J6td1[b/JX`,nu,xu Y&:0 q%+J!!+)ؚ[ j} {XnL#ң.Js~=k%Yd 'ɡysa3׼s(V6A9zDӛqHZ/·1~tVw5kNg(PK(NPKK>0OSGI-OPT/src/javax/naming/spi/NamingManager.javaUQS@~.b'pҠ5S :>&=һ qKb[Δ~6{A_e+әVԆQCOd:?۾[CA'Gr#ce Q$rfjbrHe!7H@.#,p gYfqJPS腌M 0[.3kNQ>+JQaM<-ߺ?st,#UV PXbV9Յ[0&j>V5MIhB& U09]N7`h $!=Box _H%<̴s@2+g"nIHT%dGdM9KR@-dܸm5$0v4Ϲe\z%4T-җlN\xS$Da$a56фK&,Q;i~H"M|fLRg]h ʎ"߃R˼tV/;6@lW[)k 2 w,^Lls˅̺x}~e%UGJ] Bg eE~F*w[~|f#N1q9>Oe9q#n@`3fEVqV{͔0apBxCxVO"ұ [c,th%jNfչN <<8)ǘ\Xoѐk4~PK PKK>0OSGI-OPT/src/javax/naming/spi/ObjectFactory.javaeRMo@=_1Ɏ(8uՈ:NdF9.xvw1Q7^xp+NW{ biCTלa/}Y°q6hPp ;h5=BXA1/ԆK`SW0SAd ;Z FcPF:n1CQ9Em!0;Kv]q uC :u/j44i& "Vˉk:XrV:֝斋#K1fǍ YFsS@4s"dgJ9P2 ^򂤉eB%)ƭy-}.7(<zbv k+0/=$fQ֜OXVXO}p= )0]黒s|Zt+I}bHup޺ 򯾹)Ӳ3:oTҾz?PK=`PKK>7OSGI-OPT/src/javax/naming/spi/ObjectFactoryBuilder.javaeQo0ǯSR1m˴VU}4΅#g5aR߹&n9Zl=L 򛄴m%Waz5_@O3aVq!0OSGI-OPT/src/javax/naming/spi/ResolveResult.javaSr0=_ 2ԐZN.3I39 {1JeIdɿge{V۷" *38g8DBp&3x|9z--!1xC%s46f}~\I 6L+OSGI-OPT/src/javax/naming/spi/Resolver.javaA0WzjW! nU*5]M&@jiZ!;4v!C,oyv|̕>'iHa|3^7/+-Тc7ZYEH(xvBxDcII0Ѱ5̼QGAk=BE  HBvz@m:'Cm`gչo~]E'椵}:_d5Sdւ-xsfmDʀ S3H!XUN6%YghӺ~3rMH%9>$y)]^>)Yl.rX`ux]ȑq/OSGI-OPT/src/javax/naming/spi/StateFactory.javaeR]o0}*OI ͞LhhH!]Gl6!Qk¤fǹKx:j^,LwQp& b>ϳa* lРcy %tD v)V5f|p)`a &cj2[:eGBg07x(PY ٪Zn38&2b2*gԠU/fG÷V} þ60TkxNGb=v=;Iq~UrڰVkuL)=3Glc&Qq6(3߁<ۇi f%xAU8MuQ?$hv &wvJ(xADݱ{ԂBrj``rG>r@l`-aF񥧺$,њ3{VX}p-c+jCVrQN/{W)t73;ƿҟfJ\ӵ~W2`PKM8ePKIG@OSGI-OPT/src/javax/net/PKPKK>/OSGI-OPT/src/javax/net/ServerSocketFactory.javaRMo@<׿b "אZNnBZH4qYfqP޷MHU9Tam73cx[Ul)OSGI-OPT/src/javax/net/SocketFactory.javaRr0=_ 2!i= &(Ũ1+qvvrJ}%۷owxLLy*qQ(%Bj4 ׏_#,ѡc1'Q *"ĥ"!|Gp.=TІrF($PٕZѶӱx%pq5 ~Pi:ͷ%*? u]GQ7d6OgYuVXY) JV%ŚcA9Fƫ"P-,zL9j]љi5r/lЋSH|$ =]]]\U2Kab>MVbΧk-OC@ci},Sy;.Bx&acZID6Jri:D=ZAvoc)N꯺|a؋H#Z \,15/=1xWZC(%gp4F- EAK[kjעŬ0?Gn,UVb ''er7AoTrءM>Nxi:@\?_O8?y`̑UA$1B PKIv>kPKIG@OSGI-OPT/src/javax/net/ssl/PKPKK>>OSGI-OPT/src/javax/net/ssl/CertPathTrustManagerParameters.javaQo0ǟOq *m\V3课B$dο'96ı8TnB7 xFn!Ӗ JIoQu]W~ŞT#׶㷌3h/p?K,ϊ#nT!^PK{pPKK>7OSGI-OPT/src/javax/net/ssl/HandshakeCompletedEvent.javaSMo@=_1#H=9m"0iU=,`obv5E5n !U*3޼y"]lL38$!sɕ@]i|&-1x,ΡTs42M _X>t|AI3O%,vPZ$ia!s\ ,HB/FZ%]ViXi8q*(k[5+sxUUxim h0JoIuR9Z ij T >#9@A9UWF:.Xp7i:#g3F}l aq҆a']OrO/WS'p4 'G4#λdua$Sz;[qOBo%\HA)BWhM~=M.qWz|nBǬZE9#A]F~H. VwHJ'sVdz[[o;{=Y -~X=ؒ4;¶PegO~$I+Eɂva' :4vjQtt6Lq,wjsK#d'k$gHD4;(]fteMWӞݛW<`_=7=׮G6{tzPKg%PKK>:OSGI-OPT/src/javax/net/ssl/HandshakeCompletedListener.javaen0 S9%Efgm=i  NWشՑ4I }QW4$Rtt ,>j|A4$d0],́ׯ_gZآEa2C֔X@+ 4jX12_h,) >a2&;8R9h-2, 1G$Gi=z3Rxj ~T~LFW;EQTQsε:YlUdւ?-xYU.=(21ސ#Y d}.L[ 8$}%Civdf MMʧ/3Il6I!CP$1rnMV*աh4~ЁpU_P8]hmsv6cM)xƏ̴xť;k6a WJ|P_!U:ac?PKɬȍ'PKK>0OSGI-OPT/src/javax/net/ssl/HostnameVerifier.javaen0 S9%'m=i JW(;͑4Ic }Q42DR??Rr lmPn/ PJ:'3R"YrNт? FT21DVpǖ0)5[Awp(sHA-[ 0T N07_{&FbmZl:D=zV-:tU%JbmEڂh,R@[jbpdy+_F_@ CgA%=mwE5mmmNo#c@0a`#^! VN4>U4Gµ:V~ }+4J|~839G+Fṛv^#!}*n80,1NnIe|8p1C[PKPKK>2OSGI-OPT/src/javax/net/ssl/HttpsURLConnection.javaTn@=_1dGZN*CaYfqP!CJhgg޼fօSZta/Y&e . ci` @p(d3Nۛ&|Cmpw U#8*` as!#܂2R+]T}( o12JgTinIWV,ːUCV5A{b  Il ,'V͈kJPXrK-iےit00VYakp$ d ܍@h:xN~ 1FëhtFë& YF}1N!FQ %#sIL "jZ"Q/qc5D0q0X l:<|~p@?ي=mhLbF6p-=%%rL ,TU˩]hUc]T6ړ~ ӔY{뎞+hWJ$`^ yȔ>?yPK 9PKK>*OSGI-OPT/src/javax/net/ssl/KeyManager.javaeA0U =lڢ ]с%kTwPiW`do7Xk3Z<DuR0]/EQCAɣH9ѫ,Qo,񝬓Z6^a4[Q8J{C:4#й"!*}4 gr $x< `x׼B 7dX\cmۤj]7yyӭ'Ցs'ޏ*gN 5`]RV{&1OSGI-OPT/src/javax/net/ssl/KeyManagerFactory.javaŔQo0ǟOq *h߶>e-ݢvP`%x3vf;wB[ m6;G+#&o ( R0'q]+0hq j!:҆/h N.4}B5Z^XJ;(, Y^M*j =v-i>Ojg\)2dKP#WsI-Q׫nDkBx\ˉ1JV62sSF86X2amfҟ'mLA#J N!JEnѧn0^! (itQ.y,}p_a o窋 n zds"JSY2L(r43a}[-N3[Nm7 }gsZyŘl.]b)2;m*F;ޑpsC,܊'93r"/-Uxm\xL A_iT"M_B1dIu:k%]aBSxxzNsLY!Pl^;VKneti_xI<}wanoҾ*oUoilWIf\ =57$!O'z> 7 ϚIl<̰:t͊՜I1y|\ PKb=GPKK>4OSGI-OPT/src/javax/net/ssl/KeyManagerFactorySpi.javaRN@=_1)A\Ԃ:(Ea::7hf߼y펏83]wF,WD%'q0|iaN̆<ɵ,Ш Q_W2Vj'0SO؁K!-dE@[A@uKk+w{z{tp䁚K E~smw#mqlfUY ~5ҰeX*KZa i5IU`ʵh:#;FAA S%YI9OSGI-OPT/src/javax/net/ssl/KeyStoreBuilderParameters.javaM0ͯqMZJYm"lW{4fn;!Z;~wf\Ep]F[}>yQ@*`#G7C ǰJ hv 3QY\Wk4i8!|EcVp7D=Tx6B"c@(ສ;kpcS+H(\uֹ]4MX2'Mfd事zP?0TV+VUV;'T97af-3bE^8OSGI-OPT/src/javax/net/ssl/ManagerFactoryParameters.javaeAs0o8A46't0I&ŬZ#a2];L|Gڧ>%W07ɪz1.'X_ҦQKz68&q8*(VxC0W%k[tz~H[*7TxdѸgh(&7d:m<:*0Xr4Jo^ݹH*OSGI-OPT/src/javax/net/ssl/SSLContext.javaUKs0>_ 2@nmN.!')di&AŨ1+<&ޕg:yhvQӕAMԡ>KDr%jǭVx3 Z4sA.@eq 7ES.i74VjA jޡZnU'b3( HD&: %tPR-OSGI-OPT/src/javax/net/ssl/SSLContextSpi.javaTr0=_ 2ԐZN.!')ti&AŨ1+1L+q2d>}vQG06yeU!&=sQ)px 2=Bf$*Ap^ DLD SFI8tP7)`++ІpZeO0'PiMaJ0K !c HjD׿ Qq0(2tnp'S1yϪ]W:CBYxYYU"5% 212^ui)5ҢY)GV- jG#I H@,:){xyvh>x"`6lz/ٔ E<=eLvyNѡ+C6j'ϳ@96e6Α4MϸJ+H|Zte#X/ ؗH&E:c3WY*<7eΨUkEv H~LT &BU( |ZS'\[I}sF}PK!:7PKK>)OSGI-OPT/src/javax/net/ssl/SSLEngine.javaVMo@=_1TԐDma(zX`1~(C0|z͛fw|_БBhj`/܇~C;9!auis0pQq9! cb 7 Js)k Gb!-4`501ބB9K j)7ӬNU!GQ8~MVt|n64Xؓ*jynn/~ EօQkPrEbqY R;#TqE-'&e ̘kȚh :?h8Kxڿe{0h~7:މ?=ڽ+N$D&wr.BX09%`' 0}1$ȫq@X!М`#eL_oI#w3[; 3/(Cr e\ZV.s%oiY@shC][zJm aLWE#SM6 U#[湁+Bϥ*Vuvի06CN`evWИ;]K&fEs])r}*Cͩ=;z.KAa~>\>}|ոrGѪΐU* ɖTZ/PKʭ&i PKK>/OSGI-OPT/src/javax/net/ssl/SSLEngineResult.javaSr0=_ 2 0vƂ09eY# a2{Wv⃭}zJn_;p *- 4Ny|u[MCbԨ8DR*9Gf,OSGI-OPT/src/javax/net/ssl/SSLException.javaAo@Wqu#m~͵"͗#S{U0;ޜ *ĆYkAǜԝN*[ CަiP%9|/I7yH߳5*YylYKiW$GHw!GucJ?-"'@W$P!TՊP!֯2`mjN꯾|8xο/qHoQԂ|1::RQǞ\2S=r t'5OSGI-OPT/src/javax/net/ssl/SSLHandshakeException.javamQo0_qXQFCA"tUM$^UfLypd\; pnFðJ$u-*<~ #WZ,ɒ&bo2)KjC"$(𛌕Z6c~kNQ؉#vh-ʚ@P]ӣuUszOC`gK!O_\-ĉ8Ҧt:gTMVN>B4LU5֢6!sSwF:޺N6i]5#Gpۄ ɑ|O4ytuxX1Y.lr,.t.2@=Wݍ@2> Svo9VlCʂ%{2!_eN:NKr >?{?b/"Y[O]sQԂ|~ϖ4;=x+#z-4Y!ŒC< 2BuN5PKק9PKK>/OSGI-OPT/src/javax/net/ssl/SSLKeyException.javaeA0ͯxDV4{k9,mEA"ٮh! vj;1*9$7aۓa\X_%Bta~ #WZɒ9P7Yʒ I+J '|'cV{h83oq:K!-!бA*zht='7N\pA˫ g\)ę8Ҧt{TCЯNxshfmDm jC|洧tRXu0m*i݄[plBaH>'yOsZ|[=xN$+EU*$ a:wy"r ٖJ%NԄZ(-~+oȽt_qf݆cD#߆Teok"VǾ(QΙ2AivJP(CioPKU -PKK>-OSGI-OPT/src/javax/net/ssl/SSLParameters.javaRn@<唠ऽAO&-`Q9URUyq6fw7M\H|̛12r-z%{<﷽8\c:&Ȯi3C 9iGszN~IH*Q񅬓F8:m; Sc%6ƣva!n #ލIPQOϼƛ¨ڿp9܁y^?ni΁sPK9k5PKK>:OSGI-OPT/src/javax/net/ssl/SSLPeerUnverifiedException.javauA0ͯxDV4{k9,mPj&`C@CVC"o|o.9YEEU"k)TAޏF0XzŒ,;x,HY*Ѫ ܎4O2O2Vjh A8'b/NPڡb+k jBMI;]< zq ^m>?;Oqu]$đ6U\_6Y3u_V5Y CZi80U!6Z@TiO餪Fz:a۔:#7?F~- A#i>&bc\&*X,1]d*]d${4{xd܇ Sq^n9 V_lCʂ2!_er/pW|8xο/qH'Anx(jty>Ad֊{q{*gAttJ{[qsw{g#*y 8a[N6vFwC ^_PKmCPKK>-OSGI-OPT/src/javax/net/ssl/SSLPermission.javaAo@W4OSGI-OPT/src/javax/net/ssl/SSLProtocolException.javamA0ͯxDV4{k9,m"M2NmV;T9${3I"ajcXX%2%ax?$lc+rdT%L$B+;Bֈ?:i41A0$XL8A{HT:xH~ww $x= .hxBo>iu8'֩h]:ϧE1{}գV,jěDT0-7K]wRVnZӴ?Zm@^ 1+bLOj-rrW-5_<@2 Sv^ak.HRnet݊PY͉АK 6JOpQE8c'ΩIԴn#J%(߬4jvwIW0a_K0T&!IRpw9Aq fx%XPcVxWDQPKW7PKK>/OSGI-OPT/src/javax/net/ssl/SSLServerSocket.javaSR0=_S¸NrrCzJN0d{8*11ZCm{s *6X8f=O\fݣ0E5L})Z4+#b$"Ci1Jh-b3kOB %(@tڣNSUKTCX2L-u+niYh9T8shz/Zo~uFqL/7 Gc6zK[ԙ,Z0&N5xJZK^2 tW],Bjjn:#mvF_@q A:!f =y2<9yIfdLO!_d|eLl▄H31&Z4h4KaZ- =M)q׼z0o+~Itql5>,;|>2*>P*S;oHі.X2Bzfqs.ska\MDo{ܙ];v ށPKoT5PKK>6OSGI-OPT/src/javax/net/ssl/SSLServerSocketFactory.javaSn@=_154 @bIa f㠈,i#>Zϛ7アW \غ喠z4dUQ]װK N!̴Bp Y"dN*~>|E5p"ְ0:FWh\+Ѵ=iYo9lA6@Ԋ>]["a0h&'ũ:c`s1}˪ۮ[Sag=;. R`lzGIn#ZEh5K& t2LI 2Ƌ$_9n ×|>rd<Xq񅄍=K hLY{C!5uNӫ|A$"AJCF dƥ"PdBDּ+Y PO-)!W-&uEvT{D4 ީ)}`kk& ][YϾ?&/PK)PKK>*OSGI-OPT/src/javax/net/ssl/SSLSession.javaTMo@=_15$RiNUQz=6.^ww!U{gCҪ*#Ͼyͬ 8Zs -ކqI/`GhzgEsa:)K=bp$C13CŨqO:p׃4fQU LY( 0+WV ;,N <*rzKvl-ͭ?teYzR)vkà?wκ$BSXN8Hd%( ,HgV9եVdiJl4:XET=Ӟ5ReC&\av}0ޟN,0B<fxDo=`t$˨r: ٹ"{dr"Z҂ZΨ#Q/qc5$0v4R,e  u #zdK21HY 0Ċ~6N()ZcpU$ P=Og8;QJtr3MF*t CJ_.LN?j\*6OSGI-OPT/src/javax/net/ssl/SSLSessionBindingEvent.javamAs0W 2.vrk}"245V'M<1@Ҿ[M<\a^7G-˝X%Bf:_mc* dH,eNPVaw91~6V ]h83gq[h 4ʊ@95R!̀I .GY !?;kIuZTk&xHgT"cO+5'Ύ S"cJt5Dl;-TNhr64VˬgC؄(J#FiC!Zd/R֘x^}C!r9GSe+JBYH+N^w gSɽ[rF9vFO CE64yMWtRo}+UR-Ұ UDŋi0,:oE8=\]0s@޾[cVU0+`RMĞ}4V^Ţ3E.䯞PKQPKK>9OSGI-OPT/src/javax/net/ssl/SSLSessionBindingListener.javaR0=唬RHd5"RtG6Q1U=-{޼y.;Xl::3؊/q]T9~0^?B ;C"dOZUwD6V%>\&ci2{gIAiE %cԌzraȡ3'.Sy FwtE}߇rPjSEkMZbU]U`WKgg eZkك6 +\sګ 9R.]/ z3&5c &DL`D=S=)tlwڦ>٦| q ߒqȑ|iw2yyE7J}d̩B;4AD?eDN/?( '!;*tCдȉ947b#p_*x3A5x཰C:uu dRͰ xn ?PK"w\PKK>1OSGI-OPT/src/javax/net/ssl/SSLSessionContext.javamRю@}^OtS1nU&fc|B ޡ4<3s=3װPASSX&!sf>9~ni`=( 5-BԊ?ceQRn90K魓8q,tY T#>IUӎzۡϨӨ2+.<Z۾þ185}X&YFc@㏎4O@*{EJ4r*dIV30d 2VSًNys&$Lt4NgN1|\=l1Zd/SXaJMJx > #>omx"^X(ђi1rMV*C-y"hQ7dܱ6X8[rB㜿;ob'DSzmqE] >4Oq_([]9RYC7◯oB+uur?`'QYuCJ?^PCegߞPKSPKK>)OSGI-OPT/src/javax/net/ssl/SSLSocket.javaTr0=jHzj96R`LӃH$0{WI0)cKo߾}Rm BOf+œFԄQq]0FjGd#cE XDN \ 8:аrZaV \#ap 3"u. Vp3wuJ.K 95%d5 fJ77&nE1ؓ*iX0#eֹHQkP;:e*bS⚲(=#-BqE-g` -L̵Q|hw !a>a,E09O$0Co4< &hH_^`x$ɨ^gv@4s=E+frMIg5,AH CڎU¤| 3nQ_PV#,/dמ@ivkY>%MqRF4p 7(b\V~S{)i0R݇7p{A؆DNLuZ4,cߎDZɢ,ť΄/Fm=0DZm;__-,%)yKG7ÁUb!ocLͣS)SÕ {Ct)t.nJqgtœ>HS7|3 M) 5wJ\ yvv7 `C[>02̋?Xsk|٭k՗ tOk2z/(]{0OSGI-OPT/src/javax/net/ssl/SSLSocketFactory.javaAo1_1v)ҮIkō]E/RE*=3{6Ë.`bj/`_$JIBr4}_ a)D)P{\C lrthFЏ ԰&@4T(a۞өD4L8sڜ6tن`? Md%Ό7d6gDMjރߵt<D%xI7`!ՂԍA*o6ZdY2k փ9+XE 2&X9!÷b>M)2:S8 acHޢ)Țj^!TfN#vk2JdWjicnM_)nxBa]+57<y0e@wG/sPKh FNPKK>,OSGI-OPT/src/javax/net/ssl/TrustManager.javaeA0toh6mQD ٮh` n&$wPiW`doӛ7Xis{6P5a~\E J-9Gjv&&{BfDͿY'm<fSi g= Pcpҡ=N5P냙F>K +/X.]Z'˷|Lqq!NuCZSOUOAZ:CEŬ-Dgk^J/U֏RiVV?Fc D^)+2&Oql͊].b)])xYoyq82C'c)CWDIW$gy4 #tHVD0d҅gu ^r\QE`S)Q ȉy7BOEPKR^pPKK>3OSGI-OPT/src/javax/net/ssl/TrustManagerFactory.javaŔQo0_qSX}[tAEjڃ173!]C蠥T w=NuQ XJGzvaFh,p7)j !.fXE=L'ޢ%Y J;(- w BA-i\< 6z-()s 3s8vؒ8&ʕv/ %fյh-Q C'58dh,7HsN{'T3W1f*3bR)4I;&^&80ppသ!E28Rh+O@—sEH2Br NT^! 4Af.o%b.sˡgF :F؂E ]d< rBe.эMi'Hgwp)v}Mv-h"-,u{GyIͩ+a3F)Qa se.&6OSGI-OPT/src/javax/net/ssl/TrustManagerFactorySpi.javaAo@WrJޠ'ӦjI8z 8fwǪߙMMIDyYN"8sS,bHʒQ+xn~?6̃-8VP,5AROw2/d Az`њ6؂6jGV\NQ5(:zߧs $yGTZ }WFibYF7dM uWuKr,Je X ¥؀%9&P7=bά|M[^hh%@ƆzIiփIf`r.>ptN2|6Hl*KHpN/@22CʆaϷ<#XI4]XfKVK"n؅ku7H#}-bM>v6OSGI-OPT/src/javax/net/ssl/X509ExtendedKeyManager.javaA0ͯqUXRPUՃc6خcJC/!=;ë`tcDuXde)htoWZXEuDd.8Jk -BOW +q4Ro0`Ae<(Q;n{ڧs$y13Zi9s:u]GD)S Vkd:KkV*a(qDYN%A`A9k#EVm\ zΈrMH6&gd=xgIzdqqxU2`"MV"{GKZFA0og{!^ lTd5rɢbBh$%f'?VKkoSp̝77It$UNmSp7!y$-mq.Mg6!}|٫?'8 [QF'@1V)3YSjt1B.̌"3ոЬl3,޾:0]e$Ȫ,'p7eu PKAq]3CPKK>.OSGI-OPT/src/javax/net/ssl/X509KeyManager.javaMs0W&!%$ &M36jJ2 z@w}׎N8Z#4}#!.Kɕ@ !kL 3h֘1R"RA24qtޣR+8cC^ .DkXvP[$ i!%nVWUHT< wz8s*'wtzEM0%fQ˵u2OsnUւ/44^ b-y/ RiO*B:w 7e2iFO ۸^BU&iE,̓q dL'tz eHQTO@۹"! ̥TQk4& JZVK)J:WO g1kˋd#9v w\Qw2{X|yR{(Z[ј)?aeEMj ńxvq6=gw=S=GǟucޫI@w1Zq ]mC<ť5|ӟp߂;PKUCPKK>0OSGI-OPT/src/javax/net/ssl/X509TrustManager.javaSM0=_1]-ReY!3Mͦv'M+g 7rȇ{oUW0rK0T#X4$UQÛ:ߎDXe@zXGB0C S"$TwbkkFL`~k0m`'`,A9&սVӶӳ%s5IK.ksIկm qu}:g%Lރvx}Y*%׬-Xt{diҦ a)' ][#[?pl !&<$ardtb EvE_o!ɞCŀCC)Bx!acO|JobkldP=:ÎF>ճ"TzIRhEs & Fu91B<ϯ&+x( tBSBq[]OR=؝naU8 D0`P~ {&q@"!S^gS?HLϥἸ(ZH 5X7|d|:F/PK1#,PKIG@OSGI-OPT/src/javax/print/PKPKK>0OSGI-OPT/src/javax/print/AttributeException.javaeRn@=_1inmN.HEUivwAQDDy'\TzaX`^|cHQÛikX9{H$hڐ%H +cx X+'0 A_nQ#(u$ↀ%;KoOszz(p#{ѧg$]xRk['l:ˋQwTC΁-[q>QUZ6؁%yTw=z NWCKf[^Mh/%@bCȊq y̖%0OSGI-OPT/src/javax/print/CancelablePrintJob.javae0 )4=;%){B[ 2M=: RNwGN9$cׯOR`Rs03 Ҷ%$~x3~vA` IT+T!5BgZGZ}iLd gQAiC 5"x R͈֓? uF@ϣ.`çZs޼Kc16I{Ѻ![mbǬGբs`gG;. SIQ2k+zDcc^ޒ'byKeo[؄IZ@VL}Zd<!OSGI-OPT/src/javax/print/Doc.javaRM0=_1)Y$['6- *vGC&[bU%T07={r̴9ZYm P%~:0~~2tCu IQk@[Ȉ?}g :܇Szo F؉#(M8d`#k$/K(ˢd/rH3<^i| ȑ>x0;`y:Eo$lI3Xʍ,ٚQ!TzV#0hwcu,pij$[˗hO&+=)8D΋n\+xw ܌EҥvCQ7s^bώw).[ ˎ uP0Nmda^Px'OSGI-OPT/src/javax/print/DocFlavor.javaQo8ǟO1i{H!msGJ `Khw~JBR[}?>3)a#BE:WL)Mtn AB,U;ZX%&F0..[q6"Bm!Y)rEGFBC04O.W5"i9c/w$aW%9G|0-?s, /S%& H)G #= ֿNoZT MmQlT*_O/~mCŮrW CPףj_I4>}DԱgYl|ӬF5Hg5\)OSGI-OPT/src/javax/print/DocPrintJob.javaSM0=_1ʉ(d&iK ]@6;&d4r0͛7oʁ+fx5SXo8u͙ܛZ_L} EjHPxBc(P" 7xR?&dzk)ۃZ5F\@.w(f;Yx9df%4@`f=|[cAžTUP:XEe.1NԨ5(rEg{` YFZkփT*tfU+n<в4=Shi YkL;jOd0 S (,}y}$a)E1E!}/<@cl$[;SLB)t9/yNeB%;T:Վk;VM KS7 [}Bϟ-'ֱGQ\[i322JF^=z'3<$/q/4=+2 *i%:fީ1Y)pMBT?+j9l)CJJ/}R;`w \@Upd9+PKK>-OSGI-OPT/src/javax/print/FlavorException.javaeA0ͯx4{kF]@W&m]!cH%Vo8p6g+Ǹ`Y~V U<$atX#{]IVЩY=!3߰+Y'}28Fh,κAG=C-[*2R3/ ./zr [!/{!MOą8ѶI֥۫OlQL=ڨ_\ a[fmEm!KuR51}/,tm_KplBa>fe^9_^nxVXfbeGd <qd| 0 q^BHP%kYqiDCh` mu 6&OSGI-OPT/src/javax/print/MultiDoc.javaA0WrJV){ksIڢnA ٮh` ۵MHTwLhhd7ogCA&ۖ,Ż9,۰J [hXL*QZp{X?$܇ zd<̖qVrYdYESI(AzrHNyd .м hzxQ}(ǡ2M^6zHV4߼ecգlZ0#g]`AA>sʻ 9]/ zLE*:w?qsyJv_xO6yEo,bj,GM'FH4Y Vҁp֋|(8C)Ԇ[+8DˡuV%\)Cՠtpz;BRam/o$+/PKwFPKK>.OSGI-OPT/src/javax/print/MultiDocPrintJob.javaeR0=唬(dDiKM*vGخmB1!Rr{o'C&D- Y"Lnk2OSGI-OPT/src/javax/print/MultiDocPrintService.javaeAs0Wtz$8LQ΂# IY%f&>#ӷOJn"6GKXN`U|"Hۖx|?2=V1;VЩ --BjPx  .Xu;q=tك"A@ ޙ'=3x#9jܚj: 4zVqG`ȅku Xv?-+D+{q%"ӕ"ւo[zZh= ~nU.We.AZ_EPKĝ8PKK>,OSGI-OPT/src/javax/print/PrintException.javaAo@WDOiS)ƷlL=TMVx}hkfEm *CsSwF:Vo\' yRZgugCȭL Q#Giztyq}\&*X,1[d7*]d|${4 A<2CSq aOHBnd{2;BCf'_er'p}Bqxb/QcrAӮy(jl_ݼ߻gHD#{ sxG*OSGI-OPT/src/javax/print/PrintService.javaTMo@=_1DԐD\n#0$`65^ww AU{g!#Iv͛fn52_(L 8!4EIs~=tma@Ԍb,ɵ(CŤL#nZpCJ UR,dS\@& Ch" "9+isa&e*Ci\Jtk󹋥bW.}w/{V]eE? qYU!kMqR&HzY-f,M,Q",FVzm ^~Є^-Kr?GC7/]Cx;.Z@2CX\N csXDl-K L9##IMc,04 ڍ%>9mEM~Rc ׌sW`&E g]s(#8]? Uw!2 !RVGBC)Sy`ˊm)2kʳ!ĺŕa MQ^/d6h"ΐ c>"o0-vU[O]";^.)9V*# ##c[+Q߾"ϥ7gCLM*ނݺJq&;nDa=+2띮>٣LxΓ;J`LPO2G,6^c)Yםޣ5~%OєPKMd PKK>0OSGI-OPT/src/javax/print/PrintServiceLookup.javaQo0ǟOq *h߶>eݢuPKjvwBS$wr$ʈ|;0J> LqY~ kL ch8 I\ J5EnOW4Vhga>UZs/% vPZ$ a! BF*k :F zʚ\ ̜+zUUlMj&ar[%Z0&NW ,%V*XnbN{'T3W1^f*3"-Ҷ4z3$N^.|N.$L`4pOѐ x8ʨ. ' L׹qLol\dh*/YEAf.H1|^О`˰0B(SZ"f o|0FZ?<o`jVa rtX)]uo5Ph,ݫvW-32sa/ABm!^=B&`ak_ZDVtQJ)e#mO^zrfJH׏$4ofLZs5pSPKXoPKK>'OSGI-OPT/src/javax/print/ServiceUI.javauRn0cw~3#ӧhNa|m5t]xPK-p$PKK>.OSGI-OPT/src/javax/print/ServiceUIFactory.javaRn@=qԃNؑ f0]wwAQITly͛n'0Zln!9yΙHZgi}vl"FĩC dSP)*0s`)}NQi.9=hY@n5}K%,4Pj$as\XR(ji7͞*ǚC&@AC 0S)YY2L.Q rX5 Z/afSz.6oKĖl oeB!K6K 9#1]3WTj ύO5rAe)l,~M(yNG[?Cۉ,wG5 Pseq2k~fޅV K|qe6[0/ymwL`~lY^t gj3{5aTLݰdy/ʧ1--^-P_IwhPK};PKK>'OSGI-OPT/src/javax/print/SimpleDoc.javaOo@q[Hk5&r`65| m?yofuʔ C?@WB!A_+ɑ*ܨTzExCɭ 3Yp }/u#-@ʑ0*hQɠ4df[vjśf}0KFJY_  \hTuM|TZ7tFRw[]s`kt<*åd-csKRcSVYs$ h)$sJfx'3Y]C4l2>/@b*?!%:6m$WR*t^aNY-AIv?V'WSbO}FA sA}XZ"( QN\cY0hb&(mI_)Ug=^a|av]#,qe5(.闸~\}Ҹ?ykv2aLogxNSӵ Rc]V%zt$C;a?7PKu!wKPKK>0OSGI-OPT/src/javax/print/StreamPrintService.javamn@)F>ّZ]Q x[&Vw,V?|3;n`@0&MIJ !oOSI+С=b7*94*G t@3D Zm8h'@-N4A=BV! 2]t .`çR9/Y۶CmYk>^7#SYBFZ8=0LY+т J#[+Ir N &L#~) (8(7y߷{xvh lwnV>nt ~ěGuXcJ?!AB(t fF>UtZަ$Aݯw}B 9FQ7OSGI-OPT/src/javax/print/StreamPrintServiceFactory.javaMo@q2In-'j&e6fw;k\DD37 J(7bޅYU@VUI=nahpC0xBniӞ'+qtڣNw,Ö@*"y kQ!v $p-Z-ܦӺxh=13*дZ_ y6iZuD2NZ$NVh-녡`8[kjPXiΜ ԵNȲV] ΈwBH_ (6&y &n|M(_)&M{>)2{m)B3:!Y\dYPIF6VK`Sp5[/ (cD! ~I![،;#dARЍ# *sC[&,<{I'0Hnn̖E-me\Mv)>N_iVny^6̓ +~K!Ư4བྷu٠FU5ctPK"9]PKK>*OSGI-OPT/src/javax/print/URIException.javaRn@=dG8Vq[*vU;RΛ7:kXks>z3ȊO⦑Bbq;z| 9#О<t!6X7NjpSLdbgPC8J6\ 5^0gda%4r`z Gs޼C1(uCޤT];ՠs`g'-9ޟARU=imDڂ-RkV[饪t{aiy+ڋF@ H9<&n q6dd)}8}/Iz?h>H8/[J_$9dIT݉'AJku$4l~8rDIGᴚ-bCBRvʽ C~PKDwPKIG@#OSGI-OPT/src/javax/print/attribute/PKPKK>1OSGI-OPT/src/javax/print/attribute/Attribute.javaeRn@=TAȤ,*GS'pvuwf%v͛: -;r C4$_fo ﷓8aV>Q C 㒔 ZU#H :SNֱVp`5naGPCH8:dIrJr)TbMP'J!gՉ*4g/%Q$9 D? |~p{v#qJrh*OƬ,cÿDztNj&?GODZgT`ĬrShPKV=PKK>4OSGI-OPT/src/javax/print/attribute/AttributeSet.javaQo0ǟɧ8JZƆ@+mJ4!.5Hmc;M snSh5DGپ 8#ʅnރIQ@TUeN=_߯{߆0%KfEE ^F$-P˂ A1O{҇;2V( >uz^bjXrP[b aa.*Z ZnӪxxh5TÑ4懁> `4M[PrPb&t۬[Y`[- ;6r̘, S1 YkА)uFd;jڞpPB'J!N;>JE٧ 4Jf8F*œW J:N@2Ckm[avHVS."gk$(ՊdG,j2X nė/4W/+\Bt@;̑:ڟG"S"nE XJ+% 9tr%klBߟpTo޽}Rw~UMMÆ=3)xJ$/HNHtdRRў%s<D>ǬD/sEgPK^ }=PKK>=OSGI-OPT/src/javax/print/attribute/AttributeSetUtilities.javaŖs@ǟ_t0}::Ch;}\6jwv8&~v^pU"Xh ¢LrQwz33L}Rp"炣4B%S`'a85#]Dmp ZPs$)[T*! d@9҂մlja'8#FC%9#޲uC`^&֖k-}Xٚ<ӗDx]*)d$*b-X J5ҘU wLIZ$}P{FJ}݀$8N*^*8:a8pp \hpQe@•s5#>@ ɔE&8&¸i5:BLev鷼\_ _j!lWV ^x5^XQPA5.$,;YH>J^ [̘uVZ ~.ŽR.}Acw7TL'-ӝ6@S6tX[vK[Ozeﺂwwo?bt _EnT`pui>3Zm i1#ͯ4r&pjVW֭ܺ ]ޚE4u];ŌU&u/wPK|Nw PKK>6OSGI-OPT/src/javax/print/attribute/DateTimeSyntax.javaeA0ͯq to-huaw! aZcC+{!6D]eO< QJ$ZM <6jOvT JsZaӹDx<&QXY C>Ѩi[ԸjZ?zȧE1/ݩG{pf'o΀VJI-H8!x :6[7e $6 ȋ|ΊF|ml|^rbBV_ [|1Idr&8SagHR;.5]XTHNKG`DZzFڭDr~OuCvz#qn$, w|Zt:1ڤl҂qndNhj󚼳*cV_Vi,xp9sGQQxBUS?iеR$$PKC^PKK>4OSGI-OPT/src/javax/print/attribute/DocAttribute.javamA0QNɊBvO4I[H!ȴvmU;NXuW-=7Jna.PV_'$v|?,A`=ITT!3Bg#6Y<fh g=AAiC -xh<fB/L.&]{r B~<{41D.ZMQm1AX5a*)jfڂ,@=Zn(,TMi/k fYy5OYWq0yw_ˇ7OSGI-OPT/src/javax/print/attribute/DocAttributeSet.javamA0QNɊBvO4I[B=:0iCHTwF-=wسv0f.d]GJW} 0Ko ztGq&TXCkt{̪J>$< A0GC8 0Ń<4!B@*s#@3x=̎ȕlj A}ycÐ qb\vWOŪ(Wz;IJ턵Su(36zpĤixPMMz)QHmJ$+!/')+2&i f|Uzu̷gȊP*sd]H "7"y5TI4EhD`ȇkXĊ/JHz~:%֑D!N]䮗^%$`ԵF;EPKXļPKK>2OSGI-OPT/src/javax/print/attribute/EnumSyntax.javaAo@q[Khk5&ͦ]ww+O.F[lIY@$@ /wco+-,ɒ&dor#2R6P p[Œ?1ܑB+ 0A4]y(B.$3.n.zvr s!ֹd4M-qM1Nn|2uVI 2\3, Ӟ1 U5hluFkis  t4N>^}InWp-bSH0K*NƋ1sh__c n=Cud+D.2.M5ޑQ\TdJaX-npڭuIpxG>P.DW{T ` ȸsUA9ܷTS20v=o8ZQ;Me7d6pء .d`WrQj)xnjA)w(ʚV$ynɝkdw)%Oi/!@˝F7tF ,?^@7PKT.)WPKK>8OSGI-OPT/src/javax/print/attribute/HashAttributeSet.javaMo@q[C%Iaz](`*($$"`d;ϼ:*kN- o!81B>n=?4|. &>)8K4@!`Ab"MFmpⷡjU8* csBa4 xcnKUWh%EJőmƖQ:&lMO[,} N[bkZa׏z iXNT1`%( ,H1u2mQ[2N&j>.i+F}=lcjAaT/AFM'rW# à? { Q8WpϚd\ ;;D-L1FiRTPKr7nY &NF[frZG>rB?ٌVv FLU,B` %BWsG9ޭ@sཫ+_o<ŵ;Rm~!~ fLV>kSd&l3{̕"@+rHg%ɋ\- ;K׬S3:Wrot7s|J暉a_}de!.VnzYn̥1g{\n3VZW=zPK-ʏPKK>;OSGI-OPT/src/javax/print/attribute/HashDocAttributeSet.javaAo@WrJ*cޠ'jQ9RUƞ8wfWJ>Zϛ7ߛ/{CH4 Y" /7!(!J 9Z4["v&7TXA++4%JXR.1 `З+oW-lrZdw%j$Tݣuև9'C-`ͧթ9.ā8R7dLw?Z2xKfmDʀ r)Or$ZN6Yghٺ=1rSMH$'EZ.]\opy-Y&l.yƧd)ͦ! N1ɯxP !j,iE%Gu+jZmHN͆VˀihCNï?rAq{ob+v6$]$\* e#ZTS@ >3O 4$,SW=3L<#S1f"N̾|=z _PK~a:PKK>@OSGI-OPT/src/javax/print/attribute/HashPrintJobAttributeSet.javaAs0WtzL0qJp퍳HBN;ĝIv>#`Pr0,G0$MCBUE^ia5(-V BEɿ&h,) ^0 oS-rZd%j$TkݣuV>'CN\pXo~]EbO)SAkt2Kndւ-N\@h*E@AsSw:ME*Zw2GF~, $4$OЛܦn<4&2]w c]<2[m|$?+BxT$%M֭jA#9h4kY-Vަ59G 9FFl#mHH>Eۂ e#J'Qee6|ىG5JwHE9 >dEpeW3Ǟ>!~PKgPKK>DOSGI-OPT/src/javax/print/attribute/HashPrintRequestAttributeSet.javaAo@WrJ*cޠ'jQ9N*acOgw]IwfWJEpk7ߛ8;CH4 Y" 7!vcȽB5(-V BEɿ&/h,) ^0 oS-rZd%j$TkݣuV>'C-`ͻ9.Ğ8RdLW?[2x fmDʀ S3H!Xt0m*Тu'C{b0H HOm:6$f9Lfe:Og>@4 ydI~WaHVcIK*9[Q#jFr"hdZMCkr~As፾Fڐtp}ڋ@ '`+aW"灣uɓ@Q('r(ݡ""hH4t/|o<#?`#}1~PKVPKK>DOSGI-OPT/src/javax/print/attribute/HashPrintServiceAttributeSet.javaAo0˧xU޶2hUv0#-؞hgH%i;(?gD靡z`X`V|$H,(!I 9Z4"&x5(-V BE?J_XRΣ1 }`/ FS-rZdYXRP:r9=ś]P '8.xqs]w]qL74+ٺu# lpfR,ص(6kNyΐ#Y`u TdENՏ<6!axizm:6$f9Lfe:Og?}$Oivj&qn :(Y%-jnEP ɍ@YjYۿ?(.6biCEm/.xP6-]}pLIr:PVϠo=F;"RSI4t//|o<#[? `#ؾ ~;?/PKn5jPKK>5OSGI-OPT/src/javax/print/attribute/IntegerSyntax.javaAs0x 2!9$m= &丘Ũ5* L3=[]=}{t i1L.S(a,bǂ==3Q"wbyV!lJ>}&;U60 `t%Ŏ&,c*J2;ۣu*lO*OYrVv A>=뺌Nęq9]1?uIǫ# UE+amqڱ䂉ԝSA:7Б(V>8j0Jm1K((X,x|,nKg7Ųd ߊM >X;L :4jS蟾E$DﴧCf!w{v%vVbUUC[5Nc-bTɔJv+!=G#r6mpw֙UP'7/]~uz={5-cqh/KPKa.uPKK>9OSGI-OPT/src/javax/print/attribute/PrintJobAttribute.javamAs0;9%`ޠ'0t&N(kgY% =%W\ؓv0f.>]GJWd|72l=ֱ8;P{5:BjU%qgy2L`2nMf7dzثh{P -iގh|Hq0%++9`eּ$!Vgظ6.ZeU^x^w=8Փ Jک:=6zpĤ9x<;*{~U3D)ڔIZ@VLCZd<B?,Jer BWBc.HbE UMjZs@%Xt{Y=?EII?uP:+D/Ni5J[P|1e wꞢQPKXhPKK><OSGI-OPT/src/javax/print/attribute/PrintJobAttributeSet.javamA0UI`O[ JQeG'mI Yi+='7ؓv0f.>]GJWd|72l=ֱ8P{5:BjU%qgy2nL`2nMfwdzثh{P -iގh|Hy0%++9`eּ$!Vgظ6.Zf\f!͟k2օI+BxИ XQCDmZiIݞ|xV/uhOOpQE`C14NJǴwKSct_Lh dkJ;EPKPKK>=OSGI-OPT/src/javax/print/attribute/PrintRequestAttribute.javamn0DOvJnnmNB9JV&Yre(] Ձ0 ƞ;i5u :RB^/ YJztcq&wTXCkt;ԪJ~~d4\ dܚnW'І(䡡ZP%aD䀕YRGcdXcڤh}r-Wyz'{ݡwONoOPUj+8PCcGL7 aɳmϯJ{b/R0IK |Jˬlu}(|JX\&[2 i߲v(=x.$L u^^JW y5TI4EhD`ɇgXĊKor(ꠎu9V@OSGI-OPT/src/javax/print/attribute/PrintRequestAttributeSet.javamn0DOvJnnmNB9JV&Yre(] Ձ0ƞ;i5u :RB. YJztcq&TXCkt;ԪJ~~d4 dܚW'І(䡡ZP%aD䀕YVGcdXcڤh}-Wyz'GݡwONoOPUj+8PCcGL7 aɳmW2JMi%d>eV΃S~SZiV% Xls}4oY~?=OSGI-OPT/src/javax/print/attribute/PrintServiceAttribute.javamAs0 nnmNq[eXXR&dR0Dr,=9jw j Aut0^,Afq"(=!Qc R*+sΓp/`qi2 '^@ޣx:OJHz~:֑X&V]䮿E)?O:kY'EPK(9PKK>@OSGI-OPT/src/javax/print/attribute/PrintServiceAttributeSet.javamA0QN*toh6mQWlW{t` ۵qJ@Lr ,=9jw j Aut0],Afq"(=!8OSGI-OPT/src/javax/print/attribute/ResolutionSyntax.javaSMo@=_1)FpIR( S qX;cgaㄪYǴiS*~͇'H;͋nփYC$g2Czi`)8s4J.Q]!D%J :`v ip9Ͱ%dj]jnWMV9VC]~f[ͳ|uqt{ǣ4$-B 44^W\SXI2WjPXrk-Ff̒yZER?P٘N@t}ĉD..<.I9fqgSڝA4OtR(nK2 ܕsEHXޒ)19(5YT@(DƵՐ|-Q^.P?a۠\ڀ6ۡWV)XJ`L0ӌNvҲmc(iPUL_ԹFBIlshs.f% /_ ń9 {cc]0ЮNV-qqv1g41Zw*VZB8[je1scw\1Ao}wJCZ@x-VLbth4DCHH٪wG':OSGI-OPT/src/javax/print/attribute/SetOfIntegerSyntax.javaAs0אڜ\0I3LYBR5d߻gtr0۷(#u^LOR%Bd4:IXYPzGEB=. t@KԊh8IF^i`% A=J*ܔh ҬlJZ\ \w rBA~K"~8l6;ĸzZ?-SwUZg#w\lAX*EJ`! ԭ$u7aYHON ȭ?plBC/!{!ͳ<&WrWlNylM'5|&g1 Gƺc~# Tf-%FYXt+X=.+IvK  s$IM6 DIP*9Ҵ4a.j>P iJޅaѸ}:CX`pJq ~s5?*Q(G:qHP ^LeY#}U~\7JzwQ PK{KVEPKK>4OSGI-OPT/src/javax/print/attribute/Size2DSyntax.javaSn0}_qէv iVTx(5:ýcIEo?3:'tnG=NPKrPKK>@OSGI-OPT/src/javax/print/attribute/SupportedValuesAttribute.javamn0DOvJnnmNB9JV&Yre(] с0 ƞ;i5U :RB^c, ˰JkX'LB^wUƝy29L`2nMf7dzثh{P -iގh|Hy0[V"Wrʬy-#1i: Cĉqm]>ˢ\~ԃ{p'''PV*N `֡ ԃ#&MÃrljh^%kԦ4LrYq0y7VxVkX| }xyqJer BW Bc.HbE UMjZs@%Xt{Y=EiI?uP:Ҝ(DJku[k}"(%t?QPKInPKK>2OSGI-OPT/src/javax/print/attribute/TextSyntax.javamMs@ p 5$6'$"ew Zp'ɤ>C#ɣ .`bsWU "_ǗCA0Os w!ܱ"hY!(*yt'Cx O^w\'m`06BH<85l@٭ZS%SaEkZ;ӵ}ڶD[_YFwvZ~.h 1OSGI-OPT/src/javax/print/attribute/URISyntax.javaeA0ͯx4нRQW jN`C+CZ-j~ߝӻ<7^ !|={ͧmDtĉոj1=S6&`w#-O\! S`Z=ukηRJ,_Fc 4G9ͳ<&OrSZu6ϱ\a\U< كtZnM- ߕ+4"W0)+O利F)8NGY ݬ8ut apHNrROZ ɬ֊y=!^N'\Q/W~E? ]PK_NPKK>@OSGI-OPT/src/javax/print/attribute/UnmodifiableSetException.javaQo0ǯ8SRemK "$ 6MHT04#~U+,u{6:8LWPazX|Ǐ/#J,#!;x;YTS%!nEqgd S/[ٍ88Ci{H t*u n0]< Fs<ۿBzεP ġ6UT_6K4_gVd- Ļ3DT1k-zhQ==uo!oSJuM0rnP9|qsorlYdcaNoMNyqIz;q˸Z0"r7{}A-r/ NTJ(NL#Vˀe#p_|(ϿOq5RP1Mv;n'Z0V59;#U$la)'z<FLgx{3'G? ?3PKlUKPKIG@,OSGI-OPT/src/javax/print/attribute/standard/PKPKK>=OSGI-OPT/src/javax/print/attribute/standard/Chromaticity.javaR]s0|.'PCҏqڸIMɣ֖\Ix2=@[&)fN]'"_Y!g~Q&9t2y5z4A#Gr)8J2C vW_w3oPN ]SGѪJւTj! ,E!5®s:n;*@`ތMxlS:;_,Jg/Iuu- 44&NjXE8[ւ54\#YT7ZX! h2a(6&}a:r$7<Í$~4g) qt8-\"9s@2s"HX$S!Kɚk#jZ#P¸g5$0s4(ev{/7hQ?wfBZέg,Q1M{U\i $+D+J¶Ģ˴m>DiaWWQ&h#z/&o_nW;uQL\Q'lo(,r k'CNSӂ &Cj9U(/p3{bt;HOsR"^PK=ePKK>?OSGI-OPT/src/javax/print/attribute/standard/ColorSupported.javaMo@q[K?ZlI̶vwAQ{gӆ4Q.`3<ΎN86{+ A?@}U*G蟎ǯ׃Їa3,Сb99*4@ A7Nj>]/ bJ4YC:X w9 ׵ZICNœUW$8]p~" y3mqm9ns<Βl Us`W#-Oڃ0LVmAn$!8VX2td媡#y lPЋ2|8zx%XeXD2e.`&g2N>}(qr6d˸0vn2#Ers9FޢU<t~ /SZC蟹|Q?X(M:b)aI`ʏ@ J0TWf1zcpG L5uW$vIFEO9Gͤ]GΏ?>Lb>ON8@5U5v0% }[aR<N~xf'}%Tboqu"j|&~PKXPKK><OSGI-OPT/src/javax/print/attribute/standard/Compression.javaMs0jhn-8&Ũ%W1L&+NL v}29BU(6|iv* (K$GO@߯G;4@zO NLpshd!f _Q$SAw5͜^5P=He1HZX[vsө842JgTPS'ᳱ~3mt1)os,$^uWu!K44l&ǫ=8[kZPXrԭVb Fm4:\ŪvH 46&adgdq6v"Sz`ee. Lyӄ+'1 a 7W Z"X NdѰP[ԒA=!ɔ_\ќ8lv~>[Xb:yu/,<"ɦҲ V(csŃ]˵'0>X~9_DY6?w wG'g25NϨI߅Ե [# #ʇ?pľ/{(Іb~8.m#HT UyyPKhQٯgoPKK>7OSGI-OPT/src/javax/print/attribute/standard/Copies.javaRn0}&_qԧv iBW 0&!4;mVmB%}E Lt7\;f'P99 ׃ocsdTDIeNRFdք9X.z%+YhS r;itC+]ǡN0\pAͫS DsmHGڔꈵd2MKVUݨ_4xYU.-( ^uk aʵ)uF.,Gl)c 8C!Β,$fx>E20c2KE2KyqzIz82Cx,S8SDFLJ%ٚr9[Se#JBd;BMf#eF:[A9D?VH":uL%L1fɹ%PB^ ͷUeTa0$QI&+'v!w@OSGI-OPT/src/javax/print/attribute/standard/CopiesSupported.javaOo@SrऽAȤ,#iabOgwlj~wf@U|ݙ7֣؝SՊaPD0?+HZ.'&2Byr*cQ"TAS .oG"cnHG8$tguzPKlyB^PKK>DOSGI-OPT/src/javax/print/attribute/standard/DateTimeAtCompleted.javaRMo@=_1)F AȤ ┪lj=q];U:nB+|oz207r0CXdUP&6,=0x vT@ [\>~uh8f0p4 O=Pah rQsj`Suf8@#C gܼNw[N#M/yԥ9UVq-^+XҒ;XrlCKPZ;!@jC 8$8K'JV_+8]%,0_g*Yqz ߒl$M<"dD,lђk(WK4]XfGVK"hkub4#[B y}X9BF mq4Zz@cyb V_ tឡqG4?_:ہ gZVU;\+:AU-ܓ8_q4A}O{{$ wia%nDYLe:Ś ?PKx1$PKK>COSGI-OPT/src/javax/print/attribute/standard/DateTimeAtCreation.javaRMo@=_1)F AȤ ┪lj=q];U:nR*|oz207r0CXdUP&6,=0x vT@ [\>~uh8f0p4 O=Pah rQsj`Suf8@#C gܼNw[N#M/yԥ9UVq-^+XҒ;XrlCKPZ;!@jC 8$8K'JV_+8]%,0_g*Yqz ߒl$M<"dD,lђk(WK4]XfGVK"hkub4#[OryiHϿj!i#B8 v-OB1}L+USsKa҅{n ;h}j_5nncO^vhg! Vun*<[EOSGI-OPT/src/javax/print/attribute/standard/DateTimeAtProcessing.javaR]o0}*OHַ-&dꣁ lf_B}ׄTh,/²Be6 -38+Cr4@[@cVpL`hOA7P(MXdia#KgXHZ+i, :%p56O 7=[xܶm :ǁ6Ÿ=؆ujҟ<v8Wr0sQOG@1wa賲AjXN\OǢ—&<PK.ѽ2&PKK><OSGI-OPT/src/javax/print/attribute/standard/Destination.javaAo@WrޠdAvJĞ8 ήljwfj7{I'07j0.BXuPumȼAFHɥ*H;*%Y A`!?uh8f0p4 ϼh:`j0( 6Zx\< f(r ֏<@ sf:.ž82G^&4x)í+]s`W$^*p%5v`,`eIx*V3kВ)cV-?)Q?Hma#I>&j q2a|'d# |M T&shX@0=AX#kPkUH4]XTfGVK"hn6*FM@z~QcyH9+Yд+Uk(jsre/At鞱ʒ}JڒY; 3yyxmb }D7& C; na Wڣ"? xLq(s-qku?I=;'yWv.~PKݻ[68PKK>=OSGI-OPT/src/javax/print/attribute/standard/DocumentName.javaRn@= 㤽AȤ,*GS'Ypv8NTߙuR*|XkwyN^f9XUmb  ÍAuA7X<(8zC1)^>@E9OSGI-OPT/src/javax/print/attribute/standard/Fidelity.javaRKs0>_ 2Z@14SG؋QkKx2]4i.`Fҷcw'8.# A/"$s)T;^ !-Dhl1eb JmR$׾ +So=OQ4B44Ae9p`I $([k^eqN+ \Pi}Z߆|3u퉽cOlbpLa<}ɮ۪ `W% '^5 Jv{E ڀ i6`jaѤҒvmBA׏!яxH..(e0ad`i~xAx6䖱JMy;E,%[b"2h*D-ʼnDSHj`hrYH+v:矎؊WԦ,10SV++/9$`3b.*OpLUUč"g=_? xh םG>K<ͻ1 Φ`y}P~ށ| 7In]<Č&L8z[aF}B[F}kΓƛٽz2 ̴iz}V1HQON\t~PK1QV`PKK>;OSGI-OPT/src/javax/print/attribute/standard/Finishings.javaVMo@=_1546Nv-f0ۚAQ{g!`R17ޛZQfK㙆V?8`' g"Bhz:@Ϗmd*By ɐG(N gv"+\T<ple%leÜ-ArLyf(g׳Bd1NHǚQ:v"0].~3ObXJeMV;t8uYu%T $ɹK`ؘ&lK$LBrENI44\ mZN1M;7h©Aǐܸ=^:# ]ߣ l~ޠH##|Ȥlr3[q4]YRF|#jM9 C9ʼVE'&s.^e!كI.t٭4Q199id Q\HUQDU;"KCQASsiGt/PM2<6ޕ}L` (3ޭnO坬ȓ_;-">38w ["[HݝaܯXB@*G6/+D 9{Ζ G؃p 9?\h_YZ/ok.7rzp=|? ThŘzdw?%bkɊnQj̢"5gV9J^I27{oo7+ĨLceM*u.E0u"卪=6}O_PK^te PKK>=OSGI-OPT/src/javax/print/attribute/standard/JobHoldUntil.javaAs0Wwz00&)q8ӣbo,i'g帝(Gz|L} ' RRax># KtDvEJ-!Eίd:i4Gz?Soq0 T4C:Hk!7Uݣ]œma$X.Bͫͩݳ%ߌmF#-udvf/u:6rDTX3- gd?OSGI-OPT/src/javax/print/attribute/standard/JobImpressions.javaQo0ɯ8S; @RtL{tԐvV;i6mAT}߹$ 9YnD\UR0>^I䷱J%Y2;*"v&2'e@ 2p[B܈XN^0F3oq-jq%YhS r]7Z'ݶ3x z4<B5oӮ"Gڔꨵd~f/zRY CZi80U.Z@iO*CXq0m i==#G, Q!FgIzdyqu\*ȰXbHϓUHyqzIzxd܇ Sqo>"نr9GSe+JBwd'BC_eTN~\4x?1RH!md[ SMGD E;ޑ*3NrTʉ}jR97N/?Arb섙M[ؖ6Pv[F~'~?!ޡ$7Yx½ (ѳ}26Tʻ PKi4-PKK>HOSGI-OPT/src/javax/print/attribute/standard/JobImpressionsCompleted.javaQo0ɯ8S;B7 0&!4wlQ|:g3: g,Pax>oGWZ,ɒQ)K9Zdן񃌕Z"ٚ2GSE# Bwd'BM_e˔N_$xοO6RP>mhK ςY\#PDV qus=ܞL)'Trʿ5;E;^0'܁0pd1o4ao}w= rsq#2d>) qw"*WCPKi0PKK>HOSGI-OPT/src/javax/print/attribute/standard/JobImpressionsSupported.javaAo@W|2ZW(ro ؊;If2> fJ(7y쫀ʜ`x6߅ iaA̖ȥIZ*pXcη2k2V( gaЗKU5A*%֢"]NځZhpnOIP+܎;OSGI-OPT/src/javax/print/attribute/standard/JobKOctets.javaRn@|_SR' @& `Z9(N7΁sgq^VP,[w7;;3{ó`bU嚡`}RWBGW! 0HsrdTDITNQ. su'!|#p7{i`{Іq$JU˩fPr;iOmaG)ez NY3oöm#<(-Wdfӗ9~6ʊU9.Ek- XZ36^uk+]̊[i تeOB{($6Ћ3H|$ =M<^M<"f0d^$d#-\&E$I;y"dDO$Q)W+5]6XfKV#ncu"4(F>l7}-*r6r,ThqP7KU. ELriǤ KJ^3FiCk!v2|r|][`_E;܁k$(p?.G<5%Ů@zYjMUIgdB C7 PK&4%PKK>DOSGI-OPT/src/javax/print/attribute/standard/JobKOctetsProcessed.javaR]o0}'X`}ۘ6e۲VP&ow ij /gx &;]YM#.KLF蝎F~1H9yr[#a$:#)Gmrr5!T&?ym Nzmqړph. ˨bhnZy}iYܶvJJ*Y5}xՇiHGdr>Mߊvڔ==T%2j`TH׍ӬM1+n@kN/k~VڃG )n"II:$7zx>DOSGI-OPT/src/javax/print/attribute/standard/JobKOctetsSupported.javaAo@q5$Kh&%LEQ=mvwAQ{gD>`ypmvVV+~B׵@蟍Fa_w:C2b/r) TKhThQ ZY4ou^8;Z@i!kHKY#@C zm:VjS$pi n<`iukEd>mFbOi[ C^&iO3u7ujt,ieNjTX0k-ZDek=uk%IU %¢)#+ ֟7plBA/!{5Γ|Enj7ldC6I'$K-\$#=5;`L<"/ r) FTޠU ڵtX^kI s~FJEm䈥-ǁi+JPԂEVcP )[&B6Qћ3GkQ7cw+ }tNCp ջTSIгD>h~gOXBJXċܓ#ObM>_PKN_N@'PKK>?OSGI-OPT/src/javax/print/attribute/standard/JobMediaSheets.javaAo@WrJ* dAqJĞ8 ήDZwfj+ro|oN`fΪr0G0>)J ɫzmXx9;*"q&*'Fd7q'!|'pM`h0z4ahrVslU9]< f(rZVB@φ~3m82WG_$4;)}Օ9QV:Zr\ k- XZ36.Cpf-Z6rlժ'Cg2603H|$ u`*?-BFamH\U.t`IPY-&U_TjG.h2pVicB[LY\!Pp% |g҅{#L%٬ӌCLڒZ;ῄ zr Er(bءn52$MJcuh)G3|x% %p$,qc5親ѳ}21kʻ PKw5'PKK>HOSGI-OPT/src/javax/print/attribute/standard/JobMediaSheetsCompleted.javaAo@WrJ` d8qbOgDU;[+r3oYgfoUf#uPzmJsrdTETAQ .  OSFy8/GKM ܃6 #PV&]A PMӣuׇ9'^,i! ЇgܼB<VQ}uU\fKuM΁߭xl؁%9c;Xj άCK^TZ,F@bC 848OIg 8[9̲t2Y}8iv1dqorg+sDr j +ljq ٍrZ^Vȇ|AQHοO.l"nC"M\#XCQ@1oT*D=OvLt'$STqwpM|_ˤa= tdpd1h 4>0޾GwP'(vG2VnZܘtguPK9`2PKK>HOSGI-OPT/src/javax/print/attribute/standard/JobMediaSheetsSupported.javaAo@q5$6U+H,IE9 `55E'JԢgzxZY-=&⫄%2Ix `Jʄȅ,H9*Q%YK`2kNj'וziV=4XC:XȚ6RAWCk_t*n; =/}ޛa۶ mauËl|LM]Ki| h9؂%y[+T^-R:oB{bd/86TKdSAf&W3I4e&SOlMr~i~ ?lđ0 qO+#9C\Ȃk!.c2r%=ݫ|E(MbT>A߹Mg)id9_R)Q,1چhI ?YdSEVl:H3OX7ҧGOSGI-OPT/src/javax/print/attribute/standard/JobMessageFromOperator.javas@Ɵt}::FN7!pwGH=Bkk1dvȃ#fE̳O(sd29o]uX!"b'29IC vC7P i#hk Qp$ kkQ.Ƃ:a7AőVya#xu]=qt9f8OSGI-OPT/src/javax/print/attribute/standard/JobName.javaRr0=' !0qJG8G2:Ng帡rpFo߾g0rM̲⪒Bht_+!-Ѣb1#UZ#ĵ ZE4}k^7{PJV˱& r{iugqJK GOSGI-OPT/src/javax/print/attribute/standard/JobOriginatingUserName.javaRMo@=_1ɮA 0D'Ypv:NT3븥a7}g0QArceU%Phtoȅa* ɐQ1Y!kgBA%" }jA5He1ZTϩ $j[Za7ݜ1C,r9rCͷB@ۓm;Ƒ:֚4\kfw-eEƀߍЬxuU+Za J8gcja,C0jm[` a>1#K\AA c%Y@ŗr|*&2Y$o No[^@lϡ})W :R25b-r&KRHKV50Y ,L%¢BtACc9}Tk!mWPW7+@byLZx[9,]u+bIAZwiKҞ<%'pEΝ(ezvQcEMU>n4l/TUD0;xr4/xPJT*}&6Zvx9DyyPKzGZPKK><OSGI-OPT/src/javax/print/attribute/standard/JobPriority.javaR]o0}&OҲ7V ݀NMǴG7M li4sf&DU*/g|3]wFa><,W*' O'7!vm,T.OYTӠnV+JT+Օ8#Uh$uʉ!)mIW~N/o{.xջ}pH섙;؆NBh{<zȷ|wQ=Jr3y#2bu2&kTloAPKP2'PKK>EOSGI-OPT/src/javax/print/attribute/standard/JobPrioritySupported.javaQo0ɯ8SJZC L)jM{tԐvF;m6mbQ~8^cMge#I]K d:};?ߍP GvGe ABhTI~CH(qEIpO1 ~k0: nhtX˚@T(hÜ^%+/\pq!{~2i6XjRk"g.UMҟFZv SbŬh-Deԭ^j ׾L)r'3P$9|I r./N$[9 YL n# 1exȉ *ZlMUޑUVp S˭>+ D;;ncYJ42͊s@E-^Rs]mT^Kl)/˴%_*uC.mzb* ;p G3)|tf!x|}Q m7,K k✜ȸ;[z.PKT3PKK>:OSGI-OPT/src/javax/print/attribute/standard/JobSheets.javaRM@=_ 0?*jt+X  L@`A] P{=ƺifG AQHRp}]bEgGr%ST3UhT"X\C:@}Fbk(&-2nRTU+iYm9T-O WA4)kWx%笺VZ ҰDŪR`h@A~#T7FTy^R# :LZ2rQ)&t¤$L&]& f1g$D%&}@Me)8[LR% S)[Sy-r\(vRZV3GSR]_x?w2R/u[b*aW +`"Y!PedHlvDEaC/`+GKG0yZKDO?fttۅT]#OdD Rg=&LݍK ka="[7IN ~f{ 9Xl=bj'a>;D_PK9OSGI-OPT/src/javax/print/attribute/standard/JobState.javaTKs0>_ 2ZǸj36i&H$L{W`($P8ѧﱶ=kx\+ 6D%(8)B{zo;VjQZ`% *3CpK_Ӂ4ΝlAjb-+5iH\ÔJ4r^֖6:5uw5FJZM 73.Km;Rb[KQ֠w%*eZ%H,WH{FZK y%Shi2 m瑢ؘ@4McInUt3[7p D1xQ8A+\H##\& ܎s!A<0[KĔOyJD^! TAjε} fsn@rYnAse~[98im( ҂or LjaM:0/Վx7 VQW:{kEAC(zHaL">)ةDF>}DXlIő'ɓ8{28^SބathȑS{SZ zm]M굩ر>{8=rg3h<ʥZڤTJNBtwQwFPK79gPKK>?OSGI-OPT/src/javax/print/attribute/standard/JobStateReason.javaM6Wt -|1fֻv${8c;<@mO!s1AVےFzK~QOgf %y`a ڳK._:+| U ` ~,Ce) 'Il\AUr!JX%P 2HMqB r9E$0?; ZThn v 6rGr:QG>͊%HO%$f+*a dMr l-9TR(P+e0KQ*)(ڙS;`X&>ؤ _$BǦ|oℎ)>9dK:|WHb ]*aʂ'b%L-[WlaraFPp^:L*6B1uj奅Fo/vF!E NPL.zEB2/(愳wgF ;6t);7.-R\&'5閭[oE3 cӲP%~'Offxn?-ӳl%&g|;;lbr_wwmzuMNocқ,590gq&fhƎGԱ|J -{|wG1 l˙:Aqͥ{òc{6!&Խ0]y{`BmpFvjLmٻG#Fhmf^6/z{mn]c~\,rrW8^h>5CȆ]9[MS~D0$v!v9 n1Фs4vԱp49ġHun!"<RU(nxq͸≾_^|++|8)hvC Kߜa͕\T\U2Q:dk=c~m^_PKoPKK>@OSGI-OPT/src/javax/print/attribute/standard/JobStateReasons.javaMs0Wt1i)(|L'㖆~@}-iw0ƈra|J)Pep~6L})Y2K&xȥHYʡV9psŒ?B+8 F?aPAmB!$3^TpNKJe!#'T*Vt̝*FqM9X;qrUYWJ`W- wn+VaZ%@9UpBp+41Έv{im&%]&Q2hv1u8,:O`2$>f$'g к2))BB';IL"TYcIP%AEf!eH]/_h?=.qTF(k cS)ʗ@L"ӄ4%6vBh >贱}F7nn;oZ1`fa()lk))sxO(K7*=̐cޓwmdO>qBInJm6T-KuT PKh`[!PKK>6OSGI-OPT/src/javax/print/attribute/standard/Media.javaRn@=T AȤ %AqJ؞8 lj;[A>ؚ7o{Yg03b0FL>(R1(ǰH+rdwITFQo 37cF)<`t)  CH8* hQ͠4d{im7gJ0)Qj6O܋-sj2i6Nqhl1)X7gE2.k]s`g8N0%`,`aIxխUt1g6ܢ%O+V ڃF A@ ]ؓ5DUX+-:^.z>Nj1D&sh_[@d*q&ac\MڨL0;ZAMRίՉӔR}*!r6t,ThnR0$0cJ_(W(.tNpuS%͸pݿ~C@A~PK 9<PKK>:OSGI-OPT/src/javax/print/attribute/standard/MediaName.javaSKo@>_1Ɏ\p^Z5Z9Ykx.VY8o9p3Y/g~Uq&2df t7r2!FjK g(4Ј5_}e Qi.Z/ FSK l4h$2 pԽuӳX'psȕagPWqkmLڶuYؕV{W,5EZ_ WxVkZ XjFZ׭↋r Ze -MεQ|՘=R0|0[E^ίSXqGi$0a6.4G FF:M@6a!ACOSGI-OPT/src/javax/print/attribute/standard/MediaPrintableArea.javaTs@~b'>(H!q|8%e: i)y {o:G 8W3 ?81By]E۵adFQ-0q 3Csӫq *ͥAUݷ+Y@HF熙ӎ/[hPZln\qa\f*6DTońJK XqH&}ݾBV9 Z Od?=Q w'[bmAL73x Ǟ PzmM3 ,Fۈ9%3Em{snh?ڏmkizKfP$&S7 h`*ժeB Ewղ7R<כn!-9طxz3;HCB_qo:ؘ.#_PKӠ:PKK>:OSGI-OPT/src/javax/print/attribute/standard/MediaSize.java]SF_q+qP1ZY!JD-+"!C3ʂdB8nf:dzsVՑo+0 s \v٪h.a W&0` oش.\$l `bW G6Ss'^@ބ\MK]kzAa0y>v번^GYhK_:EF^r*SqB$fB< :sys\.4Z4nX:;k,I f-Xd|y4QR%1ye^0ALb^crsH]] 9`:;@4tjGC 54 3mwYchZ0eBF@\]Ep˅0 W!%sԂ"#X|%&"޵)OBJEg z{Se[O@xz\b_M=xz,&%%spz&ȮYVkKM]Q{3q#{cLZ,|XZߜMk)_@_!X1ܿK, Vlk(X#*r)b=4œ,j(\/\.?aQ>G܋SYS6 C*g sLF(ZEMZ* ΅Œۈ="x_#T"C|>RGp! D55A45ə`&& jjhj && jjhj ZWMG,7]-7ttrr˭g8扥 ޤo['e~GB@?t]Guho5,. &0_k) MR`jSZ>jGUa5,* jkKu[ۣ6&ݐ:ERMyEĶ%um&M֮2/ƅ3m;B6qq[θƸ@ xDIAh/se_מ^}oh}%oph r|9'`iV?1sog6,{+Ue;d;ۑݿQIV dT-Ëo TV$h\QktJȗV}}~+emȗxmmiߩs+nƅyE1~gM[HunC6(1J%?'A;,1&={Dv6P_)[ 6IO ږ6?u=SxgSksxP5jO`m>OSGI-OPT/src/javax/print/attribute/standard/MediaSizeName.javaMsFѯIre˲ʁ^  |RHd-,'=>#: h&bA^ Ђ@S^?L)O/rSFlˬE%aFzu<6‰\=E{Wq43tlm ϰ-3h=nXS$Iށ,SyV&:m9lg#y$cMe\&O"cYjni&XĻyL{ׂnxNC_loJYi^jWo۾B +L*UV)Le3U9>c2& qϘ)>Re\3f*c $|7! 7!- Q݄ Q݄ Q݄ Q݄ Q݄ Q݄ Q݄ Q݄ U U݄ U9U9U9U9U\wkKʴkdqfޯtN7#D-M,Ws{AL}uk՜c%Q ~s3F*ׯF~ ͱ uBLeb!y2p] \W,$/T+S{SH^ ܻBr2p~L}~;!ʸ-͡_PS\K[{F Vɓȓȓ崎lrvj:=JH\־6e4WK[fyEy5k&Y;rg3V.f ]R|[sf YU#ʿW~9T ? O#mTHDk,@Kw1OÞοPKRT=!PKK>:OSGI-OPT/src/javax/print/attribute/standard/MediaTray.javan@S8AD ͭE=lMa'jYk 52V*>`fvniQȶ^seп >\԰DjK *E`%O՞ [w }[kzE v0Pi$а9,  I+[k0FX'jp*PR7S~vy-T6Oz4^you(sG%J漆Bҙ)Z #d6]lLZL*Qb]=ZcQXGC yc ldA{K̏0`_`6Je' ®t!^X'KDlDBɬBVQIJT;j2ZL.vpӤ~ ݂=?ҸܴӺt՚ IScE2iwfDܡ4goi7B#']br{idxOIOSGI-OPT/src/javax/print/attribute/standard/MultipleDocumentHandling.javaKs0 :Z-1 ds1jeɕd q4%i) @ѹ߹yKbyL[0J9Bp&SQ i;1k\LEH%O)J!djZR"(Pܸc5p62zx3lK3[%+=(WH#RX^QR ra̓lKn!QfpLO{+KEM 0),p6a,9 GP4{PZYLݫP&n ԔtUm",~ݳwPLmEU4R5v,?_PK'PKK>BOSGI-OPT/src/javax/print/attribute/standard/NumberOfDocuments.javaQo0_qT,L2m٪0Nr ;w iժ LN`aHJDU% ~? 6^i$KfKER,hUAnC_2/2Vjp h-E-Pڡb-+rjBG.7Μ`WBCsdu](ġ6:j2_$[TEVN!EƬ DiϜԝNr ׮M!32kݓ3rPD)tQcor-V(Y)Ky Jn#N ]c|Ɣ~[DJaH\eTيP-ʼnАj6,o4 o[l.lT.OZVi3+JT+I[gds5)iHX9*ɤ{e/wE; ZY0p 41o4*|1(>#JrsAGːkj'e%NDM/U?PKpF0PKK>HOSGI-OPT/src/javax/print/attribute/standard/NumberOfInterveningJobs.javaQo0ɯ8S;B7 0$!4wlQ~:gfodq#,QUIr|:}3ߎBWZ,ɒR79)KZUFן񃌕Z']3'X.Їg\s1t]qM9Z;WIzU0g{r1k%:hQ3=ug!oSHZbh&Q8c؛ƫ/n2JVUErE«O;|1G}h1@X#m(ks4U$zKFq"4djiZ,M%k;l77)b6F* ק c+aYдϕ?%*`褭32u=WYHWdҽrbwHM5)wJݯ6z}90 l{ؖ'3T ~z?Hޣ$7GpĽ (>)qu"jWCPKz1PKK>9OSGI-OPT/src/javax/print/attribute/standard/NumberUp.javaRao0L~ũ)eߠ)EMǴNrM mKjf& ~w_p3mVV[a1eIB\Rax9 G߆G:XC2bOr% TKhUhQ? ;Z'hCGSt 8C6F}@*(tcziOmϡs \`xy A%2o"qTi[֍"/Yu_ujt,jeaUYk-:DeH{՝$UEOSJGV-= A#[ ؄AA C%YInn*N" fteʫ5I! G}pow24EI$gY5UBbG`6:XzZ6s~GJEm䈩-isΕ/5`ih T;Ñ( mvP$Gؠs.Exͯ+ w΃!`'dp0;=<fA4I}[ i&8mHUںFgdLCT4 PK3yg8EPKK>BOSGI-OPT/src/javax/print/attribute/standard/NumberUpSupported.javaQo0ǟɧ8J @1Rn=55$/MiߝsMcDwI'0fge&!L⪒Bt~F~f>  +xKrX@ @k؈?]dWh ΢}B ±j !d TthOIK.j8ugMdmFbOi[C^&4x]BUXH/w SbɬhA[Eԭ$U9W ^\6Ĵ##8m zqIփqd/r̿Lsg8'Lg0<qz_|Ȗq'`L<"dOV r%sM(JAx"0hk:,L%kI[A>BFl#cHP7m䈥-Ɓi+_%*+iS/.Lp/eHUKNXsԾU.>>x!=lvnnBPMUcx@w?R>_x{?"Ļe{(&mvEjwF/X/WU>OPK+RJIPKK>EOSGI-OPT/src/javax/print/attribute/standard/OrientationRequested.javaSKs0>׿bd1.یI29uJ2w& Lzh8ﱒ'XVknڃ(+ D=o{݆"5ĨQ-1s j@*_[%*ͥSw] 败Nod)ֲAHF@U. eZkYltZ[93*Z0z74M㲍cW|Plzp0_B5(SsEgk`Jٌ fu(n4Lɸ6j7G@cc:^Aҁ^$}KrLES @8 '4BZ}/A8HW &ܞ"${rkIW9O)k#rJP"P\cd04/af$8%ŖlV 2Ӧu!*S3+] H F#Qlc:v<2(2}uiɋ%Nd#s.gl]ށyK43p>I2ю~>bO<L^B./8~\ړW`j v,xtM;Q#<2nչc{zݱ3TnTZ#I5uCPK#y}7PKK>EOSGI-OPT/src/javax/print/attribute/standard/OutputDeviceAssigned.javaAo@Wr+㤽AȤ ┪Ǎ=q];'ߙuVhwf|`۽ ,#%M#*“8~ siaȅ,QY !mEC%h N a4Fѩk E֐VA]-TPM;uAœ$]@˧F4@5Qv<.=qM=nv|M5SSAko' ;^ALU%6m@FSwFTu VL%-t(;Fc FiY1i_f J4_d0g"|i~ ߲,xZ0q"Vd[,JlMNޢQZ4ik XyFn$ ꯞA9B?VHEmbN-9WhlCp˂)oǃ;BU\.ĮTRw V^&$Op$[a&q8MrK_G7`>@!wPNIh}OC460b(7 y:|n6PKczHVPKK>EOSGI-OPT/src/javax/print/attribute/standard/PDLOverrideSupported.javaMs0jhn-h)4SG؋QkK$cL{W`Вɥhjpi^-tgAYr&2p}]. >)8P̡9jk@ڛ>|Cmp:U7r;YCv ip+^"6Ce dZާUq$pjȥeΨ@i8m`4ľŠ<,Od۪kQ1W5uSD%JGhn(`6Lɹ/k{2##8t¤$LN&L)E4x8iGtAt _hnv&w;OSGI-OPT/src/javax/print/attribute/standard/PageRanges.javaOo@Sr+㤽AȤ S)UU'΂kvqߝ'PrH7o~oƃ`덑傠0>JJ #kHB ɩQY,QBT'|EcVpQ9n`)64Ac=pcM zYwhŶOH3,\PiX:gAT ڶ Ŗ8ԦT;$;y]չZ06 jŌY+т6 Jn$S+ :BZ2rГ1rPЋ28 E<49EQ2O20$4$|Qr _8q\%`Lƹ"dOzdk\M(JB8hҺZ,M%m~ <}+k#%yu3KDy%RA9UadHyK4FXo9ytwh0-݋{ѥzHg!7`j]]_]Gp  w|SVũS[C[w0B4bm6}[ƨm'nOUzOPKA#WPKK>?OSGI-OPT/src/javax/print/attribute/standard/PagesPerMinute.javaQo0_qTY`}ۘ6emѺ]G\`gC@U!j }߹"&>YnD\URпބA䷱JY2;*"v&2'e@ 2pB\?X.^z8[q%kYhS r;VͱOIpy,\Pj\:q~7m#qM9NZ;N&4fFUd- nīDTX1k%ZhQ3=uk aڵ)uFw6GF\c 8C)Β,&fxe20[`2Ke2KyqzoIzxd܇ SqnZlM\˜%;2&_eTr+pǭrF 9F?NH"Ẵul%L1fs@ y%zuvNT,Ta_pJLvPNaiKʽ$u5Ə^u,NmxQ񀧲oF?|@In"86{rQPMUqdlwթҿ*PKZ<.PKK>DOSGI-OPT/src/javax/print/attribute/standard/PagesPerMinuteColor.javaQo0_qTY`}ۘ6emڀ]G\`gC@U!Z"dssY3Lt}08f7P9> oc dvTDM.eNRFd69u'!~R+G#coq K!-ֲ">A*z[whtcœ+'X.ug\a8l6GHrXvxLi6}]յZHÉWrbJ4gN{H'Uk!oSH\59SM( I×8KЛ$%n"N4l,H,W-~$Eq'`LyEdDdkZM( ޑQ5Z-ަ[;n77%vbF* ץc+aqP7++JT+ss2WRv+9R}.QJ2A9?&-)|L?.x  ;؆x=}#?h#}P͡?^\cTSU>mqu*R}PKo:?2PKK>FOSGI-OPT/src/javax/print/attribute/standard/PresentationDirection.javaUKs0>_ 2Ԧ1!gl2^Z#a2]B =֚{҂bx63ID#\WFTY^P% :TZ2r^AkdPKK><OSGI-OPT/src/javax/print/attribute/standard/PrinterInfo.javaAo@q#אZV.Ud*L8؃캻k ;k4E`䝙7{0QArcgU%Pht?;4 CzGE Nd&r hdA 1翾wF( W|0K`$-@* !֢"}N!!WۺGkt{zGwZYv䁚֧~ka۶vđ:,LlY1W#4;^kqŬ4`kV9V +dQkۢ&'ScX5YhlcC 8$8KЉ&/%ƋE.iLuL)}8IzqdvS8_2gkuD25b-r&KRHKv50,L%¢^r9tB?pBm62PcnV+_27L:kF,œYr9;H&mIsj71S^'[},9Q GU4S9ML1/MU=y,cx'c$&.wPR0&hmEgy:-k~PK[h*BHPKK>GOSGI-OPT/src/javax/print/attribute/standard/PrinterIsAcceptingJobs.javaMo@W|#qS"4)Z/c-؊;I'r);3<쌎<8PU[->@ B0!w0sfhP1I\`P]!"C%C%Po0q[UCɶ iKQ ceAHબ:FUۧSq$pieΨD`nՇѨiľENt+Y1w-49^lUDقX րrQ7ZX!! d2a 큑?N1 (IFЉ\Go,4daF(+ |! a 7-BT;$S!Kɚk#jZ#P¸k59B2=< dk+-ƒī͕@x%LRĹZdQfTemZXr)-7pك1"ŀ6ݧCX3=i?P)<1}N~.W=|m,JoZԿ>) оRuJ|PK9cPKK>@OSGI-OPT/src/javax/print/attribute/standard/PrinterLocation.javaR]o@|.b'(vָjEEpeFy<_blE$GٙgD# 0ϾHJ #y~D @fE d&sT hTh"O +h ;n`+4Ac9pcM z[ZInOmϡW$.x)gCT_mFSiS#gdfӷVZ 7ҰDͪrbhAAv[#I2 \5,l)c qI6Oqd#I_K8]& ӫdS>}8oIzrdqXtq"d$Q1k5U6D(bGPJ~eVʗ[4<#)vbF*n#KL%L1fŹ%P,fUaOP-}gcV wޛ^ŋ;c\&Q`c'(ȣd9$.w`5j*EK1q|i"Km~ RcT[Tl_PKgb:=APPKK>DOSGI-OPT/src/javax/print/attribute/standard/PrinterMakeAndModel.javaAo@W|b'U+-j+4q c ޥw4ib,vf|N`ڂ0˾ J 4~ "w si`NȅI*ikƜJ?I$E#]à/ ث6,4XCXv9\mvU jiۑj~[=m=t[[[۶#.ա /4ͦo~7BfZa JfnB!-jr20Vec֟6pl(agdgI:dmvx>E2`6,=O,/7=IC Юc +BF aH\Dd`IP-iɎ&}VÀFX _n8[' j-n#cY u1fɹ%XA^!Cpͤ/bY\*6dI܂^ZuviC3ٌ?'ye"ME= QcE]fipsȦB<1#!·OG(NRJm6{z<^?PK 2HXPKK>KOSGI-OPT/src/javax/print/attribute/standard/PrinterMessageFromOperator.javaAo@Wr+㤽AȤ-X)U{,ػfw'ߙuR"rp䝙7{'0S^rcgU%Pdr?;4 CzKE NJ$ ʂ4 A`C%懶P΢ a4FIU 5A* !֢"]N!!Wu3un=#AC,r;@o맍vkquđ:U2HL=L]ˊMZj0U+fKM\QwZX!Z59BŪB{`dO8603H|$ M<^MX2`<=O@OSGI-OPT/src/javax/print/attribute/standard/PrinterMoreInfo.javaAo@WrޠdAqBĞ8 ήljwfjy{ߛ,3hUe!̳O Rsdj|F~^`A잊HɕI;*Y-A\c.uh8&0A5/4#h8`*:T3( =Zx.nzf9ʁZ6Cw-sfj!W6xC<.&G; n52tSU٩QSiJ)2Z.I@MN PK5p)1PKK>LOSGI-OPT/src/javax/print/attribute/standard/PrinterMoreInfoManufacturer.javaAo@WrޠdAqJ; ήljwfjy{ߛ$`Ua!,O Vslj|F~^`I쎊HWvT@ \ |'p`akyiaІu$Aj0( 6Zx .nf9ʁFB@߆y3v]aO[MM&4x)é+]s`W4^q-5v`,`eIx*V3%whʱU떟 Q?P( F!ΒlM 2NWE%yJ}8/Iz>I<"dDOJsDr TTUAevd4V9N oSb~^>h2p5VicB[MGFd/Du[bέ1=c{LfiK!|B߯mb;F,ʨO6Cm]gpǦO;o;T{kIt$Adb )SNoPK8/PKK><OSGI-OPT/src/javax/print/attribute/standard/PrinterName.javaAo@q#אZV.Ud*L؃캻c ;k4E`䝙7{0rC̳⪒Bht?;봰@fE Nd&sT hTh"翾w4VjW|0K`$8E֐ֲB}5Tmݣ6ݞ^ő]W$]@oFCw Qv8l6qM9v8K&4f~FUh-HÎW5SbŬhAAvԭ$UkjA'SHKFz##[?m؄AA c%YDnn"N4&:Y&>A$92ރ8)]ǯ3>"s9[Se#JR(v5Z,L%uG/|EC:b'QmHP6RcnV+_%*+\3Tlݽ T=#rvP$Mܢsj71S^'[},90U4ӹǗ=؆c_ {XOHL\>''+DR0Aj6{zBOSGI-OPT/src/javax/print/attribute/standard/PrinterResolution.javaR]o0}&Onol)EMǴG7M li5sfeӨ {98X[#˥C?`}J giD~S%"bOr-sR 4 $ĵNJp^\xn[(Xbi69R!׫JXuz<[<BNY:WmFb8ҦV{^'4zͪU0Ϸ5ŜV6!sګntR!^V4y㞅?plBgH>Y6}pOq:K2LOdLR}Dk^ Ц6˔>)"#z&alM\Ȝ%k2&eJ:vK/|F zb-6Qmrp:fι%PB^ ̓U㻰GGrbL+RXťIxSE8B^u^kaF!at6aN\}P^I+޾GD]P G6{rQPMUq}2&թX*7PK+)@nPKK>=OSGI-OPT/src/javax/print/attribute/standard/PrinterState.javaMs0jhn-fi&Ga/F-a2]9Nm394vztLUu"ZH؅()B|<~3~;]. f>)8HQ̠j[)t7C%C%`$@* A6@}!!Ueա5n[NőM֖S:NDඃn?[kwQ4>o}QqkFh,|M]Օ,:^WD5*Ghȧ`6\ɄZk{2Fj8%ElDjrī(d,aijh%1@eφ42}])8"0G2b#RjM5rC-#P¸j0s2( ՗3yw|WZHsuKR\g4WZ H N [ 23O脲.AZo}*e2"'&ZYL{q\ۧz<*35f<n[٣rSʕ>Z>#z[:%~PKGoPKK>COSGI-OPT/src/javax/print/attribute/standard/PrinterStateReason.javaMs8˯ Xm7QP&86Iqr)F+jj$C8@d;|'Fųn}@L<<3&PTBLO" |&g)<}xE!tMuջ6)6E KPWs 2 ֩(5bY~rvYrOc8%^Y`Z9|)bVQ??ݨI%Š6KT'Ԛ B ¨^)eCU+ad|ui{XapE"p+B"7$n|&1<0$~X#e>^p>lrĺT)M;_g"!ūK5_X/BXB-eeB3&KޚZuР>k_)̵ZҘuf&LP {"ZLhk)"b/i˜gPbHuNY(vI̒1}tOβk~94LX@zo< z&c'he7q7Ly=BO9p&qdܻQvcn:,w҈MVzG|zyq$CX4 o'%4~g H&ĻgQL<bYG*,%Unܷh;Zd{-O阎[W({ؽ pϽa)Qf YHBJܠDؕ3'PQt;=eo NN:fA@x; ctX7WtyX?z@{Y1?pV[sBt/\ {ë;08i9<QzE6Rеϴa|aF|)NPK zPKK>DOSGI-OPT/src/javax/print/attribute/standard/PrinterStateReasons.javaOs0אdqIx"(Ũ5*&ޕq IX}{Or/=*6;f=\f݃`?ԋ2}1Z4K#R""Ci1Jhb3iwB % @tڭNKU TICXWjBBE7sZO׭:N4=w-t;?u]G!)ϓiN?uu)K !5pMTkkPxaԵN"fL.3bZ'1Љ$_cЋ\%8N')$$A^Ï$= )2+m>)C|0S$135YT@($G,j 02X] KEܵn#H0ՔrK y Y /Fh[?Wenrθ_p}{@- >nJg_ш3zKz| 73N=[YB+ff7=#|ݢ?/Ox[>c( PfݤiUFn_H3u|:aޟ151vнEFWfo/;PA PKuyPKK>;OSGI-OPT/src/javax/print/attribute/standard/PrinterURI.javaAo@WrhȤ,*)U{,8fw'ߙu "rpݷ{o`jUa0>+J ɛmeXx9;*"!xȵI;*Y A\c.uh8&0A5/=`ah C9X9 JCnuU|zOw=ìErs! ߆۶K[֍,f%uFWX(+WZR帒`,`iIԭUt9gܢ%)cV cF\ cC 8$8K&/%ƋE.YLUL橼}8Iz5kHLyEȈ^DXc$WS*jl$(͎FP*Ic*U-@Ӄ~Qmo92U>Jo^LfH&]Qd͸JҖ4vLg ?}9H{t[ɇ PKb- PKK>?OSGI-OPT/src/javax/print/attribute/standard/QueuedJobCount.java_o0şɧ8S; @Rh:=mjH?Miߝ6VAET}sY3Lt3Z9'P>߯q,(-fdl!\˂^dVu'C cV8A; .N{J;xK!-&жA*ztht}% 'X.ug\f4j6{XjTvtN%SwU7&ka跗/v Sbh DeϜԭNjM)3r9sM(iÇ$Oa0M矧7s&Yӫ&2ӌWdwfCж1!c0-"':BXmKYp4UyQ*!82kiõZ,M- +Wh4"`Sl6nT.K”QMOSGI-OPT/src/javax/print/attribute/standard/ReferenceUriSchemesSupported.javaTs@.ŎOhڏ$L!:Sj$O cљg0N|m `]q3 wCfjXF% 2 )"EfU,W{341mB &b'k(4Pk$ !n p,VZzӢX%pbȕaΨ(;NfZgmLa4je{ŮT8,a%mխ(PkPv*Ri-XRҝVu"iB rm_iq yQzQ -21, `<`Rt ^x߂bH-#V: ܶ0EO$d IW'dM5rA%TJX5 L-LKn`u+ŅqiݺSĩieFxDs*QGuUIe[" .0lwL<={M+ 2/?y߇ D]x.9fo$\#AAvM=ዺ$ 1 ; Oi.^pΆ'tJLlK(}b Si#'R׮0wj/?{3h`.ծ? Vv$UU>8oPKf\PKK>COSGI-OPT/src/javax/print/attribute/standard/RequestingUserName.javaRn@>NnVI[Wnx[Kvc;I4;33>f,~<"!*)TM&!]kXN hXD@db*mZ*!@cVpMw 4  DJ4CZ 9RAw yn &j>m6AtlmH#mqudvfoY0RZ oiQ\Yk%ZDikH  )%# = A#[ 8$8KЁ\'˯"NeEL)>C$92Cm)]ǿ3 }dkFlM(JGhvҺjY``*$z=s~8D"AC SLYsJTWºŻmк8Wع T}mS$[ܡz?fw@K&ʸ# 3 {!YEW:|}܁m84\'` $H3AXj2HQ=3X?&=7PK݀ BVPKK>9OSGI-OPT/src/javax/print/attribute/standard/Severity.javaMs@ p 54~KhitlL-̶+cI m4YmAg cΣp#>} at9qV9`Lڹ"$'+Gr%SZޠQ*4n3'SR\q;ob#~e"_PַRdW^% H rmI- T}Bc2i#'%3>?"xOY3UM<}Nj# H9)`4ag]3ؚ?p08|Ag8w#MaMpT_uH PKx)%VPKK>=OSGI-OPT/src/javax/print/attribute/standard/SheetCollate.javaRK0>7b V4нh]8Cpة=!샶h+C| 8V< * %D/ߗ#,Сb2')amJHko SFy8tګNo)RA!s(kU NbE4HSVFӲx'pr nZ?!^ Mӄ846X7iNBXY+ˉW{b^ р r|Gƻn">8FX4rdժy<6xq$b b%x|y2<D|IG:O6+Bxdamn- Z+t^!7[AT?c)TH\^h<؊]XY)Ԧ 1(ϕ@d!tA) A~1uNLu]{Mbwȉ%j:lV\~{0\ώ8?% £l-]]n_"ᑔ5үc.Vaռ&a7sU*}'[YrcXCxIQ:oPKX%_PKK>6OSGI-OPT/src/javax/print/attribute/standard/Sides.javaSKs0>׿bt1[jglhSF؋Qk$W1L&+phʤ3H{,7 Qr+ D>_wo:݆"5ĨQ0syBcPY x%KӜt*ͥm h5GRldK! Tk)T.ZbӰX'ppșagTPjfgaL׫e[ǮTyauo 0_j* ij \lF^ VTrtfu]+nȻLɸ6*sд;}@mcZ^A҂S/ % &t^{$bF(QHOW%G]@jT6䶝 ⁅Y%|S&\JTKod04_rvQ.+sOK-eIjCTLefWL'.OSGI-OPT/src/javax/print/event/PrintEvent.javaeAs0Wd\psk}2qQ+'dAv߾v_Rg#ô οK$M#* |~#+-6dʒ I+J~R+\GsL`2&[u8Ci{Hlt*u >#Z/~3x<p Z^ !=|{/q}$H:n.ZߦU>2XuveRڈ@Ԇ8紧tR3Xs0m*iE,#Zk $GO5|Mfdtcrݤt?fq:Oүȉ ɶTʝ,y4Uw&HFDhj63OSGI-OPT/src/javax/print/event/PrintJobAdapter.javar0)vrJ: AO&IPqmo# IY9.R80ćxdJp3FTb샀ʂ`x>3>i!%KfGeIK%4$nCi,ό++p CSхGT[=ś]PC#/f*-lU7&kЏF8?j*0g[P2sNy'd5֮ECS i\ % l,r>.oVpiEfde£K;'16SZBEɪR;2+Mf+?V˂b+ӋF >o}.Iw&V\<YG><*Q;:zӖؗ1| $U3=<%t9:\vMf/1 `f!@_S ]8N(C]/+=l%CPKjbKPKK>:OSGI-OPT/src/javax/print/event/PrintJobAttributeEvent.javaAs0x g!\B[eFr%weLLr%"f>YnE4&W &)6^i$KfO r# RhԚ ܖעO2o2Vjh A8n(XbȊ@RлJ=CN\pAͫ͹g\ysڻntR#Xq01kiy^vȣ 8603$_,Fr+eX% tqt,G cmlS8蕅>Z5r# M( ޓQ<j2;iZ6Jz3o4=xj#hOM9J`ǮObE<#oˣ(z >)k]T 3bSa!p4…PMUS<Kr/k; !Q.| +PKv PKK>=OSGI-OPT/src/javax/print/event/PrintJobAttributeListener.javae@ )U =lFPA0- דPiWo`P{p0 #!+jn ~}r_i!Gf:dlBi^hb-*L%@cIIW0)5[1OSGI-OPT/src/javax/print/event/PrintJobEvent.javaRMO@=׿bSR'R`Ӛ)Z;gvw wq >k{,8qYm%ϗ a[ {< {@oc~Cd "T(8wHLyBj1G zV,G[JKiK{d$e +QjWeXirU6\/>q7FjFpF@`5\KfqX)e/vX՟c/e]j.it "WKk6PJ`DҸH{ʅ0FfΕ<iCt'n=#r'(rb#O0Sp EF}fM-B¢YRf|3M5rRDP\qe֪|5ͯsF}ˢ[fwN%QU)E Yᅩgj[,@ևVb+@/mAMYB9ŧ^4S/ _G“ ԛ4{Cw4gaͼ+/H x#/IB: YH'e/šAQ pwcNiD]ే娟l+$"QR<kePK ]uvPKK>4OSGI-OPT/src/javax/print/event/PrintJobListener.javan@)F>ّ nnmNvZZW4qOw{g1R@|?\ypK՜4U{ |AX$d0^,́g 4Aa3A64X@+ `a#r9@mHI0u 148Ip'Bkd96HB('Fʬt Dv=<{kA/žUPsM8]ec՝%g' EZkу *ʩ5Y*m/4:LAjZ̴'ovp&Iu xm̧[ū9 [}h7$gy">P$`N%rG$J{5mVku)x]6lJ=zo:E e+aN iJKw9횾O;A'/CKwWW_[AnoJ`^GHwل-vW PKrKGEPKK>>OSGI-OPT/src/javax/print/event/PrintServiceAttributeEvent.javaAs0Wd(vrk}245V'&{Fo>1piU,6"&*# onK4X!B*dնn>=9cϨR+X.Ta{ݳ<mqXbTftOgd]U$cO#5O jvE! M|f+JU0ڶBX-ƞG?plBa%DI/Wxhg KLx/h6qd܇vM<"3 hԔɵx4U4 ՎPJհaJVn\8$vbZ*ҎxurJ4l yK*7aWt={z޿IS© ;YZ^%d]ѵ<4ΰ.p>Qf}, ^f?[dfs/MѪ#3"l2&/1^AOSGI-OPT/src/javax/print/event/PrintServiceAttributeListener.javamn0 S9%Efgm=yi !NVش͑4 {Q|!󧒛n`iQsd3 Ҷ%Kbn!=X :]>"V#sΓp/`&ch2 Π CQ䡦J 4';J:#%(Ǒa$]+y"(E_#$086IkOrz-zuU:V `ơՃ#&0`* i֟'mJ$- +&1-b ftM]*`&v&'HGs@LuI@|!6WIbI5Қn: 4G#NXѫB$C)4أvR\ct9 BRY7;zdcdo+8}EY- PKG/jPKIG@OSGI-OPT/src/javax/rmi/PKPKIG@OSGI-OPT/src/javax/rmi/CORBA/PKPKK>+OSGI-OPT/src/javax/rmi/CORBA/ClassDesc.javaeAo0 x))2;mMXavGEamIrܬxC C"IU+,M{>xL EE!m%$Lsqc!ӡ$GDȝY!m;Yu4$Ldv$ΦQG5^5zz( i+*z Z_'Bz޷X ıu\r]r-y~cսn9X)o-SIeF01ouoWÙ S[261I+diU m0c`QA؛ kI<;Qjs"y"dʅku 2:*/p\QE CS(oӛl$d#o99`ґ4?P+WdhXf:3^DPK\8}>PKK>>OSGI-OPT/src/javax/rmi/CORBA/PortableRemoteObjectDelegate.javan@)F>''5 F9.0M.]Y SRTP'띁y$!hD0Y.]gÐJ )jT,=R"w@N2.|Gp-an fSjXY`N N#ip oX`k (依znvCIŒ!sèхNy!03AΘ}ﱁؓVwQ{n݋?;h%ڰV+WpQeezʔ\μ0홑F?/ ۘYA6Ȣ̵"Kr Mxm2HRxm$'Gk,>xl0s"d/*9" ^FujZP ZT{Z5V{nBsF?;G^i$ іIe)$¬_λ%-Yϭܠ6VÁ DdNn?W4yEcWߢ4{()3aY欽7R2bNǜP8PKb!XPKK>&OSGI-OPT/src/javax/rmi/CORBA/Stub.javaen0 S9%E&giMXvBG-i'+oh0dH"~?*+Xis{dW IHtX|f,C"bD@専NUhƛ9@Vd x5]'PC4l(x n͈K*G ]zN vozޛq=1ӶszSut,% !*Kbmx-ҝׁKU SI,;Ѵdm+$n"-A!~y٦V6ݦنv_ }dF[zϲO` [T4h%o^wc > ¿R$7(hٲ僅[q=jsR^PKi=ePKK>.OSGI-OPT/src/javax/rmi/CORBA/StubDelegate.javaRMs0=_㓝q[ifi&Gk$*-ƞN{WN?So{٥rG0'o%U%x}=6$i!Af N,Ъ !hDίd X\s;h8M[&h-2rl\ ,N <:#p mρ h?;lu/zž6:a.\tUUBkVvA4*kDڀ( i3*`:aҒYKB86`# 0:p.C$A ) ,hn8[GxF) G}eJi">'I\neTي{4A֍ղT$ŗk4<#z{q_M6 93B{{- Rr߁a/|J_pۿ;7 5ế`,y]dZWaxEe֣'qqzN-NRgʼnݤzi)%.aaԹe%4j͹fu%}xw-y_PKd)dJPKK>%OSGI-OPT/src/javax/rmi/CORBA/Tie.javaeAs0Wdg\psk}"0 fr`%XR%t߻'B]ڃkHuԼY H¶LhkH@uO䁗( VЉ 5BXIie Q.+;lZ-(;س#i3H@[<,pܫ mv7L.'YXFrF(=^;k g#/u' 6ζ_zQh hqMG`JVkX֬tԃ斋f Fv`MōռEj0 3܆Y-S'9 DT+c|Ls&`0ѥPKBPKK>&OSGI-OPT/src/javax/rmi/CORBA/Util.javaVMo8=׿br[7'M[aŢl)R+FCIvuǛ78fQnD| 샀DJG...'@78 2DfELVpT @nԌӭ'4VhWDaY?u6;b;PځHZHX; Z#ܦӣ&йcцÅ\OmNY8֦nަyvXDk^8g9qmi1 UNkSȽ#>\@1gIivo,&s[dL&ft.3dk2 "ٹ(X Nҳ[42M%l"HQ \;tW4H۲ b6>'!KFc{@%^ߐ1:2s1DXWe$K1!KÛB 7 __d ?1#"n9EdQ-%.0gZBrAITEk-ao5g2: 9P' f/RStTgs×C[!hjӒv5}O/粬Xߡh"f_`GW$jw^kITAVaEAKJ:Ѭ9r;@j 1E6.OSGI-OPT/src/javax/rmi/CORBA/UtilDelegate.javaTMo@=׿b\lDA@2Na1XXU{g$R[3o޼lg0NdF_88iY!Xl t4M&S-6![a02Q 8_=JE,0/ Gb'JrTH\aS}( <1D3*(kNkuy2f5c[d6jr^HUwyJğ%4qV5e ,HkZ֕XI401WZ^80tp!\: ȃV,rKޕr}]I2υ4Mnl\Ca-JyDIDlQ4(3&Lס\d0 'e6Asy\ 2$!I3r;+L1a 0ҵͫ[29Ә-iag#%Ej5%fBkV;Gѱ%}oHٔt$ 5 h) 깈1d [)# +VM=zPiru+"Z.&mxo .c'c Q:K`4f5dog/wN !96l7/JM![cK@bn|k Եmv@)sWO9'24%V%Yq(קcg4s,)Ǣfo㗺O>;~[l~7?PKifPKK>.OSGI-OPT/src/javax/rmi/CORBA/ValueHandler.javaSMs0=_P줽96L3N29ʰjJwio{ӓN UzgxvVǐ8$Bp&+l6;c_#-hl :YFH41Dpr%,Aqir|)v@*EV\ BKTGi=waȡQ!E9a:>fXf*X;ҫyyT]wR`[ 9^iRU%ie5i)7qD`̠u/;,'d@1 ERfeIu~("*!/ "#| EFspw@2sP">R{IVcW"kXШ I@ijI`iocn(}a"N"9t )3fh|G%C tmVV;eve F>7ѾƪN5l]\tr[Y }R)>igjok&~uP> ̄O2˱Vy@I92"Ig1 *?6 U")(EēɍOWy) _PKePKK>9OSGI-OPT/src/javax/rmi/CORBA/ValueHandlerMultiFormat.javaeMs0Wdg(v}ks"0M̌qQ5*-n+Lg w?4ڜ,{q>4BW&Gg!$۰!c㰀)br ^: ̣h0&7q-fh Bcumi3PxzJܕ0]:AtH#miuud\ez8TXђ'PFTj+Z+ՁJbcUw2w)ScKۖFIAʦ$n,ByM6^:^me.$JVk d D&r; ;} 洣\RkV>m$#0hkrNSQM//hRM1DH׷M`ڭRjhwJ]}j+{mkŒcS ѥ? 'OHu[glQg0co@rm77J[6-!pPv"QTE?!ܚ>% PKz nPKK>0OSGI-OPT/src/javax/rmi/PortableRemoteObject.javaQo0ǯSR1H剥نVU}4憸#6MhT5D>/4& *$G_M>$peXNK4wXDnGiFnqv|%*5d$-ۃT! Ek BWz@kt>#ACQ;5֧6֟ðmۀuāeX&$[|$ԭ&j,'֊4R#Y[-Fm4:BE'cO(6&aeg#eq;x=]]\F*^d.a&*NZ}(qrRd䃏vpqL\dٰT;Ԓ&Vw 'Svs9(Nc@3nrxň֥ĭ-%wOJtN6qoG 8L;% z'R:g'a窗o2;E|]]`K2M"򼋼@6Zlj Um7ᛞt[v5wPKw֣$;PKIG@OSGI-OPT/src/javax/rmi/ssl/PKPKK>9OSGI-OPT/src/javax/rmi/ssl/SslRMIClientSocketFactory.javaur0)v|3T8>Qi0cfr5V#KTƮ6N8Z-~kI"OVV;c1,!UJr-7u t0a! ː`7Ƚnwi=uhaSѰ5̂4'C4TxX{Z+3x4sJAMD~$iۖ[%u}6_=Q_=h΁ş&*Īx ,Ҟ7K]ַbH\7i d0JK|JˬcR<1].|-J(0/l9 ͟kƀdcmC))B akz$W[)5]5BF.#MQr/=]迾B$ sN͢Y 'ҩlNxڗF<{qOa 0iXVr%#hfԲ7tѻ⛵8&v=@XŸ &9p;i|xִb v)4Ot .%~PKPKK>9OSGI-OPT/src/javax/rmi/ssl/SslRMIServerSocketFactory.javaSn0 =_Afs8]Q ;( hU$OE}rp Dp[*}9YIAF"OwCAamq3C TfhTB_7t^YBY6bCy(FĊ@vSuENma$.8Sq A&>FMĢU[WGdӷ˺6jDŪXV-Dcd)R5aY)ON-kzbڣFn $4$Oa Ig I$[fs̲t2>]@—4;e\w L<"O$ W(U$fZݢ3T6ʇg,ph(^W(4".["^EUdAjr_Kk52mA+t(P[fv:t+iay*vL<)S(#sK #o+gJ_h 'g0FCIMBh!!~PKTpf[PKIG@OSGI-OPT/src/javax/script/PKPKK>3OSGI-OPT/src/javax/script/AbstractScriptEngine.javaSr0<_d\Crk99f`frQj$U1 ÿ8@RlKZ]=/ EFups@2p#$,AQOɚK#rZ#PWܸc5$0s4_ql=—+<#zdk LCO ,!,T0Qcsn\N<ZAii1u :Jv{=i" <퀁3&$p͊z{e0Cr;K-6kԎіZ(bPJy7G{$/ &vS=I/8Zi3"גg3/<99PҶ:{{ PK?~CPKK>'OSGI-OPT/src/javax/script/Bindings.javauo0ƟT,}:mJ)ۢuD"tUMr ۳R FCϟ}$J Uk|i k2G^M&cQ˰J hXM(GiFhb-rw%%* `t-؃TAJpv@r=ZKn]< <jм* \QԶm(:P*Z%)OSGI-OPT/src/javax/script/Compilable.javaR0=唬R͉fuE$vG2-]ۄD{DŽJzZ< ]wl{3_ %Jba8tC{J0C y :UGH,3v#^,`5-YwpgPC9AM-J4HAf֓:#Kp/#yp W5M{)rp,mucZg=o=;< ҰRk+{dc{^׽%Oӵ@Sv GIHy yN6O[xN<ɶ麀MMnMHfs@udlmRE(o,b,GSM'F* V@ҁs88_<ʓp%㗑v"֒WmS;'zw VPӀE2(]X݈˽cC oxPKUxpPKK>-OSGI-OPT/src/javax/script/CompiledScript.javaSn@<_154Chk5 F9캻k B{7 mFovf޼*:YlDTRп? #-d(ɌmQ%2~t!R+\c=וz8[q%kYhQ 2:ktVcNq Pj:q45MqM1*X;y2{Ϯ]$kag- w *v6!9]7F:!^F4ȴvȭplB%n$N!^}]ܯ-|,.*^yđ+;`y" k}d+Zfܚ*jQ ##TdZ6{RnG_^hO$vbMN9ECV v9!ȓc]qKSqHh'JэP z(,'8F 3O$ޠ{&jh.>pUHs)PKD@PKK>(OSGI-OPT/src/javax/script/Invocable.javaAs0Wte1i 3tz֑$tlJ'8#ʍ!"( *$GO&f߰J Khv\ jBnki+!|EcpM`4]xa "y kQ!v $p=Z#ܦݧw$p{13j>s=tloi"Gʔu25Q]7BkZ8DYAk@`A9#eV] zΈv'=1I$>Y6?-nr8͓y%e' Ns^{m)|)BxVZpM5+JC#i"hc6 \\~qP>.]"Ьq"wK1x.9蒧зG*UZ13wGZm6zgwIQ;vmQuQ=* Z[NI.Q.?/su6E=~PK.c"gPKK>,OSGI-OPT/src/javax/script/ScriptContext.javaR]s0| O&C IL:>r%t{2&8$Fҭv4< &I4q膃1=@7} P`! TE -YLme_P*. ;# זzKC RH\AsXjb]jWM(C,5#8 %.nE7pX׵Ŏ0cpO ^mR {%9^*fKҚIFu-E6%R]3&JKz@zn~ԃ+7!Ylsߋ $ npzHQܖ8 Ĺ"D$b/Id*!db GP\seƪH`bhr/hhY7Ct6lXR_Ze)02e4)Ll5^,e4p?F|4||3 x܀t=2ԮnՈQ :7fݽ"zhxH̹EBEeke?YA̓R"fȒ=b:+sgJoQOP7Fowک5Jk#x/"~0+OSGI-OPT/src/javax/script/ScriptEngine.javaTn@=q[ZFI fSmP1 Rػ3o{3PfœN܅I4)g"F\ =秮c!BԨ ;`A2OSGI-OPT/src/javax/script/ScriptEngineFactory.javaRn@=_1D*jHnmJ.!UbG4q11V,q(v7o}aMke&Gf$De)'(0H3th7 YLejD F 'Z'p}uѩhu hAi!kH+Y"6GC 2FzקSN  L0|ZAPgz[Oa49- xdc]kiyE °\,k)DakJ+jE/\({<>c zQqփQg/rϿWsf(Ǔ ,i§s'g@X?۔>λW 񑅕 r%sM( Ax"0h+:62$ ] snFlC[i40SJgDRI<+fŒbvDTmzm&YSSҗkKlOOpHkZEb?m 0 }^ A/gdjx!BEO.n1'OyB{yiuR{~APKƢS+PKK>2OSGI-OPT/src/javax/script/ScriptEngineManager.javaS[o0~^~OPem4)tFD>۳BT knC.w9qȃ#KUk-¢L^ni`ɐ( fP 59BXJfLJo Nl:g%,X BZ( 70RTT.TcviXm823*P55VvUUl8: NuSu- 44("W)ׂU 5\#Y\W[.rيit47ViiHw6&&%-8(M42M8$$0C_Dh%-| ZF:R% ܵs3EH,ƒQO)K#rZP"Pܸ29/ev$z#cK Lg*EH F@\pk0;p".Fw"Cɜ%ӽߊr; o 5R eQ6]pEF51mۯ-6o`ev/pR+?1[9(-/!.Yj?= nV8-} 9CØjbNq+c{9ϟ_g{PK1U.pPKK>.OSGI-OPT/src/javax/script/ScriptException.javaSMo@=׿DPzj9V##a( f[{]cPYMGR}wg{f;: pF;~6",*#'!a0i$KfOȥHYڠV2p;BT?X&}uGKuRCm5V:dT9HLUgnTtz*mO3>;窏Q4hkGlc]4\QLk!h3H'U>[C^f#3r]'MK?pۄB/J=|8zxequ\F*X,1[$*^$@kA2C ئ|"R'([qi*ENP)clpe YJ'\zQO4 /]!U."+K༝kHmlK m>c_Cp;-p0(_M3ytQ*5rQOq}|Q)IEqr\JEpPKnzPKK>-OSGI-OPT/src/javax/script/SimpleBindings.javaMs0Wp2jHnm2B[OR$%BR%f߻2Nb>0Ү}ՊQ l H0pLv mL Ch昆Eyb Lр"t4K觌4JI؆'Pq%V*[Tr-L@e.M:'RCtF4&D`.>SVkX Zbk[Q׏{2OSGI-OPT/src/javax/script/SimpleScriptContext.javaS]o0}^~ObmcRE@"tU;wR{9N |x:7m9Yƙܫ^mX jTKL< [wx-dJWf;h^n-;éz=Β 75wK_ݴEji*'9wϔ}#˥ 3EC%޶.ruq7U6)=v44b~qPKnePKIG@OSGI-OPT/src/javax/security/PKPKIG@!OSGI-OPT/src/javax/security/auth/PKPKK>4OSGI-OPT/src/javax/security/auth/AuthPermission.javaAo@WY}Zܭp/qJKMJ)}@>s cƔ.-"#:CG$P.72gklEI(=iŎАI0`d*V/(<&14!N]s|JT+1Z,㿧Iדf:cLqb/`Z64~CU/gӲ:og{PK/hZPKK><OSGI-OPT/src/javax/security/auth/DestroyFailedException.javaQo0ǯ8SR1%V) FlfT0&U+,tY DRR0?YcdNTFMdARVdJd S/[QPڡb/k jB͈Iw]< Gs^_ !=<Oqu]$H*/ZߥU3uj~ĻaB옵 qiO餪BXw0mJiֽ #Z I#'iztu}C$6]XoXgt3^"-͖!#}?cJA m{YhjEEА9J2`mjyN_s z$ΑHp4DQ f\[\ !:;R "Ԟwſ3<SX| 1OSGI-OPT/src/javax/security/auth/Destroyable.javamA0˯唬({ksbl"RvGخmBP1ҮlymVz0/Iے%n_WZأEs*boH%JtBhQo ;KJ]̦b-I "{ZR֓;L.^&U8rgk!7A99H)Uktdւ_@h*EAAsS&j ަ" {?FncfIi>$OЛ<<'}m=w&=gd/-6! GEcz#Aj,[M'FH4Y+o҉p} z,.ŲㄆHt tWpCS rjܜUP] v7YESGTmGXPE$jΏOPK*c?PKK>,OSGI-OPT/src/javax/security/auth/Policy.java}RMo@=׿b In-@[D4q̦f+w8䃨>̛7hj(|􇀸,9__/# Рc'Q":#%2Cz]7xF9ر 0%>r, \NZ-ӱx%pq23ovgkm5Y8T#DtHIu7u+K44uBV*2ZVhU^uQ[3&j9&gd5bczq Iڃoq#Or.opVbSX`\̒u\w+YFJ{$S8) ud*b#8YcB%9 N枦;amKg((?ch;J I p#i{+ pvj(u`ĸ^2ruS"ZOpjlO*nN,_K?.{ 4qNUr-/?0>+Qaį~ѯ:-A^@:m|O6'6CPK3;*PKK>AOSGI-OPT/src/javax/security/auth/PrivateCredentialPermission.javaRN@<_SR'pk9!mš!tc"Ŀc(98̼ypS](JC"& R0')1,=--)xsQY̡V9p%B\1N~B+8&0Aw5ONװa;PAm4xϱr p:kpe;SNЙcgDmsW:W}X8Ҧ=֎ϓl>u$Z Pl"WeUV;'T1׮aL.3"ݫҞjc q I:/q#/r/.Wp/|RX,a%d1ϯG2?Re4+MoRWzoVZpޢQ*4aZ-̽krA y;eE^SCծ< :2iI #Fs)CVEx>t [O:E23[!ؚx!ZynD}1Le!w$ (XI`@a}ͭO[(%TMba[;[CAPKURQPKK><OSGI-OPT/src/javax/security/auth/RefreshFailedException.javao0Ɵ_)OIAַO,M7H!]GFlf3ajVF}w.\`ۓU0gXg$⦑Bbi^?BWZlȒ9P79)K:U q+r9~R+\ L`2&+oq:K!-JS roG^zgt$x= NhyWBzj/Q}(P*jZ&U>2utpŻDT1k#zhQӞ7IUauza:#w{մ\KM(L I68K7Ow[ǛMnUuzluʻ~$-{_cJ+"#zP3m)̹4Uu"T@FqEhj6K'p.Q8ch)CPt nDdFa ё*`z9|-O'Ol3pacSPKS<PKK>1OSGI-OPT/src/javax/security/auth/Refreshable.javamA0˯唬({ksl"dڣ%kPiW-o8 J_ e} {BXޭCUCrhNXGMBiAhu$EkXzbZ68 H`dj$RG=亩IeP,|@y-fxHLđ2m_6~LؽcԓZ0s *Q2k/FPDkԣ!G ƍ :Cބ[-؄ER@Z,SREM×-OSGI-OPT/src/javax/security/auth/Subject.javaMo1W8ADD$mQ#X(G^64w,)_!EM8=3?G8NgF$c5^^E@(`#NZzৡ#-Ѣb27FSS4+5P-S/1L vY$ aa$$sL\O-n\)U< ܖz3JHi4Z J7v.ly8&iEm^uڗ-QYJ`W& u<K!J6洧΍pB% zrf:#[3mHmLA5USu pawйׇv{tz]}{ :݋ YFu>5.B0 $"#5d,AH E3o%H1bj/_Y?"ȡY27>ِ̤WLHlx8AEЧB]PySf:<ZK$G̴ Ij#PeGF(.R&}VZ1}{q8b+e+4S !f{) tQ2)Oa*E/+Iu7`b^mƅӽhk化CCL}'=a4?y#t#[^s^,(hס4&^K)sئlORnm["IJgNzˇ[>l5S-bւyPKx*|PKK>;OSGI-OPT/src/javax/security/auth/SubjectDomainCombiner.javaMo@Wrr*cAN& `Q9(N*a8[]q*@A_gf\p6B>yA@ZׂIތF0ahPoqCnGipNP -tW"%&A~i0{^9h CXw[ BWM۫unuz7J(胖σl/}<6ֶo뺘c>eMrMfy1{MWwFc@'4u\dYI5@i`FZ[wZX!Zێi0Vٳr֟hlL - +.-"lq~tHe6+` [GCx 5z~O_ zx2bAuZtu=Ù+mxpPKo+N PKIG@*OSGI-OPT/src/javax/security/auth/callback/PKPKK>7OSGI-OPT/src/javax/security/auth/callback/Callback.javaen0DOvJnnmNB9RJf+,IY6{ $]ξf7 n4TWВ0],>Y䎴KY!<*IޑCr+$?ye4na2&(q6= mzO<$( ivDT_*/v,׍a|,!Ը6뮽>{,Z}`֓{8+ǎ3e*)jf ZG\ &RN9i EoB_7plBcW( Q~[?mo6y-V,C-% /_( ɺ1U 4-I(tۋК#9͎`pe:uPA;_qP$(S)${N蜊>S)]bSF/$PKPKK>>OSGI-OPT/src/javax/security/auth/callback/CallbackHandler.java}0)F9%+jҽ9lE]VUpKl6!QwjWȞ&X+}6idgq .Kr.z_0 [ia+F ^A(-V !ּ ++[OMb%Ϊ?Tz!,ԢCSځPڱϤIiPΩ@ө~M:?D0 L&.6zH֛4߼%j/; ꅡ3pMT%/(1H1<` ܠuF{aڕF@q 8$8OЋ<&lx]!:K]tq_.$˨v^9 Z]RԢdQG4& _%t wsFQ?~'fɡ3kYɻ*}AMi)tO:9*QA;篩kpf *;"0XmƿW^^keh/WOPKWPKK>=OSGI-OPT/src/javax/security/auth/callback/ChoiceCallback.javaSߓ0~OpS OzONxC9ont[!IJݴ=u o" joDv0#XR 8r2y}Eia<ɍ,P 5B\1N?}%h . =`З+O5lvP[$aw+Bכnuz{9FpF c 0כn?kq4kGڔca&^U?ja(qV+2*Y+ Ri1 U`uf:#ڝ #E?ؘABM&iI 2K.d,tz >$YH##U' "' YrQNTY[4Af#_%b#s_8h=7e"iBnq&eF3*ptb[AE'R4Iӯ!COSGI-OPT/src/javax/security/auth/callback/ConfirmationCallback.javan@q1\Q/\CR+٤QTUbf[vw;kJ8UU.`of,87/֒3 At2DG]ۼ(P.pj11 S(%S~.|Ax.``mz91뼄9[5 Ƀ+Hx \@ϋmS=f$gPS+k3Ӻ-KUv.^ѪޅhtHuԵP)*D fl J9䚋 *OI46SR?i##+1-'/j''1Ɵ18acoACo>=¹2ʃB vnV"'IAR<1&Ғi@)"(Pι2˪pjl2>ՋLeQlV¸mV,U*#X7 ح%>QІ4V6%geۘ[\ ,ecZ9 㻣 QRכ5YR~@ApNF݆.6]NOam7༥\*)&dݱmM̂~v4=?OSGI-OPT/src/javax/security/auth/callback/LanguageCallback.java}As0Wdg(>QmzqQo+KTn=+L=I3Sا]psݜ ;r+A"% U"o!$ah!K*QYUp;%?J?X n)`4FGt {qA$Xbz :rg$80tohx})s]EOiS2/|SDk w\@4gm@Or޺N3Tf_ xlB(!G9:Q1(GCB|uO p.#-5sx .oҠkJ9uAS|93퍂s<PK`PKK>;OSGI-OPT/src/javax/security/auth/callback/NameCallback.javan@)F>''j-j+4qo؉ŴrR?3W0WAjkaO`~ 7t7 1 ( 5-B԰Cćo Wn)`4FCT 5;TZJ.pccKU :n}Pe$g[y.fy]w(]5m<_&-@c@ϖk8;kU2*XJ4R*rY`Ti;a nYk Gj\@ccFQ q:QǛϫ Gule 5W"ī>B<8Y42F&w P;x#CW K J\m 1駲v`ߧ=PK}mSPKK>?OSGI-OPT/src/javax/security/auth/callback/PasswordCallback.java}Ao@q5$6'j&z]v5;k4R8moanUa,&?KH|6;'Ix t&GvOeJ ҎJhuI|M6(k𝬓Fy2qhr,@#RНƃ ̮:Hv0G#_h=7Ӯc:j*/S"ҟVZN\X0,q͛@Y饮bpf;lJ鼕E 푑 xla#YleutNlj 2d%>A2qklH2Eȉ!l5$V +jN ٝta`NzBi_ǻđhyB[_'*~5mSa3vliD%Eį'O6ћƽmNG;0FoOgxY2/}4' gKtʼn@g/_'BfO[TN=;C#CPKWx8(PKK>@OSGI-OPT/src/javax/security/auth/callback/TextInputCallback.javaSMo@=_1Ɏ(8>Q;mQ#\Q x.c7,UΛ7a" y0.'?qHL2DVi`< /Q 5 BҲC%o W)=`4F8([v,8 \ Pm;HsUXFpF -Տ 6ֶ뺈#X&IY~T]R1`-*YAZ@i`FYUw[.m4zyh$0JrH|H4=]]]Z%:a2[tGH{f"9ow@2EHIi5/ɚlkC-Xy2 xlQB9J&DAYкRR0ƽMe|qFq9D"{!x3 :1y(U <^uA9akNKN_lyu& G7PKڣbPKK>AOSGI-OPT/src/javax/security/auth/callback/TextOutputCallback.java}As0*Hn-ӃKHibؤXZ!%d۷%pScN}1*%|4`qHz(ѣ⒑B%4z!\Ч;t^ l `% ߃6!=B@@jfc;k CN%:N,'KKxLuhԶ-̸zdY^>֝V=8HG/-|A^o8C: &n RCfZ0,N.*5 _*Q>+peϳYE "Y g":.v@6e8E_YX%oQȕԚ^#fNSG`mcdpeaM_(I(_Q'(JhxLpt>IlTA(Nf Elp0;F!& I8$|* |t/hnfeIq~,*4Mg5Q۾r7>6b쬢_<05[/ۏ8 QjOk39W8OIPKeXV ="PKK>KOSGI-OPT/src/javax/security/auth/callback/UnsupportedCallbackException.javaO0ͧqU{k9,mD=dn;Ae[iCsHboDpS7[j Ld0ocQahN!< р"dU+1|Gcpa4MQyر#H[$na*Jtr] <j-4\ {iڶm:D&gM(g_<7LU*X k Rͩ@lbjZf0:޽ H_ (6&ay|uZcXd20_t^|^3d|ˋ"}M0y|P"Bب3X 5x 4jFRG j 6cQE`!XyJ0IńXS}iT`Wz4b]pPֶKf޲\gfCOSGI-OPT/src/javax/security/auth/kerberos/DelegationPermission.javaRr0<)' zr: tzGT$ ;OvZ.=۷ow'NpiꃕcX0?JJIKl29w$\c rdwJ!\˒" !(Wb|%8K&/ F`lx4C:"оCjf[Z7ݜ%(]a /.)g}~EgyHnbΖ4|*[f> s6Aϡ}m)C-"'z&am\M\˒2;&.ձUQr+ _a88@M>qT6!$d ƝGuSp hP*HQՑ=x+ױ!NOP*mI(MB7׆ @VNxk8 Q*_ s<Fx:OSGI-OPT/src/javax/security/auth/kerberos/KerberosKey.javaTQo0~T4PʺvhY[ &BWULriTRD׮ݤ}ݙ^TeB+j43!AmH34{@.x` Q]!Ut+jÕ׃ hGA* apK.64ܮ*)C-,pF l-zVfݢ(2A#@1 M? lG? Ž 柧sg32!Lgp:y0 5Q,#ʹdrg禋">TI&È/yD$g B֨%UVCc#x-֓Q of('Jvݠ^Vf `$>DzR)J B*/Hγ#$CUY&|,%`fQQU4ڜz^/|Q;>G''bH ;Z/=~\F<#5ӽ o݂}_m{tъ-C\swܿ1!jSK*K.1񸺹l/EP s!Ok(i,#czsgJ̾:T5/3܍=O=!⯕9SBR鯃/}Z2a7PK PKK>@OSGI-OPT/src/javax/security/auth/kerberos/KerberosPrincipal.javaR0S0h{h3=@'ʉQbK$Ǥ ޕ)@}-pσ=jE0K Bp!F}ymi FzȩP\@-ŠgN|@mp^wFP He6HRxaeAHTYuaWmN9NC-'S@ESLp4M[ǁزfxMYr\wQ@c@Zhx^kPxάr-F-m5:0Vymw#q 0(aDD.dve!Kf1Lf(J7L#vR(VU@6kv XX%Sa&"d^!WkԒ* u)! 'SRXnۭguDCϣ>8|oYM2cU,O3-d&*w`S Ԃⷛ}HxI`ea^,$: O+_œ$I 68b-}6VytD7lf#nABz4;O3:Gx}i CtSK1|IPKRjPKK>=OSGI-OPT/src/javax/security/auth/kerberos/KerberosTicket.javaUn@}._1TԐZ ¤QTaͲ1n\H"9gΜKu^C_%B3l(ʡ'g2Dhum0vhP/1R;G%,M6\It ;իցU TR ̸@U.!Tq;/T,N \Tjj3$4Vse ŞqGs`TW3);:R)i,UNu2nQ31&j>Mi7 d vK/#9'Fg8ǽ0C4<'hHOG^?!&Z$ܸ92[ u bK )9{,s2$ Fbh @IKёx\yjЮ>DrTN㌜jnNs?~’n=M Ts } h we߶iQYd} YtuuOu*(z>}ȭnWp ^- *}nhZea1Ѡt [I1I /k S!j[8M}n\-CB@OSGI-OPT/src/javax/security/auth/kerberos/ServicePermission.javauRr0=d(vrk}24kP"KT&n&&.`޾}N.F1a}H)2z c kFfEL FpT hT\Ԍӧ+x cWp);!,lD']Kk>=W=#8C 0׋ʹdҶm:ű6DvrlTUJ`w# 9jRYNZ%kA`AsګnpBXu-3i ayބS0J2H|I4<]]^'M`jynՒB:Ȩ>; y"do$lQdM +JGhvZXx)v1&A@9?zgOEPB5huSI䌖~ڒ?[*cE0)t{>]g4 gf{Ǘ!3؆Յ)[D*vPUH]cl Dp?QKxxP˄rP1[uCtzv\^{OKPKϲF]PKIG@'OSGI-OPT/src/javax/security/auth/login/PKPKK><OSGI-OPT/src/javax/security/auth/login/AccountException.javauAo0 x))<;mKXqGEfmIr/xX>ȐH>~Rz 3Ӟwc95Z~$"G@U Ad$iG:]VH ?:e4)!a4F q2m<:G!QR4ٷZgP $x4 N\n2o})MOę81NKKl^L=T醜ߝxshJ 6%y{u gLjWC_&؄(+#|ʼ}[>[bK,W-|/ }AV<{^ ckTa[DI ak.H%J5]w&@V#dʅku XF|(" S1q$;)%n#lfRN7DGOro $-x j'xގI|l t(zgPK5EPKK>COSGI-OPT/src/javax/security/auth/login/AccountExpiredException.javan0DW |WrsksRȀ4ȑ2[dIʲ߻t"AT $gg]$ؓS.`,'XV_UBKr60?NҸUTzȓ;PC4Q!??ye4.Q0Fhq2m:O<%Q P֫;\"  ,/a>?,>gԸ&k>)拲ZgV=7'TRl=hY0w*(L6QNm*gFcBQ9jMwjbQa|Y^bY ߋz ȸ0q>"*W[-IUGM'Bc4OKn|Vπui^[eI9F?ASON.mMUb G &ͥ4/οCHmosCn~t<_YHҊ87jPKlI^\PKK>BOSGI-OPT/src/javax/security/auth/login/AccountLockedException.javaQo0ɯ8S; U*5]65K`;Mi6MC"W03ɪz1, Y(%a|=$lc+rdT%LJvTY!kpYu28Fhr,N^G=V5:Jj=4v@ߝ .xr-/~>?;i}"ĉu\.]yQ2Pur~těDTRl=-7+]pf{a)Ty6/FcD^1+2&nlʊu>/\a,nu,x Yyq82Cֆ S8/\\KRmt݉PY%W.\c*4j? (wqđ8S":KS+}݆#lfRNTCIW6P)z38s<?U蘄<8;J'PKn%PYPKK>DOSGI-OPT/src/javax/security/auth/login/AccountNotFoundException.javaAo0 x))29mkXqGEfmIrxX$^$mNۀ`Q~ȚFK8˘$OnO`(rO:SCV*^ym . 0BU8;y'蠨 a{3D<v$K.hyyӷ } y"is]~=/{MCѯN;x}lJ56u#{6nB/EJ LȣL`ۤ(+#|ʼF|uqC\f*X,q(nU(xwxķ2C SG;Ϸƞ|KJoLɚP=9%>^g*4z 抍$aFr/“ء]؊\%mfKɤR3j~z-!Bb([ROg?/vQM{fCsPK8<_PKK>AOSGI-OPT/src/javax/security/auth/login/AppConfigurationEntry.javaMs0Wp 5$~KC39 {m ߻@4X}ZOkp =U5/iF'q霵_40FzY@ ^dS3p2C v,jQ$hzUovZ9X5He$ n oR,-p ZڊNIP3(QBIoa 0[Aosk7j ؖ8Ph]i^?NʚJƀ_kxVUf* Vh= 0DFchbz@_×(heToJ; L}EHrC2%<)& B-QKJ ng5y2]/_]?d7ԑC9;*J7#K!Hò)r_ZIe|} \ $V}x%'GOȏzaw{{@:!i4_ ^!& ~ `~<9_<|,>qhM@ HiS:VP@Di7U4Y'#Ü9aahN6wgފ\%@zK;rvb\|b{w }hz 3MިWljPK}'PKK>9OSGI-OPT/src/javax/security/auth/login/Configuration.javaTMs0=_S1Nd:N'Ntd$9qۤ_@Id{[K`F,&E!~3cJ34׸ *D 6GK3j#`}WzcGѨ V,TCHEWK BWV }:.;JZl'֖oú*ΆŶ O$N&Iu:TBE$U-HkjPXrk-FfRŢ{h$  (E48=E8<$0xDh=%|">xUjd v IHV)Tp&eZJ+aX \:Be}k4<#*0+J XeP^Y-(R` q `$yd*JpʄSFl2n{CZY.=pװ[FOj ²ܣH/_!CVQ. IR\kG4.'L}dUǰ HR; ƯUmZ<OSGI-OPT/src/javax/security/auth/login/ConfigurationSpi.javauO0ͧqM=,F]DخVU3I k;1Oy~$W\\0XwiےPa|=N tFve$*%tD AH*S֑Vp`4`+!{ZK4H[3c% /X.Uu.xo%I8I{Һ>/5ST΁Y80L%EA[Ey{KT=+ $-#~.؄QC}g4v(;N7qkR7 D!AZUTwՠ43׭(C7N0Z(o_* 09vƿYrYcМ( PK/PKK>?OSGI-OPT/src/javax/security/auth/login/CredentialException.java}Rn0;͇4>gʼnM^.]yQ߲N,eǛaUذV5J/U@SKtUh4M(y9Ǭ8/˻5*+rٲ'dm x X q^n%+ [} Ur++N4F*vCv/]V@ʽŸQ9DAGU ]FtU+Xs&h=#Ywcf xG<ῐ0) !$%_ ?;PK4NPKK>FOSGI-OPT/src/javax/security/auth/login/CredentialExpiredException.javaQo0_qTY)lVU}4%x g;TRj<$}=Nz 3mV6[q5."O1ym,aIɝH9ѩ,Qg8񋬓Z:bh4 Ga'Pڣsa#[*2R;3oO}@C`ëͥЧg}'DhۤYһ|6/GUKNZx}0LU5%>:PVzNo|/,Z:ooB{e/Pe%rYq0yW?+GOSGI-OPT/src/javax/security/auth/login/CredentialNotFoundException.javaQo0ǯ8SR1V) Fl6!Q넩Mds{Lz3mV6[q5""/1qm,aIɭH9ѩ,Qg8񝬓Z2bh4 Ga'Pڣsa#[*2R;3oO}@C`ëk!O{)MOĉ8ѶI۳֥l^L=Tݩ_<akfmEm!K|uR51^X 6tu߄G-؄(+#|ʼ}[>[.bK,-|/ ^ +-/cG}`l1e|( lFV@OSGI-OPT/src/javax/security/auth/login/FailedLoginException.java}n0S |rsksRjȀ4ȑ2[TIʲݻU ݝv*f=YU<B4J0NDcBÊUBUtE~GH[YoJ)q-Mntrت@ǒZQ};}@Alt-/!}v޷{!:i..Ydy^2Pur~tědT0k#{ Y[7+]pf{i)Ty6e/Fe&5FicZdEDjl^`lfli/Y~2Cֆ S;/\\KڪGu'kBmd5O^p Өҟ+4J}Ƀ< GeN4V&j [Lz'TBxGt+o[SfPx'<9> 8H; 'PKc0QPKK>8OSGI-OPT/src/javax/security/auth/login/LoginContext.javaՒMo@qBO-'* F9lA=ƭB#5=^33ۻFQyfg)]NahlqC0ZFHJӜt++A܇vVg,ÆAi"y +!pDZt p)Juq $px13 (ou*Y;W~YMkSQk{t4fDD(ւ^8+X%@`A:s:PWF8.Xr3l:#r4#~*1$4k$Kn0M׳&y2] fsͦW"M$;N2ʃ҄ Sv>"X N³[4*F0VK`#F8guD(> FlvECy.Fϩ%#Iip!znWFl[fJnte)M  g3#wAq Wp&eNG&(i^2?χqf% oR/U奞eCQ7 r[-P'j噑N(zPKPCPKK>:OSGI-OPT/src/javax/security/auth/login/LoginException.javauQo0_qT,a}QED>;{2hZ'piNVU;`Y)uli ~a"G@e A^IҎJ$ #*S$ѸgPMnɴ؋hrت@GIҐf hA%i0/]@ëF?@Kt]86JsK"/zz59KZe0fEc!*K\&PwVy)NX 2rުM/B7plBcȊEVLc|X1]|- ,W/l-s^}C?GNACB[DAt5g$אT[%ٚZQ*s {µ:,L o+D;qɖ:Ţ67Qn8RZ0}[AI#MVŰ~k> j: U{9.A0EPKI' =PKIG@%OSGI-OPT/src/javax/security/auth/spi/PKPKK>5OSGI-OPT/src/javax/security/auth/spi/LoginModule.javaRMo@=_1)&-'4Pԑ┪ǵ=ql~ άcD*r@ۻ373J6'Bj<_XeȴDf%#2Ku!ּO4V!ׅzI8([~Z9 CXX QCit( B>$eDS;S :R I++JԤ4aFpܵW FQD> @|bɡmbiC4D}JO^JI$GxQ='C%kg(,%Qr)c\iG,ς\ʜ`熌d\KwB[߶0nJ1Dy꿼gPK;4}PKIG@&OSGI-OPT/src/javax/security/auth/x500/PKPKK>8OSGI-OPT/src/javax/security/auth/x500/X500Principal.javaRas@l~t*LT3j8~8%݅w jG@r}{Зjy>L[0Lp3"4ξ{ \Fi`)OQ̠j3P^uLJ AШ[VId s!-I)* \@*窶Vq;[ϩU523"(:Mlmz̬UvH ִO NOu:/Ki "W)ׂU 5\#t+-FNm4:;xշ(y4~;<y88$0AGhEH\*6 ŹEHw,LƒQ)Oi5,G@sՐ|-ҽܠQߜW``ZRBv,: %J/Xi'j|\\Q99 /: AY{7[+Ɏqf m$:aSx CIȑϿvjܢмY=DG6ӝ\5@OSGI-OPT/src/javax/security/auth/x500/X500PrivateCredential.javaSr0=_ 2!m=@9b ɕd'ʸ $LO{oYg0ecDqX_R 8B<@#-,Ѣa'*AK Z8Az]7`PAe8X: ޖZM{O}ǡ3hj} :g\q8:bHb(X;N&y:{O[%Z0g TqVjXazN{յN"׮f=M.3"Ih4c4ICOr.nWp/|RX,aOUS=\%iH=/w@2EHO$A-dM+ ChZ{)1/`;,j"VM0]eQ~$pHwjc';*' *)DݴyuR8G"^LO`13 ]axG/Wum(gBg vZr跽/ (PχN4G忓#-LkrcIPK3LPKIG@!OSGI-OPT/src/javax/security/cert/PKPKK>1OSGI-OPT/src/javax/security/cert/Certificate.javaRMs0=_ݡɭ͉:n$3i&A5w|r02}["/,gaY &9x6;~OWCXA`#9 j[ :>|Emp`58NհeHe6HFxñ $piE?g`qJzPegt0m^qt>-wX3=8Y#íKY1W-49N;`,%%kAi`FYTZX!sؖit40VB(6&a&%#&Q;heyp uH`2>2'k8S"9xSid n >Q;IB.65,GUZ#Poqk5$0s4 l_z z` ڞxURRϸ^2;S,­fT;ط]H2i ZǓEaK]ABk,y(.6 ӳAlX)2B Jj^eXlЪa%G~%?͕GI,wPKRPKK>BOSGI-OPT/src/javax/security/cert/CertificateEncodingException.javaQo0ɯ8S; S*5]65vմ6N D>'piV[`Q~VȚF - ] ~$aˠtX#*aB)IQNWd᷄?Iod2  GM@M8B3F5:Hj=4v+=( Y{r-6B?>=[i}"Nc9k]zE9ˮ{ݐsS'^!Zv%Ś6%>&J1^X J9oպBGplBc>fe^򐯾,WxȖˬX%f6_勂W1#>thmmQ1gK%6JhDM͞В)ձ*`S^sFiq?؋CHv1dMvkq[4Tt~ŸDOr$ 7_OxiC$$|[^xPK[cPKK>:OSGI-OPT/src/javax/security/cert/CertificateException.java}Ao0 x))2;mKXqGEfmIr/xhAD{dU wВ0>MI +rdTƬDn$DK;Bɿ!2/NxqH *HL8Ak( tx( ì) *x m_&Bv7_XıURs]ryCխ9X*ˎ7'0k-: QY7+]MwR)VmZjhbi r,o׸KW4_g:[g˜wߐSбc0- z5g$אT[%ٚZQ*s {µ:,L +4J'qɖ't%Y5톇 Y fQh.<-W^=qcчAx9ϲ_<;  PK`,I6PKK>AOSGI-OPT/src/javax/security/cert/CertificateExpiredException.javaQo0_qT,a}QE@"tUs ނUfT*4-l{w]%أS6`(GX_QBKz20?ҸeTz,ɓSC4S !l ??ye4 Q0hq4-vmZO<6!A Pl֩=]" { ,6o>=,.'Ը:kZټg^7=nGTRY0s*(]&tQNp+#V A^(E9&~|bVbt1-VbΫ/^o 8cQ] l[j$VԄiNxhӨ "+6ʒs~8d SI.$]s`)o"`c޳$:ҕKzQZa; /iXҒ 7럓PKx`PKK>EOSGI-OPT/src/javax/security/cert/CertificateNotYetValidException.javaQo0_qT,a}QEDh+s ނUﻆL.l{w\E4GP0/*uda ~atX#2f`r$iG%Z]FH'c%Iu8VI}ֺ.b{]sU'^!bͬ`,Deϼ ԝU^j g6Mja/bi`-xL4_f6[fW_+|1#>thl1U|(^ l5$FIMWٓ<;µ:,Mv z5WhD3{qɖ:ƒvaBւ O+VCt_-x ްg<!klNz( PKb~lPKK>AOSGI-OPT/src/javax/security/cert/CertificateParsingException.javaA0W<ԮBR{ 5]V{tijH`;Mwm]9$7N"\afڣUc,'XQBKz:}o'IX2(J!)IQNWd᷄?Nd2  [M8;q6#P PW~{3<fBloߥi8'isֺ.͋r{ݐsS'^!Zbͬa,Dm ԽU^:3 KR[~1Mhy98ED/6Zj$NԄj-ٝrXVQ;?-1WhF=}{qHɎ:&naB6g O_]O!\$:xҕKrQ)z5v<_9 $%v:?GOPKg`PKK>5OSGI-OPT/src/javax/security/cert/X509Certificate.javaŕMo@W8AD C Qz=M쵻;Ơ($%"̮?hڨtAБ]D_YCzc:)Z4KLyFм^~|i}.h4Є)c(U?Ƚ'<{A Y\{C&hoD3Lۧ7kD&'jYNrjPK_j0PKIG@!OSGI-OPT/src/javax/security/sasl/PKPKK>=OSGI-OPT/src/javax/security/sasl/AuthenticationException.javaRAn0K-r+KNԄZ(v^ZV{~A9DA#Ke "+ls݆D֘tܭCTe<#7#_3< Q ^Ax>.vF?PK 'PKK>7OSGI-OPT/src/javax/security/sasl/AuthorizeCallback.javaAs0אZN. `LmJ2߻2NJB'={,{퓆\DW{CA?"BKIB2~D~-;xkQY,Vp9\E#^^װ{PAm=š$X9 VZCn\< u:s *[ptl>MD%)Xkd6OgS(ւ_58ۃ*Jр6 J紧n 9ReV]# z3EhO)BaHœ֔hEPAfKeHڒ]:7;qYkNhYa8Ä\ fkцp"X"_B/HG)M;Dymw]O|3OSGI-OPT/src/javax/security/sasl/RealmCallback.javaRn@<d" NnOq[Ȗ(.V[Vqr{̒\iF[qbHBdrؗHY2{bf$7$mB+2p[Bڊ?C'W2V6Wc Q8ǦNsHT::Hٵ^i~h '.x% Oֹ}}1u6fE>˪[ZIÎ#D˪JQV%z46=xսN:m6‡4ȓe5*]y :[g>"]K@Ck)}ϷL¦yd[*FlMם u'Z2;iZXy%w w*%A9D^bKe c+mWp(?j7J<>':s7Uslg/$`;v6~;"NOOPKPKK>9OSGI-OPT/src/javax/security/sasl/RealmChoiceCallback.javamSn0J=ʽ$eJ^}p-g2|8np\kxBEPKg PKK>*OSGI-OPT/src/javax/security/sasl/Sasl.javaV]sF}.Oq҇i: X[r%C;f`[hwlb |\=칗=i dQ|67J8yΙHZg/:@?fjPZb )"Ef,InPi.9в Q}n!6ۀJ5d5~,mjcE91Ejz2_PPr$пA%/AA׿0)6 Yo$}g[ڍsIȔ'/4s6Mx%W~g':6M2X⪂;m{_Ƽl5z\Zl@\ُrԭwfdu7zU%:;tI2aTi!않/DAnfij˙b*u5PK|<& PKK>0OSGI-OPT/src/javax/security/sasl/SaslClient.javaAs0)' z2i)amolEY%.Nck}kN#86ua\N`H)Pl |}=2=U1;+QrTA*`Ce :sh(&-=C8 I@%BAwf@o .]xd9OۧB@?@~lu]Xz&Z7J,_ba׍X =a f؁%y;+P-J8oEg=2rO*%9&yOmm^'&]Zb]t;H;fS ϡcC)B)BN aHP)TbMP=Y!.1`l p,8o;*[N:y097Ov<霗-A~X>Ԫ΢y4$~ߝKgPKNPKK>7OSGI-OPT/src/javax/security/sasl/SaslClientFactory.javaSn@=Tf8@Ȥ):RRUd3q]!Ĩml̛O"8VK]كqYAR $ 1mO2L53%I;Cd/ %N _:e4tӶ:@55p x1rP%m$UiVU+Q~ۧe J03 Gxx ݳz7M#pX[=o(G/Yu;uKr,edz-`Ū$Xk  XX7AucWoR+筚Yh5 5tҼ<@rNwSO&$t3^]B=u]@C,S893 *j$[EAad5;JpMVʣߕ6G#}5n#YsB[ЕQU8L͓] t!7v GF#%XDΩ7XpWmX??0~)$犓,97yiܱv~Gi39X%D*IEPK/45!PKK>3OSGI-OPT/src/javax/security/sasl/SaslException.javaAo@WQ-Z-V^{s~8Fʎ:EV6h Xr~ё0Ik9x7N^Lgx QAOx^_+ףKPKh*mPKK>0OSGI-OPT/src/javax/security/sasl/SaslServer.javaAs0' z2i)amoG0wVaZ rHl{O4S+Qmkq] Ax>M#? +"KfOeJ$-Ȓ -AafX$G3`4LޢS 4CX؈iBBvz@k .;d9oB@7@stڶm=qL5Z;J4[錇3 | NJ,c67sEu"8;G>n_a͐{4ȗe|PFE.nV/ нbR];Ep^R`(uۧS&$v֠~uOg?-PKIKPKK>7OSGI-OPT/src/javax/security/sasl/SaslServerFactory.javaSn@=Tf.2iJ-ZGS qo&΂58ߙMξy[;: ƺU'qY*$Ab8<o—afdlh!(I4Ղ A\G2V .zָJ;h,1T%m%TRNZj?cJйC#7ԼZ]'zFQ۶6ET6IƓ4d]]U`g ;w5[0{N{խQNUEV/]tL2`:OSGI-OPT/src/javax/sound/midi/ControllerEventListener.javaer0)v|3.9QmxframJݻt&N8vo) J Սy] n[@߮VC3-dhXETXB'K4X)h,) >a6f;/qVrYd PQPrgR$4i.@zM8?E0 Ce꨽h7iySՃlZ0# 4S@A9Cd*7^$ :weFe&$|<ɗ^1=1β8'vw}Ov)@>$_eO [ R$ M֝jգ<h4GZ-^#9ƣ7sFQϿ/ыShG*.݁dJ5tF-Mmv;GmxJ~caxn2qzaV?PKj 3PKK>-OSGI-OPT/src/javax/sound/midi/Instrument.java}As0W'-'(c: tz#HFf:wh)IGvgdvD4RL&16J6>bA̖ȅ,IYЩ ܚ񃌕Z$ !4NNw؈v,XɆ@%Rԛv@[ *׃.t-V!ε'N!׎/,?CեjZI;JQ0k#zhQӞ7IUǰzzaT:#=1큑G Q#GY{lu~UXevct>;˖|ƫHgb[}5~Ɣ)"'z$R)WT݉P-%e4r#pgsF `oO՜ld%O+IgC&/ )Te&-᫩;7.x_.VI\p[|<o<ޞz?ا?}#ib# Ey'ƐsmpPK,PKK>;OSGI-OPT/src/javax/sound/midi/InvalidMidiDataException.javaAo@WrJ`ޠ'(T=N3.8QάcVჭy{N"6gø̐6 * ׳ٻ)$۰JkrdTLn$娂VUd R|u\3h(&7[8:vㆀN%3u9K Co=jR{o>$Iu1ıu\.˼XN5Xղ3`֖u,{V-ma/26T0J Ȋ|LleutNM,`*_dl|HF&ؐ@09rPB 3TKkZ*I]V'Ui}WpPE2;-D$lP3uĆoRYe_NT8`ϵ` {/&$lh~PKv?PKK>4OSGI-OPT/src/javax/sound/midi/MetaEventListener.javaeR0=唬({kf5Kj dZ]@1Ҧ=o޼L| >iHa~\~׏_#-Т鱌l@iNh- ަJXRn%=`6f;OqV R9,2YASI(T'i8gbJeP'.Az &wtNa"1*悵&]|UO]OAk௎ ;>AhVUkmʀ r)z0H!XUA4%Ygйid0KrH'y9>9ls`}CȑQ]zE%9Bٽ OPKn% PKK>.OSGI-OPT/src/javax/sound/midi/MetaMessage.javaSn@<_15&@¤QTfS1(U냭ݝ7wpYYDTR o^跱HY2[CV"2#e)Gr2pkBT?IXF]GKuCikH, ˨r TFNЩ Lx:BY;W qM1(OX;/'d]U0{]e"eh DaϜ#TEV\# y\ZgdZgM{6ЉI$N^6^~,q-lOϮe<Ƴ>[uhWmJ='KLdTQP-ʼnPHj`eJN֋\ ?н؊]h58;lpJNL٩Α J8#jVRx2޾?=[sn7;Ueo0hG9V}{Z\mԑÔ'F[ w%ҧdr_=cZxwǟ(|Qggtj+J{_ 7PKB^Z[PKK>.OSGI-OPT/src/javax/sound/midi/MidiChannel.javaTMs0=_ɭ͉8i4qQޕ-qZlx=}aڕBXA ,‹|,re:)K,#bp$@iN.;Cp%"C]:a+Bg8 |.%izgqJsegtCKW>ןѨGJ#m2I u\TlNZAi`FYT[.!Uٞit4%7VygLjd0sH\yc2=1NtMa,R qߒzH|nۀdrg&E$Tj#ɴX;V#jZFТnqX:n]^|~%{"\_m7''4b' &% [*^"UMVU!=;/ %V+,Нk~Ƚ6, ΕHNI(ZH|mBYXkUksJj`k-z?dбD nt -b0^M2>[udo5wz2 є?APK[-OSGI-OPT/src/javax/sound/midi/MidiDevice.javaT]o0}n~O0@Eka"Us;wR&Us?޻H;#6,&`(`#/.N0hl0 \ bJЀ[! stZE؇h5Vg!v5ہ !,B"c@(z7JVO}Q8Na 0׈>+O^Y!d=YU4L{Rd(ւ߅0Tr,'U-Id%h,3H>'TSW2&,ܳ5R65![eGq׃Eﳛ tMba4E4+ #2mn|$SvSTגl\Si*+X EAf-%b-sE]_m6µH ȋ%uФ|M1n(m=.T{YnCMmzaL}$f]8e>?m8mЁGxXIbZK)^0igUL0 R <ü`Ѝr#r*|%”񍩷mޜ\]WdajgJar~8Cߍ =Ύ.eaNU$mQGaKׂbZ%?O#3UVFeD( _=-I tX8!+z|'!=.}p?.k&,Ǻ|uuz PK*f~ PKK>,OSGI-OPT/src/javax/sound/midi/MidiEvent.java}As0x 28\B[O5Fr%d]v>ۧoW7`dqgoqYJ2B.n a,bA̎ɃHYQ ܆W"_'+].A؊v-X˒@*mա5m{:OC`OK!o\y4j&-qM1*OZ;zH&Y:]Փ*Z]KSebŬh DasN{H'U1kC&KM(I×8Mҡ7yNOK<NjE<[&&}L3>}E<{dv?WwҏHd+Zfܚ*jQ ##Tdg {Rn ӗhuVrT' ȡ鎔[˜cCzƼNhR3#ooxgmߗrQPuYq<[,]R]vZ氝&jicPK&dPKK>1OSGI-OPT/src/javax/sound/midi/MidiFileFormat.javaSr0=ǐ4=! I/l#?6bc (hŜX0xCG.^2 Owu9 0p^x^ή  0efR*q'|ŝYc,\X+ UpJHoz8W5{o#']xg^5 埫wz0?ÎG=}Im%:JaϷBo~P)%MbeWkW[vv VmQB4jkӗZ3'_79"[PK~0 PKK>.OSGI-OPT/src/javax/sound/midi/MidiMessage.javamAs0Wθɭ:n4gLӃ5V%* O&+BҔ1۷>$ :YDTR0$XD)sǷh?ArcPKiP<PKK>-OSGI-OPT/src/javax/sound/midi/MidiSystem.java՗Qs0 ǯ,оm}b-rzLPoNRnc4e"Rp"ӹ+ C=^s&Q{ivFVR5C4X%<@1L\!RпjŁϨ4.@Zj as@tp :$ nJ;K95mHi 3tweL)e%+լ/du;kvMDZWt,%M5fHl֌ԅ↋ZF` k43kAU Mx=߱J.d Ѩ7{}#8N7 zK N@ TYp."k\ \f2G%#HQ%\ת 0jbpL95i4(߭o,g׮$&<Ǎ4R$!~) &pxU-iTBiJp'>VLhogi*U-_F5P/m;|VTkקCУmDa̬a(3+zYxBrDbk 0* $$Pב#q&|&) mbIJ@]fPK"-DPKK>;OSGI-OPT/src/javax/sound/midi/MidiUnavailableException.javaQo0ɯ8S; #inrRNj: &C"{$W0le,iHJz6{7OⰍUP:ȑ=RC0%)GZUR#J )uR+\3`4F`q- =ZG!v!Щ$!J}0Z'?gp $x< n0ڽBޛIu],zX:i.ZeE^,2еQ 9KZi9 a[fmDm!jK\:PwVz)NX 6tm_ #G) QZ +FY1 &r}Z:[X0_:[4,xd| Sq^n+ 9Cɒ5G=H1`ly^~\$x?qiYɛȴ[$F07(&v'U?Xs1z3}<#ݳ}7qΆ( PKe?PKK>(OSGI-OPT/src/javax/sound/midi/Patch.javaeAs0WPprk}"2qQ5V'M;Iݧ߮`ds,I]K j: /ȧJY2{*#v& eDJ2p;BҊ?C%/2Vjhh2ݡ(Ybi5 jBv@۝ .8rZon>=;گq}$Nđ6U\6M,_|fԽZIo-Sbì DekN{H'U!oSJt2o60JrI7yH?k<$UE eve7$#~Mqzn1_C3m[YhDEВij6l0o{YͺmM W|x,^irOkƾduFa:͝ѕ1^PKZPKK>+OSGI-OPT/src/javax/sound/midi/Receiver.javaeAs0Wdg(89Qm&0N39bbI'ޕMg@H"6'K\.d}OBIryIX*T:С=`B'ajЂ!dFH~M;1|GH+I0ik '=^@iC -xh<fB}&@ϓz A 7tDmԺ>_zSG⯁,;ޞ@bˬA[E:P<.[? A!-m&lu&̲z: oxʪ*+6UY囼,x] ȑq<0&8/5V_AI-IAt>U =p Ӟ|Fiq?qiKmd-'ɡykP"q;x45 {pοeP5uchrvC?(PKp`PKK>+OSGI-OPT/src/javax/sound/midi/Sequence.javaTao0<~ũb!m+lFU5MI.3!EU΁vv@.wi`NU@wxa HQɵdrgj"nIHJ1)5,C G=ƍՐ>jQ_PV#`7Q,OSGI-OPT/src/javax/sound/midi/Sequencer.javaVMsH=_NaKU$\- 50ΌT}{$HHNK3_n/`$⛭nx~'as&BoW]EjXF!K2! "Bf0LXHCʹ\[WKq)4j$ac|11rl<Uw\FpF ݭ@`mI~2ŎT~cu&^0yI[֠ߔ+xuHk B3Ҫ>(n@˵90&(JMi'Tz@mc.%nг$_t' ]Gwo`[ee+ ܶ3 $e.I'54Ia#U jYa&[je;'Kك%+$5͠Z3zy[EAΌ~Ƹ sQ0h!0fTipLF 'XL딱,~4Gog4fؽQ%M2,~'iʍ_k)VJ ܱcd=SWrVRH,֕HXH&U–h`vdW-؆:#j`Yc6mw;˛A6?,FR%dLh@|t}CGũe?Cþ܀-UTdDxӵ%o Ssf"grHI7buMьJj (6fujrAcku,Y%F WZgk]XS\jnnuz잢|F/XV j2S!N{#2fyJJD|+ 3Gi( w_Wh?彌GWWpu4aD7b|qoP|X9LJce,+lWf!$L$^=y}*0j Tv7wUVnE~* @뭏^n3SX;md(eR;PKKO/ PKK>/OSGI-OPT/src/javax/sound/midi/ShortMessage.java_8ş˧'hәv}H lV ;4wuBΆծ<@H~slKdW|6:cns*2a?86D1Ԗ-T"1J` ̚[ ?O)ͥӇ..:Vb/K=i 5%Ln7A:8ł-OA`z)~vC+ǎT^^7=>TDδž\=]et^sgFZ; .h4;YpmIh?<F\1wc?ZO~rF$>! an 02 e'@Y"Č=%]/yUIW Vr˔`jõ]VV&nn4mk0/V3GK _VQ1IrTfV-  S3ŷcAaA['K$q5` q 2I"dz؂/M!*jpIj;->x'( oR78տ|P0G~SzƛaB52l]6%w'm}F4ܟ&#q=ɏt;K|o؟u@y޹o%JIUM–9ݿ=JpqKa?jJ%,9V)Vxk*Osl(: Qi&VfݶwHZ3/4 {x:Rٿ m%_fS]8\ WlPKfK~cPKK>,OSGI-OPT/src/javax/sound/midi/Soundbank.javaOs0Sdg(9Qmfp8d:=`5 0tݻI'FoP|9̔QoI&9b:}L"V^iaˈɕ(- BP JE4hr-A*E* v $pns3xnyT1A PK PKK>4OSGI-OPT/src/javax/sound/midi/SoundbankResource.javaR]o@|ň'!ykZV##a(gK̝{wƠ=pRQvvvf΃gjgdr=LQYJrBb8<z?#-fdlh2'9)K jAnE*񋌕Z".OSGI-OPT/src/javax/sound/midi/Synthesizer.javaTR0=_S`R'pk9 m= Ӄbm[R%9߻r\0iN}'9Ca,Uy[0>q3#G݁ahP1ILy`HPbj+Dmp쏠;8qd5i2H@ ƨ,p,UkmmiUn523"(Z] 0ۚn>pl|8Άkp|:Nߒu! 44W50Eb"ۀ2Tҹhn`dj7LI* ?i.bczAaԃAF'r.?/p,lF0_x>p>Gf%Mn]ST,1OyLbB&רM uɍ;VC'S[f\Q7N;[o$'SՊ,1G ᷍q"1{4\S+J7k wZӧKt Ŏ.G犉`ʪ5BRjT2%yw*Yc+,jKܥ`":: c%et3UJIMW!L|D+}}]78t|UX2 WOH?D4kKoyuȯIHPK,KPKK>/OSGI-OPT/src/javax/sound/midi/SysexMessage.javaT[o0~^~ObIՆle´]5M`gC@}ǐT:i<n;'0TV|i0e_E!L^t}fi`H( fP 5%BX򔾚'DmzvVVU[Be4(pbiAHHժl.>K׍J,'8'BIwc pۄ֖ݺO(wtG0-nX@c@Jh8/)UZkgVԵVȼF-l5:LER'gяT ĬB_s gp2# xO't5|'@|pSj7!>PHT,DJɼ9B֨%M%0nfN+a=u=znoD&^Y%$lkp3238.QX 0.IJ;G8ݰk67яŗ|+ėGqʶSQ/v* w@,nOX$KJ>irKT}GK[iXhϹ!Jd`އsdxI~_XL,׼ۏbؽvTŃzy_PK ߫tPKK>(OSGI-OPT/src/javax/sound/midi/Track.javaA0ͯqMZN)Kۨ[3 5vj;w KsH7o&zoZ{R$DߎF8,"(,СbC0'a.Ђ_#v#6A?zVo0{FAC %)I=i6u֒_\ .OSGI-OPT/src/javax/sound/midi/Transmitter.javauAs0Wdg\psks2pQ K$=0q @ۧo\Gp KmNF- %79,PV1;{VЩ -Bjϸ2hi7A0&`q 9drPSG)zoFngt $4z,\`xT_ AzxvޛI},X&iZgU^>0XZt,rTRl=h k^ޒ'byKο 텑[plB$-!+'%-rLӢHM*a]rel+9 GcR|P"BTTӉ;vO.c*ش'/0QE`K1vu*L$94|+cG꠩jS5WJ$ a\EPK @L!PKK>.OSGI-OPT/src/javax/sound/midi/VoiceStatus.javaen0 S9%Efgm9yi+ N[(ˌՖ4I}R7$6Drr ,9Zwr;A4$Dfϓ8a!ܓD専NUhR#$: n`4Fy8Zq=tكlADHݚ';\ < B~>=;͗$>'X:iZge^,?2Pt,a*)JfmDڂ-r@[)8l*rRa/6`#Y1 &OaOzlYj U~mUΧo3呂2cIa[ aHΠ-IM՝jGx"0h[rZVsFI_/i-U4LW&A65Wl9x> RyBzoR /Ouӵ ^ (zPK&oFPKIG@"OSGI-OPT/src/javax/sound/midi/spi/PKPKK>9OSGI-OPT/src/javax/sound/midi/spi/MidiDeviceProvider.javaOo@SnKdH'fs\ΦW"M#:56t2EdD/J}Dr Yʂ[SU#*B7dwCv-]XceZzN FQs~N.^˥ir&D£~m ѫN{=n'5rQ?SUjl?oߟsIuMg1F[?pǖ|cJQ;>GoPKf=7PKK>5OSGI-OPT/src/javax/sound/midi/spi/MidiFileReader.java͔Mo@WrJPpBoГiS(dT=N3`.QlT*8̾3'#x g,Wb#CR׌ Lo w8,C2dnE!\rAQ *ɂ$ 1|%X+80 >4n(u$`5d5OSGI-OPT/src/javax/sound/midi/spi/MidiFileWriter.javaSMo@=׿b "|ܚ܄VS,a(zXLkvk Ri}7\[CAA} ,`Eia3x;*PZC-h-b- ~$t=Ӗ:+OU5rP[d 7j$P+Jk-}Z[;p4-N \+z,ӗ~4+)kwxֽ߲Z0&Î-ͪ J4 לCdU fNkwڳF~ ؄NAu}%YI~tOf8t &%鄿n!<§drrd7x,|)Bx&aƂT5Y֢D(dGѬZ84 ?z7}kb\9EVUQ8(*j?sdҧM;/t{;8V,$oP{϶mwj3^fpB+U!ϋZdpiFBT`O×~9/Bhm#RF=Q=Vt >N.swA PK6HPKK>6OSGI-OPT/src/javax/sound/midi/spi/SoundbankReader.java͒As0jhnmN.!)ؤb1*8L&+p9`[ڧ49 f-r C4$O 8LC2rdwTL$娂VUdo|~uS/ Fb[:v憀J2XAGo.z]x9#K!{i2.qm=iZ7NgE>/Րs`WV{@#T%`֖u,{V^-\UӞ%K  |<6]}]ެ6ɲdJ9,3-*].dt1LcC)BN aHPk.%[ j#$[vXV-{7F(>Çi[8v/"MBclPh*Pg1z GOp*|vZ5`t1*ܽH"X9xJJ[T_ǓReZ{K&HOQPK7PKIG@!OSGI-OPT/src/javax/sound/sampled/PKPKK>5OSGI-OPT/src/javax/sound/sampled/AudioFileFormat.javaŔoo0_OqLYݫmRJaDU_TB 똆4ǏL7s 3/I8!Bݾp>5]FVa#rC#D KYH_Ŏ4.64^l՛ lB4k!P.ڊyX'p_003:jV357&}jV+]V֍ r]?3(XJB6% [TbguRp;̬B6O3WGJ,1u/?Õc!wp2;o4cp ?vdשMn˹E,֒N13Rj"X%*AAjVM#IfGGy@ZÂؒ]-IjF^0lJń0a".}cUmlI6g\d'pngw1_GYt >F KdZ}Jl[mB]n@3Ad@&TihjYKCI&Sf$=Gb4Vo<\3=v(q*i( 8(uVԺEt^$YvW"tqBؗ3vуo9lOU4j7H _rG"NWlqJ9sߕ}|$?5G]}~PK^ջ PKK>1OSGI-OPT/src/javax/sound/sampled/AudioFormat.javaVo6~CBݴ۰-8N&, +^ЧN2[TI*WQ&9J}aؤ;=Slx10 a\pҔ3" OgǮ} K԰D#,%Qh *0/c!}UApahGxb)2-ۃr5vjI8W3҂dk*&)#^qy.Ֆ&;82Ez3bCx*4{2TF8l={,m&9zgJboJ'35i[pÄTw .4VwJX-.{! K2Z[i~8P\%mXSp /Z=kV'NS=^Czq yzBϤ)076OSGI-OPT/src/javax/sound/sampled/AudioInputStream.javar@ Sh8A[MH)LQlkﺻ2ݫ5ni`{W~}Ҏ=: .L*2,O PSxnr?6,e8xJI;ʠY-ATa*.2od21ׅz؛J܃6 #P6 *!5eա5mœma֌"GId9r^[h4M-qhl>*Z7y2}+]ֵ.9VV:^+Jq-6`,`nIblVbLZF|||"L9:Ŵ)>/PK\RPKK>5OSGI-OPT/src/javax/sound/sampled/AudioPermission.javaAo@x#אZNT4quwg܊4v͛G.0j0,BI]K jM7'`Lyȉ^ 6Tȵ,8ZQ*#82[io XzZnx*4 woM>uB$h/E-1iKTikaeqz .}>Hr9Nq<¶fJBu/p'۴o xPKvwPPKK>1OSGI-OPT/src/javax/sound/sampled/AudioSystem.java՘sF_'~k=yAL҂w dgWa~Ѹ%tt4rz֠Ўc)TPj6[uka=- ТcVr'CT#HU=B;!=V-uZׄ*wX5]ԮYR0KPAjtH #C Գd>$aC$6­ϽsObDFi3my_۸;^}CԫQ#`TxU(hbjڜfꅑNi0j"if$7;P؄v~p??hۃA7n-{WwS|H {@ÙgDH6PNdHi*S=G#H̤ZXM,g ņ _V􏘋jYA,]WtL0N#u8VmD ̈́`nǿ7޴:2Tb̄)-QyR{,0cºw$VFʦI %IHR@q| GU_Fs"[V'`MUk ϋ}vfY΍}˫> u {UN^V!2a:~V y'5Ș#_ӂٲ44&y1?Kɸ[ea~A;N$_!w~=p tjBNC[5^/G-^72;,!VH%gYVrֲk6G9æ\Qر64OSGI-OPT/src/javax/sound/sampled/BooleanControl.javaQo0ǟOq)TYSREcPڪO\7cgEUΐТڴ<$JԃSjyg]&9DBp&3? m) Р^aA:fK|Y#J drJP enV4, e i-VHRpD:xq]_F ~<؆ k!􏹾G{9򐭕''6tC h4.Pi+Aw >o5Ne?~w-&4JgfH[k<܆(=m}JL|{PK(#PKK>*OSGI-OPT/src/javax/sound/sampled/Clip.javaSMo@=ǿb "bHzj\BZGEUU-Lknw8,(9T7y0Qzg8gHQUBj<> _ia<Ȍ2shd!"Wg4p }_Rةj4,T!cIT;j-~NCNpͧHshԶm(CeQuY<VBkφ +^@hf5sD ʀ( r)Ϻ5HCp0arкqOLˑmBB/J!N{.JtAdhxBI2q2-DolGmI!E|BPJVcFe,M(JE#Yh45YVsSQMN}.?h]lchׅV0̯ݬL͡)ozRfen_j o3 )* fIrYUJg..3,Q e6}gbyDQ3%VQR۷ŒQQ_b59[ejqq?7]sF/kzWT{7"lшn\ tTH*#;eǟ3vNqG'[87!?PK];yPKK>5OSGI-OPT/src/javax/sound/sampled/CompoundControl.javaQo0ɯ)@QE@"tU5q.[=!kH%h+<$}|wW\XA#_u-px?F_WZE2!or/8J%4DnjJM2 V?yj`v "y KQ#v $pZ+0s$y13:oy*:órNm&@(S dO>uwAh-C0MTZV=-OSGI-OPT/src/javax/sound/sampled/Control.javao0ƟT,m}hE@"tU/%3g;s6VBwg ؃6XL`U|)%Q |~ acXG5yr{Rv&7RTA+rE24.9`4Fhq0-h=PKE@lA:%aʀ,GnV !؏Yu)ĩqL~v/;n"V:޸<ZX2lq-H9nM:tm*郓e^W?pla#y1&wvwz-7u5,V˫|=|˗WS УuqƔ1-BA6G$oIZ ^M7-6ٓӼXr;z;0GfI9F֥Ķ% X( 0:8)9>NCyskg֙@"fqBӂd=TK Jcq|I|`?B4,KxF[ۅh|}Ein{w!C-C9]xߞBI PKm47PKK>.OSGI-OPT/src/javax/sound/sampled/DataLine.javaTn0 }nSRdN=m6iK!NWv)'ɹ迏t&-aF`!߀}bme>J0?JB'^~ cF:C4 &J?C Чt+Z'à-4P}kS\AC2p`AjH̼-UujVW5zApA Y.EWm\.Q)ͻjuA?ƧHuu:R5T%bJZX rU/Rp&KaiR鼕ڭFj}@ca Q܄0\FO \q8D1 OI4u >GÓ રɔ<.BxOBf6\dB9Bnh5uڹtL\z+ףPѠ9db!V3 -5rJäy>^ G҂ pثKH QtfM*1Rbt}z=,u T3c3 p ! j.j ˢwo[ )o֮&z"-k XY6q7$Zꗠ()FI\tb[/تm&Ê~ҥERKwTfYkL܍o̊9~1N2*2tC sX01:,L\|lli n?PKHO-PKK>1OSGI-OPT/src/javax/sound/sampled/EnumControl.javaAo@q#jHn !dDQ̦ˮAQ{gV(>μo޼{pcUm4/scH\ 5!( P5%BT>m W.!זz!6ۀTj\ s.!Wpi) < YF-YZ[] Mӄl8T]4|"׭N 44 \,#54R#լr-eZ؆ityVۃ:~$Q}ygwsx$I ƳM EFsn][B, s9&˚ZTWܸk5dpW2=: xہؚ=FQ_hybUuFah}[#YJZ-`Q2OSGI-OPT/src/javax/sound/sampled/FloatControl.javaUMs0=_tw3=8m=%&cCڞ2^Z# a:]iEI8o{҈܇,׊iF~Qp&Rq YbF#+2) T"Cf,M.Qi.{}h[Qsb%ֲ[*5@K\@*em|S$֐SÈΨ%3ugnL[V$-W &@Aᗊ+xVRM)kV BzgMRp1낖Y1V&(>vu@ccN$LV}8~;~4F1 FY8G=? H##.br;.B!HĔ<Ĭb3\\m02_p՗5Z4V[kOKyQNZe5aR,5¾.$3)u`PdqJIkߩ6D٩\bT&VWq0ɮ+UQvI솇ph85r s??t]}z:n\uc@>~1 br4[`_]ImI {2 Z2.-Bg!1h#znf]-n~ԥzOДw]J{4Ϛ 9gC6Ţ!mRMw[2_T m/=dW~p/y?d"wűGʌ@ee)yzGq&ksPOr}bZPKr. 3 PKK>*OSGI-OPT/src/javax/sound/sampled/Line.javaTQoA~_1h)Fb Gmr7w.W;s ou &,RR !:_^_b@nyL Lr)3stalEFom_yi4CmSވ)v؁6*!=R!m6Ԑm2>- +ì KQ":f0:ظrX?L&Y:}I۪+{p&^@XRiU@) R}p4UvH?mBCwBv8M>\'%\lLS/`2]$d>#g7%]2ꃷ$S-BDBaL2tY4[t&n#=Փi BsqAC>db+nco{AZ0ul"3ɷj΋6=L !х!qĴ1' zl=+1p&0TNveBZF:$fx޲Byl52猾F,gՙ2#OM(x˝}~4Jߒѹ#ܢ1MDLOYJSB*N: ]- PKZPKK>/OSGI-OPT/src/javax/sound/sampled/LineEvent.javaTn@=q[zp i"0ibfe]CPĿwv1nUZ{oޛӿjT<_[]B!8)Bz0 c;9[Rp"4A)3`aRnz Ju0vw$ ۃTJ @ \B6EemשTx423"tZՁle_n08P:#'hT<㊟}t⒉B\/$Nx K!px6t=dE8_t}YC75e4ZU!} aZ-Ӄ.𯇥RiubԘdOLV Q8ȚHeة{89WԾb-M! 9 uw*kJz':/bt}C߀qOj2ܽ:7Hz'![矇&Z<üuhPKZ=PKK>2OSGI-OPT/src/javax/sound/sampled/LineListener.javam0)F9%+ =lڢFDlW{40iUZ`˞M| lj gH ay^ _C3-h XGEvTXC/k4os$oh,) >a1;/qQ=r[d P PFrǩϬIiP.@ywtNq#1Gʴqw͵.lb١`gO'./ 4SUdN ǜԣ!G ƍ :Ce^G XǤHЋ>O>'H'f! [}𬍟1y}E(_!4d5VPţɶ-B4'D?ett"'t\Q/] Yŷ]dFTV@9^۩4uv@oEl:D^o*A5|APK PKK>>OSGI-OPT/src/javax/sound/sampled/LineUnavailableException.javaQo0_qT,a}QED`UMr ނUjD=I"\az1.'X_%ҦBla ~atX#{*f`r'KR*" 'F*S Vgh(&7[J{C:dCSIC*`N}H0x,`x{-t7Xıu\.拼Xgkr~3aRl-q@Y饪pz;a)Ty+Fc @V9-bLftJu(\aouyiY~;qd| 0 q^n 9CɒGSu+jBdOC ]VǀUiAz %Q9 F?QbY;,TDr(wRFL6!E'NTz8/`xu/_O|v64?E3PKQ_ BPKK>+OSGI-OPT/src/javax/sound/sampled/Mixer.javaTMo@=_1D*jHzj9QB[ H${l65CNBhIZ0;͛OM@gk#Vxೄ~JBq{}&0AfG Lr*CT#UM.X{]h1Y_5{L9,v[$i!)BH^dByfa%pUs)p3w.ERMI+(%յ׹JZ032Ad*3Қ;Yua*iձ+AuFrhw)MM(h&|~fKe|>dMa ƣGt|G'm@*Uf8)U!@|$!֕$a(cRj*E%EAf!-ՒiRN,/i4?Z,ʳp^#gTLC \nNBiԮU 3adSylCߝ3EZF\хLyI }FyE9+}" ._ Ƅ|*}wvtnBd?x^=R}UL;OJK/-ۂ<˴ g`B/%D$gwƘsenh!W/ F7PK nPKK>*OSGI-OPT/src/javax/sound/sampled/Port.javao0ǟT,m쇲h]է$.ؙ@Q}g+Ix|w;s |Y/i+,9)B~qm&Va32) "CfU,f Qi.}h[Aju5,4Pk$אS p\T7MbMÐ3H(U/fӛܘ]Z\qJUʭVFDI\7YWDAϚ+xVkV B!i]7\]27+b2 mZؘ@೗IBE|5ko2i$Oa8 V_n[ 42Mnǹ} X֒09O5QԬ@(B>VM3)f6lМX[{WKҹNUh47*gR2mPdT;ydj[>dd(rdw"sT˱Ooav)a.2eOx [0C7S\Ѷ<^ ׷d߅1] ӻt&etiu*kEΦbJ^vzRƳ;LA M$G 4[`{/s s!׉Uz<%2r礫Gq~PK? 4PKK>0OSGI-OPT/src/javax/sound/sampled/ReverbType.javaRn@=_154mmN.jd$L8fe]C(YpS(RYϾy8[#~>yE@$@7CA˰H d6TI.ENR*Ȁ[D5 ;+p }uWhuklAi%J! .ځPuY t, t:sp䆚C L~+ꏣv q8Ԧ=֎.,Iguu$Y ~6Y X3*q Vizkեۢ!OSwo=B`"PKK>4OSGI-OPT/src/javax/sound/sampled/SourceDataLine.javaS0=ԮB z m"VjZV+I&@jiB;6v!=o޼77L铡z`X`'H,6~E6iaˈ<ɒ Khe!ѢO KJ$}h0zj N "s|,P; :^ZGnӳx%s NмA^;qu8+悵2-V5vAk ;O 4*DZс2 jsʫ 9uVU=MI[i5n0H2HK4 =}m>l6]dlt$! 6$!C|!RIVcAlM֭juD#h4~9G >D_Q4OSGI-OPT/src/javax/sound/sampled/TargetDataLine.javaS0=ԮB z m"VjZV+aLRCjiB;6v!=o޼77L:{/ i Nfcx Y2G*#f$KQTB+K2Ƃ?}$OdP&0CST &O _PKJ) PKK>COSGI-OPT/src/javax/sound/sampled/UnsupportedAudioFileException.javaQo0_qT,a}QED`UMr ނUjҴ<$r=vr smV{q9"6$gS$ J9Gbv&$B*{BjDɟ2wNjxqhr,κAG=N6:dEVLCܬVi+̗mΖ9SG}dl1er( *N<[Qj}$x"±:M# k("g0!;ͺ f&2Df(-w|uWNTz8/OOx_|6QEPK6|QPKIG@%OSGI-OPT/src/javax/sound/sampled/spi/PKPKK>9OSGI-OPT/src/javax/sound/sampled/spi/AudioFileReader.javaՒMo@q54K@Q̶fwƠ(=`IsȡUSx^pFk싀,ʜ}}Ϗț!RdXEN*$nMkxBN %:AW{U k +Q.'@HF7hpCFœ]99Amu÷vNv뺎@)Stc펓p 3u5%Y ~UpNj=fZb 甧pB!Xr52Ka=ډ[ ౡVAs%YEn|qƓY2``:Ift·ē;LnB ס6~W J\Dέɢ‚P[2;Mf#VˀK/SpAs~wUYdFZ]-x 8Bx#RB/|ky8:/<玔٠3SۧEBE[47eTmIÒrUVZ+ïyV?8i"u2g7$& ൬oh^WW!PKOn.PKK>9OSGI-OPT/src/javax/sound/sampled/spi/AudioFileWriter.javaMo@q[@k5&̴fwƠ(= B>ڝwy=v,3PzkX:hHQY9B{ogZEy ^rP9pKHM XRa>ՄZs/UrPYd 79j$!W+ݠ䖻:'FCeNpWD]K^PCe^ϵb4IG9u-K pf\dZQS6H]jja:CY垘ȭ'mBB+J!N[)JEnٗz7tMf(d 2ɄWc&5\v2m|I[ B푬ƜskDP5F"_e)iEN}B `yb-6UZ,b5P[ ry)8<7l( ēHwpA繂ceV…?@w-1}[RW.u *gJȳ@Q'Ve&[dUFBt_6k<Iׄ+!GְlTm8H<όdL*D/APKrk\PKK>BOSGI-OPT/src/javax/sound/sampled/spi/FormatConversionProvider.javaQo0_qT,о}(ݢU0p\`{C]CBjkCPs{lw ^Q(3Q~~&„,%!+xsC%s2ƌ.|!cp ZTs%V@*%f$댴!!S ݠ>'FCyv!k׿s׫:5qL+7wdU$kJ8]j0ekP0sNy'dfFC^&Vn';Fn}cC (8i(S&h4 '0Ni<D+N@е6>.BB0S$)3qk (Ԓ@Y2`eJz跾Q/8^;.:B(V@W) r9Jd3eJ.7GQKn7͊J[WBTBRW.qpc'n¡T3ZwC U'LTe2Wk*3\6#P=mYTI$7Ur0 ܾ ̋3gzA PK%6`PKK>7OSGI-OPT/src/javax/sound/sampled/spi/MixerProvider.javaAo@Wh&eׯϺS59Ki|a9֢%y[+TNJ:oegCȭ xlBadH'Y}4[>Y,20_r>J|ƧHfή סƔa-"#zP3TRܚQ*%#ZM-7 ]W(4"`Cl.vu(ȋ49"£;Voe}^gcb]&*ݟ%qJSV_ܥ}~,\xu1F[@MK ])zPK^ PKIG@OSGI-OPT/src/javax/sql/PKPKK>,OSGI-OPT/src/javax/sql/CommonDataSource.javaA0ϛ_1] z m*KG7f+gH@lysnaPut0'uMBjmz-Z4',Bv&kQZ,pGX?>$܅3{h8MZhrZdPRO9j$!W:rǾIaP'X.@ptӯPġ2UT_6Z'U^0Pu/k >dxf\(2gNyΐ#YMu ):C= '#~-؄QAM%ԛvdf MLv&[) G}I?cr!>C(j̩GU+*JH4Vˀ!'\\QWoEShyGi94]Qr)Tkx[p!aݞSe ZUx͌lz> 4nn U^tRT'0{PK+9rPKK>+OSGI-OPT/src/javax/sql/ConnectionEvent.javaAs0W)' z2iNqTɕ丙N;+@ \{}齕g05j1,b,RR0LG8 XÒ= ZhtI~KHkQ𧯌𕬓F"`4/`x4!6R豠CjfWZ9=%8]0k/X.T{ݳ~;mqbl5VG_g4Qfn2Y*[e9#S6xd|=6$`2xȉ^Xؘ%WS!7hjDE̞D `0J#W8hE3OSGI-OPT/src/javax/sql/ConnectionEventListener.javan0 S9%Efgm=yi l NWȴ͑\I }Q;4>XHKUWPw03q]PazX|?B iaME ^dMZUG!y#sƒVp.`&ch2'A@iE %x8 R'*F s4+_&p#kDQCm>h,Wic՝Z0ؒw' SIcZ ǜԽ!GեA/Suv0홑G 8$8OO?-ǛMnUYzl,7s@1~$o!G@(6($ɣB;4'́Vˀ@N\Q/[t&h[n94]jPzUʭ T=jQ^:Ms2foum2)[cSPKSQPKK>4OSGI-OPT/src/javax/sql/ConnectionPoolDataSource.javaM0WzjW! z m*j3I Պ8 j9$|<7\7'#˽}TJ f0l| Z4#"xJ TshU!iϐ ++h c_0R#N@iEbH (q ]7N}?gx%80q*Щ.wy]EWiSչƫt5UւVxwސ*wh4H9H'UՅAɥuFZ´_i+% R6w KY!~ fdt`:[t=$#|JEH<6o@2|_H(YmPB ZM-/J}@h#hk$0Jqׇ|A#T͂ݑCSp߹V |ֺZpǙnCKs4uUs_pP=6J3oc_Vy=1Dr4o5GPKLGkPKK>&OSGI-OPT/src/javax/sql/DataSource.javaAs0Wdg(8>QmzrQ V Z0~&ldyp0XO\ tzM" AyDd%*9*G4\g8 Z]4d-κAiE Y!I`@*nNC_gp$8x$tUq-98׼"GڔquxΗ[%ֽZ0JC|O@A:sSwF:.\ z\Zgu/BH_ (6`0H>$,e7٥-&ɶzuH:GHGf":xj02E`/ }A YHA%Bhu ZZ?VKd-w_}BqP߽7~>Ui!3P嶗{u38 ҏ\+3Ay5ݕ5ZǢWh"FLL/doUgPK}PKK>,OSGI-OPT/src/javax/sql/PooledConnection.java0W|SSMݪAdbmGw<($/Bt̕>QV{qU &9z6{5z~^iaMyHY bр!Ěq +S %: Fhr@ "1BT \z ( < u6hB`n0?;(.dP2Z-"/NVh-|l0M8ے׊u 9]wF8!)XU\XgĶqHT03H$z}}^&YdZ|&d|L) UF^l _!CP%Bp&ˆjHJM-VKsD-soAQP<+k>M-UHm94T\I)x*f-JPx3 hv"edkR<+eq"OSGI-OPT/src/javax/sql/RowSet.javaQs6ǟ˧PKڻG)&t t-$N{W1%<$weIt2VZwN/ ҽx#sG7d4d<$$|D b៼G~!ȥsA,:;[nII$ Idx VEaK0N||(SղhHE?kfTŪd? ':u %-a#^l QG5+اVLh#/Ն I%"QϒC/`hD.g= <:σl0]2tr5!hr#)C? d:Y L’gd [2CV ]YFDb!)ҦqiGN}ё߂w8Y` 1[ Ēb}g|B "_Jw3Pόǘ1@tw\yyg[6 ;*hTvQ/:{(xkRm9.5ay鿢<LPUjuFZz4;=,րo w?5aj,;*冋,)xj IƑA:K [?7 R6 ^q ?mw7%xoYf j vutOo/1Ѝoq͒cȸ3DeHnsiE)N>! 3RvfAGDŶYdȵJzéQ'61|jz$Y8ͤjsn!d[5?vB&+v- pLM/+L5]=<]#;'j +n6B&UJw%f(jz1YmR$$TɟJK۟k>xdlaP6WtYf*Iy[7>SaVEUM-ƶOA1W~`(:mC|aCa?nNU!6!DfEEAfÏ1fq+hyZ GԘӞ}Ld=}^d'OSGI-OPT/src/javax/sql/RowSetEvent.javaeQo0_qX`}x(ۢUAJ>p UD<8߹D4g+Ǹ*KJI+v64$QCA쑶 ;{YvEd ~uh&3`4y8q6#;t94Z'gp $x< nhxB7_Ӯ'SuѺ}X#S]ZsJˉ7g*aV%: Q[3oug`[ie%ri`xL"ٲĪbel ?n=tjlH2(!5Tɝ8[Qjs$9³:% ߗ.Fw0zGqJ܋GMR ӕGҞi=IJjLkaM.U+\^<'nxCEPK.*PKK>*OSGI-OPT/src/javax/sql/RowSetInternal.javaRn@=TAN& `QlS qcgDg6qK*E[yޛ\xp 7콀iʂ`|9_O|R4!gGr% JdI lЙWF( 0ZQT[*OSGI-OPT/src/javax/sql/RowSetListener.javaAs0Wdg\psks2u 8(ÂŒ" '6^FڷO>]pk/ꣃy] n@_VoC2h:,Cv&[*PZ,%pGX?Se XR̽`6foqQ-rZdPQPzrœN\pU\MstNC1Q3jmM֛4߼eN6h-|lć T80k#zPDmkNyސ#Y/ ):Cֽ#\ 8$8O7O_vw{,N&]]z]ʫO5IogmI>!G|Pj,Gu+jZuh$O͉VˀiDNa뿹AQp?щsh@rh*>GP-pӡW tJ(ZcƄ}8  ?nկ<׫\xUï PKֺ_PKK>*OSGI-OPT/src/javax/sql/RowSetMetaData.javaA0+a,tVP{Ģq,DӤtǎF Jn{vaj R+%Qgbrǰ V)X!,dFQɂf|kgF𙬓Fe4A(SU8J<6jG!l"*RCfʪEkiU ܶfˑ*m>^;Wq4#czuE2bۮk9tWKˎ720,,7K]oRɥVnj(_l[~, }xDM~^MZ: X`Lg:YrwWd2 <#C{ҹ;O`|{&љ(NF1F'ɣ!Yt$ŧx Mb)R,RǮo$x9اiUzj'6Ϥj=dRgv[3 *煫%N=iiT$bw?ާ OU.! BbД(p PK~rPKK>(OSGI-OPT/src/javax/sql/RowSetReader.javaeA0WrJV){ksIڢFB=0&$;&U9ly3]wQjD{t0]'PV~mȽBN̙^T$-˚ #AtdP̽`6koqU= R9-Ј.iBBNzB;}&OO*@y)thGP6nZ.-vozzY {ax ’Y;@9#j܀M-3ݫ2/J$ >ER,cr=18=$6YMI|M#>tOyE(^!4d5U&[VH4Z-ަ'Ѝ[EA9F?>w@%Gi92 j(WD͡cEM:ѬҨߍ?cAPK1PKK>(OSGI-OPT/src/javax/sql/RowSetWriter.javaeA0WrJV){ksbE@l=d nMHTwLh7DwJAV|@YLsY!J 9Y2g:M"i<w$5VOJ}Lƣl-^A*%jХ"@HIhpǡIiPC#h^/nsS}@*DMkmڤ=SU%ks' O\^5SUX2k=(3-BA V7$x4t4LFDɜjmZqݰf.( 7g]+9BNˑ7W}Anѱ]TKx p:i_+3Ōۡ *o7ÏhOPK8PKK>*OSGI-OPT/src/javax/sql/StatementEvent.javar0)v| oOq[hLX,Ix2y0\z(1++ i=j \cCR:xR~ cd+D0_OZ{T=me %ҫ!^2OSGI-OPT/src/javax/sql/StatementEventListener.java0)F9%+ =lڢF lW{t@HT;&li/`d?v| L{&UⳂia~\ gZآE걌XlDmNHI+$Hߐ2n%}l w^l:83h㠳B(OSGI-OPT/src/javax/sql/XAConnection.javaeAs0Wdg(>Qmzp Nװ`XR$awęrӷO7R, i[$BY!J 9Y2G"v&kQTA'+2ƒ?c%dPn9L`2&8xtCXEK@!T=sFOO9d9rU}-t#H&n/Z*+Voz캗-Y ;axP3U;fmeC\sSF8!]M%3b׹WcѯJ$>&EZ!~o!$ۦ69,7]M7>A=4 82>N S8/+Z]RԢdaCШ#&s_e۴ a뿹AqpοO<)"ݎ#~JȎde_oJT]I~o.UgPZ6F 3lِ{YMg fT1(OSGI-OPT/src/javax/sql/XADataSource.javaM0WrJV{ksIڢFD_G -جmBU{DŽjJ-=3<UW0r`,&f_$$U%:zD6>-)x,Ъ =BpA!+h c0BKt 5?Z!-BƁT t htϠIq;)SAC2g\1xOiS9ƫt=QUBkS+ M;oJVm)洧tR!X]2]^FL ۸Q e#^>~]n>ll.70_gt3:}${oi2 Sz;[ g$۠4*[^"FDРk{Jq_7|~?FM# -߇dg5Un_ k.Rw/чdB1DwyO֧eQx:}7%b(r4]_ PKuPKIG@OSGI-OPT/src/javax/sql/rowset/PKPKK>-OSGI-OPT/src/javax/sql/rowset/BaseRowSet.javaZw6~^{0H-]7Bg ɕ}W6Cl0IRlIeΎ :2+>h8Nơ O6Mz@I{("!>*vzj<9 f\OQrug4 Q#0hjf&K7oԺq:]{Ru/"P9,΁cCHlڴ4gk. HϘBH+>Ӗlrpvq:nÀ|pﷻڅ^:3pz]zG^5eă2LnܙF\5 #JB{dl0Y!)LX#Of:.C::"?ge}J"Ga<$O^rN,_]# $(_[`DFGv;۷- /\:vW[FwNzsȹFDxi#XZ!<;Uͷt#3&Lީ}`WO-|?mEdx`F5)XW*HDή0ɷΡb"bI9 "Fg0+7k4oYfӧ4O}۷K>yWAᾧH>On2qW5'<2swO,\&JxT?ѼH[ZK΄,Ġ9/ZpJ&X.(TYbOcE4fPW &Z" XymI,j؞lVV^SlsjjX`]d p>m @*z5) 4@+m֞KL@u%`h[ƬV*Rimh+-2CSQe6IPNϋ7v+>}b/xݢ4z@u!s1MꮵŊ:u{/OSGI-OPT/src/javax/sql/rowset/CachedRowSet.javaV]o6}E“ӾmTm&rf9 ahF*IY^Jr#L7̓{9zكbre ` _ ~n !8+4C)s`Wa2 OԆ+ s;vlp 5ۂTJ ,@ \BEKvUӢ8&PsȜCA_!0ےV?FUUf(֌huu+?\S-XelN\@i`Kgc]in\Fsc5vOG k@1 ga qzo4N..NdSL!$,$#|! IFC]D;9,BGaJ/xFeɖKA-)"(Pqi5D0w0e^:4H?lIZUE($fQ/9r)ɧJs27fcxE Ƒ`@4\_dzIrFfvw/`us`+hE(&wᱦAٍVN%1r{†o;`SDEΨv!f quܽvR*GʹV+u+BA{I47RHpj/|?ؔV=tE!?^l+P(%{*GS „\'5Cz& )zǚ1E{ \ӕ.Qц;ߞu;fn%lHN4*TQ -ǔc(Ch+8pUbє=fURB^;ъmPӺEqU}ӊ `oP,tlB3+y5Zv,;8 s:#NSN3Poq J}!Ds_ۯR}IPEB{ UM2=K9\̓^ PK7Jx PKK>1OSGI-OPT/src/javax/sql/rowset/FilteredRowSet.java}Rn@=dG.>QiQ-܂S+<-% ؊ŴJdy潙 n=jΚi>m k2G-3߅!qH >38 ( 5B؈?cf?PRL`2&8 RYh 2(FSc3J>#SO#ʬ`Ok ; b_*/Xl:NXX(k44>qvѰ\d=( 9^%YB)XMYk Fc&a Q:OasGv_;؇Iƻh66v6|9 $7!E|#TIJٚZQ!TC-4dZ ,MMG+_Qy<_7ϵUo.x<4D)ZnQc6B^7fY֎B9[w)* z1c+.1t`zlw?PKOSPKK>-OSGI-OPT/src/javax/sql/rowset/JdbcRowSet.javaA0˯唬({ksIڲh` nU&ʡ -OSGI-OPT/src/javax/sql/rowset/JoinRowSet.javaU]o0}'X^C,m:h 2 x3qj;huH stp̗OgZqC_βuvڎ} EjQZ`%3 Y |GAT}l)9[B& kH@syPKK>+OSGI-OPT/src/javax/sql/rowset/Joinable.javaA0ϛ_1] z j8$5$vV8 Җrٞy\L0AVg"CL&@#mUXA'' 94"G v*ѧ?'ԆK7` FS' lBZh 7P w* \@&kգn9#^C-rF VB`em볎ؗ C lgDw݉  x*ckbX R+5ҙrQ¶Lɹ{/Fbca Q:Wac'r&w+0^E%̒6ZEIL>oǀar!E,OSGI-OPT/src/javax/sql/rowset/Predicate.javar0)v|3ZL="^R,)0d]&KV~`ň`^- g$m+7u~| i@VT(-{4}BI0 ikXy/ "i h\v $T'^PgR$0iqJt@Ӫ~MspN#>G4q;x7ۼ%ԝlZ0 C*^k{PxcԽN&js^f/3+~3R/6.a0H >$,eOw'Edt /`g.3Z}${/iveTSx;)C|PjD-*jM6ouB##hZ{Vn՗/ =?G-U$ӘdCxޔJHF^ \Q^>b2j{P}nD|f4j~ 3 _PKwPKK>5OSGI-OPT/src/javax/sql/rowset/RowSetMetaDataImpl.javaAs<W0 ܠ LHʇ@dpT#>E27tY8Jv!t5"]9&= \%'^迆ia!<\$,. W 4VÌ'z'4VhOtI#:5߂rB"e 묒V*ש(^ |z8 4!@]˞EQTjX?FgvTW>*ւ0| <#U V xj9UF8^ΈyLB@q'C;WCC.c l83qG =3&,u23>)7 qORH&b) M9ORA("ЬjIcX ]U-.P!/|/CUFi'$$.w;R0QCCFp)yl0OSGI-OPT/src/javax/sql/rowset/RowSetWarning.javaAo@W,OSGI-OPT/src/javax/sql/rowset/WebRowSet.javaTr0="ZDJrbd{H2߻7MITҐd$UHHk.j 9UF:VXt0i2iI5F@m 21<<]Mnf0h<&SOƃxOt>AH-:-w@2oaIX$[b*2%kjUJo(r%BZ?VK3OB:#_k<ѽ؈mhڢhUB94KAcc25GG%}?A}oi8RגBo TRF-xjx{h2+254dSB06/΁|lxLr{TH[ͶEΔeYfFˌNdE٧IƪUAQF^0?Ep/KS:Y_"O&{5uGsyE_Ux^}jTjPK&WPKIG@%OSGI-OPT/src/javax/sql/rowset/serial/PKPKK>6OSGI-OPT/src/javax/sql/rowset/serial/SQLInputImpl.javao0ǟ_qSJZxѥ&vUh;g;Z@b[ۇ}qځ0RJB7;IPd}1<}g<ڝΞ7"䛤B(f=譳)69\J,E#ɸ?UN]Kvo4ku0y9kw >{b04KCRg=n}t׹xPgg,+5ӯvKr1 ο0 3 m= PKt61 PKK>7OSGI-OPT/src/javax/sql/rowset/serial/SQLOutputImpl.javaQo0ǟ8)C%L RtpI!4&;4l@%[g;D[-ҵ/9YF8ʄ;9::O} si`N>d*P%ikq OH$G9fClU 9nA* !f+MB!!QyH]4>6 [dw䀂վ#mD׿ųѨ*kž(4VD]ʌMJ9x Xc֚aJx* P,ZĥmFN}߁ˆGA4t`vv|>y9LfYf![a~wAx69tSh.BDԒR;IDD©ɴĔ UҒ3t.kaKD.,z闼AՁo|- Y/(c.($tVڢ%SN/ }6psimD=rNc^;} ˺4]Hm;I`Y)HpJg:hbD/3Y=XJeҋws֒ajƧ)5jL,;UI!.Y=XW[SwLVn *zaQaN{6v'/ {!|;pN{=H {,gvˇi+Q{J[ϸ_V;k;o!YXb^Rwi?-l-`PKTu PKK>5OSGI-OPT/src/javax/sql/rowset/serial/SerialArray.java͕O0ǟԧuim1m ՚2ģ^S3ӴC;'6~ll}he{Imym4OIFowt|w ci` g>)8#48\P] K~Ԇ+ ;~.U?:NbrX He!7H \'YjEYVq$pVke(!Ӽgam+g%tUa_uu"/rt,#MUj7u2Qs[0Nfƍ|[MH֛6&-80:pqt2`<I8a4(: '({3F]@ju䮝!F0W0s5,EH $G^rjpd_rlyuǗ+-gb)53./i(i]ϕ_=o֑$6.]J{UhH Z1#? mt| WP"\,ۻiʴMprn%n?a yg]'M1lgNu뛲m%\ՠ!uw\٧Nh%xshKDs N6>c7;4kDl:6W.l V;}PK$' PKK>4OSGI-OPT/src/javax/sql/rowset/serial/SerialBlob.javaMs0אz)&d:=f1jH2f߻2k w]'@WKͳfڂAC(g2Ehu:>Va" Ѡ8 \1r!YJ??P$hF}h;R0cKBa \[R5ki%*OMqJf2 g d7EWv,ˀUXŚU{R]wTq%Ui;RseQ[23jvϴF*}7lca Q܀0bAnn0쏢^ !th aEK,<ȵdrg窋#I$c'4OSGI-OPT/src/javax/sql/rowset/serial/SerialClob.javaTr0=_ 2!%4SLtzbɑdɿwem`I޾}{ U"[h,LrYw}nƮ %NBp 48BNQ#9ӜJYЃ+h5GιXlRY( 00q- \-FZ)iPi0Tb3j]6][e*Łi7kM25nn] q*Қj3R +dQ3[2f*")ikv$8}rM>&pp b?^Dh479^d]]$S8;)B#ajI&G.fSk2-X%jIAz!!SV[{}9?dwJ6P {y3F:jҋ @w7*O/_:Kt,ƽn,uHSx;r9R|pϙJLaFi?}ksimA$V#[@64\z4F[h Ȳcdnڧ!b3Q>OJ _\$bIHOtTx2#cWk=ɱW9`Qalv̱1%fϥp!,=tӛRì.$g`濡?xPK(,6κPKK>8OSGI-OPT/src/javax/sql/rowset/serial/SerialDatalink.javaM0ͯqUнRmTڣ CC+{!]-zi2~3]w0Pw0,G,$RP%~<?"+-hq7YPEnԢO4h C/G[uq4ك,H")(Zr.OI'X.BBs8n6qM˫Ƌt:ϊ{oDksC+ޜALU Jт6 *|洧n 9RUV\+ z-YghӸa mB ) -9)"&r$ϓl X0]ft.3Ilr8j+`LN "KQɥBhW5Y?Vˀ[o#@N.W]>Q'oS)22"^*r͆ YtpBz񀊷ߏHGWQMV؍%x{޺ ;|Ga#4ͻxuн[1 T#.%~PK1k?PKK>9OSGI-OPT/src/javax/sql/rowset/serial/SerialException.javauAs0W);=43D){ɕ8N;+ - >#ﭕ\E4gǸ`%>+u.~?6֡aMʘRhuI~OHYgLSF:aFCi4 g ƣuaj j|Ympi56dWSϡScCTaA ag.HBTtʊP#Y͉А=(~c2꠼?AI(O{ck:G>Kd}5)E ']^݋ŷSfPOgۅsAEPKl<-PKK>:OSGI-OPT/src/javax/sql/rowset/serial/SerialJavaObject.javaOs0StzLc)A׎"'tY9%=ە`@K)*z4,-ɕ(PY,U%p}>B+8gS{hXMf[(HB%$ l6Z'ܦ\< z89mhhT=wtlkDQuL:'"/zu$Z [axCT_h6HkN{'TՕAoS XY~0RO6`#xIzd>^M\*Y-a*R]B$e SvNrg>! QJSukZ(4[aZ,[~EA@}΢ctiP($'μ@l}qw`BF|gf=.K?Q>츙NS r\w8όGK$Ov)P@H0Z@R jc|PK] )PKK>3OSGI-OPT/src/javax/sql/rowset/serial/SerialRef.javar0Spkhn-tB[O3I39 BR$C3{WMɩ_p#Kݢ3Xd= ޅ@ȇ!2h8H\9Tr!֬O ;˕h]_iSKlU+TI[Xp.P+ݢ->'VCrF4\ Bl6}QEѥL ]P(#μ fhpq.q7?G=g4JA7VI{Tff#fO5v5nn'9yR`[)[aHi HCؽj2VӤIU?ͧs;x~b[+>{sv.~PKH@L PKK>6OSGI-OPT/src/javax/sql/rowset/serial/SerialStruct.javaœQ@ǟ,ܽ)3PDy2=ݽ-/|wghMgg`|u` yE'aL 3h ILx Dniѫ9'4+ a>:/WlrPX$ na2LmtVr|OZ8F 4}Nz闽^Y!CesmoI:~NMյh-/{`2 VJPXnΜԥ˼ V\ z%E #~@ccZQ qڂQ]/rMpfQ2)Lg0&xOzQr d&oRG+U#Y_Zyr\mH4 Z-.B?zA@sؖB{/BJ.L ],h FiL)2W% sϿ[G=j8JI4*T}L81`L./Tԑx/_]]uU nx\G3 "m?Aޠ+Y1ß[=mAX[z>ڝ^c6fqPKο"PPKIG@"OSGI-OPT/src/javax/sql/rowset/spi/PKPKK>2OSGI-OPT/src/javax/sql/rowset/spi/SyncFactory.javaUo0~ʼn'X{ۘ&1HlUR%U*[SI@U іx >ÓT[ӕ^܇ aen4:;vB!D! rc(D aeW49#Ynkb+ X-iH\Òg17r*nVu2C. #wF9}-t[rXؑ*f{S׏ܷĺj XNb @*`BiYW.h4Sha<mǑJw ٘$/IE rͿsğ{nAys/ & |$<ɕhr+g!> %c̗k 4wFNHAhL01Pv)y08ԽXbf/Ȼx x Nt:PKu;&PKK>;OSGI-OPT/src/javax/sql/rowset/spi/SyncFactoryException.java}Qo0ǯ8SRemK "ZHW17mBׄi6}=5E MsyBZJhI_fI J9*cv&JvT%Y!mPYe<8FCi4 'b/Nƣuaj%5JC}3us@l`WB?@St]86J%|L=t障VYN9A4L%ņYkX׼ ԝU^j gMj7C_ xlBcȊ>EVL}[>]|- ,W/l-s^ -˯ CƆ8Ϸ ֜\CRmhjEÉDh  6+/|WpPE<_8cؚΑ]4!kI!E_t~,< 7y QPK"|9PKK>3OSGI-OPT/src/javax/sql/rowset/spi/SyncProvider.javaMo0˯qv9IFI𡞐ImS!EU!J[VZ3ϼq{ #ʭJC'B_r"A ?{@߿y !DPn0Hx"E z`,&҃)JEg:h7vwh$5B!4T I+X,5.k5׫]F8FC,4#QBI!L7w~k[Bf|Ϫw ~&kRH|[`%J؂!e)q]Ky@D#r%_T^)uFa~})|wm7톙UZMʔJ=;XKϭ_PK ׾PKK><OSGI-OPT/src/javax/sql/rowset/spi/SyncProviderException.javaAs0x 2Ԧ\B[O3bL^Z#9a2ے43i}GO"&:YlD\Rп ﷃOc dvLkV9 !DƟneod }/uK#VCmb-K3BUgnQu r *υ3>wQ4M(Zǡ6ET6N&Y:}ͮU0t_KÉW]eb^K@9]7F:!^F\Zgv#G?pۄB/N=$zm4Y6^,2/0Ϯe2>'![о2>۔SDJZ,ي2GSE- Bwd'BEf+?Vs)V:کr >b'/CK.Un"+L*bN2ihH?luEaYwŒiK%9EqroN?l PK+APKK>3OSGI-OPT/src/javax/sql/rowset/spi/SyncResolver.javaSMo@=_1Ɏ\줧6ڤE(howM{o޼J6{ūi>(kD0=Z.@3ClbԨ:,\R"X@+ T`^ropJs)]&dvl%ۃZ5F\@.whf;U5dfz+|X,wؕZԷX+?Lzd-Wq֐ef=HRHwFZ׽↋jZg LQ:OSGI-OPT/src/javax/sql/rowset/spi/TransactionalWriter.javaA0WzjW%){B@DՊKI2I 3N"D<9]wRbD}t0-f> F,ś9,ېz,ʐF$-ʒ #AXW2V( ^0K[\T 'TZK!,T!sAځPzCœr,G>yU =ā8TFdfL=z Y [axYAלԽNzVUGCަEhy[dž&qI6qdsorHv{8io:] !'->@}ađq:k'`L"dD/*uE QGu5A:2'M$VˀiI8t_sFQp߽7&4B2mirpL|{b=9pdio,RgUDƙ·:Y.GQM3#:4 _PK0PKK>0OSGI-OPT/src/javax/sql/rowset/spi/XmlReader.javaer@ )4> NnOq[=I nvcO^-3΄̮~$pKφi9m i[D!,אy -#V;x5(-V =BEɟ1O4hS/l-Ϊ8T:AjjTv@Ju#ZOn?]< <p4k!7B91@)Eku\m{dւ w\Ah*EAA9{CdUAoSuνFnZc&Ii>OI7yLw_;xL,U }K>}d }#:xwy"䈯juAKdӉQG4;@֯2`mZ:nzӗ/7%ٗ62"iiZm^%fэ?w#G,. pf>hz%srOoPKmt\8PKK>0OSGI-OPT/src/javax/sql/rowset/spi/XmlWriter.javaeMo@W|# NnOq[TVnvc,Rp|̻7R鋡`Z`!Hږ,wm0|2_i!CU ^dM%JtBhQḡ%%.LdQ\@*E 5x.Q; :'w*F U84ꗅ =<8>qLZj3 [ >wdxB3U) fmEʀh r)Or$]/ z3Ttiyl0IrH |J4>}>`dY٥,tn7| -9xo"䈯juEKdӉQ'47H_e˴t$'z 'qs[tմtWlCS cg t/3IQ57X\;$<"R(k?֫ PKɆ9PKIG@OSGI-OPT/src/javax/swing/PKPKK>,OSGI-OPT/src/javax/swing/AbstractAction.javaQo0ǯ &h62ʶL=8%3g;uDZ&Mw9qo;&J zigw> _ﴰ@fY@)J2CnjO34+ zlucة6lR9(,[Xq)j\B6Vr4JvF4VF`]}aYCQU4;Rݜ? nqIU*X ҞS^ui2U+W2q O w^#Yo7PlLB7!1x!z bΖ4&E3Z}pvbH|; Y?E$T-jLdMrE#h4nc$071W ;ݳ-{lIqG ,!,u F"fY JpUL_>A]JPfNЀ;oQSo{DbQd&ka\h jmL@zN(՞MOALϟB23#ǶLSix,ˎ^C&'d/wԵ+z=Z=*/j[}%lAW b)W5彿ے sDevZ_U85땘87ѢZt{'{oΧN7PKGPKK>,OSGI-OPT/src/javax/swing/AbstractButton.javaXr6}'ţJNZOgBKV44t< IH(BAJoɃCس,W z#P~f=ER>\_#˻rL'$Ȅ! A_ )Ї5w7G1ъWvvbQ%sr ;x[e",b!vaCnN>Xs#N (/*/V9oI g+qHe rNKlg۰.5 %,KOa@4Ԧ CDtl,60>"2C^w\̤ҝQEH΄LwĦ+jּuٞpvvo/ꃁq ,ŸJ ׁ]'"mc[ `Bȫ g% +G<l)Z110Z%D-w ,e_LRyQd$WmǫK1#ғUzhqRM 0i3v"]Izw(K\)^zZp"v}rNrњe$sRae,(OĘ6*Su1WpjfFޚL%3E8.V>P^:NA5NJZϩ8݃ʸ=s9Cp臐C82Y(0+guˊz W\3 }2zЦܜus.3.oZYŋf˝1TB&'n cn%dt>ZOɪuف3 |M^q?}APo\ddxϬ6(M(9Z>Gͼ78[״TM#[Q=lOP!nk[V]C5gڃ>JB̙BZ^ir|U9a9$k_{s@%OOqEiDc^KՇ}zn%jsu!82/ #(k~xlv YH9g0ċDLjR䒙D"XW )N-|" S_rLXqXs.%]ĿlQ-m>T6P+A U%Pv4%zI3T H.iJLf:l_{M> Ps쿍 0 ɊIampr)RDB-J᪜V߄VV`ր̸qla8\|$cLpT/QL%2A.}ɫBr ߼h!UPzʲrwF~l"H~{j*]W﵈ Tх99CLtT6g\0OSGI-OPT/src/javax/swing/AbstractCellEditor.javaQo0_qT,m\gtLu7"8,")S>1,-f!5ˠ+UJ9S%҇ ',4-=ѲLZLnt)RlF8_<OPKJ~PKK>/OSGI-OPT/src/javax/swing/AbstractListModel.java]o0ǯ8UR1nMUن%RiN;fdU mVդm\=#`ʭB?݉_Q$#;A; UP$77LZ8'p1TjZ t-Oæi:.b5h2ӷ事?+)t $WKɫ` ( HgV9׍a&jVIͯpD gQg>G JF.]9w]񉅥Y2%f|3JM+ Uܸ2;knm^.zݲmjUJER, F&nyIrg\)tWA3`v)zJ&V0uoF})bL;{/p(ρ\0w>@zmK֥=YQ#0okJ0OoIۆ4pȈf" \/"V߾CiVZ@}T}?d L<%]z嚶f~PKUPKK>2OSGI-OPT/src/javax/swing/AbstractSpinnerModel.javaQo0ɯS: :M ]JM4!65մunB"lsO<fR4/7|#899 +4BzE@YjQAӟ+jå` pYÖ@H Abpk^!>Ge Vn7m}ϐe$gTh>XލMuH]NkƋh6krW݊ jiLeb H HgV:׍斋rFm4:L$OSGI-OPT/src/javax/swing/Action.javaQs8ǟO'omД r#sVMss_ @-Yq׵@|=z2.@KH" KdoyA>6BIx]Lǭŕ8~,tIC؊ l- jv7U ܏jc9sJhmk p;BŢ{Ğբ>ƚEQʢWD=f:xKTk{PxrԽVjFmm5:RŦL;1Rm\g)᳘͝x1[g?tG , Un4eTZ: Lfw;Ni_`K?I9 2 k7W^Zѵ`Gyx:DAj\#`%]/~6__~u'8R5IIwUQ[T?5{Aˠ=ѝx&PKAw\ 0PKK>'OSGI-OPT/src/javax/swing/ActionMap.javaOo@q[MJ & fewƐY㢐yf;NX*yF7DJ*Gh]N>8(ѡ],f`rI9*3( -BbDΏ҅hi'qAjJ Xlt K=كI":GziӸm< n06*Zxo>zUUŢ&-zru|dZIt,)ra\LU QXׁI]pz+a1yK,#G* $4k$Kn0I'GId8I3t4M0~7VZUJ)w4͘5n&ϧJ;/mB\v?D^ t?iLfP\8>L^X\e)i~ȲPK{>PKK>+OSGI-OPT/src/javax/swing/BorderFactory.javaWs0 ~'֧-]&[3!p!mz<@OdK'58L֊Gs #79Bt[@_jjF! rCHE MX@?J ~\ 9hXzToYLa T#ap 3#*ES˸o( rj32H߬71v;2m;RExW^0unu-bMk` ؔ,E iH:Sp@˙ɘB rmzQ]<- rM'pp |?^xo4o7hRe# ܦs#(䖒N03Ph"JY%*AAjVMC 7lDⲎڵ͖l茠jI:$B3v.^Hڇ|U[hL79.1J\X2imIWX9,3N_Ɣ2vw {tALT6ĸ,l=hz,>&ȽhO?uzO4ڧpUNط,vs9k? < Yled` yaTc?Oʘq]A'XEinO;V-¤wƛ++we|KbV{7uzPb&@m] HňJtCK2KcCuZPK&D4 PKK>/OSGI-OPT/src/javax/swing/BoundedRangeModel.javar0SpkKCh)&(kԖ\I0{W0&T _ka*02!( D07.gðVQm1HyBc HQ K˸Js)`ah ]j0{YC Z#ip /p`e HdYuh 7ObIӐaTAE_tgcLXKIšVp:[DDݽzj \XET ` H,WH9#-u"wA4LI6ǵ93H 6&`DF 0rs|\sZu8`rqn_!Xpqew&vB&H„g!OSGI-OPT/src/javax/swing/Box.javaMs0jHnmNrLQ+Lp]?st64;h-$$T!Aܓ0I6Ô55 ah; ͂_e '\y/?/)bڂQA9DH`m'z: hʕql$ɭè2> xR( &mo{slCn'OSGI-OPT/src/javax/swing/BoxLayout.javaTMs0=_ 2zjBSOS`҄SGkԖ\IƐL{WCa)c{>VVG0Nxmtaqp3 tq0H sԨ6:`IyBcQY# 诮;*ͥ3R;;Cv \#qp Op`f d n:5U˚C #8&E1ه~( ~RauO-.DZ_9WxHk XjFZՅ↋ZF` -MȵQ|k$M]< '=Kr->.ptM|a|e7l{ 4xmvRؽKmV;-s#y, 1}RPHMUSaeO;`|#*k"FnغB+Aq5d%ZMx,ܯ^ʦI CU:xLѵiII2z)ږ!3GRϢֹrr])4O}~$s\Z:"Ttq”?*ƻV7PKDMuPKK>)OSGI-OPT/src/javax/swing/ButtonGroup.javaOo@q[KU!4I`]C|&Ti`kw8 lC$g2C_CAahPo1!7^}^ܮ>Z.*%Xt1WbNOK<RdwMl"$'֪d*g4,+ E-i"Pj`12l1o4 }c[ MMIPBL0vUZ+W5&DI\ jD\waR,-#L6?j#)OSGI-OPT/src/javax/swing/ButtonModel.javaRn@=_1D"jhnmNU&r\lkﺻcT;kr #ϼy=.F;a|ABeRax3|??_ +BgG21* *AC _O4Vj70Z[Gq%JCZ 1RAVK5{:^:!pm_AP'툊/q]׾hڤ<#Tւ?4xsQXlXk&jDj{H*[AGHKFnJ: plB pDa4r$i j,, } ~  G{p_eJg{E$lu+˭ٚJK"BhriY- LM&sI҅/hyoGKTbۚnp ]IգN0c̈́*̈́/jC< cjb}L@$IsNi+TwfŸixcx6 f ȏhLԮ(OSGI-OPT/src/javax/swing/CellEditor.javaRr0=θ͉ͭ:n3I&G V*KTO'ƍz(i߾}-UWz`Z ; \q5l<-KF d- TKhU!jxA2{4VhlSSt {~CXDBA(n7Yx9t8954t΁(zxv5°{L:G rdzS?[aq~ސU^^uoՕAOS [wI#Y?Pl\$ &9lIn f%xAe8M"9d q!^HQm(Ț[^#ԺC4hZXz)q7\A@9DODu4mN!R^MiKrU G:~:-JezP0P97 ю< E}S_<̻di+=-\kaOUAklEs )powex?isKPK PKK>.OSGI-OPT/src/javax/swing/CellRendererPane.java͓o0ǟTY/m̯pi<[$ )L泋dgdxv EH-R}w .8F9侧m_<Ҍo$ic?,D1i{2M*MnBHIjYPܥaz--3.; !]&azyXj+rJEwptq -}|PKw`bPKK>,OSGI-OPT/src/javax/swing/ComboBoxEditor.javaAs0W39iz`8(`JAR%t߻cOnOzp +{ ~14!jD/@-) lѠ lx` (Q#D* p)>X4?8eGBg<7x(PY ٪ mv?\ M26(z.=^{k՗0!`#q u6' 7jd;v:iLUrbmR5RJG=hn`deٔX^FPlL, feqp&[h] *M]& QiHQ<(& L<"dW+OSGI-OPT/src/javax/swing/ComboBoxModel.javaeAs0Wdg\psks"2ua8(`Jؓʦ3N'aPs0-g %!Kby|2 gx Z4{Bv&k*QZp;Xceh,) 7^0K٭8:qك,"D$#@nwgt$1 [ fRڊSz0H6sv0m*Pѻ7g/0sH yϽS=l)ltr6dd)A>$rd0&8ϧ9Zƒj*y4Ah@c Xy:r>}o8v`@y94^PwKU2CY˞p/1̊,4rl a7js/̂PK#PKK>/OSGI-OPT/src/javax/swing/ComponentInputMap.javauAs0x 2Ԧ\B[)`L^Z#a2ed<Ҿ*p6+G`HZ Uч!x81A GvGe !^hTI~CH(UEIp^W !lJ{48C:eM}AC*zk:V.%+/X.`xBm7mXcm>k]rM|;׃9XH bZ5ukoSJ\51rP9i-xLț9 L泻lgtn=76t2ȉ^!*ZܚQ*##[³:,CL- :zW("[>v-G#Ӭx(jl~hHL=]{K9z׆2vŽx˦,|cTSccPKXJPKK>+OSGI-OPT/src/javax/swing/DebugGraphics.javaWms6\~N>@^M~ph9כN#0jJ2ޕmy1PȵL}])hp!?P.qA(jzݥeC rFG2.(WtQ zBN~R1ʪA.ҭˆXd\hE` ţ06gzIYr&'hqD㟉|>Hү VUfޢT)Ix* Qk@ $_R¨K+XωfĔl鵤-5byp]pobH>v|}7\ptzA6ؽOSP)C?%&L:*K隄H$zl< )bF%Lj rʔ)B#C)DǏ2OCK͑Q !&:GI *֔T\[7ݘq2=Lvo=<\p(F~:+`}Z+t-%|/P &|JS `#%O=]f )U=[]ecg2`ے#M]gNUTG1*mnI2jB`yۙbJ=IzVUVi29 ?kčIhIQvVo |_,rl'->%e~gFD7$I9=A)}op 3j!'55È<(tr²rjN$D'XnU| d pƙ0cW?霵qqz}܌D\ j6L;!!T7q'&0SdV&i($zcw(v 9p0mXϣmUj~-.v.}4ӵn`znL!~:8p'%ƁȆmt\b|,ɭD,-ګ8e]}y} Y wUA19/N?=Z I_JPK]4aPKK>6OSGI-OPT/src/javax/swing/DefaultBoundedRangeModel.javaTo0~ʼn'@lT(e[&B[ULrwlB+b;}w-T18 4C&c`gݔE(xpp%oCz(*9[T2 L@U.!R󴔶v)Y-923 Hi7RtY~j˥ržIKXӺzAG˨+);**b*hwV9K-FMit417VIfwLhҫIwC:u M0:Mw4A?zy0}s,I].QV#9;`+,SK `,L9xDR(r8GI3}5gq{UNi}MȹZ8An s8*\PPvO2qるh=<8NL=(WGv18.jl+~Ts)}H=""nl`E—94LK +"+*]Ei Y.v[s "cﹹ;n>,播0OSGI-OPT/src/javax/swing/DefaultButtonModel.javaUo6~C“`+8Zg̱mQ {͖5{d[[&wSE^P揊/W%L|!8b`g!H !jTkLf@2"D YJ9|cJ-[lkTe9k[VMK#x 3n=ϟ-'fu'/d"Ă[\Bӊ)f}6ҋPq&^ͫ~Pq/xh+/û~ׇ1Ŀ;/GPaET8\]Yc.s[/ Z=iJ[;pMyb`!?*M|d~wlcj[P_jFM20[cޡv?t/ |b-y,I|gVE6܅5SӢ)j/OSGI-OPT/src/javax/swing/DefaultCellEditor.javaV]s:};}Jy2iI8(GT$-L;+I:PZ֞gH;?3Ntka2|3# /&G@W +i`5QL j[?c1wF J…7 8ΧNcw qp.6]VK+ݖyj*2Zml-ZXS:*֌|ΟQ 44~˹;`YDZ+@i`Fڳʩ.4\#0jc $XͣܶvH7mL™B? ‘#[~\g`r*Xނ m]$vV.BؒQ$a78ln=St5bHnX. '*ڢLL0WPvuxk|C1oMۏ?VcgBڹB)zǮ "Js5&W^3g7җ!o}Og"i+-nx?\D۽ RdIsNPCyNTOk >9%D͵ 1m#҉r wC&0ap̩!LmIWnUN V" ɑ>#e6;|*7Dq3Sk:EAnU"{ /dx?sKq U5,67(mEi5Er RÝ 4M?,uڙL?:548DZ]ϕfQПj^VG/Qz }xk?PKʛh PKK>2OSGI-OPT/src/javax/swing/DefaultComboBoxModel.javaT]o0}⊧P@1mJ)ۢD"U5I.cgCU![ǖBs=8JG0TJ|nK;_8Bp&S?n&i`39OQ̠jsd)ݚ.\6\I89@jwNb*( P$ n`.S,-p *Z|=QqNPegD(i fknm׫gkǾyOlwGx\7K)'+`%JYB^Ai`Fڳʹ5\]0jfkdX͓#EPmLB;!pau"kt9`2 pC4a4> a4o[8>Re4v &wunNb 3dJLMr@-) nܱ29 n]/rz ݲ[&A*RX%P:U efi~PK,2an>W~3 uwus[o3O:p2f=\WZ?| ueQrK?.πehK9hz`=.9m%J'c]FG61 Yh^;_[t؅&n=kkD,??d5{ݼ0 PKp6PKK>3OSGI-OPT/src/javax/swing/DefaultDesktopManager.javaUr0=א6'I6&(QcK$cH&ޕqxZ%k۷r'0Zxata0HD9O]׾0EjK(4 c=~\ 8sб=kC \#ap Op`f dU ne 2 C #sF!0S. c^Q.+RŽdc{r_%֕׍HPkP+2e*`s⚰+3#-BqE쀖)B rmfGgz݀dc<  r>Onfp;Nwd xͼɘvW0WoHn( RqbX.Q 2T)׶&)7̔^eZ-dKruAP,$0bybF̾1A.?X:cMӅGxRX`R,N' iLK]9\7 | @piTH}p"!+E!+\rM"48)[=pp;\/3݊[+L^i"vޮmW"ZO8bԡk-V=ʽ2Ah6Ϋb?0D,h PK{:G@ PKK>1OSGI-OPT/src/javax/swing/DefaultFocusManager.javaOo@q[OkIfl]v5JR9yu&rgDv:0O>2]~5,‚,-B&xTd,R+2Q5.|!cVp ųQW>\?~["BlIEƣ‚[2'FX5OSGI-OPT/src/javax/swing/DefaultListCellRenderer.javaur0Sp+hKҺe`fr(+ݻ2&jwv%5t7X;f='_DR 2`>1 iaWTd,R+4Q3z~B+aN^b+=(HB.$2,ޔ-Z-ܺӪxxl5t8sJ(Εo6E_cm&d۬{%Z0:NKxJנ ԵN"sWs^f%3"Ny+D In$NB//-lO/`4e;Uh _yHL׎ ӊȡWY/) 3fyD~~ B5o7!ZKLև '2*@URPKPUgPKK>.OSGI-OPT/src/javax/swing/DefaultListModel.javaUQo0~X}ۘ6em:]UM{0%vf;VBZbwyΡ/ӕ⳹Vp#+79B۽h=ߝ9v6R51XkB&BT`n+wRӅ h[ͳX ! dkxS\@ s3/,V ܕrj3URttHwbYܬ  Mt{ALS)i6XF,X15{$r\}ܰp:%SߘVy@dĕ69 u/1ƆF1f9ˀm(%^lB1TNw+׃$nZ_ֈiO9>نzu(S5„S0yNAu$>^6GcQ)VG]+St.=d6^ >4z{F#]Ed"hPK ] PKK>7OSGI-OPT/src/javax/swing/DefaultListSelectionModel.javaUo0~ũObmcQE i`;ʏJ!`g5JVOg9 O|!8Bպl=ߜ{n. 18P!1j3?a}o J•ׂ 8+_J0g+Bj8 0%Dj2ngy)%[F &@`f&o,<+6EkפD}R XB"6&e4FzgSin6͘FGsc5v˴Tz5lc >a6`yun!t` ~| @2ѮɝE!Dܒ0Q$`'<4eSZT$ܸ;2o5k5#e LFTZD#m8a= DQ1\2Q!tp+/D͙]Ůu,3y{Hj,m*%Ght_Y@^UW:Ƹ]ETqAڼ{D(QoepڃuaP<[ VNû fΥP܃$ַ#6o)!dgZeq0Mn>I S!9\„)vfD'@gT vSš820>Wλro|/ߍl`j>a!/~7z@<ͨ.Ol ov`65^b&Ll?NW#mwV:*eQqσS..OSGI-OPT/src/javax/swing/DefaultRowSorter.javaVnH=/_Qʉm'D ZI96va:t{ߧ6Cp~ի*CS>P͓nto!8Bu0qH4WHx` Q] RGu#jÕ ]8/FedBf890%DjVrnE)YFpF)}7l%x-MzyP+D5`x; o$Uԃh h/*m*b3*XJK4ҙUNu2͙FGsc5evǴF* ۘAAxaz)3~`2m ǣ`G; F?G02ʃT H&wv]qG\LJIDPKRKn\[ Kn-n:_GVl훜.;i6#ͨlY#78gJ[_J(c$+xje1r^(4nJAy^J.-$hJdK9T]C\PAҒDVL[\o'RŇ%kPX^=2֩=>4LKڒx<{& JD,~k?10!` ʁq 7Rϱ4X*-|^#Ȣr4J*RؐZ֮1c9\23:0#]r7f1Vl4Wሞu΅[k0½*Yk{e yH\'W߯-۬ާ)%܌C3;As& fq oD(6b|"ab@M{sGֻ% PDo .ZBM~yGqM[֢iwI+m?$~S>-O#5 ت$:F}c[~8Uɭzt~PK\ PKK>9OSGI-OPT/src/javax/swing/DefaultSingleSelectionModel.java]o0_qUX`[*1ʶhH]$x3vf;V8 $_?=ypc4V ? v s40GzI@1J 2A v0YL_P$uCةlRY( H@m.!V뼱Vr4ZZFrFrZm!0ۘ~+k~,ˀU'h\7n@c@ςkx-ɫ`%( ,HgV9ץˬFd&j,I)$tFQލ09]8]h>M$ƳugSZ> 6.]9.Bxb!U%cSSj2+X jIAz͍k!j돼\Q8wazy"B,yƔFt"0B#~V 4Q:@UL_66+{keijVㆰxEĽC|||PPvO*q. ߅xtx,IjC{6L*))!WrD) uD Ě 2{bh !-dIrqZ+X#Ry n\.W é$ܶm RT*I_^ߖL>-5}SSg}PKePKK>,OSGI-OPT/src/javax/swing/DesktopManager.javaSMs0=_S NZ@On҂MfNvڒ8)gO;t>=p c~zAT$d?NG_0GfY R3e !"O3oh,) n&OSGI-OPT/src/javax/swing/DropMode.javaeQ0˯IP*mZs+$MF)MΞ|{*OSGI-OPT/src/javax/swing/FocusManager.javaAo@W|-R(vRG4)Z`]XQ{gmZfC 02Wg"CO'@O#~vjQb 94"Gf,GW7TKaЕ6lBh4P _2 pZzS$i0jg4P[of:6m]'v*Ы0XDQwSBAφ+rDX+ւTJT3R. hY)29F1Gf$  ILc|X~  ,c<\ˈޮ&@K6)BxP1Ț(V"rJ#QmǪ 02pӉ/sζ-I͜I)D`)fby%F1Aܠ~eqX27K%SQsI\ ֊Pj<$w~_/OxyWO}2Elٻz>+sp#1{{]Jۣ?Sb9{{@&hBa MfVQS)+ߒօyU*SW}O?[PKYpPKK>(OSGI-OPT/src/javax/swing/GrayFilter.javaer0)v| oOv\)OSGI-OPT/src/javax/swing/GroupLayout.javaXMsH=_N{uQ agA4x1ҎF`o$ !ANJ^8ҳ6&ieUӶl?t5;}˴ۃnenny?NH)8Ku:]qȋ)>:|Zl0(|m Pø|SWҁ ¦fuY%[~QM$NPPi͔O}b`|$( * 'N(]f5f͞fa״rH؀%DS(AjؾiQ< TҞ tqW0eqߩT(u/aQ&z 4tQo_e," qzPmYO-(P2ݰty@ 7E&u`](CUR/L5Ex$s]tclUWaߪ&_-SboCbt_Yb=ΗŮDڱ+K &y@{gŮ?1щ]נ6e~?F wg8A{'<<|^\kz<+Gmz)s2X@V]D3xr0s7T0+jlJRd {pj ,gu:,oGGɓ8Xْ|C9vT/٣`gA/pp^Ie"D$WGW_\6q}'(ZJ?PK̘PKK>"OSGI-OPT/src/javax/swing/Icon.javaeRn@=dG\D7AdX9aivw1{g1of޾y3M7TlnL{mIa?/ð6ha2&[OqVrYdPQPទ+CtOu"795Ġ8RK*WYX$[ p3ͪ gAA9U:* $ ;ƴMH$9%ydnO[%MmU ,]MC4 2OX&y;/SJ]$YUTpkDP#Fs jY`iZ:n/}~8Eg@w{6rh*N nO\;*]3GE%hO=$z-yoD.9 35ponEK3 PK.V:T*PKK>'OSGI-OPT/src/javax/swing/ImageIcon.javaVQsF ~.B'rC >]3}$Bfn:}Xlۚ]wwJ@ ilV`nx ೄaKB`ӵfZ4[kX{`G/IrSU녾 vͽ?T輇tuZG{etS EhѴs*Ԗ6:|Cl~X4R{>"t3/8/[kHL9 oP9 ps56 |وd-CCﶛNثTa_ws/PK  PKK>&OSGI-OPT/src/javax/swing/InputMap.javaAs0jHnmNnLaTI!@Ii}G=wiT= /$T>8l(T:Ci ArTP)ZsĈ?Iu}hVs.a!V!kI|x ^"?4* =7^Ͷ A~ޛ^UUcm\׺Uzv1.3uu$:dd0U.&*Eڂ(,ׁI]pz+a1LyKַ 86df-di "f h E 8x\. Gs1)Ĺ! iF9[SE) B/*v\AF҂֞0ECKN#SN8Dȥ`T&*s:&ghIHz~5-< lėʼ')yr T))lZ ®Ew4G+OSGI-OPT/src/javax/swing/InputVerifier.java}0S+ZN)˶iW +N2 nxC*5Df];Lu}087P?ߟgZ,ɒQ2CdFRFd6X1>ׅzGt8@i3E!+3BuJ9(뎡S'8]Wu"OƹhԶm(Nơ6:S<͓GN=4qz*)V6!9[#TV<&6fhuM(q(ī^2Y!^ŋ9 ס}m|)8ϷFg%[S& qklDI(PJղ`1J'i럾|Qxoжu!Rn[dY%X2VuaF8Lf7*YcWS"f\c QYx];__$8PKCbPKK>?OSGI-OPT/src/javax/swing/InternalFrameFocusTraversalPolicy.javaAs0x 2ڜ\n3Br%߻".CHz{+.\`bS&_0+>)dZ+2%9Bi<*=x !BT YC0Jt'C|g5LGA; "bolicPkTr J;k cce ԲZ A3}|6!FmS::NFEGwfZܼ]ս=j=W%-ūց*rlt:vZr1+S&\ c#^V /zy1|yvC6gE~S`6d6l*[dG|ͧCLSb8_n+ kb\*%ݱ35Z\EV[(D3~ЎR * Tdn"}h˷l‘Y%N`GXJmHzNt KN'D>kTr#J? ~y;rug`pHIPKPKK>%OSGI-OPT/src/javax/swing/JApplet.javaTMs0=ǿbtB)tlL^#d]CWB9${t>9 2[* 4^r&"e k˵J jT ]b$)7K׫N)^Hi~1})쎠}+&-roAw EȆVc5qU--x8zǶ`7Cwo@U?vJ'RHky0z&@͏m:}u2c Shr%@iڃՖymeamz)gR‚olz@ȯXyl=["(&|x66Ÿى{WǙvSjKYH H :i699cið xgadpZ~qPK<\PKK>%OSGI-OPT/src/javax/swing/JButton.javaSr0=_ 2ԐZNmf0i&GY^Fr5]2M[e06ΪbEЕ='De~ 6,< f!3x[%Q;̠ZBT ɟ҇oh2!t=Ӗ:ؙbC9U[ ͺj5V9-W-II0\pCūZчgET} Aqhl1(X7Y2}Ǫۮ;]s`g,;Nw *V%EZKр \#U7VEɩ=MY"'l (8MIߓ%GE4[ gxgƳI#9w2x $WTlM( AThcu,04Z+tz} ]TSd)Xۗ]PgF)#$ר %d{*U]+>ࢲPHs~W} p2wbBn+g^Ds F`/|ĒEϞ?ÿ ǦƔWW .įE\GsϘLNͦQ8'gi>~PKaJPKK>'OSGI-OPT/src/javax/swing/JCheckBox.javaRMo@=ǿb "jHn |$qd;r`1^wwAQ{g4TH`4;o{f;@k%ҹ&o8e`9Gh^vmזk!H !jTK`I\| +ӆ9\]hZ@n5Z=K%,riHBLdX9p(jk0NbS!BAlԦ71USU6]Nν? o=j BXA8Kk* XzFZוFi)4SIiByˡEG {-ɣߎbx b88?/x~0lRdB Ȧqn⁅Zr1FӒ\i"(P-kdpji2\V8%ɖlꊨzNQ&"K_ȭ|],4~i %cfb|"0k׫+ZΫsV(iLB$8_-x7pvYf7 ڍhpGx4|P1 ǓQ?7h$RQz|1Q8V?j.Ꞇns/ I)3dTʽzܾgOZB?vFT9Xi)4[{b[ΛPK`tPKK>/OSGI-OPT/src/javax/swing/JCheckBoxMenuItem.javar0Sp 5[!u &(kH$c 6I'4SʃsaB`}`#tGEmX8L|rp&74@)`WA8}>@m0uNs鍝Nf;Bi Ю!B|E*8&eڠT¸LM.2{.hygm7YsFlדK -ڢLL;ƿ} 5J{0ΩF\؝4a r ZBB+9E#R+ 2ŻۃG؃w'1k^80ߍ͏*Ѽ6Lo!IլR9j^w=z2ü4RKHYnp nHjWoyOPK)fi^PKK>+OSGI-OPT/src/javax/swing/JColorChooser.javaUQs6~>~O䆚>>e2NF؋Q+$$plC \K* x =m4OZ?9Bp&cV]ۆ40AzGdcX5T'mp%]B4ŕب,2H 1%jUrn=cYF2ZlEYXyte ^0uu-g`ٌ RtfcknL`LIVvO-G*@1 M?0j?  GS'8 F荆p-| 6 IF}]D;9.BGaJJ&ØyLtRTQK2Kn\[ LKn-ru ?/[{uV3b_=%-2c21x"(mQ.k 3.x~|kɴ;Q˛ONo/mKk'[ Ȕ5Ϲd-..^D'{G(܍a0Ɠ8Lowh%Iyu&x| pxgE 9} Y%N{SRKJD}@?g̙0xCAڨl'ιș`s.uWQ;gKb̡^ہnXӆ\ީ7(n3 >#TKn|%d*x,x =4PK˕9 PKK>'OSGI-OPT/src/javax/swing/JComboBox.javaW[o6~'o[ nZs)\P {c-%j$e(wH] %+"Qs>~~xzD^H7Sr)7?>k27AB!f B!H7@ WeBA*&b;'c#p:90{I,4I Sd8x ф$QS1( c(NQ!VUABuNhrvW r7'K޿ſޓ'@9HcdƝYFa%2J*X딮ddĔ B,bje9l4B?1@>{jP$]I)rk&x'8TUY|MD @OGw5D hlQЛ5b:-gz2_zqr`t/:zHD Vfa-^]m`7̬cd~1u_>wp9l CԘ!-Vpҥ^ 1 EӤʘ(WpQ7BkMHc=h״ljXlKPdI8弅 nv!l,ՏY8lx@86"R8AzR ?1v [mY^H*-z)}#B8d[i@sF9Ď`_Lcw&}1,U/w΃O`~~I\к}fQΦZ'+gLG"2hid[~Wy(!4{3:e:REL5# rK3Cժ%5KBFXb1teUspRD z?9TA>é}-mF^nv倫ØrD75nt"^u*!+Jg^t7yRDX6+',%ּTz(@u>"}C{VV4!0?:k[y)' U6ұJ\ Hh3s-9>&8x?2; _p. xm9o̾]-cUS: dJ^e"8սU}2 jLlpY bsSڽF1C 辙kZPlKZ}L%)Oa(ng`l7/8ZRU =}ʶlXuWKbxEQ9g1AS`TX\qw-0|s{`yՇ;RKڽYԶ*^ߥbD/[6l5TKŕs$LE[A;~dPhvybz}Cnz?*wU˥jN|C,~[5Onܮ=nMsd*&gKrǡu*wnvgdWjSq͹.ōU۷?PKbSPKK>(OSGI-OPT/src/javax/swing/JComponent.javaX[S8~.BSҧ]fgB02;;b+ZGre4*_%O~= yt쒢S\z'GG}:2!gY@KXH<1$W NRЉuz~p &?&oIj* o5Lr5Jv)fDP*M#0 D\>/,{o \GoVv~Բ9SQ44ˀ77\W$)+GG;c|XSOfr˽F=cqajQd _nEkIF uRZBS(B_Pv$.Jjm\k&zQESdK$nOd{FΒHӺDF!)2C%1k59RCOz1V q^F֘^顆} (TYL&O}>;OF?5QΟҚHFx89b2ix4v !GmG(K> b#}(PC>j/4lLBCt>i 3D H pC ֜@A' Uↆj=NA,q/JcK|C*:UBA]מ_'ÍAPUJaS?HZCΖ'/\aZJMRbWts}uU+\@bLWkSd!t1 k6"CWp/P,:>u"-(M7f(hЋ3ZdgR`EPrnW=bB| n j*49֑̣N 42I[Ő4G::`24_qj fݼwTs^ƅԮdx'ØVw9|}̤.V> ;;CN:-O*OSGI-OPT/src/javax/swing/JDesktopPane.javaT]o0}n~OP@=dv(LZUT;(Ass=\ֱpB=n0Icw0rH#4HZgb_%XgA@˪h hsMk`ٔ *z2mQ3bM|ۃvz@1 0 # _1Q0#88hun">idrv!H$ag<&k2Y%jI CƍՐb/רy#Ŗ7+xY>!]v[}gߢLL_)laXC>۵+ϣwie1vn[OnzFOIjTo: < IZqZLB?uGհۃ !dwyv-Ĺf R+Sj s!:wP3;K,_1IWF;Ý״V@J%XG("lWj_` [S!.O^vG .z1k7PKPKK>%OSGI-OPT/src/javax/swing/JDialog.javaXM6=/kNE ;9%0lf!l((c$GCMO6 פ*@R{'܀ЗZhi`<1g"@h^w_@￵< a3!XB*BT`~(G*ͥk MpU]zb-SX5i H\Â`b *)e,yJ~rn3JHptZdY汜'UԉXyoFӛ_uCĨ5('b9qYRҘu"j 1&(>O^6I@ec) W՟m 8ݏџLlx3`8GԺm@*̓/ &,V{ $MD)"J"HP˪`hab↙@hP,왽x:#^#ITDbFܾ 8eD\ PˌW[Bat ‚49Y{~يw$DJ'ؗL1IKʻgMw?呋Pf l^% v -;2T9YKVOokb`՞!Fۦp/{s)c$nK (F=bqwN>E)[ 8nCo=Mihw2pN0NdMpԺp~Rk;a[VX#`G'E5<]oץ;i-ge'߅S4kB* ,yaNl().yےoYmp z̅\46XjSsAn^w|U"wz{ij|G~e9w>5* bR|7v1(J&WsH%l\-b<@2`,Xb}@$޷C#ǝcmuSʮ681nGx:mkN<ݫ7rK{LUW3PKPz~<PKK>)OSGI-OPT/src/javax/swing/JEditorPane.javaWQs8~.b'L>eڸL&#'m@zovx- +{84Ð3#no@^9vR5%!X.Qh *0sf|WTK5ԬA5{UkÂAHF[R0.RҠoKaOr*Q\ +ۜ~gY) :R~MxqIeH6.H#x)f˿ HH[-H ,ުsH"m@hkާӸ玎W.7yآ](`+JGå;E^r.D71h{! صc.(PE\eBϐy0 6NYr2~"b?JՒ=U=t%;/;-ڴh[)N ;$oCڝI?r/*OSGI-OPT/src/javax/swing/JFileChooser.javaX[oF~^~(OIŒ쾵QpoFIUxV{l`|#|;gm Yt&Хw,"-(=.|#@>FMb7S1: G -|do}ܠK)p;F+C!h1ZЀ #@4D[E-o E2A/{1(DmQDXd7!߮'/T6Ct:Ӛck+p 1x'dTpG1[-D4ArzY†Ct9p.НN_<5sѳfۚ, -sde·{/=Ie8SD!,Gģ kr-ن5>5m.JFW>&/n;u~QI}c|N9LS{w3׵'i "ܭ`$$+R nQ ZxӶ \u @!sT60S9$̆3=̡>.,ik9S<0<>h{hYvV˾dTNRZ=hh 3ll Ppk8olv8q|dhcj@[TȦu^,r/ZȰ!5,2/]+U3'vVBm.s)+KkΪk]My8NG ?#|P"y>Er8>?s.dD,ؒ95JM3݇HeC;T E'J:)h0/uX٭!O|y}NVI 3'S֧zxA@>Co: VTm^*:8j)VT>N;c3-:51E.aGp#a*ފ٤mF^:Ta peR$i)\DC1g^O: $R8\I|"IH&SQe6ئџkwoE̗DhW_*nPr=jR̩Nq:4YVݕz7'ʑ;FFjKP' j\/ANJ5?4J겮+*iQەP ՈeD4ƧSFM_ͷ|1OM2ZcIPOīVYRJӘ^ZzY̗σx1(m 3Cό6=Ɗ.k6 }/-Rw3M*-u]7]qp]8L yI޹K5ЍaqRSɚ1t$+w$r*VDT,5-ղR7 ˘Z(t=9P1OSGI-OPT/src/javax/swing/JFormattedTextField.javaVsF~.Ŏ }j<(6JHęL9E\*Ի2$@L3-o{: ndV8>Xa \#ap s"C. ˬVp(Q,\cșad!ռiԤ˜^( ]^Zޝ3ĺ(RsE2bqMYRKҙu"邖sS0&(>͎hzӀdc.zv-'>yA0I7?'cZm${!S6ɭU!Dܡ0%a$OSGI-OPT/src/javax/swing/JFrame.javaTr8=_ѕS2fKCHY09M +8T}ZqcH6~_?=1x߃0V^et/g2B8~}vmXJ 4w{HzCtQU[,dH@S \Bi%-vSXVqeT*iocm` Ş(k`'p P_@c@4j,%U[VrPZ#YT[.}0*9hbnvH7 6&!/aߑ˻%?[ g2hu̮dT H&wv!⑄DLOxDukC-i"HQoqjH`hrlb.h_cɉjK`ˍf[welB+lܢ`QD=Z J]P$t@}|LM"P{wܢmCUN|2G]]Z9ɳ35D˲tm+O{DMK.(x&tN:j ,OSGI-OPT/src/javax/swing/JInternalFrame.javaYmo6\ " n_`@G%f0L;\dQ#);^#%Y%rEw=w<yלΟ%: HGA//@/gyJR —djӀDLQM G ;\τ "޺DJ$:9Rk^IT "% "Ψ|v2=fl"1cPa5+ ",3ϳjfl1>ݞ3uuDɿ dp <!^!s{)+N%H\aN̔ $FrzY†#tbOеypǿ<{8v< oܱ;G;@Bvk̕@p|B 3R1 Z4O9[G(&|A:V & *URE+On$o9^ $"IYONhHڲUYXFw8"=t!~є`SHtŜIIi.1/>0!NO3}EJ6QZd1K8[*'20B_w +]$7P c!"}Zb~YP 3Tx7DH\c!VͣT}Nu:VN+GV+eM8"m_ߍxj{LJ|C$OSGI-OPT/src/javax/swing/JLabel.javaUv8]_NV1$B[t)Qk$$0=y217,^wu% eSw ol[x)ރ; ,y9QɭUHJ%&Eܢ$6\e$041pL֗h-7eώΈꮗK2Ol1I5(B]-t>)R0|пC /yqQL2{L % NB*3E$'ǰ.$ʮ>Uܿfet:>Ŋ.B *~sej4ߍ%PhR%@q|/̯bG[jncدFk2w\SMKF ݳ8sZE2*= u'4zqdχO8[z|"‹ža,;y]M{z?wpcq::-Cuu :VڠtҾK.Q*şqWfMVwC,rXC;n q<ÿnA=Ys=7摰|wO/:z`XrdGT&i:)ZOf핓OYסC:}tz+y$k wTǗc3)]GYtg.vTVOkg;4PK#N( PKK>*OSGI-OPT/src/javax/swing/JLayeredPane.javaVoH~.ň'RQCvzKLvSlkv5߬7ߌ ^w5E,^kEI(.÷}?.,cD*rK")(Wt _R zMNI?Ppi g{12; XBE48DbVrE 0 C,4p )ޭ@tEN y[`l 2V ؙd]e]*̘Ď; )&$!ĒO :L3AΉfɔlhzF8tܠ  ~Cj= ]'χ7rCכ ή@Q2CRi:@YNJVR5g$-; Sf . L6L]Z}BNua-TPN-PD>OɎs5KU>q\M ^=F(؂%L,w^RhMBO3J0k<wWHlx8I@͢e\i]9zN=7x$#8ַ?1'Ź Y%|pي۹?nR ;vTV6/nḓFւ8rȬZ孽sO25@;\B1B*ZÍ4 0oeUKDL2n+6(m(>{칦&M$WeU.i6yP]S8KpHPKo PKK>#OSGI-OPT/src/javax/swing/JList.javaXmS6\~O& Z2!@W L`NGDwI2!ޕ*[e#vvz&,qH4tE08 "zfJR?` $$@I䆠q}}3D "t::A%p}uxt v,AOx"&Q"`PV4$$FgOqfږʍ^'CQ[J bxZUg#evamqʊkory;δ8P/w``kqלw)JHbNL@tH#hzU†#t8#o~so>T ~dzv]t& oMo o?߽ۋ!"2X\yfRtќÄKM1ZN5{&<PLj[(>Q~K-t|pq>g2[:;%!_`$Q r8,"֓'K`蒆TF)WEޭ/ŜI +Z}l,6l$8; ^r7@ '$ Y@.uL *ϻ\lhwY9a SY]v8l{2Oz{hp\1?yD4oe6Kq*0KBXH(XD&@(ފ S<[ׄ%V ad_9qEulʒm*li.xF{x^t6WNbP4 ҈ fWU|X۔ªAvf'c6xɶ>5A\UPwk "A: W\RkXRwpL՜޾ݩ=XBKpA~ /jap l*C$V0$|d(|i1ݮS\:A34Ru "ԈH#Eo XB0JR \KV`­/ \Ecz_8ߡ[r&k;!C-eM~3^Q/! ^ܰ#ue0.?ds]Vk1Ic*z, 4(г閾ڊUׄږlt)#h*|oz9DxjS}o̚Sńa@= gF9nGPxԸD0IK44Q6l;(y;Ӿ TuK[r%}3X"B6bfU 8k> 4z%*.Ȗ{dLR LS, 6hqcj;'Ay@6f=sV+E!c]LQ$r(W];&j@ON+R.-I~6A+=Pyix{Q:5Ý<ͩ8nt-;wDջ7=M7zBE+J{ YBu=1>&B:mLO1c[ǘh-XQ`&歒qz[9b0 \t;y)+;^QZ2l,70FTd-grUow꽲C:evf!BOTja~8в5*CZ5[21~ҥrӥwʙeOX n`Wmp+5*;kE!0zp/PK1!"PKK>#OSGI-OPT/src/javax/swing/JMenu.javaVMsF=_b[INB aD(3#dO>@*%M=~fk i4}װQ1p9#[vl!2;b5y/>F_Z6X&5ǐ+ȜCDO!0N?[c$I2v VX^EZ¿c(XD|"!K@*`tfe(n @˵IB pm_ŦR#^617S~t7 /Kxv w>x0_d>.=+6d_"e3 ܖ3E+2#l{T2Վk{&;nI_5򲁆/ '۳G'5E~ȈۯA貝L RCa _񐛃O!i `2Gx})iзE".ԬaHmOh^ IV hAsj(!2T3>6hދJp\F6 /*+)8N< 2 ¯Yq( ԊF5#52NRrXbܓJ2 d,2qt(R2O^*˔GSFC9 ]_ڦ%FffXEHLbXVd*u]C0b WUZ$M{slx2YGצ-ԯ)(ūBg@i״%X][BT*WQ#W7{ ١9OI^b;&w)R:wfz/xk6mNhśJ"C{mBO2sN;§ᴁ)5[ʩc:!t_몑\a= ڟ{cjEEx1_x(/s[z6_/#2KRZzޙɭ>ß.Q6)YefԨuizPKߒZPKK>&OSGI-OPT/src/javax/swing/JMenuBar.javaVQo0~'Ze)e[&Ү=ތ)w)(89ힵ *]j,S9Bp&#ysa" Ѡ^`##cd OYDʝ|EmpNʭ GT$n`>DZ"5OKi9"O}ɡ&Q8#@Ji5-E?3k7n+{J']5A0 /Iu2XJ"6!4D#YT[.59hbnn5I#^ 1 '~Ax~Gr|?Û`h * FCZxUZFy!ծ];W!▄ZI2)F|#*M&K@-"HQϹqjH`hslVKm?`ɉꢕfj"D(KZz4JE8oO,6>ۥ+AWep[/R,Fѫؑ:*E\;s),eh3-AfB\T]L32ilo 8QK۟q0nJ?eE 45tl%"uKޭ#눌Ik.ղׅ,!}TZ(c5Wo lRͱ`S^*M/Bvld ‹TD9f4z". gP[zO u_7g$ ;߯Z;:6;Y 9a韩xm}UN~z \Pk'OSGI-OPT/src/javax/swing/JMenuItem.javaMs6֯I([c-3L @ 5.HJ&e*:H>x /p *h-- rL뫫#ϟ.< 5&( &P5%5+#JµwCgp,_8FbBa@>Ř[bi%j熡"ȜCNOimDWKk,=V)Ƣ5v2 'Hu() T,"4L#YT[.ڒityTNҶ)I8CsA8rO>?]fsME0/O?`z7>k.u!DHHU- !djZRD^qjH`0ez".x0<uٚ=y$ /"J"ĂP(ӶRbRJbqL n7< j6m1,b]Kxv;ELkc*kw\+vI{*9JJ9kV<C&fwB0`| ۉUR.b*"FǏ9I\LY!,l 򢢞цf= .5R|'#:ZUOk'00Cv]cO߷JiuNwe&޶=k7G-kw*\JS߇x;[p}2|H'; 䧑vl;Bn0 7}fF[h fc% 8EJMypg_ػdNǷ3T"jȈ]c|LS& "!k fK90_MܵpW:~8xRXn\ߩy`~#TGOwRwH]])OSGI-OPT/src/javax/swing/JOptionPane.javaWmSF>A1B:-T\C;,%N91 =ؒbؐ$>w[hqQɝ}L뒁86f׃ =eCTQHf w4'Zg*|]8n4a_EK{g `Jf>E Ø9M= Oڜɻ NM9AIC 2"Ivx8$`br脶ahK#PA͘@*\'T&^/X,P-X! q5>)Q)aLgS$4";"Owh3 +m yU-O8\*sݾp*yMMw4|RkCƍ  k`l F^I1q|l=f½7-xblK|s@-LHas+NcߥWd_nUҕΨrnܝcCUؿwLLKGEi!gxzsɿ!WUHΟ|$OSGI-OPT/src/javax/swing/JPanel.javaSr0=_ 2Ԑڜ\B[2QVH$cL+4Nδ>ؖy0hEXd$R 8Br< ˀtDvEL d&8*T@ ~VZe<~Rop(;*!lDGA(zgZifN}ˡsΨjzoލFu]ǬQk[ Ft2g7Z+΁8?3JVJT:BCpzkf1y+ʿI#Y(6df=xdi6 $wbdLtb :]9>@2zH<L<"d/$lI3FpʊޣU ڝpX ,;o~r=;Į&T9\2vsJQ o&h7qGoO99]ѱ1(% {f0\kdXP_~ T%<;kQkP%50zPK-C?PKK>,OSGI-OPT/src/javax/swing/JPasswordField.javaAs0ȸ:@f2mB^Z!a24i`ڷ߾}r$bkDt=R 8Bl08 {?WZE,"\ bЀ["TB ,@ :M;.aŶ"1X8 ^Je=x'p013j(mstxWUqMޗ{_'8"M׍h-Q CϷ rٜJV6rTsڻpB!Xp31ΈyB{HSЉSH$ =66N,0p2HfdLoC2)2 ȦqoR d b!8^QhVkd0)V1W}cklE("pGzVdeF̶QaCbiGAWOwo x = 8ڑ2/ `*;WygKͼӿ7?(Br>ϞZKOR$6EWbЕFI+BN*эW~ءVmZ l\z3OPK|_"PKK>(OSGI-OPT/src/javax/swing/JPopupMenu.javaWMs8=_ѕI1&N.C뙄dRSS{vW!l*}[6@`i N擩vxzBp&C ý4p#5Q jS^BtjÕs 8:>pK-A* A\ s.!T8v8%=P#Ȝ qEnwXx,U)=t` >(I&GK`1 و M4ҜUNBsFit47VQb+A[i$6&e/#y}|}oo;?Rh|dr, V$U&159Ia%y17.FF̦C5BV3 hɈ`˝eBr-Ȕ/}*%Qѯ C򎏸v7AXfpԃ /X+ u~;XIify4ޝV:O)xMFI"!%%4O^e+A\k7.4;IsR}sr~1*b\K,ȷϤ]y=Zga^P(jFk !.@L/t>\4v_q Lznpüfo# Cb[VY,ڒoJz15u#P}B\"^9O`6@EylaLns{z ## dnUGs9t?y4T6߀f-66HnT1VGe+֙ +~>߅N7$TiT>Yn7MUass4ݟ&kqMPS70{qr^unDa=%'Yg;kQ{T.mZw*`Sj2wv bB2KUFoFԛlMȩZ_xmPK>RŇPKK>*OSGI-OPT/src/javax/swing/JProgressBar.javaVMs8 =&'nnۜ7U73VNggܥH-It Hr,;m %><<VV%?$B^]eaHcth$w2F0\'h_Ӂ/h4pQm]\^3䐊h!wHT*|1 5&*iK煟L ަu _.grBq`쬫JޅatTWVZs`\ZxXLHK0"yêVzgpf"$y+'o$mB(mBE?0~F&>9z|?|o#a0~ѐ>B :2OHtbCԔ\ʘBӳ\ffVSDMcu$0a%S/>Ŏ?&W,SDu %b%Hۧ{kfF`:quxi@`4j_)d)'RI ՛3DL/{1|EYLM~K2sL!* ̡c]/~Z)Sg*D9- sPKj#rc PKK>*OSGI-OPT/src/javax/swing/JRadioButton.javan@S8Aڄ[Ch4&r\uwvgqx5UբXZOLrh8eHР^cyjD*F|%a zm7u[UÊmA* AD ʂժja>#VCeQ:Nn"0BՇ0l&`{@",&|Ǔi:yGmՓ,g[`QqkPXbV9F +dQ 0N&jdhGFM1 (8]ƩD$x,lzٔN!xzȨn*p2OSGI-OPT/src/javax/swing/JRadioButtonMenuItem.javar0SpknmNflLJ2ݻ@aH*<ƪ^kQ,-fQY &9B4^@߷]C2 $hP0H `Q]"D5E|%a z]7tk@ i Q"#ڂUUwhmNőC2(QAMa"0AoKkwaضmāEXrMx't򆨻;Y1{#49j,#֒4B#ŬrԭVeL."kd0$WQgws$I ƳuXk0n"!,Bp&Zjԕ0ns'SJXfWrBϣ9sB_ي=%Kn2"Mrk-VnQ,u^Bi s)2Q D;zj,r7];H?P&x xgMdکGM)Zъ #1wH[χL4D=W#/#~PKN9.9PKK>'OSGI-OPT/src/javax/swing/JRootPane.javaWRF}_œِ{\Z !$G G2桀smmp/5*L`V BIc=p^8rjK89f9F8Q9D6S9Inw\,elr 2۸;.cw νEq N'+`؄l 6Hk*Ԭ+.féZ2籒|hGJj@1Ǧ { k `ݽts|g ]βv~ƃ IFq9:ɵYEQ8BOGYfpRPFX5& +O[y@VtK}b lK귢dB"0 Cu˄.BU[%A(P4Sa<p2*uP͢ƫVHt{j ^ZGYNY(J jN+LDϷ(Ns`Ke"㩗LR1*{)Pk^$JQ N:ϩ{ 3$JUW2RzFmm W=HB[OsΖnlfyTpKuq~.s)qYyRNoÞ|"xl@S_;S܊ : BH<33U賐/**Q%R@M=~ X. Rߧȕn rr]VNy3g|3.# 迆Kf&˿CNE8>ΥԻ/o.X>=2m:9We8v+k41ods`clal5fvdZn= 44_= w4:!eynFSx#5}WG^bq׌Yx;e+}Jhkvaz)7( &a-˼} h.D,l{>oL/.<`gLˡLj8[(bMW(7վ?0QP"E's|oUl7]DM-po59L.p9@/ ZzUZmc\t7|7O uw*߯Z-Qq{H_IwלT|iPKPKK>(OSGI-OPT/src/javax/swing/JScrollBar.javaUQs8~.b'OC Mrɡ;NZYI2mMO_`qH-VB\3'עLL}Di0UXa=?1XS<ۭO4_WVc**ǥW񙉼%GpYen.4O# $ךr>c/C5\Kcx즹c<ߦDJ $m5(L,94Hg c]fnZ9&sʁw*A?SMi^.=T8;.~WT7b~u_ۯ?c(K8tߠD#ܔn!5K.t%>Ӛ]N;|~o^UrQX:s>Ga݆tnqFͳ',l"8#ѢiSlm800I3r^^2~J>.4:>= F6xgc'Pv)OSGI-OPT/src/javax/swing/JScrollPane.javaVr8=/_ѕb .'°Ϧ CRsMWqT}[LA^?ҁ/0V^@7'{7|ֱan##czK,#PFX.Q BO>ӃWtmM>us;{ÖA*q#Xqo@mÜZ&]'GLG|(QBHOr 0N6ƄI8,e(,6?ԛJEߘk U|*XJ[k9,DsZi0K؜vHH6&fsyufgx;`6l}vgSzF;$h| hr+g!PXRbW<:fkڡT<| 3J]v~C:cf;D A ;a쓈Fܾ{VB<1iߠ\Fh:AI&4:D 7{g? j2Bf;Z "=Қ<'HDoH]|=G*,iZ"{Bc*m`G' ml&om=[x(v/!UPjO?Y$C'* rջ(\wCuj҃|Bp6kQvݝ4h$'>T;+-R 1lr.z=gɰdk4?84tf[fAICWj35YYsVl,oZAy-Jϖ~mJN}S޴97 }V}%EP|]MA fi8s nl/U5xPVlt!4ivXGak;f^/9 S&Z&]hku:3V ?^zoW}t:PKs{8PKK>(OSGI-OPT/src/javax/swing/JSeparator.javar0@Wp 546' `h&G!/f[#a2Ә锃ݷoW]Fp m,B% %W! 00 $Q9̡R9Zu\c臀^{\AWPC`M%%@ijNK &2 `xtxo>Fu]Ǣ1-F1֍4}mRXUWXk)jDaϼֵ%Ok_ V?ڋ# $4$Ka<<. fș7"My#|K7C@֤0-BxG%gPҚ$JޡU[rZ SҖY_(x?؉}jF]GZA24 Gnp|7A+Ti!hE%C.! KzR cG}TxoN!;<3DϬq'"v~f7W0,*_kn|2,;M9J'Ngg( PK8.1@PKK>%OSGI-OPT/src/javax/swing/JSlider.javaVr8}^NH}%v0샰/Ԗ a:ln=HGo` ӭ˕vx O8L^]k~ 0AjG 䞇(4FB?e!t*ͥm _]]Z a[@8)$ͥmY>9U_r97 RzZL.Iv7ǜbOe7au G-Ϋf"FAW4XJB6'1ۀT 靑VFqŲZ.̆)4FyfJ5ԋ WAǒ|Ƴ)|O&0`pk6X I=5KZN {jomzO\%ꬲF-X)22n\:+X:wޟn5;5F7?Przީf<En_  I"R Zfx}`zeܵ<c]Zì g?7ؼΙsJ=M+ /&3Q莇6Lmmsfj-k8wEmkֽ>*w|<,s[n-NK E?>VSۖlNoIf~*91d)+\ &gβ>ītT@drbWVBUi &OSGI-OPT/src/javax/swing/JSpinner.javaXs8~> ML3iޮy"@ȥI;{'.VHNxӷ߮v?4Z\/lQ;#8f@ˏ-dl,GrB "$s +"_@*&8/g .Wk)Y5BTb0E,!$0NBHrj+v0!r 1):$4-s\SZ|jBqfnEֹA)"ߔIx&4AV! ט$;- dY(1+*DLi&mC/lN@e@==3|2h<FC|%7`k@pxNi2#gEPJ dSbh|XI@.2iUH0201[0Mj/.P@1@>jP׍$$)r ƹ%Glu mO ɟ01/_)4Fl˕^áYZGꇿ1Sl8ND4tP2: TRh_I^bL-C%S1aIe>Zӊe1h8n<"HT :Liof]r# gۚ'B]nv4wrlx;*s&Xԩǭ<9ej8(mϣo'׺,<>KR>Pod>81enG"qzkgZ{yJeuO[q eRrs}4˿oz ^rRѣJ7)`ކ͞jzU+߁zS.޹;Y -o sFNB[MY ڻ+Ww,-Pn;8jvvۚz׀ ghU xo$^ñ;ǕSt&G:ٻ&Q4_8>HX27F1~ ]4ީ8[sT}{(\G?PKBzPKK>(OSGI-OPT/src/javax/swing/JSplitPane.javaV]sH}^-)Mi75D Xf^ZӻHݍ&;`6s?|!O_[>)/00㘑$pq=\viӖ<*X@MⰐ&F%() 8=\hnqԽ/<y+$E&ab 9@Wi!mS`JsEМ ŧE*D?OJ be?ʾco}DjTJ x$EU!֘l KALqz#bɲ/Ԇi"&`LUӈ 0m$wmIΝ`z9l׃;ف3Gz@1e>BG2N綊SZ[I2![CKYRX5 F)+&uY% 4MVLUK;w:5_dM AN1}QDW_$ec'4Qyt,Hbtlΐ0',͏/:[7g;,1{g&^Ami ]c%ULǞCUH ^|#l7 K9)v<KњArAbIsN-X,!1H݅e>79W7gq{) eహSNBqxF,-2nrߛi3օ^iU̍At:^eJ%lu/x⩭y1mƷ̭5gJDŷH7G J|QE;`GGe$@T&Ux:Ui:2I'379LM+$QzGv:PK)OSGI-OPT/src/javax/swing/JTabbedPane.javaWrF}^Oxٗʃ \JIHdI @d]ϜLoa{ɗ+ m&lLwMõe^X*BE"2. l K/ ⁀wV*tu7`kh($ `}|q1:L^E$( <'\32g"kL'nX Ƕ;w:z>*pIBb9q l)IXv@ c Ǖ|ѹ8RYJpe;0tvNǀ< gLgdOx6w`2d|7 'cz~:2Z_Bi" ܤ3"89 BtXnalQ BkLY \3:,m(?ٖXjGPVSq8c9zLkZ[ @pMwAə1$~u)h>>{N1c⮙z@k3K=/Yx5E}b@sŭ,8fAA&oL2m_xjp,rd/)>2YT0 ϭ,Qo~ؔo/8"/hW?I5톦S ;Ж¸^ }vx½sߎk[#A\0?BIZL'}yd?iퟦC޺橞_uL{ui(6ל Dܨ~ie{S;M:#ieQԵDG!#9DَH)΁%a5(U1|a%r8֧Gc2u4A/ x'J鉡v= gKO('v#F?C@o꜔:;>6Ew:yx8r-R}z*x/eyYU=Y=U>+=Q |rWӏD/7>Ai^D㵼s:`PNq\W_T59J1(V%F.'YUa _B.sAruVتTjvi{aYY {(LgLuiA^GERqiAjR8)V_PKv|k@PKK>$OSGI-OPT/src/javax/swing/JTable.java[ms6\ L>)ܹVFc$ٹ^IXfC*q3J\&HX>N^hohh=G iϏCͅ$Cs} emP mpo ,3rxBY3o?,h`$ %)AcD6%01EX~*0[AhONXZ<$Ur:\-& ,%!J~&z|-ؚGSW; i“luX~1%&NV]`phx^űy7]]/ѻ|>ZN' 4|ή]~^#C퐏*zf&b8,! w2mH%t-[mU@h=BB X:G~N`?_8duv (`K9#'Ytcp<#5|*%pAϒ$MpT|KtED4ŭc89 6)nAR"xdoy]go򘤝tن_QX=h(r ?!HTLd$^FOǾsō p|g$Mag*Y80\Cyøyeiy#ye0I!~@/e+G "x&b9ER)#g\Њۈwg4~| Vu)6M=_᠟ASX[0h7I<4`ہѰ|ڍ,'{ 15 ^̥Y9o3Z(:VƁz:8[OjjUC 'bfu`-Ssf/rJgv˓txGXͫ H - 7 e!$Tcl# eIps'3%qn9B`yfKڐcO_şUlE躨Ita0[^@% Et 7^K3hzRUX}C!eRf"VL; S B{(2 Sw7rяIbI u-4au`J,HjF, -C~1X道ʪz1)5J46u7u0!$Y1`;)3k2J^Lh˄%TEg7J<+XaMkն<|C+ vvZ=~RB)2ӉMG*[AHk)l/]UG$ʪ`,)>Y(߇j5uvl8 tS |p[9 (hS;t,,KUvF^+ۄtC79`EDY#ybWQ>+Eh;z8pכXdY&VNg߀r#/>6@S>nf4p˴Cw͜{ 2OKHƂ<-a}^.ڒm(`J_DjO(ij]e-#++~O!nZ.B'NCT)oq\Z(ʭ.?zYbBVEMu"fw%th?m-[m_9 7jG. 7ce:n[Y:756$tR QE az#OR=n}GGPK[A0 NPKK>'OSGI-OPT/src/javax/swing/JTextArea.javaUr0= :ԐmhSLB^Z!{W$&t&@޾}v%Zj::]1; /B)S~n5?6Fia<ɵ,Ɛ 9B2N?N~B+8Prq):[2!,$B"c@(zrE+ےCO#8*+EsV+mf-uDQ3aXJ8Vr 9UF8fM:q93iba혶HWdSpFЏN2QӓL&h^tn3[tdUj|$Sx;7]qGB7l\$SijL/(R4 a}[- = +^j5'ɖl؜.ji6%KFھqB:TbG/ҡ IjCڐSjINJgRpP;'E6Q/i7\zoFрP|ЏYV/2X<[`)?Ú𜰊Շ'ZQ_: p갋 ˤcE (PT^ idPy5Aot@1صPљrx$4?3ח,ּ8w D9ZK˲31,Z0it~X xc6<#8&>2Q㎝!L%8|嵰KdZTo=C̶eԮkPKJ )PKK>(OSGI-OPT/src/javax/swing/JTextField.javaUr6}^Od6/I)t0N|mʒ+8t'+!bt@u9+F[#~g)0N@?\5< -1xQYP1p[0g5+c :Suۃ !,$B"܁Pu7JᶕNCo#86kLW[',V9I'|v.uSII SCorrنJV6Rw]J`uJf:#6Zo(6`F0!ؓ<Vb=`rq;_ϗ zp~/nǀSn|dS8)Bرڒ͑DpjMKRC#dZ2{)2ᘫ^&'S`KņB.yeO^ɮC68p203ZrU/ѷ.43r_:xXksCjMj)i.+<3yObϏWҁ=h#Pt2D~a|xK!zW913=8r14:W ;Aj^q6 }W!1*ߍ-cWHE}\q]@oVwhfvdk0xhSF* 2en siᄘAWXl-&7HNm\+(fc3E֫ZwrBJξo=*iYdQn.;P6_i,iA 7^Vw> n.Cčr$OW˵m۽8b0>1-&{G.~\iG/ܓGۅ>PKLp PKK>'OSGI-OPT/src/javax/swing/JTextPane.javaMs@ p5$6'I Lq캻2W 36 x,m鄠7}d*FgM ߙa"- Тa3AndbJM\SyZ߆ UZ!XEfH c!<Ɯ@*4&s*SCHpƻ LOVYX*I[*ֶnNu?*Neh-]H rVkD ڀH S]IRMzL00d䨠5r6DF5Datp7`0zðA~2?}a -spW˔➄^I9r,c.MHR=C"Luղa29$hizV;y_Sܷ%.q!knr/P%v7ֿ&YwU&ހGx#]яharb`&L x $YY"}vhJc; F*NP5H0"&4 7P'rUCntK"oԈ|VE/WCo,MK%S$_R3-[_Z9JEIƴcaN8éS ؗ'`@#3j1[k[Ϩޞ7DI}[qk=yPKWVPKK>+OSGI-OPT/src/javax/swing/JToggleButton.javaS]s0| Oq ['m 34GY>Z!a2='qL#jowOp c](V|XJG蟎F'!Aahl0\ bр[!%h+!|EcVpy`v"q K!p˱t p.[ipOMˡ3@Ie̵ʹpXuő6Pvx'tTDkJr퀕JV6 TsګpB!Xt53iraY垄vwSЋSHi:Y|]-:"0x6HlJOos2)2x$S8S񉄥K%rbB7h9ZX?VKsO#Z8暭g|aP=7aDuUF!}Z袐x^9GqP嶋aܵר=qN&E&p(nW44!=V_ڷCgA]ZG% CjZQ-#nEHR+ M&l5}[GtvoD!dZKd5p-_5AwAPKk}@PKK>&OSGI-OPT/src/javax/swing/JToolBar.javaUr0=ɉt!99$iBr%f]!$-۷o߮|J'3 }v?xnFi`c-P!1j3?e;p%A˭sGT$n`>EZ"5OKi9"Ocɡ&Q@JO*-En7s=XaM6_ «3XJ"6!4D#YT[.59hbnL[kҫI8Cc 8`ux?4*e0z߂e,rD?ق=y&'VMD#m7csb-TM@I(o`QD .=|4U}Ie.uje1r^l#)+Իxhƹ!Ĕif+ٷEfqCX<[{Ź\0k%h74!E6d&9l`W1~ȍQygpZ.2kvuݏlIU(Ѷێ[ ƻӊΪ]gT ՂfY\oj%ͨZ6eo ]7Ox7BW{&OSGI-OPT/src/javax/swing/JToolTip.javar0Sp 546'ifi&G!/FTI0޽+cg#߿u0`Eg_$R 8Bf<~?05,B:;,bR"rX@ 7a^md:c臄^ nAWePC4h<\oMV i*Z :| <Ѩ5ıHr!LgQUK%9 Qq"VjXib^ /T9׾fL!bUWC;3n)%Y>%Y c/sxLd gwigt ! 0Ei!BX3ZpʊޡU ڭpa #Vx曫 _(h?c$ujEC.Z\ M'h7pKs&VB DyyK?u: ܑ] d"޿DДXU*)o<k3th?TH]rrsW#:niXiQaq{Qz&)9FoPK(g}c>PKK>#OSGI-OPT/src/javax/swing/JTree.java[_s۸?Orƕ}hލ,11/eNS Mdٗw $Ayk&%rvOwh̶/]oGh}h>A|$z"! H)I 4b~$o 8e!0 bZ~2us Z'\a@8GF0A^G >p}8{{ \D~'4:Ћ`6Ñ\<; b~Db4[ 4&ҝ'4}E_0!HԤҜ,"Mķħԇ^fO$ aDhKGrPp%aHQe\R?!vwFD~Aߖ`?TpŋtưXHB')4e8J POۈ K#ǒs. B(dt ɓ-}HH:K"AQ&.%h KVΘ(OLfzq n(oZ h+E's"ౚ+ a ޿o]}8BT 0(%+&'xCr^Ix1 v;g.AD'A( ™MS[yCR!kl%s&z2Df|ߝ̿8_etg54|bێhٹOh{=34%sWVb>_ݸ[v{wḟ/%'@x1N;k4<<{̀Idy1/@ͩ/Ra{K]? Oz[TJBJI{܅cZ.9Uݞh[if%-gQ ̎-O44#McӍ_F{/KU>r>}eW--X+}8(D.'J+3_zJ{/0ߨ_szem5ƓU2=XQ~P1 K{rCA"ȷ^1J>U*O-x=Dq V}R.i?ښ\^$%"I-U:d_|idq,hMdrׯ j;=Y[`Y۷B՝󤊴 Q Q+UIb鞪d^SvtuGՂiќ}% T3X:q8}EYڼH{1x5ir ̼gO wj}5/eq(k,X ue^AӎjUINiE~CNFIyp ))ꮑ.jy6MH靛"_N4"oW0 rK,͠\t؆WSbݮK`ArRxNĞ,;q 21ZO7{o6崪m}<(" %-ꯂ5IiS@7 )l3N9jS87yonɷ'OSGI-OPT/src/javax/swing/JViewport.javaUoF~(O$KۇU:+ÝNUuZ5;%<{wof7okp ]l_, 8t3"Z7 _n<{ cka#,Ȁ(4F*0KNBW4*ͥ;ukp]\]ߴ-VaŶ F?F |ǝ0Cw44ߡ3^JFq)Q6m9.Bx@a.sJ:yHŚ-rJPFZqm۪`dab↙$/YQ@ {tJPZQ!q{cHeAi{%HdJ 񘛭)ި3jWC[g.ϿH ѕTjA}鲁<ysPK^3 PKK>%OSGI-OPT/src/javax/swing/JWindow.javaUMs0=ǿbtIrk9$N3L^#d߻c:I9v߾vew>9 z2Y) 4 W8Lӳ6kad#5PZb !"Df%, ?Qi.дZLaV T#ap 3#S. q3( <rj3JHh53%37&dY沜+UԉXݹ{XYw"FA+R<]KU5fH,RHgFZ֙↋ ZLZk459z41|mAnh &~  oE,:(hrkgE#nPɂN034,B EZpm۪`hab|kG-qbKꌠNNDbFneF\ P.ˌ[[@at ‚4)Y^ijEܑؓbBP]{]xvN% 3z1'e,w-xpN^ߖm`;]BP埍Щ1 {s )/؇6+ibSfs˄4X2&3*"͵oW-L~PIS qi3BfpoB*F*Z7CM"2lǤVo 齑S'hJ:3BlmGyp=,XNe)yz=m)yO{r8nv+k8*w۩yoV/qPK" PKK>'OSGI-OPT/src/javax/swing/KeyStroke.javaTr0=_ j\zL(Ũ1+qL+ 0m6޾}R#S]كiMA\Jh=Oߟ{_G:C,dOr$jT:C FK!N gi:sO3l!2rR>H, i6e+Vn,^ ܵfI |D(:<*.IFI:ĪS@JYxQ*)5 "{d*R:3+EO)GV-+:2E#~`ۄNBvk&,lO8 Fe2O u2eJ+`EH$̳$WT+%4W"G抠DQηձjHPG]>Q')!t5SedA].%k} ul(j |O*)=,Gz r-,lHՠ8$"CvH <=hrםI<1rK9:ws+M-uh${{G쐐#j٧?o{oQSuFчݬȪ-~ڻQ5f%$$ 5)Ǒ,dUArN ?oPKf5lsPKK>8OSGI-OPT/src/javax/swing/LayoutFocusTraversalPolicy.javauAo@xinmN.!U&r\Lkv5; D[37N"\ajj1,FXi]ax=CGq*d:ȑ=PBsAQVdwQ|:6Ð0CM8{u6#`-z*`c;U { Jҕ4r^&Bo>$Iu:VI}u<PU&`gV&*FXkXʒļ ԝeϺÙ S7eF2AlS4G1ͳ|Dj.,rrqBNwH-n LScBؚ3k-2ZU*s e"4dZA={OW%Q$>BA=Ůi7b"Z \LѺUΩQ=]ǹiOڟKb6qNUͿN{t83^DoPKS*6_5PKK>)OSGI-OPT/src/javax/swing/LayoutStyle.javaAs0א4Kh1LQŨ%U1Lޕ0ΤL9]=}y^p F[}>yv' . $G_FW!AwZXEuD ^d&8Jk -BO4V( זz8 JvTICX؈!RhpVœSVQ;vn#0B7spXuH|X,LlS@kJr:DيX V2rTsSF8!ڸ2kaʽ 핑w(6&gd=gIzdmxe2`f\O2 Cln)4wL;ZƷEv/\Ӹb}RC5L&zh>2dUc8e7AC_ūUܽ߼wSb c\yE1PK=M.OSGI-OPT/src/javax/swing/ListCellRenderer.javaeR@=Wtlf[PY8 !h%ׯ_&Xdds0 Ȋⶕ\ j|/?#-hbI@e^Uh LR+X%=`6f[Oq= v[$i-v$mn7Xx8t89t՗@n=>;Q4 bMg&-6ITZ 쥡T ^֖ #TMVn=M%3ݕi4+$ >ER1~ynMY,KIR %]HQ'OSGI-OPT/src/javax/swing/ListModel.javaRr0= g\psks2Ma8(`JAv;lqc9 }'ka/f$DM#*nc:-Z438;YXBJ4@{/Seh n%0J8Zq z!-TACTP趛9SOI0\pCǻ&ѧgOԽqqRhSkûxIV=uݫ{iq~ѱB䬵#h65Nh$IU/FaєҒyOB_86`eg3eqp$szh] *M.N}(y/q^rd<qXtqo2W*}d;,d% ^(vVZw$A|Aqѳ!#Sz]sDz,}%6ӻ,A;\ nEƿp@EY?v堁s35Ҧ"y }s1?wt-<7PKEysPKK>0OSGI-OPT/src/javax/swing/ListSelectionModel.javaSn@=q­E=MSa(hfS1wjHyyv0Vtiua^sp3!teCױ0H 3Ԩ;`I& jPK(PKK>)OSGI-OPT/src/javax/swing/LookAndFeel.javaU]s7}.⎟p.}JinBd2y^b!5jw!|Is'g-xWoc'q ڧIqa--LТYbJ92GYFAcp 3R, rPX$ naep ZFZMӠx%PcdAis9{[e*ő2mm2\_Iuu%Z +0M2VJP 9U;.jJf:m%mB (mLQ?89~'rO_M?G"0^B^ǣaRF~i1|{<U<+5{aF,8D>(*P >6pc~@=nEr7Lށ^2#R@:q0vhj@$Jmy[#U/- $-0KȪ4$8{e!f͘-i9f`?ƈNB+Ct8[ @ ew ~t?׿Teld`XvD"oz =.aTB5ΩIv]c {vλ;&f`sԄ}֓oO2`fI]FD۠޹Ք>79T =Ò~kڨ%e~k,Vh>=PIʛ=qc gPKp@Lg PKK>)OSGI-OPT/src/javax/swing/MenuElement.javaSr0=Pp|ks2qtz`XR%d]a:M{+}/=Tͫq>UCTלa6\ S;h(&׎ رi1H@k,pܩAZ38%8p23jP@`v?[kջ0.`@*XE.ސ^h hpMg`T,#5@j`FYTw[.*,m4:y=kd0R8CC^G&^Z|ěxPn$hvL<"/$((ysZMT *٢(;nܱX8eO =|յL$, /Q4w(,2OSGI-OPT/src/javax/swing/MenuSelectionManager.javar0)v8A[Éz@f26jJ2ɻwer*oע{ր3lmDpmD LqEw6L})Z4+"xȭ,Ɛ  c~@cVpQa֠"1DH|9 ^fBEYx%T31 g* jg\vERqMڕUކ8}&uփh- C2RٜJV6RtW]J;`u fcba홶HmLAsA5 <<x"La8_p25 Op:dHvVSqOB+I6C.5,EH C֏ՒcX \uЗ/m4?s` BY>'KFPJtExi|ʌvIB?>?*cnkTh/u]J1E6+Ŭqdm 3Ojb|ܢ+GBӵ6Z(:uekMQtOlgMan -<;؄Is'8]\/S?wE'tklzz[kPKPKK>2OSGI-OPT/src/javax/swing/MutableComboBoxModel.javaAo@W|# NnmNq[$p'][Q{gmZ٪*7߼% V?hj3AԶ$d0Y.}E>C24wXLDiAVn^v|ڐp,aiku5@' {Zܗ[ m$=\ L z^Bv>^[ka8c āM؞&|W$_gIh h1手JQ0k+FPDrԣ&KڎBXM`/Bȣ 86!a38s>m9ʲ( Viro4''> G}pk7ct#^ dz,G FPKzw+gRGV㧿rB㜿;WluC!r^u-"]Pwj*lޢyipxU jbΝ8pAZbia'LIC;0vNcA_ -̜PK)PKK>+OSGI-OPT/src/javax/swing/OverlayLayout.javan@S|#;>Q'mQS[2N0I]8Q޽@#;*U9؝'=8.wA2E JgneXH KhLKJPYLR)p ?|CcI+8 &0n?zNWP( DK EIm:+Np߲@\q]ׁhce4oYuu$Z VdDɪfRԠ 9U׆|Vg=&% +w`o~&8Gr>/Vp.|]İXl1?Vbo!h~>d˸ޕw2Nb n%(T^![4;MA֏ղc$k^ {=݊ lͨil"$RWbw)TF&@.h s6j7H1i{Zn4xflRc:[G|Q3Z8ѵPR[ԧAW`M` JW}*)ϝ"a;L]qOA]7BQQm'򧝡? y[{_PKhYUPKK>#OSGI-OPT/src/javax/swing/Popup.javamAs0x 2z1LQ؋Qk$U1L&+p3aRliwg"\az1,GX$ҦBt2ߟFIc*JX!ʒ o %Ld da(:Hu8BikHlt(xHRLI=U { 0ۼ.=zo>]%Dh[sfy^3u^5,iGTX3k#:h Q[ׁKUpz;a)Ty+׭0#m @V %-""~tLU6/XboUyiY~2Cc)翈aHP)7T݊P=YI~c*4r'ЛBqϿ/u,uv&li*OSGI-OPT/src/javax/swing/PopupFactory.javaAs0x 2Pzjsr i=@frbId&ޕq2I>Ȓv{+."\`rXd_%Bd<0q2d:,ɑSB9)GjU#ru!~uR+L1!ׅz q5v=jG!6"CNC*zg:Fm[S $4 N|js;zo>FMĢ%-G1׍nl3uwVU,ea\ (-q@X*pza)y+׵ѴgF~m $C%lDշ wrW,bb~ŜWHί nסcƔ[DFaHP.72gkEI(bG0dw҅ku XJz+Ew%!v K]F^sW~hSk{mxux)v&y(ɷ~ŢߏV<Žx;/^gcfVAUuSeٖH_le?k?mC( PKߔHPKK>-OSGI-OPT/src/javax/swing/ProgressMonitor.javaVM6=ǿkN-ǰ\9y<$qe0= mH2⿧e13,4eS|2&0dg"ApÏ/݆0EjO'(4PB~Bp7lB(4װn p\ U2 FrZ-LC ʲYؗj9j[=x8H"CA?W|,'V ׌ B:3Ҳ.7\,=raJ¤\9BlLMCCGgAD?&g%N,0B8?Fh2oŸ$=͕hr+gE(,dMIO(4,a)7E956&knN/86l뒠d=+$?IMC(j'$tDYCʻ9#@+BQl4p Ľk\xA%Nx+.6L -BS(Ȳ{ؿZSW"0nux/Fz(qp0{\} ~LMKa!Ui+w 5i )kYjnbҩՅvm4?0ka1uj**zVJC"҂=T+n^-$V]U1f0sùLDz1Y1:)G}s$`kh^a5O )f{@?MԆtߐ.yId^^w'ھk{Ø dRewSGqjI'u>nό-P#82/k4gVcJuheu hˬo$\g+`QIZɽaqPK$y( PKK>8OSGI-OPT/src/javax/swing/ProgressMonitorInputStream.javauAs0xθpk9$i=MI39 Fr%d߻2nhoW^TG#˭CXD%ҪBp<](a,bA̞ ;x[YFd඄Ld d }jMQ7؉#vh,Ȋ@jP]ݣm>'CWN\pAͧ͹ݳu8m8ѦV'fY~;U0'^!j*ĊY+BԭN2 Cf-3rոWKȣ xmBa>y>[~-q.l]/0Ϯe6_U q:Oүtȉ^!l Tȍ,x4U6$zOFDjpm*N.\0x?ѣ؋Cb[u%}7ߴNLՍ˝!c|GjmDFV^)wm®\.?)0gMG*eg&hgP!DIM(!yUPKۼPKK>&OSGI-OPT/src/javax/swing/Renderer.javaeQo0˯8SR1HنV V}4p!lMNj<}w\ca^-_%BUry_F9Y2#v&"eƠj2p;Bҋ?N'2Vjh̦[8Ai{HFv:V;HJ mnw>gr$x?;Oq,OSGI-OPT/src/javax/swing/RepaintManager.javaTMs0=_d!i/mNm3$F-@wpwۏQ ` €v`|)g"DpN.k?zjF% (4FP 4N>8֡]ڝS dl B(4W!PfyMfQũQ,10rgt!xIW1^,KU]^z{?hօHQkP2*ds⚲($u"邖)B qmfG g^] rϾM.fpMxLa0?$UlD[9XS9=ZŖl꒠N[y1'!LS96lK#`Q4ʬ qmи^%S.U:oN'ӇcAҸW\D|Z#_ #_,Yʣ Kvo]=IB)|F M"MO_lM144 7ޮ=+ɊgE:g+YϪC3cr8RT&\iqmah&1]W7/OSGI-OPT/src/javax/swing/RootPaneContainer.javaur@ Sh8A46'-c:6i&Gaf[]0{`&I}ׯO`z`\L` F,׳ٻ)I!J Y2{*Cv&KQTB+K2Ƃ_}d X$\3{&7ZrZba = n{ӻxx=!ˑ4gE]ׅx$椵2/|{ِ`W+ w9j*pì v `mcNy'd=*ס!oS شbhgFn}(ౡQCc'ԛ<$ϫ5'OSGI-OPT/src/javax/swing/RowFilter.javaTMS0=_SpkÄ1`ZO!SG7Fԑ\I0l'!98xzJ|Y,n t]E_8yΙH{{.ӮgalƨQ1Js,vDž+TKt-nuvb!KiH\Ôx`a HhUqZnZFpF MVt5UUZ'U'0 >ԥQkP2 Re iHRpTLI6ǥ0mR ۘAu؏ȵ$rx'ah 'i8 GC?o$(f@2"D L'J!drJPFPqm˪I`jir>㆙zi+/8OKtQD`1IHXVg<7/pNCQΨwgS\K1YhwwI0vipƁ/s;&?Iy\1i+w+p Z.jw֫!dh!PuAt!S7؋d.Kra`Ԟ ДJ(/X;"{F4DRZڪU5Vlz޳Qk!M9<4(R :.( ^Rf-lX4'OSGI-OPT/src/javax/swing/RowSorter.javaTQo0~L,оm:1mQ[mUM{0;;€j6}ݝi[tiD2uMD_tLqis~ kz!Z4sb$7Cb4ݔq)#-GcVpt2Toy`Ɩ"q !p1u p=KKipӢNcɡǎQBJOm 0W.>Sv+$mMػGWHuu$Z eXJ8VrXbbN{չNVO\ zXXg8s;Mh$jSPFFuԍ¨Ia? " 7_pЧ?uؿlR˨.RL۹"D;&z-ɦDp%QR43aX- =3+^ڵ'l؜ji6&mpHP6<ޔ(K׸M|NkVQ O܉PLLf1]ft`'09W * YU~*20"k 0ڻ&loJŸAq;4HeܿNf /LBU&6͕æoL⏉HGOg2>Hw۝E6^l6%O//ϼșV(3g} %Jt17<B70ȻKcOӪQ5N=) 8$yȪV PKcPKK>1OSGI-OPT/src/javax/swing/ScrollPaneConstants.javas@ǟ_ShSARpCEwF#羻 ۻ ,qZK. IHQ]O2"TPK Ⰸ.H\S0rO#e) >\N\*.+`Cvf A,@"K`)D&L{jR-$p 9@ ]}R{,uR)3%Xslr#&iBNcŋUEdZRBƁ8E̔3UD˒p0K&$gB5Y#~m#)twF`]ț05|pC ܡڞ{0|a( O9WLڹ"I$ӈ,UAVVٖ+ j.&a&L'uz}@?ȖMwkއ Ɩ8~-oNSկgc}oz远La4[Cqbl{=SkK`0gc] m9?N_єx;펆18{s4@^ƛk[ӱ4/PKOtMPKK>.OSGI-OPT/src/javax/swing/ScrollPaneLayout.javaVMs0=ǿb''Bm Q %WqHޕm>-0۷ow%=8Jg'ï:Bp&#v w0phPO1 \2;A,j W>mh8jAT T2 @S \Bs;)T( }ײdv4L֭(>(|)IYP9kٽ S}NKZ`fi_pa5M׵+k ]nyCq)f]qRP$*&Hm%L"lJcDHWVԍoBZ_ YJZ&XFWYu^z -F=&;>}\u| g11ׅt w,\r4t0AXbD5]]f*;ZZԴcx3IIg܆W$5*pƄds_[mηcۼf2zwU9wy=PK.n PKK>(OSGI-OPT/src/javax/swing/Scrollable.javaMs0d2&ڜ&G!f#C:]N}ww2K`:eH(ëc?ːy -=n"&xIT7Ш p[?X FB/u[Gt;q4A IbH;k-1NGNc,|Y^uֹSmH2NZߥ,~`ݩZ0! jv%ŚVm@yi5Hp01кqgE{ȩpل^C&|!tq;_.`dY2[IH3}d_d%8T$_S!GJd _J9r0ÁGWǭPspJ%-$G6nwKE PK%PKK>2OSGI-OPT/src/javax/swing/SingleSelectionModel.javaAs0WtzLCpfNv$$Ngw~&Xhsyg)f@$a6X'LVrXCjwa uB+MdlMw;س#(sHA#$8B{3 NsF@O<#9ޚK!0?B~;͇4!a'D6gKWbY˷D=zP:aigJ6Z:PVx8Y 6pފW0)d%>fe^΂c~cd6_b]|]'Ȋ'3@ذaDBhVSmZVhm^p`#^xO (g du)/at%%(oF ћ^X]/v+ ,O3;O|Kd;u -sF5]K/~4 =3QPKH%kPKK>.OSGI-OPT/src/javax/swing/SizeRequirements.java͔r0)vrJ:I '$L0{lQ$#qNߝcJf]/+.6Nڅq J:~8} 2L| Z4+BV"(Ee1Reh-Bj"|AcI+}vjw^bKX (daN)HAEV[uO97<&p t,+zUU&{rk{⓳Qr]J`GI;m@LJQ6 rsSW<LFiM(hG IFI^"~O"L4>K`<4A44d˸ ;`LvnO{sE4[Sy)r\( 4KX-f^FҒp҃|^>BWb%֡Xj*̖5N/QI4$$]׾ߴ5skZ˽ER٣9>P.-9uVhFwAЀŞ_ȮJގs~YKyQ4 T)n 4e R8c}֖{d@w3~YwDi-/^=tXOD kN:L?| mGo[PKȁtPKK>*OSGI-OPT/src/javax/swing/SizeSequence.javaS0<7_1Xn-mTjU`# vj; i,U!gN& -i DRu!˘xń,5IeJ[B+!R+]4=Q+% hR R*jit>5WCϜ`gc EsN+nkuvp _Ad- ,adz-DR1c DfkN{ՕN, W Cf.3rVhdM(4q(Г<ӏ)$Ma.#=S< ACx,S8DB$قR)[SY)2Bd;BAf%?V&+/7}kiۊAQ8D`mE 'LWux3v\a-LLzto8}sF.f} (t؝?k+}D⽒kFLy~\k9g8n1eGfC+nbl\ PKXHPKK>'OSGI-OPT/src/javax/swing/SortOrder.javaeAo@xkZNjdK64q1캻k ; D֚7߼c۳a\MOIH*a:/_Y2GFEeEڒVT2!~R+9OSGI-OPT/src/javax/swing/SortingFocusTraversalPolicy.javaQo0ǟǧ8D'h߶NR([ &BW0ؙ퐢}g Dϝ x =SZF R hum(qt0&GvIȕ͠3q?N~uh8 zyr$V@#֐2NPAjfQhuZ%ma99Uk3TU826M\%azk9; 8eV [=oue:o3RI筜i[Fn}?mC 8$mE&i;$ q<$) $ y5xx ߒa Ėq+l1ess=A$d&s,j ±:%ң_zW(i4_A'..rK7r&PlXzw+gn?;Jg$T :uxSXI?ȷN7.OSGI-OPT/src/javax/swing/SpinnerDateModel.javaRKs0>_ 2!%4&(l*$Wqh&+m ?kw=8 t5>L/$T;O~afhl0 Y\QbЀ[!DHVAcI+8 n[ϽV[PAi5’$>X8 ^mܪiU|k5 &pmZ9W| E8&kWhGI^6^6͢<'0h:t_M[<ydpLl KD[Sy)r\o( 4k~f^FҚpA_hz{XS "Rp \uC;Tݥт'$Rׂo ר\ I ~ zk=z}x'8^JG2gf4&~4Naj./W8aFBr\ʬeЕF0?w᪔yc6]cZGBn,_LapCo 8a[]є}a۱4HjLxtPKdqPKK>.OSGI-OPT/src/javax/swing/SpinnerListModel.javaQMs0<_&1ii;l8(両ΓcmIvW`r堟`!$rxd~:6=- !+x3QY,Vp+9!\c{@; NVװ[PAm5’$X9 ^Wܪөx'pi &TZAtFMӄujSkGgdc](ւ5NmAT*{m@i1HCzadvJ摣6=xq:"WbW|%xlYr/Y«%.NN\l|[񁅥Y洤%B7h' ͚V /#iMNv 4 qچNθDȥ`oiEJ9uM;TݧQ uG5*Æ I_ u~ï[ڑ /`#Xp`>|PD[W]mZHړ%7!]"T"N`w}|PKgb9PKK>*OSGI-OPT/src/javax/swing/SpinnerModel.javaAs0Wdg\psks2ucdrMD%t߻djO=Oo}"9jv AX$d0Y,΁fۆSؠAa᳃3YS`,P!3Vڐp/`4:ja/ {jiΝco1lxRH6Lh%1>B?(rdv0&8O)BNHJy4YBTZDРޓqjp65 ;l5 0OSGI-OPT/src/javax/swing/SpinnerNumberModel.javaSr0=θqOmNI[ ' QI;{%){.9pSQl%+ x+exПC0T0Grk,9&P%WؼP*&צzK%l \h(R 71C,V^}ZnZifʙ&ZӭYi]|rY2eMӳ <{oTKR WI8 *fњ J49-J&ADKҒR?nB|B?Zkmvko>lYp/Y`/7Nfdn idlB' iIӒX(sRvL,MF9i=_q̜Z[fWU) maA k"q]W%q}X;7<=iPKtPKK>$OSGI-OPT/src/javax/swing/Spring.javaTMo@=_1ɩR ( V=ncg58QlFR$|7ア=F\k-, 0z];p0uHS4HGi0J&.’q4\6BI=ՔZX ,TCHE+!l.6}56ͱ|u@鬛o{N!nv*| $UIkjPXjV9յVȬFfM"b^{j$w c| (8her>p: dz4FI4&cz F EF}pUjd v#ޓ$S"dMf2D- aX LM. a,=u=r~%[&WVs ؜l3nDƥvWM=`\ NZ8Go_9:Z+eep 7i(V[&ȗLNdCy Kn] V W跇qB> ]c'M/|W Xm}JX6 52Zp~i}JnK%0ؽϙa-xoPK<"}PKK>*OSGI-OPT/src/javax/swing/SpringLayout.javaVMsH=/NA`%HU 50YiH21`P~j+ٝ˕Nx~ǜs}qa06 ƨP1xBaP^! 駲t3JSV:ơ]W.!aw R B =hT6&mmxgn5$Sw2?M`jǶ7q1 |ڝGރo׻R(fd@2)gEIX$a<2gKeF)(#P&\*'\3]2A<~ -iJ.>ǝ ߶6K)5 UJVD~Ûupyv7%ʊAdX$\ y_sC4ks:p#:wsfvNyS4zT4͉g﷯ ?OBASs`&0aX6cߛأ/t LqJ-Z(yx24 ^*1,_Zxa,OSGI-OPT/src/javax/swing/SwingConstants.java_o0şǧS;eI_Z!fhw5RisϹӗEY̷Cs ~QHRh x8q;@n&DV2EepڠE+ҧj#KǓ8`mNb_ְ{P iH,>ʂTHmt* t /{ Z[}Nx`tAuwRh hUKM{JŚR5Ҟ-FK+U>SfF庶Ϛ葢?mBO%#85õ~Y@" OgQHg7c@jJdSv>Lg0L)k#jEBƍՐ)NZaۥrBSϣ>tB?ĝ^U/:4ĭ/H EWC2DUiy88gx=?DsALЬ ,}BVs3W o9e/4vn^.Wi1;_:7=LB7%x;<&{L@xU7>*9[ע<{,OSGI-OPT/src/javax/swing/SwingUtilities.javaXms8\~&H3$zsWI:\ssFr%JKB/^w]vyV#g#d&uwQ_Z _:f JE@ pPr| $ 4 \8-R7 N7F\$dJ M()<k84ΠLOLAB>f2HS\NqCP_4Mj;Bbj޸wv"$Lţ91F4%B:sZԩdq(J0bdD?r#^\n=z'^w={C#{]w{ػ&Guebi,@̸sqx! H*G8c c1"2eU!ؔiІ]FQVC?6>}pTdN$~Dg4s,N+qjL}Ȅ(kjg>.4jp9ٖ@Eu0GMdFeQ&'OWHNxEoȷݺ/h!H0?Zk8SgYg \h2gaA|#0j[4{W#++lCqƋ}lvєy|`m30,xZcMM*M6w c.m(ÅAnl`)C_]n>S|#d<~)&*ӃC}K1wYm^ڇqw&, v_d,T_ysC)OSGI-OPT/src/javax/swing/SwingWorker.javaT]oJ}b'54o-Q% AD}\ۃvuUw4N}(̜9g>vfo`B_2a"g2G.G!_{XA""rs p@ v0XN?%[Ԇ+ pޚ/bl 7s,p V-MEL{2ȝQ@EumI7ᰮ5#ˡ8u)ڑ#I:P٘Iqr'I.N,oRVEX`\4^. &5^B@*J{Dr  kud*$Mڡ*[n|[ ,<[nm򉆃v>25A˨2r `D2;J eܢ!ᑳ\DӚnw⓳NU~Zln [&zlmNE[|tJ\oxi%SVߴtCkj"JifȤ=`A8SJP~Ep<5N k& `,~jNLPHU/ѪnK͛%BI 5Vǜe5Scڄfɫ ;l"__KD'.vI: g! 1~!POe-H~)S9pijV_3_/tJ#sCHa:uv7iBsfe՚Ac WhuwY&Q4GdK ?*`PKqPjOMPKK>#OSGI-OPT/src/javax/swing/Timer.javaT]o0}'X}ۨ*em*H`Kؙ퐲}(b{| v-LdU<^}9I™zeXXjTb$lc߅Kr_W\; L /3z YFml$[;)ؒ$aW,OSGI-OPT/src/javax/swing/ToolTipManager.javaUr0=_ 2ZN.- &(Ũ+8L&ޕ1$>`,=}$.kk^Q>+J=ǚ$-VHƀ_9הr,#U1[V PXr -iZقit4 7VenL;hIhQ >Qum2Ym0E8`6l: lJ_ p:e32 ٹE$^0+Sj2Y-jIAzÍVCG#[fˡ\?e)jeLX0ҶPJ,xv$d21-J_):(A2\pCͰ+4MT~dZY\oPl5vhVX9w`n 1vat< W}!L,X.DR7Z K:HrlEWUgcJA2h jq qnە h8PR}a⟰Tת8=hRWG0،4vvuSzH]I] ?7OgY#=O\RߑӸ^-'Ѭ$tue.ĉ߹/52OjsuztFnS:k! ݔuouW,ģPKIoPKK>-OSGI-OPT/src/javax/swing/TransferHandler.javaV]oF}*OdE ɮF}nM!$Vi;3ơcAi(x=Oo` JC?C? 9|Ew1aj Pnp!>F D Wt" m8Wgb+X-DBC8%XJK^e~,QC5#8#N"/n;B0Ǫ;OZF!*%\R-TlNZCtQJyt@NDCJK>Ot)i;z@ic=pS^ǐ|qgW|Oy0`23w2G;v)ebi" ܤ3"x% KKR1|} -  b2 FʔU kGnEy6Q)Q]dNI?dm&Y(5\(13F{+|G3"~&`Nb)4&ūvRi0;$]P Ovh :DI^c~ Q^1 u54#zL40q.>/c!uz\BlmC F^]uWE?,vr `rse3d݈oa2 g V[ v+sgVkvwqU*]n0~?nCu!j>cukٖ;d鈑%2j+"]IZzG7q8ѣ.y1 5EZL31y<L.^rov}?-o[ZfDG4Q\_(OSGI-OPT/src/javax/swing/UIDefaults.javaWKF>/kOKxoɺbu@ \ef#鑄x,Bဤ~hzՀWЕZ@ӿ(Lvkah%5 QZ`q3ÇKTKnV:ߺkAHFB!yS[r3K( |10gSXfrofLS\.]2vLVz^?zXZc֠+x+MkĖ B3Ҳ^*n:ehL 6OS چ#^1םxkcA>zO';'q!tt7Rbe= ܆3"KBQ1<>& "L F5ڦUD| 3Ҟ_PѠ8m>[zIPw8Pq{$RÕATM Lόtrgw-|i\\T!/WZ+d&hHZ TW_u{@DY(h]Q/ [ڮB(";x. ]wJ[+5CWF)oDUqo06`{Ol;T[90̔Kx r ei`NT2 2[=H|2Q>TY!t~!I;R۲h^̎flp*Ϩnw{"eDIz!48nX}%3fjMҸ]?WUqj,ʓ U=p Hi7}=Լ"}>((n 8EXz4SR']xVC:*UuL{~񨏒{Xla]wA]VqB:4^=km앆_nW޵S웟K-Ll*'٤ܓ,Fá-O9)Rnq`6:2j΋ޝ^PJ*͎e-sczYPֻ-PύPKN PKK>'OSGI-OPT/src/javax/swing/UIManager.javaXQs6~.b'OpC wo<9$iݦpCon:}f ɕdzޕ !CLbYZ}jҕ泹f҂A+Pdoi:IC48 < dr!LYBJBm!B \Zb2XHe!3H |J0%$jM˹{=kg |Yce$hCJoӲ 06ͭM?v:y[(=Bt]?^Iƀ3 XJV%lL fi*gur6ḡ8;ml$DpWpQv Ga1a0ޠ=F>CD6 QFz)2;:(BcT&> &g!$ EƅՐ#[f NA<s@_ْ=&'FDH#FџLHa".PR9 F͙y¿7~Z4NAo#HN-5=s.pjt ߷;<B3=g@-5LKΣNninL~dfON^mJaw Vj`|DI&xȤ KG`olXf " a?V88]6 :VJyV20e` ji(30VvpN77A grP^JS_k2`~נ[LP%DO-b/zy9^I_Eܳ`)KQR㞗8xy'(R4𽽉HeBKx7lvƁ4:sny)qxd{EVNC}K\`Sԛ">v:߷'2M^|Ffb4.MM}E_)/{psZM++EZ"za 1& }-pnI1i4U8>ǭQ.ywFPKrxPKK>=OSGI-OPT/src/javax/swing/UnsupportedLookAndFeelException.javaQo0_qT,a}QED`UMr ^Uj˃#^U+̵9[Y=D4R0>MI +rdTŬDeIQVUdԈCed 0JM8q#֐;T >~ߟ3<z `x{{o$Iucm뤹>/b񑩇]ՐsoJeFt5ug SIܶ]hM(Y1״Ȋiyߗ5*٢r22?v :0 q^n; 9Cɒ5G=H1`dy^~_$8 K)vKDr(lZceZ?#jCNTz8ůàf?Gag<KPK|w PKK>,OSGI-OPT/src/javax/swing/ViewportLayout.javar0)v|3;>Qmx8(o ɻwԵ'\FOZW\LUGM0*B " o&kamXLk4Lp%( fP 5=BX?}ć;Ԇ`C0C!RA* Afbe$zi }{NOqJg.<Ex4M ZŁrxqxϪ[Y1WMo *V-k-DJ5r*dI>0i[ۋmB L J)LwhuupMH`*Gh3|-s$!AS$SaJ;Jٚk#Z#Pdܵ9LA%YaۭWAc>t 0jUi!XaS)m¶:Dɓjؠ }II j=뱗Nу DuO|ڰ:AwBON.pB/EnQ*yYyJ{n$uK "i 뢘Aء)/pTccT~PK CPKK>-OSGI-OPT/src/javax/swing/WindowConstants.java}A0ͯqMXzRUT$['dIpv19$q7 ) Р>`3Y CkѣwF( c}'u[YT{~,4C(D k BBu ;\ vjk99Դ*m}vOAжľeP]&X KdE:\(eLhRGa _Y4Rdvpq^NB]L(DFɲ%B%M50X Φ{a=o.(<3蛖&^l)Dˢ.8Z\S2\?{i !yƵ9%dtI/ Ɠ;xE;,~] yoPK!@/mPKIG@ OSGI-OPT/src/javax/swing/border/PKPKK>3OSGI-OPT/src/javax/swing/border/AbstractBorder.javaTMo@=׿b "א=9V+0i fZqHq,P{o>#`li`_yNBݓ~n 5Fp ?(EipD 9'jCJI0s4GީبVbRY( 2XP)HBVE#"y X ^-AFt,-UUV(F=n.eƀƛ4gl@* kEJ4UNuɒ|0ja+XMIiSw 0(0w WrWtgy )&hMƼ G3K7@DAf;)Mݽ ͡xmZKJ͛UoPK,oPKK>0OSGI-OPT/src/javax/swing/border/BevelBorder.javaUn@=qBC`M"l(ǵ=mͮƠ(YPIr07oݣPfœVԆipMSDzǶc[51X1Ph!1*0 7cU|Cwzвfj,Fd@89Opaf 2,<U7 #8u 0S. cOnQ+;R%tݱ7M{R]E]?sp,#U Ik X|FZՅ↋ZMZkxkjt& :ڛ]Nfp;y> soM' |&@jul$vn➄JF|#*M$9KB%"P-c$04)_rLizTMm4?,wbkGDR!0mP@* yxW̹`)h'IOG>(Գ % Fv ZEM{aq2-hIR(@Ni"Ų#cXkcb׆[g!d<>d)!!郴6Ufp?+44IPQJs=ZirjIο}|Go'鵍zIu\ICF3OqnbقGڋjmt;}(pzq_5PKIPKK>+OSGI-OPT/src/javax/swing/border/Border.javauSr0=θ͉8n43i&G K$={WzHzOOo2KX*}4lLdAܶ$d0Z,ρߟg_gZXE*d/rO%JtBnkQgD%%*\]{`' "kZ<Rh'=3x'4j ޠyV&pӳuNCqr*D}\w=8{mEʀh 2wr$9XU^2Ygܛz_86!a${d-{c^&Y吭a&R}8}Iz;GϣO| PKYԷtPKK>3OSGI-OPT/src/javax/swing/border/CompoundBorder.javaAo@qȵIn-'Chk52&r\qPϬq%h7on`ވj`Gȿ HZ0wm4oXz%Z4;,#r&XB#K46f>}%hP1 `ЗثlR9h,5pGktszOϽ*#9M롻gmF#C:g#Q]FkFڸDYA5kA`A9[#UV] zRXgDѸ0I$9I7yJW+xJ$[K-t.2:}${ivRd4_qor3:"Y\dհ R;46f+VKV8_A@9F?َD%Pē@7e f8V2DPB_WQO iE~ZT{UNۿ+tɂA g8]!PKڳ LPKK>0OSGI-OPT/src/javax/swing/border/EmptyBorder.javamAs0zj99f`frbڒ*14ʸӷO&js,oⲔBhtD KtDvɃQ9\Ch9t~uR+G#{Akoq5TJC:9 וIœs3,|ns.At/a4h#mayҺC2GN=jiy0U.2f-Eڂ(,rn$P#,ztdeVӛ3M()$i4ICo򔬾/W/|RX,a'd1W#߇߃{c)}W F\ndΣBwhOm%VǀkoSJt5hooK>r [E,8KK06ZwEqQ: +TtGRG)Z)J}0JEi"]M.%nUϨvB}]_WGxנ@4%O.䗒$N[*PuYNPKW'PKK>1OSGI-OPT/src/javax/swing/border/EtchedBorder.javaAo@q[dF9lnw8(-#yyr ̔^ ,/"!8l:==?B WZHѢb7J%ԲDniV_W74+ g^0Jѹة6lR9- Bmtpn\< u*w4B`nkɤiġ2D/OSGI-OPT/src/javax/swing/border/LineBorder.javaRr0=_ 2!ZNISOey1jJ2߳25i}[/.F}>Ez+ R02D3,=-1x,P B\2Nw4Vhh}赥`)-;*!,D=ҁPlm9-W-#8N.kE7ƹpXuő6Pv8K7#nDkJrJV6 TsګpB!Xv53iraYB;i$]Wq'OV_w+xJnRX,a_'d1-_}i)|-Bx&al\'kXPED֯ՒHaPΏ۱}dk2m< *,KFgBUS Un⌒bܵȧCiC.jI$6o.(Z"lWOQAr䏊& ఙAoA+wJMd$3гtQ*)'G\nvN <_iͤn:Vv#|PKEW PKK>0OSGI-OPT/src/javax/swing/border/MatteBorder.javaRKo@>׿bɎ\C^ZN$L帘lkvc ;k(\>^v,3i\EPBx1OQafnq0'*K-!5&h .zSu  j!d TP5֭N]ǡ$.xn:oMd>M$uh[x߳nFUXSKˉ{]b^+р J|Gڻn$^Q#,ztd墦=rM(9dy.xg&,|o8NS#YVp_x3T[a1tC|ˇ#{p57OwB.UWU4xQ7;/$oU9#IUhwaT#mw_ksAPKUdGPKK>4OSGI-OPT/src/javax/swing/border/SoftBevelBorder.javaՑA0ͯx4S`iu$vG6ةj{ǐJ"RUj7MLtu08tfG,P9; nC]/2i1'KfG|ȽIYZV+2pB\?m%2Vja4@:m(P[ i%9UR!۪EkiS< t*>ύ>>~48Gd2MknTIZxy*Kf-Em C\sS7F:V]# e.G?7ڄB'ΐd,B,>x8]$ 9&.Y$OOw!Wо2~Ɣ~aOH\eΣ;2'BEf+W>[;J/*vbن6lU]"/#f1Hjc~ JfakBt}^$MtM.˿"FxiB\z8_oo/APKv:YPKK>1OSGI-OPT/src/javax/swing/border/TitledBorder.javaV]s6}.NȎkHv3L [g>1H$;{,&vZ-sttto/'ŗ95/I81e{~8w0L,RÄil 搉9S`x)R8)ͥK m 8ίē`E@Hf5,x€=,5rVrnu*Trf()R|Zlty0&ܥcWe')3 8DN$LkPό+ hb:C A*KpH:Wpt@˅ɩbVfεQ|jMFy(+r7xcA@pOC_`rfEcS!~d\5Qzg ?/hQx]Rm{$A ?Fd."0{.}6MŶڟF^?_04Aj~ɉ' sDOSGI-OPT/src/javax/swing/colorchooser/AbstractColorChooserPanel.javaMs0WtzLڂu8Q7@$tYnI" XhDs0XDR 8r>3V> -=f!Jt!EU+X,x/:B<8RHMNRān- Nb9BhU%BX?VK3귺,?<;۳ChkB\KmNkZ6Q`d8 hc0jr2; ~jWlxO hC;~RkA3̺1k/+vaC[Ž:AW O߲R$Al8'oS G?0ZRc l+jsrWZ (}YbNkK;frr/*&L3B#lJ#`̼Y!RTUfaoPKטZPKK>GOSGI-OPT/src/javax/swing/colorchooser/ColorChooserComponentFactory.java}Sr0=xS v z2i N҉S:"o"IY%.Ȼ$ &9UrYA!Z # ó7c(1sTA$Bk*rkBɟ>2r^YØ0Cy'P+ PnZzߧGLpce.8":]u]=Ժ:Ӈ\]iyYUFpU/w b\`DcF֝SAz oW"L|pjن?L{ҏ6a0K(X|.ptQ\1M/E1 Ėqzh\T4U0EDPX%ߐT+%Y[Qj%gXrX="VDKWl% #}[Riurm-/yҴKvR &:!4 L2XcO/h/P:o)\J:pGthi>K>fomu{9^Է/|Bvˆ Ɩru嫪8 ^UPK$n1PKK>>OSGI-OPT/src/javax/swing/colorchooser/ColorSelectionModel.javaA0˯x)Yͦ-jH!-m`cBd{+=߼y& pnNF4a~Z w9nmbGLGyYˌUX^0KٽGt8Ai3E!kd8HLZ/]5) G>8r^B7ʹ}}qMgrIWoxQd- l']e^kCל{#TV<&yhUh=M(LI:8Mҹ<%=.U!' >"[ eVRwdOQZ Sˣt [EA9/f&>h'92^rJ5eUTWpiCbsH^#k:axa(z{>JrSz:f@WG PKPKK>EOSGI-OPT/src/javax/swing/colorchooser/DefaultColorSelectionModel.javaS0=7_1+ZN)6*]3 nY8 Ze[Hlygpu7"8,")S{=~iaӐ,nVp-|OX,aOUD;'}@}a)|!A4OSGI-OPT/src/javax/swing/event/AncestorListener.javaRn@=dG.9QmQ],(5 xZ]V,&URݙ7DW\R铡z`Z`%,׋Ň9,אN Z4!3x5(- =BE2{4pS0Kٍ8R9h-2YAcI(AzraȡvNp`SE9)Š8TsrzD[2xwYU!v=(65ސ#Y ):C]l؄ICOs'ܓ<$o-K;Q<_)x)*A,>hYx F-?APKbPKK>.OSGI-OPT/src/javax/swing/event/CaretEvent.javauAs0W 2.vsk}2MqQ5V%* O&=+Ld2#ۧﭘ\\7'#CXFX%Br:4?G+-di7%)K[jKnOHQg񛌕Z2"PE3oq-ZK!-v&CIT(:9' 'X. w2t]8֦g\e/?2ujp0U) fEm *C\sSwF:1޹N6[iE /#G- Q#Gi>&7zdNM̱Zc&]e$4[A<2>0<"r7;}F r'KVTJ(NAZަM|Q<Ķc,hڂG QpxQ:`9-{:W108k {Qi<¶ |'ںfx‹ dB sOA PKi?gPKK>1OSGI-OPT/src/javax/swing/event/CaretListener.javaeQo0ǟǧ8)d}DlC@ ɪ>:pۈM;V*& VJ_ 5Gry i[D.B"װhXEE6TXA'+4%oS$h,) >a6f;/qQrYd PSPrDZϤIiP'8]pS:0Db$ikMZg#SOU{٢`OG'>\@h*ŁY[12 sS&j7^" :ƴ<MH% "-B/<&muVy6OSGI-OPT/src/javax/swing/event/CellEditorListener.javaR0=ԮJR{ U*5]V{tI:v8 hC,{yM7is=̫l$T0]-q8]tC:f@ :UDHx*K֑Vp`fSi gIAiC  I|x >I@8ΙXx8 n 0k^6;zo>$0 ڶdg\eAIt,ȲaU8V)Dkk^Ճ%O]Ӎ@S Fc fi y9i@lvi%lwm|o }xyqx>L q^nJ+ Hr+jbkDbG`Оȅku,4N^ (ϱ*Lw(95|Jk@Px;O2^Mܳ^$WȞpDC/_ژE?PKRPKK>/OSGI-OPT/src/javax/swing/event/ChangeEvent.javaeAo@WcdTEMeIRNUd% Xn9^0Sp-κACg=N6::HRn?]< F]8r-vB7B޹[}8ҦrWzzP Y C:ix 2U) fmDm jCsSF:޹^6ȢsGڄ$ɑ|O4yt+{1l6]6Xftfk@~t}7ʸZ'`LyyEDvd[*N<;Qj}$x"dg XyFn}7=8Eg"hWLsKZ S;Rj&YLKiZ0x}ABuM.5PK9;]f!PKK>2OSGI-OPT/src/javax/swing/event/ChangeListener.javae0)F9%+ =lڢFD ٮ۵ $;Zj9زgo~pX>J- Y ,o!qk8L hz,#V";*PZ,%p BE KJmOX̡K\UgqtY,T"@$g\3U< < .|^&p35Oq< C$FH:n\6˷zz-Z wdxfB(61<`ȑCr0eJЩsLȣL`ۄEC/syE!Ɏ66>=O_ ɞ{݇l6~$o#BԄd5TQɺ5Bz4'L?e˴t&'xf.()zqR(][ɮ94w4wlҎQ稍OWTej>KfͿsPK]tPKK>1OSGI-OPT/src/javax/swing/event/DocumentEvent.javaTn@=dG.Vԡ j 85 x[؊`YU#>e͛7ogq.-EY%[a|5=Ml DPn1jFp+_3 `o&sC/kذ=RC8K$5\:=QO=GҌ*zˆ@`ZWiRNas/ ސ>^HYsI*Ri-XK=]Ս䚋| t$+-'5RCx؏_ކKxt C"  >,:drcgw#HN0O5,G-JAArÕ9VESCS LL!Dz;۲qBϭ^F1:27}x.^X>4!Ɲ{o#yJnb:{mB/)&_v@|bF{Pƨ\ѡm.UH=4"aq7(p >]h9c> {$2/ލ'4OSGI-OPT/src/javax/swing/event/DocumentListener.java0)F9%ҽ{IڢFD IW{t` ӂUVjO-[o`Pur0g;uMBx8 5|Z4!+x (- BE4pS0CكqY,T#9G$#ZO4U< < .|*oAzNOQ}(P*6$u3Xu5Z dxf\=(21Q]ļXt!Nߴ _jYx-%F5* 6lοU>_PK"aPKK>5OSGI-OPT/src/javax/swing/event/EventListenerList.javaRn@=TI{@& `Q%RRUƞ8S];IJE%|jg޼كN`le`}$Lgi2 >38+JPL)j+ m_PR!tӶ:ةbRY( 2XR $!Q뢵V]:-s-ZXpߖ@5]?+k*_Ԏ}A`*O5neƀ%ixQD,k.*PD{V9ו&K2QK[ &%c5-J{o!c:AaԁAF}GrƟf1y0I9g0gS}`z e#cm6|E,,UcВ^Mf2A-y#(Pɸj`hrZ.= <$-dR6m% G){/PoGe/ ">42u3,PK>PPKK>2OSGI-OPT/src/javax/swing/event/HyperlinkEvent.javaTn@=q.$E=6V#4e=M]㠈1JMԪR9`y͛ff?k|e]_%xi*\fi`cF J Tc(T˹G}҃Ff .:ЮݡdTf0HB(0 lJiU)#[NpN 9-m--?eY2^)fNkWȟ[R]g]? |<'UIkK4D#̩.R%=0–\Z h^#Y?P۸Baϑ:[o6&Q0h:Q0&w-{2vHtMBĆEdrr!YSI$[Vr+iX M*Wr[N|BV?2S5*;lŜZ "rCR|wH-Ti2eU|:GaN6Q<*`Dt5D kVg o7^䏇C >*t?/O"(SGjA.,[<%gBݒ Յnq2%,bqv&/R Ien>SM z{SJ8%0]Ϯ\ 9)ҭХ.?U*>; 6-a槸rA_FvFhoNma}R_hHʆ5"B #y$%WmPK):PKK>5OSGI-OPT/src/javax/swing/event/HyperlinkListener.javaen0 S9%kgm=yi  NVش֑4I }Q[$??r|,> /iHaz3 o_gZؠEaYQb ,р; $Z$DsnYpgAk5BE  HBzD>'QCtODns{}8RKWbkvAkߖ O?LU=6e@9攧 9uVULIڷi<MH$9~$y^!ޯw[xH6$ۦXt3>${iveO WB.HVcA<[Q#ԪC#y"hdZ,LCGr W `Г)=KEءtnl%TM+{iuDK_|pxR8~i 3%PKGPKK>8OSGI-OPT/src/javax/swing/event/InternalFrameAdapter.javaA0ͯq toR`ۨ$v`V;iڪU%rHd73&,vb쓄,%*Aп q؆UP:X#[S3!@RrCrwAd_:cA; +P9bt%R{Ykߵ}:JpOCo<j{.yo>FM:-FIFt2[d캫zP%9~Trа+ZbັKU oRy+7/\cC$4$Ka<ˇ5<&UX +,t.d_t#>t06$`2t]X%gHȭM*N^p SʽۭWBQ7Q1դ]d pQx%Ty=%9^iU5((Iqsk'b59߹PxY#Hga j<\8%~)IVׄG. 7{PK\PKK>6OSGI-OPT/src/javax/swing/event/InternalFrameEvent.javaMo@qB!E=`ml'QNbYkw8$RE|μ<3G>8/vJkRe=Ϻ@k!BԨtDRJDf4 hK MCcv`8NgEw> .atM;|.){>]9OSGI-OPT/src/javax/swing/event/InternalFrameListener.javan0 S9%Efgm=yI b NWش͑4I }Q;4.CeIǟ?]psOq>4B5 #gSIa#-lТi!+QZ,p{Xf XR}hMn<8H報 PRu}P;'8\p]<D9) E8TsV|ΖYu'k jpǻͪrc@Asʫ 9*]' zLA5´'MH$>YM=>~Mpo6z,3H70O׋dkB~oz1d˸Lv⅄R%Y9skjDP@9c,^ EA>v EnJv͡)9_RԷFpŞ{൰=!lkgSv;j9~Q8(ӳfƿ?@Zٷpk1 o)WzTVT@PK SPKK>1OSGI-OPT/src/javax/swing/event/ListDataEvent.javaKo@W5Rԅ nb DYEI؝cP;&J {YgIlgK=, ϥP)7G}1Ni$C@\ mP i!(EʟkF ct۫7q^ {H tL i/[Z]ӧuq$m=,\PnRa[Y[~ EC:OZ3G0NLV]<Q2U*̚4-u*[[ Mf#r]Wb_ 86 DI$J&Z].V ^EaEHI%\0# +Bwܖ4U~ee7=wmV*8.Ue_3|pwyu0 fF<2nWp2^Wx8ޛrsoG<7tuو?{kV<0K:FPK E>PKK>4OSGI-OPT/src/javax/swing/event/ListDataListener.javaAo@W|#ڜi<-ޥ Ī;I(X-;7onφ룃y]!nFU̯WwKE?C+-ddTMn eNd  Y%|#cY+W0hg ϠΒxz,u }j'q3xx<ZU =>GQ4 C#qM5Z&mo S Y ~vldֆiO=v%X] y3|܋Оe*9$ >y/}}eqO92XMOv>A>$,$2C&8/9 J_lKW\h&uOFDВ9j6 ء?7@r፾c* QJjLWZA~%5ZQvpozͥ\x(gGrYd=G?"eҌN?PKj&PKK>6OSGI-OPT/src/javax/swing/event/ListSelectionEvent.javaKs0 g\CezʘLR/FTH&+dHY [s?{M70SIzkaXpHLx|_WXA}*&,x`NVnw"xDm00A5qRRYp l@c.Tr) < UXFrF 6B`7=[koQ۶1J#q֚"ͳ|\UR1:.NrU ւjgwjn#0jc[c*n慳B{H_ (6&aiyS|XSZ%:\lݥt~]H9xllr!G`aΖL%Zc5B%u =7Z 0=肺hA@Jf_B0Z^!BNp ~h66Ð$W`!#ST;gOuYa { PK|S(PKK>9OSGI-OPT/src/javax/swing/event/ListSelectionListener.javaen0 S9%Efgm=yi+ NW(˴͑4I }Q74$rr 9[jr+Aڶ$D߮VEa2С $Q9SZYx0B]@uGq=tAjj$x R$m L'.tOD~=~ͧ$!X&i/.y֛ؼgSգj9#gUIQV -"ǼKTk?S_O#:m fiY1iy߶{xJw4g;Xolms>}4Y~d˸ L v^^ + Hr%$y4tAhtVD`Ʌgu, %Q>  G"ӕl%BJ lQd8gr#!<&*Eʱi_GW/QPK;PKK>6OSGI-OPT/src/javax/swing/event/MenuDragMouseEvent.javaS]o0}^~OB}]2ʶh-L=p ތ)w DaB>sMby|9Bp&3Q@~ahPp#J3( 5B\N_Q$tlu3GV%,P$n`eXX2,izNMáQCAom 0ۈ? kw^UU!J=E KRt]Iƀےkr<]+HUƦU k=JseQs[1fƍ|Zڝ5m$t4IGrL>&pp R?'d4os2<)2wvH&wqnNR sd gdM%rB-ܸc5$ph_rl y`+vB\g^QN)J#(sKEb$ޢ5d[{ECmttQ@TWtم"cTu[imuV'LHFoS'k pIÿ}Ff.K&)*]}{0%}Š"w΄F<h+g8,Nq>IF[jY$?rId_]9OSGI-OPT/src/javax/swing/event/MenuDragMouseListener.java0)F9%+ =$mQDlW{t` Z%^`7vx ,TsT-LlQ]9v> 4Aa0A֔4X@+ `Q#r6$sZ8He5 2PR $!Wf֓}FSO#Ct Dv=<{kwa} ŁUXsM$[fcՃ%N VkEJ4r*dIV>U^htմki4 l02 81~qjX`05 ;l5 =}@_E'`yMc+5|(ۥսKfOP30!h-?{:E.OE@N9_?`VN;%K PKLPKK>-OSGI-OPT/src/javax/swing/event/MenuEvent.javaeAs0Wd\psk}2M͌qQ+'dAv߾v_Rg#ô %B|i>?cdTEMneIRNUd% X9^0Sp-κACg=N6::HRn?]< F]8r-vns8>qM7oj>2XuveRڈ@Ԇ8紧tR3Xs0m*iE,#Zk $GO5|MndIt#`om ? +>tj1_A m;YhDMВ9H2`myN!n.(o(ٞ":r ^%F0/RǙّPuN6ϊG*c(: 3'؎!T4PKR9PKK>0OSGI-OPT/src/javax/swing/event/MenuKeyEvent.javaOo@x\Cjsr m$Pa(j{X`5E5.MT;3o~orkdrf=LOqQH2Bh0x"%E ^Lf,-P!.EƏ6++Q4@tTw%ZlCe5Rɨt ^-Z-ݪӪx\z n(myµo\߯: qM/v Gtۮ U0t]IÎ[21gB"79=um*aYH댜W06ЉS$i4IC/r>O.fx3OSGI-OPT/src/javax/swing/event/MenuKeyListener.javaR0=ԮJR{ і%]V{tI:v8 h reϼ7=' Jꣃy] n@_VoE!2h:,Cf$[*PZ,%pGXh,) a6fO1Nb,T SI(IOzrqġNp`SD9.Ũ8Tsz׬zB?Z20ЬڈQS^uoȑ`UzaӔdC.B?o؄YC}'ғ<$O=0OSGI-OPT/src/javax/swing/event/MenuListener.javaRn0 =_A%f,s8mѣb7G$NPG9^ע`A"#`P}p0-fɿ$MCBC83l}-Z43x5(- BE %%:'Ldv)Ϊ8TZA*jTv@ uԣa3x%0r.V=OFwpN#1(kuXe=QAk w?Ь{ڈQS^uoȑCr0iJоu/L[ $4$OГܧo'mU-,62ݥo_ {-C@I$oe#P$ nM֭jաh4G~#9ᆧW}BqϿ5OSGI-OPT/src/javax/swing/event/MouseInputAdapter.javaeAs0x 2ڜ\B[Oe{1jJ28dIo~oU+,9YY=D4R0?Mϓ8lcrdTLV$B*{BbDɟdd   GM8q#;$!J}0Z'3<  vo~lu],zXz֜nJ,_~dN5,k 0U) fmDm!jK|uRS8l*鼕E 핑؄(ɑ#|M4tc}}$6]XoXg6]g${4xd܇ Sqo9;>#9Cɒ5G=H1`ly^~"Wh4"`Gc:HD-xGFHi}R TzXt\WMHGv+4)?E<sPK6PKK>6OSGI-OPT/src/javax/swing/event/MouseInputListener.javamAs0 76'-SfLK{:]aI&#ۧo6g+=Z@^|tB_/CEalda #*L~uR+0T-nYpgPwA#;-B$gx4Eh=H1`m:y$hz7?(7)"<%GɩF=kRezp [=]zQ" [џ9PKQ,PKK>2OSGI-OPT/src/javax/swing/event/PopupMenuEvent.javaeAs0x g\B[OSeFR%weܙ0Ai>}o5p6'+Ǹ*KM#~puP:ɑ=6a`r++RhՖ,QoL𛬓Z:a4[ J{C:dC犌T h%qХ,`x{+t7_Ӯ'ul̋GUCVZN\ SUdFt5ug`[Ybh9[M(Y1״ȊI0y6?V5OSGI-OPT/src/javax/swing/event/PopupMenuListener.javan0 S9%Ejgm=i˜!Nش͑4I {Q[멘$Tt̕>VgIa|5?LB kiaMEYRb,Ѐ#Z 7SGcII g0j4j N "3BI5sHBz֑uWCp w@n{(.P*ϱ6Z&E-.Yu'k jpǻͪrc@Asʫ 9*]' zLA5il03HYM=dl68$ VkdR}8}Iz;d˸Lv :Ks*)dՈ R-Fs jY`15 }A?D+b]ٱCS w ed?Py-l6psZE̹05W'zVT7oْ%PKvPKK>2OSGI-OPT/src/javax/swing/event/RowSorterEvent.javaSMo@=_1Ɏ(vsk}6MPSSiUU10bJrXv{,=8lWkbIv!kD0L>@OmCRԨXDyBc V†+>DpL`4M^Zذ=ij$ ak izk-7O]!1Mwژxܶm:ǁTո>`:E,@{֍QkPrE{` *ؒ֬U fs*n|reZɔ\ŗ֜ G~ 10803߉Urm" fbq.[42ꃻFdqN2 +y,MTUܢTݱj2X:oaz5{z`[ tKRnQ%TTUdܠ(uG u', ҧn0! 3i)[CB&*E}{&$垯 =y?PKH%jPKK>5OSGI-OPT/src/javax/swing/event/RowSorterListener.javae0)F9%ҽ{ٴE@lW{t`iU} ]j9زgo~p[/\AV|%,͇5qk}-ȞJ+e\kQ6G%%6',bu%.TzAj\v@Ju3H*f uth>/AzZ(1qLu\.-vzzZ dxfR#(11+O0?oPKmJPKK>>OSGI-OPT/src/javax/swing/event/SwingPropertyChangeSupport.javaAo0SS2ĒlC`  ywf ~='Tjq{<pnF;q"˿HM#* r~#kX%sm%)K[tjKnG[Qgؙ+U4F({Qw؋#v,1CZT!CIT(zv:śn` >zp9~N8Ҧ6笝^'U޳pF5d- ᎋ#DV(ص= ޺7IUO`uzac:#νڳ#2c 8G)Γ|!kvm^&YXd2$Yʫψ;|K#:kJ?-"'zP鳒m,5Uw&@FqGhjYp1K'כ|izн8@̓+x|J4(n4sŎ-(Vǭ8R[{E e?w⻌J0x8>~ x'(nXݯ.yNiSduj2:P 7PK&RPKK>9OSGI-OPT/src/javax/swing/event/TableColumnModelEvent.javamOo@x#jHn-'j &r\ljv5E5"4>͛<\aơ%ⲔBeht=?+-d(ˌmq%2t7&cVF{Acoq5jK!-ֲ$>A*dz[uhtOIy,\Pn}.ptlMD%)Qkd:KzP%Y CkixbL ( Ӟ1IU `5ɥuFj.7F\ ^"I{I:&axgdbd>M|ƻ;ij'LfG}h_?cJ/"%zG$[Q&2TQP"Vˀ)V:ڣA9Fb'm*)7zQ"+.}][KTNܶQd3e/hKM|m6a+KvŒ'Ox9~k #iUe8+N wސˆ¥XPKEx#PKK><OSGI-OPT/src/javax/swing/event/TableColumnModelListener.javar0)v|3.9Qm:xfraۂD%t]ah_ pCioݱE]筳uw*jͶ57o-U!⿼7 鳆 ~;K=_)r9{ ֯EXan){OiߞPK  0PKK>3OSGI-OPT/src/javax/swing/event/TableModelEvent.javaRMs0=_SIp C3CG27g~(p>ز۷owpЁrx2KL~"FK dSP%*0+d)}H\ 8vгn:#K4Pi$!^XR.[i57NbE!QBIC 0ӊn1k5]A4?$m\5(VqE/JRi-X RRHVpALYrm_Ti?4Rdb.| [ 9 {Q͒!`&A3;ov٤HQ.drkn#>ɝ$]b3Rk"X *AAj͵&KKS574W{}BN|j؆]&*7(̨SV ҂Zz&X6J nmn: V2Ro:YFNϡN}oGQx2B46OSGI-OPT/src/javax/swing/event/TableModelListener.javaer0)v|3.9m0cframJݻ´I&vo]pkφX@!ۖ,׫Շ%qkL ;hz,CV"[*PZ,%p BEY4ps0Bō8 R9,YESI(QOhf3xx4 N\TL&kӟhPġ2u^rmM֛4߼g^h-ݑg q`V ǜԃ!G^UA/Su{e?Fe&$|qK/f{xw8'.'Yʧ-Il6~$o!G|P XPE&NH4#YK/ґp՛|(_^)Kأt7l%TymJllqK;6]놱>+ _OPK'/PKK>6OSGI-OPT/src/javax/swing/event/TreeExpansionEvent.java}As0x g\Crk9fI39 FR%d߻2nLA߾}*ڜv2Ƣ"յ$ o~petX#{Mʄ%)G4jC~GȌ(G VIAē8{q#fH t,xHRM/~)A {^{ ﶗ=;ѨmTtSmQ}u|:W59Kiy °RYk-Zh QYAukJַRlVʴ?yM( y1ȋ$@ rWbb~Ŝw-& 0˔- z%aϒRneɣ'!.\c^zợ7sF(bГ8cZFt 'il%Z8;BYH`uiev;cO6we©^o ;z7ag=PM]o*=h7Vu\DoPKW fPKK>9OSGI-OPT/src/javax/swing/event/TreeExpansionListener.java0)F9%ҽ{YڢFD ٮh` ۵ $;&hOe7vt >jgmIa~Z[/B ;iaMUPbЀ; ZL%|CcII W0 )4[yYupgAgdO%j$TG=I>+ '8]p]2D9!aŨ8TK6:-dւ8Ьkmʀh r)z0H6Kv01Ygܕi4/6!a3itex}zݧt|M% [}𤍟er#^IEXRM%&N4H4#YVґpѫ|(]ځQ!(]dZ=䤅]6 q^+;Q&oWWkնB㜿^G¬E?oPK_W~_PKK>2OSGI-OPT/src/javax/swing/event/TreeModelEvent.javaQo0ǟɧ8Bڕ'S D5ӄxpkvUӾ;4E@H4v" )5\9!L!89Bw_F@aa3-Т`9JT@nhӧDJ C'tP'z`Ͷ "ip K.!GKZh5wOIP (Qa"0B79׫:f qL\ۻNGI6~ImՍh-QqC/4QlAՠ ŜԵ2fL3|QgiI$Y&YE^66͒<g0h:JtB tre&vN2gKCs9&ˊڠ4h4knZ,kkzA@>Blb[TnjAVB.O@1Aw( ۔ŕ"n{</Qd7W\,?O+Gy{@G0'izsaA!#؊, +!!<Fzrv.hvw%$bUF6%TD}5WSOAPK!?V`3PKK>5OSGI-OPT/src/javax/swing/event/TreeModelListener.javaOs0Sdg\psks2u 8(ÂŒ* '95`${'.`Pw0-fɿMCBqm| -ːɚ Khe!֢x2[4pS_0&+oqR- rZdPQPzrI~P;'\@zZówNC1Qs:Y|GՍlZ0%N 4SbǬAA>sSzVUMIڵYhy0sH |${dms8trdܤ6٤qzߓzȑq6OSGI-OPT/src/javax/swing/event/TreeSelectionEvent.javaSn@=_1#jhKMhk5#LEU=M]ww{gSAAwg{o3B+͋nC~ {?p0vhP/1\ *;GKѣjÕ`]iC V[T* ̸@ K \BeKviQk12JgTPi̶C_uƁE_sM*5nn@c@㯊kR<]+UƦUVhUuQ3[3&j>iIf$t4J{6|In&paA(eJM\OR- 3dJg$M+ D-Iܸ";2\rG>t@lSTKvՔL0b8!S9K enҠ\}2,x^ZYzuQJ Yc= n&p Y|aDqkvwn A+wwm}p#o`*{wKd͖+١ %>TU:|jVZ6^6޳S=ky24Vn9OSGI-OPT/src/javax/swing/event/TreeSelectionListener.javaeQo0ǟǧ8)2نU}tۈM;V5*& J Սy,F- Y oWOK"װvhXL-(- !֢m,'KJmOM#Ϊ8T: x*P; :I@L':8 4 $z(!P:j/6&Mo>Qh-ӑgUZ[12 jsʫ 9 zLI:tʴy l0sHy/=)vqO69d;XgCOO_!NG>,2'm,WJB.Ƃ**x4YwFUFDg,EA>_ GJv̱͡# qK;Qn|koWTB/ +r]x \aVC?PKq,I=PKK>:OSGI-OPT/src/javax/swing/event/TreeWillExpandListener.javaR͎0>ԮS=n*V{tIjpmc;I+Ļ3NڲgrHd7"6+i9MY@"D/@3a:lѡb@֢D専VUhK9qM,.^g4/ҷzzT?ZaܐH=h H5 /T3ks[qhMh4 W0I Ȋ |L}y>n|l.tI _aH Hq^⍄Z_%9EITZE= H``8 pW r񎟙 a/#(JJͣ9yGAÚBA5oz!YFo:-hJKɍ+Nc@Ō[ݻ]5OSGI-OPT/src/javax/swing/event/UndoableEditEvent.java}A0ͯxDVi`rJYF]D=d;Z89IJƣwdds!7P9a0G0XzŒ,1;x'TQ!EK'+C<  xn'(Xbi9R!Gku}zOCo`wK!롻o\y4j6qM9Z;zJy6}ZUd- něDT0k%ZhQ;=uk`ֵ)uFnw5Rc $C %,&bs\&U:˰Xb?t1W$HG}X1]!l֔˭9*QJ} 8j2{iZ,M% FAs^Ac۲ULRn͆GLVS=;R**Wނ}M尫^|f]!0/+>`:1 'xǿw,u!YCPK0PKK>8OSGI-OPT/src/javax/swing/event/UndoableEditListener.javaeRn@=dG9mP-,(5 xZ]V,pΛ7! J b;A4$d0[,>ρ_f#-dhtXITXB+K4~$܅ zd,MfZ83H堵dOj$PG=J9#W/#;p O5E95Š8T FdJ-vAk ;ޟAhVU=kmDʀ r)7Hsr0iJоuB_86!ax${dm9β8&6,7cM6)A$}rd<Ox,|-BNB.Ƃ**ؚ[Q#ԪC#h4G~#9ᆫ(8ߞ)=Sءtn%TɮJrk`Q|[oS4[b9051A'̂ PKe%PKIG@%OSGI-OPT/src/javax/swing/filechooser/PKPKK>4OSGI-OPT/src/javax/swing/filechooser/FileFilter.javaeRn0}_q'RemK "RHW87mBusӫWisyreM!k%ZIO8 XÊmf$wJRhݐ2#$ ~uJN`47; 1rت@GICzois%(+/.jg}'8ѶN ֥wlQzortʲaXkmDm!jK|uP[U[OR(筪:&k&Zy9׬I yߗkqd܇,S8/SDIFV_$9CRmdkm݉Pٖ+X&4jwB48߁8czJ¤NkW7*` 3Saߌx3^N^+ (]PSjΠ8)y l&?''2[5QPKASBPKK>AOSGI-OPT/src/javax/swing/filechooser/FileNameExtensionFilter.java}Qo0ǟOq *fh62[*H=;= u]w.`jC_ `}+%z0`!r'j9:G ~W\Ч Z'6~Hu`SÖ@CbHTXyVFMۧ%1sJTPѩL;85Mx[)׍8OSGI-OPT/src/javax/swing/filechooser/FileSystemView.javar0)v8A[ˉi<͘&d:=yr%Ǔɻw@Hwׂ |Jr-3 5^A]@GJbP;mN@_랻 Ci`#r)8#H5B'a>\6Bp굠Rv\0g9BjDHX1p5O i>)ۂƖQ8&ہl!zY|k6,R)WywABX1o*49R٘Ji*:Šx&6c&j1NNvPU8~pt1Mg8#`AG sz @*vHp\uB db"8Y)"LuL A=ƵՐa _nfBu@wl=s3hڕ$SA[s scq~-0ʧ"nwVxͪsQ52`|vVL dn8FT6<3Zj+šR%T`v$uhgZefZ.>E۝ Jۣg[ڞ\6^޳9"x u)s3oCtW)7Z,'(꺣t釈Nfh =-N~؏2OSGI-OPT/src/javax/swing/filechooser/FileView.javaAo0˧T,޶RhhUmգ1-؞퐢gHvljl?{yt cNU`V~UZ - `y~: ~ڶM85էX?'WEyS&WgCXbɮhaD֭SAjo֡"f|pjل7E{q_pلF/+=\fe^#>_|.pYȯJ̊igϮ!KУu1T.$z6'%oIQ*#9#Xr[c[= "V[D8.Wh$\Cc[Frc 6K.(ĒK d _sȝOɇ.e?iNK."VS6ʤ6OSGI-OPT/src/javax/swing/plaf/ActionMapUIResource.javamQo0_qT,m}(ۢuA"& ނUfluypd\{r3mV[a1"*4 ocqe,aIʘ  RJ$ %$FwIIpO1 A5Q؉#h1C:T!С ! 3NNO N3 >`xV] !|om7&bqrk[OM[r Yɂ5{Iձ2`^қ\$Ͽ؋C:FŦ]d wE#`Ra)7"OtWGNyhGʻ7 pg zWPKKIx!PKK>3OSGI-OPT/src/javax/swing/plaf/BorderUIResource.javaWsF~.Ŏ CvO8. L5N;!ӌ!$8a38~t}o/f؂aC/8!B۽l}2N #ԨV8)$b o*ͥ+ M"uѺkAHFfF`0A8xှ}3޷)dăLnÙeĒ$C>!& # FڦUf6K~YNAqbf+锠8bFL(FHE>L% *@kq8?6dce .SN-?0:T;vZP?q;\X1m|Pě647x}IDwYn]#** .^^|[/StTo"mVB*_(G\]f]ςN: ?]nOo ˩O}hg,QjK(: O~fۮ'^[|hx:?#.2#Ί*%u"{E{*Ԧ̘Z,I'݉๫2P gx">(Juvf5ja/ cΕ^(zij 3Q\}b9KAGy2N^ZvK.wo8vݺvƢrX9aX0&Qbmf1Ͼ}0 e)R/@)*u}!q}D3a̾&%V4YI>Qg&U)(TG·g$zc/PKX]'PKK>+OSGI-OPT/src/javax/swing/plaf/ButtonUI.javaeQo0ǯ8SRemM "RHVx#gШuBVdssMr KmNV{i5ú!v"L/s,Æ#1;{YrTW5Y=!5x2oNjxiLƣ&Xt8Ai{HFvzxHJ̈6H?] G]zrW[!{-Iař8ֶM%rL=VTGҿ^ZN\ SUdN g^J/U;Ӎ`SK,{nh&&i6-bLntIm*`myi_Y~7ȸ=0 " w 9CldTۋ#Yʼn` 61OSGI-OPT/src/javax/swing/plaf/ColorChooserUI.javaeQo0ǯ8SRe$'F "RHVx#gШu¤F߹& RmNV{i5ú.t"LoOsyelaCɃH9ѫ,QoܙY'm4&dv,NAG=C#;=Wd2OSGI-OPT/src/javax/swing/plaf/ColorUIResource.javaAo0 x))<'mKXqvPѦH$ Q[-vMY(O"`j꽕cX0?IJI l29w$"d:,ȑ:aB\ɂ5& !(JIqL0 ~k0:i{h8bt("]A(̶o>=%(m0+/8]pAͫ8g}~G[|f1G}讶˔aSDNLBi\M,etՈPY͎PJձu(^+_8x?؉ĵJj%nVp sА#A7J8}\OI9:(@C&F>E#f7PKNŷPKK>-OSGI-OPT/src/javax/swing/plaf/ComboBoxUI.javaAs0Wdg(89ii3v8(`bI'ޕM\g2i9Hz{+`Pr0,F0Ͼ$MCBË<~E~^iaˈ rKJ%DnhQ? %%" `t;Z@*EfBuo#) < ;rWթMssw]H:nZߦ,~d}սlZ0%Éͮ Ft 9]w:* SuֽګG~* $4UY!~ b̖4&uL3^@2{:qjM<"do,T`j,ɺ5B6h$'fM_e4&'~].(O!6bَQnDu6I9(`Օާlޡ,҈5ZIEr8gxɱET<]7hNgeO|{EF1),DǮ:gKPKB 9 PKK>>OSGI-OPT/src/javax/swing/plaf/ComponentInputMapUIResource.java}A0ͯxDV4{k9,mnA"M`C ~ͳӛ7kszDVRп 8 ˘Ü=&Ƚ,I9ZQk[BfDɿngd  u[x`'Pڣq 鰑5J2R;YktC`gs!LCmD*OZɴeݩ9XH]b^kB[y\VzVX tU/B[?plBȋ>fE^ !_|-xl'fsgӻ|Ϧ.OSGI-OPT/src/javax/swing/plaf/ComponentUI.javaTMS0=7b'Idni҉CNU$W Q@miw{!ZC] :i)A(% "t]70&h,1 QbЀ#HS[z % @;kS{!ֺXJArJp@ R(jiFJЉ.8Utjћg\߯*Ł6Y4<'oYuu$Z d8d `UHXhbfmN{Օ!GjsW &# %SzӁ& Ga=rM?ϧpN&h0p<:xī.s4:rɘWLvb;rd L)SSRfzFqFPYm,00l=[-],*Ca($sT V:kʝGpzS;5v;]kؙ% ?/4>a)̠-ϲʘXѢ\ČoqIܯs4|oy)FA3~/S#9?c?U(e\ZPKLJM>PKK>0OSGI-OPT/src/javax/swing/plaf/DesktopIconUI.javaeQo0_qT,m}ʀmѪ XG' ^){ T<$}߹& ڜlruS"i[)TI_I J 9Gbv&$B*{BbDɟd?d   G]8q#l \ >~3< B?@l},ıͬh>]|j9XIˉaRڊB4@[jpl*鼕E篆؄(ɑ#|O4tk!llr7XeM~ ;͖Sг!c0-"'B*e-KN4F*NC ]VǀUiAz[rF(9?(c׳UlZQE+xgG &]{ڤV=}whEʳ%4x]'x+(zPKPKK>0OSGI-OPT/src/javax/swing/plaf/DesktopPaneUI.javaeQo0_qT,a}ۢU0XG' ^)w T<$}߹NrsmNV6{q9:.$ogOS$Æ#U1;{YrTSY=!5p2oNjxq.Xt8Ai{HZz.xHR̀K?\ ]xrW[!{%Iř8ֶIڋ%|ʗzک8A*E-DcϼԽ^f k K[Ytjh9[M(Y>4i0yȶ?ֻ-&]mejmWߐ3[- gcCƔa[DNtP 3TZM5h>UAp`ʃŸ (9??(c׳UlZQE+xgG &]{v{R{WЊgKa*OWDQPKR=PKK>6OSGI-OPT/src/javax/swing/plaf/DimensionUIResource.javamAs0WPprks2c7 V%* cO&=+vI9+JMt{29 7iPa|7ކI䗱JY2*#&xȃ,HY*ѩ ܎ϰ'+]4 Fhr'a/NPڡ iQɆ@ǂZP};X۝ OCo`Zg\9qM7"Q Y C:i eWزF6{N{׽N:Օ!)uFn;fh=rP%9|/I桇<jdtclu8${4 סck|lSq^N9 X-NԄZ(-X-,={;/ۃ~8FgT6n˓D68{Nb&;SHEDfg߁+saX*0xAPKl0PKK>0OSGI-OPT/src/javax/swing/plaf/FileChooserUI.javaMo@q[u(e=ivw'%(R흙g,3isTl=tef,I(нzq8yt0Gvȳ!aт"$FH>: .!tC5uzqP9d9PR δj&OK Je.8oE7`Pu,űŠ b/cW3*6\FZs'Av!=RkނVk޹e=ܽGZ}hY/=xGx6>'kʁ%VC@V={aFDL:pt ~-&/ϴ}"ÚG*3QcydWZ-};&QbA.%+:$xz~?&/jTY+1oUzmo7PKt%ZPKK>1OSGI-OPT/src/javax/swing/plaf/FontUIResource.javao0ƟTmL2JhHVGlvsH7P swg"6G+nރYYBRUN1ﻞa:ɑZB9)GkԚ,-Ab0G[;Y'@74tR7 G]kHY!'A*δhfV%cWyjs[޼ m~yut\2x^ĿxsO6/zm⛏=PUYF D )8@ j( PKdNPKK>1OSGI-OPT/src/javax/swing/plaf/IconUIResource.javauMs0Pzj9&f 29 {1Idwe 4о+yx L>*wA\U$dFBAahJr-ǹ6pgQn:tV_>)~PK ^+PKK>5OSGI-OPT/src/javax/swing/plaf/InputMapUIResource.javaeA0ͯx+=,mnD=d۵Z~~'w0he#,IH ~:4GqX2(!<ɂ*o 1~uR+S `o F[J{C:T!С ! 3=Z'Tw $x= >`xV] !|}ޛ/Iu8֓ut6GOUCҿVZN9B*ĆYA[y;+TNWM)r3rKM( i>$Oq0yNW?2V#9CdT݊P=Yʼn`  6I/i&W(4"`G!v[ŦCd wE#0UYtk<]|Ўw7k/s[`8+EPKA9KPKK>3OSGI-OPT/src/javax/swing/plaf/InsetsUIResource.javae_o0şǧ8SR1fO[XmhB\7b3ۄDU{V+B?΅Mus29 wP9a8LnC(XyŊ,;x{TU!nDί~'/2Vji4 `4'b/NPڡҢ595R!G۝]< {u BCs͗H#mq}}2_#SUU0oO Sbˬ DeԝN*ե!oSHܶM1rkM( I68KЛ<$jda|%d?.q:6'`LyȈ de)sVTJ(N^ZY-ަ{;/7-َ,h-wy-0 g7 l5ž"ѹ8Ǡ=)gYFWOTa&!h:4`[N=defxF/PK{OPKK>2OSGI-OPT/src/javax/swing/plaf/InternalFrameUI.javaeQo0ǯ8SRemK "RHVx#gШu¤vdssMr KmNV{i5ú&v"LOs,Æ#1;{YrTW5Y=!5x2ONjxiLƣ&Xt8Ai{HFvzxHJ̈6H?] G]zrWk!{%Iař8ֶM%rL=VTGҟ^ZN\ SUdN g^J/U;Ӎ`SK,{fh9kM(LY1״Ȋy0yȶ׻-&ͷ٪z:Ͷ:?vqz26$`LyEDo}Ar*Ȋ-G=H1`l:y^ֻ\QE<8 lN47K$DEQuI3幡8.TK?"Y}+D/QPK+PKK>*OSGI-OPT/src/javax/swing/plaf/LabelUI.javaeQo0ǯ8SRemK -"RHVx#gШu¤VdssMrKmVi5æ.v"LoOs,Ö1;H9ѫ,Qg<Y'm4&dv,κQG=C#;=Ud)OSGI-OPT/src/javax/swing/plaf/ListUI.javar0)v|3.89mi=8XZ,QI{2y08M3B\yp |a<ͮ@mC" $hP +Q,j[a>6BI3p48QcGBk@)j{oPKo4+PKK>,OSGI-OPT/src/javax/swing/plaf/MenuBarUI.javaeAs0x 2Ԧ990e{mId  N2Io~o*ڜlvrUM"m[)TI_fIJ59bv&$B*;BjDɟd_d  GM8{q#l t,xHR̀K;\ ]xrWk!{%Iř8ֶIڋ%|zڪ8A*E-DcϼԽ^f k K[Yt1rP9|4i0y6W :]nE.d%"]>Gxd܇Ɔ)8/ B/HP)kYr4t!4@Vq"{µ:M+ z+4J'q]ViE}IB]e+'VmTUs3"Y}|'x3(zPKYګPKK>-OSGI-OPT/src/javax/swing/plaf/MenuItemUI.javaeAs0x 2Ԧ990e{mId  i2AIo~o\E\c\NʿIm+* ~tX#{*f`r/KR*t" #FnEIp0p5'(9bP˖@ǒT( hs%qЅ,\`xWB7_Xcmh]r|񑩇j9XIˉaRڊB4@[jpl*鼕E #G- Q#GM,l}!]&[X1_-MZ+#~d˻)G}hlH2ȉ %GSM'Bd'!./OSGI-OPT/src/javax/swing/plaf/OptionPaneUI.javar0Sp 546'md0$^BR%ݻPo]*+ix#X_$R T%z:0~7,U1NUЪ, AbOY'x & -Ai#f\ zkzkCSЅG#'>B@ߛ><ͧɤcmIyLW<&ey%mJ@=4ȸ=:`"xP%g(5մ4zGVqG`n `0RlGuW(4";|]ǨHo"*OSGI-OPT/src/javax/swing/plaf/PanelUI.javaeQo0ǯ8SRemK "SHVx#gШu¤VdssMr KmNV{i5ú.v"LOs,Æ#1;;YrTW5Y=!5x2oNjxiLƣ&Xt8Ai{HFvzxHJ̈6H?] F]zrWk!{%Iař8ֶM%wrL=VTGҿ^ZN\ SUdN g^J/U;Ӎ`SK,{fh9kM(LY1״Ȋy0϶?ֻ-&ͷ٪z:Ͷ:7~f#>hlH2r( 4 UGSm/ZBd'!{.\c:t wB$xq*6hn"ӗ.OSGI-OPT/src/javax/swing/plaf/PopupMenuUI.javaer0S 2Ԑڜ\B[ d0i&G٬Z#a2y!vW"fbeM"k)TA^Mc(XH9{L[YrA6d᷄Ĉ?g_d W0]u@u8Bi3C)k 2R;KkvuzJPs/8\pUy{ݳ|LڶE8ֶԯnrlUY&`o#-w! *DZkB[[+TNf#2oȭ؄ ɐf|I4c|X1Y:gX0[.nu\+~1Gu`le0SDFFB_%9C,e{;!.cNzửw}B(9 b/kZבir$Dν£+צ1w{R.7ЊCO:K\. ~ ;`]˩HuM|vu5iٮ@,ZӞwo<]3^)jGEPK,fFPKK>0OSGI-OPT/src/javax/swing/plaf/ProgressBarUI.javaeQo0_qT,a}RE`"Nr۳w T<$}߹NrsmNV6;q9*&$ogOS$XÚU1;GYrTSY!5p2/Njxq.Xt8Ai{HZ:dͳ|LvtNlc||6jɫH- !c0-"'B*e-KN4F*NCv/]VǀUi^z[rFI *6"-OSGI-OPT/src/javax/swing/plaf/RootPaneUI.javaeAs0WθDe;`7Œ* O&+N Io~oEr KmNV{i5æ*v"Ls,ȃ!'GHuNVUM~OH3񓬓Z:^`h2 ' NPڣwҡ+2R3 }F@C^\pURG|Jabq&mu]\{v#`O/-'.O*Q2k'h Z3`RV5&&isZdPKK>.OSGI-OPT/src/javax/swing/plaf/ScrollBarUI.javaeQo0_qT,a}RE@"s;{ D<$}߹NrsӞwc9*6ZƷٗ)umaMʘɣtI~GH[!3LSF6ah4 'a/NƣsʡR Z!;zw>K a /X.Uu-y~Kcq&uc6_,g!`_,'.N-SIQ0k#z Q[3ouoW™R)V7Zc4GpY> &OjS^MȱZcZ>dlwgʖSб!c0-"'zP kIJINԄjN^p`ӨŸ> (9 FAc׳U6ڮIB]H&ͥ5Ms/6czOtj9F,z> NW ^5PK{PKK>/OSGI-OPT/src/javax/swing/plaf/ScrollPaneUI.javaeQo0_qT,a}QE`"s;{ D<$}߹NrsӞwc9*6ZƷ٧)ymaMʘɃtI~GH[!3LSF6ah4 'a/NƣsʡR Z!;zw>K a /X.Uu-y~Icq&uC6_,G!`_,'.N-SIQ0k#z Q[3ouoW™R)V3Zc4G5ͳ|L͏vtNlc|6jɫoHO- ckCTa[DN2$גTMם 9՜-ٽrZQ{?o%Qs8ƮgmDu](8LKkдߓ.ݻx?Ѥ=uxg zWPKM/PKK>.OSGI-OPT/src/javax/swing/plaf/SeparatorUI.javaeQo0ǯ8SRemK "RHVx#gШu¤TdssMrKmNV{i5ú.v"LoOs,Æ#1;YrTW5Y=!5x2/NjxiLƣ.Xt8Ai{HFvzxHJ̈6H?] F]zrW͵g$0Lk&E뒇lʋGv#`o/-'.O*Q2k'h Z3`RV3Zc @VL5-bLntIm*`my iY~?ȸ=0 " 7 9CldTۋ#Yʼn` 6+OSGI-OPT/src/javax/swing/plaf/SliderUI.javaeQo0ǯ8SRemK "RHVx#gШuBVdssMr KmNV{i5ú)v"L/s,Æ#1;;YrTW5Y=!5x2NjxiLƣ&Xt8Ai{HFvzxHJ̈6H?] F]zrW[!{-Iař8ֶM%wrL=VTG^ZN\ SUdN g^J/U;Ӎ`SK,{nh&&i{Zd6u9^PK1ePKK>,OSGI-OPT/src/javax/swing/plaf/SpinnerUI.javaeQo0ǯ8SRemK "RHVx#gШu¦VdssMr KmNV{i5ú.v"LOs,Æ#1;;YrTW5Y=!5x2/NjxiLƣ&Xt8Ai{HFvzxHJ̈6H?] F]zrWk!{%Iař8ֶM%wrL=VTG^ZN\ SUdN g^J/U;Ӎ`SK,{fh9kM(LY1״Ȋy0϶?ֻ-&ͷ٪z:Ͷ:7~f#>hlH2r( 4 UGSm/ZBd'!{.\c:t wB$xoq*6hn"ӗ.OSGI-OPT/src/javax/swing/plaf/SplitPaneUI.javaOo@q5$6'm &r\c{Z1$wFDH,潷$zo( %A\U$DM&!Qa+-,Ѣb1CHA24J_NX ΢ }=b؈=( S;R ʮOOJg\.@_a!׋ҹxܶm$:ő6Ÿzdz1O/޲ԍZ0!Î{5bZ+т6 Wr]+ zLFZ7Eh5M()$>ir>-nVp/|\Xt1%d1篏K2]mI>Χ[\?I5JI5U4@(bGPِjY`1m -A9b+vmՕσYs ]H4eZ(IXC٣єgC+T7=p[M24Eִ*3>?`+$TDuѥuIS&L݌ġ\ieWMO0v.D+t+}m0GQTa祏1~PK<BPKK>/OSGI-OPT/src/javax/swing/plaf/TabbedPaneUI.javar@ Sh8A­!uMQ캻2ݫ7%ôS]K]pSS* |꜠?/ g:HȑR CTNQ. st!|#0 .\y4=h8rRrlNZx}Qx&ctZvD@D5sq4j6ărTs.콨tE΁8֢*LV؂%[XrάEKS(Ve ob4AƆzQ qڃ(ӡ<ϋ%%Q9 FAc׳UlZQE+8IgG &݄hH6c~Or9Z,z> ^W ^5PKPKK>*OSGI-OPT/src/javax/swing/plaf/TableUI.javaeQo0ǯ8SRemK "RHVx#gu¤Vds{LrKmV{i5ú.v"LoOs,Æ#1;YrTW5Y=!5x2/NjxiLƣ.Xu8Ci{HFv:Ud.ctg zPK^KkPKK>)OSGI-OPT/src/javax/swing/plaf/TextUI.javaTMo@<_ "j͉ҺIDQb?̶f]cPC)DI87;3=h u62;hm_$ L #a0E#&91* *An0ELL.XЬ#Xb J;(,0bH^䵴RyNJS'. >EWsn,KOT=mn?{R]W]  it "'UL 9ͪK#TiRdDZgpBH(69p<$W~ur 0 `8?Sk8'@Unɔf!D| a7lɘ)Bh9BZVKB:᪡_PѠ0o+ϖD噘5bJIw;3AJ#\ ;T)t,BŠƻdSj vtK2D,HH@ΰuQܰסZVۑw`򇶒 c2wFtڜI)mg/ "RBdwN^<;M'3k OK>ɹ< jĒMZ;n?7<{|׼?]2⊴"sݞU,dwE0 @Yvim";*پϋ%WHg/ح$rvhPKK&'PKK>,OSGI-OPT/src/javax/swing/plaf/ToolBarUI.javaeQo0ǯ8SRemM "RHVx#gШu¦VdssMr KmNV{i5ú&v"LOs,Æ#1;{YrTW5Y=!5x2ONjxiLƣ&Xt8Ai{HFvzxHJ̈6H?] G]zrWk!{%Iař8ֶM%rL=VTGҟ^ZN\ SUdN g^J/U;Ӎ`SK,{fh9kM(LY1mZd<,OSGI-OPT/src/javax/swing/plaf/ToolTipUI.javaeQo0ǯ8SRemK J@Vx#gШu¦VdssMr KmNV{i5&.v"LOs,Ö#1;;YrTW5Y=!5x2/NjxiLƣ&Xt8Ai{HFvzxHJ̈6H?] F]zrWk!{%Iař8ֶM%wrWzکUAp`ɃŸ (9 FQ)OSGI-OPT/src/javax/swing/plaf/TreeUI.javaSR0=_S¤Nr2!nCq:+c2 ޕchJt>Ė齷QG01֪bEЗDexamHD[·߃wXq)3 K*j$[E- ljvڵr枦TkEڭE xb#B0UXbyTuIػta^,PEY8051>xבx}TNA}/6Žy<_#G_ iR c/lx}B;~yP4&(\pܫ_} *1͛۟1 OX6J/̘OՎ#aRTo{_PKj+PKK>-OSGI-OPT/src/javax/swing/plaf/UIResource.javaeA0U =lڢIW{40vmU'TU9|];X<DR0_/8l9'jbV"O&BjD͟)wNjxyHM!H\􀣸@ikHV:d$1WX.o.y֛ܼc^,厫 aZTڋBt8uRuK8QX 2tjoLȭN`ۄ,-3|Jˬ\lu9-4emmΫH|%-:t66t2y"J7!9Cleͭn';!{.1`dzy^}BI?q؍,^*vMd[cg|`w'PKVFPKK>-OSGI-OPT/src/javax/swing/plaf/ViewportUI.javaeQo0ǯ8SRemK "RHZx#gШu´VdssMr KmNV{i5ú.v"LOs,Æ#1;;YrTW5Y=!5x2=Y'u4&dv,NAG=C#;=Ud9OSGI-OPT/src/javax/swing/plaf/basic/BasicArrowButton.javan@S8ABCɐ4uI`51Ey΂BTݙm/6;+A7,W*G0}9:,"V"2G尀ZhV9?L?: t}AMuz#/5&tns4RAצEk$}ZOOHpw˷ _+"o&{H۲_j]>NۏLݞzP:a\dZQZiOXIR!8FX2tdeVӉi<M()$iqyLf xxHnSa2$d6WO#ބl~Ɣ[aH`.2TY'v- /Sɵ$A?sF `{_b#kX*2XFp2O+c͸&b'pK wr{S0 z> sT^[03v}FA_ "P4sչ޾UtJyT[ 7Z`ߧ{T¬dZWWuGɻO{f-։uKPKZ%TzPKK>5OSGI-OPT/src/javax/swing/plaf/basic/BasicBorders.javaWr8<[_1哔R=$V)%ʛqH($hWGlgA"FOO@gxg:1";&=G >_7#-LȒYR0'y+RR(TJܜ`c?MO!cVpAމ,vPXbaa&$]'; ip*NdžC< Yg\`Pe@l k .Fu$Y p `ΪY q^ui*3W!O 댈 f7zaat(C8}=‡d2MË8i8% GM8:es3`Y"DDkfdsJL$ 2$8#,jY`iXjt:gO xؒ\,ъ䤓1 DyNa* _;MAV9jHv=a̞bOݖrׅAr%~.<2gZE)S]sH_;*GA]ڐ Qj<_:gRLвM&~nQہ"Uڑ' rq*XؒS gf ޞ=P}Cs^ؿ;O #>{TtY45T}#}mƳ|Q3jͻȵb*nOcFUw֒$l4KA֐JKkcZmӎ|.۬0Q#WO/VO/WOVw:$vii:֭nTkmʮE\r|AFyipA\?HDMe_tb)m?S.tŹPKYMpPKK><OSGI-OPT/src/javax/swing/plaf/basic/BasicButtonListener.javaSMs0=׿bd99nd0i&GY^#d߻M'iHză"]Y̢+A &9Bt86 &>)8( &P5B3N?I~6BI8uN{9JfHe0HRd[Z筵RU}OCbΈj̶`PjǾ kf0 Gi4L[֝*+`9,&+Ai`F:ʹ.B}0jiK$X-HPlLB' :pDaw"n|L8FEgSZ]B0}pzU@6yE,,UcRp*MKRA-"Qqj`d2zM]QΏN۰oJ-ϼ)O#nPV E߸FI4|VZ7//}z(&F&lъx%+QG-b/ALθm az؃'xR"wݰQ"T8$I⯇t9]ѐ`}/±{6OSGI-OPT/src/javax/swing/plaf/basic/BasicButtonUI.javaTMs0=_ :ԐC>&LQנ֑\I0l$M9۷o{ltf0 /i*^1 918+Q!1j3?c|Gmp;-A* A"cfAH><5Sw5,#8ޒu 0[.3k/nQ+{JOi5ݫ`p6 >:Fh h MGK`,")+@i`StgS]havLZD0I# ۘB6HnnNFc$ \ YFypiWΪ"nHHT%dE"8&9"L C}/k!IŽ̖G[uDF|~9[x */KYEodyD~Ot@g)ܜrX [xn/`v60oz+7Y PKg PKK>@OSGI-OPT/src/javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.javauQo0ǟOq ,P)lV@"`#x5g;TwNT5wE0`E=_R 8Bw8\@^aH wrX@ 7a>m$h AiCu@t[v=T!D=GA(zkZkNK Neg$g`>xo>u]'qh[x?6k$:VRǫ0C8[WjXib^׵^2׾f[^w<^e.tGj[d)TU;fkWVk9c(baō> Mge|f7%n)wsö&LJl}j&PKIlA"PKK>8OSGI-OPT/src/javax/swing/plaf/basic/BasicCheckBoxUI.javauAs0jZNmdlh&GY^5FR%d]ːIo~&+}08,/Lrda 8 6d^i!CfeH^pKhe!֌ӧ?4V( ^08R9h-P!:6>'CQUu-zӳqNBv"欵}2_=QUk٠`W+ M\i ֆu 9;#\ zRXgDѺWaѯ0sH<1Y}]WgYE .Y%˔V!N{ލ)2{m)|[BHV#4[V#jFDlj 6 i\Q7vlڎBݰ*,|趠<70g~oA<OSGI-OPT/src/javax/swing/plaf/basic/BasicColorChooserUI.javaOs0D:ZN d0i&AP+$WqL{WI0x,=};|m|a|I)^Cya&hѬ0 !7A24Q8=|GcVpfu.`֠"11w pkpꞆCЩc$gt ٶkLWsn,ːUCm]Ykm& G=nN)ւ?08]g)ym Ҟuijgd=&nh}[@ec ZQq҂($Ma ƣxG|GW@*݃ Ȧ嬻 ⎅- NԼ`s^Qr4Ka}[-<OSGI-OPT/src/javax/swing/plaf/basic/BasicComboBoxEditor.javar0Sp 54CHꖁLQԖ\I0޽+ct`iݕܻh.-yѝ }}nf. &>)8( &P5%BP0N?N~6BIvf8*!gBi4pͱ $p Z%iT <6*%8fUU峚W:eX$}"&^fh h] M`Qqk*PXrԕVȴ F-l4:DE\ړj "\QuC86C0y8`:tr鄞n!<pr * Lڹ"D' C2rJiRTPK Թ0n'\XfWu9Q9'bkT$[133FnmX](%DgVҌu(QwO48޽}Hg[sG* #eޛ; [.DEF,}NHjxׄH%It=j5tVLkw0qΜP %IhK-AY6nbwt]19g9rO8Γbx-?'.=X9]~ssElyPK,PKK>>OSGI-OPT/src/javax/swing/plaf/basic/BasicComboBoxRenderer.javamr0Sp+hKɐu frb ɕd ]4W_u0|㠛`|I)7KeJ shvbE&"CeqZA ѣɄ Z @tT7]–@iEB">PmѠUm>'FCS9 EB஁?犯~UUL/O?wQ7J`O) MDX%@A9+#PyV] zΈt-^i+D IFQ'yg/0t d Zd4K#zFDP Hz鿹|~Ͽ=IB5K0(ʔLrަzs^mKDŽ(pʝLh\֞ ϞȠ+UJ9cp PKpPKK>8OSGI-OPT/src/javax/swing/plaf/basic/BasicComboBoxUI.javaXKS8>o~S.SsTNEJrBv-Cdv8%}CVO dQl0#}!v-R1hP+d$,!"@ҏiy"8'] 8ɗNN/-F&dI7DHC 41C ar禭Yzrk sȩ(hVjrӟ1gg:ŁT3app3VRD? StChVtr&R:WkFZ׊&=̬K1m&za'd89!Wpҳ$_/_^_x o&iLOi[}#u {h&vLj&df!d3kb9\A-۪pdtj/8D}Y08bHZIE eb)PA7 &URm SVžl\ͧRNG@]3t4Ϳ%l,3 '_hR`%H8Ëj 31*Xq'Z[?=a [ +)s D}ë}Yĝu+XoVRd](sio c,:h xլ ԭ+ \j55!iق}pZj0*!ZQޏ_2N(7Jb 7̱4*tPbeG4Aj(i bcE\gߗ.)YǬ ڂ#Po˿mAҏF8@=S$L* FyvoUY bF*?WfQMl*%ǘթwJFMuʠM^~7G"Ц- ͝FZg'1CI-U%vu^Gi*C}a5}ceQ'fIm7ORv}{Q8\';h}d"_kRju+U˖8OSGI-OPT/src/javax/swing/plaf/basic/BasicComboPopup.javaXQs8~.b'OÙ$܃Ʌ6 N.ӧa Pk$$CNlc,cHr}hmo]D[z"ZK6kh0b!#ܧо8;;106Hc\ACr| ܈OSpANO'b-bX5p!V9) )F_,Lڊy'c1J{!& Ao"D'ZGt!bGY7L{7]PufCHo$FS")-$V61"F8 r1$σ#<;|\{0Co4!݀;~( ЗHP&3Lw;OSGI-OPT/src/javax/swing/plaf/basic/BasicDesktopIconUI.javaT]s0| OС}iyr i< lId8|a,vn} Zk-,Lo18 0@!`b1']p)CZQ3pkYAH AR#m˥.*9C-#8 m 0[> k^,KU}^E8<G'u}Rh hSpMٜeJruԖLI ڃG*}@1 0jqQב\ 4“&SNƣpNv Q"#UU@6sEw,rc(yc*Md2B-"Pܸ28/eګ ;OSGI-OPT/src/javax/swing/plaf/basic/BasicDesktopPaneUI.javaVr0=7_S N r %- ǵqDHrYnp&JisH,۷oWR=8.Ff }q0%*A?>:z>~q0H 3dVIΤ e)Rd-|"cVpA[Su K\JK!-eN@ׂ RˢVI,^ |i9t] kEןsᰪkŁ60ovxO'3Vz]CJi8d X* kͱm3ClsګtRez*4iRiI鶊vSl`?!uG|.M//s84 ItM'z |&' .ǡ Xlvb- sH 9SSYAWdg~[- L=M.ҡ_ {='+lTA!J>ޫ]h;.@C< nQbnr—|5G'Vm>%ߚvMn |x錯>RSXrQ<l[aۡfa[ Al~'F=GRq<OSGI-OPT/src/javax/swing/plaf/basic/BasicDirectoryModel.javaTMs0=_ӡi!M1NBr%f߻2!Sݷ]/>aC g2FN&cmEA='rce!XL?InP$m\QyttqKÔ-A* AR.pcfK4+͹uJJ YF2Z@`$]|&fZ|%Vua .@c@kR-e*fqlJk3qJit0 7V([9j$!#8 ~t + F`p0Aw88_Z]@0y,:ȴS@4sE(jEd$Ms6FjI C=Ƶ>bkG+j4_7s3R?bǝFG'Ă3wNVV7 ebb$VQNNQU!ѶFI,ʲ5j/4݉Rt`t63`IR_;LeA,`k?&G͵ BA*%Q]pj&޺Vph6*%CKj+ل:&'ۧۢrV/6`vƫ@Z[u>;e氯?~:Ȏ?eVOc8]0=8흱lz̙:8#}GYsᔞO▹ywDAXکDVNދfz.KQia n_oti]u?n5 PKSZPKK>:OSGI-OPT/src/javax/swing/plaf/basic/BasicEditorPaneUI.javauAs0x 2ڜB[`0i&GY^Fr%d]7LZ۷O\D4GP̾($uta ~atX#"fB*IQVd᷄??:e4.)A08;q6#f(R:Hj<4)=) zɽ`WK!MͧɤXVI&lu_ukr~aWR,7ugWÙwRyֿ Gc$C pdi6tuy}^'M:ϰ\c\ܤtg$|O7cG}0T!Χ[DFBi,*tՊP=Y!S.\cEj7sF(OuZq.WQ'd-u؛R.sE,}78Yk:h'- j_=+v|k5t[W8q k;OSGI-OPT/src/javax/swing/plaf/basic/BasicFileChooserUI.javaXms8\~&Hs~f diBI26/*LHv=Z/v[2VҐN&sΨt]^^~yJj,gHY?J|wIV,]:;[! 4 d8Chė0afX&[!g8E󂄚t4&|ql<3Z\DV_| nǓ?u,8hM1϶ʧ3HEBiYo3L,zD˹P&`(6Li;hz^F9OhrFnѤgAwSOGDh:z?F=2~Z4ugrdP0 %G" %"Z1mU#pbQ.E~nkBNތj_wh$>H>q0XJQ;c=~eaArVr-2bdk+9P9RUu k#HB;Ē0kq>^J ۧLZ5hX iS: vƵdsm+W]ZOd!6q(ť=5ven/ ܢ5Kamjg xoE%: dˠ-bAֆe036=(<(N_m5K=m64k|nPR _25BOSGI-OPT/src/javax/swing/plaf/basic/BasicFormattedTextFieldUI.javauAs0jZNm`h&GY^BR%dY!Hz{+'7LÐ`Y|J)umX:{b"ȃVЪ --BjO2h n ` FӀ8vJ{hC8DGA(zgzksSХg$gT`hU_ zo%Iu1;;myѺ!b\U%9G`\qVW:Xcμ;+P},L%lHѯ46`Kcܬ1]| X`ui4_Y~?Q<MyE(XŒ3E-8ESMF*JNp V#Nx[rFIќgudu\2'42mI.ټ { mw(x dģ\x>< ^.D;G ',;OSGI-OPT/src/javax/swing/plaf/basic/BasicGraphicsUtils.javaUQo0~LYݺS VD`UsolV;+V*w>}ӹoAaLq~}ۡwGZE4$r*8*)*En_O4VhaZ>Yo5Gb X5(H\H; ^5R&OygQ89Yہ\Mz[8tʲ نqM֑Uƽ0#h-SCgk`9lF\%+A`Asڳ.pBeX=w%3aRa) G~;4 Q'9'F Eq4ăFc荆xd}hxa?QȍW@4/gu ޡ0%#sI !dzF",j`aX uOOi4ο=/b- *%3f?jŌ \2y}' ij\6z2VZV%ʖ҅7gaL7r~]oW﷫̴HWBc[잖TCr~y˹hzPRcO3pexb>NhW8S]" i׮dB3Ieg7]3D 3R1 -z2tUWftQ ) j§#Œf: 9>sZ%j1`U4ӎ׍_PK<PKK>2OSGI-OPT/src/javax/swing/plaf/basic/BasicHTML.javar0Sp2jHn-!i&LQFTI0޽+p2NáSlK߮4< 쬨VbއyMDJG/FS? ۰nHH! a*Ђ_!L i#x@Vp  6돃Nװf;PC4RHr4צEk_|Z@O=tFVe7o{y8l&aDj(nxNgGnDZX83DYN5-"żԍ^jNaL!"0RSЛdf=di6"f~b1- gW2h&'MgW@a0)BG$gRpjMU5*A#0h…cuX)3zW0FW6l#Y >LQÆ=m3 T- о 0Gq4<xNZK(\8ŧ`GI'6Z7MeᲠϩ}PKߕjfPKK>9OSGI-OPT/src/javax/swing/plaf/basic/BasicIconFactory.javar0@Wp 54!z &(b%Uchq;=>أەW\D|+{>$EABIp؋C!'L[nRw?Nu\C膄N+(P9d9R{)4ZM~לR < ^m_'t7c% ntM߳u[u t,rVRٵ5h "{^ڒ'魯ŀِ֕?GnuM($YIfOW_w+OdJ,0YoUj> ֤0Η[ Da_AI[ܚ+# -Ʌku, J7  @?ēǮfTl ‘EZocy* ku}&#h\Ӵwg)6ǕZ]֜QPK?>(:PKK>DOSGI-OPT/src/javax/swing/plaf/basic/BasicInternalFrameTitlePane.javaXMsF=/'Ewo 6\ݍsI Rf# Lׯ{>W% Oaș>>t0,R51X{@"T`ݘϴ*ͥ4-"XL b+@8)(Υ-~rs91 b5-\t77&^.K;Ra{w;n"չW֠+x*MHkȖ B3Ҫ^*n@˩Y2&(>IL)ikz@ic.\w=kYwG`z0Ao8qp@;xM RF~)V6m:U$a*3I:FOOYf3@%("QE\e$04!a&ډ:j7/`O^lL~''!#v\N܄EKD_zI@aD Ʈo5N(79%< lҹTu8 %NfzkaUxRR,%۷gOȲʤ]zč[{PNYt3fb 22..h˶_~\6kjl2޹_6(k_gɢF^{sM3fgoYT K.*59lzsfizQ3M|ȳR" sFaK8mi>TLtbhD\(2v9Q)4 09EE1*ٛĝl}L9UEжb?{_N%tp+sHݾGUhq,|ѭ7sHݰ!.I:1f͞kȀԓ~ωw{;/6=GG;wTjeꝯ/(>⛟wQvRNRԘjK:x*5xxT8$Q&}<}z>v6eJ\Pt.^2TKئ%p[7w*H\kuQWL:-&;f{05GfU5U5[0#?yy9mY%5 'ʱiTRMN1I7&쎚>Ҕ6 *UaxS[2G~='kX}'yBNMSk)uROIL{F{ץB Li h PK[PKK>=OSGI-OPT/src/javax/swing/plaf/basic/BasicInternalFrameUI.javaXߓ6~=q7.yko:$q k&}{J26c \?jMn'õ⳹w #np&<-m c+a6!XCчH!M D} M+pkAHF<@gC\'aڊyl'ECN #qF ! 31ojjTNg7_TQ5(7"&kV Bzgzb-fZk$2m|w(mLUǽw]q[q_qw \7g4_;aH)#;*m:]1T&.=>&f! Dn&} 7KNAy~@%{nAÀMw # d{P B% z6U)(0.P<2.i]Bv,Tc7;+D'vv=×`G,Aa_P^'GIA}QT'`B?J-\FͲ"I%uXG,4wGl}'s6\p]&r^euPڻGj&Aѫ6[4LˤhV9=5FR:Zøs:!`_>!3XܲbSJeaz󩘈$}f.P|R"UbO oy{Z>FC)=44I`J9|?y:؎)mF'OLҾx] Ev~$vKeˤŒ|-]*CP M(6EEļ 9VxVBj%i"4ޜrjO ݮBx95œl.X؜ζ}RPXcTvj\`j•}{VNPB*3O[瞝}ma7UpM/h=V$aX\'M!n. ЪU H<`\h<Q-<:U)$),7n|~22ܔN_<m mhH V w 5bWm'ȭ]܁M:+h+v֣Zo,Ź0KP8f/2 {˩>MdNN%6 #gio,-yRHSogسv8eQpL敉dʷ8"GN[DJ \{DžOz\,иj1ά}#g{_.PH=bSUϝk}E) 7/ey+NCڨVQuTυ#(Gğ)芢jHԭLHL| h4PKD PKK>5OSGI-OPT/src/javax/swing/plaf/basic/BasicLabelUI.javao0ǟ_qV,2]G93!EU @ x :)tu2b6w'0oR 8B>k: 21Z4KLR"QYL!W)ps0cK~B+8~+Â@iEB"#́P"۠lT< e!FAfTpJMr6C%EAf!o%H^^~VFu~%{ lARA&4HS \2¼kݡJ~䋃\$Ȕ Mn՝S8ʢ"ڻhzj~)ءC%鶵qO nβVDJ sH^_+X2]n\zj>fdtB a rߐ¸-7w:qIZ %@C hpF 믚tBpD~7e&'SvQ]EkqSE8*놥 ӸT*GsPK PKK>4OSGI-OPT/src/javax/swing/plaf/basic/BasicListUI.javaW[S6~n~NKLB`!$,t'\f#q|Xw.t$?4teQ|67tatˡ#g<;99mر0H CԨ9`IE_3G̥?L \p@KK!,|i H\Ô \>r$G~ $rb5$gnL{ZEH5k^f0N|Zo!Wd,\6X[Tf iHJqY Shi<䊶Rl̇z#z%y;qfC> {À>Ag{ :P6 rƫ#\St? a&|T j г4/a&*e WK[WDM ܽl `S1zAed{㧜'"' MlﰕqpINH,Y1|WM.%J%׬b’ȼʺ/9VIUDd0 ϦBDZ(MJƮzKJXE}q(31Lt<`dC\ByF/cIvW!kfP 7T[V4*tӗ'L\=YM(g%Х') zܤ\JE] R2=fݶ$=mt,c Wɢ5-D(-6^e_͸IT`!qBaҗE53n&) vqw8'H2˞Mio" 9wz|b >ӞPgtX0.-qJ슷rҴgۯ|,Cjs\ _0.ӈ^q9Pt\ru?L)0a4 =h PKVZPKK>9OSGI-OPT/src/javax/swing/plaf/basic/BasicLookAndFeel.javaR0S0rk94CZ8Er%9&0{W)I&ZYFMĸS[Ծ֍4;}˪]Zs`G--Oo+V%0g 09oJ/u9gAKSHk̴Gӓ![}趲a)S虄Kr Ge%Ai6d5OٵtX ,Fɵw? F|@׸5+8G'Qs0gPx YqHsH ta0I}I,M{oNpO"AI"| ,.G]S<˯ylЎ˒]+us`%#딍_5'Zb1K_Ȍfm(c Ы!<ٟ!`1F| pOzPKpdy6PKK>7OSGI-OPT/src/javax/swing/plaf/basic/BasicMenuBarUI.javaSr0=_ 2ZN 34,Z!d]ah2 ~ @fYH d*8*T*Cnӣ/4Vhi: l J;, wKB법V iYm9t5tʟVr2uPb LdL>ZI !XI8KId5h0HwN{յNVf=M&3"Ah{d9bc :Qqҁ('Kh' 0.e<+D[g}@]i)|!A8OSGI-OPT/src/javax/swing/plaf/basic/BasicMenuItemUI.javaWMsF=_"MR1UJ0HX(3#O$d`q|xGk;xx87arEgGh_^\ܱb[M cԨ8:> $"@fЋOJs)ҹU8+ίL` D#fR(]=tPԴ$Min7CorM0t3yd]2g흾.: M$6 [(bv?M͇7カ׵_OKta'@fW۳r3A /M_y`f>vn8e_P ݎ{_ܗd^IY|ɶ,=}8r< Zc dU jeuyV&t{ T2Pp5."^ٷsdTljI OMŸKV1$ѿ+[;0 ogYJVsPKX7-PKK>4OSGI-OPT/src/javax/swing/plaf/basic/BasicMenuUI.javaTr0=_Ét!!240QcK$cL+ۀ]BP&{Z?9 2Y+. 4S83 4;Sn"5QZ%Krg*0 ^)OZRہ4ʣiRe 1[R5y\@ 㤔q,V <rj$WL):,IY,WJ7^0Iuu/"N"5TlJZ#TBtfU)n[dLqmVF^P٘FoE%y&ף

    bM\t󀬉0e!B(9U̵m&3Kf=_6QqO[3r)<:I:zB1yanQI7(f@zc?;'5,5)01 S%mzĴJ!uk# =aU =xM9N_xe$$ 2d@#RM\ܗdzOv3|) 4u4桂 y9DIש­$HRNnlY-O˧R^J=ᗊaPGoij/cڝys4ڲX{ɷqe>a^Qf}wФJH o9(U>0miK@/CrNj3 /PK PKK>:OSGI-OPT/src/javax/swing/plaf/basic/BasicOptionPaneUI.javaW]oF}^~UȊlZUڢ>lM F}ٚwf ccm=s?t߷= dV|67a|ЏcDоܳ"5 R2Ayps~;|g"寗\ӆ9ӃT(*+,a5UG0)5U1iݼ|{ǀ,>֙8i|Mm+*=eNR7,fj9|#?d˼gGDn@;]0'{f_|R5OSGI-OPT/src/javax/swing/plaf/basic/BasicPanelUI.javar0Sp 54u1 (kVH$0޽+pNi]"6{+ꍇ>"& R0! װ JKthwXLG射Fho8}~uB+^ &bز=(qHA%$r4Ckt.^:]xFrF Nե{e4j6fGXz$OZ7zL,$.k$:6R!* bm)unBCp-lJE㯆H_ hlLA/!{i> &bdLU:a"t+$ LFFua0!GB ZSujZ* ڭpa`#VxW7}B(9 FَƮ%HVsO"4OC{b :%vtC}sߺL ''nyKՏv̎EXr*aGӢS1)gXFzwv;;&7QPKڨPKK>=OSGI-OPT/src/javax/swing/plaf/basic/BasicPasswordFieldUI.javauAs0jZN!ی`h&GY^BR%d]!ے~zo*+isx,R)Sax=|?0 ˠtDvUL ZUAH WZuBOSGI-OPT/src/javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.javauAs0jZNI[)t04Z^FR%d]!Hz{+'W\LP`6D%דɇ1(۰ JKrdwTL{)H9*U%YԠO2_d ` FӀ8x=!T! A*zkzkScЅG#^UB@ߛ>=ͧ$.ƓX:iZgy~]UkՐs`o+-'.] ,kh X[3J/U=+ߡ)V19dž iY>4q^꟢w=MpOpg Q3"+,'T}{V$`-*PmLPKدPKK>9OSGI-OPT/src/javax/swing/plaf/basic/BasicPopupMenuUI.javaSMs0=׿bdnR`L6jd߻!ɴlK,3jYy̋/2)S>?Ҹ t@vUJ FpT+B ~UZy:~Ro0;`v8ZHr4צ t, w S 0ߙ_+ͧѨm۔6#yM>Wuu$:air̐+J*Y k,R躵 ڷbV? #~ ؘ^V@^"+bI"- g2h=\! EF:56N@6E@|fK 4jkAh"0h`iX ~\Qh$Hm6u-QF:-|PR%#q6|GnsQUu)!ygc|oG /xG8] 'inygGlGZ>X*H9ǣFN )Iy5 һӑNQ׸+5U|C 6#mGK$ PKU`{A:PKK>;OSGI-OPT/src/javax/swing/plaf/basic/BasicProgressBarUI.javaU[s6~^~ř<9;Ԑݙ'.m2tg}l ɕdL}qp/LtΧ\t{߁0Vًʂ],a(g2Bn./׾[CA'G#ce a.p%WQ$n fHJZN]9gIfSp~. m$p!bCBvLOxD4g)B6%y57.ƎF5̖KG~z/G'۰o 3 ,_RR PT Wx(!qswn %G}3,F.g4'8URmd* 资>jx/r5agяzsmqI)8qN 1švԾeZ ZH187nZ.gIP{p}8}9jYE}2*eAwUI* ƽ-7PK-l PKK>COSGI-OPT/src/javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.javauQo0ǟOq ,P)lV@"tU58Gflv DwK*+i\{/R)S; c^anH rX@ a>m$h AiCM@u=T!DGA(zcZkNK Neg$g`:Y{o>u]'qh[xߓ6AIt,{`\q$ՠ-"żk+Pe N|,L!bYzO46M,1[|=,1"0h6lJϐN{6idTwƆȦ|"gVŒ3JpjM+JE#0h7…:2Xo. QDs@ٖW*1%sDZ;OSGI-OPT/src/javax/swing/plaf/basic/BasicRadioButtonUI.javauSMs0=׿bd!HRI39 ymI8L&+2th}GڷceM"-P`?(HZ -7imCɣ=!B򧯌;:x h(86GPJU#DK4HVѶYx9̆7X^@ԛ-Xgey_*y_3Fu/#xw8!|H(/XQ:{zB^iuHӠIcR45🭧{ |wbR*;13? gɅ˅n{PK~FԇM<PKK>8OSGI-OPT/src/javax/swing/plaf/basic/BasicRootPaneUI.javao0ƟL,m}J)۲VPs ތ) iC2GhZy̳)S6= p t@vELjUBH Z'x Wy@lu k=!B"GA(zmZk]}йg$gT`<o:5MXj$Z7N'Y6D۪[%9&η ,'5-"y\7Vx!8]Y B8oE^О=)%Y.,͆r.op,lN3/`2]t>o*])2Ɔ Ȧq⑅R-9\hYP ZEA.Ց"`X dhE6!v b#Y ~:9OSGI-OPT/src/javax/swing/plaf/basic/BasicScrollBarUI.javaXMs6=G㓜Q鏞ZOjl#Is$(-.&43I]`zF"J\iԏO}!c_N R9QD>$CrKcIP"^4p D :92[5".4PJA9&FXBچꕵS%K!"aBoi.D+_6M@sXuv;Mf'P]z($'<g*hexDx) iaTo$Ք/HTo$&JK N#^@0G'Mt= |.np>Iht?O/t6 !;9IM8]QH'!NHLSk|%AKD$PF*VCj_YqjO9P 2 ŠW, (fd^oa,cX>NA&ᗇAӪ.cfG/ZӖI{%?jd ˾-!W]}T.OOT&opMD(^%U ^?PKoE^aPKK>:OSGI-OPT/src/javax/swing/plaf/basic/BasicScrollPaneUI.javaAs<WD:Ԥ96nSङe{}TIt߻„Z4IiW+x C+gs'!8B7GZE<"\  7GheӃoh,WEG뮃cT VT \ m^K+YSf1 g4@ӿv 0̝,#R)3:/(9{Cף@k8iR V2f)4q9USW2s O 0N#@1 NI<&:__`2GU<ѿ0}/HA%lIH 6RfyvEJ~B& HZgPmw<wijp3 UJfH"JRdd6ݯ~υc{ qSVgv`*fAzwx:NS[ޗlϷ`aB" cYb!ϑ_<*_T{p)KEz.uďt~PKl}m< PKK>9OSGI-OPT/src/javax/swing/plaf/basic/BasicSeparatorUI.javaQo0ǟOq *X6Rm*]ùolU|!Ct&Uw9F \؝:@_ `^|)%Q xn~eXĤyr[*S&Dȭ=5AfQO3o4.1cmؙ6m4!=TRУ @jfc;VណMcU@#TC'}CFmS<#um>7oٺ;uy~6qūe++vU؂q# &ZN!xSEL)}prՄgMȥm=ʊF}<[}Xde~S|:_?}l_[Уu֔Ƿ3%!+)4]7XfKNsE`mճ`1JndpXzQWh$QUX+RL۬ U\+Ȣ`]t_>=%o3Dl_L؆tjWVq'5̟<N>-^JMyd&XJ8@|<唀-q: Ӡ&?YHeJ]S 9xpF'4%NWhPKn#:PKK>6OSGI-OPT/src/javax/swing/plaf/basic/BasicSliderUI.javaXKS8>O~SbmC/N[-'+ɄmIcplRKF,pXJԽhGA㣣?PѭB tKO"SD(|‘\4'\P+^joDQlXVx"&Q"pPD=KD#UJ[S~R=l.11pT[Jyx^X+08 V=S($B NM(cP9h 1x'RThq sh|*$DZI4BE Gho"CCqWgv5d朻hzFə3s@LsȤ*%Ē0#Iģ hA Dx&+*ԏ*q)GQ}Oy @5C XP's'B 2O37@uxI"_TMs~)1Y9{@CFaF (T` T O m֜7CWפD"90.oͭ9z~- R$+03:D"³HjoV EP> }˒GyhLeh_@!.T˧+Zٖû ܴƠغ`k꣎-hMgf>jKdBl:GӞ2DҠz9 /k cnf^3XD(Nęa(]^9`5Ik6&KZ$Ylbɒ7q[D&i\Y⦵k_/](~{EM{IW|qU>9bxDu {6b!|/ԣKݩ+ip{&m l*i!;t,Rc#BZ*YD+P)vHvm7Po >kUbZ{{- 'pUMNԭlsm+*쥷sxL\0R_._1eS .W ;/<#NB)ڷdM_f0+ISqb6i+D\"2FD4OU0ZY%z%Fm/6ɚvTҴv3ZIzKK;|y;] =*Xw Wl@VרبGRi8ɿY=dG;L9z5V*Y'|:]Deg0гd=]hz_I.=9ٽ+FY00A+ǪjTzZ35mGvq*~zPKQ/PKK>7OSGI-OPT/src/javax/swing/plaf/basic/BasicSpinnerUI.javaSr0=_ :ԐZN LQF\Ia2lL8փ|*Zd+ ]ރyM@I=O@{;CXA'G2JB j#S]WQlU k,CHE BW뢕V ,N ܴ* zKVt[Y[| YW: x2&Hu[u%s44--Tq֜U4L#YTWZX!>ڊit40V{4Od "Qu>ZuXe8`|v.޾B0pv$˨M@2I"= j$HdV !SԒ&Z!ZXfsF#8ln}S_,cfyEsF2YT)Q_ޢLGȝ"w=h14Siߤۃ;4cZC%QZI"uF[j ?gYe)U?$ tМyrVZ{.5n*YbdZxEˁSZYCȥtn H$(wISV4C]6VL'unC{,8n<ѽK#wc_].ۼ~=7PKPKK>>OSGI-OPT/src/javax/swing/plaf/basic/BasicSplitPaneDivider.javaVMs6=Wb'*RI5=Ȳ\3)%^2R ݌{ mK`۷o?@]H w$LD]~{pc,-Ph!1*0ka")VzRKg݁xl#i H\Ò'aj &-Y;?U_ 0 Rz[L!IwϜb_U?ɱƓp3."AA?WXJ" ہTV iHzb-fZk"3=kJp6 !raϒ| f7 Y0az* ]p&W=@JTH&̫!bERt_BVrJPDpm˪I`liut([ؖ=zGT~`GN-(%d^o!4+  #)l1 7(L@&IIRkGk o)h;?Jls[FilWt(Jk , i+y ,9j`?SfLHޱHȂגY3}A]q |mr!Q)4 $KMDE;ǘ] 7ԃIld9䧖J+Lf!+{r'iFPwBB^#V'8nc4r7-Yկ^ܣ̀j )ڭ4>^ d:rRsZW4430fi;5؝*˃ehCI:,9PvGwu{;h%N'o|tmz}g\ N?DŽ8Οڏ.W: |iq8ef &:+M)4"'nӾ]_E 1@kީ}9OSGI-OPT/src/javax/swing/plaf/basic/BasicSplitPaneUI.javaYS8~.䜔;fH(҄!=QlQH$'N[Yc;rz.ڕ:Fnnzp0At>x.Pot G6"2C"-TDM)Q$#R` b% ,B *uX%4LHTa<ڰK+?kOx(' ̰A 1<&S]cFn_Eo6Q._9S8n=f@ø,S+$N4ޫHpE\\3XϿIr&iI&o%J Ckɩ=9Nk-趍Ng<# }4Y; 7tA&PY3S]+C94Dł}`@hOӵŘ itD.:"9]/U 'jv=| g%[QFzQ!";|R]yԒh @0(gcmd6̱RSp,9q ({֍ͽbHjѪhIMy)sMX@A4W>U,U:tbmބs0MZoqAy*ÆaBS"vn\zN/Bc]r=8T(kKU_}5,83)8XTUmLڧSmmzٛ,/KhaWN"pkk#3+=3em\>CTXk/8 -ײ,+;΀󚠾yҗ|A`]yp;0A6B߂fFWo$KH?p'Pug3dRs8 rTi*ΛԷ7iCwgM?0nߏ? Ƨ ʍh<;t8N20':dfOYc٧K 1#e}T";*)%9>Fo<MMn=o7u Ld/7ItWnX?T!d{c:UUں]~[TPS ! v:OSGI-OPT/src/javax/swing/plaf/basic/BasicTabbedPaneUI.javaYKs6>GQe֗ȲkD%iDb `APHIu,vÃ:@c>XJwэQP\/eTQFhJ"".aP<"\4 ?}""#W{x1ZĸDqDFȧA%D!L DN4A_2 >10Lo)efD! /'k':EHb*`Cs5 A`NrFPIb" Dx4cY2VGXNf 4qș8y28CGz69soO'5ar}:@Lr}( @M̙"r)T($. Kc/Z5 VB"V4R J,ں^|5FsQs'r jωw8H¼^Rk#+dQǠj[YI9w$* F á"} }Gg+88w @mp+8l|/arIk hX#,҈R9PX"79SkDk, `W9QLլʬ<$)o`y怗򙬙]q:u@UYSy!gZЁqTsJ5<ӽ0A =a>tK šl3:oҟs&DƂ!q,>O3mQ7 T-V 黴e5Ud -P]a\p j513-&z?9 '쥮KS&2 #U94hu4ھֆ <ˎ%R/4e\{ԟ&mIRs:[kfٹ'69^Tm"b61[+2Tk4DE^w8DPhi6ijm<څ!V5K$@GE: ۙGu>='Li7;Nl}ϻJ)$`3i? {+-J,\.];"6UG>zͪ}@#F]&P웚 "lm{ TMrOJc6p 4OZI$Ru )` 4չ**KGz $y5$r /FB1q,DhZmC^c}<0M[0[IC0_wxU=B?X| fj:ۄ1(:{7ӭ k 1\CM)SeAW7JIs;S h38KH'\z@YYp5ua7k6C`%YR_nmMW PԞ4k[Mh cV Y^o38mmY7χ($HwJÆ; D#:HqaQY-'V80Xxrx۷Ȕ1sծ6JC[AiMے+l6kP-b/*E{efC qu-ue*z?U|I:xke%05UUsŜAm@oSPu*|ڵR Uan!Tk8eo;5=PwqUd(]%L!YZm+tw}.$0ËLv>(%rwƠvR:uZ[vǣ%ɛ?,jMšA9cqI[n9K̶);:ݜήɫ^PKS%PKK>;OSGI-OPT/src/javax/swing/plaf/basic/BasicTableHeaderUI.javaTMs0=_ :ԐZNh|@Ɔfrbɕd 8I)۷ڟk*h,,4&zBp&#ys4i @zG NG( Ɛ5B/eʕDmpur:`6 ips.pajK2-.8sYFpFF} 0[.~ kov+{J'mŚr]R1w5e<KUfUh5\se6gL̍|كxT6& p Dx:^F8x4'xD=?dשvMʹE,֒I1sQj2XjIAzɍVCc'#[fJ^.PV:?:_l֞IK{3fxԭٌ `dM\q/ԧ ,Tڧ[E}4dV6\Z)~C["Yk4 R5OSGI-OPT/src/javax/swing/plaf/basic/BasicTableUI.javaVMs0<_tIsk9B7 d4F\Ia2} a(@j,ZQBhjԡ?3 ξ7=7 40@zG N( 5)B;f},WJ¹w5.XflRYH 70_-p Kk)lsK 51&@`vi:{M6iz,s)5E5; (&\S\lL^KAi`FZʹN5\F 0jbSɄXlj mJPlLB=X6ȓ??={#;:ޥ?=]A ~H>kW.W!⎅->&ETĨgܸՐ>lPۨYP/NWϤ$łM132@#3Ih !Zp(r#> 5-.kwy C=u)׈u08alrE3VL [W%׸v_?^PK3*m PKK>8OSGI-OPT/src/javax/swing/plaf/basic/BasicTextAreaUI.javauAs0x 2ZNI[`h&G!F\I0{V2i}Go>yp cS*]4Z>m̂aFV1^IҎV,TB=Yu#>lm%WT<.jQ %y"Td7ʅkulp0(/q\ 8_Sl.v yNQTKl&iKb}OzS,}޵ q-rѤLr'T};+v|m5t]#5dPo+?X!\PKPKK>9OSGI-OPT/src/javax/swing/plaf/basic/BasicTextFieldUI.javauAs0jZNIZL6jJ2߻!M=~UW0foE0#R 8z20zaA` 8*B ~ӟ;Z'x G4 ۃZj!px ޘZ'ا'3tZ՗B`7}|ޛOIu]̎cmD.yfwyq\U+%9&. $u-"y\wVx18]Y J8oEWH_ (6`IS2_-)],|0_lfle">36L@6EtP P%gZpM5-kEh"0h7…kud )63z3WhD3~-Ů#Tl$9iKdd&-qjrzDzߔ^s<qZ 4nyK׳N֢oJ9# c\R G)FXCPKP2RPKK>8OSGI-OPT/src/javax/swing/plaf/basic/BasicTextPaneUI.javaur0S 2ZNی`h&G!/F\I0޽+p3I3K~vU+LM}zBRUJhI_AI9{*b&ȝhtA~KHj! SF:n74؉#h1C9lTECiH;VL1 .m2;4mqll9.Y7K,gj+r~7r#DVRٵ-(-7+]ƷRy֍5MhiM0@jdHe:1_`:ne:3v9tm5U+"'z1%WT%5]6$fOVsG ձ`0)/yM_QOصJlpJNY4OSGI-OPT/src/javax/swing/plaf/basic/BasicTextUI.javaVMs8=+'2e7' dI(L25aAFJ2ߖGBׯ_H͏5=m/ Խk8t3!ۭMk ka },#Ph!>*0 N<4R@iA\[W׷b#cX i H\CC\{[RM}+bأ*)~cN3m~=Wt,?cBWi<X%;v:.%zȖx#gct):y0??ʓdJ&GF?SFfk$Kf3Vu^HiK%ƙКћP>8=:;'>m0.|^Df)wqGz[1-lk֯/ʳVCUw^Y)ٔJEɚ 4OE ]ϗ79LҚ+IGκ,psye!Wf)Ma8s z0]j̲+K^J仰u-Z?PKdQƊ 4PKK><OSGI-OPT/src/javax/swing/plaf/basic/BasicToggleButtonUI.javaun@S8AD dMF a(z0ۚE{g@i}gfG7؃S喠/$Ux|;~VAa $jԺ@EH"C+a.԰І a*|h iv(ڶu:Jp/$X.8R:%Gib:+GIGlu+ˮk%0Dcd)R7jÀ)'򚮆#~) $44l i j,< f}N ! u8O[ Ɯ,yRmtY4{t;n|XgETjHP{PhE<_SkFŶ8^ɻ9d%4MYV8~JB]6,~>tx#%>x3yF&Js/U 7XT; ;8r geި,_QJ-' NحE \$9_!d<nO6q\^_@LڞcPK0PKK>@OSGI-OPT/src/javax/swing/plaf/basic/BasicToolBarSeparatorUI.javauAs0jZN `h&ǵ6jJ2߻7C&VNn"6G+뭇2&!mJ o'OcQaV RrTBJAd :?q-J{h1C:dC@AƃT :>=%8 ,G.07}~ޛ/Iu]gDZu\.yfE>Ȯj9G@î-ugӕRy+ֿZcC4,]g8@f j.< f}Ζ ^}t?G}`lH6e!'zeKΐM-ޓU ٝtZ,;џ (9 ߸C:FŦ*.I1L[]럣=pp 1[BHy KkU?^G; XK T4S8E(PK=#o}PKK>7OSGI-OPT/src/javax/swing/plaf/basic/BasicToolBarUI.javaXS8~n O9ow4$KKcÑ|aJv:߮Vh'Q;%o ÐQqknTd | +I}D?F_>b/9qI@DLtG$VL@كHƉ'QJm&W!9E!:%m=j5l[ZƮAتdt5_S{RD1rGhQ"[*Liɖ.mS`(''9Op> d< gt1NǓvWd8E~L>,ƁH &3LV PRx,`W1]Y H) &dk*y@^d-BQHwI.zQz/H[^Ry?A!/MͣާBd lS`Nx>ERh̊- 15tBϋsҭvׂMd{vm-%NۆSB~F0M"#|H咼2mǻ_q L{h;wHg荴eb[*r= AcHбax\jV io)&b!o~~Q**mȔX98UL%P "m|b;)'$PhbdpU}J25 lWsx1Ff}hj׫i]g\KL*͑YЧWKGM;)0zפeP{#" e,VJK7&p(1ùd C߯,Ld 3XשX3Ls!(V`R_|3+w{F(ͷ0;! X|:T'v͡H9`]otOy>fxVK|=5Ξ4;L^<o9^5:fnqss'V kǢͫFm?0QcBҮhQI>}Qk[AMrPT]?68JSOT؋ĤOGDVo~ * a;֓Y. rUZn۳?렽3!5_)L8%6ݘ/drXSg" qr^~$4αM%̦a3pQ= ١lrexo=~?IQ =UTvv0BԽe4JHĞgwV7qnhS:^TyҌUZQz05( fPNvE+%yWU,_ѕ̮demPK]uPKK>7OSGI-OPT/src/javax/swing/plaf/basic/BasicToolTipUI.java0@W8ShDBW{4$5k;dъR BUjDg޼]w0foE=Xd$R 8B~8|}ߋ2,C%:;,b"LpT U!1ӫ7Nh!nuzlJ{C8(DgƃPִjcLeg(Wy̷g04Mqm5X7<%6k$:R=0CVUVY=ucӥoŀ)Vk5ߎe)$Y,24Ƌ$Ŝ>B2|Q|66t@"t!^) rQ NfBwhuVpb+<ǥBAќwcϱkx͜k'pH!Z\UJUnsDoZun/p 4[*O,ny˨/1; X T-Tj4OSGI-OPT/src/javax/swing/plaf/basic/BasicTreeUI.java[Ys8~^ T){zkdI9UAggozR9?` $$@I䆠q}'{3D E ի %hQ$J *Њ'lgy2% %`KC Ī6R<=v#%1> SZqzMf7ٟA! &Ê kwqל;ɔ;N%C$J0' &BrL\FXIjz5^ o ]b@xx>{Իno`o~APCbVbRԊhA%Š"tE}XZN5{$<-ʬ LHTb֥&:=9=U@G4;!^XP$NOļPA.I:c?YJ/A+&[I<£QI~'bYFoxd4@$֞(/ I0pLM1?0ndqȷ`ǰr*rqcYWA:um q&<Y^`D뼑n WwkfIPxw8W'9 PyD"$Re`OD?Bk2nuGuUhvWL~}"γd,$)Eޒ,SQ*5 C!'[gۅx2Bµ!sϗG%F0rk6zNZ,7!:ۼT4] t»_oE$ѻ ^H' 4f0zg9-#h[i:3OkCx~թ5-gi4.h@1|u]$ǩ\=Xo^p鶉 (p,dNR%ے=-kEjmce7/lu/6KcEoMmB5;J@"'Mި}Z#yЂsy߉K|Ha% t/JEG'V!äLPܳ5A<${ /n6.uQ!yLfY,ҼJaIdqV{rH=!J&qG?+ٹy5mNJk޶ NAڢ& vJqPd>3fs5kʈq}vEiW1a,4oCIlQgak1%U1hEPID^-1=],UIԙ5ꔬpeoS}ZD+`Ɠ} /)h-{˧J+Zώ c5ݥT.{Hzt_ Hu2:4[^{!MfB]"R\s G^aM2m"ߦ1wJ+uvf\3V&"C/NNPK P :PKK>8OSGI-OPT/src/javax/swing/plaf/basic/BasicViewportUI.javar0Sp in-'h6cf0$,Z!dx͐ryWJn"6+!" R0ɇ1qcX:{b"ȽVЪ --Bj_Z'x hŽ@iCbx ޙZ'T'3t%՗B`7}ޛOIu]NcmD.fX'}FIt,j0C8+ɫdh H1 /T3k1S ([fhȨ>: "|P P%gZpjM5-kG#0hw…kud )v3:+J3~={]GHV%sO#Ӗ4Oͻp 3MF=]'_h^w=^ak֌V[d)RU{f'kѷVj‘JX푇kQCbRαf_k@qPK;pP,PKK>3OSGI-OPT/src/javax/swing/plaf/basic/ComboPopup.javauSr0=_ 2ڜ\B[7:QFR%d]ۘ{v۷O:k)}4TVVI ax3?BGZXEuPQ(UF>Yd+V}:,?PK8PKK>:OSGI-OPT/src/javax/swing/plaf/basic/DefaultMenuLayout.javamR0=7_ ViF@W{4a;Zw Ğ7oޛ.9YDRR0|C(XzŒ,m#f$O eiVmI# ?X10CSt8AisHR:8HB^Z'\gJs |ps]E8Ҧ Ot󏬺Z?4xshXU!6 qi3IUt0i:#7j?l=&I41<$bs\&*X,1]dt.2>}A{Bб1˔)"'P$P!KY5U"T@F#4dZ4K'Ɨ/'%َeVi7O`3*E['K؀#WG'ړr27>/ZEba! ۲#CG!x PKMjPKIG@$OSGI-OPT/src/javax/swing/plaf/metal/PKPKK>3OSGI-OPT/src/javax/swing/plaf/metal/BumpBuffer.javaAs0j=BSO30I39.fmʒ*84q20X0^}" isyXf7)?/q(*(ȑ6f`r+rRP-Y;`ίd?:L1`q5Tx=ԎC8($ǜ וw%C7Y`8}vޛ/Q41ıH>k6#Sw]wJs`w-,' SaV h XZ3ucӅoR li/TkC$4U0ܧo˻5'UX +-:].+$.@2CƆ):o23B?#9C(DTYcIP=Yʼn plGߖ FQ{~cװUl$qE4%2U]()` 16>hv"w3 Qֶ{!fZr .^WW4'8WEZk %_[r Ƿ-עLgFkI|;tVt?e 1PKV 4PKK>:OSGI-OPT/src/javax/swing/plaf/metal/DefaultMetalTheme.javaMo@W|#;͉:IF9a.t?YR ݙy}gGbrUӼX#X8DBp&sl:=?B Ki`#!<( d!jXN.2 Wf>aЅ )5ہTAbp%ͱ%n:i-9+֖Q:Vq"0ۉ><k/I۶!;(&9LnU^}$]J 44q\XCr&4J#Ŭ[-*m4zL|쫦H֏mL J!N5Jt!q}>Z.$RX,aH.,^$(yqr99mw@2o-BJB%s^ʱ R%9u͍VC ։/$Ͽ={dд ʰFEи5rH% {Ck?ea(22%v]4i vF鄸nQB0ySm:'5ZYȜ(+k wLCC}bdѓX&_`o|n@;c CO{. f |PKRv3VPKK>5OSGI-OPT/src/javax/swing/plaf/metal/MetalBorders.java͖MS0WpNr mġ G8*Jk ߻JN2u?(CZދcc{>JISǷQ a "V"e =C@[_҅4^Gv qg hCPxd a.ަh B+%-y*@Wp, ^D]We$đqYOb}c||2LN^2uB+~-c;R1eV%J0DI:7s* 3(wF^ dIte<9]L?$GA; >AKyֺ1e(窋 6f-r.SBdAXtgAF\ _!Q:_/FFd*1r$;r=!U1?kGƱNC1Gѫ Gg>].E)TTE&rq azQ%"QR/XeX +:>tv8U_WLmX&nPNp[!~B] ;>bdd#` 2f6s)湑.g\Q**Z?Qi56*M &I:)Z nPp5II2F?7Ҷr2֩D5f6nb2,S3)b#tp<&ѷWr[|V22:iЅRQ_j _qXaOi}rEn)>t:PKmn" PKK>3OSGI-OPT/src/javax/swing/plaf/metal/MetalBumps.javaTr0=K!ii 3$lZ[R%d]r۷oz4Lh/->̢;AQp&h8}CA'GSD!P,G RBm;dBe8NPYYVZӲ8%r23*PVt[Z u]QK- 4L۪GQ1O5Mo)R)gS]kn=025hRnqeL{H6&DF]0s=.9σ"`6lz.ٔ޾C0}$˨vLn" J2 Fyr\P VCSGS[f\Ѡ!;_l־W-+Ɲ`{JeX/o&LȘ'>?鏩Qs]*Hr<*6,/'w9j,Y*:`Vc ֍ G.\sCe^ }TFѩթvNlnCu˽Gw@N!yjg+SPt%4ޞRI;v;Ԓ'uf;]5 Z7f[YsZn:PK PKK>6OSGI-OPT/src/javax/swing/plaf/metal/MetalButtonUI.javaSr0=_ 2ZN$f0i&G!Z!߻BI'}zEpc[m*W]كYQAF"tχw}^0Hs6HD1VI%$N8 NFbkkX-KP{dP%Vʀ몕(ZiYk9T* {VDՇiX֕u:foYu;uc4zʱDŪXV-D{d)R샷5aɕ'5[#[?pl@' :pdi$f|Le9gIHgS^]A2/tx\p2Us!H(^PBIfZݠ3*tkñz֊J|Q9DFǾaҢHB^r `_C&&e&G+_%!0l /qW.?Q5<#>$%n bҡ c6 CSk=dH滯e:$OLg*i=BԚIɒ/cPKiWPKK>:OSGI-OPT/src/javax/swing/plaf/metal/MetalCheckBoxIcon.javan0 S9%diMXqGEflIr軏rE0``[⯟)i|L9X*+C9y~C5 %ɇiiX:;,v&w$Q9,QZBjO;ZGZy2a `t,8A6T#^@ ޚ%_uyz@^{r 6 |=xܶm":Dr\n|Mg{Wݫ?\0kfE ڂ(-r@ZVX 69oi7MȥpۄAC2ͳ<&ly;_*],2a|v-G_ =lvr8 0&vwr7}Dr%mHrilDPZA%1`ljڒ:+$G1;O\V&٢Ed5d-[V(/>܊@[T|CB:ђ)A7O3g|uc$=G'#x`e؊ +N7D)M vN"<%:*}rN%V:'8,*\t#q/ (WT®@ק_PKH NqPKK>8OSGI-OPT/src/javax/swing/plaf/metal/MetalCheckBoxUI.javauAs0jN264F\ia2eH`o}rtLL\gqU)%Bz40~~RtC<OSGI-OPT/src/javax/swing/plaf/metal/MetalComboBoxButton.javaTMs0=_ 2!I/-':40kVH$cL{WƤcj4J gZi5Hd:vOWZEiH 䖧(-NS4ff)7Dcpv U+U@*E2.pv%jki%wOc͡&Q9#]]բ9)2dP#ֵsGR]@krBQޠ}KqV1A ŧoJtU!+]xmVyV~_5vq QɭրF/PKSlPKK><OSGI-OPT/src/javax/swing/plaf/metal/MetalComboBoxEditor.javaur0@Wp 4!453QF-diIC}G۷+OnF;C1UYBX+0NߏḞa3-ѢyƌC@e1Fehš ;cJMa`4nPAcB.K HBWuJoO=CS:5D஗sɤm[;cM1)Ov-q|G*Z0:Nk<%ג 9[#T] zL&32mܫW0$Jmx 0DVkXhbZ}0~Q|?Qw@ҏt RI(d.~F#Tk$yL)+Bo&A@sA?33%YnR'7[*s_fi߂Cٷ[)ܿ9XmDnC;+v+Tʩ 2>ht/iE45cWo ؙ} PKPKK>:OSGI-OPT/src/javax/swing/plaf/metal/MetalComboBoxIcon.javaur0Sp izj99&0I6ڒ*ݻ2n&LZlkׯoWRt̔>*wA\U$d0L>ߟF+-Тc7y Cg%%: }j0zjGAc=BA2HBjݣv:'Cm` Gk!Cw99ڶ EG*SFYkd6_LzZ 5dfLl-(498OSGI-OPT/src/javax/swing/plaf/metal/MetalComboBoxUI.javaTMs0=_0ԐZ.!4n d0i&G!/F\I0!|f2 ޮԬW]g<^aM@'Ij]6>|Fi`#I_p#d 2N_J~6BIsjTJe0g+Bf8Hp1 $p5OKiNsɡ&цMwl)xͬM6yP+754A7{HuQ&h h M'+`)lBZbfSka`LZL2F#YPlLBBVaÑ<:Qg0z! Gnq0п[ G0iRdTvHpq!➄ZK2)r18c1B%9\VC#G|BJr~[&'*?MԟeIfxH{UVǀ[9-o>|rkm{`Sg{dB@&Ȥ8)w$iE;b~ MlIaS׈mSK|dvH)w9MnIq6 8wg)};W \߼9ݼLJ/PK*PKK>;OSGI-OPT/src/javax/swing/plaf/metal/MetalDesktopIconUI.javaer0Sp in-'h653QFTI0޽+p3dK~v.;isz,oR)Sax?|? tBvULy ZUEH wZ};OSGI-OPT/src/javax/swing/plaf/metal/MetalFileChooserUI.javaWMsF=/'"[Iowk+ 50F=KF؎T|H~qa˕/4EB$RdO]oÌ- Р^c31Y !ED'=H{<68u Ub P$ i`!0 3TW6Ү8 3/[ArZ A؊t6l6(J/5l@+,Ac@㟅Ԕ| "'VDl@iK*flv#42L,r^F9Ru*(ai|_:lLg!Lg0NFtBW |ƓQJFq&לє\NEQ29Fr!#J-[bTke9Tn!1$2V^^P1W7'bhE2Ŝ Q"@s0\)ESw= ,f ##?wV#Q"vҹ:U7AĬ[9BD2! plY+(]{3;3kOJλпP1&O?rVwL)HӰ u@=^X/юH+ORh ɀ.SϮgV`ܳ"IE1)4zO9WdCz9=3P6;u?3d5oH 1IvnZXU|9^_)8ujZ$&nm_;eZެ:PKN6PKK>9OSGI-OPT/src/javax/swing/plaf/metal/MetalIconFactory.javaQoFǟO19qKJ=` Dcz](߽B&JCoXQBB=:/g2BZ@;eH#4{Dp>P!1j3?cY4J‰ׂ 8Z-brH$7pfHJZgEqJۊ&Q82< fW˟ٗf( =M5~9gH+)W5e4"=G_wH0~9\ku$tWI5?u^gSuw|2G P3S4trcQ 8ק RUv04D(8Ƴ< wV&5KvnEny8fFīńuxE[Vz(T):ͭUJSonf!Ok(# esDOSGI-OPT/src/javax/swing/plaf/metal/MetalInternalFrameTitlePane.java}SMs0=׿bd56 &世P+$UqL{W0yz'{p :\Lk R _^0H36TIn ZW 2_I~h8MЍN{"԰-hB*zdH ¬m+aӲD%r2 Ñ,@Њ=`4M;ũqˁc6_NϬ׊GjqJ`Z6`U7N}fti*郓eB{jdEγ"/!Lfd_0x:t»+&=\82COE,S8ёK\H%livZxVFɵ vwApο#/SJEjغ=OSGI-OPT/src/javax/swing/plaf/metal/MetalInternalFrameUI.java}As0jhn 'm LɩQ+$UqL{Wd{$޳g ؝:@W`V|)%Q pK6c9yr[ZEn i ^&, '}NK<B7tڣNo%v @'֐VRУ @jfc[F~NI0e@.GnZzCA4)S㪁:M>L{n"Z:v\-S ,UaV,H8*4(,Nu8 텑pl̊G|yvl>Ϧ|Rl*_)!>|zx=Z0q"D'+s@\ItUcEP-9͎HgeQr#_q I8_Q'n1 KV*P@5Jl]r 2淸#Q];]P"{w֙@"&#XZp(/~f7b2ǿǓݰ怺)큮^87t`+7-_P;3^Gl(ܢ[/Ks$PK@PKK>5OSGI-OPT/src/javax/swing/plaf/metal/MetalLabelUI.javaur0Sp in-'-53QFTIa2{Wd`2Aiەn`faG, HLqdi ~VA`BpT+hU!5ӯ7Z'x h,;Z!B"GA(zgzNNHХg$g`hW_ m7_뺘cmD.Ydy^?uQZag%Jց:PwVx18]Y 6pފWC{a/46`Kl}YCZ:\lgl+#1 a[ g$gZpjM5-kG#0hw…kuX)v3:zW(Do0)vYF:ޡgry0+Qn2b*6dN./胱#tS1L s){|FU+T\Er/U?^gvl-*PS8F(PK2PKK>9OSGI-OPT/src/javax/swing/plaf/metal/MetalLookAndFeel.javaAs:Stx&ɁzBfzEH$0~a оD`~Ү.WFs ')p],a{ZE,"\ bЀ#%նt;+9'mمGt T!,B"=ҁPl͛yZW?Z9F (_kE7s^5#m\5J!%Z0"imi6 Ut̠d:#f3mB@1'q Izq]M7S'x4MRO? i2ѿ!ģ% d̓L\_EH$z-ɖE.8^QhjI`1R,c9uw/[քJhɋNYO̯ܵwʆ;T==cVw?t޴Ǩ3x_@F;psVI7= # ZjsЕEZ9G9m`a4 (P/f|KI+3Z K,u`~G~)} MT_)mݦ9!1Hρ6 'jBle }E>)F)%jʆ4vQ:"9]>۶#ȡ .j̞t9 IN,1Ě >]YKJASnYTW#L4xLJrԑK[rVcR_gB* YnY;do…_B6 ةp_>4t]jӼ9LkL#G=~hoLZ<>.R*OچռaN7PKݎYPKK>7OSGI-OPT/src/javax/swing/plaf/metal/MetalMenuBarUI.javaer0Sp in-'Ch6 (kVH$c ) >#קoN"6+ꍇ>"& R0ѧ!yeX%:;,c"ȣШ- BjW3_h Cm8J{hC8D=GA(zk:V鞎Lc33:`hV]Nl7_mۘcmD.y̦y>HݩXK`8+UV[=ukӕoŀ)Vj?G*2@mc ziYރIg0@zrW,Cs}t?ZFPiWJg%gJp*M jC"0h…H )3Z+\DOf;]KHV[L#OSX{BL]gdQl$ӯчv2N '<ԏEXr EoPKiPKK>BOSGI-OPT/src/javax/swing/plaf/metal/MetalPopupMenuSeparatorUI.javauAs0jZN.I[`h&E^FR%d]!Hz{+'W\LP`^|6D%דɇ1(۰J rdwTL;)H9*U%YԠO2_d ` FӀ8x=!T! A*zkzkSck,G.0.7}z6ޛOIu]'DZuҜ.fyq]U+Րs`o+-'^ f v-`mϼ;+T|[n/<6T0H Ȋ|NC6_-!],|0_ldl #1ؐm0-BABϖ!!+)8[ j#8[µ:6XL#ң?m%Qs@quMU%42 Ay~jӚ{RmA-zmWJ&>^꟢w=MpOpg Q3"+,'T}V$`-*PmLPK2 :PKK>;OSGI-OPT/src/javax/swing/plaf/metal/MetalProgressBarUI.javaAs0jHn-'Cm  ȋQk$U1Lޕf`hoKo}UW0`e=eAf8? t0'GvGȳy*!H ;}NI&B7:V7 `PCZdA2}đq&`2zYXWKΐk)x4UTXzGVD`n `0JY+4D3~dְb}|olp qX 6EPK^X%%PKK>;OSGI-OPT/src/javax/swing/plaf/metal/MetalRadioButtonUI.javaSr0<_dHZ)`Ll ɕq '4N:?vW" zT$̲ 0{90y@zG"f r$4@DHj!qX7t^Y9,uz %hݵ$? mb8=n4~ˮ;{pQ5"gZ`! [Hޖ AP:)G $4UY?ܧO'y2]0M'"M|I> WcBBS Bi|RJr4S5BDP[)ճ"hR$h7:6D#}kZ2^! =&>Aj6\^5Dܥ d|M, mZ,ZVsH.:]`dEy8OSGI-OPT/src/javax/swing/plaf/metal/MetalRootPaneUI.javaer0Sp in-'m QFTI0޽+p3 _];fh6|⋀TJGN&@Q!I9:;b"ȃVЪ - BjW3h n C`o FӀ8J{hC8D=GA(zkzN鞞Lg33:`hV_^l7뺘cmD.yfE1OX K`8+UX=ugӵŀVӴTe bwiyV_[e>Cx~ H-{pol4Eh+BFg%gZp*M5-kC"0h…H )3Z+\Dwb;]GHV[LN#ӖO揰kuFU ߅"q#x#n`ͯ3B -2^&`$`-*PS8F( PKRFplPKK>9OSGI-OPT/src/javax/swing/plaf/metal/MetalScrollBarUI.javaTn0}^'X`}[m.TS87ؙ퐢"X7&=>\˃N`˭˕.,I)Sh 2=- !1xQY̡R9p+dڝ>|GcVpvy`Ͷ"q ıt p.[ip朖+CgQAI̵ʹl0:dP@vpOI:H۪;%Z0g[`%,#ՠ AsګpB-`ujf:#(6Gi=}->ϣdOSa2KE:OSGI-OPT/src/javax/swing/plaf/metal/MetalScrollButton.javaAs0W 2.vsks"N2M45V+KTƞ{W6$k9>}E L{xUEU"SJ ]aˠtX#:e`r/+Ҏjt& !d3񓬓F2"Ѱ4Jt؊tXKE}EԨ̶z7}@Ô^\pAˣk!Od}*NĩDnrnG"`O'-w\ ZDɬJ0kJ/u33k K[YvMhMhy1uV882އ 0 qO9#*N4j-٭tXFɭŸ6D;;O]Vi:ݒ*jDcsEeRם=ڽ//UzޙчW,N_E7.FcaT>el)_+XgGYM0%Y)k_;#k8w| χiį:ctPKJn+PKK>:OSGI-OPT/src/javax/swing/plaf/metal/MetalScrollPaneUI.javaAs0jhnmNI[)d0i&ǵBR%d߻' e`߾,3s^̊O2$jA? i܆yTz'*eBHASAXd!|'p7i`;&@R* aֶʰ( #dO@<2C[b)8ё9X\Jt`MP 9͉[Kճ*b\ˀau+6% g nS2* 6%B-nQ]ʟH/1y!O`<@";bӒPvgҜH8@%E|9 Ӡ.饹s'WM:}V}yQ-6FVq'-c֟/$ PK<PPKK>9OSGI-OPT/src/javax/swing/plaf/metal/MetalSeparatorUI.javaer0Sp in-'m 3q-Z#dx͐<~}v&isz,/Ҧv20? t"GvOēyZU%H ~;cII60`4 naPCA%zd6OSGI-OPT/src/javax/swing/plaf/metal/MetalSliderUI.javaTn@=qҢ C=,FNdRl7oF*k:Q7#!8Bb0z5, 18P!1j)(c=/=p%@vw(*-ۃTr l@3 \BYm6-ujjZFpF6M 0[.K_JǞI_TXӟ<| uZ 44ɹ=\E,$4D#}ʹ.4\&=0jc XZo(6&= p9 Hnbr9I%+/th~7H>fu@6"6d2GԚLr $jZRGrj`hrl/'o(Gأg 26-V'D] 8Q}2oQ4dGޥZgV#aVg12z/k[i5Nt:{npD칄N3j|Jfʅ=<_ɒ>KTIzc%h1AbU烊P)yRʔ~(/Aw4Jmа&3MDhZ[Fy5=XP1 4NP 2;,&8W.ߘvJʑFf8_czK͵,EHٕk8⶷(T 5#fϭ?PKʵPKK>9OSGI-OPT/src/javax/swing/plaf/metal/MetalSplitPaneUI.javaer0Sp in-'mj2QFTI0޽+p3 _];fh6|⋀TJGN&@Qa rXA*7a^~uB+'0 A5M[ز(uH :7{zJ0瞡K(耡Y}{ӳ|Jbv2myκ!bSk%9*. YqVdh H{^ /T3k1S ([i)d"+򔭾.+xJ4_eK-l-r}4Y~?=76T@"@|P볒3E-85ޡUT[gu$X[?-].J;~Ǯ#Tl$-z&iK'pHGX+?2=].< e%zG GGxwA_gi[d>L}{MIZUZ)pQPKz?oPKK>:OSGI-OPT/src/javax/swing/plaf/metal/MetalTabbedPaneUI.javaUMs0=ǿbPCr2-&(ۋQ+$Wq +p2Yk޾}+AoB39Qt!3 4O;˱ahP/0 x` LQ!9KʴjÕSMhTqQ,Us,rw DJZl]bqJPeg!6D?3kvY>[+b5A?FoIuZ 44-%T%,&4L#rK-Y ڒit4)7V;=hַd"(Z&\'ppG0C4< 'hHo o{8^_P?7[;ߔDM9Z&^^'$nmӟLuH X3;ѱ1POscxG+čK s. |S;n +AS0(h} *%=,4!ӊԭڳ_noU(-u{Qj,8Zd!DVgBK7yт*:ü SjNcY׾,9OSGI-OPT/src/javax/swing/plaf/metal/MetalTextFieldUI.javaeAs0jhn-'mj:QVH$0{W2P|Gڷ>{tL[Qm<g)п? ֏8"(,Сm ςrXBJ7a^]e?:cA+lJ{C8X ;ƃPtZ7{:JpCQRw{i4j6fGDZHnNgY>{OXS K{`\qVWZXej^׭^jN},L)Uh<)%9y<͇.WKxI$[ γt3=A·4{Rdt M<}E,ɒ3ZpMU5*ݠU4[gud )3<+\4"wb Ů%Tl$[[LN"S'ppĝ(UJ=v ?Rx.)vZDGT}=+av}mZ W4Z`~HH d?*xQPK%WUPKK>3OSGI-OPT/src/javax/swing/plaf/metal/MetalTheme.javas8ǟb'OCM{:\^.dVqaҦTa>j+ozƪj-KEq LWW@\1̝9L"84B)S`%ь Ԇ+ E3tqy[UBζ 1`aKHT^4*n: ) C--#sF 7fkmmpXUUjŁP<ۚp|7ޒfB 44WrM/ R%iei*r FI/K{Fr}߀$\" Ea4p0~?[0G8`6l: p6_0~dH!u]8w" +,O5,C$@sՐaϹe~/аף8?:пlÞS*([9Z&nzEx[RXb!~ts/oB;Q<XI &Xn+/ X)(7L_՘BX !Uj (IPfV{1ӊh K!nNF%4\+[ſ + 05KU ȍ'\ JyBy [O}{TȚycX*)R c vو.hk,ްQTFT<OSGI-OPT/src/javax/swing/plaf/metal/MetalToggleButtonUI.javaSMs0=׿bdHZ)`L6jJk& (%N|GO=I`lSՒ+{0>+HVHp<~š 0GnE ZI4 hLhB҇輲!tsXFbcX KxdT%ʀ Us` Jas P<ݷ$? mb8=4|Ϫ]7Fw;7 jV%EZh:C^#TN2U-M<97()c:Iiց$K~ M_f7 MdH/3a G}BS %*dkjDP5:ÎFR>gEjHЮWhE@S}[k-x$(j [U/"knR@h ^"OZw2bR7OSGI-OPT/src/javax/swing/plaf/metal/MetalToolBarUI.javar0Sp2jhn-'i6 &(Q#$Wq ޕqhfƖw_w.F+!,"`$`#c70hl0H\ b Jр[! yӃh Σ>Ӽt^bKX-(HB&$>p,\nUiT< 5z3J()ks t[9W|XMi>4|OM֍h-] C/ lIU sSWF8X2Έe鞘ZomLAg@tbIϋƋ܎t_&0x6ċx60x:eT ; LO'#T^!4:ZX?VKb-sQ_P?{/mCd+ ɲhaPKdï-DP8wɬх~ rbKo!heT+Ѝ;/sPZb˄]xgM4oz]#<U52af%7<UJ\K6K?/q__/bpE92Ȕ=Wtjvd2D]iT=';bǃY+WNlCD^"hE71,e݅hi]PK)PKK>7OSGI-OPT/src/javax/swing/plaf/metal/MetalToolTipUI.javamAs0Wp 5$!i6Lq-Z!a2]Kɤ>c齷߮4̌;Y  R \M&#aamL8!KAS .AX pL`n?ƈi`{&@3J* a6CkeXt) Sd9_u. Y`?m&x Nlv;o3uzЊGbhJ` [0v{D u=oТSJ,jhs 5i+xLtnsX,adl1ϐΟ[6ȸ0<"D*sD򖄬t`MP-9%>g2(aM_и9A?qķXUjڳM1ǵ1j%Ctz R$O{ׅURJe tM%9[>z]|0gxnehҁ # sד&1Qh(5SJ# R!H`qqgx{ '?ҟ9dY>wV4OSGI-OPT/src/javax/swing/plaf/metal/MetalTreeUI.javauAs0jHzjs"&n)`Lky JJ2f߻!o}ؽu<0RJK6,Â<-);D=P5Ȣ?yi4\CFA=԰=hC%R0ۢ52}ZH)[u. -~ I@x2'׊GjxbhJ` 0pςԍAUBM)}pë2 5tF9dyGyC/aXfl|&[f}e>G}hg]1exB[GӫW+%y"6k XF%72`8l+6$ 3=wo* tCUb1ǽ%y1z ]z)lɻ̠ۃgxӑݘgFl$a窯'l P; V ^3D%$LIS){E4F΋'֝|^(⫗~j!LOvQ]"]]V3 Z˄;oFE8d&Z v"I^PKy?bePKK>3OSGI-OPT/src/javax/swing/plaf/metal/OceanTheme.javauQo0ǟɧOT7Sh DFj:=%5$fմι b"ξw$Wdes3gmP%azXgqX6d:lɑ=R3!@neIQ^UdԈ?:!a2nMf7q=:q#fHZz,xHRwfT?)#Cte"{!Ia8ֶIKKnzS߲XuZr~raRٵh,zKta)`*鼕޿GneM(LY1ǴȊyg/vnvٺ@2߬]o8tf5z46t2r(^) %^4F*l']VǂU^?}(9 (c70*6㎼ho"y([yIBԅբo\ 7#/e:=GoPKjzPKIG@$OSGI-OPT/src/javax/swing/plaf/multi/PKPKK>6OSGI-OPT/src/javax/swing/plaf/multi/MultiButtonUI.java}Rn1=wb "ZNۦ $QT`̰5k٠(1lQU+ϼy.2u;5AW`Z}RPh]22 -.sfH$J h?m胲.!tӶ:Qc b@PVJ#DG HqFzeIJ  <OSGI-OPT/src/javax/swing/plaf/multi/MultiColorChooserUI.java}Ro0>/'Xz[9emٺ hUM;%x3g;T2Dj9$\EpmVk}>YI@*`#GwCA0HsthXHG射FhR8}!ܣuB+G^^7a{PC8JHq47 >t, 8OSGI-OPT/src/javax/swing/plaf/multi/MultiComboBoxUI.java]o0_qL,m\Qn:mUMp؞?1d~X_?}=x[h^zR 8Bt8<Ҹ t0GveJ*т_" 4;}AVpvEVX-(!8$pP ƃPʴᗻ:-%: H耡Yu,[ӻo04MTz Z7&nO]+΁AXJ\lrYA^%k@[`E:nB}p 1pފ"GM둢 mLAgCwlgy?Bnŧnx.ra2gl6%w%eT7dSvorG* rQ NTXP5ZE] Ց2bX nYXh$_&u R#YbPP?KF6Ƶ^Lo3Q#}XEa -P ܈"O]_,fB;OSGI-OPT/src/javax/swing/plaf/multi/MultiDesktopIconUI.java}RM0=7b V4{k9@۴[jU`IpخЊ1Dly}Ep#mVTk]ރYY@*`#tw}}/e9:[,bb$rX@ ah t^uz@5lP;$wi5¯:-Kp-^yFpF N%oMC4MX*'KdOޒk$:R!Wȫd h Hw^׍^NaM!bUH/46Y$Olt>Ollt-ٔN >÷l:HwƆdSq^r+ >Yr(hYP-ZEՑ"Hc&WJ~-Ů!HVƛZz1Lyl~1MƵZf*m55zc6#([-ܐ'[n^g ~IPyGD}=#` ZUj)p8KOv!PKk&PKK>;OSGI-OPT/src/javax/swing/plaf/multi/MultiDesktopPaneUI.java}RM0=7b V4{k9@۴[Xժ8ற]!cH"`7c&iZ{R)S{;{q(< ѡbC jUFH 㴵7}x@Vpa!qh<\oLk~}iYxj933j0t*_[{o>$I41;:yº.M-nJs`w-,%^rيJր*tupXᅪtf1y+V_5t<1[|-tMra4E6'M}@ؐl0+Bxa'K MU5*E(³:2X)63,] BIќ/e5DxSK/W4O6F쵹g % w {=0€k/d@V 7$IZۃ8B(~-9_R+TECk3E_[r iwPK<PKK>;OSGI-OPT/src/javax/swing/plaf/multi/MultiFileChooserUI.javaTKo@>׿b "jHn-'m aY3uw;kKxx1;K*+|c(]8 OQP~n_7??4B C0Df<ITgPp (;M܄m{@mUkti5|SL#ru}^;?xql뗆[Å=ljlPK:HPKK>=OSGI-OPT/src/javax/swing/plaf/multi/MultiInternalFrameUI.java}Ro0>/'Xz8eݲuA"Ъv0Kflv3dj9$\EpmvV+}>iI@*`#GwCA0 H3th7XHG射FhR8}!ZrhnXP ZE] Ց2H"WJz~ Ʈ%HVFz1L>KF6Y5OSGI-OPT/src/javax/swing/plaf/multi/MultiLabelUI.java}0S8&to-m-HvzpIpklvhŻw YĊ9$?3Nr L[Q=g)п q"(,Сb!@G射FhR8}:#AK6lJ{hC8DGA(zc:kcSЅg$gT`T] Y{o>$I۶1;:yҺ>Lg-VJs`O#,M\rYA^%kA[`Ey\Vx!8]Y R8oEWK{H_ hmLA/!{1ͳ| |tHgl|.[f>A:{onH+>36L@6EX!G|e'K 4V#zVD`n `0Rlg+4J;~-Ů%Tl$M#G)h%#C(WyJw]"x=򰶠/d@nL3sa~fB?V<GT}=+`(`-*Pc8['H_EPK d;PKK>4OSGI-OPT/src/javax/swing/plaf/multi/MultiListUI.javar0@Wp 5$C-d2XZ!a2!ɤ)ckWo߮; ;e&GJоϻ@waʙmq!#%x\Bi BHk"]A5p & %l Pz$RwʀQTXu ]ð (]ІV B#]!{bQ=}Q:goɺ57KDAVR,U ;Xl]9ɻ*T!cex4iMh%Y .,ͺ Mg&&i2L0Y:Hw%_uidTwHS8#=(Z)I9Bn u|jҳP/hοSl.BU)uP(4OZW^0)4K|c<4Nˠt|C MlǐgȐn5ht(Ӭ gP:zB<%5+ݜ45˚5Kש~;?]RԷGrs7#+~UdN gfS{bgCPKMgZPKK>9OSGI-OPT/src/javax/swing/plaf/multi/MultiLookAndFeel.javaAS0)a\'pk9 n3'0LE^;*Jr * vӷO(#k^yLR)S2@IXYt0CveBBpTKhT !5ӫp $A?4Rop,v5ہ!TB" p6Z+jOHKϨW{q8l6a{Dz({"{T %9&^lI-"ռԭ^:+2[lAhi SK Ȋ|JU62]*|0xOy6e$h& L?E(*} rQ Na5B7hMZp`#ZxK  r F؆mגUb$u#8L7OSGI-OPT/src/javax/swing/plaf/multi/MultiMenuBarUI.java}RM0=7b V4н,mVU ]Њ1Dy͛ӻI쬨VڼLJGh@4a&npC$y@ ~t 6C;ZMDf;PCpHRHr4צV :iXxi8330tZFYyo>zu]8ն#(GoIu35SxfHgs*Y ,R먺 Uu饯H[1"?9bc ZY yقn$yΧdz)>BV׼RdF$S8%⅄>JrX NTXP ZE] ՑEb-<ҕ$Hm6u5QFeҋAbœ.|GTYN= yM=]ĥ >Q<8$owph_o*O˸EfQ_N0ۏ} Trӊq׵AOPK$Z bPKK>8OSGI-OPT/src/javax/swing/plaf/multi/MultiMenuItemUI.java}RMo@=׿b "jN.$ em~`P,4U}3o޼UW0foE=R 8Bz0xz辰 t0Cv"ɝ Zk0NӇNhi[0Ru ۃC*!px ޘVZ#eJKhЩdY4);*N3yº'-nJs`W/ lIZ%k@[`EyU7Vx>8]Y4+_G#YPlLA'/(;!/IblOŸ Fm1/:}|_m"=36: "yE(_HI3E%8YSu`5Bh9v#\VGWFK|EYP?#e5DɪtĄ% \2ykBq(HGr/0cGË4x!* ܐ%w{ 8]_/џ*O۸Ef/Q_2;} Trq5uApHPK#l$PKK>:OSGI-OPT/src/javax/swing/plaf/multi/MultiOptionPaneUI.java_o0şOqT,mq4Wi) < z|kz[zo MӤl8նȽ n~MSwJs`W/6 lA^%k@[`E:nB}p 1pފE'HяTS ȋϊGC>4C6ey~]t* }l_U*9dlL@6Es@%adY*t8bU<MAE棩!ſ3TxKoߡFz %8T\&3ydf&$ PK}B޽GdPKK>5OSGI-OPT/src/javax/swing/plaf/multi/MultiPanelUI.java}Qo0ǟOq *mEV ![|-iȦ07"ti߲fH+>36L@6EX@|a'K 4V#zVD`n `0Rlgz5WhDwb[]KHVśFz1L}l~;P.3Qu)zcڂ*n=hF1 NKpOps΅6B9OSGI-OPT/src/javax/swing/plaf/multi/MultiPopupMenuUI.java}RK0>7b V4{k9,mBE`W ]?hRv3|q`ފz{0-? ȥLq`~Kcf`"ɭVT!7ӧZu:ntV7{`8h<\oLk~}iYxl9330tZ]Y{oeY4);:N3yº'5nJs`W/ lI^%k@[`Ey]7Vx>8 i*-G~ 1,~$y(柦93M'7żN#|)&7}@Zؘl-BJ,9\hFD`n`i"Wʒ3`[K]CTlnb}lWmC*r2V{q}/dzO$@Ops8܈~FPyGD}>#` Z*PA!j$PK`[PKK>;OSGI-OPT/src/javax/swing/plaf/multi/MultiProgressBarUI.java}RM0=7b V4{k9eYڦŠVUƙvmV!E `7c&iZyLOR)S{;{q(, С`C yjUBH 㴵7}xBVpav!qh<\Mk~uiYxi933j0t*ρ|k7iV tpklH@6E!GP%gRpUޠU ڵpY,k?r$hοOa5Dx]K/4OohuL1(GUKkX푇l\{!'*PZ!R"NBkZ$-2{rBAk@RaP!}PK2`PKK>8OSGI-OPT/src/javax/swing/plaf/multi/MultiRootPaneUI.java}R0=7_1+нRiJ`WL[cC@+cHۭC"ϼys`ފz0/> HLqhf~;CtC2&@r+8*%4D ~up :A?z]7n`!qh<\oL'~}ӱ%qgg4`T]NY{o%I۶1;*yº6Lg5Js`W#,9^RيJւj:nBCp-hJ? F~ ؘ^Z@V}Zd09OSGI-OPT/src/javax/swing/plaf/multi/MultiScrollBarUI.java}Ro0~^OPm)l@jڃq.=!}g]!~\EpmVk}>YQ@*`#GwCA0HsthXHG射FhR8}:\#@k@ l8$w鬵¯:KpO^yFpFN%L&Iڶqm%dӷ些Z*΁_xfg+*Y -Rີ Uʷb)Vbi:OSGI-OPT/src/javax/swing/plaf/multi/MultiScrollPaneUI.java}RM0=7b V4{k9,mnCE`WL[cC@+{ǐETo8M70foER 8Bv4z3ZPy@:C2&@r/8*%4D ~in 6A?zUo0{AiC*!px ޘZ+ӱ'qgg`T޼Kmcvtk['u}65Js`w#,%^rيJւjtupZᅪt[f1Дy+V_%"+1[|-iȦ0w"ti_nH##MyzE(/,Tda5Bh%v#\xVG@#Fx揥\A("@m.v-QF*4ҋqdddkj)1ˌxTn@=Gy`ƍ2~%k$t%3 p!*Oz"%[fG֢oH9Y@?QPK6bPKK>9OSGI-OPT/src/javax/swing/plaf/multi/MultiSeparatorUI.java}RM0=7b V4{k9,mnD`WL[cC@+{ǐ"T!g޼qn`ފz0+> HLqhf~;C`˘ɽШ-5BjOZ'xu`( ۃ!TB" p1VQc N+hЩ޼Kmcvtk['u}65Js`W#,%^rيJւj:nBCp-hJƿX@kc ziYуi@->͖ xL4_dfslr:}4/Y~7 Ȧ<"/,Tda5Bh%v#\VG@#Fx揥\A("@m.v-QF*4ҋqdddkhe^eF=]O_Wj6OSGI-OPT/src/javax/swing/plaf/multi/MultiSliderUI.java}0S8&to]N)K۴ ժ8خЊwR9$?3Nr L[Q=f')п q<(ѡb!@G射FhR8}:#AK6lJ{hC8DGA(zc:kcs+HΨЩz-;gKmcvtk['uC6-Js`w#,M3䊳ym)upZᅪt[f1`J_,G"+->ϖ xJ4_dfslr:}4Y~?Q& "tP ^Xɒ3E%8ޢU4µ:2X? (= lvk ɪxH/ƑiVOo!VHAeF=]/cGdqㅌ)@5IpjppN0n4P+Tzq#վV}9+`(`-*Pc8[H_EPKa@PKK>7OSGI-OPT/src/javax/swing/plaf/multi/MultiSpinnerUI.java}R0=7_1+нRiA"UՃq&]!1tUsH7o{Nr L[Q=fG)п oq(< ѡbC UFH :Cx@Vp^7a{PC8JHq47 >Xx8330t^NY{o%I۶1;*yº>LbTwSK%9 lEZ%kA[`EyTVx!8]Y 4pފU/BPlLA/- +z>-bHŧr|lZlY~-YNO%!-Bx!'I dM jEµ:X)63,] (lvk*6U^#Ӭ(O̯VeF=]#`(ZU)p8P#}]( PK'SPKK>9OSGI-OPT/src/javax/swing/plaf/multi/MultiSplitPaneUI.javaAo@W8A[ˉ4u@!QTf]chYC) RJ`ݷ߼7FrمI|I0, J"tez)Z4+LB&xITT\0,Nh,iga:^m bJ;,2,T ZbH,wjrySgGN~ 'X.@oۙn~s^P4Cm^U4o\h-Yċ ]I`AAsڻ 9RYV=&! -*i$!F|b![KDI)IJd^QJ4K~ &SВpQ._jqxw֌ B* Ze~,ۼk1t7B +GEx ";`.<##ˍ2jq9iP8Py0}5*@UE1}"crWߗQNEbP=e6`M.4IZ~DsZJf>xIbMj@:7_kKLLW//yưi=ZPK7PKK>:OSGI-OPT/src/javax/swing/plaf/multi/MultiTabbedPaneUI.javaAs0jHn-'$26$ ۋQk$WZcL{Wƥi9Y3`˭`*E^ }w=-C"h֘Lneb-RZ?tڭNo,؂E@M%TU٢ՒMNH >PPZ$*u]!Nkz_e\h-YI'[%S"aBԠ vԵ$UT &L*:*7#~(ڄNCw2øL|AYx4tr鄟n ;OSGI-OPT/src/javax/swing/plaf/multi/MultiTableHeaderUI.java}Ro0>/'Xz8eٺ hUM;%x3g;T2TĴIn"6{+굇>, R0ѻ! 0HsthXHG射FhR8}!t, OE6-`6,,'HgwC@tpglH@6EtP ^Xɒ3E%8ESujZo*JFp Fr$_'۲]ZdUi4+dd[[r2U/a/cG* ظBƏA8I]8#\ů%'Kjʓ 5OSGI-OPT/src/javax/swing/plaf/multi/MultiTableUI.java}R0=7_1+нRiA"UՃq&]!1d+3o޼&h^{̊R)S;Py@:C2&@r/8*%4D ~u 6A?z]7n`!qh<\oL'~}ӱ%qgg4`T]NY{o>$I۶1;*yº>LbTwSK%9 lEZ%kA[`EyTVx!8]Y 4pފU__(6=Y1 $lt>OE6-`6,,'H'wC@d@|%'I dM jEµ:X)63,] (_lvk*6U^#Ӭ(O.3Qz1V{!/d@7&?g8~fB?V<glZ T#jEPK[PKK>4OSGI-OPT/src/javax/swing/plaf/multi/MultiTextUI.javaOs0Sp"jDi?LӃ֖\I0|@$Ms O[58L׊G F'8LN}paRCPh !!*0 ^W4aJs)㴡ar~ԵkA L#yp s#*$-rnEŒ]!gтB`.Ƥ[<V;RExխ+?D]?2XJTkr X挴Թ↋ ZMZk,3;=2R |p:|oZ[wy4mzñ;aA4&E\j Mn)Z}cKrtNVNdZ(ObFvl+3q ݠr&U``C"'37OSGI-OPT/src/javax/swing/plaf/multi/MultiToolBarUI.java}R0=7_1+нu9eYڦ݂D`WL[cC@+cH)9$̛7='F쬨VTJG@8afn!< a*Ђ_!q>7OSGI-OPT/src/javax/swing/plaf/multi/MultiToolTipUI.java}R0=7_1+нRi UՃq&]!1tUsH7o{Nr L[Q=G)п oq(" ,СbC UFH :Cx@Vp^7a{PC8JHq47 >Xx8330t^NY{o%I۶1;*yº>Lg5Js`W#,9^RيJւj:nBCp-hJ_G#Y ؘ^C}g04OSGI-OPT/src/javax/swing/plaf/multi/MultiTreeUI.javaTr0= :ԐZN!:tzb ɕ8L&ޕqR >`$}iם x }ͤP))tFlQ-Ra5BN,bo'!C+K~yiI[8@͍Y;;{m$];qtw~KO#<"ofB I|sbTC#c'ϑ_PKoPKK>8OSGI-OPT/src/javax/swing/plaf/multi/MultiViewportUI.java}R0=7_1+нRiA"jU`Ipklvhſw )bUsH7o{Nr L9XQo<fG)п oq(< ѡaC UAH :CXuB+G^ Ɓز(qHA%$9B[Ikߜt,A P$gJpޡU ڭpZ ,[?^ (lk*6U^#Ӭ)O̯m2#U^_aWj<qㅌWT WpcEv lBV6nyk v̎EXr ˊq5ApPKJPKIG@$OSGI-OPT/src/javax/swing/plaf/synth/PKPKK>2OSGI-OPT/src/javax/swing/plaf/synth/ColorType.javao0ǟ_qS2e$큒C@OC؞mB mӤn<|wƣPB@r3Q CJ)\Dps^0F,Q]!2Cp)CTo0ql`Ͷ 1xSr:i-]Uǐ ˨EDhԶv}Q5(vEƀ_ 4b L-HkZXrV:խ斋jFefɍ|'k 6&de=8(:EM9\iy4 I!LiGIL+8,>xdrg!C|"{IFaK^hjXP jAB!K[fwsF##:a7i 嫚 xYPԌd:*[])`5קwgi2=A ܽ[j:{17>!oW.W}gvWxyIK:仟b߻az< <漫FӾKk{<7PK#F6PKK>/OSGI-OPT/src/javax/swing/plaf/synth/Region.javaMs68UrŹٵ.dPM0]12Zp̝JH JY8{IX06o[mZ8O/FDž#eeB?: !~Ᏸ-y TT;F&+ r.\v8;.%3{lapXg9򪅬|isLQZ&3qA%Zk#m?'n}NYo&o3񉋃.>^(r4PY-FzVRle lSskKڬ،)\bն픣Ap" LQD,I|G1,Q &8KĄu( $EɄj9f&yE8擄.)5Ou-pؔ/.ĈsimDgYڽ4FH셽:N*gky+ڧQ]zBF.\6FuVi~pe2]1 O>E[$[̦=_ɐ#m.? -m'^tl@v IUdC9 n])'-)ڂ'yЧ43t*P>O41aSԞn&A!F_{Ɔ6?̈CFʆII֏e}?4C4_:O6B&Kxt9d-<b2-dqgŊ90OFkfsk$uuT>\w.|SDm-_r C12笐 a6`\yN}PK\ m ZPKK>7OSGI-OPT/src/javax/swing/plaf/synth/SynthConstants.java}A0WrJV)$Qj&EBɮT9d n +R8<3ލ70A̾Rp! gt 8rmKjHP:%+J;h=_>PiQIZ`o Fs+q83@4\xʰ6 $dա>uOF5pNjZ/A7={cO׶;n [ b[rݟhxM2%%oR g*UYAWiB+(m̫О=/K B6;llEkIO?JÀA"aVGOpF1 EF}T+;6-C|e!.tEFɢBQQIjTj228MWo.sɏꖤܺ乫Nl)OΠ9]6I.\H^ ;߬S 2n,p gjzZŋ +ܷCX = E ,Xn$qPK&PKK>5OSGI-OPT/src/javax/swing/plaf/synth/SynthContext.javaRr0=_d\CS%uLQŨ5+&ÿge\%v߾}oWWrodvf=LqQH2Bf0ȇ1HY2[ZFIdFZ[Rdi3!R+Dt=Ӧ: %+YhQ 2)[itO '.ZͳvuFqM/XۿKFI:~˪۪{U0/%Ă6!9UF:V\- yE^ F~ N"I;Izdez?C<œy2N1a4&d:'ēG|K&!G}hWeJ?GILdT^-ŎPHjYr#pM/_Q?x?=LXEvzՂ牬,3VvO6y}%ъVAxK4_G\_4MR2&m6zx'1N/1*p*`S  ѯak oiPKFG;PKK>;OSGI-OPT/src/javax/swing/plaf/synth/SynthGraphicsUtils.javaݖS@ǟ_84'2Udmwu߻bDEGy滟XhnT`qPj~!A'HHj;unfjF5ñ V|ǐ1*0!B'>|C)鴠fEZߵ8X Y4L(BӤ@ȄyBŒyt7$|5YMa |j6,sDN*hF\۞uΑ)NҵsѧTrҟL -|-~U8As5 ]5Cis+XWtCvTm)n Ex3ca[nk_ Z ߑsZvtUPK e PKK>9OSGI-OPT/src/javax/swing/plaf/synth/SynthLookAndFeel.javaUr0=D:TtqnL^#dCIhh)cY޾};zJZ O<\&n t}{cH chV2b$CB!S4 ;m %uVSUKCXoD-u-nQY9q дwpNtʲdR̔:6vaoŃ7FMeւ0Tl \HkKPxfK#Y4ΈYvJ ۸fC7"øItWxDph Q'(%5| ~,0W[IVc""dV !S+4*f)o%R8GuDF|D?2[93nqŌ$$3φJ2DICC[ ݏk SN6۷^xrHܣc$J7 !1N~ԗ]zZ0d٥(d1u,&FhYаRDėx Uk3?ijG'5%niE,Ŝ-5OSGI-OPT/src/javax/swing/plaf/synth/SynthPainter.java͛r6FSΨYɲhJQ'K(hO&@hjO. "sǃW=zE#WN3o H9^'ϳ(,yҜ[n6<|F<ȸ!4,5}ȍN'7!ă*iPJ} ai)$'~rH*VQ }c19_Ӳ!1WCoV"%rLFgO]C!d0bS,U pΩ@]Dɪ!L&3")݁=?^+d$>aު>jmHuCcTuY:K(wmhr|{Gf[ԈU.zk^Ԇ~hСuѴ~mZ5߷XߡRB"+9>Beoݥ a5 ĘʌVJV :Q`oa;$:Ui39˄{P֦c-"R[t ޔr`5_a(NkG: > bUdq oqvbw` c͘-($r s j~Сen b)2G ws#0e֐&h=EQ`k"i)n0=29{c!$fa@נ@x $<-([S64g54A:%csOY?6?cuWtGY`_%Vܦw6p >#RyOh_`R`tGtDRaq^jw bwPtT:e?:^g\Ǚ[ H SH a| 3 R}PKIRPKK>3OSGI-OPT/src/javax/swing/plaf/synth/SynthStyle.javaUKs0>_ 2ԐZNY/5}R9, r[$ n!D-t-n^(^ *vm4J7Zt;?wEQT(uEk7r]~$[)Z0sC0MV PXf֜ YJ] z8wK#Y 1 AaԄAFrNop7Lixx"`0H)#|; ܧ"D$d5&< YY2L-Hr͂[_VKgFw̕S;:OSGI-OPT/src/javax/swing/plaf/synth/SynthStyleFactory.javauAs0x 2!9n30cfrf1jJ2Ɠ ܔLZlKՎ/"\`Mge#,i]KJj2$l#J=&ȝ,I9ZQk[BjDɟ>;Y'U20}h0N7؉J{4!6&С$!J3V1OO N3 >`x9Bzo>m&8Ѷ'eټg{Us+^u]b^kB[Ǽ[+TU 7f-rWMK?pۄ -|J![~Y/y:_f&[f9n- n硃)C;O蕅>YrJ%FTJ*Np ;?n+$Gg{qH\˨bNudbGY [`ỚnySOѻ^&6 x3 @E3<~iEc/$'* 9k.y7PKNZGePKIG@OSGI-OPT/src/javax/swing/table/PKPKK>6OSGI-OPT/src/javax/swing/table/AbstractTableModel.javao0ǟ_q)L,оmT2`[$=w)u]5B}{?W@dwGmۖa, LР^bAx` LQ] 9K҆ Ԇ+ ~;޷WVW]K\5%jOi/z伖yk-bx ,M-6X0,V-KKB}%LVߵƏh\'J͌ƶG!Q \P@z*' eSvU w3/s}YEBsoZS]wن,= ;EX!tМ*, 0CsmQx@q<OSGI-OPT/src/javax/swing/table/DefaultTableCellRenderer.javaur0Sp+hZNIZ$e6JJ2ݻ pv$8.F+l䛀HJU?>@_OgZE%#/r#2TP%p+=Hwh >ׅz | J;, OLnT< *&egS]C4}2Q|*w@·EHr"3B7h9ZX^Fp5S'|aPyGO$Ŝo8(Z Dx9[l,8zG?nxkT2YFp)x(;u {tue2|U{?ݪR(S]< ^h?ܡZ Uc̓ҵ*ێ{So!tyMy؄V.GGQtÒj-N6ΏFC8M֧gOgUFQ36ZPGqYa^PKPKK>;OSGI-OPT/src/javax/swing/table/DefaultTableColumnModel.javaQ6ǟ˧ع'.C [P4LN.NR! G3]YldoWۯ *h>_XhƷ03#4v:oZ@ c8K4WDy`LP] RO҂O Wh:b$6*%ۀT2 ̸@S \Biv)T |)422gݬlv{^,'5a0 (͸`)QlJAi`sf^kn]3N&j>lh[FJl@ecnz! ÖyF#xM&Q40@ G-@*T r]0Sɤ)59aV%e)%7n[ &NF%揎rڍ's`$XWn#ͦTJ#L-ȖOȱqISdiERPny5gZظ"y(0vU dpK%Oګca4pﯻe/ּ$s.+SX<5&Xt/mֹR y"D;[{sT,~'v |[4DؙO%7ieӝܿ=_󸾇0[ӊ%52Շyvm%LnU1( $ Lߎ'}C&Ni8l ._\sWmZo5G[ /ymr&;ʤ-o|tHC9܄o|~>X团cגhy{;áXv1aO̖ե u.+'5OSGI-OPT/src/javax/swing/table/DefaultTableModel.javaUr0]Êd!ٵ\)`LӅ/D\Iơ{lBM+iX{KNkp ],5ZhD'0 pLFv saFhP/0H\R{',՛&\6\I8pU$*9[TR L@ \BZmgJCM,#8#BBw2]?&[,<;D5zźS)XB"6!e4Fzgsin5͘F'sc5vhO)2$0N:^80Aw8`8n[05d2 ܕ"dGl0S Ԓ2VCc'#[fG\VFu؂{&#)ϺujI:RB$9ᔥŽݫ*FA-T?r v-W^3zKr]=R" &>O eťYT7NaK MX]T #ܤx~| v c`qX˵rʋ iTF*ޡj6nOm/iX4TK'_$firW6JvZOzUPAPn2Hѷ;yGNI킖NQ6S}y}u&1s čь :=w(׫h|6d6'pO5orR&^Mzi_|{I]s\/&V PKQw PKK>0OSGI-OPT/src/javax/swing/table/JTableHeader.javaX]W8}n~BkhvyJlݥczؓDJ2w`'4hf<XeO1s Lޝ8p9KHy` LQ] 2ПjQ$` sGrX'Bn8`fKH2]T,N |822gi4f+jBqT:_ė u'\'`Jؔ 5ҞUNJshRnܶVk$כ6&hCQ'k8x{7(Ln#\`t o.N)dt>fy@2 gy#$T)dO59aPK2Knܵ:2[,m: (9{ ̊w>)Hᧉ[,-d[i>)!Di WpIj $%rS0eb猕ȗJQ\SQҡ?o2,&JQ/LkL=/Ogrp%#)MuEBl>;پ52z6*c 8AX^$7 :`+[ekPQ4hJ dH& U+w6fL]LG{ Ke+,vb_4ljf7/kϽyQ"{싆qI+{z=Gc ´o#vuyJ Uf9vACe[2:u)x0E { Sg֠<ܜٶYƀPH51-Z8jR}[ijTt=}R+LwXcMۣ RzV ݧ,{W"=+)-~V7*&[:u|fzxASR$TQDYR vͶ)?_8c ;p?3 Ioumr,Od7YS!.yW+u1UEOmܝhYn p@h ;a{d߸W 6 .twa p]"EIs-g(|z6jN 4Œj߰1?omf}b`k}eYW(/=tU?Zv@(7$p֛>PKEPKK>3OSGI-OPT/src/javax/swing/table/TableCellEditor.javaeS@=Wtl!E٨TA֭=АY 4!)V`ׯƃXdd# HBr~_. CZТ9`0#%*BC:QgZ*XfSju'^@i"sH lXbG zMIġ  |]} Aup@m=cmx7IyͪSEk^8XU) ڊiz0j|At4ddӕi5rM(E9 >Fy1~IeYlMi4qD|;-:xeJgy#^IY,5Ah⎠C֍ղѴr/I/W(<#zq T9n/JvԂu5zBU٫_+ @oVx^rK# ,BKra [in;neooPKX?%\PKK>5OSGI-OPT/src/javax/swing/table/TableCellRenderer.javaeRr0=PpD 8(bJؓw= Oo>) =YoLw QHJb>׳Ӑ1B710ɝ,QY@6hmV+>FcV0ed,Mf7LqvY$i JlH޵^gda%8r :RTAQmkaas.^|TUւ44qqђR=h6H5Yuo luF0E#~ ۄICOkǹ$Gz(ˢdrH3Xmӄo%+Nn}@5<ɔl!GP$b)+YhDP=EAf'-_%iN:ԛQy&z{qlOTcn+Jr͡Kl w|0 BFZw9`/$>yPKj:OPKK>/OSGI-OPT/src/javax/swing/table/TableColumn.javaVnH}XdfZ!*jzt{\v4>ն!f`5yHSU+4n+p m ԂЊ"DPk6ׁ~qk-RC,I(4B+f#uxBp4fc[9zITɘZ AHȾk(T*Qlå3DYK.ϝp"VDargH$m}^]u?zP 0|QU/w^a~桙]Hqq3d$jy9S{bQ)k89n "~4q#-:yYWzʁ<$KRFHWktv\Z4t.NdGWj§.b(ÁvtnI"ˍ+Tol悩:__4pBޕ"sC׽p$(nϨإU-m㈷BZ',ÎeӞ+4 (ؠP[B-W?9Qq1EtTfd wV6;]+צzESi/䫥m,nx! '{M9 ۱.fRvi<"\oosSVBUmUBu ՞YkN+8w 6?{3~9p7cnz{m {PK> PKK>4OSGI-OPT/src/javax/swing/table/TableColumnModel.javaSn@=VI{"$h)N)ⰶ'{DgvP"Ğ}{ѹ0Ntm`gg"Fp/!3ϖaaQm0JF O{24.10hgWb'K4Pj$a3Xbu=eJ向agP۪fZgmLr4cbOt5X= &Y8}Nۮ;֠[m*fiXRKҙVu"+S1&(FZ ۘBВ%?[ g2-̮dm$[;!D<$]`W.OSGI-OPT/src/javax/swing/table/TableModel.javaRMs0=_㓝q[N;q[)̀LX$=08=ݷo߾ڃkzy0G_8Bp&sl:ߎ|! $hPoYFjӧόJ̟}j0u;@v qp+.pcmKUUZn])CeQAMS 0ۋɤm[u}ˉc>/tTUR1g5Mդ*gi)gSjn,`ʶL)g=3F@1 0 ӱ#y _%<IDpBdrg~"IX$ScWU#$ML*|!QkqyxdjПn\E@QE;XѲ׭](?~8ͨPKބ<hPKK>2OSGI-OPT/src/javax/swing/table/TableRowSorter.javaAo@x54&U$j F9.`5"{gHw޼"FiDTRнcsdMdJRJedք)JX.!^iK޵ %+YhR R)[Zu3u$xl= n(ou,p-t+CYkwvܾe^d- ፗ{RdB"75=um*ꕫ!oI\V$ߌc (At1JMŗ|Mmt/ٔ>!>k<Aϡ]i)}ϷalI\ɔWSy%rBdoFZ3oSȍt5G/A9FVB[U||AY-9J`…?:Ƒ0atG*/F:7Ti%}9KrS8 V`+L c—V!"'wv 3*V \skx_PK !PKK>8OSGI-OPT/src/javax/swing/table/TableStringConverter.javamRr03OSGI-OPT/src/javax/swing/text/AbstractDocument.javaZs6~.&rC4&M#\˔BHon:X>IЛ߻mm1Bvv%U B=8]$jhA%D4@.[j[*WZN4A 6c·a(VR_]m[kƗW~W\ hNF=>q)f"^rIr*i r9Q0y$3FKul8@)L/Лt0(wzםL٠?E G`MFkH7QOBc89S)_ U~|d_#te)pqf1bQ:Jj E̯-MϷ36z{޾(g;LktØ3z8]1Nd D4Uzb#CD[v|r i`uBK"kXb"Xqh.X$~+k*>1W:'>j;1d3! L`'H+N ?Slqv4"kTv?\j/^|(?! J:dA.r)K9B/mN֐E,˚1cYQGQy742rΠ@ 9$ { ԤobFٹ^,EL2]x7 kEiiGؗ3 >ԦQu"/+tl`)W9us18ߔQV!y/6P4 H4&6,BrX%Ⱦ['zNGpIT^57V" V5QtKq\d!.7fٺ,=CVzNfq&NC2s|v!ġYK87uN-gv_C `?eB"}s8u5]x)IXG\B "hb(ṳ@C(Ir(}(+IMa1KUN0mo4$#V[1S 1L@|Kfp,K;Ri]?AgW&G?5Eb!Z]W.SLnT2$oKξq/\c] dѮϻ}+\Rpĥz8w$fTc v,Pqt(3KNE앑AsH ֌S+&|:4WTZ4('T&0VYGqJЍǩd($"N߁1e[Ps4Sm\[tBd.7ܛr92WҒL~.gb3OR5u7bh`<{jq7/g/1ܼeqb]F=cqn:L1KjRN#fHYKS94lPE6leޤ)h2!KsZdjb!Qͪ~]2 XcSwXFV31+~Oջt'Q7KT_WP0_MQQɋBRWUé55%$UU+ZPK~+PKK>1OSGI-OPT/src/javax/swing/text/AbstractWriter.javaVMH=/4'afO Z@dQCcMgM Tͬ4W^}GYVqQ($%bqΈn$$~R(i0Ҥ\ Cb &bNQk{\zu԰B{qFa}7x]>Hur+ r|mMۘo$O X t+R34L,+\ R HYqtf#ZR).cY5G>+AH&( Ijѣu4LTFBq`}Uǚq(vx-(-‚ݚnd2 5'ͻrأV#K2SPT ؍nZȾyl{ϫ8wHDϓԶz0B]?nO#L*X}4{z{{L?oz֥9W~n?'}{9v>R̆_ޯ΍aF'k-)n 7>-Yxö`|tPK-;v PKK>/OSGI-OPT/src/javax/swing/text/AsyncBoxView.javaWK7>_ѵ'puN'czq˕AAHjk{ZyXg m[tbi`<ġ$۽m cXI Ԩ0 2D,ݛ6<\ xtinvnZ= 4i$ ! nBL p\;jkn2; 97)t̎[9ƁTNeu~4>LW֠ߌ+x͉k BzgeVphY3&(>L!h{z^0]:-ȷ|O&h8h@>)dd7MnSXzJ:Ő<$"c |B%#HQiD00 _qÌ{T4,6^T`pcz4S$!LXsMAuIt/Cf z&U`hci6%-T2]%tsB*=plXq(xrǗOG`ID0j^m񉩮wmd)&栫dJȒ5%S4ٟ$e;tyvjhEeU鞏,Yϕ77 +6JK v%#Lf͸wkO7 Tr]s;c~В?NvNq.qUʼnUYջH8zFZ(JiN |QfkVr#4PKCo-PKK>/OSGI-OPT/src/javax/swing/text/AttributeSet.javaSMs0=׿bd!c\BZO3I39b ɑd 8!|`o߾g8.7F HJ*'h]Na&dɬh2'99)K3Ԍ ATbΟ X}h{@9jub+XvPYbaa.$s*^ZŶOUá3 G.(y5 tpuVqMѓwX;$gMՅd-ታ `ɪrX, ^umsW!O3Unϴ{7OSGI-OPT/src/javax/swing/text/BadLocationException.javamAs0Wθɭ8nԃgi&GKTƞ{V6ɴi>}U+,us6; 6WP9a|3_OOo#J,#!;xIY*Ъ ܞ5"+M8 FCh4Yxnqg(ZbiQʚ@C3usOC`W[!g\y6.=qM5_v$[}d!^d- nwgrcZt21=ugu)uFZinPEl(7y6[*OSGI-OPT/src/javax/swing/text/BoxView.javaTMF=_ѵ'p)k\h[TB 3%k)9Ѩן=x3dPJ*FOCBfIbT(T\"Geh,i` }opQL=Ľ.`+AiE )Iǘ; 浴\V(^ |1 6[4j/s.e4*2@Hlz>ZDW?뽒h- A*k*E ڀoN{ե!Gj3SW &! JړFii .\<z Wpq3`rj~3_.5|j)cG2ɧPE[R}ds)CSBl6zFqDْe,00䄫ND^(vbؒ{7Ś3 ,Ro KP%(OSGI-OPT/src/javax/swing/text/Caret.javar@ Sh89jhnmNIS d0I&Fuwݫ5NƐЩJ4SjgX2 Lk,I !<?AO" S`H e9Z%B\L>mh gBkCs/3kXhðv(`A%n3HCfVUV/>'VYIJVn"(ng\} 꺎TC[ }$qz^۪{]s`ǚL<߁*Ssa-U Ƃ*,J-1,VLN-|` M۔^B"NEٗ 4ϒ&SMƗ,e|KƗ}@L඲~$o!E<@X=0e2.֪@(B" `eJZ+n @|~BFm#WTĸZI1.HbAh)x#Fv%p(; ϑcUqL#_Fk@|Q~*ưyiYzHݙ6r ;țѭU9|eW1%m b Grpw鴒sQk,qmU&Ye<27/'%+~PKٚVdPKK>:OSGI-OPT/src/javax/swing/text/ChangedCharSetException.javauRr0<_ 2!\B[O30I39 ٨1#&ÿ8)L}Fz4 pF[a62!W*# o&21Vi"KfOy ^Nf,hTNnKkWB&cV&z/ FS/q vK!- YQ 2{ktۮO'.PBtmmFsiS3֎|?u*ixfWذJ45H'UµɥuFn.W<%c 8E-N4"~xdblMr,nCG}P?۔>-"%zggKL2TوP=&_eN:ảsF ȶ,9:iP7NY%l)Ť+/r#d|5v,?Kr<^Iqȼ')}`zٔz!T7ύlϻ|Lt PKŇ PKK>0OSGI-OPT/src/javax/swing/text/ComponentView.javaTr0=_θS!44 &d:={mId ɿwedZƒ޾}'0jy̒+Lp08 gAahPo0\ *B)_{jåa4zQ/8w;Y@H Ar^"6Ee HZjnWM)C.-#8E̶Z߯:bH_'dTUDc@㯊krS*eKZVh3+ZsEFGqc5_VEh!bcz$NBGr/>np?GE0OSGI-OPT/src/javax/swing/text/CompositeView.javaVMsF=_l\7uXR9 R Fh3-!T@| 4yuOK-c\37IHt81m9 F 2`yL|fHCTS7; S9REd i nd ZgBR\SX&PK.xAwQ3U_LEሒcMOgf]&h hK͊; Ē&A4)˺ВdQB !-9vқlHo`ߵ ٗ<;]xfsϦ7=ӯٛ~en3m0Mig|# S22KKWX!uʊ CƦ0$r-IPDݨj[ob#)!]+˗$%kAf:+# $̟0 j9Z>$Ɣ`#tLrov ͓s/[hET7J2 - %[Gy;ɵR9Q"03&,G+7tFR=0+Hf4d͝L4 iP* }^d u +okPk[<0,;e͓4HZ79Pa^/K\LQDP3)1r_댗)*\QեG&V[tx|L/ݻ٨zIgTq#ngGȯ |?d4%±mkJj/uUkbPe?~]k%&Pz7}UAc0OSGI-OPT/src/javax/swing/text/DateFormatter.javan@)~dGڜ(5x.Vw,Jܨ*|_L7'#ø`HZ U85V>bÉʈ r' RJ$#$(3DB|'cVMn<[ J;!-&бA*z jt@&xz .h}9|"GTq}ε]:[d=[U&kaW+ O9A4lU ֢6!9;#TU<i8xmBaH>'y򐮿.xHV$[fleƧ[$#<ʸ'`Myȉ.d*V/OSGI-OPT/src/javax/swing/text/DefaultCaret.javaVQs6~.b'O8%Ld]J2ޕm}Xo]PБFpaȻ Y#/[o玝0AjCd}4D*0 7f>WpJsӂ58˗b#X D@09clGeS[sHQ,x102gh^4fr˜fs^;,eH6Ef~7z.5(;"mg3**5#-Ga5ShaĔDrЋ$yOoFwSxp'w8<M3vhH$h|hr+gEK2cZ&,D UDAjɵM&| 3ԛFZt~@؊8zMPӮɌ_0"9KbX8lm 6 \bd Yjz+JI٦}3 Vro<ݸN{\mdgzq43zz Fç^wJ-려!eh\:  {;^Vr8U?^V cWQV U}KϸfSS[RS H~!oJ)v3 [G),Ƞgkj^ULRj)Ds%xPT4aq=I;sGDrTcISʈңpigR ۖkحJa΄^hҖ$u;: hi v:RbaxwtnNvǩc9{BYeǻhg v1~ɞI(؞k/Q@lEuvsoqzo#WSxjڥ8WPK|'3PKK>3OSGI-OPT/src/javax/swing/text/DefaultEditorKit.java͙s6ǟb'OpNf@2en:PH,07߻oIi,lGVJCx s&\狋O];1Ã69D0{уHx@s+kT!>;6βΥAlek!5D!>h\2bW}2f 9׌3tv3Oq;,ؑjy}`4L(| CPgE< +W Bjx+Xv! 3P+>Nr)jJp֟pzWp5 l8ǣl8-G_n8R>(M:Q) w)4a)7E5Ͱg0>_stbڋբ<3?؆8aL(G㋾lќ2 \k&5 /9e#4^+ĠCf!J)w# 6jdę(eDKxR'(kR%I6L]tq,RyqDa;ζz"BtCJ_)dߚE8P>5Ӊl$B~ MXY4ɂ - 7^sDIrOog8{~..Ω"_NCrT\YH\9`vz-SkmXyId:"nY zZ\si3fnQN &(^m9#blQ㈦*{v3_ae>Nnj(lu0Y:)dlGh|'n*n"440IH)h`VnGcVP77VKdݒVn Jf)boڥYu3OSGI-OPT/src/javax/swing/text/DefaultFormatter.javaSr0=jhnm:nI29b ɕd ߻2Nj m2`F}o] :pcUl4zi3_d; o40EzG 䜧( fP 5_P${#蹄nOFdBi89N%jY4*nu)C%Q:#@Ay;mD׿Żᰪ*Պ=y05nPR1g59N6 R Vrʩ4\0jn+dX͓4A#Yo'PۘCw\/ g$h (< fA ZFup]hdr!Fܑ0W[IyJd^!W+ԒAzɍ!|-Ձ/WhP8[bkTDY\ۓNQ&IH#8ggJ/r23;lF3"Z%J{\y1j6:X(,:=Jz}{xAG-  eمVgˢPTOvvʖZ,8GD)4-=A 䊔g3g_@cH^9$Ȉ/TT R<oAƊQ'|=ڵ|~q^g&jq}L|n:OSGI-OPT/src/javax/swing/text/DefaultFormatterFactory.javaݔOo@qڜZ0ibfe]cHYpڐJO3yLo/=8P1w:0J?DRPB5}1Z4KC&x e,P 9BToI}hVszZWkPAedaFWHAe#&7i(^ 7 =u74Y57ܹ]Wu(6CmI|4HkVt*ւv<](YU&UQ3ڐ#UtꙫA:Cv,؄VB}iC΢8J& Fq'|wI ) PK-*j`s PKK>5OSGI-OPT/src/javax/swing/text/DefaultHighlighter.javaVMs0=_ 2Ԑ=LhB@d2R!a2 _f)c[o߾}T pM-5L-2+ !8BV;]?=. 9!8.P !!jSFV*pp%«Ab *[Tb @E.!P(p;Md( gjd3JifS$RƞғXǚjl[beHƀ1h ,"VWPD#YX'[.'0jlXGmÑZ ٘bÇ_ˆ+3 14zNۇ^3{{*$E]D;9SqX)>&'1 L B=ƍ>Q_PP 96g $Y\z!G$Y,5YN8ۥ-ez]DncMgS)^$RM%zM%H9ӵ2< !Mi c!!r54<0i Ϻ󧻋ʶ?e*mҵINI\O9P^DRe [[c.ظΆ=78 y[=p=^g]IF ,pK']G&wiGj8]>r}QjC䒔{#ҁJYb'nvwݘ }L?|>dγ{@U~pǁa81'Ϝ4&UPKOc5 PKK>8OSGI-OPT/src/javax/swing/text/DefaultStyledDocument.javaXmsF~Ŏ? җ6 Ldi zwS{C@j'6B>z{>{ـp-\C;=nry͋vS c#` } -0RC(A1þi(\8mhc "[C$4$ +=5<-ԎE1LSHBLO 0mIZ_V+!0Ug}F]R τKx+MkV $@"°^Iy@^1JK>Mt)hzQ"80pOܖy;0xN=Fc ohHO}OM BFv>M8,X0%g#ע aB (#b LZ L\31thP0@%wԊӈ)E$Ԯ^/Y`W;NwJc%whUo>4^Xʐ0j&=W3 WEΠ$M/b)4z&7&\iv{KgYz*DT)\1GZJ#\*UbR^jK&ۭHˆ/=])\cKGhw٪ҥZe!8y}"$I-s~l4PK =PKK>0OSGI-OPT/src/javax/swing/text/DefaultTextUI.javaeAs0 inm.qf fr\kH$0턩H{dڜlb⛄m%*A0?̀ϓ8&(lȑ}*fB%0 +DQPK o-PKK>+OSGI-OPT/src/javax/swing/text/Document.javaMo@W8[ڢ"0iU=,ljv1U uB>&ޙyw\g[#%A':u[JlAi"kH LpbF zheOH . 㻸j$zEQx$Izik{p 0u]uR ȥ[Sb(@Avԅ$Uc*A'IKF.reڎ[o&mBA`FA׉\柦sg32 |:>?ϣɠ Ȗ>Ɍ1"b]! Cː[SI.D(24+iX-FN&+IʥFV}nZl<[GV/I6ĂK\ZD<,Th:͖pn 54.Uݳ3c::]h+]rDŽ;[X. 3uXNpXS 9Y`DI/6Jgy]˹iàYTSj~PKVPKK>1OSGI-OPT/src/javax/swing/text/DocumentFilter.javaSQo0~^~ʼn'@^>JhHq-ęPsb:TjJCb}wg0Vti;0? L#޹ 1Lm)jTkLB 7c12OPY"qBzж -ju.-Vb[ȥR#a !ca@p*aubÐs(хvD`Ƒ1ŧnՌnM4{bnj BXA8׌U T!Ō+%S\)0FyiLq$ dˡ-q.}.N,0p2fdLk5_dM)M!F< %]  IZ,EHUN@ڶUdb% 3ё.[y &A7+99 ,OSGI-OPT/src/javax/swing/text/EditorKit.javaTMs0=_ 2idpd2Br%C3]َCJ~N@>vQ0TVtiw!pLEUs0uhP1rD3OjÕCoЮCتVl RY 771fXZFqLPs(QAFn"0[.?Kk~Q+{J}QY0Osb]WKƀ9פx͉`( ,H1Bse`L|q$ d#6Qe0{ҟN,GNaNF,';rd$d) Yu"d2$M9KRF-IdWܸ"8W2[r[-fkLAPō=je6', FL Jr[JAWqE9W:P(eOnZjӅ&p_ί,6d.6 oExC0hdue#NY]9˅;X+@\˄"ga~#h.ʢ撚OC%-m39(u;= 'ݐ2-F* {OOqzx:jU[z%g*.I{Ę}SП!-l؅]~˿ PK`PKK>*OSGI-OPT/src/javax/swing/text/Element.javaAs0Wdg\psks2@8(`jAbwen2S>)=Ym P9v6{7~nNia J,Щ !lEΟae X3;hXMAwЈ(MYdi5sl \7K .` -K!ϖ}HkSIkU4_-SUւ_4qv2U.2fEڀ iGIRUS^t6ddUhgFnR 0(0ҩ3y6_ 2OSGI-OPT/src/javax/swing/text/ElementIterator.javaQo0_qT,mm.-EwnMN..$nPءaVl =P8Za]oa<'Ѽ 23^p+;*^e5Fjq17W?c}*)ƾO KC<PKHePKK>,OSGI-OPT/src/javax/swing/text/FieldView.javaur0Sp2jhn-'@i LQȋQ*$WZc&ޕq;I}Gҿ+"N[XaQjhaO6,== VI4 MhVB;=:dq^G[NX#3xX(Zh( }Ϯ;{pV+^ATJ5{բ@lp8EʔvCp0ԺMKpۄ^Csg @ 2i%Ll-漚A:of-+OSGI-OPT/src/javax/swing/text/FlowView.javaT[o0~^~OI6Җn*mG`gC@UCJS ڤ"7_zG*6Zd >`|`#'qkaJ4W@.Gi0R.qkfp%$ :T'8*a6 as#caAHjY4*a5OmfQ9B`]zBV+z.(~&ͪ+1O)49miYJ4ҜUNu2Qs[1&j1+5v$tQ']rOpM&hOl<:xD F3w)2u)\]񙄹J2r1ɬdBV%9R&Ka|9Qο[uh* -+% lFsFJ/rU] HEZާ8lj~nR+R"ޕNTwikZ'֗F ӫ"%q҆犗Kj ]avU!l8! Og T\#iqvіZ,|pwRet_fh+iٶsF=`\~ۥvZ#ѸMߺT>^ ")(<|vMxl-OSGI-OPT/src/javax/swing/text/GapContent.javaMs0jHnmN:$ބ%Fr5f]f2i냿zW+u<8Fsf܂Qt#!2)Tмv-0Ff Nd cT(Th"G5҆;4Vj~.Q 5ZNb X5(MPXd ia&3\ŘH^Z)iS8x4 8UkNtʲŖ&dX0gj֭Z0+AL)fm@y.$6X=Rt2d䴠M(hQ(N>|N>$G0Co4'h_ >pxd8r*`Lܭ"D/fzdsL\J "zFqEYH2`d2$hVK< =Xd)pE^^LI37"iE c0\p.ʗڏHɟne1]p}g]قgStF3mAohȿ@da`Xh @Yv C7msb,<Ң D2p9QNDLT)͛Gc̥ͅ6To'܏0u7Coj.$3jbC5fY PX^]rF59D ['|!jȥ^ס ./bۑ|!}mZX'm/oyPKq^rOPKK>,OSGI-OPT/src/javax/swing/text/GapVector.javaTn@=qZNnBSH$q0tuw84ʿw8T޼؂pnSua^*Vh2`c)yrZDDTFJ " 䣙WY4NQ; [[`,CI4Q dv]4*ūzO]aG!<rc~o~UU֎#a}*9'qݰ&џR9I<*ùxXu# +X.BGAf<;5/Ui%!@jC8$m8M^Mf?'3x_$d2W2Ie M"D,,Β/(SKI4vCH"(ȭ"hV\ ;"_T%4f Fx e85VlSߺև-p:]x'81Pan82%!q4 Pk!Sn_2990Cx:;?s$,oSF#lZȬИ>jopQ/uG~4L\&/leZPKJ_ PKK>,OSGI-OPT/src/javax/swing/text/GlyphView.javaVMsH=/'H%C`P aR[{FL0Bj,#1883ChĢM^Pi.Ch9MڀMBd sP50>FxGY'CLG!=(т@`&#͌4I8,eH4:V7NUϡ@A1WT+yU(wFZ։ↇA)0^lDp$ B߽Nu ?:|h=#wq8{h~_]$ֶ\5oV$q#r`+{~Y{EuLKh`-mmj}{Hr>dC&rYQ-t"tv ˵K%> ȭ <1e8d=BiNNQƉ's@^}6uZm:?-!SOJǵK}8&Y)=+iZl%|J 'L{FP.3_=g>pSXICҥ3ܡY{4˥%^v^PKg PKK>.OSGI-OPT/src/javax/swing/text/Highlighter.javar0)v8kHKCh6;4 쵭H$0L'ޕqI~?rZ+ܤQ|!(KD }Ϸ0&Q-1I\"E@*_WTK'\mS+ 5i`4J2$r^h57ESU$pjșa(l7i_aL߯g /U/7Gx۬kQ֠+l "͈d5H,WHkFZZqEB+rm-̞i 1q΂8=+rN/)I0 y8 1}`| HQ\U0ss#!dr+Lxښ,GAjε=VM)f}B}!X;d+_$\SZI2͠%[i{~9j!G3ieKY}aoV36LXUDÒgx;:`B;;04nI}5hv[>Wu6Y>L=cL65xD,ORBV X^fķ-銦k=! s{[3RPK*ϼؑPKK>+OSGI-OPT/src/javax/swing/text/IconView.javar0Saeg\UChi LtQk$U1L&+PR) ֹG9gXʂ0K8Uř`0 ? s40GzyDg( P5BXF?Jw F|'uKYd k!-Ƀ(x . kա5ܮ}:G\ZFrFc!0AS4MZH_'t򞨻[Q1w5%^)ؒX+րJfn4\!Y؆it697Vem_HяTЋSH\i>Y|.>"0x6LlJW!>dzRenv :) BŒzﺱD8p†A&vMa^TY(h,P٧ l顰0&.klBXlIEts&r Ό*Xv.X~-,&+^ x <E(Wۈ._6 Zo.l?|?|h8هPKhKH9rPKK>9OSGI-OPT/src/javax/swing/text/InternationalFormatter.javaOo@q[%Ik5 FQbʹ]wwA߽i>`{75N`b`|"$Rxn~eXxZ4BN!A24Q%Ru;CƒVpn7;PAm3BN)VHA˪Ckȭ:]'.C``CoC!Aڹh4M(ZPb$Z;-Sw+%Z0&v *JŊYh@AsS7bV}LFZPЋ|8xy~hf<Y3~hv_Gup[c!A|0RnM( A#ДdZ|pҳ|Qb#m8*tuWsgZ{m |9?[1/tpX0'֧Pf@}}RN6 T-O'CCdW.Ju)!=sqXmPKT~0PKK>1OSGI-OPT/src/javax/swing/text/JTextComponent.javaZs6 ~^ ^^<'붇-qViܳzۮGKE5(Y()i[> ~`z$#?Z+Oa2@zξ@MfZRH;AlQk Ø˾_AH#jpFzZؾ:>9|K6D\`,Y}a&Z;E{B>X P)* Z~?0ד^[()LOkH BW`E>|T T-G\z^F#r<;&Co5vNg|2tFFӛ|2+2@Ln.0dhcWn2dPpad >[2tdw "\Al*@ÄlUʺӣ#@j^F!EO= RQ ^E?qlBCbN<_04+Hb(OrQH 7֎w!"I;毺܄D%zyfNW {'L;kSq@G ֘8!RW[P> 4*<,耗w;ȒZh<[JyV"xXzk .A.Wmc. ٽ#Sυt)h6&qLtaNTtؐ| dAd/o ݫ |A@ ɮmk^n)a :O1(hz&)*j"R):O7 6 XmCY+)Κ+>titdCj#l' _xTʷ,!` Chī~ѯꀤ$NT][pHiԫ[Aq8?D4,R2\xT61((|j0`TwmIJt)vQ 9wԄO%/Yc$\4i=E\SJP洐W <\|jԴ"; w9۪]O.s9^?x;|G~"6&[p4_gt4V6Mρ:hp>q E3U}X[H>VMZEW .g{Ew2V~-2 yız_[ 폄ꚡ,]m eܯM䈇X7yjf3 _5Uu|ɤ%$+ẉVzB$ qdl5O+eTlFUѵ[@?7!iyU΋^45[C}+E[:yI2[*Vq*n[b KNy0)Mw~~ePq3@<1ڇ$Xfo\qYNEI stѦLWƐ+̃dGLtF6j,PFjo#uOQ4٩֩Nau%u:uZ *Aڥ.Mg@ۻh˷.ichIi*98Qc*Pr'|u:xKn(r\lP \Un|(e빴H)X- iM|+wQ5^9{K%}J?CқCĎ}[|M9:kw ? e3II;GO֚d7Urߛ#O$8[6^RToY7,Ua֍S2Q3~~N)G-:]):ɆѠ)ry_N(ARm+;H܆Rd`F|7N n'VeeVpv&RΉSQl9KdYP=A*xϹҰhOOiZZ磣PK\&D"PKK>)OSGI-OPT/src/javax/swing/text/Keymap.javaTMo@=ǿb "jHnmN#d*LEU=6ػbhRg޼}ʽka(@;42Dоo@;-"5PZa%JD O7TKnjZΝr! kHx \@$VqܞӰX%pȅag4PSr fҘSWU˶]^VcuoA8@G֠W9^l*b Қ *Vu"킖BKsm_$F~ ؘ`~ص$OqOlsti04{gxQ"sp](drgEO$$ x#&Ғ\ T9vƖ&97lKgA=ǡ_,ObkWWD\;($fP%۹ZIc/RQ+4J`g_SmНJ<H\t5pOsI#LX픽C{`.9wպ4ewJ Ya ~,2C\OdIJlC({Uӥp⨾jè_FSO2LqPKebAPKK>,OSGI-OPT/src/javax/swing/text/LabelView.javaRn@=_1d"jhnm.qIPa(ǵ=m]wwAQƍB[y7;< ƦYY¼FB:GF~#ѡ`1'9jԺ@ B+ FY4z]?;SZ@!sHKpcE 5f]uIvNca2 PiyAYUæi"*-jud< ?kiqQ\dUQZ.̒aґYMoB86=$xdevx>dl*Y$)!>dz5xn+LoR7f/U˥ٚ.kQ"fV#Юku,4J% j s~D?Fl#0UD3Nr%XPKlX2.ܻFU Vp"iqI7>|0SFQ\V?k. sǎO.|g^+܃ںh(6!o>wP"> H8vȰ1tp+(ְE训Yݽԣ)CpY*̌QȗC:s+%OÝpJj< _PK[3vPKK>5OSGI-OPT/src/javax/swing/text/LayeredHighlighter.javaSr0=_ 2!izhsrIeI29.f1jJ2]CLKoAo߾ZwO8#vցQz# . 2#hzg!c{1Y2+EI"#ii 5f#!ܓBI8zVju.=F H場\H;2ԵJŮNc͡kZY8tUUES)w=vIz^`u֝,Z0O7Ue8eV `ncNyՕN<BCf&3bZ=kdM %_4ICOLnGwxx8IS?^%d4oG2 e\x,SvoR# sd5eb.2&s\HvRXO }?'r2Mv` /CqOat@{.} YXOxu/O7l#;G?ziĬᤑd W PKu@PKK>.OSGI-OPT/src/javax/swing/text/LayoutQueue.java}Mo@q4 jl1~`PYFNꃭݙyygp3U(w|움ax;|?B 4A}<$/r/8J98CkE Jm8Oth%A* iı $pu;F]ۧS$ieΨSOf;Y[iBJQu5}2[,Gdƀ?Nhr=-V)fnBc0 era[g /#Y'ؘAA k%؋l6qu`l'dG,c@S~-BP$S#dM:jaZ ^am|FQМ^7;Sh -4ݖ& bx蟰?:CG:*53=s:)%ƣ+ߺD;ǂTuZtU5k9?e'"[AÄSz= xPK&8PKK>0OSGI-OPT/src/javax/swing/text/MaskFormatter.javaAs0Wp d9QBZOS`LfzYŨ+8 hroEʈt7a}ЕR g·f_WZ%$`or%bRUB܌a?I nXhzuTo{a+PAn=)s zUhpOI\,i]*3s.nE`Ihֶ^3uQCrax 0c'*mSC|洧.pB-z 4maȣoplލ Q˛܅Û1uG`#7\p8K[8hqd܇0qnTolFGSi)AdO~o#\8t嫽|v9?xe` -y-'$;ڇKm\H%vO\s+׵wώC kx#6#γ-t otivR68yB@) Ȗ\n\sx|ZbL3-j#Ҙ^֝蜼ߧh-FSO+wW(LQZvYh=Up{~׼ ^Ii?oPKE\t-PKK>6OSGI-OPT/src/javax/swing/text/MutableAttributeSet.javaS]o@|.b''[u58x_ wn[U{lr?fggɹ0rM0 I?JJ !/ ,peX8Z438Cr4@kR+ 0vѰ5:r[B-4Ak9BVɰ! 2]7^z7g`qJa+ xAݳ&j^O&}b8ЦT{Dy_NUh-JÎW[ ĊVm@ySIR>X]P/ :\Z2rAh5M()Dއi>Z~Jp.a)$ %uW s_Mc)]S@Bl,dTيŎASKղT$hW:M3OSGI-OPT/src/javax/swing/text/NavigationFilter.javaTr0=a.Г`8La8(Yp$#q2;+Mfukr)_Z.LaQ):ﻁCA,`GrI)JT2C v"G҃kԆ`tڥNQlU+,T ,@MUJ.:-S-[pJ-AVts--?u]Q(/8NoXuJh hUf-UbZ Q rfS]k$h22VӼ=hdO  $Jz&}\&NxLa4ϣY4yta| _ȑqܔ9`u dJLiA)[y%r\QKv%V3GSЊԑ/WyOGC&05S7+9' i!X`,֔7TTXf^J 朑HmanK7`߅;=s5[e!Gۼ|L7e@ΕIЃ1We9 $Π}>M뎚}uMV+G){Qww{cUmC]17n~ rߣ2OSGI-OPT/src/javax/swing/text/NumberFormatter.javaun@)~dG.9QiQ#,Q Kwc+ʻwSiTݙ! pnOFV{i1:"׵ Ls,L Y2*C&xȽ,HY*ѩ ܞ;+u'Ldv'ݡ'(Ybɚ@ǂZPzCM42t .hLpk?EQCm>>YlǪU0'O-["gZ21uo!)uF{?PKK>0OSGI-OPT/src/javax/swing/text/ParagraphView.javaUF=/_ѵ'EĮJ8f%l!-WʇAjŌ2B]v8tyuOO70Ie*BnW=߻{ KiacLF,P a|@cVpsuw u[JCZHds ۼVJT4( |l0 N_rgCe鋊MX۟<¬*Ck࿅4x"gVX3L vK#IV'T &\2mB( ( žyV.ޯa\`b m swG;es0M쬫!bBkJ6H&2bi*-DŊ G֕2dr+IPLۨ_g{ߖ iɋ5; Q&07$LP,ɿtYE85EEVb="sUo/Bȝ t ^؂{YҴ&UdY!Kv S;-cfl:hn^Ş^nL( ڠRIj)ɴ8`,_ FU26oCX*^$EZɆ򊱁 ԋ?#u0<SSn^ybL{m;+}s^&Ka7Haz;&>>\0tD/OSGI-OPT/src/javax/swing/text/PasswordView.javauAs0Wd(vSui'eXZ,QI{2]aq&Sb%}jr3,+qbI$u- 2c+dTMeNRVd*B҈MG2VjxQx-NCk=V:8H\ .σ8r B7@_\e2.=qM9OZ;OgE6CփZJo Sbì DiԝN2[ Cަiݛe<60J2_,"o򔮿-xJVdN+̖t.Extqxd\0<"27[}B r+snM( ޓQ2;iZ,M-w 7)ێbGw4' NQRԎTaķ%0gekڑr 3 ؖWBu^\hG<FMbѹΈDU|)dC5 S.PK2tPKK>0OSGI-OPT/src/javax/swing/text/PlainDocument.javaŔn@)F ֢\"L,c1$ʻwqUEoՂ+bT&./ b0s=Fa=-"&ȍh<4+t@k;=+k:@'[0 ؃Gf(X(nFRi(]r _eDž ?kC_UU$jȺ_j}&M-[7]wFWO܃(J%jQu r|l"exQ%JyrjYIhı 6Y(^rPBҡd >Ⱥ1 CD)Z 15IGhV 9$zJv8x_r_'FSj݃ :2ui`tl_g ex0.5 C:cDinm8'~tރ8$tHGf_IBW:|{n~PKePKK>,OSGI-OPT/src/javax/swing/text/PlainView.javaTMF=_ѵ'Eƾ8]֦-˕aZb13!HZYh>z^~1z=p#Qlk}X83#xcX;Kk4@y`HP" 3jåI0\5WWAe;v!- Hy. ;P+V~6rc3zhv نtZ~ʲ X8:嵭/np n^=\Sě#0Eb!9+Aj`Fұ.5\dC02%`nž‘BlL,Ex׳pȗEqz=[Fy5ܬhZf˯by;$vM䬳! T֔˜. < ]{H؎$2zB&l [N:7R4|D܋fсoLmbҮ!݅C 1"; ]V,{x͒{We5$OԄ~jTr;r),? 1)Crt])UUO UfKV?h$SE!yq0N{!]7?mE[Ӟ8I΋On'#Y5ZOqM wלUL+,J'.t Pu rzboB%m5(Nf l[~{9Xl>6]vIŦRP"Dv v9n}>PKJ^PKK>+OSGI-OPT/src/javax/swing/text/Position.javaAs0jZCHi24F\ia2@z+3}֊nV" .K%DߍFO/+,ѡa2CD0Zgh6q%$u;C).A zVo0a+ AAJKiUgQit^;Y`Bԙns5Mqhl'l>Գ.9V;^@TJ5{-EƂ(,ﺱ.LN1rdպK&48Mҡ$oe<_%K.*Y+|OC@ྲ|)Bxe!7'KBr%5]Ԣ@(掠BUΏձcJU$]/_( ;]èpO㠪ל$Fhsc~2Ny7ݦxɟ%Rp+%W%NJxf d|]~0[[mB×%Z5wokYga.꒠yy3J*ciϷPKb32PKK>*OSGI-OPT/src/javax/swing/text/Segment.javaSMs0=_%ͭz&dd{m ɕd bOf۷JX[^҇YC g2Acsa;9kL=bp$5OSGI-OPT/src/javax/swing/text/SimpleAttributeSet.javaUMs0=_ 2ԐZ1. d0i&Ga/F,9@(`$}Vjp=-5OfQ7q5= #i`cP!1j3?cT'-p%@ԫz *-A* A\ "4:cXF2ZMيtYoXS:iUi %U֥h h͹&œ%XElB\+@i`F:ʱ.4\&-0jj X'0#I_ ۘBaˁ\1\?# 8h5-@"NU!Dܠ0U+J&ÈOyDd!QsԒA:Ƶrljj/tlᙂ< ۭeH0":zʆmISt]ǕLj1zBI|\֝l@Tէ\2Ʃs7Cj ABtr[JI/b9ӝgsc`qxc8hq bJZR hs-l(%9nͿ L0xPCޟޡR{,R}=h\nT.zVre.O`EJ^M27HCw~eۜiL<Vy kD1ϛu(}PK^PKK>0OSGI-OPT/src/javax/swing/text/StringContent.javaTMo@=׿b *jHnmN*L帬3uwwDDjُ7o<{>0PrЕ=&_<'$B|8<??B 3iaӐ<5ITS(U !*h,i>\uzbKX(daI9n%H뢡V[u p'[p r4TUqM6vpƓdY7Y7*Gk௒ w؁( 暋 ;=ʐ#ꥫAu{"ځ#~ (8eI߃ӛ9EY43M'Wj u~؆b]E`%yJ s4VAe#*W35l4$r0h: 鮴,}bxz5垔Kč0gAߵ%/Ha{VFWy)k-kǵ=͕F*7RЍV#z $y?v(- /LЩՌ Vstj5_/_[I{N ?)$ZLߒ/ܪ{"I\_4;vdYz_臗PGcPK9EPKK>(OSGI-OPT/src/javax/swing/text/Style.javaR0=/_1)Y&['M[ԔH!=:0`S{D{DŽJyg4'4& *%u0[,>΁O3av f$kvCs@:e4܉L=`2&{Oq2-C9(T !3u3J9#W/#ٓd䆆w%$@|þ c˰:c]$]}`cף9UO V=kdƂ,-rW[EJsp^Z4rdվkdMjD)Di=sysF.^r<Ļx+D 9 GsXe*!EP$` 5]D(MV#hku,04I {_GzGvIrh|)@sAlUMgT2ϗ֌kN5e;vI\v+R&f%R"k@n7PKR|PKK>1OSGI-OPT/src/javax/swing/text/StyleConstants.java͙Qs6_$C!ILHBrn9`қ{ ˕eHʀ16qd`߮V+ڧ 8k>*4{'0p8t,/Λ@9i1 fCP-p"A *3Nu&hipqq:n@:σ| 0㌜An8& C Mn¹ZEp3.Lʥ(DOGS \ hF,kDN F9L'ܼvAqa@ق=%Ze#I#](@sOOh]ϘbF$(oq2軨[Tj*`twڧcE̠=m+aA,LLL'8eа sA'G8ᱺ_8?RW?" S0'RR078<;rn i|P׽Ašsh^hXAG f.7*O[XK(yvE$n+ޣ6n#N"Vf\Sh/`讶G ȏ^ ZmBgw+͹x+AuW 2ٸ3RLGdT*0_<}kWIN:r8Hv'T]:[au%K&n_žT暰f䕩)lI/n1-ie"IPuy-%Lů&S37 _ǻB!DXG'FxyJW=q/V&ؘzG TܛTAJe{hV?NLUU@]^xƖ&vU.U.[c 멐,4 oM&`Ac'x/OSGI-OPT/src/javax/swing/text/StyleContext.javaYsF~O8CƮ;p˄@x:!-p)w'0$@B?i'Cv7V-D|2Ps.``ġyBU/,LPѵBBE z CH~Eu 53 U/ R0cKP!apc!#fABm4Z'A1L1#h:#touX,[BN^ u&h+zzPmеiwJԡa<-qȻ͍J!%@b:&mI0[ۊV =+^6~%B_^ܵB=6Hn~`/s64w}fHL\>0a7h o+'h=|u›/TA26OoOW!=QJQq; &RbG!/f1+Y(,%,8؋blϘe&or ʡ`F:-D߫7ZS"

    :T]5@_w/Bv~WG:,Y\ k[qO\r 7P[UV.$Rcr'WǩudG"YlA{# JoPKY&PKK>1OSGI-OPT/src/javax/swing/text/StyledDocument.javaSMo@=׿bĉDhFPa(̶fcPY I?rޝ7.=.vFf+nr0ϥP Bo/w 3iaӀȝLPYLT)BXmćh >t]B u.N;PRM .ZjUݧEqL .8ߊxUUqM˛\ۻI [}p[iJgg3EO(,uCȥLXJ!dzF"(ЬucL0u0\KT_rz>u@_Fl[1T@k($Fh.V'1wBڳ{uA@iuq26ș5C5 ȌfݳڐH5$kcM+aD²ۻ.{pRX&=)6ogNgyS/IJ3#KR)k^?ɴGDڷ3Ԥ+Z(x֠ھg~PKںKxPKK>2OSGI-OPT/src/javax/swing/text/StyledEditorKit.javaVMs6=Gb')RoO,lR#+ -R/Nԉ$޾][|ce$&=?KB'ݫw}{t0EviLP;L)Z%B'}FUp ]pQ?]{)`%6 A1T`N 5$fJIˊFJsa$8\G@T>K,@Tcƺh8ǣXu^+t,UH7 rV9kUcAd̂JaäґL{ȩmBEC_0~S8Y4a2d|͢ɘG?Çh|d˘r3`۹"Ĉf+ȅL85"C GΗձ($: :OX >u'/$$J6 Q*X8NɲPyS#9 0T2+&^`;s=z%<1v=XU֛}@߻Wp;= .]#F *;\ەlGEcΛfӁ^dwk4݊TsxVPs?_ܞ0k,ft^Q_l /}hﭯēϝӏ}!9upnM9ͅ[C}!P2~z}'4XmTX]\{S^d٫I yÙnoܝϜSNZ5C.!)"xT{Y(;kUp2+0%Y7#wM$RT4EA鼠T[ARZU-5kiM֤Sk|tPK1*\ PKK>.OSGI-OPT/src/javax/swing/text/TabExpander.javaeA0WrJV{kDi"R`@خ=DU{ vU=<;Vƞ f򋂬`~\ $L6(=lɓ;.`Ҟv09=AfT;9d M>X<6 'PZЩ!ˠ44`'QHe05QXCVx$2هNօS8%\Ft7`GЙ#9-%wP>]A1e꿾FiI?<)X%L'PKkQz}x1k{ ZR(uneV.ԟ( PKعDPKK>)OSGI-OPT/src/javax/swing/text/TabSet.javaAs0WtzLZC'S:"i'俳rL'-mIv,3zoe&!̳Bx># t@v|ȕ,P;\AWhI- ~'#I<Ch0i`# A3R*XH =Z+iS< &'rWݵ&q۶#cX.J5Sk9; j*DάJ`,"ԭ$u5gJjEz4ߌ&4 l,F>&]~_/&Y,2`|v.W tv1qwҏ!C|P#,5]5B掠FVǀ+Fn돾|8x?|wȵhMΓB \xێil_VP!k(5=,Rc5F 7") mX*#MSh ORٖ{)v_PK#2PKK>*OSGI-OPT/src/javax/swing/text/TabStop.javaAs0Wp 56ӃN5m)#ڨ5+ʸmNC9[O:pYzi%(8)Bo<]Ȓ"ԨrH.OSGI-OPT/src/javax/swing/text/TabableView.javaeAs0Wt=4Ni;=#p$!d; -`[o^Ep cON;i5uIAu uE0ϯcYa6N!ܫz]d++1,OSGI-OPT/src/javax/swing/text/TableView.javaUMo@=_15$=F a(zXlkv5Fή]>D>}3Anܣ\ 8:аzuUo^kÂAHF5x3\@$YEfTU,xjȩagif*37&nE08*i%Vo0 U֝HQkP;&e*bS⚲(;#-BqE⃖3S0L̵Q|q$P0p o< &_Gwxda4hx= FC:} > IF}p);VE(dIIgh4,AH Cڪ`lˤ| 3.t4m<--* ̅SRؔfg(etbXw"G\9W 1ڑRԆ!Aӓi= ӠDz8y/)y Dȍް%S3xv1$gIڥ&Vi'M @al Zm4eI7T tN7^6AiCyصxJ@G}gN:| xqEMN-wGo7V`dA,n#wrn;׺%J٪ׇ+[sb|Ѹ?t XnPKᖊPKK>-OSGI-OPT/src/javax/swing/text/TextAction.javaSr0<_ 2Ԑڜ\BZ `LӃF\I0{!ͱ>ؖ޾}+{p#S*],ZWe|׋60'GvKy d$iG9j_JH~>uh\CtӖ:@756bm#9lp2UxȈ$QHlM(ٍْrX M6 W4"g !bbO;UXw!=d)Xk ,ޓYkҢ[c 883No'+E o!bCOhk^.]|m5t]xxᔏ_6FͳQ5OgDc52^|PKl&,8TPKK>,OSGI-OPT/src/javax/swing/text/Utilities.java͕Ms0WpkG;dIiS`R&G^5Fr%d߻2`:Nҁg_iEЕRdj6a_pҔ3"4CSӵ0FQ1rI\r3E2OTKGn6^-՛Vb)s%i H\CS\B9*iR$pSi0 gBFO@`.?ScϭVQ.+]Vխ~7{zZ5(sEK`Q, ֔ D!i ZƦ` LĵQ<3dP|ux~wȤ?2a8ppz:op3,<Ȕ0s#>C IgTHr $rJPEqmU`deR>㆙rj.UϷV' r .i-r”)9j歹\ wp녘 C2@X1fAј/s>&39Sm|FёS⹬0bٔ;.-2VVK!'kRɕ)6AQn/eXwv.tRVx Fo< T&WkzUMt&,&VEʮ7_lR,"+iaE,[j/.1޽C/:bι^i$'0)~#+v^qq);=}&<2W)a:dT{C7}PKl=q PKK>'OSGI-OPT/src/javax/swing/text/View.javaWmoF|Q>ҢJGIQs$`{]۱HCb3< \@Wkɧ3 U-q;fqYӹe FR* t-`q}. 0_jRqCj@şZ0gkP! &C#A m,:'bKlC5#qF Mt :i\/KE-!uo#wno`~ Ա֣R k%y<^ ƄcKT"} ^J?d+-89zVhc>ulgpձvy~>=p@o7ou (spHMFA $'!iȦS@Gseªkx|5ѿv2+1[dҸJI`c9'+ѧwN|Vۘpy ኹWٗgh (ܷI._ mʭކTX08oRm](&RS,76FO^&`s32v%Psf>.ӘÇ rȺNh<-0=HYl-{/|C':BuyF9Bwͼ^m'/eДDXHO2!ҏDaN[ɂwQKNH[y8@z?E/h@\.OSGI-OPT/src/javax/swing/text/ViewFactory.javaeAo0 x))2;mKXqڢGEmIr`x@`C"U+̍=9reM!o[%$gOS$XLyrڦE$iNo!?CdGr^tqL &JL8Ak(Z:JJCzv>J$a6Ap˧u"D.%Oř85Kzz-yG;x 2fmE G &RN)C/EMޘG Q^FWE5"Oa|u\a,ou,t|Ə2CG-"zP $U$N4i^Vπ(Ӫ "eI>B?AS߳TnmI6-QQ'd0?ɇ+t$-IO$PK8>PKK>3OSGI-OPT/src/javax/swing/text/WrappedPlainView.javaTMs0=_d\C^ڜ d0I&G!!L{Wɐ$}. t1"_8x&ɍ)\z!NahѬ0Ge1Rh-< ZEԃͣvSlt KCXȄD5PhU-j;džC#8 } 0ט? nUUG](grܺSJa(| Wɫdh,7HϜ+#PyVgb=M*3b^7E{HT6O N0'qzxsr7ta)\M,iGC@*0>.BBwl\dS4,G DPY j`iX \}t u[-'Vlي"kw*9UddPa1{9wR{p/u yp|.Xmi( wb؂-)vpUJBs AZKCF;~xqr&y)ÁAt ī\"-+H!5 Gu#V.u<7G(6natul\X:Ҽan肋_w2<$I0g)G5(g~X$+OSGI-OPT/src/javax/swing/text/ZoneView.javaAs0d2!99 m=Madқ,!'C `[yt \zg\;!̲$Tǧao+-Ѣ`sUFHjO$[4x  Gṏ*49,H"6)uUh-u7O$pg,lj/zv8m8֦g]i6yԽFI jpDTX2-h4Ϝԭ!GkASu{F/ $4EYCŗ<.I9\ΦW"M${N"@^mm|$S J?#sZQTو4A"2`c$UnFA{~ƶ֝uMB.~ o [&v {/<z'1OSGI-OPT/src/javax/swing/text/html/BlockView.javauAs0Wd2;>aifqQ5V#$*-ƞ{Wθ}`f꣕`̾HHBÛ: cV^`ɽQ;,ZBRNh4n1 `o ‰8*qm!lBC5ԐZIOI0,\Pj{.A=twϣQ۶ccˑzӺ}:/GBFZN9*fUcAyn$R+,zB:rлf0H2HL,"o򔮿.Vb3X`\ܦt$g.n#@Cm}Ɣ~o;yCr5r+sF٣՜jtXFJE.h<oC!v-[ńwTIP7'J0TQb܄pUSsOB+OSGI-OPT/src/javax/swing/text/html/CSS.java_o6Ư_>Qڪ {Up! J26MB9{>;?i:\9;>N{p$|pށ8(4~}|ߟ -[fౌ=[A \gh먫 Y*T4.qg:9,kśnl=Lx5S Mw\RYHqiPSuKIʐ][ziT0*ˁiՍ<1|&8?Eѿ}2mӨ4 ,nvjwlPLP` <>} y=' cA  :q86yڮ -B14Gg#GaQ8Msfz5 vkllfTTJ mk^:vTUSdWN6Lٚ|Qn`2q2I"Fco4XA=UY-}B^c&>T8">N lbYGL]tczp:|ϞUJL8??t)Ho#,2Gk"T{PKZn'PKK>7OSGI-OPT/src/javax/swing/text/html/FormSubmitEvent.javamr0Sp in-'7!:i&Ga/F-d]쑵VT;5A?_Vj# ?c9l9_>cJ6}ClEoOq"4xXLO괞&yuШƀjqSANϖt&|3\ɺ x, PKL]wPKK>0OSGI-OPT/src/javax/swing/text/html/FormView.javaRn@=q54UNk5 D9.ڻP:v͛7h8*pAq&b<8~|{ K԰DjO '(4PBPڗ!<\ Z@}{Kq%B(5װ, p̋VZͮӲX%rȵagTPi33Yؗj;FpHu[u/2*G`JؚfmқVub;-7b -MʵQ|]7hѻ 1Dq81Z}]ܯ1X.* cX,aϢU|! YF}P(;&EHF.0hb[-VQ  T96VMSKfꫳl?-g_WD<gl$cFcE TMi)@aj s:5HU= nV$ % &ם -᪑A 0uI\N NJHE^_H]cÆ &rP0WSs ,h_EݎEe{X${.iw^Mj[):hYsLݿ&^g:^IxNk[lt]1cq~PK:RgPKK>,OSGI-OPT/src/javax/swing/text/html/HTML.javams۸_?}d\=\=}E tnhФJRVܛ|Âsiˋ$%.teNyCNVoXOrƋ"ʕd'N7#Y-FOn,yǶ坬Y d+O)[ʺɫ] 48?:~s jgVV-6R1dJnZlU=nvyTL]Q=nȲZyhv(z}Vtm3sDҲMjm^;}fFEnUEcUͲu-gmQ)kv0wy5:mu@u[Vc3/>fc{)@d Qă1 #愁%^(ͼ=eRu#?njfٍ"4B\JZfkՓKuGl#ǼamTw)ǼZ-/ptvt=eGNF؎hUVE&szM/6^yQfE߂}?A}A~F@\5;+Eq>Y}ob&C3̨ЉN3;?li"/"a=t >\aе@w/zy@*xnzT83ǺW>c CGW6:t &Xކp$7i0)(Tl&bd0`+ ? 1Z!ë|2BaZ«n+4p'$ " Ï|~`ӠE JP݄O :4+$G|.^-eJf:\]O SM"x$0ZD`XbA"x,ϩFXQ-x 6 "L:p'bȁ{{ND=P!LU&8NG"aDKT)wMVב;'NGGdeQa lʤ^NyftЈ\_8qdL6!:vWr [ 1 >JLxDKxYjv'{L"m"/۔07@_7KMbdDQ.?hD.D^!DK=r-_nˇlO)7've) jͫlzj[M-d{^ȚewwPٶhپXz{vͧaŶ&e S\W{W 1ZF¸e"Ǹh 3k6=*45ëKeYЙ x5(.['z,8=kg Hښh gOiś*j;qWxJ)HYXKh{@|Z1hdz|נ涸A~Wa47}yRmhl,-zfY.0-}k㾳}q[~q 5'ĩu>eu p6K?eg%58X8;h{+EP؂gcʲx}q'.s<<@F}.HEa2J8d? \`)GptdJ _Z} F F:g;MO9L׶5,42YUC-c+57eZOz PFHP}%k4>HQW4{b^X/cRR뤶4~"Tþ<+'U+WP#9(nk(oEǬU)凲ڕЯey_GY]Q^bYYW^_^ _x^84qOp)_l-[^e&ܳp %rDw}e (lZ2+U cW=1kQ΄h87PK4=PKK>4OSGI-OPT/src/javax/swing/text/html/HTMLDocument.javaXsF~Ŏ Ce<Lj& LӇCZN;{2߻_ǭwqa${ŗ+mS0Lx^M>0C},%Ph!>*0+AW'by]\ъ"bq TH7.]20\-HK/lL{Á;qd~1çl6O.Lg0^O}{~ru$(Eʮhr+g"PdJIG{4a)oQ ZD\mDз0!_sL`]6iE:X/9zCP;:췢xAr2by1py.xuׇ84/̿^` C݌Cl,Hx*ʸUG9j};2V1ؼ|Z8 phPK:}x֫=3d~ 5}pF82EG~pAWVn햍3g߂h>owH $[a7x'I\{XXAb >g 9g J/VOP2=& A{7~. 70.n=W@4ZRJJi S%лm8 ,OImG{T2:To"[q`b)>Ut-vd0Z 6L.wta!e4*Ნ?$E.Rc do8G2*]:C[Tgq 4}炏,h XBV0ˆż |?k·y6\)v_`? ʵݤJLrܯ6JޟOgx~,зXO˥'G] *=y%]6iHfHmD ]IUvEZVYi&dߞ/* f&-d:N~:V͐K~k*6]˭%̆H/P ӌ&6'bkrq3m+˃e2k!;}v"*D4W5OSGI-OPT/src/javax/swing/text/html/HTMLEditorKit.javaXmo6 " VҴ؊UKmQ C@K͎5;Ͳd;R`XޑG^w9QRwlgDŁGP8k4U55@P HŁOK{'r>Qk ui yV\8"A#4 P" Œچe2NI Bx Rfᄱ⒥ѥecu)`$ T@ijGC`pex@x!|\*i@ D4b#ZB/l8@L\(//tO\p=E{24]Ӟ-'_Gs2@$qC(T@*9YD!;<ģsAh" |MDԴF@W02yUK tο)oxhP$R[wxr"a`[O%~Tt##PEFV$-<(Qӳ'I6`xǽ=JdTUr'b O,IHFk, 2 bs\g80t)tOMJcg%헄ʋ+bHn,d\O98IǁtuIThÐ{q!E`:2.iyYqp4c,%# n@_т!e{vm9ԍFV{6\x"JkDŽ5KȦT'U\F}o$̰v((};E.-FwS)=3h\IM޶Xsܛkb]k֜']Ê'HaʵTc]v 5y,ݝ v$Ž\VZ f 8F|tm &~7#9$ Iб^:fdn]c>5q,U2;;[b!U#stڷup 3olkx-"ޛqNg`[ qE[q( q̤EQc[{ȸ1G#cZPÒڛłW9cݲx E199خk 4 ҃`,HWáe\Q}Pڍ=Kf\msӠkT#mYֽ~*$ a֋ K[;}ߛcn $\ qj>LK|Oڹ:tXgԩt^BMڟA,".0EKߤ:"/l9¥ܷ9KBaOǐ-;ua7:=JFz,-.x]9c2$XݭHi7sدQ͝J3bblQ;?PK/]PKK>?OSGI-OPT/src/javax/swing/text/html/HTMLFrameHyperlinkEvent.javaAo@q#w!i{hsrX% a( f]cPYH!j^*yv?jEgLo")W2@瀹2L])k\0"8Hd .V `WQ3nBڈR zU/8umYCJ AbK!paeA(ʢ5®=)Q-vN=-67Mx:]8'LI44&-Te|NZ%ostgK `ʥmFYcv/Gdi_$NB,h:i2OSGI-OPT/src/javax/swing/text/html/HTMLWriter.javaŕr0)v8A5$=BO)5J2e]'MMI2﷫{߂0TZtiû_Y&~k:KS4WDƂ4@)`A84;@mp V;pkUB i !%‚U^4h:NHPsȜCAmC`?KkϽ^UU>}^5q8MnNeƀ_Д| *Ě j=u2F'cNѮ)T6&m8 0Y8;NgpLdb0&,&cJFq.SBmL\,dZ!U+Ԓ2u.;VCD.,\^EupB?ي]")6S9g(OfgTܢL̮[0R1nM]#׹|ft;cu] ,̃Ύ(Cm@\Kya"wmR"cQҞʊIz;$Xjve4q5[KU=EF~ٰx*w`$~TuO)X2V҇c^5eFeEJeHDL{lCΖZ‚e5sfrrxC]^s+e0PQCkwL۷hAjoqۈ<^5hd/SKp;k ׺Dk:HT-|UPK PKK>1OSGI-OPT/src/javax/swing/text/html/ImageView.javaTR0<7_&'I@O-'z&L`N%WdOvWIuU|YL+;@{CA''21J 2A 6C ӿf WN!xmS'Q%lRY( 7r \BVq4* 7ja Olcˬ- UUv+- h>u#\Sŋ \lA^@i`Kfs]in\VLI/J#@1 0YQ߉܅ӛ9Y038N.y8=| '}@u]d8]qBL1OyLeɖKB-"(Pܸ28snr :Vl훊|kg6\P F.Ü+mQ&U>t>4 GsVL{`J*{Y ;GhwYBX 둤F[jYOck{TIhٸ%[]%aLxct7?B)h#L+J#6O)y޵i*1EM**x۩9閩ݍf#0kw(X\'igDCpw3ΌhUp|X2Vq}eFK^WMOz+͊ug}/Z+6*lNo:4Jo(m鏟p!=v:PKyzPKK>2OSGI-OPT/src/javax/swing/text/html/InlineView.javaun0DW |WvsksR؀$ȑ2[Tɕe#ȿgH:P 9;f9>KpKab^~ȍVdiY?Y<"*iC4@kvM%䍪ߌpK>hgqM0A5H/ѵة#cCl!С-*kzNԧw$=܊ȕ4ۼBq}͗L3yֆuq9ӏBWXC!ӟV{I:B5BUyړܱԝ׬m=Bphց^fh%kMY E9׼,Q4+?7KE>[.糫bYg|vjI:4>&L( l3Rh]I4[&nOJ"4w:g 6F4+>D;R{uB'VӁ-EҴ+'*F[ 8]ejE$yH>/uwY^I < d_a ^S_YGC喈Q솩4ĭ';qK PKlPKK>0OSGI-OPT/src/javax/swing/text/html/ListView.javauQo0_qTYREC ڪ&l]C*ꖇD=Iz SӜwreC"SJ ]:J6VA"G@Ud.KҎ*" #d(ӟĸ'ѸN?&dZ xC:l"бCjfh=K ca6^\@ë[![v]3qbl֥|:[LOiEҟVZN9A4LU *Xy;+u gM%rw2rMh y1MVELj-rrqWߑ-+_ ccCƔ_DAak.HRnet݊PY͉АK~c*(^և\4`[1q[%>DM:Q*s^R؞t=(S>uѧutadhO x<õe_U*x4 ( PK?B<PKK>9OSGI-OPT/src/javax/swing/text/html/MinimalHTMLWriter.javaUMs0=_ 2!xJI39 {1jeɕd we m}ÝA_kӅV܆qC g2Fhtcwa, LР^b @r_}7Ԇ+ '~ZΠY5=Vdl RY( 70W1XeyMvQũQ122g!0[~ kONY>J5a{b]{]IƀƟהl ,'V1WJPXάrK-Fm4:ODH?6 ٘fA54s b|5`2 Fpx,=C0/$(r2 ɹ"DO(Ֆ1sSj2-X%jIA:ƕqlj'/h?wd+ߔ[\Ya3kŌX0by%Ϙ^INJE]`Fvƻi|}ttZ`r"Ciq`[ABxځtw-G Wݝ}xcZY]W.OJqզRkUn+やA5n7pw@i.74TL`E•T{*2mbW]5eo:UxnDo ;R)zt>yRExv f76PKs6. PKK>2OSGI-OPT/src/javax/swing/text/html/ObjectView.javauQo0ǯ8SRemK )h&$w0U5@=;DWz0-gqHJz4?BWZlȒ9P7%)KzUNO'cVzd<̖{zK!-v!бA*FAI8z .x{-p#;}aBq&梵mZ#SUw!kaw/ '.NS`F 6gN{H'U=;7CަY2rP9|qsoldw[<ěMnulU$$Ky qIz3ȸ;0"r7;}Ar'K^ԄZ(NL+Vˀid+pw|(xοѓ8ch ]wm qlSf^TeߗЊE|Nլja34 gP}̖xAPKo}<PKK>.OSGI-OPT/src/javax/swing/text/html/Option.javaR0=7_1+ZN)Kۨ$jN2i@AH+5GcͳwX{CA7-Bxeal(TQ[4'͆Vs/#iCNff.ho/Kl.5Kw.\erI.j= I 6Zڑню\g { 8'εzAWr+G& 猘9)%= Y{Tk,&(1wr^ iՔ=xN FF96𱞚 PKd/IPKK>5OSGI-OPT/src/javax/swing/text/html/ParagraphView.javauAs0x g܄fI29 jJk ϊ0i}G۷[/"\nNcXX_5Rcax9|A֏q J%yr{$LntAݐWQy][\& `_ i8-v[3ZO=PPEkzNsuӻ<ȕ4۾Bq}*xu]NIʱyMv5BWZCV;I>B5BUաvP#:PwNr峡a26e1Hsd[}[ܮp.|r,Z̯U gHF&}и@0u+"':C/HBou!l٪P{rV!><M1zYMhE2_ګC;JT3Өi2NF d4ud7m1zכߔ 2MbL c֘x'H W3}$h(%0Fud'nS=PKD~EPKK>2OSGI-OPT/src/javax/swing/text/html/StyleSheet.javaVMsH=_vx?v9aj N*Aj vf )W~cԼtUr6P.a俓Љc)~jm~k1K =B` 01B:_ӀOT \{-Euqf`!֐( A"#*ԂL PK;w~ f_ 5Hi A؂[ly Sz֌79w{C.N'1ˤk) Ĕ"A4ҞU:d" Jcf@-G l@.:> } |ǝa4hx۟GCZAgo$U9)YMG< %b #Ph,3ZN("HQ/"2L, ^UbGZtKLNPŕvki6%9!:Fh$4cΦ^ڛ0-΍Z} '磖"_] a JX{[ըr$1罷f:׊[*B4γȭNt.So<2PsGDo-bIۂE\b%,vT"KRu UtrCD[t2PUj@ߎ+ _xAp]b8+}, lry )[ٳ.R1T:sy`r+87RnF/%4\8G Z~a3nU~PVtEs] PPKL, * PKIG@*OSGI-OPT/src/javax/swing/text/html/parser/PKPKK><OSGI-OPT/src/javax/swing/text/html/parser/AttributeList.javaQs@ǟS(D K8\݅~wwCjyInsҀdda}(%Znm&ia >)ȹQ[Ch-\WxpLCBQgMV@*63EҐR!:܁gi^-: u͜pA 9=-p5t[:tʲEEg&m휇Qt Z0:m@D*QBf@$eL]N<• ̥uF c#~?lAaԄOAF\ӯ)\I0g'043k YFup0%۹"D;ldsBԚN $ GJc8g%S鄫^= u ' +mIRõ.U~. -W3rV@ ڒs25#+2#4R(g ƋlN3J #"εHq`]hMjnJ+煓ʿe/fbkn9^Kwz>\;@i^?1](N.^]a4tp{EJ'B9IjqL&pEyɳ| sk.R4շ%cٖ-p샮R5[vt`6PK~vPKK>;OSGI-OPT/src/javax/swing/text/html/parser/ContentModel.javaQo0_q &h6Ie[$B[$ؙ}!}琪v!Ⱦwߝ=x[rge"=%_%DJISpx~> f!P*?LAt[Cux<&wlݞ *iDVX5 12޺.LN1td岢=:r <6%'%qxmvh>xl"^ij)@4#:-5!AQ_As{BER|؏h~zDPKj؛IfyPKK>2OSGI-OPT/src/javax/swing/text/html/parser/DTD.javaWmo69';ias7UXf6;YH/(wGɭ+~ӇCHQ{t/jTr:Pa.R$!Bպie! jl ڐd-H/rc)=mƹiw~X'1ˤk) Řb JjwV1륖V&5Ka"iHol"N~po:4?z7x?C-tmdWd9,BCarJ&PNdH%LLj: E=j`0K+[ڋ5k5_$b%AyW֛yBSqki6&U!펺-1;#;ro[~}WMd"b0L.Xxy  ~ӃNz9{m\( A"$2+c03˵ڭq* Gi?`h~})*#:"#D+횰ݸK Ag("j5Dc5$i$}b++h\l$bYzsÓXa$Y54}nNMB5{mӃ>;8%鼀'; .춱]Z~Yq)Gf:) rK"9zA3o E|C hnO qJH'{gv?sSS6_ÑtqkJ6vZfP yd2/Zܜ''ɷ;OSGI-OPT/src/javax/swing/text/html/parser/DTDConstants.java[s0˯)Psɭi 'ئ4ͣ0ەD 8d:<|ERNS{$+2'`9um gpPLE -\^s }҃\*Q0rpbn{zk$6lEa8jKs໌WDYZkNbSQ5C ^-_tk>u];qrO1 b]oEΕnĎ{`欆R[Iti\RhQzʥFf!boB{񈭿06V@]#ȣ|I h a0p  p ]%MhS8S7x&"֊Ֆ8g. *.7B*402ts럾L~90B39F)Gvz;\j;T1@fnλXLцn:Û#c$@6& ":AQDs I# JYؿA{Cټ/ 3%m&7 4"S./ϯ,s_cLsJl5mR~ӚM]j:~AV( >E6[[O e[jL l\s\6 hd(ۦm`g$ܒj4μcM;<=Fl/5;h+hF'$Jڿ-)N#;?PK:PKK>=OSGI-OPT/src/javax/swing/text/html/parser/DocumentParser.javaSr0<)'=$POK)e(8N'00޾}+kr3SvbUY"QJ ]1~maMʘɭ,H;*,ԢO_Y'e<0}i0 '`/Nƣqa+R0J,A z{p 5ρ=;I۶Vuƺm:[,[VwiEFZv jVU*X׼ [+l}+,R:oe֟861H2,Ɓ>\6OdIVkVyIWK^}B|MAϡcm)CSDFB֜% [U#*Bed5;BMv/]8V@^zử|A( k*tU\ ?UT79B ;7E'vEIU>Foz$W9NG#\NmA7J?3F ]{,M&r 8|]{#}od&9ȗ27Fqִ<ˆt.MpxPK=})PKK>6OSGI-OPT/src/javax/swing/text/html/parser/Element.javaUMo@=_1D"jhn-'hk5 D9.`6]ﺻc ;kAV*`w޼yq04lEIN`*%N:g._#С]c0' j):E B OcZ'h7SlM ؂6CR!&@jHL^4*I:NMa$.ءrgET| D806.x߲R+t,~/[JĂ*Q 2l#UWVYYR%,zT:rQA4r.c6qw=u4{ qx΍~aBmqKc;Z?|g~ؑg:,tS\~'~}2!# >]_O^xKQ*&V'PKPKK>5OSGI-OPT/src/javax/swing/text/html/parser/Entity.javaMo@qʭMF¤QT0l^c ; nK>>`;>3; .IYʷ ݬRABtG>^ah7RGk͚, 0WNF^iC[ <)jGl&}F2Eբ5sZOGb9JB%͹[e Mӄx$KIWdBf]M΁RX U+a@isKS7V2y\-yrlժM( mhxq&7z 7b%x|y2<['>LΡ}e}|;O)MyBrej2)5y#k"ku6Z[O @}C׈Uȴp˅+2\㠪WU2<3pĦ Kt9WZl7X#Ϧ7 }a*m 7 KI˗yd1cx*(]ĵ5`jpo8IsN_/eyn.s\*KM2]!\Aygd_;?='#>~PK`҉[PKK>5OSGI-OPT/src/javax/swing/text/html/parser/Parser.javaUMo8= 'NNWج]Xb4HY1%%pbW@ o޼!offV 1sӈmZE'LN>VPšHw@cts[>Y<Ǘ1?gMfSPg4 EzDa*@Uy~O?a^I^GmMA^3]F0cX].Xs>:hv)3>23fM1}\4w{zc=td|8 C?SQȱ=PR*5>Y~l_v{YQ0חX e/+zoT{?IQn_=vrKs`߅YdU qw=iZ9[iڷR}_%w9[<^:> PKL{8 PKK>>OSGI-OPT/src/javax/swing/text/html/parser/ParserDelegator.javaMs0Wڜ\')t0i&Ga/F\i!|tzyߵ'V A?< ZI#F@mXJ vXV"W*G㱀6I%sNb+kL zQop$<GPJ#>NJ@EOHӰ+\.BūBA Q~8lFȖXXWtM2uwhcǫȊrbV-d)R55a)'V5푑?/ؤ^ACYDnz 7b̖4$]>B2t692B)BamH\ULY;tAn|g"hU$Wh4"{&wr/|RpObC[-*:zũB%~i7'd BS?H\,?_M ŅnkhxK(+2tJju׎>zӵ|լ?{x>v0bWb@P?Kwҍ#YHZd<}OCT;~*U?Z ?_>cvaeF~xu6:<Χ;u2-GZ֚BmCPKbcxPKK>9OSGI-OPT/src/javax/swing/text/html/parser/TagElement.javaAs0jHn-'d0i&ǵYYr%d]C;SlK\XW[#nރiY@$@t>C/0J 3dִ!w"'eiZ"*VZU8tR7򈭮-( aa)$mr.Z#jOKNe!ˑTMӄwjS Akwx]$Y ~pbW9fUbw*`5hc:#ڽ [?plqx~;}c4E<0x\x u#}hS>)BJR,يr9 B(*2X-\xpSo s~MhF6.\R\3NrlvDRIK-CǕk4 чLkI|"< x,eHt%JK#ؽs>3gd wl鄥j) 9{rt/!0%:la?PKu$pPKIG@"OSGI-OPT/src/javax/swing/text/rtf/PKPKK>3OSGI-OPT/src/javax/swing/text/rtf/RTFEditorKit.javaeAo@W|#ڜ(4q ؊3kSQ8,7o7]pK-5[i9u n[RD^/_ Y!J:{Bq&TvXA+[Sƛ9Bh0x5xa CP}EA s~:n&LV dVܭ*bcQWc]—rY? BoPKDrPKIG@OSGI-OPT/src/javax/swing/tree/PKPKK>6OSGI-OPT/src/javax/swing/tree/AbstractLayoutCache.javaVߏF~ "%%D8z&9EU{M]c{gll~\|}3cz[F"z|:0u0 B}vv, TBA"= >J+aL?i80u`43{: '_w{rQF( ܤ3" QRz|=.cDX ʐAr͕)" kӭ.jQ2@؆m-)aV)椝ya|d$zk a,G$&{U Dx &@}݁ﰃX-=MX>NL~z#}?ua.DTlZmBƼڑ4)4SRА2HlXYp )ήR$LY"3He:%Z`_b]W4Q'FS&+Vs)n;z"}>Ft1wBԙ4hcBvݯhz6oӚ+UnN23@h3Σ5"4rh% e$.P"1͟W\OyhDmD-NQlHr}\/Ta7=wf/gh?YXeN|wR4ARC؍f>oX}9wAE媘wDnz[;j[GUzp (&;3\KirvJNZOFu͍U b*5Zѐ;j!_C2fyop69??2WwֿPK  PKK>9OSGI-OPT/src/javax/swing/tree/DefaultMutableTreeNode.javaWs6~.N 5ɽ2M d:UH$Cқ]yHb{o]I|_4L-KrLWW ?\z5 szWPw٧˖xQ He!1H |1%jgN8cOYFbz ٌt36\,K{JObikwvt'֙ףh h'2UFU( lYX/4\N`.Fqc5%vM#^4 ٘ ?np4ȗv;nnGOnHQ|ˀhr'粊 Q%%c<$aĨgܸ"9g2*5k5oٳgYU) `D,>N!T)i6tW^3uv[k %e1[,K&,%Xb:2NS_}g*roo3DRt,#RjaS."U4y^PMV[-#G_[zok%Quiꗔ+*E3}ukc%=]+N-V,VF-ާknKӳpZXQ%ڰ4fآ.T-`\q>!x| 5:mne}i\r|\ Aˮ{aӠ+*>-޼q#ԡn};nE"bBcG F/s~UbA0j84UR.]OzH4莺6V[q)(`6W9 G;S wfuݬf/cZ?PK a,#PKK>8OSGI-OPT/src/javax/swing/tree/DefaultTreeCellEditor.javaVKsG>_ѥr)!ᄐ.W*aq,R鿧{Σ믟7-xC\+~0PJGhz<>)KZE#y> 5 >=|BcA.˫>Cu P;- ||2j;։ C/ qA 햧 \F:~vw'ƞ6Jemq4#֙P`Xx+_,; 9ͬwF::`A uF.bWZΑ\?.3.v0: y478σt0g0p2G1`0w@ ȰDSr8, @aSJ6B_.OXVz&$ Bj`0Jn.9ņw*ɳ;ߊE|%.Eܜn} ]7R'v-f)nS 3+|n]' QRB l/"٥d -y]SseCfݭ0+xh]n u]TnxI[-zǍҹ4$S }2|k鐒 $u8h?xg<#.u=PحA32xQS7A-ϫ:lܰQ{.7(a!rA趫Z\5}ėį->0H'T44\7se% 8'X:BĦ^m>%;dT(]lBX e_f+ZUb1}*[Y cUs9HJ?p[-IwgKww FP.m'mZPriXzGï1rܾ\I_U?LL7)g=i3z\; I7ei:`s/aS//mʝxҮ7Io̕PPoNʣX4#,7TA@hֱ Rzu p'/C[k:OSGI-OPT/src/javax/swing/tree/DefaultTreeCellRenderer.javaUMs0=_ :Lˉu &((+8L&+0qƒ{v[kz*]j,4& Bp&cYz~knFi`'>)8>Q@&')\jÕ3 KfI,Us,dIr1XZS8'p[j23"4>76jy±t+i @Kֵh hqMGK`)YD^Ai`FZʹ5\&59d&XͣVR1 nAXn ?cF8 a8ppFW`pR(ާe@6+j!DX%b̧3OSGI-OPT/src/javax/swing/tree/DefaultTreeModel.javaVMs6=Wb'9R=dFSGʈLdPvCkˌVze=q=ޡuzamlh.D-] h3-!aH;hW0IzS&MM7_~ಫ ڂ~ړ~Ow+ ]P=:73+Դ Y.'JfB+.d3UXACOfv;O$Ӵ<OSGI-OPT/src/javax/swing/tree/DefaultTreeSelectionModel.javaWQs8~>~OCMڷ:C we@t2POH$CNl`KVowt4 T| .`ɡ+g2@h|s0q&hP1 y` Q]"t#W6ӆԆ+ Khf6ռr[ÊmA* A\ S.!P(v쓡8&aehADob 0NFu:c cOEG3#Xg@c@kR<UfU ( lr7[.m0jn7L b[Jڎ#I/Pژfׇ߄]~ Iw4}O7 nڀ2"MҙV|J)>I-jZ"Pqe5D0t0e6:647fOg)aW(Q&!NiGU!7PR': +G͙*QG %yWKa%`SQH{._o7w]2}ߡi+ձVI-i(RBP|+piA ߧ rww@ɪ0v˕8:!>J;ؽBoQ?yʿ yEėju׾Z~BV< $!ƫ5ӗ dѪ/2TRAIXq%<3t)i"Vy5XK3a9` C _v+22*uƳoAdfdt̾ˍ~rg6' c!%t=0cښ&c[tvH.S*f);k\㯧tQÅYJbEl>*0vɣzab5nYv\~+RsX:x)/gT$Sڶ9e}"{K(AgS5cʥ5.eu`{ɿDŽn̞܌1+;idπ.8]VQ&!'2>:Yh= S@ ,OJ;*Ek_)+@^t8wMb;u^dtj0+ffiؗ%}[:BfqigPK"\kPKK>6OSGI-OPT/src/javax/swing/tree/ExpandVetoException.javaOo@x5$Kjd$L帘lkvk 3k\=Ply\E\cX(H$u-* Ûz ~!etX#{M ANmШ Y!1OぬZ&b }j0n'(8b 鰕5%PZwݜ^%k/\pݳ|LڶEGk[Mse4/LwݫakfE m!*K:PVz1VX 2鼕ƿ1#~Y AR +Y1"~dLUX,1_*[|$·,2CGc)翈 VRneɫ7!.Vǀ S˽w? &Q>BAcײTٰYd5;  >iw'q]k߹蝱S,Ԧ)xB'xBqy_I tgh/+GD+PK[PKK>9OSGI-OPT/src/javax/swing/tree/FixedHeightLayoutCache.javar0)v85$684$Br%C3ya Iov}Ĉ`Ln tcH#4Dp 4B!S`gA;mBmpwsz:q*`V 1)L0%$jJngUMP(QBNn 0[~3kONY>Jg5( R]g]Jƀd,'U VJPXrK-Yڒit{m4Rd b&q:/pF`b ΢q4ЪE6 YFupk)B'a֒L ZY2L-PKrsnܱ:sn=4/l雒P%Ny1!'!stwhoV PKgPKK>2OSGI-OPT/src/javax/swing/tree/MutableTreeNode.javaRr0= g(89Qi1v39 XRTIx: $h۷o]xpK7; ~9,!n[D_-,p$mvw38%0q23*Pt_IY>F0 !;*nvĚ.Y|TOU[Ѣ1W5M\)RUl5)gS=hnh0h*nEoߘF ۘYCS'yH͗lxM![2KoMt8}IzevL9 %%yIg B#M uǍ[!iy-\QyOG)4Q T_dE]3Z:_7MeEQ{"?2^8khL/ND{Rte/1h1RݖˊG,'?PKۧCPKK>2OSGI-OPT/src/javax/swing/tree/PathPlaceHolder.javaeAs0jZN.eymI&3 O>)jc9U]AڶJh0>Mϓ8,:(=ѣc3!@DNW耶Ce ?ye43h(&8vt<ԪEDK4H^t@ Ne`o\gUjHi鿾AIqο؋C{Fā# v(h uP,JcZ4ϱ_V T{x 4щ\')`ۣ'\U! kѵ+\Fߢ/PKrrdPKK>,OSGI-OPT/src/javax/swing/tree/RowMapper.javaeQo0ɯ8S; "F:%ݦ 7!466C"{$.0heW,OiJ*r6{7OPF9{L[YrA6d᷄Ԉ?CgNjxqhrGa'Pڣs P˖@T z鷧sJp^\ëO{!IqmgKn"/o^,Gî*f-Dc{^׽^f k K[О=/P%riyV+Ɔ ئ qo%+ >[r*YˊGSM'BdOCv']V7ʝŸJJs@?^b3*Ud5'ɡyk.te }GCF;n/%^+Xvƿן( PK}+PKK>1OSGI-OPT/src/javax/swing/tree/TreeCellEditor.javaeSM@=˯)BQ'FE nqJfp ImI %?{gn`͎`^. ͿHV U"Wa4dBȽ,QYWBԉ?cŇh Va6f[q= &-2P%vRAHm;38&4b ^qT_7up@4a{}$5W=ziXqq1R̵h15Ҏ`$I`uM0`*iȢi9M(E9 >Ey1~MeYlMi4qp ɝȖ>xS42E'j}d;,e-K^4>Q:4{iX-L+Sr>t@ * 6dM-x[Nm7$NV^_W5P4HS57a?pxƒ\/Bu< V$z;=ߞPKGvjPKK>3OSGI-OPT/src/javax/swing/tree/TreeCellRenderer.javaeRM0=_1)YQHR'M[+  vmUIhy~y`vaZ /?KHN U#LW!,4tPCuD Lr/kTЫ5ZĈ>c%oh 9L0K St[q=C:hd[3J,F]yApA E9ECH6NXߧeV._ԃ9& EEZ;1 ZTUVzn ,2Z:oe hdP0IJH |Lʴ 1]}VEe y⩢zsҺCE&d"WPKti']PKK>,OSGI-OPT/src/javax/swing/tree/TreeModel.javaRr0= g(ع9QicfrR,QI={Wt:ib۷o\:p /+n68!kD^fsv0l,R5s,Ɋg(4Њ !lXF1WTKW \ Rd ;v! k(x \@&w(,V <25 +N(zx*cwAžTeP:XE:Y!c՝QkP&NR֬ )gU+n(=в0=ShirikF?mL$L J&>Lij$c|p h@EQ[)Zxd}$[;[B%3^FeJRvM v斦;nBgsF,#=Q v6%'4`-?k\twpE@2ag蘚UX#fJ4׹{%UcOs[lOly k״n4MRHu!m wsn XT_sc PK16PKK>+OSGI-OPT/src/javax/swing/tree/TreeNode.java}R0=obS*I)t DT)j$t 48MQ9${op O:@- Y"w4ex Z4"f$+*QZp;D?cg_XR90[齧8R9,2YEcI(^zrAgdNyP Ap9qG4q{x.Y|Ů]Ek O\@hvUe@4wr$XU^4Yg܋.yk&$L| #c+OSGI-OPT/src/javax/swing/tree/TreePath.javaSMs0=׿bd\CrksrHz &d:=b Id8fRfu$*2;=9Bp&s`p=?" ia<5QZ,psXJX$EN[=JU`+Ae8v%j[i5wfN}ˡ2Ǩ@lkE7sc_uő2e_{m:^ҫEJւ_78[Ӥ*gieW],Cjjf:óo7PlLB'N!I;pIzde|;x2G*e2M#z&"9w@2s}"H$135YVD($G,jI`i_p\st=%{lMT]e$䂑)0f/(i<$*Jp&&6azAu{@5漡fq@X234쫌6<0c|o[AYGG)]3<ِ%)&2d%9<KL7m}bOs? ߲UNۍR-mgޢ1amiz\⢠pE PK>;oPKK>5OSGI-OPT/src/javax/swing/tree/TreeSelectionModel.javaTn@=qF=M04*Zlkv5UTɁ~޾y3Y Π+ӕ@#l & g"Dh\t:-߷MǾ0DjC VC#D MYHJ_Pi.\8h؂z ՛Vb%3i H\Ô' 15rrnf9uF)=M t73&}ny±#UNֵ^?^5 j f\QǓ\lB^Tbi].h959She"Z.ؘAˊO|/?}zn> EF2Um)Bca*זt!ZqbX.P RTsX5L0Sejj+-9I9ل )1u VFFګlK@ |_a4y]+?8E}sWg!y,n̪;GEaw&ȄvWNsKh-3~| "y8 ug;p8v4-hz:>86vÖG!.*P7t?162̄9ewN gOHI 56/6<OSGI-OPT/src/javax/swing/tree/VariableHeightLayoutCache.javaAs0Wpr:Ԑt:84MQ؋Q+$W14ޕ1 $!Ir0^}PK/=aC g2EznC* hP1 7OSGI-OPT/src/javax/swing/undo/AbstractUndoableEdit.javaSn@=_154&AIl캻k;cL*Ir{͛,NV;u< Z #!Aǰ`zt[,bb` %x,6:k~8g@+6b=Ro$Vi7U'QaXX \w6*z[=z75MVql]9{]gY6}MK{pV;"'Z4`!ՂeՍSArޮB#2M|p*ãC& Ҭ,͆Lr.?/p,lN3/l>;O|Fo!]×tv>hTLq# ++j$Y3e-JnrVO jё/4"}[qbIT9% R 䔀JP4t =V6)/ HGѫـc])#4x+l1(w2=7yy//'[ W|F+8Y{/8zL?W7(Ti/ Lx>wavRm'EoPKuPKK>6OSGI-OPT/src/javax/swing/undo/CannotRedoException.javamn0SURenK "z Fl6!Qw1aZ ߟspr KmV6{i5ú*"Ls,(Bҡ GHū)G5:UR#*+s Vd\n;J{t!v%Щ"!*}0Z/~8g< 7^!(=<{ͧ$>qmK*/WzuZr~wr3aJlٵ=h,KRy+Ӵ?\M(LY9yU\ كt:+DWGq]Ϩ&2ݖ;,/CA^ 7 :yR(.:Fw#? OxFE/PKnUPKK>6OSGI-OPT/src/javax/swing/undo/CannotUndoException.javamAo0 x))2;mKXvGfmIr/xX?RJ"\a1fX_%ҶBUba^?p"( rd!Ɋ?:A0CM8Gq#{T >0] F ~S}8ֶIڋ%wrL=fmUKNZxw0LU%y{+TN}/,Z:oo[- IZ"+'Y9&z}ZiV%6dw_sc0-$z$g{YqkDCh#Y=J1`lZy^蟾B$xοO(N*fLIj.ǰjxɓݐ蔗G+yލ61gDQPKmkPKK>/OSGI-OPT/src/javax/swing/undo/CompoundEdit.javauA0ͯq to-UmUXg۵Z8+* <fr ̵9ZQo= w)0N?Gq(*(СcC0UEH ߌZm/|XKG`8+UV[;ukӕo`S (?F\@1$4$Oq0yJ?5<%UE̗]NA=4Rd q9BOH 4V#zVD` kuX)v3ߕ Mr~=;Į%z$KFsڶ=]IA917t+/;cG -qㅌ+/u3r8c Gvע:ʅic¥:I,*t8.( E;лF`EPK zPKK>,OSGI-OPT/src/javax/swing/undo/StateEdit.javaSn0}_qU@n*&eQ %tUU]EӤmyHs=8;p c/zyWaYr&r`0g}ߕ!qH k,|bp$mE7Z5 }(^kh<[Rv݈?*qHU2ZH{V:յ斋Fm4:yVH S.|(m46L0E E41@U_x.)BB\$9󜬉E F-(+nܱX8e)rNrٚm|SOXyQUFIB^2N nIEQ?($ZCbsJ0NR·Rd |QTa迃`8Ctrd{?@ip~ey_2l`Nu(il_4k?-'Bl wdk}xG^P(ג@KivaWt'("cbw,N'PKhPKK>0OSGI-OPT/src/javax/swing/undo/StateEditable.javaAs0Wxr3ln0͘4 V%* &m۷W0Q|g o8EHp'n*5Q1`!w.OSGI-OPT/src/javax/swing/undo/UndoManager.javaTn@=_15$CHc55&r\lkﺻk;cLbJ`7o޼{tLu328'_$y.Jis@fO Lr+TST!(EB~R+g@= &LbJ;,9>&X: ]ZMSea%rPӺ Zo\y4b_lvtNgQyK"'C[S?'x957 Lu2*`-rx~jaRzmݳh D@,%r1r{8/pdHq|^?=WcvD*zRb+af{ڻB{wkm^pu  xoWUsCִR8{?PKtPIPKK>/OSGI-OPT/src/javax/swing/undo/UndoableEdit.javaR0=ԮJR{ 5-=:$Hmc;M8¶9$͛$ J [b=A4$d0^M߯'/#-Тc2'ZYE(3L3KJu8SU ;q,T @$jim?g`JaP ܠT=p:DQuQs./lU]٠`[KGU"g@Asʫ 9\' z3,'l9cFqI6qdSOr?,7kW8]' +/d,S>8}Iz;xX&8O[ LBNƂ**ؚ[Q#jF#hvdZ- ,=MC;r|AQp_=vL2V9I͡ye$\9 Q4UR/j<OzaƋ`5OʓTclF[Rj. <{PK}v'PKK>6OSGI-OPT/src/javax/swing/undo/UndoableEditSupport.javaS]o0}^~ObmeQEC hUM$.؞퐢}!mSJ[H|?9\?FR4 (8):. sWi`Ȅ( fP 55BXJ&Ӄ ԆK|WiRAd !- XoRTTnT#v]4(N \525(:څl#~֪~Պ~5I4O[Rt-Eƀ%4qHUZ kNu"+[1&jiivt8{2Z|-ptca4Gh6gW-2$;;[񉄕K2 S)&ܢ4(nZ L72[rD}#9ke7*Z9T.)LgƥRR[(--Ζ`DCҗ/ax- '?l/s f5j"NItU,NpwŒ#-ӃڭTXyֆ~x`Y=:`ŲvĿOvvFhK-@E11/1ǵG"mM7??PK\ۄ PKIG@OSGI-OPT/src/javax/tools/PKPKK>(OSGI-OPT/src/javax/tools/Diagnostic.javamRr0=8ɭMjӄDɩ#ÂbJɿwEhk`齷Z TsԢYgkA] .sry1z=]R4A}'G9J@ v4Oo2 P{pII: ^Y>}4(v8B&Mأޕ7yCX k0N5T+N&;>PBRNz|_۽^':ڿOh'Iy^kEoT6^r0Wa \/ PK_Y+PKK>1OSGI-OPT/src/javax/tools/DiagnosticCollector.javan0T,ޭ2ʶh$BW$ؙ퐢4k֋"Qr~qFg05rXf_%9>qUH:ȑ=P3!@2'@ ;BR]ed4u2 ^Ga+s0OSGI-OPT/src/javax/tools/DiagnosticListener.javaeA0WrJVҽjEE]@%k8jVd{o'CJt Y!Low!,ېJ 9Z4#V"kPZ5p;D?Ih,) `2Mfw^z؋H堷dj$R{= v9'QCNpͫ9!aę8RKbL=v=z2(OSGI-OPT/src/javax/tools/FileObject.javaRMo@=ǿb "jhnmN.!UjK6帶qPY0>؞7o6[is g QHJt~ 0 2 CvUd!KT+hUhQ򧏌;Z'p C0Cѽ8vJC:_J4RAwI( < [Dԓ>>["q2.Gơ9"͓|YU+ՠs`g+-O\@fU6mA9Fڳ$18NX0tdeҕhgQrK%VޣU<;Z2OSGI-OPT/src/javax/tools/ForwardingFileObject.javaTMo@=_154%ZMQ=M]wwAQ{gIL^r0{3c/Zpc6 QYH))tй o?G:C4`Or-S(th0EMuh v}=ІpZ*'H 浴R昧fJ0+ nZ!eY806 x2'Yu ? i"gUXV%J0Dfxե$ugT &\tVFpل(0nçQ=Or.D܌lNb0fW"fhv _UKyp[eJ_Ϊ#IXJ1k5"CfGJX`iJt<×Oo?<ѝ؉}@(7lŊmj,*Shu tBf`x[7ܷ^/kqʪ!7vtQiLa'ˊ#7.Ek a-Êzp0p Fq\a49(%{Lʣ Yo&b6Pϫyș؞Y=ãa(`rԍ}ߴQA̓rQ?@]-_U#yȟPK?}ЛPKK>7OSGI-OPT/src/javax/tools/ForwardingJavaFileManager.javaVMs0=_t!%eu &(Qj$W!L&+c'QFޮe+2]*O 8A w$LayPRs6ljTs ]B =B&BT`S*ͥC GZB,e3! d kx7@҂ڂi^@L(QBJԘkX,\3v*V7z^t~"EօHPkP'ORb qM+3#-↋ZFfZk$3L[s$ v|*w|ϯ[Kocx1hS#'hu{: YFu&UVUG|@!+J:ŀG< i"X9*A E5ڶU$| 3]PR![k6g72ѭJMDFΤ"Bbh LP:"lQT;W3fgV>J ,~>tE@ nK"Kܕu0gY#;¹!ɔb6RʉLO_ۦ]iO2ۍMi0 o? MDɂBk ?\1];H3Ru4>ؼ}o<;o#@_њ齪Ξ{E씲&=z6!(}J'&kTHu8)=K4n.Ƽ x4cQrfmi#}ڧ6޳殆t cKdi*vWMp]vުzowQ>C>oS6c~WPKVWd PKK>6OSGI-OPT/src/javax/tools/ForwardingJavaFileObject.javaAs0W;d:qK4kTHT&L{WL6M|0}L8nvFT!`H)tz<1,--1N&]l8֦^k'W"/ޓa׵h- C;` u sڻpBUcz:fcJaE랅Z?PlL(!G9|!7z7rd"f<]VsH[L1 EFu1)|)BZl\Tղ [4:M-?VKK&A@9;eZӠi dm URo,;Ӝ;T=?<ĝ3{ hGtsa4xR8a8@RF{>ܚIcPK!bPKK>*OSGI-OPT/src/javax/tools/JavaCompiler.javaS]o0}&'Z1CuDicd"tUs nMNBh'MZ~su8c|md:wG_$Lr%Zn p|ƾ-%&

    -OSGI-OPT/src/javax/tools/JavaFileManager.javao0ǟT,ikURز2"&m3!ESMhCu<|s߳`2[) 74Lv mF6S5%N}R"8\LQ#t2_9ӄ_46mB5J`+@4O6EV>%RCN tF 2ͪL ~scVQ>sľTI+] QQ.DZ9WTd,#M5eH,QHsFZBqE-g` ̔k$7[mj:Q N;Q5e0^3uA8n8< A8Q:+8gM@L [;]q a&H:ØxL$g B"U׶V& nq'uٍZG>Xkd2G^ODˠ1S2Aɖ۠jR5y꧹?Jm?,Ow 5c{NVG*3A3d Aۛ$R7sfyݔi=̚@aJNeTۊVmb8XI;KxfWB <>lP,|ž$Kn`?bݯ2oAK6iNss,2#wt{ )L{/1/ۄˮ_`yE'nCW6tg<<>-wPKҖPKK>,OSGI-OPT/src/javax/tools/JavaFileObject.javaSQo0~┧Hڷ-Kӕ5 U}4pwf ը:i(w},=8jW{ ;@d0\./@g;eHР>`ZYG2DJ¥KAU 5;TZ \ s.!Wu3P} YF ڕD`v ?{k/Eu>JW q5mD@c@kR5*gqU)fcin`Ti;Xͳ־3#I'mL4H!L-Ht@M| IhnRXU vDpFWs@sɝ)BBNL9/yNdղ RԒAƍ^slAk<zb[YyME]2^ sK-ŒQś (n,d R2k2mn6HdYPXrD;~JȾӸ bބ~'V}Y > QZNP Ō.d,ZO%nAݮѶpM}y`z9q }?PKtZ?PKK>+OSGI-OPT/src/javax/tools/OptionChecker.javaeA0W<唬({kDi)dڣCpخmBJ*=oy&p6g+c^/PV_%BՄr!?.MP:lȑ=>a` kRԞ,|GȌ3Ub VMl*wJ{ C:4'Щ&!j}0(}w3uQ3tQ,wgT1k/Fh ZׁzKply+w?Fc B^9*&O[Sd6_W(7X}˂W_1#>t26L2yETDo}ErjȚGS ZBdOC ]Vǀ`˃_+4Js~ F?Qu"38D˓mpi˪]~GT1r*<$-8/: _OPKW!]PKK>2OSGI-OPT/src/javax/tools/SimpleJavaFileObject.javaTMs0=_d!L.!j`h&Ga/F-d߻JM}޾g0Vtm{F_8xYƙs6,R 5 &.1X)QhL *0k`1 I~\ pX@=Fb+K4Pj$a3|02/Zi7Nbm!хV} 0ӊ1*Պ]A``'A4yO[ ֠gy+HU̖5cH,UHgFZՕ↋ZLZk4Ai$6&EG]E~Է$7kÍ7yܟD`Z]µ\)dd e= ܆"DV HK"rJGPʹi$04Ϲaz54t(m؃kSK "#mU* \aljۻz+44` {Ec='e8+и ǯs9`05*P=2hI`H0C=UhJ%`2ڰԹ$M2RzR4^SALq>ٳS\ xTD R"vvw=JU/K'u3ۇझS!v<%5T2mZO?8Q57k8ҽ)]ԸQуwUs.ꄈ4Č,Y[;= KsHF2Xf΂on[ZȅPK&uPKK>5OSGI-OPT/src/javax/tools/StandardJavaFileManager.javaQo0ǟɧ8 BB4R1MGjiZ!;4eIC,gP;-nڃ8y/ , eн}s0sfhPo0cD&"Ei0Jf’6BI`}:NkNb*XHe2HRM $j]h&OHP ɝS@I#pB7uuxC̔΃bkI4MKneƀoTb$/5( טg.)[9f}{/9fΛƋ;L%hOL3lӭ9Nkv=T|\BHO`Ǧ6ma_96Jd`%ڇG߇V)G PKC?PKK>.OSGI-OPT/src/javax/tools/StandardLocation.javar0)v8A[%и%6cfrbYZ[r%d]Cɤ`{70QQ|g!f_E!zSwːJ {D"CipܠC*ѧ j#[=WmSIU %?Tj! lE + BBʪEkݝiU <jm9sj(^-Y[}W:Z3iĦZkixET_kPxrV9F +d>FźoL{eѯ 6.0Y,d'2 I( &qtaQ4 zat7$hE`od*Vd4k#jZDP.qjpd Q i\nϿO*UWk2P%0Kj\o*;I@DIWF3"\/^'8 EOj3ȹ2mn1Y<ެxL[e^ewhgttO6%LZb /5 tĵj:uϖs8?+gt?^<PKř{HPKK>"OSGI-OPT/src/javax/tools/Tool.javau_o0ş˧SR1vO[I,6  lBi}ׄJ=ǿ{Lr5>̫i .+ry-X(&tZؠEsC0yJ5xYGH53)1|Gcp˖0 I-Iy r-ЈjBBz= s&@ϓ9N6hZ5 z|I2 #1SMsM:/oz(; ĻpMTkPxk4` `uF켻텑F@q 8*OSGI-OPT/src/javax/tools/ToolProvider.javamRM@=_I %kKSfk$8Cf*,`{' :[Ur,a|?}?NBtE,dR j: ĕ3S)>h2gSQA!c(*$"P9V=Vѡӣx&c= .P)tOQԶm(:ơET^k]Ju|ϬG]s`o,+ޟATJ=s-E Ƃ(,rgZEJSp&VX0rdվ^9a&4t4I)}<)n.Yb~Hvfͧ/G~e<O v^) \) ʕdiEPfEP=*`aJuT$ }~FB2tl"R0~Z(#a_|-X(ҳ#< 𺨶t]sz}_ ?OSGI-OPT/src/javax/transaction/InvalidTransactionException.javaQo0ǯ8SRemk "6!QkV}=&pkӞwS9ê6ZŇ9qmAP#{*f`r$iG:]VH's Ѹd<̮t؋rت@GIҐfߎhH0z,\jZGy~Jc1Isֺ6^=SUw!`w,O9AL%ņYXy{l}/,J9oզoBȣplBc >eV΃}[>-4_g׫&[gW_7sG}0cQAؚ3kI<;Qjs y"dʅku XF~k("W0){+2\Em(!>FUroDGOrGqA{Ea3O/)|1@OSGI-OPT/src/javax/transaction/TransactionRequiredException.javaQo0ǯ8SRemk "6!QkV=&pkӞwS9ê6ZŇ9qmAP#{*f`r$iG:]VH9~uh\ L`2&`q2m<:G!QR4ٷ#Zn3<fhy}-#o?%Icc9k]r]/rSw!`w,O9AL%ņYX׼ ԽU^zgMj7a_ 861IKd2+>[[ݭqEeUU~UΫ/H|9#>tlm1U|( lɵ$VIMם 9<Z{µ:M ?l5WhD+q \Em(!J1ƽѓ`3F\xzBOSGI-OPT/src/javax/transaction/TransactionRolledbackException.javaQo0ǯ8SRemK "hx#6MHT0դ0,F xPK WPKIG@"OSGI-OPT/src/javax/transaction/xa/PKPKK>2OSGI-OPT/src/javax/transaction/xa/XAException.javaN@qEPpzNlȊFks 8d[cB{gAlrȞofg3݃0/Z,-'m3n*%z~kDH3+PJdf VLjK n!"ڨ<#U xWp/ -\6A )۪F>q >wA]~߻fRE7}fMw̆~ʺRi hg4v<}QDLQk*6k -1fsRʪlFhIefX+ƴ. X7bQ\x^pr1#9 c1 |:7sxh#P";o$gI[+RgR+Cc5(pFeRu ku 8[q*VStT/O7GnfLsH{l}*)ҐJ;7 NHyD~k"Yp厉Da aF=nb/xD~i"ȏʞ֢w# GO, AF'쌻1Yo~Db/&{&]oK!^ 6x,3+ax1OSGI-OPT/src/javax/transaction/xa/XAResource.javaT]O0}^U Ҥ !+ad(M-3iAK*@ yhsH7/44=gnr% mv{ A*br21OXl$+nN|;Mʤ"eCV}P܈V2P 9OxX奴 WsJ.K1r\-R:jm6n[B.[-V UQ,eJd .1 U%tZS!.%=-g&(*s%i;}F3|RO.IӐ\I8"7}@( \\©5exΥercm0@BJR9K'Z,R0#ș\qeʪPФ|5Oejj/C鵥%MLuMky1C78b.^7QH^Q[,g^pGvþ=<N8v%K޶}0pz < J\x'.؃Π ʈ#-m;A:AQs0WGLF#czȄtznSe>c b0_Jĭ+xXS_Si7a&DʰIpᝓb`#X6{7ђ=#%Fw(t%,;"tŢ'ukdqܽ]O}81cQE:I3LovzZ"mW\׿?PKRKPKK>*OSGI-OPT/src/javax/transaction/xa/Xid.java}R]o@|*OIP!$xp>,RGڂxXk3w8⿳5~u3s\{p U(i\@PeJн_z+! ȐS3#Y j%*LvJ?tV7rGU s( ReAHHծj5nO{ZZXd8@ŧh[ѧgkm~0hǓb_bPf'(bFd hY ͎#`ŪRLXk ( XhUNuQmPɄZ$}_lNCw`aw$r` u8a2p >Ѵđ:T9`yE^HY(Hٚ,j, '-Tw¸k5,0s4 TǗ[4<#{(OSGI-OPT/src/javax/xml/XMLConstants.javaO0ǟ׿'@mCHD+)JO\[oN(V}|W[% G1kn .S^??vk5f)XHQj̠*0 )-NҢp,daHBLI4 $Ųl,8%FNJz7 t[S~al^;&v 5gfu59j UBQ-R>%֜P izr]̚+2FieR5q m7 nåqNJhEn~ Q8`#| AJFqpS*a [ΗSqaV S1)&#̋*IAj)=VMRnWXEui~8e~*)[Ҝ#%5SӞ1Z`NL"厇$'w8$Qp9N|H~X-{'d_$buI]{7}??$_`Jqt O (Qq;RSi/sH\494Bd8Un!IjPK)-EPKIG@OSGI-OPT/src/javax/xml/bind/PKPKK>'OSGI-OPT/src/javax/xml/bind/Binder.javaTMo@=_1d"jHnmH*Lk{0^wwmB(J[wf޼f֝AOdsɣ+hc:v@Z9T0B&rL!JS'cԑ6ܢT\pbw2 :l!asH\!ap#,LO!IVS+V}jj kF 2z&53:ei-dԉsXU7iJğ9؟ˈU|Iu)i%&d LȕiK$}5lc)4\ zmr环7csF#g0v G.ݱ;'p\2ꃳLD;SqD,( >IKE(P2 Wf& LWGLNA>0@`3{Ķ>',Čx^psv9<5ՉՂ'xӗux< L^zTR._M$l=VM &KA;F˪?Q]/~L?kϥʺv]I۠Kc!xHS)Waŧ^M]gm9}Zq=}=xt9}5g%1&dnjVϼ L߬ƦΌ BSO.1tCv܎ khPK&\PKK>5OSGI-OPT/src/javax/xml/bind/DataBindingException.javan@)F>'6'b-j%pO tw1{f1Ul5pX;3|W\BGM´:N5 Y Lokx2 1.@ˀ=( 5BԊcć_ ) 7.a2&['qT4RY R[ $PM;dwCQőӨr+8]pA˻y";Bk}8P S *Vzz5vq~2U!rfEJ4r*Gk$+^ht2%)102 EYN1X?l1J(ī ),2w Jg,}@C$7-BxU'$bA[*ؚ:Q!TjZ#hQ7dܵ,LM Ya|F8b/dy]sV1Y =־x+PK~jPKK>2OSGI-OPT/src/javax/xml/bind/DatatypeConverter.java]:˯ZU+ݶQWTU L[NmUǡBˊP.!ǯcrW0PJlf_(zá/g2Fhw 0vhP1 5u()fkgfm_X,V)κǚ}8Fw׃h hVrM3*fS*iwV9 -YJit;I[koPژ~at7(:!=LC<']1 FpÏ.v)e4. f@2K_Ew$K2<1MMf%25G-iFPιqjH`02[7/7Pբ<u/lΖ2US#-dbH-#ت4%ֳ:θq8qAD s6ؗM'Ի3gw im%Rk=]YoW/oH^SJ  Wu;`ʄi?1';OSGI-OPT/src/javax/xml/bind/DatatypeConverterInterface.javaS]o0}.':VӤO|k 4BWULr ;>4: >qN] AWfK㩁Fx vp&Beӹg?"5 QaQ䞇(4F)B;c!+oRw Wkb)sH4k\Ä'132Lw,x*sȱagD43eԘs5=VTIխ{{nS%A$5(sE2*dc5as XU7\MrbLMqmfkhM :tځ4mGt7xc{8lGM!t?}:B_~ H#wp)8!@*a"]I:ÐOxH8g1B,gukVMF6MSn)>ejj46/6c o&ޘ躖c#̠0ZrQe])I?_Yg-)m l_8"bc3cw6^Q:L.ZV0L(PRtW\'^%("Z#kc̔qVaj$s+q.I"q[;\aI 'viEzaj"WJ '^RԤi)t"n>n .^ڇTG1_j 4F y^ Vל-;(MryajC?ZoUM_tsyij}5r`uesKWS zƭ-o7K:;h'Lk WPK/z PKK>(OSGI-OPT/src/javax/xml/bind/Element.javaeQo0GyJ m}iUD >o`{ ]'LjU{}w7Xks=x̫WPa~Z}\O8c:vY!<ʊ?:na6f qzq#֐txHJfB?\L*/.v ׍~|$1X6鮽.y֛|`֓9X=Hˎ3aJډBuRK8QX 2troB_7plBaȊ"+A9>vi6;C϶9 _= 1e( 4 U[S ZBd;!K1`d:K/蝯0("W).."3#G6yQOO7PKxPKK>%OSGI-OPT/src/javax/xml/bind/JAXB.javaQo0ǟOq *нm&ݲ!"%t];w&MgT[-!A~`# M&c!q4טDp( 5BX3N6BIxO``t[@Ŷ 1(pñ $pUսVUwOOqJg2 gt~ 0ۋ~+kAж:žEPbM0-O)l &Ued-( H{V9խVb F-m4:L."kAў5RT6&a (;]..LpShszp~ߢJF.)\9w]@R$X NɢaB֨%e5JVCs)E%,yϣ:tfS~&d~MFuKV/GMeZ͊CG8?[X3=wp_(YGOǐ֍MFVxGΠ Ik4ֿMfǓv6ICƬ|@Mi 2z :8dSΎ=^Y3/,tr^={ K㥪,ŚYڰ,gPD܈40nucW5J}ȲEsי&PKGPKK>,OSGI-OPT/src/javax/xml/bind/JAXBContext.javaT_o6?ONI:k8Φ5KiC@SgM$e(wQt~!w<[po/Pf$,"5퇌Llaٌ،ݴoGB'yLtqX`Y%v° AJvw|3m;pۣ/`7pX{kB_t \]p\)_ 8t3nLY+l/}5M^gH x5r%3~[`-$YNvu\5C;h(%e>G)[Oߒ@Al[]Wxh,&@U5'E%1=\i~o~jPK=EPKK>,OSGI-OPT/src/javax/xml/bind/JAXBElement.javaTMs0=_S NN`MC t!v[z#P$#qۦ-r-齷oj;Fj/,L3=@o;ۆCA''rS3(e!(XJ W~ЪZتl RY( 707)T-ښEUVqNPegD(h5ot[X[*ǾyO찦w>h\׬ ):N r *z2QsfLƍ<)&bcZA'A4Nj^pfAOLg0x2 i N. EFupSh.!BgavL)Zyr\PK KnX ̜Kn W~3WxjqS:ZLnC#-xnIG+}Qs#dH4x[5|Y 1'vKDCA-Wpk䞇5\ _4 uÊ1(q7FwBǏ[o)zt1jme#;a/$/= 9pք93B.‰XnYJ eB{7jPPK2Ao{PKK>.OSGI-OPT/src/javax/xml/bind/JAXBException.javaAo@x5[Ch6 9.`1:&Z>ڙyo,ƺiDTR }]/a}Ŝ,-e!;xkR5!*Eʟ6W2VjQ8DtTw-F존Ce=JڥT:HToni]< Zt J> !\ x`6x6lʧwO ^]i):n J?!ْR)J\o(%Z-fަkBA{FVݦReAY-yH xo_C;G*$$!i'6M2Vax(x)|ߌËu#qfo-NDMf3bC2 * < 1OSGI-OPT/src/javax/xml/bind/JAXBIntrospector.javauAS0xS¤Nʭd m2(G8Jr * eOo(Lx 7D))tIOQ>c rd!\ȒZ" !$(WƸ&8/ F'boZbmZ&Y,lr8g2g$4;xd܇v Sq>"rWk*ZMWْ՜ ZpWFZz &QsV]BIԴ(`ɯT{kgC4x?;EM(a!i9\ վgX|k5t "(Sy!PKt$PKK>1OSGI-OPT/src/javax/xml/bind/MarshalException.javaAs0x 2!ZNf0iH$cL{WඐN|Gݷu"ƺYYD\R!0>bN̖ȍHYQ ܚW"O{ +0:U7{]c#Pڡb%K2B7UH>iU< [ tT|Z&B𬝫MD@iSc$4fVd- a=DTX2k)hQ;=uca5ɥuF.kw6_l4&:q$*N4"wvx>db6x6NlʧwLCЮ2cJ?!Vɕؚ*jQ %*2iZ-^; }[v2ZJ^> cע9R}R}^Iz^*O뻾.&[a=f#ݓUeoG+OSGI-OPT/src/javax/xml/bind/Marshaller.javaVs6~.O䆊ftI聝%mJmɕd~Ml#@R4lioWk;|djA^ i*9>o~zF2 !7\xBE̥ 2Y?NqmC4مX2,#00)ynAHUN85ck Y r|o536ә焕ғNZٚNY^_eʍ*ƌ%Y,B)&U\ + Fi`aQamS61 MB/lg¶n#!G=/`zoW@_c0_e4+gurXULc11&'p3Lw &&̖K{y@Fzd3 ,%E#/"#r=fx͔)hTo>, c W'l̔H1L! G3Kca1nOkc!Yq | .{5GJpyq U0Ȼ|X!Y% D!xfa/]!xZ*e`1c}tZG#}$Lv%,v1>Ki (L߶Z#T5F؅ƕV;PX*7CaN%*d=^+tA$_b*4y挨Zek_C^yNsʑ^vB+wWc<<(,{ wxQ|aJ~/WU$Z-C›x*Z4mTߒ*#UzrH{O]gj|"0ke>Bw).m8//!]5=5PKn+N PKK>5OSGI-OPT/src/javax/xml/bind/NotIdentifiableEvent.javaeAs0 76'- ̀L-H$=0IZo}oC@^~!Hַam(B (-60 #BE͟$'4h k/X-G͝qك,#F$j D8Y\< ,r 4BnscO8RnwLT=?G2%eZ9=|E} yxO"oZuEkjd7S'4'f 2`mz 7o7o}'qCU$@ȑ94KΔKt'g~TGOfn| ~PK!HPKK>5OSGI-OPT/src/javax/xml/bind/ParseConversionEvent.javaeAs0 76'- tL-H$= I0޾*+(}6,WH ay^ ߟV߆WZءEs:borOJ5 FhQg> %%:Z bu-j^A*E uxP; 6;\.gU:rWk!7C_ss qLwfL=W=25OSGI-OPT/src/javax/xml/bind/PrintConversionEvent.javaeAs0 76'- tL-H$= I>) 6J jy :BX^CUavhSb р; $ZTWBxDcIIְżXxg`=BC*HBz=:'CN\ͣ/99qą8RIkt͊w=2qy%vbe@y)O=r$j( z3TMhMHX$n"-Bo{xJv$ۧl.ݧyƣ/d=B@Ics:E( 4jB+jd;UG4;'2`m: wzח/GqN}$@%ȑ94Caq;#Jem=KI'x PKePKK>2OSGI-OPT/src/javax/xml/bind/PropertyException.javaAs0x 2n-'' d0il/F\I0@sL۷߮<8 pK],VݬYY"*K)TF莆>0^i1'KfCyZf,UNnE*񝌕ZaNbkJ;ԖCZ,eImFTjV>'}S'X.PZr84M=qM1(vp_N=SU$kaW- O *Dʬh DasN{H'UчKC&hiyCM(tqEIߛŋ/<.IUgS>}B4Ƿxzʸm+'`L|HVɥx4UԢ zCFDȬj06\K'>j.hAl6ܮ0*Unf{o9urOY5q"z ޵6 0c 7 {#l`27ڃ˲7Kx>P|4 _§oxgFA9?2PKDrPKK>5OSGI-OPT/src/javax/xml/bind/SchemaOutputResolver.javamRr0 㿎W=_nfH8:L=.򆣜N,Bw|9cF\:Jr)PKF#hPKK>8OSGI-OPT/src/javax/xml/bind/TypeConstraintException.javaAo@x5$6'j&r\lcv5E:Fj`3y3rgdr=LOQQHRBj8zc+-fdl( !2%e)C22p+BT?md W]_iS޵GtAi3RڦT:HTZ-ݪR< p J[Bt+u]qjZ;GI2~ˮ[՝*Z^I/v%Jł6!9]F:>^ZLZgr'KG?. N N:%qxyz7}4Ey" KlɖʥLy4W"'zCFD(ɬj`1\K'\:7у؆u.ʮZw% 7w:Rmġ*%OH Nx~PKC@.(PKK>3OSGI-OPT/src/javax/xml/bind/UnmarshalException.javaRn@<_15$Ch629.lkv5EHU|o͛E u7X;tG,P{5^wЗ1HY2[Cf$2#e)Gr2pkBT?M_X!i:%+YhQ 2ZitÜ+}ˡN0\pCŧ)µڹ`4M(CmAym<$-n$kag- ;^!*V%k-Em C|W*za:#; F~ ؄B'J\Gi=]<4]qfQ2')3M< > J%Nn Ю2˔>IX$[Q&W2ckEA(bGlk,04H'ܡ̗4'.b6e*U-F~Α_}Cy7.; 35kT]b>U|s+i98cB PK73 PKK>-OSGI-OPT/src/javax/xml/bind/Unmarshaller.javaV]s6|~ōd9S4jT)#ʉ' ) (Z %1حcawoށsVZB7</!B_Ϙ40Ez#2!Jd2B v<L>6BIx. Nӳb2H$ a`.b 1 $*I+i˂BqJS˩ӂB],M SxC@>go'73Mx60dz8N'x7eăwvL,w|- sUJ2)b.BjM.2@XjIA:m!E",^_;|]@e',6F&\%c9 #-1~FdʲǺg·9m8Ns]I wEچx;pgSx{øQXxSnm{x@[5ȯ;UAOgdZ}2o弃m}ై \Tw*kOՠ8dg'o;]-ڲ kEq3>0Jqwԫ%62;͚/-9!֐[ITtS,{h6?LW2Xږ̸=GGyw+%:^lyPwE('&{_kmmaѬzi{dWP.xd̡L3K"Oz<:29?BhtJS8nUkI8x/սɾ 7G40_e:<`=Vʧ>YK"V/7k/PK( PKK>4OSGI-OPT/src/javax/xml/bind/UnmarshallerHandler.javaeAs0Wdg\psk}"f`Ms`BwLrODW\tg+#\@+%.׫Շ%"۰J;th  z]:"ĝ(3,;Z'ps/MG[M86CjTbG 5&Aq3xx`>R^}8}oIzȸ:'`L"ojsAr%^4yFy"жku Xy%[Iƭ z',NUa!u92B[ nuG;nF|B]yf,ul1\E;xCOf ?ï1:PK@iW!PKK>0OSGI-OPT/src/javax/xml/bind/ValidationEvent.java}RMo@=_1Ɏ\p|kCRTK$ʩZÀtw1b&Z|y .`jgaO`uMBlv9R4A}gGZYCcL!%a`4,I'Bk9@I5sl,\AZGvXx8 nh| ay]W+]kU,z˪[Y1{KoO V-kEJ4r*dIVS0h 2VӶB{_86!afg#fq6u$va&2X\'W&^'u aj ȑ<69`b'KOoKV*su_MgWιr 3Neȹ=PKq/!PKK>7OSGI-OPT/src/javax/xml/bind/ValidationEventHandler.javaeMo@W|# nnmNqKIv]Jq;Dp+mΖyM q0lC-:Gl&#ը6Ы-=BfD͟)3ZGZmy(M. κ8z -I{ͧ4!D.Z>uQ߳IIt,aUXh 9'ta1`rR+jmB,+!/g9+2|yKf._jS|S d+|ˋ-9x26l2)yE($"WS]/:N* p6#@^1^aPE.├2H5w+-h[,$5#l}Dxd]Dd? Ga?PK5(?PKK>7OSGI-OPT/src/javax/xml/bind/ValidationEventLocator.javaer0)v|3pSuܖfN&G!$* cO&Sg}" ֺ;Yi$Wa~Z}\?/C2hX2r&[)PY,W%pゖ)G4Vjwls/M[u-?z!-TA΁T tMhtœ IΩ]u-&98} a6u\6Monzګ{i #* bm RiO=餪`un۔:#޽+#~-q(8(7yw?,]!`&.N}(yq9x0!G|P PJ jM=j}D#дkXzFq7 #?S۰B>H#sh*NYf#*Ղ;| ֺ[mfNk|+^EJIR,%z_Ǥ`9/(׵cZUOPKCRPKK>4OSGI-OPT/src/javax/xml/bind/ValidationException.javaRn@<_15[!u 9.lkv5E6HU냭};o<.\`ڡ0KKDe)pxB_#-dl)Ȍ Q%27}ܑR+!i:%+YhQ 2ZitÜ+CˡN0\pCŧ)µڹ`4M(CmAyM<&5nnUIзZvCT*KZ@i1IUa5ɥuF.kwl N"N;8{xav}4G"1%"%|z(y882Cx,S8[DJt&alE\Ɍ[2"֯ղӔr#pAp_=p)åT8%爬,N2?M~>_=Zg(5V”e[a=f;bmtڃ˲7^s0s+1gS~g/YS|PK!͐  PKK>*OSGI-OPT/src/javax/xml/bind/Validator.javar0Sa Iv-:6n3I,e(5+6L+0S ? ,`d]#Xkn҃0/ Dн@{} 3;aUK V'(4P_~ڝܡ\ pеvY` J#ip /p`i HlnVŒC!chсV 0Bo> cO46ĮTWlgw'hS@A+JDX րTrgn7\23 SheRqeJ1R Q.(V>_sg3:&3ӫ`SZ}߃*#\& Ln"D"񄢉b9B.kTAjɵVM)f6FPϿ#]- 7"9^S$4[V1UK-T{cO!'gn;O<&̂r4n0ly9Hakqc(IufDIL _s۝c-y (e;Y)ܱқPoa%;̤4'qPKVr?hPKIG@'OSGI-OPT/src/javax/xml/bind/annotation/PKPKK>6OSGI-OPT/src/javax/xml/bind/annotation/DomHandler.javauQo0_qS@u[U hKr9vf;TD-IlknFT[a>EU@"@M~?4,’,1;xT@ 2I9Xc`/ w[J;h-P I@BAG.{qr K!롏ֹhu]GXj$OZ;zH'y6{d- É7r0 Ӟ3 UE`u:4m aֽjڙ_ m`dfdiytuX)Y.*eXd1t1H-O# nס}c|SBOH\"hj"DАj6R¡;N7;Zq]дn)wϑ){{.!|IIUķnʼn^9r:>i>KpuZh%[oHQH2q0Ќ^"g_,n Glm7p7PKPKK>9OSGI-OPT/src/javax/xml/bind/annotation/W3CDomHandler.javan@S85$9*9@ H$qz]cPw1"!i9N<8*7K ~څIC$g2ES7ta2 LѠ^a)JT2C v,6jÕK贡NIlTۀT* ,@u.!UE٢.>#VC-tF%-'-tYZ[~YC*6h>u[u+W\ R6'VjPXbV9ZseQ [3N&j>i;Fy$tQ'gWGi4ţ&SLxOt ,>.0sEHjdJL4+#jZDP.qk59 nm5k<Vl ιB&iMWVsR|0Tu%ã> 30SE8VB44kć:ڕ_BOp$-WHZ΍@Y.8Ԍ~ϚG+jMY qOt>C]e{??sUih-_CpCrܩ7Vg`fǢ'PKKjkPKK>:OSGI-OPT/src/javax/xml/bind/annotation/XmlAccessOrder.javaen0 S9%ggm9 !N(ی͖4I{Q2$??og#i5&BC,ϰ6hHEb р; 0+X$Es^zr[$ aa/Z9OSGI-OPT/src/javax/xml/bind/annotation/XmlAccessType.javaeM0˯唬RHDE H9U&-خmBJ*;Z´A-gB>,@3]C24OXLBa^ԨB*ZƗ9|Em/`i2[:cBo<o\TS#gtq$=di(:^ U`]}iMQGzډzLUJbmRk4қzrȃFgSsc5/{ij0 s <%.>^, "rH3X&.4#fH-GYw݊&)zZEyPKuPKK><OSGI-OPT/src/javax/xml/bind/annotation/XmlAccessorOrder.javaR]s0|ƿ&OI'(oa&q%}vd$9N)1L '\L5-ʭa6Er+*e0NߌoGCb4w3bp$"Ci0Vng+c%Ma4]9jBk8BTϰ $dnzi㜞)uϡ6SCC_s pۋ>^[kwIu3Iuš}8 $xMoR ixJ/5R* Yv\ɅZlZ"s% d$LƎ!L?.V);OSGI-OPT/src/javax/xml/bind/annotation/XmlAccessorType.javaRn@=dG:ͭ*84EIl pS5 x[إ;Khuؙ7o޼əg0SAbka` Rp" /ߍG̅!rH;18{4A#3`~S1|Fmpa>5MA5PHe1H@.JܧX[RUսVmקgqJ`sTP) n{ݳLڶeS̔.& LY0Z?ixMR!%oAiFYTZX!1ۖkt40VMcLF ۸CڏxHbE< 0 s:}p~3$˨k& E$E1Hi4Y4@(F] jH`hJQ mc.hywGmt]s-_Y(iAGhQ᎗ ~7hhkȹ`t3@>Xer-ٝ Ly͆TufJ?MiCJ; ;OSGI-OPT/src/javax/xml/bind/annotation/XmlAnyAttribute.javaM0QNɊBvUii¶YRvljqB;ؿr VAp& rzYxvԐFu#k %Dftq *ͥko s+MZ ^#yp oX`g (dMh7SŒ!sH@GRLЧgoLa؉ؓVhiS;Ѡ֠GU:*XN @*`Bi  ZVf` MɵQ<͋b/6&`3xQZ(e$IgQ66^GYiuAxR(;e+ Lny"/*yF&<TtZX5֦-7̜~&}cvm\49OSGI-OPT/src/javax/xml/bind/annotation/XmlAnyElement.javaRMs0=׿b'RN>jzhN)=Ȓ8N;LӁо}>O8;#ʍa6UI@(*C_?#-hl1gI.Ebр 5WZ); `4n(HB!$2^Z+f?gJЩPWqzk\f2iۖbM9X;fexAk%Z0Te<% ՜[#P.\ z\XgDڸ'Khm\ L J1LdInz 7auH`lGhs9Zǀ2x$Su>  ~dkD!2ʆޢQj4>VKsO#E%w?|A =Dخ,*g\Qipk̏<8f1:Tmw}єJkb 皛]OxWBbEFv-.®~MJ*L(~d wQDWp9 .-NQ3ɭ}$}~}l Cy{cwݼ=6OA PK M=(PKK><OSGI-OPT/src/javax/xml/bind/annotation/XmlAttachmentRef.javao0+NyJ*Y߶jRYB7T@Al;'LJ<}ٿpVw6Ap& rzYxvԐF#kr KE !XA)gTKV0Bŕe-AHF* Pȶnv<%C憑сVչΘ#'U7'oU+NmEZ=WTq>눪`96l )f7\.hY)6%F7/J?PۘYB}FkMfC$AEa Vxe& #| H-8OSGI-OPT/src/javax/xml/bind/annotation/XmlAttribute.javaRr0=I/I'870SMۡ(kG KFd:wV;ly۷o5k^m, !89j:}3z. CѠb#9J@ v4,OWԆ+ W0SQU 5ۃTZ \ .un}zzYFpF @`}x66&|vP+]Mk&<\&kRW@c@ϖk8kHU2*XJ4R*rYvL)g}aڳF@1 ( #Ou A4 X0_-Qw>G,>kdrgq P$`KhjYP-jIAƭՐ^s!\;۲qYL3|$hQpD h+{?^3w gt'|+$Xeoп6xyM Ң.olZx^J(JJVpq0;6L)t d{_PK6 + PKK>6OSGI-OPT/src/javax/xml/bind/annotation/XmlElement.javaQo0+3]64[4 n}4&xsv:MU۟=\p#]7ifg{uy|c~枴0GfkF ^d"RTP5p)+}CcVp.N ^WP=(HB&$R,.Z-ܦ9UN+ 紡Qv wq0uxi#kxM-nw-DkJx^ȫ5h<7HkN{׵NVgZXgĪr/B{HW | 8{l|Nqlt/ٔF7Nk<)2:wM|"$/,dђ-1H4W:OSGI-OPT/src/javax/xml/bind/annotation/XmlElementDecl.java}S]S0+7%aRF`< NPe⨕eW1L{Oi[)3`XV-nڃi|+Rp"t/Ͽ~/{mC"41bp$2A2`~Sz><6TpΡ]9MYC7J AB":ʂPEJ[ hiYxn9rsjh5YX[} VbV| wX3q?AI44&xERVWPjFҩ^ia`ʹ]q&j Wd}@q? qߑ< (Y0apY0 i~H9s@2s7E$˝$Sa*"%k*yKԊAƍՐHQm/w(?7_5[%Be+}z]sGm-*]rY㷏A?KʆEmKr2XlS!SmϫZ(zJ*da*;i1tJNN7a^An^` ;yM3ZG'::WGЊzbh$!ٰk菴~wr0sǤ:1V!FΎ5}gyPKYEnPKK>9OSGI-OPT/src/javax/xml/bind/annotation/XmlElementRef.javaRr0=q.vƕZOgBm2u9ʰ`BPI{2Ӧb}\yp>hQl- |)W)1툹2Di Bz#G)*4*C vq}|Z_&a*j9p[9\ǀ42:vHp|Jb3 y$Ԙ\dM /jZ#Q¸X v?|&Gsሾ߳})FqEw[ލ1wIEhQpe RQ*i2w΄mOWH $P# |_]@̏#n6nsN7[){d9:OSGI-OPT/src/javax/xml/bind/annotation/XmlElementRefs.javaQo0ǟǧ8)2'VM*K֒ ȺjڃC lfTLh`.<;-q6U^_ a|9_Oۆ) hPq܊ -4ryF!2ϨP.N0BɕT@* ArQ"!ڂZaw}ő6ӁVkgmf6kۖ)]ʣnE%KNeƀƟT^U7Z^hU YLܶ\ c4iSK IL}~XS؏0H`b-4\E?zaR(j* Ly"$g:"3JE BQKjԕ0nΦ[<}{~`d!K}ʻv1Rl-J6}R4k]0y3@;>UXenv9.,&^lsN_1i~rL?̓PKyyPKK>=OSGI-OPT/src/javax/xml/bind/annotation/XmlElementWrapper.javaRr0=_C.2 NiJsQ+K$cL+pdRZlY۷;k^n,,O!8Bj<~7z_|w CѠb#J942G v,O7Ԇ+ WBQUۃT \ .nu::ZFpF 5@`}x6Gm}vP+]kFw4'[Re@c@㯆k8IUR*X J+5R*rY¶Lɹ}aڳFj@1 ( #YGϋAe&aϢe-gC@֮ɝ)BBBL/xFɲa%B%u57VCsG#x-W}B##:lv~e3I?N]ɓk?Fҝ[&oWES񊜹g8Lh;ǿBBQ.5Qx7vdfOnRR7\Z^ִ9УaBS'k%?  ؛A|J@Z"Ʌpz,0xy^א' PK+65PKK>7OSGI-OPT/src/javax/xml/bind/annotation/XmlElements.javaQo0ǟǧ8)2m&%tCkɺjڃ6MwNj`g\582}' *e0>^M'mC4w3rp&7"Ci0Vng"S%`!4\:^P$a3l, v{38wFپFȜqI?\',AҽwjͿEMgɚ:sN\q] * +r7Ȯf16,'^n N_6~ 1*PKמ PKK>3OSGI-OPT/src/javax/xml/bind/annotation/XmlEnum.java}Ms0Wdg\ֺm8VHTƞL{W68i_=. .`ڃ¸*!3Y /Sˉ!qJ ;,}"8 /P,%j[e-Cd _Q$\s;h& 8v,t T\ PnysrHBK\lώ}8i&Zq>'íh hqM`-*XN^Ai`FY\[.)Uٞity'MJ?PۘQB}FAj]$AEa :ʢULS@j}]dv) :Y2-&ڡTnX ,F[fG<ÁF9$xu]R Zkc7*Oԙ/̌$2;ga]NpҢʮ{#d)1߽#~<+ LK ~PKcOPKK>8OSGI-OPT/src/javax/xml/bind/annotation/XmlEnumValue.java}Ms0Wdg\psk2 I4Is` QI30:}wWޅx70M>p3#/W7Kۅk!J 1jT,\"XQh,*0{e9}Qi.\+[l 16:J^#1˦<:lj!3H@K\LgoL{y}߻ltJUyIpDI\OvFAᏎ+8*gyYRRHWpQ-AL\ųμh/Td$L84 ưF0 nSm2ʃV &0S*4鯒ƆТ{wv dt#6u ނy [c9g PKܽ:|PKK>1OSGI-OPT/src/javax/xml/bind/annotation/XmlID.javaM0QNɊBvUii¶YRvljqB;ؿr VAp& rzYxvԐFu#k %Dftq *ͥko s+MZ ^#yp oX`g (dMh7SŒ!sH@GRLЧgoLa؉ؓVhiS;Ѡ֠GU:*XN @*`Bi  ZVf` MɵQ<͋b/6&`3xQZ(e$IgQ66^GYiuAxR(;e+ Lny"/*yF&<TtZX5֦-7̜~&}cvm\44OSGI-OPT/src/javax/xml/bind/annotation/XmlIDREF.javaM0QNɊBvUiiBZ]RvljqB;ؿr VAp& rzYxvԐFu#kr KE !XA)TKV0Bōe-AHF* Pȶn<%C憑сVեOޘ'U7gU+NDZ=WTq>눪`96l )f7\.hY)6%F7/JPۘYB}FkMvC$AEa Vxe6>EQ?OSGI-OPT/src/javax/xml/bind/annotation/XmlInlineBinaryData.javao0+NyJ mդ҄nh)룁x&U{Nj?y{w,e;(^ LlLnmRC ɚ(4Љ߲>cd_Pi.\ Zd MfWb4l! tɃk(y[\@.vD.GFrFZZB`f>>;cˎĮTW[ J7D=ڊ?:lU2bYRRHK+neiz\ųμjOF*\@mc&~a2? 5yOm ~Q lbXnUVG9Vs@jClm;OSB)OHŜx9m+\saPצEp԰b8/PK PKK>3OSGI-OPT/src/javax/xml/bind/annotation/XmlList.javao0+NyJ*]߶jRYB7T@Al;'LJ<}ٿpw6Ap& kfmHRCKɚ(4ЋBб>SąϨ4K[l b=l! Ƀkx;\@!nBL.'FrF:ZUB`f>>;c? ǎĞTߜ_G0NWD=ڊ{|UrbmRRHK=(n]в2ShmJyo^4'#~.1 ( RךV6ؒe6vFzSvdCw$iyt}NpÅAU1_fMgPKPKK>7OSGI-OPT/src/javax/xml/bind/annotation/XmlMimeType.javaMo@W|# nnmT)&-cG](6U;_8p W;|=99r>_< UjQcᑃ5Y:QCZc R7Ldve-A@<xȱ5iG1bIaa$g\̌kgLؑؓVh%QFA᷎+8DXkփT*3R.*,MZkx֙gMH mL$H J&.Hĵ&QaM>`Fa2J͚n X?hte&4OSGI-OPT/src/javax/xml/bind/annotation/XmlMixed.javaM0QNɊBvUii¶YRvljqB;ؿr VAp& rzYxvԐFu#k %Dftq *ͥko s+MZ ^#yp oX`g (dMh7SŒ!sH@GRLЧgoLa؉ؓVhiS;Ѡ֠GU:*XN @*`Bi  ZVf` MɵQ<͋b/6&`3xQZ(e$IgQ66^GYiuAxR(;e+ Lny"/*yF&<TtZX5֦-7̜~&}cvm\41OSGI-OPT/src/javax/xml/bind/annotation/XmlNs.java}Rn@=dG.5QPmQSnvblETuy͛ .<ꭅi1$H6 Y L/7sۙ: >38;*P,%j[6$\ :dLMf׎zhd2PQ; $Pm7Jn}FF[ps ;>>[k GžuМ&8[fcF6h hՓU"g@iFYT,zFUvMIj{̴?ys&$L l,>ZJ6k4*$eF(>G->ﴛeEII鰠 MֽjC-y"PdZ ,MC-YasF?{6~NK]˳E;r ;e5ZHO3s.u%}o/Cah5OSGI-OPT/src/javax/xml/bind/annotation/XmlNsForm.javaeM0ϛ_14{k9|QQP tG'´;TZgg^Ǐ<\鋡`\N`&H,O05l}-Z4'"V"k*QZpGDC&h,) Oƾ`4FZqtY,AsI(U:gP$2h .ܠ9:-wtN#q%Vku:_fS]{٠`wG7.. 4S`F Խ!GA/SuݙW[ $4$OЋ7OSGI-OPT/src/javax/xml/bind/annotation/XmlRegistry.java}M0QN*to,mQd -خmBj{ ϼ3ʃ+XK5j-l¶LfmH@+rK+E!TYWԆK N0BōC 1x,QYJ٩g8'(Z՗B`v2}z֪A0 N}=kMp$^Vh hsM#0EJVז 5F#Ŭt-4:Lōռ틦H_ mL, f>l qi1L0(M Mr&|% QiW䮝)BB-ϖ’׼DӳԂ*ƍՐaZqi돺\?;;Zٟx.滔~X$Me-uK3gA;*Z |=/<[.,хֵ)6nh#_PKK>:OSGI-OPT/src/javax/xml/bind/annotation/XmlRootElement.java}Rn@=ZBڢ&v x[إ1M9̛7o_:p KW;| 99j>3zz6 EjQc%9 t@f,ϘWTKW&)waiH\Ck<rٴݱbv䐙agTҭ<33}}{ؓV2\%kR=VmDZŸW4q6kIU2ZV)VuᢚBKSpm:̴isAQ‡ %yM A4 Xǰ\n4ZD YF}*;!A|&'IŜ5OSGI-OPT/src/javax/xml/bind/annotation/XmlSchema.javaRn@=9;rq[kE u%pӨ5 x[إe;kSV*rv͛7oft LdVXk^Yr&R!Y5%f.1X[ИA#2T`^Rt!|FpBz]7[lbk@8J6;i-7m*C #8N>Do1Ѩm[mRrգ[2 ReDZ_ W| &U)֒ B!Ō[ MZk1H6&=~<$~1%pE$40I\t/x?eTWLnMb I5<)&\Ԩ*X5 ,M+n^՗-4r%l宪ҝsL췩c\[rڍР%+<7NTn4#g>M/p&Lh:ͳiQ&;or]ON̉.0rF;*cڠ99mRxbid`~ 'C@썝qPh%KYS?Q3p)vD)-v;RP.~+ (&^q<:oPKX4oPKK>9OSGI-OPT/src/javax/xml/bind/annotation/XmlSchemaType.javaMs0Wdg\6әPLI2,X-* cO+L4iˁWJèvJdkxVyq~t8`vBF5jF*ӣ *-J VBؕ5|4Pk$!9nc  qYTZ#̺]s$y+IiBE_kmLua%f$GݬQkP2^WD漁RR̔Q AiBkmXh/%_(!X|/7[~F8X}݀7{`6RhVf@–EO+E*bJMf5rJRFP*mX\p]ukomLvsmc.y4B4([?]t_RWv,\Re WUcA]&'?eS:{otS+…k! ,6dNOLgCS/,E  {poOt^h!׹Yi>;qd؏:OSGI-OPT/src/javax/xml/bind/annotation/XmlSchemaTypes.java}o0ǟ_qS;g &.h#1!Nj9 R+yןޝp3FTbF@Tׂa|q~f t;a~2E5#܉5r!Ҽ4V( ^0BɥGU ߃TZJQ#@@H(Tkp>@Nq`$AWy,qN î3e>hmx4_aRh- C5*ּeW)wᄬ`U:nc:#V;iT%|<ɧ,>͗ x,JI<Ǔ n*t韒ƆFvnyvE|ҡ)9ɯM jWZx ^X!;~}1 APKSi PKK>6OSGI-OPT/src/javax/xml/bind/annotation/XmlSeeAlso.java}RM0=_1] VH"t,$vF #$y.ҽ*{!3Y"/SIÐz-=V!1x[^XA++4vf%}>\I 0ѐM>;٬뺐3qmX&9R`G M\4*YAZ@`A9Uw;.)Xu3i*nE래K#~ ۘQAMԓ:(M$RX8W BlCL2m${;O[ 񉄭:IK%&ڣ4h4 ~VF;採?fA@>D؞C#‚*dv, }.-aLng,6(]k qo?Nц0]@KfB~nY !xm!_±˘cPKzzPKK>8OSGI-OPT/src/javax/xml/bind/annotation/XmlTransient.javaM0QNɊBvUii¶d -6!hJY`w,d;(^ LlL ~36V!FꀅGds D !hYN1gTKV0Cٍd @HFJ^#1˦zn<%!3H@KŘЧgoL؉ؓVhQFA+8DXkփT*3R.*,MZkx֙MH_ mL$H J&>Hĵ&QqM1`Fa2J͚Vww)Z/]@jclm;SB)HŜ3OSGI-OPT/src/javax/xml/bind/annotation/XmlType.javaQo0ǟOq^ک7"vjRƄxpKjH`;MߝsNl<$3`V|ca a}2A9?=z2 K4Dz)#\jA*Ч?F( o9 !ZUC[Bm@& %XYUVFM8'p3rs h tlލM09fJAkt6fuBSxE&o@iF:ʹnB#0* 00Vum4#~,q ~A!h wai.X.y"X,a_q =|#@j]]dSv>L"'2`TL$Tk#jZREP.qc5d0uBrmUK49Gth=FGhN-yǢEQȷPiU-4]&~PKohPKK>4OSGI-OPT/src/javax/xml/bind/annotation/XmlValue.javao0+NyJ*Y߶jRYB7T@Al;'LJ_<}ٿpVw6'Ap& rz[xvԐF#kr KE !XA)*ͥKo s+MZ ^#yp oP`g (dMh7cŒ!sH@G\LggLaؑؓV* QOAAᏞ+8uDUX6Tj3R.jZkxޛWMH mL,H!Jg1HԵ&Qy1H ΢0MMh DQKOSGI-OPT/src/javax/xml/bind/annotation/adapters/CollapsedStringAdapter.javaRK0>_1] !Vj,{8vVwm@@rH7cƓ`fɺ 0#X%dJIԂ`x>_x ˈ$OnKU Z Ҟ*huEBCY+cBK<0}i0{MsHkh'Z'CsY9L 7}|ɤS:a:]͋ъG?Z8qJ`^v``kDםAz ެC"M%}plãxlaxy1$frWU%|/|c κm8 zdamN%!Rp4]XfKNs"6ǵz6XE%72`8=&IswnR*Eͻ?X |a.ۖ<[ (YuvBq@~ݨmD1Tzb?=xɋ^L W壢E3o4 :آ6Gu֨<]S|oP 0VIPK(%PKK>EOSGI-OPT/src/javax/xml/bind/annotation/adapters/HexBinaryAdapter.javaR]o@|ň'MRUrmF a4psqv߻NUlwfvfgTr_$b9>GZ,ȒR9iK][Z*C|#ceq^W ^b_5؈=tXb i@jWJ>TuUj>!\g?DQ۶8:+SFꄵu2[vݱn"kaO# '5E^hQ\]F:!lr0e iY #G ^"I{$zdy5Y6^,2/0.e23&!G}hWmJ?=NlM\ɜ%d4'BMf#_eQr#p_rFQ{_b+vnL"w 3&EB!W_fPȑ.7c}Ї S4';7]חK |Ʈ꟤f)\c4tGzj?APK1PKK>LOSGI-OPT/src/javax/xml/bind/annotation/adapters/NormalizedStringAdapter.javaRn@=T AiXT^Xu3Ԧw͛ffv\`DY9XDR T9|>5~ViaE̎<ɵIY*UpA`Ο!2/d 9=`4F Oq-xCX I@BAf Wun9d8rBçc DO\f6.^qM9G]Ǘ$]dC֍d- Î`êrX, qi3 UNА)uFd{Ҵ_c t4Nd?-oְV(YNj+\&W:^&|Qr j -:ow2oq=GI\lETbIPŎ!S jY`iC_= ͂}}-L"DųSC,q0Af[^r,<ѦF)HC`6Hhïzt轅G;^ 2Pz<{x(#d֒xvn*(eء{C5 (-]盛xǍPNT+_ZTAPK!r38PKK>?OSGI-OPT/src/javax/xml/bind/annotation/adapters/XmlAdapter.javar0)v|3Zw:Ce3IkK$={WIs(@,3T`Dq0.'ȿ HF, qmXL KdvTEEEIRȀ$K nX$GSMf^ZrZb aa-ڗ nT< pW뗉nsSw]aO)S1BphmB*BgߗFXv|afn `7tP6?MrL|MKBqCw(Gw<<Q}cL'GOSGI-OPT/src/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapter.javaMs0Wdw\9ͭM?Bm8peXZTƞ{WLIۘ1WϾ+rjD6Џ0y.go@o.C`Ԩ60"XT(5&P5[n]dPiQJ8cз^ -bWP@BC*rXⲨ:k06OGNc+IiCEOc!pәn1ջѨi[ǬT(?hhꏽY&ݮQkP*^W*+JHOSGI-OPT/src/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapters.javaSo0~&ũOTܱ70F:%-cB<8%5$մsNGwwgN8;#굃q1Ev% le0>;=}5z0 GZHѢ`Ɉ܈:YF5/3DJ;hr)v@*E* @@H(Tip}+CSUu g~3}^1S5(ɢzZ?;aqIUs^S^uoUAOS ;i5cKޅYM=]X-.L0YQ2^ƋV!L:N.2[m)|;S J$YDAdV4F jI`i ~/_h;-۶ ˅,4}*%׎ypA>P77Vxv,]Q>Ep. D Did:'r !Irp~iq˞g~{Ic&A PK.1)IPKIG@'OSGI-OPT/src/javax/xml/bind/attachment/PKPKK>@OSGI-OPT/src/javax/xml/bind/attachment/AttachmentMarshaller.javaRr0=)' pL[6)pXkG KFd:wV)4Z=}FG7FKl䣀HJ*#O! e{9Y2+Cf$"#e)Fd- 3t;CL `n78@PAc9BHZgT; 2]՝VO]ǡS G>Px tݳt~7mNqM9{]Ƨ%N(Iւ08֬*ÔJlA9UF8!X] y\XgDڸ'86TЋ8zxq1Ym4GE|lYgS^}hz#>w2s?EHH(^)ؚ*, J"d*aX- =pvg|Qp?xѡmp[x<0&3BOSGI-OPT/src/javax/xml/bind/attachment/AttachmentUnmarshaller.javaRr0=_ 2N d04tzXŨ%W1 4}z[ .#nփyQ@$@tw}^adh2')KkԚ -ATbƟ҇d !t=Ӗ:ht6s ! hQ@(tQj>-WO-N2@ɫ%еֹf0:ģP| OX;Y2}˪S+%Z0 `ɪ2LY qi6 ꍫѐY H+"%cC(8mIߓ<˻j b͖4$^>@4{OlȸKL?OSGI-OPT/src/javax/xml/bind/helpers/AbstractMarshallerImpl.javaU[s8~^~ř<+S7θlRI> ʒW!L'}lcLp)3>._E ^@Ok# )WBחiacFd("TcT!HyDt3+W ~E嵇X d CX H'i)m%")QRb4ӄf]):p.]V犙6,pu$Z Ʉ!5TE|JZ%_67Ny7aba턶H(6"a^ r?0`2 F~ ƣxDo7 EF<d g"HBM1355ah9M"_VKc#E"w=_jQ{|c"T-Pnٔ>x 'nKf@s] o;~)AQڗ &x+ڠ?c:o!92y oʓtQ2)"~Ic͗jnd0aVVH[֑`*1=7OmKQDv@Nnaj/ɏû~~pޏҼ7H˄fwfi Anfo4 鄢*oH~GaHO‡:<t;ouF:!ZWbw0/锺7N |Ym0V3r>& `Ds&c8sif\ZDX~gFavEL%TƗ!}zynifBqyYC4{jJ:OKT{4/H?Q3s*|4w xM}bѫ+hCzl)=Ө Bnצѻn>r64 .~:%M}OYvF=hxOֿPKh<OPKK>AOSGI-OPT/src/javax/xml/bind/helpers/AbstractUnmarshallerImpl.javaW]s8}^~ŝ<iiLfܔnB4}Ե%$CN^qwttϹ#DU^JZLg9 xq, o/.޴9gkhP1b2;CRG9ӂ[F( o4݂rB,U _T2CCL- JҒBYSFqLKC-64%56^,猙v\5ĺu#c44 MSb1q>HsV9 -5 хZ3DGJdμ y\fn!\?x/$S2 YT'&dR Df|0UsԒ2u"+! DXnr@Ft'1 ti6&=IZcN|rx#͌1jȳ%峈S):V*FtcqWMۀ f^7oYFnq}Imo4 w̹pHm%,;Pe-\z#ZҒ%W<_S2WRvԽ?Gdg^Dpqy8mY%s򑺬 ]S@;j&ݻGese=!s/B+uI+lAɯvt%OYW\oȻ?{CQu52L'meccNxl4~+k>`7m>چxs#<1avեX m'EuU;\됥qvk;Z?|!y^үD(]bԃ}f< %Zv3pT䒺c8ҽ]mY\qt+NN߽JE dZDYi>@e:<} mdRC]~?,R e=sW=Aݪ^@BSxh4PKʸ.~PKK>FOSGI-OPT/src/javax/xml/bind/helpers/DefaultValidationEventHandler.java}n0DW |WvsksR؀$ȑV2[TIʲ߻"i@ۙ"Msz VWD))tA_$XÚ=1NhuI~KHQoL@Iq1PMhZx!*t(5Nmg'x&/4^ !`7fb;guzp^+r~rѰBUBԖMpY饮p0tʼ#G) Q!Fdi6 ts1Y&]dXqZޤt$'|K7SС!۔aWDFBeΖ\Cdt݊P=Y͉АIձ2`I/|OhE<]!>TK][R tWQAOSGI-OPT/src/javax/xml/bind/helpers/NotIdentifiableEventImpl.javaőOs0S)ad:Lӣbo"IJ nmiWoi:kfoe#̊ORR0U n{ hxz{óy?w]qbl=V^7Χy1}+9XJˎ{JdV%: Q[7K]pf;a)Ty+OFc@V !-""7jt>OE6-0|_dl#_"qdAOSGI-OPT/src/javax/xml/bind/helpers/ParseConversionEventImpl.javaŒOs0S)'-'ɤT n; yz;ó~7mqbl5T^7Ɠi>yݩ+9XHˎ{ dV%Z QY7K]pf[a)Ȕy+OFc4G>ͳ<"7jt>Olc6x6lʫHM/bGshW1exȉ!Tȕ,ؚQ*%jµ:,?l= s%JRɚ n' %󋰎FodKg><ҽ\ %#/mxԟ.zաїܶvQq8}?s{6\Q+UQQf ?68=`B~E?PK"/PKK>AOSGI-OPT/src/javax/xml/bind/helpers/PrintConversionEventImpl.javaŒOs0S)'-'ɤT n; yz;ó~7mqbl5T^7Ɠi>yݩ+9XHˎ{ dV%Z QY7K]pf[a)Ȕy+OFc4G>ͳ<"7jt>Olc6x6lʫHM/bGshW1exȉ!Tȕ,ؚQ*%jµ:,?l= s%JRɚ n' %ڏɖϘ}xҥ{A%JG_٩?M]Cy ;I(8>yBui 9h=wp YTo((X[ӆXC_0XPK^.PKK><OSGI-OPT/src/javax/xml/bind/helpers/ValidationEventImpl.javaAs0אrrzJadrb+&ޕq:{+\rgX9f=_ b)I {1{WZECOSGI-OPT/src/javax/xml/bind/helpers/ValidationEventLocatorImpl.javaSr0FMu+]kFp2;rݱ.@c@k8U*XJ+4ҞUuQmF'qc5Oj(>bczA a܃AC'r./p,A 10G2G4AtbHQTu@6s!F|d!W;K”0OSGI-OPT/src/javax/xml/bind/util/JAXBResult.javar0Sp in-'m`hl/F,dxH߮]p3b싄X))t0L>׏+,ѡa7j%D EQ𯏌Z'pC/h-Z@!{Hp_`C 5nzNTw${'4\ AP}Dͧ(.'*Rg<Zk΁_q~0U!rfUcAT9FSwVP',zR:2o0r03HY}X>^.t3X,aHoUHy'GupXcJ?-BacHBndBevh5w Z:Kod-I蟾|(x?ѓ؉}UK]-I5 6aB3~nP"Ў1I?]o7}̌&vcZӹL^7??vo0_ZXJqyȟ jouHՠ[p APKQgPKK>0OSGI-OPT/src/javax/xml/bind/util/JAXBSource.javaMs0Wdg(859miS1NXcB0d߻tꤗF/8nF[S>$ R0y0|V -V)x[QYSp[e>c&h .9L}dLMfW^;hvY$ aa#$9vDsFO.rF -6=<[8>bqMco2+zS?;ah%*Jbm)紧pB!Xq=3e*ae^V?- ۘIR@ZL:)""s~dJu, _"nugtI_&$h[7 L>OSGI-OPT/src/javax/xml/bind/util/ValidationEventCollector.java}Qo0ǟOq *X62hUmUM{p#ؙPw9dm!yru}0Tn ,ӯ$T0N?GOZXE"dPb*Ѐ"Dӯ%2`4nPAcdaC9HAWkmsz73'8.xCͣy륻g\i2i6qM9E.޳uVI npDVUQ5ukȑ*`Ƶ dqϚבK?pۄABsCv j%xrere£/%-Nƀ2>&vnRg }R5洡KSe#JR(j4Y TzU?h_S>W2HaH΂ɸKwBR;TnX}Iy嚽$[<z<ros]k]cF(GM03FHFJ4hѝ APKHFRPKIG@OSGI-OPT/src/javax/xml/crypto/PKPKK>2OSGI-OPT/src/javax/xml/crypto/AlgorithmMethod.javaeAs0Wdg\De8(ԂJ˜weL<ۧo"6ua.-JHVr%׫Շ%ゅ2A G%#`r'*%D AH vI`ik #(wHA%[< 4;3 7s&@O{NrN V[!p?A{)a`D̴u]d=QO]E^Zx?7D%X[>kuRKplJ鼕_HPl\,) -f9)bLݷ'OSGI-OPT/src/javax/xml/crypto/Data.javaeA0U =$mQWD ٮh` n&U'TU93~.ڌVGy"v"WKacCÞ31+GYrTW5Y#!5TY;Y'}<4̦l$F$F(;b Ȏ@TLhI%eХ.]O$0Jk&ݭ%zwL=zR9Kziq9BDɬ-Dkk^J/UӍ SK,{&lu&fiSZd2ٶn.dl3߲|qd<.)CWDA7$gؚj{Z}& ٓtYA'酿+ Js~ėSWv4^?D/9I͓m?Fxџ( PK@PKK>.OSGI-OPT/src/javax/xml/crypto/KeySelector.javaTMs0=_ 2Ԑ2=$&IRB^5Fr%weLLgؒ޾}Q`Jtm0Y&xm;9[=bp$4C!c`~8=ܢ6BI8FsnsE ذ P$a 86y#v]iXX6jeJ@`]߆ò,=V+NkdFϤBSū XN8[֌4T#YTZX!ؒit40VUavHd#. 8`sv;>E0`6,< ,.tHQU@2s!>$#TL "jZREՐdb#,֫\aC>;lvny\WUN^I`+q 5 r]\j:>'Bzkqzd^AȲ1<4|I| }-n<8[ɵ2{ #HQf9E}4Ԅ[ir8v=cŠB#EZYRH-MƧxjJϘKee26"2z–ߌ#P?K}֛+k;_Wmŝu/}'JiZ%۶ /Hql;PK|QPKK>7OSGI-OPT/src/javax/xml/crypto/KeySelectorException.javaQo0ǯSR1HنZ) x#gTP5ѦJ {.`toDU;oLr|~?" kiaȝ(- !ьgJU4oKA*EJ v $p#Z'\=3xx51jg4iU6s#qu]H*n6K,_~$q^6h- C=0MTma(2H54OSGI-OPT/src/javax/xml/crypto/KeySelectorResult.javaeQo0ɯ8S; ѦTj:=MjHmc;M# &=vvKcCTΰ*mbaqؐ'w}QIҞ[!ywN+q.0ɸ5Et8tCyԪ%Y P֫p3DfXկa|,>Ը&kZ=UY3X[~uqǻ2;fmE GL J7sxS^86{S. #Z I^&WE5&i|m`.m.yy82>S8 BmHޒTܚn:s"#XrGzGVU__,I88sz>t .ݎZ5?PQK2ok~'b]Iv쐲 $_PKbpPKK>3OSGI-OPT/src/javax/xml/crypto/MarshalException.javaQo0ǯ8SR1Hن%RHWсFlf5ji4@.pe0'Xd$Btz&wZ,ɒQ79)KZUI#r X)ƾa4Fkoq-ZK!-6&>A*z htUI8x.Xjskqu#mʸ>.ͳ[T&kag+ O>@4L5֢6!9;#Te7M!3rݺ^yM( i6‡$KЛ<ϋ2Y7mJs^}D2ėt~82>0qoFlCȜGSe+JBwdOVZ oS˭t[s፾Gm8}4횓D^ *D=:w "֞7wx'PKK>;OSGI-OPT/src/javax/xml/crypto/NoSuchMechanismException.javaQo0ǟǧ8)}lC>:lU;&F;;JjS>UE@4I0/C,ǐ{-9x[QZ,%p5B +hS/[T-;T:!,lE{ځUG^z3xx=13Jд۞ zj8>bqL7Go2+z̺ Z wPǛ0MTma=(2H1.OSGI-OPT/src/javax/xml/crypto/NodeSetData.javaeAo@W|#ڜ(5 xRQYJXfޒDpKcǴaZ`S|#Hۖ.w9,a:=lѣ;aBy :]> V+sΓp/`&ci2І(䡦%ZPzeQ%a]ɀUЗl?'I5I{C\VǩGݢwGNPVJV`ơnMͽrd*h3 0I Ȋ |Il}󸃧tM].`&_el+3P"}l]p ⼞"ojsEKkTИ:-; 2-_>6JHr^IK7X6j%ǜ b%KO!⎩3W/SF?PK14PKK>2OSGI-OPT/src/javax/xml/crypto/OctetStreamData.javaA0WrJV{ksIڢnA=:dB܂&;&TJ+Ubޛo;`.Uy0.&_8DUř(t0 \24A}m@ .( n[`b=~6\ x0vp4\D'YBZh R7 TBj@k}GCXFrFEoK!0;@Z1 ۶ XOH]YkxL{\kQ1w5M)*؆X+ւJtfn5\>-bX7Z_FR@kcFQq>OQ yW_ ,U!`&x }(yoqieJ u"W;yF2 &ʆ<4(57ܺ2ۗ^G{~;Ǻ )+gj6I(*FiaV#̲k:^nc bxnTp䕦D׸VmT N׾^0}uoYNPKQMzPKK>2OSGI-OPT/src/javax/xml/crypto/URIDereferencer.javaeR]0|.bD!womh) =:` AU{ׄSs$>ypKzͫi>mCTלa0@mCR4OXH6#S#xV9 y"d$"(ys&U<7VC GS[f_Qy/G987u^YT{$)4d4}PcI7M]SYA,KNLrZJ~w?#Zv~M~Pz?PKUWPKK>/OSGI-OPT/src/javax/xml/crypto/URIReference.javamAo@Wp3<z .0|_&B7X\cm1[rǪj9XIT1k+zh XׁKt{a)V:ʴ<M(LY9}Zf<}F?[?AlaƔQBd-+M5h>U< ٣taAG酿\7WhD3'q6`Lc'4OmTѻPdw! M'z3!'PK:[tPKK>8OSGI-OPT/src/javax/xml/crypto/URIReferenceException.java0)F9%+ ڜh6mQWD[b Vy &ݪU+?ƃXHuԼZXe8DMÙ(Ƴz7.@ˀ=/P,%j[H>CćϨ f.a4F8vBZh 7P* \@!wj@}GXF D`vmv]8s 2ɖzZZi"maH H1+uvL)oZ{eF2lcFQq6wQgyuQFI/3XX%wq:(yOqreJ ;;[ g$/h4QF@qjt2 ql\QyW'!8욠GeS톜aN+H^w3OSGI-OPT/src/javax/xml/crypto/XMLCryptoContext.javaOs0j 6'h 5 MsfmKd'1 2V߾gwn@3j8KSβy@Z-vjFƅK Vd#4. ,<"v"[ MШ;+QVL57Jcq $h'5S]zj!I}4&~c&`+ c^gv 1/:Z[^?=m8Wj xT0yFmJͳu}w_ւ/@Ӽ8BW3}7gA_ v\ͳ8PKaPKK>/OSGI-OPT/src/javax/xml/crypto/XMLStructure.javaeM0WrJVҽ{l 8q ;6!QqB]3Io"gR\.`[}RuZ"ow1" a(C +a{$ ɟ)7$d P0R]8zqm< YC9hT'փ Mo'QeΤHy0\.yYOЗ8&BjZMZ-SO]Cנ7 ,SIQ3k'F0%7z$ncp 2{7OSGI-OPT/src/javax/xml/crypto/dom/DOMCryptoContext.javaTr0=d:Ԑm=IL9 {1Jmɕd' $v߾v|+œ'8KSD']/nFjF% r#c(D YDI~\ 8u؀v}YJ 4Ph$ aS\E"5źNb]!gQ8V@`&,ɿzeYlؕ*饛Xݻ }"u֍HQkP*`9،% H˺TptA˹)B smfǴ'$};lc^~؆s/î?7S&/? dUɭ.BCa.7t󈤉` B")UƵm&Iy 3뭆.[jϿ-=[R7RUn쬕3rj>Hape֔1CACHuu+i0&r:@!ε"R A46LmBS(H3xR"9go&sdHM2^+[(4n96K~_iJy}d rlg_PKFg<PKK>3OSGI-OPT/src/javax/xml/crypto/dom/DOMStructure.javaeAs0d2rr3IJ2߻'%z۷DpmVT[1â& R0~OgX%:;,r&sQ9,Q%Z[0Nd?:&#`q J{hpthS%sמQͥO{e8l6a'Dj(Z7gY^>uW$:60CTUVY3uk2[n^iK_"+)[}_<)].| X,aȧ*[vi ?|:Ȩ q;>#9\lTհ ;&.`lgjhE`>2`NJ]#Ӭ)MtPxpX6OSGI-OPT/src/javax/xml/crypto/dom/DOMURIReference.javaeAs0Wdg\pS݆i 3`' V * 'ޕMf i}Kt >⇀ma~Z}Z,B WZѢ9b7y zYw@5*KxDcp`4[yc'Ao?(!dgP&j/Z=$mZl?tj/[ 텡0MTڲSz0 , ̠uF 핑Z+ؘY\@R[\$қ<%l8tl rXg&%YJ3I7K@Qa eP ^!d5rQ Nɦg Bh$uM'%۴ֻEQPovdc8vmI;V t_RCS3&ϓk4GCYǯT/d8|6LUE>OSGI-OPT/src/javax/xml/crypto/dsig/CanonicalizationMethod.javaSOo0?O]*[lCk]O lflw3aRMU߿gN Njc(?e_לt>_Lo][vjHP% rs D oYNqg ר4N9نɸ59>;Av N#ap %pck eӎzn6ψb!׆Q;-ʇ(zx6ƴo={ ]*j2 8 gz<5j w\XKr&5A*`B3Ҫ7\TSв4=Sha < Fbc&~ Q:~S re n$, SX&,(1>(RdăVY$8SR%s^򜬉cB%Q r-k;VM Sf?,87 ݳmj7WHм:wnMqRrUhRP51 _Ȃ?)&4hb,`5h/֔R&\:w0yp/N[="ѕWP;;`yuYz /MgF񓞲dϕ̒Y'y')6q~PKAPKK>4OSGI-OPT/src/javax/xml/crypto/dsig/DigestMethod.javaQo0ɯ^$iaCX {tĐvVuNҖD{p WJo(+I] &98GCIahBI1{_\zFа H堵H a59jBWuU:=;ǞVMb_OE]ׅl8TFtMߒ~׽Z0:^mirي֬ei)3 Yu̠:#V{?bcIi6OIfCyH%<$E2[ &2h#ܤ":w@6sw!>P%BpjM-+JFRG4cd0Z41:rA?[h܊2YODݡTNnNRQUn3gZZ;x*d5Xo7ՐEuz7{{)Aɏ\]'(h̑5<!/%/PK2e9nPKK>0OSGI-OPT/src/javax/xml/crypto/dsig/Manifest.javae0S%YnOۨM[, m[b {DŽHY-fm0WdDs0cX_$M#}?oȽBˈRpKhe!ьgL+h #/P8yjaN "y hQ;n\< lu4k!07@9!XO)SYke:_d-QYOAkVx{-6e)攧pBr3mJaֽڅZؘ0) -Bi1&i I':]aulaH#:xw@E(_ Td5rQ Nɺe5Bh$u^XVKi^8_ 9F؁㾉9iҊzvK94]?2)*ҾN,ik fd X7ӯ7«+нO~Oc\YpʦF%:DKZXA PK#-utPKK>1OSGI-OPT/src/javax/xml/crypto/dsig/Reference.javamSM0=o~ňh{k9@ۨ,H UՃI&S{B@U{!%͛7u05rKJHBg אx=!3xP;̡9Z-BT:i4܄c{@+Oq45!2tPH +!3Hڶs:;!p @ԉn?[h4M(ZšHne:Ǫ;97AT*֪DƂ(-rWXIRCpFX4td妦7=i_6=q:$n QDuVsONl/?hoOK!u<ܝw%3jx^~Hop9 %TV] UcL-3Ӎ3:&uUBk-~Eښtn^T_BaLj*\q;wb5F!?P2g#ձbj8q8_k 7OSGI-OPT/src/javax/xml/crypto/dsig/SignatureMethod.javaO0S%Ye!=mh6#l{3[mB߽ㄪY&&>jz䓀,w7@~a6hP1 ,Gi0FQ8}|Amp ~$a %8Ck-Nu:GϝYFrFjeB`>=0l6`'@<,Z.ln(K44lĻ#8kZPX֬rԭV|FeeM*bMH/6&>DI Sm6jXo`^Mm^#Dg@jC]SBHF.2)#jZR"QW¸c5:RT2{ G}ጾ=; >Vث:gQg:dѸD[XfY8V|]. J06.m@RsDߒy4_ܗtWÇ8a`#e4yQ1W=PK[q$%PKK>;OSGI-OPT/src/javax/xml/crypto/dsig/SignatureProperties.javamAs01PN%<{,88*qt{+\T飡z`P a"H,7v߰J KhXFMTXB+K4$DcxAؗ[U ;qك,T @$j{ԧw$= ޠyU] AlH#e9km9OSGI-OPT/src/javax/xml/crypto/dsig/SignatureProperty.javauR0* <fJJXYOx4}~]}ظ&i/\*/VxN=8ՑWڋV`ơ`lnMͽrd*hyO R0I Ȋ OlistM]*`&v&Hs@Lɺ@lRrP >P%oJN5yD%XtGZLKGb $AzTtl M\yjn"NiJF+~uFF u_*|.ue`U SOhFt5O寻!W,B N9yOPK<.>PKK>2OSGI-OPT/src/javax/xml/crypto/dsig/SignedInfo.javamOs0D2T9i^mJwo~NabSa'?MCw#aa!̨@֔7Ӆ|C8Wg0A_\Dma`,CP<(@E  t d[ףuě=K$îY\K4Ї߆}S@̓6gr_4xՒ{N Fw`=ڣFGlŝmJ i1O60Hs|L,EleqtL2&4[e}t~ _t(=s>N |"*TQ!5Bm- eihKpt4Wh$hCmUc@Eڵ)1Jˮs 32~ۂ[;y󪷚hcƖP#^ʷyRdUf\r ,8FD3eħejLv KУ|9NX/b$ PKM*PKK>1OSGI-OPT/src/javax/xml/crypto/dsig/Transform.javaM0WV]!U)]TV$u4&vj;Twծwwf0^dca|)g"Bh z~{vcXH KԨ;`EfR(re&SSk pWG͟0:OSGI-OPT/src/javax/xml/crypto/dsig/TransformException.javaQo0ǯSRQHنV)U}t g@TP5QI {.`j`gʿ HZ0U<6-=9x{QZ,%p;D3NO4V( ^0Kٍ8vCX؊{ځUGNpIiPHΨAj{*F9qu#e>jm|.Y$Ah- C7`8k:PXejNy'dU[1ަi)$L|I7yL難:Ɋtj Uv*WH'fw! ^0/BxUG$MV-*G#)h4Z,M->A@s~=룾#nک tqQIK,raPvh3x2S=3l OQpAr/go(/A PKo=PKK>8OSGI-OPT/src/javax/xml/crypto/dsig/TransformService.java͔Os0Sp 5$KhiL(V+K$cL{WOI N{OkwOp]H3-ކqA@(`#zva+-LТY`J!Ӂh ΂|Ass{.!g+PAi4X8 ΋ Z%\VQ$p3ǨQCAdoݪVڤ]݋h0DVKal *f*YK ==ue*sW1^&1+݃жd}bc a Q܄wa/rM?pN&h cO`0Gh<!§hth\; L\"Ĉzd b.8YSiRT/(r\X/#E.sҁ/QѠyl27 "7rFqQ;0e *iHQ`wWP wpTw.d-1yMх2tY^tQJ)pk=FZh[[.uIhM]yI``g;a_>{Ѻ+3姽<=3ͧ=CX^?{JZ$u +9 ^pk@+KܔGjHvi]1rt{#_}=sv1-%gfL or}PK8mPKK>1OSGI-OPT/src/javax/xml/crypto/dsig/XMLObject.javaun0 S%)2;kO]f4t]L;I:w@>ؖGRy05T%, ҺVBKda aVAa1;=!B򧏌':x :XL;qmy}[}Zu6arqW_ ]6OSGI-OPT/src/javax/xml/crypto/dsig/XMLSignContext.javaeAs0 76'-Sπ4G-H$N{W$=7FPsr,W/$mKB}4^i!GUdG%JBhQg^ KJm,[N "{ZRuzFȝsfOO::r4Bnsc8R۫ƻt͊;w=z28LU#be@4y)O=r$ z3tݫҞ9K&$,b"-Boym6>=G!ɞ[݇\m|$_@|P+XRM%GM/FHNMG_e۴ԑnzgq.]fNE.Z]+3ʾκ PK%PKK>4OSGI-OPT/src/javax/xml/crypto/dsig/XMLSignature.javaTr0=W dMS% &I36JJ2ɿw8 4rx{+6PB74!3#to@ߧ=υafhP1y`LP]"9ќJ[o]4GޙT+VT \ &UH+]unrzKwl#,~Y{JgxGhT7YWR1G59^TrRie*rԖLI/ ״'d}@mc:AaԁAF}GrοLpfd"`8p:OLn"eT7vH&w|"D{R(dMf2F-Wܸ8W2[|B~M}wDwl6f%XWU^bxv΋:gQfrL2[h eb"Q?ۭ-5 Z9ŝ mtio[EewYRibk&x,v:uP̍ =Q˴*({:WMUS.Áxʧ/kO}N}*J3NJTyXt$:P`lB&c? ˅7p3rvDy1yrNY+'2mʗL%_c_PKxīOPKK>=OSGI-OPT/src/javax/xml/crypto/dsig/XMLSignatureException.javaAo@W|# NnmNq[TKixZ](=(j9y{_pa1y k@^Ǘ!(ah찌̨@iFhm- ~$\Ecz/ F؊H報daM5 HBGkm}zOZ9r WS!Cw91۶DG)SQkY:f=S]Fk '^@h*ĊYkт2 *\sS*֮MIZ5lh/TcIi>OI7K_KK$[ ̳t3^}${oivxk0&qOr3:"YhjDPɉ@ْj65m #(/oS>o0TTZݬxPԂ)rpiw%½CY!`k1x;;#<_D9G 3t1. W.)PKJǹPKK>;OSGI-OPT/src/javax/xml/crypto/dsig/XMLSignatureFactory.javaWms6\~N> 5$uOsn00ѝ\I|7]ac01LHڔ+3h%=Vo^{@Cߣ z)d &LO<L)}>>IA@Q RX5[ϸafez:jT*/3HgypU؈|~ȈLR%CAdAhU -3ܯS @ ERHDWp] сSTL5_Y5::%:ǔȉӓ^O)9t׫ⴅsJk2L&\p/p1[L\Rʃ ~2atџ2lDSi <Z>Ww 'wLUpFRH\GTTu{S٦{OAGaު/g'3j-):t8;G—X̘S[BjvS'ѼۂbR\)W*PKEz=PKK>:OSGI-OPT/src/javax/xml/crypto/dsig/XMLValidateContext.javaeAs0; Cm[CH)53$QkTia2]3L|-{OUW071 oiے%z6<yaAaXɒJ+txZUgX#:OFu?;f5Iՙ86Iڋ'lȋ'v=;rx{eT[amUƁj@;bWMEm;~W+D+ڔQZ@V6-bL:7٢.d\F#呂RGBP@|P XRMDMiIݞ|V/UiiO:OSGI-OPT/src/javax/xml/crypto/dsig/dom/DOMSignContext.javaSOo0?/TPvzhE"t]yo!RMrHdYpS]6Ff}1yYB+ПC۰H h2R"3)PYLR)p>R+1=^TICZXwKREE۴>O^9NpNV@ >Q]׌6(,^[JݱTւ4x/)+ʚ3}H'U6׮L*3rUd46&%=&Q2"n b*2ZFV :/42]i|)8oĽkɖ(Z gޢQJ4Z-LL. kzyQМx|wlWLtVf,EPV+)SM"35Q*G`*w^?o:}۾g3l56f<9f~'ZXO_oO~WLQ87V6ttQ<[Ӕ;j79t=u'OA PK ]JePKK>>OSGI-OPT/src/javax/xml/crypto/dsig/dom/DOMValidateContext.javaAs0*Hzj9@[O3IJ2Ɠq:IL5޾jrMZY= VW Rk0N@#a0gL@0Zh Z1ܢuh`Sf55m<C:IGA]%}aSAEK!pCwd4 13'\%e-u_u:Rm "*Īx/,ҝ7K]o`KО)Kk$>Y]]^&YfZ|.MJi.t1Qxٽ"  O'}XAgV㟚9^Vi$zPK_i00PKIG@+OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/PKPKK>7OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/KeyInfo.java}Rr0=PDe4Qc& әd)@ڷo{Rt,L[U 7q]+s|~?̈́߆G:ؠC{B0'YZ]#č3VB)Ja4]{޴p=hC:dT5rlQZh?Yx9̎$%74*_A(zxD(NA03EdLGV=v[eٰ\Xk-;0dekd*R :iʑU^O#[ ؤIAMK%YI&N2&&W_!N6IoB@ੱT>)BJBiΒ\*Ut 2GA?V OS"I_~P'%$NZoȈ©J>OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory.javaT[oH~^~QDڇ6O4j&ڇa8سϸs1&-bw#%9}߹^2"yF[)S}wD-"B W8fheqXZIԇvp8jLGQi9@i"a s!c@(:/ipYӠ%Sȝу\#ɜ+^zeYFViⳋarT7nDk7/ E<)imtP]J`ܕ` 댘zF }݁ #x3H@>Ɠw |ǃ$H`4<ģ!}]`. x0!)B:UqC\/% NԳ! 4"M.l(%#E.sV\jQقEw i+U)ؔ.~ULKѦ? M[a d.5z= :o(/) :5_ئ'yCooev9R5࣫6-iW{(1E 3=?(,;!+ZZ*s=ݐЅIGmR'S"nޜ3ǂ؞VgPljS'8F4.FY`~tuؗ陆?PZ|u>8Z&A#hQ6 w;#Ιˢ7"t*^،ݲ<,p^BM}PKe_ "EN PKK>7OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/KeyName.javaeAs0Wdg\De4Qo* cޕMg 1>}*+Xj3X 67iHazX|g",6(lѡ=b)!@射Nh# ;s֑Vp-0 ɸ5Aw9drPQRP֌h=%^\rYZҏ} y&qsѺx.WYcՃj9# gF-"y{KT=+K$-;&k&L|I`ovlIKW9ldw.d< I iv7<:`L q^nr7 9UTpkdP#ZAے  6 ?/+G~ɣ8OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/KeyValue.javaSr0=1PN%$7OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/PGPData.javaeRMo@=_1QMP@4EU=6ۘ]wwW"[7yփ[12 X¢B%}0]5Z4GL}Fp sBR4@{ R+G0p.տ;FWp (MPYd i!, DʎZ-iPvzG7]tAP׵/Zƾ6yPkm0&E<{ˬ'U`w% +5 Jfs-D ڀ rc]IRC:Zt0d䮢W/ 6}QS%&2 KSy%r\(V%n IЕ.7(<GqOOLSS+s2=jǶ&j*HB_1* zB&(:ZI;->:jq G> ٛn~ZdyO#͘9{O~&Jc+z?PK#(PKK>?OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/RetrievalMethod.javan@)F>7'-%渆ow`{g1R9?Kx ,uY 6W Q]Kr|3.B Z,Ъ !jDΏ14Vj.a2&u GуE֐JY#9dž@*:IΨHq{.xCëu"@| î1Ta}ɵ:^l];U`w+ wA4L=֢m@T9FQwFTV NܷƴFnu&L l,|'omv[x4J*M MroM«/%=N|@1Ɣ!C|P m0̹5UB ⎠As֍2`djy$ht՗+z~8coHUT^xMg[ABS yD}twB {KK4'ſ_gdڜZ콻J$_4XoKxg0jtp٠ťrВ5*ʲG;PK PKK>8OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/X509Data.javao0x.IAi.ځtC˒ ڞ"+({TjK9>gdd'ؤ_%u-)bߐJ Z4XLpQY,U=B؈?~R+8g0vaj4;Ip'P i5sl\AZ'i(N  #4<*At쉚OAu/zž6UP?`Gu|ǪUWFkVv;hXU.vh2sH%u Ғ?-؄QBKA*0Iu/S$m֋87k]Bz1ȸL|EHI($`.K5UB=ŎAsme IP/(<΁~{qͩ!VV*k R|], @ pcisj _̀(5X+ΌϥE^oz-,0[n۟K 'П `vp[[! _M;tiITH&PKL 4PKK>@OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/X509IssuerSerial.javaeAo@W|#wq#DEud&9.0i`.(ﬡRp7ߛ%ֺ UG|AT$U0\>-W ˰J {hMX@ 4Q+sL;KƒVp)V0ٴ5[\{AwvYdPR[ M;>'CgN\Wk!H7As0^3Ц Qkm$#SOTւ?N [eƬAAsSj VMA:fh9kM*E) n4N>>|>oRaKnCKx~G}1ɏsEH zD-TRT h'MC_eԐ\z7 ~gyZEaO8*uv'Д*C!Ys~nSgu%\) %tGqCU=+fg*  PK䭏9PKIG@(OSGI-OPT/src/javax/xml/crypto/dsig/spec/PKPKK>DOSGI-OPT/src/javax/xml/crypto/dsig/spec/C14NMethodParameterSpec.java}Ao@*iz2i8qb{w]׉*;!-}UWh{3XҶeT%f t!GX=UЫ,=Ajϸ3dk7A0&`q=tx=ăС$3#~3x=ΣQ_ }zޛI2 C'X&iZgU^xAXճĻ#w6d@=X98]-Ei%kԆ &iY1i`m?n6iV7\w6[ dH*9t06$Luo Zk.%jzlLVI"0d;vZV=? $>!>tm\ڣ:7qx~'J}lrW{]}Cz!JIU?f֢r<?PKThPKK>FOSGI-OPT/src/javax/xml/crypto/dsig/spec/DigestMethodParameterSpec.javaeQ0Ujҽ{IڢnI]ј܂&U 6*ys|lKCIBҶ+lޮw+ОdH@射^h7~sg :ܳ ,`1@1:>z!TE@A*3Af3%2sss0TU,z8I1Ӷ+ŏv7zzR-:ҒbnHim-RzKUb)V F@q$4_$Ou yNOO'xN$;G]zJU!^Kրɔ!+Bx#WIΠdM=j}FtY ,M+;鹟QD9 D?_إkN,,|L_PG[qz]~wHdȣ*D'n'~G/PKPKK>AOSGI-OPT/src/javax/xml/crypto/dsig/spec/ExcC14NParameterSpec.java}Os0SK J&MCtNvd$9N5LS`ooYg07ra(F>I\ tz>z tFv9#`Ck.ӟ+Z' 6a h,AC  5S=Z+ӻ=ss*iU<=t켯O&m23cˉzҺ2/l[9ok|K`,"y[+)|-\:o'CHџ hl\ 1ΒlL:N7"2$VW%I/ǀ42ꃇچ)8n2>OSGI-OPT/src/javax/xml/crypto/dsig/spec/HMACParameterSpec.javaun0 S9%Efgm9yiK!NW،͖4yQ74( ~~p mVV5@7@fIðJkthXMV@射Nhj؈Cf ?:܆3{hH&soqJtC:ЭzIIy[,|nZWOQ}(ġU\.Z%e/3pQ5XIo SbˬA[EΑԽ$U5w ަvt5kM(9$>yOS7qI9dkXd]Iw_ N[Myd\Sq^nr+ 9ɂ[SU'*J* V:KoVsM_P<_؋CxhGC:,B_pn3DE#!^|VHhsVE/^a.+%T%x7zc?`/l/pBLG+Tc/Ep NAPKb _PKK>IOSGI-OPT/src/javax/xml/crypto/dsig/spec/SignatureMethodParameterSpec.javaeQ0+F=B@Ēj3IΦAڊ͛n`hn<, 'mI(lޮw8\! С}2f@@zU FH͝5|GH+7 ZŨ{J{29EDHݙY@,A <@~=}} IqmK./voXJW. +:fpQnbʞ#'8mkU]OD_PKBPKK>COSGI-OPT/src/javax/xml/crypto/dsig/spec/TransformParameterSpec.javaeA0Uq`O[ b&j3I mli Bl?s| 쵙lZk$!:ɕ@Xvo@wОbL@専AUh-|CVpvrI 08$頖^RнYFyHy'I邡UR/޼qM].~H8!֣9s&?kGxcμԣ^f N~M%4We/TWJ H|H?IV#>-FOSGI-OPT/src/javax/xml/crypto/dsig/spec/XPathFilter2ParameterSpec.javauAs0*Sn-'Sd0iVTI0{VvmIOoR| ̵9YQ= /)Wp:|?XuP:XC{C0YUGH /ӯ;Z')0`4 '@O!y;!X 6=Z+ӻx=ss`h{-{{o>q۶wL*|DzPa)U*y ,Қׁ Uo`S 6i)k+$9>'yczc^'&]Z|ݦt ZFuhlH@"r#^!,NMU *}@(pXFZxrBqQXKVؓNT,ERO(.sңsk]Q|ۓm,Wbכw}7 +klIn'#x3B߹0H-*P38G(zPKPKK>EOSGI-OPT/src/javax/xml/crypto/dsig/spec/XPathFilterParameterSpec.javaAs0*HnmN.!`4,F,a2]9LhK}Hz{+O8G']a9EQBD] /1ﻑ۰JKMndI!aGZ,՟+9/ 1a 2ZM5A'RС$@j(Mm{V]קw${u@#X^m_ C=ɤm[0gdy^2u_uy~6q2UkfU؂q#> &RN1x -:6郓& 7#G)ౡAZ@V CZd8gOܧey%U9!s_xd܇)8o yFJ%GUAe4'K>^gMQCWh$<; ;`JĆm6OSGI-OPT/src/javax/xml/crypto/dsig/spec/XPathType.javaSr0] 2TZ tl4Ka_Z!c2{Ni;LŒs_H[#NօIN@ *C\=.f}-<ȭPY̡R9p ՞|FcVp=VW[PAe0ɰt dzY-<5W59NJz͏Zp|k6E_bm6dTYS%Z0*m*3*^$^'Tn z\XgĬr'Mk4R6$&m 0y0}?pq8I It$ =| xpS_)Bx"alJSE B(J4KaX- =KۛW|6K2-fVYͨINR|nnKY y\(.GhVcQ:(6O6x r`JWi5F G$)+ncKA;C <2Bm $(-|q+頙Q l8G_ wXq3SqqrB˟81ƇcswՠzQߊ!У1I+D|]PKǑPKK>GOSGI-OPT/src/javax/xml/crypto/dsig/spec/XSLTTransformParameterSpec.java}r0)vrJ:AN& !8LG KFx:ywVav_) 魬bkYBZ gwS$ǰ 6I!@Vh҆ )@p`FCh4޴P:$ `'6af@ߟ * 94=M$]L[%UXl[9o{ Q %V;0xebJ/u5gvL)rgCH֟&ظQ c#M]V|Ypn6i^dK ,MVdv kLid Sq^n3 IAt 2A.\#2(YK腯(" 1>*oK'84GM\P٪(,׎=ZFg#XhJcfz o+m+|k&' ===RР[pNQPK7 PKIG@ OSGI-OPT/src/javax/xml/datatype/PKPKK>COSGI-OPT/src/javax/xml/datatype/DatatypeConfigurationException.javaQo0ǯ8)}ĒlCU}t ۳MHTLh4MwgW\L飡z`\L`!H,7u02|Z4{,#&x(- -BE!w4h c0BɭGU ;qA*jPv@ ӃZGn(87hAAqu]$zH:nN6Kg,_ga׽lZ0%o 4[bî@A9;CdUA):C] Ց[?O $4$OC*" fle![C@6$?)BxPXPE&Vڣh4;X- Ўpo}BqzkR@%`6OSGI-OPT/src/javax/xml/datatype/DatatypeConstants.javaVMsH=_;$qڃ Dɲ x!iro^m /`f޼~Gi N'TNo'`9} zJ/:&dD: D22@"u#@O?J4qZ pT.b0Kby&Cf0qDgI)m!Md!%0*9!Ѥ JFFcXhPYc`t3T]Pd\x ֐/ NOSk*&ՋT*M @f*\mֈWhHwpJw N$ ]mt eC2kX&z#l: $ P$;WUG x%)K/'ԢiΧ\fHg2f(0 PΤ⪘zjjO"VZq2ZK,|CCBb9joJ\F6=)€ kL2©<ن{rΕXm*qH)h NJ9 Ce.R6)ӿ~V{{g@:`}5/tuװbr6"ɤ.{~qOә.~smkn-T}d_=z'{t{.`t=zɺ>8o}h]}:V%;wf2%-}| S[C/T7;`v}K[C\=vY6s(o@;!&z2`SlWnwƷ;1^/dV0.[w/6ЋAc=UKSS>!yܐULʴ=cu\`+YUq9d}qך?Tغu^A5b_^="^kPK}\ PKK>4OSGI-OPT/src/javax/xml/datatype/DatatypeFactory.javaVMo@=_15iHjNSNbukTw8 7z\}^PL`䗡^pÐ3#NON^Vߕ- =CcTSZ`@ZG1Dz`ĢR/b.Z'P2T, L&0a3RC#aFcj[RpW[Nv/u~JǠg)̀Eg($u"@,G:e ̐ZA%#I_v1E-Gu܊vO+^n{NӅNvNgݨR(D( ܤs^EpQ98BOD!STAjcS֘ L'\3m2Φƺ֐љYB (Fn?-f,wqBMH? O˥^<^\v[fv)?-ukw=>H°{r:fPq5QRoၱT&ҷ :DeeݺJ"8e\dE fr:]WIB(R)0=>9MͦͦWMt='~`3Op6'oGmq0}X]_>2u)@T?bS-l`9齇zdo;Wbă\M3{{2dm+KnFwKacP@zٺPHEou2e/mtw_Ͱl'ƏMZsO1ciH43.>v{B"w}ljn PK-ehPKK>-OSGI-OPT/src/javax/xml/datatype/Duration.javaUV@}._1'졁5 k}$Cf7݀w6FAEaΝ;wa˕Y$"` @t]O{?GZ%4`Or*RRTJ\N0(1 X}x@jx(\HJt $(iK:Oeác G(|+w-kŁ6YObm4:WC+axXc*q fizi*sDC&WiwMۆ ڃ¨ ("Lgp1NYxd xɘ`| _ Ėq*e om!"z ao%ْ1 3L/(J2FB8tѓ|^>D?qWU!9fUAb01qHdԜpz :{p 7p~=4_X>\hà  QJ< [4Ps(alm!Wm9j5*bnG =iQ٠>#DWy L(aZETDV+Ëgf-\jd>Bu&xgCn&yAӷWX_YF q6 U[,$фhNiӑXkIo=rT/: \$-*D)Wo#x''@"-P>{v1*x:oӆ3?t hl ҆;nZPKeh3wPKK>9OSGI-OPT/src/javax/xml/datatype/XMLGregorianCalendar.javaVMs0=_ :ԐD b4bڒ+|$ޕ1$)6!rzvI'ӕ@#hȻЍcD8tZ@_} c0FjC dCD ~ܠ\ 8v:аz1UoX a+@8)p`j du  FpF)=M_Bt~mrŎTQ;^cu{Ά'R]D]3(c,%UIk H!iU/7\D-rjL 6yUFJ%Ի^N,ɭ;]O;w̃zaߝ!=CwxaH%up*䶜.JT%>&Em[5 -Mn_ejjT_Y&2YxRK3j ̧Y` iq5PIEE1AA~Lb)0ocCAVh#<]p.y, ~`Tl[hKe{̳#P.LnwK҂T\>[UJ9*a ;TT{HV2{E^tb"dJ@*o+)l`<ؙRmfܰotbԴ>$oxt%lBN٧UaA yuRHEJ Cimp;^*5[,Y;WaoA1:ڎa&_;Iow!}~0x|7%g˺;GH7wSPKıGK PKIG@!OSGI-OPT/src/javax/xml/namespace/PKPKK>6OSGI-OPT/src/javax/xml/namespace/NamespaceContext.javaAs0Wdg(9QmfpfrI&dL9h'.`Pw0-g*$MCBC8|rEs]Jwp{D?N?XR.9L`2nMfW:hrYdPQCI(UGtInP['X.Az*FӳwN#q"欵MXf=S]٠`OG'Ah*ŖYу2 j甧 9uVU͎3ܳyMH$>'EZ6][mpye:]W_ {]6~$@|P3XRE%&N:<h4-YwަpҋAqpο/qC4M$ExnarnMk+OSGI-OPT/src/javax/xml/namespace/QName.javaMs@ Wh|;.vrksN28(.tw1v3bq>5իGZM^fQ ӏ")`x<oG+-,Ȓ*dor.rRVШpkƜ?B+80A4xn(B!$msn]< \:sr䄚C!롻g\n2i6Ď8ԦȽNYa>RI }oᎳ`T9f*mKC|洧npBcp-6+aY 힑[?P J!N>JtM"JY i }(qr:qws=B(֔Bܚ*, J!#Tk 6RT¡B&Asnpp[PaEtMÄ\"3~Iä/O S2 6xgua'a#d nF9Gmro!Jȴw[g7 ((XD'pRI\(/иAjSbr;_s/ b}B9X]C7~S6(ހ' wAPK*;MNPKIG@OSGI-OPT/src/javax/xml/parsers/PKPKK>3OSGI-OPT/src/javax/xml/parsers/DocumentBuilder.java͕Ms0Wp5$=9940QȋQ+K$0lNgϾZ H: PJG'=/gZE$ /r-8* *AnO-+`nBX2ICXXsBYޠ-:'FCtFtMt.e8&:8#%Z0:DٜX%+A`A9K#Pi^2ΈyL0R dSc6q]4.N,0dk-S1ВحJmSV},dWIi\zЫնu5?+f]sK H4Ug:OSGI-OPT/src/javax/xml/parsers/DocumentBuilderFactory.javaTMs0=_Ét\Crksri=@9f1Jeɕd ʘp>?73tUJm5۰G/ĺκ x,'V `%( ,H{V9֥&d̘y\-VIhQ(<~ F A" ;_pЧ3_{$y]D;9ZR29&|jMKR5C-#Qgܸc5Dp`ϸeZj7fl3L@F^$%gD0z"Ci .v^sSivL (p]K ~"HVލh:1ݡ9݃HgC7l ZfgW*9i+z˺:oWa~D1W|VuhH bMW1ᄨmO0vBov1 j$T*'CWex7'Х<Sn0}-gkOw(QO(5s3 Yj}xfra!$ߝioß]w*4wx;S| 樣klձ/mQ~|/x{xtX3F8ĎA'7{ gFPK#C PKK>=OSGI-OPT/src/javax/xml/parsers/FactoryConfigurationError.javaMo0 @ rJ N{rt3V8@QiG#i'(K9ޖH")\\#z`\L`4@_M!$۰VhXFL[YXBJ$p[Ĉ>!Y\ESp4<[؉#( i  4B̠I oCop Wy 7Hsmw]8T)Ʒ|l=dݩ¯$xsaتvmD@Ԅ|洷H:\'=֑ܴо9r<6`#xiz}[}Z%:]\|]t>u#:x0;`MyE_(Td V#) NZKiN:_ 9b/aDF?(; LQB6tkUɺ Ҿ=!bi1x5;#<__^wἨwkt]K T43x PKooDPKK>@OSGI-OPT/src/javax/xml/parsers/ParserConfigurationException.javaQo0ǟɧOT7S DL)j:=%5մ9 &$DwN."\`f1-gX%ҶBbn~a!GHŪ%)G:UR#J9uR+\ LCd MfWq =:G̐l t*xHR̨Kꌔ`w^p ꗉ~C}8ֶIڧ\dU^޲V,wgVرk+zh XKt{a)`*鼕οGneM(LY1ǴȊye/-&ͷ٪z:ζ:OH{|9Gudl5e) zP'%g,5t!4HVqG0d҅cu,XL+ ?,W(DgGqO66rWv-OSGI-OPT/src/javax/xml/parsers/SAXParser.javaVMs0=_ 2!4((+|4ޕq m3-)Oo߾]K4*p'*k,:tO!81BbOS/ ~CyJri55(lF d9wwӊ*Qȟ ͗taR`L=,SڮVVNIa*hs-ABaU7_.zȒ[˛W6PJ /76FCNUYLׁM(c'\L\/px|-ÕvכMicfua>-#n_|8d#YniN̋?s/[HϺCL{}v [񋶩\p~_h_ ̯RoPWׇJ'PK PKK>4OSGI-OPT/src/javax/xml/parsers/SAXParserFactory.javaSMs0=׿bd\Crk9fLH$ch&+(tz(cKo߾zxp֚s 3(8)B;:[CA, GrS3(E!T,fLJkԆKgAjZXl BZ( 70RTT.T#v^iXk823*P57V}v X8:^Fa ߓJh hYrMk`TlJZ VrgS]in}0rf+dXͧ}6Gd}@ccZaQ҂Oa%#&_FW 0DFchb0Q|ȨvH&wܜ"$$FQOɚK#rZ#Pܸc5$0s4_pl5z#ΖlE@)̳ؔBZ0jI{br݁{x JY 2G{̖NB M,-uHl ԵaOziy6TEbiǘ\_%RRT+IĒ<{ %u[Y#y ʢÖ671[cb[3cEMW6iQfohb\Rc;pU$NWտ#<.8۰o?*m<Jn/OSGI-OPT/src/javax/xml/soap/AttachmentPart.javaUn@}._1D$iU͓sic5 FQՇ`[{]chq $Tݙ3̍~ TeS-# h:~A vsudH)\r;"3igF( G4A;!)He!7@$4( $D**j2Nm!!HٻV( KƞV25d֕׵L#\,@i&ʱ.B`X-]J,}рӆ~AX? ¦ zݮ!tpioc>kq8M20M9"DKjFdX8$1iɊ # j`` +B 庤$'~^Tv=w0JtAȔ.x!瘅Q4a!wf(!ԧJZ&dUV$^`I31; 2-S!L zzUaVy91\K7Fs-_PA\C͵'1mx{vtM3zu) ĸ睡 n2->/k p61.XUkْ6Dz}϶zvxnfzN(d9I;c@Skq^ޥhY]RN{Rs/vv{twfn?4Z-d/GSEfis3b5n\fdqWPK  PKK>'OSGI-OPT/src/javax/xml/soap/Detail.javaAs0Wdg\psk}6if5N39ʰ`BR%awI{ @۷]p+O7{ryC,gD^/@?WZؠEs*$orK+d!֬˸3h,WL`2nMfKoqRR9,Ps.TzCœv VcE}߇l i"q6]%Y%;)Z0:ޝi*َXA`AsS;.9XU6]瞅ZPlL$. -&1.bMn fg4) *63Z@=4[)2Gm|})B Vg$5/5tAh@icXy[ӗ/`v bznG9RdMhk9 "v(+Byu%[7/$gD:CSI)Y0-Yۨ5{7(_U)aJ0Gi=Uh'?PKQfIPKK>,OSGI-OPT/src/javax/xml/soap/DetailEntry.javaeA0O=mW%){=@*AMdN Aڅ37m[9[/OSGI-OPT/src/javax/xml/soap/MessageFactory.javaSr0 _)S__M#{]!Քoy,bvL(!~PK9PKK>+OSGI-OPT/src/javax/xml/soap/MimeHeader.java}Ao@W}E={] }c)}翈FlCȂWSe+JBwdoL-ަtJoA9F?N}]EVf4sDQ !k!}_q#x|9FSDMC3Zڪߙ{QPK0ZW]PKK>,OSGI-OPT/src/javax/xml/soap/MimeHeaders.javaMo@W|# NnOqKiU=ablE$rˑZwỹ3KռXYg_9Deə4\f 5)80C-r`Wb}Q.\C軂^ FNb+kP$ n`Kd,pTpjt*: 5(:- }V֪0l&`-q uZIN>uu'J44[`2 ֒5 5B#tԍ斋#aL΍|QW=3dЋR|8}<>͢dOR`o^ڒ2-jfɈ-5Z uY{t{rlg##I7KX/r`њ9h2%OSGI-OPT/src/javax/xml/soap/Name.java}O0SrJV){kDiA IW{@܂&U'TUp7D7Z\@V@YoWWKE!J 9Y2'Bv&[QTA/+2ƒ?Se _X$܆+{l*wz R9-Pƒ!T᎗>'CUT&stNaB4Q{h7iyөlZ0'>5Sx`P15<`YUАuFz,ߌd[~/PK/PKK>%OSGI-OPT/src/javax/xml/soap/Node.java}Rr0=_S r('ɤCg h n 0Za]|.Y|C[FVZr=7J-iy,R렺KUMwb)Vn[d@q$4$Oi yJ7_VxJ$ۤVkXt2:}${iv;h H q9⅄R$9BR5UB"G`6҅:XZ6sߗ^ (o|ini#Eі"ߣ*ފu+tjezZ\(Wde*_ؠP /x̱'Wzu{b'XGQˈ&= %au_O^ѯ( PK=PKK>0OSGI-OPT/src/javax/xml/soap/SAAJMetaFactory.javaRr0=);96Ck3qJǵq$$9NgLR.=}''\6{+뵇AQ~6D%ɻ1(e99[ZHn h Z&H 1|'VpO`5M^=(uJ6d+OSGI-OPT/src/javax/xml/soap/SAAJResult.javaMs0*hn-'h634VTI0{W඄ҩzg?FW\TC@K)*!퀅߰J thX2r&7@射Fhob t7C 7n{PC<+x ]~sӹx)OSGI-OPT/src/javax/xml/soap/SOAPBody.javaTr0=)%-'MSq NG KFd: C)`[O]=:&YY=fk Rk?@0Hsth73b$RvCsq=>uh8ac@Kbgj(P;$`%nVaʪHnu:n:6TZZ{_aǔ-FFdfu:?R\ $7`," +Y[ 4teHP۸^A,ΒlHśX ^V}=_Ű`aYFM|TZS:؎~d#T-~b_}U%k]swEPKP`PKK>0OSGI-OPT/src/javax/xml/soap/SOAPBodyElement.javaeAs07>ڜL31N39ʰ` t߻Lr#ӷoWXks=x̫DuR0^/E J-9TLeEQAdԈSed M&X^=C#;+2RҽFw&@C` wk!{1Iqř8ֶM%zwL=zP9Ki 0U%ډBuRK8QX 6t߄ȭplBan2+1})vxL4e"vY _n ::`LL%F_J6T;g;!K6|__$8xwDfs'rYnu}tԓIqH~G/PK=PKK>/OSGI-OPT/src/javax/xml/soap/SOAPConnection.javaAs0W3ZLSXcD%aweLފ" voDv1)^M&8۰J hXMnGeNhҖq ~B+'zh(SolvY$aa%$87 >\< rZ=sY;~Lcv$iy&rSJ`w' %Z"VzXcjN{'T+3ަQulh)s)%d>eVF.[~-np.i% ůV![_G42ꃻ)8O%Jl\hX-EE_%H֋\Q4_m.mdl5kAU4G`%g8"1J!tp py؟N=gRoԷLAE@r/iZL[ ]Z (PS8 PKߤMPKK>6OSGI-OPT/src/javax/xml/soap/SOAPConnectionFactory.javaR]o0}^~OPQE`"tUs ނU^CʊVM˃#{>=pVka}QHR - C~t#e NIҎ,TBSF:؈=1rX@;IҐfSG%8car/.5·`4M,ccAyº]:L{vv뒜ߵ8CTJ%y\7Vy>YFX 4KUy/④؄F'ɐf|N4tuvC2'E:0c<ޤt6-#ӛ>G:lH6U]XX%WT+%9.jQ %9*µ:6 4(/\AhE<_؊]۔3EU!rN.,fњd`傱{.OSGI-OPT/src/javax/xml/soap/SOAPConstants.javaMs6կNVK '2萔4R 4,(cIR\iFg]X[#cHBGÓǁ EsX,ΡQs4nZ+apG>yn`%"iH Y!ځTPUݡmt*n: =s-l8ϭsoa^,jkq3Dݭ 7Pų-J1#JAKtiO6I \ZgqOLgmBA?!G'\'ŇtRue/CAQR$)s |LhHQW@۹"Ozdk,BTZ6bwhU5^+k/=' {=//`E}֫H94 AM2&%' ?TJႜ #;&bWO/Ht C_.vU쥒7,OSGI-OPT/src/javax/xml/soap/SOAPElement.javaVMs0=_ 2Ԑz1 &(Ũ-W1L+cmHr =i E7KA̖ B WǽR.Ri" ܤsUE7$LJJSShI!s E)ʘ+SVECk'qGF}csqd)FM(2rʨоDcI$P5#5V bkm񦆭ұ u#.a1*ֵ҇K0g)|Z&~# OEe) "b؋xm~z/~ّT:㻪BϣN zVӠ2C鹾z7hYf5JڇlUȬૢ z eQ1$ީڪb(`j{DP * t=={z<|aW|țC+NW&BDHw!1B=|ZAit+Y&gKUC:< PKK>3OSGI-OPT/src/javax/xml/soap/SOAPElementFactory.javaT0=ob MXn-,F]]8Cpة8UQr{G0b> Lqd<=B KDfyH ApTsU!ng_XL1=mSOq5J;-+BeIk۶}:;v *z\Nt:WiB*)"y!lTwUJ`G- 9^U5imii1 UkAO XUhgd@18$8K'yJV+x8]% K-һd,Rz8}Iz7Ȩ+L<"d$lIdM5+ CThJaZ{)Jk~EA@9D؎})CY5 H8 [kd8[_KTq͕uAB="Œ&K;fltcַH3j@RN_(˓*ĮC P$t);re/ @l;S}Sl6躢?atp* %~PKGRXPKK>-OSGI-OPT/src/javax/xml/soap/SOAPEnvelope.javaMs0Wdg\prk}"0@8丆5V * cO+Lg֗~q@z.G#q1,/ k _fSIa3-ȒS2CDAR ,ɀ >BI g0 !4=ZhR9h-1CX؊iBB=H 8tW牀n;(.^qLէ\%e/_ԽZ0+5*pZk@ǜ;#ں yL)3bӺȥ?O`P(!GpI>d}ݯ!^t,sVқdd)A>‡$e|LϸCxh*@-sdMγRV?G? WgתcTw?4>?˹%04SV Aa؇Cns=dOpw"g9-PKYKOEPKK>.OSGI-OPT/src/javax/xml/soap/SOAPException.javaQo0ǯ8SR1HنV) Flf5jiȾ"f9YmYE"k)TA_M!am,}Œ,=;x[YTU%-!iD+U47hr-NCk=F:8HBn۟3x< z 4ڜ6B5Hđ6U\6=S;U0'^!*ĚYkAלԝN* CަnYh,OSGI-OPT/src/javax/xml/soap/SOAPFactory.javaUMs0=׿bd &4cRLQŨ%W1L&+c2Iڐ&S>޾}Xk#vځQI@(*Eh]ah,qƈj!,xJf X>=l:O%| J;(-0W)TE#nQiXj8qs:Pl pUUxik{g0NoIusBI ,kJJ^63W]ʺ`Uܠ 댘i[.l ZaQ҂a%]OrM>.&pa< pS^6@s Ⱦ4|3Tn4 T)nѩ~B>.zʉRneG~Bj?|կI^}*Ŗ/󍿯&~PK~EPKK>*OSGI-OPT/src/javax/xml/soap/SOAPFault.javaUMs0=ǿbt!99fLI39 {1jmɕdޕ4@h>޾}v%o1XsИB%RT`AiwR?tڭNRe[*5,x7 De+f,V \rn3hYS SK h㷤9j W\Q5T%lNZsVT2gU]+nLI6+eڭF*}@1 0Iqߒ\\iq )&i8 'A]ç0:eoJe+ tb- H%&|*Md2B%"(Q\۶jZ0e <|foג^YG̠Z0jr< >*7$ڠHNo'2]s,P NF!SGRݤc`%yj\)2-ŌTtmocbjwl~ex˄$r%<)v+Po_D>}#[GZVUaJOnmvm\lEMmoZ1~18YyPMze뎍mEۘf1 7.%#^aA ܏rzk g29!޻c׌&1?/z/PKjA PKK>1OSGI-OPT/src/javax/xml/soap/SOAPFaultElement.javaeAs07>ڜL31N39ʰ` 0t߻Lr#ӷoXis{\UsgPf|q8&(6!<Ȋ :n%`6f`qzq#txHJfBߟߙ\ '/5~>{$1gX6.Z+OSGI-OPT/src/javax/xml/soap/SOAPHeader.javaTs@~6O`ib6c JNaIpܝwұ w~?vFx'J(;QY Ah<~9~51<Œ, !3xsC-s2ƌ?!|&cp78;UC;Am9( hv $dҝFuӱx'pqC#h~Z]tZ;_FMӄ:)FkG$I'/uW%Y ~pP , SucU+נ!O XiW9u %o4N"Msf(Ǔ38&<&[:'`·s?EH,ޒՔ8,j, !#9h2~ 枦pڣ[(=76Veh@K#̑Y!9Fֵ#5GLJH:Xmb%$?={>j(>g0sHRWPKDZ>MPKK>2OSGI-OPT/src/javax/xml/soap/SOAPHeaderElement.javaAs0Wd\psks0Mv39 XZTI{:]a ڧ>Ap,k^o,L[H/¦L wː: ->98g^0XB'J`7b= ~6\ 0uX>8e{Bg<7+PY ٪v3] 26(zN=\k g/u4 2Ζzܵ w\"ڰVkrQL)= H (6&`fefQ6s&/)Y%L0^E I$Ư5gn.)BxPQX4;V#rZDPܸc5X:2;,5 ,OSGI-OPT/src/javax/xml/soap/SOAPMessage.javaVMsH=/@8m=(BUK"qrr RH3̈Jorr0ׯ$޴ x(>_$]O,L$wWWo{@:2DRCS, OPhL)*0 ` };=Js)s[Юݡr!  k  DE-m͢Q^cȩaT@AYEW1`Z9RH5dZ= <}R]"2*`JؔflR+=#↋yShaR왶H7 6&mAܳ :2{7$c#(Vx$ˈׅLnNb= 3 L'Ԛl0KT:Uε&x 3ե,Ѡ"Zl:-Y1l|6Yb C[E3.XR%c91yF¼k7r={($ fP5>Dt=> &÷ۛiORA F.Gxzrc)y ,M]c(9 sǔ0’ W<Ω—8q8ɶޱtJ)Qf_˼vi㌘aהR\yB0pt6~v3 %W$Ȝ (Ѝ{~/:qsFF>'!DKd#0o{;%9e6ScfO}~wm;4猷w>905_ I%z -ˌ842CzZ~׮O&tƞ1vG_e8e>1Ԋz M䖓K',MQE "p{PK`dxQ PKK>)OSGI-OPT/src/javax/xml/soap/SOAPPart.javaSMs0=_ 2Ԑx &d:=y1jmɕd 8B>Hݷ݃@_K-o0&OS$Ghza" Рc9 ;Cs~F( G^Z.Y?5'b P$ a`*R\p- \eyMvVթQ12 gi֤s[*ƞI7]Śy#dƀƿФx+&5e%( ,HoV9֥VȤFMm4:XŤ[MH7mLBӏ ŏ@j h`paxaH7=O;2\;DSvZQ29r1ɤ` B%)u&!IE&,Վ.WhP8l"K=X~ȋ ؄3nxFCi[ %o; ULy'*N/\(6>԰86%OSGI-OPT/src/javax/xml/soap/Text.javaeAs0Wdg\ᦧ6'- 1$,x[TI{2]t&I9[W\Zva^-`#H׫Շ%i!2ւU0-=Bbdſig hib M[M8zy= ك4!BT7H~gr $4yKK>`xּ{o>8Bm].Kכ,߼gԽ9{ '*Y2k'Gdkԣ%O]Ӎ`S #RI$4$Oe0yL.Ɋtvmv6WH'fK@Ƥ祋#BhKS [V* ڞ\hc:tԓ_]88_<ȣ8pZ %ȑy&xQZdWJԺgsԺC΋Z=*?'PK PKIG@OSGI-OPT/src/javax/xml/stream/PKPKK>.OSGI-OPT/src/javax/xml/stream/EventFilter.javaeAs0Wdg\psks2Mq(I''$-Iշ+WXjs{L'mPazXgq&(6hC0)G;jG~OH3񍬓Z:^`qi2 'ݣ'(;bP˖@NJTtgFA%iХ,~)#{o>$0 86I{Ѻ>[b]%`W/-'.O*Q2k+h X5`RI,{k @VL1-bLflU`rfli/Y~;qe| S:/B/HP%kYq4!4@Vq"tZM+;?O+D3q]sTMd<OSGI-OPT/src/javax/xml/stream/FactoryConfigurationError.javaO0ͧx+{k9,F]Dخh&vj;wG9$x]DW#C?`B 7~3} i KfGȽHYZVk2p[B\?Xnmc/q5Jq%֐YhQ 2]VZ#ݶ=S$x4 n+OSGI-OPT/src/javax/xml/stream/Location.javauR0=唬RHf5 ]ј܂&$ZeZ /OSGI-OPT/src/javax/xml/stream/StreamFilter.javaeAs0Wdg(9Qi0N` 0d߻Lrv{OW\J^@^~t@Y̯!"PN Y2EE6&iiܑ'H4*!?{813qLw^o:+z:u/; a P3Uv82!9G#mV5nDC^f'3ܫ1 J%% >'eZ^1~Emu y2OSGI-OPT/src/javax/xml/stream/XMLEventFactory.javaWs1~bO}Bz#r#zIwv+}ͷ&FRF~ph.*BFaL\ d!TcԒ"u,+!XXfgjDyှ1x8(Tde)II`}0nG~jQ+)=ҳD+fCY>;؀te ṨD >,FCuDK>JM}ĜZE`aKA*c<_5rH:) +HׁrA'S+"ϧ¨}rוjJ+촋CÚOzԟ~P*fhpyo//G./~֊̦$Mg9{ߩ{2&[u+\en45^-q#~}"dr;VEǞG1OSGI-OPT/src/javax/xml/stream/XMLEventReader.javaMo@W|#ZC[TW@7]H|gw޵װQjo`/`|5g"G߬Vo@ FcB1OSGI-OPT/src/javax/xml/stream/XMLEventWriter.javaRM@=˯ʉl!d9ar%V8 ]e`>^~50AbgMǰLq˒3"Wɥ~51,R 53,5OQh̠*0;f)}>\ 'Zh 4h$!%S pAZͮ3X%p;pȭagTP.f3~]WKUhKR=T݈&U)ے֒u B!iUw. MZk1B;i$0  (,&Z_ެaVa ,W0[h-cڽ0Q<)2ZY$8S\%S󔬉aB![TAڎUҔ↙̗m8}e-*j͖ ј|^(̆2>KQ"E+y,ܳzlI#NբtNK}Ne^6z;`j""gx(}"$'9߻gWCcΚN%?3WC?cǗOq~PK \-BPKK>2OSGI-OPT/src/javax/xml/stream/XMLInputFactory.java͗s6ǟ_p&wom>ǹz3.Oa\I0]N/'LByzϮVBhdT|zkva|fg"E|>9kױf59R"!OQhC!ƨ"9K~Ӄ+TKXv=KY-AHF&㆙Ҵ oYlYPfQ%RiƈǷ0ya$[Ԏ.XLK9R: U0xJ;79,dH}^x7/ړ#%Cd#\\ kؿ]K}S p~Qc1/ 7'>$lryq1eC?ܰ&EKe׋gXV_ape|!D5\ͤR jT2VlxSPWUץSlN>-AQ]) JyiМ޶tRIYO]A\I_BОsz5PQ o~X;\:V1JKo]=F=˴]U5{\0NVQB1vlp$^A~oNux=n{, Ϟv S4NA`nv؅t2݅nR$Vq屑b{|uT}_=?2Cr^qb+'ME ș*)=)&|Z+EqO7{S(ȲSxxsK4{~=V ~\1F۷EQFm7o3}lϾDڐ6o-jPKp'PKK>3OSGI-OPT/src/javax/xml/stream/XMLOutputFactory.javaŕMs0jHn-ӃKH)1Lf1JJ2we;ҤpaWkށЕJxf5`q3!ԏ&džk0Q-p⒂ db KYD?Փ&|Gp춡njգZc%V29[25LyS\@$is3+֩T, \Wrl3*Ht=̘S bW } R$5(qEWRؘXTbHK+nLpmgfôFj}=lcj^~X/^M+r叾.Gp ^0{! 'I,up*arkg"n LeSGԚ3#rJPGsmU$| 3Eh/PqV-]ZE68i6&')"Qˆy43jwλ*sK@BϵnH {?􃳛;^L ]2n6GMkZII݆mzawĩ@ahȒ7K\", aTA*뽲e^xEΡa.S-,"齙t>f9RYʹ}a<@#U:>1 %07h7Ln%j,MYzƯ?uݕbLOO)6 $K|ޮkodrx0@hB 綬RǹwPK` PKK>.OSGI-OPT/src/javax/xml/stream/XMLReporter.javamM0WrJV͉f5 јx صMHTwLU|~;`#Y`aDM#Xz_. 4A}2 ';%]!RgU+Mb$βz! TAGeAte&AøϤHyҐeTΨAѪ.f'9X>0 밹ԚpoI}KScנ1W/4M\) ֆ 5Z#tԃVtFVv`L)բ+1d`3q;x%}SeQ9l!iBO%5N|@n)B $Jp{V#򈺣@nqjt2hev 6 =|^ؑS4*v '4bt?2TR~{oRd ]wࠂ"#K r+!I>һk92ǿx9aPK% SPKK>.OSGI-OPT/src/javax/xml/stream/XMLResolver.javamr0)v|3D2ua8Ms` 0t]a:M&hwxpΚ7 rYCԶaZ.o}E°svhP Hly`P= D2>|Gm 0w)5[Yб3i7H@[<,pԄ6p{L*' YXF6(Z z|֪a8 CF@&l/&&8D=-\ LU bmRk4RJG=hnh|0d*nEo_ #Y^@ccfQI>QyH_=5OSGI-OPT/src/javax/xml/stream/XMLStreamConstants.java_o0şǧS[e$v\p[*pr!P۔DӾ)Mu7F2q5 pӛ1ɤm[wJՓy0u_, 5(qHktz-x +g[%,1*3-Wʬ6J,G8Sc%HA23؊\2Z2&qLB(D!΁7%1 ]hS8n!YȪKdysyu/TA-Vj{ L!pm3m4qm G|{ ЌPk'ݙt^X&K^ ْQ A'Xx$1$bACԻg8@h>9ɡ1ͭO9c kci_sгi !Yt^#&I^aW 5zt~a$fO"'o_PK-bAPKK>5OSGI-OPT/src/javax/xml/stream/XMLStreamException.javar0Spkn-'Sjf0iV\I0=+LI:v-kw .`B? XK(]kY<&-QwUR1W5M*c+b)fn4\> drnڞH?M ۘ^BCƩDnn"J4&*^>B—82ꃻJ ;;) ZL_FE BmQK*%7X NF[fۭgsF?e`WFEV^ F߿v^wypgQ榭 PTZY̜cLe-n1>O?-7Z5QJ4riG8~(Lgٖ_/bR_?ʾ:OT[:@aF[k b >Tw)<PKB\3YPKK>2OSGI-OPT/src/javax/xml/stream/XMLStreamReader.javaVs@~.N'RԌVaIp݅4<@{}ւgWFdn8x'eDо8?~u93L %gpI""i(\Ƥ zFSz:J…wm8-]g.F He!79H hQfAH"+u, |-sE#d6kmI̭^wÂtMX(C)sb2R1>2OSGI-OPT/src/javax/xml/stream/XMLStreamWriter.java͖Qs@ǟͧ :h}>E@X!q|8M݅8~wBTBp$w{.:GAOf+%&o(x+cR%'4*d͟?Hγ3l\Bo!90+Rnz. DhkŮu%?* Ų5`5c4BnxI{cVIBcZx-6-; ek>%}3=|4T=bgq>3fΙbZ>嗯*Ϫ7'SS_7`=̬1u3 /y^ef5ư潽8ֽ8~J+rn#j.9./0LmL<}WӚGbٚ~:/PK\uPKIG@%OSGI-OPT/src/javax/xml/stream/events/PKPKK>3OSGI-OPT/src/javax/xml/stream/events/Attribute.javau_0şOqON utXB$2ݛuWG =ahDsp0/ VpY"oVKːz-#VN(-V ByIig hPn ^0f[o1:>Tz!,ԢESځPNOhp9'CSYTM~00~&f4a{pI}AS՝lZ0:.FJ^kPxcԃNf VnM%3ݳ~1RO028[z8!J(md>[G'% EFIa !C|P XZԚlz 4FRGtkXyVtqw^/PWoQ;G/(PΡ9v,ޡj珻kfonoQ~?wh ٧^迿UJH#lv +#~PK( _PKK>4OSGI-OPT/src/javax/xml/stream/events/Characters.javauOs0Sdg\DmeqԂD%aweә8K۷Rw'#4& !j*'-ofo+-lɒ9P!<ȜzUWD+sBJN,`4{(B):9 rv# ]}gt$4z!ˑt*_ }~j纷a8 3Ц ֆrWL=zT Y ~p c3fmpm+C\sSF:9X] yBZgdֻ~3r/*D)Eiν>}<`mQ)l$xo^(yOqqd|;;`LLR+R_lG,eέNJ2;L+e4y믾Eap߽71OSGI-OPT/src/javax/xml/stream/events/Comment.javauA0W<ԮS{ %.d;N A"$& ;[U< B4J0],3 [rdT V"kUvT%Y!d2WN[44Ldv$ΦG+ƣwʡR NuJ0m7 .*O{t<7B0 B^u\{]N,_fqՃn9X+ˎgȎ gF05o`WÙR)V{"ly&5&I4}<đ>tlp*y=ED/*sErR[u/kBmd5;BGU.c24U^?Fqq?wy'qjVI~ρrvl%mtR|^?^EA2mM~SoPKN=PKK>-OSGI-OPT/src/javax/xml/stream/events/DTD.javauAs0Wd\D2ucHXR$=0& @oF6KqYQBԶ+Y߬o {G#o Uw@z.1WV Z [ siqu-zAiEj"I`@*gQgv$0{qsӪ~*f:8׿ q6M^6%mo_Nh-9HCg=Q ^kGxcjN{H'Uk7rަYYhi+XD9$Gy}R| (-m6Y'EQ4^RdOq^Nrg T3G4&M'?VKie'wӧ xG~'vZF"Q9{CIRvM"&n/b߿ ~y`SDڠ:c-7~~pe;ݫѩ}y]V>_3VEPK,RKqPKK>5OSGI-OPT/src/javax/xml/stream/events/EndDocument.javauA0O=B[ bI˲G76ӴZA"$<9p6g+ǴaS|HV U9nmlCÖ#U1+{YrTWY!5XY'm44Ldv$κG'Pڣwҡ-N%PΌh9J Ө^pëe#/{>IaŅ8ֶIkK:/ozzP-9Kzi a{fmm!K\:PVz9 ,J:oB_6plBaȊ >EṼcy1n| lXnU69>"͟%WsG1ez(^! %[SM/Bd;!I1`dZI/e_$8A8S|ژb:.24OSGI-OPT/src/javax/xml/stream/events/EndElement.javauRr0=)9=Ԁ qJQ׎awVao߾*+X{v9l URz!1l=#Vɝ*Q{:Bbeɟ/2 0JM8:ymz̡<ԪES@i(Mg'i8gb Jq0{ `yW?I8AQ0 w:͋%uރrxiYU)q52A),0TʓSG#[ ؤYR@VmRd2;OSGI-OPT/src/javax/xml/stream/events/EntityDeclaration.java}_0şSSSC7'X…F!I(e7gvG+9! JFTG|샀9vx3:1REs‚7وZYwD42NJ-[ &h2j=H堵HB)j< j w]< <89}|.F8:߅auL*/Zn:֯zj/k hć&(2H3n;x4Jv:m mw6%O)NVs@6>a _e!C|P ՘RMV-*uB#)h4~[-ަp  z?sS3axB]J94%^K'\¼f0eay7k?W^<>˨Rs4y>T= ! E]S(w.b+~PK9SPKK>9OSGI-OPT/src/javax/xml/stream/events/EntityReference.javauAs0Wdg\Dmep(ÂՂDؓ g2}z.M74٪@0g;*ZI#LosǙ!J):G,;xQ;,ZBʜceh2n^0Kٝ8ym:FS-ҐzEœa$Y.yC˫ZF:°{!bal 7rdL=5:trdT3k-{0dekdc*!C|P k1W9:Y!TVs"h6:,MEOr >FQĩGE<&wݞʽ#i5):XE?}<½ ~ج<\3OSGI-OPT/src/javax/xml/stream/events/Namespace.javau_0şSSPM ۪;ԁ֝} pѐ$:;*INN~&(}1=9XV+9$Bp&+z*^E~rEs:"or+ke !Ѭ<g4+ ^;oqQ=tR9-pcPNhwiœJHh~0Dl"icq>bUG)Z0`*V`(5HsNypeUAoSs /{_jcIiI7yH<$ydtW>>ۦt;HGf*}p' L뼞"uE+ɶg-Bh$%%q4W.QWo(*.3JgݗT(u4N;cZpt(kQ{‹"4J-V<]үO' R)>[lX/lLYGPK TRPKK>=OSGI-OPT/src/javax/xml/stream/events/NotationDeclaration.javauAs0WtzLCq:qJQ׎a3[>=}o*+X{v>Ll QRv&2l=#ɭ*P{,%:Bbe22A0KM8Zym:&~vdtf MJw&HGf9 u!c-B 2$oP*8;Y#Ns"Zõz,MZEr(>FQĩmGE <&n Jmg¢nrB]\ķ/0_ѫ!ȹL^#e){- i ?{"EPKJyLPKK>?OSGI-OPT/src/javax/xml/stream/events/ProcessingInstruction.javauR0=ԮBR{ m˲ǩ3I mliwmvĞ7Iz ,9[#KP#{d8û)Џ/{&MaH8ѶI+֥|*KV=޺W-9~Ҳа*{6uP=XjbpZ 4t}G#[ P$+!/'6+2$~v|Uf Mw;ȊG#>t268`2y"D$*džG!IX`hZIr("{ G<%M*aБww(gl`3WEhN<'i _3z0I+ko/why _QPKb|^6+PKK>7OSGI-OPT/src/javax/xml/stream/events/StartDocument.javauR0=ob V4{km a=:$MԞPB"$y޳anڣUՎ`O`->)ZI#fSIa6Ta.V*S)!FCi4yGA# A9Rxȱ%PrӴ^4g`Je0IKnhyUAPVQ}ƺh̗XaCד9SgG-eZkك +\#UV)=MYutE#[ ؤQ, #DL=s~s6Y Xo`N6Yq_t1xZL<"+ 9Kr-T9[U'+jv-F9V"I|AQp?=![EلGM1hm)IK w .ܭ.3Fun ,||o-cf/|'yM8:&)n;_(ft!km_PK PKK>6OSGI-OPT/src/javax/xml/stream/events/StartElement.java}R@=[8tOY5% L('dkHf^3 &:Xo aQ(Sxfv 5,<fg6H&SZ,F~ ؤ^@>LdIj bh|y-y̧O)}e|-BL% SQ)[y-sjvR9V3OSR/?hO]^BUjrwAU9PΎn$o;!iiZ`u6@3w]|2OSGI-OPT/src/javax/xml/stream/events/XMLEvent.java}Tr0=_ 2ZN.Դ4q֖\I0{WiKݷ==:oG QQHT9>’,e!#x,eP -ATGw2Vj>ׅz8J<jK!-ldA@{A@5m>g^;t䂊wD@בn[wQ4!CmQqkGx:KkfU]CkiXX1+kZ`8gʇ`5hd:#׵{d=G~^B}ЃīODeY %LU >@8e܇ v"D(l%[)Xk r#XTdJiZ&yBҡkFA>@?qp_!K%,CڑrvT e m2w23v5NhP0:MGٚfŚԡqǪm[ !'j[*?\Qz>TXe_)g<%>.Huuv~1bX?9 8Kڐ!~]Ϣ=۳F M/A1:OiELI茲k% o|xjttoPKLBPKIG@#OSGI-OPT/src/javax/xml/stream/util/PKPKK>;OSGI-OPT/src/javax/xml/stream/util/EventReaderDelegate.javaTr0>O 2ڜ@[O`4G,F,a2ylvؖv?ypj,tL!8)B|8|}2\k\@&`X͓PlLB'!;>ø@,8 .(ӈ>@0)2M]W@R5L)_ɬdB֨%9u΍.9K|9Qw薭'r\\xEP F*kvF(0ck٘ӺydW-nNDfzf+Jθ~N0\E7縱 іZ,xr~yNH#ubj.h6c^KHb&j|JL<OSGI-OPT/src/javax/xml/stream/util/StreamReaderDelegate.javaKsFStX:'I J0H4iFB+d_ׁw0V(6 aa${3|ڱ0Q0t`!B.BT`baz)#*ͥg]kpU>!e[@\Ò' 032Jikn"NIJsɐ ȜCFuC`]d?abGluSoT^"AA9WXF [T"Hz"ꁖKf -&(͓56&j]/Cz|xé=a4޹;ҧ_a8 ӻ &Sv$t K3 5,B A*ږUbrLt/P/l6&M* On;YtB0ROu F`SԉGON>C <^WmbjpZI!Lqv<R10F2PJfm-CL[D,[bD$NAʅ_ >I |j^#KXdؓ?4bA5 iѣ/nKx7>nL^oxI]90㕕c fVH(e͔l5ݹJ\_7am'oԵ޻w̰[w}U~!Y]4ij6-``v^f&ii؀N[VgnF A|Se gGfby˾ u2fYD9ۗ>ku ӽra,˭L,YZ exM3]r/QKZϢwTmO^iN/߼N]jT ]ӵPK} =dPKK>9OSGI-OPT/src/javax/xml/stream/util/XMLEventAllocator.java_o0ş˧SR1H剥ن%x lfH4ЮUI>>c/=jZ{ lʌ`z=_緳) $dHwLnEFPID f|G|J%: &dpGBGBk=BTtȨ $dnF^HaP;,GS\hG[ۼ þ˰:iMx/WtYw"c@VhN;6LY+AiRY{-FGM&jk9s׆&Q q:Q36w[$ZoU M7k~>+uh1󴋐@( 4BdM-HKN ZsgSZXë\n;vxupT:h^NnΒ.ۗUG2 ˻8LNbG1IM3%K.!t99ԓz5|l]tJ\w'%W'+q7I},uДߞPK PKK>8OSGI-OPT/src/javax/xml/stream/util/XMLEventConsumer.javaeAs0Wdg\psk}"2uq(ÂIؓ d{+E7J鳡``}#뚄ŧ9,ӰJ ;h:,Bv&QZ,pGX?~$܆ zd\̖ZhrZdPRFh=Pgt$٦< q ?~-:x'`L"dJuAs*)hjEPD4dZ,MM 9ᆩ\P?)<5uQQ4a^=p;sM)~nJbӶa˗CQ+RnNŌ)uIeze̽ PK{PKIG@!OSGI-OPT/src/javax/xml/transform/PKPKK>3OSGI-OPT/src/javax/xml/transform/ErrorListener.javaA0WrJV){ksYڢ]qq 68a]5ז`{7ώnN꽃i1uYA4 uA0],Ag!K|2/r ҖJuI nOwXg\7bpS_0&8Z<6zK,T!cA0m7 >'QJ9ʆNFB@7Bs݇(!3qhKU[w=膬bxw섪68aI֜+t=k*7 )uv{3@bC 848OyL_[x78ۦI ]Mי>A=4IdCǎ}|SBe.HBUtcMP#nj2jCw/o }cۄQ[qlA$LW('04HگN(?|s; /ff|Z^:lh(~PK 9PKK>0OSGI-OPT/src/javax/xml/transform/OutputKeys.javaTMo@=׿b8z @S"Cd-;yo|NzpZl|iv'/K$G|<zz 18( 5-_3NfOPx0p?qG@Ŏ qkQ"cmAHપ;i{a)EǡV9#@MsC`>[ko~XSz3)Of2(ɢ1PDc@FhxuV*Vd{PF#YTﵰBnF`FGScX5]4R6&gg}898>~Q4 ,OSGI-OPT/src/javax/xml/transform/Result.javaA0ϛ_1+HZCmTL2 n۵Zw ĊVjsH{7oރ{JuҼ[gXOªLd~eXJ+4DΣ-EܬQ: qKvƪƎdLRoQ?(w]MOb}O`oNSOPKVgPKK>,OSGI-OPT/src/javax/xml/transform/Source.javaeA0˯唬RHfuRj dZ]@j{ Zl?6[Xks<Aڶ$U0[>.O8l6(lѡ!3OSGI-OPT/src/javax/xml/transform/SourceLocator.javauA0WrJV){kf5*vGcl6!8a7$7Za.P/Ҷ\ ja CvA`V T+U!5\gYNj A0f`1:>z!ԲE@A*3 gr $/OSGI-OPT/src/javax/xml/transform/Templates.javamr0)v|3.>QmfcH29xjARؓwԙRt59YY iP%f8~> `w!+x;YrNb#J;sx@Vp.`&d'A+N4A5J6x,Hn͈K}FOOޒtWe"gOd>GQCm9.Y|Ǫ{ՠs`O'-O=0LU-6mAy$98]Q/,ztd嶣W0 lP0sH |${Ǥo6qZ$ 6),W's@X?cJo!G|P33XJ<;Q#VD`жcu 2l% Bo `{_ mBB9.mLVO@+_v$ܞ$k#ؔ/;ad tƨV=˺V;;L.',APK6@SPKK>1OSGI-OPT/src/javax/xml/transform/Transformer.javaTMs0=׿bd\Crksrz ((%U1L&=+p0`F۷o߳? Zk/,t/aQp&2`p= c40Fz PA%f.B2kN|p)"@:Qw(ֲAH A@UR5jn> S L-#8Ey67{_u6~ŚMt5%ï+it L`5H ,HgV:յ斋#f͌yZwh DI~I. p4 cG$G Dk,>RM@2s"$$VQ9h4W,G@.q8s4/ev7k<#z`K VeẌ́奧,N^D}QZZ̜5n tb)x[Y^.u{RP(wQn$,G*ʪʾ/v^ O&{%Ӄr\|fז8K@˭)e{݆s$ i}`(b9bmD{"?SmOЯ%iYi|DIU4rײ6qv¸<PKpPKK>GOSGI-OPT/src/javax/xml/transform/TransformerConfigurationException.java͒Ao@x5$KhkI36ۚ]wwAQ{g@ʡQ}坙7߼E uy028t'(P){5^wc3-dhʔ5*&!DHFJJp 6鍼AW؊v,dA}JTHlj6MVœ+'8]pAi"kg\~0: qM>(v0ǓY2ymՍ*ZQI%SbŬ DncN{H'Uއՙ!/ܙir +ѕIiSDt5{uyPKU PKK>:OSGI-OPT/src/javax/xml/transform/TransformerException.javaS0=唬(dsksٴEMخ&$Z;&Dnmdϼ7=ʁ+jx6O0?p3"G ~36,ljT#T//ȎcH> :DPKCPKK>8OSGI-OPT/src/javax/xml/transform/TransformerFactory.javaTMs0=׿b鸆KH)34lH$cL{WƤ8LrZ}ށЗFtaM0r3 [3L jT+`A cϝNY>Rl;ð?Eĺ~u%2* X%,&+A*`B3Ҳ.7\h97%Shaf\H;lL@+ Z%ȳ j d E8 #:]B0$(se3 ʹ"DrKI9O(5,EH GږUf*ӓl?--[^fQLh9ybJ%%Y.W`bzz6D#Y(jML8#l DybUȏh ϚmJR7K/Ŝ4TAzyn[R=6q趟yLgTCjPT`=0M0R%2Sp5 i l%wm+&$u2robՠSHy EjTlvXٹ-YiiKpjdT_\YI>}r+xOWI[G a_9|7PK{Xe PKK>JOSGI-OPT/src/javax/xml/transform/TransformerFactoryConfigurationError.javaAs0Wdg(8>QifqQ'&NF=^xpsH[ lPj:&+uXAa*9*GEg ZU0k [It 8Z! B} u3un9#ACov^ ?[kau] z@SV^E.2pNUh ~o%DT0k%:$=uGJU`ta;Adri,Mk_86`#q;xiyhuHa22 D|k#9o9`L1OSGI-OPT/src/javax/xml/transform/URIResolver.javamAs0Wdgprk}2Q V ƞN{W6IHzz퓒n`iTs0f.)HVI]!Li&4A@tĽ``*=Bjeşq%HN wb K"XM<6zԪESփPΎhK%av^\ˣ/{9IaB, 5I{պ![r][ݢs@W -SUrǬȆ׼ )t3$a+Iz&Fnc&i Y9/iq0y6 4OSGI-OPT/src/javax/xml/transform/dom/DOMLocator.javamA0WzjW%) %.=$5$'Mqv9$7In"gTΠ((HV -Ż9,۰ J[XL6JXA+t@ ɟd?ye4 d<Љ3hC{dV-$ZAΎhåHq0{,|~)A#9ُI2 C,.ıqM^>du^2x^=8+ ,SIgV `! ԃSt3oj`S)ON{z3#R y0yv_3`lZ)tP("W0)6&']\.]-xګHA&riz'YY{\T̎T߮# [SD_PK' PKK>3OSGI-OPT/src/javax/xml/transform/dom/DOMResult.javaQo0_qT,SED>&xsv:P(pB?,!3"F!zeNs4טLx`P]!KUJ•?ku`,mA* Ar.pbeKHUYuh vőc硖Q;#AEF`n hg-t^E78'Nu/\-R$VPXjV9Fse1r0&jAhi  |(:huvp>E4M`6Y<,[Gœ! EFn.S!WH”3OSGI-OPT/src/javax/xml/transform/dom/DOMSource.javao0Ɵ_'XB !kU}4%xKvߙf!}}óp띑a1O>KDe)J | i KfCYF,ehTFnMjEFNJp1 .NN7J;4CZ$6A*;VNIpy.XP.:÷vm@hSc o,eNuJ~5pǫDTX1k)ZhQӞ5IU`uZad:#W{6?PG ⤏OQ'#or/oh \gW2xwhvjqwҏ=C#)L5U4 zCFqGTk yRV w8: {=OoCl6VeP+VAInV>DZ+,'5'IvQgm`;;3OSGI-OPT/src/javax/xml/transform/sax/SAXResult.javaAs0jZ `4GaZYr%߳rI{ypUn5w>}} >)8k4B%S`anJ¹?+uWIlUۂT* d\ ``iKHTQvh5vNHP+˨QCIOB`n?kk/AP׵Zb_<&&Y3OSGI-OPT/src/javax/xml/transform/sax/SAXSource.javaAs0Wp3.8hLS{&9ʰ` QI{2]qо[ɿpeQ<_%}_8EHzWJ jT+L=r&w-30&(^)~ p؅AkrξN3(q pN'`FF}p])0)Bxg$]a3P4,G DP*Ǫ 06/au6d+eńzT I3bY+:s% oI']ϸ`h fb+ߎ<'pKp2S+tG^` olЅjMU(t+%z~!1|ex4GlR4.lwGs#i0={;ws)CH< qZ* v O܏rqPKKiPKK>?OSGI-OPT/src/javax/xml/transform/sax/SAXTransformerFactory.javaՔMs0jZS 3iSGQk$W1L&+ǡ!I#iJN8,w+ݴ-(8)Bt0x}s4D6RC.)X OQh\B%jWR; KJdk! TIkxK\@*eVsj*Z 0m(i3-t)_y^].k]r$8xN(PkP*^쀕D iHK]+nefj,6/*sϴ;F*0lc:~ a܁7~}+r&y~$ bE0M$Mi4zY,<-0#C-.1O4W,GDڶU| 3ԃl"qV۰]QLhʸv5ZdK #ؿLPiAcP,Q#γV=-lvmnLSiOQGhݣX^T ;çx~2'IjfT S{nn`Ϻw a9. #QRaoFRd:OSGI-OPT/src/javax/xml/transform/sax/TemplatesHandler.javamQo0_qTa}QFD>&xKlϾ!i}!:\ؓS`Z`S4@,O3^&(=lУ;`)!<:]#$V7:iLƭ6XL<6GP* @K4#Zh?.G#r,K!Hߞ~quܜ>~H,_}`ԣn{pSN -SrǬ8C#{HzTKTufh/\Rc&Ii>/I`n׏[xJ6$ۦXt3^}${iv7q Sqor79#yTt6tE*3`l*4z+Qs~ʃ<OSGI-OPT/src/javax/xml/transform/sax/TransformerHandler.javamn@)F>ّ nnmNvK4q v`{g1l>`??rO0fIIJ !Ls秙a2-lѢ9`y*9*GG4Vj.a2&G'q-JYCZ(d} T:IϨHm;.SqF'j>Au}mʠ:9ZdǪU`w+ ;A4LVm@9FQwFT.L.-kjhgF~c &aQ2/a%s'O^6hf Mh+|G}osҍEH }B f[Se+JR(v ZZVˀd-IpΗkx)ec[?zMM!x9U B; Rs1e~[?c;;~[`%RruO~A/CA,5OSGI-OPT/src/javax/xml/transform/stax/StAXResult.javaAs0jZS 3Jrڨ%W1Lޕq Mcixp#U57Ifg{;n ->)8 OPL)jd ڝ>|Gmp :V7t{UA ipK%$([M3Uq$jeTΨmgcm!YC+XkI4O[nR1W59^D5 Vrg5\}0*5dRn^PlLB'!;)DVlU8E4a6lz-ٔ!>hzhJ&wqOb LL xBd^!W[ԒA!^plt 5OSGI-OPT/src/javax/xml/transform/stax/StAXSource.javaAs0Wdg\psk<=ЄLS{9MrajA0d߻466`iDp\zE0N'de)Lٻ)!q4DnD`P 5Oߙ7F( Ʈ`o&s'W T|RYh 0w)TUu *z 95=tX[_A۶>}<Ԛ&,zK}׭,kJXKނ gnBS0*-d2aBHO (6.a2>,fS'r>/oWp&IXeU zp_"9s@y8E`\LEJdP[ԒA!ɔn/7(<η|ҷKC+X{uD!-923h:uJj7@.$/8 Q$0߈#C#yqs|C^_o-'][gD±uʻ_z/(вXj$gdSsxfd++6?.&U"s 'PK`YPKIG@(OSGI-OPT/src/javax/xml/transform/stream/PKPKK>9OSGI-OPT/src/javax/xml/transform/stream/StreamResult.javaOs0 2ԦLnBZO30L^J2ݻ2n4@}ORx\y0H0OrL0p۰phP0  jE*OWԆ+ Jp,@* Ar.pbeKHUYuh ő]6Q;#AEvgkm) XK(]kj:KS@c@kJ9*ebfn4\#0* l2n>_Fo1 ~@%JdL|uXDeB TM5+ C-)TKn̜ܵ%̶[OrBϣ9rF?َ})4tbPhdī R5i7¶XgxΠu9LqPi\<]i\-)tI-yPKk]PKK>9OSGI-OPT/src/javax/xml/transform/stream/StreamSource.javaRr0>O 2&LnBZO3бI39 {mڒ+&wʸHpoWޙgp)ˍ@?,sDп·@vjQZa%1 T"Af,24.mC-cKlB4א1Xekf, ܷra3tJLk,)?z^].kRe^Mp9FE݊+(b$W1[ל L!Ռk LMZk2{C둢whlL@Ϗ zُhhI0`,*)÷`z5KeMnǹ"D{RKyc&e\JTv &&74W84_'[.r(&4).FVZL!YHV6oMc1yR\57&qFp>Ӯܮ/Ef*N[xq{mkQVf[y3fx8> Unʝ><=1C96;PH[ <>@M)H^GՊ6`J~g_r@0mS{?%9_?qPKLt&sPKIG@"OSGI-OPT/src/javax/xml/validation/PKPKK>-OSGI-OPT/src/javax/xml/validation/Schema.javar0)xeg\Hk0$ X-H$={lډn9Εisz WiP%a|uya ~!etX#*f r'KR*t" %F2SV9zgTb N/cˆ:bA%^PKV`PKK>4OSGI-OPT/src/javax/xml/validation/SchemaFactory.javaŔr0)v8A5$=9QBO`4A؋Q*$W14ûwe!dڦ-vwx m.4O&jQG-!8B<} gi` c<8']4C&c`'E(wh$T[!a> `x޿ek0hA'i0 =:V >S$88Oˀ0sUEjdRGL2 $jZRFrj0vnrl ԨTH5? S'4F?,DmH3ZPz7WV#V7ڿZ2D,/A]v=:OSGI-OPT/src/javax/xml/validation/SchemaFactoryLoader.javamOs0jڜBZO3I39Ũ%U1L&=+pgBGzz{N"6G+띇.!mJg/SIa!, 娂NUdR~uR+g0Ѱ5#(sV6td7OSGI-OPT/src/javax/xml/validation/TypeInfoProvider.javaRr0=);d: tz#%!v2;)ia|Gڷo{" kz OR)Sa|9Mp tF2&@r#8*%D ~3T Ze0OSGI-OPT/src/javax/xml/validation/Validator.javaTKs0>׿bt\ t0I,/F\I +Ir#i!փpBw`J)X'GG>Na* Рcs)y!,Gs5j#T']A9juzbJ%Bi0XX9p5+jzNm˨QCAv!0ېSknUUJg]5?uuK44(&XA8Kd( ,HgV9֕VFMl4:TER8 c| (M4^&80ppVnK482B;DS8;)BCa֔L\L'iyV !Ss9)L!b&,ց.7ywtl,f23)ҺeBnKH?dz]A7Vsf=)zQ} xehm͉Rq*9GfKm5p1BLuHVʎ,?1חOeQ(mHFÄI=Xmh=r&w``^Jo=R5 .c^RstO9_iDJ ^&^;b2/:rU'|??B#XhNn4 : r^#ᵃ}x4r?bV PKNPKK>7OSGI-OPT/src/javax/xml/validation/ValidatorHandler.javaTMs0=_ :!%4L(ۋQ*$WmhޕqJOm9۷zo[*_i-t.!8 B??t}w 40A'GrS(d!YBw W>tݼjw/J`+Ba8L0%$j7*nu)CŖQAN6mDן^*Պ}`M& Gnn@c@㏂k8^IUb*XJ4;JseQ3[1&jvǴg46lcAaԆOAF#)I0G4tK,>̵drgf!H$cgSo"RN=E1ҟr L%O7lwGJS09L; mXOf{I!"N;?QwAxf VPKihPnPKIG@OSGI-OPT/src/javax/xml/ws/PKPKK>%OSGI-OPT/src/javax/xml/ws/Action.java}RQo0~^~)OP1Ìn0%aU5KlvwLj<8>ë`ވjWa}յ@]F@>ǐz--1x;QFЀ[#D2 %ᚍa cOW lrX$a5 Bmt'n}ӱx%qtAST^N[;? m2~R̔kwdd5Z 4P=pM $5oAA9UF8!XU4+a=1Fj@q aA)lI|CQdz )L4yB-D#|,:w@2+OSGI-OPT/src/javax/xml/ws/AsyncHandler.javaeQo0_qT,a}ZM([UA"tUMr۳w D<$=Nr smV6[q9!$gOS$eaE잪Ƀ,I9Щ,QgؙY'u<8Fhr,NG=C-[J2R;3oO}@Co`WЧg$}Dk$Y뒇lȋGN=<afmEm!KuR5S8]^X 6tM߄ȣ_ 860J d"+)[/xJW4_g.[g˜WߑwSG}`l1e|( %N4F*Np`ʝŸJ (b/aƽL90O|ũ;}[x>쵬=4܄Ɨ.k5EPKcPKK>&OSGI-OPT/src/javax/xml/ws/Binding.javaA0WzjW){EHٶU*5]V{tI2vV+;6H]8C{yv| ̵9Yb AҶ$U0M'"L&(lС=`)!@射Nh7u܊`4F`q 9drPQRPzy%w^\ãZ|< m븽h]J,_eaգj9#N SrǬA[Ey{KT=+K$-:*?c FIi>$Oi0yJ-<%Mme "ݦG!ɞk-GcCI!)B $g nM՝j}@#0h±:,MK{ҟ+lG#}y}+zwn)r`m%IaMP rjC9]]V8֢ax|?r68h*U/׃3vEPKZPKK>.OSGI-OPT/src/javax/xml/ws/BindingProvider.javaT]o0}^~U*sm*фmh-D@W)rBlMﻦTM)ʊė}}ι^{tڃSjD40HN pB2A@Ϗ'Ch#5Q1e`AE2EfT}ǿ?eăJ Hv>V"= |+LD&Jk#rBږUb% 7Ы,Ѩ#ZY罪^dAq*(Sb)w]-OҢ0+Edr,xLEY0dI2$3֛T3'pz"[kd׺*= "TC }-[Q?"pf6H^1]/3MDDtPKDث aZ!G}N^Ƹ]B{4QvELPi8 q QSJ%?bKOsi B:P=1;PK/_PKK>*OSGI-OPT/src/javax/xml/ws/BindingType.java}Qo0ǟǧ8Tt}[I :RYG lfTLjxwd;(^ 9lOLw g!J jTG,<"XQh,*0e9}|Cp] i˝/-b4l! t5FS. M;Y9y&u!сLؓVw*-NmEZŸWT~֒kz X{ ,MZLQ|ߙMJ.1nBpQ(f$IgQ&&^GY)A/Q^R(Ze+ ܶ'OSGI-OPT/src/javax/xml/ws/Dispatch.javamo0ƟT,оm6@hL$qpk=I@!ʶ<$we0`z,IUP=_ q؆eP:XC`C0y$a*Ђ"$FHt'C֑Vp7 ]N@iC p/x RL֒t.; 6o |}|ޛQ۶8ږut2gwLU= ?j<0kfD ڂ(-ׁICpz[a1伥uBȣplBA/ zpdi6 &4X'OSGI-OPT/src/javax/xml/ws/Endpoint.javaT[o0~'FWlF"i>M9`gC@UCڦ-$w9=tml!0 I%J 4;&0h,1fARCb4 +wZpJ`uVkAiE2AԁT "- +COpNRzVRt;~nvWNyzwZOgFE$ڭK3co[jC yaT+vNB}w4j+{C_ìT VPK5nPKK>0OSGI-OPT/src/javax/xml/ws/EndpointReference.java}Sn0}^'}[ehL$]G'oU]C1-{|9" jxXR x|9 XXU@:XCŒC *%4D ~^Я ;Z'+6~Ro0 {@!qk!pW 6V͡OCǡs i5Dz4jۖbm5G&"%ݮ;%9{T<'-"ռ[+P^[ 4pފ'H_(6=I: $Iey}Zŋ,\tId|M7C@d!E.X*Nyε[!: 9bG7PK1=JPKK>*OSGI-OPT/src/javax/xml/ws/FaultAction.java}Qo0ǟǧ8)Tt}[Ie Z2YG lfTLjx03x70]ؤ8u͙W@{׳ːX5,(4Љ=Bв^SdPi.\y0Kd @HFbp %ck eNzn9:lj!wцfLޘؓVw*-vmEZŸWn֒kz XbFZ׽↋jZg -(̋H lL,H!Jg1Hta!Qy!H ΢0MMhDzH%s*䶜.BB)Ot9/yNcB%e-kVM y 3_yك|ǡ:ޱ^/;)t Fyנ*"HPVw:5xɖu03*4韒Fk+ZCjunGxW-jv <9oV5vYs ΢);P`i90-gPK|}PKK>%OSGI-OPT/src/javax/xml/ws/Holder.javaeo0Ɵ_OT7(B ]aS"5\;Njι h<8~w\E´'+Ǹ(JJIkz6{7'qc+rd!ɚ :! #7dNIq0ѐMd: xtC:l"бCjfhs%q0k/X.A˷K!C}3qll%wb˷L=׊_2U-̪Dc!K&PVz)^X 6鼕οFn&4FisZf4-OSGI-OPT/src/javax/xml/ws/LogicalMessage.java}As0Wdgprks"Ҧ1N,X)H$=l:rOD\BAD^!݌mXyZ4[9x;QXA/+46%}ƓBIbszd<̮^=H堷HB-Zܕ 69]< <p 4S!p7Bs} )DQkdL[eւ_04q|e7)O=lBv7m*aEBH (6.a$Cݯ!^t,sVdd)>@>—$ )2;m)|[ VG$(i4Ah@j 6\QOoķ|v]{辠)0twTۯgر\ o|*^M:('fY;=q)BQם-7s_U{^rf!5WF?PKBiPKK>0OSGI-OPT/src/javax/xml/ws/ProtocolException.javaQo0ǯ8SR1HنV%SH Flf5jJ6@k.pa\LȾH$u-*2?L"WZ,ɒS1CdARVd඄Jd Wc/ #NCkb#k jBw`n3P< ;r m^ !`5H#m>im|=UMVN!vU֢6!9]wF:Vo\' yL)32oО=rP%lOIf dLtab~Ŝ>#?[: A<2އ ئ<"23 }d*FMUޓQ X-,=;AsA?^î:{4mSDQ 6h ]TiϚ5_Dw d<#G>i9^uxY^m •5>y ?PKgvPKK>'OSGI-OPT/src/javax/xml/ws/Provider.javaeQo0ɯ8S; BW bJQ1MoR6\AD'p6'+Ǵa]|HV U׋Ż9~mlBÆٞv1+;YrCvdԈ?ced 0KM8q#֐l txHJ̈6H?U G 0_6B7dXcm.[bS%`w'-;ޞ SUbˬ-Dck^J/U3ӵ [1 Pbi %&lU`rfeyiY~;qd<)C[DA $gؚj:ݓUApwA?o+ Js~ BD/ƃL90O|?%+|,?9zSrO4- OPK$JGPKK>-OSGI-OPT/src/javax/xml/ws/RequestWrapper.javaRn@=T) `:NzcgakvqlbD -۳͛73= .u78cXR Tvc<#mΓ|Inէ n,Ua2'dr>'|Ėqڵw28EȉHQm(5UwXzKFqGВic,4R4¡;՗/4 '[EFF>|o$Zɍ(;zw,d!!V;2c$ }<}ݰ׋8|}*[s\L YwkxG؋o&MJp R!5l PKD&PKK>-OSGI-OPT/src/javax/xml/ws/RespectBinding.javaSN0}^O-\@HRhEI꣓ܤ\۳w݆jcC{α=9hV'axvza 8baҀtCC %*B ~^ҧ_7Nhg0@-:$%BAצ YX @Vޛɤ:DnrLglTUJs`g+,9.v *yAZ%@[EZ:B5cph*EB{H_(6`gd$$x1Nx' )L$OsB<_—d~3Ȩn Hqv2# >HrKQ B7h9v-\VG@#ZxS &QD9Dov-Y.0d N6.[|+d&q;,_ϞGop G=ݿA6u -];V`XdtO-rZEu98*;EQk*ʶ/ @VJ(2mAJ$[s)pxZKbTVTXVzŋ9~PKJ:?PKK>4OSGI-OPT/src/javax/xml/ws/RespectBindingFeature.javaRAn0V+r4ҲQBUBTMPZ饮pf[a)Дy+ƟplBcdH.,Ɓ.]_ޮqVb^eXp\u\?| xjL|"2 ,Tȍ,ؚQ*'j;Z ,;~Ms~8ć[7&yZ(Jt!uIƆI=<+s^`чJd]W&9bpB/x@1x{a4QVO%nЍR3'OSGI-OPT/src/javax/xml/ws/Response.javaeo0Ɵ_qSRemkU)hA۳h3aj}Gr,=9r⋂mazX|? AU^I+thZ!3:x GU8tCyUG@ifoG^n3x=LI/X^կ h$}b k}\=Stރ_rqyaJY[уq |F&PNM<9Uv&k&4Lb"+1~]?l1l| Xo`omyui߲vȑq3`lZW$hP("g0zq6UdS]-xY CWTKej: {Q|zX4y/%@4\HSD_PK&TPKK>.OSGI-OPT/src/javax/xml/ws/ResponseWrapper.javaQo0ɯS;tMH k-EIǴ&58մu"Icgv\hxX$R T%vϐ-U1RUЩ, Ab03d NchMb;hqJ{1C8$]IƃPP z7:%8ہY~,õޜf}xpk.ӋEV,^aյX ]f{s^׽^f N׾GKS XwIh@4O82C;cClS8v 'j`*E-JnM56ޒUpa[FVxO ͢s@pxʸwgyơJO6[{VԒ򫽡j'/roۺkjs.ԧ*2ݚW)(ˇø^b)ѹ [O;a4:{F)u[:NO}PK̼k(PKK>&OSGI-OPT/src/javax/xml/ws/Service.javaVMs0=_P6̸@ZL(ɕd>&ޕ1 PN[Xv߾}ڵT/>t:3r0tP{ЎKDr%ʇ/+@Af1#Ҕ27DR.QT +Cveo[,y`g"aH } T`@*z& 8g9NRz7 o\ZL&猙6j2fXk b]x3i( xJׄO@g=1I5}7=L,3-8R H6`7 v]QŃ\y.N'huFڭz -z;u VHQg@4s!>sJ6E!RPjj@(R4#iZ"{D.zT-Ho芏MG أRHE 'ruiGLY# ?vP?*ܐ׬@( Lc&9܋-AECrn㎵'m\yg̼P,#<Ӈy0֋&H"mA*K|+v%y;1 sOZu$]fXh[Z^arB31ojEOgpǧݻ6*zO}ip~Uo؉*NT}4ϴdw7*#s2aB+bXc"st -M%ҙa']tBGZZ7}nOǻsCVlix/6d6th8Ug9^U]0no"v՛u-TS?S{7 `6j;RPKaL PKK>*OSGI-OPT/src/javax/xml/ws/ServiceMode.java}S0=7_1+jZTiSHۨ,$t$6ة{!X4$y~=j(~Y .Stn ~?bn"4A}Œ#Y j{@+ҧό;j#{6 `4s[Bm8\xN $Xa])]ϡӆ`ma2iN1S,yߵ%BSxER'%o@iFYT7ZX!1ۆkt40V}m_G#~ ۸Cؑ<6'?U1#W0 +>peTϕvLLbWrud*LE.RjM5/ uB-#Pqc5$0s48 mW_矎?3;K֘B0.t$,@;<Ə%Qڤ%M2%tm eі} nq<4JkU'Fx!3*Cx\뒝2y]Zd\yPKPKK>*OSGI-OPT/src/javax/xml/ws/WebEndpoint.java}Qo0ǟǧ8Td}ۢIe d l6!Qs´V[p߿ߝ+`)IfoaRNa}-gD\of@-CR4XDp[^0XA/*`b%}Ɲ|CmpaOq=tBZ y. yFs#CEQT̎Z. aq u oez<-\S "W%+kXt- 4:LōռH?Pۘ? |eI6s]lsEi$`r^%yYS=|I֫ QiW䮝)BB-/’׼DӳԂ*ƍՐaZqy鯺\?;;cp`0 ƅ0A rk{|OIb']LY=N_hII#z -.~ec婾p)5k"ޫ?K*YZyPK/PKK>'OSGI-OPT/src/javax/xml/ws/WebFault.javaRn@=dG.5V)q vblEb&mrf͛7oֻp9)^ Ld~c-RCs,Ph̡9*0{a}\ tg0ѐM$[ 4j$3l pAZ;3X%803*h(*Ati<:]J:cw.( ޒj-*hw'` ؎V )gU)n(ea:\wyf/4Sd7~&SK Ou ?( V1,V2LUD->r HQ<6N@2EHI(Yn0h4QD(AUsmתI`ni*^sL\8wK=֕smCvq[Г)S%U-~xxTX0A7Wb4ߠ{IK=ƹYkc4*S Ft[V7+W 21@}`5dz"jOPK;PKK>/OSGI-OPT/src/javax/xml/ws/WebServiceClient.javaS0=唬RH֍*-MhF9:0`SۄD Uwݖ0{ow,dsV<gX'9Uř׳ٛ)ĵ!H 1jTG]b$+ИC+rT`~2z +SJs)ڝFh2gB V#qp ac d :n}*!ц1DsYؕ V{pDIT6BAᏖ+r?kHUbHTHkFZ՝↋r Zc -MεQ|ߚ'H(6&`'&#x'a2$0ޤ؏0H`b-4\GT}?0ZN)2ꃧFY$8/SB^$3^e%B)9U͵&x 3|FP-7vd'TWnέ-]eNAOLhGVYHPa¤tw0OSGI-OPT/src/javax/xml/ws/WebServiceContext.java}SMo@=׿bSZMZNЪIXUk{,wuߙM]@v>޼f2h69b)W%j6}9g! itCŊB%*tB ~^ϐWNhWlP0R|J{pP ԭos ]xN B~ }l7oӾ?0f6ST|еV?:aIqnU *yo,R LbV?1#I?. ۸QA]%$<$:8Me,2X0_-@خwב r hkN+~"+ֹ&'UNBUFSo5Z /Ƃ6ܹ&dH%t[T1tgYܐ-L!w5id֞}Bp8ZK.Ȇ9EPK*>BPKK>2OSGI-OPT/src/javax/xml/ws/WebServiceException.javaQo0ǯ8SR1mK J$H Flf5ZM6@{kO\aa\L>Iu-*:M"WZd˂*q# _Xn^0Jɭ8{q%[YXP  oN]I8x nhx=Bv5Ӯ"GTEk|ozzP5Y C?Zi8q~h9֢6!9;#TUM)32o^9&Fq$C%YM6aMr,2RW˻dx/.x:6'`LrȈ.6Tȭ,8ZQ*} 82{iZ,M- -h<8ctQgoy(jp3aܶO::R"Orr&y 60OgU;să0 P;p/Z_a'PKR#PKK>0OSGI-OPT/src/javax/xml/ws/WebServiceFeature.javaeA0ͯx+нR`ۨ+[G'NmV![ٞyDw0j0GX$⺖Bdi ~~k_i&K@E ^Q,hUAnG?'+}8 h%N^Ck5E)ksjBMIU< { 9^<;/Qu](.ġ6UT_kmt'U0g'r1k-:hQ3=ugu)uFf{+#[-؄ N|${mz`r,R֘dz@|Əd982Cx)}[DJW$P.K5U"T@F#4dk XxZΗ q :4hڌSطZ0喲5 ZCx >4F;}25q6|]p5 9%hu뤋!U(EmispPKeBUPKK>3OSGI-OPT/src/javax/xml/ws/WebServicePermission.javaAs0Wd(8>mfp8(`bA%agЎ3I/-Io~oEt=jYm-ƅEY"k)TA_M&6Ni$CzOeV TIvK[Qg8 𝴑U8 Fȟ:ca'PEg=F:ZHٵZ/gpq$< .hy9Blm?FQ8Ykd6O{TM@ӯNjN!Z*DάhJQZZ^hr64V˼/ xlBagH,gNV_w+2NW1OSGI-OPT/src/javax/xml/ws/WebServiceProvider.javaS@=WtlE{ӔUITʕq Bw{ry׃w,d)^ LzY5f.1X[ИA#2T`~Rz +SJs)ڝFh2lbiH\CK,OSGI-OPT/src/javax/xml/ws/WebServiceRef.javaSn@=dG.NskJ6iQivblE8a޼yv8p /7W^Uq&2)ĵ!H jT[]b$+ИC+rT`6^2z )@pFCj4[lf{@8W˰1dni7b!SΨ83|ͺsYؕUX=[ ?zj \XC2֊u R!匴; ,LZkxښgH6&`#A<$7Am}E^~ p$:r HQ5N@2!F|&t/xFe%B)M k{斦5769ݱ-۹r;=wm..=0UoYI ?}uo˷qZ>L^! ^]Iڑ]9]/q.e;MRsTho0#/#,yDӮЁԴr,X[GUТb"L8<f,H]:W+fq~PKn=NPKK>-OSGI-OPT/src/javax/xml/ws/WebServiceRefs.java}Sn0}&_qէv*nBeQ@XUax=ߎ#-$hpLj܋4r!LtIqi`&I(ebgrA.69^ǀ6>.Bx!PgIVc. 5Y6D($Gm$pi*Q ]7/hOO늵6C0.t$lFI)HQ^5E;ubɊ^̸)DzYI#6(͖NZSp:kܦtO|s;tt7PK PKIG@"OSGI-OPT/src/javax/xml/ws/handler/PKPKK>.OSGI-OPT/src/javax/xml/ws/handler/Handler.javao0Ɵԧn*I !c#iNrI\Nj C">I."LnaZòHJIB <۰ VY!QajЂ F+3֑Vpa&cir~$8zAZx ޚm 93x5t 0j7#xo&0 8v<.ExԽXޓeaZT*ڂ,r@=X8AX 2 9o~1 P0IK |H˼|}_CZ:_\A,u,xuizȑ9768`L qnJ>!95T5CbG`nɅku I[JsoX@L_qG S]U:fSi45PKp#v?YDv#z?( PḲcYPKK>6OSGI-OPT/src/javax/xml/ws/handler/HandlerResolver.javamRn@=x)z"$j9(Nz8c{akvqg61R+y͛I"\anړu1.'X_%R%a|='q: h3C Yʒ:# V"S Ѹgh&7d: xtC:TRXR!5Joi͹q0[/.8S$}86Ne6_-"`w'-w=A[֪Dc!jK&RS8S^X 4;鼕ο0Fn9m@V9-bH~tNM(ZcoMioY~;e\ LL Hr-%NԄj-ٽta{?_W(D+q{.n@nnql%xwQ\Oћw^x6}|(>&?^LWag/PKq! PKK>5OSGI-OPT/src/javax/xml/ws/handler/LogicalHandler.java}Qю0|WԞJR z(8ݣlRCjiZ!uН@3U+̵9Y<DڶR0^OIH59bf$KYrTSY!5P Y'u<8FCi4 'a/NPڣsҡ-%PsOzp os Dm}X&i/X,"/XZrwҲ °RlYk+zh XAuoRVn;"s&Fi}Zd4۸w Z7鶜&ւW _?-f[~F/PKN38PKK><OSGI-OPT/src/javax/xml/ws/handler/LogicalMessageContext.javamAs0x 2Ԧ9R3I39 {mId  ܙ>=}& ڜlvrUY"m[)TIfIJ59bv&KYrTSY!5P;Y'm<8FCi4 'a/NPڣsҡ-%Pzw}@Co`Gs!{!Iř8ֶIڋ%lȋ[V=_a[fmEm!K\:PVz)}/,J:oWc֟ 860J d"+1|Y=liVkW}V9>!͟5 Ɣ!) B*e-KnM5h>U ٽtXV{?O+lD3q6]c]d-y^m14k.=IUU?͕ wwOPK5uv\PKK>5OSGI-OPT/src/javax/xml/ws/handler/MessageContext.javaV]s8}OI5iv Jخ4'FPk,$1;2nYƒA9~Ӂ70PVyvepm!q4W{@2`u@+W_PJx]¹3趯WbjX-Bm0,paeAeJ[KhxZZ 5h5mE7zDSz/v?,7Rݞ+ 44]KMO *R)i-1HrZZY{`̮FKcI~j$5>ws A:RӀqD0H(5| aBF0S;ILdFZj$BƥՐr)֞_P9b%6fYxk-@}թ)EgQԒ@ƒ~en^me݊}r=NahMbf:g-683?)Ͼ Y#?Yr9xb&KQqe_.i/T~EWa$tAGaMkdk0HU_Yfg(PK</PKIG@'OSGI-OPT/src/javax/xml/ws/handler/soap/PKPKK>7OSGI-OPT/src/javax/xml/ws/handler/soap/SOAPHandler.java}Q0WSSC7ww:jWº.4 ILBi{Ӣ<!~‹.`шf`Z VpY"L/WsahbD;QXA/+4v%=Ɲ9|Fcp0ɸ5]{Q#H堷H a-JRuz6;) < U8NrNVS!p7>];U1S ۳ֆwjdz-Z P\(1H{Ny׃NfVn=Q~yO46.aegxeq68ߤ9>OSGI-OPT/src/javax/xml/ws/handler/soap/SOAPMessageContext.java}Qs@ǟ˧S#M8Ch pB;;B2ݽLRu{p3n쭀ib:}_Lۆ) hPdLnE` ,Q]"-/1J Fhr,߂T:! TAM!Pv@] .[NrN-S!p;@ﮥ 1SlggD=D?:| %^k3u\)Z}Ҵ#~*q 0(UELMr0Mx3HR%uVo }_2ʃV SvJLDAɺ5B֨%U-0nKgӈ% <=5߰ͪaaK2hP3x{]N-YygIaSLR!eimwd hoM$_!Ddbz5S$I.dޅ_$$WA.>; K;JYѰ #fFk'Ok%J0Gq~PK+7PKIG@OSGI-OPT/src/javax/xml/ws/http/PKPKK>/OSGI-OPT/src/javax/xml/ws/http/HTTPBinding.javaen@)F7͡v5‘!r0i.]YL$[ڝʃ+X権ZcXwQ]9z:0~. =+8Q,j[9~6$\S㙓8vRYh (FC]3ud}Aőˠ6VpOy";@Kv]8P S 2Izz5yDT0k-:PDcV9N%YMvB)XM^ȣ'mB>̣4N'N9WO$ ea.ނwCqIR`E=HNs?lHW~c|o駰3E?y+PKcb/PKK>1OSGI-OPT/src/javax/xml/ws/http/HTTPException.javaeAs0WPpsk}0!('ޕMxFo% pnF[q92*4$o!q0V^i"KfOUA,UTEnKHZQg 񝌕Z6bj4yG(Ybi %RԻv@۞ ./^;r -6on>?[Oq}$đ6u\6~H,_g!I5d- GJfF6wN{H'U!oSI\wjhP%9|I7yNSdJ"]X0_fwi.3>}A[݅ סCk|)8/[DNt$R)7T݉P=%֯2`mNs迾|8x?kF~.OSGI-OPT/src/javax/xml/ws/soap/Addressing.java}SN0}^O-꜎i6DeZԄ!&ؙ46"_Gn6FTK|䫀HJU0auo3mP6ϧdTnDkVrm7*imWii3 Uuܠ)uFd{ڣF~ظA@ KؓM bx|E.!xv1ȨLܝ"$$z'6RdMU-*B4hjaZXx)jN A@9Dٺjޜg~R+j-K W\xzOTbʥYzw=}µ@G8ttL_ycM5be.`q(AvGC8'EI.Zq\ȍEOȾ%v4mFL8Sr8{(o2%Q*߾pidxDɥ%CPK--]JPKK>5OSGI-OPT/src/javax/xml/ws/soap/AddressingFeature.javaM0ͯqMح*E=QWA"ldn;Z;A*5Dy癏΃;jy0OrLf~8oX8[}rp&OrF?ٖ])FjUuJK& 8!lC8zSr64Jq2fѕu^3aPK?FPKK>(OSGI-OPT/src/javax/xml/ws/soap/MTOM.java}Sr0=)r(Lgj1neւ0TqIUs^3'd=*qi5RKD)>Fi=]}^fp%I4Y 8sZ]B4/b HQh+ ۹"O$Tj/j,D% *M-jF#"hVZXzFn.( '|6uY48{̧b\(XMnM\tV#oftEݲܽygr[. 9pܵ?CQ&{>ooɻ[V zܱҎ s:[\XpkGns*4 AʕjP.#(m+ j'1~PKv]fEPKK>/OSGI-OPT/src/javax/xml/ws/soap/MTOMFeature.javaAo@q$͡-ZM@¤Qk{0.5FASU*#{߼F\HA7,!3#t>}/ahl*YB5=74+ ^i:ة lR9,9j\BֺE[5}ZOO#9MoS!0B7sCu8TAkd4Kn@kϊJiYFՠ 9keZ6rgC;2RSI)$i>ic2{Xc/OSGI-OPT/src/javax/xml/ws/soap/SOAPBinding.javaSN@=7_1)A@=VX@bSĩg[{]lj{g&P 987y;u`Nu62[8%}DR+8c@=b+(vPY$ia.s\%X: ]ZEӲxh9 *(i5pp|u]{qikt4Fu[ur ~gk%JČm@div]` Ӥ:#g # ؄nAu$h$a|9>Nq"Lt2> p29 g@tpUlJss!X%[b"2TV !K4:M!-_%)䲐Nf믾Xt(LE,[W[jQujFQRj\=GDpPv{U[NT<ك')!zӇFk\DOp߷ۤrCJr.2t;~[UN^F?pTӻ.ط z^H3O)X^ 3lePK%PPKK>6OSGI-OPT/src/javax/xml/ws/soap/SOAPFaultException.javauAs0x 2Ԧ\BZO38I39 {1jJ2+7 }ەW)}4: G*g$ 'OcQ J%Y2{bLxIRFVd඄T?X$ A0C4XU;B*ƒ.t(I;pRtr.OZ;'hڼ{/IҶm:X:gM|Q?z>A 4G0JP6cNpe=U2Cn1 ؘ -|Ml=X1].*ȗ勛l Exlq3:t&t1yQ] lj*5Y7&jOF j=`lq\P("?۳C|؉ULO#ݬ(Q N=f8%ښ\3 \c$d#EPK:\PKIG@OSGI-OPT/src/javax/xml/ws/spi/PKPKK>+OSGI-OPT/src/javax/xml/ws/spi/Provider.javaTr0=*HZ̸n3@mSG؋QjK$d2$&=wW}+W=Fdn5a~३2Bht:-&sa\ ƌșP1js/U\6BI8`hz7FBa0H:܂,Η<SZN5,n+}]%KL餝jMa5V TE|JZS^ʩ.B&-0jfKX-}dZ#Y@q u/?G/Ö1L c0ppှN\Wp$ˈs: ٹ"$J13Qk2)xjIA:ƍՐ"eI_]?_kv4[ˋ)9 |JBrR:j!mUU1`SaN 2> G??eƗ۔l]V#g:h-=G8}JH[d1$hGJd2OSGI-OPT/src/javax/xml/ws/spi/ServiceDelegate.javaՖS1ǟ_:4}juAz-Zs=k8XSp滟f`:42:(m%Tr%{n6zhь1fERCb4 (f*ZAlS[^R0◠"iH "T`@*zh醳<'BCGS8= w5t.PN&gLcm4ZU*Ek\8|O ҜӞzb*7L,32=T+ت[pTE΂Ig^=ht;͠t;t 9|: YFyp_aJo|!D0s$)4BK@Ⱦu+UfdBwWQ>Hv?_]SR'~B$3X pKs}1f3cʞdwW߂t ꉍ*GRSQC+Sѯ%o:Rqr=AuD9hkfNLh%rCX(rGwxn)CS4dI?:ދ, 7mpMvKׄ׬;}޳(n{0ph85^.h !-+㣋BN{m6M-?&+;gϧF^,NY!z]*PK}  PKK>>OSGI-OPT/src/javax/xml/ws/spi/WebServiceFeatureAnnotation.java}Ms0*hnm֓dl l/FTI0mag}WpwFT+bB|<~5}=`~i!Af%#܊YB5/՝ ++s6uGGTk4!,,E!PkIk[tCS8Mq p׉?+Ѩm[2ը>m4%FkF8פ9iy ҙS^ukUKrS wboq%4Jreg $ ,0K`2,Ŵ0^M_ 2[m|$Sx;SDR$YXZU+JmH4~Sp |Aov]2Ep鷘ĸ ]=3dZvYdz,|w3п;E3ޱdN>>ǼRE`& 2KNw>k !x8o?ШxiOzBy9r٧ ?/PK-1PKIG@'OSGI-OPT/src/javax/xml/ws/wsaddressing/PKPKK>@OSGI-OPT/src/javax/xml/ws/wsaddressing/W3CEndpointReference.javaTao0<~ʼnOIAjҶXmU"AolU;kMCݻI'0Qzgxv0(0?qHLvאy - 1xk^XB#K4f\I80sOS lR9h,j\BjKk[wuzzt4=\/;wqܶm:ő2U,X_,$}֍h-pC/w4*ؒ ւ2*sʫn w\V#jZfӔ:×{4_cI<I#Or.>opdY2[Ltg\ V~-BHJ%Y_ZU*JmH4[VKKO#xsݫ'}BqМ{olöѶQkdey[rYFL/:k-2T` $"R+.]+4H G>`Eܞu &KoCp?U%9l.B0Z =̡,=/Q o= ]b7*ZM1sC ؾg10i^uƐ 3(6݇ l*CPKjcbPKK>GOSGI-OPT/src/javax/xml/ws/wsaddressing/W3CEndpointReferenceBuilder.javaTn0}&_qէt*nٞ`OY[ bJG1unSciZMw6!&TU+sN';+˵Xa(%hj6 ɥ-5BRsA]e:i4Jyؙ*m<4C:XI[Aү:KpYzNpNjZ~3m13{^iO_ԵVXHK/wkr%*ނKT&nRpf[n1y+#@q $4E ܤ$y-i9g$]Vo!nCMබ)CS񑅕jr%ˆ٠h+X,~+ r> ߲mXˋ"#n)_sBq{s66R9"]FqNrԮ{3 S ;q-3[?n]&F4K#Oo}}PKV&5QPKIG@OSGI-OPT/src/javax/xml/xpath/PKPKK>'OSGI-OPT/src/javax/xml/xpath/XPath.javaTMs0=׿bd\Crk9fLIYR#a:]g:L; #{ѽRm4iFGas&RUw}u40Fz-OQA!f.BR3>ܣ6\ zv:FdBa09prji%FqJƐS˨En!0[~ kn,ˀUn5h0[R]9\S 0ER6%9+Aj`FYT[.2ےit03nZ- ۘV@CD@ɧ8'0:Df7Ə9}@xpdrgv!Aܓ0[IFaG'L _s W`K4d:_cիxBWB6 UD:׳OCMy4t2X?qo :pzqeNέ>8 q4wD3QA$fоLgZݾk(A 9PcPK QuPKK>0OSGI-OPT/src/javax/xml/xpath/XPathConstants.javaMo@W|#lӔցHӜ5 x[؊;DREwfp,8EU$/6[a|q~f vb0DRA 3) 4"C z,>3(\06>5 P5eF!1Oն\oszQw=ZkF6Դʇt/l/m[uJNyU_xA&QR g%9^դ*ekZ* H9]խ䚋b u$Lƕ|'M;i$j0rc؏r'›n(rb#XO0{p;) }-M;1 yujLyS&EC)(\kU$03of X}g;LofVݬ}Lq44r֫>sJPtlh /pTp;MYem1\Hå"V5¦Ѥžv:+NVmGU| ,D˰K(ț ]߁qx <JcMxBŏA%3IjI hw(tΠ=Yf.3Ü5Ӭ vl>Z/PK[sPKK>0OSGI-OPT/src/javax/xml/xpath/XPathException.javaAs0WθDe4Q5 Ӊ3=~Kt Kݜ,+i>:,׵*'Lws,L Y2G*Bv&w2'e@ 2p!nDΟ12w2VjpO[t8Ai{H 8H\.9 nʹCu]8Ԧs*VozTݫ߭40U.vZ@8洧tRsXw0m iֽ_Fn2&&q$c%ܛ<$/-&N*z:M:'#&#:7wҏEdDd^ܚ*[QJ}$#4dZ,M- 7\ӗ/7)CpMд;$Z0ߏo|vг/(}-$g d[ [P=PKT"8PKK>1OSGI-OPT/src/javax/xml/xpath/XPathExpression.javaAs0Wt96 qJQv֎- Ia3a98v{O.kF[rYA@4az5_@73a;-Тᆑ%J -ByIc%hPa2&8Z~tICXD!TzÜQœè ǩM_i#p7Bsm}@̔kzD= Z t\U bmx R)OᄬCr=7e6:#= #Y?mظICO]'yEn jdC,II{7! EFspw@y:OSGI-OPT/src/javax/xml/xpath/XPathExpressionException.javaAs0Wd\psk}2q(bJؓ&F۷[_nFVø?K$M#*~F~KX%2bor# RJt$WVN&NJpM1p4 g;lJ;tCZldC}AT(zcœ~k'X.\S;~#q$椵Mz5[nUCNN>@LU566!>sSF: ޸^6u^ 홑 xlBaH>&yO]].Y.ls,Zd*]d$4xd܇ Sqn9 >!ٖ GSU'*Bwd'BKf+VˀiV:[ 9F?Np,h5E#7ޛ`n~ D{GGC!x3i"+yh'4`;6>j{!T4 xM?OPK}PKK>.OSGI-OPT/src/javax/xml/xpath/XPathFactory.javar0)v8A[iIҜaH$cL޽+0@:V~kekz2(, 4&nr&byst46RC g)X!QhA.f,܌SRӁ WKfJldK! Ik1fX. fQT, Urj3ڐhTgaL.a%#UN={(>uZ5(sEO72ٔXSVTf.7\$-rn ̸6Os̴'F*}?lcn~T 7_1ܺaƾAB/h4wtQHQ\gV@ڹ=E!Ig94,AH C&IfʩuDZ|iي2u3n-˧d$)bq-h,j直9,mťc \#7pIp'ANC>C:r΅CmEu.13w2U\yn2r/=6gR]I=FvwNLLz A3@fr,+:M[Bz,O9OrUW.zu0'K94ʳL*"?Au@` ]ZJ 4? QބhlgP2{h낣<8+gЫ]޶ss8ג)SDvq}}XPKi:PKK>DOSGI-OPT/src/javax/xml/xpath/XPathFactoryConfigurationException.javaAs0W);94SJd$9N1{+.0Ȳr!;Pa|9a䗱JY2FLYEd*B҈X.)^0F#N^Ckb'k jB` Co` vOn0s͛8.H2ZߤE/^ԭZJÉ7']b^kA9]wF: ޹N򘭴M5GTm $G6|!wvdJuȱ\a̮uxv$LJ4e\ ئ<"rgvl6Tȝ,8*[QJ} 82{iZ6Z_#/}q::6Ui7H`?ڵ(6V;Y/G̱gE>ks9Ai/OSGI-OPT/src/javax/xml/xpath/XPathFunction.javaer0)vrJ:AN&MCfZY;*$$9NY9flK﷿Dp+mV6{S1$!m[JLowsYa2lȑ=.f )G;Ԏ,=AjPgY'xӐ0C2Hu<:G!Բ% A*`F^gT $Ɓ8ֶIKK:/ozzT-9~v0Y[A[ǼԽ^fN׾GKAf'iy l*%d>eV΃S\U<±:VG?l7WhD#O'~LW'[#)W&ā$.mC98]̸սQ|%,QPKGPKK>8OSGI-OPT/src/javax/xml/xpath/XPathFunctionException.javaAs0W);94SJd$9NUb8Hz{+W0Ȳr!P9ax=oocKdvTDL;TU4"O22Vjh A8n(ZbȚ@m[뤫}zwǞN\pAë͹O\.qM'l^^d- hDîrf DiϜ;#TVo\' yL!3rݺ<60H2,F>.WxHdJgKLt.漺E2ħt~3ȸMyEdD6d6ˍ9*[QJ#82[iZ6XxL- w#o};:7Ui;e(x ^ܿtQX;a!r`Uں'xƿUo xPKPKK>7OSGI-OPT/src/javax/xml/xpath/XPathFunctionResolver.javaeRr0=xS1vdMOQqm'K(goYpQ,Wê*b-Dcs^ս^&ӵ@[i/M(y9‡87OSGI-OPT/src/javax/xml/xpath/XPathVariableResolver.javaeMs0Wdg\psks2@ q (IޕMɄ gUt>Ѵ⫀ʊ`~Z}X?.B ϴ%] ^FT$-`;2ZXcş);2V( >a6f+/qTx XCXEG@!RFSIœ㤡J|@~&:?E8!Ce;&Yob󞩧S#kA<jdGP11.OSGI-OPT/src/org/ietf/jgss/ChannelBinding.java}Rr0=_d\CLa/F\Ia2{Vඡ-Ao߾}U+u78t',P; ޅ}/Xxł,3xV9 !Dƿ6++06<^؊=v-1X˒@UR!۪H9iYܷz'T|ZBV8W}QqM/OXۿIY:}˪۬[U0;^!*Vk-Em CsګntR!^F4UL[ `ۄB'N\i.Y~.q/lLSgdg|xv/l2CL<"R3 k}d+Zfܚ*jQ ##Tdg,04J'ꟾ|~?<;Ir衰vTmDV V7*7m<};)rQKv B\ D}aO8/ f~Zi>͐ro'&6NtnxA PK%PKK>*OSGI-OPT/src/org/ietf/jgss/GSSContext.javaVoF~.(OD ѻQ|\0itj1cWqܪ{g!Niy{goo/Bxa8MD>:@ߝ:v&S5B C8LQY ) 駲tTKN2^YBfdi H\C15rVrne 2F6:30&a%cG}uwQ}M]"AAW͈kr XlFZֹ↋ZF&g -̜k,356)] 8qx~б wM}/];?A$8x*Vu!@Q䚒N1)5g,F EږUIfʥGy@VtG9bZi6#I1*bTAЗvoW9%m޵{;>л;I]#8?|wwu%Xh.VE(dKX12LtvJ+z=M*QYa1,u }:? ̅z)ۍPHe#eԣ1WHQPN1VJ.z@i G éK9N +)y/kpx_R:r?+6^U3 LȋB֍J UL73'+>4a͓ր,ҤE%*r,̔N7w vrP6ټZo.kp_dl$ڣLY/yY|˙aqMM]T1#TJ>} H/:V_PKݳPKK>-OSGI-OPT/src/org/ietf/jgss/GSSCredential.javaT]o@|ƿb G# D<)┪Bk3w⿳縥QK)Pw3>w,8W[ɳf܂0:9gEw6maj P1ILxVE)YLz Q*. ]h@jFb+Vd[(B R#U^@,emmS'p^kfgD() koul66Bf|UzA='5Q)u%u<+U5gX&07k^dmP"&$\i+ڵGj6bc4oȏF̟ OgpLN0)a0g~ HQ*lrn!YHΒ*1)"[ !ku%%Wf &F&Ke u,rb(iNLU#%Qf|E.E,'D%[3ۘ\XzVS^V 8}]@k;{3#x8eyhA*!.v[f}<$ͽmJ-`K5vE]  -w(p[Z QBHo2IK],OSGI-OPT/src/org/ietf/jgss/GSSException.javaU]s@}OڱMD/Ί+n@w]h>{|_KҍBA-s08`PZIзaL2b3Ȁ,lYG&d@XAʚ윙}i͹9zMxa^,<ۙN 3Mۦ'-!^cF y;8)i芊V 1 (i*xbⱄ;htԐ'SՅg+c{yȋ(:yq\]} 꽝^yTPK. xPKK>*OSGI-OPT/src/org/ietf/jgss/GSSManager.javaMs0d2!z@f2Fr%we;SջϾ+t؃Wsn܆Qt!2DtǶoal#5QZbⓂ91 "Af,fƃ4.6L=+, 4Ph$ a317r7h%7*ObIѐS(тf̍?u:eY"J;Y;'a0Yu&2.+`9QlJ+A*`B3R.R)2 FiaLemL@+ Z9ȳ"lx ' a8 GC;`x_HQʕ0"Dk3Y#c>1&҂\T\۶jLL0S meu|ei='/d#)bq8Npλ&~m5 $G`"q/ْzo`T[GT~4MjcRפ?RRl)=^ MpUPM>d |֋9c>)teϭZt_GnmJEz`ltx}кiGא>G1<7b{pv+2o m߃f,E 3[L)QdYn^*ʤq\X_p$Ue_UjV)׸v8PK:#r PKK>'OSGI-OPT/src/org/ietf/jgss/GSSName.javaTMo@=_1)zILkTEglqv:n@wfW4 7oxxҁjEs~Y .3hft1$@!8K4Z.Q]!Zp%A9t[S 5߂Tj! D + BBUKvӢ8&pb)#pے]+kwa41. /q5nfDc@Zhx^/kPxlV9֍VbFRŢs:l\Bg.|Y:L/Y ~Q q4 0# | $I:i苘Ԛ`2gArEs?`> '/$aF%RIR1ԆQگUc!m5 /*&vw7sŋ[߬vk7Jb,2TY'"ќÊX-)Auvj|OLtPK7xcPKK>+OSGI-OPT/src/org/ietf/jgss/MessageProp.javaAS0)a\'rrROKLPb" I08 mYӧ 8Qzex5wfb!89Bh4: ~?" 0AfED;QZ,psX^N?X$E#{A Jհ`+Am< |Q;r-Z|}NIP3HΨASUv\ ~Oa4[GTCl%J  Ѝg+`r6#VPXeԍ*J0ަ>Nh[FzW@1 8$8KЛ\'ӯ$O dc@#OSGI-OPT/src/org/ietf/jgss/Oid.javaQo0ǯ8Td}ĒC@ jڃsl6Qs¶F}{ۍC^pHLVta86|Z4;#"x-PZ5pD>\Ip4Yl. W0ϳENV_ [-&2ʃO Hv" :+YoxEɶc-Bvh$U͖[[- #;N[ > t5ck,]ImJ0y ݰGXUJݹd[13Sz{nby?t8k("/ͤrϷ/\K?X2K4t3&,svh-4c<PK aPKIG@OSGI-OPT/src/org/omg/PKPKIG@OSGI-OPT/src/org/omg/CORBA/PKPKK>2OSGI-OPT/src/org/omg/CORBA/ACTIVITY_COMPLETED.javaŒAo@q2k 6'ǡU#$ʩZlkE} )j9;;y8C\7{-ˍ_ f%B|<a>c 2w dA ZFׯ%mdp;_ /žn{ڢ5`-+=XH6=Z'0wq$=,s!ѨPZ5YO-SnTE@ӏVjNC4LU%VC!JMfkGii*zm;٬Z.[{R/F\ A!$ ]JorEE4ϓit8_%y=>'ĕzhKy1OSGI-OPT/src/org/omg/CORBA/ACTIVITY_REQUIRED.javaŒo0_)TY޶R`[ Z4;RTgȤJ!(~ك`du>GP!Gȼ"#KfOɍ,HYZQk2p[BRd ^[t8@i{HPP  ;VqNIpy,s!렏smXcmAuM:[v-UEЏFN:@LUV6!^sSF:Vo\+ yUJџ 6KryI7K,Kftcas%*`dHolef ;Rk{7nz(=o:axm= }8Uهj*0Bx>ay5_ ̒a/ ۽E D Ia)~PKqqP#PKK>&OSGI-OPT/src/org/omg/CORBA/ARG_IN.javaen0DW |WrrkM 9 r*hy%IAK[T gWXis{L^":)TM,sicAP#{]A֤ЫY=!5XY'M4&ci2[q'(;bȎ@/5P>K 衷^\ûo$0Lk&E뒇lΫGo=߽<a[fm!ZK\:PVz9n ,tm߅G+؄$UܦUV̓SVF*G/^F/PK>HmWPKK>)OSGI-OPT/src/org/omg/CORBA/ARG_INOUT.javaen0DW |WrSk8n*4iSA+L$e]*:P w8v\EJcZPTwiIjz0fq8F%9GLeMڑR#j9~uR+\ L`2&e8q#\ >m~3<z_0k^ !}ޛI2 C,ım].VZgփ9XKoOjeN 5`RIMhyM(L Y5MZe<ll1e򊨈 4 ղ5^V*Aw?7WhD+qұ>(oed-ȉy7N˻Y|ލF*g) _qPK=PKK>'OSGI-OPT/src/org/omg/CORBA/ARG_OUT.javaen0DW |Wr}kM 9 r*hy%IEK[T g7Xks=xL^":)TM.sqcAP#{}A֤ѫ=Y!5X;Y'2^`4Y83thdGTьhK%y;/X.]ZGw|Jabq!muC=SUGү^Zxw0LUvb%y+TN7~^:ooBȣplBaVȪ n*)~-xJ2ͷ٦BQb]w6+r}A?[Ac)CWDEW$gy4%DVD0d҅gu 6#OSGI-OPT/src/org/omg/CORBA/Any.javaWr8=_ѕI&3\.)L)%hH^YaےLj8^?kaxӃdxaaǜkN"ScjG (R 5(a}+*RpU,]]Y4a;RI8x +#K. H-z)Xl&K( Ѫ kupe\ƞT0αi2~PEgc WxPV[R1@*`BZf)ʕΘBKT+4V}$ 1W#&܏?$_'?fu4ɣ9gӇb2aH%}%QVm9SJ) |&""HnQ R O`hibi7un4["'77Gw,$Q#syN1^"u&OBswEB9Urшh_+d]3SϩSv}%)1YSw_2u{>;$|f;l<{CRnQgKq%y9jP%@8FyuN^hͥ,bv|(fԡb܈ L@;hDT͇UӶaznrd+ab}Fpq@RD PC";}'ͻkjFWH"M9i϶Yk NJ4zxm6sIryQu9a1b4阪$ݴ+?[x'=Sߺ?{;a2tAX"tÜ <]󽓛kn];.au]qxnguudb]bEͥjz5{z2yw_o-pM_'n-giEkPK-PKK>)OSGI-OPT/src/org/omg/CORBA/AnyHolder.javaun@)F>ّ nnOq$4)Znw;ij6`f*+X(^ d7a|=}?OBV^iaː=/PZ,%p;XCd ?X$\3{h&soѩjցT-l@.PZv}œ6QX sNmCT8hmt,iHCփh-pCo:` !VZPXebNype5eMɭ3|Ӹa֏46&a#$zd}=1^t,sVdd)B>$Ȩh; Ly"'[u@ &Uڣh45~Ko#xs 9F4PUV7<͆H;L@!1ƲS»xTQ:{je};|Nd{& +' op&p/D \]wDxv֣t !GyKƝPK0:PKK>,OSGI-OPT/src/org/omg/CORBA/AnySeqHelper.javaQo0_qT,оm}JiFDjڃI.[]!E}4J9vFG0fkedWP2ߟqX,t:ȑPB)G%U_# *C|'V8臆^W NV7X-htXʚ@PZW9J m^p O!|7Gmc'Fc]i~񑩻]ת&`鮑/ `Z5uko SJ\4 li&zI4,|Dnev=M2%yz#aMyM -!#9tolp2xȉ*RlMUސUZp S˵^ FQ9BtU,OSGI-OPT/src/org/omg/CORBA/AnySeqHolder.javauQo0ǟǧ8)2剦݊VU4U\5c EU΄mɖ~wGt,  Xd0>L' KDfeH(- -BYA!2oh,W.`4FT5@*E6\ KPZh-w۾IqPkH(Ais(:?EQ۶!CeH6K7i~󞨇{)Z0pC;` &VZPXebNype56eMɭ3|ݸf46&a#$zduݯ!^.t-a*R:}8}Iz=Q|w@܏sE6jd5| jMV *C##hjnZ-F;O EA@shҡp-y5v.B0bebP+duw%?`D?2 2rvD, i"u : U"<9z H}]YNU~ _PK 1 PKK>+OSGI-OPT/src/org/omg/CORBA/BAD_CONTEXT.javaŒK0WuBAWRarԐvF߹nB,d~ؽ7hds.[,P9!~Սo,}Œ,mbV"2'eiZmI%r;>R+ >B_i:ݑ8{q%֐[Y1A*z_htӜVœk'\pCūe!kOιu4M,Nı6EBTL56!sS7F:Vo]# yuB/ 86I2Y$Kȋܧw2Y|ŜWo>O#Gs2cJ]!lV˭ٚ*jQ } *2{iZxR'_~P/8/^'8U̕(Y>ۑ8;ZGhu.z.[3o~{3q Ue~Z{yٌ-\"A/O|qt64A PK;PKK>-OSGI-OPT/src/org/omg/CORBA/BAD_INV_ORDER.javaŒOo@S<#ڜH$)Z1/tw1|T[j9}7owt9hYn-b4(U x) 22\˂5Z& %D(%md0 `o P؉Tmbi j,BQv{ӻ8 .hxy-=Zۼ ő8u9NZ3g$_eFUd 4}kW bJt5Dl;-TeSol'494VUkBȣplBa<gr/?7KEY%x#0KyӄW%'đqzl1tȉ6 4Tȍ,x4U$АI0Tr'_?sWqc^#^hMԏG<@O}g{PKOY PKK>-OSGI-OPT/src/org/omg/CORBA/BAD_OPERATION.javaŒAo@W)OSGI-OPT/src/org/omg/CORBA/BAD_PARAM.javaŒO0SR+\C^z8;q%Y辠A*zWwhtcœ+'X.ug\r0h6GXrPvpNf|U0'^ j*ĊY+B9[#Te7ZZgqg}cџ 86Kry$Oțܦ7%n,KtcaOeަiȸOy:EDg}B5r# M( ޓQ<j2;iZ\{J맹|ApΟ']O8u̕PT$K1#5q~v!xֹ| lìaIEsW}" #ț*OSGI-OPT/src/org/omg/CORBA/BAD_POLICY.javaeO0S<唬RHF=?mQWPA*Cb6a߽J*{Zw#ô!+>Km+~? o"'KLȃHY:W2pGB܉?ced S0KK\t@ikHZzs >u# :gT$؏t_Tlp#9:}aBq%ikdM[o=_4츼@tLUY[1@לԃNfk7C^ 3ݫ1 PbU\$܋<%/Oq.rt,'_t3qd<;0q޶BoHJֲbkEChbGȜk x2/OSGI-OPT/src/org/omg/CORBA/BAD_POLICY_TYPE.javaeO0S<唬RHskȟ+XAVUbSۄ~*l?͛.VYYU"n)TIgSqc^i%sC^,Щ#!nEɿfd pd-.I\Cg=E%:HRx3xw^ !}εP\Cm꨹imt6iyëGՐ0;_ Z*ŞYC9{#TVWAZgsoBȭplBaHqSole[*˗"h=ȉ92/C#=ow J*B%Qh:g PKp?ȩPKK>0OSGI-OPT/src/org/omg/CORBA/BAD_POLICY_VALUE.javaeO0ͧx+E=?m"+N+&jS!VC*987owbdut#d7Pax?|OckdtdA:;Fox cV'z[J;CZ&sAT(::'{'X.Aû\9 ŕ8ԦFdL{_mUMVxh{fEm *C|紧tRUcX]N6iֽ #Z A#ycm7x8$,]$$KyqÏ$]AסS8oSDN7$P!KYpkjEEА9IjmjyN}BQpο'Sγ,M91G'OSGI-OPT/src/org/omg/CORBA/BAD_QOS.javaŒO0S)"'@3[YhlDI(PK2Tr/p_/A9Fte<͖d͚c3WBQ f$/uZΣ #lÜaUD쇈sV}" #S[,OSGI-OPT/src/org/omg/CORBA/BAD_TYPECODE.javaŒO0S'}N\pAͫs!Oι`жm,Nı6:k&%SwU"kak# O>BLU5V6!sSF:Vo]+ yu.Bȣ?plBH&I7KW2Yyli4[ =ާYȸ=Oy>ED[}F5r+ M( >Q<j2{iZxJ맹|Ap_'}O$u̕PT'| HmeYtGz ^tFϋ>0q~q#Ve_89س?~F*0{#/#Ow.џtQPK농sPKK>-OSGI-OPT/src/org/omg/CORBA/BooleanHolder.javauMo0 rJzrrl5V؀Pl&K$ Q&?D×띃q9!3Y"gOSI!rhXExbЀ!Ě"Sr%:'h2B "ip [.DK(UݱϠIqP(Qi"07@sKu]#qL>FwrD=TKւ_-74LU6*X R)O`u̠uoZwfF4lcFqI1E\$ԋ<$~ q:Yқdd)}}8}Iz3$˨>k' LVHVcɷdݲV{4&֯`eocx\QO/DNe/y H;L@)1.^bP+a 渉 E`D3^.Ľ0OSGI-OPT/src/org/omg/CORBA/BooleanSeqHelper.javaQo0ǯ8 *h߶>[UD"tU5I.[]!E}אM[8;N0fkeCgPap6Qxyt#2b r# RJ4$ "FUFJIpM0 n[(8b 鰔5 2Rkӡүs:@NC^p WVޛq۶GV7j]gn׭9Xzhe0U!rfE m!*K\:PVz^VX 2tʼGfd86Џ3$Yqd r,<- tv,tƫOg.G Уc!,*RlMUސUZp S˵+ z IGz]Et~Ls9GQ Ƽк&2z|Y ])ھ}g{(V[lݖ|cTSؽT!6" 9D  wm,3F^}nÒ(_(m}QL㙎[CS]]?o5n8F6nw/PKjz';PKK>0OSGI-OPT/src/org/omg/CORBA/BooleanSeqHolder.javauQo0ǟǧ8)2剤يV)i \5c ~ n0w" +7:#Hob!8r243|Z4;,CR"7@iFhmb z1@cpN`}h0zjf{Ac4 Tv%=ZݶU< *wh:m/QԶm:P*\$2[|$V  >6P&*X R)O`Ƶ̠)u;Fj8$ l8KK*^E *Y'N_!^dy5>i; Ly"d'u@ &Uڡh45~K/#xsݧFQМ{!t*Y< ti (#ƙRZ /扱Fiuq~a [s:?o< +ɻ%<9&OSGI-OPT/src/org/omg/CORBA/Bounds.javaeQo0_qT,a}(ۢU>p ނ){ T<IJ}wDBc\OPT$ҶBՄli aet(ɑ=6f kRԖ,Q0L񓬓Z6a Fhr$NAG5NzxHZ̀K?3< z n0<۽/{o$I86I{uCX#S]kՒsoNjaV{^J/U3; KAf+r2PjyZe4*OSGI-OPT/src/org/omg/CORBA/ByteHolder.javauMo@q[Xl&r{0ŵ@wyǓ.`f`X /pHLVuc(B-1)^X5p[D}d X$\SAfAb4OSGI-OPT/src/org/omg/CORBA/CODESET_INCOMPATIBLE.java͒Ao@Wrr*㤽ANk(NzBYpfw7yTq@;;ٝy8Cܴ{-_o%Bb:=W}) dHh3%)C+tjEvCZQ߰i#p Fh6ֶ'Cq ]ML8Ɋ%SnTM@ӷNjNCLU%֢G!*MfGkifm{٬Z.;{RFT QT -Fmx,pQHq]4 *qe<[0tuO º9"J%GSU'*BH+NVwWΦ[i=|%4<3f[q>f^-F>s%j`8Jd9h^^'Za7᮸{ g⏁\P]]O/8dg x~T;yC':l?8 yPK'%PKK>,OSGI-OPT/src/org/omg/CORBA/COMM_FAILURE.javaŒAo@W2OSGI-OPT/src/org/omg/CORBA/CTX_RESTRICT_SCOPE.javaeQo0ǯ8SReVlC`OC.mJi} Z#"lz,w&̯V%x}1 (Ȓy]V֤,0=!EͿfd W s/MW[8Bi{HFvzw >(gr$x< .y׼B ?D88ڴQw6M6YyS՝Z5Ho=Sbˬ DkԣNv 7 Cf'3r;Wc_ 860K qKorV_ qQYnJ#ٞjȚGS ZB(=Y-M' w:o.( 7C}h$/u[sdoT?MYiR=ImIH%:XT' |_PK~PKK>*OSGI-OPT/src/org/omg/CORBA/CharHolder.javauMo@W|#ZI$paW]vgn|̼;DgAf`Z /pLVuc(|-!)x^XC'k4f=~\I80 14-^uв=H堳H† |P;*n;U< ܏j3*9NF:EQ!CeHrmt&WYyǪ[)Z0&^iؚXA`A9{ڸ25uNLH'mL$.!-'pi9"w:]]\qJJ H2]yF_!g]2ꃏ {;[aHVc7dӱQ;4&֯`eocn8o.( "C6a2ݚlK&-3Jxϊ-JgOBއ3a OQ"1Mu:'x"cYSTO?HMhטۀcuFX ?jwAPKPKK>-OSGI-OPT/src/org/omg/CORBA/CharSeqHelper.javaAO@x)AL*8=quvuLߙ "`{wg|oE8Dʣ_ _%Bx|<? ⰍYt#2f r% RJ4$ "$FNNIp78 [`-Pڣqa)kd|qqL㙋v[C]彶'Moe?D]=PKt149PKK>-OSGI-OPT/src/org/omg/CORBA/CharSeqHolder.javauMo0 rJzrrn5V@(Pl&K$ Q%?D×.D@^| ,Ɨه)$ǰhl I ZYA5+1D Je8O d%v@*E\ KPFhwϠIqP+(Qq"07@9) YO*SGbk4ɊD=TKւxd+be)攧 w\Sj:fT:W;17#~@1 U\ԋ<~ bg|I]43#|M) YF}E?aro~P j,4[V#jFD4Z wGEA@>Bt:LU<t"i (#dLϷJx% JgOKC3Ț~A$?`Dxg3+oxOԳ!JnhӘ [dеFl 5[oA PKPPKK>0OSGI-OPT/src/org/omg/CORBA/CompletionStatus.javaTo0>) mv RB*ʁ6MhT3ZTZ-"}?.[tq_ax5\F]EjXF%K) 4"Cf,~g ?Pi.\Zb/4h$!%>XRYսmӳX'903*-?35ymۺsJUxE8 $xO[Q֠W%*eZV(=#VqE1-s2&(iIӞ=Rc  $LƖ.\}oWp/~ %h8GkF1 tV6䶝SB.t)yJDѰ;TA&)y 3Y.+9%N*YNlt悕<쁣eKѝcP}ZR{n8_pG ug "X}L_'MYNuU(o yUW7 oLߖ2W'15QDQ,R68<MwٍO]@6I 4N;׉W4Yf#Ü5^q~PKFsrPKK>6OSGI-OPT/src/org/omg/CORBA/CompletionStatusHelper.javaAs0jHn-'t <U.@#K,Q;lKK [7eU[-K>(J4y8Nؒ(4pTs7?6Z MuNJKDY㏑cPK掵<PKK>'OSGI-OPT/src/org/omg/CORBA/Context.javaQO0_qԧuiS(lR) ܦR; wDECD8[ʕG_0($UxeaP0#GvCE AJIҎ 4 "$V!8臂^i[h8b T$JCuݡʯvt*wYxj-_BzwFmbG[}],]׵9X(ˎ[X0k%Z QZ5oukW™o S(Z4 gFc$Gpi> "zd6Kyzc:d]t;bxzmp*Ĺȉfjj$[e#JBi6d5;BMv\ S s8جx2'gQ,8FCV1'F{zx>uLG1@AqFT rd7W|PWhġ7S~q͇Sl9F1?CDowljvzPK)4PKK>+OSGI-OPT/src/org/omg/CORBA/ContextList.javaAs0x 2ڜ `LJ2we rH'On`듑aNIDe)< 66bĆRf,hTNnOj񧯌񓌕Z6b}i0'ݠ'(Xb i%R!UݣszO^CNpWFCw޹dҶm(:PbR{ddU0'22k)ZhQӞ5IUaεɥuF{?F~ A NEIc~1l6^$Xo0_m^+~ī1#sX1|H ֔ɝؚ*Q } j2Z-^tu[WA {!N:UכYtM1Bl\dY)s[rx>MA"χA?L8R>3jB*>U75ߩ^HGtzl־uX.ut*5^/PK.*PKK>'OSGI-OPT/src/org/omg/CORBA/Current.javaeAo@OvD͉ͭ`E@Q x[B=6oyp6'+YAQ} AXޮCU䏡J%:FMvA尅Qh J?:FkXzb.-VwG8(M0:d頓4hF͌6I:.f]` B4C4ELiE]nj[j@QZ>0LՈY1 z\#'+I>;EoJGV#]G+؄ERAV->*&[Ǥ,|m+(JH|"/O=7! G}X?cJeP!^!t 6 Q~Fx"0h:l 7s8H(-.0c1rbt11jݵ>C\Ezj%(춊$O7^PKJPKK>-OSGI-OPT/src/org/omg/CORBA/CurrentHelper.javaQO0_qԧuim)6FjNrg; deCm|α39p6;+ǰ!˿J$M#* Óx 42aA얪ȕ,I9Ъ,QO_;Y'I<04 `t$vF젴G5J6/xHRoLIU n{ ]x7~Z=o=|LŞ8ֶ4Onr.Gw]A*E-Dmk^J/U=+ KA[Y ߌly&I4,|DnevMX$ez#[`e -1#9tolp2tȉV *JlMխ ޒUFp ȍMs8Xox-ΒȴQqQz`Yk-)I OCo;XG)P^xXM[aAɒoj/UV!8d5|{Vˊo7M˵㽿SZݽwTw%QP5pTs$65c34@0{Ee?Dz;(PKMEPKK>-OSGI-OPT/src/org/omg/CORBA/CurrentHolder.javauMo@W|#>mP#iS1^uwnk2 `f`\M /pHLVqP-=19{^X5p;DCd X$\sh&`qPZvx-l@ .R:v}%6QT sNͺYO+QkgrD=d=Hւxsbbe5)T w\6Sj:f0:7ޝ #~*1 MR4C=4Ȩh: Ly"g[uD+&FH4۰VKu厹?}B(9F4XM̋di1%P FKo JwDp ٞZ kMFs` {&<.~*' op!xJ+^3 \_4.UG4輑 c¹wE?PK~PKK>1OSGI-OPT/src/org/omg/CORBA/CurrentOperations.javaeQo0GyJ m}iU A\U=۔F&F>;U+l9Y= EM"{)TMX^o6*(CCI+51+Yr`T Y#!5\Y'Y'u24,bu$Nz NPctҡ=j2Rփ&9J ^p wF?CkL3qm^1|Q,eLJaZ,q@=Ypd鼕#[ EZ!MZlx)-4g Emeyw4Ə,[82Co)CWDE$gٚF:JV#tY6AŸ%Q9!N:Co6x91OZR1OPK\PKK>-OSGI-OPT/src/org/omg/CORBA/CustomMarshal.javauMo@W|#ڜ)H4q ^vabU+*μ;$7Z^@Q}@YoWKE JdĬDDMR^6dR5% cp`flq$NÀ'ʁB+zzI;j5 mp3x4!#h׉n>?$13qL\/OSGI-OPT/src/org/omg/CORBA/DATA_CONVERSION.javaŒAo@xd"@n-'hk5&r3mͮAQ{fBV=T;{owp],a"(T (cȒ:f/r- RhԚ ܖԢOᖌZ2"n{n(Xb i BwuJ=T< ; r7Լڼ,p:W ڶő8֦TZ;N'y>{]׍ZHÎW bJ4{N{H'Uk!/jYh?M(iUyEwI%e:˱0Y̧2]y4qd<j0qN9FlMȂ%{2&eN:Ꮏ~ s8XxȮqP7+\ E%q,/vl=ubNUaïb/bo*9hU0O#/ƞ*c<ᗓr bEZGIX)PKv2  PKK>/OSGI-OPT/src/org/omg/CORBA/DataInputStream.javaTMs0=_ÉtIrks24f`C29ed{1JH2JvGL)X{z+4ҁ/0Y)y Oa& giл8;;};uLfS  F![b00OSGI-OPT/src/org/omg/CORBA/DataOutputStream.javaQO0ǟOqS ۢVj Mrkjƙ4dӾΎ.@>8;|ۃ0e#y%0>q"AFP703 fP1` 7 rOg'qb(i6tYHKd+HBRKWxHޛੵodnٚf4DÚ]6mx8}ޔ8),ZbeZ#>٬hvA.OSGI-OPT/src/org/omg/CORBA/DefinitionKind.javaMo8_1)5rPwWhj/,AO-QQԒTP`Q6^>d`*d; ? Q*XRE=M$K(W4T$?͛|R1,ANW'؋d\h(ES}HhqHĶh\1}Wi(0Z.f\3"HMhM܆kL,It5Z:?'CXv o]:)aK5)&S|8?/Ƽ 9Sx߳AfCQenDʒ+#ibۡO:cxI Y:@y+ 1~PTȡ\ ok^'kL/a&./P XB;m~g<ѫqpnG/G3r=~hOڋ] sw/n5mnsqUx]/zxal$6iMbs˭w/Yxlh=Q41qڧfg'rt`G gRloŐT? ;Q4OSGI-OPT/src/org/omg/CORBA/DefinitionKindHelper.javaAS0)aR'pk9@&Cu$Uc2 O`ZZC[}߮Q#̴[Ym<YY"k)TALcQnc rdwTLeAQFd7Ĉ1uR+S `- FblJ{4C:eMT(thÜ%+/X.xs!dҶm,ıդ~Һu:ujr7r0U!VZBTx@Z饪pz[a)ؔy+W?pmBaHΒ<6]^f7K&E2_9f<]ٜ>!*A\ϡ{cCƔΧOHP!ײhjDED0d҅ 6J/o Iq߂7mϲYrf5B8(8UF˽.0V^z(k|͝-OSGI-OPT/src/org/omg/CORBA/DomainManager.javaeAs0 76'b-Sfi&G V *-!N{W6Sb$=m| l9Y 򳄤P5v~V?+>c7Fՠ:"$FoBI6Z bu-NzA@i!{HFC z03$x3xx=tE޵ h>G"1ię8Ҷt;_=Fi0U-*fڂ,iO=YIRu!8$,zF:*k&,rI7yL_<&EdtWB^&϶!3}${i 92/S8/S $g5ՍC3ZA;H6$ :ח/qґh]`Ɗcm+x[= bMw* tіآt)t PKv_SPKK>7OSGI-OPT/src/org/omg/CORBA/DomainManagerOperations.javaeRn@=dG.9mQSIS ĊDU}7DW\Z铡`^. +mKBy2i!GU J+e!֢t4psMWō8:q,"KI(U'i8gbJiP{'.A~&spNaB1*i]ަ#eւ?=v?Ь{ڊ;#,  :C]plB,. )fpI${v8tl rXg&%YʧO#I7K@6$yP ^HYXRM%[M/FHvMG֯ղӴԑn,s8PuM&cZ75&ak5 jyce\pfſ PKPKK>,OSGI-OPT/src/org/omg/CORBA/DoubleHolder.javauMo0 rJzrrl5V؀Pl&K$ Q%[?(×띃q9!3Y"gOSIÐL 9Z4{BR"wDiVVhbJz 'Sr%:'d%@*E\ sPFhwϠIqP(Qy"07@9% YO*SGkdJG@k௖xsdbe)O`u̠uoZwaFh\ [dеFl kίAPKq6PKK>/OSGI-OPT/src/org/omg/CORBA/DoubleSeqHelper.javaAs0W)a=i:L0{I丙N;+@SPHzz6[̴[Ym<YI"k)TAOGcQ rdwTƬD.eAQFd7Ĉ_}d/d Ð0CI[#֐kY ! 5=Z+ӫz >`x~{xo>L&mƢ#&c\y~SW&`鶑 bZ1uko SJ\5inP$9|$OqNb̗ylY6?Ki6G$|NgcНc[DNt֏HP!ײ`kjDEbG0d҅ku XZnW(4" ĝg49L6Bظ(^*xf#}CL<pKDY!~PKMF;PKK>/OSGI-OPT/src/org/omg/CORBA/DoubleSeqHolder.javauQo0_q *mV  >6P=0MV[`-(2HwNype56e=n8R46&a${]nWp/qJ9dKeȲ;&G /pc&bw@DOV{3U"<8yt !GysKPK:WPKK>&OSGI-OPT/src/org/omg/CORBA/DynAny.javar0)vzJ:)ܠLZ$L`81vd$9axwVВ0rh$kz;=fj/6FkQYr&RӋ'ơ Ka(4fP  BT |B4 8Ɨ! 5D+\@*U/f)V |rm3Yw 0Ӌv1i9šTŴb]<'׏IuGQ֠GxHU֤d HPHkFZՍ↋bZa -&(͝51gQqr/$N&9^Y|\h:fUsh JLn=EHHe'IWt4QԬ@(Aj˵}fS-7̸Kn4 w Lr[etLE.e۱^.U|Sj Q1\"-̠]nXN -nL1u1&J6)]ćNy+yv<:ʱe7?Z+|,\!=t.Jn2Eh@\oI7D[KY"եeAtÔ B&k| QR2 n4A5 0nMvMd sM%Yo8n4q0,ϗvCG3u34IirR1ԧWC}R9^u.'?-GrZ7h%4'3]N?UxOy{t9t)Am7VS;s`;] v|`G}3tVu?-}kX=jV/F~}. /"s}F~(oFKCo緵lk PKONfPKIG@)OSGI-OPT/src/org/omg/CORBA/DynAnyPackage/PKPKK>5OSGI-OPT/src/org/omg/CORBA/DynAnyPackage/Invalid.javaeRr0<θDle(3V%* &ϓMg[^t KFi9CV|F U׋ŧ9x< 1rɒ9Q2'%)K:U;V+s"cVzd,Mf7bb%{豤A*؎z{F#9p -n}ε_PQs.YbU][Ր0UbZCל{#TV]/ yJZgsoBplBaH n")>|϶yd] ˱UIw_9#{5˔>+ z#a/lK˒5'2%s?eiQ:G| x"N::\fmvݎC PAVhd׿\GŏSad3<Iň}PKs`J*%PKK>8OSGI-OPT/src/org/omg/CORBA/DynAnyPackage/InvalidSeq.javamAs0WθDe( ʦӤ-iWO{ltKF{i9CV|F UŇ9qm"'KHU ^V,UTEnO[Qg񃌕Z2\`&ci2pv,Ɇ@%RԇvD۟U< G uhy{FӳwE}߇DjSG͹FrL=ڨNv Z*ŖYCלԽNzwL%3r۹7fd860 $qs/rf5_DAaHRdT݉P#ŎВ9He4 p| y!N:ԇ:\fu *Vs*h-DLhdUp*Ćru?iOQ Ox*?QdXp(blPKP..PKK>:OSGI-OPT/src/org/omg/CORBA/DynAnyPackage/InvalidValue.javamAs0WθDle( ʦ3I[0Ү*r"7$Ls,}EN̉ȝ,IYЩ ܁X㞌Z:\`&ci2pv,ˆ@O%RvD;U< G shyFspE}߇LjSGͥFwrL=ڪ_4x7@LU66!9{#TV]/ yJZgsoB_7plBaH n")^!|Ͷ:OSGI-OPT/src/org/omg/CORBA/DynAnyPackage/TypeMismatch.javamAs0WθDle(J„weә-iwPt KFVGi1CZ U׋Ż9~md"#KDe ^N,TIH[Qg񝌕Z:\`&ci2ЈJ;tXCZdMǂZPzsFOQCv-/!}~εPCm.Y7-SS;U0 gZ25=uo!/SJwUhM(LI>m'܋'n86YH3,*&Wo%٬ ϡx)}A_lK<Ȃ'2%HeԲN?AQp?' ivAjvmP(QoJWن#UڿDv|/Sfy9: 8[ s=YAPK3C4PKK>(OSGI-OPT/src/org/omg/CORBA/DynArray.javamRn0}._q$bmKimhU ]UMdB܁MmA} <s9?w`+ {lQCPU azXuw3ϖ!H 1jT1X;ИC+rT`A2\ 0ؚ̖b-l! k(x \@&fs?Yx9djhhWQӼ=vTIU p&7z< *\t֐b=HTH=#^qE邖BKsmO[sd@1 0mkIݧaA]I am. >۵ H<4: yEH/$$I7gdM-+J١T5Z5 -Mkn9eC9D'[Emtnr$u z:oiڔh cX"P.E/=O5J13ӹ7(| kFO^uϫZȲ*O޽Pty/KPKhR.PKK>'OSGI-OPT/src/org/omg/CORBA/DynEnum.javamRn@=d[\BlE@'QNvb{g1M&@;{o,a-Ajo`/ Ns3#W.³eH,RC ,5Qh,*0{e9} 4ν-`6f K16:5F[\@.vsL,V O23Z:o$z|ƴ_}{=*>bQDQ֠w9`-YFZkփT*3Ҫ7\T.hY)4F3'H(6&`3 0u-].H څq wa= H|ju@2x"H(Qn1%ɚ:V!TJ#hQ5\k$45oaf,eC9D'[Up%\Hrf]g7{vMT%a3fPأn j=bn9{ݑRd~yN?A]Ih j!ɱ~c/PKIS-PKK>(OSGI-OPT/src/org/omg/CORBA/DynFixed.javamRn@=d[Z_BlE'QTU{fmm9v͛J64A~5g"G^.]gːX5 ,-Qh,*0;a9}Ǝ 4.L-`2&d {6Z5FC. fs;Yx9df 4t*Q|=vTIU p;R=N݉Zq6kHU2ZV)VurAL)6g9 E#Y ؘIBN:HԵ$s| IhnRX:܆qDGFk"=xhu@2t"I(In0%ɚZV!TC%4\k$45s̱/w%=U\Kǟ@R3뚠WOc_Nf7EkP~ nF`P٣v j=ans } ͏-N鏼$/@FLbFɛ Ž^:PKwk nPKK>+OSGI-OPT/src/org/omg/CORBA/DynSequence.javamRn@=d[Z_BlE2NxSإ Ubm|o{܁9d+^ LGAYr&2by [԰E#Kr3shD !YFą4L-`2&eAHFDc. U=J9 {FGFpFj@`f=}: = )OSGI-OPT/src/org/omg/CORBA/DynStruct.java}Rn@=d[.5iAN bUڤӪ@;{oLa)8@|Wg"Cg@Oז!H 1jT.1XkИC+rT`6~2 ܡ\ 8u0Mb+[4j$f2Y7nb!ShSqfѻgcLsy}߻lؕ=V{2L.?aVT5(|i"XC2֊ R!{  ,LZkxښ4Cd~$3KrFkeQ (\ p5h6: ƹEH$r/I7gdM-+J١T5Z5 -MknٕeyC9?["Jڕu._8t 9Y=bsfw4mJySUgXmEbT2gPڥ/w(}B+.rZP3D;m ոTcU7oߡķ CwO([%هc|Y8?PK/ !R5PKK>(OSGI-OPT/src/org/omg/CORBA/DynUnion.java}Rn@=d[.n F9Y xإ1I;Q9vL֝0A%g"E^M_&@#ז!H jT;\b$(OSGI-OPT/src/org/omg/CORBA/DynValue.java}Rn@=d[_BE 'QTUc ĪŤӪ@̼yLa!8@~Tg"Gf]gːX5-1XkX@+ T`6Ar Pi.z3[hh&sK-lBh5װrY7Mg`Jaag4 gcLs]yWIUpqH0u+*\l!U9Hk: XzFZ՝↋-צc -MQfgOW+. [P 3tSO(J|(w@jǬ{7oߡķ ݣ25PJvv{ ŖUHet_PKq4PKK>5OSGI-OPT/src/org/omg/CORBA/DynamicImplementation.javamQo0ïSemKimhU ]UMd q 6MhTЮ߹6ă ,T}ТY1WaY &9j68zn4A'gr+8J942G v֌ӧ_F( W FN0없㹳8*v,4C؊9GkuuzG,#9 5l=;kAж:b_"(OZF:]} ~ם,g`5QqkZPX֬rԭVb Fmm4:\Eس2Rj0 S!܄iN}m>LpV) ,2DF_ \?hR˨>% Ly:EHdjb+8EE BQKJ5JwsgSJXfrBQuWU/&{d9g.5Iٞ|[&~/X$( V(O)E~u#r7.:GxJxddm%Ȧ,p .'zu+ӕ٫' :4L:0yPKZ(PKK>+OSGI-OPT/src/org/omg/CORBA/Environment.javamRr0<θDe3i&GX-HT&L=O$[^t KbuC"k)TA/_Y跱H Y2*Cf$ײ eDJ2p{B܊?ced SSuFCg9N/u nQZ/~8gdJp7r nhy{ p;~C1(u\3nTMпNv!ZVU֢6!9UF:9޹^4ȼsoB{_8603$qdsOrlo78& *&WwWsG}k)}[DFFN$ٖ [SU'*Bd;BK_ee#p;_(8翞uS2.!r6. ,shՐrx>WKA˒IH)ػq7Iv !Ypc<PKʟ|^PKK>-OSGI-OPT/src/org/omg/CORBA/ExceptionList.javaQo0ǯ82mI -J$HWсb lfШ5eUvx3pnNF0c}J <6RHɒ9R1CV2'e@ 2pB܈?Ced h|'ݢ'(Zbˊ@95R!u3X;}wwN\WB7s͗H#miUXGv=QY C[ix aWرJt45H'U9{ CSHܵ,?yM( I6<Βl!f8M6YfؤXl6٬y?đqomJ-"#:ϖlC˜GSe+JBdOL-V d-p֛|ipο(OSGI-OPT/src/org/omg/CORBA/FREE_MEM.javaŒAo@W<#ڜCZĖiSc-ޥg&RHUU7߼ILt3Z;DRRǧaȽ"'KfK˘ɵ,IYZUK2pkB҈?Nd g [tAi{H PR JizNOIp{,\jZzv8u]=qM5Z;&H3u_uj~ċDTX0k-:hQ==ug`uYJ\(Fc @V pYylyv;]tf9&e6fS^]!K6@ S8aHRdɣ[2'BCf#?VˀKoSˍt7qұTd_$A.8F>s%j`ƫ/OSGI-OPT/src/org/omg/CORBA/FieldNameHelper.javaAS0xS¤Nr2=2{u$Uc2 v lKzzr3mvVka9B^|HF U'|26!aN얪ȵ,I9Ъ,Q򣏌񃬓Z$b}h0: ;b#vPڣua%ݗd,EgD{A2C)C;" ~BrJ%[Su+jBd;!.|VǀUiFz[|B(> BXoxϒȴKn#Ēңlc^JjLlS"2vOq` 'C^~xP=N[aAĒoj j6oUV㽫w,ꅮևSeZy$6x(ǃ_>j5 =EPKϹK3PKK>+OSGI-OPT/src/org/omg/CORBA/FixedHolder.javauMs0Wdg\psk}if`8䔑a I'>.UW0W`xs0,F_9Bp& di t< gXL +hXExb ,р!Ě#cr%:' `4@ "ip [.@K(T{]קW$kcΨ@i{ݵsNmCT8./|{)Z0&i*؆XkA`A9[ں2%MLH&mL !0${d}ݯ!^t,sV0ENN7-Ic@6~!G7o ӡpf4͆lK&o3Jx5Jg C懹3n/^۳fnxYjR3-p/ .H?5{Kx"rx4qGܿoEƹ*u|]c$FIݱRqu~ PK&PKK>+OSGI-OPT/src/org/omg/CORBA/FloatHolder.javauMo0 rJzrrt5V؀Pl&K$ Q%[?D×.{뭃q9!3Y"/g/SI!rhvXExbЀ"Ě"Sr%2'h2{B "ip .DK(UmgP$8hcΨ@4kE]ׅ'#qȵ]X3QUR`w MDU5 ց2jsSw;.)Xq3e*n֝vdO6&a#zduݯ!8]%Yz,GS@6~@.OSGI-OPT/src/org/omg/CORBA/FloatSeqHelper.javaAO@x)ALbRPƞ8::&B ."`{=o7;E8Dʣ_ _$Bx|<? 0#GvCe AZhTI~EH(EFIp .n[(8b 鰔5 2Rkӡүu:@NC/t /!|VޛϣQ۶V)׍4ݮUstHˎ[TX0k-Zh QYׁKU ҷR)V.д?leM(iY0ܦfd6K"G6$4_-:`lp2 ,3Tȥ,ؚQ*! ٵtXAkW(4" ĝ',9L6B,ظ(.OSGI-OPT/src/org/omg/CORBA/FloatSeqHolder.javauMo0 rJzrrt5V@(Pl&K$ R&?D×8;ëa1,!3Y '/cQa3-,ТbJ%4DnkVУ'˕pC0CKT5ہT-@.PZ6]^œ}VQ:M_D`s[m8T>F7lDWJւdžx`+beU)攧n w\VcjZf˔:W;2퍑F?L ۘAC"Γ|Euvxe2![,K/euqz?r HQ|O@۹"GkG &Uڢ4h45~K/#xs?sFQ9 g"YsPxXt68;V|zS*~Ö< ~h_[KxU"uhE˝ƙ*uT]c$FAݾTqPKIw"PKK>'OSGI-OPT/src/org/omg/CORBA/IDLType.javaeAs0 76'b-S̀LK0l:`}zM7f;,W IKjz1~ZE~ tPCMd/kTT舐QgZm,bu-&=IL4=VR! j}23(x3xx=tE^o h>?G"9qę8ҶtO=iyjabmAtFSVT]N4 ަ #V \}ReM÷IQ$!ݕɳmzHW_ ɞ{mC@~Ɣ>-Bx 3XV<!t=I1`mzy$\Q/oIGEO3T#'Fh[wnP5Z՜!."~bM/;IO7^PK{U|PKK>-OSGI-OPT/src/org/omg/CORBA/IDLTypeHelper.javaQO0_qԧuim)6FjNrg; deCm|α39p6;+ǰ!˿J$M#* Óx 42aA얪ȕ,I9Ъ,QO_;Y'I<04 `t$vF젴G5J6/xHRoLIU n{ ]x7~Z=o=|LŞ8ֶ4Onr.Gw]A*E-Dmk^J/U=+ KA[Y ߌly&I4,|DnevMX$ez#[`e -1#9tolp2tȉV *JlMխ ޒUFp ȍMs8Xox-ΒȴQqQz`j3tI OCo;XG)P^xXM[aAɒoj/UV!8d5|{Vˊo7M˵㽿SZݽwđu-ꅪևkʴ aLW|{ FtPK]'JEPKK>1OSGI-OPT/src/org/omg/CORBA/IDLTypeOperations.javaeR0=唬XH%ilW{40ovmU*%*7qxR͚wG zYCa~ޟ6ۆ! hPc#9FѠ{D鳜RCQr qp-TrP!+Ψ@ѪsV}ivVH݅kCbOgѣ159f`Tլ"=@j`F:ҩ4\t>ډit4 7Vj7H֯ H EF}s@22E(o$"(yk&u|G-(7n6̞G9tDt .)zXQE2q;Œ,x(s[$yVamGˆ<Ϛ PKRTFPKK>)OSGI-OPT/src/org/omg/CORBA/IMP_LIMIT.javaŒOo@S'}WN\pAūs!kֹu4M,ı6EWPKPKK>*OSGI-OPT/src/org/omg/CORBA/INITIALIZE.javaŒO0S{]׭ZHÎG fJ4{N{H'Uk!/nEhM(iuyEջ wrdtctݤt &qd<j0qO9VlMʂ%2&e^:N~ s8XxX^'n#J0cd~1#Mq~ 1x|o #lôaID9ǫ>TSUK驿lUs6se'jTaX2hO~>F>WPKiUPKK>(OSGI-OPT/src/org/omg/CORBA/INTERNAL.javaŒAo@xd"nmNUd$4q1캻kg)4RC`ko|vG.0jC,I]KJB8/#0{EN̞1;x,IYZUk2p[B҈?Nod x `x-NCk=Fz(q 5=Z'اw$= .hxy-p=:|ő8֦',+fU5Y C?[ixaR Ӟ3IUEz:a۬uFZw #Z AR -N]].$[Ev.EƫOH{|Mđqzh1t(6d*FS<PK7a-PKK>*OSGI-OPT/src/org/omg/CORBA/INTF_REPOS.javaŒOo@S6VcN0Ù8-vU[CldE PԻG.G ^m !l}|6GBq$k]֌n"/UM_ZyaBj Qj=[;NK+U Mf-rڳо1PD9|(˷wQE2^H3*^i«kD=Uȸ=4My:EDgd*F<*[QzOZDhHqjpl*V㯟rF9vFtXpfkgD'}3%6Ea~0v q{|/#L˴IEF sWCswȹ&>yWPKH2QPKK>0OSGI-OPT/src/org/omg/CORBA/INVALID_ACTIVITY.javaŒo0_)TY6N)-Z$B[4;RTgȤi!(~ك`du>GP!GXxł,=cv&ײ eiFm I- V"ܒR+\C^z8;q%Y衠A*zWwhtœ+'X.xCoBA[A۶8ڔꤵt2[vݨ4xu+fD m JC洧ntR޸V6kiƝpmBH<#or.?oK$[&l.yodfĕzOy:EDg}B5r# FR(NNZަ;;~)47c+|qYq|JT(*iv\/dަ{w|kxO{ tf >0y~{XqUTUa|_<9kI %^v!k#k'u]}ܧ xPKi:"PKK>3OSGI-OPT/src/org/omg/CORBA/INVALID_TRANSACTION.java͒o0_)TY6N)-Z$B[4;RTgȤM4A{\D#˭CX1?J$U%*p8w+-di7)Kk4jMnKHjQ_ᖌZ2"^돽A7؉vh,Ȋ@RлCkt.^9rj~ۼB:W ڶő8֦T'\Y2uFUd- }oīDTX1k%ZhQ5=uk`ƵYK\5k $Gpiyti~]X$2/0gt3~$4F Cm|Ɣ)"':CYp4U6$zOFq"dvc 6I'/Ap߼7]O拫d͊k3WBQ fL:~Yr(OSGI-OPT/src/org/omg/CORBA/INV_FLAG.javaŒAo@xd"nmN!Ud$LT-f0ۚ]wŵ#FzZl͛o,ƺYn¢Y~#T <?cs%Ud* RVhԊ ܆ԢOᎌZazA/^7؊=vh,Xˊ@RۺCkt.^:r5o><σA۶8ڔꨵi:d#SwU"kag# OCLU%V6!sSF:V]+ yeNB{e 86KryI7O_f 'y-IYv.Yƫk$Uȸ=Oy)OSGI-OPT/src/org/omg/CORBA/INV_IDENT.javaŒAo@xd"@n-'hk52&r3mͮAQ{fB[U=T7owp],a</T (c X%uZ,Ѩ5-!En'-+eP?cJ!l Tȍ,x4U6$zOFDjpm*N㯟A9Ftwe*OSGI-OPT/src/org/omg/CORBA/INV_OBJREF.javaŒOo@Sh7cJ #ikYhlEI(i!aVZa~5yqa-Y]D^.9F>s%*`8^|WmIiQpCz^6K!2;QœU]6r9Ԛrx'T;6N4'D?_}D?hA<PKPKK>*OSGI-OPT/src/org/omg/CORBA/INV_POLICY.javaŒAo@WW+-dh7%)K+jEnCHQ߉pKJpz 'b[lJ;CZeMPmӣum}zOC/`WBCsѨXcmQ}u:e%SU7&kaK+ OC4LU%֢6!sSwF:V]' yeNBȣ?plBaH."-"or.7 %y-Y|i]4xIviv82C0qO ZlC\˒GSU+*BwdOVZWަ[;i.hgoIz[|~L]r|J(kivC·p؎ʞ:7߮Eo4-ӆ'%.8^U ں0ZOe#Z@=*BuGt']}Ч PK\^+PKK>(OSGI-OPT/src/org/omg/CORBA/IRObject.javaeAo@OvD͉ͭnjNxw;XU{g oypmVvGe*!{)T]?OC theaj#j̕~uR+ְ\ZYpgP`pA+{|H>mt]< <"r o h)2&[pǤ(J 6=y_ ɞ{mC@~Ɣ>iP"^!zBrkʚGS :N?U<'Z6ަ'I.GA9FtO]ɋ.0C1rbȫX#]_^9cLwhK~YQI:ßoPKs"PKK>2OSGI-OPT/src/org/omg/CORBA/IRObjectOperations.javaeQo0ǟ˧8)2&نZ>Ur+؞mBi}I~aPw0 #!+jy }r_i!Gu ^*kd!֢ϔYO4ps_0Rŭ8zq Y,4![IT'gR$EA>z!v:T}. PC>$_XL]$kyy9_"a?PKDPKK>0OSGI-OPT/src/org/omg/CORBA/IdentifierHelper.javaAS0xS¤Nr2!-2LpT썣֑TIafl!0|-IL[Y=Y]"k)TA蟍ǧC ۘL99[*cV"ײ DJkBbD.2ONjx~HuT : 0Z=OZ{oFm@k[\7N'Y>ݩUs/ dZ1uko SJ\6inP%9Ҽ$OaMW|4G6$]4~![uhglp2+"':BX'$g+Y5U5"TzKV#gu XZnW(4" ĝ'"9L6B,ٸ(j5=E5PKR13PKK>)OSGI-OPT/src/org/omg/CORBA/IntHolder.javauMo0 rJzrrl5V@Pl&KD Q%[?D×\DpscNV;a1,&!QJ ] /OcQa2=УcBj%4DCH(GFe]dwkOVdN9d+gtfK 1 [}ɺ0c`gEC FT٣<Xta d-I迹BI?;*Eٰs-J0cƨPFM,Q>ɡ[x>bRjpz93MIY#w)06ԁx?/Z,MHvqHӠf'u]{EPKPKK>+OSGI-OPT/src/org/omg/CORBA/LocalObject.javaVKoF>Wb궇'Zv[X(96YKBY%Eܪ%oMHU+͋/(C g2Cnß@^N 4A'3se!XF_O Wn!xS]]:d+Bm0aeKTYuԖΛ8c: 59T46f;gnmn0X.>kJښc8z'?h h2U*cS*Vh$URsefv4:;E[sԷ lLU@\]I߁| 'D&1`< bEpFcz '3d+2 ܕ"$;fd*g,jV jZRFP.qm5D0w02ۈzT/*GQ|zJeL0b2&glCKkw˻ծgLCc!42n]-,3[0UO3>i;v]O8FJ̟ѩv4ZK庯~hVeߢzq]OӼnʢw*i3Iåm7´lr5)=cw98/EU Q5=Bj:|Ùsf懌ǣUJ[wPVAVQ_/1jjۆsqSFg3C1dؘ̙z@:)7)vfL<. 7~pɻZ*3 |cT|ScP<ȴ#|Dc%Vǚ=Ycu#7oJnhtfOZ˽i8K}5.ܑ,^ţx&WlNHޚdžfuW:ɪs^ /x^Yx^?PKLPz PKK>*OSGI-OPT/src/org/omg/CORBA/LongHolder.javauMo0 rJzrrl5؀Pl&K$ R&[?D×.띃q9!3Y"/g/SI!rhXEVDiVVhbJz )Bcp`FCh4{jaAk4-Xv%Zݮ3x41JgTk{ sNBԑ8h,iLCխh-rCo4QlCu Ŝԝz Vm] z[gugeO6&a#zd}ݮ.8]'Yz,3IdGmɽ-BxUG$[^hnYP=IFpj 2717o ӡjpWh\ [cеFl ?jAPKP3PKK>1OSGI-OPT/src/org/omg/CORBA/LongLongSeqHelper.javaQo0_qT,оm}JiFDjڃI.[]!E}4JjE`\;GhZyDRR?O8Lc3rd7TLdAQFdWĈ:N1Az` b =G!&}AC*zm:VվNHpy,h\;g<m=qm5ntN.Gv]FZNB*ĂYkB[y[+TN/}+,R:oM{b6KrygI`r/9n,Ӌ lzlʣ/HNχ nס{cCƔaB.eTՈP Yʼn`Ȯ  6\K/~UPhE;uOYrfmXppQx`+jC'};uDmvZUPM]b؈8!h8,ߵѲk/[O<8'x#%Q0pT3;ͷ&K+\mz(k!?rPK'z:PKK>1OSGI-OPT/src/org/omg/CORBA/LongLongSeqHolder.java}oo0_/+XnUJ %iLrk)wu]sKt̔^m dax9|=?B KDfeHd Khd!֬W2oh,W. ` FSoW lR9h, BպGkvyzOZ;FrFVS!0Cw9)ڶ YG*SE⠵"|[)Z0pC4QlM 9[ڸ6%uΚJ?PۘAC*Γ|MMvxU2![,KU qz_z H-<0oa#!lj,TV!TjFREZ,5wu[ >FPU8˖W4͚H3L@!1.#cP+du7]o*1~8gxFfvx AHݸcyjqJG_A bzw2|+qָe~ _PK`C!PKK>-OSGI-OPT/src/org/omg/CORBA/LongSeqHelper.javaOO@x)AL*8=quvuLݙ nE`77E8Dʣ_ _%Bx|<? ⰌYt#2f r% RJ4$ "$FvNIpn78 [`-Pڣqa)kd-OSGI-OPT/src/org/omg/CORBA/LongSeqHolder.javauMo0 rJzrrl5@(Pl&K$ R%?D×.{ëa1,!3Y /'OcQa3-,ѢaYYE5+GJe8Oh%A*E6\ SPZh-wۮOIPk(Qq"0Cw9%ڶ YG*SEkE2#QUR`&^i*ؚXkA`A9[ڸ2%uNL{cя6&a${duݮ.^.tsȖ0dd)}}8Iz=$˨>i' L'OSGI-OPT/src/org/omg/CORBA/MARSHAL.javaŒn0S |U>)um@rHkL$e]*7@C C\a룑!,X%Bp<"]?yEF́61;x,HYڠQ2p;BR?N/d x zV?G`/Pڡb++=T;HBnwӹxɲdJg9MJ ^}@xtq82C0qO9VlMʂGSe#JBdO^Z7ަ{;z5o47c/2N&Aݬ9F>s%*`I&sfv6"Ώ~vj=o:.O sWq"9XU0^N5#o(=+PKd:PKK>,OSGI-OPT/src/org/omg/CORBA/NO_IMPLEMENT.javaŒAo@WW+-fdli7%)KKjInMHQ߉𑌕Z"#A5^zn;(Zbi5KjB7MI]< zp ^?kףQuTt2͊KTMVxh fEm *C紧tRU^N6Ki֝G?plBaH"-"orws'Yi|I]4xIiv82C0qN JlC\ɒGSU+*BdOFZަi.hoIzSœ|v\M̕QւSzfz; H-iY\쬣tGz ^Fxm8 ?8qjuq|/y߂jA93~F*0{#/:GL?Zg}LG}oPKMIPKK>)OSGI-OPT/src/org/omg/CORBA/NO_MEMORY.javaŒAo@W6V `o Sgq[h 4Ȋ@5RwMI=] G ^m !l}|6GBq$k]֌n-OSGI-OPT/src/org/omg/CORBA/NO_PERMISSION.javaŒAo@W< 㤽AOnNzBg,8fw7ߙMԀ@`k3ov'Wpɶ:{_#N/:WP?jCPgg} oPKpqPKK>,OSGI-OPT/src/org/omg/CORBA/NO_RESOURCES.javaŒAo@WXzk&ͳr[Ր0/-SUbɬ DmԽN:k C^f%3rٹо3P%%rLȋܥwIQ$" :]yƫwH{|Lđzhwys%T`,\5zpV-.v~#~=x8 U=&4Bx*>nɦ:{_ #NV/:GL?JCLG} gPKYPKK>+OSGI-OPT/src/org/omg/CORBA/NO_RESPONSE.javaŒAo@WS|PK◥aPKK>&OSGI-OPT/src/org/omg/CORBA/NVList.javaAo@x5$6'jd$Lr{0ڻE6|=pwF~6,,*#! ǘL9Y2[C&xȝHYѨ ܆"[bIJp .\{N7J;4!-ֲ$SFTtUwZ6>+c+'8]pAO׉6GmCWjSCœiN߳^d- lW;UebZKBǜ[#TV]+ yL.3rո~k_'mBn4N/x(Y9&6^ij>!J5Nn Sm,Sz;[DJt"alM\ˌGSE# BdOL%_eǔN_sF `x;'Mt͊mX"sJ2;]?x Ǫh({r 3WoQ."6)!:Э/ievnWouL79G~50[G csue_C/2^PK7U7'|PKK>-OSGI-OPT/src/org/omg/CORBA/NameValuePair.javauAs0Wdgprk}"2@draՂJ„we6Hۧ*+X*=QLdgq.K|~fCrhX1r&QXA'+4%JhPn^0K[  "y { SځPVhpSœvMk!p7Bsc})SGYkM\=Qdւ04n;bmx R)OᄬCjznT:#v7#Z@q m\$EMn q6YUMv NkB@6~>+BxWg${QhxP#IF `m \QoDI3l"ݎb7Ęy7.θآt*8?KVt #g(Qjx_t)itf^PKStPKK>3OSGI-OPT/src/org/omg/CORBA/NameValuePairHelper.javaAs0jHnmNI29.bڒ*8Lq;qڴ`I'0SzgDq0GfDU%Pót a۰J dTMENR,ȀDsVpK %, `t-vw { kQCNځZwhpÜœ}VYAuЇ9q2i6qL9vrI6ݮY`G# '^5Sb [P4kNy'd9֮ECަj\kC (8E؛˫f wb%xAY\8MD=|1WsA1)BFCXg$)ks4Y6XjKFr"djac XxJ¡;-4 7CU,]\DnV\#c 10WTLx u?G{%' {a_lL! sؿ[ }?aό߻J|>MzkԬ8=dx5M+ c #;M3U9?z(m\FAPKe=PKK>*OSGI-OPT/src/org/omg/CORBA/NamedValue.javamAs0WθDepQ V 'ޕMxR0>ފ";Y YM"n)TI^]^~ߟgF9Y2{چMneIڒN+sܓR+\zd,Mf oq=Zq%lTR Jv# gt$x= >z+p#9}aBq$椵m\#STC^N9@tLU 6b6!9#TVWnVZgwgC xlBaH ")!YxGA<2CO SqnBOHRVhEMDȴk 6l.o7Ie_Nj70OSGI-OPT/src/org/omg/CORBA/OBJECT_NOT_EXIST.javaŒOo@Srr*ў4إTmgYuܨwmbA읝y8ìnZ "IDU%*t<a>c 2w \˂Z" !D(_ 4wA4^8}b+PEk=ZVz( EmzNaNHp{K+X.xCoBC~kѨPZ5x6OkwݨoԜxhKfDZCx֎JU0vBYIc\k (C peq88不(ytY\y&Qrqr2Cv S:a]LC\˂%w'BCz+;VÀ+gSɭ> yqa-Y.]r|JT(*,O~9rVtk퍥pO{^f/ !2;XaUrVUqt]+OSGI-OPT/src/org/omg/CORBA/OBJ_ADAPTER.javaŒAo@WWF9Y2;ZMeI ZFw"|$cV`o o-bZK!-ֲ&CIT(:6>'}N\pAës!ƹhu],ı6ը>j:%SU&kak+ OC4LU%֢6!sSwF:V]' yeNBȣ?plBaH."-"or.e %y@cͯEyUȸ=4Oy^to~t>$OPKI^PKK>(OSGI-OPT/src/org/omg/CORBA/OMGVMCID.javaeQo0_qT,=h-ڪ&klUﻆLj<8=.\`aXwq]K j2/#J,mCv& eiVmq# 1X ^0K[u8Bi{HRz-q 7=Z'ԧw$x= |/p=9|Bq"}2_go=߭4<0U!6Z@T洧tRUcX]N6[i}#^ A#${d#}\9βxN9 tHIwīLV1#>?cJ}@(6TR#OSGI-OPT/src/org/omg/CORBA/ORB.javaXݓ6|7%}iцI $t<^@\Ic2߻38XI^sbWeF놡?OSGI-OPT/src/org/omg/CORBA/ORBPackage/InconsistentTypeCode.java}Rr0<);=iS:=*#p$!q3;OiyZ{E ,9Z< EI":)TM^.,(ҡ$G@M V֤5UC~GH7VFIp/0 X̮Q؋#1tʎ@5P N,A F/m_!(7dXڶIwƺ6[jUTG^Zv9BVU km!ZK\:Rs8h鼕޿ F IZ!&Nl[>-4_g Eedyi/Y~3qd=L6OSGI-OPT/src/org/omg/CORBA/ORBPackage/InvalidName.javamRr0<θDe(3V 'ϓMgHojwWXhdw3diP%azX|׏#H,U!3x{YTW=!Dɿ22VjpLdv)G+Pڡb'=9HR(mngdJ8r nw pӷwE08Ԧ3Frzڨ߽4x{XU) qiz0IUa uFn{&?%c @RLpI1$kY!8]'Ye%$KyqoIz7qd|=u;`y~EDo$Y;Y5U&@F#tdZiZXyF w:Ǘ( 'C2o㐗M[N_e#XnU*Z?Te"LN9x7\tNgx [)"&Âgwa#%^PKOQ.PKK>&OSGI-OPT/src/org/omg/CORBA/Object.javaSn@=_1D.vDEMMN)ت {f޼}fv|>sjx2$gD8xEHb|0!DjK '(4PWQi.\p,`إgWb+k(4Pk$!n p,NZͪ=cJKΨ9D1Շi]q?ͣkRU݉jXE$k@*`BiU7.h)4)Femz5Rd0"!\{,Ƀ- Cog!L9}}o_,spS)!BIN0O5,GBUrmǪI`ji ^rL:4 矖ve U$1*c4`߃W= ĉBf0VoJ"X35[3׶Fd+i0vd~KQ޳F~C;zF'x Nv :ǘYu U}q&N`\DٞڢCSN`I:}VC%lӫ^t)etqbc2fo(^{T#qCYKMY=/?uvK=T,OSGI-OPT/src/org/omg/CORBA/ObjectHelper.javaAs0x 2Ԑڜ6f &(ۋQj$UqL{WvBNv{O$ f쬬r,*4$ Ϧ1(XN9[bV"7$B*kBbD?}ed g0Ky#֐+$!J1=Z'z?W $5t `i{y2.{Xzz&]LU 9K?[iq0LUYA[׼ԝ^z WL%hQhM( i>E8ܥvdH*G,_4${|KcGs1epȉV r%KVԄZo*vCv#]8VǀUiFzK &Q9Bt7u<ydڂc(ظ(=F0fV]/#<j.aߋa+4YUPmӜ؊8D|,OSGI-OPT/src/org/omg/CORBA/ObjectHolder.javaur0)v|3.>'mf`8jJēɻwۘ %VJ w Xd0\,>́g kFfUH䎗(-V BYI12oh,W.L`2&8vɃ[r%j\B=u:'CQX̍sNBԑ6KV7i~Ǭ{)Z0:.4Q V:PXmbNype=cMŭ3h~3R0sH \yϽC7qInrְdd)>C>$Ȩ>k; L9lrƒoyIɺe5Bh$uMí_%p\鿾|(h?M:TMU t[i (#ƬUyZlP:{je~;N#hqGs\g:xcg⟤<M5=ÚHݺAJUOz@5d+(o8.OSGI-OPT/src/org/omg/CORBA/OctetSeqHelper.javaAO@x)AL*8=quvuLߙ "`{=o7E8Dʣ_ _%Bx|<? 0#GvCe AJhTI~EH(ENIp .n[(8b 鰔5 2Rkӡүu:@NC/t /!|VޛϣQ۶V)׍4ݮkUstHˎ[TX0k-Zh QYׁKU ҷR)V.дgF2&zI4,|Dnev=M2%yz#aMyMy-:tolp2iȉ *RlMUސUZ0VǀeZz ;qcI6;KN#, 6. |NwTs9/qh@Pع,ߵѲ[π8;xÀ%Q0pT3; ͷ&{mCMoe?D]=PK$:PKK>.OSGI-OPT/src/org/omg/CORBA/OctetSeqHolder.javauMo@q[!ic5&{0w7cw\ m;3-OSGI-OPT/src/org/omg/CORBA/PERSIST_STORE.javaŒAo@WgrGjm`K/cW:#laYE !T[sr Sp'bT{aXJh~>&g} oPK1 fPKK>.OSGI-OPT/src/org/omg/CORBA/PRIVATE_MEMBER.javaeQo0ǯ8SRem@R0AڪOC.mBj} Z#*ֺ; yU"n[)TE^/,(Ң KHɭHYڡW;2p{B܉ce2VjpLd' NPڡҢ-+B݈6H?]< Fu/t_ !}uhPCmhmtL3x^d- ቷ'*eV 15=` IMhyM(Li9*.rMͷ~Ǹ(l&%o.( 7C}hu^e[sdjoHM.[%^wJO(ڞe'PKW?PKK>-OSGI-OPT/src/org/omg/CORBA/PUBLIC_MEMBER.javaeQo0ǯ8SRem@lCkadU&\5b3ۄF*F=>U+,u{2; D4R0ͮ$Ƚ"'KHɽ,IYڡS;2p{B܊Ced 7 c/ d-NACg=E%=:HRn3x< z_hyWBk?GQ8Qs>Yb[Ր0'ޞ Z*ŖYCלԽNz + Cf'3r۹w2oPbE\$ԛ<&of8t d9Yz,'đqzn1(!Td[*e%KM՝ >Q<Z2iZyF|\QooIP,_#'TfzX=,V9^J4M (py7PKqsPKK>-OSGI-OPT/src/org/omg/CORBA/ParameterMode.javaQo0ǟOq *(o+C lFCU}B&kNSTw&iEJCA]8p3YvVW^s&bd<=? \ MjQz%,yBcHP!x%TKw }["AHFbp ))ˢljnvsZ5!QQAIoii1hT׵ˎƮT(ozg Z|$N5(UqEoJٖ\sVT2g7\dC255Sh1 Fme:C{qO46&EG="?ZȽ[ý^BW}/x~0|*4gs!vR(cZY2L> jL,&7e9Ѥ]Ydl^{S4FsFvL Q FwR*cBn|hI),mu?[/n6~0} ?.gUOXw 06'-g&xiJ'ܑ#SIxF۩ņ;RMM$q~PK Q;PKK>3OSGI-OPT/src/org/omg/CORBA/ParameterModeHelper.javaAs0jHn-'g0i&^Z[R%߻MK9~pSwFlIQ@TeFпχ KfKyFd$-P˜ A1ve_X$\c{A] &bjpR9-%=f t9i]< <j4_ ] }lGiB<򨵣x:L%Y pP3U+f-e C攧npBCj4mrauJџ 6ЋR\Fi}Np-|RH0MW2N||WC У6>c _!% jZdM5ڒ4JXsoSJ8t[FA=Ft"&hz588f V|V9]S3)xӊz;,J]M$wE3~\m$Ⱥ,'~”όy߻J|_Yq~?Q abV7' N 5Z4MN-QR.ҩPKw;PKK>3OSGI-OPT/src/org/omg/CORBA/ParameterModeHolder.java}As0Wdg\psk}"0M!N39edXcMJē npV}o,3X(7:Ȋ/b!8%|603B5/QZp[X\I8g0ak4{ja{Ak4 Xv%ZݶT< j3:i9.:?EQu!CeHjmt,i|Oé[)Z04QlMu 9;ڸ2uNPۘQ\@R".bEUv8t, rXdeJV!Nk^Ne䃏};SaHVc7hnYPI@icXy?EA@}ᅨӡjp&OSGI-OPT/src/org/omg/CORBA/Policy.javaeAs0 76'b-Sti&G V%UZBN{W6Sb}zm| lzyYBRay^C theaj#j͕uR+ְ\ZŤ8 &t_j4RAOfF%.f]` wk!ߑ|q#q&u>r[GAZ@EŬA[Eԣ$U-¢i#+BȭplB")!-piz%8cRIvHw%ll<'H'f#wXcJeP"^! ֲ5At~F#0hO:lM/O?qґ>u&/ ȉViO Lw-9\n%?(w$M;PKy PKK>+OSGI-OPT/src/org/omg/CORBA/PolicyError.java}Rn@=xɎ(8>mQ#S(5x.&VM#Gؙ7oߛ*=YYY"i)TIL!a0rɒ9P1'%)K:UV2!R+DS=`4F8{q%[詤A*zzv{8p-@7>=;ڏq}$N#m9cm|bUUkՐ0o-*ņ66!9UF:Vo]/ yJZgsoG#[pۄ()#&EZ!]}+<$y,W@c-U- _]=eJQgIRneT݉PŎВKjY`iNS/_8?=w::gm2 nm+Ѡlk9r\nGo5/ ~wixJj5{^'x !"~gFLÁS  PKGjPKK>5OSGI-OPT/src/org/omg/CORBA/PolicyErrorCodeHelper.java_O0şOqԧuim)nDCԔ!6ڞ4DMDǾ>wI̴鬬b,*Ե Ϧ1ia,CÒ=1+kYrTQ%Y-!1G?3Njxa(Syt蠴G5F/xHBLJ=U z /0y^{õ|LڶŁ8ֶOnr|U7&`w#-;^w fZs^J/U5 KA[nQhM( i>E8ܦfdLt#[b-.U- 1#>tolp2ȉ6 *FlMUޓUN S˝Ms8Xx-/4kbEQԂ1kj;%]Q]}_G+r[m=pa/40=Kb/Ep>[~e^˒4op~zݒ(_(g/Ni1OSGI-OPT/src/org/omg/CORBA/PolicyErrorHelper.javaAs0x 2ԐڜBO3I39 {1jJ2ϊLZ8֮~ID8Dڣ_ _%Bx|:a0'GvKe AZhTI~MH( 񃬓Z,z]78;`#vPڣqa%kdOft#c.E !#9tolp2|ȉV*JlMUޒUFp Sˍ FQ9 Bt7U<yd%d(j5/j{E5OCk}SGmp8ag;VqP>kb+Liq$V˒oCM{۴$W>\8ULObsCD|{ϱ;Ae?D:.(zPK%4:PKK>1OSGI-OPT/src/org/omg/CORBA/PolicyErrorHolder.java}As0jZNcfr{1ʒ*8L&+Дp,}]G\B@V| ,Ɨه)I!J 9Z4;Br&DiVVhmbJnJe8d-A*E6\ SPFhw۾IaPkHΨ@X gE]ׅ'#q6Y,b;)Z04QlMu 9;ڸ6uN hlL(. )FpI1&&[}qJd9,:Y%YJO!Nk^Oid q FƒoxIdݲV;4Fpj 671EA@shҡjpW,OSGI-OPT/src/org/omg/CORBA/PolicyHelper.javaAs0d2Mrk996fpfr(5*8 +p;@ S{ .`"UyCHLht}n !)8;^0XB#J`Wb~6\ GໆA_ N YBZh 75>,p\vӫ8x5dn3ڠiyлZ9ڶ َ8}tM?u^h hpM"ZVirQ`ҶL)= #Y?lؘAA :Β,p"6_C<dzE2 $$$g-g.)Bx{$K^5Q5B GPqjt25_sn_nPyO'DIr]t~=#BQ3.iŚ:\[[38N?.Ƣ #'6Zhz S'a"x(^H^UTܹ;˜`ZdB?!yWe5DTIm݅KQ [׈Ep"K{$o=Fz7ڭPKE PKK>,OSGI-OPT/src/org/omg/CORBA/PolicyHolder.javauMs0Wdg\psk}"N0@frȰƚ I'nc|h}].`z`Z +pLqcȽB/QZp;XcdX$\ zd MfKoqP-4R9h-KR5zDuFO8FrF B`nsSu]8TĠ]ID=fKւ-7LU6*X R)O`u̠uoZw2ߌ$LbWqsoo50OSGI-OPT/src/org/omg/CORBA/PolicyListHelper.javaQo0_qT,о}JiFDjڃI.[=ہFU!Jj;'hZY<YI"k)TA蟍ǧCA1 3rd7TƬDneAQFdWĈ_:1וz kBikH X ^m+j7S $x4 ne#w|4nVzFz_gnם9XHˎ-aB,[h QYׁzk KA[hAhM(ie0ܧnd6K:G6$^4G$|NWCGs1esȉz r) FTJo*vCv-]8VǀeZzwK FQ9 BtU0OSGI-OPT/src/org/omg/CORBA/PolicyListHolder.javauMo0 rJzrrl5VC(Pl&K$5Q%?ė/]pK[˽q>4!3#/wSIahjYG41DJe8hb-H堶HŽ |Q;rUn\< < j%h Y4!Ceʙvv/WIzKC֝h-YsCo[`r%VPXibNype9vaM3|[f֏46&aeg#8zxsm>Zd2HװLx }}(yqr=Q|w@܏"d';#Y9ZeJRH4[VK⎹蟾|YМx#t2\hzKcK& (:ioi7Jx3OJgOC3gU27究wLԸz]m0OSGI-OPT/src/org/omg/CORBA/PolicyOperations.javaeRn@=xɎ\psks"ۢFP(j ^%Ub**̼y ukllr,]IXl6U="'K慪<Ƀ,T*2pGBEɟw2V7KX̥SICo9E-[dR,m8͙Y<7h@7sc IqLg.-vXصd- #fU8V P15H'f j7Cy݅i4ol谈 $wqkOd{0OSGI-OPT/src/org/omg/CORBA/PolicyTypeHelper.javaAo@WOMD#-s$Ev[Us[TX3k%h QZׁKUN7R)Vk0leM( I6E%$%vx*C<]\&$]ċ{|KЃc0-"#:@g$g(5U֢$zOV#;ZA;M ē">zcXq{`Uk*n>84Ow$x6iZFjv,*t,SEG}bDUJ^˂{VIwkܖDqTm]ejD$vqq6o&NZCc{OPKo807sPKK>)OSGI-OPT/src/org/omg/CORBA/Principal.javaAo0ͧ 6.Mm*2v0#x vf;ҪzZ  1rHqUIrBr<~?? BX%"dȜ*m q-rtR+\c}C+8;q%fHS r;V鞎Mp1 n|e#OֹcmqMU^$"cԭZHÉrfJ45ukk!)uFjhOeM( Iu%C՗vxd!]b.f*Ixqb6zOҏR賒)s4U6$zOFq"dvjYJO.Q<ē :p.>5^{s!5y%87#U.kQ1*{qDpmc}p'щb5FA5U5{-3ccPKOPKK>/OSGI-OPT/src/org/omg/CORBA/PrincipalHolder.javauOs0 in-8@O3I39eJ2wʸ[)0{˭~>4!3##AwZXE"$/rs e!,GWw4+ Wוzث*I[p9j\B*ݡ5m[Nœc֎Q;6\^[(j&d-qLC|u^  =0MT9[` (4H5O@܏󰋐!!ljM5+JC#)h4~[-^F;_FQМz!t2˛xD!\Ht9۱;c!MC2`2皉[%OJg]B;f M{ uGQ1Qƭ?x˪ffN_NƩ*]m$Zɺ?x8_7PK14IPKK>&OSGI-OPT/src/org/omg/CORBA/REBIND.javaŒAo@xd"@n-'Chk5’M帘lkv5; RU}7oyWhds!DRR^Ǔ~7o^i%sMV,mЪ !iDɟ~'2Vjx `8Gb/Pڡb+k=8HRnwӻx<z4ھBkޏF]DkS֎nbY,2u_uj#DTX3k-:hQ==ug`uH\"dJlylɫH.o"G}1~Ɣ>) @3m[YhjEEАK2r/p_s8Xxd4c3WFY f3FgdGjc/ hoS8C e0*"#Ǫ!T[K۹d gpgn AM9kf'\} PKPKK>2OSGI-OPT/src/org/omg/CORBA/RepositoryIdHelper.javaAS0xS¤Nr2Ox&e8*QH$x!e(ד'iYYm<YU"k)TAMcQJ9;*cv&7 DJBbD~gd g [yt蠴G=Zz(xHBoMJ9] {~Z?Bpm7'mcq &Mn<[Us:TX1k-Zh QY=uko`SJ\5i9sM( i>E8ܥvdH*G,_4${|KcЃ!cΧaBeTՈPYʼn`n 1`lj^ҋ\$?w:*e<2͊(j¨׶Kk$pGWLb' ιN"#8QvN%X9or%F5QPKu+5PKK>'OSGI-OPT/src/org/omg/CORBA/Request.javaTMo@=׿b *jhnmN$L`61E5N)}|+t52[tL383BR4@+ ;}@cVpv;v[]ZlAi"sH K#&@*HhՒVM)C$.8)ϊ9uFM6wX;8 GI4ƪ۬s`𶔆; Vm@dyS]IRe}zI0hRiȸg=h֟6DF8 0;pgz>`6 &pt4 ~A0Ȗqu2sw!>;ID.e­B+4;ZZw&kIЫ\7:GIpe6q$nnKwޗF={x ?= d]tIQbE%|I]0Ïs=O";ܙ20\"{@H+ 5y ^telO;̀ʵd׋C>wh̐|C !9 K͍PӘ-.*}{k׹{9+T<"psw!ʹeN^'T\^YT"%~߁i|oҶs2HxLk cPKkqPKK>-OSGI-OPT/src/org/omg/CORBA/ServerRequest.javaRn@=d[.8na D9Ekmaw[Q=v)M8y7<T ޟ;! $hPo0\ jFUpp)̟]?O%=v; F#ȑR̘Y]`滈CT%c!oSLNz6D]G>_AŮwULNW._Io>7l?F=y3PKRNPKK>-OSGI-OPT/src/org/omg/CORBA/ServiceDetail.javauQo0ǟǧ8)}DlC@tU5M gRTLl ^xpk룅y4!jD0Z./}E!s24 Hx`P="D">|Cmp,afShX9Avв$ n|,QYJ٪ 8T M(:&Uðāu؜rM$߾'F4h hqM0ET%+a=H H1+uȃF'Sqc5/:{f+#6lcfQq>(s߉/n,}!`&x >A8dGɝ-Bxp'$^hXPԂ&ƭ`drx\QyO'DNu]G+OuH;aĘ_F}6#.(9/ ěVXnxMz`0'jZsaAោ3tZL/צt*=PKnqPKK>3OSGI-OPT/src/org/omg/CORBA/ServiceDetailHelper.javaSR0<_S¤Nr2Ox&e8*֑TI0;O`ZZmIQ#̴[Ym<YY"k)TALc(XÂ13+YrTQ%Y !1O2WNjxa 4PuCisH tW ޚNZ+Чc Jpq \`x~ó|LڶAqm5nr.{VU]x0+ZBTx렺KUڷR)V F A#8K4ty]/q,|^etfs}B2ŗt~>qd܇ X q>"r~ r- FTJ*vCv+]V@S˭~Ms8Xox-Β4+bEQԂe|иxKK'w_fq#9t1c'4YUPM]%7q'y8Y]Ӳ7㿪fX$݌>8UD˽.[^S5/魉2OSGI-OPT/src/org/omg/CORBA/ServiceInformation.javao0ƟOP@ۢ!]UMd%g;MQ}mJ[yt SmV~>*(*'o!x}71A&Gv1;I9ڡV;BbDο.2Njx~Po0 G]G(Q;b鰗%r2R!ו=K C硷^\p\;;xoޏFMĢ%-FIFt:_fLeݩ\a*[f-Em! K:P7Vz!FX 6;鼕_47#~. ^!zM4tiu}^'M:ϰZcZMZ>-{Pc] ^\*jQ HVqE0d+XM)+o^.EG0NǺ*j}L"So8OSGI-OPT/src/org/omg/CORBA/ServiceInformationHelper.javaQO0_qԧuim)6VjnrzKlv*u& B@&>;Giz wP9ax2_FqxeP:,ɑQC09)GU#r+c$V8_N^7J{4C:ldETumzVmקw $= .0y*=twm7_'mcږQ&Wb]|fZU,i{TX3k%Zh QZ5uko`SH\7 8OSGI-OPT/src/org/omg/CORBA/ServiceInformationHolder.javan0S,|Wrsk}RH4)L"Yby,ep]F\B@V| ,Ɨه)$!J 9Z4;Br&DiVVhmbJz +Sr%2 Fh2{B "yp .DK(Um_gp$0xc$gAX uNBԑ8hmt,i|Oî;)Z04QlMu 9;ڸ6uN mL(. )FpI1&&[}qJd9,:Y%YJ_!Nk^OeT v FƒoxIdݲV;4Fpj 671zQC"˯y5f.R0b,DMӻ(M=96(=u 2O",ACy ާڷc/ < [<}5>-u ΄\5.T7Z#AB̏ӊ g[ xPK#MPKK>/OSGI-OPT/src/org/omg/CORBA/SetOverrideType.javaQo0ǯSRem@E AڪOC.؞mJ*} tڦ}=fr̤i^m- a]s& M\Fۆ) dhP?'g h5-BXAd nN0!-Ƀ(y* \@!գun}zG\[FrFVZq2gb_jRfgQG5\0ET[k:Xάtԝ斋j Fc͆g2 9nȨ>+& L<"g<"/yAeB%P w7Φ M5OSGI-OPT/src/org/omg/CORBA/SetOverrideTypeHelper.javaSMO0>/QO-mJ7FjG7yzKmv*u&ʆrȗ?_G'N0fgedWP6O8< n!\˂*¯ ?!uR+c blJ{4C:dMT(tZ{%8]ǡ^0\_@ߙ_kѨmXVFd:˧u7F,jaWXZc^׭^jWM)r~{/\P%9Ҽ$Oa MW|4G6$]4$;|KgCW:tolH6eyXXgKP!WhjDED0d7҅eul 4H/_(矁'"9L!\E-fN>c=+KZ ]Qͪx>tx#\T Ưfr1{!*Q;lFK s+OSGI-OPT/src/org/omg/CORBA/ShortHolder.javauMO@唠N9@UdKq(6Yuݏߙu MZ;̌`f`\M(pHLVucX%Z4;cr&7Bi/k4f=~\I8g0Mb.OSGI-OPT/src/org/omg/CORBA/ShortSeqHelper.javaQO0_qԧuim)6Fj&6PwK(ycss팎"aj/I]K Bd<>ߟqX,d:ȑPB)G%U_# :N1!ׅz b =G!&}AC*zm:VվNHpi.xe"{y4j6{XjT?U:ujrib a fE m!*K:PVz!^VX 2tEL ^#{8K4t~]qft^fdtfS}A2ŷtz>q˸0 |:EDK r) FTJo*vCv-]8VǀeZzK FQ}ӱ^W$%iFGQ W.rx>ty9!O6Fqk7VA5u}k_b#Ё8SaF˒o+oU>x- DJp$\8ULFbNCB󭡉.{{Moe?D]=PKbBTZ9PKK>.OSGI-OPT/src/org/omg/CORBA/ShortSeqHolder.javauMo0 rJzrrn5V؀(Pl&K$ R&?ė/8;덃q9!3Y"gOSI!J 9Z4[Br&7DiVVhmbJz )@cp`!4̽NаH堵Hš |*Q;Jn\< j%hZ 6/Qu]zP:{nUZ\}$!V  >Pǫ0MT%[`(6H1,OSGI-OPT/src/org/omg/CORBA/StringHolder.javaur0)v|3.>mf 8䔑a I'w hj@Kt,>^ 7a|9}?OB2i!CfeH ^(- BYA!2h,W.}h&s/qP R9h, Bz@ku}O8F 4lj];(j6dqL>Fbʗznh&mUVS5qYMkA/Sr 4Ĵ?4q$|WqS/roһ5Y24ENIWW=Y]O2O {;-BxU=X-/h4Y5B@kXzk>7o ӡpfW<͆lK&s@V7Jx!O5JgO+C|~= =|ثo < 2 HDO U"<:z H󣺾iu~ WPK7 PKK>/OSGI-OPT/src/org/omg/CORBA/StringSeqHelper.javaOO@x)AL*8=quvuL&nEh3ףGhZyDRR?A^c:fnY!\ɂ*¯_:N1וz b =G!&}AC*zm:VnNHpi.xFAhԶm,vıըU:[ujrib a fE m!*K\:PVz!^VX 2tEB֟7plBHΒ<͇A&_fs$Y29&<ٔ [:=82C)CaHP!`kjDEbG0d҅ 2\K/? Qqο'uOYrf1B,ظ(/OSGI-OPT/src/org/omg/CORBA/StringSeqHolder.javauQo0ǟǧ8)2扦يVU4U\7c ~ 뒮0w,3)38#b!8|243,|Z4[,Cr&7@iFhmb z1|GcpN`}h0zjf;Ac<5Tv%=Zݦӻx=1Jg$tZ&s=twmQԶm:P*\$y?u 7jLUV*X R)O`ڵ̠)uw4aI9$.<.Y^gK8]&̲*Y&YJ/-Iƀ42Oq9Z푬ƂyAɪaBh$uMͭ_%^s\鿾|(hοM:Tuβe< t1%PF9@V9>^+<0(=ZY9[b[zpo'lhpp'VMnXi[Gh5Fluo g{KPK\G&PKK>1OSGI-OPT/src/org/omg/CORBA/StringValueHelper.javaAs0d2Ԑڜ6f &bʒ*84ʸI(CʡKod O8k˥0C} ³teJ ShVXDEnxb,Ѐ["Ě JY4^KU [Tj-,@.!WNœCQ9MO\~a4k#eʡM2dW뺕?kn| LU*X+ ҞS1qYkA/Sp n'?dm$ qd/r̮i<%WSdz% EFsI0s{! ,jdM5+JB#h4X-^F;ڥ=_~0(^TUFtzS Ft5^A-,V(m2·]',޶<:=ϰsV,Nm ];2kX13"]m$Zsؼ)yrᨮmt/i Y=vT:* gj/~\:BƱ* ?džAvHGC':aPKihPKK>,OSGI-OPT/src/org/omg/CORBA/StructMember.javauAs0Wdg(8>m 8` 0a2Y٤ o+`!Uy0'M?s3#g0 6$Ni AE@ds hE!R,P;jåY0h2wla=i5H@k|QYr٨v382OSGI-OPT/src/org/omg/CORBA/StructMemberHelper.javaAs0d2ԐZN)ey1jmId& N&-zzgy|̔Qn|iY@\UI^M&#߆WZXE""or'8J4@nk[74V( WB/tK[T5ہT!,EO!ZwhpÜœcrHhsxܶmđ2:j.=Qweւ08DYNkA`AZsSF8!Xv-3m ayzfI$,F!Yݦ+xxJKd $ UFsI0!C!jb-8EeJRmHJM- oSZ8^A@=Ft2x&qb9p-V4wb8g0?*:F}ƅ}I,wef HMUMa;۲ȗm}+kDA^&MCj/fie?Q"uH>3vh8S!sn|b[DiHg_PKip9PKK>/OSGI-OPT/src/org/omg/CORBA/SystemException.javar0)xeg(vk"2͘pRk$* cO&+6I( ~s{$Wj0.&H/q]K x>}#J,;x[YTS%=!nEa&w2Vjy4 Fh'ݡ'(Ybi5RM;uOCo`-^ !}εӾ#q&EkrWzXuj~upDT2k-zhQ9=uo a)uFn;&ߌk&Fq$:Γ<&kz}ezr&$隿>#^?[ Aסck|)}]DNa/HBd2;BKoeԲN?}B z#N:M-:^m!ܸ(Z0f~ CGG!"LQ)'z<7?>%9#vr^Y!C#6~hG߀ /s$N ,&OSGI-OPT/src/org/omg/CORBA/TCKind.java]7ï8+vEJ6E+% H\'=̢h{Ι1o^be#Z75JZ,W5 '`2P۝&= )3 _4@"2 r5~"43$tmʽb,2`3 A,1!!Rԙ *q>9r R gt2& J/[IZ'ڭ eW+4z<KѪք4(:l@b3 bnM%h;CIOa8p |O&lx?p6}w]8 Ꮹ&LA,S+&Ī4)Ky$bkriْRm\EFiaщ_QV8!F`w|]:`G] "ݳ 505#A<8wI˃mr2AXT3D,Ff nN"0*#aw6 %m{)#xgm/v1U/G3ø8>!ˁ2^;4iO58rӪxmX~hZܦN5ҟ`oߏ,ZXXYZYJ0KQOwPK:.e4oPKK>'OSGI-OPT/src/org/omg/CORBA/TIMEOUT.javaŒn0S |U>) M-rHkL$eY*7@C 7C\a룑!,IUI B8GXJY2{ZǬEneAZZv"|%cVCm/q vK!-6"СA*zWwhtӜNœ+'\pCͫBAsmXcmAut:糷Luݩ4xu+fD m JC紧ntR޸V2ki],؄B/ɑ=\'yG^>]~OdLg9&]ٜW9D С6cJ] lTȍ,ؚ*QJ'j2;iZ\{J/?hw/IzWlqLYq|JT(*#q~vW1xit}axm3 8`Uهj*0Bx;׌dV{OWr "E?Ѕ3p)PK0&PKK>0OSGI-OPT/src/org/omg/CORBA/TRANSACTION_MODE.javaŒo0_)TY6N)-ZG$BW4;RTgȤi!(~ك`du>DRUR^|ӏg,bA̞1;xkYFd඄u+>R+\C^z8;q%Y辠A*zWwhtœ+'X.xCoBA[귃A۶8ڔꤵt2LQY Ci8Q3U!VZ@xiO*#Xq0m:#W;+#G.ڄB/ɑ=\%yG6]~nMdLg9&|.lo1O#Ws6>cJ_!l Tȍ,8*QJ'8j2;iZ\{J\~ oވ'*u̕PT+O&>̗OtڞoucA`&ïb/b+ιjU0G;p=)c<ףr n7?zi#tu˿OPKvPKK>4OSGI-OPT/src/org/omg/CORBA/TRANSACTION_REQUIRED.java͒Oo@Srr*AOnJP6΋uܨwH ByE Lt}0:EDRURQ~32Ȓ:for# RhԚ ܖԢn%g2VjqĕOy:EDg}B5r# FR(NNZަ;;~%47c+6OSGI-OPT/src/org/omg/CORBA/TRANSACTION_ROLLEDBACK.java͒Ao@W|vnmN-e$pT3/tw1UCUv.<\ /HQUI 9O0t9AF!;8,HZUkҰ[BԈJ.1|'Kᕳ8-vU[CldE PԻG.GhmRa{㵵y;u]#qXrTf4O"f[U1 SbŬPkRQwZZNhr6ki֞pmBaH<gr,?KEY-,G!Nd ~{hqd1 @\ϡF)]]DNtOHBndTيP{Ҋ!maNZa~<{⌸ޕafѕ״+\ E%qɱ(va>e|>^G G nv<-=zz˟CYE"9׮!T[U1;&5' O@,B-hrD?(M˿yPKe#E%/PKK>7OSGI-OPT/src/org/omg/CORBA/TRANSACTION_UNAVAILABLE.java͒Oo@q2k 6'Chk D9UymͮAQ{ނ+Vs`"&>Yn¢y^"*)TA/Q3^i KfOL,Ѩ5-!En%-+eTSU9 ɏ9jcOۉR9a_{z}?`DIy)PK S4'4PKK>)OSGI-OPT/src/org/omg/CORBA/TRANSIENT.javaŒAo@WZ̛E ts0:DRR^Ǔ~3o,}Œ,=cV"7$eiVm I#J;>R+\c`o S/q-vZK!-6&CIT(:9'}WNpW>>[皷Qu8TTkG7lLwݪ4xuh+fEm *C紧tRU޸N2ki֝,؄ ɑ\%yG^.->,n %eɟt9PKDHpPKK>(OSGI-OPT/src/org/omg/CORBA/TypeCode.javaŕo0ǟ_q *X߶>mQ+]'8Gؙ퐢!Tekюw;Pk#$$ R0:ǃ}70hѬ0 H\b Jр["++`on/%l J;(-o9A[qO׍N#sF-s t[:W| XMh/huu$Z PXAT%*Y ҞӞ2 ꅫA/ HJS-#؀ a=/r>O.gpNxbLa8Eh2<do 3 L˹"Ĉ; ArRSY2L( 4S/#E.s/y@V|ㅨҁγ`8'LJq\2œ kXQ98_ :)'Zo{ wpQvqAY;Z&49&B'rց +޾7M(7nŜ6OHN3W w+&*%:S g=ǚ֋5$C7W$?XsCYz3Ǔ~LC[fs4~I]?p.Zo%KPv|zo(k<3z Q} 2|5+aE"$}{u:1E[PK(' PKK>.OSGI-OPT/src/org/omg/CORBA/TypeCodeHolder.javaMo@W|#Z6HiS1^uwnk;<3Cr,l  a|9}?NAiaPZ -BYE!2oh,W.`4Fy+-ۃTE6\ sPVhw۾HqPkH(Ais,:?%Iu1ceD67yy󞨇{)Z0sC4QUlMu Ŝ ԝf Vm\ [gڻ1R0JK\eVNC-W.inJ((l9>C?,Ȩ>k: Ly"'u@+&FH4۰VKu厹_}BIќ#t&^˫ti1%P FƅV`xEinqaq _Knp<վyŽ _Z +4?wDT s&wrCtH^Qޡn\»U~PKcPKIG@+OSGI-OPT/src/org/omg/CORBA/TypeCodePackage/PKPKK>7OSGI-OPT/src/org/omg/CORBA/TypeCodePackage/BadKind.javaeAs0x 2Ԧ9B[O2cC39 {1jJ2 ܙiWO{*ڜlj&"gOS$(BCAȽH9ѩ,QgL񓬓Z:aFCi4 ' NPڣsa'[=Ud6OSGI-OPT/src/org/omg/CORBA/TypeCodePackage/Bounds.javaeR0<7_1+н{ ,mB@W{4# k;djϐJKC,ό_r mNV6{q5""ogS$(ҡ GHu AVTM~OHx*S Vgh(&w; J{tC:dK犌T z{Ozp w@?>{ͧ$>gűM^.y˼\gCF,eaUزV5J/U3; K[Uh5M(Y9<-rHfǴ(|-K ,V}V9>#͟- gc)CWDIt%a/JdTӉ#YŎ` X`hZy^EIqο'C/V<'C ]K.2ݖcPE <؂^lx&Y s.M ^OQ}?PK)$PKK>2OSGI-OPT/src/org/omg/CORBA/ULongLongSeqHelper.javaQo0_qT,оm}JiFDjڃI.[]!E}4JjE`;GhZyDRR?O8Lc*fnY!\ɂ*¯?!uR+cCA[ NV7X-htXʚ@PZW>J m^p GVޛϣQ۶V֍4ݮkUstHˎ[TX0k-Zh QY5uko SJ\4 'Fc $Gpi> "72&͒<ȑ0ɦ<ͦ"r~Dr [SU#*B7d;!.c2r-WBQqο'uOYrf1B,ظ(x DBh݋Se\$s(4蒯yp-H𹋢?PK ;PKK>2OSGI-OPT/src/org/omg/CORBA/ULongLongSeqHolder.java}oo0_/+XnUJJ$iLrk)wu]sKt̔^m dax9|=?B @feH(- -BYAd X$\z?brX$na>p ur.{v46B`sSm8TAkd6O{VR`*^i*ؚXkA`A:sS;.1Xq-3mJnƝ57#~*1 8$U'؛%˛lxe2![,Ke qz_z H-<0oa#!lj,TV!TjFREZ,5wu[ >FPU8W4͚H3L@!1n3cP+ du7]*18gx)Vfxx HݸcyrqJG_A bzw3|+qָe~ _PK"PKK>.OSGI-OPT/src/org/omg/CORBA/ULongSeqHelper.javaQO0_qԧuim)6Fj&6PwK6QyHlss팎"aj/I]K Bd<>ߟqX,d:ȑPB)G%U_# t!uR+cCB AbJ{4XC:,eMT(th}N% /8]óDAhԶm,ıը~utr1/>2uZ,5Ҳ0U!ZBT8unRUC8dJ鼕4#[m $Gpi> "72&͒<ȑ0ɦ<ͦ.OSGI-OPT/src/org/omg/CORBA/ULongSeqHolder.javauMo0 rJzrrl5V@(Pl&K$ R%?D×.{ëa1,!3Y /'OcQa3-,ТaJ%4DnkVУ˕pC0CKU5ۃT-l@.PZ]^œ}֎Q:M_D`sKm8T!FlDW@kc MDU5 ւ2*sS;.1Xq-3eJnƝH'mL !pI>"w&[-.^,ts0dd)}}8Iz=$˨>i' L'OSGI-OPT/src/org/omg/CORBA/UNKNOWN.javaŒAo@xd"@nmNȖ0)q1캻kg\)4RC`ko|vG.0jCgP%!'aߘ{Ŝ,=cv&w$eiVm I#J;R+\c^0+oq-vZK!-6&cIT(:>'CWN\pAëk!롏ֹhu],ı6ը>i.βb{U0'^ *ŊYkA9;#TU7ZZgugd_ 860H I7Y/d>OE:+1ͳt>!pf7#>?cJQ!l 6Tʍ,y4U"TzOFDhjpmjN7sF {#N:ֻ**hgDxf2cfGjm+`fS!2g~{!₃U_3ړrxg ^6M=ίG6BO¹APK$4r[PKK>2OSGI-OPT/src/org/omg/CORBA/UNSUPPORTED_POLICY.javaeA0ͯx+{kQYmUSe$X vj;dQ1Ү#oyB#ø +HM#* ~ ^?LB+-rdt<ɒ:u w$ĭ(7L񝌕Z!aj4{p(YbiQɆ@/%Rԧv@;^ .C`-B7@_s(>WP:jnZ=%UZ3j~up DT3k#zhQ;=uo9HwMhM(I1c\$ԛ<'v8t d9YL6I3toI82C/0qަ BoHRVT݉P3%s֏24$pף z#N:ԧ:\dc<n1rbL%x۴خYY-3wJ4V {, OPKKĞHPKK>8OSGI-OPT/src/org/omg/CORBA/UNSUPPORTED_POLICY_VALUE.javaeA0ͯx+誗FE J`WV&L`CUC*987wbdut#7Pax?~O#J,3Bv&+Yt@d1X)^0'q% RP  }jzNNI= ~|-p=;:|L ŕ8Ԧ72ɗU5Y CZiaB왵 Ӟ3IUau:auF[&k&Q8!|MtSeQ9 4Yě8MxQÏ8YAסS8oSDN7$P!KYpkjEEА9IjmjyN}B z#N:ԧ*C4 v1rbL)x$߮iY.)bKR*QQ[|/PKFZPKK>/OSGI-OPT/src/org/omg/CORBA/UShortSeqHelper.javaQO0_qԧuim)6Fj&6PwK(ycss팎"aj/I]K Bd<>ߟqX,d:ȑPB)G%U_# :N1!ׅz b =G!&}AC*zm:VվNHpi.xe"{y4j6{XjT?U:ujrib a fE m!*K:PVz!^VX 2tEL ^#{8K4t~]qft^fdtfS}A2ŷtz>q˸0 |:EDK r) FTJo*vCv-]8VǀeZzK FQ}ӱ^W$%iFGQ ƼW.zx>t"s Bҏl{?('jגoj:Fġqe%[ު<|&[,HxqL㙌[C] 7"/(zPK:PKK>/OSGI-OPT/src/org/omg/CORBA/UShortSeqHolder.javauMo0 rJzrrl5V@(Pl&K$ Q&?ė/.{ëa1,!3Y /'OcQah YE5+GJe8 `4{@ "yp .@K(T{mWw$p{c$gks,z:DQ۶!CeH6Mf4$>k%Z n&UVS5qYkAoSr _7dhcI9$<.Yd%ŋE.yfYz,,=Iǀ42Oq9 FƂoxAɪaBvh$uMͭ_%^s\wO_P4ވ& g*Yi (#UUxXt49$ sg..?܇#x8~s1wҝ%+OSGI-OPT/src/org/omg/CORBA/UnionMember.javaur0SajJY9@[OS{C3Yudbڒ*8L޽Wऐ/0=:Qp̥4/w+89p:\~F[SXA'grs hD!T,W?OԆKSC'h,:@:Bc<->Ge ező]!3HhZ9ڶفؗ 7|ˏDڈ )qSDX+ւJ4Q[.1-l nYcJ{b )D4J6ZK6k W0^G̓x$/w=c@{]-BxG$0[S4Q6D(DPܸk5X82{XzxQӾKÙj;bĸd X||?Z,嶃Cv. EG92fςl|Oo %Xw;sYPS=a8AIB3=/_?#prFO=PK PKK>1OSGI-OPT/src/org/omg/CORBA/UnionMemberHelper.javaAs0x :Ԑڜ6xfrŨ5*8L&+vB2ic1fge#diP%ax:GqxEtX#*f r-KR*" &$F|+c|'V8A_΂N؈htXɆ@%P:9J ] /]O_kͧɤXcmI&r_~`~Սj9XJˎaRڈBԖuRc8d*鼕EB֟7plBaHΓ#k:82C)COaRdT݊P-YŎ`n  2H/+_a$8Ag<9L[pGƼQ6+jx"w}p4OSGI-OPT/src/org/omg/CORBA/UnknownUserException.java}A0ͯx+н,m)h!XvhcHE[5G߼fMI菑{EŃɃ,IYЩ ܎p3O2Vjpd-N^Cg=V6::HRnw3x< z۾BkDQ8Qs!Y,bjZIoN-Sbì DmԽNz M%3rӹa mBaH")1Y}+?{#tux݆oD̸VJjӶ:OSGI-OPT/src/org/omg/CORBA/UnknownUserExceptionHelper.javaAs0WjHnmN<5FR%w帝6Ӵ>`l=i=>SmV[A>D}J gaXÂ=;krTVY-!6"[2WNjhA:OSGI-OPT/src/org/omg/CORBA/UnknownUserExceptionHolder.javaQo0ǟǧ8)2剦يVɪ>U\Uc{ ~ ۚ`.`z`\N +qLym}-=V!)x[^XA++4vf%})@cp`Fh2B "ip [.DK(U]_gP$p?hc(Aj:gE]ׅ'#qmX#QYk)Z0o4QlCu 9;ں2MN1 U\$ԋ%l8t, rXduJV_!N{^OeTv VƒoyIdݲV{4Fpj 271o腨ӡjpW B&WPKK>-OSGI-OPT/src/org/omg/CORBA/UserException.javauQo0_qT,a}ۢ!"XG.[b{C^CMC"^c'7n0deu#7P%ax;|ߟGqUtX#{] Ad!KRvhՎ,Q򧯌񓬓Z6`}i0 'ݢ'(:b 鰗5J2Rԍ:9J c^p W>?͗$.gX*/.Ydd~F,ieaRl,q@Y饪pz;a)Vn[_Fc @V pY1"{Y!]:WY%"]>GAϡ'cƔ!) B 3Tʽ,ٚZQ*}$ FpwAŸ+ Js8X7UNs?9`TxF Gx _]q Ga'(zPKVPKK>+OSGI-OPT/src/org/omg/CORBA/VM_ABSTRACT.javaeA0W<唬RHskH6mQ =UUbSۄV'TU9& 6; YU"n[)TE.sqc^i%s}NV,ѫ=!Dſ2+2\`4Y83v-eK:Pc7 .}FOC` B7B_sݧ(!P&jZ%mZl3x^d- wg*cV 15=` KMhyM(LI1:.bM[v_18-m,&Ko2R}A>{A S8 BHJֲTӋ#s?eiQ:.GEA9FtMu ~1rbL-~EǛ/^K%ZXߤ=hpmO*PKeH=PKK>)OSGI-OPT/src/org/omg/CORBA/VM_CUSTOM.javaeQo0ǯ8SRem@lCkAҪOC.mBj} Z#*V; YM"n[)TE,sic^i%s]^V,Ы=!Dſ2#+M &ci2[zq'([biQ˖@/uR҇nD۟.ϣ:r:on>{Q4 C(ġ6M^6OVXdFd- ቷ'*eV 15=` I]hyM(LI1m\$ܛ<%lS)8-u,*K2R}E>GA S8/B/HJֲTӋ##s?eiA:GEA9FtMxtcZ?>\m2{kaRַ`8Ez PKp<&PKK>'OSGI-OPT/src/org/omg/CORBA/VM_NONE.javaen0DW |Wrskm 9 r*hy%IAK[T gWXis{LDuR0^,>YQCIv1;;YrCvdԈceNjxiLd ' NPڣwҡk2R3 }F@Co` wk!{)Iař8ֶM%wjWL=޺W9K{iy 0U-ډBuRs8AX 6;鼕޿ #Z IZ!&Il1-4d EUfyiY~;qd܇ 0 q^^F_Z6Tۋ#Y=H1.t (#N:և6^ML91O?~EKn5R.4zE>cD_PKJXPKK>.OSGI-OPT/src/org/omg/CORBA/VM_TRUNCATABLE.javaeA0W<ԮJRTnHI=!7lg3n+rpdo7XldstV3dmPazX#J,':M"e^ q'*9Xn^0K[u8Ci{HZzs >u# gt$x= ~)p#;:}aBq!i6Yob[;Ւ0'ޟ!:ĞY[1@לԃNfk7C 3r߻Wc_ 860 $H7yHʯٮCqZ&Yu%e8}ķ$82Cϝ0q^_+Z_lGeţ OdOIZަ'鄻7oqҡ>5:W2=ȉ927w:.vQRK%ZXߧ=j$ڞ PKPPKK>/OSGI-OPT/src/org/omg/CORBA/ValueBaseHelper.javaOS0)aR'pk9Ox&07QH$I|wV >߮ޓ=:&쭨DJ 蟍ǧCA^ݪ%9/ \2,q@Xᅪ7h)Ȕy+? /#[^C"|DUvd>OftC6I6Li6oG:qdPKK>/OSGI-OPT/src/org/omg/CORBA/ValueBaseHolder.javaur0)v|3.>amf 8䔑a Iɻwij5@~Kt̕^m 7ax9|?B2E2$or Khd!֬G˕pC/h-A*E6\ SPZh-wۮNIPkH(Ais,z:DQ۶!CeH6IeH}֭h-pC4QlM Ŝԭj Vm\ z[gq'CH hlL !0${duޮ>βxJ9UJ%B|j H#:0a# lj,ԚV!TjFRGZ,5wuѤCUW+OSGI-OPT/src/org/omg/CORBA/ValueMember.java}SMo@<׿D!Cj99@[$$)Z](oi!y3j^-t,²Ld`p}n cѠ` jFE|Fm0 uN uz#'5Tl BZ 7%g,pTkvӪ8'pj23:muHf[ӻZo&`;ǁEsMd\Dƀ?5ה8S*c)y-YR+4fshn(|0reX䑢6&&%(MZM|MX0^'2Z['> UF{^ilrW!A<{KFaW[cS;ގsG~ص=u{pz)?Zb?>%%=n?z_PK=PKK>1OSGI-OPT/src/org/omg/CORBA/ValueMemberHelper.javaAs0W3.8>mfdrjAR%ad߻iN&9î~I\\^jc/Ɛd_9Du͙(riאN)[,Rp"w@aVn" <6\ ໆPgN-4!-IX TB6j@ * [F(zZ7X>auRWa}5]<_,GV݋ZqSDUXkց*TQw[. dJnykOBH֏(6&`eg#88xuܯ1Jh$)̓M%=}h"9s@yEOd| &UܢK'S[frBϣ:!J:M̓:y)F`9gfcŚ&‹ah}S;`Jq:(8ZEagaԩi ںeK&h(^_A{'`65$%uG6j-#k4}*eIk}QSyoPK{9:PKK>1OSGI-OPT/src/org/omg/CORBA/VersionSpecHelper.javaAs0x 2Ԑڜ6f &(Ũ5*8Lq;LJ|Xzzzt mVV+~1@HZ UiêaFʘɝ,H9*Ѩ,Q;Y'E0OSGI-OPT/src/org/omg/CORBA/VisibilityHelper.javaMo@q[!a D9Lkvk+g H"̼E0U5T$OH5__ϴ@fE ^r e!"GKJU8Ou`%ZUF "kUv@rZCnөxx4T .:N:vN Ş8TU\;y:]սZ0&Îf\dZQS1HCjadv'C֏xlBB/J!N{pq:"6_cXDe.OSGI-OPT/src/org/omg/CORBA/WCharSeqHelper.javaAO@x)AL*8=quvuLߙ "`{=3o7E8Dʣ_ _%Bx|<? 0#GvCe AJhTI~EH(ENIp .n[(8b 鰔5 2Rkӡү}:@NC/tW˗_+ѨmXcmQFWb_|dZ,5Ҳ0U!ZBT8unRUC8dJ鼕 홑L ^#{8K4t~]qft^fdtfS^}A2ŷtz>ȸ0 |EDK r) FTJo*vCv-]VǀeZz;cI6;KN#,x 6. y3Y %ч.0;Q?^1NaǡԒoj2FaqΛeF˒*ou>x DJhÙSe\$s(4蒷_k+jz(k!?|PK-:PKK>.OSGI-OPT/src/org/omg/CORBA/WCharSeqHolder.javauMo@q4j%L{0w7kwָ?vfyGW\Aj`X ˿pLqcXL hvXEyb ,р"Ě#cr%:' `4{@ "ip .@K(T{mקW$kcΨ@4롻kEmۆ#"qȵ}=QUR`&^i*ؚXkA`A9[ڸ2%uLH&mL !pi>"ty=,a/|rdtfs 1 YF}E?aroa#!lj,4V!TjFDZ,5wuGEA@>Bt*LM< t&i (#Ue&;%絡Vydu]Xc\{8WxKѣS'Z/0R7GX^kLT譃2#A6BLO}g_ PK PKK>0OSGI-OPT/src/org/omg/CORBA/WStringSeqHelper.javaOO@x)AL*8=quvuL&nEh3ףGhZyDRR?A^c:fnY!\ɂ*¯_:N1וz b =G!&}AC*zm:VnNHpi.xFAhԶm,vıըU:[ujrib a fE m!*K\:PVz!^VX 2tEB֟7plBHΒ<͇A&_fs$Y29&<ٔ [:=82C)CaHP!`kjDEbG0d҅ 2\K/? Qqο'uOYrf1B,ظ(FDmvd,*O$d{F˒7:M ;g0fI/>8UIbNB󭡉.y{Oe?Dzc=PK?)7PKK>0OSGI-OPT/src/org/omg/CORBA/WStringSeqHolder.javauQo0ǟǧ8)2mM iovmU;뒮0wYg0Wzoxu0Gd_9DBp&sti t< gH}-!9x[X@- 4f9=\I80 >4ͼ^P=H堶H† |Q;rUn]< j3h:mɤiġ2DtvrϯGUwR`:^iٚXk@`A9ڸ6u펆Z?L1 (8e؛MrUb_g0OW2Ntŋ1 6~!C2OSGI-OPT/src/org/omg/CORBA/WStringValueHelper.javaAs0d2Ԑڜ6f &bʒ*84ʸI(CʡKod O8k˥0C} ³teJ ShVXDEnxb,Ѐ["Ě JY4^KU [Tj-,@.!WNœCQ9MO\~a4k#eʡM2dW뺕?kn| LU*X+ ҞS1qYkA/Sp n'?dm$ qd/r̮i<%WSdz% EFsI0s{! ,jdM5+JB#h4X-^F;ڥ=_~0(^TUFtzS Ft5^I--V(팴2Χ]',޶<:}ϰ sV,^m ];3kX13"]m$Zsؼ)yrᨮot3i Y>vT:* gj~\:BƱ*?džoAvHGC':aPK`iPKK>0OSGI-OPT/src/org/omg/CORBA/WrongTransaction.javauA0W<唬RHͦ- $ %6MhJVg{D7nf0fȊ/qJ*v0?BwZdY<ʊ q'*9R+܆ L}d,Mfw^{ J;XCZdK:PC7 *O::^6B>E0 84Q{c\=SSkՒ0oOSUbˬ DckN{H'U3;7C^UhM(LI1}\$܋lk.- B ;Y5!4HF#tdk X{V/PO/IЄ,r|JZUS&;R 7y ލROgx+_!"FÂgGakPK(2PKK>6OSGI-OPT/src/org/omg/CORBA/WrongTransactionHelper.javaSR0<_S¤Nr2!-2L/ZGR%9&} n2%۷F'N0foedWP6O8LcsrdwTHeAQFd7Ĉ?:1z@ b=G!ֲ&]AC*zk:iC%(mǡW^0\p)w{y4j6űը~ĺu:GVUݨ_x0+ZBTx렺KU ڷR)Vl)c $Gpi> $tq,LdH99&2]ٌG_n-]A;c)CHZ?Jr [SU#*Bwd;!.lceVzS FQ9 DtU<ydb(j2Vjar<ǴWTs[G:(D-祜͡u=vŽ%X9;7e%R/u&A4lIzm}8qL-&c?o!\zIQcI!~PK=PKK>6OSGI-OPT/src/org/omg/CORBA/WrongTransactionHolder.javaAs0Wdg\psk}"N0!䔑a5* O&+L[;'%J Xd0>M' KDfUH䎗(-V -BYIag ?X$\3{hMbZhrZ$na>p jq .vhZm_[(.d=qLFw&o>p^  j=0MT%[`(6H{Nype=6cMŭ3|ݺaj0sH\yO*)nVrErCE^'E qߓz H-:O@ܷ0EO6d5|K&ڡ4[?VKᎹ|(?u:TM.U<t6%P F+d]&-+scSP+dM?|} ;&ZU]{,OSGI-OPT/src/org/omg/CORBA/_IDLTypeStub.java}RKo@>_'r[%2qEU-0M.]L(64)&L7;#0!IJDu- Ó4 1bI̖<ȥIY*Ъ ܚ5"O3w2Vjp/Wѩ%Ɛ S rizit=OЙ\.]ڹdu](CmI}xvH?Jd- jaaUXk-:hQ;H'U5ե!SHZwly&Q8,JtAշjhqdCXqHBlC,eTՊP-ŎАHjY`ajN?<$8{IzSdyMqknjPڌ%;R=nm=L;]fhCʽ,y3 Gx^{uN5UL_߉}`aCTՏrQPm]o1˜JBVK_tkOAPK;0PKK>+OSGI-OPT/src/org/omg/CORBA/_PolicyStub.java}Ao@W~kwI۶CmIuUՇ6g&=.]hC=Gx/1**#l>k[”/P_Nb5FA5UuY DtJR9ԝ˝t2 PK% 'PKIG@$OSGI-OPT/src/org/omg/CORBA/portable/PKPKK>=OSGI-OPT/src/org/omg/CORBA/portable/ApplicationException.javaQo0_qT,оmhl1etȉ^! *Z<Q*#x"[µ:,M- z3Wh4"W0ciNbN"Ӭ8O`npѣ'U:;|} +KrΗ ;%Ni< Ilr'YE>-Ae7VA5u=?=CPKo<PKK>9OSGI-OPT/src/org/omg/CORBA/portable/BoxedValueHelper.java}n@)F>'6' j8r0i.&Nw,RFڝƒ XKuT-̋WiHtjߟeР>`;%]!R!UKMIe8B'-Y T KuPVMhgRq$4iȝ.@zN㳷V}a1Ras5]$#SOU]ƀƟ=ixw;fmR5rJG=h>YAht2%i32o6,!g8cMeYlMi4q D|->1y"gS9#I4:F(Nd~ ToY E N 7M{{^ûdߞPKrPKK>4OSGI-OPT/src/org/omg/CORBA/portable/CustomValue.javauQo0WyJ*Y߶>4: m5=۔F Md;W\^m`]m /? H^ai(BA3;x;QT(k2:Dcşe%2V( ^ZVoqV# xCXhDO@/iBBMu9'CyQZxgH6/ZߥCV1^d-1 ÉOg@T l Sz2 ن`U&4mjaѽ)#G-P*)!-WKʴ cz1)$;yv<'H'f!WЋ6>c _$zШ TFTM#z h2Z-ަpr {#n:RCbDZ; x>:GAhH74>s4; ~oPKBPKK>1OSGI-OPT/src/org/omg/CORBA/portable/Delegate.javaVM6=׿b'omݓݶBva9EaXfB*Ik3ԇ?cYIO3op+lyЍa3!toמ3yA##ceXD?JP$z:jAlT)ۀTr ,@3 \BҬvYPx_ae( ž#0[.>Kk_zt?ÇQ=Jƀsi XElN\[fcr]3&j>h5G$\! 9w)'4 BO`8`<_?}$'=IY#(0aSʣ6u־<0!<4ci<bz;*iXVsx! q~8Yb)OL.??^~(A :T{ݨg5WJ uńiRk|NFk ;xBbݫΟL Y\fiilȾFBgie$^g1.Zr"ۦʊM*Qca2vKfv갡j#08_zxrKGYJ VcQ݂sC)UK\_^ q})fֵfڝ]|bWL9B*bUYOTr4A)=Ek˕19n"L04xqdHiiߚ-JP^Dto9gaؖD|g/=b3y= *.ht%v'{U |PK tO PKK>2OSGI-OPT/src/org/omg/CORBA/portable/IDLEntity.javaeAo0 DNIYo[Onm=*6ps$MfZ=%7س0PT Ҿ'kj~ ~XDXȎjtZUo,:OFmyhM.H'umAZF@jsH|̙T em^m tA=89LJ3(+T:kF0TPjlIwKQ9 2 yvtMhMid *A1)emE "de ff (|.8L q^_*7"y5T5 C3:-; 2=_%Q$9BtlN].4q.A]䱳n,]=L\#ӯK?QPKPKK>=OSGI-OPT/src/org/omg/CORBA/portable/IndirectionException.javamAs0W3ZL3x8(''I[0Hշ+%WfSOiJJBx=ckdTMdIR^Udv%ƙ_XB/S[t8Ai{HZ:9HRmnwgt$x= ^_RFs$0Lk$Ekl̋[Wݫ4x{蘪[fmm C<紧tR5 yJZgwJ_ 60I d7i7y6W4OSGI-OPT/src/org/omg/CORBA/portable/InputStream.javaTQo6~!ONn޶TqMXa2;(ҊPHѶ:Q8e(/5Kƿq3"G7/} 3`5f1X(@+8i*e y-X RҞu"@%f -M+xb^6.\1D܆q,h>Y8G1Lg0Ny4OG4RHKe+ ܶ"Ĉ{TO4#rJPEPZʎ")kݫoB^%Nr6 JM4 XB``7ѱVVTFUYe{ :o`/Mz8Bma \hbaRɺ=wm/6BS޶+gL=KCzoνi0v]35:dbxuo3#2{i~;HHyɊV}Mca˴Yu~&1MDsHY }akɳ=S5}ǁ;-Fׇ%S-ZWR4zrLm|Dyvq;+-Xmf4E!?.6OSGI-OPT/src/org/omg/CORBA/portable/InvokeHandler.javauAs0Wdgp|ks"0 8`5 0d߻IL0Bo~YgV`Ds0_]'<Z0rEǚ7J5 Fnk^c ;+[ flq-j@*E!cځP^OhpcœJIΩ@Ӫy-&sNq?3eڨ;imt7iHSխZ0k&.5QU$֎ 9G#mV5nM-3ܛОiK$ .")Borl-ydS@:Kmqzߒ*Ȩ>j' L<"ouB+шF[VH4^XkoӉ^87r~F4S}Y~3^z()OΡi8v"EGOWlpzp3{!U|ϙg,wDu B4 BE}ɿPK\CXPKK>3OSGI-OPT/src/org/omg/CORBA/portable/ObjectImpl.javaVKs6>Wb':RZhI9u8t8 5.HXܢ$bw?|Cry0qLpSkC< DhP/1 < *@JGkjÕsjMW׷b*(P$ n`>XZRU-1-YFJz;-}0XV>Jc8z?6h h2*e3* k$UJsev4:m8R$pWpaw SDQ01L"M4-g8dt>e@4"Ĉ檡dJL+#jZRFP.qe5D0s02[}hΟ)"G.KWV3،`T0;}ԆDJk:|b삼k/FTN4T#;)i’a>%*~L"9蘦0dHtL쉉 gOY q //׮Q*GKgclے&YUEMG(0PHrI>]t '1I]95m2r Ts"_񷢳uQ=Bk}ù$ f9=<(s,!+(D.gN*mhمVtofẆv^L[ ͔H6&akC/ٜ Ò ZRޫ,R& >ӔOEtHEw(=;ՂK3mCfx",XbMYq*r>8hncU-b >n<;pa>uG_ ۖvv7;+q$4ϺvUP?4h'mt]D^zPKea@ PKK>5OSGI-OPT/src/org/omg/CORBA/portable/OutputStream.javaUMo8=׿brn.UX iQE@IcLj)ʊwH3 Gp0exCLhg3Ld3P1 \E"Cz,3K'x&5X Bj+$ ^xb Htǡ%aD3 gPb;voux4Ϭb_|\lbe8oI˺V(*NZ`%JYBZ րTrҨn\#B7LxOjӴ{Tv 8b8 0/ct5/lLE &<єC0 ZF4@i_rJ:~K,ՐF.kklEEhY?ؚ\;mp w:ex@Lix͍rp.-dI,B]+.S֒gv.BÚ!5J桤0o>'s'RhꄷuO.ixݵd#J~`bc6]4W)3J杭 y*?EKV<= %Nd`͝?@0>D'1@&<#)oݩ8v'K<6ql_ΚIyaD:K?-̳bzUIYiϮ}4@'_ޯB>ֱRqZ^%"7ۗTV}IPy%]@GlL/>*}~UGW;OSGI-OPT/src/org/omg/CORBA/portable/RemarshalException.javaeAo0 x))2;mMXaqGfmIrxX C"U+,9Y= EM"m[)TE^/,XL59cV""Fj{BjDſ12ONjxiH&HtNG5N:Vd[r[%`O/-W=AĖY[1@[Ǽԃ^fw~L-r7c_'mBa n2+A1|/6xL4d"6Y+ ?nb:*`Lt% 9CɊKSM/BdWC.1`dZI/]]$Aub}F[8OSGI-OPT/src/org/omg/CORBA/portable/ResponseHandler.javan0)F{ڍ(lsks"mF9X`{ƻJ^Ȟ" i3[ 򋄤P5r7?g:(С}&b/r'kTU舐Qo ZeOX-KzA̠45V\! j=mt}G")iĉ8Ҷs>+zW=: 0U-*fڂ,r$niL#YYƴߌ<M(X%% 2-C/n<$Edt_B^.nCg I_&d˸>'`L<"oZ}FrkʚGS(:N?U<tZ6^$A `{!v:C:= Xlm_6?7ÂxMzwmdF*ɢpz> T5(S+^PKծw0PKK>6OSGI-OPT/src/org/omg/CORBA/portable/ServantObject.javaeQo0ǯ8SRemM  U}4䆸#gҨu¦Fds{Lr +mV{i3CQ}HN ׋ŧ9ymAP#LۘɝlH9ڢW[{BjDß2ONjxiLd G Pڣwa';4d3OSGI-OPT/src/org/omg/CORBA/portable/Streamable.javauQo0˯SR1نV>U\5=MNԨ-2KXis̫w II*r9~YD~ tPC:b U!$FTVBI*Z flq=@/4A#;|Hdm;3QxzK75 h2}|vDkH6NZߥuV?i׽9g+@vU-{ڂh-izjCpQXZ:r;Yh=rP0KJH$eZn~xH"6麄Uݦ4x ~mȑ9lmJ穋P"Yhɒ3XFV\j"zVqE`:6X{L'{ISoA9 N:}&3̰<9:BnvIE opײ'TN`/oŹts05 NX,PKIPKK>8OSGI-OPT/src/org/omg/CORBA/portable/StreamableValue.javauAo0ўv# ڜͶE@M ` YUTMTȞ7<_p{φuJ= Y#ۏ!&Px-gl"v&wT(4N5Jh,) ^ZJ͍8qك,#KIՠixxZ0r^h-9ቫ3T(351yE( d5RͣnBH4Vˀi 'ܼ\QoIGj}^H+|7+ΓshZ]:bяp(AO'}v?PK^ PKK>9OSGI-OPT/src/org/omg/CORBA/portable/UnknownException.javamAs0xd\rrm=͘ (bɕd  `>mra9Ĭ"ֵ$ч8o̽bN̞1;xYFd඄%XnB/[[u8Bi{H t(q 5=Z'Tw$x= >js)p=:|Jbq"C6=S&kag+ w:B4LU֢6!sSwF:Vo\' yUBȭ_ 860H dwi7y_g<ٴl,,ge}ȸ;`L<" +>#نJ%VTJ( Z-M-w wO_P7cl~ƍ6g8vyc.ճҝ}s8ZG]oCEtM'^*QO? 3/-7^h -U ں0^N7.8֞1^/PK; PKK>2OSGI-OPT/src/org/omg/CORBA/portable/ValueBase.javau_o0şɧS; "DJMBܤ6Ͳ ݹn G=cW\ؓS`Z /?)HNI]!LwsLe(CւVU=!߸3;t^ b [M8CyhTZ2G; sF@ٓd˳$@d?0 Bqm]>ަMVn2Xu;'*gN`! ԃSt;o`S+ON{z_Fnc&I i9eR<ܧH])!/`gt>B=4[92> 0 q^nJW yjTŭ鶗-Bki,Z=SGEKs8iaX28 Dsk$_z\JJEn4):w$E%'ۯ\+y?O?PKk PKK>5OSGI-OPT/src/org/omg/CORBA/portable/ValueFactory.javaeAs0Wdg\pSqifI&' $U&N+v)i~Dt>j Aܶ$d0].OoCrhXMDi^Vhb-J9<$,L`2&koqT=tR9-YEPNhIyP;'X.UVЧgE0D*DYkdN{O=?{2<B3U)vڊSz0H6sv0m*Юwe 86!a{d5{SqId96$Yʫ;gs@6~$@@j,GM/FH4Vˀi#'i뿹|(8ވUׄ,C^qCS Gx'J~ヒI-7(+?0wcqa?PK_- PKK>9OSGI-OPT/src/org/omg/CORBA/portable/ValueInputStream.javaen@)F>ّ nnmNq[K$ʩZÀG`bU}TMTH"'Ga^-`[~!H׫Շ%"a(B=#ֱ({P{a5:BjU%)GtxP0RM8zumAB@* m$>L*' g%J.X95 A}~S3ql\tZgM^n tAw=89'PV*N`֡nMãrdjh?2 6a3Mˬ\lu(|mJw.r i ߲n (I|.L lJ7 y5ThTК#:-EדkXzbsFI?86q<?:F(Y̴d_ѻPߏ!9 ?PKo qPKK>:OSGI-OPT/src/org/omg/CORBA/portable/ValueOutputStream.javaeAo0WQD65 6r []{w@y~*+is;  IKjv!~D W:(СFՠ:"$FY:!KɑID<}xv?APKƊjPKIG@OSGI-OPT/src/org/omg/CORBA_2_3/PKPKK>'OSGI-OPT/src/org/omg/CORBA_2_3/ORB.javaAo@q5$=BZH6IZcɲ]㠈Yp*H*=hwf|-ó`z_ `} ,yykH}- )x^XB#K4VftX$\D#^W ^bX-H報HB>p Znөxx4T3tzY9 mFlO)SšotM?u7u+Z 4ܐ| LUrbe攧n w\!XU2%q'2I$Y.,B/r,opi<[$ )L泫dgtxߓUH|; L<"d': YxAdݰV4F?%掹oaPO^Ժ&2^^,?%̳A!RҞE| ՛IF0Ī6,'[fF^Ơk1$2?}t Z--e(h޳*|"ujx ,Q`}f{OPK~>9PKIG@(OSGI-OPT/src/org/omg/CORBA_2_3/portable/PKPKK>5OSGI-OPT/src/org/omg/CORBA_2_3/portable/Delegate.javaeQo0_qT,i)ED>!'wlU^CD;T#˭C? IJDU% 6}Ki$KfOE ^^,hTAnKj+m8F7`%NCc5FVzɩv Z+tNIi n3SwS"ka_# ;5S"cJ4{N{H'U9 C^5*wFc (Epq:"Wc\FU^j0qo)FlMȜ%{2&_eTr'pA z!N:Ի2&˻h}8$38;`UT G|K^qĥ,"”fS%u ʄ~={C1 1PKuMSPKK>8OSGI-OPT/src/org/omg/CORBA_2_3/portable/InputStream.javaQO0_qէui=m]eh,W&^JGT -\ m5ܭ>;뎡2HhPug<5MqL5Z;:g=v]Hւ578*gyeUw`Ufc nY #E?ؘ^B`q:xy\,*Z,2>M!Y,8- ido &?EHY(ս%1%)jV!TjFR"h6cd71.7ѤCYFcq~ǁ3)r`9v36á,s#!<:jw ۲Ї %ՃMrlt k!a' ef0EÙ?ۻֲLԯ[?h?{{F 7fn3t_j_PKMz>;PKK>7OSGI-OPT/src/org/omg/CORBA_2_3/portable/ObjectImpl.javaeQo0_qT,0nVU}Bs )ヲYjyHdL."\`aUc(G I]+%a8N?/8lc+rdTLn$DK;Bɟ~2/NY<0h0iGh:bU5%5JC}ӣu.)` o>?;Iu8VE&7z_dԭ9X*ˉ#DTRZBTxMJWc8lJUEߕpmBcH.<.]n׸KVdNsd+,UN%!Yg20 uED5$VIVTjN^[V{?o+\4"w0cEL61ևQ)D-!kY@ҧ1<ҽ7y5(ۿO8u " [hF 謶[ۺPKӃAPKK>9OSGI-OPT/src/org/omg/CORBA_2_3/portable/OutputStream.javan0 S9%EiMXqڢ@#i7-K`CON8;CA?@~#t<}>--!+OSGI-OPT/src/org/omg/CosNaming/Binding.java_o0şǧSR1Hنj&7؞mBQ넭",plՈs{8] ܏ /}z֪a}Nāu؜&ƫMoXu+44"ڰVk3+uȽFgSqc5/:*4KL|(sߙŻ/,]!`&x >A8Y][^’yIc5B-M uˍVCix-\(_Έd[+i֒S]AQҽ @0\rQf[<2 օFXnxލN=~$)(?/S7rj,-kFtoo&PK9rPKK>1OSGI-OPT/src/org/omg/CosNaming/BindingHelper.javaAs0x 2Ԑڜ6f &(Ũ%UqL{W͔dv{O$ f쬬6b,*Ե Ϧ1(XN9[*cV"7 DJBbD?}ed g0KyAikH P nLIU { o0{y2.{XjR?M:Wujr~Ҳ0U!VZBTuRUc8dJ鼕 A#H4ty.q,|^etfs~d~or x=0 q>"r~Fr [SU+*Bd;!H1`djH/~鍯0hE IǺvsѰydG b(jR\'1зGx^.`o.b?cґ-.8Q;l5K s1OSGI-OPT/src/org/omg/CosNaming/BindingHolder.java}n@)F>ّZ6H4)Znw+ʻgƮrof\p W[biC$g@^O@ϣgZТaJ%4DniVУ˕p C0CKU5ۃT-l@.PZOIPk(Q8롻k2m8TCŋe/?u_u/Z 5P=0MT[`-(2H1&A@shҡpljY(i (#9%njkξ< 2ί ̝AVwx >gVa/ ;&I3OSGI-OPT/src/org/omg/CosNaming/BindingIterator.javaeMo0ўv# ڜ؏Hiu k!=]=3)$;yKi $|O]Ȗq|2Oy"Z}ArkʚGS(:N?U<t~/Aӻ|8_^E[21M`Ɗdm+x|==jڼ$Q^Ě7F[[^SgCny gPK}-&PKK>9OSGI-OPT/src/org/omg/CosNaming/BindingIteratorHelper.javaTO0>/SO-m P"5e8!=iP= Arh%p37F+C>4. *$GLc/߆GZE"$Or%8J4@niԯ'+p CKѩبj4CXX 8jBW­:;۞CMW˗@`7+ɤmېuCeIxvduZVh-C 0M8kZPXi֜[#Z4ΈqJ둢PmL peq6$72^M4G" ,ME&t ~*#|' 4E_YX'KV#K),V"jFR"hjaX-,9OSGI-OPT/src/org/omg/CosNaming/BindingIteratorHolder.javaAo@W|#Z6H4)Znw+,'j9μ`z`\N +qL$!rhvXEybЀ"ĚtNJy8/ GKU ۃTZ-l@.T:ϠInPkǨQq!07@9% YO*SGPkdyz躑Zn(zLU*X ҙS3qYOA/Sq _0R0 H,")^6Y]e7+ar?@|Q$^R4YFD4Z wNry(h?M:TM.MYC@k%]2`ĹಢġaN+%G2YC g5VeJvL8x(/3{%S{"Jn!ܳii׸T½=A b~w*g- PKA*JPKK>=OSGI-OPT/src/org/omg/CosNaming/BindingIteratorOperations.javauQo0ǟ˧8T Ҿm}iED >Mr؞mBi}i`˾oaPwVs_Ү#!+v׏_gZآEs:fBiAhR-*ަHXRn>a6f;8zq AB$Tדgx%21T .|j&pӷwNJqcqR+&9&lʋV=U=?2 FD\P#!FWRU_w2,V^͏B9$-WAPKաSPKK>6OSGI-OPT/src/org/omg/CosNaming/BindingIteratorPOA.java_o0şǧmM*i!^lU"a<`_;ȓ`ֈj ,Ɛ_u-,ƒt?z3- ș(PZ,%pkXa%hPB_0FC/U-4| R9h-5 j * t9m4[,Y;?O&]13eIPk'g$O>Bh- C[ $֚w 9;#UV\ zRXgIJuB{d$/ (6.a#8$e8.pqHNr0dd);@^$=)2ꃷx)|9+z@ YU+JmHrM#?VKE#ww|IP7^fLٔ7$xvIQ_y^8(jNGB84)s¡,ƹ2Ο@Kb=WβQPQ7xJ5={<~*~ g>BӱOu}-$YmÊwfѯd߫t ۺ>N;|fӭujh3gM=xWpo?HW/APKZq PKK>5OSGI-OPT/src/org/omg/CosNaming/BindingListHelper.javaSn0}_q'R1H剤يVUմn7=ۄFU} F2{α]xpSWk ~1,!kD_F0t0wHs47XHny` (Q]#Ċ+|EmpwA_ ǎb+[h$n`k|,PY ٨^ZzߧgqJKh%Ecu]P*X&Yޓ~՝/*ؒ֬UfSin0re;єX͗= F@18$$ΓD[cؽ6,t9K߫6t>&9jB\U|MIm ZK5g?&ZlNeI~ |KQcI&PKl+CPKK>5OSGI-OPT/src/org/omg/CosNaming/BindingListHolder.java}Qo0ǟǧ8)2剤يU4U\5c{ ~ [e-wD\\A ,ɇ1(a3-ТcC@iFhb z1|CcpN`}h0zA5PH報H na>p u/n)^ qh:mO^twӟmېuCeHsmL4_'}Սh-pC7`TlCZkA`A9U;.1Xu-31%M^ F~@ccqI>Y'Cnuvxu![w@2q#UGIVc kjXP=I@k$k> 9 t*+@7%]2`seI%Z OF3"[P+du]=k?`Dӿg=#x'x#m+^=,xHn3LW>h['֠k1=;$8k:?oPKO)2PKK>/OSGI-OPT/src/org/omg/CosNaming/BindingType.javaAo0 rJI{ۂ4ی+z*vْ&u}T. |!{''ؽS`(G̿(HJ -gamXztw!\*ECHNWFY5"lx +Joywx@5I [-&' A>>=Z7U52>}Q_l!_W: S™ ^87iaO4 ( PKD9vPKK>5OSGI-OPT/src/org/omg/CosNaming/BindingTypeHelper.javaS]O0}^~QZԥP؈)C!-<~7cy/%QP4pTs ?$ 3]i?-!|#>CPKpϠ=PKK>5OSGI-OPT/src/org/omg/CosNaming/BindingTypeHolder.javaAs0Wdg\psk}Ž0 8䔑a5* O&+LnZ{]pK;rYC,gD_f@WZѢcCnxbЀ!Ěv Je8/ [#@*Ebp [.DK(Ukw^gx'p?01*gt@j{Z kE]ׅw*SGXkdJ{r=?Zn(Lmȫ`(6H{Nyםz Vm] zLŭ3|ӺWM呢PۘQ\@R`I1d}ݮ.8]'Yz,g{WS@j6>依)BV-Y%ɺe5Bh$%֏Ւcoct EA@}AP5uT6e n7JdJˊJx Jg_YCc g5DwL.1OSGI-OPT/src/org/omg/CosNaming/IstringHelper.javaQO0_qԧuim)6DjnrzKv*:d1C~ƙ8B7{#˭8 ;KDU% x ~KX%"dor%sR %D1L񓌕Z$cai49{ݢ{(ZbirjBf@uOC` 6/ns٬Pġ6zUHL=VY CZi8z0U.Z@xiO*z:a:#׭;h_FRm (Cpeq6&72^&Z.d_dHXyӄG%'S]c|ƔO_F?!نr9GSe+JBwd'BCVˀd-pԫ\,Ͽw:u.MD͆AӮk/rV* ;Opzz(m!?#PKG+4PKK>1OSGI-OPT/src/org/omg/CosNaming/NameComponent.javaun@)F>''b-%p帆1v;kSՑ?M70Wh;X !!KtzL" ϴEs*b/ :YGH(3DBƒpMaFCh4yGAg5Ž|)Q; j֓۟ * uh>.A_H#e9xΗYCՃlZ0#o 4SbˬAA9{CdU; ^" m;δ1y"vd5Gu'jZH4_e4Ԓtu5oHu4W6- mJ޻ `N$JwBƖu~DZWR:rGx > zAD~`Sgwx7 xtf^7A-PK`PKK>7OSGI-OPT/src/org/omg/CosNaming/NameComponentHelper.javaSo0>)HۖM U=B&4iWfv ,Qma|6N~LB2E2$Or-8J%Dni6LJY8h;Bv "q kQ#=G@HуNM3x'p7p13Zi k:u]qL5X;I~\ndւ?0䊳֬eUiwᄬ`u̠)uF;*G@1 (8yԓƫfQE*!`&*NzQr?b HkM<"G`jb-8EU*JmHJM#VKKOSF8W/ryYPϿ=5 &!EۂVPxU^I k҅t<#zK`xUǏ4;H`st ۺ^9/e)i Q^UsB_k7YLU+ac[GI5,hӤTҹ?--uǖ>>PK\y?PKK>7OSGI-OPT/src/org/omg/CosNaming/NameComponentHolder.javaAs0Wdg\psk}"N0 8䔑a5* O&=+LNZ{p wrYC,gDf@ϓWZѢbCnxbЀ ĚvJy8/ [#v@*Ebp k.DK(Ukw^gx'p?01*gt@j}X kE]ׅw*SGb_kdqWpV  jī0MJ"u 9]w;.)Xv31U뎚#E?,1 E\$Cuv8t\dd)B$RH &O # kd5|K&ڢ4[?VK+ᎹI./QCBٔ5]Q+i (# (ݵcCk 88?pY)0`O#8lhq Y3 Ur\ɓHݺ}WirIBxp[6Z#ABu g{K9^PK IY'@PKK>.OSGI-OPT/src/org/omg/CosNaming/NameHelper.javaSo0>/'@{8[UDj8-=!E{C֕V( ~_v'L ˿ J0giie{9Z4,"b$ׂX@# 4f~IX$Ez FSOU l R9h,sj[k[w:=ww=Z:FpF4=tY;?mFs)S=֎e_~$Y`O# %^nirْVeiw,CjZf:#;(G@1 8$y'yInUvx>ErC6Y^$$K |Kҋ*#' ׹?E,ޒJp&ˆڠ4ZX puKryqPϿ=5fʦ&i%U lIw+FViWX<z̿`O 2;$J'Uѩ .OSGI-OPT/src/org/omg/CosNaming/NameHolder.javaAo@W|#Z6H4*Znw+,S'R9|Y`z`\N +pL$!rhXD^XA++46f%݆\I8g0 4=bZhrZ$KR5zquwCvFǍ`6OQu]zǡ2u$6IWiq\SR`W %^irUyew`u̠T:W{?)qI$.")r,%y䪀,E^&$K3=|M) tQlr)BZ-Y%_ɺe5Bh$%%p\$Ӄhӡjplݮht (#Tk%<,C g5Q<ډN $e߁xO Ujfo1OSGI-OPT/src/org/omg/CosNaming/NamingContext.javaen@<';DlE@Q x[!VwMոhgf&hs;,g IKjz>>?"W:(С}&b/5* A tDH7gBI6Z,bu%NzA@i!kHFC z03$x3xx5tE?0|k_8)gH./.ާ]V1AX9JW'jQ1k/&Dgs=d%IՅtKej+2 6` Oʴ cz?1)$;6yMi$|MmȖq|1Oy"W 9leͣnB* A:Vǀ I9f.(b#=tFL ,xb+5B %x!f'T2/(cMQ-DvS$]<+PKp"PKK>4OSGI-OPT/src/org/omg/CosNaming/NamingContextExt.javaAo@OvD͉ͭnjN0U`w;[U{gmʡ@̾ޛ&Xis=̫w II*r9~YD @VV0-!1T ZmoMK8C֐!BC T7(p3xx4 `y&s 2_xH#m۸x6Yӭաs` -;ޟ@ĞY;1 Z\#G+I6E/SKGV 퍑o؄YRBZ>)2"OG(lnJ X:ݥy ɞgC@X1E(}Ar+Ȋv-B_*vm/_ct$|8Hm.= fsmRXi>8HOjr^'іt(t ?GWbmi9;_PKس3PKK>:OSGI-OPT/src/org/omg/CosNaming/NamingContextExtHelper.javaTo0>)HM RHW4B܂&$MW-8?0: &Jo(V|IU@TI?O@ s0GfyH Zpse !Ҍө[w4V( gzsOU5Tl R9-%n8jBW5­Z;CeMW@`3+ѨiCeQut?x<7_ˆ۩VMQ-{Z6d];gk”HM]k%rz`zKyxy!dƨ@=#!bZ_0vT꽂-bqrzaYvU@R s PK6bPKK>:OSGI-OPT/src/org/omg/CosNaming/NamingContextExtHolder.javaOo@q[!&r{0ڻ1E5nD{gO86+-0A}U*GOG K_`ȵQ9,QZ-BdDηd ?:SA4ͼA7P(M8d `#+h\צGk%m;^œ]$\pBCwז|Lڶ EGj[Nc\E->2uu*t,jTX3k%ZDiH{JjE/SHGVz1?yM(D.,^6^]7+(Yŋ %2^iO_!J{\yd{c}Ɣ~-BaH`.72hlDPZʼnku XxJ֒uNryIz!t2kgi _NT v?<¿N_,;be:|8 5@'ׁ[*PMU͞} PKwp*OPKK>>OSGI-OPT/src/org/omg/CosNaming/NamingContextExtOperations.javaSMo@=_1Ɏ(8>⴨DiUU7][U{gmZrDUˁxޛ?s BnV99b:=w& VjXF# rs D !hYN!gTKƶ`4F! t k(y[\@.vsP,x0df3jh<,fһkeL؎'UZD'f?\35 %gy!toĚռ'Zѳi?# +GA- ?Yz6~ߩy.<>- (/79?PKFYOPKK>7OSGI-OPT/src/org/omg/CosNaming/NamingContextExtPOA.javaOo@S|NnMNq"4*Z1v`lEX>`}{o`덑Œf$De)0~1L-Cvp&2GeqZ"D[ +p^Ylt؀EDu5TZIőMg$X.xCwBAoKx0h6[PbPvpI6ݮ+U`O# 'm@Lm@yn$^P+ :d䬡W=2rM(EYN,grOӫ)\GILqFirO4ữ%7=N@6.cJW!C|;$[c.2hhDPʼnFSI2ٔ$h].7hy3C]HDTlx͌1"'KՑVk28'KmA^L?h+T(;}s/·S%>u }x+ÌOV?([{Bh=a\ޕ0À6B7 5Fj&I6T7QTc]n-U7hoYb57ث }/8?x_PK4p%PKIG@7OSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/PKPKK>IOSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/AddressHelper.javaOs0jHn-'ǡcfrbڒ*&w Lh&%>z{" Q ⫀ax5^FWZѢ`ZYF4gJU8/SKT ہTZ!,D[ځU{NOIPKǨM_\}ϓIu!;TXk'wIb%n|+gn1%¸^3r5S/; JOSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/InvalidAddress.javauRr0<θDe(3V%* cO&'LtvW/ pnF{i9CV|F U׋Ň9qci%s*dOr/KR*t"'ĭ(y+s cVzd,Mf7;J;tCZdCSIT({F#:p -vn=|{OQ}(š6u\6OXgcF5d- a3D˪Je DmkN{սNzw+ z#a/lKɒ5G2%s?eiA:ᆣ| y"N:ԇ:\je[ &h-GD?QG*7_, j?{Omt'<՟(Bo?,IQ/PK4HPKK>POSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/InvalidAddressHelper.javaOs0jHn-'ӌ{1jmId wn&4Ӊ{FgTA?@}U@/! a+-ɒP9IK4 nMiэ +p }_zةj܁TK!,DE@ۜ!!WZև>'NC-r9_>\kѨmġ2:M<%=SwneEւ0xLY+lA9[#Z yBXgIJq'fdO 86Ћ2\FY ]NopQgsUӄ>A×8qd܇x)|UaHVS.V"gkl$(ՆdGe XxJ¡;×o4 CUTk nu_@7Kpɡ` -r(b xuXc=lzT<eFr4c̐kT >0LEo->/u%~~HB23N'Ku;aN;MSUF$D6M/PKu9QqPKK>POSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/InvalidAddressHolder.javaQo0ǯS2e$'f+ZSHWrX۳/!QkjӤؾ>;Ǟ=,9ZY쫄P9d>8~~V =!+xKrX@ @;Ȉ?~uR+8 0ai49G@-4A5! r] *n !7m{vDlֶm(:PrVnv/Iî+Us`W#-;AņY+т JFSVTR+,zB:rгM(E΢,Φ^:^_WkV(Y ,<^i£/%7-NΧcJg!>CVlM(JGtX^$A _,8^u] Q`Zhy}i` GA J0ET΅|3kTYmɟPEQwut$|x0ރkL =?{- e bexxFi}4-_g"5VjɾV㴡:oPK*8PKK>LOSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/StringNameHelper.javaAs0Wdg(vrk}"mfN39ʰjAR%agi&N&M|0 CL<8H¸@5g@_f>I!s24XDnx` (Q tv|p)"d$AH AּF]PF h~ΠH~А+˨QB`vk뺀āմ>֚M-|񙨇[Q1o59^)*؊Xkց*g4\T>dJn֞?/ؘQC2w"w:]]ea9Dir/4o&#N|@Ni0!G /x<Yoes(~-. {2=s"mpxWtTzkZ{W2hd ]%u'6j-!k>hThWɒ|Ԫ$-H~GPKACPKK>KOSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/URLStringHelper.javaAs0W g\prk}"0@frI''fdRj" .`*Njm/9Du͙(reaȜ@ˀ/P,%jkH.~6\ ; 'b'[h$n`k,plTq>ӻ8x=23ZiRЇZ5 ؁8 քwtDݯZ[)rLUZVi9+u+1ΦjlIi)K |Q#gro,yU% LhS8%hTA{DikO}yOPK CPKK>7OSGI-OPT/src/org/omg/CosNaming/NamingContextHelper.javaTO0>/SO-m P"5e8!=iP=0Tzhřp37F+C>4. *$GLc/߆GZE"$Or%8J4@ni_O4V( '0SOQ lR9h,>pj[k[u:=w=#8 ρ\o_'mC9)'k'W".>~׵Z0`\q׊ 9]F8!1Xt-3i ayJ둢?PmL peq6$72^M4G" ,ME&t ~*#|' ׹"d{jgjb)8EeJRHJM-%D-sݭW${ODM.Ù 4MNU)<xnuwccu8GzK`TOt~4#A6Uu ۗwlBS Q Z+QsB'-A:24dƨn!w }H +^ke?.a,u+dG:FLҟwT}k# tcgJ6n?G ?PKBE^PKK>7OSGI-OPT/src/org/omg/CosNaming/NamingContextHolder.javaAs0Wdw\Da4SF5THx2]a$MrV}o؃`\N /JHBiϰ VY!\ Z]!$VvFI-At٬XıqLk2]gN]iރßtxsafU@yL$)xN8 2䦥gMџpۄQR@Z4)bDE~dJuz^@e4x[>xg]H28E(!l[,VM׭jG9Xta d#IPE`4" ĝMSK3Ѱ"[sBAsFхQA3cH:MbkA9M? 0~&{Z\)y<{xY-W7ڶt (2Xh}4-[ZAJ-;2[z!~PK'@PKK>;OSGI-OPT/src/org/omg/CosNaming/NamingContextOperations.javaUMo@=_1Ɏ\愉ӠFQTUx[إ ;k(p`ތǣ#ex2O8xyΙH'fmH 3Ԩ֘`A.yBc HQY!x%KhNR; uGhdk@HF@+YANY-Jr͠Z2s{Kڸ3%Wk~.3 [@a>~5Sch6hcRZ?>!p2w\!K$]/LPs_)Po|+k N(͹ve礍߬zIR\6" -I8Ӣ4NNïOC8!i 1c7CeޮLյUONҿ~+v%hAwPK/5u PKK>4OSGI-OPT/src/org/omg/CosNaming/NamingContextPOA.javaOo@S|NnmNIDiUUc nw+wM8JZfE >Fڬ,aч,&!*)Ts?a;LС]EOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/AlreadyBound.javamR0=7_ V4{kXF]%U]$CpvhcHUVmy潙n`ۓa\N_$⦑Bla GZd <Ȓ q+J>?Xn0Bɝ8{q%[XR Joits+7N0\pB˷5 ιS}P:j.X=$eZ,߳!k~wҰ eUذF61H'U=[ Cܛ֯60 $H'yLV_ q*Yr,>Y%Yʷψ'|K)[ueJQIRneT݉PŎВKjY`iN?|(Ͽ<w::\h=c~m2(ѠlC:5`GTee<׼{ 4ש ~I݃0!%^PKdG?PKK>KOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/AlreadyBoundHelper.javaOs0*Hn-'Chi`L^Z[R%Ǔwnɔi۷}F\Lֈb㠟 I? Rp!!ahl1gMnEbр gtV JC zRo0-H堶HZv $dZ#fߧs$y$Ti},:o85M)Sʃ֎nKOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/AlreadyBoundHolder.javaRo0>)HۖI)zx!֌&$.4`{ߏ<J /w Hd0N?G߆GZXE"$Ors e!,O2h,W.) =` F3OqT5TR9-9j\B*[k۵:=w=8FpFVS 0כnsd4MZǡ2DtX;$['}խh-YsC7G`\lC^k@`A:sʻn w\cjf:7{մg@mcQq6yؓv wj%xAE\8MhZF:x' ܷ"d,lUgjM5+JG#)h4~ F;ڭ\^h: &"°,txp:,KA2`d>Yq+ҸV0Xt8]ͣP+pQQ1x׳TLpCƼW:v]mq Gm 6d-줮WNk' PKC&כ2zPKK>FOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/CannotProceed.javaQo0ǯSR1HlCHɪj*.6!Q넩ͦ}|w+^n ,OLdxB×(v)2F8) B!HdVLb~6\$Wfݣy,d;3{]! (̷4 LOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/CannotProceedHelper.javaR0S0SfP"oJrLɻJ\2e`[&GAja(F%u-Óx 0baf! 5ȕЪ-BlO2h N!`/ FAb[h:$ `)khN&]1#fVz&WirϺQ5:RNj pCT/h Hk^J/U5L)r~2R6`8t~6l^ ɳt>A4;eT  vw #9B.T k:.l#2Բ/}B("!rbvoH?V>42 G jN WtVd%ѻ>7<B\o`deb B}kOa7,8 eR?g,D{ڡ;|gႰTSț7Zu(4LtIg~jYQCpEPKSO\PKK>LOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/CannotProceedHolder.javaROo0?OSRe$mˉlE 骞*^5c{ ~=Uql<; bW;bYC$g@矦@ϓoWZXE2$r Khd!Ҭp2h,WN9}h8MrX$ nap n (^ j3jдھ,ݳsNڶ Y8T.xˏz躖nLmH`-(2HgNyխj Vm] z[gqG=i$/ (6&a#8$zd}]&Zt,sVgyNV_!Jo{O)2{m}!GDOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/InvalidName.javamRr0<θDe(3V 'ϓMδHojwWXhdw3diP%azX|g?F9Y2Bf$$eB*2p{B܉22VjpLdv)G+Pڡb'=9HR(mngdJ8r nw pӷwE08Ԧ3Frzڨ߽4x{XU) qiz0IUa uFn{&?%c @RLpI1$kY!8]'Ye%$KyqoIz7qd|=u;`y~EDo$Y;Y5U&@F#tdZiZXyF w:Ǘ( 'CRTLV3&-àD,>QȊ~>8N9x7\tNgx [)"ÂY xPKr<PKK>JOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/InvalidNameHelper.javaOo@q5$CjdW4q]㠈Yp(jԖow| ̔Q dgq] l29 ?"^iaN̆ʈɵ(HZ*%pkXc~%odP΢ `/ FSoU-4CXX B5G[.ztrOB@Ckđ2ո>h:]{ndMւ0A$82C S89JBDɪŊR2'MoeԢՋ|qp?'fʦذat̔ttd@Kpɉ`ᠨZ\BWT3 <z鋵`7DO8=4Q,A3m Hm]Oaw`䳌r_Q?Wm([SZo}2!CX>c8,X[6oh4S%|ָ׈#c~ PK-MPPKK>JOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/InvalidNameHolder.java_o0şOqT,a}xJ)[UD>U&k)w*4u`j`\L ˿pL$aVh \YC5+2L;˕pc/ K[T5;T-l@.PZv]InPHh9)ڶ YG*SE:Y,|]7R`g 5i*؆XkA`AZsS;.)Xu-3mJnƽ3#U?ؘQC"Γ|MnUvxu!["K/u&FF9o@܏?E_!lUd5| &Uڣ4[Ko#xsݫ^>( oDU] eSVa_J:|pz<͆Kd >{&xIzR.Xt7[]ġV sg1=czv8AO/ 5|pO~18mZ4.Tp`5FlsWogSSPKz3uPKK>AOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotEmpty.javaeRr0<θDe(3V 'MɄZ^t Kݝr&7$LOs,ei%s*dOr/KR*"'ĝ(y;s"cVzdlMf7{zK!-v!бA*Fit=#WǑCo`vn}u_hPQs>YbU6!kao/ ;ޞ :VU-kmm jCsګtRsXs0i*i޽ E#[ ؄$.ER=CmxGACx,S8/荄Hr'K^ԄZ(vL+V+OV:ΥwEQp<'ڦe,rtt?/뷜/ FTU۹q*+op:Hrl:[D蝆,FsPKm3PKK>GOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotEmptyHelper.javaMo0 rJ OI{rrl5VCQG-i(G%nt(>ˇYg0S38#H\Ë<1>--ȍQZ,pH}$hP.>aЇT5@*E֢B!!WZ6>'^CtN/zmӟm3equȵx6OGneւߍ04*+bx / R)O,CjZn:#V;2퉑F@q (8eYEuzhe< ],Me&UHQ|O@yXEd5b-rM /JE#i"hjaZ,L%jk.h//DN3UllkdLI!mfE_#80#9j=]~boE{e"a5Flj ~-gBѲwjDA[[xEqXѤ :Zvg-I/E6=PK9`aK>PKK>GOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotEmptyHolder.javaOO@唠ILHUdWq(6Yc"wg6">μ{;; ,w|iMBTURa|:?OBV =!+x+rX@ @;Ȉ~uR+8 0ai49@-4A5>GC 6Z+i *n ! m_vDlֶm(:PrVnv/IC׵9o SbìhA[E^#[+Ir NoL!YihhόuM(EΣ,Φ^&^_kV(Y ,"^i__!Jn{\Lyd)8] a{$g0[s4U6D(D`mu XxJ֒uF 9B >^T <C'{{- 2 Q_ ] u TSUgz_=㴡9?PKb1fPKK>AOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotFound.javao0ǟTxxJSE)U4U&9`gC@U!e=4l}s_ʃ+TӢXYf=O\fp8?;EHР`H܉ jB+j#1BtګNo$v5߁Tj! ,E + BBUiU <ja9sJh|ܶoemq0h=1SX3 iNu5%BSNj2 ֒74B#Y-EZچkt20VEmOL;2R6.0;p9O?8 gaM,:0" ,TȨ5YԼ@(B=!ɔb-,\Ͽ9Ժ`2_ ;,!lUa){H(s'>xNcF{J"4VJл';#eGj"q 'pLf)=GOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotFoundHelper.javaMs0WZN!I39 {1jmId gN&)}W,3(5\9Ho\<0f> -5ȭQZ,p+H]$hP.>ׅzتj4ICXX 79jBBjݡ­}:OZ8N 4}-_'wZ9m2'fʔkddDU ah&/-(4H1O@yXEd5b)rM /JF#i"hjaZ,L%jk.ho/DN3UllkdDI6t /;+Nr׊Z`E|<^'fZھw.]F,[Xs3= HMUa/[2ZVNW(h a{sߓPޓZbo2ΟK8y}ABƉ*hK˩F;Fs xPK{dxK>PKK>GOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotFoundHolder.javaOO@唠IL*8qB{jnw1w6"">μ{;; ,w|iUBTURa|:?OBV =!+xkrX@ @;Ȉ~uR+8 0ai49@-4A5!GC 6Z+i * ! m A];"e6k6qm9Z7$[~dFUXHˉ7raJ-"ԭ$U9 ^4jhό& lQgS/rқ5FUe ir4K;'S@>cJ?~!C|=3˭9*Q"zVq"0hk:,L%kI_oryYz!t2\hЊegi6<_> JTWMt=|Q{MWQh%1aFEcaP7 j5xײ{QI+PEmܮi}0=[Go@5Uuvc )~PK;1fPKK>GOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotFoundReason.javaOo@q[zpiF&Ibf[{AQ{g@r7FGTW[# A?<(!( )T?[)-hggr!STP5 BPR+8w^LVP-(MP[di!ޥXH.\ tzET APlQ4䣢E8E-SwTւ4xQ1U*VZ=Ҏ1ʇ`uF0lҒJ{dM( IN$L:\|_-: Z1LYC0:re<*0tu B[$[a*3r4"G-ʼnBSJ2$h*4<3}]THl跏Vwt&^U_H ؑs1 ˽X"l7O҆ܕL-{o:L*Qu)_rCK`<˴edzSMOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotFoundReasonHelper.javaOs0*Hn-'ӌݱI39 {1jmId gn&͔i۷}FgTA?@}V2G_C_CRhX0r&"GiFhBst+C %ႍn7xj[Ac<pv $Z+jߧs$y$TiRu9q4jۖ=1SUFYuWu'+ h[r ֊ 9[#Z6ΈEBHPl\B/ zpfQ6&&}a.BxT$1KhlxP5IFS `m*Q /sF {#JdSec^!;\J:ܸ/$͂Dx 8]+j"J`E4Կ[v𬱞4?;R{su^,[Xs3 HMUM`7̇2hJS?W(裢V_C|O<yP+)aԍ'ul4j>X954 -qH.PK֦PbPKK>MOSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotFoundReasonHolder.java]O0_qԫui֫Pʈ))C\!79M9g; 8 ~8N`j`\L ͿrL$!2hXD+^XB#K4vf])@cpaFhjfAc– /P; UZݮ(  qm}9 9e6k6dPj&Y;$_}$îk)Z0o4*؆ ւ2*w`ֵ̠ǔ:7;*#E9@1 (8YCnez(ˢdrH3Xyӄ. Jn[O2{m|})BxdazKVchjXP=I@j`11׽z ͂zAt*\*aY*}n6/} (#r2^4;B z> Kž=A24<OSGI-OPT/src/org/omg/CosNaming/_BindingIteratorImplBase.javauOo0S:D4R0?.Bؑ%@U ^F,UUEH;Qg,񝌕Z*7̦lq%NG+NPڡ =9HR݄6HwL*.v:^^6B z|uhPġ6uԜ{mti}ө[Ր0'JQ0k#hQӞz0IU/a uF{Fc 8Gϰ$_zd5.tlsd;t,g=%f x=v;`L<"rW}F K^ԄZ?QVZ+/V:ƭ7(8^u[kmSѲuG QyQ:`+*'p$̽Te*eUnNJE-3hv\ڷ)x7o|'<#xPK`O`IPKK>8OSGI-OPT/src/org/omg/CosNaming/_BindingIteratorStub.javauR]O@|*O J[ɓ XE"TUlo;n%.`ngggf=9 ZY 웄H))t0ߛ:# s/6"/IW?,fZAJ`Բ1yf{{*(kvRl?}?ǥQ>^F#rq!3=]PKRdA2PKK>9OSGI-OPT/src/org/omg/CosNaming/_NamingContextExtStub.javaVn@=q25$6'CHc5FQU̦Ơ,ЄBԨ47\{_ДTxd + >s3"8AcŵеQ1r r3B2eS4:86*W,T搲)i H\Ð'8 132͖ nF wQhM Z3WD:OSGI-OPT/src/org/omg/CosNaming/_NamingContextImplBase.javamn0S |Wvsks $rTZ&**IE1{Hu@pfW4ɪ17В0?Mϓ8lcrdiC0U=Z' $$*S$Ѹh(&7dZmQ{6saxAEPK&jCPKK>6OSGI-OPT/src/org/omg/CosNaming/_NamingContextStub.javaVMo@=׿b "jHnmNjd"LEU-`6w5Eb7!P;7#w8̗'3ͨ/M9B=lkvF6R59.!XsC!bT`f^"z;mJs)B4FB,e[ 5Lys\@$Vr3[SX&p]cȉa(!f 0S^f;,]fJt*Vw ouu)R~+"œ%XElB\SVTge]*nHڠԔL6O ȴIf4=/ög1\yA?\G?8iet.reMn!# SYQ9F|#&%rT׶&7̬tك:C>@+KT}) .Lh 7(b:<7X#㓬6P}7'6[p+esZ+ܐ#_zJ(V)sɩM$}j))a͙RW[-rSEIî*d'&KxdD=,_Yc+94xۮݶ'8ks;Zō\6wUO,7Ni70OvmCs;s *fz>j$Sgf>J^ }1e 7͓ &jWqPK\Y PKIG@OSGI-OPT/src/org/omg/Dynamic/PKPKK>+OSGI-OPT/src/org/omg/Dynamic/Parameter.java}As0Wdg(8>m 0a2]ԍ'm9OWjм[3HLӛZ?w SР>`3 :QG+7V|p)& &ci2[8Avв$n`|*QYJ٪v38x=da]P۽#[>a;RasҚp/I~O{Ѡ1g5M\ Q ֆ 5Z#լtԽ斋#wgMōռEhi D9n<}go[x,J:4em&Q_dRdv&wq^r 1OSGI-OPT/src/org/omg/DynamicAny/AnySeqHelper.javaQo0_qTY}xJ*"`KخFאU]Ux{}wYg0Q58wqY &9Bb4: " iaȵ(-P BO4V( וzhU kA*E֢DځU;F~NIP+ǨMO뗍\l_æi"')l>uFh-!ǫ&*VZVS1 Y`5̠ɅuFjw?FbczqIփ8KЋ&˫f bϗ,tt>MI:oG2m>)BxV$dM5+ E#h4X-^pA@9Bt"UDz^QVqdJ ﯰ|^.;xYOgLeц_)vM ̌AW .1^ka[8ry][%r79/-UNfԵ2(vD:в8Q9]sa=vH% 'PK %>PKK>+OSGI-OPT/src/org/omg/DynamicAny/DynAny.javamAo@OvD͉ͭnN𶰻BPYVI[ vf|M|촙NzyQBRa}ݾ 6?w:(С}&b/r'kTU脐QgZuoX-KzA̠45V\! j=mt:YT< <."/k_68)gH./.KwǗ qґh?+1:QM`Ɗm+x\Sˋ$ʫXSשі6twP$i3+(lb _PKW=PKK>2OSGI-OPT/src/org/omg/DynamicAny/DynAnyFactory.javamAs0 76'b;-S̀LB,X-H$BN{V6m9]*+(=, 򳀤ay^W?wZ(Тy:"/YwDH4+!|CcpasigH`HB#:| \zF;*f U9F.hk7s39:?8;Gʴqw>rwM١` 9&`8c#(5H58OSGI-OPT/src/org/omg/DynamicAny/DynAnyFactoryHelper.javaTO0>/SO-m h2irԐ؞4D4L Zmc~$`tkDv0#HLrtz86 2,<- !1xKQZ̡9pkH3N?~BI8 0A5{VPrP[$aa%J \Utznz9FpF4]^tY;O&Mӄs*SL-N.<=JSWDkZJ4,#%k@`AsʻnpBcjf:#쑢PmL J!Npq:$"ZuXDe|BY2?q2s732{m|)|)BcaF.VS4YԬ@(DTZ2{RT1- MzDt"aPKK><OSGI-OPT/src/org/omg/DynamicAny/DynAnyFactoryOperations.javaAo@W|#ZT4Z/^vK;kc)nz@˼y*+X)=QL ⳀiazX|?BrEeHNpKd!֌g;+pS/l-AAg$])2 S8OBNHV#ച;V# @ij 6hc^~PoDI Y+x,e=eI94"nw M_woÓApWr0= WY~^bFhF/o'0&ӽtAJw]eTsԸ PKZ+PKIG@5OSGI-OPT/src/org/omg/DynamicAny/DynAnyFactoryPackage/PKPKK>NOSGI-OPT/src/org/omg/DynamicAny/DynAnyFactoryPackage/InconsistentTypeCode.java}As0Wdg\psks"2k$U&L&=+viIOO>mr,b򳄴i$*A0\,>́gq"(!IAQȂ?ƕ9|'Vp/`qi2 9b`/zd=ͧ$>qm4gK*/WzܵU 9~urŻ06؃%^:PVz98=Z 6t]߄K-P$-!+'pY9&z(|JX\7&[<4Y~3z46T2yE( r/kZ* Vp`Vz %Q9 Ft:RjEuWv0wDL)GpFf0UVr]\{uuOѻ_<3_8⒯s8]PK=XPKK>TOSGI-OPT/src/org/omg/DynamicAny/DynAnyFactoryPackage/InconsistentTypeCodeHelper.javaOs0אZN$J2'w LH˔od 8ҭA ;R0yi0J sh6GMnGi1Zhb8]BIF^EjX R9-%>r*ݡ5­w}:OZ:FrFV\ӟæi"#)^kj]}$Nh-U C/[`8[kPXa֜ԍN"VaM.3bYОiI$Y.,Bor,nһy<[$WsiH=]C<{lRdqw2#Y\dQP4&o%۔ݫ?A@9Ft"UDztf)~Ɓ0%EBKKF$S ['*, ]qQOToƔl2IqDŰaft ml"tS"jDNc,wikXYW+9];YubtF/Mݜ?x(!һe PKrPPKK>1OSGI-OPT/src/org/omg/DynamicAny/DynAnyHelper.javaSn05OSGI-OPT/src/org/omg/DynamicAny/DynAnyOperations.javaXM6=`O{RVhj F2TIZE"2G3'_M,TkQ,L_u-ח?΀H߰vhPHȃsVp he!mafQ$N.a ·+W-YRYh a5rl, \훁Z' ^8P[Ȝ ] فm~ϻKg(]`ko2Xw5jo{` lK\kց*4gciaf`Ti;ѹ)Zl[(hG6&YVC5Hg1/NG~f$(7~iB!,]p8׎^zF< 7c!wnz꺑k?OSGI-OPT/src/org/omg/DynamicAny/DynAnyPackage/InvalidValue.javamRr0=θDle丆5V+$* &ʦgo{*+Xv0>83Ȋob)`zX|?B GZɒ9R2'%)Kt"@XgឌZuLdv)A(^Hz*u iGip9#W#9d8rC˫%ЍOK}IqM3Fwr돬z*Iւ?0x7k؃6!9UF89Xw=4Έ]^O#[pl`{d=n!8$YJ6I+#H#s5>-BAJ^%ٖJ%[Su5Ad;L#V+O#E#_(8ߞuSAa#X ??πv,B D#JQݣh8Rϴ8pOC90\Ng /~1~Â,Ɔ PK9PKK>EOSGI-OPT/src/org/omg/DynamicAny/DynAnyPackage/InvalidValueHelper.javaOs0jHnmN `LB^ZYR%ǓwN'$IroI'0ѦxdW)?O@qx t@vELJpT U!1ӥ[ Z'x uKyhu kAiCB"=GA(2Z#fߧs $pyg$gT`iTw{y4j&f{Xr$Z7J'y>H]յXU KZ`8[d h Hk^ /T9׾aM!bUi)%9y.<͇6]^fKMdLg9d diL9=}d~tHQ76L@"yE rFSeJRo* J`#E%?OSGI-OPT/src/org/omg/DynamicAny/DynAnyPackage/TypeMismatch.javamRr0=);=IaNqlIHr\O*1L;mi>UWfT=L 6'iH(0^,́gq؆" О!ܑD専NUhR#$u\ d,Mf7bb=tAG)5|ȡ^0\p%EC}X:i.Xeu^߲kt,Ȳ°*)=h 5ޒ'U@Sl%c &i Y9۴y ϶7-ܧEl]¦&_el#|#seRrP"pIΠIN>U ږ\V@PK^?AIq?'붎W-T ?.t{N@d#Xv0\+<r6w<Є{ތ4/[3xg88K6zv16EOSGI-OPT/src/org/omg/DynamicAny/DynAnyPackage/TypeMismatchHelper.javaOs0jHn-'hijw0i&G!/F-ݻd}'ktLn(6|iY@TIпχ@ @fyHZpse!Ҍӥ[w4V( ^zhU kA*E֢D{ځU;F;OIP+HΨ@Xu9q4j&d{PbTvtOI6O]Ս,Z0&^4Qq"֒5 9#Z6ΈUNB{dяЋ2\FY mJop-Q ,^iBO JK̆{m)|] aHV#ki4YԬ@(@j 06cn\((ވUUVJH.I% lEY0ȗƯVDN|?|'?VMě}6d]=mY# 3VN׫J a{/砚}A?!8XєȪ7sjMUN#ݼ5$%vH.~PKwfK8PKK>4OSGI-OPT/src/org/omg/DynamicAny/DynAnySeqHelper.javaSn0}^'@BFDjڃq.[bCU{! [7$=>c{xLn(|iY@\IпCAahl0bр[#ĚqtBIF^W ƞU5TCXX9jBW5­w}:;th^NY;?MDl8R{$YvTwneւZrliRْeW,Bjf:#;E#Y ؘ^A2Β,$w:]]<dzErA:I:&$ij{̦! EF}Qd ~!C-OSGI-OPT/src/org/omg/DynamicAny/DynArray.javauMo@OvD͉ͭnjN0Qaw6~;ϼp'CZA^~&Hak(|-#V"{PZa5p'D9#KJmOX̡KLj^L "k:5AxH\#eڸxnvY{١`@;>N 4SUȬAA9GCdUA/Su{coFnu&$,rIyJ_<%EdtWB^&϶!3>}${i 2gm|ID|Ш+XQC&AzA##hz~k/QON_}Bq߼;=U=K͡i13OSGI-OPT/src/org/omg/DynamicAny/DynArrayHelper.javaSMS0=׿b'Id-2Lpؒ*1ޕtHZ(L}>}49 fJFkC>$* *K$GLcQ#-,Т`'jF4+c %$}i0:b-H堶HJQ;t/nY9T-zzݵvNL Y8T[\ųyzTeւ08kiRYFZKր2 TsʫnpBcjf:#텶H֟(6&a88{xy\/&Z,2H!Y,8-)2x$S8SqOJm%Y\'kYP I@c$04c/h'CUy+Y%x$@e ,#;%#a%=n0#7OSGI-OPT/src/org/omg/DynamicAny/DynArrayOperations.javaOo@S|#ڜ)T$ZÀWb~DrZ7߼҃KKk^m- ${a]s&rlz t~3kH@ -Q,j[P.Ce `4FkgփZ F}F hCő!7EOZ6فؗ |gWD=5\ě"mfH H5+u墚FgSpc5ߴYhO4bcFaQ603yV,OSGI-OPT/src/org/omg/DynamicAny/DynEnum.javauOo@|OvD͉ͭnjN0Qaw߽6ٷ6 6JOړeJt Y!,!*PN Z4OXGETX k4Ns%{4h K߰KՍ@*E u\v@*m$w:3xx5 n|@y8FL)ݥtO?28LU#vbe@攧 9mV5nLM:Mh/lu&$,rIyH<$EdtWB^&϶!3^}${i 92|W B.HVcE UlMhZF#hzY-^p| x!N:R}m')z9z8rC~h.3CYۿ6yqDZ烏~')^e?PKwSPKK>2OSGI-OPT/src/org/omg/DynamicAny/DynEnumHelper.javaSO0>/SO-mJ7Fjq^SCb{{ND`6׋'GLֈb`G_De)Óx ieXz%Z4[Cb$C-s46f~1|GcpNa~k0:b-H堶HZxQ;ton, *shzZ?sqNL Y8T{\Ƴ"$+Y`g- %Z`\qג5 9]7F8!1Xv 3iraYJ{Hџ6&a88{xu\:Z.*,a,U, D/ǀT6>!EBf, [fΠY)S߲- }/aJBD>9t^Rf]wԵrUZ3ӫI+6kIaF56OSGI-OPT/src/org/omg/DynamicAny/DynEnumOperations.javan@)F>ّ nnmNv[*$)À]QwM$z) =j-ʽi6$$ *2#,ow3߅a* lȐ(Y܉Z'x3sx mp/` &cj2ujb a2j, v38x5"#hxWmA>}ˠ:՚.ZtS"c@ӏVhx76LY+AiRrԽVrFGMN&jki/-OSGI-OPT/src/org/omg/DynamicAny/DynFixed.javauA0QNɊBvOlmQ# Ȩ`YZ-=7FP{rV#!+z>~XE~ i@Ȟ*kd !Ѣ\ +KJmoX̥KLj^L "k:Jt?+]f _PK#NPKK>3OSGI-OPT/src/org/omg/DynamicAny/DynFixedHelper.javaSMS0=׿b'IdOx&e8udylI1B ڧu&Lֈb`GDe)ãp t2 oXxZ4Cb$C-s4f}e ?X$Sz/ FǞU5TCXX9jBW5­>=W7=#8Vρ\/鯓I4!rxv6O>~Օ,Z0g-0M8HkPXajNyՍNb V\ z\XgDVО4ID)N4NǞ:^^$WKhRH0K2Nu1 EF}^d n"IX$dM5+ A#h4~枦puMrDt"7OSGI-OPT/src/org/omg/DynamicAny/DynFixedOperations.javaR0=/_1)YQHDl%UjOL 6M'jƞ7o{&4U{ |=AT$d0_7! lѠ>`0#:YGZ2V|x@mHI 0uXbP4b,t T#1IUӎzӜ)CeV0\pC˻ŽOm}@*Xu_^h hޑfeUXk-zPDkV9ս&KB)XMYg[#[plB$J!N'.Jw$~v%xf Mw&-D|ȑ<9`<"$,ɴSI9[U'*JPKv-ꆌV GSSCV _nPy7GI ECy$vgɱYԥ-ea>y𮾊 DYvAN׻ʔ5N_4؈V?~> b4T<8.'2~_PKpvPKK>0OSGI-OPT/src/org/omg/DynamicAny/DynSequence.javauMo@OvD͉ͭnjN0Qaw6~;ϼp'CZA^~&Hak(|-g#V"{PZa5p'D974h KC՝@*E uxP; 6;]*f ut?|j^'p3;9?8Gʴqw͵>rWCk w|@hđY;12 ZsS67 ^& ƴFnu&$,rIyL_<&EdtWB^&϶!3>}${i 2gm|ID|Ш+XQC&AzF##hz~k/QON_}Bq߽;=U=K͡i%{~xv(k&/H+Q#7[^zsO3WPK c%PKK>6OSGI-OPT/src/org/omg/DynamicAny/DynSequenceHelper.javaS[o0~(OIo[hhUBO1'-؞mBQcB^VxnO8ҭ I R0'(aVh0\bр"Dq+c %$`t)ZUCZAm8(v $pUZ#ܶY9Tmy zݵuNL Y8T{\ij2]|&KY`w- %Z`\qג5 9]7F8!1Xq 3iraY힕葢?PmL J!Npq:$W<\UZEuH!Y,Yu,Dk/c@tNl _~">Q{KV#),jV jFR"h*aX-=M)*^&A@=z"j:TU[*#ٞΨK`g/y%DJ#MKS}6=<_~?'[Np%($옙zJ6d]X; S#];%rF4<>d@]ռPMA8NXQQȪ֭ƙ铥?Z緘V3oOj<fPK1.E4`PKK>:OSGI-OPT/src/org/omg/DynamicAny/DynSequenceOperations.javaSn@=dG.>mQS(*k  tw1FUHNR/7ҁKXȺS.OSGI-OPT/src/org/omg/DynamicAny/DynStruct.javauAs0 76'b-S̀L2,XSTi a:]٤L{6`Y /JHN U!,!*PN:OXGEB将AhNJh 5,}b.-V7^bb !4C TPhyάIqG.UDd>88Gڶqwu>rSwCAZv|@đY;1 Z\#G+I6E/SKGVz #[ \mReE÷IQ$!ݕɳmzHW_ {mC@ೱcJD| 3XFVlMhZV#0h{:L'{I[ x!N:}m'%zY%j p,96Bh.dPM^&і|QI_WLό+PKB_!PKK>4OSGI-OPT/src/org/omg/DynamicAny/DynStructHelper.javaSO0>/SO-m P#5e8!=iPwӀ & )Q ,ax4~Bia<Ʌ(-P 5B[?O4V( G0GѱhU kA*EVD;ځU{kpNgNPcg@9Mw9u2i&dPbRvrgrݯ%Z Pgy-Y+ )1 YkAO jG9jcQ q:(ӱ'"/̒i9=}h~ ?*#' ׹EH_XX%M5+ A#)h4~[-=M)*^ MzDt"f$ fРY1lo؆}-"{F:G)߶M.Jfjw&Ake?a,uԎhj>S4ZK:_HkѓڽPK]PKK>8OSGI-OPT/src/org/omg/DynamicAny/DynStructOperations.javaOO@SrJP 'hkAmhbO-~&Rr}7o=:&jW䓀(ʔ2? | S40%CzMZ$ ePˌ4APaʏngwPN1mg΢U5؂TjC! ,EA@O)UTU\ }ogpLA4 /0p} z0qd܇*&`Lܞ"$Djd*JR-OSGI-OPT/src/org/omg/DynamicAny/DynUnion.javau0<(dE!['6I[$HvG2*خmEU߽Vjc?& 6JOڳeLt Y!,o!*PL Z4XGETX k4/s$4h KC՝@*E uRv@*m$wU< < .мk^'p39;?8Gʴqw͵>r窣Z0} &*qbN ǜԣ!G ƍ :C17#:mI iLЋ3OSGI-OPT/src/org/omg/DynamicAny/DynUnionHelper.javaSMS0=׿b'Id-2Lpؒ*1ޕc:$-)L}>}49 fJFkC>$* *K$GLcQ#-,Т`'jF4+c %$}i0:b-H堶HJQ;t/nY9T-z zݵvNL Y8T[\ųyzTeւ08kiRYFZKր2 TsʫnpBcjf:#PlL J!Npq:$72^MXDe|BY2?q2/o[6d]}6,ф)2߫6J5y|P5!;*1dwH1!v,8*XQ>Ȫwv-[37{Hg-{ל'۵ֹ>/PK_PKK>7OSGI-OPT/src/org/omg/DynamicAny/DynUnionOperations.javaOo@S|r"9'mQR2NvFU{gm"9Jݷy'0WuE0Na}@Ogc-) Ȑn) "%i(FfnS~ ;%mp`akt|jb0)TU`v3P*r5B@;]kiu>Jr5p~.߱ԍ,;Nz];P{V9םVbFCM cH$GcC 0yA*X+/:\.{  ж֮)\)BDBLMEʭɢP-iAMƍհaJQ v/WhyqҾ X4W7 gɱY9yF2n.m-{ǁw(/W灿_ xS^%Z^x" C;}TI< XS+Z+>8 Wenl셶Сc/s|NmW ]PKK>-OSGI-OPT/src/org/omg/DynamicAny/DynValue.java}Rn@#숂[ D9avw AU6*y`d=9XV+˯Iבz?" GZ(Тy:bO YwBH3WBGcIIְ\Zn<ŤR9,2YhC P^Fr+ǙC`ͧ-EssH6.X.+wXu'; ȰBJYk'FPDkkNyգ!G ƍ :C E#[ ؄ERBZ.6)2$[~w(J 6=yƧ/d=Ͷ! GsYeE(IhEXQC[ ZV=4_e''/_~POIGo$EOU"@GΒcsh8}mieO>Jt Fj6+PK'PKK>0OSGI-OPT/src/org/omg/DynamicAny/DynValueBox.java}O0|QN*toȟHȨ`Y~Zeժy.;(=jN3Aܶ$d0_/Crh^ Di^Vhb-JM%<$܇+{l*bT=tbك,"D$@tgr$2y,ܠyW A hP\CejmO6ؽcQh-ޓ቏#T82k+PDckNy#,  :C޽ 7#~+؄Y\@R`I&Kx8 rd69$YʻO/5IK@6~$@|P+XRM%&^4zE#y"h:Y-VަpEA9Ft&܎RtTr|t,96\|mkuft7YCvܸuxc1ʍ:G3~PKKƶ-PKK>:OSGI-OPT/src/org/omg/DynamicAny/DynValueBoxOperations.javaO0SrJV){ks"ڢn ])20`SۄU{ QFZX߼w e)^l D'~Yr&Rdn ?r1R 5f.9X;ИA#2T`~RZ1<\ u'0A5ME'XBh4א)TVur=.zFrF5s!0C1kebW+Ze/u_u/JhXMT)Kd-HPHwFZVqE1-s2&(4N x3?5y ֟5<e QA#| FF90!F|#19O5Q4@(FUqmU`fmJ^q/95I*E'XS_tSn%͠=4]>G[ޠ,S\Vg5Λ|fKj(llE*^sۑ U5m}azubDi;3Я/15uWW+f핌sOOPKb&PKK>3OSGI-OPT/src/org/omg/DynamicAny/DynValueCommon.javauA0QNɊBvOlHȨ`YU'ʪ-=7FP{rV #!+z>~XE~ i@Ȟ*kd !Ѣ\ %%6Z7,bu%&5@/&`5BCVJzFɝsfOϳ::h^5׍ }~Nq=OSGI-OPT/src/org/omg/DynamicAny/DynValueCommonOperations.javamR0=/_1)YMuRjO+l6!wP).g߼Lt- 5rY n[D߭VOЗavh `dd)B$,92'mI>-BFB.ƒj*ٚlz 4F#h:Z- 3OSGI-OPT/src/org/omg/DynamicAny/DynValueHelper.javaSMS0=׿b'Id-2L`8udylI1B ڧu&Lֈb`GDe)ãp t2 oXxZ4Cb$C-s4f}e WhP) =`ЗcOѪ*ւTj!,D!J]+CeM_@`]kɤiuCeIE<;gIuRh-U C&Ued (0H5'd1Va=M.3"^hOs$ t'QcOr/ϓ%\GE4_g)$ %x's~1 EF}^d n"IX$dM5+ A#h4~枦puMrDt":J3|̒I6L=AW .cؾeh”E|U%rt^<~S5!;*1y/nb~ٷ VSR׎AV}ӎhj6(#޷t֒9эo|yR}6PK2`PKK>7OSGI-OPT/src/org/omg/DynamicAny/DynValueOperations.javaAO@WrJP 'hkAmhcO)&(>y;:&j5+ tq ( 2EO-) LѠ^c泃3 jB* jCJ‘?YR {%be$:jӹ8< >Pr_vЛgemu<5M t>*Z3 'QrSײ@c@㯚4OhATLAy*Gh$!l22VӢJ1MH IN$L6}gpLA4 0p} 0:rev0&: #" SZRʣɼ9B֨%OꒌVÀ)$+f韹\{gMV@'^U/K͢^ h޼E1u`QfN=QeޙN>?\ Fi% {^Y\m'Ce島odJaՉwSjj <8v%H9^ٝy4fr.d̵ +] =~ޑPKcLzW8PKK>4OSGI-OPT/src/org/omg/DynamicAny/FieldNameHelper.javaR0StR'pk9SƞCy㨵%Uc< U0CҮz9ϰЦz w I]KT`|<M_'q؆et$GvGe AJ RJhUI 1(1D𓬓Zq3OSGI-OPT/src/org/omg/DynamicAny/NameDynAnyPair.java}As0Wdgprk}"2@fraՂJ„we4OFoFW\Rz`Z +> FpY"LoaoȽB+FN(-V =ByIw4V( 7lS/l-AAg@9OSGI-OPT/src/org/omg/DynamicAny/NameDynAnyPairHelper.javaSMs0=_㓝q[ӆi:i&5ZTI0҉dp0}z_N`tgDq0Gf_DU%Pót iװH dTIENR,ȀDs1 cpNa~4{N5PcR9h,1 uonY9!Ñh~Z?8?O&mۆw*SNG\dz$ȮU7"kFN5q^+lAϜ[#Z yBXgĪq=y\JD.,ƞ6^^7K(YƗ <^iO_ J[@\н6>]Z=Zr9Ge%Ad$'MoeD-ryIpϿ<7 ZݬKA^!{M&F1; sE+CG6vcp5W>!g" y [4Sj5Flv/~C_VrKV Vo)θ}6 e:n!,hi9 [Zz_; PK BPKK><OSGI-OPT/src/org/omg/DynamicAny/NameDynAnyPairSeqHelper.javaAo@q[ic5+LEU=mNJ;K*J='GLΈr` > J '(adl\Y!4ӯ +p C/KѩT5v { kQ]NځZhpݜœMVYAл9~2i6qL9vrΓ-SdEւFN5Sb [P4kNy'd9֮ECަj^iOkC (8Y؛\ˋj b%0^P>xoxE1=}ei >lB+DG׆'PKјK PKK>2OSGI-OPT/src/org/omg/DynamicAny/NameValuePair.javauAo@W|# NnOv[*p81vb4h7{^xpKZT{ biU@TeA0/}Y~C: ddH X܈:Y'Z,3V|#mpa&ci2[8AuRY 05=Z մ#Z/8gTq$0jEnGiЎgom9 H(]ׄ7rL=޺5~wB2U[f+M\QZX!+59RŶgado860r \GyN>|Ko7peYlui4Yś8Mx=9`L8OSGI-OPT/src/org/omg/DynamicAny/NameValuePairHelper.javaSR0]_q'IeeZF#Sbx0tq-'5#A6Uu ~CTqE=kD;k㷭3xá aLW+cYwVpH4T{_[?1q>CPK(+BPKK>;OSGI-OPT/src/org/omg/DynamicAny/NameValuePairSeqHelper.javaS[O0~^~QZԥP؈) 449M%︄2?7ۓ`tgDv0GfDU%Pãp |0 o{9Y2*Bf$"'iFd "9?1\BI8 0A?4{N5PcR9h,1 uonY9!Ñ'hZ=Z;?N&mۆs*SN\ij$;{ϮY"km# '^v]d `iǜ[#Z yBXgIJq{=zO\JDN,ƞ:^ (Ygsiӄ>A89qeCwlS:V2= +`jJM ڐ4ZX pv&A=Dt2<$"dwf].9= k5]aW&sXw=ep(/{}vG,D!#afi HMU` 3^EJÿ(Q-xK aL[+cy7ְO4T_Z?=qmPKY]IPKK>7OSGI-OPT/src/org/omg/DynamicAny/_DynAnyFactoryStub.javaOo@SrJ -XT S !k;[]kU:nP;xr Ujo, AQ&9t:}3nV ->)8+QL)jb6BI80t~k09VPP$ a s, \U*n{ XFT=/f{X[LYG+O}\EtSײ@c@Zhr*,!ւ54\#Y-l4:TERۣI΂(N&\\^&X:`rq傾.!X§pq>ȨW9 LO"#LL\d5,G$GP.qc5:B2-M0OSGI-OPT/src/org/omg/DynamicAny/_DynAnyStub.java͘o6ǟ␗:'{}ی>N r[If+IYъ=RbW?sˬTu`)h fW2Ӯ5/Ai:=5}V$ w<ҮB+qdm-y4OD+kf%'< 7/33n'¸ &.0l}0v=#skW;T8#}%+ݣ)]v\1Qvsk-Ks_ Gx)3+ ũۗF:ZpɔK2OSGI-OPT/src/org/omg/DynamicAny/_DynArrayStub.java͙ߓ6ǟ_s/2мLwm$La6JJ2>7s{Vu]{b'#iٕZt_% eZ(/ k?q$ g"@h}~ٯaj[jF# [B&BT`{TKmoM2+@HF5DB$K$b#k"X5*AAjŵVM57̸u[-gk"Ux0Ef % #9 bovNo^*&O Om—7p,m̳zÒBڕ_vkY~k쀺}Ma[3?aC)4G֒@CXϸ# X3ջ`+ZfErb&XZ`\ͤ ;cc.=3Sbh?۩".Y2R&H;6Kv%\͙(ڇHY,(>j9b4R,gfdvS/t4)d yG>L(3{Xxi uh²:Zk-Vgós=k.J$3+0}QA0YA,DTrg-CS!s5+rźt8P*3C݈t5'dH55ds8m4 Tʥ zd:țܻaevϵa^?[UnRIJ7ҟXRO{5ḣ~R:!\?N랔T )ӯ~='%Yݓb~IB%oVBبIw)>Ws׈6ߩ[JL|)?ԽtoS[PKoIPKK>1OSGI-OPT/src/org/omg/DynamicAny/_DynEnumStub.java͙sFǟ_+hROv[)tI&vCZKĝz?i{N&M`n{{{_<7K&Yƙ.??cQ1Ȃ3G(4`E a>7R]zuv~LlۀF5$~/69hwqa7֯C.=*U\1tک#--Y2޽ZH!-3Z,{4ֻi<"Qr5gb/XoXf~rh2OSGI-OPT/src/org/omg/DynamicAny/_DynFixedStub.java͘ߓ6ǟ_s/2мLwi$L۹(1+]6?6ٖv?ZI_a,Bxe\(I8B`]kކaC,X#oxBcQY!ROPi.еGWCkYB4 ! N+SY$!QwFR;3[~y1GIoD]z+qE/ `)QlI A*`Bzf7\=229Sḧ́\ŗ9HZHw1W#&g,~]|>.&>0Mo&lJWa4?O7=@JTt>B$K$b#Ph"X *AAj͵VM557̸[GqYGNL{r{7`kD1ْr A񎞼&[AljRzoPH..\06 ;T".Xڂmg%Lk wY ak쀺{M`pgܧodJH~`d~.jL(R53nqa2wL}>y 鉑R犡A=iuɒqh)ehmsD㑋HE^|&bcIFO1G^̌i8UHGSr@qigÄ2)x߭_X6UHfk5hhg0YA,_e`tMat,_xkZH8$j4[LMp"혱 *3tEӈvg?ڱ!j5OSGI-OPT/src/org/omg/DynamicAny/_DynSequenceStub.java͙Q6ǟ˧عpjhRLS`L0^%Fr%wJ6`k-=6VݕVL7K&I™گzo:@__{kږQ1Ȃ5(4% e}O:R+m|tuݷ&62ۀ2dkxw@-f)XXڐ è9)EՆL Ƥvy{{RݤhoG۱5Qމd\Nj  ք X!=3R.h)fBmHWPؘ# ߱F>f?N`:g[&SN7h2a0?7@ w&,>B$ $b#k"X5*AAjŵM&КIfWG~ف5D*n6x0~+KFszS2lAEw=雁JelfD^9pxU9hK@[>5ް`vWm/;Y~g!{:޾OyÜ5Sh2%L%Fhv>`Td~wȁ7ۤ3+f ƅqM <0U^<]HLb䒡l gd2AZr?<K4 )3iXYQA}~j9b4R,g2 )/t`ɔy[E&e,Nqyi uфiu4ߩZ<,wg6LW=k.J$3!}QA0 ,]3)#WA,z1b'/CS"U$5ZW.a"m Yf& kN=ȚQs3OSGI-OPT/src/org/omg/DynamicAny/_DynStructStub.java͙sFǟ_+hROv[&)dI&vCZK;~ ӌlM-V/GyPkӥnt ,LDg@_4LL SԨVdy#c"Ff0(XD3xJs)EЇpR_:9=w&B lp *ɼJnOmőچ\FPQ;Ҙ^,ˀy@Usuhx9/'w"CA_+Zb -5c%H,UH׌tԥ↋ LL:31F5aN1'F 0:y7t0.CLa8_fɘ~#/)d V@܅z"BHd x#ZH-KRB%hEPʹvU`d<jo]Qӡ8v(ҁb-XΣXw XB1Bӕ(7L_ B*bL02#Z_(>$Z/j ,#V,p ,of|9?Yv[c4Wo œOSh{W@x*DbJV2OSGI-OPT/src/org/omg/DynamicAny/_DynUnionStub.java͙_s6˧ˑ{k>p$mBi;F#Coݻ vlK]V+a ӵ@;8+~p&n3?z6LlO ԨVz$ yCD ~'gR m|trڳ"2%[2$kx@.-fR, |*eȹaԝрݎL Ƥ?u:y{{Rŝ;=Q.EZ2XJTkr Xis h)bB9mHv 1'} C 86dM>'0·xDW@ Gg2҃ש&,f|=HH:ŀG< D!+T,Ւk;C+&Knq*vYEV|e=`KźJ9⌞\ lNE۾Je3fH&9p:PTq:.ؒBD֦m<, "CS!mݘ *kꭻEUuNIAc2,E@u#nA֜|5#!x֐ Qq/lĤږ:yj oF> gBX` gK\q:| tVQG]M1~".:g) 沄nOYw ߂~#(%뇹-DQ^4+fd2~¬A9!kZRȚP>XE׏7PɛOeK|f/>6ŠKe$o?68/Uj'="JW^4Y[FBXٳI1/kw6JvjPK- PKK>2OSGI-OPT/src/org/omg/DynamicAny/_DynValueStub.java͙_6˧عpjhқ<2I!I2{m3+h{V p{8˖Z2-x)93 _ztH.#=x*karbGId3#rJEZrmU`h$| 3с]VQ"?_ZAiO.c|-ؒ}>kٜ| AqF=Xo9L'^*!% *S.%-xيyZoPPTY5%\oݠnktn"Pa Mā!*qs+zl%۬˻t\/ p ^3)}@fvn]&13S\2٨{t3"ܨ]rjvIx(V,[Ώ܏}Fu3 v*Yk.ek>ɒ{v!b{|n "q5HvS` S6߽g0l8Ez^/|^ע a%Z5,:R&"~r] !澼:4Tc\Qaa QiݪD1}>6K.OEFH==ɵjA\n7U4g " tS7b1ffl\z>*NcUIBM7\;ф 4pUsAD.\R3AxjG}?@q %p\꫟|]!\?̶=ZXE"d6-pYiB֬8b~IJެ &٢}j+s@g¼:xb#J|zY&i5S +kDxO{ƦcӮ[PKь PKIG@OSGI-OPT/src/org/omg/IOP/PKPKK>&OSGI-OPT/src/org/omg/IOP/CodeSets.javaeQo0ǯ8SRemlC` i>:p!ֈ&4w0x\EJcZP$ҮBUbq=?ⰍMP:lȑ=RC0)G5zUR#*9:nA0K2Xt8Ai{HFvzxHJ̈6H?] G^5o~>?{$!gX6.Zgu^?2xAu,w'T1k'h ZׁzKta)y+w?Fc DVN%-rLatIm.Ql*l9"͟# ЋaƔ!-$z 3TFV#OSGI-OPT/src/org/omg/IOP/Codec.javaeAs0 76'b-Sti&G V%UZB<08-1~6 6ڜzyQBRay^ wC theaj#j7!|EVpajg=IAi!{HFC dfQq3xx=tE޵B4COߑȼq#1GvqѺxnvY{գs` -w\AEŬA[E#G+I.[EoHGVV #~-؄ERBZ.>)2&SpǤ(J 6=yƻdO9Ͷ! GuXcJeP"Bhe+knMu:VqG`Оcu x^$ s8H(Ϳf8D΋ж' LKWɋ$ʫoXSϩіt)tkDc3WPKgyPKK>*OSGI-OPT/src/org/omg/IOP/CodecFactory.javaeAs0 76'b;- ti&G!KTZBN{W68-1Vo6 6jK :%DX^C*PJ:XGEDAhI/$uhְj(&І`pA:|( mTt8U< <"k. A }D81'6ε.O7ܽcՃ9sPW# wd0OSGI-OPT/src/org/omg/IOP/CodecFactoryHelper.javaSOO0?/⩧uiq h2irԐڞ4DsRTrH߿N8ҍA I R0ge0hl0 bр[!Dqzt!Dcpz]78`Ae0(v $p֝ZUӡx%pa1jgAjuk:uVqL1*vtOtTwneւߕ08kiRYFZKV2 TsʫpBCjjf:#ʽ M#Ymؘ^B"JtAurh>fxB2I2q2D{.6>!E|'aF.5YT@($GѬc$00X \/O4 QҡZa8tQ2͸^29Q9+Z+\cI|z?xaKn,Z[$_Da$03`]e$Ȫ,emX S%"wmǠ#tyxX2O[GU1%R<m{ZBK]9i@F'G/GzPd%XGCʽ},_PKSH[PKK>4OSGI-OPT/src/org/omg/IOP/CodecFactoryOperations.javaeAo@xin-'j# rجbvuw(v͛o&W0Ѫz1iВ0;L߯8\ckrd!)IQNd:e4A0JUB?@~{oI},NıuҜ.UCV7,wG1k#z Q[7+]OL{a)ؔyv#~)؄(-#|Ol3nj- k,Mn+[LAϡֆ S8ϯBeH%*%y5]w&晬В=(1`luP^Շ $8`IPY~?n!r^l%$y+75tT?2Ɨ滀,l, 1gx[<EPKw.PKIG@-OSGI-OPT/src/org/omg/IOP/CodecFactoryPackage/PKPKK>AOSGI-OPT/src/org/omg/IOP/CodecFactoryPackage/UnknownEncoding.javauAs0x 2ڜBZO38cC39 y1jJ2gn'i>#vr3C9BV|UHZ - B4L%ŚYkXǼ ԝU^j g6LjwC&؄ )\'EZCxHthlp*|(!l5$FIVTjvNp SŸ~+4D)c4g$y+7x_EMhQCւWINϵ4e@']?Z,N6a垣_n{a}KPK\ APKK>GOSGI-OPT/src/org/omg/IOP/CodecFactoryPackage/UnknownEncodingHelper.javar0Sp $CHig04H$x2{WtBL҉_$kXY=tE웄,%W{6_z,|Yt0Cv9# r-*9T*G ~.FZB7$tP7 `PC4,A 1-Z-zߧU $pjΩj<o{u0=1Ӷ\7NƓi6LmBXUIK/_kkxab^J/UWL.rY#Ӟi dWЉ3HYm2Jsgx:O&3ӋdSZ]B<HQ|06L@2yEV FSE Bo* ڍta[AkhE}",IoX(.67(2Ւ$+(PJjΉ KSx?I.@ -2oO}Ū-âUv/[΂,%Aw߮jӟDgN|<Ae8DӤ74Xh F?Fs( PKMEPKK>-OSGI-OPT/src/org/omg/IOP/CodecOperations.javaQo0ǯSR1H剦Aj&b lfPTP)YUiƃ}{εe;(^ A]s&rry=*5$Q`!7& ܎"X(n1%):V!TrJP"hQ5\gd703eCsaA4iO6Ʒ+2"ˠ*Zb=9o/21IH6_*c7nmkf>sMk[guwwTZl[9OSGI-OPT/src/org/omg/IOP/CodecPackage/FormatMismatch.javauAs0WθDeBfraՂD%aweN2r#v]RwG#ô!+>KM#* ~ϴɒ9P%)KzUN#s|'cV ̮QhJ;XCZdC:P{FOQCotv!}uhPCm9.YbǪjZKÎGJeF 61=`!/SIM0 60 $qs/򐬿d5?OSGI-OPT/src/org/omg/IOP/CodecPackage/FormatMismatchHelper.javaOs0*Hn-'g0i&G!/F-d] i2oYg0fce=H/Ⲕ\ px:fA`sFV TsU !6\Х;Z' 6ntR7 ]C7!yHKY"@A*2-Z#jקu $z$ow{y0h1Ӷ{&4|$vս*9&^l|A%o@[Ey+TE^[ 6tEB{a_ (6gd$d~!Ŏu<w7<Cakg2ɐW'rh4 ͩ ?DzOR( PKcGPKK>AOSGI-OPT/src/org/omg/IOP/CodecPackage/InvalidTypeForEncoding.javaAo0 x))2;mMXvGEfmIrܠxC 2$R\DܴGXNҦQBKr60'q8F2 rdTŬD$B+;B ɿ!27NxqH *HM8Bk(j$PW~w3<f n:Чo})Iʼn86NsKbY.3pkr~vrǛ#DTRl=-q̛@[啮pf{a)Ty6coFnu&4Fi:-rD՗|CZr-J&[ewH-o SkC)$z5g$גT[%5]w&@VsGh cu XFtW_PE Nf_Y~MEnÎh >FUcK.4U@'Oryqk~ӳ O9z7[d<3^ B\dAp%~PKr-AOPKK>GOSGI-OPT/src/org/omg/IOP/CodecPackage/InvalidTypeForEncodingHelper.javar0)v|3.8>ifL8(Œ* &w&8t﷿Pt Ln(W|iE@\UI?N@Oϴ0GfEH ^Zp e !֌ӣ +p}BK5kA*EBځZwhp]Nœ}r(Qe"0Aﮕss5MqLU\]',~$VVh-Y C-0MTZVS1 YkA/Skw`3#2lczqIփ8KKW<-i&"Y$Vk2evw2#Y\,dYT4&f-VKZ8v~7|P0Io‰*@99 ,'w+FĉܰJV2SUAWX<[k=+?JY7OSGI-OPT/src/org/omg/IOP/CodecPackage/TypeMismatch.javamAs0Wdg\DeBp29bՂJēʦgZ0bw" Xjsy7 IJr4z@v5# r+*5F ~.3VpI-`&ci2 C!iH["@A*3# ϨHqϩӀ{%a`H̴mtG֪E^Zr97D%X[>T:PVz98dj鼕޿ /#Y?oظIRBZN:)rD{!)$U y=OSGI-OPT/src/org/omg/IOP/CodecPackage/TypeMismatchHelper.javaAs0*Hn-')`LB^Z[R%߳0zz'{pY[Y,=tE쫄,%W{1?X Ӡt0Ev9#`r+*9*G ~.]Njl K(Xu _j!,dO@ʴhmNHsIižo`4 [bm1(wZ7Mד#QU΁ߵ4| sb-y/,ҚׁKUo`K筜WF}_@q8$e%Y?<$~tOfu*%鄮@& Lܝ"d Cr\HABWhMm%]8VGy)e%=[ A(#j`Iz:Gq[ESDɉx6]{9j/v{ pKMe6˘j +n٢U6oS~g21RW2}J˜z%O'v"m}xYLi*Չe ZJxQZCoiE/PK=DPKK>/OSGI-OPT/src/org/omg/IOP/ComponentIdHelper.javaOS0xS¤Nr2O2{u$Uc2 ߽+c:?3`[۵'G0foe#dwPax2/8lc"Y!\ɂ*o?1~uR+S C?N^7؊=htX˚@wPZ7]^%+/8\py k:m8ֶԏnr.gUMFZvC*ĊYkB[y[+TN}+,R:oM{bdmBaHΒ1OSGI-OPT/src/org/omg/IOP/ENCODING_CDR_ENCAPS.javaen0DW |WrskTMR 9 r hy%IEK[T KgWXis=xLF":)TM^/,(ҡ$G1;[YrGdԈ?:A0&e8Gq#R >mp3<z_0\5~>ͧ$!gX6.ZfM^m3x^u,w'T1k'h Z3`RKMhyM(L Y5ʪy0yȶߊ-ҲLmPX:fEW#gzȸ&`L⼼"*7 9Cldͣ-dOC(]xVǀ`ɣŸ+4Js8X8+w"6_xu<]ѻQH%:Ъ;h,e'PKAjPKK>&OSGI-OPT/src/org/omg/IOP/Encoding.javamr0)v|3ZL=:X-H$LL޽+CҤ)ƒ XK5h^-gQp&Jry?, 4A}* '% tB )VgRUKMb$ABg4oDe (e&ϤHnҐeΨ@e"0;Ac}3q u6c wzD=U݈;ibd6)f5\>y=d*nEg_HL ۘYC:w"Kz(ˢdosH3X&iB Jkl|@n!G|p#QX/i4QwF @nqjr2 oef.(<"A~[y+D:q(F[QqآffQ r;n2G9ZfWϻ`.O+oŞ` xGx?;1G!Z^]^MuPKEyPKK>4OSGI-OPT/src/org/omg/IOP/ExceptionDetailMessage.javaeAo@W#-sG}0ce(^! UN4F?U< ٓta'~7WhD+qұ>5qVXFs'[ fX;~gPT ݆:<#|e'PK$3wPKK>!OSGI-OPT/src/org/omg/IOP/IOR.java}_o0şǧSR1mM - i!l~]'kTi<>>c.`toDw0.&u-,Wet0a~2Es7YZYG5/1̄J Fh2j=H堵HNXv $Z'IaP[Iik!p7@s:cH̔*/=Qdւ߭0xDU-ּeWi)OᄬBj:n۔:#;+/#E-ڸQC&Γ<&sz8&Yf0O׋dk$EH>O@y:Evd5b' &W:4FXKoSF8Cor y#jbIz; t%9&#b'OSGI-OPT/src/org/omg/IOP/IORHelper.java_O0şOqԧuim)6fJnrzKmv*1?>wQGjZy !D\R08LGaBCFʈȕ,H9*Ѩ,QY'I4 $4HluBikH tW ^~өvz ^`x|;|۶Ğ8Ҷn|L/fgV]x0LU֢%:PVz^VX 2tE֟'pۄB?Α}yM2L縉,͓ii:;OI:7ij[Hf#Нc·]DNtHP!`kjDEbG0d҅mu XZ~z+z?A;u%ӞiDGQ Ljާ.)6;'OSGI-OPT/src/org/omg/IOP/IORHolder.javauo0ǟ_qSRemM T9p!֌&4 ,K};]p W;biC,g@_f@ϓoC3-dh IYC5+5DJe8O d%@*E\ SPZh-wgP$0hcΨ@j{ ݵsNmCTsmt,|;)Z0:i*؆XkA`A9[ں2%M^ /#~@ccFqI>8OO7,WdC"]]'$]+ī42'm|8SVHVcdհ R{4:%^s\u֗7 ѤCUWa%PFI(5<((=-*2>̝AVwg|N `Dc?3s3/yx ^aKn\O /Z4.T3#A6BOz_s{ir~ ?PKPKK><OSGI-OPT/src/org/omg/IOP/MultipleComponentProfileHelper.javaAs0d2ԐZNIOSN3NBR%߻'餡>`l~<< &J ²iC,gDF~_WZE*"/rK+hd!֬[2oh,W΢-c/V ,rX$ na>p Znөx4T3ڠi_uk8m-qL=Z;N&=Qwn@kr\i*YA 9[2q=1I$Y,^.ɯ,e &"ɓtJO ×dz1Ȩ>h&q\퐬ƒyIdݰV+4F֏`e_r_|aPο%e%8MA!+6+F8NhJt7FCqc°j}(gu?(-IT5Igq5yE1d#6/|jQFxkxE:চӭkU/:je?Q"uTtϱ!_#Jwt|* PKkPPKK><OSGI-OPT/src/org/omg/IOP/MultipleComponentProfileHolder.java[o@)yr@-J\.UP'ΊQlbBJ)_vgΌG'TA@,! ˰hlI!\ Ѐ[#$vJi<~(u[$HlmA*"ip +.DK(U;ΧS $picT耦q!0A﮵shԶmvı2Hk25Qw@kw %^ni*ْXkA`As*P;.!Xr-3d*nK4'#E?.1 $4Y0ܤEv]MX$"-`"-|LC@j6!a!G|R{$+^R4Y{V#jFR"hnX-VAF;vKrQQ!t:NIHL@)~q-pJcW2*J@ -ۃ4[%VƅiĹ3Ț`WÑk\+l89?xQ;P_HJ>/gQ& ێݠFBL}/g1~PKA6WPKK>-OSGI-OPT/src/org/omg/IOP/ProfileIdHelper.javaAS0ͯxS¤Nr2OCq:*1&+c:$|eI'j\{ !D\UR08LNGa>c2nX!Ȝ*¯ 9??:΢ !߅ 56b=jG!V"cNC*zc:FuۧS $x4 N\`m:w|DKi[\7IW3SwUw"`O--;^ Sbɬh-Dic^J/U9+KA[^P8KQO|Uti:LI:og.G GcƔaϻa\dTYP-YŎ`n 2H/|?_Ѹ9B6OSGI-OPT/src/org/omg/IOP/RMICustomMaxStreamFormat.javaeQo0ǯ8SReeڢ=4Z ]G\5mBj} Z#*V;Y YU"n)TI,sqc^i%s]^,Ы=!Dɿfd 7S/W[tVCo=E%KBnD۟.ϣ:rB7Bsݧ(!gP:j.Z'uZ3X~DT2k#hQ;=` IMhyM(LI1H7yJ6߲ t쌟1( Td;*e%KMս >Q<:2Y-M#[;7oqҡn0~,r#S ~!YA gHwڴ%x7+D+qMOOPK 7^PKK>,OSGI-OPT/src/org/omg/IOP/ServiceContext.javauQo0ǟOq ,о',"V"KrX@ @{؈}$oh n }  FS/q J4YC: 9 ׵ZIOI[.n6ݷ'2q۶#mquue2[{U΁ߍ<0U.ZQZiOZIR!8VX2td嶡 ^y lP03HY^!|N7j,2H0KWd+}x_<d˸0vn2 >!9ɜGSe#JR?U<tZ^$A?sF `y!v:u%i`-7Dy%07ƅ3bܹrhK(/$9x nKD~Y=<3^IIڋ7}KPKJgPKK>2OSGI-OPT/src/org/omg/IOP/ServiceContextHelper.javaSR0]_q&Iee-2q'eX*֑TI0wZZE[瞗Q#LZY<YY"k)TA蟌CA^c3rd7THdAQFdWĈo:N1z@ b =G!&]AC*zm:kN /.x9w{q4j6{DZը~ĺU:u7ujr~6r°B,k-Zh QY5J/U5K K[hAiO9s&zI4,|Hnev=M2%yz#aMyM-!+c36$`2ȉ,,%gKYp4U5"TzCVq"k¶:6XZ~\AhE@Mz]i42͂KXplQx`93h_R͒u?-0.)Ňc^d$NaǁΒojFġ8-^dF˒H)fԒ(_hm}8qL?cͷuJ>DçA9h}PKW>PKK>2OSGI-OPT/src/org/omg/IOP/ServiceContextHolder.java}Oo@q[! F9E=U׻1; n 0μ{3EpScwNV~1,&!QJ ] OCσ8E@ne AZ=![w241CA; &Abg!h<  RCajۡ6{N%]aV$\pq!׆~ڶŞ86C]<}dF+nīTX1-rgdu$I] 5a)''W /#G?. $4E0ܦ˫f b̗,ll~.lO_!t~9䑱>X0 3`d% ڿz++cSWqDYyZ((`œ1nM@WF5jlq8 ;sr(:W| [6OSGI-OPT/src/org/omg/IOP/ServiceContextListHelper.javaS]o0}^~OP@)"i&ol]t*uy $>|E8Dʣ_ %Bx|<5f0#GvCe JhTI~EH(֭ 񅬓Z$n78 ;`-vPڣqa)km 2RkYk_u:^xpO3VޛQ۶;F֍4xˮkUs/v]b^kB[y\Vz!^VX 4tEJ{џ6KrygI@r/9n,Ӌ lzlOLo)A\ؐmP."':B.eTՈP Yʼn`Ȯ `hj^?rQq?7u4 .bEQԂM|xvN.fYEo p8lOEѯ߸x4fgI6Ž%X)7eS-K>(IzQCK>~PK"g:EPKK>6OSGI-OPT/src/org/omg/IOP/ServiceContextListHolder.javaAo@q[!ic5&{0wc ; nJFc{ߛ$sZdg RR:~5C9zt,cV"ײ@Fߺ!|Cp zQo0 ;@-v A5T-H mJZ}:@wYr VDž _k"{6m=ql\5RZ?N=Sw]7ZW#'^@X*ĒYh8C>#['IjެL)=9l0rKrH'ymnpl^a.E$;.<2u!c0!G|2$o+Yp4]5BD`҇z,$AW/rQ!tl*N6K"o\ L7ƍS t2*HnQҘf$QCCQW봏F'Oyvfn쿒)նC/;v%==Cj(59;o_3cPKb_-CPKK>-OSGI-OPT/src/org/omg/IOP/ServiceIdHelper.javaAS0xS¤Nr2O2=*QH$d{WtH 3`ݷ[ɓ'ix DRR0c2Y!Ȃ*o??:)!aЇ b=G!ֲ&}AC*zkzVMקW $k.e"k"r~Br [SU#*Bwd;!.lc2r+ݧ|F(9B8OSGI-OPT/src/org/omg/IOP/TAG_ALTERNATE_IIOP_ADDRESS.javaeA0W<ԮJRTB[*AI՞*7lg3n+rpd͛o7XldstV3dŝDܶR0],Y菑{ENBv&[Yt@dƛ9~R+܆ L`2^MfKoq=N zK!-j蹢A*TԍhtKœq{'X.]RFwtE0BjDUkmڤ-SU%kaW/ O?CtLU=b6!sSF:9 y}^G)؄$.|{ݗx+OSGI-OPT/src/org/omg/IOP/TAG_CODE_SETS.javaen0DW |WrrkTMRa) r hy%IEK[T gWXis=xLV":)TM,saclaK3cv&w&h^5?:nA0K2Xt8Ai{HFvzxHZ͈6H8] G/5~>$!gX6.ZeM^n3x^u,w'T1k'h ZׁzKta)Vz&.OSGI-OPT/src/org/omg/IOP/TAG_INTERNET_IOP.javaeQo0ǯ8SR1E{`i֡U0]է!b6QIƃsq| kݟlzHN U~\DWZdi75)K; jGnOHzQo 񓌕Z:ZbjXyp'(0XbiȎ@5Rև~B۟L.:r=B7As81gH6.ZߥMVn3Tu:~DT2k'Fh;=h auFauFn&/OSGI-OPT/src/org/omg/IOP/TAG_JAVA_CODEBASE.javaeQo0ɯ8S;T*B[F`JPm7EjYV!;m6Dqr KmNV6q5AQ^Km+ln ~76A!G1;YrGdԈ?wd xqd,NQG=C-[=Wdش(_ (#n:&Ίt;.dk7MwX97JpaD>a~PK*SPKK>5OSGI-OPT/src/org/omg/IOP/TAG_MULTIPLE_COMPONENTS.javaeQo0ǯ8SRemҬCK! dU*\5b3۔F&F=U+,t{2>8 N"n)TIfSiclbC3Cv&+YGd%)~R+܄3`4\&soq:K!-*襤A*htsœq;'X.]VwpE}߇LjSGEkUX#SU[Ր0'ޝ Z*ŎYC9{#TVW^ZgsBȣplBaHyOCR|϶&Nd#`Id)!N#Io Kk)}WDN$R)+YhDM3%s?eiQ:GEA9Ftudyv;rd*/\wOUW˧EveZx > J*vB<#|<PK5PKK>*OSGI-OPT/src/org/omg/IOP/TAG_ORB_TYPE.javaeQo0ǯ8SRem@ӬC*OC.mBj} Z#*V; Yq'"LOsyc^i%s]^V,Ы=!Dſ2O2VjpLd' NPڡҢ-^*B݈6H?]< 6:r:on>{/Q4 C(ġ6M^6OVXd֣jZKoOSUbˬ DckN{H'U3յ!oݻ1oPbH7yJc8L,M$Ky q$82C/0q^^;Z_lGeţ G2'BG Vˀ;oʃt7s8P0Ao9Dˑp=gsyX50 jD {8'|b PKުƨPKK>*OSGI-OPT/src/org/omg/IOP/TAG_POLICIES.javaeQo0_qT,ame]*mէɄ`-؞퐢j}אIGU+,9Y=Ey+"٧)x<1A&GHɝH9ڡS;{BjDſfGNjy<8Fh' NPڣsҡ-^*2R3u@Co`w[!{%Iř8ֶIڋ%wrL=zP-9K;i 0U%ڊB4@[jplvy+?Fnc DV5-rLatNM*Q,l9!͟#o ЋƔ!QCd-+nM5h>U كtaw?W(D+qұ>4qV/"m9D˓Ox/x -\qV(ڎp"EPKLiPKK>>OSGI-OPT/src/org/omg/IOP/TAG_RMI_CUSTOM_MAX_STREAM_FORMAT.javaeAo@Wg' j 5;Ұ{B؊Cd懶T .a4F8qB,:C! JY蹠B6(ԡzi>#ӠVpoD;@ gb_*/&x8[ejd 4扷' eZP1uM5Q&'j+1/6`f>YMcI94 -OSGI-OPT/src/org/omg/IOP/TaggedComponent.javauQo0ǟǧ8)}DlC`tU5M gPTLhn!w#R G riC4a~\^@eР>a :Q{D+5E|p)*X%̦lrei3H7x_UZq384da3*Pt:Lf'9Zއa9pI}KSՍh&.`JVkzXbV:^sE탑3Nj^tiO4 E9 <}'r?7{,J64ul}&tQrdev&wv9+<#%?FujZP VCix-?sF?9ȶS]A&klY]cKŽ?\N(PR[gov[a{3)oogQ1VaN–.:_<îjD˩~PK 3ePKK>3OSGI-OPT/src/org/omg/IOP/TaggedComponentHelper.javaAs0jHnmNIO3I39 aId&q:!mڔ`kە=:p6[+G ?K$u-*x0m̂aFʘɕ,H9*Ѩ,QO27Njx~4XluBi{H tW ^~ӹvzo0||.|ڶŞ8ֶՏZ7J'=SwUMFZNB*ĂYkB[y[+TN/}+,R:o=1rM(iY0ܤzd6K"G6$4'$[|ICWsؐ1e ,#3Tȥ,8Q*!8 ٵtXk-W4"G0c4zf%B,8(wHKy&w/ @q}\~jI3fgI-6Ž%X)v/CCqΧȲ]-K~B]zmԬ8gDbև7Ni<' ~cCD$z(k![EPKyx2"APKK>3OSGI-OPT/src/org/omg/IOP/TaggedComponentHolder.javaMs0Wdg\Da1C)#k*$U&L{VWZ29J Dd0J ^CrF46Dž\][ɤmۘuı2Dj2/#Q@ko %^i*ٚXkA`As*P;.1Xq-3d*nk5#E?.1 $4Y8\EvUuZ%"]䐭`-"͖ 1 |N0yha#>CبX /)=jC#)h4 a #xsݧW$Ͽu:VMُYHL@)ЕD.zZ'y:Kb Csg5<YBvLx=;=<b/DvWpK,xpk [ly#Az!fG3r~GPKp-'8PKK>+OSGI-OPT/src/org/omg/IOP/TaggedProfile.javaun@)F>ّ NnOv[T "pEUUaWbEy$Uhvf_.`zO0.'%M#*Wac}BV"kYrXA*@{؈?Cf :\3ѐM^;h&t >hRf@%sOޒr B4@=E}߇Hj[GͩEdJ{nU΁ߝ0U)ڈQ[iO[IRSpzGe*mGg0o 6`#zd%]qIVd9,tl,=|M-9h߀1tP ! ,N;Q#m2l% : ӡn0nl"߸ `kn>[T^Y~F[rR$OAo{ Ig%H_RMO ?I l2ˡ9PKQ]PKK>1OSGI-OPT/src/org/omg/IOP/TaggedProfileHelper.javaAS0xS¤Nr2OCq:*1*q]ޓ<:p6[+G ˿J$u-*x4kBÌ 1++YrTQ%Y!1[W;Y'I7yf|nӒ(L2phT3=[C]?_G5~4 PK!M] ?PKK>1OSGI-OPT/src/org/omg/IOP/TaggedProfileHolder.java}Mo0 rJzrrn5VEPl&K>E{)ےȗKjr ̕^o dax:~ ia/QZ BYId X$SA4͂Nyhr-JR5Gktuz@wZ9F4և\=ɤmۘuı2Dc*_,DgHւ?rDU ւ2jtTn w\cjZf0T:W5/#Y? 1 $4Y8ܦevSm\&"![<[E-hLc@jm䡝)BxV{$k^5Y{V#jF#hnX-VAF;溭WBIQ!t:NYHL@)6*\K%Z@/lyZF kii _ky#Az!fy:{3ުEPKU_&.PKK>0OSGI-OPT/src/org/omg/IOP/TransactionService.javaeA0W<唬RHF=lڢlW{t` V&lTwPiW7$7nlew P5a~Z[qF%9'jbv&&BjD͟dd MG:X8Ci{HVzxHZ̈́6J\ & ڗB?A_C qmWK6ozzP=9Kiy0U-ڋBt@=Zpl鼕 #R YZ!fVY &kcZi˶"vY3 ߲n ȸ=&`L"*W"9Cleͣn''!{.\c&( (#N:.Ί {d[7B9Q6v$k=\tI#VOPK!PKIG@OSGI-OPT/src/org/omg/Messaging/PKPKK>7OSGI-OPT/src/org/omg/Messaging/SYNC_WITH_TRANSPORT.javaeQo0ǯ8SRemlC`*OC.mBi Z9\aaZ͐_%ⶕBUbq=?BWZdi7)K;jGnO;Qgܙ+M &d' NPڡҢ-*B݈6H?]< 6:r:^կn>?{纏Q4 C(ġ6M^6KVXgԽjZKÉ'*eV 1{N{H'U3յ!oݛ^9k&&qs\$ܛ<$CqZ&YU&e8{A\ϡ)}[DA$Q%kYq4!4HFq"tdk 6%F]-ha vQ= xPK譼PKK>3OSGI-OPT/src/org/omg/Messaging/SyncScopeHelper.javaMS0x'Id-x&e8*QH$x{Wt3iݕ'G0Ӧx DRR0N9Z?"9C\˂;J 2J/~镯PhE?A;mdQidbEQԂQN9ϒ.暸>/v#]@F[çlqĉv2-*LOR؉8 y,]g)7vZ|gy츇=DBz8sqL㙊#NU.yQGD{8Yy^[|PKK x>}PKIG@)OSGI-OPT/src/org/omg/PortableInterceptor/PKPKK>4OSGI-OPT/src/org/omg/PortableInterceptor/ACTIVE.javaeAo0 x))2;m zl3V8CQi[#i7G%Т>I=~|L"\aʦ3loiIJfO8 [rdTŬDeIQ^Ud[BjDɿ13#Y'M4Ld ' NPڣwҡ^J2R3 ҷ>J ^poB?B{9Iař8ֶIKK:/z|:r~aR왵h,q@=Xjpd*鼕޿1?#m @VL%-bDOvl]`jel+?nb˸&`LlZ_RֲTӋ#Y=H 2DOSGI-OPT/src/org/omg/PortableInterceptor/AdapterManagerIdHelper.javaAS0xS¤Nr2Oi܉Cq:*1ޕ1Baz۷(f쭬6b,*Ե O1(J9;*cv&W DJBbD??:N)A0` b=G!ֲ&]AC*zkzVMקw $= .0|~.=txo>O&mƢ#&M<}յ9XH bZg^J/U5k K[jAhOtgl1eqȉ*Z<Q*#x"[Z[7Wh4"w0c^<ٰkmO#Ӭ8T  °Pl`j}׿.pSXr<`f,Ni0=K_b'L8Y_iYro vܡq%Q6}qL㙈=S,f䷁/;Mx-?OSGI-OPT/src/org/omg/PortableInterceptor/AdapterNameHelper.javaQo0_qT,оm}JiFDjڃI.[b{E}4ʺH||wQ#LZY<DRR?8,(fȮ!\ɂ*¯t+C|#V8A[ NVhJ{C:,eMT(tc:% /X.xS!hlb'F֍E_gn׵9XJˉ[TX0k-6k^ꍕ^j~#,R:o=2rM(iY0ܤ7ld"t4;O4OH[|I!+9tglH2pȉ*RMU^Ul#]8Vǀee#[rA(#n:MևRɆ42KXp (jI) 2%<ѻNl?=v+pOqHܰNCD,Zq[ں>5KȲ%? *4y?X^8'{C0Ktmǩ2g%1[C]c7 ѴHEPKwBPKK>@OSGI-OPT/src/org/omg/PortableInterceptor/AdapterStateHelper.javaOs0x 2ԐڜBO3I39 {1jJ2w8poILYY=Y]"k)TA蟍ǧCA^csrdTLeAQFdׄĈ/:1Az` 6b=G!V&}AC*zc:VOHpy,\`iR;o:m=qm5ntN|Us'^ Sbɬh-De׼ԭ^jWM)rОyM(iE0ܦfd>Oft#c.E~!#>tol1ei 3Tȕ,x4U5"TzKVD0d7҅mu XZn~hhE`IzS?!Tya=LP!(?OSGI-OPT/src/org/omg/PortableInterceptor/ClientRequestInfo.java}Ao0 DNIYo[Onm {=*6s$M{R2$Q{L"G=^@Q}UF_/c" PJ%ztO$DTcn2+kM71Dp,a flq$f<6GPZ#s@iNhϤHq0;\.]{Y&ӷ'tD㺴?N6yӫ{ݣ;AZY{9q ;|G&PN] ޴4JAQ *lcfYmV*"bCVY VE[QYE92B)B 5g$oVٚ!t fG`c ^I:Q9 Btb]8 M¬P9?>k%O|ŨJ= vB_gUYb'D6:%ot uvK?(zPKaQPKK>IOSGI-OPT/src/org/omg/PortableInterceptor/ClientRequestInfoOperations.javaSMo@=_1D.vrks"$mQ#c(*7Żtw1V>`7o8@6{ū7?(kD^SSφ!H 1jT[,FOSGI-OPT/src/org/omg/PortableInterceptor/ClientRequestInterceptor.java}o0+NyJ*Y߶>QmhLFl>Ji{ RU-F he' (Bc~ZDJ_DF֨60-!1tONj`6]7^8#(M08d 頕=>hZ̄6JڟL*& #޵ h>}{"9qĉ8Ҷs7YΫ^ݩi0U-vڋY;ҞzBpQX2tdncdP0K*Ȫ&UV^>~+peouE imVI߳|rdS8S BH`-[Y5 C#ZŎ=H2POSGI-OPT/src/org/omg/PortableInterceptor/ClientRequestInterceptorOperations.javaŒn@)F9%UCoISldT=U{pvu&Hݙ]p m$q9 !n[)T0Lo'gZ" Y :U! F"SdVp`FCh4{`+"kH lD@*( htCAœNpç49.Ł8D1F7bL=Tݪo$xakfmE@4sS$T]/L%#3ӞyM($ERL]ݮ.8]%Yz,5=|Jҫ) [}ѐ1E(!d %N4!) VZVˀiV:WEA>BtMY%!]k[Ղ7`Tr;I͘bhUe iYZK;|8szTk MxdykM+TCE{7Zv',k:F?'PKy_2PKK>5OSGI-OPT/src/org/omg/PortableInterceptor/Current.java}Ao@OvD͉ͭnjAN0Uaw;=6V*3o6 6LV'e,!:)T^߇ȗ thXea #*̝uR+ְXxIЋ &t*4RA{3N='YCI׃ h>?'"1qę8ҶˬfwL=S:Ҳ0U%ډZiO=ZIR!8(,zZ:8Л^M(X$%n2-C/rwO"鮄MmCg 6x>0q^nJ7 9ldT;Տh;_ct$\Ǘ_ qґ蛶KwM`#q|ZTvNo6nWQI}lW;PKUQ+PKK>;OSGI-OPT/src/org/omg/PortableInterceptor/CurrentHelper.javaT[o0~^~OP@)"49! );T:u@$Ep7FTK}>,, k$G蟌C8,, -ТYcC ,р["$qv JI<~4PlۀTEFځJwᖭNmǡ 耦s 0יn?KѨiceQU:uwZh-ᅡ&Wf (2H{N׍NjV-\ RXgD^iO)s$ҼgI@r/9$Y29d3dtfS! UF:MH@6Es7E,,ΒBp&+*JHJJ0VK@Sp̵K B(5UUƅRЄY+si_P qfdzA.&mxua 6m0$w穜Vd$ŇA/5ؚš8QEZz^S䞐m.1yw݁Q1ǩQoVoT7'P!~wӎ9 2+xܷQPKaPKK>?OSGI-OPT/src/org/omg/PortableInterceptor/CurrentOperations.javaAo@W|# NnOq[*pTabbUiRr17oádu0f$$]'M~;| PEc7y*5FEH3J6 &dN@iE!KƁTP>'Co` Bn>>[̻8!GHSw'*+Woz:xaJlhӞz jCq 6wgf_ 86`Kʴ S?))$[yvkr>T9$kMZ#x˞˹/Um,..u?sIТj;3&%=aEڋN%_\W{-kpٍ7gPK0DPKK>8OSGI-OPT/src/org/omg/PortableInterceptor/DISCARDING.javaeAo0 x))2;m zV8QqhG#y7(G%b>I=~|Ln"`iڳUc\N)ҦQR|64'q#99'ǬDUIޓ?V2S4꨼sFIϿ;c4dî]DmcS?U72W"kaHWJ.t,,l:-OPK\ՀPKK><OSGI-OPT/src/org/omg/PortableInterceptor/ForwardRequest.java}Rr0=Pprk}"2@frbJJēɿweLnL 򋀤az5_@O#-h챎 b р"$q~BI0XzرH堷HB#:| \(mn{3x%0r13jtjQ:?0 ;*i]\e#6Ck^r\iRYEZ;62ZTsʫpB!Xո4ΈwgH(6&aNʴ =}opEU yb:gxl"KTҪ(=3ߓtcKPKexPKK>BOSGI-OPT/src/org/omg/PortableInterceptor/ForwardRequestHelper.javar0)jHnmNIO3cfrbId&w86mrl=>SmVV+A1DZ UGnBCFʈBȥ,H9*Ѩ,QO2gNjhA(wKqk#ΐKY ! 6Z+jOHpe\.i!wxܶm$vđո~udz62uujr5ċ-aB,-,ׁKUҷR)V.'푑GZڄB?Α}yBu2H渎,͓ii:;MI:sij|Lf#+}0cʠ!,3Tȥ,x4U5"TzCVD0d҅cu XZ~w맹F^= Al:*ɆgKXQx`sm`}rjF]MWwǏmǰef'q-6NB%X1oElDE9){]-K~|E{i ;!’(+Ji?PKxefI+PKK>5OSGI-OPT/src/org/omg/PortableInterceptor/HOLDING.javaeAo0 x))2;m v5CQqhG#i7G%Т>I=~|Ln"`1&(;mPa|;}ϓ8 rdOY!eEړ?R#* ):nơ`4Fy8Gq#֐l R >p3<z ~`V.;xo$I6I{u:[rW%`w'-O;CĎY[C[Խ^f k KAf/r7g_mBaeVNS/xJ74f"_f۬iY2C/Ɔ S;[DIW$gx4t!4DVD0d҅:Vz7WhD+ӱ>6Om}p/Slصt;6X-xzw}rT *$ڎy7PKVPKK>6OSGI-OPT/src/org/omg/PortableInterceptor/INACTIVE.javaeAo0 x))R;N[ЃfEC;I>*AHcv cON5q5"ofSq0ֱcMܑv)+D{UCwʊCfGr^tq, d%NAM@5GZTdFev@U؟ *σXկ !}!OY}*ĩqM^j}v/ˢ\^3A=㉷'HT2k+{8\0w*(LMz(Nmƴ<Mjs^rEa|΋XXXwb#V߾ /]wS[}ź8che( -UVN6iAVπ(Ӫ 2CeI>BtjMø:6nn˦%o\b#Ҳ*=(ێpOPKpCPKK>5OSGI-OPT/src/org/omg/PortableInterceptor/IORInfo.java}Ao@OvD͉ͭne*pŻ!Ī;k*ir1;{oҫ`eɩ@0d}n2C#6 +Q{l` :Bfe͟$2%Cl:-n p'І`Cz|( 9 mTt8ϙT ݊fWn0tN=81(ǎHT#sgd)MKtdɩjWfd/86a f( r/=gEbSB^*߭^;>:x>Y0 q^%+\ZfkdЙGtEwT>3`dzuT$\WF=q҉9v('4 6&Cšr~\k%o\Эa~B?Wyq%y kI9FS4#gcsPK\Q*PKK>?OSGI-OPT/src/org/omg/PortableInterceptor/IORInfoOperations.javaRn0 =_Af ;]ѓش͑4IQaHGN8;CA',v0Bː<(- 5BE>3Oh,) `Ч+S-lrZd PQj$PSȭ}zz r_|N AY;M&]ׅb8T4Z;gE6ì[Akז +^@hfUsmDʀ r)Ϻ3Hcr0aJЪuL;rdl02\GY=c<,1Jh$)̒Mn!Zk0Mv+ :P `inEP-Ɋ@ِcL0 m 7ӡ2λKZ@+6X%xqƲR 7_?@3. , P UC^3eN~ϔDG8sfS6o_Q^xVA{VE?'(xutvP˱m1N!y&rO̮9X[-PKҞoRPKK><OSGI-OPT/src/org/omg/PortableInterceptor/IORInterceptor.javaA0m*AIdHmc;qP+$Io#6GKM=H=IU#-oc< PJ%:/$D6Tr5u% j6G=AAiC -Z@ j}0H~3x4K.,'ӷ޼Oqy"N\ҍXjWG,;AY{9 ;|u-yR] N~LC[ *ߌlc fYCV*"ObxSVY E[QY E92I!BBhnB_*v\c&t //_QE I'%_!=<0km#38TΏZEyQ6<YCI*Zy_mkт G3~PK9 #KPKK>FOSGI-OPT/src/org/omg/PortableInterceptor/IORInterceptorOperations.java}Qo0ǟǧ8)2نV>Mp؞mBj}IZ#w]pk\@V|%,׫Շ%qc}-=V!+x;*QZ`p-BEɿf ?XR}l-nQ Ћ#H`d%j$TFrΤIqP;'8\p]}MЧuNqCq"ikdI{eւ?xw;fʀh Sz4H6Kv0e*npLȭ_mB,. )f9.bE~ q6dd)@>$]e\)B Vg$JnM6hG##hz~+/QONы|(^U߄?q޽D:4~zرՂ'dE@Ƶ2xp(+\zSn>l˿0%Q:;Sγ ¬ PKX̙MPKK>@OSGI-OPT/src/org/omg/PortableInterceptor/IORInterceptor_3_0.javaQo0WyJ*Y&f- U} \5b{)EZ%4iTz!,4C !R= s&O*'9s!p7AsS#qLw'lI;Nza(q9DUX;>2[甧pB!Xո6Έw2Rs%̒X1ۤ`EMkv$ϓt6d9tv,K3$|c:h>kun FJ4hyЪ'4Fs_%t wǥrAqP?5C}Wth]+s辤R?Zk883%Eq(kf$ғ]ۍtFE0} ~PKnƭVPKK>FOSGI-OPT/src/org/omg/PortableInterceptor/IORInterceptor_3_0Helper.javaMO@唠 r2(Fv(gc"c*>DK3<ڣ`ƈrd?DU%pt:kH}-5!)x QZ,pKH3NneX$c^{a6 "i Q!=G@Hj;Fe[S$pi1 gi<c65M8TUX;'g3QwYWBkZ8DYNk@`AZsS7F8!!Xp 3e ay^H? ۘ^A$lEyr5(M,> IaLOYL;DOOd{m|))BaHV# 5Y֬D(@Y j 2X \M_(;/DNjU8^,?ke]d*l`AI,je>>NJ0!e<81 ·R^J$IFrkfƾAW cx|]Y 3/y(J{pF(udOC$3F5ifdǂY2XڑV; 6'/n>0kI?~|--I^y ?PKq?j/PKK>FOSGI-OPT/src/org/omg/PortableInterceptor/IORInterceptor_3_0Holder.javaROo0?OS;uELɔtL;UnZ8fմsFG)~9: fJo 3Xd0A>$Rdăx$8S񕄕KK%YujZmHrMí%Ꮉ֑/OQҡjVKCg4B R0RdAbr>A ,/Pa f7M 6L8}>f8'x7Q9'|'RnoQVLU G;]k$VAߞkJOSGI-OPT/src/org/omg/PortableInterceptor/IORInterceptor_3_0Operations.javaRQ@~_1S{;Wx)z^.ƐXuw)mYI;3|7\ypk׍y8}!l[D0Y@ ]C2 $hP zQ "Kp)_%̦lq AH A*"@e (d&jgBqLieΨ@ѩ:Of'X0 >RA{5}lKb=U=?zIq~UrڲVk^FSrc5{{a$;x $M qx{xKwnc[eJ;D;;OSB%O‚W iYP=jA@qc5Dt0-evKkxӾjֹ Z[O9J]hQ%dULVx(J pV{V2Ec̐̊c9'&gzEsl_^^<&οaaP#-iT뿛5M.J~PKj"!PKK>9OSGI-OPT/src/org/omg/PortableInterceptor/Interceptor.java}Qn@#숂[Ղ F9.0mvw{gm9Tμ}ޛ*+Xisg IKjr>~XD G:(С}&bO5* A GH3uBI:ZfSkG=AAi!sHFC `&iiġ+ |IqD|%gI`-[Y5 C#ZŎ=HX`izy$TǗqґ>t7mɧ*BwM`C E=ƽ06=Jۍ"I N^~APKgc^2PKK>COSGI-OPT/src/org/omg/PortableInterceptor/InterceptorOperations.javaeAo@W5~>={$1'X6ε.yV\c֣9X=H*cN9h]ƏRVƴ}F?[/@lc)-$z33TFVg)"q2=̟( PK8BYPKK>9OSGI-OPT/src/org/omg/PortableInterceptor/InvalidSlot.javamAs0WθDe('M;Τ`ĮU+u{4: D4R0>MϓF;-rdTEeIRNUd඄%d c0Jɍ8;q%֐PR Jk^Aœik']WF7@s(>'P:jν6O拴X|daJ5d- a#DTX3k#zhQӞ7IUOauF;&lc @RpI1"{Z18]&Yy%$KyqIz7qd|Z0qo>#ٖJ%[Su'jBd;BKf'VˀiN:NEA9BtwuSK#Z*O F0qU?yrq?jAbxg࿥_b/B3,8{6f6+PKӥC1PKK>?OSGI-OPT/src/org/omg/PortableInterceptor/InvalidSlotHelper.javaQO0_qԧuim)6fjnrzKmv*& bC!s{"aj/I]K Bd<>q,(fn!\ɂ*¯?!~uR+c-bJ{4C:,eMT(th}% /X.xwk<m=qm5ntN.Gv]ߍb a fE m!*KunRUC8lJ鼕ȭ?plBHΒ<͇&_fs$Y29&<ٔG_Lo-Aס;cC)CaB.e;!.c2r-}B(#N:*ʓ gid DQԂS,ZK>Z{WXj_d$Naےoju~Cjq'qɲ]-Kjzx{#$g:xͷ&䯎_L5HIjEPK9:FPKK>>OSGI-OPT/src/org/omg/PortableInterceptor/LOCATION_FORWARD.javaeQ0<唬(S@lAٮT9A&l9Ү̋o`aZ͐_$BU|.f/H,#f$YGdNd Sl)κQCo9E-[=U9HJQ 2gdJ8r [Fї\1aEqMW7r뷬z|uZ~ҰcUرV 1=H'U KUh4M(Li9LГ<ۯIQ$6] ,ln<l82COXq^蕄Z_%َ*Yˊ '2#s֯ղiQ:.|Aqpο<'c}R]k~ǡr~\o|/]^7#J~n{`:D>"PKyPKK>:OSGI-OPT/src/org/omg/PortableInterceptor/NON_EXISTENT.javaeA0W<ԮJRV\"V j,{Bn:I-RNՊθ Ү7߼I"\av1g(iIjzx3fq8&(6iC05)G;jG~OH7񝬓Z:^`j2[q'(;bȎ@5P:K 衷^\ûoy$0Lk&Elk_ݩ߽a[fm!ZK|uRs8AX 6;鼕޿#\ IZ"+'Y9&Ypn6i^e"ɪy iY~3qd\ 0 q^B/HP-YskEKh` cu 69OSGI-OPT/src/org/omg/PortableInterceptor/ORBIdHelper.javaR0S*aR'kYO2,QH$d޽Wt2tuwILYY=YU"k)TA蟍ǧC ØJ99[*cV"ײ DJkBbDnfd gPz 6b=G!V&}AC*zc:VOHpi\.xa!{y4j6{XjT?պu:GVݨߍx0LU%֢%:PVz!^VX 2teB{fdP%9Ҽ$OaMW|4G6$]4$;|KgCG}1ei!3Tȕ,ؚQ*% ٍta[As8Xo>*O6쵶i*ĒcGQ iyE5wC+:GrOqp*^0a$N[aAĒojo ʲ% y^<|ç{Wo2X?6Ni<בؼbghK>$^kDY㏑1PKWN:PKK>9OSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfo.java}Qn0 +³޶$ۄ`+zmHD  2D>=^Ep+cNu{y {%u0^.EP='lf$wFA75N _ye4\'Klj7h8#hC0xdU=>h $mT?͙Xx8LEX@4>}{">MqLIqb\gOj-7oX^=81(ǎ#H˪jY^`!գSt7-ai'^[#[plR,+A3JQƁA>;xȊ"ĦU]ȷ|>:x>[LCOSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoOperations.java]o0˯8 *h^ݬU%tU5MINlU;id|<{=86Z+ dAQ_ap:= 4Aԣ ȵHPL)j+ t'#%ԛ̕بJ,0, *v8jr P*n;07MS:X3fYtY1G-4)7+JxLo@iF:Q7ZX!نkteRaqmL1K~Ģ+ra2 i0` hu>,>Pi0s;E2E2&" Iys\QKRR7VC+SRXnۭg\qG>wiO7W:ݬ>UuLqx3), qwV"˄HtAcw+in`dHZ55Xom]⌗x)c2o^dצEmF0B)z.{EtIdp%Ѵ,{SbrjlzAǻ>KsFUWo^_4~PK=PKIG@<OSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoPackage/PKPKK>NOSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoPackage/DuplicateName.javaAs0Wdgprk}"2@frajA0d߻4'pAW\RG-i>$. ke0ϯ}sːN),N( 5=B>cŇ_Pna2&CU ?T:JQ#S!!WM;JGYN6WmnGó}3>(fJWA}5]\3wmeƀƿxwޒHk{PxjV9սVJsScu,KDn,|y6?4 M Iaīh%1}0~Q)2:ZL<"dgJudZE)r&W:Zԍ0Z ,KAQfؽ֥Iݵ,Io#)l$Kuj_xmi($!9XuCc޸I( ^%d[0CnO#7?p\&;z:gxw/%zPK%PKK>TOSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoPackage/DuplicateNameHelper.javar0Sp+Hn-'ӌJ2ݻ2N'4`k﷟I'0SzgDq0GfDU%giamXJ hX0J!W"GiFhm"sWB %M` `4;@w "e kQ!}ځZhpOIP+ǩMW맅]}6q۶wLr\j*]${w ?ah&-(4HkNy'dUkr>jܑGFiiQq6(Їf b%"t48MD|yHʨk' LuN2#: YXFeKRmH4ZX SZ8[<Add8o/?keX8p\C4͊<_;+Ns̛ξÄxAC/p_%HÎIj4| юEr[n&A )7Ʒy,S'}V0z_XqzSYyW9,qyJuA˝ƙ*Y?UP|(m1қ9OPKORPKK>LOSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoPackage/InvalidName.javamRr0=PD4QI'ʦgZb}zz&W\JüZ@^~vB_/bゅc(AkF ^V0-=BjDEwNjl M&P8!4C ҽOL,A ̉GU+Hٖ&u}0}/ѻ|/ -uVR;APK[ysDPKK>ROSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoPackage/InvalidNameHelper.javaAo@q[!&rlknw8(w*$ڣN`ֈr ; J g adl\Y&4ӭ ;+p }/uK[lU5nA*%V"!!WZ9'C-yS!shԶm{PrTvtOgI6ݮY`W# '^n5Sd [P4kNy'd9VECަlQikC (8yЛƋf|%xA:i\ċ8M D|!Ws^1p!jJM ڐ4ZX oSZ8t[/rA z#n:Tu^+|{tdY+X ˕>'n3A^!+Q$X%UNb??Ol=Lb(6h~! 잏 }aͥ]% ~-|mB龩w,Xu:8OXcVTKz(m1; PK52ʳQxPKK>OOSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoPackage/ObjectIdHelper.javaOs0אZNey1JJ2wN'4Gz'yxLZY<%W1@/$ <OSGI-OPT/src/org/omg/PortableInterceptor/ORBInitializer.java}Q_o0ST m}IE0Ar=۔fӾ NF;]|>#A$d0^.߆EPI Z4DAT 45N_XR%lj78#H`djHBz6۟x&& U9h/AI;88)}vpEM y<[4>:ȘX&8[BBΒƚZٚ!tdGZx; { N:R.ҡV&Cšr~\koFOSGI-OPT/src/org/omg/PortableInterceptor/ORBInitializerOperations.javaRn@=dGڜ㶫FP(j nww֦RJ9hg߼y Ehy (OYߓT5r|/P2 I!RajЂ!dFnbGH+L0t5[\`/!sz|x ޛIH~w3%8q譗 `>ӳ|HqyRhۥ[Z-T΁Yv=4[Y;ђ'tGi14伥_W#[ؤYVfpUɃ|.6eoĺU߈(r>},/"92O,B-BBBϒZٚ!tV#0hZ lMO{ҟJ (✿"N:. ц]k{aˡr~\k%o($eO?<{+zsԀ#_!N&Z iMwPKӠJPKK><OSGI-OPT/src/org/omg/PortableInterceptor/ObjectIdHelper.javaAs0d2ԐZNLY^R#߻2N'e{gLֈr CHLrb29}F1,}%Z4;,"R"7X@- 46f~BI&A_ ^U5lY R9->rGktszOvF4/li"Gʔk7lu++ !y Lg9Ve攧npB#jf:#H_6PlL pgI6"w:]]\ƋU2 ],]\%$]ċ{,FGm>)BxV$dM5+JC#h4[aZ,L%1=˗4#-8^"L]*b`ArXpx }DžpO?U8?(N2|?KqvLV6d]USؿy`;8rE];% ✚DOSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceFactory.javaeRn0}_qb&'Zi \[b{ E} ^s.`hDs0]'We` GZѢ9`͈܉ zYC53 %-aiiaGAo8FtZv $Tj'ip9WO*'8 -Dsc Q1SFwzzu/; !\(5HkNyՃN67pQ,[%bHГ<&JOSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceFactoryHelper.javaR0S09S&ء GY8Jrɻw2m}-ioI`tgDr0#HOLrdr?"? E2"/r%8J%4DnkӯJI4KKt5@*EF{ځZhp]^œm (Qi 0Csxܶmvđ2ոU2;Ϻ5Z 7PELg֬eUi)OᄬBjZf˔:#H? ۘAC4Γ<"72^Me|f0Kg"I4x~ YHQw@۹Ejd5rZU*JmH4~[-^kMҗ/4"#/8^"Ld*l`Ar 1eK w}ka<~Z_~/GNІ4;Xvaft y;a5iOQQcE4C;g1YMQ"u_d7t(4TI~jQڸCo?PK{ P[PKK>JOSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceFactoryHolder.java_o0şOqT,a}xJ)]UdJ>U& ۳Ҩw5d]4α`toxu0.&9Bp& la qאI Z4;,CR"@iVhmb V Jq8 KK "ip x[v%Zv3x41gASxsSu]=qLì.r/R  lě&mUV5EOSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceTemplate.java}Sn@=dG.9QiQ#iUU47bbUTJ@;͛7Kt>̫dq |z~]> GZɒS2'IK5 &nGk3eJy̦lq)j s "@HT'ipc+C\<I9E8!ʴQw:YobUOU7#kЏA<jVUaZ;AG#j܈Prj߀-xtz8[WV=1-ۯk\z/9_nUދ߹a PKcdfPKK>KOSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceTemplateHelper.javaAs0W3.8>'mfLfrbbI'ޕM:q:N3m9v~I'TAȇ$M#x|:0k}-5V)xkQZpKD3N~eX$Ec}_ '^bZX H堵HB4Q;Znӫx5T3jx^лk]ElG)S;rV\'F6h- C 0MTڰV5KOSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceTemplateHolder.javaAs0jhn-'ܱI39eJk&i4N9V}I`nzC0,G$$JIKtn ~אI9zt[bV"DVW6%+cK80 h$vF@#kHkDK 5=Z'iU \fEo~<zgCd?L&]bOWOaO.٢8{K{pv ,SbŬJt`! ԝ$u=o A\_&4 b'I r.ϳ%\%y,YYlq.lO!Y\tq:o S:9 y\˒5Bm4'>g*(H,W0D=qӱiqK5 gm,KR &V߰_|BlPgI^>.ȡht ^_0P-$^M0Y /tjҡJ9lZ,MpCo!Nn=w _2Z}PKsF7PKK>NOSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceTemplateSeqHelper.javaQo0_qT,о<[UdJjڃ\`CU]C:Nն<{wQG0U5\:$'QU &9Bd<>~5Bȕ(-P %B[2hPN1}A[ &^U5X R9->pVCk[nt*n; ;F4=-sZ:OGiB%)Gծ֎,xO]׵Z0x_ C&*rbX+ ҚS1 YkA/Sk#Y^@1 (8YЋz7QFy|A48Gf9)2x)|] qavHV# ɚ,kV"jF#hVmXxJcn7_~((^ժ (|zth^+3 tSrqbw] 4H`9+]Zi_c?A$}PiEa$[X33 HuUM`r['f(w(ѷxh/P6AV ԝ@K];rlưƩ*ҟINOSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceTemplateSeqHolder.javaQo0_qT,<[UdJj*\vRTc{tLXY콄P9Bx<~3~;kH5!+xKrX@ @+Ȉ!|BVpzRo0@-64A5>GC 6Z+iT< tzAo0A"2'Q۶ږj7F|fnו9xHˉr`J-"ԭ$U9 ^\4}k zQqփ(4f<$i2;q2wnC<;re)}S R\.eTوkA[K1`e*YK}"7 qӡۋg$0͂KDy%8Y|ŜR\Esd|A݅σ5*rO$=B9YW8ZT ND<¿/ֲ[]+Ю/mo NupKo"5Vjjoo?2Nc|PKm=PKK>;OSGI-OPT/src/org/omg/PortableInterceptor/PolicyFactory.java}Qr0;> nnmNvZȀLB,X-H$BN+vvh{o`dD{t+OLrz>:?"_#-hxL"鮄MmCgt${/i )2/x$S8[BBΒF.ɚl"$GZX{N1w*r(HmtҡV&CER~Tkm^}cp(kcIWߐ𯪞tI'ovt1)'kPK{6PKK>EOSGI-OPT/src/org/omg/PortableInterceptor/PolicyFactoryOperations.javamMo@W|# NnmNqZ"pT^ngTw&Rh>xwҋ.`eH{Y)%jߟIHC:T^pBWz~Y!3Ubp,afSi FC5Fu*zP9 mP~3x4 nyOg0$Hj|.Gz:zEvaJ-vbC ZByR^6g? SΓ̴7F^}&4̲z7Yqy7_ 9OSGI-OPT/src/org/omg/PortableInterceptor/RequestInfo.java}Ao@OvD͉ͭnjANxw;XU{gm9T fg|M|9Z 򳄤P5z|?,"_w:(С}&b/5* A GH3ZuoMGō8J YC:heO539'ICW$]e#OϞ|q#q"mdSOT΁_:0LUY{1 :|FSVT]N4 ^z_F~ mReEݗnIQ$.ݔʳuK>A=4['cƔ>D|33XVlMu:V#0h:lL/J z!N:҇.-REh PqZ/8qtVBոU^&Q^7U3GzQ$ort1'gsPKM2PKK>COSGI-OPT/src/org/omg/PortableInterceptor/RequestInfoOperations.javaTn@=D.vsks"NڢF&QTUv19jZ[}3`)Uy0N!J>s3!L3;! hP0 EgjåsS酣d5@H A ^!>Ce dFi-۾!S肢̎Zq>ogb_r^ X3 ׫o݉ iHURZVjNu墜mFGsc5O´F@1 0ȇ܇/8V:(e aOkeJ H&wv)BBB!IFa hlXPjAB]sb5$0w4e?k.hyOGDN.[s/Z O5)JY(GcCQȈ=U'X3iV#].5SڲGcO[Q `?L( up)s$԰+(}:(|@/at'ΐˡ%h ncf3aM+ooJ(&-[LPX.b&C*͖ZhN3xyJY! 29+) TML'?>ߞPKk`PKK>8OSGI-OPT/src/org/omg/PortableInterceptor/SUCCESSFUL.javaeA0ͯx+нeۨ(Tڣ `5خl;TUspod7 n0Ts WWma|;}Ϗ4萲BY:} p$VV2S$ѸMgǂѐMQl:tXCyԪ%sE6@iTd^ϠI8h}\.[2 Зe}ߧBdgb,=Sv%wO?CZY[8炉ԽSAf oKGQ|pj߅7c_mRc b/(4<ofb)`.m.v|2C SE;[ zP+TZU>OSGI-OPT/src/org/omg/PortableInterceptor/SYSTEM_EXCEPTION.javaeQAn0AZ/<OSGI-OPT/src/org/omg/PortableInterceptor/ServerIdHelper.javaAs0x 2ԐڜBO3I39 {1jJ2wENh&M8֮~ID8Dڣ_ _%Bx|:a0'GvKe AZhTI~MH( 񃬓Z,z]78{`#Pڣqa%k 2Rӡүs:@NC/v ?7BY{o>Fm@k[^7N'Y>ݮUs/ dZ5uko SJ\6('Fc $Gpi> "*Y6ϓ"dtf3~dvorx S8O9J?"9C\ɂ[H1`dj^ _a(8_AkCzdYk{fɡB,9Qx`<\;WTpGB{=z(5]qL㹏{C]U?^z(k1?DPKҐ;PKK>?OSGI-OPT/src/org/omg/PortableInterceptor/ServerRequestInfo.java}o0+NyJ*Y߶>$۬U0A=(='lJUJ IHr We!HOϞ~Nqy"N\;SOuރ߃rxwi;fƁ@=:EJw1x(Fyrj7Ы1MjejY%8<~ YYfVl*(JXZlE d#|:ȸ>[0 q+֜ZfkdЙ'tEwP>3`dzuP$WhF+q҉9t('4 6&ÎCx<*qѓЭa'uVEy%vRKnI1~Sr~OVDPK3pQPKK>IOSGI-OPT/src/org/omg/PortableInterceptor/ServerRequestInfoOperations.java}TMo@=_1D;9'mQ#(*7]GǛ,9pKWn~ QCPלX,=ߏ Cl+5ĨQm :QAZkxR̦B N#ap %pck eNzn6 2 CfQ9NB`f"=>cOy>RUz_f| S׽QkPgX,#5A*`BiY.*,MZkx֙W8d0 \Ix!\qZ7 D1,u>Czo$hZeMnoWJ[ys&UܢZT v 7̌#]vq_eSwR^( *k.Tb%'Ʃ|GmBQʈOpgP=D?I6XZNyҍFOSGI-OPT/src/org/omg/PortableInterceptor/ServerRequestInterceptor.java}Rr0;> nnmNv[L)Ti tYٴL&h6G+=^@^~F_/CEPxGl"f$[Yr@{Ĉ?N?:\GK{lښ-nI(i3x%0q0j/ h}zDsH.Xo&+7XtNX=Hˎ#êjQ^-"G+I.[EOHGVVF~ ؄YRBZ6)2$[~(lnJ X:ݥyƫ/d=! G}XeJyP"$gٚ!tbG`cu,4POSGI-OPT/src/org/omg/PortableInterceptor/ServerRequestInterceptorOperations.javaœn0 S9%Efgm9yi+NW(6s$}TV KϏ?*+is Yo ' qH dn ~? 2d>Bie ^N,Ъ !6O3oHVj>`o FS/q-lvZd i  4BoMI9U< <z N0Wp=8g>DQu89.-SYAkG+;^@*ĚYс&5!9;Nz VW^֑\iM(9$>yC/!βxL9MLBx/f Ȗq0v93JBVT݊;$AJj2J'q鯾|(^jr޽D9$?kMk6Js(cѺД)wJ{I8|9)xӲ(wS%?* ;A7L qBN_.w[S_VNw-zWKhÿԝ?PKHVPKK>=OSGI-OPT/src/org/omg/PortableInterceptor/TRANSPORT_RETRY.javaeQn@<dG.Q/u5H#5~U.]L6â}ov̼*V; YM"n[)TE^/,ei%s] NV,Ы=!Dſ3O2VjpLd' NPڡҢ-*B(mn3x%،z?VBQ;D0 8+i]Z=_=?4x{XU%h qiz0IauauFn{&k&&qK\$ܓ<&cqZ&YU&e|8GAϡx,S8/[DAFB/lGeTӋ#ŎБ9HjYӴ p(8ߞ q>D92~,rj/bq|]<FL-ha vl8'|e7^PKQ O'PKK><OSGI-OPT/src/org/omg/PortableInterceptor/USER_EXCEPTION.javaeQ0<唬(Q4K[YA*'TU9yMtw698LmPa߅,eiQ%s} NV,ѫ=!Dſ;+"c5-=Y83v-1eK:Pc7J;\,^ Gst|_!(>0 (i]J2}˪W[Ւ0Ďb6!9UF:Vn<^ZgwBplBa >%eV!|]o7xH"7YZb]`oMIoY~82COXq^蕄Z_%َ*Yˊ '2#s֯ղiQ:.|Aqpο<'ck|zrdY]P9?Ղ7-gc{oxތZ*pmO2PKPKIG@$OSGI-OPT/src/org/omg/PortableServer/PKPKK>9OSGI-OPT/src/org/omg/PortableServer/AdapterActivator.javauAs0 76'b-Sti&G V%UZLdwy9E(_! ֲ5[S :N*vA:/˃$A|Fqp?'C}Ֆ|zS60Cyrt|I# '5ɣ ==+.;5zEN:Golp+PKIF2PKK>COSGI-OPT/src/org/omg/PortableServer/AdapterActivatorOperations.javamRn0=i7ɭ͉n-jlT 0nvmd;ޥR86J 򋀤ʚ`y^_ȗH Y2j"f$&iQ6d 5BIְżX]{a#H`B+zzI;j5Y$gfJqPC#мj_,xO#e?cm|nY}ϪS'kЯQv\5b=N `g'#]VnBCQMh5 %,r2-CO;xH"v鶄Mݤ4xMđqz;`y"Do$,jE+j&;NHv e S_Q'#5tѝ2ΧW;e=V'GȴNN)sKR'gORMGwy4~#o+*9jKPK_PKK>0OSGI-OPT/src/org/omg/PortableServer/Current.javauAs0 76'b-Sti&G)H0lI)iWoD|llOjyYBuR ay^V߆w:(С}:b/*5 F tBH3WBI:Z7,bu%&=@/&P`pA#;|H͌6J:*f }$^5A }~NDc3qmw^.+wz>u:t,e aJ#h 5ҞzjCpQX2tdq70 PHJH&eZ^>=|pE] y<ۦ4x 6x>0q^nJ7 9ldT;Տh;_ct$/?(#ݷ7mɧWf8rm_f1:ݟMmf(w$M&(gFgPK1(!PKK>6OSGI-OPT/src/org/omg/PortableServer/CurrentHelper.javaS[O0~^~QZԥP 5SSxt,cBaL\$%U<6_qy@:C`3C V]"_!$VH~t3Cpn78[ZlACPFփ vZW;%8^0\_˗@3VۯQ۶9 Uzut2[ukt48qaٕ{E @T2D}(##@(WCƩP-'/9񇖎()PKjWLIPKK>:OSGI-OPT/src/org/omg/PortableServer/CurrentOperations.javan@)F>ّ nnO-j8xVwMDiO =8Hw#-AD^,ow3}UZТyg\ zU"(1 + SW0&Ct;q z̐j"Ď@*(IcLnd [kKԽa|q4iTk8Z% [nTւ47 ,L6*4(MM&>#>5t#PIvXZAOSGI-OPT/src/org/omg/PortableServer/CurrentPackage/NoContext.javamRr0<θD2@fr'ϓM3ɴHojwHtw49LDܶR0\,>YQxEÁ<ɭHYѫ ܎wX'+e&ci2Gc/Pڡb+[=V9HJQ ta'.-OιK P&jXݦ2+YصV-Y CziѱJlXk+h^`!OSK]h5M(Li9u\ܓܧz(l.K}~װAň~PKP5PKK>GOSGI-OPT/src/org/omg/PortableServer/CurrentPackage/NoContextHelper.javaMs0WZNCO3vfrbId& L)}W,3Q-dwQ] . htݿ SiaKF ^F(- %ByA.O4V( l}BKlT+4ICXX Bt T< B4S*{Sō1(>kfN!pPԜS+]cM|"<^5gZdۮ{.Φ܌|1dScלyYNJ扲蝹%!:mu{:yQK Jw,q4)Չ 6cUҞS' #wA PK1UK?PKK>>OSGI-OPT/src/org/omg/PortableServer/DynamicImplementation.javauQo0ǯ8SRemM hX&4wЪ6lcG.z0-gHoqHJr4?B+-2dTMndIR^Ud%X.^0&+oq=Zq%;豤A*FAIp?z >lVFӷwE0DjSGYkdL=U Y C{i1U) fmm jC紧tRsXs0m*iEޅȭplBaH <.~Oo,lu42ݬmnx?jȸ=vwyEDvd;*Nܚ{Qj} #tdZiZM#[;-՗/8PuS2WA'D ҡlJLZR"܍#Ux~)0f:*z-}в;<Xu d ȲN PK!VPKK>7OSGI-OPT/src/org/omg/PortableServer/ForwardRequest.java}Rr0=Pprk}"2@fr`XR%a߳rh&6#6> Jh|yE@uI0CYC hXGInGi^hm8}J?X$\Dszd,Mf OqP=r[$a>pvz6=Y9T5h:5o(lӟxGʴqM\e#6Ck^r\iRYEZ;62ZTsʫpB!Xո4Έw'H(6&aLʴ =mopEU y=OSGI-OPT/src/org/omg/PortableServer/ForwardRequestHelper.javaR0S*aR'kYS&ء Kžq:*1&ޫ`:)ѹ=G=aj1(HOq]K d29Q,(2rd7TFLeAQFdW؈_:N A` b =G!&}AC*zm:VվNHpy,<wk8m=qm5n|L/f{fݨb a fE m!*K'#:tol1eq ,#3Tȥ,5U5"TzCVqG0d҅eu XZ~뷾Bq9FtUE[Þ=,8O' {-Wf<9E5WC]`KYJЁsWkeɛkGogkߒ(_nB(xaͷ /o %#z(m!ҿ~PK: EPKK>@OSGI-OPT/src/org/omg/PortableServer/ID_ASSIGNMENT_POLICY_ID.javaeQo0_qT,}2`].]2&X vf;5R!s{nWddw#dD\R0L(XzŒ,#Bv& eiV q# 'c&cV 'z?[ J;CZ&sAT(::'['X.Bëg\% ř8ԦFlLzT5Y C[i aBl Ӟ3IUau:auFn[!7Fnc 8G-Γ|MՏqxUȑ-1yJWkLđqzn12EDJ}A VTJ( ~wަ;oח/qҡ>T6ΧLr#S v2yܥjT֛dS-5|[W\NA PK/"PKK>@OSGI-OPT/src/org/omg/PortableServer/ID_UNIQUENESS_POLICY_ID.javaeA0ͯx+{jm]]qB&L`CUC*9$7n`aX_%⺖Bdr;?BWZ,ɒ9>do Rh՞ ܁7O22Vjp h-κQCk=E)k8HBpӻxlzs/4*_ !\}y5Qu](.ġ6UT_6zHf4_gZd- jwg cZt2gN{H'U5ե!okݛ1rP9|qco򜬾e2NW"G,K*R^}An=IcGu1Ɣ>A(6TRܚZQ*}"#4dZ{Z__POoIX8^)3 vyrtL)x|N"]1lwJ԰"Nn pa PK"܎PKK>FOSGI-OPT/src/org/omg/PortableServer/IMPLICIT_ACTIVATION_POLICY_ID.javaeRM0<7b V4{kQ)66A$+NȄ`5ةl c;OSGI-OPT/src/org/omg/PortableServer/IdAssignmentPolicy.javaeRn@#숂[ՂF9avw{fmZ μ}n`@0_%$]'i2@EOSGI-OPT/src/org/omg/PortableServer/IdAssignmentPolicyOperations.javamRr0=Ppsks"2@dra;Iʦd\b}z[W\J飡v`^- /$]GBVS~^D PE:bOrOJ5 FnhQoƒp-a4[xG`9BC*HBz=YN:w/:p4@n2}v/q@OSGI-OPT/src/org/omg/PortableServer/IdAssignmentPolicyValue.javaAo@q'ZِZجjﺻk+wJU}ofփ+`$Flk`9g"Axu2DV!BjɄ'(4nT`~;}x@pzеN E#+(XB4א, p,f{i], ,[6JOL }xƔA].;ReՃI8 qS ֠WunD5e iHK]+nejjl6+s6FjT@cc:~ a܁;?5y f9;OSGI-OPT/src/org/omg/PortableServer/IdUniquenessPolicy.javaeAs0 76'b-Sdn&GS,)t߻iN8Hz'n`Pw0f#!+|)~E~ i@Ț*ke!ѢX 'KJ]4oKUqY,4![IAhiΨIyP;']ͫO9%aĉ8Rsb[Omeւ ;AhĎY;12 Z\sS67^& zw?F~ CReE|(lJ X2ݤyƫd#͖! GsM1yE(uF+jbkEЪW4Fs 2`e:: qґ:ѣ2ΧWqCJzQ2ڑ]8ȋ$:wzԏz%I9_PK 6PKK>EOSGI-OPT/src/org/omg/PortableServer/IdUniquenessPolicyOperations.javamn0 S9%kgm=i+NZشC̑TI {Q7|!`Pu0f#!+|9^" ϴPE:b/HJ5FnhQoƒpa&ch2GNA*E uxP; m =U< j y׼OFӷuNa"q"ikt5SֲCk[O;AhĆY;12 ZsS67^& mzMH$%2-C/򒮾$EdtYB^"Ug{${ive\)BQg$*nMhZG##hvdX-^9NG}Bq?;]=){S6dFz-GOcǜKUP"/"WKg{Nu?PK)K,PKK>@OSGI-OPT/src/org/omg/PortableServer/IdUniquenessPolicyValue.javaQo0ǟOq *h6f%@>!.ZbU|!EMD.]ypCUn6I  B߿?t| 340C >d"P5j =.ܡ6BIvV b*(P$0,- *FvP <4 Fzm-?zu]|o+C&l8{nN-dƀJhx^UWi=u2QFY cXUlhi%X܂ fqAk}0ᜍcf0(. s])8_b3TLHEBɬBPKJԅ0\;L. a/yѤ}UdTiJZAOSGI-OPT/src/org/omg/PortableServer/ImplicitActivationPolicy.javauAs0 76'b-Sdi&GS,0t߳iN`ZM7Ph9V3˯Iבv>?"_wZ(Т9`YSb р!$ZTwBƒpa&dv%8TzAB$TjG4gT$KOSGI-OPT/src/org/omg/PortableServer/ImplicitActivationPolicyOperations.javaun0DW,|GrsksRH$ȑV2ɒewiE4:P 9};dr,9ZjrE :J"Ls,P=1;;Ы--Bj߸3Gx [u8vJ{9hCDH3#@~{3x= >`xּ#zo>'0 8ڶIwֺ.[juաs`gO;Abì@[E:PFOSGI-OPT/src/org/omg/PortableServer/ImplicitActivationPolicyValue.javao0_ *ho!YDh*c^lU{j[l{Ń`AW IIBr%ym{9Z4\M@eqZF*.ӞZE8tڣNo-oAiE2Y ʁT tYht}œ]롗SAEXܵg\y0h&{P|Pvp8~$Zh-]KC/+|Io@A:sS7F:>X6+iڽ퉑F?Pl\A'JR-[|OpQ`9x,i~xȨ>TO@y"@V(d&ޠQ4ThJio6,nj.h/oDIÙ6Χ;eFAU/)O'Ltpr7iXrm/j=C6*'s&/zNEx/9xn"S.#Eܟy[7S7(y۹2ڡL]f#;OSGI-OPT/src/org/omg/PortableServer/LIFESPAN_POLICY_ID.javaeQo0_qT,}V  %U7OSGI-OPT/src/org/omg/PortableServer/LifespanPolicy.javaeRn@#숂[ՂF9.0Uvw{gmZ μy[n`nO0_%$}/i2@)2$O[(lnJ X:ݥyƧ/d=! G{XeJD$gٚ!tbG`X`izy$Tz/s8HA[w*Γ#x~dqWyqDfj&(]o7$] F[r67 PKAD.PKK>AOSGI-OPT/src/org/omg/PortableServer/LifespanPolicyOperations.javamQo0ǯSR1نVAi>s!l]'lj`d; 6JOF{K& :$GX^ןB*Px-9x{QZa5p{D3Ny''4V( ^o1z6T!,4C#G@H3(Tgv$2{13:iּs3;8;Gʴqw>lrSCkA긚i"֎ 9G#mV5ndM-3EhIX$%n2-Co;xN"v鶄Mݥ4h~]HQ<OSGI-OPT/src/org/omg/PortableServer/LifespanPolicyValue.javaQo0_qT,}R`[4PSeM؞4Eא"PM~80jyHq3#F!weH@#}rp&s0FQ vpp)A zVo0v[@Ͷ yp)Ge e:;OH+H耢Uq*f;V}m}'.5,OSGI-OPT/src/org/omg/PortableServer/POA.javauAs0 76'b-Sdi&G V *-!N{W6$ݷ{" 6ڜzyQBRay^ V߆W:(С}&b/5* A tDH3Zu/XGՍ8q F!G TPhyάIq .`xվ,A39qJˎTh g=d%IՅtKejWfd/ 86` Mʴ Cz!)$;6yMi$#|Nmȑ|6;`L"Z}ArkʚnB*v Vǀ Iy_~P7/IGz;mɧWf8Oж/.OP5O&/n(bM_f~H)ϰs1~/PKPKK>2OSGI-OPT/src/org/omg/PortableServer/POAHelper.javaR0S*N`ײ2OC}:*1wUb/##y9gLZY<YC"k)TAC ØÌ 1;sYrTQ%Y!1G73/Njx~(XluBi{H t[ ^~ӹ\wz/0|*ZyoFmbGk[֍4?ݪKUs;^l! Sbh-Deԭ^jM)rg=0rOP%9Ҽ$Oa0JgWlLilI6=Ii6HNO ЭƔ!."'z{$gKYpkjDE`Ȯ  6\K/n蟾BQqο'u_hCzy8S(2͂Xp(jYrF5]<='\`(^2agLq'j`g7VA5u}7b#I>qF˒=U͂]hT kuZ!N}anI/MSeXh54%K~yog׈?GzgQPK %,L-PKK>3OSGI-OPT/src/org/omg/PortableServer/POAManager.javauAs0 76'b-S2$Œ*-!N{W6mvF=_p+mVv{y(!{)T0\.߆woC+>bՠ#$FNBCVp-a flq%z8C֐Z#S@*LhiΤIa .`xվ,AqHˎ#T#h g=h%IՅtKejWfd/ 86`3Nʴ }>)$ۥVyNwi$|Nuȑ|2;`L<"Z}FrkʚnB*vA:/˃$A|Aqp߼'ChK>S*0Cyrt|7yE(nqzWyqDyk 5nEfFr65~/PKv&PKK>=OSGI-OPT/src/org/omg/PortableServer/POAManagerOperations.javao0x꩝B=@Hcir"4;iC"{K|,>lL ⃀maz5_@7oWZXE*"/r#8JtBnh3JU4/GKT;vtICXEO!zᶃϨIaPcT肦U}Z̍óuN#6G4q{M\e5Qdւo0qyX[փ2t攧pB6!XU2Έsg=3R0I H K}m>Yl װ̳tC=4)2'm|)|)BxP#E-8&5ڣh4;aX-V^;A@9BtvMt2@w%I945ag&rT+QN錬_t*G(&T+Y*"egf܄TBKՂGEh3VGPKiqPKIG@6OSGI-OPT/src/org/omg/PortableServer/POAManagerPackage/PKPKK>JOSGI-OPT/src/org/omg/PortableServer/POAManagerPackage/AdapterInactive.javauRr0=);=iI;=n#p$!q3;0m|GڷO=mr̵9Z<ꋄm%*A0>L׏8CJrdTHn 娆NdRCe wd .`4F@qJ{1t-= 2fK;3%0pG#7m_ 7Ocm=c]ryxϪj9oU ܰ{5J/U3GK[hd/*d*>[}-+O2W٢ydye#{e"z%aϒ!!R5t4@V#0d҅gu,4KtpQE@IzKm}H 3ee~G<"m8a-Y~Zd3COvIEyki~=E7 <3Ά( PKĀ}JPKK>POSGI-OPT/src/org/omg/PortableServer/POAManagerPackage/AdapterInactiveHelper.javaOs0*HnmNIOS`LFR%wN'ftHOo$N"86+˥nރ4,!**' }0 JSrdTv&72'娀Zd/ b9?ڙ>|#Vp& N;aPC=!'A*ʴhm%}Yзk84M#pK,-N7j]gvխ9;o S8g s^J/UAK[9^hόKdž :qIց8K~0Kf 4ϒ )e2K1}x|_e#:`l1es!,Bܚ*k, J�dW҅mu XJGPhE`I *D[™b_QNvsNpΙ`!; 4lxH*]+|E.GSs}6ӋXjkP̒UW9<k![~s{Z˂UKtқd NzDs##7m t_.QZ}7)~PKFHRrPKK>@OSGI-OPT/src/org/omg/PortableServer/POAManagerPackage/State.javaSo0>/'XiC;Zk,ڪʄ`-3i{UbDdp U"_Y= AQ.Spxn CѠ~O d&RP%j+)=ڝ>ܠ6BI8uNZP5He6H@& |L $ZkN]ˡӁV.mMo՗ioJb5Od\eƀ_Дx^/kPxr-yl5:0VEmJ{HwT `I΃%}Grn89&0 (7;I*#|K@6s!Aܳ%Sa*2R46OSGI-OPT/src/org/omg/PortableServer/POAOperations.javaWMo6= 'gᕓڜٴچlX-eneRKRvC}ؒd9$9|p(u߷=}F^GO{O@x5Q6ɭ.X0$`r =$2_Z>ὃ$y!UFsx,{A۸ZPKS PKIG@/OSGI-OPT/src/org/omg/PortableServer/POAPackage/PKPKK>HOSGI-OPT/src/org/omg/PortableServer/POAPackage/AdapterAlreadyExists.java}As0*ڜB[O36cC39.bId  N2y$==}UW0de0&_$$m+QUx8atP#{ZC0)G5t& ~G7L;Y'k1q&Xt{<:G!leK@NJ{3 .rgB@?@S}/L,mu}:_d=S֪%үNZxs4LUY[A[y{+T-Z:ooBȥpl`#Mʴt5_!)$[yvNOSGI-OPT/src/org/omg/PortableServer/POAPackage/AdapterAlreadyExistsHelper.javaAs0d2T&BO38I39 {1jJ2ƓwN'e鄃o}`tkDr}H\px>~3f^ia FF(-P ByNBI`C-#oѪּCXX 9jBBֺCk[t.:p 4=- z[9?GQ42eT6IƓi6H]՝Z0&^5Q|Ao@AZsS7F8!Xt 7m aH?Pl\B/ zpgI6&:}w ߿`ԝK͍|ƸƱ*[c$"Jkw97PK;PmPKK>FOSGI-OPT/src/org/omg/PortableServer/POAPackage/AdapterNonExistent.java}RAn0gš6u\6O拴X|díjZIÎ7'UbZCל{#TVo]/ yJZgsoBplBaHn")!Y}+ϔ Y np<J4(JLrl#gmyFs|'x3%" מPK*LPKK>LOSGI-OPT/src/org/omg/PortableServer/POAPackage/AdapterNonExistentHelper.javaAs0d2T&BO3vfrbId wN'$$o}`ֈj ,_u-,‹|kz)Z4k,9xQXB#K4ݺ|GcpzA[GbX-H報HB)P; Z+rߧs$y$Ti\ukEm2'fTQ}&O|򑨻;Y`W# M<DU9ּeWi)Oᄬ`µܠ)uFw#\@q 8$e''ntdC6q^%$K |Kҫ EF}p0󰋐#!,j,B4^!TjFDѬj 6X ի|((ވfjU[eO/gʰ,=(Fn-9 E =.vhR%' ƚ`1U}xY[^R{xM/c-F]c$ȦG{_sce9m5)%+Ou8TzO翄c/tWG3#_3cVXt`{#!"w7PK/OaPKK>AOSGI-OPT/src/org/omg/PortableServer/POAPackage/InvalidPolicy.java}Rr0=PDe(Œ* c&ʦx:-@ڷo߾&+Q dWq.Ktz?M#-hbIEbЀ!Ě"!@cpǦ0MfW-yR9h- KR nw3x%GOSGI-OPT/src/org/omg/PortableServer/POAPackage/InvalidPolicyHelper.javaAs0Wdg(vrk}"N0̀frjJd߻I'NI:` z'1=RW bICXלa|6@&{ SHѠn \QA+6RY0d,z ypk^#}Pȭ:n7>#C斑QS!0;@﯍tu]āմ>h:Z\GnDƀ_ 4qSDUXkց*f4\T>lJnycB{dџ (6&`fe#8(mJnVpi I|$/w-/|@n..Bx$k^hjXP@r`ljrG9tFt Uں2wtLA1TSr z$ZVr)iš80:8uȋSIzezzh ye1ho)@^_j%/Rg'}&D#+Q4):6Z sI%HInyPKuKCPKK>=OSGI-OPT/src/org/omg/PortableServer/POAPackage/NoServant.javamRr0<θDe(3V%* O&'fI9޾E.0z0.'ȊqHJr62_'?F9Y2Bf$$eB*2p;B܊Ce;2Vjphr)^Cg9V6z,u ޷^鞁+7N0\pC˻[ Ds(>'š6uԜ6M拴X|fCZ5d- aǛ#D˪Ja DmkN{սNz EA9Dtu ?S&\f n(ѠlN ؉#UWy_Gsq?nOo<oq=<3APKGP1PKK>COSGI-OPT/src/org/omg/PortableServer/POAPackage/NoServantHelper.javaMs0d2T&BO36I39 {1jJ2wN&$m}+): JoV¢YU@\ׂ!@O}gZEJ%4Dnk^У ;+ 6'P?[oA*EF!Pkݡ­}:OZ8N 4}-_&wZ9?GQ۶2UTrmt'i>H]խZ0&^lk*Xkނ2+sSF8!Xt-7eJaHL ۸^C2Γ|Euv;x6y2!8Ky%,>0󰊐#!,j,R4^!TjFDѬj 2X sFQ?9ԺbSew/{ʰiO@7 愞*ʥƚ1%D><֣o7f:d׾sT3f16 A N{μw,$D]QC΃*^yyB2H8 ͷǪ=H/5ȟ,|(k1ҿ: PKYG+PKK>GOSGI-OPT/src/org/omg/PortableServer/POAPackage/ObjectAlreadyActive.java}Qo _qpַO46k]ɪ>b|9Ǎ]oji~nz,=:L uJh0\,>́Ə3J%ztl9D[%Q{l :;n߸32.Q0&hq4= {$a:|h( 6;3Dx=L4۾#ۅ`?0 Lqmڝ>͖Z'Fw=8+GGuH{Dt;oaM|pÛ~3R0dyUhr5:[UP,l9>[)2q_*7[sF*I-Bk4U^hө "+^& #Q[vg\U+Yqؾh@veC [$neQ^s&]'6sntt<`1VP㹗$PKhOPKK>MOSGI-OPT/src/org/omg/PortableServer/POAPackage/ObjectAlreadyActiveHelper.javaAS0)aR%pk9OCqDIgo}GGDr/f_%U%xt4`5̃ ɥP-Blne:1-5y J{t 4צCk_mt.n;{NrN/}7Gi3mQӺe2βGU΁ş4q7D%xNo@[EZ:P7Vz!8 l 鼕yB{f_ (6gd=8$dq^/&"faΓE ij[·{c)C] qawHΠK)h4UּD(]K`l* FQD9F4]iCzY8S]Nq:hD =Pȋ6^n+CWrPCOSGI-OPT/src/org/omg/PortableServer/POAPackage/ObjectNotActive.javauRr0<θDe (+'M;I; FzV]RwG#ô!+Hm+~GZdʊq'*9R+\ L=`2&+Oq=zK!-%SET N,^ F]:p ﶯn}vuhP4Q{6YbU]Ւ0GUUd DckN{ՃNfn+ z#aϒlGʊ 2#?ei^:NGEA9DtMx~LxwgU%GsD;+rvq#U?l, 48~螃w#_AyXk0%~PKACPKK>IOSGI-OPT/src/org/omg/PortableServer/POAPackage/ObjectNotActiveHelper.javaAS0)aR%pk9OCqDI gIz'ytLXY-=%W2~ Xx t0Cv%#`r)*%4D ~.֭ 'Z'6~4Xlt+=4C:XR+ӡ/}:@.<'9COBྃ^KѨm[ƷLjTntLi>L]յ9&.6 Q ^k[xeּԭ^jN/|-R:oeОi+9$y<ɇ&_dsg8'L<'YJO NoG)2Ɔ S8w9BA!RhjxP5ZEA.l#2r%=Wr(iWևp,⫝42MA/( .<zVܡrX HOSGI-OPT/src/org/omg/PortableServer/POAPackage/ServantAlreadyActive.java}Qo0ǯ8SRemM V}tx#6MhT:aUMwotswr&7$/gOSye^i%s*dor+KR*t"#ĭ(7LqGJp0Ѱ5\yG(Ybi KjBK;3x< zhy}+p9~Cq"欵m2_#S֪!kaw' W9BLU 66!sSF:)޺^6MޅK+؄(.#\ERL}WGLAC0q_;>#ٖJ%NԄZ(-Y-Vަ{;-U( 7Cå6ΧW22gUv@e#۫rqcHTǸt{đ<˯p]8uG`/Ox5?A>̆APKUn+mRPKK>NOSGI-OPT/src/org/omg/PortableServer/POAPackage/ServantAlreadyActiveHelper.javaAs0*Hn-' f0i&G!/FTId] id:`loYg0֦X{W qYJBb8<]?Xx t0Gv9#`r#*9T*G ~.]wNjl K(X4 o@iCVDƃT ƴh}%}롗Ss!pBkkLbPnp'l۪[Us`W%-Ml|I%A[EZ:PVz>85lr鼕H?Pl\A' :pgI&w:]]ebaheWVrm-g!\цS2^2E S@iXLin7ulh uNGn[ QZcwqEPK~OmPKK>DOSGI-OPT/src/org/omg/PortableServer/POAPackage/ServantNotActive.javauRr0<θDe(3V%* O&'fvAvW/pnF;q9AV|F UƗ٧)x< 1rɒ9P2'%)K:UV*SܑR+\3=`4F+Oq:K!-!cIT(N ,^ qZm! kDQ8)挵m2_#֪!kaw' ;!ZVU kmDm jC\sګtRSXu0i*iν F Q\ )Fzd=[pyE,JOSGI-OPT/src/org/omg/PortableServer/POAPackage/ServantNotActiveHelper.javaAs0*Hn-'ӌ`LB^Z#d] dO,3k\ydg qUIBb8<~fA` FF T U !6\Э]WNjl K(Xlu k=C:X RkӢ5ү}Z@^xNrNυ} VޛA4:h&O|۪[Us`G--M7D%X+ހKunR}pzn1y+? 퉑F.ظNCw2ΓLuv;x6y2!8Ky $U">`l0e󰋐#!,r)ʚޠU4k¶:,M%s\ (fz]>3e4(20 *NAȕOƊP1z,vKxQ{S8],V[p; m,*PuU`wpe9m2%)U- :PԹ7P>E^%ԞE~cLF.ҟ>>|(1?淋PK|Tm?LUPKK>@OSGI-OPT/src/org/omg/PortableServer/POAPackage/WrongAdapter.javamR0<7_1+н{ʲ"(=;hVoxf7ldupPa|;}׏#H,!3xGYTU%!nD2w2Vjphr)κQCk9^z.q >6NCi;'.wpE]ׅWjSEkdXzڨ_4xwhXU!v qi3IUMau)uFZ&?5c 8GpI>$d5ݬ,^E4<]>$$]3%ˇ)#{1˔>+"'z#a/lC˂'2!s?eQ:| z"N:*\i|z)xuAMhyQԂuoVU\f}nx:{ 4׭ ^~0G`'afCkPK:PKK>FOSGI-OPT/src/org/omg/PortableServer/POAPackage/WrongAdapterHelper.javaAs0d2Lrk996fp29 {1jJ2wN$Or|QEBx1G@_̿WZE7J%4Dnh^Э['+ 6 zR?[oA*EF!Pkݡ­}:OZ8NrNBஃ_+8nۖ=1S7h<ǟ5Z 4ċ-pMT_k[Pxe֜ԭN*M)3bѸОic%ҼI7nd:M&tC6Q6Jgi6oLG:)2 S89 RB,EAɪB6h$MZXKoSp_7r(iUr ͒ۃbfA_PpPԜF*)vh& x >uڗaaogV!|*e˄%r nA !잷7YNK2|jDI>:G;` yIw,q4';95m5TIG7&kDYN>.PK K=PKK>?OSGI-OPT/src/org/omg/PortableServer/POAPackage/WrongPolicy.javamR0<7_1+н{ʲJPE{4# vj;djϐVoxf7ddwdiP%a|;}׏#H,#U!3xGYTS=!nEɿ2w2Vjphr)NACg9N6z.u >^+N0\pC˻5 ޹S}P:j.X=&EZ,޳k~uҰ eUزF65H'U=; CܛhdM(I1}\$ԓll&8]%Yy>$$KyqoI0qd|=;`yyEDo$Em;Y5Uw&HF#dg,4<{ ,W ^~۰`Gaf5~PKO7PKK>EOSGI-OPT/src/org/omg/PortableServer/POAPackage/WrongPolicyHelper.javaMs0d2TZNؤL^Z#߻$m}+ixLn(7¼IU@TU!@O}C3-h`EnDb,Ѐ D" %ႍ .돽DjrP[$ aa-*Q;rZ#ЧS$piΩ@i"pAsp4 bL9vxOl[Y`W- MjkX+ހ2KsS7F8!Xv 7e aڝH?M ۸^A2lE:]2Jh$)LU}}hv,>x0󸊐! jZ4,k^"jFDlj 2 ׋|a?9Զdsew/{ʰy͏@+ใℾ4JsE+C"'zv>VM2blaw0j#AU5n?3 hU:QoW(hY{/砚gA^<#]!M|NsNƉ*h7{Mg _#Jjw7PK! 9J7PKK>EOSGI-OPT/src/org/omg/PortableServer/REQUEST_PROCESSING_POLICY_ID.javaeAo@W+8YPc舮9=V"S$mj0gMN: 4(eMZ ٠Pv@=] *ACt-׉v>'kOA/ľUPrM/$3Pmj2~wRć DT80k-z( QiUʦ¨B9Jc@OSGI-OPT/src/org/omg/PortableServer/RequestProcessingPolicy.javauAs0 76'b-Sxi&G)Ti t߳iN`]M7he'V3˯BUc46A3+xP9W5Z=BbDşNja2&;/q=&t_*4RAfD$OsFOOޑv F4B=0DDiݹtO=zi0U%vډZiO=XIR!8 ,zZ:rUhe&LrIyL-<&EdtUB^"ϖ63^}${i 92/z)}[ g$gؚj{"bG`2JOSGI-OPT/src/org/omg/PortableServer/RequestProcessingPolicyOperations.javauRr0<θDe8(k%* cO'vIAV) pNF6;i9CV|V U׋Ň9x8 1rɒ9P2'%)KzUN+s¿)stZs[]sV^k2HU/2o gߢ$E~;PKLC6PKK>EOSGI-OPT/src/org/omg/PortableServer/RequestProcessingPolicyValue.javaAo@W8AD ɭA=8nlCZجj:w(eϛ7DOSGI-OPT/src/org/omg/PortableServer/SERVANT_RETENTION_POLICY_ID.javaeRn@<dG.8VԦ-j#pdwbE@o޼yD7n0.'X%⦑B|6ߟ&F9Y2tɒ:u w$ĭ(3Tx$cV3=`4F8'q%lRR J}jit˜+v{'.Sї\9EqM5WeGV=t=ߝ4xhYU)= qi7IUOauzauF;.[&Fqk\ԓ< 0OSGI-OPT/src/org/omg/PortableServer/Servant.javao0ǟ_q *h߶>ۢU"tU5M\;cgEUAw<$:}0VZjn!NrLp2L])K,Rp"9OSGI-OPT/src/org/omg/PortableServer/ServantActivator.javaAs0 76'b-S:$k%UZLHˎT#h 5ҞzBpQX2tde5Ы~3 P0KJH&eZ^!}vEM y<[4x>:x>0q^nJW 9leT7GA{_c Iy/_~P7/IGE_%^){<9:B l_QUVyqDf҉vH)njOŜ\wPnG3~PK&ŊBCPKK>?OSGI-OPT/src/org/omg/PortableServer/ServantActivatorHelper.javaAs0jHn-' `LNY^#d]hҔ`oe8#.A~`#t/>^o+-ТYc7*D4Ӯ+p]/K[lT+TCXX8jBW+F[6uZ[9FrF4]-^ 6tY:?u]I*S ʝndNSv׭,Z0:64,%A`AZsʧpB}jjf:#A{H6&8{x~.͢<`LyLD{O6)<!E܋PHV# 5YT@(@Y j)`mJo}B ΏވHjU_q^ϔʈ'0U&]ĝX35Twςna T֧GjD}яeFrkf۠Yuؚ]8ȻߵV"Cٱ; y$3F9i4A8A0rc!?'̕sj_xBR} o9 PKgPKK>COSGI-OPT/src/org/omg/PortableServer/ServantActivatorOperations.javaRn@=dG7'8-jj"4xnM%[Uh7o޼ڃkfod&#HBx|ߌiaɃQY,U5BԈ?}Ƈh &0SQu  Z!-F] TMK$}z^z`zчgMԼ îqPhSkÇx6_WzR5Z DêrZt H;՝$U%u )%#LG?mB J!N.Jw$ChxBYWq |w> [}p7˔!E<OSGI-OPT/src/org/omg/PortableServer/ServantActivatorPOA.javaOO@ 'hb"TUhL-vw|%ho޳^{0fme$>d IUI `8܏ t0Avɹ,P9Chu;|CVp!^ynkPqBVxW! ]\< \wzF^-^ AP-`жm,ızкy::;u*t,jij5T1k%ZDiH{J¢KGVzU##G)ڄ^C8<&W,U2$izC6Q6>Ii6gH5D\;c}Ɣ·9+~@r GSe#JR*Nm-ަ$A[A=z#n:u_hKܿS(0͌1DAPTyP$WBnS=+G8MSҷx!*;~Oe>top} Ja!žwHU:ӤqLC<E <ևlCpCz?S=Dߌ^e MPKj9PKK>7OSGI-OPT/src/org/omg/PortableServer/ServantLocator.javaAo@OvD͉ͭnBNxw;XU{gmZŊr̛% VzyYBRa~\߆W:(С}&b/5* A GH3Zu/MGō8J YC:heO539'ICW$\pUMЧgOd>88Gvqu6]mr󎩧;գs` -; Sբb^-"ԣ$U-¢i#+.B_plB,)!-gpizt%}RIK7%l<'Hf#9dwyE(/Z}FrkʚnB*vA:/˃$AW88^kK>S&0Cyrt|@(ZU6̤FcƄR/gg5|-PKA ?PKK>=OSGI-OPT/src/org/omg/PortableServer/ServantLocatorHelper.javaTMs0=׿bd!BO3I39udy1JJ2weNeJZO}+{pQ,ty,{1z 30CfyH Fpsd!Ҍӥ+p]败No)6ۀT*!,,DO!n-;CeMO@`5K5CeAM EF:l n"YX%Ԛ,*V jFRGѬcd04X \귾 (GODIjU_q>)3 tQ2JqdWt735rϰ_#>Ԩw_dvg6*#AVe9[Ї4HJKݿZ+ӦrD=o%3Fi pAvAK]9Jꍚ;FX崱Os\IMG̿F͸eTn??PKAePKK>AOSGI-OPT/src/org/omg/PortableServer/ServantLocatorOperations.javaS0=/_1)YQH^ڜh6EBٮVU m Q8RVUK9<~~=_;p 6#99x6v&-CbԨ:,\,tTDZ-W4qv֐ef=HRH{FZս↋-K3(i5 )>i1\kx $28E݄0hu A$˨e' yJRJyysMT-*١44v\X5 ,,Mw0s,1m;D'wXROӴIT%^HSۡ B_`sv~8W4RS48; :%UX]g1:⥔YAy9Ξ17" ς%bZmzu[Hx'kjB*_V*Ջ j3w~:/PK n>:pPKK>:OSGI-OPT/src/org/omg/PortableServer/ServantLocatorPOA.javaOO@ 'hb"TUhL-vw|4mz߾g˃`rI}OBp_?c&^` 1;xsYr8F-# v"I Bn?k@-֠4A=@C 6Z+iӹx<0Zz[mXlcmAutt:O3uwRUXHˉgk 1cJ-"ԭ$U jEo35GFR $4qyMYv9d2I4ll|Nl̫s:>2w)}OrW r! F^U Z:XνM%kIA=z#n:u_hKܿS(0͌1DAPTyPt A^d '!Ts'lSblrĦǩZ[</~@Ờ c؇{X7tU܈.D.1^ ;#s TSUGy#j֐iTݠm=;xBJX/>?7'|&&~PKXi/PKIG@:OSGI-OPT/src/org/omg/PortableServer/ServantLocatorPackage/PKPKK>KOSGI-OPT/src/org/omg/PortableServer/ServantLocatorPackage/CookieHolder.javauRR0>OS¤NʭdBZ7OSGI-OPT/src/org/omg/PortableServer/ServantManager.javauRr0;> nnmNv[.tI&G V%UZB<{W6v߾}*+XisG IKjr6~[D G:(С}&bO5* A GH3uBGVp-a5[x 49V\! j}0QgbJq 0|j_A$81'ő]ܟ.ަMVnްiNX1Hˎ#êjQ^-"H{գ$U-¢i#+.BplB,)!-gpizt)CRIK7%l<HGf#=lw2|P"^HhY3XVlMu:V#0hku,4AOSGI-OPT/src/org/omg/PortableServer/ServantManagerOperations.javaeAo@'숂[u5 F9.xbU@37WdeX+lP-ay^$\ 9OOX!ɖ=F'  dF#1~uR+\'k,Cb-V7AG J{XC:tr sKC*hfIùϬH8k N\`ԽN39xo>4M8'pu]SUj `(-Oܜ SaAL1dt'a)V6c?Fu&Y^SVuD~bok6eqgd#m b˸=&`Ll5N_VvT?''!{.1> ( (b!v:>៲7d;w̖v'zPKNPKK>?OSGI-OPT/src/org/omg/PortableServer/ServantRetentionPolicy.javamRn@#숂[ՂF9.0Uvw{fmZm9fp+mVv{y,!{)T0].߇ȷH:/DIF封A5h5I:FK{lw8#(M08d頕=hZ$m?Xx8tEK D=8F8Ҷ3t;V=zT=: Ҳ°ZT#h 3^h%IՅtKij~kdM(%% 2-CO;xJ"v馄U]g\}${i92ރz,S8Ϸ%╄V%9leT7/h; VO˃$A?88%^){<9:B l? $TANnU^'y5ӎ(]o7LBlv3oPK >PKK>IOSGI-OPT/src/org/omg/PortableServer/ServantRetentionPolicyOperations.javamRr0<θDe 8(k%* cO'vI8jw>E.f0-gȊqJJr2_g?F9Y2{Bf$w$eB*2p[B܉ceG2VjpLdv)NCo9E-[JBwhmn{Y<z_xWB:}aBqrjDkdJgv=zP-Y CzicWذV 15H'U3յ!OSIMhDOSGI-OPT/src/org/omg/PortableServer/ServantRetentionPolicyValue.javan@)F>ّZ-j8rx.]LXFUU v曁х0b堟 NIR !!eH8i!AfK *Kh BPX\csmFlt؀ĐrY"K Uݩҭvu: S '(.@MoqwʹhԶ/vƾ6Ũg6΢tSDkFxQU&ZQ=ٺ5IU ܵ c:#;ڛ#~  0u!{|? IhRM8޾B=0ȨԆ; MEHOrW5f2F^Qh*iZ\2tB#ϣ9dMUixz)Sf͂ Y)Hr :TӴye;hX8#팎 z:n.(eQ='yF7"|ՔY$;Cj)f#skarFWD=!tQg#qsbyPKk<PKK>9OSGI-OPT/src/org/omg/PortableServer/THREAD_POLICY_ID.javaeQo0ǯ8SRea%يVAh|z5OSGI-OPT/src/org/omg/PortableServer/ThreadPolicy.javaeRn@#숂[ՂH0Qvw {gmZ μy[n`Pw0_ '!kr1~ZD GZ(Тy&bO٠GH3uBƒp-a5[y "sz|Q; :IHn3x%S.ÎVeW{yP\=~WyqDf'(]o7ґ@\o.wll;PKT6L*PKK>?OSGI-OPT/src/org/omg/PortableServer/ThreadPolicyOperations.javamQo0ǯ8SRemM V}tB&$w)Uǃs{*;l YM"n[)TI^/,Ƚ"'KfOU^,UUEnK;Qoܙ㉌Z:\`qk2Gc'PڡҢ-%uRԻnD۞./8r:՗B7Bsݗ(!'P&jZ'UZ>2xQd- 7GJaV 1{N{H'U3յ!oSIMhK&&q6.bMq8t d9Yz,W ~$đq:twyEDoj}F%^4F(Z-Vަ;;-s8PA+27Ao8OΑ_zkHTWHU2owK'"_PK`  PKK>:OSGI-OPT/src/org/omg/PortableServer/ThreadPolicyValue.javaAo@W|#;5VĦ D9Yk>OSGI-OPT/src/org/omg/PortableServer/_ServantActivatorStub.javaQo0鯸S;@Cm)&&'M=R;7ʴuuB䡩sszpS]m,lQQBPR ap4z)-hѬ1|*9*GD*[++# 'wKYlt + j!-,dVRAWUHZu:GWNI\GBAϒz?5M㋖צ[} 5Sw.Tւ48݀*)m@yn$ ^P# :\Z22Y9SM( I$L'8+`ȃTͳۖ32ac2{ggI~PK7lvPKK><OSGI-OPT/src/org/omg/PortableServer/_ServantLocatorStub.javaSn@=_154E=84V#l(hmfqPqH7<8T[͋nփ(!(KD=~?|! hPo0\ *D՞jåc]GQlek!-TX2TLU+viYn9dj%(Z<YZ> u]QK]  .dLޒ6Rh hYqM-0E2֒ 5B#YTך[.>5hrnie_4Q#Y1 0IIߑ\rWAy8I aMOyM 5| }@j;];wS񅄅I2 3YE BnP r 7VCsGS56W\QW:uϤ{)=TR?!+ɼqQ&̘:UJ, Q|3!QXs7mdp6w;URq Þ.=y=DBps4JWsPzm "mEе ?ҵCch// S?Mw[<,,~:{=R-Kr&5]:OSGI-OPT/src/org/omg/PortableServer/portable/Delegate.javaTo0~)Oio[hmhU ]UM2pw#4V)8ckY#HBd|wiH} V!#x+YrXA*@+ȈuR+8 g0aitt!؂CƐj"C@*( zI>gw.Hpãy!Hy?}Pfk*_.˷zQ-:tҲb 0R̵=h k=J5¢#+^#K^ (8yăOn42$yqw9^\L2 vS Z)9eTӉA`aZ$h7.4 %^ϔ 0< LW!~-67t_'TXǯPag|IzIq%A?m3h-rd␞ ܋aƱ<}Ji Tt0-o9x5ӌ*/} ^́8?PK)6PKIG@$OSGI-OPT/src/org/omg/SendingContext/PKPKK>0OSGI-OPT/src/org/omg/SendingContext/RunTime.javauA0QNɊBvOlHjlDU{ v[opmVvGe(!{)T]߆woC theaj#j'!|AVpahg= Π4=VxȞ6I:^.f]` WK!/ϑȼi"q!u>r[GQZ:0LUY{1 :|FSOVT]N4 ަFzoFnc I iLЛ@=4ۆƔ>D|+3XVܚF!tcu x^]s8H]Tjn3V'GGh[.FuM^'Q^}Ś¿vGNsls;3gPK PKK>:OSGI-OPT/src/org/omg/SendingContext/RunTimeOperations.javaeQo0GyJ m}biU A\5=۔D*F>;Ml9[= EM"{)TMXn6*(CCI 51+Yr`T Y#!5\Y'Y'm24,bu$z Pctҡ=N5Ph˜Y%y/]ûm#/{9IiŅ8ֶKkK.vzzr~Ҳ0U-ڋ BtuRuk8IX 2t߅6plBaVȪUVS^4OSGI-OPT/src/org/omg/stub/java/rmi/_Remote_Stub.javaeQQo0|^~ʼn'X`}[yJ)ۢU %tU5M$[bgC@}C6Q-|w\'#0a~R 1x8 1ϴHȒ9Py)K9Zd1R+܆S =aCKtJCc5N:fT;HLWuonӫx'x5 y&Bt흫&mC9)&k'|Lu?J~7p fWزR0Ęukk!/K6Mi=rk&Q8>JtEQDuHJ0_-uZ ˇ1+{XmJ_KLdTшPʼnPj`eJYI'\w_.$_^uU58fAlN~{%Jd`*h28R8pJ}$H azk8Mg8v4C1 )9PK۶DPKIG@ OSGI-OPT/src/org/omg/stub/javax/PKPKIG@+OSGI-OPT/src/org/omg/stub/javax/management/PKPKIG@2OSGI-OPT/src/org/omg/stub/javax/management/remote/PKPKIG@6OSGI-OPT/src/org/omg/stub/javax/management/remote/rmi/PKPKK>QOSGI-OPT/src/org/omg/stub/javax/management/remote/rmi/_RMIConnectionImpl_Tie.javaOo@q.ڜ6VS,٤QTUhmf{]AQ{gKC x߼a0A2EΦӣ1ӈ9 3FB( fP 5 _1@m0cS:?VP-He6HZxbeAHHUYhOHP$TPѷc!pCwɤm[;bt>)vZ3gQU@c@Zh8* *Gja`ڶ\ɄZ$=/#X@q ? ؙ\r W~epC<\ \з//[8Rd*& Lmb! S)&jPK*ԥ0n3gSRXn[r&G9:#J2g c%tRLc,2pUuB CZp_E߃S&VK23{y#n;,LnUtw} :S] sf޻݆#ثs &`%24ZKuQþcmڒ NOSGI-OPT/src/org/omg/stub/javax/management/remote/rmi/_RMIConnection_Stub.javaXQs8~>~NH3I>剐s ഝMFkVH$CNlCBCҹckJW5xmN4O!t?8Lo{ =gi#<8'W"7/Gl\ԗgn/H͠ C7~1%3apyB=Lh]&,^f'~odYc 8oqoKlMOSGI-OPT/src/org/omg/stub/javax/management/remote/rmi/_RMIServerImpl_Tie.javaAo@W8ADBOmNI)l(*mPY x߼a|҃rE0HD_xy.Ltt8d6Ni DƔ3 J)T2E vlYYrA^^Cd/:U!|KZ^rZoJ"O28% kt;[-WLZs$<.xa>*?zPKxAPKK>JOSGI-OPT/src/org/omg/stub/javax/management/remote/rmi/_RMIServer_Stub.java}Oo@S|#wDEMNxSإwH}yfarUu"Z#\~c\ fȭHQ̠j[)1|Empɦ0t 4͜APHe6HFO $zFmӫ8x5Tb9snj2i)OLnb/u?u' 44xET)O ( X} VpG\&X>|f H+#W% Lٝ"Ĉ'! S)Eys\PKJRw3'SRXnGrFϣ=pBiʜ['\RDiRYd0: CZp_G_ؽ~z$(3y]-sE7><^Nm|kMY m]ИjtSh~圕=lĴĥF GŽ)P,=PKFmBCPKIG@OSGI-OPT/src/org/w3c/PKPKIG@OSGI-OPT/src/org/w3c/dom/PKPKK>"OSGI-OPT/src/org/w3c/dom/Attr.javamAo@W|#DEdD9.0maw;XQ{g1l@7on6+:.!n)T0[,>΁ߟg߆W:ؠC2do( TKThQgZ]Ldv-V@i!{Hl@C 5#Z/i73xx=tN s!gGdDQCm9j],Wicדj9' S"gF-"H{J¢)#+.B;1M($YͽK~K6Yer>$d+L҇9 G~Ɣ>-BxP#3XJ<;Q#zVD`жku XzF [Ws {#N:?at9yJ DP\Dxn~=UqRS#)P7 [T^W`* 8 \| C ϢM(kY;I.X7PKP|? PKK>*OSGI-OPT/src/org/w3c/dom/CDATASection.javaen0zOvJnzjsRmȀ4ȑV2QdI*QݻU Auv$سS1`.U_WBKvzi c+==SBWn! Sf2 X0R]8'q6'P "( iNvBU8^L*O9,ׅa|,1Ը.믵>/۲ھcA=gTR#q.H=: peS!1#mBQ9jEce]l+XMQo_O^%-9b]܀1U -I*ɫn34oK||VπMI.$aF!v:?ȴ16 Z/u^Z H7uKZs?IPK6&PKK>+OSGI-OPT/src/org/w3c/dom/CharacterData.javauA0WrJV&i)dڣ۵Mh1Qp̼yޘ΃;XHuԼ- lүLt:' [4EE@ds hEl)cR< FCi4wGžAH AJ s˽:n~ő!3HΨAѪt֪Oau]z@*lNZ*IWzz \SLU2bmXR4RJGin|0l nYk_ #EؘQBsƩLݷ6Jv*dMB/%O=N> g]nSB)OHFaKS4QBDPqjp6 sl*(rJoq-UC9o=?wf֫i3ӿݎPK(PKK>%OSGI-OPT/src/org/w3c/dom/Comment.javaen0DOvJnzjsRmȀ4ȑV2QdI*Q߻U Au@p0IpgS\.*]j~ ^?.x}Tzɓ{:ehr$iO5]C8r+$?ye4nQ0J]88C{(Fuzd4FN>K$aA\˻"LЗe8BfUb-;n=莼_r< aJ#vbq#G4aM|p87c_ 861+ 󪨖8|=yy(v{w8w_O^%#>b]1U 4-I(ɣv-54OKW>>g:tWAsFYp?'dZ.ÑCF MߓH:]~'/PKlyPKK>.OSGI-OPT/src/org/w3c/dom/DOMConfiguration.javaMs0Wdg(8͉nԅqQ+I'ޕMC9h?^=.uװP`Ds03ȋOLr|~"AfUD ^d-8JBnh3fB %6Ldv%@*Ej"3G@H# xϨIqPcTΨAө>/FsNa"v$iTkuXe Q]Ek^<DYI-@`A9#MVn`L%3݅iiI$>$EZ^!~l6IMWX2ݦyFd%͖! YF6~@@ jFMFH4NXVKiE'sЫEq?9 oyT.}I&_MhBZ49KpU*"Y,}cuH'g 2C'·owzh΀#;e״>vJT`WPK#PKK>&OSGI-OPT/src/org/w3c/dom/DOMError.javaMo@W|#Z=PH@Ttw1AU{g1VUÁywt(|qz+/K*0fWSk_Cb35$Qq璂Y 4=_3N!2TZ 6a4FdA% 4IChEk. *6F jz?@<ImIBM7~]| %صn% i_<#synJ %(@Oȍ'X2Z;^)"-IYW:/PKDn0 PKK>-OSGI-OPT/src/org/w3c/dom/DOMErrorHandler.javaeOo@S*OSGI-OPT/src/org/w3c/dom/DOMException.javaT]o0}'Z@}u aq(e/ $RTφЂ&s=N`gFRA+>|瀒4fкv/ڠgY %L2f3K+>Y* t%XU;mgB,K -hV[ͳ# X B2%y€=,WSU^Y+ZnT* L*lSMTURN,Kn[XtVv=kk&LJoxkW1j -!@=ץ6lJ*q(G!@FSh".i-".iQc ]L= ]ow p= LG\MnMcGΒY<֭.,5r&V\Jmpfd⊪}BFC餭*fꦑS" S7'=*$kjVP+yJB r eHpMvob]ղt (|tOQu"dۘ=8vqP{Ȝ}S9$Dmg&Cd?0GSDp!3O0"(B?~|:9K&^ןp2%ڽ=^~;ַ2|}[ ?١l^lkXSm\[?h/ hPK5uPKK>/OSGI-OPT/src/org/w3c/dom/DOMImplementation.javaAs0Wt z2I J<tz嵣bKBf;+!3ҮIUWP`Ds03Lr|.~E~6-=)x;QZ,%p;D3Nc%hP9L}d,Mf7^:hrY$ a >sZ=Qœ㨡 ǨM91@)SͱwbWozlQWHTE×Yi$=3.m㾤=hkz-s[JKۃBV3OSGI-OPT/src/org/w3c/dom/DOMImplementationList.javaeQo0˯8SRuO[XmhH!mG.6ѴI~6-;Y YM"n)TA/Y跱J-Y2G*Cv&YTW%!Dd'2VjpLƣ[tVCo=E%9HB݈6Hw8]< ^Fw :^UB7Bs(!gP:j.Zm:wL=V=߽4<1U!ڈ@ԆiO=餪簺r0mJi޽ ?#~-؄$Α|${d={9ntsd[,t,W ~$jȸvOyEDo*}A^ԄZ(VZKoV:[ y#N:>aۇ"ToxLZR '? KPېa͕Q Q;EGa,PK(PKK>5OSGI-OPT/src/org/w3c/dom/DOMImplementationSource.java}M0WrJVM5 gڣ۵MhqBҖwoG#ڽy}tB.oBEPJ Z4#R"[QX k4}LX$FKٔ-Q #H`HB#:|P;* mngR$8iq*Ԡ\w;8?Gʴqw6]m2yMS׽Z0s&.5QU$֎ ԣN67r^QiiK% R6 KYE~IQ$.0 X:ݥyFd%! YF6~!@hjD#*MoZu@#i"hzaZ-^pܝBWs x!r:VQ@%H~94 )a,`(hʠEw"F%yPK\PKK>(OSGI-OPT/src/org/w3c/dom/DOMLocator.javaeA0WrJV)dRvOl)HtGcl6aUY7<pkF4Gs, n[$G߭VKEː{-V!9x(-V #BϸhP̽`6nzr[$a->s:= /}FOO*#9VT̍ЗE0B*DUk]ަ-QEk^<DYI-@`AsSF8!%XU6ΈwB{aѧI$ ")1{xk' L"juEdӳQ'4&_%۴K鿹|((ވw+OSGI-OPT/src/org/w3c/dom/DOMStringList.javaeQo0˯82ȺO,6,H!]G lfШu¤Vwu|Kݟlay,*$9xxebG̑F,UTE@HzQoڙ'+m@ikv}-Nz@'NPaҢ-JB~B;\< ']8rz/n>OqͶ&OSGI-OPT/src/org/w3c/dom/Document.javaUr0=D:$z&Msbؒ+ʘ z$v- U^j,-LO4LrEÙ0uHS4W{HnGi0Bƨ.qW;j#KzЭgWTd,CX8vYS8%Psegloimq0X{J't5`8;R]g y ,'UIk֠4D#YTB&}0jaLZ cV#mLB׏ pGAw$ntꇳ`d I8 f$ | Q,})׮).B#a6L\,dR!Q+Ԓ*u&k!IE&,Uh.Ѡ!9s/VU'/d"eQ/uxx$آM*FycʭVLY52nXVszS3è=m዗Ñ?#ν:MPekufvZ͒pe8ek+mK+l9jtOEͽ=M78Z$]ǢֵٚW Iݰ:ոYDKsKÃ@mtonэ&_J.DRo&vlzx]i:+nAl$rƒe'zt')H؍48yaǒjTp0nZ+=\"Bڈ~d!Z,=,UU'}->a֣1}uRig[q>xT6e`wm=zh?PK PKK>.OSGI-OPT/src/org/w3c/dom/DocumentFragment.javaeAo0 9%EfgiKXqG٦aIr`/x@`A"1p6'+ۣǼZ`W|HN U淫%ygCÞcV""ƠjGBjDY'Y'm<$̦lq$Nz@/NPcpҡ^+2RҽF>J K/8]p[s'w|Iqcq&m뒇l͋UGAZٶn.dliYY2CƆ S;/[DA$gx4%`҅:L'{??7WhD+kEf(D˓mox'hT\ׄ?(zPKx#jPKK>*OSGI-OPT/src/org/w3c/dom/DocumentType.java}R0=obS*IYNXRtYI!=i6B;4HP=o޼6[Xj[Y 6G q]K bz`ː<Ƀ,P9,U%ZBlD2oh L=`2&{OуCF TPƌ:Iaȡs `x?Q̻(.P*OX=$u_QXJˎaUYk-:DekJ{EOSJGV-]W#[?plB$ &>ΒlIݧ6Nw:tMʻ9IWs@˔>-Bx!aOBeTՊ GAHձԲ$h8ǗqaK9D΋JmvoP%Lu+8 E֊8|tS~d7QFqDC CR=:Ju0WYwPKːPKK>%OSGI-OPT/src/org/w3c/dom/Element.javaMo@W|#DEdF9.0ma.&VYKݤ@μ̻;ޕW0R|n`}g"A>cϵaL SԨ`EyBc HQ#KӮ;*ͥ;MKލXJ! Ikx VDUp3_ӪXxj5dl3*/NfZ37yMӸlEJ{:W{hFDV=jx "Z+5#-u"iB+rmkcچZN ۘAu֏oE g8F.>> e>Wv@ڹ>Ew2F&< &\TJjLLKnYyC>B|HT7NUd"ePeNx\`Al7)o`s#2r4i}.m{,XmY]=b=r8V➮mշCV^f Il: ],Fc~, SMe+/ioA>;֯l)Q5%Hڲ9nl[S'?@8PKDuPKK>$OSGI-OPT/src/org/w3c/dom/Entity.javaAs0Wt z2iylIH*13@{$=J."S`*g.>(HF -ū9,Ӱ JXLnDN?>h0 ɸ4]tЊ!Gظ:iNZdU^^2N7=8)1k#z0D)R7a)'v= 7#~.؄IZ@VL]Zd-OSGI-OPT/src/org/w3c/dom/EntityReference.javaeAo0 9%EjgiKXavGŦaIr`x@ C"1p6'+Ǽ^I}/ |~Zet(ɑ}&f (kR ! 'F"K$VW-I8theOcMC*`&QϤH2i.N{o>'88vIuc斩'Փs{'ޝ SbǬ-Dgc^J/Uӭ H iyM( Y5×ʪeyζߋ-ӲLmPXC͊o_/K[}hl1eETDoZ}ArjʚGS :B_*AVǀMAzO (b!v:?qvl"ɶ7Q^SI-Y 'ո8 O7PKQ4&PKK>&OSGI-OPT/src/org/w3c/dom/NameList.javauAo@W|'=9QmQ-,(-Ī;cɑSy7D7RG#&*!n[)T- fSi6gGP`yllmv[x,N*MMlMJ/O=I@p)9!G|P3,5 AhGIcXM+;;m]EG9b#J:?a{ rhjANEk x [(()%B9Jokxk-tkTs%2,}"K.K.=PK%7~PKK>*OSGI-OPT/src/org/w3c/dom/NamedNodeMap.javaAo@W|# NzjsۢXQk`[.&VYL%UX{[ka!^0g>p3#LofcH] 98Q,j5BXNcŇ/ n9L]d,Mfwb/;h$n >,plՈs[sFGOZFF`v~m}8 C WbdWD=Dƀ״vLUζڰVirQ`di{Xͷ= 7#~@1(8(3ߙ<ƛ "OSGI-OPT/src/org/w3c/dom/Node.javaVMsF=_"`|m\9Ȓ%JfWh3#O,6 `[3uzZlQkh'D,,Oڗ]s A*Q\b% Ȑ'+LSVSt3JE hY}uv~mL<rTH6))B!z^%PΈPtLעjJqWY/[cUoٮ?53T $~+' R i 6HwZ+5gPbWL1r%E6)]pfEEgpcE^1FS0 Cˏ=7 ;/`;@JBH&7\W"b-I)O(|VL,Q(\*3_ptuqk(_!twutSn儒H(*Ŕ,el'Bj8nƱ uvz\fCݹ~v{\uKOGATU[:7/x}J07 FCYc4rmod骹 MBvhuFE7i 56tnVύ,?3( l7(9"q8~1=6rcmWܙn5ݴ81O9ɋC$9!2͸ݚmYG$s=}tޱf-]oa6/lɺfv#:HpzCb 6L`RAt)[\σ dve&GR6?~'q|vaUO?>=TQnQţFK.JV1%j1}_9L`Xޟ3Gwn^ݞjN/eo^xx>:p踿+۪̾r]&G;8"'cˢݓw ,^tȎ9J[ 7\U5)Ht,;atmYτzk&vZsL0/cܘD_}jPK9/ PKK>&OSGI-OPT/src/org/w3c/dom/NodeList.javaeQo0˯8SRuO[XmhB\5=ۄF&* {|cXjs9xL67mP%azX|ߟfq(c[rdTLֲ$B*BjDɟ3ONjxiLd,NG'NPڣwҡ-^K2RԝsF@C` W$0Lk$Eu\ꎩ]O%`w/-O?A*ŞY[1@[ԃ^fk?K[3M(LY1Ȋy0yv7O;U< Np`Nzϥws(#N:>q{dk7D7\EC~M)07W{㠄M(PK7-PKK>&OSGI-OPT/src/org/w3c/dom/Notation.javamQo0ɯ8S;'S DL)jM{tԐvUuI {|w\ERcZΰ.Hm+* 066A!G@UNUUE~OH(3Vx Vd,Mf7{t=zG!j$!Jݙm~3<z0/~>={$!'X&iZeU^2x^,wGT1k+h XׁzKta)Ty+w #~)؄$-|Jlu}c٤6[Xo\6[4·,82CƆ S8ϷBHP)kYhECh`v҅ku XVv g("g0}WL9/O|ù>0'UKy;zCDbSVM8:OY'PKPKK>3OSGI-OPT/src/org/w3c/dom/ProcessingInstruction.javamAs0Wdg\pSݖiwLXZ,0d߻dƙOo}" ڜlb⫄m%*A0^,>́ߟfq؆mP:ؒ#{*f`r')Gt" ~O+sII:^4&ci2 'O{Hl I }0#Z/~3x=t K!gケIccm=k]r-y~{Ւs`O'-O\ S ,l,q@[jt{l*鼕e_ȣ_ 86T0I Ȋ |NlmstM].`&_el #|#>dl1e|PBGSM AdOAp`ʃ臭7sFIqο'E\mdC<X-dD0ezOrg\Wѻ_x8`G| z-Q ܨ=]oPK `>5PKK>"OSGI-OPT/src/org/w3c/dom/Text.javamA0˯唬RHvO4I[B خ=D f7DRuC0-fɾJV U LsYa <:Ujb# 'sI.\ &dv-κ8C*"@C `F^R3]< <:'rWյOQ}(P:j/Z=$u1XZt,3Tș=h g=uo%IUza۔ґyGB{aѯP03H |${}y>nt3laIW.٤qߓt5ȸ0q^n2W 9d5BhOA:Koʃ$A֛|(8_ވEX}`Cm%wx"%TFXQl%HspSEŒ#ciŔ\#n-5Qyp]w[4-3{(⿥Gz PKxvPKK>&OSGI-OPT/src/org/w3c/dom/TypeInfo.javaS0=唬RȦ{h@Ed{ -6aqҮRlϛ7o`ʁ+Xxu00gK>q3#Lnc-RC ,ɖ(4Љ߲>cdw40CRd ;:5F[\@.vss8Yx9df%+Q9Ӿ]vVJUy6\Q&c^Ԩ5(qEg'`-YFZkփT*3Ҫ7\Tsв4=Shi YgW#@1?0G? %ϻ} ~Q bXMvG%6s@cl$[;)BLB)IŜ-OSGI-OPT/src/org/w3c/dom/UserDataHandler.javaO0SrJVڨh5 +HS@%&lTw TʪoƂX,yq0N'%_8eY"z8 !ĨP0sHlx *C ,0c7   SHEGvJhhW_R5 Rqk-ׇnA8AC5#тF%Lua:macGbZn&[r=U%*6\R3\lO^Kւ 4qJyUؠD[&d\i~_%@ FnA2On$y wn n6bXGl(gp' H>RK&!A|e!%UcsRkUѰ'u5#WX̌Lɏ\3ݕl4,v:8SF3:]1ivG% L+V2ۤBj#z#[]כ(u7~/QӋt}|AOSGI-OPT/src/org/w3c/dom/bootstrap/DOMImplementationRegistry.javaTn0 =_Au-KXvGEfmIrܠ迏r AETtLt5\9/b)S9? B E"$r#8*Ԫ@nWӧ +p}LClu k CXX +B몣jt( nq<0`2Ky2K%$Q/DJ{z.vT0AU/HNbdj=!Fϰl)xsoOag"Qflw9׵xC{E(v+`hOgN'etQj)ǯMk:;U'Ka(h6nA&ݩvךg.>E<)d2朆GDxq#6ߧ6 Ma~9M35w~?4.m(2~Jz.Y-tjF <PK(]~PKIG@OSGI-OPT/src/org/w3c/dom/css/PKPKK>0OSGI-OPT/src/org/w3c/dom/css/CSS2Properties.javar6S`|r2즧4'YkM{L$ew$)av@c]nZ8N߉i+1*^:R|:(W.,t-!U bhŲKK D f̼\~C\~ a_aOzDbķhPLU)ڪ TfrnZ ZnވZ|A{-sEw19nn)`Ly)8hb hƉ?eeIjq0hk\_m\N;! r7x[-,<*ηQKl Կ8{,a0BڅKH#"ȣۺ"gN`ڒck,%BF K؃>9XFe?hq%f2ZՌr-y36:'4Ƕ;PK#B(PKK>0OSGI-OPT/src/org/w3c/dom/css/CSSCharsetRule.javaeAs0Wdg\ᦧ6'- e`XR%awp$}Iuװ6T0 (WY)%fzz\8 UTzУ;b!+c A#dVHL+K+ᆭ`ii'A@GP!D@i`'AIi0 H.ҨCt&Fbf\vgOwD=U={ %*)vډ:`"TP]7MhS+UhK&429|Ma YUe6p(+X]˂F_ +{^-)2qO8+ƜE%5Eh;(`m:uPAqM_q4I(_шfjs`; 2 A|c&Եl\I~`q[ -MMsiWGjo*­H'IPK"PKK>1OSGI-OPT/src/org/w3c/dom/css/CSSFontFaceRule.javamOo0Sd)')RLYؓ+wg R Ğ<;NV֝nsu;YCuZ0Y.-8 UT0:ehr5FtDȝT* >hk&]< fSivu-ζ<}@!BG ({rڠ83Dx<$%/pG"1ˆaHHZfEb)-SOM! 1fփl=rl&m =FZӫ0r/40brQE4y(_v{xȫ*/Fծ\bWh y_rx|v>v:y9E{A nLO wIxh&I?}ō$᜿G#N:ޫTpArf|+!Ж~ LY7&oStp~$i$PK-{ PKK>/OSGI-OPT/src/org/w3c/dom/css/CSSImportRule.javaeRr0=_S1r('ɤzΌQ׎$0;+ )Aվ}aa^.`?KHV U"o˷1~5@#@%*B Qo Z [<fSj 'C'N!qHlDA*(ug&iġ^\P;xo>$0 LMҞ.duoHTZt,쥥'TbOZ[1 :R518]AX 4t}_W#~ ۄY!3ǁ1ovE5mm~mN'H'w1 YF}0ɔ#P$g,i4Ah ku$ 4~z5WhD#lxWJwt62$.OSGI-OPT/src/org/w3c/dom/css/CSSMediaRule.javauRn@=dGtqSu8r\ÀŻtw0AQHIr̛7o]p +VymEA4Ja~\^ Ӑy y>}>β8%mK)G!N[ކl Xv9+ 9Kr-RN9ռh:XzFISEA>D4GQ8wݞdm%ʫ-OSGI-OPT/src/org/w3c/dom/css/CSSPageRule.javamn0S,|rSj@.D'A4$KRVޥH~;Tz%,=9L 6mazX?X܆2*=bMnDNW 2+$}Ɠ9ܡhb Fd<̮tp'&@ŽhTӛVG$PKCXPKK>3OSGI-OPT/src/org/w3c/dom/css/CSSPrimitiveValue.java]s@8UIL/$B0鬸Et{$x! < K0V~za<f`yawO "Z $r%Rk>2qf-XNnBp`vs}pJ[YŠm!JQChHya@UX4* 95 q ڱp$^yl~c|p lŽqwG{+7!U+^|#?BS/ҟ EӷgLgz;ֳs^M$ն"Kڌ`M3v}f3 9A}]3#>C&lzBdUqTJOfmNܟGOZx@.`3OPK3]PKK>)OSGI-OPT/src/org/w3c/dom/css/CSSRule.java}]o0˯8UZe$ؤEMdU*6ѴcE}~{ȁ#eV\f+^U ^gÓxеېXRC sTdXk̡sT`^3z|Gĝ48<k’Z!4B L.Z'bsObC!@C57˜xu7]qexAĂ?5+jk V fu)aD]@t\Ʌ6J[&Gj5@ B6"azRċ0`'EqDK  EFSldS8SB!t(DFeKRP4B۱j2[J,f/{q(Vvʹ>wvNARfUi>cIKvZ!j^WdR𯽄c2Nq>^z~?ۻ8y>CwճO{I>L,hOWܵs}L4uOfH&&>Hfy_6ƨJwW\M8PKƯrVPKK>-OSGI-OPT/src/org/w3c/dom/css/CSSRuleList.javaeQo0˯8SReuO[Xmh ]G\5mJ} ڍ}=1ukM9zBڶJhI߬VEQCAU1;UtEHH{!3UA)q0T-n x C9Ԫ%гCiHڨ|H8y,~-9zJqcq&mu6[or󎩧{ݒskP'> za,Dck*t3`S): MhyMhY9e0yv{5OSGI-OPT/src/org/w3c/dom/css/CSSStyleDeclaration.javaAs0W3Dme3$ V   i`z-0ux3cX'8eəHdrߍ}[*5ĨQ1`!KИA#2T`vaR ;ܡ\ p`4l*ցr^"c. U=Xk FrFjZυ`vm[}Bz/jRdt>v@60EH_X19O5Q4@(FUqmǪ`f1%a/^8͂(i}Tkn$efP匦 Eav}巫| ͋T74aA$lc}edRN9.OSGI-OPT/src/org/w3c/dom/css/CSSStyleRule.javamn0S,|rSj@D'A4$KRVޥH~;Tz%,=9L 6mazX|?X܆2*=bMnDNW 2+$}Ɠ9ܡhb Fd<̮tp'&@/OSGI-OPT/src/org/w3c/dom/css/CSSStyleSheet.java}A0˯唬(dvO4H8[bSۄ*%T {|L|-Lw{ 'I*Kry-"ކ thXE&UvXA+I'KLuh0gl*lq2= ;$V-yPJs&Agrax0OSGI-OPT/src/org/w3c/dom/css/CSSUnknownRule.javaeAo0ўv#D75 6јkU1K$7ϤW\NZld$d}/C I6TABɽ60-BfR'Z'd X-6X?F!GƃT `I|Hqе$`hվ 7tĉ]_.wz:Fii 5|mwuRu18[ 6tzoBHPl\*c|X`ɿPKK>*OSGI-OPT/src/org/w3c/dom/css/CSSValue.javaRn@=dG.8)zmPX('k tw1{g1U`y7x\C 8@̾ J:Cf7SĵאX5.1XȰ֘C[g*SXBp`l4-I'V#q ac@Ԑ}3Hs^5: v4=:]J:c EHе+j"Te|KZ+ށTKT3Ҫ0.ea:B%y?d5b5|!gljI1^'A@Ga0zRd4Hq B%3QeKRPT{Z5 -M%p_eyC9Den.ni-IT-y"vb!j^32;EmK'wK0z\$aJE$|,׋_ssGn!#n ksr+Zx4cέnzjAGc:p5# PK~!PKK>.OSGI-OPT/src/org/w3c/dom/css/CSSValueList.javauQo0˯8SReuO[XmhBڪk`3ۄF*~:5;YU0cQAu$U$^ԄjVp`ӨVy[%Q9Ft<|qiX:wu)OSGI-OPT/src/org/w3c/dom/css/Counter.javauAs0Wt z2ig&JkGHBZ0wViے~*+XZ7xjEC޶Z0^,́fimTb@*eh M :S: N*+s>hk:]4 &dv-Q`,A=tZh݈k:.F'rB4Be}ߧLZdEu\b]wN{x?tLY[ك F6R^6MyYhM 1O(<m^G!/[Q92S8/Bm/HҵVܚi: 4pGu6>jtzW,% 3qi^=*u{3#S^.yidHBC ~ʗUɚc4_@'${$PKNm:PKK>6OSGI-OPT/src/org/w3c/dom/css/DOMImplementationCSS.javamAs0WdgpSݖi 3LXZ$LL{W6rj{O$W\tU\.M:z_PmtE%# r$j%D vBgډ;ZyhM[mMACP* ΃ MMh9J I콠vA }zwd&N:iν.Vo4ut,%DGTR쉵 H{*t3 S*"de&4Rǔg<"KqtM]PlaUl9>A?,_ǀO S8Ϸ2g$סTdM׽jsDth[µ:,LZ?^ %QD9 B4IVInSG[ u-#FlQEWt9z>aу(<^?Q`q ]5PKǜeEPKK>-OSGI-OPT/src/org/w3c/dom/css/DocumentCSS.javaeR0=唬nOh+lW{t@܂Mm6Z;&@yn`eU\._M6z\Pm@:آC{ĒC yPz]@H;!3ub)-a5['C8J5"4HvAxa^\@GO})Ia`bŤuC|TOSA^Yr?H{ڈQ[7A`Wb)V{ڛF~ ؄Y!3ǁ)}+wni6-|"Hg"{T!#^IYPJI^9:raQ|("J $+MˤsQ)Ḥmymdߢ+IG])Ow C ^w3"{kFƪrh` ~`!i1ʷPKEWJPKK>7OSGI-OPT/src/org/w3c/dom/css/ElementCSSInlineStyle.javaeO0SrJV)S'-Hq=:f f٨wPip7dW \س`%z~ZqQa#V);D[R=V BnTYOtt(M&ZM<6zAjjI @6P8}&H9r,BaSs Ðʑ85ڋgz[{N{r< 2GfmƁlr-H=8 %xSA:6؇gџ 86a ( hr_pyy(v{XMq(v%B^>,92O b[6$oQQMGM/<<XtxhRGAq\Q$hIGVK7$gՒoyb:(tKE8swkTtch0{s&?PK c{PKK>*OSGI-OPT/src/org/w3c/dom/css/RGBColor.javaAs0Wdg( ;4;$,S,0t߻L^Foߒ^EpKmNڽZd]GBI|!~%aʠtPC{:a`rGzUGȌObx@H+N0 x4 N!{:|h<fDuF@Oyr B~>?{4!gD6.ZUQ3x^uXٓw'1k'Dkϼԃ%ObyK޿ /#R "*&~ YYf6_U)a)nm)x m ȑq|66tL*W 9ܚj{"VqG`ȅ:MGŸ+Js8d(ZMdəy)RwL+z:YVwD3CM)KwPK;PKK>&OSGI-OPT/src/org/w3c/dom/css/Rect.java1o0W<ف+fRjȅ$HS'DɊh@.@\EpKcN5{ m[%D^/YJztbv&k%Q{:=Bj߸3t^ A0&`q4=tCyU- MgGATgt $4z >`yV$!'ظ&iZ*/Wz)OSGI-OPT/src/org/w3c/dom/css/ViewCSS.javaeA0WrJVdvO4I[h@܂Mm6ZwL@<&XdU}0 ҦQBKry?.X؆]tC%# $j%D vBg)-afSi'C+N!i(jUbAi&AxΤHe0.hUuOs$0013c9![mryOԣn9W'QIQk#0Dmj*t3 S**z_F~@ Cg9s}sۥ>p`>i߳|Rdtv68 L<"p+ʜ\RUJ5]F&GСm  2j~W8("gAҴL:wu}AARfm%薟+Ή٣.đj$G4(aG0ѯO юЦ~`9tdoEPKw@?PKIG@ OSGI-OPT/src/org/w3c/dom/events/PKPKK>2OSGI-OPT/src/org/w3c/dom/events/DocumentEvent.javaeQo0ǯSR1uO[XmhH!mGc.؞mQJ`; 6ڜlbECBu+^?@/+aЎX3r&RrXàj>s%{Njl X̥&X=?!4C'ƃT tofIy%+IiQZ$41~&fڶIwѺ6rUwCAZ:7D%xE@[Ey'+Tm N7~M-^+X%deV!;,i~v%{6;dEN+˷1 EF”!)B$gPF jMoZ=UtXܟ6Jr(i6}=w7*ʒbhNb詶 x>_.5a{*OSGI-OPT/src/org/w3c/dom/events/Event.javaRMo@=_1Ɏ\86AQNbbU$)X3{33r B/6њW)p6^FMChBԨ`Iy :CfI__wTf0Kѭ8*vZh4אSx d/fYx9Db=@`ϓI۶.BՓ{ GRݿ%j 5\L%d-PH5#Vqb Ze -MƵQ3OSGI-OPT/src/org/w3c/dom/events/EventException.javaeQo0ǯ8SRe$ힺj,ZE*HZrx#6MhT:akwer 3byM"k)TA^Lcr22ȒS7)K%ZUFwƸ'cVzA؉vh-Ț@O5RлG]< V^;r^m !\}|5'Bq$&Ik',N#S&kaw+ w>@4LU5֢6!sSwF:1޸N6uޅ[+؄ ʑ|${d}\!ʲ(]$qy2OSGI-OPT/src/org/w3c/dom/events/EventListener.javaeA0W<唬RHvO4H!Ub U*j9y~3MX=EM":)TE߮VE J9gcv&[YrTW5Y#!5TY'Y'm<fSi $.Pڣwҡ+2R'3 >K ^\ëOs|Nab1ڶIwպd7yyөՑs'>\ SU-Dkk^J/UӍ`SK0OSGI-OPT/src/org/w3c/dom/events/EventTarget.javan@)F>=9QmQ-,'Q2maw@YLXi:kX+}2>:Lrj|?." {_iaMeD ^d+8J%tDh3eBGc0)5[xe'Ag4J4Q;j6wL*' U8F4EB`nsS8RszwD=u:ahLg6le)甧pB!XU2Έs0 6&a3izmwwdOCa.M. $#|O,9߀0|#^ Td5rQ Nɺc5Bz46_%4^~PO/DNGGM$Eo|L^XY[%ֳF9Fd=3/>_FwTd0E+^b?=|ۈf%{# PKA?UPKK>/OSGI-OPT/src/org/w3c/dom/events/MouseEvent.javamRr0}_ɸ\zIz &G^Fr& vutt\ z1LB%^. S0EgGr'TSTh"ƃG4VjgzmWb+X%(MPYdi!&XH^F|UeqJ1 ~PrAP+z_i|Rk5h>Ճ*Z0; JVm@SIRXQ# :TZ22hϴFn}  0uHُ 4Q) 'pN}`d˸u2s=E$dz-ɖL&ܚ+#F#(,uc,0u4\HJ ;#b]tPKK>2OSGI-OPT/src/org/w3c/dom/events/MutationEvent.java}Os0D2!i=!v&drڨ5+vN{W؝>itLeS%_9eəHx6ĖF`摂Y jA+O R~ip~m%v-ہj5D+\@*Uof?WNאkg*3gcLi4jc{ǞTŨX=Zyߐ~׽(QkP&^U*ekZV(5#VqE႖iB+qm_ i d_$H\+,EKx<(i΂eT݀>m\@J &qv ⁅\vt)yJfB!T& Ֆk{ fV[nٷri(iJLn=lP}T E՝dޠ^vz VS . hS/_]] 41jpH/kg3W GB}]~O,OSGI-OPT/src/org/w3c/dom/events/UIEvent.javaR0=/_1)YQ&iJj2-m`UJZ0c?y m0Pw0'NuMRtz?L߆GZؠEa!i9~]o6j,SXo`^-m^q |KV#>e4OSGI-OPT/src/org/w3c/dom/html/HTMLAnchorElement.javaRn@4OSGI-OPT/src/org/w3c/dom/html/HTMLAppletElement.javaAo@qڜB0Ib;AQ{gC870fd(P r:2~6װt%Z4[L}vp&w2Ae1Zhr tX\S:`IѕJ j!-ld/ VRA˪H{::&?mނ ݾrd4/ľ6٤سvrQ<̩S@kZxQqD9k!Df5.uc$I 5 I%#5vȣ6`0;pu_c\*ǰXl݄p'F7c@ʸ 8tu1QG&r#Me2Ex"ДҺZ:B_.xq~5S]9ŕWknK#4k] ^y%**'}Wӳ ecfHA!35[JIr^}ka[t~rc#Q3&[?ʔVj=Txnc+,ض!,}۷sk7pVq{a2OSGI-OPT/src/org/w3c/dom/html/HTMLAreaElement.javaRn@`f,ލ70N40N'q3"ogS秉kǰL Ԩ`EV0OSGI-OPT/src/org/w3c/dom/html/HTMLBRElement.javaeAs0Wdg\ᦧ6' πL2,X-Hx:]x&sӷO\؃S͎`Z`]|SD,3ʐ==Vɣ*Q{:Bbeɟ32nA0[m8:ymz<ԪE-PΎh%a$Y.yUVF#_x!¸&nOZ?UV>0I=8+o -Srˬ8C ԃSt3oj`S)ONm{zڙG+ؤIR@ZL.)bLiI'&]aMx#sպ0c@|PXZ2OSGI-OPT/src/org/w3c/dom/html/HTMLBaseElement.javauAs0Wdg\ᦧ6'5SL$U&L{W8o}" J wQ. bi2c~v^iaKFd# Kd!ҼX+kLdv-A*E* sځPVhpœrIΩAӪ:w#_ð{bL6' 7rD=v:ah\Usbmx R)Oᄬ`Uzn۔:#ν 핑F?Pl\$J!N'pq:&qgvQū;Xn8 A<8Rdt>k' L<"o*uB QFukZH4VXKoӈV8AaPο%+Umn$Tyr[^2/|~g")l3n=J`G\56O7PK&hPKK>6OSGI-OPT/src/org/w3c/dom/html/HTMLBaseFontElement.javaAs0WdgpSq솩gL2,X-H$LN{W8fFڧ>]p3FT;|싀9z:?M߆WZXEǂ7YZYC53TB %Ma4xjAk2OSGI-OPT/src/org/w3c/dom/html/HTMLBodyElement.javaAs0*dm#ۧo_ypUo(wAY .Shi2`nNi`3Fd&R3hd!yJ2%j#k6Rop,oA* ArQ"K!!UUݡ®wt.;jZBඃ=kk믾߶-;bt{gdӏDuixMT)_k[PxjV9V +d1rr&jj4bzA a܃qЙ<>`$0_d݆I8h ~"sn.-B !W{$Sc*rhhxP jIA]!ٔ\ (ggDIs2UnV$fQ眮.9l;-Bi ޢI+sƒo8s, @̄|꘠ R7B?[\k(9h7\eGԗE tQ|PK PKK>4OSGI-OPT/src/org/w3c/dom/html/HTMLButtonElement.javaQo0_qT,iS tʂDV}t-3!]'h<{|cf\BV8&+ D0?ON\ [԰EjKdSE XB?d 49`4FkkJւj5d@+\@"j@ku .FrF*ZeB`f>;coY4.]Ykl/VADéQ֠w%[`Q%,&ւ5 \!͌ԍ↋| Zfa MʵQ<͛X@1#/?Ԛ{S1N{`m^D=9PKA4iPKK>1OSGI-OPT/src/org/w3c/dom/html/HTMLCollection.javamRn@=dG.͉:nb8r\/l Ī(ڝ7o{Cr5,=:U7S9MUAڶJh0Y,ρgqm@zآGw2f@Vz]jR+$ye4 d,Mfhz!=2P_$ZAΎEia$.Qi$!'űquҞ>YgU^ޱA=8+ǎGUIg8C HzT4T*%c&iY1i@7;xJ4e6[Xnlmr>}4oY~7xXL3OSGI-OPT/src/org/w3c/dom/html/HTMLDListElement.javaen0DW,|rWrSjPW,AJ$KAK[FD oLn"G=T^æ m[%Dg8,6(=lѣ;`C0Y+cR+$ ~h0 X\GІCZ|h i:; sF@O)I\˳ЧoOd$0 85I{d-VyݢOw\AXdV `!)R75 a'ʞބva_ 86aY1 &~tM]*`&_fl #sٺc@|P3(U$^49XtZ=VU"Aw}(#N:>ɸ2]l_r_z(V-v u퍃"zJcZ!i`TEvnQPKa QPKK>8OSGI-OPT/src/org/w3c/dom/html/HTMLDOMImplementation.javaeQo0ǯSRe&랶>$[R ]G\7=ۄF&%+ 9&lbyMBҶ+0],>́ޟf,LC thX1r&)P9WZ{pAqe?:ܲL`2.Mfw{;$頖-4;3 O.G6՗B~>={81Ӷ۳śt{w={i);bmo,ҚׁzKbVzU?F~)ڸIRBZNKR<U Np`NzOSor(#j tk"I*ͣ9]aRٙ"xT2xz;i'?pڧnPKZ 0/PKK>7OSGI-OPT/src/org/w3c/dom/html/HTMLDirectoryElement.javaeRAn0ճ*дS$Tz+\D;qIƕ=umd]-xw+Yqujb}DW1-rp Ғ_4vu0v[poPKϐVPKK>1OSGI-OPT/src/org/w3c/dom/html/HTMLDivElement.javaeAs0WdgpS݆gL2,x[$ L{W6I`mPup0gɾuMRӻc< [EB7YSb*Ѐ; ĭ3vBƒVp'0ؚQw#(d_rl\76;]< <z$%ohyUt#98~a< m>kmN4[}`qףZ0# [Yk96 +sS*K7Hަ ;. #VI8$8KЛ<%6Nw*tMʫo#I! GKkI>-Bg$bN%<:Y!TGx"h4dZ,MM 9NAQp'-O(t#sCSJU *Uav ^߲Cd ]\S ʕfβAPKb "PKK>/OSGI-OPT/src/org/w3c/dom/html/HTMLDocument.javaSr0=ɸMOmNv.e`5B0d]a&8c0>}_pS](7W)0L>ޟC GZHѢb'Ybр D5+# 2}ip~)v@iE !c@(ສ{ipOCϡ׎сVK 0׋smېuCmʱcxOI6@SwJ`W# MIgk*Y + Ri5 Uµ̠ɅuFʴF%lc Qq6('W˻Gi%x22ūxlHQ|d o>E_I(^BpM +JEh"TX- =pu[oA@>?z"r:l?0Uq fMNiM(LBHCW9p-NOz%H6d8\b':ulBo^QZ? .OSGI-OPT/src/org/w3c/dom/html/HTMLElement.javaAo@W|#DmAudH0ia.&VYC$[ey曷7\5M8:FV !ogSa6hP1(Ci0VFd*Sڐp`49jBk=@A>gX #;\ < jkhxU Am>Au8JAkM8Ygԃ%o ĖY+с J\Qw,r FMNjڶ,WFT 0(03yC fiL`:^Diy Gb ȑq|n1"$gLhlEP=jA&0`l* {z3kxq~1sU;[Ww^n9I͢._}cFiܢٱڋ A t%y%EcXX//SUq(sFzv*u@WELvUsDY/z?PK7&PKK>6OSGI-OPT/src/org/w3c/dom/html/HTMLFieldSetElement.javamRn@=dG.͉:vb H0BYKRy潷DW\ZMK0/ϿKN U"̯WOKE!H:OXIvD専AUhZ؈?Sg :\+{lj7&2tPK4RA{3I%=W>`U&ѧ%2_hP6Qwƺh7iȪ{աs` -;>AVUkڂh,rW=ZIR5KpQX4tda7]4M(9$ y/=CR x,Nd>>Mdr8}Izx>L<"o$,,e-KA4~BtZ 2OSGI-OPT/src/org/w3c/dom/html/HTMLFontElement.javaAs0Wdg\pSuigL2,x[TI0q͔Oo}" J U;|3A\$d0M&߆WZXE"dorO9J@nkgLKJu8hr-F@*E %v@r# .uh^Bnscu]8TF|fL=z5Z dxf\l(252OSGI-OPT/src/org/w3c/dom/html/HTMLFormElement.javaRn@=_154=94V0im]ww{ghw޼yLn3OSGI-OPT/src/org/w3c/dom/html/HTMLFrameElement.javaAs0x 2)3I0jmɕd1-Pf,}Z0R^tk{0? L0w>cwðp;L|Rp"3QL j[`>|EmpN3;*!g{Bi4caAH*/kzF9FC-#т6 0ۘ[kOAUU>J,Mx\7eƀДxV+5c( ,HsV9וVȴFml4:Dźg=RSjc:A a܁ Yy `e8a<p# | q*}.)BxfaL\lh2-YjI@ Րd"z"hyw'DM'*6\STEatQ'(-(swݜΏ/Hǡ.}|7؎.S唋z)A+3S2өSt ݶ2'JeH߂St .VteN )'U}\bSǪ ꪖ yPKPUPKK>6OSGI-OPT/src/org/w3c/dom/html/HTMLFrameSetElement.javauAs0Wdg\pSugi&G$UZ L{W6q-i>}Dt,9XY 6W qH ba4 6d^ C2do*%tD G(3VZuLdv-V@i!{Hl@C 5# i>{"9aő8ԶEdJ{T΁ߝ<0U!vڈQ[iO=XIRspAX6td宣72M(9$yϽc0qnr7>!9d5B{'_c4$u1?( 7c 67v$Fh+|i`xBUЋ_E/sNqknܔ3=%Q}]mS PK #xhPKK>0OSGI-OPT/src/org/w3c/dom/html/HTMLHRElement.javaAs0Wdg\pSuܚigSO2,-HT&N+grO\\5MEiaN`|&L7)w۰vJk4L)Ei0Vfa#R )|CmHIg0vPMnAPHe5d Rl,T֑̀->#C` s!;@Oim!EO+]QkhN= ?[<aT옵( 5uɒ,`Tn;dd]k_vb0 | (:mY6 0DVkhb^}0~/Q|7ȸ>5M<"$/ruD2 SʣɢB%O ꚌVÀ&+lu1kxq~.3U[iw$fQ炯yz\/*QZF(3sqww]x3dmXQ!]픪X%Ȱס_/n)e_+z\hBe'}ۿ&yPKIbPKK>2OSGI-OPT/src/org/w3c/dom/html/HTMLHeadElement.javaeAs0*Z\g24U$tW8("w0EiŞ6ݎ]%%r`PT9%RbsZ#p&1Q%kt3PK{Z'PKK>5OSGI-OPT/src/org/w3c/dom/html/HTMLHeadingElement.javaeAs0*Z2OSGI-OPT/src/org/w3c/dom/html/HTMLHtmlElement.javaeAs0"Z &Ov~S$6]|ݧt+$3|O) GuT!-B2g$oP*5]wFk 6jI:-]s8i,DiZl$94BWIjɥE-jbxB]"_E E 9Ȩ5ޮF]X7PK渴'PKK>4OSGI-OPT/src/org/w3c/dom/html/HTMLIFrameElement.javaAs0D2)3I39 y1jmɕd&ޕ1 :`'< ƪkn-%,,Lrhqwǰt%;L|Rp"sQL j[`~6BIGw@).o^=He4HFḏ $pJm=QqNPkgPfgkme8gc_tX3iO?Afh hU M rٚffs]iaL`VLIZK&GZؘ^C6xDl` U8a"p| "9\h.-BF,Nɴd)Bv%m\w &N&Gg{ACϣ:!Jگ>q?Qyv嚒, kf9N3QZoQ&wz.~g?l6D*8(^]DxTR-*M 23t/Kkyd:A[{S!;TУH축kk1Z.vB{|S"s1=:N섛 :vo}'}ص^cF;ߞPK ڶTPKK>3OSGI-OPT/src/org/w3c/dom/html/HTMLImageElement.javaSr0<_dZ<%fC0jmɕd&1m(5k70Adg`~)g"B@ߟz=ejXF%+2 1"Ff,#*ͥ[w]KPwg%@HF3OSGI-OPT/src/org/w3c/dom/html/HTMLInputElement.javaRr0=D2xB`drڨ%Wqhޕmq3}z N;p #o4OWz Ÿ|!8Bl8~;1 518 P1j+?g5>ܡ6\I8snꞜ;* cBa8 |0%D*i%jNCáхd6`P*Ş@X34&ͭ[)6^n*bK*X JK5R*rĖL/ ʴFZ}@1 ]? ? ¾#W?]fsͦ"MH|ʵۀdrgg"Z1 h5,EH GqՐqlut4tGGDN{ȋUl&;y$'4:aWI Žf(-(csps-oZqzQū"~|)*5z^H^)Z?r{m5nnͽTJ -V=b| +ī[ 쎉(q/iܥ< =MPv:~ʲsdLvBۛ:ڕ`ˀԊ_lv[7,omV%à8\^3=չ8nӱu#ڎCcF*2G5OSGI-OPT/src/org/w3c/dom/html/HTMLIsIndexElement.javamRr0=Pᦧ6'8 SwL2,X-HTZ={W6$rݧ=)f=XUm q]+st>^?N/#Сa!,Ta.mV:!@p#0Mn=thC9dT5sl 4 W=Xx8̆$%hyWA{!UT.Z$y߱ԣ9So [V keƂ,rW[EJW!8SR/-zB9jћk&5 l,BOkxW8]' +-ӻd,SC>$ 92z,S8O 9Ir-T9[U'+jv-F9V"I҅/?( 'E!iĖ6h 'ɡR5?-0~^cX?.igKpS!O;ָsc{gT_vʸ?APKUPKK>0OSGI-OPT/src/org/w3c/dom/html/HTMLLIElement.javaeAs0Wd\ᦧ6' SL2,X-Hx:]dsӷO7؃S͎`Z^: i[%u0?΀ߟE؆MPzؠGJC0Y z]!$V+3xBp+0 X\顓ІCZ|-( 6(] fK,s!Hώ~a< 㚸=i}J,_~`Q=8+o -Srˬ8C ԃSt3oj`S)ONm{z#~.ؤICOk,2QEr%_CsJ-v u/EFW^+rΐA`qʿlި hK7?WXEPKiqJPKK>3OSGI-OPT/src/org/w3c/dom/html/HTMLLabelElement.javauAs0Wdgᦧ6'85XZ$L<0q Io~Dx5us09 \ li 2a~6^iasFd%*9*Gn5\g8O4Vjlc/ Gɝ8j~CZ(dRu3u>'CgSAC\ s]13mʰ:jm$]P* iψh4HgN{H'U9 q&Mh'F\@q(8(ө7y&J">V%/'S@kc)}[ BHA! )h4UD(ASK`m*YK]u1oQҬ,Xksuu4mFIRhM隗ϰZTXrDPyI7ydRZ0_]m Ue/~nIE$Z`[\T칙KO PKeQPKK>4OSGI-OPT/src/org/w3c/dom/html/HTMLLegendElement.javauAs0*xB &(QkK$0!C=+=UW0`e0X%$u-e2=R T hU!1\gؙONjl  [M8~=C:(e/@ hHy[I逡<t7_:{bmG|勏D=zT5:pCToh H{^J/U5Kq[mN4b FIi>oI`nWxJ$ۤVkt2 ɞ!nc)C[ BHΠ4Z^!TzVD`6҅kuXZ6s/]QD9F4> V|SDRG[r͏+TŢ'|O8̂$z>{3)G'Bx?wӶ9 u({^y =7ҾdPK PKK>2OSGI-OPT/src/org/w3c/dom/html/HTMLLinkElement.javaAs0Wdg\pSݚcL2,$* &Sq9h'K.a*Yn``~g"F^M&@#זacI ԨL\R"KИ@-T`rb1}\ r'0o FVb'k(4Pk$ !>XbYV;WNא[gUz3ɍ>y^۶.Re^g U8G]@AϚ+xVmkZ XzFZ׭↋l Ze LµQ|[=y !>a]-ַy L׫Yoj6|lr!D|a!{K˜п@YXΒ|b6Pyfx8PKlA<?PKK>1OSGI-OPT/src/org/w3c/dom/html/HTMLMapElement.javamQo0_qTa֧5 hͱ=!E!ZQ{|㤗 \؃.XL`U)%u2==VR +t!\0:/+6qhr-@GjY 5aw8»^)[5r߳2/1ܮ7Y%0_7&_ ~*sٺ0etP"C [ Bc4%>^'*(q,W<(MO4YEʴlZunKMRi]o7w;n [ԁʟdQ*zI.>ύR("42܏ۻt)M q7?,)H/IPKfMPKK>2OSGI-OPT/src/org/w3c/dom/html/HTMLMenuElement.javaen0DW,|WrS긍PG,AJ$KEK[FD oL#G=T`S|WZ"Los,˰ J[XLJXA+t@{ ɿ22nL`2&`q4=tCyU/- MgGAtHy0% `yV$!'ظ&iZ*/Vz[#TRڊ8@=8EJ7sA8 6Tӛ.k&4Lb_"+)owniVlw.<i ?nȑ9b]1U|P A[V[M/i,Np`ӪNһAIqο'd\.SF/9IՂ~~@ݯZPʿE'*i3kh)?QkAF?PKx`lPKK>2OSGI-OPT/src/org/w3c/dom/html/HTMLMetaElement.javaAo@W|# nzjs[:X2N0maMGe޾W\L7{#8*&!*)T0N?OSZXEa3Y Z!D3T|J: FCi4q{B-4Ak=BVaC dn^gpq$8x- 8숚a} ā6eX6\Ƴy3^Uh-Jo ĖY+у6 J\#{#I AgKKFn[z3#~*؄QBKƩLbuhM G}1nƔ.)B G$`& hlEP≠ASK2`l*YKtu6kzqA1 r];i$Fh Ǽ-ļ1< Ew?E'G"H3Ͷ|[_Uvb13;-s/0SK77U%_PKUrPKK>1OSGI-OPT/src/org/w3c/dom/html/HTMLModElement.javauAo@W|#DmAMlɐF9a.L6ڝ7oyKtM{TIa|=?LB tAvE(r tx*P7pc/ [L:6 C %c@rӴZO;3xx<̖ȕ4*υx>>;c}#qhl'r. kt,VrZ`,ʢxLɽm rli^esĦ4t4I1n<ƛMʒe ׫E%땬>Czj1|n@0yEH_!Z̩\FU*jZ 9N oSSCu1?( 7} w7Am%I іJ67Ų5 ;.Egu/_jBVsb˿B1fԜ{CBWvv? PKnkPKK>3OSGI-OPT/src/org/w3c/dom/html/HTMLOListElement.javaeAs0Wdg\ᦧ6' Sf i&G V * O+IFڧo>^p kF4{riU@Զa~Z_?.߆WZءEsCDi^Vh"KL%@cpV0T-n=zr[$PKRuz6L&*'9Vk!p7sS)ӄIkm$N={ah\(1H5'dj7pS (z&GbfQq6QgKy!hMŦ#ee/2<^B)ݚ^9gWD[8󣱌⦙5Ń3u+#ǤPK2@(PKK>4OSGI-OPT/src/org/w3c/dom/html/HTMLObjectElement.javaTr0<_PCS413$l?R[r%dL&)q iW}T;ųar/9 b22vmXZ%jT[L]R" b'~% Oe}ւWLLvzLfDs102G$dw-Uqȏvy nXw 5)58[XS;ϼxNc<5J>舻ejֶ֪$VSMp̦N`ikZ:ԩR2[#ڦOp߽._PKPKK>6OSGI-OPT/src/org/w3c/dom/html/HTMLOptGroupElement.javaeR0=/_1)Y&ݞ=$EMA ٮh` n&lT;NX)p{oo#6G+ڽi5xH)w9k-:1P9W5Z{>ce?:ܱL`2&@q=tJ{pBA;3Jߟ,A  K p?>={͗8bm3śtΊR=v=)΁?<7%i|muP=Xjtn1y+޿ M#YPl\$) -&5)bHcdM]. 2V.3:}${iRd4_ Hq; >Kr+ш-Bh9.Ց:H WG;QlTZwl;y$)4ݏMnսYKPy2QotSj-rkѯ 멧΂VPd^4OSGI-OPT/src/org/w3c/dom/html/HTMLOptionElement.javaRn@=dG.͉N8r\`.tw1{gKq@{o<; lqC(g2C_f@/]! lРc#Y CkgLJµ?hr(@* A .99SOJ-#8Nk 0; hgb_2=h\'ˏz躗qzVUVjUNu岜QmFGsc5O{Q#Y ؘQ@[Dԑ7OSGI-OPT/src/org/w3c/dom/html/HTMLParagraphElement.javaeQo0˯SRe&랶>4[:2tUlMN*iV-v<'Jw_Y7%Rls[OZՔyBvQPK-(PKK>3OSGI-OPT/src/org/w3c/dom/html/HTMLParamElement.javaAo@W|#DAMqeH0mawXQ{gmR9r۔͛opswFb쓀iʂ`|>MBV^iaE̖ʐɵ(HZ*%pXc2[2V( ^0JɅةZ܁T:K!,T!!Pz69'CA[u,t8GQ!Ce9hmtixC׍lZ07^5Sf{P651OSGI-OPT/src/org/w3c/dom/html/HTMLPreElement.javaeAo@W|#DAMqeZ9aQa&VYK;o~:kXh wiHazX|?B tAE(r uF;g7ZGFMLdv-VAޡx|αc im O.Fg%r% BP3OSGI-OPT/src/org/w3c/dom/html/HTMLQuoteElement.javaeAs0Wdg\ᦧ6' SO i&G$UZL4OSGI-OPT/src/org/w3c/dom/html/HTMLScriptElement.javaR0=/_1)YnOhmPD ٮh`` fF̛7=zp Sa:uCXUax7?|WCؠA'G) 4"C DKwR? `t(AH Ar^!KZZnnOs!h@)?)Um[u}:`MU<GGQ1W59NJYBZ+ւ Գҩn5\c02-h2nIc߄vHO0c|(;hX?n)l6ǰtEhgfc@.-BFB.”<%khXPjA@qjH`h*^slW:G9tD~HL~iSMBIRhuo8\y5 K-̜ zz7?؎NS$@;-6h$RVHRy9/vA^uz%/{]s'y3)`U@g*sz,_B?PK|fr)PKK>4OSGI-OPT/src/org/w3c/dom/html/HTMLSelectElement.java}Sr0=ɸIOmNq1$,X@T&N`Npݧoߊ0F|e`"2A^N&#3צaiQ1uy2EfU,O_*e 0K+K5l4Pk$! YTUۧgJ琱agt(3YS}qYؕ*s: gRݟ/j \XEV XjFZՍ↗LZkx\Ӷi}Jx!{,ɣ.#xK/Y%L'#@s$[;-Bx !$]a3he^!kT%MkVMSK#x 3m\qߖv/]B\9UdA1Zmt7Q`bf , 7XaBΧ)4~\35}E a,j5ELj݆iG9kUHQ-;a ]<27w05sBܐ. m+tϩEvQڹOK{>(܏#b 6iL‚nӐ[vu81% ;+IO8PK@ {PKK>3OSGI-OPT/src/org/w3c/dom/html/HTMLStyleElement.javauRn@=dG.͉n`ɐD9.0mawY%'V8v͛\{p Kzͫi>mCXלazX||w ;4CO ds hE!T,X#jåSQ qp%%Ge eFia!3ΨAѩ<[Au>RWA}Ě`-qDǮQ1o59z`T,#5@j`FYTw[.9Yڎit47VoB;i$ DISmRx w0Nu,*JmL+Ws@.!A|#GIFaK5QB GP7ܸX872;\]rϣ8"J~!oSmFIRhuhw&}[z2)k*+nn)hWفΊPXpa5Ń3ӌӋs=l PK/*PKK>:OSGI-OPT/src/org/w3c/dom/html/HTMLTableCaptionElement.javaeQo0˯SRe&랶>4[:"\lUN*iQS*p ^EPKTJ+PKK>7OSGI-OPT/src/org/w3c/dom/html/HTMLTableCellElement.javaSr0<_PCSCh453QZYr%t}f&$qkW0U^bca^"!3" &O#/;cXA''rS3e!XJ?2Ԇ+ W0ŵثJ,Iȹ@].!UeYkt* ?PKT;_xPKK>6OSGI-OPT/src/org/w3c/dom/html/HTMLTableColElement.javaAs0Wdg\pSu܆kf 'GP * O+gIFڧ>\ypsq68!kD0M&ۆSXA'g 9"G B3TAmp`48laBk<dQZm\ < rgP*΅?ct]糞ؗ hX%D=5\Ļ0ETk:XjV:NsE9# 1&jkN4bcFaQ2Oa%Sgһ>m^4Z$an4W F) EF}Qi7ar!A|P#Qg4([V"rZDP7ܸk5;72o]G9pF߽\6~eS펒,5ߥߖKv.E KX8;I{$mXRgu^PH{hr-^̉Bgzv.#Whe=,!?PK[_N`PKK>3OSGI-OPT/src/org/w3c/dom/html/HTMLTableElement.javaSr0=ɸMOmNqL2Z$L<{W$S0Ҿ}v1>w* 3X8xBpË̵X5 &.1X;c12OPY#xDF 2 wC 4٥2\(5װb, bNbc!QBAU4wژx\Uv]ұz|OgpT7Y@Aϒ+xV-I`H,UH1#JqtZLZk4φH46 p~8$~t oLk?s:݀7zH#:T(v!D|&a%kIxLiRTnP2Z5 L,7ƎCsahn>vkK(4IAb]d';anH<EA7GBfp sH;HiN"Kv $(yu !u &/Bj/rgڽ!yOU:BT.whwLi^_Y(&$k(a:M`lX0Uw2%ƝѰ2VduBkl=:uM9ʼj=7KMVNAhZվ -r=w^L]";PK%DPKK>6OSGI-OPT/src/org/w3c/dom/html/HTMLTableRowElement.javaRr0<_dMSS 3QF,a:>3`}+\CB?,!3"oFCǁahPo0ILx`P]#K!CX6\IGw^Nbj(P$ n )VTUgvTx423:P*?&Y[[} i|:.`Gi2~GSR1g5%^U*e+*XJ+4fshn,`TndXW=)6&&'= 8:x0{\S8E~yW3P*lvm LQ 쿆J &WŢh-%^t$b[.G۳͡Iq=I[^PK@PKK>:OSGI-OPT/src/org/w3c/dom/html/HTMLTableSectionElement.javaAs0Wdg\pSu܆ 38 V+$* O+Iܸ'K.a8@} W)w!uJ);,|rp&K4X@+ `arz )Q$\3;h&bZ$nsl,p v38x<23Z[T]'qК`qxCê;)oنX@i`FY;-*m4:J;2RID>YM}MVpiEI $VQ'7S@F]S BH/ PK$pPKK>6OSGI-OPT/src/org/w3c/dom/html/HTMLTextAreaElement.javaRr0=ɸMOmNq&=$XZ$={Wv7`V齷=87ZK C~@J*0L>_|w CР^a#+4U!Oj#T0[KGQ l$a k ʺ Yx9Tj T@`=Kkq۶>JcŚ]8GROWqV*R*Y J+4R*ŠQmFG cH{N#YPlAC[ȑ<> ybXD0]̯$\̩`jH=s@2sE$j+E.8YZԨKaZ vGGEcϣ9"Jo?s?S&$)4:g]khd3%V X2s4;}X)A둍rӕ?يΒS@pNCw8U欑;PDڕ ~;SN/ MsV!< KCZ$qd.>ݯ2;_1=هvI:Y)K.׀.wi^;E%ܗHj PKV0mvPKK>3OSGI-OPT/src/org/w3c/dom/html/HTMLTitleElement.javaeAs0Wdg\ᦧ6' SL2,x[TIx2]d&sO\RfaZ`'Hږ*79Lm-:;5VЫ -=Bbdɟd: nA0&`q=tJ{9ERPΌhHi;/Y.~+Gӳ|a< m=k]N,_}`AXۓwGJcV-"yKT3k?H"-z.WFc &Ii>I`6Ɋtf Mv&7H'fws@ೱaƤ!G|P33XRM%^6>U<p`RG^\QE`IS)*݉;NChk|_\[\ءLQUV%-Rdsڠ/xASnܸP]_PKI2"PKK>3OSGI-OPT/src/org/w3c/dom/html/HTMLUListElement.javaeRr0=8ধ6' SLB,X-H$L<{WO11Ҿ}ޓnaшz`gɾ F0Ň9icz-Z4,Cb$kQZ,%p{X3N2g4V( 0Kك8ZvtCXDo!VzÜ+בCQ]u F÷wNC6(愵:YluGǮlZ0G`TqVֆ ՜{#\ zRXgDѹw5K$L l_,%ɟ6^6Ndf M&WWs@6>-BNBNF.*ɚ;V#F#hZaZXzF17] y"J:?Tmwm讠$)4btOnMQlQ:RP73OpS( V[ҫaMdz'aFGCD Ù>4\1APK>YPKIG@OSGI-OPT/src/org/w3c/dom/ls/PKPKK>4OSGI-OPT/src/org/w3c/dom/ls/DOMImplementationLS.javaA0ͯqMh7*TTd;-H4o΃;EO²\h4=[SXA}'g)J2C vVXYRu:FőP;IΩ*zML+]e52-bxI]Fh hV MN+JXKހ gnBC0* l2a^FPl\B/d YĆ)Z?$5WM@"0+\HT"dQPGԒ& Aw3gSܞxQ~*3uK3zG9RducDx@z.^t\H^q;)sȶaɆLq0k4"YRbWIm/my[kH۲r ?r3z(qZb/ K PKue%PKK>,OSGI-OPT/src/org/w3c/dom/ls/LSException.java}Qo0ɯ8S;/CDT-J:\65vfմuX'$8g2ުj1#, I]+%ax178CNʘLIҎJ$ !$;c|%Ѹo FboZlxC9UM{IҐfh9K ]aV^\WS!du],ıդ>jd]"}]sU'^!bŬ`,De{*t53k KT[j0Mh Y1Ȋq0͖7K&y̗YZ`j1ΖbΫHwͯ ϡƆ S8\CRtՊPY!U.\c2j?s&Q9 Ftܽqiq.]q`Y=3tI?Nā#[Ֆ$ы~ZiQ 1K4/'-A-9+.GDQPKj |PKK>(OSGI-OPT/src/org/w3c/dom/ls/LSInput.javar0Sp 54=99@[Oؤ{1jmɕd weL$ >3n`ʝB7<* s2!ߟz{ # DdHo(9LEBP LI]%&Ӯ'i#[]tڥNET@* !V"'mB!!QEV]7) <jiq %߭A@ۖn>kkσA]>6}Ag`&x[dNƀ?,OSGI-OPT/src/org/w3c/dom/ls/LSLoadEvent.javaeA0WrJVM5"RvG *خ=VZT7>(=ѣ;cC0*c2+$?J ?ye4'Kl,bz!=P_$ZAΎhu%a$X.~+A#:i: C"ĉqM޴>MQn3[㉏82k+0Dkd)MMpl*ɩcO^yMhe% de^)?|=)oJa+! Y ?brdX&`L⼝"ܐEj%y4Ah 6 ~oQE`I'GTKZ9rd|rkD9&&ԕ4a&&2׶'h/s&}zYQ QPK PKK>)OSGI-OPT/src/org/w3c/dom/ls/LSOutput.javauAs0Wdg\pSqܖfSOXZTI0l걝OD7\ވj`'_u-ieXyZ4{,Br&KQZ,p;X3Nag ?X$܆3{hMEZhXR9h-P9jBW:v>'Cm#94U99 ف8TFdH{z5Z &*ζZV=8O7$o6jdCy>$$Kqߓa HQ|O@y)OSGI-OPT/src/org/w3c/dom/ls/LSParser.javaTn@=qBCX%٤QNhmͶf]㠪Yp*R(`޾yjx6K0pp˒3"ƣ2D!BjC VdS3E XJ\ ;#Y@]Nְa;@4be Hj5ܬ* <21=@`5> M8lؑcnYwDAϚ+8UZV(5#FqE1-s0V&(YhOct n+r,owKw <oNe0i n_p2h|lra#>˃%]asRkYP-*AAjõ&)fFNra(iLLnR_u:)2*g4Y`Nꜵ9mHA2zٕXd+&M"?pq f@+w#ڟ#H!Ebz ~JKأW,D:WDoֻ}8֓"Eòj'R;OcᇻSe* l̼we=wNLBrO:0h^w't*w>ݏO1}GkwPK1VPKK>/OSGI-OPT/src/org/w3c/dom/ls/LSParserFilter.javaS0=/_1)YF=,iF$hOX%6MبwU^7o{ށ{xYf#X%_8u͙a ~ EjQ:`%Y ZS! ՟;*ͥ; hf)=;Z5F \@&M/:Yx903jhhW\^驌i>z^u.;)v*2Q#}FԨ5(rEwG` ؎֬ HSpQAtLɹ6ZsڛF~ ؘ@ ೟ؒlj֏c?J U U*i H|mu@2| ^I(Yn0Ț([V"J#hPתI`nij熙S?_v8OKDIcrz4r %/5S-xM% V2ЕT2 |SaDk95!sނN5a {~ʑqxiԄ~;%mL*Jvѿ~LPbko$/PK%c"PKK>0OSGI-OPT/src/org/w3c/dom/ls/LSProgressEvent.javaen0 S9%EfgiKXqGŦbIttػJ< |-nanQcX_ Ҷ%Kl~ 8C֡=V(%=V !ϐtxP0R}80tE<"k4foxw3x4̖+`eU_$>V'ظ&iϵ>YfE^, I=8ՑGPVJV`ơnMͽrd*hieMid>EVLszs^&[Z|?dl |)X&}պ0`R|P ^!-TS)S BcLݞ|8V/UiiOo("gCWf>V|]䐗ţ3M]P3_mĐwts-/LێA>Hx4elcXaPK/%PKK>3OSGI-OPT/src/org/w3c/dom/ls/LSResourceResolver.javam0S8*uXvO)Kۨ(Hjƙvm,CVZTr?vv ̍=:VmabU 3|/ʇ,>b]0U|/jsFtӉ1t&n|VOUi^N抍$!E!rwUfZnK>e]-蒗ĸ$.ؒvnZ1)EhH=7MZzxv=|w=$PKLhVPKK>-OSGI-OPT/src/org/w3c/dom/ls/LSSerializer.javaR@=/_2nNɞ U v3df5{zSZ `_͌<az q (K2E>L&#[m! ,Ѡc3#YP`P"HWF!%}ip(8TjAr*5IHծ5dNKϡ6V0\pCūgkm~<eyq4 Wa >lȑVM6ٝ"$grY2SʣɢB%Ow fYaۭ8_G7#GfQy$Iy~y7 TɜZrP]7;usN=Qk^nJ?y<.G,Hb[+m?^iB(Un D*6 ݸUm]-Ju+^rpͿyPKx/TPKK>3OSGI-OPT/src/org/w3c/dom/ls/LSSerializerFilter.javaeAo0 rJκ֓tAMIY>*ħn'Gm`Z`#Jv0~qQa3);D5U=!Xtt(.ZLGymك<4B4ThGBwgt$4zC,|y+FӅ`?g0 <Ƶh}.R3xQ+qLJHT<0uȵ`"(nM0䃣CBȭplR$P |E!d_mwϷۼ+-,7}+6% /{Q92_0&8/SxИ XQC^yF#X=Fё eI9Ft:|S8G,k$y-:~{ u'KQc#h1;vFtf'IPK>sG,PKIG@ OSGI-OPT/src/org/w3c/dom/ranges/PKPKK>2OSGI-OPT/src/org/w3c/dom/ranges/DocumentRange.javaeQo0ǯ8SRuO[hmh ]G\5mJi} Z=vr kӟjsZ7%yiAP#LU^IҎ* " $*K$ѸWl*dtm<GjER4 mTxgr $x< ^~-9zIqcq&mu}U%`,w|8AL%ŁY[1X׼ ԣU^f gj? KR[u3rИ%re0yw{<4,,AC/ 0 q^N%\\ORJrkDCh3Y')1`lZ)/y]_a$8_O2L[v'wÁ__jҒtEPKWPKK>*OSGI-OPT/src/org/w3c/dom/ranges/Range.javaTr0=jHrj3=8@ZO3I39e6jmɕd&6)!}[IÓX-ҕ,,2$G蝍F}-! Ѡ^c#JB FJ™7tP(6m@* A!‚U^*aWu)C--#8] 0ۊ+kaUU{Jìu0=nndƀ_r U-Ik*PXbV9ՕVtF%bM,bY=Ӷ]$t ~DGr,np~0`B?A8eT : L"= j$HdZ!UkԒ:u.!D.,A_а!:"rګιĎSKlF3OSGI-OPT/src/org/w3c/dom/ranges/RangeException.java}O0ͧq zڢQW* ℌ3NmV;T y7ypsU(w|IM@PUIПǓ!~2Ni EOQp hd!O3gF( S }'u[YT{v,4C؊ k BWCkݝ\ :jZml}~v֟Gm}v&.GEkF<#Qw]KY1w#4M9 Vi*Gja,`ֶL)Zl{_FZ@1 (CEЙDdKAGaI $^DyĴ AQRdtk& L"d7[uA25rFeJRPKj{aܵ,M%2{.3;hy/gDI'jkrG3fCY!:x( ?فOiJ}B c`vJ[ n~H"HWOI:LSڢ9x8Y|v]kxx5@FwLARy2WxPKkPKIG@%OSGI-OPT/src/org/w3c/dom/stylesheets/PKPKK>7OSGI-OPT/src/org/w3c/dom/stylesheets/DocumentStyle.javauQo0ǯ8SReuO[XmhBڪk`3۔FS`;pNVGa[|SHF - 44vA#GʘFIҎJ$ $W#Ѹd\nh xC9T!ГCiHv#ڠH0z,\z)#9z}Nabq&u&[bǪ[ݐsW;> :`,Dm׼ ԃU^zg*?KT[u2r/Иb/i`rooOw4g|mΣHđ>cQBu$U$^Ԅ<:rXQŸ6Js8x(Ҵ'HMd+2oI";z,(CMߌM{?PKPKK>3OSGI-OPT/src/org/w3c/dom/stylesheets/LinkStyle.javau_o0şǧ8SZeuO[XmhBlSM&Lj5s2%VƞjsyMM!:%$̯ EJ-yrOTMn$FkrBnϴOr^ty̦u8Gq6'P,( ivBT8L.rgk!De0b$NkmZ=SOUw#Ww?AXbϬ`DԃSAvo0GѦV>8Û2rИj/yUThr_ovϷۼ -Vg_Q7 GгuT1-"zИ3$U$^<,Z=ѦSGD+% 8t(SN({ !c~w)KGAh)9[/IPK.PKK>3OSGI-OPT/src/org/w3c/dom/stylesheets/MediaList.javaA0WzJW%) "J*5]V{tIbHlcOV+;6HD<~~sn`ʺ!)OB|f~7|6^`ˈJЫ-PQgܙ7NjB/[靷8:q z!TEC@*(tgFARs3xx=0. h>= y0DDi[YUXf5ST΁ş<0U!vڊQ[=ҞzgtEmJ]OWa/P0IrH |H4ytydIma:O:GH'f3@X?cJ!GB,d% MսjGx"0h;:,M+;INsFqp?' o]ȹ68PΎVo+R8x^,}J_؋E9g`{a[%H?)7i&R>l@WH.NWܿ~oPK˲tPKK>4OSGI-OPT/src/org/w3c/dom/stylesheets/StyleSheet.java}As0jm8OSGI-OPT/src/org/w3c/dom/stylesheets/StyleSheetList.javauAo@W$886Iwu} SO]#` -o|8A*ŁY;1B[ԣ^f k? KA[y+0/ 60K d "+A1>vi6;]϶9GOwK[sذc`QB*e-K^M5h>U ^p ^zG%Q>Bt<+J'%62Á e9OSGI-OPT/src/org/w3c/dom/traversal/DocumentTraversal.javaM0WrJVM-HmGcb-خmFU{ QjXgfpKF4{S>ME@ҶI0]BYͰhH<bЀ#$qBIXDsQб#H堷HB-Z| \uzD۟*F U:F4@`n>={8!b'H&nϱ6~H,_'1Qh- CG`8+e(1H><` ̠uF{5 #~@cc&Ii>I٥cdM"]r"dt${oi idT_2OSGI-OPT/src/org/w3c/dom/traversal/NodeFilter.javaT]o0}'Zmf J: 8h5l{96UӊC C8ÂW@`?w:eY:lؑjIX brIrAB(t<QU5e%Hl8iUJڠҔLqK(1/̛k2h1qn؏ۖѧw£En@}Ca!`a+e ~sFR%'b) Ⱂ\er6B۱j4n_QX"L)g!7Q Y5Ky1819ՒC~6>TK핀^Ke`(f1/л>ij1#,j.|SGiL(?`oRw\.|-H_ ޤB/Eφ{{h_]GckWkȡA-/ճ8!HY-ZAH*~6qz$v1&]Dw/ KW^{c7.~E5PKVtPKK>4OSGI-OPT/src/org/w3c/dom/traversal/NodeIterator.javamRn@=D.͉:Na Z9.0xw;[UHbüyF7JMK0/awD.ס G:С=`2'y%*B "F2 I6\fSjv})N8Cj!DC zo&iv3x%2OSGI-OPT/src/org/w3c/dom/traversal/TreeWalker.javaRn@=D.vSu58r\wblUbrry潷Ln8e 7ٻ U?CRhvXI(GeVhQ#r~ |CcI+ g0]zna+"s$sl\oAZG ,^ < z4\@n_sPCmEYM<:^}Y>`iE.^˄{''w@1$!C0OSGI-OPT/src/org/w3c/dom/views/AbstractView.javaeo0Ɵ_qSReuO[XnhH!mGcr*؞mBi Z}}g`R{0 (ʟiבPa~Z}Y- tCu$*5 F !3U֑Vp`4['P=ACH4HԽF9K CW^\pUVO$8Lk&E뒻lgU΁?Y:0L%EŬA[EyGKT? &-U+#V e0y=<]m EY ~gf ȑ9bl1)yE(!4 JjHhD#ZAۓ 6?o}+D8x*Zpt7*ShV7'h9.zտ(PKզPKK>0OSGI-OPT/src/org/w3c/dom/views/DocumentView.javaeo0Ɵ_qSRQȺO46H!mGcr؞mB Z}}gҫ`R{0 ؖ?#$f. tCu$*5 F !3UbxDH+I0T-nIЋ(ap䠡_$@Lh#%+/X.y+'s|Kqq&Nmu}暩աs`@'N SIQ1k'FDkk^ђ'tGa1伥jBȣplB,+!/gpy|slˊ})aնX|[;d3ʋu ȑ9bl1)yE(!4 JjHhD#ZAۓ 6?o}+F;qE&#n#3T%6yУ\ѧ=IVqPB^-56b9ZQPKPPKIG@OSGI-OPT/src/org/w3c/dom/xpath/PKPKK>2OSGI-OPT/src/org/w3c/dom/xpath/XPathEvaluator.javaAs0Wdg(N/mNq[1NX@)F$= ;L8zz+`!A0X_Du-Xt~ k4Fzy@Npl 69jBװOFN0Fgq-li5H@!jsTD\nՀ [ .YFrF}B`v>>Sv]#q uֽքwbD=oj44i0ETeZVj5+uM郑Fg cZ*F\@FQ q:Q3y7Vx(VkXxQȨvpq)+BHF!4ZSD(uCB!b+,\QyogDI5r SmFQRjurY"z] zM?b\#x*؎?H)S1=/NIJ[4z癲y*Ϸ$2cOuYeO-`?iF9ݺJj_pћPK[PKK>2OSGI-OPT/src/org/w3c/dom/xpath/XPathException.java}_o0şǧ8SRe$ힶjeZE*Hrx#6MHT:aJI{Y3\fodv#oQ]K b:=G/#J,-!;xYTU%5!jD3=+E8 }k0{b#Pڡb%k jB7MI>ӻx,zt74ZBk>M&]ׅ@jSMNn8LS5Y C[ixaB, qiO餪ưz:a۔:#{_Fc (G%ʓ|MQE3OSGI-OPT/src/org/w3c/dom/xpath/XPathExpression.javaer0)v|3\Deq済bJwegj* JlZs"!: w!"aL [dTEERC_$~R0 ik'5O+%֐jQv {j'Q\gR$4i!#м}~Z813qLw\ߧMVl2tZ0{;.O6x)O=d߄`UF4e*i^[N`۰YR@ZSREEavdtS@uݥ4x ]Ėq:j;`LL  YMBRpk}3`CШ;Mf/etr/sU_P//NG{Uj56CVkL<9 'x3OSGI-OPT/src/org/w3c/dom/xpath/XPathNSResolver.javaeAs0Wdg\pSuܖi:`'q IޕMf 1~*+X+}2id7q %z?-B WZɒ9P7%IK "%5vpO %:\ flq-NjO { Xv $(\{3xxss8TFwzL=ɎCa P3U{fpeC甧pB6Kv#6Έ^ȭpl(a3I&{CqM6d96&Yʳ#Io@ס6>-BA V$(5 4@FrGk XyN¡;/s~Ft8~,JQko=9JN͑O^O ~p7xzSi)dٚvy29YCPK +PKK>2OSGI-OPT/src/org/w3c/dom/xpath/XPathNamespace.javaeQo0ǟ˧8)2Hۧ-K؊Au}s5=۔DӾ Н# /V0~4l| Z4oXEGi^h5f>BI 0h2[zcAo4J \uzDksFO/9F4Ey!07B9!aّ8TSU;dւ_0Lg;bm ҙSz0 Y ̠)uFzwa?FZlc&qi1Oqs/n-<ǛMmӤ|<[4( q_l=$hvn JF.*i5YFIF `eZ 1^~PO/DNKՅ{\ t#+5bt?)!^fD\!8FG"5%cJ^|G[WJIJ5|hxJ PK0PKK>/OSGI-OPT/src/org/w3c/dom/xpath/XPathResult.javaSMs0=׿b';b'W$aBpҜ22Z$=7qq[}:pH.4>%;8cht8z- A*P\abs y.XL62 ۆS#%,rTH\gsŲhU\/]2y2P&Q j!6uGw|߀SN=ly|||atR h^)WI i24>]:T/7b%+!2, k2@e$_19"N7PK(kPKIG@OSGI-OPT/src/org/xml/PKPKIG@OSGI-OPT/src/org/xml/sax/PKPKK>+OSGI-OPT/src/org/xml/sax/AttributeList.javaAo@W|– nnm.ۢZX2N𶰻]6Ei;o~x Jhr mʒ ^,΁撚߆WZؒ%s*bo%IK"nOh,3VpO %:Z@4xH堷B-Z: 6?3xx=T WS!9>aL)Eku\e S]w%kЏ^8j*`P15<`UАuF{FcC $4$O7yHw_6w;xH$ۥ6[Xntn2^}${iv;:j'`L"DjuAJQGM Ad$OL'VˀiE'֋Aqp߽'6x >Tl%Ys7Fpgp%hȭI6nt y(g-3r9ÎB/=Y&ڝ^qmoߋ5_APK9z\PKK>(OSGI-OPT/src/org/xml/sax/Attributes.javaRn@=# NnmNqZT `'q)nwcw&83o޼ƒ KӼZ[!Lht CW! dhPop#b!VO RU8}k0v;Bv qp%p[Q~OC!рSy f{gmE]ׅl8DdPʃ$%/ȚZV!TrZ#Pnܵr45oev_z-⍑mPK x PKK>,OSGI-OPT/src/org/xml/sax/ContentHandler.javaTMs0=׿bd\CS%4 &NB^5FR%t߻2N96>~}v`Έb{0M? R0y~ۋf> - f!xkQZ̠p+X3N4V( >Ӻ:ة lR9,!n­:-gw-Z:F4@`%<+~5#e~d4ĺͺ%Z VP0M8[גՠ k#EVf=L&3bY#8R$ЉSH$ ="_Mo簈gx2O)Lg0N.y2ē;L.C@V^!E<=%\pjM+ A##hZ"yRc1՗/v]Fm$"&\l?Qş ' J84|1YQ8%vyX.e=LZq49Bk OcƝCM nQxT1vzX=c}hPK+dtq}PKK>(OSGI-OPT/src/org/xml/sax/DTDHandler.java0)F=tFRM&@jiZxwi3&+}2T IӐn: ȇa+-Ѣ9`yZYCH(7dBƒpMa FCj4yja/N "k<B֑}Oσ:hU ;8.=qL7Z?e/2pQ6h-ْቷ' eFt ԝ!Gu ):Cֽ2#~Y $4$OЋ<:62lnUƻOd%! [}𨍟1yE_!Td5TQɺ5Bh$O͞VˀihON>\Q/NG}YqݲCS fqϢ KoJ6z8CE94a!\ ^MΨ^Dymٿ8n4R {)j=~oPK~APKK>-OSGI-OPT/src/org/xml/sax/DocumentHandler.java0S8J[˥)nTaKWUƙNm{!@]UTg'{Ї*Z[ ]ރEQ@TIн >M/p۰thP1 HGi0JnqkO|%.@tڣNo$;T*! d@҂ծljaMVőc6Q8޲@`n~[k˷aXu@<,N&<&6Ah hY MoJlCAi`F:QZX!sl4:TŦWID IGINd+XGe4_K/x/#|,:x(04EH2uB2%r Nɼb9B%u%0nS'S6[ G>pBtpa.EbLe!_B:c4bI^HofL-~=eiu#jsY;H/Du_4-,p rD7 \*.z+,2 [gVOL+Vqw<mo.eОM)˔vdSeھ&Wm}gvPK}|X5PKK>,OSGI-OPT/src/org/xml/sax/EntityResolver.javamA0WzjW z Dj,{tI:vV+;& D<9M7l{V3(OiےTn>f"l:(ѡ=NC0y tj!5X+ZGZ4&ci2[ Ϡ!{ZU<rZMK_+4Js8iq:"2ݖCPKK>*OSGI-OPT/src/org/xml/sax/ErrorHandler.javaAs0Wdg\psk}mfp8Is`MARWؓʦo߾% VI6;rmP%z0~~6^iaiU%*BC(3J:\ &dGPAoB-[)OSGI-OPT/src/org/xml/sax/HandlerBase.javaUQo0~S@Yi¶h&BUsolCAAZs>K݀6\|E,Lr@Ϸa< LР^a `LP] 9WJB/Vu 6%ۀT ! Ek!e^S+]Tqjnj 5m֤]Se*Ɓi'0kb]BSƳ Xq6#+Ai`Fڳʱ.B>5%`avϑRu ٘fC7"w j d .ǣ~4#z>GHQ\e@4s{#Q-%#s)5,EH G]!RXf+A^.P 9 R:X/yng.gr̋ W5*^ nVJ$L3n=VLw}Vg^ѪO# wB(|ӎy?يV*ӱ<ҩ=´N3˲T*z!,*L|+VuDyv\uώ{V<"Is.ޓb=-]H慍Ui,mmk ,;A{CE#QԶP3i?}UGKh>9TA 6Hr?Wy79}wzPK9PKK>)OSGI-OPT/src/org/xml/sax/InputSource.javaAs0x 2ڜB[O3J2߳7CJI8{,FiDTR=?ߟ{wZȒYS7))Kj[JVEJp ]xQ-v-Xʂ@*jVwZOC/vOFB?+/A4kh=AX(Kh*ENP)k yB :?47MYVl.^pH ljm=vx[E(uxsD07Hf$<[}!"'wut8'0jꢸDnFt,TgRWluZ I$nD&/-Dˋ<<&c hvAPKY>c7PKK>%OSGI-OPT/src/org/xml/sax/Locator.javauA0WrJV){kf5*dڣL kTwRVrygn`h98 /qے%v~\ ;CUdK%JBkQgY4ps/M[ŝUA*E 5x*Q; 6;L.'U8r4k!7AsS 3qLzL=z-Z dxbbe@4y)O=r$%XUA6Ygݫ^yk&$|qKof{xw8'!'Yʫ-I6~$!G|P XRM%&^4:<h4Y+oRGNs鿹|(8_ވO]Zq t_pCS *c?;.Bnھih׼Է$SEiÜdL|?'՛|oPK6^PKK>$OSGI-OPT/src/org/xml/sax/Parser.javaQ0ǟ )/V@ PC-ђ$0 Tm|$F0SdDs0FJ?Jp! o&W!mXL kh3R"w"Ci1Zhb3>BIaA^jH堶HB!*B4;+fqD1͑2gD]oWС)8=7t{D/_3R2LF֨9*KV5"ۘߑiOH]TՆ(_ߢodYMBe{]H'܉ZU*퇮+Q湖U՝xMD.}ҏ PK<PKK>*OSGI-OPT/src/org/xml/sax/SAXException.javaAo@xkZN.$L؃캻k WCUl̛8 pFk~>,$T*'~75>bN̖ȃIY*Ш ܚ"O 񕌕Z.z]7yn{(Xb iv9R!כCk[t*ϝ^: j>!\}|mH#mʸ:!O-SwU"kag# ;^!jŒY+BǜԭN2+ C^l~1P%ҬIfyJg <%y2] 9Ƴ}HgS>}D2}Ɨtzxd܇vSqaOH\dTوP-ŎPHj2H'/_Q<^'6Udn̖͒%&ǭ?vTa]lE)߱MWx^\] 3 j#H]K+]3PKMPKK>7OSGI-OPT/src/org/xml/sax/SAXNotRecognizedException.javaQo0ɯ8S; S*%cnrRN2s !G=εWksz GmPa|=Ƿ8,J=1;;YrTS5Y-!5߰3Njxq&Xu8Bi{Hl txHJ̀K=3<zm.~>}[ͻ$>'X&iZeE^.^3PuZr~tr0U%ڊB4x@[jpz{a)y+םѴߌRm DV>-rLէ iQ*[X/l-s}@?sNA2>Ɔ)C;ϷFJndTӉ=Yʼn` 6I/i\$߃w:>؉Md57U+LTFɟT/NO <:xRYGi2 7q|x/l~_PK #BPKK>6OSGI-OPT/src/org/xml/sax/SAXNotSupportedException.javao0x꩝BRvBW bJc&_SCjiZM B='p6G+Ǹ`Q~V U~?I4A$GvOuNVTM~KȌ3FIpL1Ѱ4G(9b鰑-Pz鷧s@C` GK!O{!MOĉ8ѶI۳֥wl^L=W-9K:i9akfmEm!KuR51^X 6tu__ 60J2/`򐯾,WxȖˬX%f6_勂G1+s`lH2yED6 Ur#+N4F*NCv']VǀuiNzOS Q= Ftrصtk.U+̾ڗ1r:xRܚ)z38c<IH|w/tE/PKH?PKK>/OSGI-OPT/src/org/xml/sax/SAXParseException.javaAo@qȵ m-'*2&Ms\ۃuw;k܆HUU`y .`"@?%C&QAEoc!0A1;oc-'UgdӗDU݈?jhd"%Z+;#-u"wA˕iBkqmOj(_4bczA a܃AƮ5 7K  Z ̣p#zAtȨn+e' LnH w^t'ol<Ŕ)opȥMcCtoSɔZ~$=dGLdQ"UJZ aT;QRu{fE.6X;OPK;]PKK>'OSGI-OPT/src/org/xml/sax/XMLFilter.javamAs0Wdg\psks2uN,xXR%aweӌ3 i>}Dt5,>j 3Au$d0Y,ρf߆+-hBi^hmb-*9<$܄ zd,Mfz؉#H堷dj$R;= 䶧sFOϣ*`ͫRЧgE0D*FYku\S]Ck௞ O\AhDɬ@A9Cd;7ަ& {?FR H7yJ6_ 'OSGI-OPT/src/org/xml/sax/XMLReader.javaSr0=_ 2!9@OSIFR%C; PC'#۷oN`(Fba N>s˒3!tSC/p0uHS4WHx`Q] e RY0tvNQldK!-T* \@&j'vٱ8%p㐩egԠ4oٝ泰V}X8[_E$'ջQ1G5mn)RfS]kn(|0rnkXVo6&&%&Q;hv6N,'OaOF,'tpr_$hvLܾ"${r+(g(*V rZFP/qjH`hJ`/7ywGDNe>TE=gw_/]  %a%U 7] ^h6jNn(ܲ\m7 ZKnp*evT@f+b33HӃ٤emڞIx7v,#_`IԶO3t\kIf7UJ*Arl"+MAw~s،kuv$;tw4ϻ^L[üMv~{PKdY!PKIG@OSGI-OPT/src/org/xml/sax/ext/PKPKK>-OSGI-OPT/src/org/xml/sax/ext/Attributes2.javaQo0_qTYByۢUA"tU&-؞kԢCP|s*++}4l OIے%x6^w/+-Ѣc7 :YEH(o%%aMaa4x`' "{Z<R֓۞\< < p7h~ A:q8G4q{6/|]wEk '. 4S`V ϜԽ!G  :CE.Jџ 6!a#iztyudNMa*[tGHf+sO<":#Y%Tr4tAhDk Xyv;-qaFV"<@wɝ94[NЁ1CYً]Os)j"墫1[^)c/|(g#N^Z4_z _PKyPPKK>1OSGI-OPT/src/org/xml/sax/ext/Attributes2Impl.javaRMs0<׿bd\C9IzLQH$c O$$۷'8bz$ⲔBep08 7_cdVGIdFRZdJd htRw)6RlCm9\ZgT9HL/VZ#b7eJpr Pi~pݳpz7MH__׬V%Y CjilQLXk)hQ^uca5ɥuFj${l N"I;xIzdq|=M<ģirb=0{ILeTQPŎPYJjY`iJNՑ/?WOIGeYh΂qJbÄunG*OT=bwP}>9]lV;l!c +a:gZĻ0]Ґ\ΰYA@qxǶ/HJѲ‡MYԵ PKro7yPKK>-OSGI-OPT/src/org/xml/sax/ext/DeclHandler.java0)F9%+ ٴ6']B=:0Ʀ D{DŽJ5*g|7PQroaM`~ Ƴz. Wi`=P̡9j{f}_P$̂)]hH&s'qT TRYh 7Pp].!SU=>#AC,rFj:/ ðmۀāe(N&$]&փh hpMj؎XkAi`FY[-FeL΍|3~3/ 6&a#q;x{~cD6^b,mN >$˨vv&wv)BNHƌp ktddb%--{+_PKj& PKK>1OSGI-OPT/src/org/xml/sax/ext/DefaultHandler2.javaTMo@=׿bD!46'hc5 Qbfe]cPY!ABr<o޼qȃ#bym'9DBp&S@ۡ3EA,$rS3(e!*XJ?' Wza|j\بlRY( 70)T-ZӠ8&p`e(@`!]:BV3;bk:q8Jouu!\Sdz XlF\@i`FYXW[.ۊit07VYiwDH ٘V@cI@.b d0 =}ht_ $ɨ : ɹ"$;jK9O5,G @ƍ/Wy/DJ [^QHHH#~R3{ۢNq0nl.QZE 9rVZ=85 7 d6\ ܹWgx@'[i&d&1WLwg>o7o>i$v%Ioi]toNE?]0GÐKېj@|!dD?,w0ݦH%[ڡˢ*5sÆ^R ÆZ{ ])bm%RӇrrDEo_%Om«?QXSgK/PKDC' PKK>1OSGI-OPT/src/org/xml/sax/ext/EntityResolver2.javaA0WzjW!"VTwY$ԐvVθ rHp+OF4;r9{/ i[e0]!,eI hXEEEbЀ!$;!|Bc05-Iu'Ag4Zx,Q;J#Z/|ΨIiP4iU}9܍g~}GL)0kt%Qdւo08DUX[ރ2sSF8!] zJXgDѹ~1K$ R6 KYEa fdt *mgzI.0OSGI-OPT/src/org/xml/sax/ext/LexicalHandler.java0)F9$6'](&U} 6j?vp,d}R8p1l²Ll2z@7c߆ag35P:b擂Y s@kg*ͥ?&xn%N@HFr^"`bm HeUh-7ϠbIiА{(QAMD`f1 hg=/U\j^P Jh'`5QlO%kA*`B3R. MZk1aџ'mL(!G.س"Qr}H1Mb`,$n='m YF}0|#^ kLySM + yD%h"QU\cYW0Ӈ6 |niJ_̝ٓA3:5vdlyO%It^%=P7=0+xʮW1VP8Pde-dySJnN7vdҏ|DKbm275jk/o#rPK#R\ PKK>*OSGI-OPT/src/org/xml/sax/ext/Locator2.javamA0WzjW!)B@DI˲Gי6i m9$gwسŚ`*g)?*V -M ~;K4l=#V ;=V !BgWF"4&ci2gC'Π A=Zxh i:; }F@ϣٓ`GK!/ρȾKaq!Nk:_rUE^9xaJ=b@4F&PNM 4Rt_Fnc&Y y9Yq0yw6;xʶ۬6[Xn|o }xyrd 0 q^OJ\Ej%5Ah 6 LW("G0⤓S&^<}d=əZ)d܂ uoE." Iɡ1YT?_/R(PK:nPKK>.OSGI-OPT/src/org/xml/sax/ext/Locator2Impl.java}Ao@x5[%JA¤i=mͮƠYp*>`y曷r.FiDTRߏп+-dl) LdJRJedք)ߚJ?Xam/h5Vg-F존Ce=JڥT:HTon}Ӹx<5z7:Bx+?zu]Hj&hGItc6{X1ϣ"'1ME<D'|]GshWcJ] ɖʕLy5W"'zKFF(lj06H'^~P/8?ވw"b ZrH | fHv2{Ѳl:mH9U6st>3ܫ)`+LMo)L8X:GC2 *!7~4̭έٔ+W=gntPK)PKIG@!OSGI-OPT/src/org/xml/sax/helpers/PKPKK>7OSGI-OPT/src/org/xml/sax/helpers/AttributeListImpl.javaSn@=_1dInm.uIZEF$Q=m׻{fSŅ6M޼yc‘#jygC9DBp&3|29} 4@zy@ Nd3se!XF?]g 7 W΃ 0ZᅓثJ,IXs + \Bʪpit* uje*zZ?zMu(]5,^%[rݱ@c@㏚kxVȫ` ( H=Fse1ֶaL΍|U^hOiID)>Fim2^mXD2Ja<4OSGI-OPT/src/org/xml/sax/helpers/AttributesImpl.javaTr0= w\͉&i4'I&GXTƞL+Lq`}ځpKә703#ǃQ2,R59&)X Ԙ@)T`f~bz4\

    UUyv*V/0:C֕5(YrEO r y\KRu2Χb LµQ|RVh=IQ>QM0:Í?88`8axaHoo[)2ZMn\"D- |eI)i4,EH9*IA*n&<㆙1]8+DI{Lx- R'NQN(L#i2YbwΫFMupCmqXAٜy6/bY=V>^>^~v6 dm74 hMZBS* ;#x253wjCR򘉐eZGe)>˗e}Lh.(xLhE =txDyROጯl^~ǚn'ܤ_>:w1?惈OIPK9e; PKK>4OSGI-OPT/src/org/xml/sax/helpers/DefaultHandler.javaVKs0>_tIS 4 &M35Br%d߻2N&Ӹdշ>Eu^CWk#3o0$ R06V0Fh,0 b Jр!D9SiZQx7hVfCus CXȄD܁P<-~*.+ =q-oU̹}\.CV2vvNnԹh-UCOrbلJmM izij3d=L*3bRrPژf@4CIۃ\.(~t^<z>ǃ^RF~p>*BE!J6G.2)45-ahE9Fp̕GqyGF|(j.CV %F^L(%#=X! K9*gvr$[޸SWN5G:cyxUQ&nN">cqGX0sЦ.pEy1zH}зQ= Px'[3LǨć5 Q+x`ƌ?jBg19|1Uq1-M@N-G\Fs:+Zlf1OSGI-OPT/src/org/xml/sax/helpers/LocatorImpl.javaOs0jhnmN.I[O0jmɕd q3Of췻,f>YlDTR0HP鲩TTk2]!Os /o4LJFq~jRMYKQoed 3 PK3i'PKK>6OSGI-OPT/src/org/xml/sax/helpers/NamespaceSupport.javaQs@ǟS&XP3vdNB`:AЂLnw^79 ^,6Bp&Sy{h&>-f)xKA)34}R#r%3OSGI-OPT/src/org/xml/sax/helpers/ParserAdapter.javaVr6=W_㓔a)۷'RNU)#*q2 pE!XJV3,(&#&Ձ"o\boU&̒_Dy f{OsthA&JvBS@k^uh ϡꩳ؛6bC9Xo%J4S֩Q<x[c% vPhtA5&*~w](*ơ0?$O̺zst,]*/ f%ŒbƂ,zg)̊v¢I#%#t gQqrDI&^ZM4GE3OSGI-OPT/src/org/xml/sax/helpers/ParserFactory.javaSr0=_ j\z1LqFH$cL+0r}zU2` 3Sb⣄T)Z 7﷣8e@:X#2f@E ҎJhtI QO_7N W0Ku8vxm<4C:HE@AA]Kkv}zzp5?m΁}m;űUNX|f󼘿f;95f [05oJ/u5g6EK[nEh/9cC ȊI Vw+O4_eK-l-r~4Y~3ȸjL;ŃPK-IQPKK>3OSGI-OPT/src/org/xml/sax/helpers/XMLFilterImpl.javaWMs6=Wb')R{j|R-ԑ2R'V`PgAVv.v[.H&O-)S~}yy0>Z43AGeq7Ahӿb&X\PEC,uSd CX iZP 7)P<x_`cd!!0W&Υ/|qMҔ+[ۼn;ݸ+.*ւ2a(XJ8W 9YύpB%X=vsfÌuF 3WJ)mJSpъ!/VŁyzo[Aԉׇ^ ^}EvH)up>]DaWl\T!34"TX<Sˇ 5k5gDSZ'( lH.q|NH&"9]rzW@ JsAxG9TZך|R-Q7 |#;P}d>?3f.wfZOa|m?~[TQ?]cĭwq|zըyY?ͽڊ'6c0zX<4|uxDo 55q f,nN3doHЕG52@eRٴؼ=տb0VXVsƶUuS9bȍl߭Rm},Ҕ,*:=7wrzZF~S=*yWT.N;<|JF ܝVPKJcjPKK>6OSGI-OPT/src/org/xml/sax/helpers/XMLReaderAdapter.javaMs0WpkHzjsr6`$A 1+&ޕ8Ҕxj%jp 4& 8Lv~tF6R5%F.)X>Qh *0s/a!\ 8qаUoZLa T#ip S#*EReuJK7F7 fJ37&jeY沜ؕj֊X %2RĨ5(rEO لXcTf g7\rj2D\'47#@mc^~P^g1\y7# ]x Ulm;]0N0SRibL.Q T jL0ejj[+DvWl1&5}ZK 5˜yT% b\0ݑ bTNw +ޔҏEMbT2Ju/<;wp7dݬf.% 3B {ФttWUEԕaj;_YO{E?ؒv݀6f>n~!)_ӡ"ͧ|&Gj j1M,b*r/?|r^b3Ij*^u%%C_]6}A5[J̻ýUC/CfdU=5e|Pu=Tۊt@0e:^Bϔ/Xm^ʷ}XZPKW PKK>6OSGI-OPT/src/org/xml/sax/helpers/XMLReaderFactory.javaS0=7_1&to-eۨ$vw3Nm1+6D߼f#T+ˍ<&!UJݻ߰H rdwTHRvT@ 7i?~uh N԰hvZ* Pj} $MxV[&u4Of#nO=jE΁xuXkU؀%&nRpfh 鼕߄_#[plY>$Oq ObΖ$}3^=@:{~đqW68`2y"D7"U$Z Kjv٭tFɭϿ ("N:oUpoH1EU0tA\(8FZ +%X5<`a8W_[ Vj;C\q-vh*n厙Np%ifDpa?xGڟ _"ɢR Zc*OSGI-OPT/src/sun/awt/CausedFocusEvent.javaTMs0<ǿ '踆#ROLN0¨5+8L&OICBZZ۷~xe'z?ZPK ʎlPKIG@OSGI-OPT/src/sun/java2d/PKPKIG@OSGI-OPT/src/sun/java2d/pipe/PKPKK>(OSGI-OPT/src/sun/java2d/pipe/Region.javaWs6~.N g}2$)H t5Fr% O!xYꓨ~(Bpb_CE \n*@ߟ; ]k ,H(4 3~7R@ݩA\b!i H\ØGcl 4N͹,( S 92944fRĘju>;lؑ*F+[]mywvX^"BA Wh,&V>׈A*`Bzge=WpV@˱3&(>JV)M*p]z 2> nmf:]セiඇ׾R(f@4-jEa,Wt>sRaBPP bTSj"XOaf9 T-H'X=pbc'#*$ӶB/_K?c.XڢNjn X~ݚ (jIȃN9A.ʿ̅S lTF?^+dfP ]%gg=Z. SݏxEIfUۭ|[I˩42Bf{OHc0рOO)]5c4@= ',IO  ( M`ws, D8ROӖ:ln7+`q|Kmx/^%ϰ߉ŰWm#19ضOE G rʝקc&,ƴ qǔt|OwU9!#vSX5wQF^ff*Ls[4 w!)}Nw=i΁J`crQYnɂRے9RwQ!0OSGI-OPT/src/sun/java2d/pipe/RegionIterator.javaS0=7_1&[)˲mHU=d۵;KUm͛q4 `3;l3XdПF@gZXESc'J9T2Gnkѧ˕I8Ou`)=;T*-\ !CK^wvm+MǡQ:#2D9) Y8T9FlHIuz*n&UےVPXibNyՍrVa=Mέ3|[W=k/6&=$ydexdr6Y'Adq;$˨LD/VIjqjKFB&;VK0GZw]V.OSGI-OPT/src/sun/java2d/pipe/SpanIterator.javamQo0ǟ˧8)2HO46T!]UM{0p[M;'4j*++}0ToKXe !! l:?\^iaMe Khe!֢74Y8[T ;qك,T @$jgp$4x yWp:?FQ8Qs./l[Ak௖ W@h*DάAA9{Cd=* ަ$ {ӴF.&$ lqdol6qI0_dR}8}Ir80&vJƂ**4YFUFrEZ,MC;r'l+ß2Ԥ&m΍94)gZȄ71QFr_"c.:E U1|0skp9*&0ϫyϕjg q<3F9'PKTKiPKK> about.htmlU]oH}EUJ@J*V8/x{Ɲz}M jl8g=3L^~^?ןZ~|/v}[: X>fp{`w0v{Ax4ŗcx OR~Kq6u&AM2trr?]hP9]Q1m9DnYG.hڇ:.!j7m-͊cIƃu"-47B祑TV"z nͿIN: e4D@kw0xGy}l;AjAw?Pa[BeA&L:``-.aPK3PKE9@java/applet/Applet.classVmS@KRw( ਵ3t*ў%Nt+~r%Đ^ϳn:7,h> Zx",K^>6?3m?'1J'd9!~#5fo3澧gCӠ uMu~nzkq d@Ÿo:6g_8QRk#1-juv ݆[i:U0|'?b\9"P*sݟCoЛ9wTD[&{E=.U#itZڴbB]Q[' Kی3^M>4iNOU5* n^09t1.#;QW㹒^ze={F`P~Ir޹sYwq'Tb łt;wt{cbЧ@ȶ[1/ XIoJ<7q,oOŷ2͟0pIuw}w|_NE$@>nQ5= 9 c%5%rV"')Nh#c*x1'9m8Mcg7ye-@,BSUX E97gTLhFf +z,)XMez#nv&FѬIJDĂ}Ҕ|vFTNb^RVjr #KN~~#fSX K@b\Eɩn9 |p@12513`V6PDUpI&.PKCPKIG@ java/awt/PKPKE9@java/awt/AWTError.classeNN@WZZhwoՃ5 95\ x^6Y ~'~exj<73ow_npWhQZp KQ2KR͈0HqhU P?-t! RCGtz.$y]r!2/6/ꝐG Y}c>&z 9Q&%6N\9CջڢFt qf4~ϸj*uMm%2?aj֑sh?iIV/c2ep'mD]2J'N7%i e y n{N˲ɾݨ-p1wOY1r{Va<[Dp 1j "LX.䴯:twx.zs9xe޳gr}7PKiqXPKE9@"java/awt/AWTEventMulticaster.class{߱86 8:b; $YllXcc;" [+Z}mm>O?OߙGH_v%_}i杯 m z[֐--oخ?ݨNɪvr bC3+xn\~ Fݯa(bЧ ^uscIP3ڛj+5ꡢ E15VZ{tkvަԆ= *)wOWu= :߮ +kvz禽Fz*B1!ҚmWBY0R-9nTq}tDj޷|Eb( ߩ  m# '* rlwA; 1hX,0 vq^oTWڂR.z%h~\kNb\sVT4-1f=V NDiUFxD%K\t cTkZNZ)RZFG{)Q|T1]t['6ӵ\Q-x86=̂Z [$I$dm{ 3L"WǰDi4ZN&dz^%QO(3Fq!ZۑVk:Z 8PlZGaRX0xsƜ"2L_tObN+.1gJQe jyĢdVZ &IdxOf^.!%*4)M,&$$d%>UՔVε* m{,YJ.wRT ([W68h:rץh svy{JVgëu*lbes_I鋢H` $&p9_ dxl'4[؁8N+zuA~Ֆe&- ^2;U5NYp!Q;ɑQl<%)h}Snj‡5xq˷ t;h6DuN"'t=zzM%K@Μ]-zx0__XSM$E\VWC8/t{!>#<몶F=!NÄwU*ܠp!O)}d &⼳uXsu8 f>yf[+15dY0xj =5##Ҁ[Z3yaN}I| 0|S,|`͛ 8e$*^e)vEmmkNs{NZԊ) U^CM̺-JKG55j%{%ia$!$|:؅gOi F1x`߻?9<-w ^d)s=gw79w"d'+}< ^F<GQ_᠙sB6!VPF^q00΋цi\  cL2%Oa$0. c\280Hƕ1I2zƔdL$¸&FdRӒ10 cF2f,S7$F#GƼdqTaܔcdSK0^'Ʋd,7H3 d I qG27IƳ dxd+~E R8X a= 1X5p>x>@ *P/$"\`BLD|H j4b@鎜":Y&hЈ3b6)ċFMEtc0>"@M[{u.q} oq^?A$=_"Dg9 J"q@|F /)H"+U*%_ 7hk4b@|F\"߆PB"⻢43x˄ofofofW' _#<3/O_'<3!<3%<3Axf?Gxf?OxfϿsɸclձ`#$ݰݐGx-?4^VX";3#` a?q?;399";6Z KU-x#;=E @#n?҈;O4Mgq@FE ޥxF҈PKD7nK+PKE9@java/awt/AWTException.classmNMO@}SZШgoobb/%p^ԭYoq"GfAM|{p$G ^MF7|!|BRSгtCdg/(= uu'#4Fq)-oSiFbZJB7 QQ^=`!̙3r\RԩqMƐ d֒ $h3| : @:SkPK,CWXPKE9@java/awt/AWTKeyStroke.classTYO@u)! 9^P#QE EMDHm6,567}ԇk♝k'k@挶h~q oޱ˪cXNFavNz *87ZMnpg@L  V>4k:pNC,xqrȴZ\>!ZZ!@JjU\č}nRI3Z%XQ1, 1s k|Ǵ&r&rx]'V:;*BX377,agl}]i1!01a*%XG $£(@ҍ _4I\./ОB{¹p{@}3j8k>Msrk]84໙zݮfWNm[0!lEOe/HDE~{q7: !|QFuBSa#AEjbRBC0 c^ K}DY:qIcɫR!?Y_ $r*=̵EW7ʍ>qlGqJY6! Q$L׌͆2ڏ@?e?îȉJÓ 246;G4wENE"D.9\]8,*"u]<u3Kۆdx?CZ|>(_Y^IZPK?0#,PKE9@java/awt/AWTPermission.classuJ@mFcFp´n#-u=CI$˕;H,ܟs; =5BY,/^ra|/\eJa2ZT+!4U QhHf(*s>JuЀG8V[ۡJ]1J=X:ax"2O*#Xz`+kِBGV5ƅ!?aN]vOޱfű_J-p6 [nTԳR2gmPKPKE9@java/awt/ActiveEvent.class;o>#Nv&FIJD}̲TײԼvFLNb^RVjr #GJfqAbIr#f#Wp~iQr[fN*P z l @ 4 b`L PKztPKE9@java/awt/Adjustable.classmN1oGQ׍u5L)АL'vgsP[hdqs۞7pY 9]P+ۙ8`E-lX}C#@\n$P#$,Jž ]Ni ݮiM4tz1dBy\*&XL%b lmgD>c.&oLryXGY^CP=sz|Q#JF=ryk^pQ 1:(&-̕dS(\(-+XQo[n{ujA1^`(Uj_k5"W9EqLKC\񢖗mxm.m5U1`R]8`Dz՜K0Z8SQU2u&/rHX"KKò8t0[lZmz0 Ά'Fs%HFk4(%R]hHE%ѸD74FinihYDw4+jnMoXdiV]wM`o5te{[JZsK4>,]^Z ޗXB+31E2z]/NwrfʖyIqئAqO`(& F}A_UdQ QQOiMcU2Z0LN=x[)|< Q;rJ!U'|$)? ~Ǖi3*gU>qNS33`,,"2bqqGK۟lq a1(Fh΀a@XjK:Iw~5r"ǎ~D,YZ[hb>@k@SE<*Ք}~8~`KWV\*G7`<*΅.hz3QJ&Ճ f>BB{ֽD~ʔPAR\lK>gaOPlN 4]g(pV&WFmNB=&WiZؒ` BWpE6v=.rPK'DsPKE9@java/awt/BasicStroke.classR]OQVJ-߂jE46M!asYi??ܻ eIaΜsܙoH+zGOӞҪv-K"_TWrːM`aXoͤN/ZhjϠѠݾ,c5rtBÀze69)Kl#[$|-[$M^Q1mpe>쯠rӔmv@Akn -et`G=wT{8ؾy$H `8 $KПLM&Ls%0je*')FcVn+jqHXTԘ?ѓ6#0+֍걙ՏR 0o5Gp%0]C-A=iQv!kA-&sgFR5'`\yabyvf ]`Ui3KAn6_HKm!oN Z=WcrZ?J4m|׹~2zW(FMZZLs;L &KlMG%LnrsDw޴OiAQpu0|]8^z2U*Tl %Am6ݴ9-@:5$ YBzy:{rMsNÚV=]_,ۡD``-3&(L~V:hq=js5Tk}W\C/-0M}1QA3@v ONP:˭ MOʹuf;[[hn8VJ^`'zƄ`MotI}) /R tp ?C>isPr)*jO}2S&IY fd:^x9:uZug@FhOiMߍWI\yVskStǰMPK)OȉPKE9@!java/awt/BufferCapabilities.classMo@q> !4 -I~@4D#EU66ln?Ÿ'$~blٙyޙ]?}mXK1-o툑+|%=YrT^/VE;zhkI?WF/{t%rZ.7?nWQgh|i|wFv粀 naH4p|\{O:B WI0W~]6PnYl ^o9]HP8UbxaY<\5pyԾnJiʏry֔wh_˱P:%IF#e0pUav}ѓp^BNhyH{OOlhɻcY7c6yU,ڌ P2ywsXeϊ2F-ְ>gVYeFw#-ى.* Z"YeEd=蹙H9>Cf>ϐ[V r;NA$G>-pnGPK PKE9@)java/awt/Button$AccessibleAWTButton.classTMo@}똤MM$MZ($P#$JRK qۺȱ+{]āB?Q+K{ff'oOa1}䟕:Pu%|_I|VЛuΏK(2tCb.-%+Iˑn>Ja}_JGW #M{&VV*e^EuƼ68 f;TC}ZܞpO~r1짅I(1} s=ꐍSҸ8`x#|˓q&k35')!0'@f`+|4 zc8`؟dbig'a}{moL2.*ts7$U\M:u JRfsc#yfD=KѸD2 ElZ-N)2uc'pws{s#gsPMVY+glz )R$ͧ8¡ޚ& NE! PK$\ XPKE9@)java/awt/Canvas$AccessibleAWTCanvas.classmQJ@=7M}j}ml VWP PXzi'\ěԢap< ѓx}"lSqIt_ &UlHvWKXS)rj(g\.X a):b,+~X$AXr\ [ȼ:Q;/Yj$2yQ2IcF ՚ EI;Y1w|HKWh_Hsmyη#W_{݂{(M,p4[7%lNhٞKXv2O-$h&vcIc>֭K^6NC̜6q;r=pxyϩyض]3PK.tPKE9@java/awt/CardLayout.class[OA,"r\[T (xѐb5>PΒ }22^n>tg99?g'؇aD/hf镝SZ_͆ISQ~8`H]wT0J &-1SSy_JgBy`O=#)r7Sf}r#fe|! ċ oRk)=Ѫ7KS0aȤ8-s/: cAN=lZ.(KUͪf?6 Vu ag_ fXbV¦([Pk@5z)O +ܑk?ŞqeI䢉mQ]7<":Ft|<)^sa%~sx:jsu>@Hk- 1bQ6pzbd=MlGp%](]hܪCsp{O6FlXvt|9os߲8Oh#>'\)i/8/}c2xuYW\`gg '~X F0<Hu<`s5/E'/df%l]KIWaC<׆s]kmaË cwp7} DŽ`bd+ 7#+ Kx0XpP[ ykž#^ڴ9C<=C'##A<{lj?PK?n1PKE9@java/awt/Checkbox.class[S@[,Rʥ& )qLՇ28Ovi$wAr;PݑUM/\]` qN;e+JT8z]ֽlz˰&u\Wz0dτ+Ì^ߙDx2⧄(*&ZMȑGpDCFOvEV΁=U| uKבM}-GF-/S6h8MqYT6w-aƚ?\qܚxc3=oKCȦ%{xʰgn~!"[# ,q.y/`y ddgAtgĐ!Y" æt^0=2AxCikDul;}C"ǰ1mn4 +D:)1韙C)a zwM{D_2`N' jL1=_en caUƕ Mdm}A @i N>> )|v9IFSK(QvS5:co24kZ:#oM9 Cm{x"r;vxK6!а49ezn:ݟUZA X]!%Z MR9(4mU_ͺ.SRit^G5$|8E\MlJƈjc# hӦ4/Endrc 2Is')J߳͘8HzAT|yҷ?PK2APKE9@)java/awt/Choice$AccessibleAWTChoice.class}RMo@}c$iBi . *)RĥUmUݭlP~bQ Eٝf͌O\XO\sN d/dP}8\8?9=3ZĽ~vQ#S_ ?e4<) yJ au9unypqKhz²HFPD*ţ #l W͇bs`<׹C֦2)Ff=2aVAΙk I4, ;o溞<7ZFPı]l JMV*HV/ 7@Vu4l2z@s{흟e>kLV&VE|),[)EvsoZ=pwѝn~ou 2|"-@{hn4U&&BvCdw|'(٥]˖Iwf99s??f"0rN۴L?rBx.e2JIGV'FL: "}k/CkC@M@W} 4Z{=soϿh~ O'ZE-ӲTP+3Bo2H:A Ҍjc7ۆfϴ+IE *W+T?D# 5Fҷ$ґy 'ұR، GBtd"آ.XrX*59ecU\E@uPCN'lm#yi4#Z^/8,E`E:[gmp0XMZP4 s+B=,;+7B!^vvZ%U*5 ֯NTjlPV.K* vU݂ .u:Vi`#*lT}UlLTKJP`S*,R`3*lV#Q`wU:FM >m)+r00$ &*ݧdhvBJ\sp^%뎁P})I&L #Cɻ|BGB[e*te% Oc#c|:&\lx_Y6 ꩼY[=j%1q4ޚJ㖢UMd,[[ۧ"8ʢe/rЅ.J$L~epT-28A:ƋS`8ӳF㲎UvK*W1K8 F¦B'\vHl1n*6vZEjf $iP ,?6c&s-3=_r"֍!^~E YM֪{0Y' OA~҅`PɞFFRX1RHhN VߡGNQK8{|gB8lU9]zxP!~I҃b'i`|%&}|=RtL摗2W-!KU-C5iQCDtvdL ,^#J~٦;XqMj>#n@}ʯ.Dnj>TȏmHӼCt/r]UjZғ]%y]n֍Ŷ.rLFkyz]*(/DHo;5=yf]{vϊZa-DW ~k#5N99]桿PK~i5PKE9@/java/awt/Component$AccessibleAWTComponent.classVVF=c\cRhiJ ; $ĭPL^<5dBM}hV˶,<^}43{s`N#qn7^A~-jyI]t8`Vgޯ^-^ t@V(3P3쭁\"-3<7j:s\QbG-lٷ͆(, aN7S|}Y!pEV+]#@`*c0! &0qDYe:G}ĂBSցxl(hj U襖ddSVXЊPIl/ݡn7x[a{ EJ/ցΛZƙXER7c(vHԭgx61ݾo'4}D* |aCQH54b'qt1|'s?! (W9)7C_aSq.L\O_sB hK7Gņ~ i,4bmj|,4ѽ=X@+*H% +u1ŲHdHm&eB.{U FfNʼkJf^,y]ʼ* )&en^Ȟ+ WRၒyS܂m%sC|8󖔹RcU7󎔩+e>yO|>,+}\kJżDA6i~U"mOSvDIH*|؉8e8RIi~^cHzJ䤲A3ۼn|gCi1 uMf0Ueusija߄ilWUM1 w2oT//M~1SY-lv fj7e)0< # "x%xܨX'*!@7P $M!ꖂ0kt[n:g5^-C`769-Nxađ`vxCBeGC>9|T^J*}dx=P,2,]uN_I>zaٲjܦ(ir[İY*SH~#997y$*פk3^SJGۘgՌP!Mbv%6֑Y8w?PKFPKE9@+java/awt/Component$FlipBufferStrategy.classURA=DB"rS.o DT|*Vd3I7 ?U>~e$YCExHL9}Nc/1?~gN,Yo=]Y L5^u`Ddy%})xMC?8H ml+k/-цF ,0v-YJYe0Wp=3ؕSa܅m_LQc{1L0L) n&0dQJ` є 4xר{ċ`;& ܕ2!jC:4NT[ 5:5 )6︢0l"3^HHs2İn?< ۫3ZݮQua넅n⼢|zUęj]>٫:d;t)z6^!g۔'hm3.r O/@S]Jﲐw]@ Bc Z!0FdRm3݇2qDpM{I:%A:^韘Nn,'̐yO'O TQH+n$+Mo+%%}Tt+LT+j ˘n!JVZm! Ml:U&iPƵao]1ʡc\F_f%f_f5OJLџ]_q1Z>V O SsPKLhLPKE9@java/awt/Component.class[ xGƖ,KecljHv%qر.{R$Y>sfښGrǹCr.w`,dYe!rvavBWgx58իWk}C0.寭c5-IѺBW97szP-򬖛IOA|KCzk ӭ:V٪R1M]Iwx֭!Y+JfטnZ8MfuP3<>>ьfp|Vb^upO+U+wа :`ku+"kb1`vM? ܫ+pv1tKRK4lhŽJ<=:|02f傈B #4]q^DWUpz{,zнq|eCA|B>9k4zh#( zŐlA#׭\o&U;k9(ٕ1VTwLKHaz>+aˀ4vQ')d8[Y:NqKֲ01!#).OBĩ #L9 Ӑ㸸qgu'bLr888$WuQԲq%&vHv/HN>@?#nm ,'FY▄ 9[tX\׶ xQw-.DKڛ%X(00Xk8Ѐ @wt;K{6idJ)=y F^] `Fpֳ֘4Cn'$K4߼+^*R%B>mjsfd978rћlH;;.>۶IwDضì<0#)DHd.TB&z锺xpl`Ƶ"'΍A94cBUˠ4reIJI =y^Q2]cĴ 3^Q`khHC@OwEpw&zkOb <#\kG,nYzq9XDmW ;rKFA+]l㦙=n|Rn;a <vqBrhz8$*Lg)"hKͨf≌f.Ĵf> ;D7Ig&9CJ{87-k8ņ] qа Ym=څg_{`sQ^H::`r AR[ьn@< hb[X& 5o]F_@QTXToy :ZX:2, T=!<.ٜ"3Ywו°.wa¨AצqF@FCp;`覍ҹH7?+b/>[ ]غ`Z( mQ7\KW6~X-!sFx %w*`ۂ¿-RB(V!lW M;Fw6AAXpG@b-ld=~myRvmH< 6]fZVVZ2iJQЌLK Vn/skW:d/^*$%_EIWHk=ʵtN,ّb]SUB^,ݙ+}λIoÍAMV ; &\ThY\©!4;u({[徺{F{Wy.=U]⼯cpeq&s\ڜE.;u,2:&;xHıZ.xkO'E͖w,_SnJYfJB33rT̨ͦ:Z:sA%\}tC/Gxh#i[Fɶldip;]mWU m!mxEvh#D4Qێ >Go[KI^Έ)pAS yx`V'yLa:ݤ7E+B`Qi_$솮I`zN\+߉1t}9]QydtEM'[prhHY z kY-7ձw[1Vbxn=/疐|k9WJdt'yf˟Bs|,${- ZXTȿ#E|D¿ $MUȷ@XT!?D"!({>rȊҊwTCPbĚ$Ʈ Qw*?ȧa1A*L"? B~D~$Ƙ \$9_IǠ*'Iǡ*H'o~FrYH?c_>v|}ViקI>>D~FrN~VCH_b_V"?O"U5%$ו/oЗI7ٷȯoȯX۾F"˾WI7Ho*ߒ  ߖΆ1~cH;jSڛ*#Ic @"CU[IwK~)嗟sTگ΁گb?#j~N@5"u@,GCsp;&8Ϯ~{ޯHwo>5'ߒ?@>O"_3gA^6yM Z@*WID +D"@@"@D֩B@r D6@֒ȅ1 9D6@'b HbC UfaU7_Z&A(5oU~KfJR6 E--{9I^#s/S*gk =mR{9=Xb.|%zo(j>&p\5қ܈orsFq~~U.BӚ4mBڪ4mBӺ4]\UiZ |T4d\! . Wѹw6i4܄p"E_>3Y]Yy/*vXU\⽈h.#cp4o.q~;#bb@1".㗫(vK)@)o=o$0kIېbHCMqb'ZE1(؅=\uI)]AOJ))IWE1" RQ\+؇{|T::1{|LJJ=f>.{`3/{`3R=fRuR=fRuR=fR9I)3XfxTnՎ!=f~T13N1CC laݾc Wߒ[)߼%2=~Sx{lWkXPKH.O`PKE9@#java/awt/ComponentOrientation.class]o0_{%+vB+ cR$n&54wHM\0q?8v1lj}_xF)]]Ijv()r-UGa<4%bӊI8/&Lŗb/Ő֙ZEOF?'F UA )]Ѧ 偢=7zGbIF#G;!fPD܄C܆4gY;xDIRݫٹhsp(D_Oi6O}<CZHB E.VhvAU\JdlR+UĻL6bNl$w8U6uf6"yA^p dt%!݄[3=*{f PK3PKE9@java/awt/Composite.class;o>#Nv&FIJD}܂̒TvFxNb^RVjr #orQjbIs~^Ijל 4"'7?%5ǚ(ԼԢ̼t̼bkML@mfd /-JNuIed+acd`d`fFY@,v PKƕZ>PKE9@java/awt/CompositeContext.class;o>#nv&FɬIJD}܂̒TԊvFtNb^RVjr #{2Xa*#C\wfnbz~PbqIj5E%I9Pi0)Ù5@|ҢT(@12U3Ŭ l 3pE8A \PKẌ́PKE9@Jjava/awt/Container$AccessibleAWTContainer$AccessibleContainerHandler.classRJ@=֪~}VETE(6Y4%M$|?gRk%dvg3;3`:hUߋɠT,NݕؑlW:4B.Vrw]>7H%YjNI^ KZϗaڮ9amKVmaЄ~IdM#$ [c]. |ͷ{)G.N8=/=2߼=nSŶM(~Sۮ%uPPWL6J`w%UNXSRc0Yrϕ} ?7 <$}\N p{[H+0Wy`/!)ȳ5㽁aJ-tc<> 1>n l K*d4y`klEhPK'M~PKE9@/java/awt/Container$AccessibleAWTContainer.classRKP.̴OÇTz*1`u^bwAQ+B ι;}}|8EME'_vױ}.m;)2̝ `C! Aĩ (iIoZe̮gvԇ3}H,Jˌ%s4_} 2?Xmd}K-P 'MסOs9_!Q(V:At%$[C!Ek[}c;fm/!U),UB$l[|lwVIUk(*a9ǥFE).fUf '\sC*hL 4JqqLv=F|)$c4BՓfv[9e`:skQ)wlu gaS-b8à##2vh+Xt.ӧ/G)7 .;"#~ƴ\sY|66$5碎qD#p6"ƶ`)B,> ]u8>aQN&j\#nZu,CM˙(`<(@aˎMz[Gڌ"qCneƍp#ܶ継ҘZa"EoyR1^zV=<0 CMŀxTIȸA3-.܂a4Ý@;E?W4vE<-V,Yu]ى5:1pVn~֭ fF<{Ï'm+6kj:[{ܮlޕ(s~TwƩ-zEޖo"1ހ 7+|q¯K3"9;+Ǟ@8{y]")V}@ȱ:!9n)APB$CDdxNl$$/")f j}쐴cƈ'_"K'amE)W89+y'?OHɐݰ2%,݉uZ&)mٴ6g.B+-hvZ^3-1cFY8g=5{0z {JaB)_#D.]W"ccY~"=E @,h3X1C<ިf#߫|Dv{*ؚYX Œޭe-`HDLK赟rJ$C3ڿvQ43r> vZtpWtkcΌQ*m4Fgoz}4$hzT2ڦQVè݌=5Оh˨&Q=7Cvfz,4ҮA3yf;hDc.cfXHiv"M˘lؚ("1#e,'64ce˸[1*J4+S*SV6Z*6)+7PK&]jCg Sx_*f<)!蟳ᮽPKl /PKE9@java/awt/Cursor.class]S@ϒB-7(RO3uR`BY0L2ioBRM[\8ؙ&yξsv"Z zŎ+i}zí\B`r#^Tcv-ir׶*'k! yLe v A=JVLDp,ZB7~Fj;[lGIh)f 3֐FT.-mKj5U鎣X;`+6X@E=!aF!ǪbG\9\a>v>?Żl^Bѷj;-(yJFi3R4ekT[lhV*% ; nC{h$`Љn\SL0|Ƚ4?hLK=AYCl=^uVmg س*ߙ$S<kV]<=z[XHnQ^m^IR❠08"q<(8&0xDQqK_OJ|tUkߔxJimg$͑&,%h^H-]\qk-~SӉ0l ׉#cl?m4Χe3Y1{ezҋ.X~G9hV/eVE Z/F^^_9#s>nFi?PKdxFPKE9@*java/awt/DefaultFocusTraversalPolicy.classNMK@}Ӧ "~-^Zr *Xz$+Yl*,O?JD$ 777Dy ?dn1>ES/\[G9g])wJ~3™ W`nK! L\6rK΍"d`b[} bN m\RݚО HZ F’l``GRT5Vu-*|TY;q-~S"Ծ)N-˰4W{t9[]rP?œtodrSOl12$U:t[q3YASy ϖ =[KyC zzN3Ċ]x@~Mf#W()oK ͭBV{󥝍JoVc{+ R"YTkVA  w0H~H4QT{2d%LQ A!(4(8 = aThP!soJC/4Xnu4U^1]cBBz&;4-D{*f1`agkH1Ct]88bHuYݳ^pRwLiOI4,`aV7LTBקꍖ[ؼU<t^˥+lWU+U+8 VSAi>]^ * 6[ہ8kbhO+a~1$p@AF+ 0.}E/BRChcD7mƸn(mLǘNG!}\IQLcKA/*fN0}H$M "yI|SGۘ4J3#nHv%)ZjN7XwD'r /9"2xPKt"PKE9@java/awt/Desktop.classNAƿn[[jłb-&1AM4rt;ew; 2 gk-kv9;;s?OAϰ4\B7hΆ~ʴˣ ElQ xBˢž%eT&qUc,L--af_2ahBHKLꨞi.w4Z#i\6 l }BkV&SF0 `u4gm\ ޶k@~ֳͱ;ʧnb+i~^PKꎩPKE9@)java/awt/Dialog$AccessibleAWTDialog.classmQMK@}6ѦI"VTxm薘@A8IZf㽙ٷ_αo@8qF z|_&9,a49BqYh|+5;W=v4%L +(a͂yF>+cT:*灌7!8AO*zhqhV\3OTu2n"Idb`WXIpJ; ]""Xl;! |8@`o(^9,¶ |U8Yͬ vPKf1PKE9@(java/awt/Dialog$ModalExclusionType.classTOP=ᆢ dn, bXHFaybjJkJqf>Zv_G8hҾw޻wo /.ca,eLn9sȭi]2 c~fdwZ =M-jor reV*ڎZZA/  iJE#Ä1xJ{i7sj{ ! 0@ ,0Bb6 (L(wZ[Ӝj50A~f,pcd1*(x&cbE"uyw2W /ް#}/ on8p$,+H9Uܭ$Aw:n6}׊tis5f~m!-5/ws*-LhcX3 DQ(P 1 㧘> AHaRz` _Id%H~3HPxzU2,,˙3<(}e<9PO0ߧSa#e.ymW=/إ5@9~ΓϲxᏫg"&E0fPK`rPKE9@"java/awt/Dialog$ModalityType.classTmOP=oD DH%BM$dŔ ?h~ԲvKss{{ou1?Nlj.[i8jXcuf53Es0ݕK|T>0'V'KU^XW)墪2TE)]B-/)xW`al2TWhA "yhRHuljfKZ%B 38BJcaL6,9o ̚fa s'M~N4`>0HH19HBmkFːO?NtTP>2_-| X k 򂩵]%: 7m*+EMFҜMevgTY*YnVtJD6[E/q<Ə>0BQB_0~ID}.r1.zTԺZ0"aQiY0E$3x2h_ Hr"xkG:959 %1^_PKPPKE9@java/awt/Dialog.classN@g PSHRRBR(U A&qVFvgE^TEUuvm T`{27: Iؑ@'FNȷDe$A}uE@of;>3n,~pΦӊrVwWJ@zLUZ ŏoiE X,GU幢B+Sl'f5C:C]S]cKS?ҵ.Wxc jtY#uV6eY-%*:UK& :S)!*@ KfV/ L8] gEEրp#J Yk&޾'"#DzLj^R*"X(O+g?=5 p[A1طRP-* Q3&pc|7 {[#,2 ks߬6LyJv,e,"}WU},bHt3-Qm. s]Π6[#j0{?]A&|5o (.hQhvKB(ISGaFLn5$;A}hAoE=~T0dBcv7r#̔Hv7c! ~ _4S9 c; 1F,G7wTߘ q1[ll۲i-Z[6)یgoчނVo11KŦ`s .`Jl Si,3ÝG6f0+o }Uλ*H)_mʤr^@L (] 7K`[T5a +~eOD#VXb~xZ.5^p70f2xnPKU(˞ PKE9@java/awt/Dimension.classMO@)EDTTů[5FăHB`\ek&P0O'q[+bI53iLL2s8ܹwvPⷼ¿JU=xt!RH0Mrһ}Ő;hj[5;8NJͽСNȩֻg=k}itZ6 afOR3 :m!ɦa#EyùEk'<~L3qD[vhvBKÈ ]*72k54ѷ(Vr0,ve C+hyӧIGRO6-DB I̐2,sOd靧Hllr7~Ezu%z?x^<(De !۠UB ʗ|$, EP ,R(P9^D=cȆ٨)WS0KS0bo/PKGVPKE9@java/awt/Event.classsGw%ٖe!Ʀ9K'NIY>,l)wZz$?e&3H$BݽCz ?3Ҿw{O|1o`ΦƬ6kmSBH`;pökyB.l n)df%<82lsFlG FZ#fi>"jHq SzL°EMSjx*i灧>< kֻ/"|)2— <<_ | m w^^Jxx9o"|#5ൄo+;Q1J8" jΫp/X'' i&8C8 #p?xM7ԟ#lk m;w E%.·˄G.Qq^oN>w"|7{ؽ7](/|q9A|%;ƺy%w=d <\VX`.g. eԣ~"SeE_IKxV^U/`5HeX^w%,aWZ^EFy3dٛ+s& 7[ȁ |O{׏\veloܿN'# PK@dE PKE9@java/awt/EventQueue.classR]oA=Pp)HmG/(FԘ4&lc%m۰eZDL|we0wv9gws7?H#ɰ}n6;gR) j!guE Y!ŐoISy/[ܑxze(bauksSbu =iu;ALj9ޞ8Xd-;ܖB|ǐd/ a{24V*65MO8o{Ȏ4ֹ5'\@)(GiM!?il0)G|SIu@= ܡZ&78Cs#xWĠBG=n75 n[v=r5vl2-1[ REhGo45(2s?qm4dhM%Ӛ((&qB6M\V0Ъc[ Ol}J4 ^oSb撾*OBTXZXƺR+ hElK&vCS [QGg\0̗Xh(PQG1S j( 1hKf%mh3*5Mf*@vFv_TRpcϏͣs#:2OX!V)D X]k.>a%0F$jA] *< !Qyȃ$6$i IM -EbAMXⳳO9f ߞ~:~.~^&= |wq3 ʬ MU|Pp+\-_剌c̽}cKFۇiYi:"?Q;s8 D|*Ho˷PKkvAPKE9@java/awt/FlowLayout.class[S@ϦE,[߯E,2`vB&&Ia3OC9݄4잳۳7l4H/57[7*j54$ %l`PQ֙NbMefkTnJQt-qV` lH= I_s q{*_-v4Ss?HUd fqKj]PJ?d9rj\A:)+Jox&i)qet ,jIJkkf$(,p\Rt4kյyb~ƒ3%CtI4=:fU1~KQoûi@^7wv]DC= ;s4D@>3f0"g3úfl;'|7i1%v8wvt}5~!o 3x A7O 3O ݡP܃qo(ø?`CHpX ?D(~S"9 cx0`o(WlJt1>d;̨x0|63oYcv[  b v@aWR=x()0jێSND*?B9\}r*R|G6K[M:l͐{C R|c6^eQbKl_|[xl#cK1PKs=c=PKE9@#java/awt/FocusTraversalPolicy.class}N@gPE1Ɠ^0$!1iD.tv d𡌳 Uv~~ 욐 7jѩ: &} ;&aKu1GHqd#`@V4=vLviepۣ}dh( jIZ[x⓲f}%šl $TB h4p{-ԍ1=tӘPy?8Dk;HunruQO48 '; oA2Ckfg  ȅPKZ1w")jB3/r%$g3ra*;PKpPKE9@java/awt/Font.classWW6xkzau¬HfF 04hF,8˹ΧSˇR3 3f~O)ܼ'54S.2]4Y!t6;⥩.7ѕyv0YLc)u]xWiv].ˈ@'U^7u8hm_sBeKk]uݼ\\EY즳0LEчex)àJfQenKfʖ*2qU1l exU %*j*{PJc7l ~y 'pISNTSND{} HP@@croVTI Ǡ&&ITBWr*f)M2\û<0oI Ya*ZӐ !]cZIUIu]w$y' J Ur}?p a#8>BY;/x3?9ƗY=9 ˞8~1~ǯy.~H<~L*u5Hu>7pi@7)7M Y ܲ`Ip Sp-3Iǡq-)y-sPLZzbԢ= p'5Y #q#1/FX0޶Ћq7#v"vhܤ/=a(`D1"POO,OccMp;־B#˜U׾}DM̈́@g]vQvZTSУ)lu돨I:4n@۴oߖ]V9֒ YS}55bPlGy+Ltf`-5[;\v ]!MʗëiO͋Y]0™Yw_ ϜПO<B=ط4k"%9cɢ{c oe8dXa>h۾n{?pϗ%d<|!0߈xO XF!2(JΒP!8B#n~ *fkBo8_+B'lZ=z <_>_Oແ|=2?~8?F<]j~P'!4 5B=Bhօ?P!4P+KQ ތZ_sA0?PKNUVzS PKE9@"java/awt/FontFormatException.class}NMK@}&ŃUFI16.u%ݕ< (q6=(7 ipp/V".ˍvsᮞJ1BBZ3*g)awP*=M᥹ l!BBh S(-7bZIB0&*?-Cw~!Vžz_,m)s?O8{dy:p_M-FR] D['PK^#mPKE9@java/awt/FontMetrics.classTRA"# dqMDI"+J VS3iŒ5p&*?vOYzA2sn_` 1@A?ƪmp(nySVL76i{UF h]4 L7tAX.8Nk⸫-`9o6iu&aԭ =[!Kf d@d7#@ r@Y2&r’Rⶎ+w̅&eL&xg(UD%NvY%p>Tb/W\Oh[ecbB ӺV9](J9cEDY%->> FܲD}Bgi<>:̤.+<\~vxcXRiLbN>.{:GACrb0I&ON]l 4C-1*nyt\ơ~WǓ+{4:"]mc~g= W}H+)oMcƻ= Ǡu ƕpwx*Zy|k)}@Cc no}I;'utÒSqx8C Gi݌$ߛ7;p7ySLvTL@i30۲uޒ%!gs>9yHa^)Kq++^(&}^~lMi9E>}-)<}POlZ!^"3,0?3 ,Vl@.T δ6[9"_jsŶ |+S[PKV PKE9@'java/awt/Frame$AccessibleAWTFrame.classQ]KP~mܖ("AF7^N".݌h"āy&4BIsE2NDRqw@W3kCgu32 3ɺ4~lj༰ʲE6Z.}"bG8oPK0PKE9@java/awt/Frame.classvFhPB%=:P$NhS.GΒd=c㌣1ʅc{IBo kzl=&!A 7užXK=0JAӏ ,"~`A hS=mC`EsBhu8(lUg3η UsX=UCkB8K [)KBh@Z+6ZYSKU+h5TvfXh,ZiZcpSMVektQL&Ir U&YKRHK,v0dgʶ ع8Za]'q$(;4qؚ OR=Iv{uܱ}:݁u䪸gꃓc9j߶zMsxL忩\$M#XRfv|8L`[_t:[x"4(<RZ<'yvh/cpf쾫X]De1d摩Y5n+ԩctxw-<ҋ"5"Bf4Eh:[1<٬w^WkmcHo;MR4֫jǼ/)"9,N) \R >Y *RJIg lj23Fٴ찷wY\C=ckk}`ޏ-p -%XHB GivsA쒄v!1+0'9)+Rb^ "d<X8*xE_{B>GgǫbYXR@ܒ u)@|*%&%ⶔL HeހwG[|mB{q#@\؆/|9<6]^!2k|όTÑFFn:DBF[[ wHǒI99Bb}^$BY(Pݑ3ƕ1B|]:GW+Jِ*QJ}y"UʩKUWTNC_@iJ ^~vjKdU nOMɻ-",t4⧩&؇fE{E[`émnq݋x:Z# ZԧzA8gZȸ8M|;XZ҈yX74bfF;̺ŀLe0+Gۇ2,a\l^Brʁ\rsUPKXIPKE9@java/awt/Graphics.classURGjv$H[[G(BhAZvU<$OC> JwOUi?XS0Z~fVuz .aX~m['k Dޯ#1A~8*.-1VSYÖk`jr1Y~$co"-4~%f"}c,(P7bш%Lk~G*~!0.#cH.0?OBN֛JWu`3/‘>DB3yl{P.vpl4 X>{Vw~E5k[v'Gc6tZT( km|_ b|ax fO1f xB0 UnvzM[C\->͖NҀw4VYm'.OOXFxh[5:M0D`XKs({Q!UܰkmeQ[aΑr:t|rX<£~*}kM&^ wBATɪ#-&DLozS)dT"Թ.,_w`8 WwJHI7zƛ=N|V]Js$2(ʁ`WTb0A6N(~Lq\dyILG LKUF^6^4̰?3%jq֮@nMa]u&Z M""R-""R@wH߂QI)gp]|ٓ٩YHBZ;"EeyO>CqྤFzSd:S] %\&6}&:"iۇGܿOM2_ƅ>˸*˸&;T։ӮZ=,<<(caG<ݛ|%C) SOm;֤mx_.& }<7K9j2^Zy>oپ3F=8$ܡOWbv*GMD ڬQVYvt?kW Ä'<$?8xEy0ı-IOaW a*2ڽa?ؘ|~D_c3AWp8ulTB(GԤdM01dpr]"!WX/pb-[9"C̬}r ̒p.s<$ N ("4ggs"ᏄW*5Nx~&RdW4 oτ6 up0!܄=Ge"|ۄc% Y'$O=:?3g>>  8VPK%hZNPKE9@%java/awt/GraphicsConfigTemplate.classRMO@}#ȗ <+D zZp%%V'qZ eIB)9睁4Rr*ϰEǑeePn ' e3y:cM0j6ͺiۇuD%}*}@HTmBˣPl_*6pڂoL [1ָG2УZy.^/[SUC][wQxj&.# c<~8v=yK,)MGF> VZPKlfpxPKE9@$java/awt/GraphicsConfiguration.classTs@ރP,mi)XT[ez0!_Ow$*{~n?}#В#P#ҡ jeС.$(V%ƤVW{ӾdK` {L [a)$`J[|k3I&#n:5[b.ٽ>ޣ]dS򤜋v:4 氎`>Qʈ:>im3+?0:F#5ڧmnrA5 I㹍'y*F%X2Zzse lFmE \ʚmk@J 56I#;XC3fС6j (ii'>T/=c#D#%Б/%u(FM[@w .7t([Ef%ol.s61n+Ba}BLM SNw,ŝ`?0JTS|{[;pWZʒ"3/PKPKE9@java/awt/GraphicsDevice.classT[OA>"*UZb XԦǬd/Sڧ&}jzfΞ3w??@@h^#v/jWYBFN}6DIUJrNT ݲnRaA\ţ|R7Ku#e^h`(Kc1owJ@hiB" #r;Wmf6i[cU5TRM nXl@BrM0 4fRؕaHX"ece :2܇4UWC8+B=jL-Gt.L^$CvNmMc-qS^X<3bE,]v4~f\c+O"vC6SِYEԼ r*^ 5n0 ,qҞ٘5To_,„J§*+sq2xWĕ LAnpxOUL3y S[?`7,IXoEXW4 )C̔e.> >|b.Kf?2XA[{AP RFL}1E fwRO>蓉̰]貱$ss 9:P7x{-F\aB"l69*\p@Z;%`=$gaRZ\c0vlF r>k?Z{JհG`+U:`}gWUm€WtB\yA4dDKԱ&u: )wBG[I. U,"'.T1)GTo66DxGV6> 7cHǽ:i~|^컾ai{\l)1]"bW:Sd{o}LBCmP24+[N;t⮠l=T#7X#*^z˚\oZhhU,o ,ѫ%hv~ >S&x Q-`6p ?{DymJ9*b`zeq F!a2xmBl (PfL~(lLe0 4߷?2>cߜ"xzb9xhV 3?> !lƫPKhoPKE9@!java/awt/GridBagConstraints.class}zFG>ĉLB8S΅$jDeᴴ`GJ(.} L EA]{["Zht| +~ڍwnrMˀȏegk'h%h^ZnB? [QPQQ7CI4fEiiF%YˏYip8izʹû8\ݴ{Ѿ44g> dŰ&KS=d!/K9wxIhj؞ *cuO%^3ݺה &G?=ݕы7|؞n ǒ-?ԁqz o- #v-mUk4&D߰i(,?\ "\=adŃ@7XyM!_loFzfU,f`|FicwII~tPSS;nbXaJm/},$ 2#,Zm@"ɝ0eWbL&$0[ASGd ^b| t IƧ1|k7+ς1>"2UW_`||یc||o}:¸ 16kMh߃}C*T>HJ'G)ݔ葔 )ťߟAeU/YWROĝ)5eMz.C|o= ,/Z$nmCI-@y=VZ1ubq*H[=Ι>232PKOڐPKE9@java/awt/GridBagLayout.classYWF̞RH .$/5Ki*Ky4P=SC?@?TOFBmу%̝?3u8+ڤQdZ~2mqI9SC]s#0pMA5fr*8gz3J)W-'@JL!!Nn?(:&6Ǖ|!_s7йu=ڥh}:yM\>\Ye-٧KٝE* *l ml~{3 fl=g2rC4; j"O`iLgɸ0 vQ2?di;zR=)s3fus3V6ϩ~B^:#^7Ѕnni-ԭ!~PUXcZk f ڵ,f5 $l"lUSdF(V)ܨϘB(6@uf4i8jkK@:]yS/\[7lt;iuu kUtu;k7qbiBGzS1boY\ 2IvQB ($ɍ&5*k+^= q *BMW%uu.pэh_[Y{'-V7CeE 7y$mT~Zq=xsB?$`\0@{#vFa̹i`&Iִ`Fs9iGྜ7_xs[||.쓝s8zE8#aŃ r[`qX5J&ֹohcp0ɎC밡-Dʿ"Wj7[QWw>lK#W1[H`~Nرм? 0Z%;Kc6Ƴ ׏W)c^{eo{uƒ쭘"hy1 c)E#OI-~T#2 OPVƴ5D sAk ‘PqƆ&cS@UU] -Sf[9PKRY^rPKE9@ java/awt/GridBagLayoutInfo.classuON@u! NQɂ"(9E'3(G!:Dq;s3ٯO{ ~f/N]fv󌗶q }_r5WB.FDjkåyԄT]:GSBxeg:A)bzMnfrʲE_2t扰판LlSzdZIk$L2)A#y&@*566+W ~PK!5=BPKE9@java/awt/GridLayout.class[s@φKQZ ^^pG 8ɅI|'g|OvcHi0<${re_p*(rgtFiKSG85Ш1n!z~L}C :f E8h@7@VKA n:d`oY"5TS;M iE Qt~F##c*Fy<*tۦ>1 f8|cqcܚW[..{5M 5fXF-:Ӊޛ綴—Ѽ ~,ZE#uOu9d_ᐹ%יas@@nbO̲((XL7g.\T Pmz۟7}gN!{ݛ/ЭU PO^/}x<d (\g=q[B\ صrZ=G<ˀ|,tZZqo–W>n,(:&~WqK(w`׃xSb_hy{+(7B ʭP>O?diBXKK#݅{)nB-03qNQvRRBr)-R?uiwd{OLe=qbh_-xszE7/h%!F`Ll9<Q)%h}p1 ]QkPǢ=EݿW*',)],5UAQ]9.U̢Q/.WYCS'Nq{ɄD%촀Ve1 q9\2v DXmA 0q@CT8]4ӦͤkQA_L(D~a*7gv!0fq74F~^&fp>힦(BrAӘG渲{01S030O|ٯ 2)UGSncwX%Tq^AҺgg*o>!}+͑DGxVԃEzΐ?ZrרoPKIwEQPKE9@java/awt/Insets.class]PN@ @)>wo!₄TCe)"UpBQ& 9xމ=#4]8ғOhm=ɾv'lU^WFJU|bP_a ! j|Є\>LJV[] *E,ʖ):*WaOF7qJ' VΓbV?ܙꔟ&":0U߸ [; 8Ke}Mr1E/̢ [0[@"gw9L8 `I,2簬΍Ȳ3DzUXF2dzPk2ڎ\gRkZ(emPKUsPKE9@java/awt/ItemSelectable.class] PdeYPѶnںEЦUQٻz^f1pߙy;LMT47$'8"D0oL{ Rf"OjWpё> eՄ\O+ˆCSyB'n5dH eB`bαޕRPKoPKE9@1java/awt/JobAttributes$DefaultSelectionType.classQKO@,>y%x3h0 &p55}hYƃ?8 w3Ngo :zQ88ΩˣБ`(O}ƂAkZÁ:C=o3dn:]tc:ieϐh7"$R2Z4ei(c9?nC9e UX+08Vҧ)|W7h>u.v G<(F0  $5r> kaکk3d,4?j@D-DZmJ%BXpu&::iYiUZkO=gHBE7eENrՐ9[%ocYzc$^ PKMS)PKE9@'java/awt/JobAttributes$DialogType.classPMO@}K,~  iiƟe]Z#iS+4Ld'#dQ{JF5pt ?Q9y"h< Eh`!s{Gk(HcT- 1$R[ &ʫe(g\Gc%ŚTA)dks]Ր9`cGAMlJ!m/PKB-e<PKE9@9java/awt/JobAttributes$MultipleDocumentHandlingType.classQN1=euePхD+ l\ f<4~qa𣌷ąmz{{{Ϲ=/Ov#ư{ox߆c[ CFr kGT^4nx vͻk#0 D zZ:+5IU6V|bsZZ {? rC[_=h3ޅH00& H0L+Ѡ+&: cz=oG0S0m Avn`_TK;`HY^ġXݒ8zNu_vx@"0,l">6H^VSQRqN2O${{2IvB"50nJk@#2_ +ُsc1zoPKx|PKE9@&java/awt/JobAttributes$SidesType.classQ]KQ=5WmR!C- V]~VGEs-̜3Ι:&6#/x1a - tDqI;Co5k]^U6RVmgZƐɚ(۵#m;a "ihրFbRa9CS&w:ܳyVu2Ȓu(M$MY]>C 8/Nױʐ{+^P5z 9T0p0MP~ ܋*KO"B@~va +-=)хH/h ?QSMFX9嗰L(V7PKvxYPKE9@java/awt/JobAttributes.classVYWFxI%!M K"ٗ&4vB7L\c_>>7䛑(yh{<42 0V]{Mr$K[^-HhMۢzͤe tiSEf s ʆEw[5ڬz]it2e}LBMjVZov\ ݴ-+jJR-;(81]oSҭ#!tKT1awzs)y9w>6O@kX 0"o"K zϖKd_~C3SI`Df7:UgM`P*G/6[O G @;^d@`E4+˃d`8nl&ՏϽpԴnlG%41,o2&%)A^vsTLOiSjti LO 7j{һN6X/KUO vDyvW{ |&dp4[rd;pv‘_'jg3w™;2_90с8Es73p昔J:)$tcլS$vef}t??63-fG7T ]{ON3;FUYo*WVyqJ_8H@?|1=6@/aeK>w9x6`6 > "c`|tq)AD(G |6FDD` _քL: KL-K߮31*xu(rAi噋B GtF. w,D1nrEЪ9&D.@~%D.s,*{B y_,p\%k0tHpHp(#)E?x!$ggņbSl)0؄*M)5N"bKA()(AYE-)v LP:,={rG\E+{B;oxu_kp;cPKڪpPKE9@!java/awt/KeyEventDispatcher.class;o>#Nv&FIJD}JײԼĒ"vFļt}P T L #ܠT8k(FҢT̜TFqL@@h1+$8PKB=PKE9@$java/awt/KeyEventPostProcessor.class;o>#Nv&FIJD}JײԼ⒀"vFļt}F*FF q !֚Q \Eɩn9 RXgcd`d`fF l ;dbPK)pPKE9@#java/awt/KeyboardFocusManager.classWk[G>D)T&7X55W ^bDj+$#,ݸ ҋ>=3Iv/If9s;'uA$#+F bVb|h5 Bm/Q8E Np35Y˪YQ>}E fM+gEjA`q*\Lmg6ZUY%Л5R4k[)WiC&Ɨ7vwӯL  ll (*Ǘ9_0䒪X|@$ha }YU5BE*;k_5 vLmR*'T,!I[M1z vtp0\,SxR J#a~*XYnikYKYģMv,S;[|6MtI?xP"^NR6;ՠX͔K3vb/8μi&ГXKE)ba]F0A|2gКc. }{J-FwT E`(oȞdU@P3Γ nM"2}T˶-CQThJ[u8ZN)hw^j`g 9`@2 -ns1 \QRLs/%CQLp){Cq!Y0#g7YO9 YϵFg,*Cu<{u^>7B|YF6#|:D|, ĉfEm.:yhD,qJ;;(\&!$<ą8]Hޅ+[ؕz_z ?HH0 +B $OC'6#I#/o$RFB7%*o$ҁy#,i$D&`# WkjEswZ;o4=h*H&ϗ ,_O}UHFKg?(~wEBKA9d;n$ȣx1$sօ}'̭PKR](iPKE9@'java/awt/Label$AccessibleAWTLabel.classQMK@}&mm{-X<)B Bbm\p%MJ ?J vُϷw'Q"tģd䊙{cϓqfN2JFiN8_ bjN*ɽ{-6?ع TrAh d*ذF(ȇeEuWz9h"X ᆞ"RMj,Yq.#O^أ`]_ıutxڪ.B%Ԋ êty e(tG:cS`c0|n u '-،VfD#73la[ei=h_PKp5 PKE9@java/awt/Label.classuQ]oA=([-J?hUh&>JB|pcY|'(a|>{s ĥpŗmd ρ:v%T ~~_F)__FRg9Z /Q,tHy&2i ޾#Zi!k.yC(`Ph+-FÞ ;+"TNLQENmB܋8Tzpb']Q[K(-ᴮI !?:v+kehYI'.Qؗ?52li-CQ$#5Bum4w,ATfp 举9Uޘ7N8b\;۲1k2v8 (]|w+>SȻ\7$dYDƳnVY{$OS9)GC֟c9RfK36o241@l`{0yΕ+%vlC<3cPK ,PKE9@java/awt/LayoutManager.classmMN0@в ,X4C*W) Qzᑞ73~?_0 !\-J݇T2v -WO/ {XfixK&iɢxwFg ovIm-f=0џLOoř6,oJDX:~e8mtl}cwn:/㝠n+K@8@uen]Pਮ8+Iyyw0PKnPKE9@java/awt/LayoutManager2.classuPMO@}B փMd4j<9t,Κŏ"`aw7yy_Oc Η^|Л+1eW89qϗztFi 8XW/- _8|Pf׹ QVq`OuFL6ܤuBF-[ښ95ZᲙ l ݩ+\6 ILaO^[boKIݪcTSaPKPKE9@"java/awt/LinearGradientPaint.classNA|TBAojX1)P$&C;nݢd) 4{1̙9,"?S_LQ7ڼ Db#v q)nC2Ua[e U(gI.}v$}~dѢUuwCΉ -(+ ๫zf3 ڡ x0&TIfʆΉU&Kn1l.ªev- nZ gm'/X7cb.x}|LkfزkL)fo0XwD2>o-Mk*w1Z4ͪѦhUxk6"lݬnS\bG֥đکk1wwPDD pޘy!(2΃YrմˢOGKfb3Ma hF K] C"gהla,F/}V6}?0@ !JA a cY )a]i0K%Lb$M@A8 Ȥl(A:4۴5np^[gɶ>#%ᣪXc߯-j>_#c^5?|s,RHud%$+z,-N&;԰ tMl&B6 PKBYXPKE9@<java/awt/List$AccessibleAWTList$AccessibleAWTListChild.classSN@=1 .[B@!,Ud>/a[x(Ĭٝ3g\t`u?q&E= dϣv=}בZV~[L^Ǹi9SaY>3N`>~iQ *:6CW}lJn;l֪:\YbW*!hi$]v:"byO𥳐VM~!š:v.ݦx)՜L*㮂06M'$h !5d;d"F0d=l] k+J7$Ee2Aѿ4gp4`GR2O~۴X@֔OcΠ" h \ԁٮv9iiJHUM(AHF/~"F nq3_BF~aȕq[Y(7`-; Xn@f optp 5xh;#xL0PK]\]NPKE9@java/awt/List.classVmWGDmP,.n7C??w^$ 琝}>-0R 086rƻ eA f©[oup~B8_ hBmjơMS0J<[|3LuhV[ lJ`X}Cٕ*dѭ4 A@frv~H={laW br2b̺w%{lx7li5u1Q opr<3&00N!V ,a C=m^uZ0K)fHoІGM#n :Z\ӂ㸁\Q˶be$Vr:ׂiöw~iVæ,/ =lXiE[,aYR5jFG4TgCOaBU iQdLHeE.F⴬;LIެW߱}BB vH>/8<y&Y(X"ZɩB)Mrgk\٬R.Cw->{yHv|>jA1eRƭamk[TF,3 e犨&+ nǗyOgRHT&\Tn6e<Ys $L󋁹aA zg$m\F8 Y4|*!HYO/#3,dc|0! .H Ir M{m/a5ib^ q ˆM хz+ҭ[Z #P$ZkA뮒*nW6RW~leg*nX9!!Bȟ])wYDOa/DS_b:EJ빡oj2f=RfpoJo-u?:'Jz|?a=(TVznbݺ*㹭#P3mw;39 O':,7LM2%뙐#P2!)5euŢ.<~m.Z`g3\p@!m9,B N߻`3'NrY{{#udSqmJ#h@=;ņbb X.$Pirc#0k-"PJ%P:}!ՙi5qYJ*XkB8Jt/E5HX;8[KÅ\\,VrHcٺ>sQՕnu̹ FҴލ#I MFNe\Uq\[lg3!`M6?) >1 L?G]Y8'v~B. cNK0cwiULg#)xA| XfaN|i0eY0jUTP A]>BD2BE]T9@۱т#"HR#mA,Et%!vqwgjdd#,#dZD-uCRf߀ ~8 V#:b K 04l+ a;~חe5MZ,)8 +}nżOO;?PKPKE9@+java/awt/MenuBar$AccessibleAWTMenuBar.classuQ]KA=W77u> ^{'t6v]=DC?YD5ܯs3?_Nc#C{/%^֭ԓ+۾/H FЛ&mX?`h4`V"⡊DŽrw~9W/V%r. V'xy+ 6V 9li,uw@= I#짶/TIke4dh-HDlloU ]&Ik2,hٖVJc˝BAEQ8vy >m8lg7[?OG9i)ۮ}ds.w?}xgڤ6"L$k٫7?ǂ1\Sژq\Iܱq0mqT\k2 <քN(l9ў9 7obpWP;FZ²:Xd8>E,v hXd+P0^,%_]\bQc3+}7@B,{KS( jjlbsZ,Ė Qh 3E\zvZ\w5/;?PK#PKE9@7java/awt/MenuComponent$AccessibleAWTMenuComponent.classVkWG~DD/Qcb!&%MkHLi1bIk2Ivg!6=9z,2΁ݙy/l1Fx];g:6]Ӥ>jJ@Y=w;GK --0'W.3,@@X҉4-&1&2>F`n1;fS(r@ mM1~;Ub:eO3m-%ÊFK"xXf4/0[e?``G(n/?eCBx٬_\193ZUzl[28<nWUGdCCbe ̮ C b0߽H~$bdCaKq-L1AOS0nNb,R⦔+r]!1p4ݟ }?B̉Xx I 4k4aI11%5wU,S,ĚYvV2W$ %nh"^J9X}K\:欒LǼdnuf)ࡖ9d>,Dg[Z"WJ-sI>23Jne%)̬ k)؃SpGi.wBU%.9% Yӌ~ԬkF;~l(GK=qSI|:E:tJ:H#)u#%^KăHc)-|x)_JHGH Nb;RDJttLg *OghX<PK{|#PKE9@java/awt/MenuComponent.classS]S@RJAO$ Zc)08VXlw3m&@(!s~%X΀E`􈶨C?kgfE6<) _gsh!P0V.m8/t3bzN Ӟ8tռ'^|⟃'{d9|*;8  h茈WMDsQ||kx nETp-YNdx*E"s2+p~T;Z ZYJ`0Nu ~󵺾iM:ӿ~/P5eg BGPKE9@-java/awt/MenuItem$AccessibleAWTMenuItem.class]OP+!c E)݆TMFcBfL7xw('%}AN^12>2K=o響~xˀưqFP{-@;b[:s扩dЎs^ґkCr' OVsտ$ten*ΐA{'b KẹTBe,ʰa$ҾtŻh|,#N1T=;CN_q |zpꉗ1tqeHY!CÆl_Nb(.#0;#ߧVs_5gI)r8D{Pjjf>S<ҡx+/^Ls7d(\W} ti7кj3, U$6i p X}msiʤ-t΅nnw{?QN/J?$: kh!^ _3d-!5%&ZӂNc'U13ٵifg25~6{.FC}dSI>R[h_;K;~0k&Uz*]PKZ7=(PKE9@java/awt/MenuItem.classT[S@> E(pV.#LA:8OK:mI(}r?&MCƇf}{?58C@gzK5Eh^9{T6t84}h>,_"wZ*2{\b@49wA v`Xqh!Й:; ѓ5xAM.`Lp@o4.RZ;&ׯj[jH† ,`WKJ`0 B&/g%LSZ:E˴y<$@+R#Ln%Ydy*X.x]pՇJ^4q:#Y&ƒBrmdӈ䥊]hck&qDJT*s~U4kc-+Vk AZVW*kR{T*0wy/K#=.}F\*mԡo>ʭ#{A)C[dMC?;%,`j GJNdܲ z[`*N>pF̳c.-e 踵2Yq8$0p'Lṅ\5o&_ޅOqŋ Jpm v|6(tN'Љw9]\#A1|gzU]͸h[#GMŁ֓Mxj".reA}(&=דp/0urp}U:5T9_aS<*?MJ\ 8Ţ3c٣(*J0拜Ğ+DDP-+ΙU%nK8o/|8 _FUK1.fGgx.D }[=.+Udp1CJ= n" FxOT)/7bSТ4~ QR;hE7D]Oh-WUkiɉq:&\l z#&dlQ6 (`ɳռcncf>@罱oW5Yj PKKsPKE9@3java/awt/MultipleGradientPaint$ColorSpaceType.classTOP="ZP~ PAI/#$dZH).W~lQk:KhҾw;s_oKYdUL0_Lm`f?4K]=ÞPcy۝L3hJ\!SK13e $ }[J!&QcxQvh0E8JkFs9OH9EhN1oa1&g6ictySrlF9~`Dҽei>ʈ );J겙j}Ʈ, ^4R"wK]/y lk޸d,,PK( RPKE9@0java/awt/MultipleGradientPaint$CycleMethod.classTmOP~ZS :& s~ JBa֔bJq_mAef%FѦ=> [bȞ3_\#6=~h ϖ:uGTθ? :B Ք2w7o3")&~ N=;?S"eh[qL:1\}m ޻~P 2F(7om"P8c㋖aT9VJfP. /ўe8V<Nu:K-nFw}, dq VҽJ:J(ۉ4r'f*4d5|dYK =)Mwl}[)Gv;Cc[>aPKUVPKE9@'java/awt/PageAttributes$ColorType.classPN@=CB Aԍbb$ l\ 8ښ>4~qawͼs9 :R {sܺ3qǡ;IbXG#P_10*wӻ`u<3V` +w: EE?yp'5.{c[v %Tz{3q/V;7"O ҕUǒH~/BQ$"J`/h)4d5dU/t8h*H"M"Tn(-5%i?rVkd!$3_Ss[t?PKqSPKE9@'java/awt/PageAttributes$MediaType.classy|TwXaPTԀdO$"B2İ@Y}7Zm]j-Uqik[ֶmmk[Z9{/3 ͹y/}SkI8[fX͒ae5c͍u3ZcMcu5e cIhiNo9)#ýCC{ Cw!WR^AЫ k^mЫ zA6ڠWjCWjCڐWjC^mȫ y!6ՆB&>\RYvPJHON%IvUYg<# }eiGOJ*aJQ 2ѡť%塱,\^wbU84!ZTɢvK#E ST$)-HGJBq(NV)nSIP/dK/9g?0_#xAAޢwQI*:Oe#GпE!QYYZ֪.ݟJo5OebW _1+zϱNerZMSHahLIA4\X)-sF9 + .ʹt_2|%˗l_r|[HpLw ~&Fs?[ZR?1?3sH G}g%Cvwޓ^28.>9LO/OR=>O%^+It5qQO((ti(D-FJYg55d[NTO -uívh$;jw :-v}Q{@pڗվ" EaAW =*7=վ)P[^jV{FGYEj .V{QWe%j.U{MpwԾ'}j? P`OWTpWB+ _ VpC F폂j S`ijS/AYjd}"ȉs\6ZujՎ6$بv`f5-j[mWcۡSon5=j{Wc;wPa5#jGў\!V2F1Z3" fW4ymsθZ4Y_#kf+DyN]X836g pQCC1T_kJr$_]ܫ  `C;q&;;;x1x"ƾK/337^n`hx*cqqj5ơa4c1Øi2fs<|uƑ덣Ơ1d,4ccEqcXj,37+QcFcqqqqqq8Xcai5ƌsuƹyz|cqqqdl6WWWW7777wwww` 7O}8gdN00'S̗20_gc`dbN3O3g̫w70o2?fb~Ƽy .{=O_02f>b>v;0-ӞIf:2tfRnLB7sӗ\ ddRf(3Ig2l&gF2 SȌf2S”1LdIf329\i`2L3Y,gV2zf#lgv2~ s9pqqqqqqqqߝ~{<lx,)`zps͍/7~Pr3IF26H&7\n XnQ "͡=B-79Y@3R6l췲'e?~?8 6lxa~I^46ب^g~M6x7o!f.{ـ?`#T5ѵ$|5R04ծ/~q1åbZ71Y.]>QsbޕaUan:Z49hrhv ⚱-KZ,sm +^rw kqs'ޝw ݃f'՝6w b{Ͻ]p{8>mqs )5z@_3Cp"0w2qO q20  q`,D=obvoc|Y6Q>/=_$݋Ke#;^EPKU0W PKE9@6java/awt/PageAttributes$OrientationRequestedType.classQN1 z 1! lx*`ͺnWOă?2 <ئL }@Q;tB| }ăC]6|3;&b wWSTiGQ {H@y~& nro$Ө %*Cu4;ص'}3.C1)06P  +}D=za{]Hu5-h@Fk\OyTTuV V{8 L*E$?0oH y^R^< D+IUBN cʋdhNkWF1V?tC @nNN&֧7\&1/PK޵V$PKE9@.java/awt/PageAttributes$PrintQualityType.classQMO1}eapQ9Hf0&D. 6X.f?4,AEG&3o:}:~|lbBpxjx_kx NCȠ Qܘ=f YuPW=2'gG:C|HW; FaEޥH!e#SES6a4m#2u-&o;Lp=00gc9Pp[:^nE_\I!y ؗJ { U`\Wx}[XH eà0WRWik&$JGddMː J^aY}lf,S U4fL~EQyHPKM41mQPKE9@java/awt/PageAttributes.classUm[F=EXyآ"..PZ+*_`JcӤM_O>l}im}ik_w&!Lf{νsۇTq@ay׬?UsZo7g蕋lUV@'Csf7mйh9VpC vvf2L3ǐ0ttAHT3Ry$][<"1( RlHRA 0!qWHH*2gS4.()&T4E6npߵ5r@}CN9&c) poV)?K0!E(BbA//G'-HNs¿upQnS|LEϱZ8'vw>ZTA""pX|-TdZoI""bs<͵{XbcḎ%E`ZGBIQ3:*S(^&`U~=+kW x3BW/e!Y{^qJGFIOR,'UE}j_iJIqF)pV>GqCBRU$+tAF@m{)J< BBF o¢nВO%t3 87GoL0&gc"| L!:ERS>26WdlbF^s! "nRԲAY+(q@PKZ7PKE9@java/awt/PaintContext.classe PdiZB-ZMBۖAEA^D1oZ=T4TY,sfyõ Rq`-\OUU[hz5D}*CM]~IU`Dhq(LY*P!e˾Duәϳ@*g:9=J^(b́B͓Zד籊l /9q<'KNuoqa;sy'զLg/Pe+ Cۖ¾oÄsw啥ZyϿ iuX*95z$nkKJ"q`X䕡%0,"6a al%*2ʨJC(s'(+syMقR\0u40s֌aMwVgoZ1ww~O~vr/PK{PKE9@java/awt/PointerInfo.classJ@צ6q1Vq(BPA~vJH:+CwPŽsscD>,h<:+ҢVO!&9W6L3B_`ثLd6[O⑖Tf9uzI|Ki艜1&!6NBDӹZT*pv[2żĥ4FaCh`<~.<>Ue ^E"@2z_2ZCZʚk=@iʶWmPK] PKE9@java/awt/Polygon.classU[OA>--*Zr+(EƤ *ƒ< P]]PM>蓉,!9s|93?hӤ1ʝ ^ҶٸFhQӔbt=g"MzTL7KyCQ<7jMoy!V3S7l$ FZ#@/[Ԫn:D(ڬ %'K9˨sK7ĻCa9*os4LzSN JE_pk1y^mvi\72T.?`e I袛aw_T+2 u0zhr&xIpGEЙhqO>lxlY+6ɓ`i6ZӨ˶6؞8a <'o ^ZU0o֫ZV eRl_lJyz1Qp9H)1M3XιdqQz5O q=r,?qP"4؃{-*lKPHu,' Fh7V nݖj:FWϽgpZSs3;Pxl(p%kPK{JR PKE9@/java/awt/PopupMenu$AccessibleAWTPopupMenu.classuQJ@=7mӧ"ta["RR*q<\;E8s̙ϯGرaI s2Rigy2̗Iֶav3x;+Wq'#Nv&FIJD̼ĂbvF\Nb^RVjr #wzj XW~#~5#Wp~iQr[fN*#z l  b`L PKiX[k}PKE9@java/awt/PrintJob.classeKO1υA|܁&NVF%jX J)\w*"I{N?>cEPG'cEp5kB+"C*!q4EdRFyBM} ?F/ D8J阱J޿8Z!p3ӥ4gxZoۏm5b$OTDE^F>9{-( *H֩c;B&{+?wKm0syů˕JW^xA5(\X+H|w^ukkZKn\m[næl~PKG@PKE9@"java/awt/RadialGradientPaint.classV[OA>t)r+m" "RjjZ0)Ddh-ʓ?`}GNRv-!aΙ3eg( wfG+CK U7 LYaH[URNTv@cES5;=9]Սl1T-flz@(XAgd"ЖVGUF`O Ş!X1Qx,֝Rc;e'D*Kf[J ~cg>keW2:->}_4YMZq ։xrtwnϠy-"$&|ߊxʆVOM=+ZT+znhx=EQtb|QTh9[#j kћD-Vb7рMpKB\K yޗ@oY9|uGjԃyX5Em'nW5yĖյW"+vkyt9@书1#Rdfo隣€p& ]3@`"Ўcg1vbg~@wL$^bN@/nu1x6Y1 l3gEL;'! bFO&`bb8tctÜnSh*=1eB%Nz'O9Ӿs7Ӟ}Kyg>bb\̲l&&ꊉv+RI qxJzv.]̥KpOw y+I_o`d̫Mϴ;4 ISjݾs19n '0]iPءڔ=N uZ^:2y[!dn,$ ?9H^#u 4;&g9ElbROMgE 8۟_:+>Ju2M9\|g3/ NXZЯ$VxӶՒh ϰP;Bl8Qu]吹 jDzlA "Q+c0;'R᝙U!ܽ+ڧ0msMj2"2'KAqkb]p*OwI F焈1-`ؗl9MӕSU, E0 xU,(Tr%,%|HpL-_wO^I (p΋*O ʃb BNepk)/iJ$7d8$x &Jfi-LQVâ*yFj8 -59i LQDmQ:z1Bn+J>sQE-(inIm)ec6P0 UjZa@B/jF]EaCp@3eͥH-Э K[Z;c9pOb,@_Ee+*RrK=Y\v)4~;bD.FnDCl<2 J죷 O#i58k[(@s aʽrnF ؁M~7=]UrWKB"$p"[_>ϳ -?mwg̛73/{mȢPq*Cz$ 3EP7q} RY-e%+TWr C3ш&4 hvE߆އ"!  BQ(ADc;f`%1}"=wrXnyړҶӶ |O#1g|$C'E#Uz3N2lIȑ47x[gz:=3qɣ$Oe򨻲NeG(m!gݦ~NR{L".  U*,PKPKE9@java/awt/Robot.class[OAl[ [[HըX4J ondw[;O&>P3u2M{n7<\ 㗼s˕!`R,޸}\1z-{ z y @2 1b0Q ܬW9 Lm[2Q&\RT`){W0l h;Od11 y~5:y[iywEQ{~8 *,ٳ_NgB# ēd8oD #ϓqNy:7 *_|&ɽDŽ[*PsP8e,k0*(aÆMBWW6k^/2 E'T$ h*ve."O^tFuY:J쫀y}26iZŲ! {WP>S_%I5J=:eN l  8l̷ZVg&5Jhã ؅ PK8J:MPKE9@java/awt/ScrollPane.classURA- &&1()"j_`e]4<*|T*=XqQff=3 ې1zc2CWS  7fQ1#fK 4yܪNeBtC,sH3H@?լ,Uk̏;8syL& |lLQr.׸GDzF` Qqg9zYjpwMiѭ$556 iTUQ%LkLMZ)vb+.aXtKȺ}X`5f:չ;DCnVUZ?U^Zn-ЈUFnaeW s':(s3WfL)VjT*5h%c-Hm2+Mz rmD5ZbF\D;'Ǽ۟%%uDim'\z2z(\tpy 7@ X7ȝ76XGс$ }w p%+#Ȑ0Ν8 80u„~X|MJ5aO94)AJ1%)A ֏9vQkvI5x}4ps.{"c`dwk#_J%]u]ۗL6>Ś( l!=J[=KiKV߅we{PK`D^PKE9@#java/awt/ScrollPaneAdjustable.class[oAp[K-ZO5&Ąm| }22EJ`ه̙s3́?s8OC@mBT]ٖ_S]&ҡҐ %:5p47 )p|@Q$ͩο%:3.w\f2@KIl)u'xi&{Cf F>nwwSjhF򘹫 w~G >vLf~@\iwd0~gnW6Zrw&wkxԧ '7Ǣ PayrsmQVTݛNcMYUG ?m9[9gՅs sP<KVRϐ>fx}{gkG6 ihj!IHo=ຎSbb5)ǵ$a6.y\q>"@( ;cc@iY,*PVVAY UV#(PJ;Z=K'ܗd p CoE4Pؗ 䈆ђ#$rDSP-Cފ8G[y6CJeLka:UOPKj#gPKE9@/java/awt/Scrollbar$AccessibleAWTScrollBar.classKo@1MLQO\~ r[_z}]w/a(B $?^֢Wљ@6Jlҥ_]Iw[*i`Tw?aah-@V;G:HnxNٜ!l߂l ۅ>am\OԚZz ( uJx-$6v`PKTPKE9@java/awt/Scrollbar.class[S@϶bEZA&r(P HXgi`0ٴwAr2P*R#Om]=cssnlJ&~u˲۬ͪ۬AK%W ӹLfM5N^>݁d9 .0*~̢ĤTw`g~.;Y:D`j:zuӴmX۠f9݌t _J py$=ԃ&Wj]nbNT^.^uŪ Lܶh&lt5r"0[5R  ܯk[AxP;ԎiKJw7mQ2qlU"ׅ}PDW3qYrx^͐pw( ).k F $r/ochIcKZC?u|vK^pS^C0ci<&,za(0:0w{n; ?^LƱׅ0{$3JZSM*&Txԥ´XT-Idd3p52%r*4r#0'+Iy^̚ e-tPŽDΆF.v9R+_e=젊"C#`Y 4rR+_ evPrHd (JX&{>s3qٴEE:"D}F+Ոg ċ˨BT׵@l[ 6dT®85 Ad$b͝ T!zi|"^΅ˌ  PK׹L PKE9@java/awt/Shape.classMK0n:݋ABCA) 8'o]GHwCObC~y?? ‘`xM8_Waa .y)M4<%C;Gw%jT.MOYs󁄤.De\|!q0K)CE1f쟔aH7[#47J3\4Oq2Uz5m 7x>"E.tM:7y!>006UV9;aqaő㸪<oPKa6 PKE9@java/awt/SplashScreen.classRMO@u>܄@ٖ‡0E CKAHHY%;@ʩR(ԷXٙf":&7[. ᚔe4CweF!x`oex\ 銋a-o3l/=rfÞ -6R+1CqAO ZO-tEjqdB#ϻnF0W<4H8}S h9MtPAKR} R_b-!&1Yw(B~8`f0+OEF)MoT*9}>Trnⶋzf+y혧K)}h:"T1L0bLc̜Df59KZ*s]Lb.0 17t$TCD̏~9Uⶪs|M>ʊNQPkz˾)j("Z/z$ȹq PKe?mPKE9@java/awt/Stroke.class;o>#Nv&FIJDTvF`Nb^RVjr #PrQjbI*DQJpFbA*#B;HZ]+8(9-3bH##30-ee`؁$PK]}PKE9@java/awt/SystemColor.classmVF:[Ht%i 6v6!MZGJP0$o?zNm=F32cZ8w4?IDK+`4xqƝpܺW M#Vjf]\K -9ᄈVqtְ3dј]3,#ae~-tT& 5,d^ +U[0V#9S`>BJ&r+0ҙ:i71#gic`Lq"ٟ։]O9 L6vQe;P^dԑ]^,93D0X`F#9Ǫo܋nAcT{\8Q%Nt1jYdN&H6QJOS pB/ w91ɆsAVq Y۽JV ֺSvqz*nWhޯRf%T2~S6` #x 3ؗ=5{QtmdL{+kziTm} ,TDJږ]ϏVƥ!Q)U< /2j;ZFPv]&Y8IWdHwSBuNIpJIW4/)-tUNW 9-Hɔ.EsJtoqZmNW{S^9Y}ɖcN}ʩ VӪt_sFq5j/bJW-3vP}!/-?֖SrRF^ aՒDW q\@O M(R|xRScҸܣq/O~ƃ!#j|Əq? >S5~ρx |Tc4~Oh< >)Ƨg4> >y3 __xD:PPTR:44EY9KJ*+J(]Uz-Xt+*<("D "n#Dm!jm.uěw!>@| WFS>.ရ>?=+|i\36gq5ΡyTA3]_-pl*7p 7qe:^oEGή[ĭ==_xZ CO?fkbV|BaCog2xP5C~ݳFÐy'Ʈ-'4C1=c #/rMiɨ+Twto=>p%}pwOCb͈DrulDP*{,;;:%+)k 8\%A? n9f4OpCu Yd%u=/CVn9BTK~^_/HXUA;tZVg3$SRu#DZ}i b8bZD+齅ܹ^1}Z%ⴻDgC U/hNR( Ksb ݁ 6ٓxF#%qEK$ :Q$ @+ eA8Z[Q*m( _ ^RV3kc2>oKO+\ fƢΜDXu7PK!m%aPKE9@-java/awt/TextArea$AccessibleAWTTextArea.classuQMK@}ƶM֏֋Pж`U ŋq4$U<Q$؂eavf޼ٷ_Nk GO/HN(Eq]EjIv4 1g U>"ԆQg +_̓%xgL,P2|& lZ8)2TM'2 ލ`Wxc$MɂNvr%xM0 ]y~y& p(-B5әXrX&Bsc4WDă*]9>@{C{ay.ؚ_BvR[Go=ZZPKz<OPKE9@java/awt/TextArea.classYO@g G G wBR%QP;h>UC@Tb !!ޙ̷3:B3 zi'식4@@ sʨT 6X!e2{|d/W<$@RnTKT0OeI.y=l.{s _Lf{n`~in61` ܾN3Z.PK#j PKE9@7java/awt/TextComponent$AccessibleAWTTextComponent.classU]OA=]@R| &ci ic >P,fwZAv)KM̽9_<ǫ$4O ~-SђEc [Uy% O裸ZJ>0߁&ʦ'-$2)@iq+ wfѮ ڴMS`KaCCH` ңL ֿ8[sgSf15NB lljӱՖm_fB=:=Zdb-`ЪEV03lO ~=[O}]م[dn`.G2ju+Y`FoM2|vi.A/trx PKYMPKE9@java/awt/TextComponent.class]OAm+PmX)nZ44iILjh'8f%;C^xGn-S99 /0F`3R~^Zxr,Yp/b}ܣ6q˯^DV Xh\X!^x@v:Œ_I倀S ;xUE-//66h>9t'.5#.ш[Eh2%ӏ%0VbOc)#C`)i,ŘBe'T&pg/ѳoƽZ*jy._O@ se4EmMEnzͧB0.Z>Bh <4 GY?h0$A~E Mg ܂<^”)ĺޣ:m80܆a%>,3׸sŨQyu9kUVyg}A}Xvmdae콱n%x GʄЈ88(8,`ؚ>76 .`E-x#)D\,5kWT-X#- Ȃx2%%M^ aN_- f jѷz8PKC84PKE9@/java/awt/TextField$AccessibleAWTTextField.classuQKP.lii/ +DKbysmVV&~}|8Á P!p$׏M=lXo[am vmut|hVTji]3N]y_4`cZX 3lxW.39G^1wT+)06a,ɦ:)|>?wf(T@`tXSJU Q;)ŀDB Ѹē_-ZNXLuش8QēM&c/0rDgTc]pO{b&|ee!SA2&g[pXC|Y7`*,2@%q h&.U-Zݹ`ڕ$\13eb/'y (MH1y+.wϓYQQ_9=Y ۓ$=nKqU̚<#/]m)0U㸒Z9bA qma%Xة*#sSKg<xji Kmd)_)oOb,xc#S`El3>cxY6MJU=:)^$qL]t? %ct R8#2  4*9UκB=1% 59I*+ ➕i1+zEI/x\*/1 P$J y $B;N%pw`9Ht"ڂjDFflM/9=/U,S׹pSvɓy\OƘ {±]EǧplK# ^Ԙ^ ;i'AЌy+Ay'no5DO6_+]JeہVz;y ސ -Y [?Ϙi!3ooVRM-g٪8*!aי& Moh >3ϲ*8+8خkJ0LGupvx 0<Äy<,k3HVt4adXꈾ ѢHƸˬUBU([_FDZo^5\qƣUݸKuU\󪽆w ƪy/+B+uU9ݙ3 c_ڕk $:L>-`rRtY´Om" w4]zg^H ֘$dG" m+2Ɂ.Vhƌa3KڬtXjEK/t ?yte7lSwثV+lٔB3,ာ]UqY8U~qk+-J5hiD?_h4uىӱo'xTDgz5;R[UclO.jb[g[*EeN*ZK!eJ_'^jnWtNjåñ$wgD0iN+±?ChzTWhzh6]G@Q6eW I ,MWY}o:13Rk䒔9)}Q+;t >T-::(ѥxӾb ፋؤ_{;f\]Y,vM)dQ}ݻ{Q)`tId ^=;֯O Fً.ȯz`o[.|~|^@V߻)N &`;zQP AwN$y7J< |9F H60?E=qyzFR|ГA_'p = Yja#p?GA 'ĶW^xz}/zЋد 8)8$rDŽ8E=8ƒ| NzS0ktoWwzCtiԚs#/ȫG@\a^WD{.R2n_#EX$[%X1N x 2+OSԾF ej+P*5SMu t4IVF2֠!7P(5Lq>㬴"y^"v| lz/i$N+k8vSG2F6I[uĞ ޝyZd"z|Byљq%@^N@fUL@3&GDBzCSc~_+>-|Sy-q= 8k,vw CįNd.~C+WOܫ4;y6?Ÿ{WQ:?PKԘkA !PKE9@java/awt/Transparency.classMK@DE?p t#7@/~$!A\xeaUw^u  BeO˸_^1J8ӕǒ`M Z:~* ydI eUBsLZȟmBe` G 0߰/$VH'0U+zAc&ic7ڦ E=yC1&&ܢ?L~!5HàPn;]kѫR iΨU)T2~1f[v]g< RBlgzOOTWQS> P1NCKuku3MfMJQ+i lv㝵L%pmҺѦ^HYӮ:v̺0<)^̎;+\s#%XO0f3QFYuån2FY -I/X '8#|!|G7~O`|` ` #u`r/fF`-  eGg9@;8.X~X D XwJF)Nِt ylJ:%!)8/@v º$_Ñ 87p"CdVݾ?w ߟNPKZ"3hc PKE9@)java/awt/Window$AccessibleAWTWindow.classmQMK@}&Ѷill VOP X6]p&wy?%NR)ٙ7' (ċy`Λ=ߗqS Z *%L(&*n^n'U{m z? Mhزa`ӱ˚籌/t("ƿ #׽,J{|컀S26`Uig98UhcTH=輏MK]ڝ7;W (-r| U8YY;|;icGpPKD7)PKE9@java/awt/Window.classi{FG!LB}%C8I ycd* }~~>]+$ 3?7܀_e@{G d/01`0\OM,pV,Ӥ2B1x=fC*6 ˴hdπ_G/jշ"3Mbm`0cDs8Gk $0o1.o7\ceK|uur^f[gOq L}?f&Mubzj:LqD3k! qA=^sMX⍏n,bW 슄.Sǥ&"mlU6IXm˷275s"Z |fH'ӧ1L"|K]D}/ Q2`"_jnFn8D^ce+Mpw w9 -ɀlyps'4J*7Ad-Mnpm,tc2OUۘhxPv$%dKxLnDp"@rE &į(j1oz 9/ Ҫy[u@xe.9 jJkqT'zE:M(  ,l!mGwkc62V:P屈Q+We:g}rN;~mЫ/dc,Y(~1ʆ֏g|7A F܍H'Uhޖ # d0c1S:Ti8guSs1o&@5mgSNB/JhftLE\ 8w2tE[;IVLkD6+) eej eWMUN+nRy%ݿ%y><996=$<mԗGwV| ER(L{,>'JyU*dSA<*)%xU^W*VyC/;ؗ\(o+WO;PU*7:PSFفRՁRQ)ea4> |G< ^ mџi _ 5熯bsCotTķJ􈥶 eb%A%b*DEQj*}$sA-4KC:etWNPPZKN7F*= a57!!Ժ~̔l"L._ݫ'AOcsaOşddJ+Z?xLFܝs F/X[#_4XwW6UDhbiU|PK3~OkPKE9@java/awt/color/ColorSpace.classRA@o'a# .Gb#5NˆC%3T2A,KKܾvOwl I9}>~c~WN8kBXڡ5#̚sYڙ5fL=g39@5!@T mrzdx_ 1h%IQNct\]F?ܘ͔Pb~aROz!ƹhbF!&hbf!hbV!fh"EK\tpIkt(Vb"E1.B-r?Q)3IKG=*x@㔒Q xED2ޚ2EU!UH)Q^P! xCT7MX/3Fa˽Bq;:^+d.}KH'ϻ:AGza-Fq/ v^nl`7Z\rfqސ:4|M?fťi]c)>&ibm˰"urH_Ywk[,ʱYCf Y#fҽi=a:Oȋ* `9 q=rčM7#H܊&q;rĝ]w#%#EK^_+W%|]7%!H<|K!#%Ax y\ I%Axy^;/"ߕrD%dEe4 ;y|{J>7`em5>އ`X%CXxW}ew[YNHcs Km 9zvyyl#9RS ȱ O*w" =g9w's~:;C֚PKGOPKE9@#java/awt/color/ICC_ColorSpace.classN@)"(w]1F 76bcjњ˜Zte𡌧E fqΙ|{e= r+S5Z7LQ?Pf[==`XW#HXY-71`&  YuOHխyM眷mv;WQzF Gqq1$:j=CmʭœΎtk5<w7PvEhc5;b~TҩD"Bd,üP H==Ğ1C"Fgd`&0r-d  `'0J~PKdU`8PKE9@ java/awt/color/ICC_Profile.classxGgu"۲,$Drb"Cl>IYbNkwd{ Bo[C?3ϟyof޼o1VY6f>xЧTHs'-lg v[s}c% LlVMRRH&[*3jYaJNa+U 5aw-ձXTȨp-xDzxNFp=I=W*3\TB2X?pCrIXo陊ڍTyxƖ6 'PK [m />w)lZ-gDmDR]E":E\L-p=Lh/m\`XښGZU5 gۍhrCQj\9WakBiLjzLo5L+T(]эK`j\ŪKQMnXnM@8՜rLD,Y'([MlgXiXZkU0=ݬ kzv% ӆw)jfZ5Ig8TLbZa]RdIiyfDl:OŁPb:"\Ėǂr[e F4LZ4j BS p Mg-Pخ&n{8ٺ hV1C'Mⴲ}&ջe\a*>8L٪,]yq fbk0ea#?e|*幏z>pDr8ޜxh6 slwO/NRim"^ˇO_vw8XlfkZaaO X:Z衰EZxjV#'#Qw)!J'pbDnH$=°|fcd\{-O{ڕv%A2 $K~Kzsи\Km=|Psk$+"&$YB˱5j&ZrMxv^#s'V ?m8R/M;+ & ^C p7x x o¿̈́I,C;p?'?##|>x+G/ '<No#ND>w'D$„cq1KYJxJxl.N# aO$xI ?TO?3$, ?\? /$|9 W"|5ׂ#|=7o"|3·o#|;/K/%2 J¯k%: FwD |wJm~~ A I?4π?Ks2ᯀJk6K{q{ywke?c@9N-̿%B;Z<~:nœZRw&< -] +Os-M=5o 'E{z^ܓ ϿVXHk1D1 Kx>(Xe M=𼱩gix3u77lUZQ,[TY~1~RͶԭ±G"U"AcZ\t,("ZڟVY`N? 2i j;38G]"k PK Q EPKE9@$java/awt/color/ICC_ProfileGray.classAK@ߦIZjM{ zkE xUZ(Ŗz t+IbDO?JA$TÛ}1o?>]ưuW׽Z2tg*7"0 NǠjJ'#q6'"I:σ1eöwCiѩJ~1(%wӤѹCG2qilf `jE K aHN7&iUFU> uX!-^aJ_-@K5%[KH-cN:9i쾢R?`{MPK@"!PKE9@#java/awt/color/ICC_ProfileRGB.classQNA}*.1F/!A$x` $c~ѓ?2V nyKիyx} < s^vvr%]:蘵b>Cw t|f'ՓQ3qmInL/QPX3ȩXG_80L]Ȼ]˖]}IYJ2:oDnN;B!7!Sidsg!Dy\:՚MJL(μFHj Ki4Hte.iS"%!75b-e0O6 oAU"?j]"a‘1%7-1:QJgTn`H`N-]aA-4c俕+SHO2a0ݿ62kPK  PKE9@)java/awt/color/ProfileDataException.classOK1lwV- zWIŋNާk4~-O?JLVуLMf{{ynqSQ\K%c)4:ELX8'4+~|g\ ̶ #4za.gd$% t SF6{n@B8`':|FC&hzM}kk'05.Z^W> B HbYPK PKIG@java/awt/datatransfer/PKPKE9@%java/awt/datatransfer/Clipboard.classn@q7zImKiZ$*P*!v&JvSX<rs,;8`ظ^w^=9rtڔ͝ziVtQ5af[jBޏ0< 闊BkĦoAvC:%<PK)PKE9@*java/awt/datatransfer/ClipboardOwner.class;o>#Nv&FIJDĒĒļ"}̂Ģ"vFʜļt}FޜF YPe$&Zk12p%e22:Gd##30]b1I&PK/PKE9@&java/awt/datatransfer/DataFlavor.classWkWG~'1(Q ATQ^&@[mmdݸ~hO?xN?GdMpB>{w/\Z2f0# FJ1+[ !0$V=~j1C WYz \j VU]c|yJCL`I"A.+e:Sl笆J %PC[5ӢGUB?iZJZNg9h:rY]5UdUbͺzFPBca0_,1C!b I Yԉ.Th; B ]5 iSx/kn JJI"Fao*b-dW ;h A&RpM3N HEcvu;NE(zsw'/$ #:RL_;4[ ;WR5je[@\sZ8[y,$V_i!p%#ה\?-H@xԭ *u1%TrHA :0yWCDtE3B,&%?pѡ]ϩɦ*v*g߇GZE^&ӜciP몓t˦9zOvj.kdVyÝFCJlm2Ps2 g`4~\(2 ]BXDw7ʣV1{_#w5ˡz&P:;Rx2 $sI(ipyՔ2v ?Mzhm\SLgw}8-͂Mt.*u^xC5V,FS3FG$Ƥoma1Z%pC*T@.q *a't*o~*5b|C0faWolF3[]ƿCh%^ϝ~T:]9aiPaI9pWX(uOɮG2"HK<9x(#Y8 eOq P64)s mӌd3'|b;è#І!&xK>%/nb䷀q_b-ÊXׯ/zm1-)-cԺ$ڞu*{<k^MK|W-y[7)mdV L gƌ`u~G}Zm(vn%;BެԢܓ |"'ܮ؊w>Z6~/E~9/E@z>F8;CxԡJ" K4T,G@>"+R$Ky!7AY|ٶ^pJ(KpVUeGe} ?z_ѽW\R'FAſiֱq7`tPCPܫazxx8쐁WM\F(/\4M|j ,OPKjaNPKE9@'java/awt/datatransfer/FlavorEvent.classN04Phi{0ԑV,"@/W&A C!.n |w;/CCx9ӛsd Gi⩦47,l_*tw\fV BkwD״$fe-B)^QBV/4j)Kʌjuӷj!p #d.?dr% E3{hh!ruah!@]9pPK~PKE9@*java/awt/datatransfer/FlavorListener.class;o>#nv&FIJDĒĒļ"}IJ"Լ"vFʜļt}v6FqhiIfkYj^ L #_،b F5 |[k12p%e22:Ed^Ff f6vH21pPKc PKE9@%java/awt/datatransfer/FlavorMap.class;o>#>v&FIJDĒĒļ"}IJ"vFļt}Fb"Ē̲bFh̼tkMPiIf>HkFĒҢTF("`p .k;k3:`Fc:; m6u`ztҢT` #D䳃x @>' dYPK߼PKE9@'java/awt/datatransfer/FlavorTable.class;o>#v&FŬIJDĒĒļ"}IJĤTvFļt}v6Fy|} SK b"Ē̲TF y%Ey֚Ғ}kFĒ""`w q5M`d0 =fKS2s@=r`p3201+0Qqx \@>7 dYPKEoPKE9@2java/awt/datatransfer/MimeTypeParseException.classN0?iPh TlRԩc1!1<v#ݿ 1=-(IV$[+1僧!Unjϴ(d!vDNr|S!>c y1jXm ɯW圡CRUwdYǰNk%XY? Q_ ;x;>]3DQf~gW \2ƚeuި_w l&6-PK2 PKE9@+java/awt/datatransfer/StringSelection.classMo@uҘ~|) u…C%BE)=i,VƶNʏ'$~bv$J^<3}2a0<<^Y()zH"Úu73r(1N2\ P&1LrW#oD Mb؟ U$ -K3qofoI4.KweH>2~i2`x;+/SVgFUAi4璒{~Jj^Ij dZN5Ob iLݖZFd=>XD@k6cл*jAkߦ7p5 E{W32AwӶk{ě2ff r9՛I)@65b;qfR;h?ZPgPK@PKE9@+java/awt/datatransfer/SystemFlavorMap.classKW@串 "Zޯ"zSpQVCj8%$*Ʌ<Džf&%L"if>f71P,]&/,[2օjfK7S u4#z(8wSx~VX mG:9J`Vb`tUUzLDvZLMr>()!@QչzPѨz=v&fXa{CA6^x¶A`>8P'k0ĸ~Ȗ-I-3ab=ZQfV &Z:c^uݰ.bx?zȂvkHFl_:sJ`!WZ1Su?٢f1NYDaI>8]&%1YvPgp?ڡ%$lQD'̶E=|Lm!qYv`g(d!:.}!Z5QS%;09~wBN;؝t3^>؆|_YQ fOzk6 6e@8c+7ލ&<{Je0A0K.l=0;sQU|>a2&a _9"UNLrԣLpl5Ǥk`QsL9Ε <,"/q*R׍[wi"~`eX g3e%89lkڗwt&ØtK س!N:?%x a$ >,Ե^{smiu9@9PKeR% PKE9@(java/awt/datatransfer/Transferable.classQNA^tG+&&pq/\ĄrӰdfg33= HΡ3UZ|C] "\M\IXyݫF8 T}'?*}L&7{BVoWM(w]Np_fYQx KVjcS \\1z/"ux6Mt74ٛ +3bD8Bs8C89*cpPPKћPKE9@6java/awt/datatransfer/UnsupportedFlavorException.classN0?IPh$VRa U7TtXĀQ#Iy-&$B)b"–ݟ>?FOTSBKdh{;RiiAW//P27]ɇ7=Rsa7Ҋor4c/T#tC3t~*$\Ҽ TeTH y qˬ&&=b8 эtƧ kǞ8a׀;]kCN߰j6ui FU6`v7PK5PKIG@ java/awt/dnd/PKPKE9@java/awt/dnd/Autoscroll.class;o>#nv&FIJD}ҒvFdNb^RVjr #W"\ #\{@~f^fP4=ag^qjI1H&B1Dh\p~iQr[fN*#?BH)##30]r;P$PK CXPKE9@java/awt/dnd/DnDConstants.classuNP\ܼ!W6M) IW'XR>+>eSAL3"4&Y%GHo-# fYiB%."`"pm:7ue+x: [oT%m57ڕJKWj%َK,6mx%A;Ӗȵ~SMĔ`6i!1Ƈ 됲KS &?xfv-eꢱIwϜsLsjO:rg:/YU{~\$Xڹ{xʒ@r\nx+=埙(!]Y,qK*]{qb8/a7CS[{VMxGp+ Ɗ u/W{KekL 8Pʴr@Wyt}qSD`&ue};WS8[H;Lxg ˇq=Sl%\\;zuОWeqToD{ML]XÄH3ZCtrhjnj،htWUR@6DÆ:h `*ԭ3a:bA`.vD}5+_㶂&kFHIo[z׿r9 4z}\L뷣0 x@z$ tBOwr|K56>|B~ID aee 0 #QjЃW&t[WM95}f, SfȜHͬ9 w"F]d`>9jdއ\lƌ`1l!k▿ZLYPi &eZ3HMh Y l%f?a 6-Y罄=:)c#WQ\wȜ̬(kzPK:<x  PKE9@&java/awt/dnd/DragGestureListener.class;o>#nv&FIJD}tҢTԼ"vFļt}v6FqhiIfkYj^ L #h  ̪F% \M cd /-JNuIed$=@F8@,N PK#lPKE9@(java/awt/dnd/DragGestureRecognizer.class[S@϶B[(K_EE Sac|)IgV3OC9l alvm˟~6 B`J Ўn[-ئn)B )슺ej.hA!l-O9ӋV,R=d[r$WSVwT9.(hraTm52/X]baߨ첢vĹ~Р'LKe6u`iVx˽;B2B!rb 54 J6h0)%UDYms9/t0Bh87 lG$뒈=lM O#PH!1!(Qq'_ $|} mLnN͒@^*Q@`Jm3&H9'Ʃsm͛Lf./^?7\LaJu'3Ӥ쇇hu>U dߞ3?!Cwn8~}XM`f7hxi "3Lp7hVtTGQtFVXy`ϖD , ]@&KjR8_ I{d(bM Q8OTjh]Ġ8'z`3;MiAK h;yH=wMoMR]xQsSQ)νGxP-$xFĚؗ b _^'Pn/;!C{APCPK*iuIR PKE9@java/awt/dnd/DragSource.classVmWW`, ȋBP "hK"Vm@JRj|XKXv U~I=c?WtK6imO<ܙ{? 0ï3%|ke*Z%n(բ041}|hWlšULRSϕ%лNF7^'p`YshBiYPcƫQij%r嚪\z@,Wh  & )J .j RBKEH 3AwG(X zY+?'(L`z:QM#6YƄ *JkըA`fQS';SEF]LۺZo-[vK`lPŢr3jZ Ѳ^s}u]Hۖ/mUZ@]dKKm8%Q&c])oKժij'Vk>'sRv{v;y}7f R+ɢf?9Y&^mޮu T7بuâ"xߞfܻ##7I in<7JkxI6aȤ0 1bC܂c̚bƈ _L@Kp÷e>>6kY 6~mbYa2&D`LsO8s6C3as,< b2)\JVQFLߖe׿]Cj9`cl2MJ8 G+I8n8(w͐+wlH}O<bClECN@`2ʥX1.=²ct~!I'DvtſAʤ<  M?$88^s8WPKPKE9@$java/awt/dnd/DragSourceAdapter.classM/CASK7]*`ĊHǪXiFjN/JbQ̴Hl>̜|{jr/R'F: OѼ;ICG$@04-U^6La5YSm#62DQ J+sDܺ%OH1Q$הLnD% S!Z"Qv ͝jjou@8xďg:27NJm\]Hv ~5af8^E?>oaȁ!T3J a.Nʨ*OF|m{\ϕ}ݱUp/ m️<.x~E9XpiX 0Ic3Xv5Y9b61 X!ʙ%XW1bŏ *~Ăk_PK(OPKE9@$java/awt/dnd/DragSourceContext.classV[SF6@s i&!&! n%}62F>OCg]d[B 3s;9|x,*<^^M]'AY ip^8<,jdXL`Vl?rbXK:i{ټaO!W|sgXa' 5!HPJ A<c5:v%?F^Gݮ5' N Cw}]<B{'Xѵ23۸ː1{b; <;^UVŭ vfOϰ=mBaӔiN0LMQ띧<uff-?@k&r9`V) F/ 7,R+ynt,:HD TZN1 Ki^w0#܁1 )s;&^j.\ a)Ч %vÖ,|ҢvjrXOt7h]E:g1"/ qj1Lu:o0Iz8}5NcXb(]fq{NӬ'hJquؿwkW m T G:RF\V;\'ܵe3}#y37Bs(Bޜǵ_ߞ_bCaꊷyrow8 Z. m _{p;BCb+U;0_{QTO!2pГE2 F_8lԄ:k0X +ihKddq ⶹZj\a` WPJrXo wTpe38y2hACK2=C\Q.Mk{6cٓm1ϰd4h#ԅnugp q~$B/UR]GF?r40H  rÜBS'g(ٷo4L8Bx1e/iPDP.΄:RgdVW ?JIjmgIν|{PR1;%(KNC޼ :#N+|0C CZCyR \ H3U8V|qѹ5i l-pxCOC[zm^*p_5qUMY1 Lw0R{H/&Gӫv[SH= ?Q=`dTő5IC؈?,cU)Idh F0)ai""]4I[F󋤪,)LS.Ч5h*OgUef0%n(zYse1a3sAPKgPKE9@"java/awt/dnd/DragSourceEvent.class[KQV2ݤ J4cE/V HQvf`:Z?z z=Cxfu||~8@>aAt#tΩ/Z^oȳtu1B(:Z3?Ȇ&ď aP){/X#^S&D cH27r,gʕǺoD- UЇØWOls#uGXuG=*  T!ӒOM,GN7O+UZS 3g.\&61Uq*Y6%UYεDzf 7e\"r# KXuF_{+p:WM PKXN}PKE9@%java/awt/dnd/DragSourceListener.class};1O|QY[+ѱ,8 22qQMֵEr=߷+1r ݃˥|:9ZUF -/"gcf_&i#nv&FլIJD}ҢT<Լ"vFҜļt}v6FqhiIfkYj^ L #_ 4bae)@4|pbu[k12pA2sRdqId @ #Б  'dbPKy"pPKE9@4java/awt/dnd/DropTarget$DropTargetAutoScroller.classRmKA~&^rmz5Vc i P8ZAnՕnۤO~*ۄD$f}fO Q!ވ7g:?X38J{2t,&ϥ \kF.D>e#]|:et 'ڑv:ɴkp B5cO" n$J/~Os%a91/Ue<w ^H=Bs=<7 TKc2#lzw,Kk\[7+L8Y,μЦ*7f gͫ(db~`6` ~xc>T~G 1 4vs\=òW5Wњxz89%#&k фP>GHhҚr:kF-F[-tdZm2'E"QWp7]ږ 1SSxSUEJ39%8]К_ =pp|oJv85[r. 5nmܛ:8ؕ[gi1n5Lςnob8ù;Ql0a9_.Kپ?}̀V8`Sg86N|IZo4`6ANu [/ĕڹ kx9 }x͇r;LP^ "e~w#=B ~7 #!GF跸vz3h .EF(]2#cv(F8LD$ƅnn5`hfauZIb,?;)bRx$oʹ$ާ @谀*2?Z4ibZ ӲWqD[z6m&789`U[? Ĝ!j/^C"8rfw'z|0 Ŏ?>WbBᤳCU|tisY}mDKFՒ+h5C:JP[EW7KB^wi-tj{1MZ 'A)~5|Kң&)d)fhPfz-bQL=lS̭A24 &Sah4"!}%;@T#؏FT"PK-]0PKE9@6java/awt/dnd/DropTargetContext$TransferableProxy.classSMo@}㘘-M[()$i R%R"5MW֛8 $~bq4 w7X«ÿ H>|O lXSH #lbgwtTC{ƾ*DJq6*ancl9|hml dxQN]XpgF,~ZD,F8qebb @Z} hF4"t53_F[lz3+Ul}Z:E*ֲ8OPޚ؁PK||PKE9@$java/awt/dnd/DropTargetContext.classTN@54@!r `s3B/ T(RiIȱ&>OGU0aw3眙&OF`֩IzgWȻ`7" cSb~f%QV5[ԶKHRy ~dwx4XvR^2~p.%jS}`LϖO`Yz)_'@BG'XxVSHFJQ8u+ƥS q *3satE םV@nճ/dniAsY=gGQWwwhӺFuS)~?,ioik²MiÐUqqTϺ {WC7ڽ!엄:`nSXлQ˿Ty+g`vSg C&ӜU:mߒg߮Xb/=* EKВf[^ԅGxަ$%޹Is1bLpiG >R8<984 '0s2/:BPxR1"FM cqz!FVk08xM4r+j%hZaFSBD Ϥm6a6b"a9{Sd.2rXHm\H΅==epV`5XV9#_# F$z|-u4M3u/lY0VЗ PKToPKE9@&java/awt/dnd/DropTargetDragEvent.classR_oAA^ - m#Zm_h4&$14F5xG=CO&>Pƹ \y8vf~vf? axRծݭ֥3hs.yH*8CiJ#'mSrsܱjkDzUѨ\1ϝ0b 0 ytӲťZ6 lɸ` fI{v3<{!3ݑ_9d` 䝎h#ʕu9O͕|\>9S SIIn Yȥ?6!$["U/GŖճr% /|SYsge96C\F(ύc帲#|*T;wf޺FGj9k8X D6*oo36`o(["SO@x?N H7I=wSXA/}qW+$FF,1 VC9:ũZru6m ~ql@ XHFNkj"E%?G!c_kM={"[㹞c7"==='ڭJ5#V] FPKUQPKE9@&java/awt/dnd/DropTargetDropEvent.classS[OA=S" &_ $$!i 4#)tZQ>蓉ٵfU~swm p[?bիO_Vhcn O 0ӣV08ғa-<=->郇_zp͐<"> яr,eJMM0 ]s%l0,lz@-6i-qAC{ sa?R!.QRRu,]t^ ZP6Ng5-`-RZq^C??nd=dRz\70vƫpx㊖hC5W bm΅go4kBWN V;#l<4v٬}Eլ/~B;lاGNkĝW3v&ga|CE *$ >BϮ4{; m XLE ^uqpgGRNemX0 cieosDzмRׄ"rw@zY,,aͅ McHGA[J}#Av&FIJD}ĢԼ"vFļt}v6FqhiIfkYj\ #gJQbk^ "Fk0FFEZДl`I(S1$3?9FҢT̜T0CAd2ˌ @ ?V`3p0 LsC< `L PK!3EzPKE9@/java/awt/dnd/InvalidDnDOperationException.classOMK@}ۦjU[`ěTXBCmĕuS6< (qv s7f?^02E]q%_Eɍ,S*19:&Jp#H Ҝ14)w^d"Dm3tb~&>S)WS^JCv})GGǖ!LEKi]Z5`AD9."d9[GH]I C?D#ԑ=}Jw>pZ\+߸V SKȚݨrb"1dЭזzy|`bA4 ~S7 ލsJH}g'E^gYdp\ eeD#Fŧ u/*е4节VX3~f>Oэ*i().@'X/]%+q5 bSk[zĺq_(hPؘ0!bWA"C`yA+U/PKΪD?PKIG@java/awt/dnd/peer/PKPKE9@-java/awt/dnd/peer/DragSourceContextPeer.classmJ1ƿk_Г>ۋ=}ז5IZ}6>%&[5 7 53t ^`J[757Ճ[L g|IT3t ' \t!@Wz|xgG,oç֐RkQb#ܾr%[mhF\eEyZ׼rꋗ) ;yb9y-cJ=B|t1]ɰ>MA$PK | ^yPKE9@-java/awt/dnd/peer/DropTargetContextPeer.classmN@ R- Wj[WBhaR;tDͅC $ .9+<.f|cq6s!TQ2j"t[fZ|z(348$D|$"'  jcB[HFR'0%Y5i.aq 01xVwS>gaRK/eJG ǀR x=h0-/hCZfCPi^şJDwjrK@0One¶e u4,صþ-%M8w 'PKFL81PKE9@&java/awt/dnd/peer/DropTargetPeer.class;o>#.v&FIJD"}ĢԒ A*'1/]?)+571%AF(fЄTd\Eɩn9 ¨bcd`d`f&#X@a@8'PK0ZkPKIG@java/awt/event/PKPKE9@%java/awt/event/AWTEventListener.class;o>#nv&FIJDԲԼ}W'$5/A('1/]?)+5A,ZZlKfqAbIrFj #"֚a \Eɩn9 4bd`bVag8$PK\1PKE9@*java/awt/event/AWTEventListenerProxy.classMKQߣMY~%PYA+#L$%oLՏj*hGEgSs{|~C!aV DED-@-yC:a(WqLrLpUCMzC@3Wy0 li="9f4 jX~89 XoD/#fiu PKȖL`PKE9@ java/awt/event/ActionEvent.classSmoP~V`̱滀:tfIaehX.&]?~2?0{``H<9׷PPse͂+1,.XEamR fHi%8T-UVJ}홶6#O倧krh˯n\Ե) gH>Itz& 'zS0Wmy' ٬.gv\WR-ϵ~1fOB6pakV0Wugapu隃Zɘwi]3d,klE u7%!7ܢK|԰;sϟ c "fY-lܖ&n]^Įҡ "m"'d/pJ ik!. l&e4EL̑gWl}mz C? S =˺b.J^|W6?)s5}Ť̓KuMFڜ?QUtzl`L[?GWʯ^#JcD?UD*|_K|(*ItPKl3PKE9@#java/awt/event/ActionListener.class;o>#nv&F٬IJDԲԼ}<Լ"vFļt}v6FqhiIf+H'L #"،ԢFy ր5Zk12p%e22:Bh##3t; $PKZPKE9@$java/awt/event/AdjustmentEvent.classSnQ]RҖ^,xZK}4acGi_@'8>Q}P:s{Yg_8~ty㣓7Gp\T8 Ȑhw(3,ʥ7V)cR0_ǰ8c{̥J]jJZ.RJ$~O%XQxiRV˞2=-W '!ZYo:WF~aٖsİծͮYPU5Wg{f6bHX5v1[NA(ee KZetF|\ :CF^ 3$>m?szΐ9̹TsZTt k܌D_@j)eQGa Wkm!h7c㡸 b氁"|yy_ E _"+'JUU!#;LBI'PCW- &GI'11-gǤD̑+=1]{|emg1wJ}TpnOu_=PKΈ+PKE9@'java/awt/event/AdjustmentListener.class;o>#nv&FŬIJDԲԼ}ǔ\ '$5/A,'1/]?)+5A,ZZZA,nNXbNisPkj #NfXk12p%emt F#8@,N PKt]PKE9@%java/awt/event/ComponentAdapter.classQN@=*"(Е ]Xc cbED ȐҒ2Ŀrew bBBf8=̝;?_.p`#p8 wL9"r:hT|DlbII_PxFhԕ%B3d(5Cuc:/ b eWq:Pq#=K/@K 䄡mK!qkVt n7 shF#4ĝԗN}ϴ-їQPܤΡ4z;)SpsJ(S_|VTX\uU!K}^lQ3XuEl0X4R/PKPIPKE9@#java/awt/event/ComponentEvent.class}QN@=*sƈŘ(I$ǹ#`koąGW33N>aOC("-^JKgݧgᓮa/U|ZWVQ/VnF\!AHd]W sav -^T|03K0yeU'^6n+GU- s۱ ʾEJd;CKq!EHږpi(2iڎ,v]ΛnCm+~!ld]>!,5Z{J7קpcenȼFX:V7 z(V11 a11}b0NY^0uSUvH,e⺊;= 5?ckdv`yĻmmwBPK0PKE9@&java/awt/event/ComponentListener.classuOAZoN\ʼnI\8 0f|x%0SJUW~ !ظ+ݓo;y%M{)j \< #P٣U_Z3ROZKBMLH>羉9>ڜxs~n{* (HKsrET, PKŧ-PKE9@%java/awt/event/ContainerAdapter.classPN@jEPxT<jL82X u5`aDg`*gor*ŽZJ*qlUugQ,%-JZe&ih>h5hR2':Фj#Sm hMHpX >6B[_Bsꐥy[mUXxPK|t-OPKE9@#java/awt/event/ContainerEvent.classRNPJA+ 1!PZ ^ANZS >Q=ݙ=3duDb(J/ɡtRu|a;3ԡI7] !*ӳeX͋rjT T#$9T$? 2jdXr2'y0ɘeEĎl Ŝ.02"h#"@sL_iS&5跥$̙资g+<&5k?C.MG0y%JuK|#4ҍy݁w)OlvY? a1E0x 31O|GOb3uW@G>y>XXn`s|[eNa}^T r8\l\ unh PKUEDG-PKE9@&java/awt/event/ContainerListener.class;o>#v&FIJDԲԼ}̼"T V\ --wiiadK-902(iZ3 h \WPjn~HWp~iQr[fN*#@] Ĭ@1]r5'sPKPKE9@!java/awt/event/FocusAdapter.classPN@= "C֘˜#n]hO˨Cjk)~+~e3ta לs )];S1xӞX{$̳ˉx2u6- wLe]T hʴeJX Byp8&8WDQF kby2}A$ ? E42yQt{!ƣokNk43K`LIrL͏s^_j<ȶƙǞW>P砄&۪-namsZh3bςhK~=PKɱ'-PKE9@java/awt/event/FocusEvent.classnAƿ.-/Z4ջlJRޘ)NKv gW0]n |+#< E(}cQAMԚn7TI،u!l_w6[g.Zp {u:m$dCit qV63m^k?I>nU{YXce;ttu!H’Š'<[h >lM1CcV!\98'Mv>KC׷9kjrߕ,=JweV/p_9`?D ḭʰJ٘s4Z*.p%^p˼> `wHWE&SڲY6[nRU(2߈߰NO7/ig!_-jPKU`y0PKE9@"java/awt/event/FocusListener.classmO 0=>b[qqg] :[URJ mZĤ 8\.~<l0\Jܲ2)Nump%'L:FM9gV`Huhcu!w^⫷+mBX, f:Ž%DDz2NtOwq[n#<PK2PKE9@+java/awt/event/HierarchyBoundsAdapter.classQ/A}nTT[!A9X8U$qX$H/:MtIGoua_ޛo?^bEN`/SQJiQ<0 G`.dt]vE|H Ú@pJc SU_Et1뒾 8cz*e-PQ@yR(zbv.zG`y]_Q~:Num+묀a34wg399*#fQ̿1y/;1V5'K4&H42|PKy}D7ePKE9@,java/awt/event/HierarchyBoundsListener.classu= 0?At1&(A=FJ iZџGIqrs `.Garn夭*2҄*t*pl,E7 -GaXUX'uHM.)bOk@zz}L2F0*Ά>8c&yw}PKQ޵PKE9@#java/awt/event/HierarchyEvent.classR]s@[>bVKPkikp:J:$C_: @:48i@rFr3Qs9{_ 0C {FGH߹Esdnju:KA2xlpXdݨk'ML(椁}RmЌ. 'JM֕7r-*FDC^emeTb 2eT QkDFZ?Vj~l= 2No6ZRH?gԲMThJS3XM2g-gfOdʔm:mM CMX ɨ۳.? G!֭W=oy^MA@k8 $_tMWfO8K$_@:1O-NOU wNN2]{8"==g}8'#nv&FIJDԲԼ}ԢĢJԼ"vFļt}v6FqhiIf+H3L P} F% \V5[k12p%e22aEdbFf fz8vH21pPK} mPKE9@java/awt/event/InputEvent.classmOP&>Mp>dHޘU-)}%۫%{ܶۦ{=/BObOLZZI.Vb~wJ/TÓiPG+*rGeXlv%/LA:b B 1Qo>a-c}~򄕜%vͼ-obb/Eb˄7jI(Ұ-]cH'+v!nK"' HR:TAWYc#p# | $`Jd_Gz,rcrم @6$ Wld]fr1bruww%A&\gCIW+b2J\w!?ed1xs78o-Z PKLPKE9@%java/awt/event/InputMethodEvent.classT[OA>*ZwE7Z־4!+5F 05,GIԤQMnQ7Ivg;7?~6( ;":)͸! B&IqQ3YrT,iV,T\6GhTh j2m,:$0ì+U.#y#ϔt7|z~E~ .LTua-^>b!,^ jњ`֮Ч&^G@ 85}B2jY01 c04q*VY <7XnUja#f6!m+IcjZzݍn6NXcW\$اn+ޓwUjxw$*h"ٷ 2l.J5m`52L ɿ0IDyM92\ppK41Gx[uGtL۪}.oش*mHzX?Bah)h`kv{xcpĪ#*k$|s[Bfa XS`f,9qˇ!w HT` (R1vv1;RO\E2́Dn9PK[QbPKE9@(java/awt/event/InputMethodListener.classuAk,\L($BBnͬ^<Pbf\8t:W]xzꬤ3SsLxN>1=j]N.CA PF꾊IhoA :Űh诺+*Jb&:$֏}go dmӌMעNGPKȷ PKE9@$java/awt/event/InvocationEvent.classS]OP~N}0AsCd܁$ܒfK`ȍʑ̖tOictE~=99?}` H }+̇r˪5 5m ( !r qi5\TrjݬVZjm^y0][n[ ( t]=:&lf$UD&2&)CҲ]ꩉYzu^nv.QXqu~d 7-=`xS-FqnNKmjd,1 Q2o >ugitྲྀ^$kҚ+ovJD-ͷ <3e1E/>nxq 3,Vױ L-!ulMqci`/8@)zR7bӘ!_AYag#K/z)2H?e7 _yqe`I2婩$uW" !F9< #On,9bxM\>Il O6lhAxz5]1FR,Of>ICaJ~ms=%PKxQePKE9@java/awt/event/ItemEvent.classRn@=uk҄R5A[R`-x6aպr)݄(: Iăw̜sfֻ~ `l['b"jˉLUWӑ":vG&Mpv <7v azDz"K#opF) L #ºèykrn-2Nc fsBȁDvt`J l6 N/G@$=15&8>#ԃEÜmj (ϲmGwg`I儍fk:%'4ΩsY*{NL-?'Gk@Oi|KƫRrx.qyrwY~L75j M^_d\c P7u fLt76nrN6Ox'B:LRVv >*sp?>甍=PK/PKE9@!java/awt/event/ItemListener.class;o>#nv&FIJDԲԼ}ϒ\Լ"vFļt}v6FqhiIf+HL P}&ЄĒT FY ,Yk12p%e22"@h#3t; $PKk]PKE9@java/awt/event/KeyAdapter.classPMO@} bAQxC֘x˜5J/0B-d`YL<QمD%=|vf>?cEF`/'җ/ڧ ڿyO4)mG2~o;}jy L4Ťa3lc-\ {!b .  f!Ւ*+TEG?Np7面$n vTGB@)"i #zñUh&+ph=r|W=v3`;xA%y[\2 ű6'X<~X5DUXWMH%)uPKS}5pPKE9@java/awt/event/KeyEvent.classtTUwSЋ` *yI^23ox3#B{W,kュv˺fonmC={8'߽:/}se2X†B{izk5VIw8XCf;e1K1cXCRԖ_]^c ju G"Hq;!_jl߱3FJ*!M%y#J fTi1[3v2fkVdk_4X)-KKUGQw4u{YpU[kn!)Y<MC9KGyO^@^H)l=v7}X("Ɲ= Lj=`gr7SZYdad5fq/b>2?i$+)pp7K*,ٛxKnoMw;nz7̖zy/,9- IKâ{$Rv5їiH! '$ sͼAKx,,.,M5;Ou ysݵR[cxt o#t :{(GLMpާ/r?D>ILJMny5*pLdhS9ˏk<<i28O]1DܺMoyъ52)\ޙ.7ڰOQ/IPI+?ޔa`xA^-y兼lCvY++w_~HN%^_HNK\\r屿D.e-PQt*ۗnd =0ޖdp&}:ې뤩EY;HRfeҐAbԅHZQ//bO)m^Jᥲ~I*Ir LbcT/s:֭h/E^MAE|5>n/ڊ]k v{{G)_*y)em}-y0#UNǪB-~][g.38+ab{!ٽnE3Gax;V׶;0JlwmuCRgfZ$8[/ vߡfWm63l]](eΚ|'A(\C%K] U#ήLa^c)jPӥbE.{%.S[ۥZQUU:ĕ'Ε"hQ x{yoU[~ Ye딇CÕG#Gcw)ǿԷSLPלּ @y!"x)pǔ]Q nVV8>R^i8Ç( 58|8W^T^W+GG))ᣕ;.ܭި >FX8OOR>>ET43τR>>G\< //RDR2+RFZ:ooR ߬| |mוoPKn{P~~HaGǔP~~Jigo(?Sy[߆]{߇LË//+~EGʯ+O)/_)o7߄R~~G]=??R{?((( 9_)?)p kqÚJ*Zy\QS V()G(G)(wPWV33$xnʻ{( \OQGy*4x x,xx{1%P#{шaLg=SSGF`|;?Ȝ=*bfQ(T@_Ee'VؕŌUfon Fz[ S6qF2:Nc{~doxG#gKiW286r+IZ]kK?L21èK&l~ȣT5_s<b <2y,%,Tk+6XK^aFT57@+DݍXu 6܈5bӍXw BرPKiPKE9@java/awt/event/MouseEvent.classV[SPC)R@r"B H)ӆ 3NP%a_|G|'g|{;Lk>h;9_?PFrDVT=Su+79Un^ӼŖ wd95JjbJ+ټ-2Fa)$I cV$r%)lBlrW9@5VdJ&HZJtO䫓{;)RLIAl.ʭ*5]t%gl1q^s>b$M~qya} %lyql `kA>\NlVq ڨΒ_cDsD3ǷPKd.GPKE9@(java/awt/event/MouseMotionListener.classmO 0=trpŀ:8^JJ@s(1u\8|!12H!VPCڊ*#UYTr f-/:[F1[*G/KJtgXV\xvp1uIİ訴f.n\G1|׉<PKsPKE9@$java/awt/event/MouseWheelEvent.classR[OA>޶RTE`LdScq u"k;ݭLxglM郛tL> p/1G&koe0'Bue ΠCaӇuh޳5=f >6wa`K`Jg6Za ss V*y7KNm; :-NdB0`iDYJ ݠw,-~ ݖ]yQv'΀=z/[9uŨ:a 5t0 w™Uטœs4gNG9TƨQY\r!.YkPK9#PKE9@'java/awt/event/MouseWheelListener.class;o>#nv&FŬIJDԲԼ}Լ"vFļt}v6FqhiIf+H7L #.Fe V5[k12p%et ͌ @ #u  'dbPKPKE9@java/awt/event/PaintEvent.classuN"AbFfEXWLrkZ1k镉>e骿C;}s#@ē*ɁU.<_hׁMXHWBWjgMjUKtMœNk r+qyΡ{ꈰStCʵQBymGZ,'!sfӮ˳õ6uGܠ-:-zUwm DwӰ01h<V2ŭ)`o]#ݶa"CTXQYr*#eyI93%T[KDŽxvC(hD|Nτ|rmMoWNunwϜSB8uBPDw`$ V|+ 0P.b EB "ٝ< dA(ٍ"Eh=̪`LtdT$Zlw9{$v=}6QrLF,2…LZ#/)i5Tn(bH5{9V6Re PKG+9PKE9@!java/awt/event/TextListener.class;o>#nv&FIJDԲԼԊԼ"vFļt}v6FqhiIf+HL P} ЄĜT FY ,Yk12p%e22"@h#3t; $PKgPKE9@"java/awt/event/WindowAdapter.classN0P_`A+*h XJ}.VH,x qU$ޓs?~y}z귲+38W:ޑ/J(LZG[YVyZߺĮ aF__n)unQ>9ؼ(4C_1 FQpuN;w-]V[ TГK$Ăѱӱ K.X_;ힺ2ڡf;XZ`*͏̗дtl߶csWal2O= ^ q"Nm5 {o%cn1C[`48)+UA f='{-?$aή7#f1E1 x< bG,1QgxDAZPKu:PKE9@ java/awt/event/WindowEvent.classTn@ !4! 4 "I-YvUSPC#b>UCCUghxY9sά䋿>.<@[if͖e˶sdG D ޕ3ȗ,+Z^/WrRQ)rQIsW2k +  ɵrRю(4grۘf~E5w1)(/"QN|K/ չoF9Sn;;e>˱QWg9᧶c{Rj{lJD $'VAV ,ʙvBKk[y\p%[5k%nSɐ>'T56xZ,C`Ǖvid5v:㋼1*/QmԫVE  90aDDF<"(QSOx񔀧xo!E/!|E?qysE2$V>5zPK"HoPKE9@(java/awt/event/WindowFocusListener.class;o>#v&FIJDԲԼ̼rbԼ"vFļt}v6FqhiIf+H;L #`9 ̼q >Xmk cd/. /-JNuIed:=@0201+kL@3p0 \ qnPKCwFPKE9@#java/awt/event/WindowListener.classmPNAey'U/NՓHLH8yXZd3k`7~eYF6$+U~~}x@F٘hS89[bWY1c[ B Ju$ՓzE8ɍnvMi|'4CbׄTGMʇ-~#nv&FIJDԲԼ̼ĒTԼ"vFļt}v6FqhiIf+H;L #P9 Fy ցZk12p%e22H`q͌ @ #u  'dbPKPKIG@java/awt/font/PKPKE9@%java/awt/font/FontRenderContext.classMo@g7!hE )!E"R ! [9kXoJOāB̮]$.vy^3??!<*E`S~Vc&1c6i:oGgU/%\sJ>Ǭ9X- `o:RJQVx@OqD׾j2t'|@RL|9;/LT>SgLxwH`?p_I1iN_i;_2w=N.ڝ$;MlI* 0%D b?K ^ |d3&PAlMuhq (e=|ci'eAnKx.H0[1ϼ)V6`,c$݉MpaCl *]XGBgUrFEAK׍t6"06ֵPlԄHq6|[ظ3+VHnN*H½EriDrۉd+H>@&i/PKPKE9@*java/awt/font/GlyphJustificationInfo.classSRA=CBB` "DLwT$ THŒk7d0Z e~Xṽ>9gt5dXuj4n߶ɪK1FP 2s:\U_`h҇ftXeϺNӷl5Zv*v.szdΰJ DžC#txzɪ-!{יJ*vFX5?//%%rk't=Dy.h=|+3iGViHfF`O:ߧ˹33xY u?ٽ` b'bd`Dkq:敏1=30R&60!#/к^ɪ4l[e˓bЯ˦bn,oUk:밡æ[:lC7v궼=o$4Ot#D,̏=#x_;x t*h{m>"=')ZI|t"pD--0Zd(hQկ5Z90 9F-JN1A.2OfY:9SvMbڢB4GB;4A@Tnv)/ŰB/iG}BTPKT[i'PKE9@ java/awt/font/GlyphMetrics.classn@g9&@C @HڛT8ɘ(i[` F;UU{U}>TYRBx7xw [WtBz4+LW5ʽd}::\-eDd Yө7`̜a]Tł '%\4 \FFgjy]Q_drFZ{JĊlS# X:7 rJ O8c<*H26S=`6CMJ\O./iBqU'0E xXfQ@4*;?i'rcz;r_7GSeyX+J|7)<}~nĿ!XB<}s:zeN?@:0χ>Qx?Y(!°vq#Wm7fֻ֡Yt/hg+`jw+' ^[W|;"$_ Cd $@-Ʉ mK rǒ7QNbXW-®U'Bۅ @myƕ>L*}%u(CM.QB??X\㋉Oa$=N!Y;@LK<daNp #h+qOِVEWjı6E:>wqBᐫk +($^#7&[8ioic zf#y$o?+Ļf}+WqT̲-|ߜ;gf_'2 1tBRMbͥeBV, AM.!*띎h7U H$yJ`-@B8:}8av igg?1C{6#p jwkI 1<[R u_w%=e{'gjUN P lJ --"0s>&sFͰƌm|OXePa9Me2.E866ejq)L"ekr7`Z;}%xo|VP%ۨW#:NDQE:LDo`v:wycL9߃{/`w=yq/xY߄<c%!ꌉGcxH gFBns a۰)˙HGb;÷: PKg3GcPKE9@)java/awt/font/ImageGraphicAttribute.classJQ=LjL==xBHi4o"R7-"L:'d'TzUEUc,ֿ$ k>U~+HV[7R|׫082;C)2p>nL0xa#j^U9epO]E 3907Ny]yS,\weO7m6S ?Ы[uPkTaF'# y3d/\B-D9 R2gx6%7IpC!JU)U& I8Lu.I, $m?"kƉkUdK>Zx{^kMMaFu]N٫}v=>W1#1v?IG!9`G`̳mPKMUp5PKE9@%java/awt/font/LineBreakMeasurer.class]OAiT*PDbAcDoj4ڤIu n2;EO^蕉)sy棿~ `NS~k_\/R<,yqm}*:a{)+5Q%>s(mp;J=\I[wlP[ V# Y\. !9z-oÂtxKOǃ:B w¢zC)壂4; ŶĤUelyd`wE_(gf7VKYaX7A)/QИ*B>\9ЕXs[ aXl;(z EXwTjpTr.ȎhzR@O"6r6O_x<Q'YjuXDQ0yBcq%܎Bh 1=Z%O6IJ!l<+Xacdh(V'k,OQZ {Lo E Ѯ*cxӌ~^јӿ7n-Zඁ[Ic?nN}drP6jwMPKåA PKE9@java/awt/font/LineMetrics.classuQN@RPExWb$U OKڅME-O&?8[6þyofN?> Ơ1/ʙFR9x*^A%C.}?.A1:m@Y1(1C>AՍ<x,tl D kAGux(U:K(s Iד|M Y!i[#ݠ{ޢ$\!}E w'1)9 ~lJK %&]0&W Zv^Gez%1@%jS2;e l:sir&SVUi1]3qFqN?PK{eSPKE9@"java/awt/font/MultipleMaster.classeON@UD-h/6ꉄ4!ȑӊCngPٍH_۝'|kS0j[8ssNUe&Α"gk^BK4M$C臋$Yp/ c3JgpZaHw y6,@'sS"~"uNQY .%{Ž'˟/p鰃+5n$APK/ePKE9@!java/awt/font/NumericShaper.class[S@϶rED7r)7*@2i 5B:mO| ~(* IweϦ~IDd)h9rG?Zf[J[ SQPv*ޡ[hHZj"N]F]0v-n<#3IU+uߩEp>9a-SA ILsC؏kZ<-i`ԫY uuhvFm fD VnK3p-J͌nrkm3լ DsGro! 933t($6rhXYJgu#(m[3 ( .j!l=ٲU|pY0Di-#fS3 ߞ[s0%\t0+p:rjƣ偱u0 7㌢17xKBn~ڜU^Dt'r;fyNZYXp+^_Iyw:q}F{3üiNW̉h͙H]k w{)xPa (|4w~C#'c O'ź9,So/.-#|R.7p2*MoK)VdӋك_ňɾL+2+nF9'/qRbpJ MgK(VK~&[U vQivRXҰ / -2(MkzCPK~+ݘxPKE9@java/awt/font/OpenType.classmvDqo[@ihZv&){d-R=q(Pd[^[2&<xT}|ǿY̜;*Uatգ'y}&y_Ix|Elm(a<+Rh4f;J"64YQwqL YtÐ6m!p}t-6"ʦ>f3̣ZnP,{7sݒ&PnX!k +KeXh96ū/hjMF\[7ZFӐNi84_ rA*hw-G\kMh B[?Y@/C:<^ٝ6YR5lZi.SrT(ѩ޿9=Raei ~'yۆgS~аʛS >vHW; :v@,^+aأ<mۥUV'{>ٮ:ٓd# _<Vko[5wdM31|R9xן5/cD7ΖGJ v* pW .?MqA\9q ~2<x*&"K5[+7̯B1&|6;1\01 ])ͼc K௙3 =܀Mf ɼ {.1a92w`]0 9x#1k+&W?Q*e 'sE<]OpDbHԿxk +BdszϽlwd6jb^Pb8ჷ`Q)[~=N9a3KtekBk8GwY_1/psRwm~GNF3|7n3fM Uj%/@Ck)>+; hJFd+f_Eusk[Mm(l] 㗰]л&-.]IylcKs,4g= W96Rw-0w}<Of-5Zf £*K+Vl-|l_PKSPbPKE9@!java/awt/font/TextAttribute.classUItU}!HC 0yJzTTU'Ѣ4INpFEEEEEEEEEEEAADD Yp… .t΍[9cιuh)]ϣQ Ufwz+/dҽx(TN _?8뉥cxZbTfpLBl!BSؠAl5U~-ԬP/1lCTCBMoQ()ąMaCؠJ ET@oX\еPiiMciBb) s'bD*i11v嵨F=yTStlz-wӨPy vA|DzycL*;յ ."{ < ~P}ʇŶnMXaLVLZp3,v]dF#a -K/͊l3EhgM'bzEdEn|ˀ;(jvm.@"dA.Wj,m3GÖ+ 6~x#Z#<4ОXzSmt|T37;ș7WK&i_"ˣk __ )xuo @Mt^%H.\$%K.r2q2xOIEYj4a`3`Q @ @7 R-@nn^^^^^^g'gkeVÈ/s X Mp-6 ve&Sh4p:4ggBk(C0SF0lqI,a A9P qf8 #A0148;DO٧s| ͽ^ ES?P3DLj_q(H>=#l]Fyy|~r]{5Ub}QW+; PKaX', PKE9@java/awt/font/TextHitInfo.classN@{!]]tӊ jUKQYnAf,&X >@꙱h0 ^x|.c_|2r ga"7iejq;gk<4BPP Zg5>1`XhK%;BNDv)ip c-JbģuIf >u,/р@5C"EJj(J+1`ކf ˿ö=_z}lhr2rRIszN+cC[ HwWiOu{{U1"J)ڣљc9\f/B(㽀\ iINɏtl-3A:r-b57ը9E,M?X=`lr=\oGFEʊwwkf5Ql!ݶMU[h&ֶ^fi:Y85Џj +]-ۑͰ@:Q8YxEմU-Bٓ@߶Zib~\3T-;MV T*65 x)aNy!zg;zwX󄜞vVI$b$'dW5Ԋ5KٙPGӏMEC~N$ |MNLu_+7%Bu>(vt+H綵Z͢6'oP$iJÊyhUX($[(e0 mMuj즶0q/f lM42en]M =~JvW̬}+Pb$15^vՐav"7lλORTc+0J2YgMVk*:^Npjl*v{KvRNbUTkjuXzk2ۨ7̲ja7oS UUC&oH_Ni \Lr\{y>Qr1orЬML3 _3 J[5 K@IԦj#?W N3.*~y{Yky#9dIM}mOzl jo(zUN/f߭j{|hgO|^Lr?sfl* s_1X 3E0DbmT281bU*Sf=/FӬмN-CƹlgHM,j)V43^h&_jO 3x^qC%/0>;9 UpU{8SFZjGQ2lpg O&Ɵ`# 2-].]8/b%|dQƜ^qDE3Ɲ]r6t8G8L5-3Y6έ9Pb57\^,,q-fs7$nXNRc: 7]d_}v'ݳԳÕ3<[po>C#9~K3#YTˡྫ!y sx(q5<<,9YmXEƲŲcy KBD!҈!#DD4-ÊQRއg Znni9XvPᩰo r&CxWN$Jz!n!dŬ+Hhh@wA>(?LaPKuh]PKE9@ java/awt/font/TextMeasurer.classn@q6mz B H, HZ`KMZ !B =|3o pTUK֛82C>7/X G"a)Ttz;#vqĪ7`0 \0Bkps kO2nftQuGvneP аE?]aُ58R:X4'ᐰѶ+pgƺӀ]΅JPk4.ym½Ylc9 kv xd[R;YI5pMIB+ѐI,G:nh%N.3(ɯr$t ʟesbVpE$*In$UeZCrZBތFXFTD2VʠI4)C!2س/gc6Es&4Gh_M\jj}fni9 턶sleD PKG|PKE9@&java/awt/font/TransformAttribute.classQJ@=wcߢvՊu'-Bхi;SiEɅBpQ4XBfn=dn?>a3vqe= :?Uʓ͡qDҺN׺nDKciV֍$oڂ!Q=W ,2WZt:aK șI0̛#IG\ MvS.ဌUBqn:t7\j#k" ԽPqak vCm()q^K\JӗNf!!L+Jk՟I*Q({J!,nPԜAJ41U#3Ŵ[NK ct/c%Әe#=?ڴ2<\WPKA7|PKIG@java/awt/geom/PKPKE9@#java/awt/geom/AffineTransform.classWmWGb" *F_$^DkjHpKRiC@TO,.X9ΝfM ,3hnlhIµU*Fv5"Eni ȉCm$j])&knbsEL;pptMKXSL}a Y52Z 8AJ%^ nQ#ƞQ :_V_8( Ap A;qƧq7Ƨ:9_p1䈿{GƗ~}ؓ'g,'\%u^CLp^3(GJ~$-AlE5%2na+A Nmq<7x& A|w.M'Cߦ6ޫѽK G=OVc_%XH^* !DՂP:.BvQYi`eil6-'81aVeQr,3 \n[e{6Ocb`W'c\BhA@g|M^gL >{.YM.>+~jr/E(. ֐͇۵n_؂ quMdw Z#נJ!^4eTǢ8ʔQ 8dT+Ǣ:jU2@>T>*c?SPK6\S PKE9@ java/awt/geom/Arc2D$Double.classU[OQ9]Pʢ\[ *ryc" oK9iW]r7O&>Q96nM77=o(† asP~8q sC  @z1 `Hrw3,`J?M(?]PK88PKE9@java/awt/geom/Arc2D$Float.classT[OAfmEQT  ѷL^twL'( ͺn~gfs??Qd0zoZYVxpʹTִ8Cc4 fv;U?[G5(=UnWD]r=*^an:Hf< P_ԏ̶ݱI;*LNl,XO^v-iQ"S6O-gNyer,(W"f4 ejTj͓Ʊ+R-♾2i7)2R).#M5O2/bݳ""v͚D&$!YQ.GTmBmڦJ "D~@ [& m;} ﮶d*h3JqȐh("()PTqDwiu+P0 sQ9L`]LjCDN^׹we-}Q~鯁_Vt\ e>쀹|s9,9s%9C[L"_ /oطsͷFk VH4F)~‹seL`J_#-P$^]Ze2]@c@H$j Q2Vǔkb׵DPKXxFPKE9@java/awt/geom/Arc2D.classV]{E>m/(RlRZJ-_m6@h#UQ.t&>^<^Q>3nݴEsfΜs2?7WK-ҖZ1 0?~\|n{6ςQxɈUMù;=>c٭wղ\1wײ->΋=/ 4I3-JtͲNJM™=Zr831:_cǯ{X˱}nوMs62#.픎mn~֖V\E46w7|[{|#Bdk 抋X;B.~ݱ$ɥhu"Ya.ѽ гr;pX$WNHN  rSF ZޑNyJ1qQg /& xm#~9 lGSi~Hn5)IL+lrlG!]6(F{$BQge ֏i"O]P-Kp(x6w,4K~ JӛDն[pA5LF\3z%rza.HqTV̂|Ze)!.>'h2xĦg6'CçL 2=|^t+R3p 6+ӿ `ƇTƬ:Oe E(U5MqX8:4z 0ãHC YH\z$œ*Ԙ>O3Oc3xbf-6}Q ,Q)wbow g2D,ioKKҮk*aoDf!1l6|D3Rq]; kga,u< Q_GL5j5J R7hƿIlj|/7񭂸]r]PPi(85~*PTmm51/c{A% Úxő~ձ H"f`+sx?$^~ )PN HF:LGaxm.%L`'(dzJu|ɞ=wn  D ^k\+QbĹNZ|*]')M uye 9 Ugbf%! }$fzY.bdV~F-ØsJi0ZPAĺV\hJ qd pjpf`BqX~$@nM  .[ƂMpwM#0}$0y W(Z԰MΪJ-ş$|B6N}jPn_L} [fGD9͆QËׯY{|;Y11 G(!H@ec%+~܈'›Ǧ~S3 lN-OMb6CnQv,ʩmF5֓'fêf >uY qP7W.+5zG)oWFځxuJ 9w.Ͷ@"ub@SaԣXʈo"~ /q2-3غ;$R0Ml۩Oۨ`{z[Sh~h)"ŒaykLSGc-ǼX GKr, ePyLp'gR"Xg*TTbtݝϳ;pW{5h;m3I2FX`e'Hv&0+C+J{Jk'cOB^9HBJPF(v-|\M56u}f h.[kPzFG<,h\t.\r9rL_37p.F:]hN~e|ڔrf)Mu8Ş_әX=&<ȇYyO{b~.äذDS7s+,iyxy /ڶ1T4/)THo fhY9yBџqf*)Z?w2 ܥ1L |\a:5%v=$`n\ s+8J.Yu숛(m$+PkaVrUJn פ4"R{s_Ȫl ץd+Y1Ⱥ܉Q )()%wcvKJ1Ȇ܋A6lII=jӭ=zFQazFQaz(ZO}Isg%PK)2rPKE9@&java/awt/geom/CubicCurve2D$Float.classU[OQYzP.Er R *MLCH|Y,vd?e3簮4&=wwf$3O0a3 [*YҩퟕcYmYf!0+ Q>wҾ8|]! }S BCvC2ێ;=T?F0 /gvJFiM=(+c*|fs XWG*dT,%Pj U@Y*MXQO l,zAϑZ zn3IJ&I~fDbtԻ&%"gF3 h`4PV9MY<+7 PK$x PKE9@ java/awt/geom/CubicCurve2D.classVmSU>wJ-ՆJ&J Yi)EB)X\vu??Q}d=<{7ǟDT,iO3`LPn[r;3KzҌ. m8G'fRvl`fs˲:ozY0JgG)4@9c4Tsyoz[JխY]-ch2Lf4F󆺷:a9 u} x >#KXd\WbGbo#,7ct3궉\m*׉.zF#6<*n)Hz(K`W:;E5zh%-0lwR[bQ%)` {zi{x K!ڏD!. ⛞N>9-2⻸YOya3Ӣ؆k"w~ ?]{DFs:Pr׊_{'1.?Ws^\4lj`_q+Fa6 t)H h>Z)dzppI eqߦ4O֏$~ht!qU<5kij@y~ϯ4>h)1`ض sپl 2V6ƁPVDT "¨ԶD!3B79^rL iIz{M>'BV2,.&DzaosTyzbܤ`(-؃t=I@}4(I[q_(24QGܛx%"! ` *Ljj1Ch/*I]Œ^5p-RpyE0Ḍ9r,^HmXY,Ks8^%>g}Lc6:"tukʔل8yG մIMҷ5`5B\|5lm(LIo֠ [9I'qOH۶MvbnEE]^PKiD>SDPKE9@$java/awt/geom/Ellipse2D$Double.classRn@q& )BIS("!iRĢA-&dcWR X!(Ɍe*E4sg(N+bw(y$v'{!iJLKRnOJx곀4j8TE.jS&0 U0kythL Yi{TO}(s\ese#WE_%UN gYenѽ f{0{x/x:[ʔ'?S `iw; zt?ߤ?PK1O!PKE9@java/awt/geom/Ellipse2D.classQ]OA=viU@T>JA^P#a%!i߆:mlgd?e3A&Üssϝ߿hIa ?M~l}wI"Sъ# WEr% `(J7 zc!֟E(0ٖJ d22̵ofaRQYǍO:3Qg]+ 0ymz4jpn6iſ*RQyJ++{zdbG޹|sׄ0 OSFXm񗂧2aaDsK.~WD~EMBn}:K[tVۄLⷄE))׼r[ұ)5b^ޭCXۺﶞyceu"`6w \93Yr? GFl4DPKxqPKE9@*java/awt/geom/FlatteningPathIterator.class]OAӯRˇPEaAc o04i~ &r5-2Mv21^xG̮Rؙ93sv?ᑇ a\\d} 0Fj9 rYo˞P T_M /Va_or,"<نݞoFî ߋ@'"TN6sLEm6BEOZ`;roR#D7NZ;,dNZhE0ݗS(r]a%3"h_ qASnpd;/h|-?xžl+k!Q~SLS\9o.:Gـn5yٱ \LcR 8hW,ge_Ƹ[KnU-v#r-c1AxZfuXM5~k"|۱Ǯg3֮2\PKL|PKE9@java/awt/geom/GeneralPath.classPMO@-|)p=p3/LbL0HMiM[wy2G.Û3M@ )B^,DK<ƭ;ZҗE<`?߹8{ 3wsBy8"VH# !?p}y5ex#ƞ$Dx#꜐F;qZh=c㉛lM50n1*vb>eL3$fQ;M$czIc*zRgܥrU*k[Eeu=ԑPKLPKE9@-java/awt/geom/IllegalPathStateException.classOMK@MDcڪ'[FIŋ(AH۸+Moy<Qm)1/Ĺ(F)su45܈L<Y>Þ+F>Cp.4 p_"B 0tm]LD'J02j+i蛩|a&\lİ3H:f:ctL\K;s֊Uϣ! )q+ag. ^'|F-3o;\ИmŦ_PK#)NPKE9@!java/awt/geom/Line2D$Double.classRn@=\LB)i6)6@,$U *覫`ڒOOH<|bQp P1׶lWzf, DCO;VU&!Ԟzc/:6XlM\!,ihJOvW]Fb,Wv \e[Xe[S5)SuM~%!%/ȩwo+Ho=WgϔI6umNMe4$ fԂt}QkLkdnc̭\fkf3n4v.̝\V.v.v6KY'ޝ#ʞ9l(#sdTaG(`KPKg~HPKE9@ java/awt/geom/Line2D$Float.classSn@qIL MKIH[ĊA*8S|``Xٝ9svgg<س@xǮާΈǗN?˜+y~ *sŒe\ew 5dm9ݷ4(oXGܤ F{նpkm+Fɪ)Ae)EiF׋]mnjX-ͤ`w4ˆDK5ho k X]F"#^lA{.]7]V^ct%X.`8>c獐}Jvӄl$m5ZA {{g9=;, jD9JTZD AUQZPǢNC+: ]!k; F 7¢2K,+G_*0Lr7f{_Pw7t}xm V_>>Q}4;Wc{g@+5{-ԌYwUV;&=îk}B9&=kKNd8ξ8Up/,ecP2M?h.6ʕJ[9MGc"-P½J)DѶaSh%ڢ5Mx੼L3a@vQw:LӕHP]xypx3}N_H{CXnblesKvIULb<nݖ _ Vy> GP!˧IJ@w#Y~;9ɪoNb%MtQoܒ]nһOU,KKo ^Vzr@_}s /{ h5ϸ ENU4U#?NP'A)՗bqFK1oD/P[}9H}917c_~ԯPC )Q+EgJ3R_ǑQ&[*74֒^uB1} '!~0.Ĭ3`V京|p^p1PK=PKE9@3java/awt/geom/NoninvertibleTransformException.classN=O0& BH  P )ҪL0Jl亁ńG!aKݻW'Hc;шL]{A(R. *L ^mMKxmhd-&*}22vK9|??/-/axNyۧ`@& `yb.ܯ9/ K0Xp) cרwLQm`avEV6R!+ݭ3?9dT&gW:? :ASꬌ8%VV*! hȃt;jq<{C=7N/X-DUkWeᨰž  mrHw}|Bq,15&Fusc'\2l6ܦuXvxؑ%60Uj+UR]-A#> Jm^6S]+(^\1Pb{8+b$c? R4f&R$Nb)M~Fh0-kZ0eJYUe03m| վn+7W+4Â|KI|$/yò{O zjiXA}l(m6 f1L11>fI=#.E%`Æf>է9+Ɣ7QcQ-/H[=--V[b{zwiu}Q3rr;.Ƅ<1 PK11wpPKE9@ java/awt/geom/Path2D$Float.classSN@ I\((ʝK1@E-QHoK#ǦC~UT~TKLH&9gfǿ&h#0}EoAF #/rvADعYԶsHE`H_;%?rk, Cɂ[{j3DfUjRDo/&h} 2^vKzh&' ?Ӽpݠ̩C*)̣qZ ڮݙdMUy;j˻a'.^%ES]i ؒxDl@n˩5M̜mS>!,"Fw*%ԞФͣ]~.%.Ekv.!巉, d ieaޑMMӘs Ӎ+Zk|@K&@;:1;)6aYa-OUhcQ+"yRd3`U3/z`7^L>DW>Rפp]z@fL+׸x<[#`Dmo]hSh9C|Y5&cCltXd,(%XF/%2tT #݌$yq[4Ћ+Ҽ^tg= m}5B[ 7a%}llG_i*X_9m$`\0]VPW  0 `Ou ])1l2qM PKPKE9@java/awt/geom/Path2D.classT]SF=+ń@HR84iBh ؆qP2 (#$*O}L:FE&{ٻ @c- G וaQt }#~"2pܳbX`ެvjͽVtVL妻ÍH96[ͽZ%CK ˻dRɆnfx_^ Ín?LGÐkDv~FW,D~a!" Ju%b#\>˒2!QW:r$rBZ4j%/xs\fc .2,t,t2OlSݨa3ܻ`46s[pWlt,XtÑHu}EcB;=Tl[ TwCPVJ}:INm U7dt \zk̰wA Ma'L=F)Sb6$뚮>*}c G=&pPWeqϸ1<}24۲zvGlO%x4]1'& -jP)&gh%!,*M: }-=/1I\):Y* O 7g-|op[F| '}<)J0" |t^)=*@K҈֌kDk푏Mk6mE-zF,<Ǵb_]?Ý~YA}wmp3_ϷgXUZeyց sU5c}(Ʒ*6b1*1bTbxfXk}/7 ?P/Y/ka*S ʗ贷iKFz| ]ul$$9LWu:Rx=~#j |#GTÆ:s( I7a_Fґo@EOkPK@ 8 PKE9@ java/awt/geom/PathIterator.class]N@g-PAolh[L*HIYqSK6)[ټ|(I;39{?>L НWf7iE<]XwLxgL %-=O,43I:roB{@G.hةXJ&d8ڳ 5e <]9d`ڹ_9+6&n!u_N!%МYƅhB{t=}͈I,c 0zʮK'+( .5*Eg3ޏzɅτ#(CTaaZr[ȍ7 Bn/cw`O>h=m]8]PKM8PKE9@"java/awt/geom/Point2D$Double.classPMKQ=wɴLMˤE4嶨CHi{30UТЏ hs9J|'FՕnߺp-{2(!?s#8!?)jJOz "?#!~"!Zwo)'dʑ~[z!:p;xoՀPi%ڶ3~8u%asMH?+!Mwu ƴ{1nGz $kǰ f191wg ;Xx@c\ X 1<_+:Ac!a@ewC]ySlR?ĉ³i? M ؀r eΦ#PK,EtPKE9@!java/awt/geom/Point2D$Float.classRJ@=4mZߏVP*hEEt9ա $>~J\ .?JR{=wf>?4P-@cX=nkҏNc -( 0d`PrO>'#-C@2>d76/rF1n(DKy.k]pb<ŷ2bXnvp]զR)pa4q('1*0ςZ2kev"Ar 59-t #)AZyc chȊULLhL3pS\UjZhT}3UN xBmEx̜s/-۰gB4ŗٗy]Di˳'\ץPDޙSE8H^( A/ 9Tb6Jj''3F"A&O? a3s焂$8ngz<.N$\%/1 <$\ZYxBpj-_*|fB_W/[|$,&2U ݫ4X>_zT~^"9h"Idbc9ShNj dKn= cl:+m ΉW jr$3(.in!Eߦ{LkĬa0_qV c-}b:y3ZQ[cc֍ΖfZ/50Ұ4(bTSngf6јI}s;?p*rl6 r-vz F:4h5F8ǒPK͖z PKE9@&java/awt/geom/QuadCurve2D$Double.classn@gi)C4MKRn \ )EUrMVڒ᥀+$.x 1]Qpvf_s!>)'_pBq'p6Npn֯ݕ,šxl:)wMfZU~]a36f !qƼ)X-C{Os'EZLMߕ"]=ҖbHy$屔' _8= RZ|fO, Ơuߧ/վ(@jaHe#o+5|C5<^x4ڬU(Lڶ۱q*[VvҠ4 OBwQZTZRZV$t1Wh"i;FF4fXT?C7CwK A.#&9Il+W%W"fvT*k .DݚKYRƒu؋HM>|Y cFr'Om- 1](8`KsvwΞ 02!l7Gn~pCWz#aԷkH" @a-W?e'P|]TƠf1X3Dr=,Mg{+W^l]>5ɍj0鿳[!Wnv#ۓP`Hؗp swFa\rz#mr <(FnTb[Uqm@FUUhHl~[;ߡ~v@`[DZ5hXA&$P|8«` ).leEo f K'VWXPXT8X"FߏH2iaڢ +p)`=Jk\plX$ub)fĂ5æ2˔ku"e-LWJ#RynJMΕ>O)#11=Tމ|#Gr He%Ir'iW&P Ʀ")8zcֽ4 0vO4 2,74&ǖmyk>diYJe(hjّINh2Z-FhW/Bc{e'UKFL<4$ق$& !ێe{pUoF }XUTጂrFpv1/⺾R*{nskB *z5Mó\eDPU,9 5¯X(-~Üi3]s\FO5yv|&s ug=)̑sFkq<|s55l CoEu?P=]{ B-Gǣ<790`bODM\>jXV._RL{66Nj 1ݺi1P0Pض閛FeTe4?;m$hͦc`S&&4JQw|N%Prhr 4BXtC*c||1z[Y,Sr]XN!%tSK[ m4@{(}]ƹ pRo\Zx<<zRQ1Qĸ+0^lފ]zOiz_8·9 3,(׸5.jM~5IRnPp3G~4iυVsW􋾙]!2L%8< u^OlGvޢؗ{9!қNƥmd*~*"6`>؄{%UZtlV$"d.`q~5,?Ւ۔PKրS PKE9@&java/awt/geom/Rectangle2D$Double.classR]oA=wX Zk) EcLjIHB|mշ-5Zd?e;Y@&39̜]9qΩvׯm帝շ'l l$ ˺,jK ɮ"P8Ǫ'g\|,]b!4bX"KtaH Rk;%xnUWE#:Zpτ Y G?`鹄G{sjՌQ{jP/B-;ƹ8oMxǏgL|ko!;Ϭ4xg T FHeW#d+363iCL#86R7|0Ø17yUH;? yNU,5p˚&!PL4loaq*g\3kȇ"9Z7}SX +)X_1GMl c#6YM[ױ!MGX/cD OuNB5.B6 [QsxEUi,("(j, BYU1mPK}D@mPKE9@%java/awt/geom/Rectangle2D$Float.classSn@<ǹ8IC[Jo@(iRCD-榫dc#{R xBg/BHXxwgfw|_P ustXs^pǪ†$Ba"jNgc.㝮@:Bꜟ.Ot_s!Q*!$S!fg/rs͠zG.YлL.+q`t)37eW.{+X,H>x%s+Ni7vxa2Xj9% G{ŅZރhStV+7(dPF<|6sv*rsQ)NA6dhæLR5O!=͡TS?`; 30gnÂ!+1 E YEڅ\"d)L(P5 (  XC`knOOVGY~3%!/"JR*LO'7q&ľ(<+d:LMFKEnςQ,z~2jOY'K"TFRfRU Kߓ"jY5L]gO1jJY'"F!FŨ3g}X:?.U#nRM0lr) x:R]r{=v`"|2Lҽ /W*C#ta:~xPYDs[pWdMW` d\7Aݖ[=CS w*'N]v{Y]fVY)ƣtN-F1p 5ǺW3}7F'EÕT&jQV7aV-`qfG_07؁U "c 1'eMSة"w 74^UR1a8jg(4A8y4@),"95 An 54I2]E)_yK}B78*f~iH )¨z=5QU|?5X ѧ i‡x*[B_+0=ie ܓVih:h*چB{媃&Ip0?q3ط[ajaS?r T ZgUh.jH_[$7 NMx"C?3,T> ;55I ]Dv.FXٚXޅ,Kh 4\bQ ~WR^n|Wiˤ&#W !+ߢ_PKeO PKE9@$java/awt/geom/RectangularShape.classUmS@ @E@(-(mAJyS)oG9cڄIS?Q{cHIfL}}v.OX*(O9-Vƌf-ZTܫ3Bx)fC`E^#3Q:Ķc.}'0X:{n1sA *mPgYu")_-D*Hdsev\Ed鬏mີr95 :h$jzfc*r4Lc6-fVj!6;&mbS^^0^[T_я;+AvUըe~zroRub͒Wţ3"9VV\ Tz<>¹ܡY ?ܭwk_XMM<3 -;tp1i^ZӚehUōߍ%( * c𩀖o(0=vpI!ĸ^`|!"0*hهIgU"]-cɎ6G&B;Hv0 S.Rqc@ dBզ/#E>5'kߊ DE@N"oG@"D>A TFfBFV  NoALw4"N r`,,ª|_/G8q)="Ku#,/sC6PC߾ M/?EՓjGO <k8fڅRv1ڒPKAqO PKE9@+java/awt/geom/RoundRectangle2D$Double.classS]OAw(@ "-*ժOL6l'hkv &?xwff5d眙s~.l`!gǬNΐ{ή7u ;nGcnC6u/X|fF(2q1C(D Bl==pE!j#d/Af+PpoTپ>4׋p$~>&ɦ̿ྂ *xPÐg:fY-EQ۠Kjvҹ>V d*x`cx*#J{wK]|[Q{Ҽr]oYph'ym(PhȕƒƲƊK?2:HW*ys4VkLkYE)!w Mb$[$KĊՈE밬ߡNQ 5ueX^I%*j,Sk)z.'*)+FV jrZ|)m!=Q0   m2 B/PKGH5zPKE9@*java/awt/geom/RoundRectangle2D$Float.classSn@q.έ)ri Pi "E<\޶*186MH|Dbiwή̙iP}ώNBk>8ծv&҄,¼蓉fۆ7aϝsxh AX(NDM|kcLkʁ/%m =ۛO5mMHVGT<F5mv6=n_[(vku'G.Atݮ~`pOg<%o}i'5K{sOa^9NX~^.tɧzb*c\  Ӊ o+sf@vL58呪.-ݖ%4$ Gŵsֽa$z$%d,$ %HXpN. .hcߥ% :I!<#ot#&Pb~BG  ii⇨y^K k&[&~O)7l:#߲ 9"s ,PrωXRaԱP^!>`/F,@? ;%@56 M &( !X-)ݢi)dݧu% ·]<nccwm t 3HW NP.{$ )(jΉ,h{4 Y'kv y|QP_i9'Ww 7d,?u=fe D1PVS:nXivi1b0;d5 U1!ku[J%a"_fFdcXƱ4as]6vߖxet݌qXS 9v4}]dcs!sŎ)m^?h^Ueu}zb@no/_ ПssaآbX$coS52l)_dcvvWaJIh(RI%Q&C00rΑGca W_iW`_n($;*vع;;;v>Wы?PKMlPKE9@%java/awt/im/InputMethodRequests.classRMO@EQ>N\4)r2$&5F<,e %eW۩<QiS !&||% (h峴 vcBH3=S1l fITS?GZT$" =26Fn WDQ0Nd$=%IGKٌbn`9Z-]TS ز:Î1;h#YͭӶZj,k0k!Ik ~X [[$:Q@>OiʎRBp"co h8ۈ$\ESH?nY4ŽY^lߜCʌ*/rXk*BZK6s{N>?? \l7\ zo4x19.23%PKO@PKE9@(java/awt/im/spi/InputMethodContext.class}N@gE OxMdD&޶K.ngPi{avۙ}|5&|Jdo)#MlԳpI hu2cL1薀jw SL(*J t;sHN-bKd|eUf.su8t2WN*t!V^S0MS!Y+?G>sí&ߌ&}pF1boS=X#*8 hK19 co.s"`muv ؆\h~ \!~PKaz3PKE9@+java/awt/im/spi/InputMethodDescriptor.class}KK1'j}^(l/< =ꡂi ۔MگgwCgy|~%9Pcp>9r|\${Q[iHƩuE(A[08u?Uqdb/=4NcZ=\34/Z:|| TJDC]*? mz"l 2/@RhaD+CpO4qB(MENl2OӀ&zn҂튲CCJh]R=tנ PK#1PKIG@java/awt/image/PKPKE9@&java/awt/image/AffineTransformOp.class[OAlj)rʝ؂R5F[6 !11C;KwAL|gkԇv7sAPĮ5MOnJ*KTtmj:ˮA"0! jVS+Vr0B`ŗiT*fex-u\fŋ-F`,kKM @4zq9uQ0riQ&/ ݗUfթZP*`& !HpxCKfL5Ψgr?xNHcM *Q !sYfnVtuT^|O/J6.Z:uu,d97 -mY˰CCM## XC'MvHt:uS#RE7v+my/ڢ҈*s3V,;C')E>0,6K4JL[e?י,ybw=u6ۯ D} cFZXMSa"b*`@awnC-0n||#.Z0YG 9c-$ðhEW `LTɁ șUϰ[B.ؤ&40Tu1XJb•R]᫰?f\i7SO@h%}&Sk+#ܩ3[]Hcnآ%2Ar/ 9G^ ;p_Qg,R_al,Գġԗm= N@1mdut=7dp< ܠVUzWº(cN0l;pmSatFBqmT#ƫHe?.3vTE兊JP+QьbT=dP#il'RRmIQB]mPK 6PKE9@&java/awt/image/BandedSampleModel.class=OA9ďh"B# `hHL 灿2]A &3w@ ,޳xq%?m8pK i ^r*P%w9ã2XqEQwGK=Ȼ?ѽyPc Dt^z!m{ڹNMVRN MP至h,v8; _鰘qv{@;= zGͨ NtXŚyE fb2Tf0ƫzE,DO/M{n17PK5)z7HPKE9@#java/awt/image/BufferStrategy.class}QN1}UDAԃ1@7 F/Mp]R[-?˓?2NA&י{o|{p}!Oy$i/thnDa(-#G]0aȟX lepڪ' b %_v:~H0T|Qkic2a8P UlDl_%&u}{Ed.E´r$֥;6+g7O2$Nm(S ԌQSki/S=9Gia?vo(y0wdPOUlP,7aa l{)v WRBwPKN|7e}PKƪL!PKE9@"java/awt/image/BufferedImage.classWVGXlm"b1fIfCAIa}_C<<Q9Yʹ9y@U]VUwuu?KBξ~ޯɻCU:mk peTeh$"\U].-lbdͬ/l Mgf&gSDuTtȅ cqanDS:\ 8Χ ji1Zg'Ϧ\%pP+-NϬLV|bY:TrJf'2dXJ+0{ Ω3 ʳR*ǭ&Ԉ=heiNY4hU>$I+J90hp@8"]mS5v@|)+VdUaFQ@}Yc| k,7RJx=U* 1~1c=eWTMl])ZqMie(3^=q/g &p=a7lm`w͐\.ҶF}xw,iA -Q5Ke]ƍm0LcT>04<{}ס-RY\+YS1RN3]' l \"pk0c/j"ho$Yo9O,6]V}5;Eؗa'EUZQe7.=n$8&v|JZ7V5{aYc&-"/2U, ̴?JqZZ~ː`}cG`ZIX}ҢG%yl@S˱kaNdmwS2z05cszdjyo 9ͭM*xq$1\%kGsy;XKfX OՐl+Ɲ(XqvnͪJnmigGzrRJ[LyUylrLtSCb_‘F|WDyE W׺î^.)EV`myY!?;eU R.(4֊mlts^khߡ5Z1vێ,}Z#եN{Zz{4hf7:Fu=WmmFCڠ f|[2?搏|!;Q>鐻P>B!FC>9| "ʗe8:k0^,෎d߹-E5 m3 g&8! (GCpzؤ^o}-˜z0DFq`8wsٕQCt6Uƹ H9yLv]vK.'LQ\I1)fI1!HpY39nrYqsk`q/2&D>y_dȾ%ߵQs~S= 72 y;nv͸W BF9$D9,D>w|*^s1Bqјp v2lV]a.Yȹ½qD8<,PMo0-eF%);{zk#GDП=("B}Bd ҇ᡐAj^s܃u PM3}"_@N SBB3Bj Y#طN'|c!'Bo6=Y# #6ٷEGwRM8? Dˎ:J:&Kk>u\6hȺl}!ePKPKE9@(java/awt/image/BufferedImageFilter.classQMK@}hU(Im3I.=Ki/yKd 7׏>kzEa5" &KcU4Z-RaS/PKe"+PKE9@$java/awt/image/BufferedImageOp.classJ@ThO nDp7ͮ-R+4 S&2uPLPh8=~w;_>: CnBQQe)w>àH^t0'*܈ Uax A:VRGW2x4?l;s2#UiMp9"7%)XVϲ(C-n CQe~gEEUN5kW10|qCQqb v` PKؾ[PKE9@$java/awt/image/ByteLookupTable.classNPEm)E@#8+ƈ:SIƘhttjjA+8(㹥Q<^|{5 &nwE| KCmJ3qgH}7<ưbHW" sYhH3heCvlk 6lý\9Dx3rȃf]1tJ2:rNuE52^:wG1i rcI?:ԕTmA>uTuNh+"B U)R$BБbtבGY YY"GeTbMaSrDˎ1yOge"2ΡPBL*UƴZD[/PK!ݫcPKE9@#java/awt/image/ColorConvertOp.classmOP &Oxҡ2F%5P !` FS,ڥk+_P۲ݺ7s4 !w]kE[4jZU۴նH1L Sţ+i 1#{Kʁ7"0G|N˝:+2 rt­ w ް܆R8cHv`c][(Ь]pvarkNawf4J4nO0A!Z1I9Lo3d0F[`ffwa}# B<1M!xzԏֹXوe(|Mj$]"A[ў'I[h;0m~>eiKl@N/_^䷁B"c9Fx0 XȐzcժǖc1+PK PKE9@java/awt/image/ColorModel.class[SFc;[;!@(%bB2YȲGӦSg]زdu2|B@+Fs+-|( NǫhE!B`tfRZ&3 +گLJJ aq 3ϾWȖfhfqCCq肇 C@·Gk+ԣW:*T?fغȑgy<􍚋fR?XGBYB%KUΗ[mj {!rX:Xff%8}ljV-f/2QGg&+*PRQ:M' h5A`ڍGF3e2^; MmKwQd5tg$0d:W/U3/dx4K-cT!J[xs묄xGXbl=f%n)pdjг&cNfI9c<87V_ pD$ 7A{AN#ᮬN 閣.J(k㳖xҸ0\C< U1|kr}bUtתm=^m{^8{6ݳ#*ùgGɍ;/R]a :os[ y/fUmEW/Ȓ fLnuY%ygڻ|^n5@]>憫pۇ/o./]:|ƩVd|s?PK]BWPKE9@(java/awt/image/ComponentColorModel.classKO@ @<   BHm-.J"Y aD;2)6XQ;3̙wn԰h`X:/㧢z~ <Ng!0Tfq}7ڥJ֑m;󎨷Z|ĐjPW&FmeYqMcǞ`5xs|9Ïfdur_pa635mЍ&>< a-̩~MYE7@P?q= aGrwYE0z]JբSҀb2fw5 ^` 6ڇqL6"GRM2ʣRERiE-ԐV5jjUiR2fb60^Q ZgAf(&d QJȘ"]PK)PKE9@)java/awt/image/ComponentSampleModel.classU[oQõPZ j+ ^ZiՈHӗƇR/}22ιtKh"9;s|3Y~ 8'G+16g V QeF|qejVkZ_ҿʈ1vs+mpB Kv^pf%C|' *;!a+6g ec7DjKyn8M"bwGb.Mbƀ R12ԋ<)C=iUS|sZFm~Q8~0EK\Ml ㊜qR`O`ykȂЏU:'/s`umrv! l\͋lY{S>1X~ úS.⵴9/ 0KU Y*rYHa:]x-c؎Y Dqk#M HY3A~ƭwʙfUяKgW?i oɨXke +7j f :;[hKKֈy7l]-SMkFޓfУpmtj\/p0lx;?KE\}N5sM*œBŠmiC>$ю*74[U~s'm(k*u֨if 34i_ C[s5_y`x4cZvݹ[iU&މaU ETV$1I`$!:FGh|7ir8A_N8Ĕx +i fX̄8>5K s\hB"+*ޥhO|hSv-Ix(R t(t RmYe(4R7Pkk.Ɗ<.Ń1'1 1dENa\FxcFUgPKsPKE9@$java/awt/image/CropImageFilter.class}?OAN叅-<@; % lpeebCg,Sfۗ,Cx+uhУJsxϖN(=s] .+ܶYW5OH1J%dcVf_zZZٹCn>gK=6~m1_Sǖ< p@wG8>8S&RɵTgXoشPK + PKE9@java/awt/image/DataBuffer.classU[SPӤ^"*wi˥PPHgjHaxpRHXZMq79^rܳJ~{I_Mx 'F`Kơ H6EA/F0+~eMr7b 7eT0AJrL 3< yyYifyP]yZJOgSoۉ`TՑ?7\uQUO~ ߁q؁{_u>:p1^jMy\~&܏ ʻ6^oNT# ("`XhMȸ!IIO"a"6܊uTR{Q/CK&S4&؂4&x|uY_Z9T9AϚ]OkU=`*',\kq,J5*ǵ;-eK4Ut/-lK-C[xs:Vg<1z׍ lZ#3H?& íY%lε9۶)΍K'`2^{-ͱ!O35]ܳ_=?p)Ql]?PK2zPKE9@$java/awt/image/DataBufferFloat.classn@3v& 4Mz#\T.p*`d)B@x5-bErR,`Ăg+JK7ϟ~8Y^ʎtEfw\y) ϡ} }'x&`N JmUr(_6eGӈ'T`w14~8OCVNH`E2[mkiq.)Po--5\7VpuӢ޲CU ͠ʖ0еE tBvAḱjƖcj\XTs=Ws ͛F-LS܆VҬv͜[ έK'5q2^{-oS!25ܵ_=?p)Ql]{qPKl-PKE9@"java/awt/image/DataBufferInt.class[OAgvۥ B)-7A$iƒ/^bMOKlKO&>P3njn;6??8^A,eS~IQW^+ȣ^'2+Q/Jz8e*Czm[hE=n=UyQVLvNdiStEjMe@!!MLwz@{i\k낂 ޥn SpF|؆auGuFu׶xgMd13,g+<-x-{G?0E0%2J"m)`ר;molP۶h%. ]Ʉ'+mbh T[<_Ujڬ7h.kXwd"} dilwZ-1Ɲ#Ng饻ó^ ccdȓ m {G.0Ja kPKԍ PKE9@$java/awt/image/DataBufferShort.classn@3v& 4Mz#\T.p*7YQ7^M˴5"Ny)BbP3%u%{_A,/eG~M:Q_k驊axp BY4巏xy5pP2a~hr+hޏ*({ޑ#۠Gfw\y) ϡ} 0 x&`N JmTr(_6eGӈˑ'T`w14 GzCVNH`E2[mkiq.)Po--5\7VpuӢޱCU ͠ʖ0еE tB?΃ t/-V-7ռ>z7-l[C3Hߧ íY%`9l^ŕ[Ndg٥keZ8ߦCehk<;ki>z~4=ܝR Fp) ?PK\PKE9@%java/awt/image/DataBufferUShort.classN@3vbR. UMaM/MJ-0dR]J]PUό'VK78A*odS~aG^w2 ]؁Me/n&uqYPB 9 3uu}kSsDI; ,z},P&hǗ5au\z#gr 9G >0yWqA|(WjSo2I戧wm A`s=i!T,:.YraۂžeY 3?\],JR{!jޠ>mMB-ifR4R[BC3KcвmOV4t/)UV-K㗧ռ:6j-WU3H?F5-%Y%᝝+9աK'ҳmb0ޘ{-#!35#l˯w}h(Q:\J/Ďf<PK POPKE9@%java/awt/image/DirectColorModel.classR[OA>Ri ʭDۊP%JI1&2) n]k|'( 5.0͜33_d.5-nl:+3ܲm΁}Ƭ{Q㒝K"~f6Mw@$W?&,c(!1˹jwE VT*5yqj6ٛ)sSHVmZ1^sM [Y#@*eC.´t'[^^I'rFO 9ۣ.%<]ty2Tw'ܪ.q0겲hQ K؀h/9z*y~sr@ۗ9~] hX!`7YmOƧE |MB7$;5T 32;L&?*,`=GQ8Gp  $@8~@;5ƙg̃'xt\%i%CZJZBkGQ D!R_PuCuB~yT'"= B_<",)O/kh[p ':q yŜ,/Ɂl[\YXTl۸J.),}ű+ˑR X>L_S7_Yq :WO޹ּGVoV}/x}pd=8|TاbPKR4;PKE9@(java/awt/image/FilteredImageSource.classn@q.JhB* HtMP%P[u$>MJ xBddwHՎ4*Ov"WdbX+Nu؂y , h0G!l \O%=x!lhtc:ȞMءK{{BYilګU:;S{-s3ø7I %~ae}<1.&")y| U%Vq:j,ljip  qs ?f1)Û2Q)y>b#A8PKq倩PKE9@"java/awt/image/ImageConsumer.class[o0Ǐ٥meܧ" B& $aOn2xnY%ǿb?~~g/SS1ߠ,fTV-X%s-3C`'HiDs~f#e(̉е\6G iHrpk ؀q{% qgƤux̌;7/Lݼ:kub}lND 6Z<q0VuvS&xeuyjSI+!X@|9UѲ{F c#0 #*̡oS(kv6|84j,Q$Brct)Wsӱ0tпb [%0ٲ) -1d=SmN~X 3yY >ev8W 7DRq_&u| وhs ݇I! %hcop+ Ҹ:`&kL@~53:,LmZ(3+Y `",[ru=%A:x0/%r0HbĢ K$f{JH_$LbNJ,)FHC{TLe I٧ TEDQJzLxw=FoBDIY>XjBP {S{{w [;;rOPK+yPKE9@"java/awt/image/ImageObserver.classU;O0;I*.Dbei ) ŪZiY\ |>l 0"r??]XC8ɕkODLh*\@LG&G35.*ABj/J2[uqgiyJ\hj܆?UBvZP}(0) M&Jui Bì}$K9$L#Mbӌb;B72Y7M[meMޱK޳HRM;PK9dPKE9@"java/awt/image/ImageProducer.classONA浸p&6BbB"AÁ۰ۮagtf̓GwxxU餪{`N E2)GF'E&@p{PlJuƱ#DEΆпu,x, 0ù3Qu/}wjƯn!7`*!X';~Ve.LSaݯbC S/{рyt\XAPKt_HPKE9@'java/awt/image/ImagingOpException.classNMK@}&jEoK`ěTKI6%n˓ggכ|{p~0xPs's2_ ɮgϩY.Mre6 {'Oذ=%l?V"4ڛNGha5tnF_TWjkB/)SOTnY ɿVGB -!D㲮R}Nu{`$-t,ՓbE+ &`k@.PK`!Q}PKE9@$java/awt/image/IndexColorModel.classUnQg@)(^zj-[4J$Ԙ~q(#t/g o`R~̾3nNF%inuR-&=|̊i)ͥi6qA{ x?}$4i@ҜՌ7IP mKK#oؔ%TS7L%,F%VP%VRѹeT5by߼0fA6':moE>6<{e*x{68!^  !ăx]aP <;'~\V/Qq]eŶwH|rM iF`VǞB M ).l̸Hۘuօ9m]l#EwƼ)9F`\H¦[]Xre=tǕ6{$V۞܇ǮzKKܹ4ODPKWº- PKE9@java/awt/image/Kernel.classN@) RQn4n0DbKX eRԒԪ/BW&.|xi4!]sm1ϼ_|h $bXrk7{|ilۙ>Oz4nPd|:r z.O]+dN,pOqL#P5c;g3ri1hC vc(gl ip-SFirAu"P­#,w=OU_p5y,ёJg/mRu:PtA6I6;9) ,aՀ+SQ""0T#]AަtˡnNU#"jX&SK`5"j3+!YQտ[4 6jZ,1C2l/PKIGPKE9@java/awt/image/LookupOp.classn@ushӔ6=͡)-&B2BHZ!q$ׂؑ+$.x 1޸vl @q( څV־:euynY_F?Ê sr1am~\$D8nbtSw3<-C5 NnvuSHj气n0n^°ZZqٺ;&#g} _W)B2ge8zr%esUl5>pD>N4I5V-òPZ=fai0lFdVgt:St,:!+~UژiKr׶#XrAƠJ b[=:[-n+5b=&;b S)Ao_J :{Ҍ+3Om{khKݍ^D]F HЀ$ӇezhX =o* ְ.(6&-*[~i 2BW PچGMz H3J_#P %mNmiB-i}[Sˈp[HztwUeV?j_(E<}zPZNВsDK|Q;zPK ,pPKE9@ java/awt/image/LookupTable.classN@ϔ(Ņn5n4iDÆՀ)}(7L\>Δs|s|{p,_p?BEfC~ʐL/f: J8prM-WC'cϣO>^wsZ䄁YyJɆ"%&S8{/ f#CO"b(6A7huiȽU/Pvױah˦AuRw_Q|Bvmо `ࠊQeQ] xDY CdHdIz6 a˨_PK'?PKE9@&java/awt/image/MemoryImageSource.classT]S@/ --PP [d0d䁎.%L34B{=63v 'jeߤ}2c!C@;24wpB8-*&[MY!0SՍU˰MDbAUGDWq hi8qۆnҷwHlX:{QXƞk 8-}!2E,XxN,kэV9v%_ӎ^65ǵWY[\LwyV5'UT*A A{@{Wd<X,3hҪeVS6Czu|<#BY܁q2Ŗ8q-khAϺ)B9zhӘ'V]uan#g[/;۴BzTkhk50 ߟUv-5 a_uɅ!O5lGh(1<耇\=$ u R8$`(]o8Az1icHN.`[ !2zi&n6$J6ĕaߕ+{$@c X+]\ԊG'E%b^-r\Z@m)7}jlBƇi%)d?eI&/wqKTܕDX^8,x:kp&x\ڸ(W.YF.t DF)8jLܼQ< JS'sΙ:A 'Z%1U WPv6\h,ֽKen.ʡ0d7^uDD6b{ I,|'J ~0oq`{G$ K%&eH+VLZihT5NDIw=59IMJgoqɚU^Y J` 5$mB%uB+2:Fh䤌PmobXc dЅ1AuljX3w%Jx* e_'r'?!~a?,c:!wy?Ջ-C݈ݠ&`1 5 mί0K ' v|=Sv)KIpCa&V娰߉3`HWOyK? Z+0YjQy0B\6+ڬj:nh)k0ƻRH\>Pu-P5)HJ8x=e3[-H-kXP qF3g2fNN% C ݪT!Q!S~BBB1 `P;05H43e6鎢gK~ c&Y'+{k~Fguo~)0'++ #z8:_PKċɷPKE9@!java/awt/image/PixelGrabber.classV[OA> "r R (VJ|ٖIlvC>蓉m%&sf||̜I`?+ZdD$7x1h%n$#oWpׇ%kJ4F #Iwӑ"S:;@'|>BVVY9&8t[7_MM9WP54]D/>s`v /s7s԰`Cu&P3T23slXPK$y'PKE9@#java/awt/image/RGBImageFilter.classR[OA=_FEExm}Jb0@٤yږlwv ,}22Բy9g|ם_{e=Tgo+*)4r `Dѡ:݉8ٍU(JNTDesj k(r5L f:RoFJP fq?D{fOz(X=;"k<V>4'j_$`APмXYum=~c[}B3m\s9l8xp : GaQ&}ϴeGIl{vvLN"*^-br~5 dP; LZT'3&Y3J%LcqɬuW5^) c=gqf4kf$طՔNJ0@M&\\ZT*$$bAM+u3WY T)/]9d 3=VcƎ7UힳOvULQ?|?ؕ`(rwÑH5^*J@.1`eXDRyJV !ĹVc4W8/M!S>Kd83Sտ7ӣrTi ܤO~F37#gq%>Q,_c k %_, v8>dza m#oxm3o@ m[!mv~Cqu@'thՏb_~JOz( ^A9JAJ8T !pu~ʩel})[ >=Cf"1`[OT?LZTk͢jyPO=OyW>9΄Z+5ksZ5kT,7ʍ'zwZ2 fUp7='-2n{\ݯW]m[RKPQ^ U7Q5mAnlvܶjPK)PKE9@*java/awt/image/RasterFormatException.class1O0ӤP(B 6TĂ15X(?8 ; -) Nh[|SF$]Z;U@Liُo`&^"$w3U]ͥy)zɩUV-Iس~eH+I8߰ N m֘S+O@֝Oֱ"t`PKPKE9@java/awt/image/RasterOp.classN@AiDd/P/6i1 W ޫ5cEW+b?f\da~@s;HA ۊ4r7pDouaglT.GN- f5K4)?(̈́vmUG :m6QcgnXr1S0aq҄S38M8C#%CGX -.2_#6 ?~!2myPK? PKE9@)java/awt/image/ReplicateScaleFilter.classPN@=my5taխ D .\MC %-W&.?x=>Ι9v 1 |]9}ދI(E'ࡸk313{bo4J({z@cfqK,c~#C$\Yt%2ANp,wh=c 0PKVJPKE9@ java/awt/image/SampleModel.classYSG{]̕"+GL2rdXaki]:|TT!*Cf%4{~]?A#pHoU5Jf"gT/*Y RYyf$@2e*iU=0jMֹ]Ʊ=fzC; c05 a&0U3OZբ =Ѱh[t첅^-{$/yM g Ӱz°-J6|O ^2at.Vi.ީ7]2m:QŬ5WĂun Nk-+ƶ1Z=uBƄX O)LLq;yEOdj#O4+4KiF44MM44CMtuEN;aB5,"d9SVѓ^Jݰ=8I =:S3THXbj=&Υ2mCei\ 4^m>[L6>Fjʔ_V|ALۨgThy TU-*Ψ$% UHZ$'K?;? > 00b`Mc6jXG1Яn-/cL򇋼|T5I$YdY6,1, |Yǰds/2 q,|fWO݃NOTEO;!/63fKR,&c1Jr_x!$EHʬա3+,FTR#CS-%umhjua=/R6Sz_{pxΖ\\.3 ؚ3Al`#E4 #cױ !??P#']Cd]AZx~ ;K&rD.%d"_ED#xǐq7$cxlwT$],mŐݶ=zCcN4gHϩ0LnuR<4d44`{3v 1,ǽa*g )I'<8b`f\3(͠S8>wh"Эxu=-ǔ3mHaAϽ]p(3 ѨҐSr2T*)@y:b V!tuQ"DCV@VQDy@oS61Ա8/P9ʱЊT)VVuۿPK7ӈcPKE9@1java/awt/image/SinglePixelPackedSampleModel.classTnA/`; [8";MC i{k(ߔCrC> z WB7 [@suZc97j6_}EwbΛfG!L`xy=&3  StAb1QovĜkZYLp7'"s6#=Pg)(s_-y吀Qw0ft.! uIZee FȬXR>b?sO{N[wX Mj#v{YCb&*Me閕ݣ2ݧE6{&D)N5!3cR DDJhS/:su_2̔.ӆ#g+%?tQpbbGrƬf)\kwE X,'VF/&mf0? Ƿ8 |C0 de aMeH+VHZ)Қ4RMYD;ҋrZRCCP0 ǐ  aAGƕF&4RE %|Бl˰җ}.}u| 2#gE eۂ O:ԫ~Jºs 6d 7b.5!ϴ+P&|nЅL7a?=]V;= ɶ=@3;D']{R0+ Fx&(#?x$<uE6ų/PKZPKE9@!java/awt/image/TileObserver.class;o>#Nv&FIJDT̜TԢ"vFļt}FЂĒTF 4#‹2KrRRRRRS蓉Rч;9ޙ{"%ϲ/{G%PLKcF(s]ApD/G>9;Z&bXl~(/{ԋ `|nSRϛny@QNȾ> ZV&PjqF}&1lQNtyH2lE?``TcAG.fZ6J4dAG=.9S%\]&% (.ϲF<2>t㮬X(tmu \MYtHl&]DD6Q&;ܑ.n/՛ 0x-ĕpDR-90ar( ^H"^BE 1 uQ#8|2Y\{c:> LLw 6帖řX;=ut3tR_3{&=`G;=wPK6MIPKE9@#java/awt/image/WritableRaster.class[OAYJ ~RQ,YYO&>Q3geiKI;3|ߙÆ~)x!vl]X)볗OCڞ nB!j !`gmo!X+ٴN>9p/O7F-R!pby֫6ĞgeQd,LWBxw~+-m=ٶ\[d;Ⅴݚ ˝@0FEM"4}rwxU~"[JqTu2м #GH&2$ flV]]oV̡} E0PxuY/W&<׎8$:a%P/Rw+ܩi:i\x~$PU D(hgEN;+zVôf6B[-,}s|F*:~%VF%0u%Ƣ.$h>*J <=wDږi\}v +LVNGGQ~~@wp~e @3o)Q^B#4Q6kR[:Pk%~4(V/@~]TEQM]Э.]kصV.\&2edA.]Lrɻ݅dE{/'Xo=r~~д1bIZt! ȑ4WN_1_|0̷^0-7TJ;=$6;Qx5+Ži l"Ʀ=a㌝ɠ1Azoת U߭UqVY0M' ~Ecؼ wX%MxB{>Au) ϴ`>H0|Cɂx`U-蜘Y$Mܡt\K_Iw(3s /PKՒ PKE9@*java/awt/image/WritableRenderedImage.classmOK@Vkjն6x\ x*B@(i 1%M`gZMxV<ٲj tp$+jF]=V4/kj^֩H_H-&mmb'ޜ.o;qЃ:V7iu Cncl]wPK睈 #PKIG@java/awt/image/renderable/PKPKE9@>java/awt/image/renderable/ContextualRenderedImageFactory.classRNA _e 'nH0$D4 T~OQf"fz2WU=l DJdd/BH7IJS*Ö@ɡcuo@z -I IK^vU[ؑF&dcksM!ٺ\rtʲ1USގC2kך( *HJ3 "Z eq*H l['r8'RNXXE(f㜮6s$;gϱ{=`< .]<@C1B |PKDBPKE9@.java/awt/image/renderable/ParameterBlock.classVF1$ dL 'v@6F(V,>SW]}>TWdec]`F3߳gF-PS ߪgTmi5K=24@S֬a6JAm햲Vk)&p,]5<8dmH;2u6krD*i譶jw-S((1VSC] 9{H Y24$ 3 ax]ok/GʱM8T?>IDGZ>)9 ~O|?`x6qacr1gqHjJ4%)ӔOSjH0I4\/ Fyy Q?Cҟl$)|T|g9 J<$AdڙBhka- e 0LYlI,Tƌt[঻$n6÷WT$/yf||L$cePƵHƒ˸-q=2V edF2r.cUc.2օ!Ex1@-6+|=U 'B,*| W$f˽oKښ핐v/}ђHGK0ڡHrWBڃH}-a$-GoB$-|s>cmw;q#7?8|AoӏPKPKE9@-java/awt/image/renderable/RenderContext.classmoAg˓"Z(OU{cB0F#I~n{QX~?qv}q{3'4kn5g}eDٴc,/nʹGEQ}PbRgģc0T'%dk ?(͑@SI oWGʎe W35e&IYgVAz&5R63$ aze4dlWj_‰Oe!B7ϥ{0L34jܪW.c G]0,Z(7˒jtiMf !';HrkƮ89)vrEɢs5ȂUš x8K1_˼:!jY޽xI洼HrV/~ȯ#z+}Oo5 M?7i责-@wi k`n#M1BPo Whum!-<0 P rL#㞵GѦ0s<5)zchv^YiVr"yd 6T .`ih $F 2Vj@4 DXGv}C"7_G;jӃPK}g:PKE9@7java/awt/image/renderable/RenderableImageProducer.class[OAg{R[,P.qE/5Ԙ4j*ķi;!?/>C.粿~ 1OXԸj$K-Cv&WQaOE6}==S@PM}"8!\ygL-m_Lsm}YD7JGى•pԕ0Rm=1<ZE~̚c̮lMn wMݙ7IX>{A8(-KE\PryӦCC kˏǦ#נC_S ͥ?[ &>u|fɗ*0XP?cy.ײ9 w;Jx6a` lo*`WKXVP*Shla896p+A#nv&FIJD"}Ғ A,\ 9? ?/58'1)5ATa@pIQf^f#Wp~iQr[fN*#?N=j @ t&#  'dbPK<PKE9@java/awt/peer/CanvasPeer.class;o>#Nv&FIJD"}ļ A,\ '? ?/5+8(9-3'aHP7#32#;dbPK^(uPKE9@(java/awt/peer/CheckboxMenuItemPeer.class;o>#nv&FIJD"} ԼRϒ ; #X]Nb^RVjr ;#nd] ũ%%% ,Qa \Eɩn9@1Ilv  Ĭ@2-gg8$PKHiQPKE9@ java/awt/peer/CheckboxPeer.class;o>#~v&FIJD"} A,\ +? ?/5 8f{Q~iP\ f#PObRj#(T!̼tĒTF(Wp~iQr[fPLz dd`bVo>ag` Ls3ex$PKopPKE9@java/awt/peer/ChoicePeer.class]Oˊ11E`8uO ,(Hf"cGqAЩtWUr_LS{}ֱ\ӝM^UFK|{NB@ylv9U˻tEofA =s3{fB-*6F$8ҞR#+Db˿Z-K@Oߋ+gPKДsPKE9@!java/awt/peer/ComponentPeer.classVi[F` !$44Pڈq`ˉ.h݃.b/ZuW"?tv$ 4O~}ܝ] w +Wq)\ʲɐq Z0IR{7*Nuu_o8[n}˵`,C0eA07ƚS8 V[N0! FV٬4cru6n1iܨkrβ`8XXEQp찈cvM'aɔ/E"-2\^ڵ`ca\uEKO-Zp6:zjz #ղkѤzt WKؘ)Ok7ck\7*5)br-sRmE@"\MQz{۽5 RYUl]X+Kk(') X,3 S_}4s+yګۏ|AӯHja< Ddcᄊ9U$񌱹i&<^cq=(gԐdL#TTK/B_T6xlt M+un:L k>Dt2MDHMR^hPCQj&ݦ_REtySl(VOETmK؜a5wX<\́tJ{Xx@:HcBWd(t:bS詙DTT&qn(2#ڟGtQ62QE-_5bo",{ gyW659nX,gѻ[u.I}SIAia::^ Y6:2S C@Y![2.ڡFAEa1dRxŮ"tGvx'r] SDy* {{hbaWoTƿ7DŽ_3e oW`p-ūda5̏ /3 oa ۄ;K~-GŸglLϲq<#N!tw WPKw"! PKE9@!java/awt/peer/ContainerPeer.classmJ@ƿژ֚h/z`iod[nH6IBk\.E%%%sZ6\-0 ea){.a2B\z#Lgk°U3~2"DrvfW&Wj!tɴ;GB%NO,m8#ElS| Q|Պ|IΑ,*8Fsy`qyq3ϸ͓~{8PKPKE9@java/awt/peer/DesktopPeer.classuPMO@}[KD&=&\hH`$zV,f̓?eVTy{{yC'S%3i"Q`އ+Ь,hBFF h^VlN6[9%m kJ!U0}!3 NVX`(vp&<&24kMm0TSRi,\tTz 4<'s%EA@O|t"X 9OXA<Ϊg'*#Q溱\6#p\ƶPK-PKE9@java/awt/peer/DialogPeer.class;o>#^v&FIJD"}Ĝ A,\'<3/%8$(8*1)'E#J3(YA\Rn R_Z RďpH5NFf f .v8" qPK'ePKE9@"java/awt/peer/FileDialogPeer.class;o>#>v&FIJD"}̜TĜ A"'1/]?)+5AUB#OqjKfPe~Q%#„̼tk0Fv2u PV^bn*." Օ*_Z .h=> Wf/8@\ @c$/PKɹPKE9@java/awt/peer/FontPeer.class;o>#vv&FIJD"} A,\_Zꖙ SR @ PK2_oPKE9@java/awt/peer/FramePeer.classmN0t x$K f4f):0<>e<-h/z|ŵRE 6:xFX)p:0Yϗr]1 ~[T!C"0j-ds\fԃ#6Җ9~H!-KVj+EZipUCAS~`E Rm<l^Yp_yP0V6H*KvEyU,H]xc`H!Q.Ap]|PKPKE9@java/awt/peer/LabelPeer.classU @ Eoc|F\uc+K(-T6~%f\(.&9`G} B}l#B 3m`}H9 ueQ°n9gIlrA Jo~ebKŹxdL}=&.,O {"Ѐl%v7PKhSPKE9@#java/awt/peer/LightweightPeer.class;o>#Nv&F٬IJD"}T302$'e&312Hjt-Kkcd /-JNuIedA3Uh#32#;dbPK'AxPKE9@java/awt/peer/ListPeer.classUQMO@E|ȇ(r-xd4&M 4ᠧBG6mAOGgEо{;Mg>tw̉glB Z\8%3 zwQG.cpڣZ/K\ EaȠ0[Sl5TRm*2?k瞇(S!NW' ``"ӆ2wLeP WݐZSN0x+FJDc(@zntj+^JU`m;k34c =S`A >+Px5uhhl‘Ɩc86z]x/靃_PKpW2PKE9@java/awt/peer/MenuBarPeer.class;o>#>v&FɬIJD"}ԼRĢ A,\ 9? ?/5;1%#5$  cd`*H@X, )ҢT̜Tܤ2Ff fHvc947PH21PK%0lPKE9@%java/awt/peer/MenuComponentPeer.class;o>#nv&FIJD"}ԼR܂Լ; #XQNb^RVjr #{JfqA~q*#f_Z▟ Is%euaآ421,gg02pPKsױPKE9@ java/awt/peer/MenuItemPeer.classeO=@}Z\ADA fp̛z0D[DYbsNٜ~,R(xv1OنxkP%|6Q ju2*gN|C֤SB7..lAEv2/XE~DB N+ KhPK*UPKE9@java/awt/peer/MenuPeer.class;o>#~v&FIJD"}Լ A,\ ó$5=1%WScTZXXdOÍc p%e22œ26 fNv{947P H21PKʆYhPKE9@!java/awt/peer/MouseInfoPeer.classU @G6az$uB!3kDfŸ|=@D==_%F&:Y"7j*Xne]2_2Pay$"LR yuYIY$JV[zOyr Vi=H.bb?  }eևmhbPPKPKE9@java/awt/peer/PanelPeer.class;o>#Nv&FIJD"ļԜ A,\ 9?$13/+8(9-3'nHP3#32#;dbPK$uPKE9@!java/awt/peer/PopupMenuPeer.class;o>#nv&FIJD"Լ A '1/]?)+5A UL#KqF~9#\kYj^f#Wp~iQr[fN*#]z @BF  'dbPK &ߍPKE9@java/awt/peer/RobotPeer.classMOAN0iPJ r"JrUI1_(X>xٝ VfDuVn ~ ]Sɷev?_Ѣ*ֆt&0\RS\)^i.cYrێ)ن ]gQaU7ɭcLIꍡ;%onbW3m wFmsK_#ЇM`0Dp}}qbPK=ePKE9@"java/awt/peer/ScrollPanePeer.classUPJ@=SmSk>Vn u%4 X,drI&L4~%Pbps7k, .K.#7"mHK ̺#m=%)`$pϻڒkiSUh=Q?)qJ9T5*Xp-^t yMTʲ=[c NmV6nil)׆իvb9|{0F{#L:#Nv&FIJD"ܐ A"'1/]?)+5?=39?/8*ALCnKfnj^qf~5#Wp~iQr[fP0z l  b`L PKC`PKE9@ java/awt/peer/TextAreaPeer.classmPJ@=SI[[7nۍ]"*#x SINi.?JIbpgr>>aCKx.W26,LxG/ܐaS`PgRÜ-pWuQeIJ*O^+eW8ExT9*3;3Dcn+ cFӟ bkN'^oU@Gf]Ce&e=GlLXTƢz3kuv*Tm;us};8}vna PK}PKE9@%java/awt/peer/TextComponentPeer.classmQMO@E (rR.6I &% 5-t%em( K{ov iAAsʙ!F3.T;BR ͠h.G`Ce.ƦtC &QgNL mw[]rjU/dc\e]It&'Qv[)} aPvW%'!ڨf*D=~:4-= (HAi("NAejHFo=PU@Y/L! mJH_2t<҂=݇  b 5u86xpF 韂_PKTvedPKE9@!java/awt/peer/TextFieldPeer.classeAO1_YAWW$&I02Bɶݔ2NqcPKs%||qNl>S@hȤYϳ>BU?X[CT ?RF鍞 t{O4[u蕜OFuM1]d)S\R>P؍Ki2:݆I8@HF8G}Qhzh+Kh}PK;TPKE9@ java/awt/peer/TrayIconPeer.classOn0<&) a/ UH@ ) ;EЏСCNwr$xO:D]Vt!qU8PZɆW=]޷jecP!<ԃ8!BFccxPK-eGPKE9@java/awt/peer/WindowPeer.classUQMO1"ȗ'oxqD 5p+ݲ),Jyݍ5ou^|~ (+uָ1ڝ #>(hjDeN+Ό5wJ*$יJJZ݌j)dH`opLKK['F[KIʃy&i ?QFbk ~l ph;9)ñ˸JPF([p4Z'KnEs_A#ȋcxCCV[95Rlҍ/ްsw"tuT33%ƌepB T-A1-6iU;x]kûoPKS_PKIG@java/awt/print/PKPKE9@java/awt/print/Book.classRN@= 1I3OޯM,*TJHb? C0$vS] E?Uqg b^Ͻ̹o50q/,3z7ϻ5$BGmy#[k?m)IH}v\'BHTwRf,LL+u? %:wwt >η^OJT튤_E{~Wu-^ žC*§i"j BcNT[_{ȅ.+vu $Fjvfμ;%ueZ}x^SL xOő8N>!ȉ,)} ٰa!Pgq`^7bT"S(0B#2WrYA1d*+]rD h$~x3ӭ`5B~X z!KY CE+*ְ>I5Wa 1m>g i߷0vZ } ؍zk!P˨o3g2Q?y\Ng|GGO: )x#yeeI,s/bBvQ`04#U[t#+S\Iobr"YIAVJ"YMA&+)ȵDr5Hߐ^u4_E`Pqk=cmfү(<~ Vt;|PKAAPKE9@java/awt/print/Printable.classmPMO@}@9ɫ^l•! nlͲ?E1潷3~8nw.7qjܕI*_ [w٩ڋegy'tY77NJe[K`)ja0/]8ڏVM2f?ITnbr#_ tJ:#5E薋=ƺ$Uj r t-7A-S+_7gPK7CNPKE9@*java/awt/print/PrinterAbortException.classOJ@jk R=M*7q+1)[~%/Vp3`^ "&jUƢiK&FEX#"P Ey'#4BB^SoEKB7)3V/}s6$l+e.I<2 ]\ckJFLgJ/Yv+^1.f&^8b e+Jlk˼[6۪\w7PK>qPKE9@%java/awt/print/PrinterException.classOMK@}j^R"z "TzƥMYտIgAA|73|p4F@ؿ '͌6v(s!gVU:FHHz}5ѩʞ1!#Nv&FIJD̼Z^X\ V\ZUꕟ $5#Wp~iQr[fN*#%z l  b`L PK4݃PKE9@'java/awt/print/PrinterIOException.classOJ@&jm7)^R)FIŋ(Am\t&eV?KO?ߦAVü7f~|CоGJMtaQD \|۷P>P20*fRz>=ʮx жkJ~  %gVMܪV=6O%4BH3!V2D(Cc;v mo`7e }Wo /he` ԀeT5NXE朧GF#jAlY PKl0LPKE9@java/awt/print/PrinterJob.classT]SP[ XK(TDDSD8(38U6`ArܻIښTC6sݽOX 1>-^dauY#nv&FIJDļb}ǂϼ̒Ĝ̪"vFļt}F̲ĒTFq |"X/k0FLA X Y"JR+JlgbTp~iQr[f(1 gꁌacd`d`f&Y@gg02pPKPmPKE9@java/beans/BeanDescriptor.classRMO@--(V(m` ƋW@KBJO&(-`o s0ۂ{aSv9 aGLhoC)=385W3{[=kK-sYf˿yd0cÂ͐)JO\ m\v$JkHuft'CIDHP-0v2l%GM}7u?߀2]Pm%Nqn G503f*~}%MГC}&U0)L~NA3Қ%(cjL@ZB%ꗩ5O!Uʠ21jqTGlĄ2W*91,bibMt:'~;Vc;jª>}PKC:PKE9@java/beans/BeanInfo.class}RMO@D@r.4iHY%uKyӅ 㥓7}2°E 5Sz_0lHȁEP{#z[כcTF V+(OԚ.'JyV){}L9 G =O}Q35j™~2.PKmYuPKE9@java/beans/Beans.classT]OA=j )"E)&>۴uȲN AL|wnM:sgsw~0Kn{z#vkq/UEU1H[]h&{wDQ$ч~ᢴQ"c^Xѩr넻R[1Az[`HՄ:=(gx)u|;BÐ(˚Uåz`.іdĐ'"3 Hsm%"LUtpʕv-\tUUԕtt6 F:Rb ̑}F1L 0ޥ+@UVJjo7daWW[b%͒F e+Q aaHzorKYAjO=BD^ۀ)O(XT<#0:%Níi5/@%ɢG843rqq 8М9! j`G [BD}1c0 ccM`6ޙ"+ij0D0&“~[|K!|/Z/m.>m->y%bS9¬X9"JԲ/%;mx#&73>|k\>̥9?1[j},XbsgQ PK~#XPKE9@&java/beans/ConstructorProperties.classN0?JO1 ,DbeBHHNԮR_t`gﻳ?_p!p5KOI.-SgȚY-YSԙNg:;ͭ8ӟh.e^dcgZ)mJ/*g袶}e8JԜU9m׃ڇ#v&FѬIJDļb}̪"vFTNb^RVjr #dbJJ@Q~AjQIsP&'$5/AM,쪬5dRsRqYZOj&#Fp%e22#ܭR@o21982@3$7PKu~JPKE9@+java/beans/DefaultPersistenceDelegate.classQN@=S ((/]XUwFMDWDM0l\MC`te𣌷TL>s=,a1l ;*t▏s)t(C#/"}nD6t !w 4 f` oD̖EܑJ==͝ 6;24 6t\0TR+#cG ̅7q' *na(ʍv%8eMb(t#3렗EeΡ(g^0L\|XEb)PS>e/r-&7@J2hncT8fXc-~iXQRH1>PKq=g\PKE9@java/beans/DesignMode.classMOM@-Z_E$^4qu"MR.?K{zy3|7 z,?\i?Z&*bW)W>_07&Y2dgR%Sw)m2>D f_˛R%Xy'2ialutdeE,dJ\7N]PEh_ 7t]PKcPKE9@java/beans/Encoder.class[s@-JVZ>K!e};0[3>Pg I <&s6??38B΀Q,D2nRky?bK`[=#Z24la tnwр :0u۠%\{ƌ;JzX!CCM_&Mx""|%D 6vmq H/G`f3?0(^3 ?unR`IE݉@Ip>[R::ϸ%'(ȞJ9cO3%-_ENlLq<On.]sl@}isWb|6h~cv>c̿.¡.={+t, x@r,up'Pn۰k~MܱV(x'dYR˔OERȞ1Œzj^B{ VQ*>B9*k>zꪎz$wіK^ZPhhl]e)ݺ6@¿'(R73}23lA5 jQkP}1bxExѤV}:"qh9;2Q]ݵFv öpaAuY? ShV/r@ cwY "p9 HzA7,?oѶ,阑y@!2*>(,}I;'675Ƕ|bΨ@]o;& jaQ O6EŐ#zߧcZF8J$K ?餝`6Vu>.y_T!+*O6;*Ȗ+~oT5}ʸ>uc &-q=8;n}?ƁK!,H5!ﰗ<)a_ $~p $>7H}EA+Q Wqv`%eG#C)C6FOK"6Y,IJ1Zt=cK MV$m<-A 1l*egݖ@GN.*p*F[U 4^ ~"MtWVV.^J%'Ҷɬ]K}Y'0u,wUI&P'kg͚9oaz (s5M3j fb̏:M)Α>a& )̑6q"`Q 3M08)8L]( |C|@3^MeZ}- x'13)m i-I7=} :^;}pw` e߬Csa:=5B4̸:cB,̹:yXYEaܯwz9G-8G ,՜ <:co7O>Ę_PK tt_PKE9@"java/beans/ExceptionListener.class;o>#Nv&FIJDļb}׊Ԃ<Լ"vFļt}FTʐ(uؔ}V4yg`8pV7 ?v&&8:ŷY&Ϝ'01d9d8DLcF0ŬMq<:ÎuXkcN^#?::iIlqK +X>~[+臅ZaM?PK'-vPKE9@"java/beans/FeatureDescriptor.class]OAϴ_T)C Dh /E&5l;!fvBLggkmM:3{ϙ/x )[2%9})Hȫ Z{%)<#o4oB29X$6ؕ;2H Xk}jvsLk TJ W+:b4ƕl]X *marÇb8+T+4d;c~*(NәR'Թ\Rń<`[*{Ks :Sw|0`Xk;Ą`t8(7`ℙh 9L\4UhM;Myjt]vlW%f<7< _O8};}!Y\*Xe\s~p fU6C(Nb!a $BY* (Zei#q_VemNPQ6`sz ^]@Un-*k(_8fG:eIh&^֝]xE lGy}z-oqh7 Q_!SQARPK-D RPKE9@+java/beans/IndexedPropertyChangeEvent.classPNAf"##0\&č`0%k?yd={g<8μ=`=a{ &ܖnWJ?ۓI)7BqF,_T:w^WMiZue HmZW^oҿ$l#-;fwFO?V偉Բ/!wJtL!Փv$7Mow䙣}-ԋ1#1ɕvRZ2QI<2kK,d1y By-b-X,8ɘɫ2!yVuPK QPKE9@*java/beans/IndexedPropertyDescriptor.classU]oAC)"Zmԭ>HǬ8;4/铉 ]>vA;9읙_`v-HjQ/쌵 ˄<GI!dB u=.vJ uש6^69tiG/֕  lxQG`;=g:ԵVo4 CR{ms"Jw{DW~2)OxԘO5ğRXqEˑfȏjw/q/DS!Ȩ}Wgfxf}_죋g}0ar쐨-%Z*m~4kv9;yhGsUǂKv,IJK4ӥ~O8%Wtkxa=[/ ,%qip 28cE! !? ` )M|˰I-gu݂l LYnj݈-ho٬}e SdUt s&FI1F n8l9ȔӶ2ڲC[vhFYD~»U }L35D_G>>\]3ؕiؾF`uU [W[d˗!+PK:clPKE9@'java/beans/IntrospectionException.classNMK@}&jm^</ՃoRR&.u%Ͷo$x(zPp|yWgHcXBٍvsY:eժs iCeBBi. {0qVhJ^&ha 5n]<މ~nJQMU~ZAՄ_#&/=BYR^+zĉ>3B1k5:~ƚ[ 0F BL?PK6zPKE9@java/beans/Introspector.classS]S@O E>J Q@_j̄P66LH:IʨJrM˶hs9n~=xzGMZnY]9=U.#`a3+]ãU'^P{{aHžBjXz{ԝ 4Sm ,uvXN4ymvvjm%.h˱Ǿbc>#&Fˢ^" c!g͎i d:/s6[wSk@AҎ*DDw<ި~-]-gt)A[p5Gt}h*s珥-NnNzTAkGpt $ɦ([8z+9Vi` YH59lP>lƘV)H xyj_@1 ^fhŐ1ѐ奕a PKP`PKE9@$java/beans/ParameterDescriptor.class}AK@ߴiimE/=WK/JOAK86)M?J:{›y7p 7%Y8OR֬]nxf*J+̸ 9 c&!8ЋM&*;d)8Oy9gk*zxB60w B#z_'4m/^ToPKh<PKE9@$java/beans/PersistenceDelegate.classMo1&$-$ _I T-Rӊ"ꁛX֩NM\8!qc6$M*{vf;O[xXF@X;gӓB[eԉ|)SV|N*t;%VvGho^V9'CK%a%$"=r3!V%T]=%RŭTӍ/jԓWyuʁkaۛ;ED<%9=u屭zF͢C|z>ڬ.J+4rn]L8?f5̫ -RڸU|̔Ծ e`0Z36{mc2u&kP71Bu#"g-e>c<σY+&oPglZEvAQ;%ZEW~ kQYuڄvqlmPKFTPKE9@$java/beans/PropertyChangeEvent.classPJ1=SkZ) biMP#JW ?o2A,2=y{y$" |+mAj7퉓pU1 t*loEG1$+1FHUTt{_5)b5+Rb28R2^ ga-+vCuԽcF꿯Z%;zX\~^zB5};CJmiQZQ:}%JzYe&}gcԥ7;TK!n9XW_9]#BOTE0eU$LB:`mC|g!Թ?PRyhp~>d >$òѯ|PKZQPKE9@'java/beans/PropertyChangeListener.class;o>#nv&FŬIJDļbԢJļTԼ"vFRVjr ;#8X$3Gߵ,5,Fe 6Zk12p%eHcw @ #Ё  'dbPK.PKE9@,java/beans/PropertyChangeListenerProxy.class_KA5-3-SFdA`bH`>ڠʸJ~z z3sϹ=wv?>!g#B8x#QjHJwחWmIG { E?tW^{]u` ~'$:RFؑBـxīEy6D hMlεӘ?1clPK:Hk/PKE9@&java/beans/PropertyChangeSupport.classoAg"zPE+T,ZĊчFK`Op #AԿ}2??88|3;pDgԬwio]gD]5K@rMvq5N V-ޢefgH ğY='4~)؉ӣI•$ E ZכM_O;}IZS-ck"ot8^oѯi=jS~e5KŽB<ײڲ'O>fraGȄD0 I N8Oe5TfJmL2]}96'*#9iʚSQyF>5oM߇9HXKϝ)]u-gv+o{}.5e㘀K_8Fp\;o8U|q\w]  ADzAf@d>Q":\@>]XX-mg\tg1&]H@ hB`W%y!}&3쩎,JpS |b2D!f*[*VP[C`  | p7w Ǣ=w 2(""" #%U0j[S7o)tePKHWJPKE9@#java/beans/PropertyDescriptor.classV[OA>n)TV ^)7QSƒ\ ńm;!uO>蓉춻3|6?/!0.b]|ϭ&jUΚq,x(-Nv.GzY1Y/zɃ5 .O $UiS0˴0B`ܲ*V7UlvU,mϪDa|b$%,3m}PѨ4PtlUƩ<&ΙM Wۥ/ &Ezsl&zzA zlNC -Kqك8sY6 WK\<ܪHp3RXjL]ˢ7AstJ8:~ )=4^ԙ\ң#L` Ԩ939Ϝ Ǚj5uP{7j#:lS4L kQ-mon?1_PV?UĉUz U)ˀK.CxI0$p;0'+]! 0]r0gPL+{ ҐA܏vYDdй*(S)t! *w 9eq$u"2ci"U@@ #r)Eȏ.ݴM;֎nu}x'O֊ƒ2J).P Tx [Glg~Ϲ@<~\s!)X5zE:7Elf$_6kUB2U[Wt)T>Ķo#|sPKoSDf PKE9@java/beans/PropertyEditor.classuN1OQn Efƅ$nYFCBWdh'mˣ|(i ?\_puc:>B72Cn`@#*]3p$[#6׆  ~T3H\.{AÒWe:Fq6 iMy?*K>FKNb)0ӈQå;0ڥ&PMRHh4eόD{ʅ-?x$"_vh<\= FM_Wl"g-j9eo"Z^C[q,[tT 5J>9;{+X%c: *EA t"T 3|^Їչc ή.f֋!4BiRޞz8>fLo9|h^2Tzf_y?wڒ"mA@jJ^f㵆%,3jaWI'#'Ra=am-_gLЮ̸j|9sװd=GBƂIKȉy=c :}^FΡx-ھPKb~PKE9@&java/beans/PropertyEditorSupport.classn@$mӦ6iK"@E EP( XM!ʱ-{R.VH,x qZF᎐MB员8 d5i2ML#q§z9|W|/h14wa0H8.u*:іΆiPP8Cf4p/KIKzs *"z a84eU(a/uuUPdkH}sӷF=[HD:Lڽ( xk4V\Efl&Y?Gj*GneuO/)I6lfMrݶ261E-ldcMhN\m7sogV\I Υo՝?PK!PKE9@java/beans/Statement.classPN@=- |?QbLUƍLZSgąGؤs9zPG@!^k j-ɥ W22nv [2$ב gekm"]ya"$t -a[= Y˳á&{ΈhEo>.xOӿXur ,${Oܑ gC+LPDM)d!-ϗ+Qіv}&}[8Vgq(#AՠI_MMoXzC +T 䐤Zj LXCC ?aҤH3^g 9CMl諰{S~)c36vU#WoPK!\TPKE9@'java/beans/VetoableChangeListener.classmO= P h⢋WGIP_KЖ*_sXQBK/W ~3zMnڋxf l8Qp|-]y!VL;7~:ks-6?|AlR:&M|L|^\0~ȿDIxRHWΑ\hH]@PK3#PKE9@,java/beans/VetoableChangeListenerProxy.class_KA5s,FdA`ҟ%]YGoUOA}>Ttg-s|{p-bE U,KJ]^< &]ғmw{umkU/^uG1X!v< ytZ (ʄ LMQAR_QZ%>xIv&NXMލhptu3`PoFNįUZ_Θpz緃V{?Zu`P7#LhfSF-miPKXjQV-:X l(ZnXPKS+SlPKE9@&java/beans/VetoableChangeSupport.class[oAТ"Bi+`mCS&idw!gAL|ggn|؝s9_N0xOj]mq;C~6Ѝ>oG#rb2lʨ!o;Ku Ї⋛̰Byɐ.5jC8"@ H5o4ߌ/;z [:iQg lFP5cTCNv-jU]=V>a8]y?v[ }_Ί251ɴ,XҜUoc_ wbгFs:Nih]@;}hIu2wp/m$ȟR2` Mi(+z"~D="+ [њCmEiWwer˝,+aϹƢړgq lHNJ @.TP Ñjޱ2"o ܼ&<⺙U35˙3 Ҧi"ʋF!Q On ~ 3PK`{PKE9@java/beans/Visibility.classE=@(.m6x--T 6d&x5 ࡌD3y<*e'TI] לr#GXQ%uRe !uqh0^o\j5X !Juos;!'3J֑|+'si> PK PKE9@java/beans/XMLDecoder.classMo@u&5iJ )"PHn{(*YW]Ng ?];$N;3O{WP;㗼܏ z",Ȱ\OG3 s]ߍ_04,[yݠֿq( CCW`(Xj8wEw=dNxszY?Cέk<|Hughf%)Xd!c^7∋ |ۍbS4{ W+>}Qdc>y*12Cڙ2E}Vjs7(3MeMok9fY8#^rTc 4?,svvodhFt˨кp7@G 䗘ISa` #%J)h/NJF߫B?I3*ð+_hJPIiulUg)}ld"aMlN\͍5CZndS|s6# &dqgbc"bY!*PK$|PKE9@java/beans/XMLEncoder.classNP(P.rj1qa0n,0x-]|(㜶AMhsfsaЦ|?> Cu%Wc -Wk OY;dݐXE[e(P#Hx|d *a&ܳ= 悉34z$sbڮOFʋX#ۯw1esgGSaDBi\iY =SYr_˧! O~PK^PKE9@-java/beans/beancontext/BeanContextChild.classQMK@}[kUc:#Nv&FӬIJDļb0WZQd;C9)yy%E , `9yIY% <%p b>`E%pqkFҢT̜TFevL`cd`d`fFլ l ;dbPK%&ߕPKE9@4java/beans/beancontext/BeanContextChildSupport.class[S@JEE+xiQZ/*LgHLJb,&L3SgɊ&e\~ pג)eJ\RtUwF}JUQ0#MMR5/l'T@R0o.r͔\/ȺE!`tUY_R3.=*xvι`)#^a0ԝkjkF=(׸0^)r(yA=Y}%H^a,C0̠ +Mk ԲT0n,&#ƕ3X lj4%mT4>  hhR齎uscͱ (k59Osiƚ]a;+! K,Mc*AZiV:zo%S;V/jxp Ǽƫ6u vڄ3HhF5WeB3Д`{Aڤ";1b'2׶$ "Dl%? %2:ibv+sT0"T8fk?.F)^裱h|8<{:O?`;ބ`49 x )!x 4zgLX-t+bI{`u<` `6"X- ز[W8"6 hm` k.^Y o-)GJCf᥯rEWJZ!˫$B0&_[3&MκA ؂a{װXD >*POX'?xߴj0B 1=PKQKUp PKE9@6java/beans/beancontext/BeanContextContainerProxy.class;o>#Nv&FIJDļb0WZQd;C *13/((A+'1/]?)+5'=ALC(D.n_Zꖙ =f6FFf`b1I&PK|2PKE9@-java/beans/beancontext/BeanContextEvent.classQN@B+Z@o&F1&^xȉm`IiI?ʃL<~u &&潙~}|8 Ox iϲyEu+'“:4S-6xk ->!ng9CyI.]DYarߌ Rxh[`X6w

    5 Wɵ61 93eث/Bebޥ^p_![o/$<̾iS\ ̦4pMoPK;k:PKE9@7java/beans/beancontext/BeanContextMembershipEvent.class]OA](h 10ႯD$$E/4\t!,N7yW$\Q3cʒE9s>fJax#3MVbo{]yq PdX-s caWFZ(j۩FFVE"42V; T3ۣ;٘ C (#@ҩTSߎw"0ݎCp-^MW,^gx${a;gIREsv⦚ɸoB*. RgOY:i&pۮ{'Po1&~5a42[)}:.֬+ 2}TO`q>sq A7YY,&\N20gc}s\JbK[YNh$m x2:bz1$2^հAL"F\T֜PKpPKE9@:java/beans/beancontext/BeanContextMembershipListener.classP @}vVR*"(̆d#&m~%F s3 `"t rYٽDHKkw?PRfL@aX2#G\' F%KY( }/X> ˉw^ЉR9S<"3r2U5'jm:z*8PK ;W,PKE9@-java/beans/beancontext/BeanContextProxy.class;o>#Nv&FIJDļb0WZQd;CE , `9yIY% %j54}윑b_Zꖙ n 6FFf`: b`L PKI@ՉPKE9@=java/beans/beancontext/BeanContextServiceAvailableEvent.classQMO@}[+(ȷ1z0!^51!^0&ۥgă?enဒN{y3 qX O#nv&FˬIJDļb0WZQd;CEeɩEe)E ϼ|vFļt}v6Fa$Caʁ0>X[32p%e22v @ %#Љ  'dbPKebPKE9@;java/beans/beancontext/BeanContextServiceRevokedEvent.classRMO@}BW/qhH $Mm][Ï'$~b6U҃wgvyǧu,g`@:R؞>+q3Qw {В)!tz2s R!mɖe#ѱ$atu*\cڿPᵾM$ϲj+:c!v7_&9}+n lX-k]׉@Xv. JM(カB僴/);Pn#$ xF`r4q|qֆ\;do92%̹0ZԁIL:ƌg言"O"P -j\Ty YJD 2u=,'"a!FHDjd)` gPKWbU 1PKE9@>java/beans/beancontext/BeanContextServiceRevokedListener.class;o>#nv&FIJDļb0WZQd;CEeɩAe٩)>%yE , `9yIY% l `Ғ}ײԼFb4|HuHk0FҢT̜TF5.t#3vH21pPK ,<PKE9@0java/beans/beancontext/BeanContextServices.classN0%P]@%.rb@qfnpx(Ԕ Q"qX/3y~y|9Ledbҝ-mNNerY:Q`=t ,N#*acj\L C`q͕ci>X4 s%r]kJGF`bu ZQ\:UnɩR*Y+}3&aWQ#FkH;P)Ƶtk# ,txԡLMYWd}!_Ƞf-,i4fiQӍJINs7UUF1s_T[@]//y4^vC(8;Nc|2I)b&a%0kPK;1 jPKE9@8java/beans/beancontext/BeanContextServicesListener.class;o>#nv&FIJDļb0WZQd;CEeɩ>%yE , `}9yIY% l DZ3h`1D±,13'1)'FÇh\RJ5KS2Af):@3pX @ PK6g8PKE9@Ajava/beans/beancontext/BeanContextServicesSupport$BCSSChild.classRMK@}ƦXz-ZKCPDzߦ ]II ?JD7ݏϷwm1~F7cop\98jv{^@`FLyl 1vRh,̞33{/;E0O˞į uCȁ/7 tODV_,RƳM{$z~YN.{1p?~|I-ێ]aP:~3R8C!lƕlO;ҴMkTCK[v i2*Sn_ږ#B]-KmgSZjS>B;~uSO00%l+N}mX1$-ij \8]@u jN'_e|Đ[((bpA*fɛ.PPLVm>0F^D}+/`KXPKRPKE9@7java/beans/beancontext/BeanContextServicesSupport.classWmWG( %11FkcM_PX[&bbzӸ).?ɇSޙ֕p< ;pVci&kJ EWLǷ[.gyz@t!0LJ8 0^tM;Q2~L~W/֩6V>d!`9f% ap3J`#OVN>!\%pj>vc dG5gzo3:5@ U! zO'©*gbx; >%ްoq^k5V#"7-EWk1ݒ 90WA9r5k 7B@Nn 6uQV[fĩ/&ÜZlS޽/;VB>'L/c "?0Sd*ZSD3LՑ|ן&4NQKr0ͻ%D2\tD?{gUְ4C7cyaPܹ68;wvb 8zyJMGaNy=9$5:ұ3hFuk\1΍eɫ&9stQG&b@n,E"pՙ û0b--G{C={[qg+xUH\S܇wQ|o `OD`cCτ |G7qIAlfqL4IIC#f9"]Exc40% .b6' yET9:-΢~(#k4إ)q }>Dmo .A#G9r=NEb{}R!G1N/}z9,-(HAԋb)"))ˁ"(ψŊKb6`]- j*ƳOz"-D 1|몥x.A`e`F,dgclm^Vpkۤ{`KSx鹧F|Ə>钍8ea `Qr)8Rrg}߻z4]="Sg"#BrCg+\+#8$PK [kPKE9@8java/beans/beancontext/BeanContextSupport$BCSChild.classQKK@MZ'>қA(zI%&%<Q$U/^*~3;ov?> qD.ă=)¤~1njv2q f:4U"oSBveDHB%}JOwe*TaG]wJМh&k lQ5PFD ޓcc" wPˉF}%oQRZsyWy2v$2qH=P޷̺|mfbs%_`^^ ;l+En f 첟v"J,8PK K<KPKE9@;java/beans/beancontext/BeanContextSupport$BCSIterator.classN@ƿBPxx I o[HIiI%>=x|(tT~3;o7'ёa897lPxFb?f3?{]sГ"th ܻ7IyFqn}>bȶ; xMmpۥJGɱ2YzN̬aVmfTӢ5bZlZ+ZGĠ@˩z2K U)3>mgpㆡF l˳ST#'rK1W .k*%[z^a;t3ן &YVQMEє^-/K`gFty5Gy[NIyVT<`& Qc\b"p4< xMtMR,CF7 [BCá*b&grOh]b<kGnDZr#5}ܾg7%ЪTtjc;TeoH\?*K" A·C2?6DBm Q1hVGa;(]ɟ/#x'x2'8׭ak-/A3!| c 8`3#M%tu4lՃNjp£ޣAG9-ЀzbMϡ-AԽ-*'cHo5;vܨp\q,8Ƀqڃ&|ģ8ir(;UF/\50AkB9TG <%=C|s1@1NvƝSIDqlp QL)ddɐd]07w*}=b啦A-P+K3$I!gX>!8P8dx k#,yթȳ>n;cq; srɋVɽ|^8da^V.&7bC ]?t}X"/U!W<"/ )*&E ȫBd RIc)+aE5Qyƒ)lCEaU*‚.H^(թt#(ܜMмB o FdZ4C H+ĞBdUPbctZ.6ӰE< ы:xV7ߑ7d}+نjmxjg:TǠ Nx~f6&[ $si"&ҧ!{jSy~"$ei+ PṚ3 eG$ @PK}LPKIG@java/io/PKPKE9@!java/io/BufferedInputStream.class}PMO@}*(Z$&zSx@cBxpWA֖ă?e.%!=xff?>\"4TTrԍ&iK ИTHP&؃tL;0N@]B)%PIdcW*R5; >G TF*i8A IP}UI'yRBPKE9@"java/io/BufferedOutputStream.class}P=OA}s(r1F;cƄj%98L,( `3;y?_.#콈ְԲ`ͫ5- SĝJԳsBcAwS;4j Wj5zOqߤ=""J{;H(:$+Փoa?zq#||o a++t^\i|QGC:+\]r[8߳yTPXeellMtn[e:cU؛se_PKY(PKE9@java/io/BufferedReader.classmNP)jED/;P#`\H4!aê֔K|(2qP9m!ris?ڟ߯o%l'o[<=<O4ohA0s"=%Q\&"! ɫbU:|/;-ɪ۰5ۓ&o{lBz#Yhvxy/]:9ɠϺ*1`*pVaVNjn!ܶVIv[5ąTJ@cu(GQjwMew?1y^ 5` b*!~*&c e}Ʊ ˿+Ktycd}nilm׵К8pvU>6!ϥ6t韶PK PKE9@java/io/BufferedWriter.classN@)*" wCLD &M.4`U`c5k2qP3BtCι3}h@cȽZ".ᄌb]a"tX6uˣa3QPI a[V{R c +d'ã2H1 ro<6\20A !u}tH8@N2g>+ >a󩜞2SɥLU7\kսU>9c:\ bwD>DA!^q~?z#CBdPKGqNPKE9@"java/io/ByteArrayInputStream.classQ]OA=3vi@KAƒјX6 /QƳ1fs{ϹRy7֪pDZj"X1Q(tO)PE0-`h,Pze&~͎isշљ*f1ϾF똡 ~TݾXD=?Q֤w sCοV~ɾKe jLfp$P&3IO&,'0Qz(_mq؞~gRvo agQrQe!;gQyDI,} $xVs9k.z̲yO Yu2{Y-4ZfِUFfkXO(*tkNU0`=fOx{{}DD&<9+_υ9 PKAPKE9@#java/io/ByteArrayOutputStream.classRQOA^{P(b( UM Ƅ*&MH|'(u=ngwfo_=u"^:ƥbR@ u$}l d@#`5d=i=>W/0V엢<Q0yJ;=F`%$Pi]oݦsA#T"ِ{?3%(a!jR9NQ@2*%P~->k!G/U\@ Ö{7' 46Gm` $bI G•(4y=VnmjGqf)=@z5 뀛Û LcdZ3%hP7igf,D p n s1Zk(!yT\05-~/"i܉[/c; eCcr* K8λ8wm4U,3ˌ XD{m t5AA 16`3hjQ)MQP=G2hzƵPKOdPKE9@java/io/CharArrayReader.classuPN@=3|󑈺3hG԰a51V%%On\(im 4>Μ{f>?bg(݋zAչH)|%E[*CgR7~FzˠGD[k:  2 9axk]{<[R݈VG2+: <]Mj} fi_f6Rc']m g\{߳0vLuʕ'v3=}K*R}idLfchA8U{0+%3J(R4`32LlD?2:+hIu+7,6,[1h2aX Ei쎧^4~Y5X5X[67PKaSPKE9@java/io/CharArrayWriter.class]S@IKʷb""(qL^ Ҳ@`oBop ?&4IhvggϾ e$AAȼ/agow0; *U]C5'Q!޲5s4 jn@ anMCهzVKo7tޢl=$ mj ޤssf#j>Bnhr>vb(La'XE!y[P6=~vhYjʄcI / y8a BR;ZZz+|%ՏoމP]ni'fPKPKE9@%java/io/CharConversionException.classON0}NBVbCE,HH E`FFn[LH|T޻|_ !FA>@1,!dlvD1p[;pКw%μ̇1[Ů۹oPK_PKE9@java/io/Closeable.class;o>#v&FIJD|}ĤTvFpNb^RVjr #k2H#f#kErjAIf~^1;'#0O PUp~iQr[fP# =b6Fa  gX4sL PKIOPKE9@java/io/Console.classRN@=4ginjT!Ebe&GR~T@ZYܙ{9s7laWV4l^N9ltw<^9at:@ SuFȵ>'uQy L(q2^ʀe -Bak>PIձ'ܭP mB~UPR^5J,{r+ZHlɴ:mQQGnNP1HvdWz2Z^W %B/ U3<2"J<{ BXK+#4oA5&E̡Z1Sf1Y`ZŌjĕK4֕">}4꣑裁T˙}b-J:6R LCĘٌw?9cDUoPK}PKE9@java/io/DataInput.classeN1"0\~Y Iܺ$Cbԅ NIKb\>-N9z 2)m{4ő,AMa2=MqDPw(#0[/ϱ38m],~^a9aG`0L}m:@;"+M*F#I+_k)a>p,UH(!P62FnΘ2ao} ~`hkX0vU:jmXXk֐ j͵M@&)'?]1+M*CkTna}Ft0tSڽ<鉱eX$!ڇMqc;2g'~(㙁%!osx@_T*/{/pJa&=-s ٛ OZ 0JRf(:|"8ӘGa!}wq.~ :Z;4 F- S+*Imho 8z%.T~7r3t3~mĹu< ` @f8vxRMTU?jV<ŵlƐChCmSqd+fG:,B-Ar3 =q@Ei^ %bvmS%z `,)|n٥a,#bW ۡL2^ _2h7X2ְ>=l% lN+D¶,l{e ͢4A}< FZ#<^Z$̵,3[0<] {: fPPKW0!CPKE9@java/io/EOFException.classuNN@}SJE(rf ^ $&0ܗ5ukB-O&?8Dü}͛3!cpmU]Fkޫ3+Am].OPKl4PKE9@java/io/Externalizable.class]N1Yb<…Mz$@,)ٴEy|(,%z43w#"Vem2=x\JA{4/Iު 7ARNqJnpJ4z&Cv^[S Ӻ#%<',3[MMN{uo]ej;Tጣ]pB][ks+WPK*YPKE9@java/io/File.classV[S7>2cgȅ= 1@H04m[z]Rδv>Guz]kglIGUﯿ`#Yfͮ3ơ@y<}xJ n Wf~~GeGgRYβ)_M/W˻633z딲':*,Sv:K]&ВJhZE5H@.ip4>A'Ҡ 49fҭ!w=WrVA7u ׾}72s ǑOB ; stգPQ.z#5{}M{;BU/",9-T@E;T/b&qf|+QVzzP-!y]fN0vuPT` j5kY籮EjPM1?E9=g>ʡc3T,{AE{P1ɰ|k(Z)͗WM, ^cuL:bIή҅=w/H23 Ye6o3ǣ`KV,Rf*#F[ js;&wp,11]jg1nnKޕx ejґ(+;;&j# :lq!ļUrunMm %l Oi|<.g[@n m2q8%0\ҍ#."rr[4oC;gJt9 &  j\dnw}{A }G&Bw,I#ZD !#wm$Ӧ}|xV6rx{l+M=҅G 9}.iA!و|򱪜Gk?yx=PP|V̴ U eDߋ\ G@#KCCzxbCJw<<8":F E YSs0in˳WXdd*h(YqDg`XT).XNhl(/MptPKE9@java/io/FileFilter.class;o>#Nv&FIJD|}̜T .I-bg`ad$'e&02%&'>Ⱥ5KA&22# dcd`d`fF٬ l ;dbPKHrPKE9@java/io/FileInputStream.classMO@q8MGB> \TM QDB8۰YGS72!’׳; `.,B㋘ =S=DQ(ŭ vL%J݇;Wɝ'G fZqD`5("r(`Ęlr{-KqKBx¿ɡݨ1%S~ ,?,c9B5дJjzkK1Yi᫯zz2:ZK8etlH$ u;&kis3S"Eܐ bďˑ<,w9:⯳/p`a<kX>`erP `'1LL-ԟWW-།&R{iV7,O«wF9g#gxlFsoosBFPKLhPKE9@#java/io/FileNotFoundException.class}ON@uL Bt#:Dd"(9C;ⷨ(> w64<!Xs冯k^8T:%4gb<H鳞$TDm!I)/^j)bd]O~6zBu.\a| ۱qK }TJi#BG$-R#OQ;~~&5^| l`Z$m F#d`'. HԻ)ћa5a=vukF lެ̖3-[z۠U4l1 X=.Mq9}.s+3KKyP5N%.ۓ'[GaAa0jC|mK0-jSuXZ+NcƸbH97"Бe(P\Sk 2t7[W&:L]l pw'`؄Xr>a۷_rt͐ɅŪgrDfHTS],)Qb\y.ɻ]Sa 3odN-Ҕ،t]9 xhKUwmn 3-%곦+\ }HXĨ)DO|D{d\vm: V[ +ƶpeߒM M7nOңCxr/Q D`-Ʒ9$9p=k Fg%@i> Xa2\!A G|v AzQ|a|薫-k, 5^ 5^2wn~PKwxYPKE9@java/io/FilenameFilter.class;o>#Nv&FIJD|}̜ԼT ]Z IKOJM.ad`KLNN-25|uZ e[kF12p%LedFB62X @PKPKE9@java/io/FilterInputStream.classuN@mK W1ƍфP&qLiIƕ 2hf=),BQDGjYtTt!ȃC}KR!WdBeJ_}s<UXev:^ RI؍D}QR/LG? a?| g&.,%Okg~" 峢?rPG>YyXcgWk7yu5mt;&WY=Uhm0~E - aϨPK~s!PKE9@ java/io/FilterOutputStream.classuN@ƿ)jEQ)EoAb4!iM\-Yky2P*(^7|{p|3QiFԽL27ZePH3CU9te. J累6Pfh+/W"l+XNJP3B.wLǒ<](xT^"J9{Xc{} ʛlK\l P6`Qe-YO-Ֆ`g_PK*PKE9@java/io/FilterReader.classmPKO@m Um 0f4^&5&jp*kjk#(/L<Qa D7|]@u/T0{2a L0T(~'S@2/V[V3 L,91T(@ zQZ~/PȏR z+* 6J4msg b ؕvu.n&VGM`n0Ju䃱&2l,Ydu!J``{4P rrYZwV g*j}=kެ͜DװRe2QD2h]6"2njPK /YUPKE9@java/io/FilterWriter.classMO@-*"񆘈r3/D&4xT5Ң˓?v Di3;3_1 ݐ^B] ;Q@ ;~": k^[@oywN ,e` CP- ,9p.Ǯ]Xm_FqPr(P5=2=}s lir̼*̾wa9N4N+f 3v^{sXم-D]Z+ =F;h7_hXb(!˵' <9d/YXY28q|AT"X0nX^ uaMz -PKTmbPKE9@java/io/Flushable.class;o>#v&FIJD|}ĤTvFpNb^RVjr #kH#f#kErjAIf~^1;'#0O PUp~iQr[fN*# =b6Fa  gX4sL PK"PKE9@java/io/IOError.classmNMK@棦Zx+-B!.JIGIƊ ¼}3fK8QT"Q:Y]M,DNjTs0_D^(#WAh(Z:NU)owO4K%RE&tLT sA8gBxwf%occ!|ƀ Ww+? 1~q!FPKIPKE9@java/io/IOException.classPN@G+ R@zCVI6TїPRf6^`S4Uj@ys:pSBU ui`7JiZ [XU|j_嫥PKL0PKE9@java/io/InputStream.classMo@g7NLLJ?Ҥ 򙖊@%8QDA=]mNŏj=!qMd%<׿EDԵ3j Sa I:Lc)6Y̅/љRja"ȗjT*ݝcFax*t@dKÎqIqq$'#&amN}~'f?uB0{'(z BS~ ߍ/dA %abx""_31a;8K='Ts5RP{`?raۨ&x<Q" =.^U"e饻ֱ0a?% Rf,wBy̸LnPi6YG=i9G '.q8\W/][xg]'ٲ«ͧ} ޭw\ƆU^U(k-M iuL>55V4p'MX*)fJ`u `=6֖ni63'WY4R̰izk\e}ҘV7˖ _ hPu?V@= }OPK9USkPKE9@$java/io/InterruptedIOException.class}PN0MaABR"RVTSc1!1<q"Ywܝ?^ pQ#ݳ EFRsIts8K-R!t8=}<+&[ "BLH \ PdžkV,$\t 8ń)QUw"#7$`rr>WL (+Q_844YdMZh{ob6{4/ BhWSVS*qmcgv- PKXPKE9@#java/io/InvalidClassException.class}PJ@}jmzD=Y=& =TzߦKݒlJ˓mQf̼yv??\b؛2U#9D^14 _mA2.jXoAv xXc>qd䓐G#JE;~Sȇ]h&4wRoۭT?8Yeth9XؤnWޠؠ2&ޒ6M_tJAR32KŠF;PKPe%PKE9@$java/io/InvalidObjectException.class}AK1_]]-zEoՃ+Jŋ(*gN&ſIGzQLMf8E/F 7Lɤ׺%Mn*S#fˑJir[FK)cñ@xa&*A-DH}?ngb+{'R t3Sr,-k{z:dĻJ!ꊼs7p^̏k~ b^XFmNmYOPKJ~PKE9@#java/io/LineNumberInputStream.class}Q]KA=ݴL/7"zӈ @Xz}&YYgUGEw5?f`{9; RW1u]c8Ƞi@A6<<(, k!6h,,l䰆40zOv]+T'Iۼbc+}ifTU59;ZfdmaЕ<.T=y/ #{NO6j jx[}#5LyB3N`?7~>3]!HB6ɧ3A |!-NN4m-pI5y9,~0'N00.ZW~PKHg~YzPKE9@java/io/LineNumberReader.classuN@ƿjAƈxxhBxP}E M 婼x2P]-7o6 ;Rڳ +;)2e<Hm9W#5 \c{F^}zi򒬭u%=1HNԘZŚ M=b:_uf9>QzJH` \pj9X{4 ZXi(p_AjPـd -yyh,&hCWE䙩s-F}w ~_6fF_PK`E|PKE9@ java/io/NotActiveException.classuON@ML t#:TV(ҟ)\s-*$ >B M+vvwfv>\A8RDJGCmnSJyWt#Tfd )freng6Z Xr%xI& X"BٺnzE Gs~g"D|'Ņ‘^|Pvs _1*b$r] Jh[ʼ6۬ms黿PK.PKE9@&java/io/NotSerializableException.classON@ML ]$ ѡ  gs 9>d.Q_Q!Q|blhP;zp^`*"R:iR\47L>úK23)R*"4cwd&h'tbU|n'tc|,ؑGL8;jHT\Rd\c,Z4q" 3UBuh3邏U1CrS( {NrԆ_hc7U*'/DլLl$0 )l1dǷZZh٢6зo*'M)}2*I'ֿ*;ѮEt}:"8jNM6H[҆b'8WPKێPKE9@(java/io/ObjectInputStream$GetField.classN0υP00fAY!P "4E+$<5&QmDw}/l1BؼYF/'$V|VA'022 }0ZuQC0P߶T|.["Q[2zZe QB+Na&. C[%: {y>:{guW!J.E.# .SžE {6E.\5^~@ؐՊ?6~V X2LMk E/ U(vcτ CH"=U#qy#OF<&q)&3L8s,dY4ȒA +Cd?e:687Qv oPKFIiPKE9@java/io/ObjectInputStream.classmWG*M"ؘTc5@ D&Q -T mo#Lqu׳;p맞Q=3V̝{2woXDLMӭ{VEf4vƠog+&7\e:!0:_'M+>TQ!W;Uc 0!AzI7n`FKVjb 5~;,nJ,":In*$kG0>5Az`Pٵ0kƘ)"ge4kRC? ]db˲ FM)C+RvΙly >@͜q &S"VVCA۞hGgF k9d5RAqieXKNK0s-QE*VNqOM%(ΝV[7"mvf* K70~*c2iq*Ϻco̺S/tuh4k2kK|bne#R"g{w3xKn2~Fu̮PCQTccMu)v]vƠDvKx&u ɴd" {ڶ1^t)oX2vKW}*aң^s`M_JMjLr~D8!)w#Qv.nkVPlg@` W5{-L&h\Jýa?8@ﰫcpGL n08af$fU0b6Iq 8 P:ïwp܁q% WX"џ{,g}DځDP2)i∴3U5i7zx,fa!+ʕ",y,r_SfOѺx&zVqXTR_zK F^z_]D}R>*dK@>O CLvYUR^zϕy%5eS$ek2nvݲϻnZ2/z/ t8m=N*2ʯ.nrpGQe(mI|#Ww8&P=~TPKьPKE9@#java/io/ObjectInputValidation.class;o>#v&F٬IJD|}ϼҒĜ̔Ē@c[M0⫃},P%exg&P=;.i9sY|Z x*d[a#\M OPKk.#PKE9@)java/io/ObjectOutputStream$PutField.classRN1&!۴B?~5R)ժCo7 >@ 1jR}؞bopceق 3iC4Y&3ʦ0};ƾEEu5rVF>qm$upmsqSU>҆)sC0zXafIV3iS0*fR6Ŝnziڎ1n5N{83$u+xTQL@z>mQFKƴF0WI]Jr"ײ΋y+ܨ }J78yt*rͻng%Ӧ{U pFًplk_zl*Mi4O9*1΍Wŝ!E`ʸ2,:VUL@5:MRhYj0Ilb1Р]D,pg ޫ7!~aXPmJ L*̘"*_Vja%4Nă}--WUkV0ThUغ@M:QWb_OLrӼ4LLn2ohi1QN3P=OQzxCAJ=>ϡнPXZ ċ(ma6,۶f: Z@lFtu_FzJiPR` zPKsye PKE9@java/io/ObjectStreamClass.classRn@=<mMU,4Z"E" 4IMؕT*DG!vHxfs?}( S~©Ó\,>gdXCiRꚮɠv߶^ [oq-aZ'  1$S<22mv& mgtw+2u[4R$+6&.9kZ{A XSvhzR?C]!/a 'ϹaG#b+!Q6llEr3ݱpG/Җ|1 %dWn9f-|/΢F;!G&<"ǐ:w`O-9q*A+EOͿJ9\A/sE$QWF%|>>Oii)I\>xۺdа~F\H-x L)6Q 9]En"3E* TqdhN0TʸK9}?87S*̰rj__^I:C&PKCLA0bPKE9@#java/io/ObjectStreamConstants.classmYSA{H!"^ Gjg/[e-́/ſ vT%3_X#'Ll;\Xs[A%Zf˯ f0THGwL]a87π \~ta"vi0{н/&5 %EA.X KfI Bp8ǒuאܳ\sr B\qO zQhi8]0M)9\dqg^qpz޷\.x!7#.[7*.n$*հtMt lFan41l]+i+~;>Qo7*JH0vbދKT&^3$S !!#g@TxyXa?0? g,xGO^P"—|E< o"R6swoA@ȏ~DE%e>Oi`%x'ž_kd7 |IJE\nkPK:XPKE9@#java/io/ObjectStreamException.class}OMK@}jQ7x!CM\4+kZ[8^üy̾8A#NB$J'l*jT)fO|.CKr=&*UuNhB-,wF@親7Y&ͭ I:XeWꑰ{ǀկ%(' Ӫ 0vJM;N>6sr0cKώ8cc02ZZc>e2o:v-h6bp'PKJGuPKE9@java/io/ObjectStreamField.classS[OA=,R녋"^i_ mK3c5 ISS>G5fvvv9. !h ;>yawFө;Bu!%{nF`X*p ڈA!E]C*nC.=-Rgre+fˈ (BxHx&zY0 7+n y@ݹ6CdE" u,$ޝ0Đ4vh`V]r GevM=n&Cb<[u1[҃Bm9]{&׆0onlQY3ClB2,aʹ`s#/ G \eϾZ=GTe%}i 9̬dB >s^=PFZwϠ!L' BK>&UZbXK:6!H I6i"[Hj[Y}%T*r.?VriLwViޒFN ҆N9{Fy1ՙ؏Iuo3ʷx7l-N* Ի\ϴp厏RyO hSݱG^}NJ⵻PKU#fczPKE9@#java/io/OptionalDataException.class}?K@r驍 bUlB I=rY{ײ,~(qXͼ}< k1936w\ӧRFnB舽%5!sc5jMmܑᱽ,GB妖ٴ抋Jܖ\1^nl[EΚRLo6~AE'B9AMuA]Jݽ>3ut_}O~PKGndPKE9@java/io/OutputStream.classN@S U rBLDI\i\h4iBdqQTJJ+>e<3%E\;@ Bk(FUɂIX<ԚpC )Bv=!/V |[Wz/>$g"<=> ޕ^璊 |ye`Gwyl^ģtexƲX*%V]YP&u PDSsS`c`m`S8B+2%L7Ag"V3u%C/e62s6gw.xS!vsr,;£TP[;!C\hNS҇֞v n#rX.b K-YOEo +(񳠫sB5k_kױlj 6B[ Z4*3,ws@( e[9XK/T#Љ8vmz'{]sei,APh@^ÞnEo VAWDʜgScv+qSN ]>rU]lJs^(5!"~ׄCY8Ƒ/Yk.I`>'~ .܉{fKO<㚵%pO WU-愧Tl1թa1SLzepOX 0Z*V'۴-}PKB1DPKE9@java/io/PipedReader.classKO@gJxLDI<I QJ5ؒR?ʋ'qv[tP@A> -3@EH<B[=CTkeY"(Rmns9Fo2m4GvH WuI*/&ܶF䦖ѯ\+"D́=5Ӷ,fphRrT-]xJ7i;{삋ESF t<F^I$) IgVMx $WI_|LRYT//Z Ҳg(!JV`~!0 sv( /a("ͪ^Y<0Z9d#Y(MdsKTʒVM!ڦ+B"-BmiPKv WPKE9@java/io/PipedWriter.classJ@gҤZV+X-xKQz)MW$x|(q6!` ;;|a[ O[|̆)gSnq !!{2,(Fw.'O!=bވnzcp!-WvU?՝_풆jؖ N̉;,w4M wZ֞8s 1}1v~'M*Z|WJ$ȄM%X54P\(.+OL9L S1ՠ!ĈH2Q*1'* NGD5惑F>}jP]#Aqg5ĮzhAYPK|tڤ}8PKE9@java/io/PrintStream.class[SF"M&K 4`ԅ$t-R!5 C@TgWk!l7ts=׵` ~T F`Q/Nkޱ iy{`?I`_[ٲ aiK4S+!=!ЧZ5 $ k:^iڵ@@Ԍ>C hOP1myuno}_+NUNtפ|1] #|lG]!p©܄}P`|Kh5ͮ:5 R;8FR ?SK"(w}'0jbzfRg-@`L-f%E0xMîb{DVrYDziT\q )] ݽYzya5^?UOP.CmzU`mbw8fԩD˯٧b%*rsOn7oIBeأ3bgX$; ax<=VԳr7#&/o@%tѕyLq !K`EփTj=5^P[iU^CY0qA(xAGi WbLȟb0HQ`F} &Cܧ1NL3㌹r\fi_IIH#٨гLl:I?C\I;ktaSi㏳SfX1a&<sw׸0+zaW9䓳&M>9T29|r6$'gS29|ru=<'_KBR G$u BcvQ߿`߲T)7Ogq&0'\t5 QzǤPK/CPKE9@java/io/PrintWriter.class][Gjw%.`DILb0&C4 ij5ntYӋ~~>=3 vLnafos/@~B{탖1+0vBnZsV!0\:#6L!pSq FM%b{UcXf# _84Uc!O qczquq]5%tZ^uB u;-T.61@x\Ziw@1+dp-~9HVt$?! ΦasW9{q9 ]iF:< $<]ѝEOK\M^M^vOZ%a)[,+&kd>׻biЃ!G%S"D<戜 Iؖ]$)D<#dg2Ī12]!9>?Pn 0*A;gCU99$Qι/q*wΦ99$Qy(q*w#sTsz:'{|ۓy)sRIܖ$rD n5_CA؝dʞ =W6?EϿ}vcHgf/"/?_2J_«?|QQKx;8zF?PKւCPKE9@!java/io/PushbackInputStream.classNP)*^P;Ѕ(1.4!jq@ UlIiąC.!͙|gf4lxv5h0|z2 N+ V ]ub Gǂ\گ*o a'4&k_O5ۿj-[zuukN.]l{9LK9DAg/u81"X.ApW Zs+ rܘw#Es4#Am.Cfhy|Ɓ R< aP*#bsʜد#He؛FmN*4Ԟ pDV K`k#0Syc` "8RT1 PKpЏVPKE9@java/io/PushbackReader.classKO@-* o%q# j҄QÆP&ԔG[L\Q;S J!MsP {#Qvi NL vtB9sBX8|z kn[rD ӓD+ knCx DUvwDHX: o8&š=|q{}y>du3UbFF0 3ݡgKPPO+ ^MNa DK7 T: 9߁8V5!5$XWsBNFs|Guxg,4Dfţ)([60Kws`y +b**mPKT74xPKE9@java/io/RandomAccessFile.class{WGAHBCQ *|ښ`kj0'ݍߩϿzNnYᐽs}̝511ӯwz u~٤[5L1kV}6 >ev~kq3Nw 7,{@`A,j1bs U'*c\)]/\VeviR6H],da9: #p(Tvɥ ' 1!T$^0g4 g~f`=z"=Ba93+Nr9 !ϩ.X,f0\+FLX 1JR"hѵ 1f"J1)c3ncXmqڒ1iI7P-CA9 㼔7[= Gc^ʸw{Br!/uj|%-tM@/I+pExtJ_ ,JjѤRORFY$}*H:q\*Xv+&<-Go` w\:<5T2[ZlDv9vnG¾=ӳ}۟U2'TNxix_}PKDYPKE9@java/io/Reader.class]O`V`c L_: Θhb4^hRH )vi;I/22Y[h?<0wn_-7h 'B:aA<: '6P ,^g vn*7! uҤKwWs#{nP5'۪NWvK;dmiIg'Gc7#kku0"ʺA)r[epJ=-)K!oe\;i 6,KyH&pR~sS< #޺rd}0cE%~3VO3sa\"Tħ,^NeWUqm[UȞ5pU|a1`MVul$ܗcel-a3!#Q`ܝ`uI3vUdC15czk(kPKPKE9@!java/io/SequenceInputStream.classRMO@}RDQ>'…`B$zp_`kO^gHN1/r#źijHKޙqmr-- V J @!3p]6 E=u h+^(/wevW\Jq3μ6d=:E SV_)аBIܟ5%` uؠHS z'UJ _QUgSJ83! P RDa9(+kҟhh>f*PKj1Y2PKE9@java/io/Serializable.class;o>#vv&FIJD|ԢĜ̪ĤTvFLNb^RVjr #Wp~iQr[fN*# =b6FFf`d`L lPKs ^qPKE9@$java/io/SerializablePermission.class}N0nBƟA " V9&TbBbx(٩Ѐ's \4B$zD+=<,uX&WqxdN/"оKТLg~ThJgD&;h8[!ꮜO~0 ,D\/raw&RsXRꖌy42CjpBU S!ޱf pܫlb*\tF-E7,j-XѰBVD&ֳPKIPKE9@&java/io/StreamCorruptedException.classN0iPh0ت" NjWi\ⵘ<T~|_kN|cт/FJri5K#UgP\dbF24"B-40Yr \0t|µy]ͳ|a8KԐ_Q9/flf2DcULK;K)hэR2;\;b;[@Kj{y@m2:qf{kc;]J%&{Μ9?g_1;4͝tA3&W BCm*Nǧ̒>m YmGx yH* fG.EZWk1\RqNmmi3w[EqqJ *U!| . r7ʳRՙC-VqE%+HB2;?{!I%Gz*`H)8ia@89.^|0ձ}H]`1"K=UΩ@Ot6g)|ES.3!3%"5cg?3tTHEN&{RGh;Pbx^]J-}iV PnWM~-B E.{hwq TVR-/ Chs6uT|H<& WBKgSTP/f>%uo/J\2B-To@9/8Ub;\RCYP(\ QhB/^o GhC(: ֆ W? !Gg6l!`F4"05bLh$Le" h҈iH"f4bļ1;cD3~4`o,>j( `" 2X4q0%x 6 7BLhĈhLJɺFHWĩ6Lva%1\fĬj>6`;PKcPKE9@%java/io/StringBufferInputStream.classQn1}u&RZ(MRR@J *B" DrIbxn 8|ה`x潙7o߿|%ՙ5A{Nuܱ4a@q R`'h&!P8RGʞ2aD@tI4%&y&p'a/ _DGWF^+ zxj0YhF}2ygإD&TPLlPI@ut@prb=LNÖ́rLACd#z~7\뾙ynmDgMP4?2DEz%,8[vHDxWzBv>':=XU+9KXwce7ᇹuWg} \]ZWcsu}5"p:j=ׇg~A\nzcs̍E.h-jbo{PKfPKE9@java/io/StringReader.classmJ@$j^/ܵv'7E!tUu$&^ܸ\>xf9?ā Pz~Cƍ8N0fJcȝH/UOk V`p``9 QU'#q3yaӋ?Tu4rPs"}''j V#H4]]28/x8٨0gpv0^;207M4܉'I αDϠBMv7J8V(*("O*4B=p2-5%ȧbChN`RUֈkL5m.0ʚQOչ N6αmc2=]PK@yXBPKE9@java/io/StringWriter.class[PgmqwW `LV&5D0>u5XL|sNKmh %39ߜ3s_Є'!+ݙj:S#|j%O,!K% >؍@US?]({b :<:uAlNR-ʋ_z%*,O&ve/ڠzW#n#> zN*?`;98ܠgX@&Y&3 ^ypkFN晉 #icC Fd$62RH7d4gT4ʨ!G,iQOoy^HfelFEkL¬nš9_r6`)KpKɼh5e[(x"&BsAm#q" Z#)MCO}w ݠI3NZ(.j!ח8lGlJuGRQP_>_5yM= PKVҤ^9PKE9@!java/io/SyncFailedException.class}NMK@}&jAă7x BCmԑ+kZgy<Ql(7 iu*c*w5[#$߄˟}̆z?o2Ӭ`wDOD'ha nF_n]q ܖ)~Z5 6WK@H ;s?ab >H2B[0Hj 5{“4H$`+@.VPK}kPKE9@$java/io/UTFDataFormatException.class}ON0=NB 0V"Z*Fi[[> qιs}x}p8ǰ<*T)7Ϲx4R!|Ksu`Ne)C{0b՝r M Lz6 =B0t2bĵy]ͽ|bHa[i ^NѲ9v.C4P3TU;>>.}EtaHYB̈/XZvDbV% ^%#2o:v%6jcp'PK}n PKE9@*java/io/UnsupportedEncodingException.classOJ@mDcڨH`ěTH!6YJ ۤ[~%D/7ya8AŰ<:S()E6VΤRQRC&3dyL mvсKL[>C?)ϧH;7K ?1 ke<_rsl3~ DW& 8n @Wut Հv_萪֨vk:5o4Somgޭv=l-PKK*PKE9@#java/io/WriteAbortedException.class}J1OcZ[څn+] uf&ԔĴZ>%LRHrrw7pјy$UFdwo EjF >Y" ~& 9C;.ɜh47 A9Μ ܾDPgulB<&O<C3V)χ\K{y 96f !NŽk4NA[2:JؠI~{$lS Cd]T{h}"ҭr PKOkPKE9@java/io/Writer.class[OQ,r+.-R1H >-'tE??8RKw0M̙of9/СϬ l$aRZsZ>FGG0uYmma[B@xm7p0w~.CHGB6\b~e;v5!aqj=$0 5ﺟ{r5a,ϖ~Lvv] pYU򶸾%L:kCwliX C*8XڴC+؍6b9AclsoV/r]Ôs^Ω?f#MIUj<Ύs̀V [7Zx[Wz&ݮ|&mJUrKAE%cl{e^T&!ߴ `Y?[ >P*ᣜh=3a LEFäu9: ~nb-Vb e#rOoT^ ],urzjc PKX uPKIG@ java/lang/PKPKE9@#java/lang/AbstractMethodError.class}OJ@=jUq#F #"HPJthFLL_~%ޙ|8;o 1? ^N2g^\oV:p%+35q#B8pZ֥,bhG ~"Dm4b$i*# Deq-m^}ˊ Ndh,'x\gVM{=&~/9}ՌghB/_l_>|o m a@7|ψ= `:3FW dtsFЎ^OF/gD'1g ؓB;<1G2-Fm`0j[~;"mӶQnۘ1 !cȓ1SBư'c3f' 3f髨D< y9c1Ƙhv Oa9{`, ƒcRXxYƔGUX5'/Ҵu /ַ8cG@(5RA 94nY j6 XcX֎u/-1*[#Ώ;v~עy ?>x ͽ ZV9wPhυU 8}!IЦ9-)KN;zfC3g^ITg J<0)ĉ)D7-J=qr5wgffy^Ǎ]zO߮NRz·Hlg[NhўEgpn{xǩsַV8U+1`|P;xCVQ*},OF6'ε F E>h~#>v&FIJDļt}ǂԼĤTvFRVjr #["X #6֌ \ɩ%y `upF $Eyɩ8 6©kKS2sRRz l 1+i7L PKuDXPKE9@#java/lang/ArithmeticException.class}OMK@}jUA[`ěT=VzƥI6'?%ΦA?|73 ν8z\YJ/S`!|/M-/&{&NEh`&vBZ]H[9ʔ@')R !ENh*{N_`M2_-Is D4"i뗹΄=/_r3 3vT.[s23f/zeޜ jXvUPK(MBPKE9@.java/lang/ArrayIndexOutOfBoundsException.classN@iUD ocFF n|,O&|8[H410fv>?!b&DItax걜wzW+oxAW4X]XY-OYUp%lve3rLP7PKZ(/PKE9@#java/lang/ArrayStoreException.class}OJ1=NgtV[DU #ݧci"ig\~xT9qν7oэ0<)OKF19ڈ˧BRki(3wdHĐ2"6)V (k5_R%cYU0 EхnΌanoGn=;9hps&=`,ED'(Ѥdy\hUXM( 4ż~d3dx*9Üocm'vZg !rjښSuӤ A:i[1yih|ǟ>5ql)Rq.)@ʧy_ƼC'y ߂ BUZmj(؝dN#^C?y7o*R7(!H%b̃mқZ~` kl2&`SEfh44nfãQ$¡ǔ 8'cDpDݨP糈ѹHōu|uHWaf' 9\-/r+rG 9T*zI qz;ɿn{+|wϴ9sNvr ȹ:ڥfj*"K]X [Xj*HoPK-gPKE9@java/lang/CharSequence.classm P1SӮz$mB -| JvZ=T4Qf1ov̄FX*RTd乕U"Mwv (0DwC/ດU2Bsia톡w`GT&R]&nD뛎6|MX}1 { PKX_LPKE9@ java/lang/Character$Subset.classuMK@MӦZ xhEx *=xԥM n*z<Ql̼֚3Ͼ{4ƌ/xӛrǁùPo ۵Kjkin{Ġ{a"LI j+rCi3Vuԃ34;ԂE 9wnVfHO?UC}j^d.2\ŕ|.(CB7d(yٍ}PN'U5W_GE%d)֢l"ȣ@zN)Ɯ-¨`hKFrȨD82j!#1H&{^٬԰m4(vPK-PlPKE9@&java/lang/Character$UnicodeBlock.classXUe~ "ʹ0s=2\``QQQQ_jjj[VVVVVVfVfeeeenVֺee>yaf`V{y{{x _&TchʢJE鍕J`~o]5׵:lVmk&9nurPʧܨhhn.34 9'^\ܢNA%Ή64K;֦ 58Q <'HƋv <1GSק tk]tѰ!|2$nG7c ;ʙiTx NQRCæT*'ln9_Ԏ_.vSoH(lu]̑^ZNy <ߋ; دl(<2nBǾSuX*d:EdF̲5ҲdʅRKI Mk̨]!+qQ. ̧-g<'yqbiõ9o*))wc: ([AآRAsՔtg!%卵ӞTg9}HWҦ>$\nBms'DȬ VrlNMD~XĦǕq#/#VM"z+qmpfQ'ҘuüGv]9`ր(+ k" JܦKd/ {8K Ȗ}mǵuQIP}z De]MEn;/es^REqsڑ% 9/BT{ !Q c sW:NiWpMJdl2`y( nhub5e,raj[s8SC'U'*.=9>Gw|N oȼ\I.r6aI6^1b Kf{-anwc'y;3F7t.۽A62y?w: ;7a6g3!d8Ĝ ޛyMZF^'[N`1q=p" k#&oK[_\R;Fde6Xc3'a ҺXp^볐(KXJOD|L{`cㄎUeQYwvwk&ghBUUvout:}/>:+xRNЎAZD(h ۆ_ʖ9!6[ۓ=z]L)><)K !L'WWKZbzN/Yep /wbHca ˻z{φ5/hOnd:nfu SۘƋi;&Et{&idjOLSD}Qb*#LD}PQg.L3D}iGD=t09٢>4G%#D}if:RWQi3-LLjwcE}YԷ.qt0-CDDQ?aZ$gLE$Qd:Y2"WLKDTQe:MNLKEt?1-d:KߘwsD/ӊD:)%)-)#j<+j"S&3DMaDMeZ)PVQ3|QMLyQQsBQG0Dt"QG3EZTu2PMIAyʬ|$ʍSQ^y '*/R^|ʧ(/Q>U4ӕ*|2g)| eG9V(-Y圲RUW+ʡrA\H+۔ە;;W)Z| k+k)W+oPިܭIyr^>ʰc~:ܹfخ|動/QTyeʗ+_KJ嫔Vޭ| _G{My <|x,ISO <|x9;/?^~  Ukׁ?o6358h& LCit`&p08 qBD`1p28 X ,V) 9`%P" ڀ`X끍& \.vWטko#;۵_ꍰiڙٰعf]K] ;]+] 3ZY]ư\ \{\k܈^=ĭAX ַ˻vwn|,ۃ0ðG`gʞOž}= z? zv<EXKaM`U’^+z+|:qVqti>4fLZcfS̥f>ufZgR,f m0KiYNfm2lrc|b kb3լ 7hlACVn"vtEtC;Mt.7wne+ty6n0]g=q<$h~n6?Kp /%\N .ty uǼAM: (sN$Q4Oc#mZ{=oM!3C$uuǙϙ>OG3w&fXcޗ &|s/{PKRQ PKE9@java/lang/Character.classXxWG$ݬIP(t/t \HtNI-B!K RV(Ж^-w'YOϹ/w{͕8!bibzL߫"aCx 50w ,އ%@hRda7c(ч&Ra={&CE42A*1-p.\p,,Q+\UlcDd}S\VL'{7dLefP{-pAAsq= jmnJ햣ؔmòa {Aݳz+#٬ha2 L@uEN"a oSdZD"$ajfL:s4 1k*[,3s{2uf c`֔N C†#Z# f);g;)T7"qzi A1;g%f ˏeF.-.]rSiZze ]FDZ la;Z$?s O+-?np` %v CmEҰ.rcVk=܁{D\՚pbȅLϲ XyVٕR+{<u 0q{҆^/^ϼѲKcrv;m9|+m@p+-yl v1jMpgG.ۓB!?u`b5C)Pq+U&sj]܃<+dˆ㮷x1A50QkفPe5bmry'oh Y[* `&1ȵ[w qY'ئ%~ٚp}AD_Laضnef d1gGr!vn[=2zc ڄC{ q)c`*?vv Zz QzXG- 9 vw/b%^nAˁWpx%*^3rxzo(o/7qx3ۀsxN >~~6w y~. GT!A!!kg_,NN_駀 Anr8 <~G9}>a|e9|xLqa,>a0 5wD ؀g\|aj@8V^>vAwo⪼}I]e%sdkWTޞpM<z]1Ыݾ4k%7[d57 >~h:z叫,=FzdyN)?fWqЛ~1oSǕs||c'ヽo5v"@V?D~ՉY2pVozxcS·ZVyj]E[qWѻ}}NGzxwGA,f_?JNF>k')N?K9 )58*弖>k7)a_˿K9 )u8)HI9?XGirI) 8rω29Ey8kc} N=PK [ V$PKE9@java/lang/Class.classYWGo .3 ΌȢ("a$)ut?!y9yȇɭꞞ^j5x/=^rόJ y #jFY,3ߒP0ap^~ l^I~9-6"j¥t':UfN'3m֔nVz|mu<VNDvVwr|{:O`f=9_q8H+ >;WY"ƚ|BZY>\if?WCTDy-3v=İY<ѮvAV3ӌuQ#Cp|SzQV5Vlk(%CRAt݉KBKԈZ^sF+dM"rQduWj%6u?f3f0sN̰S6_iXwZoiZ#2U5}u &JT M\ Cч>s=-OL O׶zt=M!oٝIo8C/nʄ ijŕUY ۮ+BvR#'5X,֦;h`ERҬ b iae8/_nY YtO| B9OŻ)j5N -|ϱQA )&3.٫O8Mgjb ;#.v|؍/bk}~z&lqa{*_^oa58lU:AgVfWo p)u}{IaV39h>'tCqpX'8cMzuX) 0rXZl#0oO(xsp>u@u.dAef"O22*{CFԡJNM”}:Bax>Aֵ`lo+5v oesUોAv<9XTB05duByfR,<2` 2WndY/"'/ה5g+YpJP K|$ PYG3~m[?.g#j_dd݇B$ Z$ KMU=.֜{IT3*51y[kd<'ƒfF̭eAcoqAk Lye[3o2o h++z;󿺭4'yRPA0+C?P8-#֌ c5A'났OXsn/+gG~Q1nY8'|GwӃk ]܏'GPKfb!PKE9@"java/lang/ClassCastException.class}OMK@}jDoC#ޤ%x6.u%H)-O?Jxof!<8z'(D9OF:OQVڨ $4zc2B-4CM5NL2I TdcQ(Eg2o;BPmƦ۹/PK؋PKE9@%java/lang/ClassCircularityError.classON@uL @ .P`Dh,,s2-H|G!.@;ٹ}x}papp/"֢DJ-.)M0"xt3Bp U_:9O[}q!͍XhIe& l6NUqg7Ҭ6ȧz)̉]cJfec2y c%/r3cknq \s qъZx׉G+B+YsPKߢyPKE9@ java/lang/ClassFormatError.classuNN@ }NB0ĆX*:E,Er i"]W'$>B@z޳Wg(fս1 ?|WNuuGh ΧT< D@h\=,3ey)B')MhCz%4ǐ'y:tWWl,!K3Wcm.A O*[r(],H͋7Iܰ=ɭ@p_Кj󍠷|6۪Cw;PKyPKE9@java/lang/ClassLoader.classVRG, |q 0 vlND$4u]jwEL R9ZZJB',@"kWZf9S+RzjKgi!жB%>&]74-Vh#Н S)QP;+Q}95Kgc9u~mC9%yTgҬ9Bj֪mSM#hNA;Ep''^cEVYvZŤM Kw3{`Ĉa5Ȧo B͟ 0olVYs6-˴-jyj%˒i Wa k۪4k+GNm9VRETP ziт"+QT G/c|ʊǥN]/5&%ʜ-h^['*T?퀵2zcvt̊Qt)T3hbO:~fi5Gus7vWU#d36+Vi<.bL;U4*ej\|Jmf^J5в -~A&CRT+TTif5N}+\-Ѫ:VV_Y%ɸ8:=/COԂ@;];VB4LUU,~CQ㱐tU}?CiVz_˞PÇzP =*%M&^|&q\c/.)b֜N)`ܯG<-S48:o 8`KmOCv lewFyPHgq5L? 7!Xu1#/N?ϭU |$>M4M |1}N5DR8Wa9Cn68UGL -@kDt$} M)ϤG6OC϶ޱFl.,G䃘|CFd;dq(ijTCzؐQ4(6<25;PKFPKE9@*java/lang/CloneNotSupportedException.classOMK@MDcQ"TFIKS}.u%fú)[= (6 }̼qyRr U{e6bzEe*C {\RtTDha6n*ii<O OU΋1M7$w _hYΆ3e2U\Ikx~t([(T%}G׌E"nZN#"։`Eh6#vv&FIJDļt}ĤTvFRVjr #Wp~iQr[fN*#\H%##302I&6PKiXmPKE9@java/lang/Comparable.class;o>#v&FIJDļt}܂ĢĤTvFRVjr #g2XIjH>#kMOĒҢTF6 Wp~iQr[fPaF +L0@DV6 cbbN0 * PKj#cPKE9@java/lang/Compiler.classKO@P |ƈ1n5lH\]`XJC \ą?e3-ZZ{ߜL??\ Cyer{8DAaW ceq{pt܍q!qC+lvf LR]GfBs\ u?])C%@iWlOl\c듶rb @OE_pUCڰ6}-lsа&*ޣFrH3suFbp&!4HI7SwJQMybE9A> O*,֔VT=өajiI)+9#i+aUf `^#5P=!<\7lEWh)`Wr\PKaZcPKE9@java/lang/Deprecated.classMjA֘QP'1 0>N025?*i订sB\NIltB=LVk6Qηu'JB5njyIhvK+ǹsG6%йI9BHJ{2yG: ΚTP.\YFE!*x'{PK_KPKE9@java/lang/Double.classT[sD֎Rꄶ@KKoIhKquc'UP& U:Ա唷03<0}# Jey3fl\|{Xw Dύ#ca؇ %0jf38Åwyhϐ,<-lU30ܪc\vkFmFh!jEIJ:#v:i͢Gq>1^ԕZ);wQtͱJU=T2CwHXsh $jچn'e5 aF ˶R׈yf&t7qj٦lԍFhZef$WRb19LjqԐE@6-Ōu1c˕JycCb3;c>ܖ'xndx=.E% p5jeT'esyuZ4zR莧glp~Fjg ɾ/A W5oMž%Nb<9͟E |4+"ü{ L߰ЇU$@1͒W M$k'˻>=~IqtuGD"A"r\lKBG>,yEVMȈﮎ$<ɰH{yaP&ʧ"'%$!H|Z?C͜j| %<ϡLBP 3RN w:O!tߜ9/Enz*rrqx"'ΛJrzدz];׿7PK5 PKE9@java/lang/Enum.classU]OA=J|[P *~Q,V/CYʒnnxM|0>wfm[b:;ssϜ;xCaꌟ΍fbt[1Dfz3a0ƐQ,TKj 㗈ܿcXI34̐U5Ҍ^!cZqL1jmVݡ r*Lk7OM96DVm2=gܾd P2FiV A|jm[3N V|]ۦeVxCM2x ״%\UHKKcdCF J*)? BK6UйgG睎P>|0zi)f[LX9׻ Ö(L-{[NB'>dĐ#gS\$p72̮Pw5qBֺ`P A7{s8"$!+D5Iw?F0i0 K$1 Y iGAs4O$Mc,Dg ",Xq zs%J;._}w1岾ؠ>#XqgD?G4wk<+p W@\#Z+"6<6 [58EN3yE󱫴@Q_] [rcIrPKiPKE9@/java/lang/EnumConstantNotPresentException.classPNAMYU\1Fԛp!z"Ĉzom+=x(aAqoR}|8F>=bVT9l͕P)4U~(-;b8g°p6ҷFC[RJkHC׎%N&{qw/ w[zfv>>\yk<[D7Rҁ 'K?Y0W"5C+<2>qvlEܭg^y:Rs54xb6p\H-z՚3eaPkӞZaبtJΓ[cЃ@}&uT:Eb.U[=Pm]B%ޫėFAIĪ`_ЭlFUZ_ ( 4t._/PK$%PKE9@java/lang/Exception.classPMO@}[A)z3/DO6oy2Gg Jh03;ޛ 4/d߼S.Ă6ϳOȯ >L# l7adh"(NM*Pv K4v'PiSuQsoB`Ns]C!>}eyl(f8-T{VCL˻b~TJ yxI&@DV j*YP5ՏruaWd$pzArۛ,(= !!,$(p V./YwyZ;[XO<譬Tik%]1kq_̺^BHhXt\Bү/0jN ⸳Z3 dR.(ڶgѦB0)ERlc@,lW)LgYR lQQ=hpv@6p$ fc 4,n.kf* s[y EYA`2.RHѪOev-%|*nllf1OU=JQXWY%$21%ФG^[EWj9h;667j*htDnB=B @.BBI1; } ^G~G<>}s<E^r_FOCFDF`=cI~;c)' b2/ a6-Xcds a;h|' Hi>&Ŧtn4mcc{ira1qTeew1^~qq19&XcmH0@Nx ,72مv vD^ui#tvC2tD&<]ՎȤ.4=5.4g<5Xs'rSsĎrͥb xF.vDnp2:gVS94Lٿl_OPKNG PKE9@"java/lang/IllegalAccessError.class}OMK@}Ӧj"&ATz%]&I< (qvCޛff>\A8~ igѣ2.MeYSlEMTjeEYS.K%7*W-?x!lIT.泉4ς'I =Fټ.zTˆbTgCw!̥%bnR좣)p1s2c{)`f|˼̇KAmQnwPKL PKE9@&java/lang/IllegalAccessException.classOMK@}jQ/^S`7" BR}.qeM$I˓gA|7 q}'f"1"ϒKcT&̩zu AuB7&gōbmnsu5ZL"B 3yS[]v2$lFulvD9t ѨR]hlև-o` 9K'׎Wؙ y11{םys.h6b\sPKpPKE9@(java/lang/IllegalArgumentException.classPJA=ZfYAPхz]AHA ]x?ڰN1ZUECEߌ \|s'3lg0> o\y[ _)eG*c1g\H%KTgp!<0:Rh<`(v!\KC7gߞZ j>lXeh,Mz#/3SڳSKdAFW%q6REE1K]2nc 9;,ab~ Nِ7b9e'\MUݙV,ӎ-X)`ATEX|U}WPKv{BPKE9@,java/lang/IllegalMonitorStateException.classOMK@}jUz7x!z06.qe+< (q6 T9̛x3oЏ0>Oez(2Z:csǝ8.ģFvܛJ;9]ISpo;ڈ⺚N%z)s+} Cw/1l}J] fz[$7-ą _PEPK a{K/:>V(wUB/^kDŽoZ='4b_u^{nPKjPKE9@%java/lang/IllegalStateException.classPN1=AEyi( Ą¾`5Ì-W&.?x[&BzιpG>AȣQpbîZ\œqP_=w)#2qm" 6 c(vd$P=>CyJ>z,? F-zթ_ehp&__3ړ `82xF'Spbh> TGQQPfwlQ Oѳ2(۔ y'!_Pv֑+\ص;KdډT9VdLU"WmUPKo<PKE9@+java/lang/IllegalThreadStateException.classOMK@MDcڪg7" B6]ҕm"Moy<Qm(y9!E+%r-85܈L<Y!|%Ϋ(7!4W )"B-40Yj:zGJ0t2jȵuDgF"\Y)Cĝ{j]<!U1!#lbō#kvF ZF- ~o;PmƦrPKa@ PKE9@,java/lang/IncompatibleClassChangeError.classOMK@}j{7x BR}v5&$gQüxoj I,EbJMr,1ڄ /ngQ*TuMh N?я2B-4LD:D>FٺnLAQeT1 œ[SB4 [e-Y5`1*f$^8f;[.KF76Zl6w>PK`PKE9@)java/lang/IndexOutOfBoundsException.classOMK@MDcڪP=4T<( B`m֕t#oyzķ۠Û1f>g>a(U { Lgx2S>\}9w. TE`hDYϥ˦(ǧ ;_ľΥuϔ!gEino)@<2OUH'oXy〢gMQ-FQ;2.dulZ-o|PK PKE9@&java/lang/InheritableThreadLocal.classN@V@p!cbbh" LZLmI|+]|(&ssf>?Fp̧roԼˀ\a9Csbs7 5WbHu'.VoPА!C ·".CQ)ܗjNG>1i3TϏ?e0lG>wCsXAbA(S'T~}^+$0zзŵZjx}PK#6U PKE9@&java/lang/InstantiationException.classON0} BK,,TbXHHKQw7X(8u+~ g7$@x;+c1Νz]*aU H~>DieO U72A-4ڹjv?ZKIU!ʑ0u1jJʀZdwυ9rt ɰB^(lч·]-p/`7p9y'N8Fbck!`\etg 2oxBPkw{}PKn3PKE9@java/lang/Integer.classU[S7>wpl\Z&)#0YVLNgMO(V29 hGVExB#]ZNmEz3t֌>[0J2ܔ8`UNL]70:U'26mBS Da72E4] Z#v 3dnlږr6݁vTqˇ&54Բ& }mՌ@ Z)NV0$͸\PLvCz1@&x߰]mMsW媠vs9KACD|ߕ+V 6;0[e[l Yաo_XD8{@R8NE γ:88^ao%B2>3ȣlk>l; a vIA )$xLnm殢Et]yG>8ڡkKQ>:=q->ԋ0BƼ.N`Fiuif?744F[ r+WR8 crx^Pqm^(rB X6#x{[mE~9E.ãPt,Jh'BNjZG@NkkM3Sq7c=B6sZy-r3rA܊\<]ݱm0Biշ#ܛ|X> tLJO/x<$sPK; PKE9@java/lang/InternalError.classuN=O@ }NBC l X_é=.qbBbk$@ll~8 F@ B[mѢ621B+ckQމbBt8'WգLzmDny*̓ϪB00sB8V2&kɅ0gn?LF6:9E9.e$^=pp Νqљ1Xe潥1oPKŵoPKE9@$java/lang/InterruptedException.class}OMK@}jQz0M*^DA^*oӥMY7˓gA?|73 I{/f"-Jcy.V:BHH4 BLie ^c6h:zIs+F$t2P;H?O} Qzg?xPV&Wʭmsap3F<|ғonj-_L^Wy627y{!.`PKTPKE9@java/lang/Iterable.class;o>#v&FIJDļt}ϒԢĤTvFRVjr #G&HAI~#XAiIfD#Pܚ383=/(A"k;JҢTR^z 6!V>.bcd`d`fFY؀|v 9,.7PK=2IPKE9@java/lang/LinkageError.classuNMO@}SJ+p,F ^/ ljm8xKI=̛޼>|~CۇC轈aWG3%8$xSP^/CJTQ!oKbHB+V"Y\,| ;+Bȅ Iȍ@) +b8G"1:-ONg`QgW-k,֞=ۮ ‹hNtɤV}Izڶs'0Ҷ7ԡ{&#zӫR$0Rb>±:ށ /\W~~3O̤:FݢtpCc}ɍiX$ȞY eg`8ss vUbM4[U+q4C 1u f}[e)B6c{MJL&K*6٠fE`FĤdwd]H6mDq 0-*E+]qw!kŶ /a1ѿmAiX};4zb80VLB1 6;f !kڱ9LgQ,[9&xǹy'ۆE. K5N͓u'cBPŐ8+YRP¯P׬qx~@rXtjlǐW- zrOGbQhXA~b H@SxohuƷij³ߴwǯPK 0 PKE9@java/lang/Math.class[SY{2`@/ D  $'ɘϰ_e/O[~%,NM?\zק?}B`~co{m =~c=Z ?E F] ?ͮ(v[ 3QH|zU\B7T*yVKN40b[4ph;ֳnbyDKnU4g}/\0-kJ7 P)cJe43&.M<?qQu؎0gLCN+V<_N\mxiץCc7I47MŒF_:iAZfNFCEtq9כ1'(SmTzK&tV.dZmWz©-ܦ-0<ԂD0A9+JxSza,S`] ؐ;D㈶gYYlZ61ĖJxt8<&H^զ/ݮWʶ|Ii\> ;2)0 !;SX$Z.e mqd/|G \qm~ VqW#cB8_cHrOj?CdSaR=DNT6GLiE^cy:& Ido3 &I2,3}51ُ1ϓpQ,YMw H2 dOy G4yݑEFdK >IfI/FTc܇SYqeC1R^p-g{sӪ"| IrAI K$Ybe,3$A>!' @Fw 1THcxw~z 6s PKάh;PKE9@*java/lang/NegativeArraySizeException.classOMK@mDcڪ/"TFIESH۸ĕt#MP'?%*H=y3o}}|8E/@aW<ʹʢȸԚ$U\?BvR9s`hG Uq/B4F >C'J X;>C7.RyS?0l1οz2IQTHkxbtkPFP aKonR]pЊjacxӉgZl֝wPKo PKE9@$java/lang/NoClassDefFoundError.class}ON@uL @$]RYi_t_TH|ػX3{x}pnp "Dc=DQ\˻ō1ڄ /MGJ#*W?^ D@h\4bIB'sMQ6~y a-^fRy)̙K&2s9RvoO G>#1,f& ֞];b \ Jl[˼̽6ۨms;PKalyPKE9@ java/lang/NoSuchFieldError.classuNJ@}jċx`ADzߦKfez<~8 (J0of{3} _0"NQk} ?S+,Q2h,Z)nmx XbR/gB?sЋU)Э2Y21 ҲX7f?!HTS1k9p)ԅ}ʞGAc#td#h̦<7PK# PKE9@$java/lang/NoSuchFieldException.class}ON@uL  .P`Dh4F/)9d#~ { x\1ݽWgCx[I!,C%c.+eti>BiU]Z12STi9&BzE1ySz 2 iTz6p<t Qf2CeW6ĺp8Cfbn?cɵ#c1vufkh_mg] t;PK][PKE9@!java/lang/NoSuchMethodError.class}OMK@MDcj/Tx ^"oӥYII< (6Pt3c潷_0?s^,‰J4{UwZ+e8<ZJr,jYꖡ5<2-lwІЍe!&r& X2yStL=??DIUb6<5t A27:u򉱡9>g31_bg!6;+&1o5sf/5D]l۝;VPK4PKE9@$java/lang/NullPointerException.class}OMK@}ӦjUA7x="Vzƥn˓gA?|73 5ν$z<*\ 7g9&PKE9@%java/lang/NumberFormatException.classOMK@MDcڪ/ROՃoRD,Km\f#ۤ< (&PA=y3o}|8E?ǰtȸ4Y 1R5<2WŽjm DjQ{ Hr#m4A?1 &:97'v)C4)*^{n>2 @>2bHULGXyqb}QuB+hg_m'ޭ f]l:-}PKmVPKE9@java/lang/Object.classRMo1'lh4NZ(D .TE()QRٺeo &pG!UZJ3o޼+h#tI~@I@ဇ\{3NK3xȎ=&Oi/@ipF%X-9?!b^.}곡"p҉BuPHP˾D4+^ %]Q@4ߙ U t ugUD'j~HU$\""8A<5a%BoQJta?=؋<5ʅ]I*&e4u[Nͻa/хK]I}Džx45%[D+sx{KG/rP`paOJEcc(Q93QK8蓉~?e>tveO?`!0{IQPm8x7Kq%P&;ЬtݰZ/4aM`l AaGrBo]*oN+UjCj PVK-s_ux֑׼Yb3@YpvO@Cn.psCqZE0:V޽ )hܮ ,Qx]P6+Se/٤]u@wwdq) +F3k nna nF(p~%;|Q} =HjFUdVJan(!ȼ\AI伄%XJ.X*dAEAFD!r\VWA.Kɍ䊔܄{}?/%(BO?;UW6 Xֶ-G/` j(nm@f/?PKKƠPPKE9@java/lang/Process.classeMO@ߕBO?#&MbHH`/eKJl?˓?8ibγa/ νG|E.VM7 [Jsǐkw& νr(G:xS4 y0ZFt̳wܙVo EfƒX$*sazZ+=6Z%q"7WI44Pm$bQZʥ+P}2R4m̓ JX/mM_6˹5ui1wZDM-}ǩײZ: 0iL[&PKwAJPKE9@java/lang/ProcessBuilder.classRKo@u^A_iMuB Cz( [9vv"zp~? 1$nIs|3m)h)P/j&Gaq^ a"qkW3\Cnq@^eurSӹ6kg-޵;~Pk[摜;,1 91ՃWun^Om"n<{_CGyibϐh(@q?ݽzW?<@ʰ{=juЋZW7Fm_"/_,B.HwGcK1nkoɰ\Wg\+,\VY,g=c 9r󂍤 a ,0ړ@U=_(`Oq@U5{2_ wm9)hྉS]-{ ŖE<T/Q@ 3n@w*x& oa<8jUXD X 1>F<=Abex3u%(:$]C☓ Q\Cgؖ oǂF 6Sj_2gSm`gl 봮R$cn9CU[mw?؅Aɽw"m*0#PdvPKe^PKE9@java/lang/Readable.class;o>#v&FIJDļtĔĤTvFRVjr #KP#X./3_9#ȩ4--Zӓ˵"9$3?A.T_Zꖙ U`e`ف< \@67PKy4PKE9@java/lang/Runnable.class;o>#Nv&FIJDļtҼĤTvFRVjr #sQi cd /-JNuIedibcdbFA l ;dbPKs?hPKE9@java/lang/Runtime.class[S@ϖܡxEh)u(S|Z ML:OC9l۴MH3Mws{6oX罐 0ѼEۚ $fink|7#lm,5 ]udP6{]3C-\.9vrnW :2)e=p[F8Vl~noI;",`.wj/"\mNհqy7,p8؈G.s}-vBUZfcZۻ;V1cG&En;^0UY&āc‹fÚX6aV1sv(A]fm˫m;.UD`ܗw c!?ŭqKeӐ :iy{sWL-)P%T*G,ƫbf,zWlDu~zO5(U6 j]uEW-;:,\Y6w cE10l3%%\IuC>{qv jp0)|{FHCrF,'^;ЈE5GﮯmQΆqوb c<<HSqDIW)A Sr';8Jr'wpOC&T)t !ӡSp>TLW0fڌWU0hƄ(q1/Iq1J$.ɧ8zU!p?3% ˺i?qM1#! 9C1KdV`24~u-C0>ى6(b2t LC=|Ti&cph38ʼ29ϕڔYq<,.hO.+d(N8)N@uL{(VSf˭wlQahf[ mʊ(E& @FVU zg{L'+h`MFUuih|ڗPKg4PKE9@!java/lang/RuntimePermission.class}N0NBЖ.?iY@0EQ V98Tⱘx qN*uh W9A",x,uAzP& = h,i3˄H`6kg\i[ffiYXӞT^#SY셱ĭԿ㮄?: ZSX{BcUlP- Z/ ,q͈9!뮌m3ĦdK9aFwir&WPK_:PKE9@java/lang/SecurityManager.classV[SF>k(pHB i1` @ژĩ Phބ FHkSڧ? ?ӣ]ɖŒ,\߿ bFdX'}jV/w 8N Ի 1+wJ3- ZvipZD9=d.;.5˲mT'KuYhIM"I,r~LQ l(}a2 3ZLc4=kI˘I"6Nyp8Mja4#NjX_HcWc(BG )#~o*BB-Kt)ʭlB=O_%ȁ\p݂mAKӆhtH3CvTrjo;뺲V>; ^qHf%*zr0M*]VęiȰϢ<ǟbA"ZUk~f" a' wjh 3;~?R0V\~I_vRLΨ@*Gagϰπٙ-V\]aen;"Z2JI`R1WQD@ۗ-DK\TJ|lN>\tĬaLަGz/PKY;q)ȼ7Pw"SSC+Uٚ7;xGY*gʀc8?z@@|@˜{bU+ mC[1}d6"b[EP}ԛ `7~#qO h^(m{yN|F/'>Ġ7H@vJ>3DF!x"A$i%lI`(,!u`0A GBwrHZ1}-F?ch%xU`XZ*aO2𥮰w# J1^$DR@LYkX,&4,au׬zșԵy.ԵAaH>n^Wd$*e1HibJ ĊOGV%[ʄS1QUC3}g5E|k:L$ĺe1ea3ÆςϦ#;.*︌wWϥXu YOy}/5k%|{s{D-N$ Qj XϕXa`攘p7!sCI;8FXG VWf~4ӵgPK>ŹPKE9@java/lang/Short.classTYOQN)P}mTD[T0)6P 3f:m טh%{ge:X3gs퟿?@:L(bWsed՜# 5(r tcc5v^jxw2NR=+Pbd|FvONDWJ$asZPEbsx*i Mpkfo3<ǪLCQC}g5Cu;t͚E+mٞriBd"AQ$S؁S*((zhҠM r yZ|d;2u!A CD7ڣaiFd45BQi%U^2 :x QKD𭭖)M'~# Ux-' >y\wCGgj6B{q?9S9l=~DV8!ފzOFm$I"@61.KQgGDW&6^a_0O$?ma$؈G1ғ`kl2$`S1CqN3{Ki‚l4RcCrH1%F.DzQ'*ೈ9Hɉu} G:"<1_2nxM"WVAN eτ8rL5o7-է=a;-OvuxK,tCMȹo^KcibNV/$ť`ߑU/m?<PKPKE9@"java/lang/StackOverflowError.class}ON@uL h.P`DhT s$'.*$ >B],!;zp~ j碘ģRd74~0F>a燑*SV"TQ*TyFh Sd;h# t^WOcin8^3([7MgnACèb2t0Gvܔte2yCor3c nq \%qъW x݉7gFl.VPKPKE9@!java/lang/StackTraceElement.classQNP=P|sƈ+1n&$M] ^,mR* ɅL\~q蝙3̙I??԰FC^ӭ}n=\yg OCg.;=ab0BTն$؂!u"2͟=t 5pD9clS8UCɋ{kSŽt|Gٵcom b/D!9Mq~RY-a;5H;n`vVވJw.U<-fr.*4At9SƔrifL\r%~Jwѱ9aΘЬV<_N\m:!]VqƱu#[XHKmױ?H h|j7:Z8.z3F[X>Ty}ޒ&~2Ym#pjn ʹR³evZF3:(gE oJ/eX+@rE+8^wVݳZ5[8ֻML%n;8΃ Rwa]k ]jmGO?,FA H5shG`p.(^\\C_Qz\p=wA~U cGcc\8cHrOj!r"DN0"'CdG^ g-DB"1JyAN y$o27{ӧMa}+"ݏ^gj:ccϓpQ Y]y$1;$yA%4G=uc?|y{佟ctG&;ϒy/0$es$cT<Qqq"CNe_3,Hb,k9ݛ ŘǘRz,FgGG>Ba;$ $Yd%,12I.I2=c2NzdG/!)؀gg ^(PKOKPKE9@java/lang/String.classXW#2)6`7~ď;&!!b2Be`+lw46~Q=3;ZKfjv5s38 2؏챊miuqu.$pX]q?7* >A>QlU;`(fJR~TX.KQZV& mώjGBSŴ7r*Fڬ2I{^8].v7h_RQ,;8M`7d- X\#;x АjqЭl ],ɬ͢;>eh5M/ռݥe7t#;r}/Lréb&c. ]Ps+ȃ?qhҙzѭxaZT(S J;X!x9S EE'1F5G5;dЙ`FP:AQP8K|V%+93ôh .RCÉLaC:v|3G &+nDDjl}rdl6 dԋkv%M\<:ս]-,<aaCq6So3F;>mi F}VLFyK ܲ/tu4݋h j5y7VhAY >I/\\߮Iie5ډeK#ԉ.7V=>Y+v괝m&,gom\7p`@qܮ YЪrs** hb;촲r#sʎPv*+T*^D԰W{ϼl\Պ,i60Ht XVFwv|57ljLpo=h)z@3 ŢqtkZqyKQ}$ X2{l|fjN 3`*,x/]/}VIs ^bZEPɽPzhR.`׶٭ "`/pe_Y|v (8ɀOa|X 5|fT7i~iB3yAМ099)hN )iN 1cgY:OFT'cbv,D0#lW焣>m8CWv50R.[;W]5iL3.3*Jo6(aQWh@8._13ڟIaU> 9%5%0)'?x7xIx3kqϧ -6p uQ eBEC>gqQ14K% <㒒(pi9nj9^VrnAQp\n冓;[ 8v>ZM#UXΗ+1ฺ/wpJ<Dz62Ȭ$IdJ<2e~쟡W2T[m \IN*$-MGexRrR2j1kPDuY;MYn0'kBi-QZ4>Yi ۰Fؑ"i%o /8yy8/@ѽ!-h|6M+퐲jt۰~ $N"06iXpVO{VOt<6Pղ-(n$l78Cl5 EPw5u#EK=ؠSJm,[j[1cm˚9|螱EgmTzGBUeV/ Ii]_h_hZ{@~݀}?F |?N ?"n?ZN B~ ovT+ov[ffU^7F_3{?PKׅt!PKE9@java/lang/StringBuffer.class_\g;aI4$PH a Ĕ$ LH] q2Cf$.uҪ}]Uսj]Zs}g`7}9=yS{IVCD@)94S˃NN-O䖖L5Th[_:3l"U Y+cIac :vZgrV*a :dl爀 9U%lu]9N4u鄙3/+vV@zchΚ!".9:j u>7hXErև'bdq8F$Y0O^8Źhh.za}!3 [1 3g ey.Z'ށ6lr6{uCrXggG0N2;2+n=Jk$uO ,%*.3W 8[mώ:c$M&p/)62Yn2f7oaPR:cy;i)^MY'Z,VXRp´fu-^A36e-PTsJnYz#&ڀ9QeŘc\C^k<Q2Z6V`@ p-"$ 0i읥d ӳ Xs@IaWzBff(FNC 0W̄wY7g ZvNҫ7Wն7`ZoNGM٣B׋i(|%!Und/V>B.G(6=vBp$6G}PW 8nՃ>Bn.)&Kqj pO‫8NYRw! ؇2VL*{ tc=`[_!E?m!a  u=s#N/ȿF2%*{eY[]쩹\Zqt*[ })N:Q+`(w]伣l.qQq\n?&w;Sj4j{;Hr-J?][N ;ڧg xlݛH~;F2"+Vڍ<mlQ[w M(]O ]"ZFd2vi18WڹPz gKQm=v^ϧD7BDF4FRs AkuIZp{Bo# A%ic Ak+%8>+~62@1lU;"ިp m0QҎ҆B$@I;83!ff@;30hw*<4_ IS.ja2Pϯ|&{-SӼ UG\͵0-5]7妺e^΋f|zWzNs5w9[fҝW«8⃼JgwE^=w"}/'yѧE^9exDKV= -y_/<|<5=rz?T|1MSs);cFrVrT@鬝'r[#+23V:LTPJY~gJX3`#T {s$ml3i&yॆkHS5L:+53c#~N-RgKp o^_JXplYlh&~0s!5ӿPhf&퍜;=_aHUXs617F[ pݔgXjF ۋL &?aqVGӹ!ŀp*O¡J7`  a83L[h=h΀hP=sxʀy:/b=#[LyBffh4f)_',s<;L`yLr޽ӀpZNͮH r {k]/z0,`w Kn&'ҍfMI!"{QB?vGA(\{mz'tˉ`O2j}Zv<R\(Ƃ)@KE2)`9*WUƣy6_5 "|J/gH'k\):ZmA05ZL=0b 2%acQe4Jv8괌&he\elc2vJFo ZFdJ>˔Fq{= jQvckmm6ݗѤe,]ėѬetHF/c%ݾZFT2z|E;WQ\Vzd.z+ ~hOD-@DNDx]ES>(i$i#@)iV#iCv땴.62@*s<;@a~_Z4VҮuI_ZoZT҆}g/D33_v+rCA-s}^4܍o)HLCV۔yt8S.^ɂ-s5n^OzEy/^8E_T%Nt_hughhW8Ou5yêMGy*ͷxM^Y5S.Q{~ZyUqK<Ҕs^K%_{bkox bT<^yxN,_8Gyq^TӼ/*{K{cUPK>xho$PKE9@/java/lang/StringIndexOutOfBoundsException.classON@}RPDލ@1 ƃF&0ܗv5%%'~e]H&TIFANYwn p~&\A~` Ue;l`smI`e4⽕)7pIXMUǾ`VomPK#k2PKE9@ java/lang/SuppressWarnings.classQMK@}[ĶZGQ33"T'ۧsj u_Gw>0Sb;K7EN"~{V&;D`tIϿ.; dqw'&x'*4<5fAu#f3ܚ[2R6`~lM=v,4xH% Hi%1;4KXVT]hճ)'m Lpc/K=X-nC*9u}oPDޞ)c_껊ߵ?I O7BRR hn ʾ6~Y4,'PQް0X5fʠ9;xOiD<\WJoTh# /"+TnÝ~/ѯ¢_Et 0~jyllŖ0T,rN!˞GJab7.Cu_M ᒳr E"ȅ-#Aɓho}%ʝȬxn$7bl}brJg=^T|m%9ޏZځݤ<s I>Gq9[1 X 7N$>F(~ke>(x-!)PKX* PKE9@java/lang/Thread$State.class}O@ǿG !"6lTӰ %3]GBth$2 a.=繻_X.ul-wrބ[-"Ds#q ]!uZR 䊺Ub +ZY]S*T} "%=ij(#"Ad0@d 1x@bePAA1D(@A7Aoqmuk{kn$JUZØOG&تl:Ng:V-DoTs#ϱH<:5>doּ{hvǔƺ'7?ѪLTWK7ku?O$ej;5*v~yr gߵGWN9И溶Ǔ" tқ BZ1R`c6>Ď*Cԯ4N)eLΐ8E`Cp1D&$OBI 2p#ic06 Sjc87}2я!$1,bEY>`i;xC#gD ay@L6 !{aYeas3_oE#W)D5Zbd [${@:ܾ SR(RPKy ʶPKE9@/java/lang/Thread$UncaughtExceptionHandler.classu PE$&Q0l-EQ,\gx,Y~B"8e830AGG`")iWAB$:CvSB/= ߿&} (]^ VI ^)L$DU(IBF QMhyA|(mxPK;xPKE9@java/lang/Thread.classViWF}ccH $,$ld3 [' "KSBfkw[Hp >!CN3kS\lvu{jn: ̮{n@rՇzu5R%SLUMwK5-Q{JbO`["PLM(EڠQT5Wߧ3]. WQۥڧQw6\U`uS]saSMui u;:X6MU]%J` <ۦPFEBרWWo OMNmB$%qB0OweDlz=W7&U }T]F$XuciI֥_܊:Β֨eYBbG3z;6Xuf`$3G$^\8Z]m݂,`-[wqzpt 8Cf Bkhw"zmLAcyI Q22-_4u xaBP^wJwTZLT=K0.'/?1ܡ,VYiSc=\wR$i* ]3LpiCqkT.8|w,:Q^3a[6X6bq-n 4U]gktAg¬8۷j%ȀX 7o}|}% }pЏn@ی <AfA>³\4| 띅s`ۉ4sA\?ei\¸els2+p78F0,PĶSF#vYNS*`8J@8W'k (gc!b֫\ou>Q* :p-)~W&*8?*-0h70hoi7ip0V蹀ہ<۱Q 9 wqtON$c~RXLVn#=e|o-zafSc/DC@$𘟘}>"`>YFORSBOý# w nQ3s)h2!;d5Xt caA}cY2}vo^9AVbY|H»@8  "/$,;*_ iQ|od :8=F$gP_?ۼPZ#"}Ck@(VG?K)֤ۼ;^=oeNTTx|6ٛe7]Pƒ$T{R*i_K 'd|O|p=}xgO apfvPKTQzGPKE9@java/lang/ThreadDeath.classmNP=CԣB MlǪ!7z*e%>JLKLrf9yۖBMK UP,^2OKbt6 ArՅ;4Jלx=A9O-LVW$Pd{L'0!25r{,L7|ĊܖVeE@_PwHp\0ە 6sb52;r`1۱:!0S9Wc]W]ٮ+brp9;=d"_䫾9V:ha0x5ץ4=oFpm M?!mh{gmPOihsI䕃NE3TѤyZ#Ӄ<9yjغ[wt٭E`FЧ4J5?;\< CʏU^MK_Sa8د V=zLem}W~A9+Y!:&&B *M*T4Y( wM!Z$^"ga1-r.Ƶ=CÜZb)%%Ӂ]RӶA3(gF+1rV8[ܨ!7O()}Z>TOL6^W*f:>Y'@DDQDp7qmPK+$ PKE9@java/lang/ThreadLocal.classMO@m jb< ODch/%d2.rIgfg}fp \Oynw^1DV_ VU`ڥ&CLēbHP73;&d-6Ky {0 Vb3B6g6b}_@Qyh䳎 qDvw׎(jIPKշPKE9@java/lang/Throwable.classn@ϸi܆ ͵ꄊHMRHʂ)lH}*X!x(ę8s??\Kڵ3=+L?YyUyyJȿ^X1ۧr=`nA5>wػdļaHl]ڧUps9 I3 ;cz䂕@'I =&4S=ʟmq>=ja ژ=:ѩKY1bgo1V(:G>39hfze seG)\9ś5}hf-KB<4_je0p^s62 _+~3luuq&8v~@;.4(☗: XYe?YK %c(dv)25)c 2bU3M ֖ɫWIU9RȷkXc1%f" ;v"H~&H@TɽXZe#z&~/j?D T'Xl&};K U⎔ $TR”PKh;g7PKE9@'java/lang/TypeNotPresentException.classAO0pNQ@MAW!lutJO&(c;1ӷoΰ"9mMS֍յd3&CȦA`iI \puA$I,{:v}@ķEkl9ߌKDC&KPNTrgüQo6ϩ<1_)ʜEe4OV*ۋ+nb\D 0']uxA9u52P€ l%lmS` Ի,VMiBhi PK{,PKE9@java/lang/UnknownError.classuN=O@ }NB_P0R"S`)d=wґńBx޳p~0x B{2F>K)+Q܈l.U$\*Y^ã_8VmFkީg]gVmtͮPKy\PKE9@$java/lang/UnsatisfiedLinkError.class}ON@}SJDAIK# }m-'~e]h"y3ޛ|{pNp$"΄N{]RJoMXBqRiU^j1g2B Z,D;1$SQ~ Q-~fTӁۼob (_*`31r3c/8Jd|esJPmŽ۹/PK+=PKE9@,java/lang/UnsupportedClassVersionError.classO=O0}NB[THņX*:E,nkԮ BH !7ܻ?^\#`8}k\-UV6VG/\Rjuk61B/'Yr ѵT04g9C8sڙTZNB0t2=E΍t}= ,2}Nj18[d+3c,{\85z"S2 :a;[.+7oUm{|PKPKE9@-java/lang/UnsupportedOperationException.classPN1=PDQ^WF``]Mh:2+~e-$ ]W9?_pp§6jP{V=/4z7E.)T=CF*2J"ӈ#iJ%qW6Cõ4}4t03J Vԭ)f-Cegaj ]ҞZf兺'yٿ >TQLRW(+zAbsء(R6佈|MYG[rqȦ` iDV $c,t`~_ŵrW⋿PK1APKE9@java/lang/VerifyError.classuNN@}SJA =X`95^0/&c!#-wF Dex+B?)3S6Mѯfp{È;&WFӑ[, DvzɳäyZc@#GQl sEsq#U# 'j8C]}].#Av&FIJDļtļĒ<}G8A?)+5: AXC9'ؚ383=/S퀦&32j;Z3##89?h 'P$?(3/AZ(LҢT&~z l @@V6 cb9@yr@c*PKcPKE9@0java/lang/annotation/AnnotationFormatError.classN@m)hE@x[%ƪ711DNXR,CCZs159[0&SֶnUBPK.PKE9@:java/lang/annotation/AnnotationTypeMismatchException.classPKO1 ,+A`xŃe)P%Kғ?.Mbә clH\*z—Tr_Xy?`u>tw覉Ty =6 g\pyN`)/`]9Ҫ3;HC\AwXIdr0%Hu;osC͂&m`u[4ຎ)CS?{U~DCS9Goe`\$Cc?Q'^نzh@I@ZESUo=aQ% ̫a`9,`120RXFA)bc}uk,A#JX,\wPK&eRPKE9@%java/lang/annotation/Documented.classOK@TkIAz4S Aq([i7~5~?8`..΃{3 'ZLtdFڹko  `Эdƹ_4CQ.r5 a=JNy3'4urIp Ἑ !JJR7š|- {L>!5G^L y' 4X Gz'}aKؓ#}_!VPK@PKE9@&java/lang/annotation/ElementType.classn@q\jz@(rH(5i\n$ $S\J>.@ ׼Z~3gf~|*Ve 0^yn0lG^Âw0r_2 ~GawaȨ,p*Vn S*2dVveǪ3$W+fWQ}0~RȢy(ɕ0MK1c6gFuӴ.<>JJ Zfi|I cq^_CƳ}v b%HS줆$R d'5g4(kHsP9jP9d8d5d8h4h9\0_]p C4jq0\m7VS1j(zQVקl6wɨ;2n3}E"Jt^7/svfT ˢ9!6 +`/Qny{{kϕ]N_ ><ЋھGz%.W$XIed*MVm&ZlէRt'a;<";LJp*)ഀ)\S qyAKXav=LnӶ=خüʓ!% o,sFQLa tŮ LIw`E/[PKwvPKE9@$java/lang/annotation/Inherited.classAK@Tkj[yЪ xh&%xmt#п'Kyf>\Cp6KN}mm3#Υqa0dƙC4&$tL; $3s~2 3y\.GEVJ ἙI !JRd+ xcpQs?V,P/D*JW<–6ӂbO@}W_PK9FqPKE9@$java/lang/annotation/Retention.classQJ@}SU۪'ZPŀWO#4)qălPRiB̓G%yü7|~āBp<6sYFq.Mf΋9gW"uB{ʼncNr BR/!>7`Bw~ i"4bMjE\/J90.c:KW^3iuY¯B7Bݿ Gm#΅yV=,⍅0ҾG~]aM^]ErMA5l lKcG%|1 PKN]PKE9@*java/lang/annotation/RetentionPolicy.classR]oA=BQ~c i1B Ӏ+nei¿RFc?xgC,!հνg̙sί߮PCɭa[rװ|[wuKdlLe6Uk2bWeMcةQd۝IQehNBzizJJW av|? PҜ,jcXb- 7@wH*" m!6놥7'3u{.w 0$Dȏ3nNtJŅƎTǂG vaqӁyʐ[,?nvTM\i}dx}ÍdW'a_A^,TL>+^/g1%ƖN8tR3w'Q^-IVzT<.P$zh4@QǠh`^B[FWS7 l#-@"4CTfk= ${4dcHbz⾷*~z dXXs{xp- /P@C'Gwg`(Hj+E;H"t"@8W|`Hkrp1 Ϲs - MWXv6G5FeM)ƹT7odϞ9Cc_{LG TiXAA_ hkcyS H#tdS}*R ,J1l`۪N5{R§||-a6ſ'K'wT PKSkgPKE9@/java/lang/instrument/ClassFileTransformer.classPJA^c^ƃ+^W"اꢺ׷GIs~̰2m}V6dksR+I!.7sUB/|i{`a2q|$AAO«gfmh8珥oyG8\1bG,&.te949t)U(a݃֨K ei:@?o-;PK1PKE9@6java/lang/instrument/IllegalClassFormatException.classJ@ƿMFcڨgU&/łTz%l6ٔ'CiPA|3 `(0|K+XҚ*Je9-L*V:}Q΅^2'sR܉-lvFH-n|!-_(O97Mҷd%]mp0Fͬ:׻,y? ᬨL* ?3t ȣŤ}[dmR49_Çv^̽PK! , PKE9@*java/lang/instrument/Instrumentation.class]OA RA|UZ@Db&?I E/j螖i3oyGLK] qo9yw3~ ϡ^ [ae;XuQpoʭP :ش xk.MK.j;X 7fW$/ 4M(cF)K(Uu'#KgCp!4 ф3T.B x> jy fC/hlT[e'ZgZ۟X`GE6_BHǯX{ql16vjsRoeA[m7sPKՄSPKIG@java/lang/management/PKPKE9@-java/lang/management/ClassLoadingMXBean.classmMA _( ԍ AAQ\ ̡t#Bȃ/{0@=@Fs+LP'6>irnjh29  }!ً7(eG``e۴5wqJnʎn{kr8#A$(ZzjTR[zPK8ii-PKE9@,java/lang/management/CompilationMXBean.classeAϵXBxhu$ SBtךlFvg6kx8PbFCŽ=Q O| a)+E* f:dFjM+EBn' Tڃ&*j˭to0\zF;{x2q|{B-ԗ<sX v. G}YP PKpIiPKE9@1java/lang/management/GarbageCollectorMXBean.class;o>#v&FIJDļtļԼ}Ģ$ 9?''5$7)51A?) (ȠJ_ Fyy% ^ (R! \Eɩn9@4vlht);Ŝ (gPKhЅPKE9@#java/lang/management/LockInfo.class}PJ1=vZU뫾*bխ"HA,n\X3I2Ʌ~%޴BI=s`+Yx !WroH([CUY ƽ,CP*iZzeTfa2QVF.lXr+ce6ʔ+Y6:~Ja60ܘ3Q\Mr')7wIP]90qT=?^J%QCkN3LL3"f0y:6ݮ汗Z[1,`qz`d.uoPKPKE9@,java/lang/management/ManagementFactory.classU[SF>kBp  NHҴq"pTux~d ] WƞHpr|. U]x7B1lI5o cvyF'K>'pk"|W:.q-WTtS%gB`8oڦW 0{:|xf;?Wu؉!}!X1X!h bH,SvJy&¨տBBi_vy?&8Pz xv/4b2NFb:Fz*#,`L3 \\o&_X3 ^Ϟg 49\Z=!z[)h@-{*.ys z%谒,lÙ[tvPKEPKE9@'java/lang/management/MemoryMXBean.class}J@ƿ5_[ ҋJ[Ho8,[YI>7[QApf7$ÕzRyDbq+[?OYISv\q.[hNhvVmpٙ?Q7,F؈*͋rʅ] / ]̹^چ o-[ {O-cѾF6w/MtAp GPK8]PKE9@.java/lang/management/MemoryManagerMXBean.classm @ҲA/ ]uulYWPj/af>#M؃)Ϙdg\~3?z5gF0n5QI^Re \mذc)V[B^+G7zg{M̼EkQ=:LmمF}8Bn`PK`PKE9@1java/lang/management/MemoryNotificationInfo.classS]oA=C|Zk[*6>`|Yִ  Odٝi?DL|wwQ*EЗss|`1<>gn` qFO(zU!iBwMv" g?#Fߙsk*>v2SS|'PKLPKE9@+java/lang/management/MemoryPoolMXBean.class}N1OTD@@/xK$nItADI@btUgd:y5>e<-Uwn 82 Bl@hաUuG-2/6qsxŨg@@n@ c685+!QuIL#bV!L<,!$pCe2Zo{5L@&ɷCNǑ׮_sž:~2c[yBp@[, S?r3lѡVgwDػEͺb]vc;+7?bjc0 / 1g@\uPMImAJiZ3֚ҼEPRJbe@PK >UpCPKE9@%java/lang/management/MemoryType.classR]oA= -ඥCk+* F_ M#mIfafY>2YRm7sss篯W!"qx˝N[8^*;< ATr6Cu-fv!RϕjTr\2݆]lw-tA{D! q aǐdz*鹖)3(at@NRARU,GvKG Fw-IS3ڤҙ[[*6S}O:"ˇ!;Hu"^|QY^ dxqM[HS ]Rfn['sIVvF{]BV_sȪ&V)$ap:y 4 abwBSF0fp%_ c~c0hɈ\5v #Qjv{krtb]%pLIHzr%{,JEUe;g4Y:Q`K<o^> PK9=\d PKE9@&java/lang/management/MemoryUsage.classPMO@} ~F=1 c"<(x^`ڒQ&z2G-Q$$v;of{3ϯE1tnЅ! 5ScHCuꉶdX: M^0 \!P6;"?a(1v9R Q-aV_0Īf|Z GmpPoq:f`S 3ԳdVFlsIq%/{cwI):1h]t8: Цn͑W}#{,A.!U))*7,aeJFt"`kN_:!b\^J $C)|{p&.(2Q^yNtwcL-TnzP*<(3 N PKʀWPKE9@&java/lang/management/MonitorInfo.classQNA}+'0Fn/.$EcⱁGnҎƏ'~e1QszU=o/6Qp ,^;Qn ,B GZ6._[!3a]~AOBf~DԈ_bt|qai3/OSQ~oilUcqQ66^Xddlkb|4flYBoȄUup2V74(QZZCD٥ - "׆Ip^i۾~K֧כv̢oEնOm fv葾.>{ȄԂkjVuyD>XJR}!3%(1 ul?SݕƌZ c_ĩRp]LT99tk8T?xw<)塁ίP7\ )G=Ȩ\oU:ܓ[JzzFBB[\Wy͹"8׻1w( fxXlBM|5c/vL@IxcCef?HlqlS%I8`#*p> ~6`sOOqpI?s,x z!HMɐ[Dn-i8Zr[Hf?Y!Z!@C! 3'$w0+$sh#B @a <|ɼ,P[dQHAyYmY#)YhT~.98:k~< _PK@{PKE9@'java/lang/management/ThreadMXBean.classQoAg+B[j-D_}V#6O[mv흉~4~(pP${_nox筀a+E(T:}{/CAqb|y#1 G  m>-H+֕TStV 9k3YL+hkc(⬬o#$Q(9`pkb~aD(rjE+ubgoH 'qٜ׶u3nhOk^T/й!Mcc:A'Q<>3Ӿ4Fښ]׻ IGF`)WMտP)U1ZQ" 5m;%Skʑ0swgLg弮uWleN({ig+}vއU8׈:Eb O˰E&VUSR9>#/#;6ѳ6/PKR!PKIG@java/lang/ref/PKPKE9@$java/lang/ref/PhantomReference.classN@-Q<` (ī KY` fmI|,L|(  haߏϷwg؉Cc/.+*uJ8#ʐdI!U΋t ۫3}a!Qm{"RѲGDTIDCӦtčoeFT3k^+GבO s N)s)=| 8%o3m5WAo@°.-Ugu=,>F4a (^|CK( a@+Ud¼N:Ie'ܘʏ 4lFlPKpSPKE9@java/lang/ref/Reference.classN@WML$1FWDiX+eZ& ]|(m)mHh2gzϝ; *x1.61 !폹1Ȧ A=r2 ]:Ӱ{kqdJރ5eul2TV^浇ZlSʝg<tiܒV/AS]kqY!mMfҲk!A 5]? ZK?Kvj'-4O? J9-[Jh"̒Hc;p"ڴ9A|JK,!Gُ dC$LqpMXE<`Nc*cN33gM>ߥs]z}z- > ]PK{PKE9@!java/lang/ref/SoftReference.classPNAaYDQ*Bx@I6\L4"WgȖ?M;^kmy+fS×Cr: ZYnjGt:֠eBŰ(^悱kZ!}}[DjuQd89Ǩ[\^,JFD+02!p|ï6ڑ$`87[я .LGbTxOE%VPHc$u2^zR*7+)1eTFISR2&QE Jx{<@PKIsVPKE9@!java/lang/ref/WeakReference.classPNAQ5Du Oyq1+Kgy2QƞYlx9LtTu'c#0|+=nw*hWm%"1q![51dJAu[\GK!84%YN-.ݧpLяo^;|P0]%ؐ;bb.{gNw"ɔF]j`.LW2'Zሡ8a? zuZRV; y6UmgA@e#굀([(jw( b0z$4"I2ԓRٱTNIYQJԖ։*CE=+PKzsVPKIG@java/lang/reflect/PKPKE9@(java/lang/reflect/AccessibleObject.classSn@=IҖ6҂ jHUQj a*ASb+$|XJ`y\s{g~ sEv%-O|tX-|_v{N"4cUvA{  teb v4VF mwË:NeXolpO(ϰ۞AdE\Fwpo֘E2KDz`葁f`&5uPi&%2MaI|-Ȱ1a͑NWv'z)~YR~2T(>xWMfԓ/4d_LOUH֌14ynuCx0lFG&qOB)A5o"nv͌慇?PN4Te#VJ3=@j]a+J-Es}1P*}7RWU ee[ǑjW-+ڞg2o$3uɼq-kZU>؉|88٢(EUֱ;Kb;%Q^$q_I0#Av&FIJDļtԴ}ǼĒלԼvF:,2F'(4/\PKCPKE9@java/lang/reflect/Array.class[S@Ϧr~k+R@ jjGOKm8IGx}r?&@6n4{~۳ɿ響~6T;g4oPwVwM'0xU|}r5ǵL5XUċ[@U7W'82\8ή7YMdHa24jH {9"`Թ!)6 $)Y-ޞ*AlX cQPBjfm@aW-xԚT@}TMǥfڎ 8!O3Y&u[6N^7t͏uEFD@<ɱxX9ƻsX3%x ^1N[DӏMX4  ER9r\RH8\S9 b*Xw^L*ޚ~`=}|a bJ m;^PR5e׵An0}>iHBtuvY!zj7c4B zlIAGs1"q 1*q c2GZU.GpIi$}~ 8%qeB☄)߱g"tLrGWI]H~ ̜> sLKW|l^t4 ;\+\']3l=+'!?.#9.'~:)H݆ l>,e_B6݁2b=.ہmHA#Ygd\e~.GddO "Ȋ.,2r?f]Q©PKb#E PKE9@#java/lang/reflect/Constructor.classKO@gy3GI%wI)HVJġ=-f -О*UuvLd{ʿAyN e:n²5#u9?2ۣ34hO`5{Lfs jS-Sr1X OƞAD6Wp50h aE^/PַgbMvДA&0^tjb 9}cLƲ 6}u"JK']ȢHw:}Xt!!i%fu:21L`Y<$N[3lB@C۰5!$sDA@*%n#` iτk_\M~v{an [UTi0wjW8enArv36 QSg{ǣ  =s4$tkP;fL*7n TyUKܲv'*g,Kjo@M.Jn ObkV+.h[$b}7ѣ ;Q*)`hx3 xG1H-|J|gUeFfa=a7 IE4y3kJ5J)faŚVdBϼҊEd(;0Wz0ֳ󊬻 %X,{poޠ>E7Bʛ#ȯ!y?TCc:YeOwp.wPK>+ PKE9@java/lang/reflect/Field.classYW@(պw\.vjBQG'&$xws;3H&3k?PB@vL*zlRKe jE!B`p]ש&=<ō(mӳCG`"Y-tzF@F3MZL@$cQ-â;euOl]35`ϕ͈wbz >yc Y`0mTCϝDң>PdN4G!Њ UʘA'o׌obHQ4젿Z*1]% Ѐik$K%[Ԣ]#ëJ3tZˉ2lb>2 `+ wq_XE&s] BnZ h 6pwB=C=&ZqqoK jfd4L L2{np YtY׻VT9ʉD?e#nv&FIJDļtԴ}ԼԢdǢʐʂTvF:,2v6F1L  %Pss RJ 2R>uY32p%eU;Dh+#3}t; $PKG[6PKE9@*java/lang/reflect/GenericDeclaration.classQe5T hJh$$D6ʵ+%j Yb S$L~< QQ B8|0p [M92*GPQ@B#fy%܉  *P]8Qj'R F)a,2rwtGL"V5PKԈ`PKE9@)java/lang/reflect/InvocationHandler.class;o>#v&FIJDļtԴ}ϼĒ<ļ"vFB,:FLTF` tYkL}SK2S1kb 12pV$Q PQ_+8(9-pH##30y,@l&nPK$PKE9@1java/lang/reflect/InvocationTargetException.classPMO@}S (('77B41!^ ܗlZП'qmqM{f>E8xጄ7pI7pn@^W ^]d4lB0 .KBV'3H`=$R\[yvؗ+#IȷyȨ'2y\z&Ifݡ_\3t2PZ@h,g;V`uj/r-#Tjs3]yֻ+w;6l<͙H93 350n2G[1ZE.rMv83X{[*S e٧q{#x)3YӍaVPKq:OPKE9@;java/lang/reflect/MalformedParameterizedTypeException.classNN0}צ B+ \cWA_1!1|"ҳ{ zRV.s<\Ruʩ=;yr2^I֛xsB|"F);ڝ3[r.V!& r1|UWSvc5LmD9io3H8|!o?xMAH(8`Xr -½7Z`PKbxPKE9@java/lang/reflect/Member.classePN@A?61Fޖ%Mڭ𣌯̛}o>?LqhF8ZW&"\iw!7KhzrCBӟy'М"Տ")e`=\sB c}%"Wi%($f U ]08?`QٳZ)sR}<5l&oĆ}?PWQEUdLOvy$U>km;5~6ܒ3]2CU{}w)(FPKՈ PKE9@java/lang/reflect/Method.classTR@1XLv-1` +YY*CR1!y0CDIc*?9$TG3-K"i{6 3zIs9X=&Nۦ<[ $Ј{lr 3-Rۀ&ΏK̄vyǢG`0T2q@wm**.#0҈/@PSBm_!(fM`:0)xf@ŔJV,qH +yd샫 )葦Q?"AZD[$Qu}b?%UוK"g)\h.0и amvXk3WM߇%F~87oQe<*||:}|$6;phnJO8Zπ*fײXZ} a'Ҙ.&cPvp/&^_i%Ž./g+^ n-j-cS lO\PhgIxOSqMk7tUFu@4$ C z܋$JP[TAH3{6F;aiC0Q*B:69sTXfZ˜({9eNLlq-3 -sә*` *܉Q(|ӒB%`R啺:񽁊Z\( vmU[`jZ`i[ؠy 3!)30;yRPK` PKE9@ java/lang/reflect/Modifier.classKo@g4MPw)ua8Qb,&ݶ[[Zo"NH(H7??3:F'5C֓w?L CԿf ߶lqqHɀ}(Y.L(;_o7,=wEX[m'|r_?Plz:"QTvl:`VSGTqs+|Os;$LPKaM{fPKE9@)java/lang/reflect/ParameterizedType.class;o>#>v&FIJDļtԴĢԒԢ̪ԔʂTvFB,:v6F1L @߱(475AZC3.kF6")Rr%CTr%e,{@?3p0A4PH21PKX$պ+PKE9@java/lang/reflect/Proxy.classS]oA=P"ZbD`@ QLi)f5˂AL|ggivMЇ{ܹ{g?좖%P>cY3{V=s? 0FJhP;eVX`;pnOuIo+!jjG-Je@r,X!KJv*Rh3>Lz(SKQɱ# hTlMXfSzߖCJkN0Xە}濙gꆈ@G}0U֊ __8A=dWQa9=nQҨ&w6BY,^黳K-+;q }xp{q7i_'@㎼zQdM~KH%zd\n 7ұ5E("ϵ* . = _8 G.2D esa+DH4"`jTXF <4\35\S\95[fm nc|lFopnшyY+fW PK6yPKE9@)java/lang/reflect/ReflectPermission.classJ@j 5AS6u%M`|,O%&R=|]M̅xi0AJSlA2̵޽kp*Va4X9GV?Ya:\p}k+Pg$v" yyig*%g|.QU,k;Jr;eo:1TfY[w@M6v vnDRtˢߢn!:,d{/PKTPKE9@java/lang/reflect/Type.class;o>#vv&FIJDļtԴʂTvFRP+8(9-3'RX$PK]BZkPKE9@$java/lang/reflect/TypeVariable.class;o>#!v&FIJDļtԴʂ԰ĢĤTvF,v6F1:8SKKR54}+fdtOK-LvIMI,J,cdĢ S%Ē"Ŭ!.@1v~@K2ҁ KS2sjRjbeE|C Ĭ`,;(9@Q& PAPKq"PKE9@4java/lang/reflect/UndeclaredThrowableException.classN1 ((r+1 ą 2TfL-cąCOg&bd4s 1jYX |'m%n#v&FIJDļtԴ̜ĢʂTvF,v6F1L  |%>ENy)Ō >U[C s%e DvՌ @ y  grh8HPKG/vPKIG@ java/math/PKPKE9@java/math/BigDecimal.classXSI~C* x(@0x5$CMfŽ{=kvy}3$d:Z^ .h`se[,)V9]x]йO!zQG$yHГJOCh,_@-deKѭR> ؎Ľ8H-D"EL> lbճF:65&'oWH(Nϧ. 8L$.AH*kMcYGcAnu"#ש n+-aVk fbV15vug (Mmżڅ%.WbZ+kFSdoDbKZ&-ȱZQ-S >l`ù\_RQ*&`bur(C^ wZH.lDi3% _ /uqHcIf!|J>/yٻ 0o:| !JYt-HѽF%Q μՆ̑!K,˜2*z|7 ,cf^ϧԒyd4Ƣ.Lv<.#쇘vF7D.Q4fZĽX]r Pmj-<5%c[MHS7,RfV}SZaKmwuX8fVӷe$\A[&~5󛵔u$.NxeJr ߼Vʛi54NJ VT4<, U(*I݃Q<=Ftg'Jk.Iic" Zѩfy:;Af{CV߰|L?Wsho_!xS5!W{[#N>߂Q8&z(ozЎ}˜ǔΔC=u2'(eA|Qv:HDDsL]t]%p Dky{6 8iFNV 㘢Eaqpq8I9\z4s]=b0vS<҄ęKR@\\=$eg4]qVlkw$!F_ ׄ! \lʖ;Cd7 @r"z =kzi`ƕ-Ox]sgyOԀ\D!Od^ aNUc \E&}Xphs͙&PQ.p/{i|s=9 W82d%n6l @eT!PY)Pwxa v۲Gaq5'Pݨ .}6v />T@^z"wV'@?Tk ,\{ܹ<ȧC.'#X gO@S̅vIe#?"䴃UaձQWa6By1V?HW DA o;PKփg&PKE9@java/math/BigInteger.classSFl @0 Ke,1s:CGuv%0%vˌW}wϿE!$A{LrZ$Q萠e]\gyvJP%loH*Ѳ}-Aގ岡:Yu9}yA$D!FgwfwuSu 9ptb*NȲ ǜэ̞bVZ6}0 %!ITLN:>{^L"@'e_. 9: $+'njT_2eNA:(#T*7(q"NV$,58.US#'Y6T9$2 AtGgfVԚՖ $yb52%V YB8jeGSIɾJјn^뻶Uk5\@ϏI2&m ǚrNGݤL.e zc3qZ qhS:n96i^C4|Jw-EneRqf=];!􄮙Z[oq-J0LX ٶrA&F, ,=qߩ T99~ĝ{L[JIO}aMv&fʡB6m1[kvdaIw؍hc{.I<ՍoKp  BЏctx~b}8]@ w';xSLd9t6 #lFqb0(>>~ϙZg=o=•2XB󤄖^`aLCWjGx R|Vyhj[H욶 s ٪M"e7TsrukL l0uUPB &hнar;?9WRpKQmẢNhz%4 M7\Q]c"?Ku=кQBTnjN}]hi#&0my-PKKPKE9@java/math/RoundingMode.class}kOA QZDQ[j()BM4+Rpi65ѿ̰Qb$y93Ϸ +HK0c#Z5Zz_Kl \ŨDZ %t&bgnlY{*28ԇ;V *%1οfpY5jZbWg1뿚/Vʵrk h$MȰ01G 3W5i剥C'Ŏ+!C0@ s@pO.nAn y  %00)JvuxcUJ LhT FY8]b jԯc.>2l4X&WЅ8%9Vo>3cSC]a;ggz¸PL= [f8Rm gmJj.nf,򴌦h?{ƜfwT@$g6[gKWߒH31۫ҿC$ߔ0%ǡdMN6r xAFPoI|+$(ֿ'Tb53p a/e F}=#Cl2#30}ZL!9ENE@"# \?i`"y2Aa >ʄwS0?*qƕ (.(\+5 xT}3utϱ_C.dGƓw AZԺuc x'PK PKE9@java/net/BindException.classuNN0} B0 1`XU Aƭ-&$>B<ܻ{}~# RZBK!txv3='BxYd;h#"t3q*ͭ˪BaީgbL\)<ͭQz>KaN_,!ɫ)?6;9ý;>kSH7z:>6vj&3o5S?7jAcv]>s{PK|z PKE9@java/net/CacheRequest.classmPMK@}$j?bիփ^!&-i&џIGTŃ ̼7~|EC2c,J* [SKA/)1s)s!` S{gv Pet[be@/ԉL2WU]Bs2z,p4nJQi֥SBktVMkv[.c6:tY{|PKPKE9@java/net/CacheResponse.classmQMO@}+ |)xWF*K%mڭџă?eŏ̾y3 9M4AZ>ik(Q~L& jZْ-P+_@ӝ `N%P,#@V>&Er@Meh腊=%}̟Zk䇉9GBD]7fqksxbYgȐ'N"o~l-o< ȡ+giqq5d/}`% l`myM`PaʘH\Apirʢ'PK<|oF PKE9@java/net/ConnectException.classuNN@ }NBRbb+ " %5ACZ[LH |]"@gg)1޽XTKֲ/|!aM YBtpBV&ha6"B7SZ^Rz)D9r}3 z&gKÚ.хN,!ͼ*rW;E9.e$V^=p5ΝZ1XfZИ]ŦoPKPKE9@java/net/ContentHandler.classuQMO@}* UOzczѤ.5m!,=x-E|yfvLdա [n**>ЄA('E_ Ǟ![ot F;X,"#Nv&FIJD}Լļ"JvFļt}FĒTT= >%Ey֚>8fd /-JNuIed=n6FFf`: b`L PKbjPKE9@java/net/CookieHandler.classRN@** M O$ Z[RƧdӅċ7N 61n=7]׽;0tNìnD]1DJґj!/3#X#0LZ]Mxf ֹ}=e!c ^$r.\l[yěBӊ"05˕C*WG<-Q3*O:^%[jbЕh{6 $/ Y'/3vOw&x\fso2Ł d!xFDkF2JI>!8Ɉv`d =`'0I)&T5Ю>9Lid0S}Ao.BEZPKk=BPKE9@java/net/CookieManager.classSn@=h( 4  BuA)U_".R( TnӕY0v>!Qzk9N /ŖvwvfΜ''xPEh|dh} *(^ <n d,,26P|}ޗ[JB}'~PBk0C^vw訧`OL S X#CZ-S1 koq g_Fr*ߛT$,[SaaOQFbsa( $opKU7z4>틳cȴ=qĽkw<%ӷgo2Rՙ)kuGH>W7,BTk-w;B8b%7s/v`S  %9c X"[ 4]bה JJ-_~z-\o঑OV*_rmF3f*T)J3T)zw է2miF✂kut?PKyPPKE9@java/net/CookiePolicy.classmQN@=ȳ($ Ƥi4dᆔaCYƝ ?2)$p{Ͻ>rf NsH14kЋDܳZI1Ro9d*I) paE+QvIO} ;&'m&y5uk Tԉ-h&LPKIQ4PKE9@java/net/CookieStore.classRJ@=SkbZ\H1EPQ(tn^1#; Ԣ1s9;o/q!p0sd+c)Ю*ZY<Mild"pmn}cq:^AOfN?vI RScVsK8s Y&̷m `fwZW:g?@U9PKݷCPKE9@java/net/DatagramPacket.classV]S@= j+϶Z';T0;c:It>uQass97 m1d;լ;R;zshCBnrܼZCխ} z!rkkq8CXن>45ڼ^K>S dĺMlATc!t~`UVg%"qOTmmh70!vư9q#}'ҾZzkXdXpae*0ẇ`OBJo.p҄J%Zc]Ӫۙ SlIϠ(Aѐ,C{Upw$ѐ<3-Ez0G|䕱owk:bPIR$!JLC'/O BxL+/)кlOY$D]3 ”CxDψ ,ۀ1<(,jQ?yAo&Q$!%TrgN B $Ɗd DLcias*sZƊ3=9*~xwƮ: X yv㹻3ՙ|1Ag : Js=;xtUDQaԱ -6q)&//(dzv4̐l6}=l7 R,斞Q9Q M|YYfӋ2?k2ae2,ܡiW sI> Z?)ɴ&#b^fY#@* ^j|"n@^AGUi|Kl!"l`"%z;1~nsL^3l˒ve晚Ƀs ]٨wC3 ? (Eal_yc;ldK"btQ4yQe3~9U+)/ڰ9Y0s g̪i>2nȡQS!Lo7Ec.,ZAz5O"0>oܪc סb2ճi>Νx@ vX캥07{ Fpe#r\QoZo^Ln:;00cU; -y))O ~ ^ 5@]`u`vpŒJL 1b4  }J8ǙXHd)G$pZܖ p;l"#'r^ u1SRacX%Hi:&f)pϷXx[c6HҢ$۔וyXU){PEەyP*Mr5o)+?JƝ|/(vm%(E%c-CW21JƆBtW.)=(ʭ+J6 e| s'ّ>H[ϾR$^/"OSpS':z$'pYV yv @ƿPKeܲGPKE9@!java/net/DatagramSocketImpl.classS[S1>n rUZ.R@ 3`{ n:Q>3>Q'-ԇ$/9_kŐUTڑϙj!4<-TΘo"X'U%sE=|J ip("@<MrE S?&`UBp KmcRv0]!7UDjU(%,nǁ l&j@D_!Z/LsTwSUė*uHѨXž7m|B{b̈dFu>׬]gGrtOS!0S~FT`6LO#_[.J< RpDCL#wYG,>mO\ ?w``|LE7X"ѻ)։I#'07_30k z-mJhլ0/꨽)oM--9i"tdk*r;f`4D-ΒQoqy )+)dyOS3XO!E yمv ;pl'PK@_OPKE9@(java/net/DatagramSocketImplFactory.class;o>#Nv&FIJD}Ē܂JvFļt}FĒTL} >x fd /-JNuIedi6FFf`: b`L PKnPKE9@java/net/FileNameMap.class;o>#Nv&FIJD}̜TTvFLNb^RVjr #`zjs~^Ij^IHeA[~#BapIQf^&#Wp~iQr*H120203#rV6H21pPK mPKE9@java/net/HttpCookie.classSRAɅ@pG$  hoCJ]jgBQZOVQ1 Ps̟~L@9;)/  B V ߮c3zVgzUi(ILL VpY  '@8c'{ThL][ɘqA SԨc[hM ^I+}4(Ԙ}S*` 5;=?}k.*=WF MK) ~|L_UH`6}FϋWֹ>*M{z1.zܱ!jT.K [Ҝu\A%^TS! ?R˶ oGZ|]ŬSx.DǼuZ<E7q7&|Y34 {˽[99ӦM_$~ЋkwU "Ƶp9`@EaH1_in׫Eۈb-$X ߈W~ 3 9WtPѰA`&G5 aFiS0D=E΄9E>62גI-r.)-r>rZ\"Cx@\ 1sV\9-r5yݷ 5[7^[wUsGxH#&iX2P`D|'Ŷ1X1x(:;)vŞYePL5P<5۹fYźAsț(6W/T?PK\ 7 PKE9@!java/net/HttpRetryException.classN@@+U_MtWh$a_pc%e N.tewTb3o'vSH0Tc\ZR;\O>sS @xVr*\!ʦF;ٮw3H"m@G!ir.>G!o{gs|{1aس$baw fܐ`lr5C.\EBDLdw3]oP+U78RPPN:S^ dTmP5G6MɡxE` PEE%ZB9BҭT :-\#F\pc[؞w&_朕XNUPKiPKE9@ java/net/HttpURLConnection.classYwF$n҄@@7-@K=dd-CF?B}}hzNt}FlswFNnÏDtFkTES(ZF. aOFc] E)׵\gtpATsin1"Nks,/F#]{;E+/m~+h NKܪJ'i)9,zN?e4mB~fC ;uDzfp%a,XsSXg]Zռ0})%>KkMۦfԹm[pܜq3ݖeI. f|(Pj8\s24i9RiC>o;ׄ~IނU5eQ ^*hkWzAӒMK,A+~i)]MY]3t5emV$Z1NC^t#|&,Yٛ0x˖9#_1L.k-yr\k*px{K-FqDWŦAhc܆|in0?u;DZ5-\x7)54.t*UR--a,_W+<_XEݒ_F y_F^Ɲ|s^!l67ݰ h!DۣJkhk嵗й <$Œn?:d dQFD R/] ߯~G~W8 TXg>R0GO($OV P$9OW48+O[*9N3JD+||Fa\R[ )Cg<+gjy.< Aǡ#Ǿ$zX|^%WvGA ͑ftx*-Mj DkO"J|߬=2n5sdbtw1n"Pΐ]u5ZȾƚ: j)J:8cf'u.Q]~i_GBW|.w7}z܎,L;P&/Jߒq7PK/8T PKE9@java/net/IDN.classR]KA=㷶ekYDfA/E ji2b#.θ̝sν |{p4b ƈOysdlH0,kްz9ITݲn{vݶvLņ%d'Nر[=yګ v4 KK_ ;Ɩ)DpwSw< dbʃcE8EDљRcJ㉁O]OKxeCJ(S|c%k~䑳I0pzV#ՀB-H"E(QpvHb1RezZ_3t3X& XdYOgj8nZϢ?L0=y6sHT[k PK3+vPKE9@java/net/Inet4Address.classmNK@Nb+ 7 8 \ o< x Pq`{q^(o0A,O'!=RJYiH&rd`ʾ |x%6IV"V~7dx[]Fx+gJŞAt }c&L.63^b:^J]?PKƵPPKE9@java/net/Inet6Address.classR]OA=REl)ԗ RC& 1 Oݱf;O>蓉v]}83w=޹ `/2p?>*aA^/x\[$\-7WjӄRkGui\c|EH8bx>S{gw[a!?=i=ou>P8>t<\ܕ:sT7ǰ7 scO~侨]Tts\] rj擤!u,\PIwWˍ$EU?0J(<":lҎ2U[ 7q d(rۊ3"Fp 9 <|Lq;ȣ@h}[ouZZ#.mm:rfiexa>fF*pkc$VVceO,^ϢPKF"PKE9@java/net/InetAddress.classT[S@>[ RVJ!)*^8C/qJ9?xvB[s|n6 1=9ps[Q J_DLjUscCwcu\p57Z1 j&UԃN!2Jg'%m{ pF#TQ&(O +fDO0}E)^+y8n̶ U ]wsN5.F OH209(puޠ1nQ3mL"pZŰܗǑTT͓?=fGJ۲e]܀CQWmV^ ⬾δ+$7ߗF:pWa,sf؃FoѠMݏAեv.(~K{a;5r Սq{dx{C r^1E6eэo*/u;N8v.39B~8v!1EqŹBq&!saʱcXpW#aR-B߃cDLӴB G1w;xN8GDԜ֚['jB '))r)rZ\"Y)R "3!RJG whXlz~D,`mIehۆryZqp,q ?G|dg<VA^PKUG PKE9@ java/net/InetSocketAddress.classn@8qҺ&ii?9 BB vg< X!P;cʼnC;|s?~xEh K>ODM"wQ °𘊵9Y CĹGgߝq7__ܥ"KaG/aיܢ~+jgmnC>A>1DC  8924{G~R AàE:UU?hafvPٌpw@6J9I𙘚<RPX XO7n|K4sJM*+h`oM1$h%sY>Q {r/Sy@ZRnf*oT>ģ %cuzPKX 2PKE9@java/net/InterfaceAddress.classJ@iVc7WZnAAUt?IN۩5T}(\>xC)Ϝw._Ѯ ; 8ס!=>8 ΍7%c2YN.uXdN( B]dp;?(`ɳWB![ ^k94Z[^dk%4fMn~08F5DC.|QNɁ4+ Z9Jey(O:k&Z-\G L;־QA1(cj@ @mDX)>a_*Z!F'jMWШj4Фߕ۩鵫]4vq~~Vh#U>LxPK'PKE9@$java/net/MalformedURLException.class}ON0=NB0ĆXHH$ Fƭ-&$>B\; 9~|8@#`|3)a ^i3Vj#dHFI%1C3`OH$h`&"v.Na):.x9F.^>1lǰ֭4%WoTe,;bwv)n"2N6ZEpzر.A`i=76/ D ě ^ @ kd F U6;]1D*hѱh儺\>7^3LuYun 3fw+]y13H3Qs?Q gl˷`<0M!83j]bJS1q/ifi:XU J2 V&0f ~NQ=vU j[1@ *9E^CՆ/nsZfxRtV u֨]žOi͸QPʤ696<"gnμaFvN͵[.xސlX(㓁O7 <އr?\D`1r n5;@ n]btavpa&;40r5 '0 `FFZ:e4oP]L(c1%΂uu+ .rzP v1(vl602p_] 0؜-6؄B# R55 RB5Ã>&MMLW6c1@߰-쑂=оaZXNizjY-?+ZXN PK<*[oa PKE9@java/net/NetPermission.classuJ@mFcFpXB*OPG LJpPIAqw9ߝpa""ԲDzxf\eڇG8t\&Qkx#rJ+UqM?4zN <:Ihbqڍr1QRIY"ҩ0֫W5C?@?Tӳ,8Ιs~s_` S#?԰4rš-DM ulQm4ϙ)1fr!ns]ۥj:)Wo|1YWrvS&%1W͎N:mZ:&TpTl7E &85Ո5)ݎh{f1Dnע7[*3GV@{*ZWTljRiKy[Ɓuo5޶T-oWoO+T]{9#S>x|H >m}un\)iX}k^3nqMj^^?sᶬ;j YBz"0zݮ#{YŴ.SF9 /a5j'L`_~P7 i$ @#'GOᚆq`LIDt_e~ >e 9 j #,ErZ2>G#e9Me Hԯ')*VAXSOig!E-9nI(X2ֆbh/A"*WC47AO0~ C#**kPKRַPKE9@%java/net/NoRouteToHostException.classO=O0>A>":0,&fWvDbkJ@Nl˼;6ۨ۹OPKDPKE9@%java/net/PasswordAuthentication.classOMO0~1P@AxPo1"^1&fMP.h+d2ۈ}>p,)]Җ`H%0xHD9jBQ1n= ,T.%h/Sqg{}X6pP$]\b>dgD!fΖ951Y!`GST^ARM` |ҘF\o|ҹ~z\h!CvMA.m[wg{[oP>ʺ`71pPA5졦D3ᅾ f?nĭAf2PKX79PKE9@'java/net/PortUnreachableException.classO=O0}PKE9@ java/net/ProtocolException.classuON0}NB@V0bCE,$*FF[[LH |8;KUwwpG3Ihؠة޼՘ U`ׂ.ΝPKxPKE9@java/net/Proxy$Type.classuT]oA=kP@FZDm_ b$q) iYfYWJhl|GL6 ̙9̹s' +X`gF1ܑ:J7F Òذ 8CmC`fh _uAW; ;X.њdS2+`]Pu.s-[jqWTB IAlME rram m ZcMõ8 $)P34YhkQs(gT#2\u#J3Ndqx369q$lalAaʹEݎW-NRtХ[$(]99:Oyd9v"`"R\#^UO&cZRU%n~ƦB#K+|W%6~I^1O $klPKhQTP)PKE9@java/net/Proxy.classRMo@}$vjLڴ4i *F\RHHU\Y۩āB̮~;7;? [ BXV(A}9P$\ Xz){-ݫ6;^~Ph}B `f~(2>@滑'}ϓN.ݜp<:$;0Iv6 :O8xPO K7i,- {1S~O/uSW枍D2Rm=SUs]lFؓ|)[COI2"Idba0E-TKB]=La 娾mmUN.[zs4S5Av jXdߟ-2fз Vs24WG#g>3 _'˚u\2U`uw=oݫSwEkXM&lx[PK' PKE9@java/net/ProxySelector.classRMO@ (\S%$F%!!bD/튋k-'q6M:3oُϯhA# )QeҸyfIe ENxyZ\v$@L,I! b2x3FuF!)y}; p]]f u\+*^" cxKۄIҎ|'g|nCH49{|7lAJS)h*ѤFYW?Q+ !bhׅ-U-=1k@0 {Yw53 ҩB Tԫ4A! C'L 5ΕJ=UvɐuL]LȕPS16pLm]ajPܽO"g`{ryziU^}]c"lGh!t]]Sxh;Jd5kzlS ] wV+L7,hf~ңߎ>R&=j\],Fa˷a\'dH&uj˖~ToMIHv*#7kEn+&ΨquESAQ,G܈MHnPٮ76=Ő+9VTK7I/ac"-( Cnj_s:  Q#Oxh&Jix4 Lr)aRζ|()w me^ȒhB"{uP"оjEUJeVmЎCUG5N"%+rL6Tcֵj; 0,-Cծ6,WG-U8nj3H% ,Qz5Y) jvrʼn]U#"9~ -=hZg;[2_Y-'c09'0&Rr-1bxcCiY{FIɻRqx9v P U+4gW d$& )EF+DuE̵E3RqRlD9NC\1RAa+6KS_ tBww  7>F~jɺcݰPذB7`)jEq~/q * B Xh 8M@M 8(]gKz`7zW]b= Nc$AʧSsM``sqluRIGAH=m_6X?1ؼ󯨅=t%X|$\UR5T<5F!Y+7җ3%\9gV<'dl« [M}Aͯ`Qx݄~iaN$H+X22+B^$ƪI5! RO7hgȷMD>Ff|!ua&"_ #wd#;2Aηe@G }'@Y \56 q;D( ~Q* /^X`7~0Ѡ#oԘƻ-7kSw} ـ, d~ra|#0V{PKjU9PKE9@java/net/SocketAddress.classmOMK@}Ӧh?ڛ "oA,$[+O?8z)a̛](BpZTfWvepF_t%.BH8*|bBxkj˫!ْctq Vo97O[(ZbZEBUS;!Kə$!  SOI:HC/X06}oPK6PKE9@java/net/SocketException.classuNN@ }NB AlN ܡZ[LH |]"P=~p$B@} jiO^*#ijʤ׷s`L/̽jmtLiy3NLJIgXT0jF˖0"lkzRz:7:v{87Wy ?W4爻ۇXyt̹ 8wk:3o4S`y;1Ms?PKGuPKE9@java/net/SocketImpl.classSmO@Vx8ށ໠M\<|-Gm{~2?eV4۝}vyf?}1= dc/>0(6ZcI,9V$l5J $Id%s~) 1Bα]`O wׅ30Y`T*΁:Ov*v0 SjI&Q_be3ZFW=]=q<2ZɄfo0F$ X2ic1˸ܡѕP(خ`L0P帮2OXOd$0e'u݊:='໊zq6^SDi͚dV?&l 0Pg5xjNpɯh09k9qYd1 2)q҈,rnE2T$Urwn*f5c/9%%F#]Y=Ua%WŪWsk\ȵ~m"އ)Qe.e=Lxh $R VGAZzr:CQ/x[n1֧PKjPKE9@ java/net/SocketImplFactory.class;o>#Nv&FIJD܂JvF|Nb^RVjr P((5$A\CA֌ \Eɩn9 bvt120203#JV6H21pPK4PPKE9@java/net/SocketOptions.classeNPg@x"^;ĭB!"4F%`> 2P#.g:9pB{J=?(9νaֺ^捻Nevetܶ"DPK}4ޠ)o+UB!FW9LQiG˲f`BaPŝnڲ%%lY;0M#!#VYe C taȩY!D"K=J]S+PfKY?z~4n;.S[XWo>B-O6E`&!F'@83ijsJcx^4ƋKg5hJ:ƛ9[oCdOEp?PKPKE9@java/net/SocketPermission.classRJ@=Fk}ն;[c]BQ4hh2-7ЕěIM[\s9`& [+;.ߑA =Da^ÁTo4PШ%wo:!/]6u]pe5/V?SbHy7"s0c(Su銳n)-_l\q8Vm0,ՇWwB>(˝ yVتVK ٖP"bʕAméR));X<\w83SoLTAF#ib1ad6t30Ƅ}=}A^F1VܣuR V+E菚Aj%0kl0(j\d2osC^n:ZPKLFiPKE9@%java/net/SocketTimeoutException.classO=O0mc$vB7% aeQe]7о3}?YieWƂvA%# Nػ,6Z˻0t[' ux"I|&fnR.Qnl>BAeƭ'SJ Ĺs_) GNj֎'{k=Mp.ъrMky]axp!>ᆰ`&±(7g1yL;<%<cPK 9PKE9@!java/net/URISyntaxException.classPMO@-_(*B(WI\[R AO&(n`H{ff"':UCjN]6#b >a@E:[D/iZEz$4$R0$Lm.{0tM]ԽG>"8WKڄb!B 0JlF@,xy豩{ A,//!MFG꽒-gv WR\~8t S#čﲉ`CVHz mo`Gv0S0V Ce%[hT^|o*؆1;$osRR?~PKŐa PKE9@java/net/URL.classU]WF5r7CU4uuJzN?r#s}Cs]i kgW3\Ͽ` C5F˂,uPwj-k rԩk̳cDF vmB\iիoVPXpD:;`;H86+@\* U$FS_i6uPLaVZxzdL,IO O$^6:/уu8 T抦+/ӫG=&w>lqTM)W"Y`@DW!)V7 (j_]uk %DlkԚyGh5/JシC Jshn]a^H~Z ߿B׏,G8D}^%n &yaW4Ha~ȯ^1vˍjym$ wRSP  YI_ TiQ4Q8 GǮGϠɻ^ocIJwXl ` W E?|;gJ0aWp21o}B#|bAK]kF,bt\]Yѭh3I:SOĈ_M"Vs>L/7b$ E2g&)"Гgjb%C*0O ā5[o}A[fz`&`܎a< ;ԗ*Gj5qݐ0n\H9a"1n:'7RDN#SDN#RD2Fi^3 ϠDmʘAx !ƌAW(Q>Ə*qc$ $!%%qHO|wD5~/M%tв)Zy~̫sC" H!cVa-{`1b4PKRy%PKE9@java/net/URLClassLoader.class]OAYZ+P (_- $C E UnC,fw ?xfvlҋ9sy;gf?60{ϹD~(;!j#>CJ0 eS2CnT/C}@%Q۾ #WS/䊋 Fn'c*v7tAOY7h̑}p'MШ@gb-k̄X)0z6If p5gӤ"g1g `ؙvYK9(5XV~0fҜ!Ƣ;$Ic%}nO#͝KhKsuwX+!#uc_Ƙ7]Fz0(s+S^6]̸ESmXPKzԎPKE9@java/net/URLConnection.classVyWFb Hp$ĐÐ;1G0\mI^̦j4|?:mY^!vf~3O1 >$mP;}[1 mfmנ[tbӻPAu#NaSHe  yǚ4h+Y\Asb.vmf)mjRt nqd ɟSA<3AOQmXY}]9fНJZTGgɜ'1xw79C95 H3fњ ee_hGRt`[(fwD8mzrӠ}KcJ#f5^VA{CV%Yw$65D*S91GN8(zYf1FvnEˠuxQ*<V˨xgP0TWhJה"]Wi٢y"kyhb1 kf0Lax6[^Ȃjgtȗjs/efuRۤ%Z%QGqt7()PkQCOeҲN< f6=YQ8*(/Eλhb7s+ĮXK/j2cVh,9l?u]2JI QtZ]qnW'gUAWqG\&uib1"]yGj]'7UD%Vمm-gv Y h=}n%QNV'N)iRZxNĤ+A^(XShlZxI?REN0%0Ġ[q6 `@> ! 4qa+w$Ę#A 0,S <ЇoweX0It-G$~#u5C-GSQ4`h0`0^<7cyH!C < c\ǣ,L(-G9|ȇ%~YSX&` )QE{_ZƤޤ[|jS E_Fiy_EQZ`Pi&Ǐ&8`޹$~1Oa@aK.ƕ'Lf 4P kh4mf~.ڂD[Va އ ~5\i+LJ_*-s}ﯔ;{J+a?BdB:C'Q9N9Mkq\P| \!c>oe'y|,yHk|JgaˁsB< OR ?pg* ONxc8i^p2?YK!p0Z7}˕'o]v+w r]ZN7h7j\KtdĐPK-ԵPKE9@java/net/URLDecoder.classN@gK(RDX`L0&Fh})\fKO&|8]!ڃ=;ϯ8] QG0t-`Ly菘d.@0o8)!  vNL>(G=*yǛzS7.-  %6nY GCݵ-E'Ѹ 1;Xc6`0|-4C;=ZaFD_ ?fF1}+( ћeX5?/1 P@HQ6w e/ $oƬ f6jOqHdT5ÞƌHPE:PK۾/.vPKE9@java/net/URLEncoder.classQ]KA=צYfDhD[=DPQh>n謬)ЏR>0sssg??`A!c*fݫ)?xC=:}+|͐gثx3C:տG 1ϵxd(GJ˾hɡlĕRZjPBޘw~[r^^ؘG[lQ{Zucص52pj8 ڷ҉cz dV(Io?06Q[i&̨CS Eq$/J$L:F؋ٱ<Ҵ',VJh2e)f5N),(Zℝj(OI ;CLiJ(2lڪoPK?qPKE9@java/net/URLStreamHandler.classT[OA>,-ܑrUn-" H&<6Cd;[w!>蓉̦Bm:̹|93g_Q0_L$?3cxLya^LPO\^ yms[!O0{"6gK潧#0v9-'0]bx]n.qx7[!WU8`WS6<#QM!nW;p[Dew9]N ~7 nkcV$7~VLT=v5$uDir">%Evd]+y,Kᰟm=]AʯMlhI*a--aE0S暏\Ye  ?ea>^]%AٹbkD=:e/J?H~_CURA7`5ц1V-4ܪè1 s !}[(32cP 0h`m1yw 0)!' -Y:hiF,ugL* *:`A1j&~_q0SmJ/%?Ȇvl`Bn~*#4V3EzTj+&VQRjݘ7!;6n/PKhPKE9@&java/net/URLStreamHandlerFactory.class;o>#Nv&FIJD \ļ"JvFļt}FdڒTt] >@̼tkMX32p%e22p6FFf`: b`L PK PKE9@#java/net/UnknownHostException.class}ON0=NBBl#6TĂ@ E0*`W[-&$>B\; 9^|8@#`ؼ3F?hĞ>rl1BKW HieݝCxbne[h"bhgJPbXHNfrQ D\^C{& [ٿwֺzTzgwt$2zz%.jc\PK@qPKE9@&java/net/UnknownServiceException.classO=O0#1<'JɭzTEeT2篹R>CTR'׿ D*Y2cL߉-,wFMW07|R~s^6o~y/2bԪiF9tLM..]`5bt (#CbF>xқkG+X!Ubk^kCboyÙjAcQ=s?PKPKIG@ java/nio/PKPKE9@java/nio/Buffer.classN@IHZHZn&PSuMR/5R[`7q0ء❺>@ꙉQ[w؋9s;g~%v(0^+e~;}pL2Yۻ^r5~'[}P1ǂ<>LrE}A:2GP_x/Ly<8J4$2fu2h+U?C|7c䔡JObe(3T֌wÀD{mvSQVPKbPKE9@&java/nio/BufferOverflowException.classNN@ }nӤBlH L ~ wHZ~ ΁g?[tfn2+.;kʒhξZM62.7 XO ݽ !:wz \,_5)3T?è'ncBz_𥴇[G؁CeY@m:H0[u% PKW^BPKE9@'java/nio/BufferUnderflowException.classNN@ }nӤBݐ*` +S@5u(CGB-&$>B8bCҳlϷwH!͓ɬ)K7vξZM26jl- cR{SBt朢z \,_6k3TS?èGN#B:q/B+i%DY8EER8 GXU| ~PKc¦EPKE9@java/nio/ByteBuffer.classUrG"X[nFqhcɉE !&6X`U0Z)S*<\` ;Bt9;`~AmMgOvW^ " feb@o791af策[]|MT)@3 sk1SrCۓ[sZ#w+0З;]2r'cݦaEܰBܓ1 .ػw{Q?twayޱZ.cXڃ%e3%]3;L?>[X-wC×DL㥈 1u>;]0㻇f|5ahy 7ͼQ&+@2d0{9C:Z  <,u:(by2B3"sK'rvd;o &w$hVjՌ9UepFL?&4EJPUiFߪ.D-•?{8KڙPzvu?yGk hI) ZuPK:PKE9@java/nio/CharBuffer.classU]wUH)4MRMڦhUb,_T,Zb\}!2]ta䃾Z>|G<@0̹_{s9Ͽ 1̾oyֶw:禓Da[g n׳V˴iLbajGU;]wPw^Y%5-1BP-ui5,/^)e W: .xKrauh:g".]" ou\qIy>Xv]͙ u,[ T w({ ~-j$`:\wH6/ 'H˶C)$(z=˕fOqc\tiҘ n3 Uqĩ85OT@//؄FUf>D+uGTVnǡ_j>UT^wýOq$0$RFz֧hE+NߴƤl,9' .EXQ6"9>NJl"cArRT 7iT,{kX"KHsے&òRY0+HU%עYnHnCF8:kJm+_YpO}Z~">uTt_z"uҔ:W$x?MU2:0"`= R%<%hv"^¡|U)|\>ׯȎJ䚷#{ѱ~t1ɶnmߏH?~l+?}-1fWGAo$dOXTƄYgC2:mdz4.Bo[?\Ǥ`]|,>~U=ҞPKMq PKE9@java/nio/DoubleBuffer.classT[OARxW\Њ^0 iBCJRiE׬,YvmO}h_l҇QM..,ؐov9gs~񓈶mBƮ t37sC;tU͊R`+\c4* ^unqs04Ŏ9F#=E}p5%)nrKb[XQ[Œ>#ؗzDArZmh6#EMc7>jR>FSjpѲX<&gvb yqB ANi,|^HŖB7aɖa%oOɴ*B}]V+u"1d7B" x">g5ޓ%IlzYlVsqb4fU2A4(~l:VY{_dž@ 5n;E_犝{7@^.<ܨIQ:"C b8>0&,#a'rP9FRC#qG.⸈Ai1ԑiR2YW01pMyINҬML T{pGYɑqmb60Scz:8eZ1E^T{]$[X-cЙV]lV/P'DλY٬ ᇿ-|o>B^)Wަ^ih_ LsCQf;zo ώ_kPKaPKE9@java/nio/FloatBuffer.classT]OA!H ZDH-(mVMHhHI> %bCb>4}jzgv tsg9s;'M<bW:^(k:5bK 2  'u)f jtIdN%["U|_WSCeb{C]BG pI^1j@Yj$g"J{ڬu@Bv4`򙡜L~ljy ŹVCR(aRrwƞh%Y1!h2MqMSuKݾW+ɼt7n٠]HP<Ơ̆VRf)ax d>[a;^aBzh(euMt<9Uj LںTujgY%*,K `߂`l~fq [Y01uSQD1<2ڐra:,Y'1z)neE 9 ȵ$8XN²{B_ʕ;͕%xȱ9rVvVqUIc ֧:vtp6y2WTkw9OOq,s61ԙQ]{Z w ő+VV Q=ះ`+:|f#JYRGxvxs={5=$GE_@nṽqF0|^/PKT$X~PKE9@java/nio/IntBuffer.classT]OAÂRQjB3IRj|O#,f%bCb>4}jzff!sgs;ww"ڡq0׼hNl{Fpe;!Fiqx\5,0,=LgrKYb=tؐ}uf =Q:)־3z-F(]Ozf 2"7W1<cmݨ}>YkBW ؄Ʊ#T܉ziJv.Όd~Y}k젼jAPǭ85۞HpAc-(wMFCmz{2$i8EZǕtґ R=4j^)IR4JiFSzo<_;h2GNۭoL$6 >2m]_U Z5nRtjbx JPJ``#)qHzƔރ"'B%` OT/s~aE FB2iZEqbzsf%wf=frIeY9FC9$GAE{8*NXLÎEZX .ӊ9ܻRm]W%Pݡb+[1e$(ͱ׮}Gv2{-PrM"TGva|"g+y _iKP#:s]-0 H m< ?Nq0|O *PK^DPKE9@#java/nio/InvalidMarkException.class}1KA$;=#S *iD!p\8ʹ -+Vwᛝ` -p⋱[5ϕy ]pnY5KB\}t<#$~arE)_37<[kiO3 3_Օfj/Hh("zs-ZU`K ۋۑPK[\>PKE9@java/nio/LongBuffer.classT[OA>rJ.ZQ TM@HI> u,M?acbCv9߷g؇717hhff~Z1Hb4_ԩ)]jцn6ӌ\Qj>%;R5Pu'kϩw.R!EoqIV.KG`&qnT$+Ȑ*m G`N3dҚ󙥞Lvo:TV(za^bpC%64b h%9v!j1=j#^mVD%P=Cd.fhvz I؆Gby+Wj.%~C ?«+.q< [?so0|^PKzqPKE9@java/nio/MappedByteBuffer.classJ@ƿ5m#x֊4UPSmlp%fK= |JA%Tq3|of}{ypuxI\B$ U.0؉gag0~S['8/o"Ӕnf<\j]Vq- lEx,bs0"*%LǕ;`F ޅ*鲧RGz ⠏6.}ʌuDS9=PlVaOzI \` iGdX3kPKD5PKE9@&java/nio/ReadOnlyBufferException.classN@gH-S`*H8d౨(x w :ĝ4v5o0L!lݫGmKVTϧ|$n̢k.'5;_ ?%Dc[r.!& rm}V -T5UN{3; ;&Wukwa | $˂zXzT4 a}-P/PKg OPKE9@java/nio/ShortBuffer.classT]OAÂҊV(R.hEmk?0j҄ YY2,6>/6CwfBݢ!;wv3瞽??~.Ca-GFCga'&m7 e2zn&iZ5j4re/"Uǔ?.uvgˈ6O)3\ ^QM(cY2~LJmC8~i6<IWiƫ!:"fL?xm?RuL@isVCZ;Ee0Ѝ'-=tC5]z#^l./c˯{b|/E|PK`D~PKIG@java/nio/channels/PKPKE9@1java/nio/channels/AlreadyConnectedException.classNJAN6F#zW@ %dIFLD?˓Qy>>b@pt6(3޳[ װGA\_>~6a73uϴGWDȇxNL(\>z zYOSDŽ*&-9fqn 8,W=HJEҒNzXyR0Om 2ד}#_PKQ_PKE9@2java/nio/channels/AsynchronousCloseException.classJ@ƿiӤJikE(AOvtWIVo~3|_߻O78"L^ěH̅1pmKkl:uD Oҽ 6#W BڕIazKU>e癕XR7wTvivL!~u)Ճn\NDSX#v@w~8)koO PKwkPKE9@#java/nio/channels/ByteChannel.class;o>#nv&F٬IJD|ļԜb}ʒTgA$'1/]?)+5AScPjbJbRN*Xe)ed /-JNuIڊ$2h'#3+;02pI&.PK&>PKE9@-java/nio/channels/CancelledKeyException.class1KA$;= و[%M0 6͐rو,+Vp;3 GwQ+o2K=io9_h/_+M  mǃ)!9hcrBo3o1a FmY\aP39umxl?!#nv&FɬIJD|ļԜb}gA,\ q/NMLIed`,/Hcd`Ќbd /-JNu@*bV3v3pX @ PKEPKE9@ java/nio/channels/Channels.classT]OA=VHB Ak+4]&̚'(-63sϹ;??Aq.%ײϘ|0C y‚8 n+$AW|E݋~W|sO8s]Q{Gs/ؔ2Ts09~\N=0/]O4 gzlݺhv#)JkJN6՛)WX7vUnBLTn@`j8#Hܴdi61mQ G8.a>`g ?sf_Wݑgwy΍OېPP=d7\& njlALG.Es9j&r9\[XD#ȚF.I\\"Fփ驞2Ccp23sh {c(j`Me4q'SjDQ-E!ǽ+r6L6G&\9[:l!'ڢ!_,"rwװtL;_0w}/PKnGRoPKE9@.java/nio/channels/ClosedChannelException.classAk@hLڨ4Ǟz xU ׸+I'??Jœ}|<C[jet)YF)".R!fsv{ #U9&Ի B㱅\B'VZN7̿<ؤ"KD*7tʥ*lT~j}_8"n |gu0@ulO\PKTI JPKE9@/java/nio/channels/ClosedSelectorException.classAK1ߴ]] *RJth#1T[Mp^oz=?r+bĶjj}+Zg-xW #&ܲ[keɶ"ƙ0!3B6 )Qeܮ aaV%VwA(kn\YwG Ŏɢѩ+6^⧇2j؊:⻝w5PKpFYPKE9@2java/nio/channels/ConnectionPendingException.classNAJAN6F#MEU%'f32f"~˓(g < ]MUS_α_C8{PϪrWzc^ƻ;v O5խ(; *𯈐_g{|2#dc]lCNd8^-jD9faiVQr׭ _Ar"IK>BX8;}֫,y:bG#{I5PKGbPKE9@'java/nio/channels/DatagramChannel.classSOPnW66&LJ| ,b2Ã>ݵvuI}2??xڎ1`n;iJ`(]nҳ&w]\3ϫQ"mi7|%l-oJ2 7|җIa BI/lak[q0Ct~°S<SוP YA3YL!0Sx9o:00Wl:Jq/iGhvY!p=+Ɛ=ۚEVݳ 8J~t%̳hk~ 7&91XmJX:6jJ2_ۤSP PT Է@ BY9'x6 9n$n0Q$´V6Le]yt= cXx)#bz<8y Tk2T<^H4> Cdy8Tq4L6&= O2lΙ(o|=sʜ0ϥrdD\Jx"ip}Utq*3GDs ƪfhje~w<Мf'Y"3͐},$jXśKz:H¤XئcaG|#-:UhF j,&e]PGkgjqc`_gZZW :pwYA߶MHŰ5YaU3lk1]`UU輇yV2öV:&\lQ$!j.z ၎PK%úPKE9@5java/nio/channels/FileLockInterruptionException.classNJ1}nwuVI{0WQXX&%ݕVO~%F`^MޛO#&hԛ~˕z0%箘gbee_Lɞvxln ˫ !s.: X~S/zZ2LD{aT̊0손>{vCҢ9$%)a*p3`#M `} vrIP~PKј_PKE9@,java/nio/channels/GatheringByteChannel.class;o>#~v&FIJD|ļԜb}ĒԢ̼tʒTg(; #XmNb^RVjr ;#* E%I9H02ES$5}Z@*JR5\+S J2 <2 8L_Zꖙ g@.gd`bV`h0}qy,@ ,ƒ,ļ |PKHDPKE9@4java/nio/channels/IllegalBlockingModeException.classJ1iuԃ+^BaR=a;٦k$PlT &O'7dhճ*Bϕs.RzwEeH8c~IP"8{SBr!;rC)_37ǙoN鵲SUs㿛IpT/ !e7kF0dEsHdWtWh!Mcs/@VߎTPK#B9hPKE9@0java/nio/channels/IllegalSelectorException.classOK1ߴ]]={Гq"(Ji44+~-O?Jn37fxoYG߫GU9+=Wα]Vr-h+ok~д v#ƙxFL م}1@NMqU3˄ke*87Ka'r۠t'v؅dDW$-D qU`gPi5 zZHPKJY_PKE9@,java/nio/channels/InterruptibleChannel.class;o>#Nv&FIJD|ļԜb}ϼԢ҂̤Tg(; #XmNb^RVjr ;#$ PM \Eɩn9@  Ĭ $8PKJwPKE9@4java/nio/channels/NoConnectionPendingException.classPJA }iV+қzpīKQ"TzNvdT-O?(K^x |~~A?kmPfgR0ҙhc~1(8kuM6^'3B6 .v=Ae=O֏sn1 FnlY\KB9 m `6HR< T@ [tP ix@nZK7PKhPKE9@3java/nio/channels/NonReadableChannelException.classNJ1}nwu74U(>m$&M$x(1Iţ {ϯhNKVJpݼ䵳2aZ1ljd,L<{5km'SB6ts)v^׏3i7l/e"njދxIBT@ [B0Ovv70w^rPKLoePKE9@3java/nio/channels/NonWritableChannelException.classNJ1}nwZ74URzNסDz<~8Iţ {ϯ+"?Wk.л=?c/Cp_rƫrcRc8\o^K~ƻ 0VNKLÓ)!sV~aWzf_R۩LIXaXlO|]|k >\_E' ʬjQg"/ ?F|pxRvӨ#Bz錐‚KE9WYϓÜ[=wLدnkaWvM8PNæ6|cMC2)l8<bE>-y`G ȻPK\PKE9@4java/nio/channels/OverlappingFileLockException.classPJ@}ӦjE?@zSF*^DAz>Ct[-O?'x܅7fcz^q/9;'vQܮ4WJJ`ːDzkkf; WDHό3? /9Xb0*L;Y!SnMI_SB>˶nD%14+Cz5bbE=ilbCq-к[Q5PK\ޒhPKE9@(java/nio/channels/Pipe$SinkChannel.classQMO@W*ߊEXQhH`𼔍֖lKO&(n!J}̛v??c3Bf³>s]VK x-hIy@X]?vYvXR/7IؙIINP S_i4ɖBV̺i0E iB)\~=|ryMg3äxh}3bL #z7TtJ_ Zm(!Yws?uBiv&Bf"% sHw7`WNToߣ7d_#|A Sgi"@t+`Iy: #GidGXP\hw fPKg5gPKE9@*java/nio/channels/Pipe$SourceChannel.classN@-*nL5ָc$&$DC;1%wrąCg( *,{wN_Ne <پl|{ ፤g$p ^IDq'b=o&N/qjs4fҎâK?ښ* ȶ brYu f#py)"G(oO=.u"B82)t=nQ_^OUW¿21{;P.jI%kXɆ6٩_m(8 R߀@UujCzCu4_еk((0*cIKXʘsna^0G|23 r( )ݦPKQgPKE9@java/nio/channels/Pipe.classN@B-APD!o&&DL4ܗź%KL|(t1"j̿3iv_bDP:7oG) !zR‘~Ί9fb #~v&FIJD|ļԜbĒԢ̼tʒTg0; #XqNb^RVjr ;#*A)I9H02E$5}:@ JR5\+S J2 <2 8L_Zꖙ 3z @3201+08cg8< Ab^Z>PKYӐEPKE9@)java/nio/channels/SelectableChannel.classSMo@}q  -$ J)Л?tND8Qڅ!μ<;Fq =7 8QHGb7wٰ[/ݗ~j/H[q*S9W&,aBeCqkW\a-cvCVzZfi2!lmBՏTГqkםFyq'Z⏲;U'8QcJρn8DX4i0J&sXLދL"҄Bf/w91c'"@F ~m%}qgn$}A(hx\}; 1Z~;NLj5-; #>"Jr:viOQnNCƨxm#QT2z(kr?%2hT=`]y 5Nh$CF !"X&Oj.h_ΛW.„6T~FodJ!'v$U$F ߷k,ú늫(qh2ı$ aWa 2Yʡq2)1Ez4g8p{5&;ּ.(} h(TPxq&pxyӗ5xlXpֿ yO& _f4}bnf0zhq<)`Vc{"{Oҵݡ}Sz:2\U`N*pf5 LPCa/U(g {PKz*PKE9@ java/nio/channels/Selector.classuRNA156&`8d₈XɈzdofVW)R|T1XagvGTPXw204FEiU 3T ,~$ n P`{%پa:ڨKO%) et%]OTў@9lJv!TqI+XXqS:;\MX5-KݑIu]=02jL݉.gq uNN0'NU"_n19?u; ZEs{/PˡcUI>知?6(♃W|/V`,}7&%B2PQ/\wǸHd̢v* ֘ΰ_'V[)㭋 j`c4PK PKE9@+java/nio/channels/ServerSocketChannel.classRMK@}ۦjUqP[#U) bm՘-Q$xٴT9@fg7owYx_*s^t(^a1 9npCĈ`J_g {V2yHRZH>2X 91G6C%}q `Xh){\KVؗN¬=!hGu dتՓL ]<T~"C)wȆ dDvca 4qO:t$;]q)iU"<X(Rv0Jr&>P }1+ؘC~y @5b X?3c3"e2:iQuUS4TyWyawa5־PKpA7PKE9@%java/nio/channels/SocketChannel.classSQoA"mb|AIK}:Y;r'M?8\O|3  [8 o6xc51Q7î']Ô>4Q'°<3d~3M15 ) ˏ-cz/|"qO]g,,6kg z˱x 4z[}/6ێi Wve_x Z3ltlŐ4p2{hY.fCGpl/ [ KOCG󜉪]^1C(ܶhrJPhyعȤIM ?Q1C:>! :{^X+cc FE>Bɧ:5SL~ ZB2E Yw\F; }6蛝 I6 ћr'O7և eRmZ"”Bͅ&~)Yo imIײ]肅 Nfȁ+^BC0l~ B݌[Q5PKM]tPKE9@+java/nio/channels/WritableByteChannel.class;o>#>v&FլIJD|ļԜb̒ĤTʒTg ; #XiNb^RVjr ;#$PM @R$4|@:Ykz22pV$d3p32yeKS2s@aqH5 @ # @'fbPK!^,PKIG@java/nio/channels/spi/PKPKE9@8java/nio/channels/spi/AbstractInterruptibleChannel.classMO@q6q릅@ -+Ԟ@H( )"V9p[Yd֑A?qRQU+D$B;3>;3򟿿~æw%odhtiJlh:&dIGSFft+mo W_Q] ~lE VC>5b{Ʒ-vKL3SZ~XAAnO"(_rH"žq}| 9 \]e>NjPJ4#5ё"w)_*[~<#d Q)EPul7m}5"c3D&g-q<|J`h%r j T6HK?PKhk[hmPKE9@0java/nio/channels/spi/AbstractSelectionKey.classJ@IDcMk1UDbRfЕu#I*N^< |Jv <^<"Sa2UR="Rz.z~{ᙶ>'!,&*.: T[u3{Uy+rd7ɠ0J)Je2ad!R+>v}0w|naX;7C1'Xi`]g>j n@Z=l6ਙ/KNu PKg? PKE9@,java/nio/channels/spi/AbstractSelector.classSn@=8MꦔI[R^Q҇0uRUBH3Sv"'BbQ;F !R<9{?<Ǔ >ⶒs@گAs'W8`2fk8‘T2GnÂ؇s97خ#bxw'~莆S˜f%FݍŰ? kxj︤ݘjDN; PeٻW|x@_T|ת=oj v_:e EFq~I{̓m<5%P|L D瘲eo[DWcG4&{ :9^Luh %tK~kC8-V\fV%\tEȧn絹j_Z>$"Cr%h&h&r46{8mRx'R/PKs^!NPKE9@java/nio/charset/Charset.classUISA~@ J}$KUTE2=5IM 3q,h˳?u!3YoXN~95vhS>۔VeuFYn\l99afI g%PDxXg'l/QEm7::D|wJSSNR 0akjHh*< ^iS}vs(4v?Kߌ[|bnCVڧg{v-Vi4bdu-Y%t[g_v~f \$R 7tHvac[."Hv&KLa8:p]·t,xMu@/dSr߁<2P@ H^FȷռTM^O5C0|0"%"H boƼRn"ƿ"fE=cw7g$LIiie=5+s0iW>T(# hh’^c,T#i<XEXDƚNN館@ <ܾ۸N~)y$s&0ؘYLPMx%Wl<_{Lb"ť?@~"Ͳ`G^PKzM= PKE9@%java/nio/charset/CharsetDecoder.classSQυE-D@GOZ,dۺ\teűif??ܻ ny>9w6`'>+ZjU.eF5SE/R#!~,k٣+TM5.8!6)iA!C  DfႪѷ95eJ`+rT6T7%RH9zīײF`9 :55 C'JHgza< -r0nTZK FUSյZ&d>dŤjBOވCFp&ʊyLk2,99譬 ^%pn]>ŽFrvI ?bZ#Gڡ\.F_k:XaƎtd;"VUbbV˲B?&FwvbΆt09&MXM}KǼ{<|#z-i+T7/eH7!=<.VohU.'RAP 54hW:`X*E&6DuCy}ע -k7 ~,p!pN|0 h]p!~ Equ 6zGv7AF`C$_;,B˻%<猇8 #1b6aVxh8lq-t3,IC/Ii\c=9 ssvc%y6.HیǬ:[gA|EwĤ bqK|_HT ?wXN jH`݃eJh]fZ7<ewInu O<0\+cޑOaU [2-ٶePKzxlZU PKE9@%java/nio/charset/CharsetEncoder.class[sFk1q&c@r!Li32@a6&cK,gwtڧӳqlRv߿F)wWۭX RcG`UF-T0qvl>fh_1u421M=Ӵ>K~ sMWܳ:4S˰%Z%32,E 6XCO<65aH13I[!'-h=co(RJBUPڿ?cX:d&D@6;> 8K.C%::,6ʡ1S~ MXVs>^KfVPΨr9uu; GبV{ʰo~1/OǼuzmq;]csrUvFCE';yy.<{.:-n׶O2nI}l6 ?7l  ["o_3HQ&+JǠWb¦L.K0%xlcboTys/ܞg-_E[m zF'hc 3;4Ia1P4h|O ̪ #9+,5(BrVDBqAn(SS E(4@UR9J:YR%}ז"mWTE,2.G2yװ2}AXut~Qc1RǦұ@ǣFKm0ʐ<Hd/P׸q[i,j *c_S/ #B܎G p'()] X}U]{=%ե_خ]گ؍PϯQwUK؊a|[|[?3 P,xl'{:PKr PKE9@,java/nio/charset/CoderMalfunctionError.classNN0}& BJ+bcATlX@]cQTC?BMJһw))"᳘h[ȩp3UAQ=6Fښ+Kp[ T>FAg&իƄfha5t^jnrbR)BRTcᴟd\O7sᆄٝmTڻ49J?⟠͘t5`흛~ a=&A`{?PK]}/PKE9@"java/nio/charset/CoderResult.class[oAe{RFW_&Xj1mX0ͲKf~(če73^Bt'I DX: SH0L˽~ݽNȐnwV#C?W JOZ!s3`m$aUF FKzd< w]vڞ9S2h(+Á r2xs_ E!+Ds׿437lm h4\ÁQ;ùHWYR=]wĄ 4@ώh7uB "QحbK;LWき{PX9) K{B5On;9"K aߐq@-$M& &n5şҬb/ 2oObr{ r7Y܋$w #ɽ5b$O[d$BEphj6d1OLՊDiI-]aD񘾓3>#j\tzPK@PKE9@(java/nio/charset/CodingErrorAction.classPMK1}鶻j~h)ԃ "REXZt mvҭK<(q<y{/||B<0UYυ^W+![X(Ck<tC?mFmXX '. ͪpmڳ))7HNݞh؄ƨt͖ܵ {v }jPK:y6PKE9@2java/nio/charset/IllegalCharsetNameException.classOJ@=MZںVW EAT!I'2?KW ?g@Epι1w^^UEйa+֓"E3\.,p.Z p9&w陊s.P9RSB+?c C>\xr`PH>ZΧ\]i 0X2aJX\ = B7[1շ?v"b͠K a㽮5codn.*V :6d{0|Sws6Q\Աex6EL'M2YEdoPKk/"PKE9@.java/nio/charset/MalformedInputException.classNNA}sqz"(;!\rhc5YGXX~q 7oޛ7!F9vnRB},mR?a?pė:g)Y9}?ޛϷwhWQb=Lpu*lLua81W"񵎲PCR*iڝ`-U4Na2خPv#JT{>C3HBOMe|+l揝0e4ICq+"G[3A=%zPD{ޡji5kvQ\4G<>EL/f2ZyFm-j}PK!()PKIG@java/nio/charset/spi/PKPKE9@*java/nio/charset/spi/CharsetProvider.classQj1=5jպ/]p` S1hd*tGތ>Y>`^8 (ͣ0iI~0T12d, _dd(;e(KoG:J(34E_I(Vdh:R<٭:0esmbO~5\hJ6Oy92*wVaR &65`+hw)NM$ЕzW"zp a/x HK$ .UN$Y!~TLeqt %x`ᡆ&x nBy2OcMx9A_y\V:@gJ7*7R838zYtrPvvƫ7jCjwi A ;knJo0KF7PK&#PKE9@$java/rmi/AlreadyBoundException.class}ON@uL .P`DAeاp9Î೨(> w>fq}'f"1SF鼬u~J:Oz|5Ҫ:%{#Q2B 򺞎Bzib$yS[@I?d@߇ +d6τ9t ѰM&]+.X8؇%³kGWľ3'0.3ZJ#>f;ЈmŪ۹OPK"PKE9@java/rmi/ConnectException.classuN0EӤP(V:P`CE,LE`F[[LH |xNhl{st|8 O|y&VJ$%Fje[w"F,UT\1ݸp\MCK5H?57!`umK%ngX| Vx.lQN4`UY tF_40C=q#mo;#aC'u>.hwhzoX{- VvѠYࡉm-fD%.0 ƞZ.&oPKPKE9@!java/rmi/ConnectIOException.class}J@MFcZ*ڃQoR`m\J[bZ|-OgP0;Ϸ|}|8CׅŰOZ)e7wWfR+6Rp/e~!.:0W\MaJ5@? 56cLJ%ngX| V#x*ͻ(ٓ|a8 ٜ'QЯ0蔖0xC=K#q-c3CЖ0Ǣ:E^-N+oy{ihP.XFp& f1 A cn-j瓝PK PKE9@java/rmi/MarshalException.classuN0ӤP(V:ʆX*E`FAnZZx qFھǟ_.ra1>9T";߼F%Yf8X"rRW25+8JgOC58*mݮ2d$#łf\I}/v>S߀=2͹:׀ X:?@]Jd3[!~,:9RuvIEy[T F4`;ࠎ]5f |)i0KF47PKoEPKE9@java/rmi/MarshalledObject.classuRMO@}WAԣ^$&U6-FUz2GKQMӝfޛ 5 =~^_/rz'ځCF6wb*T$oق!U LaMUJ7 C[u| s +#70ې]/4M՚8s;BG44,1č^#!-NQV ֿ_[{S3UF%4IqvE@'g5l|fs߿r;p:&ip^[d8@n0b0i+s A3ӛ%FQ 峔%(ӑV<(^J s.su|윈nPH1lWajb/HDbfԪʰHJ&p@1sɱBc#xT4Ĺ{lRou$Q(ϒ0x'BEӔF uܤ엻::\AcI1/YEa{$=!V{ޢӫh_e4Gں}NPp75tWc*\Rгˣ}?G>^*.cںPKPKE9@$java/rmi/NoSuchObjectException.class}AK1_]]-xUx+/+gchSv$x*(&&3>>c#`8X%Om҉k1-Rg!2:FȰ82/Vag5Y;l|t͓$oR;fb0$Kk)>4ڱ9TPZ:[=GjvKoae&*(п<`kEto'$"T۪DCYPKۚBrPKE9@!java/rmi/RMISecurityManager.class;o>#v&FIJDL _Ң̒Jļ"vFIļt}4iF6̼;Ff 0FT.fNV6F~̼TܤԢĤTF!ĜĢL*RY -֌ \Eɩn =J@aF :Hy`>v@d 3pI VPKb2PKE9@java/rmi/Remote.class;o>#vv&FIJDLTvF`Nb^RVjr #Wp~iQr[fN*#7DH##302I&6PKu'YfPKE9@java/rmi/RemoteException.classuPN@mjEQh< 9Xf0^&&&B/5kւ'~e|쾙yv=8 {|C=὘T\ c*UP]›Ci$R.c '7b&…Ldz6  .6Pd"ngӁ=#aFj>ҜB:O Ѫ4*hMLm;s]2hnctwLŵ4r1A 2(r TPl%Ld/ؤZBywV+nd\lvZn3.iX`cP*PK7LPKE9@java/rmi/ServerError.classmNN0=M>(TTe%6Q vZJŖ| 54Q +cf< S"2кQZaRrgQZҳx '6|Diy?/4~b2O+@|Vo俲+λQf]zaj;E^8-N`kGn`>ر>v/^ࣃnod9PK8PKE9@java/rmi/ServerException.classuN0ӤPh)i`+" nQ~I#^ C!*<\c}/yRDBB]⹐y^UDGeh^LW Ah\ fAT(F{? lch tLөP|nW:'ljˢ&Un[;wly=lc!]cv+̸b|9\0ԥt.LPK.PKE9@%java/rmi/ServerRuntimeException.classON1=Qa\(;d!cbPW`ؗk)[L\~v ${9?_nPbKMdӄ%3#әjBz|hlUH T]N2J+{'Ш1j$ٵFak.z ISѽ֑:(H,9-t;P)';Ⴏ4=O>bE? 'ruLW5h&͕YK7] 6hjzRtåoq'ý~s| k|b?[O @0PQCgʍ@b'x f"x&ͻ(:Q0t]Iمl`xSX}J TY$;.usn&q TFѣ5 e7ޡh!;+vg.اQ/Ŵ,l`̭I__-;PK^PKE9@"java/rmi/UnexpectedException.class}N1ƿ.+" 9`=m Zc>Tw^t9f؍5!ᔧG`]`Oc)0==Icq)"3fMaC7e>N);;l{iPlXŚxbc9S`cn5PKH& PKE9@!java/rmi/UnmarshalException.class}N@--ՊhbLz3/DOQKvkB|-O&|84ifvgOhp:JNxr\fʇ˰܋4ŪPJ NdU Wpkƽ!ϞD k0T:\wt$%e1O\K^|" ?{$s}f c*@L!d3[i19^xɭg3tSۂBaЛX1LK̐.eSwj6goK쒫-lmnth8Б{ ɟԶֹ*Lb+X%\ q>L8Fa9JeƮ0 pR%15^00v{Wh>Bh"4f0iyI%ؗOX5 Y5R.kĥ\ֈK,q1R%A_!I kj]J|*pG\+!Հ~MJ'JEU "$nj%qUۙJXe[4ܐ(7qXNb,PE*'~džhe<=I *?@t\;Ji RkCϩ!tgQJF%y{ګiom`u|2 lS_cv ̠bZs`tԤlPK=,4%1PKE9@(java/rmi/activation/ActivationDesc.class]OAi][* |(D[0$k eSldwۨ 22mm!Mw̜3;g̯?~Ėoqé W=hƫY2ݪaTYܮoO/̪#ΐVaTLGpK|槖 嫸oDj8{-۾ÍҚ<|[ۄl+'(ǛMZBhsl"^$a0L/ɚ]▲\ٮSz2I~ lYvl{골J|=JazuSQ6Wd^[Pd}\aysl#K!߂jZn'z@Id!S^rV@ŵxuKMu`{ q)sWOPKTWO%PKE9@-java/rmi/activation/ActivationGroupDesc.classTnA=RRRjjjV[L4n307?2٥3wsww{L ['-Օo}:aJ}Lf;y"ZC:Jj%-?-HXkJ:2Zcnۢ>dPҶ*T(_ o0Yfv~rpra!;{~vTjn[$1)0WźtA]hrmqne)T!*ʗFUkQKp9D"bܫ{+wz0Ӧ1B/<  NK2J?3{QۋjMz=GO|ȡ)5$J{LX|*^Mc-aꯇ^t ^(tYmٵ 8f `xL{(1MXIL[=kJKoc4sXo0o\Y PKaPKE9@&java/rmi/activation/ActivationID.classJPI/ڋQ /[F\R EJݝƃ&E|*] .|JX̜7g/0a:b 젫lj B{Y|0$ޣ}H'4&X|!%\*ڮ$OSN>j<d `"GHTvG/L,X6B؝~L~?p䕊+q F/Md8pu@]s0qih@@(N[-jFM1 jޚPKnzRoPKE9@0java/rmi/activation/ActivationInstantiator.classJAi]=@`A`iu6fGٺz( y00ߙ߫/=+DY`3]2pHh$~z*f˳e,7Z:}=ڳg!&zdq׍P潀s:bGU \ ձ8s/N3 wlȸ=n1(yI$)#BU5TMaZPK=PKE9@+java/rmi/activation/ActivationMonitor.classRN1= xE~D$q^1F/@LDykť%.m>~qE&>4̜3s:o/rdj1n0TB52=NUh%5 Ww9rZZM([I&b AO[Cٓ;Xeqa"OtQ'M kF5~NZ҉"灉F h,.=M,<)TwMxLDEti+ OVA9^r *6cPK:+PKE9@*java/rmi/activation/ActivationSystem.classTN@= HAwPA_y2^1 L)-i^b1?8-P#&>l={fƚCN+f[ȊPezel#!v&F٬IJDL̲Ē<}G3A$'1/]?)+51(57$j\ :J78#1''5b5#kErjHm1;7#}piv^Fu32pg%B3m}\emrzp~iQr[f>x`CY ]v&N Hs10L @5` PKt'PKE9@/java/rmi/activation/UnknownGroupException.classNN0/MB+ؘhA" !!,KbH8bBbx(瀺[t_ЍTNU)[ͳ]r1B"ټ ;%lZT=I*=G ,!!4z~Δt,L.Ͽݫ'~Uz?Д6ʻo/t82쀣?t5a镛+ tb!`kA6kPKjPKE9@0java/rmi/activation/UnknownObjectException.classON0FɰY/o/8>쀗?o&c1׀k+7V3EqGUXc6j}PK=PKIG@ java/rmi/dgc/PKPKE9@java/rmi/dgc/DGC.classAEo{7KƈWȈĂUk33_>J,L JNݮ[DBS'ecm uP"#P3! KhWv< ȜDG0XL- |:Hj_1l^ؤ4~A6Gi ˉ $|@"]y&E W9ҢPKRϹSPKE9@java/rmi/dgc/Lease.classmQMO@}S |yX1T=`/eK MJ2ѓ?8%&"yoޛ' ;X /*o4<_t`l= '2H5XP=a( K5Sa^wzF#"" Kt(ԫG^v5V[r֜Ekn5VLٕ~V^֔CSPK ?#PKE9@java/rmi/dgc/VMID.classeP=KA}Kh>Z A8^a,qe/^,M6V?%N6B@yp-BkUM9 {(N7É PNX%&TNذ=%w"B<iEJhlu>nX%}91{Ov.g#mn,Ous3cR,Fz-i浅CDY U &] Όq]rŁK/ @Cj MD 8ƒu`qEG MwPK,PKIG@java/rmi/registry/PKPKE9@&java/rmi/registry/LocateRegistry.class[OAgJ-P T>-Ƹ_4ƄHҤjˤf:4?xfv]efΜ\f2?=5C9׍_^r,@X^#?z"ЄZ-79i*ⳖQ8)cмqŵP8.a+Cj<?nJs,L}uL!r;7EL tNGR>qAY~}+te i㈓Dd@X }3}7m/ y]v'?d,:v ~IXr+X*p'? >+GW*gҼYS68̷Q2 _F',}3+Vy-Y&Vc+ƻa,iF2ck0:6n8m`+mY,:Ɲ;sL1d2[F< msޝ,-yd14/|j}οX/PKkŻyPKE9@ java/rmi/registry/Registry.classmQNP=U i`cԠ!1 )\n ?2+d=s N nrRcӚ= hLwmg}QtB:ʲW*Fz~}[MU=ղ@큠K(J:^\[R-Zd#a)iYDv?.!$E˳j`H8__iAG+|b7,(t`=:ɠ ?q:gGpy8[-71$+ma#:c;0 αC,e(,w:PKh=<PKE9@'java/rmi/registry/RegistryHandler.classPJ@IU+ѓx^s*X( xߤaf6WPMж(üƑ|)D`rdeK}>^(6>zQ+SBgC_Y^*dv1=,$ nS.,tcpVG״pi8ӨV(+(j]XbO.uBl ckEmR o\6V@97<|zA98'PKN8zPKIG@java/rmi/server/PKPKE9@%java/rmi/server/ExportException.classN@--ՊX7,z3/O1ܗ5m,?\b8}9t"йp9S:.#1ˤJ] 'kуHT&]Lev섅*4eZ'ᡂx )CE2ObU1Ҽˢ=9C;f9=ٰbWS8&%-UBGNfmК0Ǣ*E^ה-N ;E{iǨQlApP! JV_`V 5+/&PKKjPKE9@#java/rmi/server/LoaderHandler.classJ@KjժuoЀ7A\.X~h:)IC'҂h $|2|{p 9gٖi*7&&"铹8ːPmPqTu6Xc2IK}jңU#S#+">uO!g9;IS/:2g Md/D?%dk>EI}*uhiCT9;6h̆տn\%ƣKRzSI#ݬHzB[꽤L% -3jY[VGx [˰ >T-(P i~hJ-˪KI0-f`143ho5/Τՙ;Oth22z(D^f"/S,bY*-]Eq.=_};֧uxG&jCzfPT:")lm܎Y;oq ub.ffþaZ o;z(]{u‚M"e8VlTn[j%|u/z$j{ixuyZ LWLP"5fĈ϶/v9 TGBz%dj#X *MOhR# +X$1ԀPnL U p\m<7Z n#szl]_ś:",?{ͧ yjWBVV&6#cnO*^7oT+˲ _F.0v#.{b=6g%-gzlK#BR*XbEQ&E?&IIqm+^28;)2&k{PKcj>PKE9@java/rmi/server/Operation.classuN1ƿ (7 5 hxeH,I%Ϝ` (õ1c^$O_#f\_X0K-Ao'Sigs+)hiؓC˷ȲM'8Ekc5ݕE9N|cǎ̫ jجNPK&D<2PKE9@$java/rmi/server/RMIClassLoader.classT[OA>j/h H%DVyiuH6_铉n[)J:3|\fe4+ZYʳ6N*Զ&-1+  SF9{vqtA ^fB)A`%o!7YF9G Ve b1{a#ynSzxiZ\=cNMcLfxdݚXKwc]0YMȎxZ4*+},d>!ϢCvIxgudž-3Yy,xm[E4l)t*XL1sns`klYVt+V*V2[sQX" XOMqd:FWt/lnwCH!"k>#pG kz-[=j98=ViQ3lC| ofBr_+-H"7'ЗΜBl&HDgɥnxmMD{CF ? Ġ@(4g}y&_QiI}r>u2k Fa OqGГPmu<:8&a -2rYy"'T0ZgrC+ܽ"u+)u| ܒ]GmZ(ۼbtܭ(ǡOk 7z;x.Mݐ aɀuxʻqŮʳm5yz_[_)_9W PK28 PKE9@'java/rmi/server/RMIClassLoaderSpi.classSMO1%[%oh DRB%VHHKI˥''1hc#gqB菪xvD$j7o潱e{` i(Jzt45o S!)OKjE Ѱ ma)N=9`l2cDӮ 0ON.=)z_#eփJi˭Ԋ[1~qRRFjZlo M>a^^IۿnK4 1ϰJ'gڴEW5~&̈́CeH"#Nv&FŬIJDLԢ" _O̜ҢTļ"vFļt}F42F kErjAIf~f#Wp~iQr[fPz }l  b`L PK͈PKE9@,java/rmi/server/RMIServerSocketFactory.classm @gcL4Zvڋ6Z+yX$r}5 …egoa^a|有MFl7qZT#ەTV{Ыؓ"XYB_$+6g+ق-o/6yMT`EGjF;;wUl"p>tw6rCPK!7ůPKE9@&java/rmi/server/RMISocketFactory.classN@ &4- B@8(pP"5U7f FMoWH\<bD(1QɅwfv׏OPq!̟b;R{#\H_pK"lyG3YndhRcٺXBvG$TWg7:9c&j*Mf AChMǜP76ܒfOv`R/T]ƠJ*%@j`i?kS][nu$,<~|y`>+_^9”U;$irg̙3H >Ug$1wQ|d;䆫@f S7cU;B7œ55L1b8ǰ\<{ ؅{IZ _<)$"զxk2rŐkچnvtOu@Kf иjmTwNVm}V_ߵ5we8S!qhWXA (-[Đ]$7[=;G@ Q(Ɉ#AO/GwJ:U*EF1zJ$d`Y:S9lIƒsҲ\ aȅ7R(sz/)Ԉc TfGC EpPKx"ׅPKE9@3java/rmi/server/RemoteObjectInvocationHandler.class}RN0@ygyKA7hŅۺ%M'$|8$]ϯ{X`0l5xmՔvKH(Z4P\QP SW=, Z,du;[GbH_ 3嵨97 QPYah 1s/.eJ x7\8nfX-ː.:qðCm![RM_ąAչMo!sE<ĺZf&jJu<ݡ50]DRGb*D#zv܎UЯAA7ߐ}I'a ЧqLParӄ59̘clI Y70y=%-PK3ƀPKE9@java/rmi/server/RemoteRef.classn@gC(s^}Biȡ=mik!#qBֱ+,Yϻ {а`O QOP;=+=C>v8'7塒To)}ߵ jSCIB VgTIF^$@F{)28R5omsP S7>SAA`c,=eGN):v*~:cr@LJ #2*@|=;LH\9P? ZIEܬ?MO`C/i?e#1,e& 1c0o3[Nk`֙p%h6cs7PK PKE9@java/rmi/server/ServerRef.classmQJAƴE~|i۽+*%崌32;.>o=E7]T=BV/3|ęDI5ȷgds~X=K9t?;-M#&1!C2J@ zFg.n3|}.?UOuKun_ A=@f@4ulI47Wg륊57۝5Y@)^ԃqة|] tR Wvx*<-H)CH2FqOPKPKE9@java/rmi/server/Skeleton.classeJ@ύ5jEݸn7J%PhWRN&a2-> '&`fq9ߙ||~AΪ /PK"dPKE9@/java/rmi/server/SkeletonMismatchException.classMO1 (z1ƛ?N02nt oy2G+Abb|Ϸwhh=ʙM̌{lTKoCX { yVxf"G~GV_|MC4NU1U]jX@@WOOGp <*xX7(Mx@A2L$(ϋ;VLo=9FzԄtOʱk!pKP䬔+lE/qcb텃6`U>lb+Cxa;{`'ח_PK\%-PKE9@/java/rmi/server/SkeletonNotFoundException.classN1OUDQ`"`L j 24X\|(00s9/(cO SハZm@ |1R4 #ڊŔ!u+w F\ ]k6=DSDqlgD!^q'h0O? yO|F{Lg9e8A7!Jg 芞Q%]ғ?]87[1`(weXTCҖ;1=򹥧3σ[1:% 1ړln Z D4wӌ1s:a)Crq: p8"_PKRPKE9@-java/rmi/server/SocketSecurityException.class=O0_iP0A;4ĂuwU i\NT~?Bpp 3-/'ܟ1Y0"ya*fI.z *.2_q8 "5ϸ!GVlJlέxdnF+df3vOFL>QZHh:xt薂 [Y]֮E" fцӋS}yPQ}Bޱf;FCR]Y&u݀(ԠfPǂNJ xhڶPK {$.PKE9@java/rmi/server/UID.classuQNAY<}WM<фd#ULtaAWăGa!p/g84a0d:|-Փ@PCj"̐҃.wz#Z(CVwg9BIޕ KJ!T,5^[z&b I[nk u?amŻ N*taIrS>ꄁ9T* =U>_)P߼Dߗ;0QQkلK"Jdwa}d.l@KoZV##cNAOF_H2=5:YHw* $(Fu3 HRSҚ!\(7{[PY1Hc[[?s颡!63HlO_PKQ4msPKE9@)java/rmi/server/UnicastRemoteObject.classAoA,lAl-BVk[%F&&C1)nvb.YfINd2nqa9,of??8D݀FwiOF0rLi蹎=a't3apIf@'^L2zrA{z.{K13»+{yڬ:*&[9- bY:Gh@S{03;p:م;!8`&O7ۢ1}j Hl+'ХgʎlfZ^4|޵ pIE AlZQ>5Y lnܮzx'/+U4=D5-Y8+HTJJ S _7`gB"*II0p+g->%CW:_AG aֹwʾp;ZC_U^U! E5g[}p\VaCPKzN; 3'*P)Zwc^!d[#l i\A+PvCOf6Ua&Bք3J꾊"J3퐰PAب7@{Bզcߜ`V33s\nn` XFH"yn0K)b* fs$WYWPM{̡1Z5FӔFlTPK jJPKE9@$java/security/AccessController.classT[oA>KRzk/& hBI ,6 i>G [\Ros7?~s8AaRi]™3ۮX#,`"e14Uظd圉mn۹0`1_GT&UnN0hfjQdgɜu.xŚ/F tGQ7B,ejNWPץQLyqV+y@H 7|su~<gvZƮj4E@YJr{O@x59k] mq|cA8~^9|x| "FpwӠm1#NB)#szpGvt=҅:{yM'r=e[=Fot{4.U$A}4PaA¯4= k1,̊˹:\S˙T~OI ĐE6<3jOj}exF.tϓCt@ݳwRf#2O`׵خry=Q\}.}}-7=p9eϼBPK]VGPKE9@/java/security/AlgorithmParameterGenerator.class]oAXҖ*ն. 6ћc`jbW2.YJLgf](̜sΙ_@pz6oEeۼ-ac Txgi8h7:XmuU؆<.\0^Z D)đdjry0Y]'^o SK nr-ƜKppsǔvpmyat#TViOT]JN530^XuSoNԨ䫯8evfM>j=r3|(bS_C#ש ~AUZu,& nCnR=Wz-/hF o:MvQY=[ yPza@~4{Gcx'n #BPn`)-; "?4)CZ+Xi!K4ʨ>]Uܔi#;5s- sؤ102#ER2z9s(O)*HYW(Joǧ) -?x07]ŞDl71_ U]<'!":}(P_B>6 {1c-̳w%kA}57J#aŠv\àx*0g Auz@KP"r[HG]ԏ"j[{=5K0@ C }9 pYE嶢1RV,QNG'q]V{K0dr<4_j ))"ՙR J7'4vUժn(3 bn - CZ ((>LȂa;Rz(WTv݅)ԻL!]fX ۬e[j5 W5䴢ضe0SBv`ԕ^jS{r85a >!| I_>Ocy$w50-u{L °y+~ lF0*1$1F3xk)r &*¾upSp nPoQLwaL0f}}jEiHV~/EAaC[d[DXj0齀]bʴRx+ي/pT(mI`VI[CVXSC7۪JB뮘 \mx]=X熝ZїC0{P؛l *EASba{8@ Ϥ PKKA6 PKE9@*java/security/AlgorithmParametersSpi.classRN@}N )J PhKW=(RAJp8+YGS|b@Be3o߼};W76o/ĥr 3e~z8yD_@ٰ%3:N22jSieZy=%XGiO0%TP%t߆BM$aF"9*ַeUNx/>;:f/눏채j?"90*չ5BTT>N])eyc,<>2ȈК8JDۜ3,M‡cO] TfH_#|h~w9Cn#;->y~0º>d f>ؙEn3cg^m^yso,j%XK#秀ea+2fq~V")dt4U*?mLp%bz/WuwPK516PKE9@!java/security/AllPermission.classPNAY@KM0F јlD۰N`̲B?yГ?2nPt3S]U`q +w+z+ ۾nGz:qD (ԁt)G[D)ĐdȕLMӪ\tZuU8oJG:M^-f5wϨߖÚGu1.}}V/4j4xqy',^& ɖO3[*3HV:eν-dNZ,Ns-q"hE1}) ~+/ Rt b^ŞTjfPUP1MPmOt"O#j9ЁAj9!KƎ c#y Xer_,b߾ ^nk:[PKJR$%^;CR=aHέ%U+FU0n8]2zP\wh&o=t^}!KC.0Jk1ʚ$N>QN"+R/XSdid(mڃZ)B+P}4iBƚ)ƞ#bzѐ0he_違sWw)VwYu[PPKXKW&PKE9@java/security/Certificate.classmQMO1}eQQ>Mr2*HTR5<Qơ:yo7\yH1'3Fڹ'2Vx8`(:8jXHz$jͮCT۾5OۭC3Z<J b$RQvW*7͔SkfiHR -\\ 3 z!lg^UoH7Ҟ8X&QHoj;s2HWrr(k{Bx+na w~|C^E+TiN PC0V ^&1"[h` TpvڪQ$hke2؜\`mܧ=f0[ z]{n[&ھPK3PKE9@#java/security/DigestException.classPN@=S UDQ(ƨ,377Cښ~+~e3m 5s;l:{cO 9B6OȵA7gX™ e|ΐkvt+a< ~ TPD>\IݧC;1NOk-Z#<zXp2\i[ηIoGmc&tL{b7(_\I C裠M}E:2ob E3bb)P^k)Ev RX7;Heک25#dtU!t㫞j| PKtUBPKE9@%java/security/DigestInputStream.classN@* J]1FԄƍĤ`W`c5!te𡌷jS;ozp[5WϵpϿPH8k1;!3h}P2Q */Û 5m+XF: Š6e .w3dLg ۖ+%fߖμ{}{~ Pun-ЗV]P݅|m%ڙ) ֵ."snW#N<Nuo}I0OkfҰ& EGEo m!xt}ţCSȀ$m'0K~i]5OXTcxTZQbH0)W7jxN#Nv&FIJDҢ̒J}<ܤ̼"vFļt}FdFThTK2 fYTIP#Wp~iQr[fRaTWt120203#Ѭ l ;dbPK5PKE9@,java/security/GeneralSecurityException.classPN1. ,7B ^j]Sd_ 1M|~}ľy0L=P<-/Lb.o₡t-c0ZC<2 جC'c0{ 5H0zIȣ!WRv9eh3ahX1O`չ޲t^7LT,.hJA+Y'3;_v3M1렏K}E2\lb e%3E(oSK*v"Lz[)02G`IFW5:|a?PKv=PKE9@java/security/Guard.class;o>#Nv&FIJDҢ̒J}ĢvFDNb^RVjr #WrFjr6X # k0ҢT̜T XƳ2X @PKڜ vPKE9@!java/security/GuardedObject.classmPMO@}J~Ęck4zp_ .4)-*=x-vf罷of MTGS\Y.I(ÇT ҂H& :U;zHjBy~I+7"8شa&Tnj&L " n4'5'ٯ6XEno$tK'$4&2-+sqV1>8ŧ_lbcfZֻ8vo;hkƊ6boix9*nv.:PK'w+PKE9@java/security/Identity.classU[OA=."ojHE%5&1!V$OPuwK>Gnon}\̙o?%iGU[0]0X0\Q +tNؒW/ C \4 Y%siJ@2u9 "1hVZ G0 ^:Tf$lwd):璂bFUe 3P/23 7-7yQ HeXp v4K'_J-QgG!n4ǖ3?*>Wy YkLHA/ ؼGnN{ 'L촚/I"fԃd rGbu80.A([Wlݩ#\R5Uzw0 U;rV6kH]鶗MWb OcR,Τ#q4MQ71*B t E{}wVi?A ;6')0>F- ;{ ꇣ{HB]=bOf8ɺPkː: /. "ֳH"ŐkI_MG=: |+pJ>PNm0*iJ2㪦-2TpM:C6U9dk/TXPLa&eMފgU!#@LUfg;L3Tdd#2ſ*U0J_PK{SQPKE9@'java/security/InvalidKeyException.classPMO@-Q/'`՛x!l`MmҢ,O&(mc0ho޾7ϯbh>9wf έ?߉+By i K!:2`, `,r }8jG`({C>'C;QHZ+yܟ8PI1\+ d0UctF{R ZeD7RT#%V z0ϦjN!#̶߰J՜VE x'_ZU#DŽDv,n-զflcŠʔ2䪯U1j_PK?PKE9@-java/security/InvalidParameterException.classOMK1ۮjzpśT"BtH4$xėtуa}5G^x.Huɕqg s'+s"`8buW&+fBC\ji/!ʧ"B-4dh'Rb6O`$y՘9g'\pK~Y#u6+ܜ1 (/L*ncg>*W! )q +6}5B@N̼ͻ AevQ~wPKS=LPKE9@java/security/Key.classEO9NAږ 68vJD!phn-cgY$~#x!J]]p h^TZr^yv=Heq<$8 #]W2,2 v@weP6,|~Nu2}˂׶ D5[КLWps*=sy ~V?L[ :])@MiuCEֻhFQsPK>;PKE9@ java/security/KeyException.classPN@=S UDƸЍV.$n :15CA,W&.?xg 4<p=qw"ܽ7OD2  'w"_`rW25C0؝QfY]P> =Ov4n6C}^d0j3δʖ4U=,Z~#S[TSp z"ϦCKQζ>N<ŜVE(oS䝄|IJ#W 57(%2Z9+2*OV㫞b| PKZ8?PKE9@java/security/KeyFactory.classVNQ]TJ rWmQ `(!*E }:Cffؿ'?ʸL+}8Z{} `{qDoԆZV,|cUsLGaRZuը+7\sF!COӰ(/,!KȒc Z]2D+ƒ!0uSg jE Sꗪ%ܽuͰP|Ű20hmd qKr[/,ѠmJvk.kbF^#3%>~xaDZ:1.|A @]h {SLV^de悔'vTC#U6 zq4WgGj}x=E+:u??(r?ƃrxX0ϠɐfokS:'vL:jغ5 ٠4t"ftY4~,܈Smw}ҧkq}9Js,~"q]30$y1!bHaRcP0E74f@,t2GgQ$r"{ÌdH{Cɮ` @G~/hfi>c#.ea<1Fiِl滲PܕB+&b G[E@NZj0TjrUkZ~q}iv,28&ތI0V2s`} ͻ_pa8}qΣ(AbKآ)NL"-b ص;؋eD9K2*O U]d}U,PK@PKE9@java/security/KeyPair.classRMO@}WVA %p .)4YZUz2GAy͛~|8G@6snτ).s ʚtd߹c U%/ ¥G/=2.Jy(b=da"M ,l+Kh u8!`.|3}gy$suP_;]"04`D _b oA)O\(V:iGtū Ezǯ0_h.)%PnIQ zK Oh {^rj7+aS7l[Y[YYY PK"KPKE9@$java/security/KeyPairGenerator.classkoAR,E -P`m] ըc"i~.dYW'?Q3B,9gϞ?~xR'>0tuK\XDb(,Իa!iTͭf:j/Bo톈"ˆ2 JK\;Wȯڂaj}fmC#v{ ™012M R 8!-2*XȨ̘j">pawtf Jy+Ը;t5INk@5==(uL jIBŃl DpZ1@c;n|I]wk(MҀ0MwoӨuЌc0"v&} _q6R4Izc{xk4Ք^) (jT{s9-}pem2ULl3Lgfp!^7jD~x8PCg0#ٱ?PK'glPKE9@'java/security/KeyPairGeneratorSpi.classR]KA=cYZVFQQIEzщuWUSC?ٕ s9sfC>@^%U\T|2 tҰf6OM~On(W RM:&H"%(z:;YH`ҫIL>X– lTF )3g3iPXK#;c*'ާ`5VM@o9…=ỳVFj٦X Qd: n;> k$+K=ҩ2#X岷 * YX٦9s ?s@m*Z$l~ M#sP/D0RDY1e-a9 PKȊYkxPKE9@java/security/KeyRep$Type.class}TkOA= V)(-ڗma}PL$:k`1b¿jMM?G53%j @=s9{;laZV[}=>1trN%aPNĐLG+"fX-fKqdH}J[m۱m%3<t~TKWn}k;'r~PxC (@BGt1Wl;M֬f3D*ݖծ[-Ԡ L~v,[>`)֑eVq:y !uA{6`0s<-/WU'J _c!3ՔU1lV(vshP-k.#>q,Rf3?6e{*> hRؠ)*t}7@:Zb 'ĈEYTPkDK_ *O)CD͆o7/N"3xB)@H FÍbIfCv 2,,JOoTIg9^[ԧdžH6㺑^~n,hHà"̸o<2\7 BL`xBPKOeZXPKE9@java/security/KeyRep.class}RJ@=^/^Xoo7-Чmt%&%IIIRJؙ9gfy{yy@V6e'᩠U:9 bKtV%+0+T&OI[=ȚMm`GhvPiinY<\wT/}H @LiF^%BmyN > moZk a[͹Y#qn<ɡ x 3*(@ Enhl})(6n+=xӂ!!x:3}o&:4ƘO +bUm8}nqwّ=WG!: |" k۵ e yK"Ȱ'j!"3БaUrδ]LB># GB=.0_jd Ms[ĝr`o晌 ZWꤻ^ -qkd,C̽ v _G~DҿC2쭹0NVFcb+B0Q@=jg)& C89k^_\D9ۊiwX!a!tcRJ$SPKLmiPKE9@"java/security/KeyStore$Entry.class;o>#nv&FIJDҢ̒J}T׼JvFļt}FҢT̜TF^=BFϼ"bvNF1v02macd`d`f&V0@r \lPK3a3PKE9@/java/security/KeyStore$LoadStoreParameter.classPA @ Tm* zգ /Xk(- Uk|=U0d$`0IU9[AKţg֬ , vDŽCMFJj2 dC B^)yVhuZ"9w6 *7A&j(3 ԾAx ԮPKg#rPKE9@/java/security/KeyStore$PasswordProtection.classKO@]yl[1tD(s>0d{#e: L;N,ד! +plo` 7i2+ݐae0>CmJ ƈ9fh;~0p] Sb> ]>=C3TޒAM߬s_ރJױD6G脼B^yE%)jP$[PBHTΰTf7͞i'Ƭj(XOl+UC/PKFUcPKE9@4java/security/KeyStore$TrustedCertificateEntry.classQKKBAirB#Tm Z(d#+U~Tti1}1o/P HT?r]}F#>824[arU(|PK0XPKE9@java/security/KeyStore.classWk[F~gY [QVA@i+6dG,M(>=3 !d23ﹽL-!p\nT+,Wq,Qgfay7< 6IbҎ9Zq*f;,yio1d2FzЎnX]4mTΪaqŊ[kcyLaPa8I Su n&aB}[ˆ nɎ/PL0kW{f&ُWtB)i^!G'MFtvm )p-YsR"\ۮ_~p)E2Rtו 4!8qEai9$r |"p-)vqu G6Wg5 #xp :P"Z cIIc׹( wҌ_o+.5#0Poի'20O½V#'FY;6I$#T cDZJjlMYnm.HKFeJH%!#yC M0+&WQ#  "~4IAҔb^L9IfN1\Y/a7d>3.v'YgV N#-_Ӱ@.G,E"^Kp]u/i-RԤ .E,wkzFvZhصHwJگҖ Gp%2rڰ7 )Gσ ha)ݙiR嚟LghwysWKTqKnKcǦ2f虷m˓' ]gq,?-x`2PHuЍs]se~RiN;C*>^e|QX|8}E KY= iolEG DQJpurvA/ԄgWrP<җ~5=1Kc_^28DO G=G} Ў^ȡN~ 8'h-K28)1OIeWiE˰?bƥ7Д#S?KoBcƄ8f &H ]c! QDn^/X&EP'%97axszGE`$A0imT]66kt]!p#)QIIym"&cd5qz~A.× E1[S ~A N<$xZ%Z$16zDoMg"l>̆P|zqK-hm=SD|h&ڳHkڒga簜 K~"aSW{sYi@h稴켜D3~Xq᫄ąT0o*|*\ZoޗMm;VwJ݄TVx֭*X&d]\ɻuy7P.pZvaw4OvGlwhF=w@'LPKXsPKE9@%java/security/KeyStoreException.classPN@=S ((Nda՝!B⦄P'0fhQ>˕ ?2ޙ6DDgq_sιgv'J3V̼8RO"lߠ /X… e|ɐk nt/Ja< ]8χ`"儡\JAG+:f-p^1U̅NiR^k%EŵOrkς>6UIԹ| kTX(Q,a )&eM甭U!;) #몂m3Ly[*02)`AFWUi|9+}Ռ;PKЭBPKE9@java/security/KeyStoreSpi.classV]sFk; GR %B PڤiRf`8bl)#2MSڧ??ӳ"۲c{ƺݳ{J?DDo J1lZ&Gm~d cPј[nPm(긎Xc嫌2E#4 e](;. {m9Ke϶Uws̈}Z+F[Cc59S©6ݠ}K8 \K>[-d qk+k{Y)z1uo] ^o?E{F6L4*F(DUܒk'Fw2<źl*z[}WuʋHC ׯ#{^tP`4ѺGk48 FWt?(r_88mlL(f!TRpCvODb>h9iRz{Jzhz(]5]ȹkV;:۶N݇@[!;Fp 7m:Q!cbaFDAA :O[cCrvhWٳ>299^Ր}(ڶ]81vZ&)͇&iԍUDkF0h4R^NrKщo*MbE=uK&OdL7^%FgCUѪ7L7sGcTr]hW z7@2PyqЛhw3*%owSEgMFp*e:#t.3| 8BOk*ݫF*;XIչ }Stnz3b$=B/b0GCwQ8-AIZEc6쏶g`@~OL]uzrؑ'kVHz^jYU&`D :5bH*(,L=2|I=%f#T o4RnxJj S¾. ^]/iv!+#az [ PKSC PKE9@!java/security/MessageDigest.classmOAgkOJ--b &g*1ᅼ:度=NW&{ڻrۙvv B ƕpiwwxO]0!3멠X%}_1y Th{ da9(js,z_Qq֧&[vx=XlR>]6GJ " i}) zM'P8ڡ-W*jJZaLC聹KhRMߴ1wAՒ)aTkQz#z$.`ı;H W X:A}`{"K:*1K`NFEBU}~08R5<>Z+QXn4=y\I\Ap*mзL꜡ɣ|6hd`|` .LJcc6>( F1X 9%3dJD=gP,+M7A{£߆hӂhܚ95V M,g*&d Fv>;0JFk鹁N#9QѴ4MZ O! 걮.C`j@A2$/EI8uh">!q9Mf;Nbe$bW_iՑD<]hb-rYn\"/ PK PKE9@$java/security/MessageDigestSpi.class}QMo@}81M-mBK8"PSV"KOM vd+8 ?ݵB>̼y?။a<کD[PCXp3 a.BE(?T EuLp⁨*J(2ǾH ,u0u~3'QDkugpS(JQbsc8Qb0"Q{Z'>NNqBXۚNI8APЃ?!P=B^Z(;Z1iv߉TAn<_vճd/SV?3*8KBJegH;`;#{]ڜsi}eP@c.cc8_Lf-2vid22Q(X a嚙_F}Ja0r4yFavm7*nkQ;\FԉtWx:7i5+=5<֌P6'bdvL} PKlPKE9@,java/security/NoSuchAlgorithmException.classPN@=S ((/ݘ uCؔꄎ)-Zrew@fq_sιg5^;3%JN?rϿXFa IBM%p+C1ZC=r.#C'CO&#|j/x0J>ڱ/g f; p츱c̹[Vnk8&_ER02%7J'~q.4>6Ue9|[TX(Q,a ; ]ʚo([Y!7 <RnmLȜ,+2O7U3PKqAFPKE9@+java/security/NoSuchProviderException.classOMK@mDcڪ'/oR"%!6]ڕ+$$xķ Û134xɣH #h"]ʩ0ϩxʥV<[YR?\B*_24cJOE&VhgRQ8O2Ѝuʳ17urpk!Nf\͢$7R͆nSkg&0qo+>"נ.P2V^8fkpЊ7j9acxۉw+B-YsPK3PKE9@java/security/Permission.classR]/CA=[[UZm)Qx" 4H*}6¯I^x93sd^ߞ_l`@aoxfJt*ܖ< i]/Ԛ rN"\-yk0gd; {ۑw6aw]^2D @ COQqЪ LI0dʎɭ*'Y?ߐCmmʹgH a^~pfbu-K9Qׅg%s[4HZ^dʒj'ݧSBy[ܶ}DzeXTPqR4NZSYPS]O>$'oll Eo` 4#a/iu i6u%~SQ/ 6JG1u> !媖 639a4$ILi;0 L;PKwnPKE9@(java/security/PermissionCollection.classQN@=RB #Ltȴ5}7qe𣌗AB$,sOpјpfJb ג'(%L"FS~4z1}H3lU}J+*nI[md1`:HDbW&½:J]jOc8ؤY|4b՗S-%lxF |+;cl_>\q Z>M Q 9 >jJyO\ \S\Z-|:@;Kхidr$PA"QDxrlDtg])fsy91S7u%U٬q?DPKtPKE9@java/security/Permissions.classQMKQ=o52ڴ҈(nVSb>b>M-j;oah1{ϻ 4_pГy+<[t߀p%fEr U9|SK0ґ!L;EdQ3SA=%a3f:!/,a 'v'F+'ǃVG i~0lI#8vCo&et핧F4.@_NK@IAٜ*bl)` e4; T['V7bUhdꊵF$:46"B[G#qI>ڣe֘RTTYPKYFuPKE9@%java/security/Policy$Parameters.class;o>#nv&FIJDҢ̒JJĢԒԢbvFļt}FҢT̜TFn6=2Fϼ"T~NFl@XL `Hs188PK 7}PKE9@java/security/Policy.classkOPg Ƹee/C#!NX ĐRkI[|'_h|a ?l]aIӞ7u1 IRXWْ*UaѣJZ5|ea`|P* JGb1=0nTt-*cڔUES !C8n0щCQEX E]CPwcdS`b@}"u o$S֮fZ&m0Y EZ*K!ո 3 b _d~n4eXl/7jUZ}0})G_0NCmX / }VJ~phA{D.=8cA ^Za.ݚҜ>[U]m=*`!sX~"ˑn5In;K6'LSnDR$Gih*sUWme>x1glxMX;}8+hq#Ji;`iS8kStu9Kg|B. 2bߩB1z#c⫍˲K?ߐEDŽĝGh4jaIlt}0F#bhM`R0)gӂ/xvk93;~ n sM6q#s!7sWɦ|9J'E1<eL2B˘uϘQ.oV*gZ*Xu5Q&Y5f_tŞc0AV}d=H`ꊣQdzyk1+$F4kPKAqt+PKE9@java/security/Principal.class;o>#>v&FIJDҢ̒Ĵ̼vFdNb^RVjr #[jaibN1#f#{zj_bn*#&֌ )@@|$#Wp~iQr[fP=1l @ t+ȍ ` Ls@<@PKe#PKE9@java/security/PrivateKey.class;o>#>v&FIJDҢ̒J̲ĒTJvFlNb^RVjr ;# bԢĜԢPOFF/F^ļĜT֡]cd /-JNuIedGX2h#3$; H22ټPK lPKE9@$java/security/PrivilegedAction.class;o>#v&FIJDҢ̒J̲̜.X`ehݎd&ǑPw| N<r%5Vq/ Ae4RquП`нK+Yx㡞.aЧAE e{ K^i LUmϰNms`0M?=ڃˠ7PKO1ثPKE9@-java/security/PrivilegedExceptionAction.classuOK @ }An .U q(SJ+z5CS@B+ :&40 I9˥NBD<Չc&xhB'tȏg9DŽ=|f{Ij">w`",`#+'$௪q`Ͻ/T%((?`JWx uih(o> i?PKSj5PKE9@$java/security/ProtectionDomain.classTn@=u IҖT@AlP+ *Q]MQʱSb+$|36Iq /u;#w`1l]+މ?P29TQ"DFḛh0;zfy!CdxVFg}4PpsC2IAⶏʚSA Qa('Cv u{`X"\IG3lr1zq) ޿Πzon؋PX-2%vQ r xJu0̟j i2?=ڣrn Y"ٿ f"Fndί*io~Ny=Kϡus{fmuXA9 X4qKX&\?]|nԫU2:(Sd !o/9qa 3YTfc"s w2&0W`nK3Ӭa>Mìa'-qgv{PKz~.PKE9@$java/security/Provider$Service.classS]OA=m"|)Dʧ/C4JRÃoeRfv/?xg-lM8sLpNyJXŊPM4 S^z*\0+=R|j K2пxcga"kס oˈI18E eB!Q0ᑒD9< W4Xwy+iV0OdgTDu(ѱEO^̶Q}C n.?-![YӰ'g ㅥ,JW 5izX ۯ (3 ^(LWܲ5[ 'x:cun2߻i,UٯIg~;rAhJ\(蟈:WP47ܞi`i#'݉ af;'^=Y) AӉe-3tfq=N]dlX9|p1LzxD^$yKW>wǶ /k8X^ktflulbPK&qPKE9@java/security/Provider.classVmS@ޤiKKW+"R(/h+f :S5&4 J(ǽKI{!}yvٽ7laDJ_H6U41 0ljT%֞`+MTv`XU<@$ 1He ib2U7Tڝsb~R5"Th)ڙbt*%닊gbW =ݱm 8#D#[9'7<1K5t L5նX%|)?_Uݫe^5%d Uh>|[8l^6/֦a{qX$S&Xl`"Ipt4JMbn8s\Alp@aS]O|%N'B'a,'`_Ӑn9^v'ZWunE]{}39(GFs棻0I##x}Eif MCT1t 4lETzȱb֩c]'f]Sz=KDJIG8W- uL0g&ip&A+$NoF~ ( % @{ 0q*MNB GM!=`)ʨޢ}g9a.#x9~EndEfw6ϖc[Ⱦ͞CSnȷn#Ydޱp&QQ^Xg ޷%n/{P9Z"`5M9͜f k^= =161h7Zo"TpJM\%'햺WZ }xٹ̯:FFQ(z4hm"bkjk6$RPKMKE PKE9@%java/security/ProviderException.classPMO@-*(xQn7B#R6Z?˓?viۙyzp}#qo*DŻWLy$Qf84Cr, +!S?2ح/`,r E_.H0(.WRӡ唡P?ڱiVϸ:K _PEO:$0*(QܥZ豠?:z$BPKE9@java/security/PublicKey.class;o>#>v&FIJDҢ̒JҤdJvFdNb^RVjr ;# bԢĜԢPOFF/F^ļĜT}I>`d /-JNuIed۪2h#3$; H22ټPK" PKE9@%java/security/SecureClassLoader.classR[kA=vimKU$Bd!}(dlwawSҧL1ȍ߾8<΅^*;De^[;4 bѕI.dB!w" սی,b9z"apy.cqJFwDx"a>ܲOخ3w H^*sZ+]Lp<}T53z<8>e;$MR1r[#@qXZ)`+>_L [>` 36>kZѿc:g yMXL.U8|WzT=،Pv2`ۏ~B`ءEscK:[Wv3M6V ߲u p6 \/6i=]ӗ a;S1LcOG '/8dt=sj]5כ4\1]2wD~PKPKE9@ java/security/SecureRandom.classn@g4&M4M┊$ V "EUQ/=*YڕD8 C!f׎8v"|7<#cbF;҅>VϾV!&c[-B !5/ҧv +y@;__1q5dm _!Ի^k oG==ei9F]I0vy" B,.X)#Caߦ5=а-u'*:5,:qkے{kHYAPG )$,IqUL*cb游S-mFXb.LMs=vL,TP>҃xѲ[S,;?Q Gלּ\U?dMwO>e d`DuܐMO0,˟ؠycalJPQ*l#1J+S `Nu!FuQ]3d457ExEPՔL%J/#_ڛIάG:R+LS"%3mB`tvB ֡?PK5hWPKE9@#java/security/SecureRandomSpi.class}PMK@}&Z$`⡂" Fzi uKd#IG'v̼y_p!p2((.seAh:VTEp-)6Z*2JUF) .VR9,6aC;Q*V'Y,ә.& ɿ띳;ސ\ wx;yXMNŌ׆ vN̈́djE;r(ު^P&Ӧ 4i ];KCԤQML+4%ٝ33¯?~9A@QhUla> F`Au5SpH[@ZkLc$P,Q|C hS:{wOO}-Kuu^c<%PS$ܡ1C{|H B&;57H}4N>:g=dÈugna & +rF EUaٜu1MɫٌK? U{pw䊦{N OADs?+%ǽoTMy܋pu?rt 5rz:`7b>&:JPfX[65K\2+R(gYj٢HKvtp"p◁$!9JpD7sYv?c"Rx /{*T8 +!t.TKqPH^k)Nֻh%WȻb1AbIi$ʜK;R0o ٥gxMn:ʸi3eqF'o-ޝS7Gt9U6U*u#rk ZhT! v83뗝oPK4uPKE9@java/security/Signature.class[SFNBB27;mJI1L<$lƖ<))Sgٕ,dKkËvwlA%1S_iQݱ})َES 0+9,7DY}S"@TyhٚaWCG角ZROԽ7@R8V>U*wwW&0Y׌Zl[̨+h+oV0ab·AKNZ'YIESb|m& "0S"mry#5jk&*]4WQRwPJYFT }ifx-Z2ˎ~; xa&SH`9ڑeYZc[pr'9Lf,TZzZk8>v233>q؄@H,<eK0~we?4 N쩀ͻ!-a.c} \EǗaKR؎o>" ||!WWEkN0[ґݒ7!!\**iWKv󙊳8Z8w! Ґפ!Eȇu)>\!`G!*V@0aN?qȀ2*L|go\w'bPK< PKE9@&java/security/SignatureException.classPN1=PDQ.хA37D7Cؗc g2qQ΄hhs=Sp|ƽ-ϗD@<2RE QB C?X¹T2`uG n?%^F@*q<q((kilwrʰ?]IQ!WϏT=/2tp~Lw:z2NB'g)aYDJ7"@s\((3^pPX6(SMʆ(;uKnl I&$LO}h:ӇN7'B ɞ=I?G HfifLMn2E^ըehpd#bFjSAjTu@c0w7K`k:"IJbqPة]/33-ZY{Nٺ2X$5]dT۱TfX\ LXĜ8U C7-Vi UQ{fQ֙LIC2V͆aTfmuV uknQ!/vScǵUCnvtB2wf&R}dl#KyIksۑI ŐeN!8i/vF œ'?L(<,F"8O@}ѐ`s4u-ֱ`YXH VaOuS:$}RBS"!!$L] 6<6"GƗ ~$a=A+(sy[jBB=2@s;q{(VPK?2PKE9@ java/security/SignedObject.classRn@=<܆@IS X!Ri3S6Kob+$|~qb^93_vP>!y\{ibt8<̰^24tzJn/|h 3iK9E~1;Wo8Dup?pEsP{|؞+ L|pʰyQe)h 3MX ]g$j(a UK[gCOz^[Gs,'cX/*sOOZ^%6=lL_ZCu65O<%WV\޵8أ)tT9~E_#>jv%vx~ \CiG z?ZUA<(^CװH#NFA*Vh& ĻX ڸA7:n o6͑#Z#¾tn=AS]2iUZksJ]ܻ4}<ʟ"6x9Xe#A'(䎖* PK%PKE9@java/security/Signer.class}Sn1}d!m)-Mڔ("D H*RnQ⍼ND NH> 14Iك=oG86hf2e/hi"UCOjJie_]BxdKʄhp&ͩ8KF;E+rb3*2EZj#GB'͎5J'-_o,39pڋPzʻoZ,&UGyIh'焽ViO +Y8a\^ɤD(Ci8mGe|u ktґ{a9?.rhdvz2])7ZVs\?KN+ н^GjLnOA eY2+yϫ<G K5O Ekk H14ro`GQ2 e]|}W0d.'CfkFk]s%Z!զpհU1"-Ld-*mpA7R}=N)Sj( U]ZDA :&ѿ:r`Qd8רLR-mແlGhܒ} zɢMҧȾ%m*;Q< ȣ[%Q&CgtFX=t+nfλџʯʪPK/Y3UPKE9@ java/security/URIParameter.classQJ@=h/Iŗ o۸+q_GT_fv939y{yB݁Űx CgK0U%C]"0颀)F.R+9G/i̙ ߟ&; S鰞0"G͟X,Jt d2,2C<PARpab ,ߵ*Hq]3ܧ .Q LLqv@@U {MF8 aiCiS\@e@PK\mPKE9@/java/security/UnrecoverableEntryException.classO=O0X?eB/"j6!8J3`8aϋ[T| }mzI|µu͝3$^sİ59W85Z-Qq}d~L(u&.uC+.2QFQ a{KnQ \@JhkM5۬uOPKoۚPKE9@-java/security/UnrecoverableKeyException.classO=O0'։"bqPKkP PKE9@(java/security/UnresolvedPermission.classRMo@}넸 !Il-Kd $[9vH7q~? 1^[wg͛7~CưuƧ{E9Sq^csu CC/##*/+W dž2ЗW$rbem}:'iP#w*(z :j (qɒ8?[͝#NMH ;QOJW$cl7ܡ w(g{qZ. 3T"|m1RrMr]Of(mz]IQXdc[`dot9>w Ú{if4uߛx#u$bc$L5ֱ@"yhw4܈|[I8KX+Q'Fd5*)ʄ;J_3 ЊK:XOja[FSըhRvf+;s̻4۹{\&+}@yPKGZPKIG@java/security/acl/PKPKE9@java/security/acl/Acl.classRMO@Et ('/p x"@$m]6nv<Qi4v޾7f>> b}6d/xٌ; w( d#z n(l(, Z/JhvR'rZc酑V~ r10S>E~3ѕS& -+}?B.ײ0SF&@?RuBDG3WО0MbܤG:P=$0󇞪G[mnm2s{ pԟLRo1;Wh.n,\U%T`l೉0,XDdv m2d$X~ ?.,t8/(q:PKܾj=PKE9@ java/security/acl/AclEntry.class}RN1Eqx . 'qg0&( w4ctH!\~Ne1hNz{ӏϷw32Z:,.dpdOY`@սKq4zGHq:@)~w5y&Pa/nfeYR@w BnZ(&fT8MY&G$y!bwaqe4 T<8PXc_%`h756 `yp'h~hloq-1Qb$w4Y05¹{0L'{ PtX}8fbVjx/Gpx 'B/PK!OwQPKE9@,java/security/acl/AclNotFoundException.classNNA}(*Jnb11F ~Y6f5Ǟϲ2(j,I̛y3y+fh[҄7!wN}ʭ^~ƻ aV[L%4 BrW:G.ZH 8=˥Մ~ᕴ Y1[¸85!TzbF`o8cLD.>~禁1?$zPK.8oDPKE9@java/security/acl/Group.classuPN1=0⊐¸S7Mر+冔t:Ӓk.?xgEn:ǵDK`;J2)ظW8 kiV (q7v@OV/)LtBk˓ROS>tqܮ)CqgŎNy83׾켣@$ ma gFPKmQAcPKE9@*java/security/acl/LastOwnerException.classNNA} jcMl%4F es)~GVCcLf̛D?Ap(_(oB\dWFgo " 2^xbSBlE;Z X=-:ׄAV(35F?vmQ9g>\0B~f"pu;7 qqp= ݠPKNJ2>PKE9@)java/security/acl/NotOwnerException.classNJA}\$`/AP l4#͢+l|VGI`x3o>\(C0xoR, K!U).ܿ[GJlЏRG 7ƚ0$4Χu&:h!%t czi g& d9|;L“YN&WyL}{ u'a̘ȁ7 ip=QPK9ũI;PKE9@java/security/acl/Owner.classu1݉Oeck`V E"aFffPb "`s9܏\3:{vH*- geBLbae >@^˿NJv0Xj[$EyjgPٰ\Ud^ ?x{y=_Oa'|gxχB SriTٽԞNu}4PKuPKE9@"java/security/acl/Permission.class] 0:蠛.\; b%%6Pb}px֘$ˆ_8sRtV+B'2m!a64ok;6RxB,׎ȷmY7 q>$d鬐%a\7&#O=!GPK}PKIG@java/security/cert/PKPKE9@java/security/cert/CRL.classmQMO@}[Z |TK1oS ޖ"dYd2ζ$&N2og̛'Kt\X ޜ25ԉ?$kleM^h2jgMl2PK0F8PKE9@%java/security/cert/CRLException.classPN@=S (Sw Q7 !:1%CYL\~δ! :s=3_αpgܙ /V2zu<"{^xb0f8 Pː2 DlE@OC| zp%uh, Msz+<9H`1g\j[ ¤?V62:=+ B/'n~Ry 'cSEC1OCQζ߱FŜVE(oS䝔|AZGr#d]kvfQNe2u#sdtU!WcU7PK,SBPKE9@$java/security/cert/CRLSelector.class;o>#^v&FIJDҢ̒JԢ} Ԝ"vFļt},8;#0B9'?/51)'5fdAf M,I`dnf#Wp~iQr[&D$4fd`bV?cg` ( gPKQPKE9@-java/security/cert/CertPath$CertPathRep.classQMK@}Fk~~TlEzx(AŊOtiWҤlҢ*= (q* aggy;3`%  s'^O񄊝s΅Z0&4A9k/e( P7|ݗfW]=V2hU+W f-l0jÂ0TNyWiujM+N$͸-#Tj'P2ׇ J慈BOT;D7aYgX!eOaOyX&͏ N ($°XZ }v9LE5'56<`BҨX,ů'?xvJk}s{;?}vmOtc "m.\OEmqz+͉ K`%2o364C"-}Yv}%o@=jO^D:5jGV+G K܇s9޻w~ N0WBs,iT5asZqVQ-7NF}-4a4U46ְ̑$%oږ4CVD Nե!.~[X-Cnj\T2jaoj=)ᒅxg E%yg*bmg}a kX,g1ttjb`KQ`8^#kk2>, > s0$JP6)©̀]\CY/3̯ ttDUd[a?Hvf&t u'm)uby61Xx/;P=U0<=Go QzdH{}C*7$G^`%!-CB6$rtrDGѕyN*.¾hd]5"qiǃq'@#y<%̹HG$/(J!S)؛S{,ꔦsrZVXȖq{YF%ŀ^2ePKQPKE9@1java/security/cert/CertPathBuilderException.classPN@=S ((/ݘ F ƅDca? Zrew @}9瞙ϯb8SL)8PӦpe$PWϮx ea3&_(u~eȝK_ ~nCQ@Edc(u/nP=>Cs%u p,' m11J1Xeh.*xҦfB'g!a,tHZmHӱ ?cSEF1OCQ6߰JŜVB(R䵄|FJ#W JX7;Hdډ25#dtU&W=W|PKMPKE9@.java/security/cert/CertPathBuilderResult.class;o>#^v&FIJDҢ̒JԢ}g XTZZ\S V ecdF:&&22&، ">ڬSK`12aw P=Wp~iQr[&l)Nt#3}t3; \@ qPKIKJPKE9@+java/security/cert/CertPathBuilderSpi.classQ]KA=WW"-hW#()$qĺ+R?~@?*A9νs=3w?^"G{Ps'F'gc@OELppط=#䛭D#.! (]M2WÀ n`Nc':&wLPp,KSFMٲۭ% 8N+GgVGaN8*У`I>.l2[GJSi~Qم N-JI$p3)PKE9@+java/security/cert/CertPathParameters.class;o>#nv&FլIJDҢ̒JԢ}g XXZZT V\ uKMLIed`MD44}еY32p%eԊcڧ4Ye:bL \PKnYPKE9@*java/security/cert/CertPathValidator.classS]OA=SZZJZJ) G`1Ԅ 2K.NWd?e3lsg={Ο~8^1+㕎VKHU9)Woۗ\28ÜlsYrq%,0vlQEաSK!sC_Wvr!~^4&0Ai>َ8^_y/ڂ!Ws-npiW-ð*g(Gnƃb(kˋ84Ȑi t ӺfȗaQ3Q|ݶ:(X{S .jO,ql$ĝ J j!Y$2l/̣GAKzbX. .4p$wprɯ3ѡ G));P-^4}BvhnWZⳭ_ea$K̓g >I$iӚ2bv #f1g d#摧Y,SҪbof<ϻn"E)Uzv7VjES'$~bufC33_ cq*2Hjx/̨/b5&կ"Ѩ4HLq-B%ʼ$}Bd\[B erW%Ñ(n/,:!E53K,a3Z%ÖTǶ٥ {3<nF:dǚp۫潬9O؞dO !ԛc/97PXIm^:֑|z;xd*pr$XI*ewE>27?םy#x͖zpc~dK{࡫r,ڬ&(:U5[1:Ũ_eʹ5yU?PKL|PKE9@0java/security/cert/CertPathValidatorResult.class;o>#nv&FIJDҢ̒JԢ}g XX_Z\S V ecdF:&&22&، ">ڬKS2AjepXY.gbL \PKPKE9@-java/security/cert/CertPathValidatorSpi.classQ]KQ=[fjE=Amj!d~]ݻR?~@?*DBg̜33|}|ġdʋOzm PfڅCe@#q0aW:o4 <6(HvttY &;2:AǎuLhvEp8ڋ0U֪dW5e&n7I`e30vQ'\U߇Tr"elKtEN;oAiEr/'?9+'N߱K,-/A6WPH-c#,~<PKNb5SPKE9@%java/security/cert/CertSelector.class;o>#^v&FIJDҢ̒JԢ}g \_ Vgg`cdF:&&22&، ">ڬҹ% >8lLLN,I֌bd /-JNu,.=n##&C8@d02pxPKk^PKE9@"java/security/cert/CertStore.classV[OA RʥP@l)%4HXeY2d%m#JL|gfҲ.>9;߹L6DaBo7pwb͵DaX!Lݪ?\pepwJ7J!N:ªES~]Jcx>) zR/Osaby;Bʾ2l׈%5tga>H0Vؔ  l[ ݻd UaE&MvJPwY,ۦ "ԇoB-inX~MT-ݭ;K?fflv)(R@7 Yę0t)D6t61Օxۖ!*=?{t}EiG ܞUsu Зck2z;dj8}gVm/lC*R׾ՍSˁ4~3bx̜g|K"f{f ܇WI#9Iiv1G!_ȡ&ݚt<艅$I雠ob'~&Z /=aH$ư'y(TƑL`49 =X&wbYڌd W:r+Asd yO64gdaK~> ߉cBqH~DS%_Jܾbe2ދH(i?2e$ Cygp;( "12P=>C#nv&FIJDҢ̒JԢ}g \_XZZT V\ uKMLIed`MD44}еY32p%eJ`P h:#3]t; $PKl]ɕPKE9@%java/security/cert/CertStoreSpi.classSMK@}ۦA F<)AT6uKvSgy<Q$`4ɛy3fW(H1ͭ"% 2WJ҄0$<[4C@R2lm8J\rśB ղKU' aܳ}ysC_/QoDiȠވ+92Q&a =W4l1t۔j "B+u[q\Ce: U8J"ms v-dؕH!ۂͫ䪋AJX6PA/ٜ>c 2'30#ܳ5Ke,K2nZ7q|v 3p_PK~PKE9@$java/security/cert/Certificate.classS]OA=S [  (_RE"b0&`BlXۡmjUd?e<-aνs{xe &r&;j)k}m(qTq[>UΔHQY%k(7[lڭWUI X*jWDL3EϖNY~?%Z]>XHTpR%0򞱃ojs[;dT d=nWmT]lA OM)}՘h;OI1W6** lŽRۮsjzc&~:!(k ھBe6ً|J\m4vϧ7 BPdk{CRѡ*VKq^vn?О&G u&HлG5mv|? yLrB wӘ}4qiy~mWLľQ6b'+{v+}n gXf]-<'ӹ;\OW I^{ ?PK=CPKE9@5java/security/cert/CertificateEncodingException.classPN1=PDQ^w/B ΘRP?˕ ?2vFczι}{yp,܍| O C6CV2Wf-C+g ўT^c)Ћ7+X]W}U/PK-bFPKE9@4java/security/cert/CertificateExpiredException.classP=O0AnbNR]r.y(4J0iܡ1z5^Q7U[-<7j` @(=4옾QvgDGokDY[IrDF a1DRFVFh-J26,daHZHۻ"daS$QhSrw::BǹZ:GOY{GF)JDr_{bsbo<і޾';IdT1^/PC+XI2@քdQڬ1aekd#IjʦfO mc9ԭ M >Ts6@ნPKO&/^ PKE9@.java/security/cert/CertificateFactorySpi.classT[oA>[ UkZ-iLHM6@a;idm_铉.]a̹|߹e~^~b]f˞n2!37dujJG@?.) $@X:#՜s8a nUSڲ1uFWRKlm>n#f3Z }vǕM)"q#cwB`3sx1]-X 16mJW`GVwrىvB74UIB# 4FH&RI&*P|@})37 p 1HpEw@=wa 5i_F*ø<,9XX[bʃ|z|Yy~aaȷД6TkeO1ڷS'@OOYsyun\De•n4ȄPKOqPKE9@8java/security/cert/CertificateNotYetValidException.classO=O0U!|u_dLʜ34z)?*f2B-40qy?O3I ke[`8IaW2*6K۔!RY?< <a?Ϲ?LIBiCAˀkqT@+XZUPK5kEPKE9@6java/security/cert/CollectionCertStoreParameters.classN@ϔ(ʟ_ XV†č`uCJkƩo+>e-EΝ{wO}{yp, sN8rVw]h{JW+>Z,L^: HEa75K`ȴ'u!ػb0;#c(g'%﹂dwa>>4$ڑw8f7F]nL|ue:P4c#YoGR&C-~xeH;س/ }ZV'?Fs]?P8_o0`IdREk2"F6 f2h-XDbؼDH[ tj!Aj#TaIY؝Uc֌Oku}Z[PK$lDPKn6MׇmPKE9@0java/security/cert/LDAPCertStoreParameters.classMK@M?Uk7zVĨ7QH۸Ԕ6u[?yГ'i!;33|{p-^ tգLYVM.y_(!tJǽy G2&$80d\U jŐw"1P\O\m!oy'-nPG/%}ӟ2,Wm%]sN104H`k0dTj͊_YT$/Pm 9fc9HG\S:@쀼ЏRs*"{E H,@g~$<'ip9 laOG6p)6ˡH0adehDR{6`5Nbd%\=WɍPKB~׈nPKE9@.java/security/cert/PKIXBuilderParameters.classQ]oA=[ER5VI!ٖ:]&efIOd?e;(%V.=s;xj#PǼ1n4\t{:~_.W|(P#CmВԇ zg~"&hv2h)8.!=KW\h°??ܗ#R gfc6n0lg[/V K(3'#-#qS@|Bs_q%:y'{YfI3c6]k8n /uG#E+ZY *z1'xVB]cw]iXvQ脑r;ne~:j B?%MU"J<WBY(GS֩*0C1&Dkw Ӗ]QYqoN>䥂1<6X㙩I39ÆN~FzdyU3X6g?6bO ~PKC(PKE9@2java/security/cert/PKIXCertPathBuilderResult.classRMO1}(-~Q1Q#!D 1z*K#5+.'qv=.^ڙfzPD.aQtE#-W++XRB03WMeǵMQE]ت)!PBX9!KU[Vܧ5Ѱ%!Sv,aׅV^?C=Yu] hQ"acD<{4?EU&oW[ByYضIG$G O;DϘ5 `Ӽ1,2>`F^4vE,0V>{q;VlPKuPKE9@,java/security/cert/PKIXCertPathChecker.classR]kA=n6F~Wm+TRQ|,-k-d2&Sם0;_?%3ćݹι~ͯ?~x!* .'RF/Fg^8v Mas37 )lCg:Iڡʕ=bktXds@[ i+Qr:(TJ6CU8WVGUY,~ۮC+ OoPr;i9jceʼpm0,Dti̬K:Z箂-Uh󙛞:& i.'pcƢ<(*=2dtVG4<9CƈXX"2ibG쓱l}\K2yFJۄ>I<!]ٻPKS^PKE9@4java/security/cert/PKIXCertPathValidatorResult.classR]KA=gaidiAAh&%4nCNl0 z zek0w{ιs;#0D`V&`gIOp 9r]pd(0󀓡IaGeX+.jA:zWjlљ!(!Ggevy+E0 J#P˂xdg۹G>P eDаo3_L! ˻J~׻<{?npSV0Q!C_84ȧ1\MC`]є7-.A;U?>,q{)VHc9GUϿРcs>AjoNLB5us&FWنkC)(PjNkTrTԈVXlWR)vC=4oJE&&XVj6lvc JxFPUc'1fYԒ:ʡ94=\t3A;tS94pqZGֺ4:ZXЯԬU%w!VlƭcO ΧX-t.:v9[uSV*R墀lb -46HL|vtKfg_铉trj pC@7iTOsUwe')^I7ΌhqRL6^WsX'# O vZF9~X٩zFvP7z6a+i=Wצ>,gTF0|cU{ǴCu>Z ٸj `|\E`וu?A 9K,ZЦ8{wEdg$\e%WbZKL)vjր ::ת'ױµ>6D4g3sE\ܸLik 2c_8x{}G`Cb-x[dc)doqD0sI co;lj&z%}a6í73#o.Ƙ#-B;-30Tq+SX{@$,;+IOOy*W{PN{*׸)e^ .iN?mZ,ŒG(1xOQroÉ-}넆y_3|>o'le^2- Jâ/G#{<>PK< PKE9@)java/security/cert/X509CertSelector.classWYWF2Bb0H aM$R7К Y1aŚԇ??wF-#Fʃ~`BQDS+eݼZٌZI!jJ?8vh`wB%hЋ)AR MlIUcw{1lDɬ%xy~TW3z9 ԟ[U6RCf♃~Hq:Dʙe $ U0rQ1U5JE3Ywb(Vd=|5›kB'|)iDvO).n\}+5jh]W|ܟ| m:@:U?dG 23$$$d"PE_( .s8𴅸[Z^qT8Uܣ:SLOLFWQ>Jӑ+Uʪ&wX +?k-w ﭳAǟNq\L #\Lf O 0'<)99vݛc˱Ǹ8$g\U9GWs˰RӪa*@' }toi.rGw\FpY.Ǧ"|<B"mw& vkBažͱ9ҟpP4J2"%O(ދ(^xRdQ8`-~{鞓AIQlt#;ojqOW<mOW=)~)J 'p*'ŏ'YDI 5HHo!)pi X$7Ǝ%ݷ 9y+sE2 l fR<3pa1aRJ,iE((=)m[EٓPKERPKE9@(java/security/cert/X509Certificate.classTRA HFD`EE"I*e*RHyy62,J,{fbvO=_o""pJϩ0ݵtf V?1ש`ïgX{ ,-nqC` UAb&EbR斱-En[;b=2b]f\1,NC`ؿm# ӿTɫE ٙBLXY5cJu 2#0w njyYy`"K aSn GWUV}.jHN"wvmdRPK] 3XSq\fYV=&e* [(ә5 i%AwXϨſI>"0bA>b I]q5Mki/519s1%ˎ8e;lzTb,7 `Jgn욆dĥk${o"P[-][go[|xx s!!_i+#RWq1p8ǔ->ʖM (bvyF.WY+h!#w%wˍs0kt7|K {>+W#DJIix/WaMI y/7੒ϤDjg-^]{"mau$Z2D_+PKu:LDPKE9@&java/security/cert/X509Extension.classuJ1ϭc_Bf6.?] *0L$Ҿ ̢bY|p?>AwJ4z-ua#4 ݚ2e'_GKaf$dP&͔ڙέ)w杶y==~&w;^d .wK{oe EX'B'+FSa"04eXGXaFU_s5QO6PK\PKIG@java/security/interfaces/PKPKE9@%java/security/interfaces/DSAKey.class;o>#Nv&FIJDҢ̒J̼Ԣb}`GJvFļt}FԒĢbF5 M|@Y32p%e22pC,dcd`d`fF} l ;dbPK=PKE9@2java/security/interfaces/DSAKeyPairGenerator.class @I4M%" ,ָʅSfPbb'N~3` FM`Ӆܜp2qɊ^bM&6GB1GFJI@԰2!uRo_iJs x.eXuT󛰀DUhPK̩PKE9@(java/security/interfaces/DSAParams.class;o>#nv&FIJDҢ̒J̼Ԣb}`ǀĢbvFļt}FwF MdnbISf'Ќ"k_Zꖙ7^21le H21pPKR-(PKE9@,java/security/interfaces/DSAPrivateKey.class}KNAA|•+n-+hLm1)Ʊ'!L*XJ6 tK6A۸2EOI0սK2Ur3/$)6 u_Op_EJ -3a4$-awP4_ K|Աgw5|\|ОBqkѥ HDָoIS.WPKgR5PKE9@+java/security/interfaces/DSAPublicKey.class}JA]W_FBXl dYL "^តsl3UdAj0>mΚ+ӾR7c Y!G#FV hk7蒰qQOKET u~Qj$)7`xhǿ LXB.r5IuĖL?PK2PKE9@$java/security/interfaces/ECKey.class;o>#Nv&FIJDҢ̒J̼Ԣb}WgJvFļt}FԒĢbF5 MTS R R֌ \Eɩn9@|=F6FFf`Zb1I&PK*r|PKE9@+java/security/interfaces/ECPrivateKey.class}KJA$Ndq#`6P=\ ÅPb9qU'R$l䍷qa8`.[oZ)VZ+c)yLB X {U r5l"ld ]qH|x{ BTMZ gsf n|.p_L AfX@$:HĖV[PK2PKE9@*java/security/interfaces/ECPublicKey.class}PNAi6^bk&^6ef 6qj~2|o>ܡ"!\ReuM\eEoJsQ9F?*E]Ze6gS{:r(;eL&Z…\*[rw?jUxoÂq!Ƹ(恱,"{In0M A t8FCꉼ%A$aOіIPKb6}5PKE9@%java/security/interfaces/RSAKey.class;o>#Nv&FIJDҢ̒J̼Ԣb`GJvFļt}FҜbF MĒ }tO1E@uEɩn9 3@j@h+$8PKI \PKE9@9java/security/interfaces/RSAMultiPrimePrivateCrtKey.class}Q=OAE񀈂Vv K+EMP jK=Gw' dsHogj@ɐO4SW*#{vF!=n NXfPJ|008OΊG%z#v͠XUd2=Ę=>}44I!Q{j37fKA|ԧN72VEEljq*a?ˍs2B7+ {x]2XR9<.phPkbe7-n%H۩PK^=PKE9@/java/security/interfaces/RSAPrivateCrtKey.classJ@ETbU nŅF`jixSIL,wpė 3<}w/qPL)Qv*mɄ2ԽFͤ%+;XhXȽ)j{8؞Q2IUzgR%:Rۡ3>>OYN C(V`{{]MwOU㸈ѷ&t0M4?v}bxKm6U 4IfP1 t~rX %W@[[Ey{k%KJKndfPKYPKE9@,java/security/interfaces/RSAPrivateKey.class}P;/QΰZ[QMe"1f{gc Q(~c3O_5\ [1G ]pQIsIhEO҉jb{Vz`:6P.엕T?@AR6E}R%_Njޭ}PKevCPKE9@+java/security/interfaces/RSAPublicKey.class}P;N1}/**$hDK/R DDzGƋloD.((8E aiBC5+}C=*Mce}p Gu;Κs%S}.C6)a/d i`s7K]ōyDh~5NJ>6vv/j{ԑ-Sp8 4{e wcNGA 24K4.ʃ2,$ Ve PK° ?PKIG@java/security/spec/PKPKE9@/java/security/spec/AlgorithmParameterSpec.class;o>#vv&FͬIJDҢ̒Jd}ǜ| /#7 (17$(( V\_Zꖙ ]H##302I&6PK6QmqPKE9@)java/security/spec/DSAParameterSpec.classQN@=S DA^kcϘT`u,CxW2qQۖ@j{=sι3'*4( ]>#̑-y~ެ7v *C]ab ;v9 7hX`(!M2رHd>w;)v?lŠ E,%2C)CoC 0s|>d(_'8? J` X*'E#{Ds8Mq)gx G4őH J#F@i@d"GNubWQDz*dp:eXÙu,:7iPKaqjPKE9@*java/security/spec/DSAPrivateKeySpec.classQMKQ=OGLDzZє3>( ÂV1>1Q_*hGEw>Bsϙ;*VU;|0tIiwť7HQ0d}gۖ~Ud(EC@=dx(ݶ~, pjW+M(Rc& ixٓ3հ-ouC蛼PTܶ0lD#0h T#{ΰX#G=R1ř:Ͷ.)}Hajd`sTXYg9rXXgb 5%[?ƞl4@w0A\ E&K$e[PKd6PKE9@)java/security/spec/DSAPublicKeySpec.classQJPۦjkC.DVhuW|A+J%%M%M +] .?J#Nv&FIJDҢ̒Jd}WgԜvF|Nb^RVjr #Ozj XApfU*#'#Wp~iQr[fPjH3#P0 de`؁$PKJHo{PKE9@#java/security/spec/ECFieldF2m.classKO@RE߸+Xug4.$4GԸq5aJ1BW&.(㝁ܙ;|s:H1,nێdhkURxo 0%iN,B#Cv_2>`XNJ%l@!mv&q"uO0LB{W'(3PE~Tt)-D[{߹ %j +,PѳNcݵJz@P OI'2!n2W V5o,u܎IWFjM2$vL0 z<ʗq_OIBў8@x9LEC77>te]"uxHdd8,c:NF|q7u|I`k>r\+ ("͙ƬNx.=ev]QۊVyQPKK6<5PKE9@+java/security/spec/ECGenParameterSpec.classMO@)* "=1x3CK&Kݔ% Bғ?8-$Faggw9Z,X̅7L+M'2nw2yZH球"F" XƁMp0e5AJ"Xhw@(v'YF[8 ,\U"{x(FP@DU)Ln }V>CpBiz\Mhu~:ӁUӭUiփ|Js .[Ko(m6=m. PE os8XbNrEv PKDg-PKE9@(java/security/spec/ECParameterSpec.classR]OA=ӯRT5ED7j4@^e;dK&'?xga܏s3?~-9K9nV_~=2vPKpsIqPhd߅AU%7*RY%(!53a"zt*hEVDTF38=VzDz|;ex"u, l#&RN63¾XjOmp4% Z3/u{SgB?kU"2f֯>'.a^|O}X6KW?ȧ)\uA3'9{ITD#Ŵ/џB93IϰX-hepFڍ#®Vz QB;#9g4sBaį_p=a\Ծ}(wmt/8s8Wyt"H ·卝T+l]nb˺ҁ`'Ȭd1$G~bzyBOٺ=WZeыJPKsjPKE9@)java/security/spec/ECPrivateKeySpec.classQMO@} "^4~ ب R7e ,$+=xRb:73ۏϷw'0c1)'I8e^1FL0r=׺kwM$*PŐ< gU;Xҽp͹}]<4XD!^-=q;귅z`Z\I?ACwan?V}C)ziagRFUk 5Crĕ,nq諰z(e$_~K KX9% V bHA}Q k1!r_`\ ! L>ɃcnYjٜ%^nKIoF:c]r8g>1`< H 21 +<4(; S>OG!, 4#üAP*B+XL*TPK:!PKE9@'java/security/spec/EncodedKeySpec.classQMO@}S 7c7񀑋0\8-eK5ۅ'qZ7o~|8þКε2K?yHnǩPhSDApGsE(]H+Bt}}ͪ. XAPRHgCp* Ŵ/JͣJ`BS5ܱ49 ^;ʌuc=v=U4f u(*9$- |wƶ9{} 6ؖd"E[sgg9w/fQYUWI۬ v3t PKE5PKE9@0java/security/spec/InvalidKeySpecException.classPN@=S ((/]ЍAb37D)a? - g2qQ;h ]W9p<,qg"ܙ3޼zb0f8Pwː2 ֋"P@-#X]W=W|PKF~LPKE9@6java/security/spec/InvalidParameterSpecException.classJ@MDcڪw=H`JoR"*B!6]J)M$x|(q6 {f7#}8 ^0Iy HkUTn ay񘈥2|qSyS9ch ' y6ZX I%nT;>MC/Nn9(cAM\hj록!B'RN88@'>2:OUHHG/Xy^cb6ZxOH ޭ l.6[ PKG^6PKE9@ java/security/spec/KeySpec.class;o>#vv&FIJDҢ̒Jd}` IKOJM.ad /-JNuIed*ccd`d`fFV PK$TcrPKE9@*java/security/spec/MGF1ParameterSpec.classQN@=+U 1`^јR7eIS?2n̞3gfo/E1k;^ JػVt]pk"̐Lwe%,/Ccw)j0kgJ?="/ol ˑ2:iuohLQĔ20{gF!Qqo7{ vkq] 9dկk+;~G3qwCSޱE|!-_u%N:Qla֦UKk81DbRT!T{BLa,HLi,&q*P$R @S >cK"L'`VO9=ÂCɬ阪IaÒ?PK'/PKE9@,java/security/spec/PKCS8EncodedKeySpec.classPJ@}jڋ"F<{i!KOt+iR6i'Gvf߼7og%\E,pU a?Ot*C f$7h֭JT~Guƽ`wz5XM~X4HhUu̟UF;B_qPd>HLӭLbD^kD,wtC9Pm,ϋ&A<| > 8ڌSz[;fhaQ@=4?>sahTڃ?DPK+jPKE9@)java/security/spec/PSSParameterSpec.classRn@=\ir)m)8RE dӼoܕ ǩ?>Bצ=;g眳߾؁i`u"NEs,I{6Pb C8 *Cw"@Hވ8x?;m{j=Blt ٗc9B  dГAG|I#W](On"5F K@Wc"xB 1V0PCu2K-ˊ^[#}ƒI=(O3al9/7w,#ЖC/YU'ʗA[IPtFmͥ6=Ǒ%6x~rF<\1rϼU~9ȢF\Kh/8FXWTiy)qg5Hˬ$2c2ً .~['&k΍Flիg4嵬JnE=s%2-ܙff>N1WS30RwuvPK PKE9@/java/security/spec/RSAKeyGenParameterSpec.classQn@=8ך^iz ("U7ʱ+gSQV< HQ;32aѕ'*O L"II!x'c G:nc-P9jPh48;*ʨXo1@B[q4q~z Yʵ'Dpњݻ٭zIGCG_\.GGlv K:rz:(D[lnr+S)*ÆX_ $k*}Y xX}^$ #P([BX̘~g?Zr3.]dEl'#<k1mJԂ1:Q#<4nk3;.PKVpPKE9@7java/security/spec/RSAMultiPrimePrivateCrtKeySpec.class͒n@M8 ҿ4-E$a'!AR)Aݰr$ؕ332Bb< zƕMË9ܹgx?~2sŸDRữ;O^LJ#9@om@Dfv^ب(a2r(SmlKd;V{}/<)f@ d;5<;=Y4ed]#7CWE ő/EZ@q{g€Ok[j{Q%PG̈́R'Dx.ϱ~ߎsb ĿFr#WKM/(|f q2=ӂ8p0zSF<ӌE% iyU\HbOЧ2-Led"\ĥ:)άXWR8Ϋ)Us-s꼖¹ju/PKV7PKE9@*java/security/spec/RSAOtherPrimeInfo.classPMKA~Fw{camy5an讌ԿSСЏ=z>zP^pRg{6}߹l!wRLxq YnFS s uЬ8jh_AW|e?ӣ.yQla"#|~;|p{cΐww])~54PMT'• }2rR5 Op>\9K"ziN_͐skl$>A8u7 f W*"HQ a4ꒀmhd5n"GUDWyP\YSY÷}KtCiei@iQ2 PKc+XPKE9@-java/security/spec/RSAPrivateCrtKeySpec.class͑]OAS."ߥPIHư|\`LА.CK /(™%1f5{19g̙ CX _ z߈S#q⢃,aXIȿT7uy ; ![ D#+"kuA-^+3'^$uB zGgЋ6 klxcö ;6ڰG'Bq~.})E(W_y* XH5 c/܌vWbB"_HO*I`į?)<g_[KΘ8Z̢멕`O22fF 2e 1 3 C LܧJ<+o6ɜhwIOS8)DR Bs9|YIt>7ًPKOPKE9@*java/security/spec/RSAPrivateKeySpec.classQN@=ë(Xѕ&cŘ(X~(2LL\~t5a1w|}|8Ŗ ސO9vH53'caO@Nb!DC+]9Co(lO\ 3Iu`Vq50/s)ሠ6 EdRCֈ%=qz"x=W0os S9aطy]S3' EG;!7rtW/c"s[\h),^J+O_.S׎ 2XZ ՝eT=PE- <=2WZ5N+$F^YKun]PK?LzPKE9@)java/security/spec/RSAPublicKeySpec.classQJ@=WVJ1"hQ+O!&%W\~xX];߯oѐa8ק |t",wżGC%:ܵ's$,bO\ JuɠH7j_KU~'mr]o b %l+ˆtc06MG0 N20rph,qg?eJ'P pnɫyxpy{^[V5g8 &}y=a*u݈G(~&uMlP݋(D*j'E u4cZC.QZ)f4z%Tv5PK [LvPKE9@+java/security/spec/X509EncodedKeySpec.classPMK@}h= "C^,^"Ei.q%Md)_IG?.̼yon aQ̅ ,II:ȅϭ*2}be. θ*W7*lBsby&R߉I$ $HhebTJks #X>J3HLC7Z!~@Toǣ|m+ޟcc}@X})FZXS*`p&[[r',zN.= PKCBPKIG@ java/sql/PKPKE9@java/sql/Array.classN0ſd0P!/\MPed:#C K79=mN/8CR N5]eBfSz1+j㉀rg#n O,,ø40@YmtT@Ui' u&疭uHOe t(]<\7YbprL=B.my͓J>Rr[?aecѤ6bW&9݅@mn0;u73[ㅽm}y1>lV ?&Wÿb8q&;D\cd Rs*e RPHb# ;npt PK(s\b&PKE9@#java/sql/BatchUpdateException.classS]o0=Nʠcmڭl0j0DR:Þ.jJ2t ~? qATdd~9>a1>s=4dD/4à '%㷣dPpۇ <*( (1TG~Y|<q<FDE˱ư5t'=K"vqřP\DX=6ye&fQYW{|K-`hK=@S瑩d9nRՌM|uN"m-E4^14=Kl7(F}F]b׾QbB}IMޡb`EPIQo{5+.0`UjoSfl *[hkFDP,ep%WYRa^SjJc$'y_.1vmTGlp'$cH#!<ٵc i,ꦢ2lwldpCǹLxrPG9$5b_ak-},+XhPK#~g dPKE9@java/sql/Blob.classuMK@߭1釵Zk'^{ ($$&̓?%ΦP .,3ü7 U[l;q01+Ҟ-V< s9Ái=1?B(M -ᶅ8zK.( /r2LkZG&Y)6 rMg-xk1Oɣ,-}iݜ;Pd<+Şuk=w,[IIZF]nCZVhTӡ BؠHIN)cW Nkd3 rQ\(d]Bt׿PK@/QPKE9@ java/sql/CallableStatement.classy_EǟE@@[wh[ EKRt1%-Vl&n xZ>߆|Q~ kL,ޜY,3dDT%I[u'F'SjS.ȵ_nk6 jlѸަsN/ho\>/P&߀KY KTӉ%l'8: & JV f5ut6wM& zTY±VJ'nmƚ+^5W 9Ft6_uV2g#K|_~a`#Ex6͛fxǪ:ړ+UWJNRu0E[NGXela:.nC²PIQIǭu7HрhkT_r:SLtJ~@!t{r^è t/*ʹ<~nзJ+#2*[֒D'{uU>G*8W,a>x=.U2ҙT<࿞a3 pT(WsnFGTG)>靋_"LtZT|Toyc$h~ݖ9iS%pIs9v z^K҇H?"d7t QH9 !r; !È wr7"܇pÈ#8! DF`1D 9H"aDN#<88cpӈ<OBd2TWOO]9KS mdf`BtDfYB!,X,XEBr\ ""K!yeDVB.#"D˄0BV R@Ā+ YCĄuD6 gД)H"​UBRhy^%5D^7yBmw]D^'+A47y>@&YMRQG|L'| !9|ȗ"_~"O3"&oPK%-# yPKE9@java/sql/ClientInfoStatus.class}Tn@=BȥriDJ(D>D:ԑ11jCV܏:kY)={fgf￟^cKCX;rfh唭hΠ/0nɕAҮR\ 3*V3?;zW VBmkޗSMqֱv{\e~MKzĐN2#I x%a  7s,v5ZԵm+vuOc)fN @IdE=v*ɛH>KxDyO1u >̺ wAs̋ CD7ĬH*j`y ?7N܀:5$bX&[gniz=F++sx~]$@$w-bK#/Kߢxz|EuO^r_H]`yjBȒ#,{ÿoHPKzӌvPKE9@java/sql/Clob.classmN@(Iܺ2&&z#\>mCI39wg7\å; A7~8A#LOϜ̕W]cDz鲥aP!|=s8R2~3BJTyq";eҮS#ɉ^b|WqWZH=?i>#pdzxxNjx 21p. Y/(Y5epM#u|kT#734-XF }| F24_#$Op)57ـo5 q <3yn ?FPшgTghPH y]7՞y~4Osd6[PK1?IX PKE9@java/sql/DataTruncation.classOMOZA=<Z[-m MƗc 0MW&]QM̼4yY=s_7vGzykv6i}HGʵjĐ}/r͠CC8yytӔRD.?R;Iki򸘉rPog}9z!wpׅ=24ZNlըX]iC%q0ȟA9j(~0 sͧ"i_ń7B@|mҁy>!Y}8,Eo+)7m"n xXS %bT&h*MY QAg(gcLP{Y鐶Tpn)VMduNe1Y 3`x!N!-Q 1$l&P& R$OѹPٶx$&9K`$9kƹE)VG1ҞVEw̬(HjRkμsHWmI:]@6HĢLɹpHgYp$HejYϹv ScY16jCʼI.JeEyfݗQ̻-R^-tC_4,c9dk#[1ϧ". ; ?[Ğj|5{`Ua Za .#V*ۉXNaUtqGt[fZW|q 1=jaZvSpn`-䂊Sc7WLԙ< BsC-  ,]|^2]>~̋zuiKOl'[I0<@b]BU6+y5hYs}|Q䴳D='~X^{o 4/TY]kD v 2pMRa$j5Nh0|1B@ j`OCvya򨁛4#5rQYϝ #0Zԗ!Yr-WrF^]ٿV$2D~@ʾ,Ց>Tw= ֗l|vK; :Lg<lBy5t-adT |Fbcj^m?lNfM],n40AjUfXL9]SQ|L0 y!yIUkNk.B% ,.{c-+mU^2#D S" aV`4FJU̴f4ct$H)ݚqYNґ;<40Xe4P0cpN̫]ɰէ;Rp7<GI}`Q%"SFO~%P9`rc^8_S}T^5=4ŗNK_->:,;Wcf( 傪YRU1f.eM|QU|U!“PtמՋCxLStLۤ2?ɴQ98 ,WoN%ql$鄢P7Gr 5ʊ wWR VX.Z~6Y6这'uyp(bgY>Xo-s7*{LmZh|M(]k1efҙ PQb9kX75 zK xlH'%OWbJtktŴ)!hp&Vi&[ A`̫$3gd.C'V*?~K7Ϧʶ? n f>Go! 3/ÑV Yu4u="l1 ﱤaPx"by YXjv?FLw|BSF4C{^ $`jwm9~տ˒w[퍖~5&Kk7-j/6v}5}eo [Y}˿[@|ng/^˿[`gђeΖwsW߲w>`ٿ2K~w}}Ok~kX{h Ycgev-x[ǬK_ 2 c< d iD!r+Ƚ,r$}ȕ"RCf#)&Ej:ui䨏@$!g-r,y.^W^C:'AA<ky"Ea<G HDȣy "Eq<' DDȓy "OE+4OG;3Qg![&ϱs8CtC:z"/F>^/C:/G"B"E^?o@9( 7#Dފy;"@;y"FFDރ{!~D>"F#|!r"G|O!iD>g\y||/!eDW"_G|o!mDw"G!cD~O"?G_!kD~o"G?q_+"C"r3"Cq9Ddg5iB|D֠q2!IoPK2\ *PKE9@java/sql/Date.classmOMO@--CdbDI }Ԣwă?e|ۃMfޛy_wa1g|[pa3(1de( "!C+"1&u`_'" 8XgxSP$#Q@9|̃!ӡ?ȅrH%No詁6S.y{C<q$iYY5c$+Sc)P_,,_f6|C,*Tƀz6Bl9JUE]tgt)iڰ˟(6wvu PK4KA!PKE9@java/sql/Driver.classMN0Ki͆Hl`Q@T '`"G[Xp'Q"x<<}|8AaF+^3T R"xWdž1Mqw0L#4ZwtfMB6xx4g N,'*eiD]ksm/|7h`P>= 2J(Sw^BVs.c:Ox^LDҔM؁jc~.20 ,@գoGCY)} Z[-)c8PK{4HPKE9@java/sql/DriverManager.class[o0ǏnA;: MiҤ:g6)[x'$|(ıul,R_`^%"]Z4w8HB5cWߟ_ĩ &=Ʉ'- n@k%w/ )֋Hx;]u)=oTm\}.[&CK,=1 |f S!*8R*|7>ɀ1b  3rGMfqdin.knޏpOAwY לׄU"5ҾXђVs-Y?ק_5S?zmimxx[GPؑXa/knI}0V lf\5U?80V ۦy< ᅆhPK:'&PKE9@!java/sql/DriverPropertyInfo.class}P=OA}÷@ Q[ Ą BXaɱ %,+ ?8w{v||8E#1h/nҪ@;kfzd"WQv0G:c T=*=:#rX5ф_%)-r++z ,gΕVZ6/+}n1CGEBHBUZӁbp/ XLycvF8u 7=[G^Cmp6>x>x1 3> rĘG!bƱY 3,ulp܋?7ՙ%oGΝ/PKc)7PKE9@java/sql/NClob.class;o>#Nv&FIJD}?$vFXNb^RVjr ;#/\%H!#Wp~iQr[fN*֭RT Ĭ $8PK:byPKE9@ java/sql/ParameterMetaData.classeN@Z@[/QM]2iuZ۩˫yP3d38Q`@sBh{:7ԥ/L0 zAU M@Fg80](OG:s =f=N6Z>KabB:t59VQ{w.=߲<B@G#POyUE=og^_ɍs97~aTߢ4&;w:8UeMePj:Low4l0 SD< $.lA*d[WP@%%4аcыVTƣDb7\zkHVyݟFYQ2'-;o^,S\ ÚطW.i539Z%΅h]b1beJi$Rcn#c5x>qtLinEk %cǧ| $} BðBF`T!cT8L(d4rC#7r 2hyfm܁ y<#,hQ  YF()~ J W Y Y*\*\<+U YYw yh$l(d>(# قO k5oCA#; م=R} $pgGPK̦J PKE9@java/sql/Ref.classuMN0߄4IYm.`CA{ȕIC  C!&h K=߼y ]8Thz ES[B7Ty+$ `R"4 XfVR#Wd#xlmjI_*\,SE*I-rWŰkahq6U}wY\i~<.eMaj<7-#>[Lت`ov8Eo]{wPK LʨPKE9@java/sql/ResultSet.classw|GbY]$[n@@tw«;&HZg'[ ދLI t0wbBM%N޼;}H߼yޛg_5yGmľ3f8t@.7Hn+"m)WYZ,'3Bz>9/dnjJV@QK*άfO沨ϧRl ẃx&hd"=??ύS|z6/ʛ88rx;2=;}?⧹d>̫B:[PYw O7Lޮ@`Fa %C tY1 \IJpI&SK[tlG Yzآi ⬿UțGg%a6~v`5YEôq3P/R]*CL=eØb=\bΘei lopT3P&n.:JVƌtsDTkApICRf(30[֜jw%Z,)'q>]+G\ap쩺K!oUc"\mA&5K+bߴ%a#Mo%mA7tێ@x UYY`2N1G8-5񃷠< MȘD!IHJ"i 1*!2DrpKR42+9ϥCcɪqu;'D%R"(\0X$dI"ˠrD"AH+`3U"Bk &ӣpU\ O y!/ I _/&%ojKe[~%!"Մ: yYFBDVܹo!Jy;C"$]nB#y?! 䃄|K#QB>&5gFY#{ |>E5>Mg$r|IBHȗ2!_!9A:A,"u":|oJ[mB#D~?$G1$r$I$S))!S&/Dn$͍+~Co !Mp3!HVrwG L_$r]$bwIȿ$Ʒ+PK$ #PKE9@ java/sql/ResultSetMetaData.classer1[08BHwU\9Q6T8 4Y3Hy4<EњI0ߋ~W" vO)荒6W.Fq#0X/뤳7:A"tN}֡YHU>t+e>n}*j gF*(c\7>HC6t]Hɐܭ~{0,vF5۟3'mW738lEî֖E31Xii[Sܓ6S|_5OAYu&]z>UIƂXϜ~J&ܥ}- RbJ'OZ#ZLhMҡ|s~G~%ԥq\ƪ$e|'nKt}hkHJAC9]':Ф+D6TId+ M^" vr#Ⱥxnd =Da@qIig)<PK+ZCPKE9@java/sql/RowId.class] PϘA7 mBV7(Z=TtM49͙yOu(YƮi97?ҡ=Y;KCAxղ!յO#» .-e=I$2℁e2uZĄe|K0CKsd֝M#t~Chz0zutr+}PK~MPKE9@java/sql/RowIdLifetime.classukOAqu{ j7(͊+]@ 65̸Q4BœyΜs=372BGƱk}cA:4f0 5ۨWcz0ϽOo,f^._Hm3Lfg /%34R*Uқ+zJӹ,DOfVAyZ(t5۪[<[Q1nH(YwVOGK aJaFC G*l^E?TU7ھ,I2aY8HR"qdž6iD{6` 22 w5pr̚1f84>0hm̊OJC;N'[5+XgXNܲV+޳sSFY1w,qP7/`Jui7)@U KF|sD9ů +ڀknR0HCD߈ 0rqP0M$u0=Leoa^;O1c(z8&DODvPaY[9u!MR\FD MAC̕IE9Js,.}U]Iƫn <|U 2}PKT̒PKE9@%java/sql/SQLClientInfoException.classO@ǟ&6X1a2"јEC$!L)P3])}e (sr^ /z{> (z,vLjXub|d]j[)P 6[%(6;1 1HQxph8i#le~Pu[CXR!%,]Zpd u]j_ 7^MKwOTٖa{j.B:*zh7k6 =֯@ߵ/3窣I$Pg ؟oa@ąl#8e?@_/A,9[LhTx+2GF_`aƈ4ilpwujǯm8.5OVg_bu]+Eg{w l~•Q00@{Klu̚7xʣ"@i^dK^2~,ޛr r |0@F2 W Yo rSYBaT q!k~(! B%-F]|M0`~Kos[cg9~/װTEQu'޹sثA cTA94 B5 PhR50`j :G]!ߡ/N"N}PKrjS9 PKE9@java/sql/SQLData.classeˊ0-Zo]+ԍٺUA(P}RSS/Sѱj $'9 @`.FvRt|{P&|Yc5KECsuD~` wu5g3H3"XwQBuZ]S4Y, w&!qkl2*\ JVy³PKuHPKE9@java/sql/SQLDataException.classN1r/oB jb&F\|(i/gsy{yPJ!5_i7ˏ;+l+Cmn i#ClOX=`/"uL")DcH5eߴM}aawx;Bbb÷Cmխ4]GXݚ:tȝM ˰6Ob(2|: a?R÷c {b仕lN<e iC _24Pdg$( !IcL-1I'8MQgybϜQ'f0ΌbNc꺶¬z_SRRs Xe K5AzB,Bou![o~PKΕPKE9@java/sql/SQLException.classTn@uҸMM\+:%P5THU"JUyv.26l6wolb O~˨nIjŅ=G\X~/LRDa8]PR? {B }}1YXFƐGa-dx|4T]~ vQ+an1ŐaJwfj-rh%`sպ9.tCztl2þR\7Rߢ?)`§o_ZV_~x(Sܚa;0_24kPd($284%y™w(f\MlI|gaYN0&P)+LC Hͷ/v*[N0 {ޑPXy -P@}ʨWh̥(fkw($"94.o(*[cާJ2/ks9N{ifbV4f3LaTV,KxL1,k`-lOkt٠,bZep]yQ,1w{=Q7PK4U<PKE9@1java/sql/SQLNonTransientConnectionException.classN1r/(7ktbE7tC41AZL\>SFFYL{^ߞ_TGa]]kCBC/PK*6PKE9@'java/sql/SQLNonTransientException.classMO@g˧|# rE/B4!$X-O&(v%(V;̰ϯN{:ӰܺњѶ1ba_GFR`̾ +tD!A1zsխ6uqaZ=nKё /l(>/0wK`ǝrLqTso2#L?\( PwբUe~˻}Cnl1Ù52F1Pz+& Dp u0r4aTIaN;iY 6DlJL]]G0Y3ExL `,,}[sAgxB,*6ñY/_缼u[򭷼@uT1BPK9` : PKE9@java/sql/SQLOutput.classeks@VZz^(^ziPg, #%]!ŰXk~nBɐ}wߓ! ;P?Pe!`p}"\`4x| _'>/W'AlGVZ*`+6S 0EčQxplW]'`k:hl1_c+&h9H 2ůe#%4:0&h` ]rWpk>m)Kiy*Ky%ThbK@۾ VIU}ɕfU R :O Q {i`_.,"tD5~\ NR), R)OkǓq A/u |Z][VaF6Y041\"(3$*?5iP(qKCWT==\:kg@v휅9\gqy$D2%$7YUB`ye3t=A 4 b1[ RE^)[z#H|{@d=PfoPKx$ PKE9@&java/sql/SQLSyntaxErrorException.class]/A'jFB)7FH$%6\OkH2?˕ąG3C.k/朙ygΜ׷̥c]^n߶ʵjA~_)O7_x2Wձ'˶p)cHm )]xq!睻?$R #U!uUuh ٪Sń) տ bUˋrWB^l\j]pC1Qa` ;\_ʻwy:aOv$|()nej^G5_n&V ΀(1M2EF1YzB#%1dhLh (j5oRǍYg#5g&1f1{e)`(&€,_:]33 AOF *Fc'~?'#ܵcz:JLcz`gPKPKE9@"java/sql/SQLTimeoutException.classMO@gKQςHd` ф 6Z-[L<QA3}g|{* (SC?֍ަ#Ӟ=@yF֘֯@N-rþ3!B S˼6C@J{ưc8š:ȪbhX}:xݩ2[{ <#j CQ%@΂ľ1~Bz />+VTW=qz%eMYv' '(4c L$iX5 0adua>(3ܜ̲$lam!&1;`òf q`,,C[A9B, 6ð +_u!]+⮷@w>%PK笍IPKE9@.java/sql/SQLTransactionRollbackException.classMO@gQ ~DbP/D4Qjmoy2Gg+@qagvN{-r*7.M=jx̱jS0A"VG̴@;!.mD΍0L 1:͋}tm2uǠVaZ]@-jw ev"jPw3O0eۥd};c5׏fux/8Rb*pa17aۜ뀓I`kwecT &!HY5 0`Yi> 2/sH30'¼Temc19Y#e0 `V1Fy} @%ZЋ} <[ ؂JڿdE^z^/@1p41BPK*PKE9@.java/sql/SQLTransientConnectionException.classMO@gQςJ419z!Tsԭ-O&(v%=nt?^(oQ=Xq 6&s6cfߥ6;{@y%4a1[P_WB55(΀&f`]7>PKX*PKE9@$java/sql/SQLTransientException.classN@@(ʵ%n hBRM S[-}-W&.|xf: -]93ߜΜOn"vMsuSr/_ƓKm+¼fE ޤu/De)Jb'ѨeLA es(#:&PՖBOcP ~Tw}a'rL@ eh:Hy8Rw/f 4CbY Ju30({32/v/v  XoD c/`Ǵ'ׅ c$Ȝ'fe`Mi|1z ˲E80' `k` ey<>EtO=A(4J c1 [SeQ%]Cܵ,z+LT{@=;?PKM5PKE9@java/sql/SQLWarning.classNQƿY@Rh jo# S&$J7 *eL|s)]Xbg|=;<›44Bye6f{$f_&ܷ]ԶLH[G ,RX"件c.N,<Yծ;0GGg &S{] $F3l}ODe+ȹ,M4%<*Z>S̈́O=Z雇 XHziź -gM|Ic+[ơGlR`3}X_m!&x ~xS-M5n @ >g+9%gER\ Xxy=Sx0jls᭲I`AMF ]Vcy@W$CP - tF`̯bܵg;l=&Ĩ,6]XW=Xy}9M=lCoPKaYPKE9@java/sql/SQLXML.classN@g "MlVBن /;)n-C%A5`z98q;PKsGPKE9@java/sql/Savepoint.classMN @3J"%מ )/NK>*Z{0efgfylp L4¯oFE40PPKE9@java/sql/Statement.classYW@]{qДJ@[}a'&4ҏև~~j9}ȁ9 gl^|s̀Aܽ>=2zg* $5#or0jI5sM6z33v[7ڗm$_Ǵ14W}U acaN=P'Hy=EDnG/O&Gs/ z'(D1Vܵj1ϪTخA}SUy[ҼźZ zjd 뷅&lyuvB_x~=6u߳.Unˏ#)ԹkHP)چ9F|zx=Ҽ6p~sj!G11{>\̇'0\W&T|4FhdJI)!*ʑ`e@-UMn}tXw8`vM N\+@|d ܼγirDPsw"Ol\{mXojk 4; ^ Z\\5mWHANcPVPKPKE9@java/sql/Time.classmN@ \qĈ3#1)AM`1\2qP3&di??4B!1{}9)$:n/gґ9eYC-<1꘡r8> Lmq8}:3a6w&C fa *p+qLs1IGɄ g ;1B{JQ|aH͹{z=ߓΤU[b+I#Յ}Ч@=qr)IR.MsM>Aj߰J&|P6` a ]7I.]\2n>mj /z-T"!?fd*Mn2hPKDuTebPKE9@java/sql/Timestamp.classn@u|HBHihZ !!*VQ(mMXةSqWH\<bBHRK3;ߵ.;0*7 ٖC)>90ʺ+5 kKWCɡG WDHv=ŕ @ww("R 3Ԓ8]9i+qCYT$WZ<|R< ixiK>81,W"dt*]B2RE;o;E=2u |4)>Zg̽X|3ᝩPW.wG: 'ʓI+A\Rl鶩VX;&Ԭrbin`Y#,TpS[X!ehJ*UU)[:)GZgbUfvP͆L[ؠuMle}I2èM1 Ʋfܺcm6,d0c}.e':ЌR1A枮SmclN g, xG?+p5?PKiYPKE9@java/sql/Types.classUYSAHOTx&ل.l6x`'|]e%ɛM(Ll&7^" E}S/QRI s a/+ Eh%EPԛU (zu?Dy+id 5߁,)6FSQ8iIN(mS,+>*5W3 k2Xui=e4P#VԷ(#mfExb-jE힝[oMZE B_:a{۞܌kU&hw[3(PU鎑b*eߑg3AE9z3'8 0׉ R"YShuF.8;yw_x&<o  G'#|J4|FxN O//—+W)iuMXN)4 g ls&0$T#{A `r ݷHy)*PKժ_PKE9@java/sql/Wrapper.class;o>#Av&FIJDĂ"vhNb^RVjr #Of1T[~#BsNbqf#kErjAIf~^1;'#(@#gpfz^bIiQ*#8Q6Zv`Jʁv22bݍ֌ 6!VvX@'%eH##30cs0p2< Xdl~0KPKiuPKIG@ java/text/PKPKE9@java/text/Annotation.classmJ@IhjM{&AOAJ-1)},= |JMBfp .RZt|]ZU 0lB>[\T0Mw6M M$=ÁGE$wK&G0J\]0I4c)33o7a0:EØ0n2?XgAꂳ9ཱུw98qn[C uV4m0–ݎAL6*PKYQ?PKE9@5java/text/AttributedCharacterIterator$Attribute.class]oAY( t-Vmj-ꅉ1!tEJM\x 0m /(a?69g93g Sth 3>@\RxV{n= WtDNp>@G![hmAjIl::8mCdxRϝ Z^9)UL,T wl˱ \-]M:[0ySf9>8o 9:gvtvZ~^./ݠ#9bDYmз|2C=rwno~WajOu~.2s//^0 =kTclҼ舷:U!u;*xiɇC$:6}A[Muw%+8*1ʆŽI(6+_v_!<$T]!PK@>>xPKE9@+java/text/AttributedCharacterIterator.classRJ@=-z>(ķT Ŋ`m]jJLe35?JK b0Μ33; , 勴I& $yZI6"Pzٷ5/L@uy)z Vz)`:ȗj%p[yb ,D"W,IS33mqvfo'-͔ww\X=㴊YBf>"JuHjn4LB=T]EsU|_'@9`Ew)*+d)Xgdo 9( xi|3U̜ iԈ}A)Wj:֩:5Ec *- PK~Ӝ PKE9@java/text/Bidi.classUISA~"q7 hfJEPTM p@ eS)U9Gi^3ot? !Ԯ7FU^#2:;Wm6:l{]G_k&j}Yj5>Zi"ѤYf5ZtgSPr׈3&3iAHLXӉdYL\n 8W0B =zoEE!`ChIۼ_0S<ŧ>cVjbEP)4F$M߾NH1+A8~A3g|+v4gVfQb`׿P Ji%vMYo:%F-6=Jцn^cq61Z3YW&K ʥhKmږZ/5&5!! MiXtkY>Ggfjd0gwg~ !WO}c` XV6u3 RlvF6#:=yM ,\'#ZX/,<K 6*-,0$p a'އ6g>cnQnuĥ#m)]Hp[7=Ι#txW ׶OE.R]&^eKm冡vƨ=aU?i]RNMRW0FT{$mZٛ)h@vq-ij2\ :fϐ@a@Or3@Ǭޱ9ʿzX93YGur-þkٌ1acdqE5]썥fe6>|"(ނ`49YL#we|/d;@RC&6 !C> x?Y~0bcV1T:l̬ύf:Ώ8ބBPZR*͡>U<ƐRy¤vb#0]ˍ mMK-3C:e!,l&q֍ O,! wPV܏V2H(yer|*_iJ܌uhw(wފLKQ% \+Pl+BO=J5l;1aK}"f*LPKaPKE9@(java/text/CollationElementIterator.classR[oAKi^ĖVKDMĄd-I0,dv |?J=3u6ٙ9|w.3?~~%c8^bKev}YDWH]Bq q)՚עV>:N]圁UV˾ 4a#> {\͐(V:Qۂ+Y7=dŽWCgB_É3SBzNRe x&dX)1p>)fzrB1$o0$ljp06.ȸ[Eg2VD_7Qq+xbx"htƥ7t48 W-5,3/@a#%SdŰ Wy^3gj&Vi͍X:`O6pP㩵4Ff 5,E27`nG0TIz.s/̑AO8RF^|e)noogy3%ByG]`#2K!3+,p?7PK%$PKE9@java/text/CollationKey.classuIO@S ȢU#ƛ'8f|'ză2$ü~~8NCyI]j˵s1Jdȇ>{e/:ҏnW0$*ғʰl9?M+m_4bdD!f#=q1tjEr͕ 7LL\3a3[13j'ti^˞h>ҢQq˾O패iP,Đ2jw ZmʞPL~忉esagHKvBX^~Y 2#YC_X!&w@wi rFވE|HcMޠ^jok lr[ PKҖPKE9@java/text/Collator.classT[S@>K\.P;)d )ʌ,u mRFm(mR(ә=|l3zA3>g4׶ MJpzʾq#W^vFOm@/Q0irfԵ1 ELD'0S?vŐABoP6 Մ7K;b,DrtaIf^{K%]㻖c{bjXb00A eX3秬VWDV[ Y_<0K°6bbX) 0aUƣ4 &_&'ǶB`Ef9lKޭK޷78.esQL Aj(~NavC$u^o;OG$md#,_Ӈ]SEW⳨j5Ý. KT*UzU>>H̋UWZ,ZX|.mV|`C:77EeNoo7Zu@P7 H/G{D;b}F{$dA =wѓ޳ &i\937̊=AzP,JYA+!bC3r *i xd"PWA:{-j5k @[Nhux(Xl)TXJ6akˎ"Km;Xa'CC"I$Eg!VoYPKMPKE9@ java/text/DateFormat$Field.class}SRA=CB !=A$QQ"s\0 PZ`X!,僔VQ=;C#Ugϙc7z|ԯe|2r-Rsuq!ұߵ1 xx&uR+jRWlv!|gTӊN'T-(^鰜PFq 'M9$Z%.3 VD׺ir6:1/ +7nv&Ck~*߁J<3ru@aUk֚ML7vhQ/5z` U H٣ثاد+Sܯ88x@qH!6;)X|1a0C#,1C#BFxLxBxFxN"`=xE"*IxdAJ#|c<&$V0lmbIa,`bؑRxЌ8f2t'֢fZz go_]l `G^E\!hKv4.*gJke􏕻Sp&2сCPKSPKE9@java/text/DateFormat.classV[WFc0LzIRʄƐ42 @002'?SC@TNgWpٙ? ܄`r$ (m#AӶƔrbD9CH&-c(q4jD2hZQIL&uT/d뇢g+x ʎm]TVD2b6U+Bb)e@0[eyP-ٚiKnbfhS`r!M 9L7'ɲTӅ|ƶ'0U,c\p{w kY"le.}( 9f,[C`#8sJl{Vn* wѳ-yv-cg +$Pcgg"B>d{Wa{NkΆǼK.,gpsG\bO<7iAށ6Kq(~0c_ a'-֕kf3AIPKY3PKE9@!java/text/DateFormatSymbols.classT[o0>κ]z}][:`Mh &!T4$xr;kH)&Ư'$(ıvm}c><"xN/+7ᾦQU܆ iip~a@Nz[cG};̆;C? 0 wb|We{I])}cpCVɜJ5'Ϙx:nDg\zTtuf%z8VAڈ~QDۀ 4bt z(1EaF<d@4y t{c_OUz&ڎMTk '_V˷y9>imjޕSyOjJ=BKc"j#O#)PI`0x 8[q8O|`#j1 S0 p䙄G9ȅ[wg^U"e$5XGJ#U)`̂9 0jGǜULK9-4q%X6:w$~$(k,ªcitKZfy沖6sE\Y27`\2IOg"}K]ǜt9}̶e}Uk}%*s*\ĆAb,i3Kl$I+XIħPK  PKE9@java/text/DecimalFormat.classN@8  -mi(wQR) . a#g]UЇzfl۝,"979?i@ϕvelzgg}üF~<\Rә#аJ S9m4@$sDgTR9Lӏ5w7/E/a"KKu&uTlYf.ql`j&j[s,]i~/ľf,hq­WN Xک\\PolQVZ!/:gv)HؾEjq5-?$?F $EChNJnΨIߏhQ ͛TfթSy{bk@˚نjVҸ- s'dV^3-Ên6DGl.eVwMu:VۊZ~ԇo0xUUXՁ13~)2$Lg?p@37`<'x JSWGIhk&B1]3$0|B ;=_^ka>OăS#Atc8D5^YCAFWpO}b q#wǍr##>qc-ǹnRZe[r0T9Yr(T9Ráʙ:#Jh2]r,T9 s *PN*`Un=vw˫;밌K,SWCX_2t$@kb&F &\%wrĬsNRuyrĂQǵZ m:PxPKne PKE9@$java/text/DecimalFormatSymbols.classVRABe vH®. ЪX׺mEC&ꃺ,= c1h$^fӸ;y~G 36ЁϔЅo Q>?!˯4Fd^4 8Z䤊} SaX_S #F9 Fd99EGP;END9ENF9A”:O1s=E?c4vol8-Ty' X:c2\fJ1L̎' abkrb -—ZҪI4񟱄r7SXBT6ZTe3Sٞ=sgZsh{Gpp}PK|tPKE9@java/text/Format$Field.classOJ@}I(TPFh0݁C}cwh5Y9/S#0n1{Ren ӸhND:F٘Pg3 \B=V_-'R?I8d,c,TN1c-/!e+=e #Ԇi*u?y.s-ɿ&[!Rx1]ک9z\] gfhwaB;h}4969+mPKKk,PKE9@java/text/Format.classSMo@}:1M mRhKF R*ٴ[vT NH($RE|7o'~ -)ߋѐG(ZfۨP+-I}'#a 72-\kQn0 BWF/aX8ѓ]}"Km3ӎvy͔.m!Nk6=i%cB\7dh8=-Vpp'R8*!Rq+h:V /`i1sD02FvaauW6滂FG`& zHbOE SPۏ":!OAvٲ-"@n֐bU|lԾӋ;tm:kiD <;[yo d%q7C&"W-f3yk'ONFoZO=y-#M?l5cަ)PKpFPKE9@#java/text/MessageFormat$Field.class}QMO@}cZA@TbL<1"8r_`5MB[ƃ?8[G;}fg *P> 1mϟmKgb A($_Uo@8`qsخ^jmHHLn! خg#ȑ\ g(|[cRo6겨#i;mԆ&4lYDKvr%'}oeێ}ו~A eB@x\! e0GkHEHƨ$=|-6c#b138^]]!).EeUgGb(18Ұ]gS PK,P.PKE9@java/text/MessageFormat.classmOAgR-\)X* /D,H6wW?LGg]o&w3즿밓vlzeQjta^hvbBg@n6A¥uͨmS7jXqJS4!EKe˽ݠ[')JՏ4Sgb1f-JHXETUfpO`QҲz{NHYs)^)l֯4ۦ[>{89U:;fѳ}On oI d")IqM0(H |V%3 b[Ǖ.D\[iYk]P.@eN- Uı+z0Ș4`4p EfL[ǂOg=0;p9Phܝako+͇'h?FH3sϙsN%x#c!~hyG=NW(aۦfu֠ +edm, j2xꕽ@hz~nԎvUԻb4,&LA"{o s ˜gݒhvRulFjxC?I~,)dz{ f^t[}L!\5b1 sdhωftJ2IANF!tiѻ Vl[;m>2n6w:N:bʯI>0GIv) Oca&lj~aˠn_ R9vomR,^W Q6i=ro)PwcP*=f}%??Y3Dz   `QEH"6=CԦw a;N>FS cD;wmR?#9:k%)"Qإ8=:rsO]6徔ڷ[jB^Ć $3j-r@L`xץ?PKlPKE9@java/text/Normalizer.classP=OA}{| ""`!bA1&$n ,9AB+ ?8{nrny3_qd`Ȍ}[s[> e"̐ ;mw$z>CBz>C\hCa"5W7Vgݾ`H6#ZqW;޵n=nw:Sr† 1p}%F/#KPԉ#Rأ+ 1v''R_1Nqg"`݌i@ !U B##(jHdg, $C| H.{%FCܣL;"'oH.L >CYoPKA,_PKE9@"java/text/NumberFormat$Field.class}SkoA=S(ϡC808R3>/O9gfųϾ`P  %apP&'T>6{i\Ay-lYHuD[e&j`=m92M,{ dC) ̵s18bj~\ώޓ]v-_d\cA;ӺNaRb6z [v^,œPam&Jκ[# Mfqœ/Z-jΠt <}tkifY{76"44˦CCc&9O''-z7hw _ %!j`H`RH*uJ6`MUYI9/ ? E} G-7EsZovxa6+55Lx%OLKx oD`EP#;h)Hp /`S`Y{~)} rQD.۽Hk@Izuz yxc5pTX{}X|L1*'nBXa| Y闑LK] W#P)g`*\ʴ`Z"a7D6*;AёEid!F iJȯU#kKc0 0c0K5*iDpFYF>_߉{lzC{z,~ BG[χ 0L"RZv(ĞQ;c :ьD@G8B A ILPKSsJOPKE9@java/text/ParseException.classuJ@FO1*tWu[qS* qGj"iCq%|(qfgq'oNSl{vF-etME˄=Jg x9AFR, N?e>lp=nP3úEv؇99s$ gzI}>LMvF΄$'/+[F@lv {7 LF ۵/yN.fL|.J7:61?75níq[zI'8% i_M+ FgM%)`6rtj^%ʆ=*s,i/#/l4b΢gg\pj7<d2C-țPsQ/F#x,@|J"r(Ecn\ʺnm}ra@MR}{\(dN7| WM p;N4H?6spp;s(g]9BFԋ-W ,Ʃ) 0_3@˰ć_zDq %ǘ&ߖ%8 eu}uvP^nZyy=+ _Kr_<\jdr*C0!"9h`eGxC=_PKf|PKE9@'java/text/StringCharacterIterator.class]o0_iS}]u[l|Hh *"UbӸvSe* rj? BB;Q;Eyϱe7c0]1oE:jEK. ǣPڰl~cJx<o2T4/vEdPCQ饎ї; .}5OVt;wc.)F\AG e4Dur ̞ղ"^$!"z'~=qWe$WYZ(+]W)~8( UlʜkY,IO|o9iZ/G7>6 G4fhD,?Oi`@5` ˀVJf-iؔM#٨ ʰ~J5VXCSQd6"O.ț}PJjRd n$S5#; #HAnɽ䖑|bu#6)#U o 3kk])y򝽮lb&?PK0PKIG@java/text/spi/PKPKE9@)java/text/spi/BreakIteratorProvider.classQJ@mTk5֋74kŃD6y՘f-O?ߦ)Q! =\^=+R|ҤFH7ᬍKiJ:W!J3gFBm4 xJz4'}+1 tRtBe?ڍzd eg$32 9TWG8ۯJ2JTGҚKҕyfuOp0o2UOްʛZW>%&"/+#"tfw剡29'!K^,.\V\0{cdt+}YIsНL ZQ.6!d˦I_ '-Ns+k! 2Umx%,x~G^ǝOYHF ZHc׋a;nI#ۙ36ulk{:Xl߂m fPK*zPKE9@(java/text/spi/NumberFormatProvider.classJ1OiGk ,ZV A FڌA˕ět!EN|}|ٓdhņgާabVҎM9yKZ(&d2oP~wno* 95Pn5ZT gK䤩4ӳj-p_/,RcHǯ#R̸Fen܆1Ð S2ls1-$I*䯞f4p= >O!p;vPAznYX>\7h)grPK%PKIG@ java/util/PKPKE9@"java/util/AbstractCollection.classn@16BCuY(BT]VjPj+ud$ީvU>@@f3?g $5bэbslvjahmGL2C\dܼ*~j]S@A!13Dʺ;`kVG! (Xclmiv Ijsۺ{;ec5MWbHonVRCaHW,0D+;}"*Ny3wj_ Qh02j#9OdnF*زJpиͰֶL&a\5X QEջ7P|^ʍZd̈́8VնЅ br_Q/Ma;0vn^woFNZw#zm@vo=th~"%#Q g<[ӽL %$gJ9mN3!4SXӵRHS<>b;b v>{+$./<<3&50I}X8jz%N8Zb@< l<}e|O)dw {o/Ab$^ޣO}T牳sw$|2Kާ[8@^t_PK~eePKE9@java/util/AbstractList.classUn@cI@X@a6$Bj %j7udب>OGU3^`']9x 1dđX3 YCC{FG1X5Ez1XG,ok["6dU6B|@$N$ؑUt%\* Qm !\_l}n4ML >e{5֩ę|#T01=k٧gRC~Do) CX'Pp6vH3.5j_z@(..NP@l;}N S84'`wIL0tpM~9Dui$Z=(YSbxzԡ\?5$ 164ֵXhSJ1 cv'4SIG2ݥ  >>1 ܗ1X->|8Jq-)jJplO܄`Qf\E.,챬 p=k CB4dA- Iw9F.4Y\;*E p~dwcvs9CԒsݱrLki1f*8m}x7ȏ)ap31|4VwVoPZSi]bxE߽}awA1ǨKG>;y|FRsx2d99b6ӛPK, LPKE9@'java/util/AbstractMap$SimpleEntry.classS]oA=|,PjZRk[߄FDp6ۅ,K?xw.,l/s=sΝ{wT( K~S״oom׹QgIacR \IDQ+[7޷\֓B ɦinX, 6VCSG^=CA [Yc1mazN+! ep*wo;/=)C)lr35z/Ҫ-8bjz'fNWG*Fg_s5n[ z% "LTWtj@GKhLw4u0зwal^0"]Oۈ|"-sO&b5r CfHz$S(&  x"YlהʞĽ>I> ئrWDIء- X<#iP./cktr)VҪ%q%ٙBY,M'(㝁.,lӾνs?qCc(]k^U}ۛmǖ.Y:7: )Uoq{PԻ}WG!-lcZK^E6N*am=S2t7:ZW@Iđb22mq: #aHF}nu9 H<vmQ5w^KƵIgC֯v3UKgoԨIނD` @ݶUxO!yUyBY.]% h0FxRJ+:{J'9C:9_F3X-] -rU*-R6!"jLI|^>GLސa{f9w_1TdH]ZrlU+6-ۤ- Ȑ$&wKֲeHБ@]% )MI險NsѢZ*ʤY,b)z+joki-C[g+p̤K]eĊ_14`luBc"t! Uݱ{P yՊ*ޖ͋:Bc lZwrU #jJa9ZҵdmR2јSvpkM824 KP +ט*.Dp;Q*e|Qꕳhw1u*l䩮3H,^.F]mw4v&Cw@v۱+g`7IHwox;DIP~L "IܿOϯg؏`<%R3T.益x$-9TQ .]cT#U!T(#XaDtčnwl]n+u~ʫ_[X34]#>Ie& 7hFc)k蘽a}f6K#C)6e7PKmىlPKE9@java/util/AbstractSet.classmPN@}[(X^zlQIꁦ7uC?˓?2D;og潝c-ц?id<[HB&[4Ed0; W&Ry يA‚}&zLmlX0 4gz[coøzyUN%rx4"q- nᢐ1tN3j߸굘']aΔj_s' W{ڰCٌ`EM(Ct)kCe7PK(PKE9@java/util/ArrayDeque.classYSA{6 E![9 $FC-(ym ͆>U>P=Gn-*U;G=3SX9 ĉrdʶgV-K9__4 aUm)f:Um4.4E.pG54c@fhv@('^3 4!f@l&ɰ}$f2C͢pF6©-ՙb- [RU * 2]P첅~9Nf U+ ĔBaSJ6^Wgz=9-hL@1(Ո@**}#-L^ RG[6۴p5yjjXQSj`` ϯ6H*w;(v4_?bRE>{YN;v>p`"_p59ìV;P,2r,zja;Wю-*zŝy }%k2MEvLJQ$0YwM{\,M kIBYT݉JEnc1y7©M\880C@1> Ul _pvBpm|qn$jfze{ ฤX<ރؗ` |J+P{0Kqa$d/C5^#C|f2en җ2y鯪Pe/ |f s|5AAB s1sX A<˜ѽ0R{^%5/?_Σ:c7yサx9!|y_,sR<sJ9-`2sO|OC` 2_vmyu箽W"tU ҅5G@]*^?u eS\r ps?PKPKE9@java/util/ArrayList.classn@g4iCH͡ r&iA\) TXE"wrTJ_Wx(x8NVff= y43vS)vuCs<2SBYpW0K\>YcQ@(-pOI4!:iN} pJt2πe8&NCИ_*FJ:_~3;k= .6TM}Gf,X7pl%^z\@j:ak5fX3#wUgrF$] L=z⒫@]+&CgL3uMVr"^4IpH@X#mt#etcy k AN#Z7֣i_ ~![q>be^]hq;!UU :EY*TLp/L"ߞྒO % CKEe?xd[-+R1FG8≂Hk]K%?ggP~37~#j޴-mPK8sLPKE9@java/util/Arrays.classYWGo $vBD88H`[6^@d٥`;p'$  "#, 8LY2h};gfy0jTUnݥ}[vI[,8wJ5}^wvzZFyiAX4xhgSmxlւڦܮ-854i>YZZ:Ov>X,_߾\/9UbmũN"~cg}~҂5,_l:B٩$K )fAWidUq)  !cw a| #4G͡ ׺X]_\[mX "3%r6"2/%0",%."r*%2,"SJSDPJdOJ)v [TI~F teN1v[AoMعbׂGFQ"oEܧ2Nwe}*VݰKA9p Ǎ;x7oe(PvmPʘ,lP֭eq;ʪe:īxaTv٢,cGP&kDTV]Wv`bRvCQ6lݣ5;M"N%ʄ$NAMl T*kRKQPlR( U6Sn)iTVPeP EY@>zxSy|KHϢG/%3o+9;wU]s =?!=S<|M29GOG5t3e9VVi딊EE U|RqGQaMJEYQGQ*V *`ߢT)*۔uEE"Dw(E(.bCQa=J1T}JEUQa*J]E!bSQa*#,%Tgt*q3ZL:~S9ԛ[ 0[9{JL0_P1+15ЂᆶgS[[ s[[[KW:؂_u5h` ~Cz>PSg={PS룀s/ ,/PKgi)PKE9@java/util/BitSet.classKo@g< $MڦoA@)*rs%ʵ+ǩJ?8!qkD<~8 8IB`ʸ5L=sMBll5 k^Zz:0ٽ5i?5mrkf1 U\}e!,EG]|2-gc%r_X+iM5#2>6=]U_@LLj8j̀z,XUZp Mvu==NқbK!fg$]05p/ d,zr esMuȵ$PDg\Gy!ǒ;j#G?0'+-P IU<3'Wk2qc|&1 xOpY?%ʬ%\dˡ3>s"2F'$@#刂"u5Xh&/_H$YՙaGş( DsN!nw nE$d]RII^ܕŨs 2/ssBД@P};Du4hwcE;+UT=ؗV1ۑTw$ؕ0j/|OC/Һ|H:pY|8={w121FYy˵5LZxy]SGL X)S`%[lv 9]_1E]5P4u[`-;)\Qd2_$I?+'W&BTiT`[\)O%sVtOILI@+Zc%E5W!WPjpS/&L*<@\nZ=Q*$UjZSJ\-1Lxau\e|ء4)&Ӥr%"AΗ^.͐Z䱬x1ǂyk/ $ڋZ;2H5 T^`ear,]lgj8@ΛOҘ-WLr>sZ1x fUTyR @1Ě15Kz\R^CCaO;4lGg SXg_AJ:\[FU4M >c=&񧰃j5{p PU`xvj7L>zf =@:y&f9ebB1J{epjܶG)_Z[â3F!՟ գJOKxFi%a s!Oo׌jK ``4&<82竹ALӰ b 5?XgAmƐuU#pݝ#,/ӄ(9:qf8'Vڱ=?)_I'+p\ZO]yDH(wM}~]9k}ؑH`?ǚfo21I3]kGDd?EW/ujscxdow쟈OcH%s%|J=y,Pާ^\au+l;ڹ<L;q]"#2jgq3ZH|ݎ̏s܃?;n]xu>iǮPѤg{#*_W2 2G仑"ՀAB{NqeO{ wsp(#/uLj O<%(BX>s PK˻IPKE9@java/util/Collections.classY{k_1`c -\ m&6]K+{uV`ڦ7m;}7۴ M۴iWzיhvfggjooގ^˯Z4zMjUE#W5r4!^^--_C 3?S,jp gqom| R9mjFiX&_EWv]'4'U>j`.Ekuv`K5e=m5ria'xjD a #RU ӏd>8dܪ{7O cW+Ox!H6Qh$RwKph4E4 */·VЄ5ynWmԞ5e%-(ho'}Ȫ C̉|<5mi3Р_J ⼌ SLz++֖U- YT-{ [vՍ&ci q*Su Qku2 CļF[S,*ެ[0bIɕ%3l2]aB& bS6B%?#(X3W9J>][|Yj40vаQبe =L?lHrt$s4!U˹U*=F~峡89ɹ[ubj6YY WoUNj^Syz4"/pHp@!8Lki}(1ډ>Pa; -v"uv?]Ș:n>V5 z?Ao A^̽s@e?Ed kv4ŘSoGC'%bA !E=tۧÔ# \;.cq < n{XmBgHH= TOI4|V8G)Bb~D1ǹ z)Bi_%/msu =!i~5 ߢbMŴ94 1kMw);ryO1#>v&FIJDҒ}܂ĢĒ"vFLNb^RVjr #{2XI*#5'#gpfz^bI)HFH5R KsD_ZꖙɏpH5#MF;L!6FFf`z g8|N.0L@exPKO'PKE9@/java/util/ConcurrentModificationException.classO=O0}nBC Al)0PMM9:8 Býx 1:j{9Ii)OJcńn) }Dv<=z\L}SdH &Z)iuUqi|$ j߫ !=%9SxX&S\8t`|ܫqWqJccK~s }qщ* c7o/e-{ oPKPKE9@java/util/Currency.classMO@g| Vcz!!!zp6)[Md2NTjЙ<|{3W A@ 5|m{s)eY30n!Yc6LDtӽJEotz@*-uîɼPAU<+Vw#jphSmZN@"7:qƂ:FrjBSdiI zӑ֚Wr~S zY̓Ufp ؏__[,0 Da&1[E֡H&J 2lY#U@V[{na=$1'bɚ$vFFea̦_aeA@PK_:MPKE9@java/util/Date.classOP^l "(/8D$lhIִw&7ihƟ>JZRHz}}B-ffl0$!2[dH8.VMTiOV 鞯lʍa7C `Z&[$6 $+6A@? 8}ۢNC41b1]T jsCM`lm1sn%˲LBȨޕڽÙ!@Ҽ!Y}܇Wp@VntvqȯY#p"Tgip2yè).ĸ`jRM^,@lST6@ƚ٥ODp6vЬVQWluڴmWt'ԷR&ϼBU. θy>+qr\w_~f?5:dxUf Xp QXer e6AVb],J 29>଄#1U`i89 0A\>Fٓ8r\ dnTq)҄upv6ԙv:٘p(ђΡ&BC;&*IBʔ]QB{ q _,\ˡxB~Q/x 쀰N|]Du"^GDj `\`b\U>eOciOGױjC-ꙉźȺ5ȚŚ db d݌źȚɽιxv,Ywbb`/ UPּ8ONA&jt1T>]>݈.u~8""գ86#tU`9llDZXzYCKx~E嫀\}x7eD@U<PKnN PKE9@java/util/Deque.classuKO@gy ""G!Ąo]jryࢇfg WJ"PkSsn7J!PE[siLu.AΧ>% kqk1)}1>-ѸОS(a\_ duf9? T 1,q42uEIƟmT#s~BKlu"=q;!3c՝b"i tg:: %aѓwCg:&g_ iw{YDm3\p|$H)( ^Ul J3o W :IxyKm!~G / ǡ;cA?S8 };PK-PKE9@java/util/Dictionary.classRN@=* 7jLq!+# QL D`$\(mAE.s3wnb1d|-l4aw4nt׭h QU.3B!rfފ˜ 4ĕ-M0kfkMnIȈ}' KKƷ"QX6FTʸЄ. sJaL]1]Xܫ t]v n;Ny;~ΣTd޳]|74{l:lPl) '4l#j x/%Cn:V[\HoΩz~ Z=npI*ӊ Sʌ⏴#A1$) g)}cR)IBpx2V|]nLJx x揺-lwF;PKV<đ@PKE9@-java/util/DuplicateFormatFlagsException.classOMK@}&MjM=FIŋJ۸ĕmRMgIGIQP0o쾽8FυEؿg JI0ţ2I/>S"\؄/hNH#WW=G$ʼn` ,rh|Pw.[mw~T_PKNRi8PKE9@java/util/EnumMap.classT[SPNo - K"bqP{Z")I'MQU3>8<Ф)~}{6(J0(gJeilQo~TB 7j2%BiFR~(պ*aLD~ݫ kVR'@i6s C2 ; 3#aC%MWZU<GKFMW3d}՚TbsfUÄqM8k=P<ͷ >>f}llsglT=QkV.bm4] ^{->$)yjBԆzSü80r0LK=r10<3lݴMKAw?^Q^(ű--z3=7-_8sv%?HpR!t]57w30 Ɗ͒ !я(bd@L=Ù_I/A=Bn` td%6N>+rbR=HMfwKEjNHz:ROTAf m=9iδ"3%83i.aI*V*û4,Yk Qd]/; g.Bo `9%/B~3FZiJCN(aPZGy\']*>:βcr7,]qMfCH!s/D8<69|!>{Vf($l 0b174'<4Lf̈́9 S洇fҤ9cќ5s|th0gh{h4,)]3mh.2cI-kSoRF,1lgl_3-j񡽧 0vV'^133B{Ix*D0<+my&ϦC{ 1v7V/ȸi0n17bq_l¼aM k[_пfX–-h|9}c!!^00a>{Y PKLo PKE9@java/util/Enumeration.classe@EHb+Vv+ vfQPdə͙؄Ae%<*xdZ ]YL$X&Vˊ9/5'#M0`Ei"T'<jfGbMs /y@?k- C&[ LÖPK0a~ PKE9@java/util/EventListener.class;o>#vv&FIJDҒ}ײԼԼ"vFdNb^RVjr #Wp~iQr[fN*#=j6FFf`d`L lPK6auPKE9@"java/util/EventListenerProxy.class}PJ@}ZDExSPA}S%&&EJO?'D7͛zp φA؝\B&yLdvO6LBG+bLh&' SF4 yz/4ra%4U"Hfw"%EJ\A {u##-DvDخ]КmZdyVs>MhN878^hq:R6:m<1߫l4nz<[PKBPKE9@java/util/EventObject.classmPMO@}K)E5F7bDP BBUz2GS{3of9Mh <̢Z!YTܖx>~QoQYDSQJO2`,L)Kbd.5 ӓ~S< 80x\W/(9^\w.X_9BdSjQBY(y{m3-ПN66T-t WuaKUm{(JPبb6vQS R xY+S7h&e%X77PK\]EwPKE9@java/util/Formattable.class;o>#Nv&FѬIJDҒ}ĒĤTvFTNb^RVjr #GXMH>#"kOOO0FҢT̜TAH&4120203#"V6H21pPK4d}PKE9@ java/util/FormattableFlags.classuPN@,(ŋ7`B '6)[˓2~ovfgvgl' "B|)Dl ~"ҹ{?]ș&zA䍇#ЀgJT")Ňs $d˵c5,5Aef4mҞ{ss?/laKCRN}owvewcA/eDE!vJu72k^0  ZfQce[Ud(~OXrl\>50HC2,̫6go ;cT,P:bS*v~=!?vCYiqϖ~AI}zʝ@b=GO⹊g kZ}_tu@!=޷O嗍 [<5Tta{AQANK^OUsx_5x|%<ĸRMr?(XA]6 ^LUgXag@FȪ&dP$BV tZgX;5#qT,DB'=&Qu#0 gFFa }:=xLT)ɐu6 *DKYxUX*mX7##86Ck Q #Iؕ$-s>M0LQC8E|p2'հ-$QKNZl=3 WZWkwվU8,mF0/˲{*9/Xa]: #7o)PB[ǂ,+̐jjaFz{t-]XLYѭ0l]lYGO ۬RVFX^ ̜S)&a,7Z|Cj]*V0%4 !/k v s?`;$6'g`a`{P+ŒO>H bU@R]dH#@V\V$1#.j6t53LzMtxW9]|JJR<ޤ< {Dh+}+Dyf|jK^֒'eMU&MKz4G^ -ry՝ܬo'<z>==O k_@ {v,;PK%k[ PKE9@(java/util/FormatterClosedException.classAK@ߴiZѳA=x) Ki:ԕmVoy<Qd+]x3ofx_.C8~g.`l1r~!ZK%O:CB8zQI !6 7ٔ \rtG)aPZL=ϬJW7&'5iW/[8fCHfR7ljA>Tk@v\߉PK7eLPKE9@!java/util/GregorianCalendar.classYO@gHp7u(%UEEF })B*oK n9CTPUg ?;_`^0ݰb˷;]bNܩ1s1J3F- ү,f!Yrk< CrZKK\ŭ2QׇIj"V)r,unm W-{}xF͐ w1x8j Q#QBdBbj)S7Pu-XܮQGz/ T]Jot#\(>ݳ+EYS"U g`_"C'7դO\ Psm[|!JF:7#ćvm>GUbM4mb i#w 3'tRiM'?d =pٯ(qXuFt)Nc2y]daj"Ҕ!q=L|=}B k,UY))7EMH*5CVZ jᗴ'Fk|7YԘH̴,cT(a 55b;l&AOQ4 +>М’8Oun֖9ofl/mw:҅K1.1Xaa+nVm9;a[ s'QPK݉HPKE9@java/util/HashMap.classSn@=ܚ&iK PiCB7aպ2Ne;/3G!f7CbG K93gfǿ~ 1l\kޘx3~C2w@AYq'<;g>tDk [ q{h9cWLXA! ( RPd(Y+M> ח$ xĝt`.f\ͲfkFzGtͽa\mF&2$.&_ 0TJR:xj`$$5WRׄx7=ǜE(r|3K`7x#Ѷ\P2}bkZ;UȰvXg^/\$T'dN Gued3qR[ؠwqMOt]*NB:yĻ!5 ">Ĉ.lr}BY+gx0*vT>pfƾ.o%\~/ӐUGlbioePKF1EPKE9@java/util/HashSet.class]OP{)!ĩvYBrVOjבgBLOO&t% eq{:+"CaeJ# C-]trF!>rX- tǡOCú9㔑ޱ2\R= و/&Q{PLz F7Q Uat=v = ݖا<;~#,eIEtOMk:wK# ϧ z4$sk4ƾ-z2^9س0sU=ZXӚY({+@2-NoZ:WuL7pw=:J5:ˑ Tf4UC\-ƽ[[(\-rq:ٳ^u\U!آ)d T {-a'aj&]5='0ԄbYUW=f@4g|dAA#EUgojSfpQZF\;Q\HH/.dO Rf/FSya%5 YTbOqTևd[g y$,D/~%q"^U$P!=c)\|[V ڻJ]z=ukj*uk&ܐ5!s!znI4lK; >BQ؅;ޚv1w[-YzЁIc4?s#g38LS*!2R*_Myމy@[XmI&8]'AuBv]zL6B䤥jz(fСDQ&?X?PK z PKE9@java/util/IdentityHashMap.classSn@=ܚ&)-xQ*CB7ؕT |81qm@vw̜=;/pTsɯykH;N _Wdj|:O nk HOkpdv(=wzJZ@;\FwK"[ VVhPK]FK PKE9@+java/util/IllegalFormatWidthException.classJ@ihV V+D"RtiWCy$x|(q6 =?7>(=SY>^M)Fee{мP28]eJv;V)c߉N%BDa?ya)ETV~ymV*K9װ ^} <49878{h*Gk[9TXz MtjQyy薌rk1٪PK%A PKE9@&java/util/InputMismatchException.classO=O0~ʳkG+Fةּјωμ[ t; PK@e PKE9@0java/util/InvalidPropertiesFormatException.classOJ1lwVݮx "xPXTh=݆6MJ'GITlLM^ߞ_" 蒦EKZs4gT3r6\>A\/zI+sI׊IpH_1Pz "Jˎ캜Qi1s)_eWKND{sJM.j+Cer6 a~ {#v&FIJDҒ}ϒԢĒ"vFxNb^RVjr #{Fb_jŬhh+fd LK,)-Jed` q日 cd /-JNu ¬Ƞaji#@`:v8'P fy$TPK7aPKE9@java/util/LinkedHashMap.class}Rn@=HH iȥB rAHjDP$P!Mj]\H'^xBԩ{f̜33`RP|[s[[.u_gȯ>dX1$ۚX>b̦"f1XC>`6s}Y [TRrYUHPq֓-^w %Kt ;nkĪOk&o%ڔNjn<8c0nBSaهm^1T$֩jhI)3Zɐ9͉j]_kk%ѹq4>[`+-c@g<йe +C!cGi z%}'N2/d~CK ؠM= yݦG'D=t%7sEXq#"' .J⪛pJ(lDœF6%Q 7 C {D9+\X9raby?DQK_J=R=)%cMrMGuzQ|''<^F6C:LPK}2(UPKE9@java/util/LinkedHashSet.class}N@8IIHL[YE"eE""",d? #2ؕqX!uC!&!Ff}|?- CX[QʩʽfБAaa+֑=G3p/kMse(f'$u媠AVu FӻEd1_G2ttݓY!,^_8]A#Š2E0n5ώwն~[ P[/X GVX6QF>m&XXm&uoeKE_$a#~Ӟlwoan4^NXeO5j6xP jT>g76g^g)*"@y*R;ę1LqfTBk9 ^zpE7Z&Ks lRg0Sg،g*ܖFnkX3PK`PKE9@java/util/LinkedList.class[S@ϦRE K_[nŻZE.LFF<!iʌ| ~?f7a&sw{ٔ?pХt#efEE%QYO+!f~RT$u+zH \WnSF J`YTI;FmC@ k#'pׯb+bҙDcqwr)5-4˒z"|wR![3g6})S-wr6wtUZΒWT5ɬHn_evج@T*ذ=Y4ZDӋFĈE鑭baaәVT+)I 2:zZ$FJ0h:dDϩ&S[Q\ׂ҇[|g[ݰgghOnpc>b )%kpQkZTϊs*e˧ZPo0ĭHA5b }喲G!#Z+oX'5՜[]ĆkxaP="J {|6ǞpNBg/[?C0cneG 7 \qB;&mkR0dmijM2S0텚a޳9h 3 C0,):ۈgca$N N?+T+,{ s+cqNZf3˘NS73'|= x= `M?зd[z} ^ ^=g8Oę"YN9NyNV'3`.q2_䗻HOsJd+L?tMWwmnPʩ ҵJw`~\ c}oPKN4^+PKE9@java/util/List.classuRN@R@| 6&Bb&MHX`\%c ~ ?2ގFh{ϯO )9]Ж50]O ;Ԛ9 +(ylΑ6m@VedN-# c_sNƭ趵gceEbo>.SV][c8E 3gXeZtմ >|IPF^y=PvɆ6LVO4vDcjQqdk( 9^ݸAMDݑ@wk)ѡCdGL؃ɱ %zz:{!爭᷉Ǔ!HA,# Nv#~>_x!T"!>^9zO,]%sPK2PKE9@java/util/ListIterator.classePMk@}ckGmժ K=VzPZ,v%$%وC@T070w w.jZn_M`T&M$tm/Xq'E9MQDd J)2Ep̒Odj"g`&H"L@h|G«cGB,2"-wO{&ǪJջ'x:LxWsu87 FMF5q}\cǸou\PK@ z PKE9@"java/util/ListResourceBundle.class}N@ϔBUƘ1Qk\ Mİa5 )ӤLI|+]|(㙖DsN;î1Q7lр]b0to-\ .[2%!+@%BqIEe/РK#.G|J`od; e;^* $bb ,x^x"*y(w/#/ߑ~ZsDH7L8IgpFgjK8B'kR]^X1ع +`Ac.9@c)0Z 0' [HM%1;i΂:z1.0k+V۹RUTjIWPKM%qkPKE9@java/util/Locale.classTiSGH#.c0{- XHXE^!9bEʇTC~$`1KUogїB3+Vub,筢BVVKyBU*:[+Y +05QCsS32Sp=Hh%ˬF˾`Dׁ YN+gw5aDՒ[|$I؇V6Ĝ1駢F7)[O6Q hNsNK 2fZ?eolJCM9|p(^ZݲdG|\uaI4!nodO,)PPҐiE53gn?P;N9:>~C}O'רP_T?9>ԗ<Տ}d.{Tv6fN|į4V={*|'MeN &şDM\x/<=_WPKkpN* PKE9@java/util/Map$Entry.classmN@ϠnlR  w#NJɤhgj«|(JJg3s9ǙCgyTLF&.C :Knn+I\`1&ROeFA3f PE]t]׏?YTf \j5au qb$RB98ahY& TfA`E`,؁K#ڀOޯIu ?$Y.zt08oPK> PKE9@java/util/Map.classRn@=ۋ$m^r)C%RU EECYHo4N߬۝P_f0Xpf(<6eW&Z ogipgE]/_DJZJ]x筴aUE80Œ-¸eFaxuژ_'c?$~1'~<` g8-3_)PKcPKE9@.java/util/MissingFormatArgumentException.classOMK@}&j/i+ޤ"XH۸ƕmR6ғg"af߼}{ypCp|P2e2=T'T!3#ԃðPJ$\UOCXҜ0tT+&h Yv#cMz`P⪘N%:as5ZZ:N {3؇03XJeHEv~vEGzSIP4խJU.X'aE^eeFb-?PKj'PKE9@+java/util/MissingFormatWidthException.classOMO1}Q3` k#eL%L<Q.Dy8F޽\HnIW4Q3Fv|$. ^j"3JxJ13F+HZƑ߷s@<2XCY rj@OȡV HC/;~𦓚lXHs~,H֟HzO&T=r[4x ȵ{w^h`;HnPKE9@java/util/NavigableMap.classTN@&~+P-cP%JDHmlE+U~TxlŮ̙33^‰c3-wC.ʷ;) }2` :#kd+6 Z :n"PkzqTVbͮVu4ݨ&0ѸcUeة)"xbmiYH`ՎwUV`d4U4R~(H\%Z2-_o粝f^!93"$< e%F{0‡_L%ZOvaf榠j9Kx?)+LKz򄸊T&6JߒVzߖ{r7nj ٪{]Ůy6N?T|?~}=}Bupbc]hnGN8 (u# 2&1LDc`!yS0 YSx,*xY[>ªk5 Kw4 ."Sك}[8#8Θ/PK[XanPKE9@java/util/NavigableSet.classRMO@EK %*$ZJQ1&=ԓMkJ̓?e(X&}3oߛϯ Цr|nЁ`se$ zZFq0b:VltθA\G%)u=Pԧn@a:(v2c3w^Gv5Fv `r`$6rҋidi˘Ͽxk s R=ѽ>N_R}3co |72\Cv)mZ=Gg=.g痹Wvfuj~S?Mx$ oA&Y۰|_bKw#rDo/߇WW#B|$:UξPK5/_}PKE9@&java/util/NoSuchElementException.classON@ML 4@(0CA4(TV _)9ds-*$ >B],(>f X2*FERa&s)F:GsLit[ir'J+sEhﺸ!XmЉ*NL2IE*(gfjN8h@%Tz:p<t aRTe*o]S!Xkp?8ughxۉwZl6-~PKkE{PKE9@java/util/Observable.classRMO@}  "c ĄAҮRRۤ-$'/L<QR B=l̛fϯ P o=l \L( 1H#Nv&FIJDҒ}Ԣ"vFxNb^:P<+5 %$A[]WbRNk0FҢTV^%z l  b`L PK?P|PKE9@java/util/PriorityQueue.class[OA, Jmm*{cZև4 vʚu1ԇI ;@ؙsΙ_!A#85.Raf,9W;Cwma"č*5 ]M6sz@p:Y4hY݈2C).vA UWW&]bs~As4-F s6.~3 v6±=춛/@vK=vӤ-Ym*R<<:f]i4iHcУuxpGȌ#iEզ&-̡ĺwB14'S܉r°lS^Oҋ 7 vMEiXE_2~<۳ SuG[V+P@]S3#^}|.OI" geG pqT%wΝ-(1\+Qĸ@0$ΒBԜ'yᕄ4)GUWV,Z{R0^*ZRRxR\ܗR:S:# 1M"IfzBؐM Z 03}d?4&ڶxy4&섹?'T\cCn"?PKDPKE9@java/util/Properties.classYSA{6 w$$ Z %U(BC2,J왌Mvawz{w kzC3̩m՘-8sz J`̳|ΕFľP"|Xl@w\.DY%@sKfשyH+[+6}Lh7:Br lnJ 'ĥA`RYsSUD%a!"7h)Ȭb_&eb_tp-쾣TijR\,;+X]d\C. d}ƭ XPy+6Lw~ep%vB  [)auxe~.xB:XJʎ'1ˆFa cL35㍮3xsuk! [(=ZԤ/!Ҁ졅(D.D-bJ!amףaSmas69l-lA-Am*BQ p7FcW MM+]U^ Kk7 i=UvҘuo>[&zvm\8 ՂݾOKg #M*ln+"P1T!Ce&/5#PK! PKE9@"java/util/PropertyPermission.class}NMK@}cWcx`Z*oRGD6B'?%Φ0ypB@8x WxdWcrd˒\!$֊Ҥeot韄к54gYg&s6!œ6"tC5!t"D[/g. G[hـʦ枽~¯b|*UIw'9;6zÖml ;s]AzPK p& PKE9@&java/util/PropertyResourceBundle.classQMOZA=^B J@X)4GyF]52P4}sϽsw_+^ ~` avO0f TT S; J 4  uK :x60Dm Da`uďoڑ{\KOӕC*O G&炷vK ~GbDc Bs 5ad >}ɫW`X66VWAG0 9k).Ӭ`@-cAwn 0zS z&lfD/NȰi;Ru[:!%TߖYsڔ֙te' xSRB|_ k3PKɹfPKE9@java/util/Random.classRN@=\L.pچ RET<&YE+%6*|S/S>QٍF<س{f93ka1LKt 鿨˽3}\t|YArZ'+y =I-Cq̐W]G "l1L4'm8`cN*tIu..GF^1#:z⳯!4RS30 v TOkZ:1u@ƙjںo:CQ#< d8Mzo % zQZ0cKυP5=A"}!zPd3/"Y>@EM ;Fvl1JOx9٦ԗԐiX1e`: _24 1ِ2g9#9c6ȏi$/b)v[9|ϹD T#/jEb-wkLc1}=RIZ1fPKF?PKE9@java/util/RandomAccess.class;o>#vv&FIJDҒļ\bvF\Nb^RVjr #Wp~iQr[fN*# =b6FFf`d`L lPK1V?`sPKE9@&java/util/ResourceBundle$Control.classUmSSG~f"H *"b!5HI1$%xMh2?YxrssCδ(۳{oB^Kpy{(0="k;$!HkdJNC,ew0ldOMl?Yyo\ s]:8#kvcNg6-v%3'f)Z]KVE6o0(nLj&؃J%^{MZy>遲%z|>X\^W,v:B/hr3[Vǫ=Ʈ=Tk{EjϺvyX#ڶ+ZU8C|KJhYQT}kЗnq"ICȀ/!FgI#:y,*i,3w,~S7h)hJa< -wa4K{YxP)*$9U`*>g:V< W`]5l Aci3SP={XA?ӄUƄ2)DPKrgsT PKE9@java/util/ResourceBundle.classV[OA>S֖*{Q"[h A5jLiZ&eq5[d?e2ͮ3j.GrlEp`g8q {ZUT`Wgx``:.zǥCbe pP PK@e PKE9@java/util/Scanner.classVk[H>)BAD@D RP(PD))V`{qC;tⓦ<~qg?ϞLӐL:&3g23%`~gaf%Rb'S |i%sp$tk0Zw;AA gn7̎ak Rۧ%1,ZOBW+-gjвFMLRtA~vLWIPJ*k6XLv:UB(,Ot{A"5]h^tlVx ܆sAkvIj`VM揈^fr˰̀^rWnKUr?9dӝ䋧c`-.\UWɴX21􌯈6̡5wd4F S~mzwZ"$/eGUON'E'ڄAA3*[dt\: tl@dY&1ʾUsbe5QiJ t,ZiUfK w(6π96)lg l#ttT຤^27L9Xs:fZZ/Z,Q{s,έ>Rԗ}l>myn5W^ \.\(h(|tz8 ؤf6AamO2>7f:j!8,NCN2$k:r*̦@MTj%* ZFNFjyﮅӸEׁ.3 =^u(o |vė\n?.!Khg#!M4pN Bm/RHBAVH񐮉8F#u]š4\47di<2K,݄.M ]dQ{\b? 2!@.TW}yHx$tNZ$Gsx&rKdX{%8=%d$[:6v`!d !o*; J[.ƈ4ȩ};robxz@u(t/>+(8^R"Wc 3Hl RޗI{蜺/?M#H`C|(E=T2`.-Xqn2i;\\@*ug}ѥkR{B|,({]%{.Rp[L oD ʈs_#R_`z "o< WYQfmG-Sf1j+9/d~PjO=/{ЕavCK::JPVrDr*JvMtafUpLv~#Hq7ƟPK.pPKE9@)java/util/ServiceConfigurationError.classN0MP(mGBH6T[r\LH <8'@jpϯzpx,?&zqfx*5FMn!LкJ7 QӜFxr:ghAf. -wC}f`:ɜiLrp97fa\cWe4~Z&-U+`hOuf"q'ǃ?i=\(z]߰Z(6a)6v .vo1{&~9,kWW|PK#C"PKE9@java/util/ServiceLoader.classMo@u64NK!ЖJ Br$!R ɂ7ƉĿ~? 1Bݙ}??x $nj*aR Ѣ˽эp ytG`ؐ4j[sPǻ e[^y<(?L>e%%mY&_FBejp+:aZ }_o6WmIqexղm\>wԳz;+yz~ WYIra'!,0H+Nqjdc\a37 Z r{ғAx&C'dl0eY )H}4e T>EYodsL6VU<K˨Qs%ffYGC3f2Lf=bf8,5)dCȧ{X@ԁ2}F<4L*If~_PKxQ`PKE9@java/util/Set.class;o>#~v&FެIJDҒvFPNb^RVj2PA9?'(ZXS ხZ3##89?%YCӓ+8(9-3(T383=/(lji6WلZY Ye?N.7a|PK؍+PKE9@java/util/SimpleTimeZone.classU[OA>r *^HBZM*&lHbKYSbGL|gLkKI|̙|4WXg<^qBܰNN f:1/Ο:No_2O REp兊AY.E="Yl m9 LFNɲ]T :"N]۲mnWNRPTgx d\αUfПmI99 ˨ 2,ʰ$ò +2$dXauP^κyQN(o:OʦXW}xV7%to V0\KsLN1h\ģG3jB: cy>ܩJc@ !q|AH 0y R6/ŗ@QGugp}?fq7!y.cRGqZن|sj§ 9*6@G5"W04#!Sp @Xy !F'41@hQP Q0 W?b4KɆ(P D-$uRI=LjI}/TI d|?Vw]iPk5ZMVӮ) fசz#k8uF9a}sp VҴ8)e#`5 ^ZC7y6{mWh 8*J>u i$}?AK6g+g? 72x̳Q=yy_R-4N3;Zx3Df=zm՞1>:5ڿC+vKT'A}M,GXtNMPK \EzPKE9@java/util/Stack.classJ@IK~]H*hťPtnD\JpPj҂Ŝ99f CyuNpBa;Yc ɲ3  cVd #=ITp a_FG0TMw60p>C;A/O+PDrnm fk@fѢHw\V$,|naK$id{nyɾ" _?gLũM ;哃aO6m`t&'I;_SvDQT_0LPb։@@qT$H?r!$1`IC,iS%R{Bɞb?s0|e9ՐDH-;-=`5۳/ʏv/a_7>PK[PKE9@java/util/StringTokenizer.class]OAٖ@B\"7E/JnZ'ep;lg7yW&^QƳ.v̙}/;t0t9GZ_D̰h}&31.* +Ӂ"Z+{$yWƄ;:f(E %p`('xMG"<#_0,y<&T^aE 4Bw#Ʌc0A)jfZ|G-a_LI6+Y[CQEƑ\acV7L@ Dq$y-}Y難7X-zMCԾS` eܦEDwD1fb_Kzڮo`=N?F3MF*bC `he.., ՜##FQϷQ}6AdnOҡ]q?9KnѼ)F7^1,9lڐ唟j9)5VfX[] vmuÕ B!E1 S>\%{;nCd2.CF @IJ9 J qpLIOv4ڔi 4ӊ |mAj4!j L"w*IL:^PbiؗC1%9foDzHESe;el+?lm*ޣG3=Ÿ=F^|sc0@q›feKOhT,vT*vT񌞻\$X_Ю v 40YаG/ew_kiߗPK3dPKE9@java/util/Timer.classnPg|IJ(4MnACA TTQ9JݺNņ B̙uhH盱_p` \ъ#o+B(r!! "X, t@~2쉾/Jݑ+SzY#vSmIzͭnDJzPМMER+9W8JaiAN'ƗRW2_QBc39@p$E$yb}r NFq#O Z`J MM-SFyzjQDXNXZ@(>ď Ecx-V  PeTfgrJi"\չ\evǥ+m$J^a~K)k 1S֠鲲Zk51Jk6;fuY'cM,J0Y 0nkƝevѤؼ{{޼v/PKV&}PKE9@java/util/TimerTask.classmMK@MjME xU$(hfح!(=x<Q$UJ;3'c aU4Ǽxt`1l7&IQ:m5S`*3so`gtabӃ ~q-~ NxMZT Af"2m3 1IY tݔܻʅTrosTk[6z: ޒ.E!yFs>Yme%Jz^g+2Xr5~ хT^2GcJߋ-vFͥwD낗cnfhdpcN?fhTӁqs,LM!n[bt (K(Te}W?N(FbbgA \'tF|N,o{Ј]Ŧ7PKu3]iPKE9@java/util/TreeMap.classrFbl.q߃/8qݸIMWk"yp'y>H3Cuzv%HH2HgϞҕ>.c%mCw.YW.KN+4qGVHTj:f{jҕb#0VU(jGZ&a&S0)eY7uW$e!)5 طQBn#ܷ3^vg-/VO Z6R%C ,DEnQe}\qJ|tJXz $|Xѻ\ >h.>h B裙 )wW䣹PgbuZ}L 9ȇ> y9?ssVMoK|&> SCYUOB퀚y!s⫼0G/Bn@ͯCh 洫Y瞧v/ݶNmo3,>*/9ZG]bV m&;E}akۯB|)C۫_ʃyb<$z~_@KPK~NPKE9@java/util/TreeSet.class[S@Ϧ-ʽ\ZZEE*^>8R։ 8|'g|nҥm&: g7oo8I=RMi=5%8^/7LC4@`L-Q;V ¢ZvC2 Hv#Vȳ:3 "{ J!gG8[du\_D`WTطk~L;W|=lwNm f"f5VLsɡUi ">/YpDHGq;#0 pjntݖ_Iݪ]+13nsɑ3L$0齌@B56^ѫ'LG."0Ƶ%bSk6 ytzdFQ*ưmRXSV2N~~r-\l VbνP*29wlcJ^>`=']'@>qj#d2QM1jn:ēe=Ea61w6bͲ?p,pr-'Ҵ"4U7MfSes7 b/E8OM+` >퉓\OapK/q/8i;Fs@ ^&(:F$(p 9*^1MZl,oM$:l ii)5/!ԼTSjԢKRjYHKb"udt(RB'}w6]ql"72\>0'2BV20'2os* żÜȼfpOљK &rI 9<јvZh߲=No^ı?;؊`e%G qE]{ekPK?yhPKE9@java/util/UUID.classR]OA=m[W[ZUDmA)K Ő@xiX:&ME(ٕvs{9b^+٭"0er]u.c(mHޕYWdq/bw}aۖT; A!럋RCӓ-鉗}LG!=C(Vod̵n:n2&;-q;o]_x0B c܉#Xw*^a5*1FmX0\Pڲ pO5+LO{9iWri3A:m플;]jB+zW ف^t$= ;$DXޗ\J3YJ?UƱP";!tPK(K1:M:

    +߂c!r*'ޱ cE-SU?`%w[R7痠H8}z)I/1Gc46TjW;b`}@ ѭt+֙!>sy0g;`áD9Vf>Úpz(~HGǏkQR2ͽr&+x%+NۅݳΧɅ8Z?rKs;q g [U.W7YHυ2)2OPi.p51NQmrZ=%Z$rr e7CϪ ~H%,w-6>1[ 졕ð%Wm5GxY(n8}HWFiy UbryPK"L'PKIG@java/util/concurrent/PKPKE9@2java/util/concurrent/AbstractExecutorService.classVkOP~L2 ˸(*+$ aMIWX(- ?7d?RZ֮T fٹ}y??$!F`@yӐT5kqB%d&!NG(U9q_ *Lv@|]ۣ)h[m%Y/ͣ bEΒ&ʮln/ƍOrl)JZ隢d\뚢YS YrI81ۭ&s uؠ{Eȳ#﫢a\Ya՟].* .˅U]LR+, &sن3W-}w_oϨyD{ٲ FBkT=%k\n0N`]q }{#U=WTD`f.I'0J?aQ ȸ6U3CEX`6a:>|dsLc.-cqK$0.É/Y9 $^% Iܰ M7Ԏf-=6m0ˀcUf@Ja$ض,=9Rq6l| ncf]w{N։8κG9&؜|öɅͱ֮FЇ[Iuyo<9aagg1xܷl*Ԃ=c!J{Aipf1Nsm^,~}q08غybgq?Ņ:ృї<D8XOCgG3g9đȎL PK$5+ PKE9@-java/util/concurrent/ArrayBlockingQueue.class[S@Ϧ7@\[. x ;:%JIFL>3>PgihIƗd?g Hϕ+%cQuM jff0튮^0lעAmq4մQC"5Ra7q#]f<-913O ,҇*'Bp̧Lcjs*CmO/F ]x,.RD *y]m.yȥ#qGqIW*T5eyb;26헙[ UcOEN i:QgSǤw,TFdc|K|T[uLj(nI梖,+B?=|ïY ?p(N C|& b4CWX\x>P!!PKE9@1java/util/concurrent/BrokenBarrierException.classN0?iPh 1uwU FƩx-&$B`}{x}p8et!@%;ehw 񙹖ZX젍[(-/WbRI^aJQU>nQ ?0lF*=5fQ? ԶatȣsȦqRF}s(gḏD3o ]&JFޜ74X 3BPKx PKE9@#java/util/concurrent/Callable.classeN @1jT>6,UlD+BGH8./Y~x`fq" SvfaL"υI")\؄"m 67 mpqIN.Zǒ&`1ڽϧ =I"S8icfUwR3LD?Wff48_Y>)H0{:V9m7աBBEFkbi+Q!qYD^eΆ*l@rʸe 7?Kf={KUhi|PK7CWPKE9@,java/util/concurrent/ConcurrentHashMap.classV[OA> xZEPkڋ 1F#I<k],&W>5C@T3r]̜9s̆?xɆ!+ɊVT#yd~ւ'iauCClL-YK.SEeaJd Ȫld  FC0 6eqfBE5\[Nq) %&5R}rdR:\xNM#0ϝ4]:Lev0`yL|o(_h\ BCǺy b*U,RUz|Wb# p9*&bDڨ2"lk/G XtvۗeK.T Haαm1{.ɻí#qS>?W\UkرAZ3}qg Y!p9\zȼfN/[p}5~|;2H:=a+,H0A 8gO@p gp x8Otx8sI.E7)&V}ăx" r % 4P]bƒK"*$6LܚECl1hK`Y)ς-Zk%q˰bujIHo]m/!ǣ Vᱝ`Z $]챶\͙9'F[=8g|Om-yn5s#4ZfGPaQ) l6759vmυ9.=û5 [x(L| >x!V/`g< dCPKeF& PKE9@0java/util/concurrent/ConcurrentLinkedQueue.classn@(ڴrsRD%"UQ*Y HU'Lkʱ+gb+$<88nnt3w3>//gs|e7,ױϓKS9] Ar}OX~L3uPՅY`X rfH}d=Y$p3Edeo=Z}t?>Ss: qԗ!58f`UcRǵmiuaY]u?>[{cXaA¨hwsҬ KIGG"po{'YH aOKR8zah\2jWR.C%_K|g!ᠵj6hAyl9b )doЎۦќ@;-EcZDcn mܡ9?vR9 _5GYc?) [@aUϏ q`5NS 864bO35}d'N0#y읓cy=mhxy9?syNc<#fMCu.ZPK}/PKE9@(java/util/concurrent/ConcurrentMap.class;o>#av&FIJDҒҢԼ}g87A.'1/]?)+531B]5&#gpfz^bIiQ*Po0kM fd`+J/ gz#{QjANb2P%Qzu%@.Wp~iQr[f\!gd4* .7Bb50,xag8<&. _h |p>? YP!PKn}}PKE9@1java/util/concurrent/ConcurrentNavigableMap.classTMO@JE x15nj)$?8ݘ@ d7o/DGT ̾gϼ@;:tlu-}a@Գn 9_ъ<G`&,dz9ԣV i: B8KW]o7vGo Ĩ\Vj*2UUǴ HA3{5X@@1TdfL݌8 rS|5$ n~ ܹ}8.jrItz6kL?YhH<9`d9y(blKK, eW7" V8~U}PK0‰jPKE9@0java/util/concurrent/ConcurrentSkipListMap.classW[WF51$@B $$bjMqHҤ(+OzNzNzٕqy3}3o_c!~, .əj&*z&χ'R U;B%Q ͪ %CA$5S5I¦,Ơ&e;UE4q>žM@GNR$}@[2N Wbڠ7ݐ [q)jkԈZuws2HUSg ڡWp !prk+ٵ"OZnE]ղ4zMCQg4B-2螠R {`4V94DI:6`8Y:Ϙ(g#p&0mJ Q%YRo)@buxwXҳ)LMO'QhY6QN nRH|ΝnX@{n3T:Mk.YʭF\Db$*e#],p7aDi F9R8 KZ:E,C6湜gѰDoIZU7hҭG%V+cA'joɪ셙vDR9$j l K=geq6i{Ggxc)xbt,U1e)d/lWsU-C' JM,zLC~c iMULŜ4" %%a:C0r>Tka \}| zk5;k x\ymq %#. Fcc+Ċ.J5*k⪪k L4ia Z (ò]Sj&=O@3:bs_$\\uQi%qY!Sy-rsb˵Ijn]3~-Ͼb&n+VE\~xH1abЅ_(Sz|mO o6g<00f B8}3AC0~lN0OaSp5Nq1AWTg8T=*B^6D8O&l<CeIƓ49v3x:;sRdEEYys( s1qK>1/yd@,85̑pc bojfoc-ynngx 9eHpތX"[ Rg[)Vn" j] y7ZZ!2{!r2`X˩1R\g[`&@'0;AC˞mC> ~ōlm#Dl9 s?d/p6yƝ6tGm̋'O.^[.,˹7y.!8mE}y#rSvRq^h[L掚 'i| Da%oƋxi=; z/)v{r꟏P2.fM޸>Tj] ghN>yy۹ѽ2+H^&K\M0o[ھiXttPKoPPKE9@0java/util/concurrent/ConcurrentSkipListSet.class[sF 0N/1!v6n! bp[>/L:}J,7 a՞=ٳGw. HTͤZJJ0ԲʉfZӪYT0 7!+i@*5z#45 q&/S9M/a@A;%3 @%'N s: ;!p7OqMI5Nکlw+Z%>4FՊRdNYMƛrIrMkH/˲Y3=<.9< ײE#0 țlȦnp-%cm&E0sdu4e丣')w7aE-_X טt`}gE`pSHaK`;WM{VD.Yns1;WZ>ǜ<7UkiGC=S-4)7cF1Ѹ㺄֢.4Rs龴N,̖ tA]ԩ!@pKW*cuj2K@He GVRY;*QV1Z'!xcK:OׄZ=\rSoZaZ5 / )ǺYU*|;CI$ƞof" pU=*b^"P}1`WkQvL9 یF&sߩmj:ɋC9uu`#/a|#twP/xOl`׈5 3w-~6ʱ1keIB{6.l<;]jԸ\y[jAH-J-uZR+*ָK[J"ot7HBGBz$t-u:\'kDK/߄-L܅=|؃9|(`xd~f„N\_: yw$'y`Y;tX+ ⵻c\cf>t?QQK9X#O}ľ1CU#>+Gk# ?$D|sku{uZli!\{CqвvyXY l]$%2zѲ*\- Yewsb#ɍtm7ٮ a q[#W\lgVPK6ڡuPKE9@/java/util/concurrent/CopyOnWriteArrayList.classVmSFޓ yi &ņCZׅTZp3Pe2S?ONN!Y'Kfcyv=)^+Jckzi͎e]{ƑjŲ˚ֶS$pm㴸x6:L`Y5xZko`n#pO\eUM&0\ & $fKpf/;g ժSwjfS /b\ H.F|r}X3yϙ(f%vj(vBya\( NG Ojd n ,jrq{N" G`*/9Ƃ) ] _E ̺pW. vGHqG hcɑ`cW.PSW=q>p^#bؿ [6,dF;+RJ3Z{B%~eH::+svn_ƸFp>,6-z RڑxNpi\Wڶ솖qd9;ZJDaN{k": Özf^`9G+i:ѦگITQgXAmʄ¶; 9tf7̔mK n͕OmQxj]oVTzJ}Sj1z9%XT0)q|eΣ_7{ sh/'.pq)|f|i|R %eߡU dgC 7}X7>gT/QMRT,N0Lgxqrp;Xd~K0W9aw30N{ґ8>$C}+LUX<Ϗ7D˸cθLhf>9=Q γ3{ 'TjzOAe=IIx7v.?zyı>BӾv/Ǟ&$B*ާ,P5]t}YJXCPK./PKE9@.java/util/concurrent/CopyOnWriteArraySet.classMO@uLiZHqHQDU$ qWt)&TC@TxmBngvgfyw=p8 ~ͽ U&Zx=u5:jiDWk> SxFTnSRy}% Dܖ4Rko^P,| cq\>N,*' k!N0\4zySSڧ~Pk#=E"4R~z?,rİޟnK٧\?d`C̽MJ]눲1ԋ .ĥ6 #c5bX:#I nPױaS]y,S)[ fʼn)HP\V:zõ*^̱ED⥴=K *r1CG'4;4.ӘpW-,(b^/-v&]*u4hnZy,X}{1K_ϑ\͢99)3ܴ+rC.)(?bWVC*TbmrP?Wn=盳8!dcͺPKHPKE9@%java/util/concurrent/DelayQueue.classU[SF>+ZB@IMqҚ L_PGuzv%72}j;߷粻_@"9VߩE[E44DzaҖzP I`ٖ0 OZvGG`]!Pr MIG!_ɐ+vttNUWZhqmVCtM&3;.?o_r,G[ 2.jQMӏ v,$+N-#&:l6KfM`!$jZngk\k<fk6!,~k6T۴0J˲ͣܜeZCՈxn/SüH]/1p)=aEeqH<&7?*{bz6KY `!q|K55#i9m6R&b1qY8)'"j[t :POmƫc(`dXLɄd"m(HxHE#U'8H0Vv agf{Fw $Dvg N;)t4P( Y*t\ЫAYO_hߍ\̸}|lu$$}ٯ֊VW^|uvBW!'"D$`Jޥ%4L cpecrCt.aZtVXo㘥1.OܠCM8W=GMOLIb0c Ψ_~ʦP3;F섙2l3JÔAw`s~mxPK%PKE9@"java/util/concurrent/Delayed.class;o>#^v&FIJDҒҢԼ}ԜvFļt}v6Fs~nAbQbRN*#Gzj X3#VC2sSC2K5KS2Ay12pg%<|]a6lmg t:#3=v Lr1piPKHj'PKE9@$java/util/concurrent/Exchanger.classR]OA=VU[>BbLMj&Jy_Q.gd?a%"ls9<{` .RsʫFZv~R"՟ !؜.;skB.t&8;!)L C(4e P-f{ݶc%a:4\~{l1j +bK|ZeEq2 .]=. P*iqzιpf3s?Md䇱 SJBԋUW2T-8j.wR!j^$ayr xL_B8 y4Z:kT Vhh&]kavNuf iFik+8Si\wi8rioQ]ʧ(zSHg68P#Nv&F٬IJDҒҢԼ}׊Ғ"vFļt}FTTFq tPi^^bRNf#Wp~iQr[fP/D=j6FFf`Zb1I&PK|(ȆPKE9@4java/util/concurrent/ExecutorCompletionService.class]S@ HEh)E/ *olΈ03Nvp!M:!a_3^Q')I:rٳy?~3 v]Ge2u׶锷.:iwes\\EaD14yuGRlH0Sc/ջ+ ̦uij!b+y0;4(X58cXs^cIP~i_#zШ(vZZ_~*.wL865ǵI lW_kF[gXE(M ܶ VZO =.Kv ZNq% ݺy۫9wpv? ^R9M_IqZ Eٳ33'e?cW_p`o2AЛGo2\q.4\Fd $H vMccFB6܁.\I*=@ ևM[C^mPK"O2PKE9@$java/util/concurrent/Executors.classV[S@>[ZP(%H*:[ RĄI Jr<نI}69g7oX7=!0sRVPdAWU*kٽK*蚢zxxrN@K"Q\f.vI7aJbU5]Em8rE+,2=пP0-*WEٜ*/}o=}5ﶔ+oy/!l~Y3sW[@0]SVE*{uQUZ4QClsG.s*#B{{0"CoMvC%܎ =uI++)ǩ#23Zi*D_"%E_ #.vmNiZ| { MTغ1+NZ \1]G u4XGwi lwk1_ _Z^/l &J7ਆ%7_BvXu1˨q*Vu`p5 }TRcѷlۈ(q?t-5_ #K t_4b!H g !=^|Xub'KERXǙ ȉ%Fσ=,2%B}l%ZB&יUM3SDr7mJ.Sng>ȡYcXwVaEt fîPK[4=PKE9@%java/util/concurrent/FutureTask.classT[S@=^¥-~⍖8*ѱ>t%e?OG9~لNd|v?v!1_jڶJZmܰGe־3PE5.ϯfɈ2,n-؆WKnRJNs[3C~a.TbI2@b1Rn97a4_JI5u[ [za1ń AoUsa<(7툴UÐhVvsM6KE!D3Ò?P+SzK 绰1BE TC2A9K10zA.E) _4~cU&cayoX4} k %%\U(Nf& 9V;nVjw ;hdk /LnFO&A_9W/RT.J` I'K?Bj?ҝ;\?-k_ -,'B?2 $ `D6~!^B1JFh\pxQ@a\##AT.*☤5Gt*uu Ń0K1ёxIH-~痈c !u'ZNRw#H'Vb^2[$b%%sf?Z'6~)< „ neӈ#M -l{>c;=pM{{j\=5SZa_3#t^( rac!#!#=s 8fC.mMp &O5ũøI3\CC|2!> pYqhOs츅7xFk,5TY1 >-XMP ɏd<|E o q3Xxl35g|>J &JG\Pջk|ԢSUnRU#`6q/.Sx;]Ӝq1:r9!~ͣFvlme;}!۹}Vr;޸oG\܍@E@U>ˡ7_ Z#db,;"!%,rme,^FbY0t4Ղ0a!\5wA}.?FGo݉Un&aH7#}+ȑ `0jSAзыmo K=O\PKmPKE9@.java/util/concurrent/LinkedBlockingQueue.class[S@Ϧ)"r E( x )vtƒK.$4a>9xMCK7m|^o;o؄\$ʹzlUSkiRJ^彪U~vhSF@&0q[[Y72#uDMVٵZ&O/tfe 9giBpw J`7E%je#CS'*pNV',=X@]KVY8i&;&2 SkƬ+8QgflGmj-s.*9N'2[ySai17 !bK '~(: 6> c;63#7ʽVr+qO$%nq_ zYx8꣋Bnqb-H8y8 Gęxqzԝy%N̺I[ɖK,cOS)h%D+ +d'LXH$q[w!SN#3#?4gk>D녗YֽhmUD| ;byn_ӹ tRATdxH|pehjtvWbKw]սPKPd/ PKE9@0java/util/concurrent/PriorityBlockingQueue.class[S@Ϧ)Պ")o( h8㄰JI:i⨟}r?d]&iKs;́~%NB`{.+M2=ǡ0am0G=Au }.uQbߌZ. 4(2Zna4$r'\4fu|e=;i TݏB`n'~jF9t{US5gpn :lاe1\)~wٱe<׮. i%@`HkJtmqp[g7SNH2Z.* ?uڳ[$G'"G[d#uxKurTdiHI5.Q>:x_Juy Y;\4t=A;~Ch$rv;BS?.y׎Hq K˔qR2֖bҲߍJ pV.=NfsxXF4c \t;'N l8!<V7>|wm1gL6t,$ t.I\>;ah A$E7KO/\ ]Yuxa\{O%JeB_@A\+0x.~:* (Fk:ʡo[ejLdDc~'`R8jUC!?8uPPdͦaFj^oDJ{`]슌] Į} 4h7AP]cY)smYyX6֭Z1i5m9d(gsfA T,H+pZ=ɾߦnb94Gck\*=dWPȻ,ua8jYskF[g>^|"1$|"@d6HO,f ɘZ[`۵s*O3PKDc> PKE9@5java/util/concurrent/RejectedExecutionException.classPMO@}[ ((_/ 9Xf0^@%ek[L<Q٥Ah{yzp<,g-<'Dcq?4 ew']a3RɉӋe$|=g ){Lr`w1/ "1\!c<q5Fg(CO }Ov4 - c)!'mcekncLUZg+ᤑ,XA'J Ǧ~bneF9|+ sY @y&$[Vj !몄C3Dx*S32+2տ_5PK1u8LPKE9@3java/util/concurrent/RejectedExecutionHandler.classuN; @5Q+=`F(Q7&,dųYx%&ZS< aZʳ*P(J\8_^X?k]6ahib5:}qi}coɁY ̈́ѿQ&2$Zh@†!oPKGtyPKE9@)java/util/concurrent/RunnableFuture.class;o>#^v&FIJDҒҢԼҼĤTҒҢTvFœļt}v6F!(L;#4Vc!12p%e9¨t22pg%BلY[om)v؄YYL `LPKf4PKE9@2java/util/concurrent/RunnableScheduledFuture.classP 1`x`bi%(\asA#!bY~Ol6\o .ޞgb!=)f*F)g;é.dCR=gHAX|Q4K/]FLK'(1ʨ=!99 -8 fd:MQ*;dCrL$ 1p lW}=!S/%O1&p ~ZJ:\D=7+|xN! y,i<,P=Z)?|N׋? Gx軽U8"ОL|Q*^Wq_ܝj[@A D }߽Rr)HX2k٤nbcAàA5hxkF7ƦΫOPKuj0PKE9@*java/util/concurrent/ScheduledFuture.class;o>#^v&FIJDҒҢԼԔҜҒҢTvFʜļt}v6F]Rs+SS8_Zꖙ䈠٫Qafk;L!|! &$7Ff&Vv`b\ `PKAퟲJPKE9@6java/util/concurrent/ScheduledThreadPoolExecutor.classW[S@>Vn(EQ P2"eѐBH4A>M $--t͞}6oBv)bLȺ&[A53TTu]WlQ !#^^5&JSl8`2%P34f.i, m \mZh$%Hy+{/?QuyiŊ$cLy Ke;ӵgԈx֘F[;HI;*fԼ˒ Ðe9Qo @2X8QE`@BWa?eç1$y:*hT06*iȆi\?xgUc2-G+3'PdMsE!)|*_06ۇ@;Jm?vUǰےגZEeGi V</j撮L!MfLW7OnId2LGL ]קTxz圄l{Sާ^'u|scvdW@\?[ƟйTZ */+*xxȹ"mK B~̊ EvUB-EUet]5X5b' CW:^kz=1Ʊ`'4yXV-nAw79Zc Z@NVhC^n)p;N7c nJ."ЃOzR` |1XQw ~X dGs-x}y:}yOZ;G ܅vB{\ ~;V.TfwSxv{zb Yse;b"9dh'][U/ͮ'i1t"KOٌƝbg*`?,wQ[i !.A,C x$PKpPKE9@$java/util/concurrent/Semaphore.classT[O0>~Z@ڤ 6!& s4=M~~Դc' rα~C80 pChޗ۞kB0W/X.'RVa S2/`B@C%s^f2 <:WpSJϧy;* ^p1tk&\bWJ  \Ʉo%D !˛yٹǶ ;*ϏLԹl?[Qp'ܪ!\LY-%zmF{,W]*}C Rkfb;ҼqF 0 Xŷ 0sm>Iq4H[ u y`bՍdθ:Ѿ)&,օO/1Mw?hػ 2?qbVA|Oa=QdBSmLN,582$AIp5Q(.;ePVIuHI f1L'ga.kd|oӘn17".31X9L"LV+m sޫ=[z̅ج_&ob6m$#콜muQJl, nDFVǟV /N5855a՚u8Y*ay9k0WPKnPKE9@+java/util/concurrent/SynchronousQueue.classU[S@>ޠȥ-\R ^h-"3ŎBIFM>3>Q'4mKv߷;g7 ¥rli)U4n zaaWlj $CJTTu s'3Rj2EcwJICO9![P~3LgV@@N4 x%Пg:`_Yt Uюdõk ZB`)+4x#m"S.6D2:V?: l +Vd3|UiIS(9iezAA&U6]1LޙN)$O2XbؒPo,m)q8053}̺wi WO!Z0lSsbe!!PemjE/LZcR' Be\Hp -8 `@}x 86Xpt]8J9\9ڈ8#=s 8'@ |kBաKq7&x x8'yfg6^ ,yO8c֭D71& AԚsZ#mZꠖ8IZF[WO]Uxq3.cU53'ec>qߘ{ 'vٚ:zE/ीg^c9[V_"8]?PK HR_ PKE9@(java/util/concurrent/ThreadFactory.class;o>#Nv&FIJDҒҢԼJvFļt}FμrBF ҼĤTkM$AJkFҢT̜TF!@@h1+$8PKɕɑPKE9@9java/util/concurrent/ThreadPoolExecutor$AbortPolicy.classRJ1=jAA ^QZ|n GۂRP$dN23L&=,;HIQ7ڏ:tVVݘYQhکglX7_d 1޽[2N2RV -!w !sfZ24 p0B(֔ѣ'mSx$k*AutS%l 'qI7O uВ//TߔXPZڳ@t:`>d د*axfäI؎e$I681ζMaPꑏyc_?q&!t=b*c*]rNlœ90 PK 2x%jPKE9@>java/util/concurrent/ThreadPoolExecutor$CallerRunsPolicy.classRMK1}֮]Ċ EQ(**m@v$xmA$3|=d+8R b礉}m>}AYZKwjx&Sj= 'ly#1*k΅i3%!=!װmYDc%x%%ݝhiIn@{TsQG[`ZM6IYiK]v) [@턊P0Fa(C!snǃUɰ,gMG6P|M%Ըq^&Pfꃏd Wz>0Mc&@1Lj SdSŴ*PPKjPKE9@Ajava/util/concurrent/ThreadPoolExecutor$DiscardOldestPolicy.classRJ1=֮jm U_ PTT|OwFbݢGۂ}(9̜3d>?`Cxm'~`M8'M>8)+kɳ غc…:Q|e ^<c޿l= P$li ;ʚ3aB- յ;BȆ<0H4SK[ҒPk@;Tz: {t TW?^'Ƥjd]"D k}KJ76q8k.-fy-w0 #]|M\Ȉ`jgq~SL0#Ɍ9iRvaPK oPKE9@;java/util/concurrent/ThreadPoolExecutor$DiscardPolicy.classR]KA=WMLx0Ҡ}\favWgGEwW!2g{Ν;s??cBp=armNhԁ}1Ro==NxfL0sb!EЏM+B=R))O_ v!V1!Y>Ru-Hb* BCiy>-WJ 0*:|a_E3|Eic3:UD-'.anP?G-Iyq䅊^IrWZKSwK as:sxM$[fd3q86;ȳ0#  d&r?8 Ff8&晑B\c62VPK=8lPKE9@-java/util/concurrent/ThreadPoolExecutor.classW[SG>MxAEp]A$bgg6=3S_OHb^RTNzNsק 0'!F`xOW'\G7&4\ƨLl2XtH5ױXƤΙ-a]7(5JԼn˭3 廆͝.uiz9 }Ta';3eZyM h#ФpsǪn5E&&еji\e:qgW Pl9!*FBˊ7N|Ȗ=iQD%[u8<02u2Ӭ嚞As* t7UUebQ0hyHi1c W"uaܪvTzB؊,3Q.+o|$7P? *vAG6DҖkXs[}j][XSm].]LqxA V1 /BJ Qtxт\VXv}YĕN:"\'^ᶤb*S`A~IپukNoUǔ` [6,itYR}_{>ge ն)m#~.f,W5~k, :Qa[)ÍezS 騀t[SY]X`yG2`{.6;C8J)Ag1HA3>mybOhy&hShwg)tt(&FgG$J@//1BN>њ "2(<"tt1 Rtɧ4(( Ju P!+%!l%2y+V BEABX 0 WJ`3C^ol  \7_0FX k8qgSRѪM|1SFE0z7Е@f} XB-f9'\F>p'rޖF> ҫ!hHxyAs;K@<ϫZg\ l=~}|^Ad! 0{S]o߅\eIAA O}_:[W<>sY"4PKPKE9@%java/util/concurrent/TimeUnit$1.class}J@iӦjz RBQ(D/Ү$$IPdA0|_.gD8z}7Ke 2Jݩģio"k a4ҝZ`|:#Xx!QG?[;gT!BOy(-/pkߋdB8Yo"BI@s UA'{>VJQ'H` U⨠w+X^;j1d)vqV94e' A$RgXEA-!+- =FY7<A<. Xp鯜3ϣLbJBÏND}YtJ ǫnPQL(y[e,hx8lա2"Me?k`G%t +}zEl2.>U936a跹d ?l,`R pkǑPK_Q0PKE9@%java/util/concurrent/TimeUnit$4.class}J1c\[U{RTZpABa{ md7 ]$x|(q6V L&|M>>c5x^ bdHzcV p"kB[4zR7<A<. Xp鯜Eu_iyESibJBÏNQ}Yt҅JǫnPeQL(s;3[[j?Y7:z'E<#TZK3EȤ _kE^%[vKlZTjش:GF%[hiecۖj`];,>PK0f1PKE9@%java/util/concurrent/TimeUnit$5.class}MK1߱jEQj^*R( Kk6,$xIAL2y||^kG$he8Õt8_۾EC(K3gEU9=#J 2i /E0ˢ.TB8^mlu{, g(b_ުRr ~%;.:Zƃ@$LG` U(2.az崳ObwǐMŧ*gPÆԱtt87m.BO#--lmw82PK.?2PKE9@#java/util/concurrent/TimeUnit.classTkSV=c$ %!JBb .(bb!lDm2SEHgZ34ϝNP=#C{ݻݿ $ ]G>wxʶRy1,w| hddt`|gV4'~#v!ݦHy+TWǪK֜XI Uy=5QoSԗ j ("xG M>Ok4~^uL`!6C0tO$tze!J>!rX46-""a{"#aOa3"$ cؤ æa"%LU`h灰9 M\[q MHg %n̞Bh9:p\f@ oDw10_e &oiq욶`>o?vt5!z69t =*g7 GFʽԨ*IUް9D2S}f2JZyy ݲ+^ՠBI)1<) -4Yi莣cb↱+\1~kK#aQL,S{1\įf\nZ[ۓ9%Fxeu)GSQTݼC&j^ 8%e&,p>:1D;^\n )Reė/})s·R]A#2M*AmethJWc Eѧ)x\Ɛ 70Rhc2.𬈉24eF,a25ex" hSzT-\cUk*`TՄ&TM,`NZB-bʩ+O(h0M|@f‹-xfT/^1ads& =]/x×)![ Cz >k_b{߀Bo5Yq5Ñ6ջ2!.-ydr?{F9naj]b/,١+ }Ɨ o up pc&h{Z X^F>i|BkYu^#|oIa#pص8:!~qCt2oʜgo겞f1~&_[#X}/|9_PKpf%Ȏw PKE9@+java/util/concurrent/TimeoutException.classO=O0oS 1>cgKn~ȯ.C66ZxA":0 f=vFb J@I[8˼{+AcQaN>PKPKIG@java/util/concurrent/atomic/PKPKE9@/java/util/concurrent/atomic/AtomicBoolean.classNPB4KK]S$P+E*jA,;1GpAgb BQ sgƏO6 Gh+uzn(D;*u(E@4N3$J*dDnD;wd7},c#n-L1ԁS8Br. ͡GƢoy% @w.D,Lź7+xyR.rҖ)/S^Kq~Xnnȟʬjtv,wcO+w( ے)~8Jր`'x}=qՈkY)~2j1{f:Vo0 c){c,#9Jf,mn4HBs19ܶ *gv|$[gz{>C|?b!.:?E & PK!0+PKE9@/java/util/concurrent/atomic/AtomicInteger.classS[o0>Noe2D $BT*^bHm%C7qOH<Q'ͺ,<|> a 4wÒ] Ϡqd ["?¬PpCDFrx#yh -bE\ 5i,)fzM#-(jvuDK%k3pm[܀ds5Vk _f[̝ P};Oe`6S}ߌZ&l6l%Z=22jvPKװ^IPKE9@4java/util/concurrent/atomic/AtomicIntegerArray.class]o06֭^g[@B UpQ v&V&K WH\Qc'F;w>cſ~ p߂G:D10f#&zBS UM@Ñ~xļ@]0i0`g$ ȣ>Eb1>vW+O!@\R8L}oX,Gh @&ncgys덑L8}ܚį 7VV@NKo,ŇR0ioߕA4{ 6foGdW¿p,cΥw|às8 7p\N6`{= 9h'[ {i/IyǻcJ+u_C J^T"Z/2V(c\%k J;j# {xXè|ӵ1F˓VJ1xV.so^IQ%f1 x7A}]MⱏwƯ8[lt!{vPK__=PKE9@,java/util/concurrent/atomic/AtomicLong.classSn@$m꒾_I_8€!VE"6AYC:ko!VH,> q=vΜ3w<~  mt.A=gM-C \3Eur1S_s(>{V@رXrPB fԺ\PUX:&Upy_л|>Aޑ{Pey.B3|O]p/ zz9.bOhOmI@Po 8(*Ho[ l 3\L9#PGxeh}w=wMvʃ-t\ o,`;Qŕ`,~7(Pű([0c5L9a .KL4G20'Q %PbE 5GSrKRV̖q FjGTG-Q▬z95\Ienf oB|I0WSlep)odZ{k շSoj7u_k>C$XIlD `{'>k22ruPKc4,MPKE9@1java/util/concurrent/atomic/AtomicLongArray.classKo@gm&!%M_ -CHDEXQ9@O{nql:Eg'$|>bvX%=xgvjhvNG1m7 Q ikEli0O[`(8<~NhvZhC@eL@opv0Y.i.)p߽vFH@y#@z^;ްX$:NIja-Sn8H#%=QbbzhcqD4_H'"i<ƒ Ӌ^G0} cy8~*O~Sw" k@\%4aTZp"A+:Ljb`n:`40yUIK1DwcN28Z*Ex (K'h󒶝V30 k)1F+U.\on9 ZRE JTSm*(ZQwR "2/ "dH&.Ka_(7$Ъ̗QWR77VoPKXA{PKE9@8java/util/concurrent/atomic/AtomicLongFieldUpdater.classUmoP~n`&n2œW:h"l/w vv)eO&Kid&{z<)DUC-櫮Y8ubx\_Y!yv܅}rb^(hf1 2^*TŲ dCI{ "0kc IQ\;iE̤) O4ąiRKT&I#ҐaqZ)lұuBK'JYrHc6tV{®pic6o =YN;8) 1/07TVrfGԒ;nd$jn3Ğ%G;3ZǦDeZ0A;Kʴ3ڧ6a+$h*U\u@J$ialr${tyL)J`J+u_CJ4흨dFePt1C* ֔7di#? {xXè|iZVJ1xV&5F3cT:pV!,r!}AU62Ǜ;LPq !7{{C4l)k;PKwP9gCaD63\?`vR!읰3Vvb5<۪NY_wOA!'U^uN#$c5YMņs?8B[*2*5L>EϤI>.P= "܆;JT.ĩD!';ռ&SZέV9ӵfsGU~ ۃ0PKH/iPKE9@1java/util/concurrent/atomic/AtomicReference.classKo@gҸіgy =(RTSismnǮ\LāBN۩DSS~I \{ ,xci[]rD`:dTz7<vCAҳ—ܑW|tea1=X 7ʠCjOd<bpT}9%~Š׺<.#>:V3{[b_\L|կ_nR%8 ab{3{ GT9r^HIT"^lI3f#~uIՙseO܋wQ{os51JA=xFuk?ZdgsOA+.2PF-XA[&MXE_E Jn 4U=ĨvldӄPVjcsfDg <3`6"&N7g>'85a0,°1y+@';PK+ 6PKE9@6java/util/concurrent/atomic/AtomicReferenceArray.classSQoP>eT9Ѝm:릮ȋH$]YgiIWfoAL|ve@9%iceS陆^`5ץCb"ˢvW9g@@NdI-v,F ^1mӫiC%A)P E@RôٛAc?qjQ$0杙Jy1EN@M\9>*W]ڍɾyeٵ7p^4Ejiy4> 9!HORFhvLG㹀%vi7SdzBX^ E͉ͩ[zgm $5KϮ5.EZ9z1Z܉W\-@[?OpMkƅoq1@X4e`ﳸO ayD`(Z(.o{^! +%;Y(s~6C&fx \ ʔȗ ]ja'd(ߋEY5f;^ 1;Y ؝L!*vfa 8)ZLԫ0z: y5lsTR2"'J+_TԉBf·rV;r2zm]S4=&%y/2C#qi;信"޳B\eWpS >iPAe5 п7~[VeOB|T*jnaMnm1/&ZUFݝF YcTIJ x,ˇX6qXe,U4 f 2-?ֳPPKY8XlPKE9@8java/util/concurrent/atomic/AtomicStampedReference.class[oQRj)R[.Ub_iblB411[al5|'~(PmbM܇so.P  jGWTsA K8=diֱ꛸3q)p$޽ӢG<{^%]P*JnZ=|Jdw*I(lt%9%1(ډA̡wT!Nc[ r-8⩫mb`OF 69nm}W4ٗ|JϤI>7ЮH=$2 mRoPˤ>QSwuJ+ֹտԪ~)m[;5~gz,6~1>~^PKRFgPKIG@java/util/concurrent/locks/PKPKE9@<java/util/concurrent/locks/AbstractOwnableSynchronizer.classK0_n9ݜQoAADO&Y2k i:uQK[T揃}>G{E`BO|K*ť]'ihEJF/XR̸r!P؈ʑ 'iLJH K|,'Nw@96,U@H~ބ\]D#_a𿾏G\߱(MĔc+Ny|H~pSv?dT1~!4c`gplp[-m=ATq/g,^`jh=joEH i} ̘@K63_9yxc;PKלXPKE9@Ojava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject.classkOAiKkK&RHbJ5)6So\fߤ~0&~gj[hi;sgs)X P8'"`lNAuǾ\81gv ٓGbJϾ''ܥVraGI1vr(Pf'K)c#YO` Cz}a$ڍTݪQ)RQ_3(0$Ϗ\+$a,mal;M)ZUKYmxY3qO$\\NRÞQ&b˦u]Kzﲾ!^PJ6#Ek\ԑ2y \YWD&# [0 ka+a z=%2śZ\.*+Ӫ>SPK2Z!PKE9@?java/util/concurrent/locks/AbstractQueuedLongSynchronizer.classUmsDޓ81I'n(ICJ0 z*')!M0?Űzl+t‡{"pӏoRբ̈y=*Ac/֛?F9m:mlV meOX˞dr\T RL uͻ:cA6gexĥ GCwe<+x?bF7etemt(Gy+[uKE5&_$~{|C\tK<է17eGm$p0{[DgtyaҾ>bEn?g}$ޗ5C *{RmVS󒙌Yѕ-8?X1R>[ Łчږ+uvĽ6`^بLMj sK&󨫀5՛h͢sP_i߹;+E( ;rHч!{+e\ ,OE{y2g)dWP\[p>|\sC 9O-nM>}+>z2c3/%*V ?ODa1L*P]Mds e̩Wb{ w$>t F;xϿRp?ҿ1uN. 6SV܆5؜[o%FN=6#j3d {d#p,G0\j8v&ra?}NK*|AƣTp!8ShS>սm$2ԭ6Q 9ڷ> WPK&WqPKE9@Kjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject.classmOA֖ۖ*-'- L 4Sw]<Ϥ0&[ -4i?3{퟿~x ;窾s l嶊rWUQ*+:J^7GbHU9WR*\Am-G_~Ez%bC*o2t1/(b1 vK%'E,#N 1NJs)K!zˋ`a![=Eʉa6^ā<T{]*?۫M;D#i+2 e26rkEz0ؠWFAH- =ř*ӆ]T僊+x$d mǶtT"E _u5 7mKYco,+' 3԰iI6ٲi+8Unͽ]ԧ0w=OP'WV*t#. f@"`cK^yV+167~"V 3L>@>0A ј0k!5yj/֌l@x %B::1d)!m1lf?)L뷔|fZkd1ѯMa2Eh&e76Y`ZQCO_Xe53R K9c5m"X\ɶujy._Z3PKpi PKE9@;java/util/concurrent/locks/AbstractQueuedSynchronizer.classV]sF(qp'Z )_Nq$nN=0ᥳvbEWRhM}h:ӇN/E&}V{sϽwwo rsl d/;WkzCf7Ֆ́I`+AN(j,w &9uGE`b +-"`V]a >LsL kQEGFosvQ뗀KEUi%GT 5ՄϤ j1rד]'OM% \ =`~ç>j/joBq.N#-K}Ũ,%s=-A@e:m&"hh8ڱDo&c=g;4e-L5僌Ok+l2}|)WgE`.EOg&uXc7=1զLjWcq΢1`1+`gpVƑ8'=0 s0O$\p1\1`m&F}Bv1]Ksc$Y.'-qSs,]#P__◁Uiۢf]Zfcet$)ۉk y"R")T/'2:JCsJW'1v 5-Dj.RwУ wS1Zb&DKMH&}#1<~i !)R9 /86Gr~mL c;%a=D'=p}o9R=J=άnL.HG3|PKZSPKE9@*java/util/concurrent/locks/Condition.classmP=O0}W҄(vf!Yʄ P6׵*cWS1QKUxݽ{>>aE8*M&UQ(3c:;^;! v݌JzB[< q-I T_F~֫f^$~_;N?8}`fȵ$IA1eGuAZ#?g«-, nwy|B m\և^ m\G\$^A6la+OgB PK 1PKE9@%java/util/concurrent/locks/Lock.class}=N1߄e,衠4XMZnXȱ\p(8EBߌ{:YԈYW6\ d2%V odlPǠ'fA(O_b@IђjBU'NVհg8+DѮP^k(Untr:r] f]l|"~PKdPKE9@,java/util/concurrent/locks/LockSupport.classKO@𔇊1ƪ+ M\ P&R-ZL\Q;DIm6L;'clby/ ǵl߳C)Xo?Mx CEk]=X7Ga +)FRaӋB]̅? =@;>piJs騹Y̼pyj̩6!ajCA'ҾR:vЈEő=:/\Mq'&wxNpVDke41O6ȡD$;5ZCiKGEev,m)ЛEyӗ7^Ո9szet@yZE%͖1o{5 |4N^ɡm`Q,̀8\6 qSWȂ:JnfדW]EK\ivQx}lCljPKfPKE9@.java/util/concurrent/locks/ReadWriteLock.class;o>#.v&FIJDҒҢԼbĔ̒T A:'1/]?)+5 AYCq E֌ 0#KS2sRPL@Y@`@8'PKSx̖PKE9@.java/util/concurrent/locks/ReentrantLock.classT[S@>j~S@xǎ 0qiÆ>9?x CvO~ 6U$z*tlcۊn?YŹr4$ h]tNvR.3cj2Ug_ԒNI` KJ 8w$)dhp? ]!]ds.Jc-9C#u#K,P U_ E>E=,4L @kH`=l(cx1sY?Q| fSگ-Xjs$p2PD_PKj  PKE9@@java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock.classSn@=qBzC[h !A***R[Yw6v|G!fR9;sf!<:'ObAc?Omh4*MoX. :ADI*Q"TE+.F Җ*~Lx5.^;$Q[Q P%<o*-w4CDx(FbFu[_+SgaG S%&ciL.VP~!Dbr)yF*s=6a0jA)E%;RSV9k"{ )R,a{H'G^^dSrȕ~V/bʱҟqXk]5MG麁kf/PKոPKE9@Ajava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock.classSn@=1 wiBZpJE(HH("H9.ox(؎LBx윳gf?~~ h jp'P).o>'[Y2Zw(ZtQeہIQ&M#LՕdO39c {YK+QN}hz &Ÿ:Q~PK{Y:PKE9@7java/util/concurrent/locks/ReentrantReadWriteLock.classT[OA>--mD rq,B ޖv^ |M|gn ;9ߜ~%xz*4hE4n+Qd)GצGT-̦G!L !`ËKZ!0$PT}U/4^r0u"Lgv@HNA1 jp~)ک1qvY B|.b_rNLkX.?Fz|tC T/ă`3҈򆦡БuvL#m9B^8/P-Qb-˓zohvupM)4vmiyC/1Q W`3WI7^N^-Tr1VftO$h  5.tG`Y*Æg!k Ow ;vwDV-'3X8, xl8f34:^Z$wլ.G`&HQ|Gp#pLp`Lj0A7$r8K8`zC? "Nqst]ˑG0ڈ }k@ nLbexCƗY s> wP/EH9/]{ȅ'ʼnOWmrlJ|GƮ $2,Obod/8'}mI<諾:@";@"u H|.\uD%Yl%mxs W9]PK;> PKIG@java/util/jar/PKPKE9@#java/util/jar/Attributes$Name.class}S[S@Ko,] "EDA$iiBG:i`Rfz?Iv f99Oxs{]pym{^ΥC"tZRmtbXVا c3pdښie!}̚nZbM -Tt4ˆVXo*Cǥ C~LqUXQZ5]HQ1f}CIK?1VYSި9um 9h4=ḓUԫOn j#,qdz*nTKx $0QT¿-g tTa9/R4M ,'<;YUw=*i ǎ/lq$9v}9c]tPG=O6t qߓ!*s<ȥn|+ ׻Xg}z%hHD!6)AR~~VHKҁ*ۥʢ>(0@' qK1&h!U+ )#*]e|$Mo9_o;`1D; +焫COv ?ڣl:i5=IϐɗSJzb-W"L$08RhYTYz4 uk 0[]ިr%M.Fl1{.㞫m骫?9BnP ɺ0@ 9_"d>bgH[oLВPZ^K[zpᶄ(ێK痋)˭Ⱥ'Vzc?iG`[&50F٨cT"B/n?,1q TH433gn 'rCq29"Te-q*aO]%:jH a/}X7\'PKOPKE9@ java/util/jar/JarException.classuNN@ } Bi 0p  PRԁNUH#ńQ%B T~{??`؝UI+#|NtQR/T;*~x2*ZÃ-vF Ѝ)7T[5M@?N!7C|'x/#aͧ*qi(Յ2v?V I3 ar'c +8n8N-`\g|-3o9N-h̶b9}PKBܥPKE9@java/util/jar/JarFile.classn@u\H9qJ(Q$  n ҍAƎ>U{U}>T5J%vf?pRC_qU9q7RʑJ15*ZnϚ͐k;}It:twb+ ; ]yQkV)QeKGz' [$\0$/=1$Xg؞*jftQ$$HQpO Qhms5L>AR}cl}rh:/o6LR%~|6ƐYиąCr⵾lǿ.W{WZpwiQX6O4phQAq;{ ¼t#i5ݞdJ`)A Fg<P!VNR$o dAg~bVo+=@&P M.1"R$1"DTV{TwC&EHvFK?le}AݒN;Mv;ٍIln' <5@I>>Gij2N Oު Y?lgx0}WPKȠh1SPKE9@"java/util/jar/JarInputStream.class}NAEo :( ;4QjH4 v fte΢NUu>rQXܣUys) %Kш"ӣ*Ҫp޵6C)'ꉞ-?~qT D,ki6H ]غ.yF7(cI,c;Fx^Qc}:Q_(Mj*JiCXl MOL.:=M-cԟL!杰:m%=\2Q8Gz3G hY%wSX*+ngGa4Ѳ Y:)(W2=:={R$y|ڛCFwl4`s:uPBK1.WrϒCttc'vH2:5#N-m1ݛ Q"T#W=={g&rkao:NעUX̑ 9gѺOÑ8FZwMXF'`ؖaWkycÊʴ*g5ǂ43JlUP~&-yHIh}8y%trA ~hߋ u'1Qb@b:u"=6ڝ?A/m5'~/L'@!3)& 7nj/m.T6} A7U PK4_!dPKE9@java/util/jar/Pack200.classPMO@}GK _1J<K) QR7X-d2ζŃAü7o>v??ti"P'L"9c8ܽ&r qu\ ,%D ;Vf^2z`(瓇#] x u%~?O58JF' fkPDe6hs4!C},^RoS@)=SJ=M2l{(&P]Ж< M2E{1wH:̀ҿ}FKwu5_-ݸN`)Wc*E5 k PK'_<UPKIG@java/util/logging/PKPKE9@&java/util/logging/ConsoleHandler.classNn@cC X AB)4 Nq'6EDk&Ȯ4;#v0[GeґILM9X-hxj:)+ , nd2juT2;ۯ[خ^ r8zVXpn33[܏.8"n0 T>Ψx)!dc /_(T;PKY< \>PKE9@$java/util/logging/ErrorManager.class}QkKA=Mj[o5 a.$1~IȺ[ƍTTIAEys{8v#kq'JTE(T+Z'DĢ'u”͉kM JXo #Nv&FIJDҒ̼t}̜"vFlN"P?)+5+01)'AAS?P:(59(Z3 >8(9h(P=7l=&6FFf`Zb1I&PKjGPKE9@!java/util/logging/Formatter.classQMO@} * !`U!ܗ%Mғ?85 of{ُϷw8ahM; %'|_ӋWJ6,]p*܏S +Ju͐mwF M4d]Dy+CqE<@0TR拉]3B `8ot (t;jҁHRB9g+%/I3pp5DyePD=wQSͶAۅrV ۄLgO^B tM:IQ!LI1\KnI5Q0=Tq 5jԍF MPKiQPKE9@java/util/logging/Handler.classTMSA}! " _!QP(~ay*j(oZvSAOVy,{fIvf{=~ `ϳHNsͦ5o, E0ӮSa/ #1!oF0Gɚw+5߶cK:j/Oخ08m'Uy%^3?17)971|:g:VMF,v?K>.Tiļed`69odαbsȜxs\R|kJF14s.L[F^Aik36dG5W /PHEKsU=k(u׫ @@--QvDiĎ$ՁĞPOSPKAPKE9@java/util/logging/Level.classR[OZAVH+Z*j՚5GhmФQMgwObG+dfgfv~FϝSx-NGv;eK C!/]ֹh{1D:*{KǕWN CbYw1Dkv!\' u+lRjWjTT(8i)-nWmۮJr &{gb ʛ5^#a91-pp-qocx[H"0iɮ-?5LY6z:`to+[gj@O9 HQ'yI0tJVa`UBvii8 j/](QIȐWA-3Wx\v8/VǽbH4tTK-E2=D:oSԘqG㸏>NԨSH#:IBYgߑ&˒͓͐͒-V־QoH\JgI~N3ackTfr (eÀHJײQͼM6tĖmb(_a.-X2 *objܗ TY# E̥ͭ@0)З(kTSS5j;_PK#qvxPKE9@"java/util/logging/LogManager.classS[OA>SJ r[. JHb!2ݎ`O>蓉Җveg}g!E`P×n]m}Jj341S|9^3K4ώO*Ǘߖ+2 <\Ǔԑ$`%|-o\dB@ȭ0`VU&>j)׮ETpuiy=tg>"8Hk5 KhB? QPpLۣ+3'7C*gDT#0d]1ˡe13L3#Z(&P4Tm`@@i+0{ˎ`J:9*}ىFpܱq$X U$]`~\Śq89k ](%J2| ްcss{hXR- Y`V[ax<~B7` aB N= 38}ߺS9L76pfCڎΧ;$HKˆ)V!1 ,bH\/!߻^|{sft+5m[ZjwDjE^ l&FS,q hKp"${$b[Z;S05YLШPKP.PKE9@!java/util/logging/LogRecord.class[OA]EA7miAۨO+Lpʦ;Mڤ}j҇~~gfV2^9Yv !3歙{jժU%zJˎ[B(ML|e/ "j93Zm}5/mJwϪY>M[jJ3x!wA rTh 00Q$6xxdI撺rS6 w?,F ZݚTd6_cuh{2 1FnŰ2fVXޏ$".FFS}úSʜ[Zn_k%(GuZ+<&*m1Y8SʩFϯ\jVDEƜ/5->(5M~"X C}b\von8yr$Y' xBm<4>cI菅)TcaʱD(m͔ /M -&zoƇ&yI= }xǷCY!b`0i E+]AnBG-.h2”VP*S](J44!ަT*ӐѮ9TœVR*]9TwRŚir eF\ve[rV\UsJ9_+kBG@󁈸@l #lBU@D^ `[@Ď@<':r bW XxLŪƋ]]#rK(k=x:z @oPK(w PKE9@java/util/logging/Logger.classYSG{@7| a 6Ӊ `%8d% b]b׵ZATR||TzfGNO;?7LqNѢGf.$>{ܚװw;fl6ۉx0s󁻶yM+Q5Ni" A@ 7Z@gM#E3M:vД^y7 l.Ȟ !n/R|+f#m0D4'unOӐr03Z>Y:{^NrO,zhoVhFQX(}5<19-ԌlZG% ,.;F1#=GUsQæHVcXUVsW%AJ`sԎ,@w4U!"zvg;VڀCEY ϺpxR\]QPJoj_WFAmi'8-%%k~5c{̢" z*zEauKskG& YvݲuL sz8/d|, W;37J-][avhƴ|Hv~&s\=vNg$m6E wjRe?ㅪ޽{ |_+Kzv.EnyJ7pE%*+|P|6y)GtXH%Źƶ'/Ϭ@!M1?jTV'xYEvI@s>}:| E[ ǬMEWЌo-O'߹C\[q[?ѹ[q^gFqSЅ:lwCN R k6Xg?'(@t"WNk 2D煔.#XR [>gX 9Fk=g(ʰU;NʩS|ԣ ?QT8F*CjD'" /`X Ū#U1ˍ)d񍎕+1\*gN`\\9Jg$O9-maS҆}y@ո:}h2b A1NTnOPKoPKE9@)java/util/logging/LoggingPermission.classNMK@}cWcڂ7A`׊EOAJ۸đ4ͦ$xD𐋻0͛pB@8xK׎8/,N`삫B!$5ʤe_? w+qHs-^SgjeNf|2V*zA…sc<7aR:i~%C0Gȗڞ{Nv7&DӲco19$$_KU2 yuJ7"^!uBa f-(\PK`dPKE9@%java/util/logging/MemoryHandler.classJ@Qk=j=VZ7(Dv+kSҦ[CM V6|3ϯUӈ6͞YqRUmYeU.ē<N BQ&dKv !qb7EqgD0mȖt¹5J a;ӑwLtdP4FKE?!zBմV4 tUdC@^B+tG[W66eֵhNS_Zb۾NdnliSow=E{+5_6Y~+;1dxM<&xl'zT_M 4\ 147qB]z~iPS~4;Idy#4τ=luB5VYac0n3vЩ猎3(Uvl{nz_PK%+aPKE9@%java/util/logging/SocketHandler.classN@BVQ@ЃU/D# R6Zd𡌳@vfvO8tQ"=TEASO_dz'I$zQH1+DꕊUzM(wNF5TxbаoDz(QAPXgL8@"Dxt' xZ\3k}YWy@}^d$ʚC?3hw9%x .WW8 8#wlY6U~.@  fo+>ZiZq.(0&9}e'~PKn'PKE9@%java/util/logging/StreamHandler.classN@ KjbD77&D FSR+>e] :`# ͩ}ڡ?%(,5]4PKSȌ6PKE9@$java/util/logging/XMLFormatter.class}ON@uL !.@ADP^r|wADQBPٙ}|8CσCKJDDZJ:i3Y&m 4.TKB?+=>jXoT4wbHB'ԑH&¨WC7{T A!/|pVF̆RMOǙaR$Dr?8.8srX?zڋ} ;bk40n2ЪN_ɞMj,mŽe/PK PKIG@java/util/prefs/PKPKE9@)java/util/prefs/AbstractPreferences.class[WFgm[ i$\bA B]qB[M,,SN塧+alie[vfvvV?0 $(JnkzjѣZ~T-EE-jW$ zJNt8Nj/HL %^ ^l"mK3}\o CgE @,t@fНYZNm) d ky̴zF j^bWtdG)YL*M Zͦ</"mÅ}.7_.H.'Х*j*^F\N>f "b:Uw匥iOÂl\jkɞ|WE۴hCv:U0zQ5-Ijƕr1Mwv9蕃.K؃#^\K'"~Lm&,pd>lP?1PK<N1QCdd&^Ǹ#^$_O&(ixp |NH F*Ͻn87sĨ"5jOᙻo΄o6vaX sw*๗C@Kq m4m%x+{Ǭ cMXmc]{l{=} ^Oo=@{i+ 5N[ _=49mb|`[E|6N f>,ܨL ΗBBp:$YLB}ݙcy+IOeꪌ| ߄E9U[8E-p!|D`Ω~Es``ΙWBsUL .o+ϣ\K;8#U(tEϪvU=M\\Ͼ5jMx 2PK=*)PKE9@+java/util/prefs/BackingStoreException.classON0PKE9@%java/util/prefs/NodeChangeEvent.classPN@}[J Edc+ RFXRi ߥ'~enILA{Λy||8î C`*ҝ'*p"zlDDc^P0$]NOsR9RDOqge=0=ꠀrE8q)7[ծ 7Rt/ Ժ3_/f2Q@:L]D`onjv*PSMT0˵̔ܗ TltR{TM@8+h3֡xE3k)> ǃulh Ul꾅- k SkJ]L6~lhPK59uPKE9@(java/util/prefs/NodeChangeListener.class;o>#v&FIJDҒԴb}TļTԼ"vFRVjr ;#8BkYj^ L #WrFfNcJJj #nk5xzRs@KS2sR6aKd& @ С  sh8HPKk8+PKE9@+java/util/prefs/PreferenceChangeEvent.classPN@=U@Q^*F *[ԍM0:ZLi1L\~NhA{Ι75l1'm#N >wzl,πP@X~,0Fl{tzJAk oDq,@րiJGpy vRao妢I0!4!H"j4=]G|EKntQCua>sy=]KK@9`R}U tԵ W !ztVC8`%u"K U娊4{cO?|o:D' ( 5,F*7 PK8zaPKE9@.java/util/prefs/PreferenceChangeListener.class;o>#nv&FIJDҒԴb Z꜑Y\Z VOJM.ag`cdGZWT_f#!+Xk12p%eur@;;F[8@,N PKkڙPKE9@!java/util/prefs/Preferences.classVkWG~[5Dƚ&hK"$D&0&.g/WQ=}f*a}y?7}E1 1Ϗysu#ݲš.)laքIE0HoWߋۃwl+F,h"cM Od׶RY+L`$FUFVaXu0M8M@5UC0Tjܨp[1ksZf4Ϋex(qtJ+,n6zqd`q)lFRCôe<u EVj#ݨm7IiAq''5ru4$F7k@-->r WR,ە91[mmy.D@1re~ۧ4Q({U!2vhx npÖ$!nY^i{hd]fۼh63Jayjv6 Fqr`NNa~ɛg0H e6)&))~?e4ڼy 7tNβ5'rELO.J;;iD=#DDL̝j) mĹKʭ x867RGNPָdj)ҹS){M10Λ)bu,(̾Ctv.]:qf M KSJ`J3ws( O,TJ!ڭ-1ƲЉkuJqiPe˳k"KI_\-\o> QV!cX'}(Eyr4(QeB2Mg`xf 0^rܢ]K(۽т‡GXa.OkN7-TߩOfSK3zĖiEዡW~PF m7Y)|IiSk*(ܢm*)(,ӎݡT ۀH!}*nCw5=̟2a SUߐOgvn7=-+ a_IJ>!X_?PK& PKE9@(java/util/prefs/PreferencesFactory.class;o>#.v&FIJDҒԴb ZZ얘\_T V\U\Y\kh1ʚ8+8(9-3'AF=Il t+! (gPK"ؓPKIG@java/util/regex/PKPKE9@!java/util/regex/MatchResult.classm= @jb4Zy1`k)E0'XB"]lC%S3o޼Aa+J@D܂W *+r^$X1Eq!5D0 R2-ÌT9[ [R\ݨ24'Ϣv0oP<157#!FoPKۓ7PKE9@java/util/regex/Matcher.classU[S@>Ax- oZ{"cg#BlLp8Q}h:ӇNO6F6$l}` *1H"`Z`I>Ѣ, sJfm1 +SRM FHMcVI^S mr큩n2EkXQ- O 'hF0֝vqU׿2ĮykӤLq-;r?|c&}2 KJ j>$StnswpIj%\VEIwQa㻱F9,ʨAMq6BۏC#f@(k8q[ 9Qˠ^Ngp;ݎۺn<+iO=~ubvO+t56l~(_W9|qs쇽B><~\g/$a G`FpYm![;^& c.ߣ{HT }\-iz&3YToBOQP=jSBL9B !3B,vvV," 6ښ2N4+!cAjvT/NW[0lv/,ƽWQUvoZd^.T߅Wojom G9Bı5r*DW~4GOPKhEa PKE9@java/util/regex/Pattern.classSn@ͽ%^-PBBA*BR#Yri!چ%uةT'>xBkSIs??#xszIkZ.s$dĢIT==gM7 "jؒgzj2rIj 5*Vץ[fE KP4]tepnR1'r%T$`DD) v@DScy$6&IPi;t7/Lwj!8$+6zSԼgTI:6 Kk !Hk+4iK ckc`q/٦n93Ǭ& )⑐0t% Pwxa_l[=ݎi{}pBa qI“4^}39MR V?W"v!'.wD|#ӈ& 3o,;qcw1&}L3*3>ߑP`y><l{J7X>w]Π5DD `v0y썭}cd\k YoƿsWZ;?@9<PK~}PKE9@,java/util/regex/PatternSyntaxException.classOKKBA=sifZpUJd5E`uM\GԢVA~@?*R.<|g>PJb8|c^TŤzύZ^IW<9P 8 6ʯ6@HsrB1A-e[@ k54ud"YlD{TYQ#M< e|nc]"g BnPKRY_PKIG@java/util/spi/PKPKE9@(java/util/spi/CurrencyNameProvider.classPMK@}Ӧj=yz0Ix)x EIId< (q7Q<̛7 =hDPWRGkH7 .b!Ee*Ǭ~ ,duMOgK3/W죏q$ ^yN$ vRhigѩpo.$ 3Mp9f( ,ۖv8-"qYoup[v996zpY{[Om7m6y ~.ƆZPK]NPKE9@&java/util/spi/LocaleNameProvider.classQMK@}ۦjm+xz0ГR}.q%ݔ&ПIGI ¼7oo8jpKF~~<S:+B6XХ T043C2tCĴX΅~T0+曢cepg-`%|$+kaݙrR%Z'mϷ\HOį7*0xQVXIkxڥwNA]mm|BFغx3(Uq=@VxE'PKeOPKE9@)java/util/spi/LocaleServiceProvider.classPJ@}n/Dփ OAJ/6Pl'G {og9F!: kS*ƛ"3j5/Ʌ FhM5eBp9W tgŒ"tG n܃I-)q'($Ba6l`2}E2a៙gަ ?h?PP,]Ia뵹 9Ǝ~+ = 7PK0rPKE9@(java/util/spi/TimeZoneNameProvider.classPMK@}Ӧj=yz0/ Rzm.q$e,O?JMD0Ûy;8Ap jU%'^foƩ\䙼Sy+X D"Cj3./dN.tf=؄aZJR2Q4 ,Z=s>au"M0b/,g&ֺ'i7+k6FZyj+a^NcG#Ogҹw򌍧h7=lo :oC ; {PKܼPKIG@java/util/zip/PKPKE9@java/util/zip/Adler32.classQIO@^-EA.1 у&X`J?f4.3o, ;~t쓞+0GέwBFvF=!y 0Uhư'3tR\#+q%!vi7ΈPnM\쐐K-@j3B“#COJK&Cu2f C^W:jld:،O_.ɑ?4W6G|A0w6`9یV3#i|lk>?-_ ,4~pUVi?%*b$cNhpKBeK2gꧬhOPK$X\sPKE9@java/util/zip/CRC32.classQIO@^Y*x%V14 1Mp4eIi=Y%- Il=2LMPK_pPKE9@&java/util/zip/CheckedInputStream.classuP=OAp((Z1bl0&& Y=ȱG2] A=xfv'KTHjOb&X+}Q3g9 &Hqi‘UнU MpT5UAK0FC G8L0ڢy2z}_J^8~ODE2GjJ8M*k6kg"jk iKH87Ks0MVsn~0'ů YF7Mi;6,7y\mXEZJֱoå[źdPKh *?PKE9@'java/util/zip/CheckedOutputStream.classuPMO@W(TQ@DO/@5^0=`/Ֆғ?ʸ@۝7>>\|f &R C"g˘Dމ@x'b* ׺M'rh̋Ž< -.bpG6 8G# X,4^%sr"愳xKB=YCJO\ZU--$qEf# Mڈ>zaXPVa;w×4V#>v&FIJDҒ}\vF\Nb^RVjr #GzjIXbNi*##kQjqj VZXd5<,ҢT,/= l @ d;;d@ <@PKS۰PKE9@'java/util/zip/DataFormatException.classON@uL hFt(HeS8qE"G!.bg37%3!a~24Z3 }j ~L Ѱt&ʺ yCFblaՍ#kZ7x3zwxE6kcy8~PKA D\PKE9@java/util/zip/Deflater.classTN@uP()5BrmLL AojT~TڱLb䨉3; 6a?x+&[$'拏d^ȢFx 9YT.kZ0Ε+gQ)W.dJS*-A>!V[>zc၀/~P=UR܇:1/`Iy+TXX9.IНOR$m'fuaI֗sVs5Qc3ծ&Q]X܊:_?i @('O w4ס^FRu^H(KXPj^9 h%TKeJ1hDEN~R%M f* MymPlJM^сOMcYI ETT-$@o5}PRk4/ [wbla |G7>!0 ?A<`Ãvlx(#3I 0%_+q`'v&McqF&Yؼ.3md8L0iKFb0 0g n8I)RPmSGX2f4(?,blj2!::mk61ep'g˰bW̳݂Yʜsd&abr\߷#s#sW=0=6r%܆7&q;mXXbޚ<;+;-G;A;lَpz=,3."PKQA)PKE9@'java/util/zip/DeflaterInputStream.classQNA]AyxQb<1!!AO qȺ`L<~g#tUu|~`?GvS|:'Z{ v/erPgaG0V Sٗէ3b&tD&#!!  mF*g/^Kvx}жJu$-A>t4k#-Rs;#淼hX= + 1kSj@5B1ݶD9(!y=&&&9+ >czC@P!qqXS`VQ Τ<ΤȰRN\B==c/ur<}&>[Kdf|2ڧ06vv7PKłu7PKE9@(java/util/zip/DeflaterOutputStream.classKO@-* B1a)ƅU!+v 5q非3߹+24yo=WZG9(eixs#;:!|.^JN.A9#&c+Kݭ_ik~fwD 1a&ݵse,AHi]ۓCNHvߛ!!5B)ðS3D(hu|L* tחbm1pX',Ƨ³l=7mi VLNz<8 :JiO“uwG-3OļgHbT"U%̺Yq g+pU{15"UaĴ"DJ#:U5 šJπ (Dv"bS>PKuUPKE9@#java/util/zip/GZIPInputStream.class}QJA}K17`\ *J^[lg#/5~%V4/ݯ_WU`7^2ڣj#?neDR)~| -4Bo| wZĺ)L:SiH(cosί23BbSK_\~՗ʖVlSaMPKq}PKE9@$java/util/zip/GZIPOutputStream.class}QMO@}C+EDQ(Ő4bpVJJKʓ?8-j@>.;ov޼y;m 1Γ5"]oT$\<8/qA=M\!ī'3BaĐ1_9h϶ 4FBPkHBZ ҄IsJ#6eO\ݎn#ӵ-my2.UQ%s ^9.#7a xpQ]K31֐̙Y)FU1C" w8s6̏8 D(f~JXYGgJ3D؊7PKMRPKE9@java/util/zip/Inflater.classmOAg"<(O*hb4&V$9H&j.e\DLW&{ٮ&ݝf?R`[j{5-ʦ)Qw6uZi5kp@[#i `" Hr}=uvԮQ˳k#Pg fdN@;3y5U5n1i3W9,YtT1E`' /쌵)9-7!0񆌧Q*.1ܧp j4ZiNmc.?5,ˡL wHCÀ I|fܧp~/8ҚaP%aP~Ka6k@SF9"C(rAKΣ@!rQK.A.iɥ1]֒c+Zre % 5i +`jPy 9vV\툚`ϵV ǘuKKcE-=ڑ/#U u= AG˪Z)aj$Bm֠$h^teEW+ PK!FPKE9@'java/util/zip/InflaterInputStream.classMO@)Qo1(ƃ_ ƋK\S[RZbWL<Q٥?4ݙy7b0{o_'-לm«9ob0 y-nBӄH+vn>Ze-#H[ݹ&#dHuFޕղ!Uwۖ}myRa{B_˰oy.ۛtE6;YHi^-t^ z9ʰ^[rcG`b QL0 ڒ6sXP1,H! ho +N6䜱&29[/GCs!9@Qyyî:aL{: ipV99^0nw~˛D8b&t PK8PKE9@ java/util/zip/ZipConstants.class]]SPi""*jYJKEFZ/i^QMܽI{v~"-jC{Mƃcpg|9T6χ}9r]cC3pҟB.kCGT>,wۢVEakUXT$jm֒]3VDQ6E 6Q0O\&s 1r"n7I/ %Q̡c1PLƒ)pVNI*Gn0'f+"lEVPs:vþCsS?K|)O.TS\/)O3ʳe2<<_Q^*/הe t]y ߤQ=e&cjO-Skgּϭ꿴R^oo}h^5޶5\uU5oy2y/PKh> PKE9@java/util/zip/ZipEntry.classUNQ](b#:X+^kӤ&I!>'x ̐TMڧ&}sFC3g:kovx1i:̹h Ǻ!0r5ݨfN/yىaL5C?#i؎n86C.XTP+uך2Lj'%~!5+<0CXpAYVIzc+ev[B`Ĺ+U>U֮d?zaVƓe9 -]ΐ*wf [~`ԭiXܶy("3VFJWɪ8` 3ẘ*99ܽ2VvNXdʴnF."ڱI+vˊݶ.d> "ڑcvۇ/MaZܑc2B!DAi N H :'0F%d!F~a*`-Ig-Rr6K^d]eRJf2*&6јR 7{@fʗ2Cnn໇9\9\ZY_:67sΗÄ}Z}.2=0}[x/sѯNw ;֐אv:$~+]%2Jb7Xb5@94U⥒xEq%&FKlHS{PKj㼑PKE9@java/util/zip/ZipError.classmNN@ }NBKK+ +[a uA !E,EخTKu$+&$>B?^"" Ju&e~sJ"&(/mU&)[Ƅa+Tb?%gz 2Bc۝f]ф^QΕ*Ǿn?vbܑM{СWbr |MTɑk!iK66Af+{PKZPKE9@ java/util/zip/ZipException.classuNMK@}j?ċoR" BCo۸ԑ4)TG tf73_NpBɪDQ.(zu^RpBS&o~ R*/ZÉ{=-wІ'Ѝ(շTjhA*L 'F;ÚOT:㲠t6W818X_9بq&g>wQ0X{tٳ;qјʼmͻ1ٷPK[ҶPKE9@java/util/zip/ZipFile.classKo@8'inNR!VPkHQH4 Cq"ǮXQ;$J Of_<ǁ a_q+c]˞^HG3,ݶո-Dj8}~a֮8k 9w79eקj1$+crMeR>+ KK|I  CE10OE1d1UXY5פ+ABxg Kn;ܓj=،%צqH+3ݶG UR%>l5aZ o3$ZNONLҖ 3re̎quXRr?Eh'|_ $]k"i0uV^TUWFA5M7^r2<}>5]Lx->CvTD$`)zflZ^̠O,IV1w#@г֨!6i֍ T rmhݼ#^4?U$aٛ(z4`Wi;Occ@]Lx4Ɨ8/_ea(M[mkڎqlL&;c&:7vZzPK-lPKE9@"java/util/zip/ZipInputStream.class}N@ƿqLLݔ!)M)(n{bKJp.aY[&>U{CU16nⰳ;;#X[1بJ: Jq&}} #9Y\uc=2B|2 ש؛.JxY jmڏ @i9]􋸊$a;C]TeyqiŶY7{B}FHIvf݇21gwPvO+ F{Es5z1_.WPKjBe(@ޛl?p/q*O.#Z:qn~DT'-XfPƓUli \õzmc^Y/-vrXXlMa!~,tglXSh6boF'5f|#PK>6TPKE9@#java/util/zip/ZipOutputStream.class]oA"P@j&^ј Z!\nJv̲KYRW^xGN -\d39 Y_TءV]5ze&Ni/2!PMߛh !j9:uh PZ,(GVdC)P;|{ng2 (D8HHv?щ(q8:A_Prp"P;BSvS#K!䇮?mOV=o_X+nKۄN&B(0X^t>/ńLo*IAm"u 1޹wnKnGtTʺi {>I}1P]w6au)TE+)پ?csx_e!IyMd&k(:iƱ-zlǫ +X*O3xo* 6gЍbSg{D3xDD ^.GԖ ^?PKqZPKIG@javax/PKPKIG@javax/accessibility/PKPKE9@$javax/accessibility/Accessible.class;o>#Nv&FIJ ̤̜̒J}G(/'AF?'1/]?)+5A$=9?$(@RkFҢT̜TF~ =l t+$8PK|PKE9@*javax/accessibility/AccessibleAction.classmQN@=-@x"RiD bJِ%5,~e- asfg'b8Kݴ,>Zo,<7,_N a̬ۦ3wn ehW {2$v_>qSeKﺍvAYN?laZ05w`TAT-9*ϙ 1gID)%ޞ=7i٧kGtiը3_j ʊ&ZxRЪIܙg ![PKK@_EP+ɹ/0da:_By\*{Y,C#˿Q "@%q*H@^ ,el+أ~qPKYYJsWPKE9@5javax/accessibility/AccessibleAttributeSequence.classQJP=ӦkjՕ . cU"J7頷Z?˕Cps0sfޏϷwP"S5W [>DZtͳ=,DK 1,B;m7ޔ}Chʘ c02:'@tFEg:pp88 l D-B0[:y8Ur |UӼ-seχ#Nr0SF$R{W,XAUzK)%6%+W)-*2Ś^^ցmelSX)c]Ine_PK} 7PKE9@*javax/accessibility/AccessibleBundle.classN1O( NccuaL0[\]`ؗb1s!V2qPN,؜kg?>6`!{q(]!EM2 xBs6bc$q&Ӏ\pr<`*IMG%D؅O Iˉ iY? `$#<1u|3 yÒ/}R 'QZj4J%'}f'/|XV.|ZD#DewKwsE'բS}myV >wT¬PPҸ1aN9Ds.vO^(rite N2ls%r CوkH~VB㹚ՈnĪRn,-S\3==OY%3n4o4 g;Sʨ\Vd g8w{C[v,ˎ* o 7;tQx!,KP&*ku nBkہ]uA܇[=x=}x@|5uxL|Oϼw19 6xPKPKE9@+javax/accessibility/AccessibleContext.classWkWF%8i $CܐIJj%дR[L7Q=dk9^_iݙYϿ s pݦ;9hN\3[Sbyrَ{ Ls-jm*k/X%pFU]ꪒ7JyZT՚Bd1$cZbǥ[.ANimU{9.FӯUϫR62p % `V]tJMbA 6VH.TaTm1]VĝbuQҭif`pcny[G@^ZgjeqQW Rv}󭬯w/d\WZA1 \ p.L@ilRQAT!K˴uc^&p*~ eHbPJ<3OAy=}͵J\*G/xT\nuۖpd}{I/JAoHU]bɜ`RP-,PnV_!PU612-Txz g/JJm%yO >%ӈG&3 <GB 3BNxt<˸Ӏ|8'/p@B㑥HreDO#8p ~ۇ*|^ tsBN.4"u\R oy+i )v*3hIwRnZT6lIR#eO.W¶Ta>U%p]B05/+)Q*kF|++|'@Eҁ2=%ďrD'Y&QS%~PK+-PKE9@0javax/accessibility/AccessibleEditableText.class}QJ1nVmUՃ(t()˶lfj|J$d .(ZR*ZЋWo#B]@eO! ރh29{Иb:3$Gx`O>OJLfW&{&KOMuRYg^|X;etUGl,iMZ$~L B+KVJ ILߌ{?׋0#?Ek5)WzN xrMBѬmz܁> M)PKE9@5javax/accessibility/AccessibleExtendedComponent.class}j1u"Tڛ-zX7iY_>%N\a2|#t#&M )zu OVY>BCIl&J)0F}D[m&cR+c*߿B|^A윉ԵW'Oi V 4v(P9iоԧPyỆ3PKAV3iPKE9@1javax/accessibility/AccessibleExtendedTable.class;o>#>v&FIJ ̤̜̒J}G(/'յ$5/%5%$ag`adiIKOJM.ag`cdPo X;#pzj B9?47ESӓAEhk#'XRE2(+8(9-d 't#3= ;/ \`I&^PKɌǶ#PKE9@0javax/accessibility/AccessibleExtendedText.classuPJ@MV[Q`īF"J$*dR &5h)zz7of;\؆2[d"SΤaZL0V6 \bbПDQ{ 3̧m.Kťz-Zh1hOk駨W2)ԘL;05ҀWiUɔtFS2RaGc4t/=yAtü*bӿ; [ptنmY](]}{a`pF943/PKWJPKE9@-javax/accessibility/AccessibleHyperlink.classQMK@}Ӧjkz[*BBConI,O?J9xyfx.rxsOHXtfQ* w3nFS%"a]iuhSm=#۝!9}UB \j}ma[}z?"H'qtDDŽNOt-G}]뗞ePڅ{WtʹͲ"~Z#,R';(DEFyX8|A陝* hʶ$` 5F LriOPK 5PKE9@-javax/accessibility/AccessibleHypertext.class;o>#~v&FIJ ̤̜̒J}G(/'գ $AX?'1/]?)+5(Ƞ߈nF̼lF OM"lfdjt/ìKI`d`  /-JNuIed =@bV`00}'f02I&>PK_Y1PKE9@(javax/accessibility/AccessibleIcon.class}O @h|#jƀ XZ'WB")k~%^D ΃y#nv&FIJ ̤̜̒J}G(/';)3/%3/AZ?'1/]?)+5A<=zFQ OMt ֌ 28t8 ddd /-JNuIedĦ\d4#P0r';P$PK6kPKE9@,javax/accessibility/AccessibleRelation.classkSFcdnBs!-m vC",WV4QdK2Br(~L?Guzv%cPJ쑴<{vox\bplzvt O[rmv 0\;Jh՚*fM$g3Ax‘jCTEU'PM {V$AL S4j G2Ϡ0u?H(JZJ oumcФa[ {K- }W Iz|]Q;-`w~=If034% )2%¡= .6([%Gkv3;h3fm9i7]^!-:6I ӎxz[ZFU`xVޘdzc~6[ "fښQoLcЅޅL 8sgp p/`_X'?PKw PKE9@/javax/accessibility/AccessibleRelationSet.class]kA|51M?Vm AA A`J.j.L&+ ?J<3,aΙs{ _}b<NBq#'LE5+sNr Sw>1R}:1%(fCg.!,Wp|BrGҜ0}h(j(fUVOe(O.Bq*>`|0gk<>j+ir]D!jn!w2GR @ V(4\5cN<ٞ29|c>L:GYTr 5Z\DS;&D1TL՚_Zc]Mt J;>0Z(LkvVPޠO+?]-].V[XE#)~MwUq ICX۳Ig1U 32Biư7ΔKH 2VvʨofCuLMf&^잫&]/&3lý/Bz9YSh]PK. P8PKE9@(javax/accessibility/AccessibleRole.classGtUBXCzq #i,M<7̌섦ȎH {{,X` ,?soL8>?Fo{?O|m":E#R4ڶZ__}Fo:Q 4hdܖ zҖk_wEF[=Q5oʾlem)Kv3k1)o\T%cB;qUKUYV"j.aWd7nCl,Vp,S^p;;/9+Kg0tݯŐ 2*]+ \/u{)*xv//y:\JHp㡪gU-vbyZgvA:!N/[Չ2.mتɣd_ی9[|hW#+݅U)g`oV1R2' {LPFZiǓL1ɢceISJX*Q$ fn50=MN[|`\W@9]&dBIk }Ǔo }.FVT] {{87>Yyё)]l=FO8=3=nMBdBʾf1*E{,\ԍYJÔLL]LL-B)+tSP&TabBڅa#tX*8x> BuB& 5& ĴLS 4Mh3t-L3Nc)t:,3f 4G\B1iEL .aK2`G*B0-i L Ĵ-L ƴD t}iB0$B0"ӡBO0&2g =t L+^bZ) B1zi[LG d ǔ)/!S2H{[NF >5kx3+5&fcG84߸bQw+A1NyhSc3lkmpi\_wo``_ K<ZLM߈[Գm>Z]}Xq'OT>Y}O)SէOW>S}l9sW_/T_X}_W_ޡTR?XCS_\p+ՏP_ZHuK=W/$>}9(b0zJȅ<ȇ(бzmNP?t 4 A[mY9v|BbRrJjZzFfVvNn^~AaQqIiYyEeUuMm]}hsɱ|DC$v$ڂDsJitDi2Fk}sѢy0GJXkcܹ Aj"D @C 9 َ\"(W"$" 7ƝŽăXQIYE*&.;؉6FF|G}OkL?G_(/i`'}"1ʩZz+q!Oqz2KfD dPKe_b PKE9@-javax/accessibility/AccessibleSelection.class}j1O:j[AuQ@DࢻhvfFi_E&Q&ENrs=_N> PxˣRezY?vcZu( 4-r7@WF(okb(,R_Ltc49Ĺb.?2iEטI+970s ׮ChL6Q0q`W`&2DTVQs'Ϩ;mܸL hPKGF̸PKE9@)javax/accessibility/AccessibleState.class{sFŏ +"OqJi&(o%c&@*;juqo~~Njw2ԞսwWϤka$yٮ5l?e;/F$P%Ct^:xdj-u",FNѪ@^-;EMeF4}. 4}!09M4m kZ༦o&4)M]MR'jsyMO4K \\.kz)pEӁUx^KӟI?OxǝۊܖiJvݸwTw*,6.o> WwIvR^ui(.<@Ҝ: ƋKG 3>n ƧO1~9/_2~%㗍_1~53YuRg>֯APkmjڠR/WzLmSjRRSuAETڣԫY:=3Ħu[و)6a6+u,0Eی`8n,ˆ* puD=[8׸.e x(q6:-xHWsk4sY6%3:?d]Utĭ-~,PKit@PKE9@,javax/accessibility/AccessibleStateSet.classMk@ߑm9v&͗C݆RSɴZ^ iSɩC~@TZdhfgygnU환_c9JȾFLXQ"LƆm˜shWj}u 3ђpt/ѻsœXʜJPd%J+'E2ZY?OR[>}yfnnTM Yhbt oq$bKl+~qR:lXj^|6_+ޜ%m0sLP\`l10[Cgy2s*T.Vؚ[kп]gx3ocwn^PKspPKE9@.javax/accessibility/AccessibleStreamable.classOAVaM0C 43jVF]k~%ΜvUTU V !OTB/_Y/Bje8ۨVRG܈{)Ԋ;Y~<>vHhz30H;O8ۗ/ωgyiSi#N Tw|'B3M?PKJPKE9@)javax/accessibility/AccessibleTable.classSN@<7ĭ+ILLĸU)RRZ_sQ; 6@={=5 % B7ތn&eXM<_Ҝۆ;}jzR=ͨ VK[,yI@6Wruؼ?ֵG̾j-!+̡%TUj,\=xoBX!vt1WƧˆJA|;+/tMkO= @mjVi7#U#h`[3<fe33)cBKU]F [rҮSљU]V惡L-i6[ ]\펆&l@s^S _q sn@R&l ܆)H ܕ=ߗ~E3R' 9y( ,I,ÁC8x '+PXSy><?PK@mPKE9@4javax/accessibility/AccessibleTableModelChange.classuN1ƿ M|6XRRCMgfp |sUzv(!麱Odϲ; =I qz7[1>3C'EdTM2FS>͈}=;Wnˬ^ NU/~LUQxje?I=xL 7 MD Q{["no> 9 z+ykPK^{PKE9@(javax/accessibility/AccessibleText.classmRNP+(EyָoU50RF,iڤͅG6W陞3WpV5SR>i0 €ޤmXC\PZ'CMd4E;{`;Cw @tT8JIED(znoWSpٻ2A n4ƅ^/",8;e}=cp ޒ?XA[` 6968gt+7l2)ű2~^6v3+evh78PKy +PKE9@)javax/accessibility/AccessibleValue.class;o>#^v&FIJ ̤̜̒J}G(/'5,14AP?'1/]?)+5A2=Ĺ(5M#B_inRj5DobEfni.\fvbVj`ڤ_Zꖙr6=6FFf`zUv(9*$PKϴBPKIG@javax/activation/PKPKE9@+javax/activation/ActivationDataFlavor.classN1Œ(Uq u QV&a.İ/Pf1>L\>-5\ ]@ v>'J{A%mzt,nut [&.SsyFLGh$RpPtFgIı$Atjev=Fm=u:!~k-j`DAfJݸtߙIp:sTؚ,:P0y /AS!;ǚ\Giڇz;P },XR6FoX~UN 2CJkX7il jBsR<`+/nЅEjNh-b3[beV4ԸLTPKkDPKE9@"javax/activation/CommandInfo.classQMO@}kb i@(p" WRZD$+o%,rDYpC? 1v>͛7/8CՃð}|PR~]u i&vΚjp~q l.(ѨM*5$L$-@6R*W1 ŃydXT~jTj6d\~ i^Νt`t0_<d=Y='r| k@%,ZK(ۺeWmղjFεkXhâ|Ėe-4ɲm62v66{PKrsPKE9@!javax/activation/CommandMap.classnAƿnA`i'Vj25F1jhm҆peDJL|(ىPX %a̜s~s曙oxP>Cm >:< aM>z֙hK+/k%g`Ž` 7XF!q4Dt[`761l;%RG1RMG+HtFWH\\z[x<`r#Sh /K=z{Ԧied~XPғwp$Pg]37n&TcoLнkEk`Z\64MCHNnh^ASzeW P1:&c &~:<_ѧ>wt݊X?y aXzPK$= #PKE9@$javax/activation/CommandObject.classe @ Eo|޵nХK(( #uFXm.?JLU1r_Fhz(z{LT:mAm٫y(Z9#biv5%Oʽ5Ne</D;?N.d2X,R|uP#t7a*$R +BanEAq*gPKP/PKE9@)javax/activation/DataContentHandler.classRJ1=֎GՊ~ƨZ ]Lu*Nc2&CNosQb恔 BrO=&_qF8ȩ r4-$[Yi~z+N8ȉ"z,29V\1 WZd6T~;yz& NdreVM\9Ӣ`/ScG\/,Ie5*ܝ,+ )}&وn:m48ءJgv(Vw3QwϺ#Nv&FIJ ̲Ē<}ĒDԼļ"7l~Q%; #H~Nb^RVjr #DrQjbI*>FK ̼tkM"fd /-JNuIed*=il t$+$8PKPKE9@"javax/activation/DataHandler.classKSA{$yKCPD*%df;yГU~(˞IIfI8dw @`A,QnږrZ,sBNWDYj]W,C$0# 1Rꃞgi|BѾt,O@>h#"A|0"Q7E  K*̊cD%*1W-U@rȓ=P2$L5e 2"- q4d.#ڹ㦫0U.@rL\{=e,PVO}RXmwJT U~Sl6dZ[X1l_Թ+:r θmwBaYn_BaƐ ண&VCP/ -e(`YCꖥSkBv}}&Xc0c|B/}E[Y)L{C iMR( C@ˀ9吧)DLȔ왘FhjAψ\J$s m9Aћ9/]dna?EjT.~h{8lَPK"PKE9@"javax/activation/FileTypeMap.classQN1}<#̢kb`h"<Ő=T i3dz( |dʮ M8р|PuCCI}O@K=þn.Ci,T/ ڶ)qdhݎ;c_E2Sա]I籯2؝&VƵ9N 0<_҉VZ WN.LGoxC YְIC%\!щ}k`ȓ' TwʈOUVVywxQF?'zFLR$9 h\vPD°7mt{RmKz> %KsCuq)k9i.)2|(&69q5RJĹHx4Oy 󛧌e⣟ZKXMZF oQ4E'ޣ׬1jpb-ᶝY2P@j>>XG^X%yD4 X`)bMxxc K^Xz.hcq[f dw)(sm\Z9MPKV)bPKE9@javax/activation/MimeType.class[OAl/J)\ 0&HH*۴L`HKv|'(v3gfe쟿~>A#P]ګҦ]*iT?6;e: dqEY5Ijգ`A[+m[np@\ ?4/Y b0qv f;5I[rn5 ,"; /Յō4uk[m# D-yK])!K+&>P[9"0SQӨQ6:K).Jm4OJcuz,m*L`첄dl]9g6=!yvOFB53ZTLPG|0YG\Is/?u7>f-9J}3Aw)Chɓ(2IJQ\BhQ*I5 x*S%U ԰@L-cbJB+VnNOG}A;v4(&}kkAЉQf_'<3>UHl8f-5qшw*qKoŇkB%6Yv>PK/D PKE9@+javax/activation/MimetypesFileTypeMap.classKK@ύ}hZ[ksaDPQ.c;ԑ6)ҕLCY̽ss7g7XJ!ދxpEMsՒ-;)94_!u<#7ı_`,$R|UyۺmJtկهÄSz_*򆕺wϼvW_@Vf`P 3Xs/ͦcҞYwšϵg'4Ab&qcvD s!cOFy(c?PKSPKE9@$javax/activation/URLDataSource.classNAF`QPVw1f0^P$ޛm ѷғ2 æ0ݵUU 6y?ֲǵty}ipkN׵0CӘMf~/lm ʰrT=Jc+=tt8"a 0S K*qmՅ{M,[͛7ܕNvG/} ((-zl2],Y%kڕU)"x!7IK4v`7E Cj(3 /x:&Ȫv;?Mi X>aZ ̃X_{ 9s:2Z/R1}~t *uƯseph`σ{ ٳllEWvlc?l^ Xݴ> j]/PK(PKIG@javax/activity/PKPKE9@/javax/activity/ActivityCompletedException.classPMO1}]PDQ@ =B kAYL<Qi؄f޼7k04_L̹)_j9|{rU28şei|eݪP;LgpPvYJʧi0qO |PD"V4]=V 睍j GcZLėf+οNoGoRZB7ƞ|Ts鿸08T()3ٳOl}P@1gP,.w)^B중\_Jط38Hdډ25+sȘL>+XW=WY|PK~HPKE9@.javax/activity/ActivityRequiredException.classPMO1}]PDQdrp՛'4PZ?˓?8-btޛp<灖3舗X*1Y(e82h_MH+CFR2d>ۊ "PjP<ӁP=>r; ϕ4|eh7dyOx8ZpԴf\]9+4` _7Vћq9k/YF ă4;NĹ=RE[OQ6>AŜmVCPޥl{ FZr}HȦ*a i%Ԭ"c2t`u_T_f?PK֐GPKE9@-javax/activity/InvalidActivityException.classPMKA~f]̲KPC[B }\Xwc7Y~TθD yg pNx~Ørts_ C<p%M ]=/  {^O+BՙYtZ7OTj ӞF*Ћfw<0 c*3y<ʌrw*(찂-6eCIȗ4rՒ @B6U vg{L'Rfe%SɧcX_5PK˻HPKIG@javax/annotation/PKPKE9@ javax/annotation/Generated.classN@g) ("&^=- RR*@ֲy5>eia󱿙;\CE҄-ث|?LgL ;r_?Vͧ wIuW%]RN0r_ 5c7kY @ 1³ l,-VkL/goBW%pdp'Oq΍ʁE3H?H7\g`g>XN]a٘ /u˹ GHR펶]~٦iSmv?nߚ փfhFaZmZ7OwEF. >@8)2CY o݆uGh(8ÁC)GRJRH)K9PK_PKE9@$javax/annotation/PostConstruct.classOO1ߠE=ptDSY'fKyS&6ie9jZXYx l2 Fi<8tΪ++󌯴aBܳ&Ku'Wpr[rḚB 2R.$H){!Op`|a$š:©!~7)#NSیb/'/PK;PKE9@!javax/annotation/PreDestroy.classOK@ThMDz4S!kK^g/y?V,Pg7hH lHQ{ t>z|18PKt̴PKE9@2javax/annotation/Resource$AuthenticationType.classT]oA=B+ H[E&i@ɦBIOtXei_)}heA!<̝{_]Ů)?3469>mtLp1eDnl Ê^*6Z!]Y1+ժ^-Uz|,Vu̇eN0 {A' Úua䧐H2n[鉦w5BFD \*)~[X Pe& i;~(X# 17Kc ,P^szAQX$6nLL9)] HNr[Ǥt&>i{fqf8\<-&T Pms*;\$OCu|k-ǵJܚTqA2͏M#y"n@\j,XmMUޓqR NsB:CYr޷#sNk_px;lOOvɤFSkEa_q~i{C.3TL6=dm&xRukse@].$Kk $!yXq;M&07jM\c!95*B;Lc)u`85Or5' S.Jm+әdB1y]*CM~+Gѥ ?'a؛!,F^퍥L` '$k}i%1-؊8*  BabbĆ0*r^cUxp :k}K ɼcXiۀp3 "h;gW~EpLi*,☍8 V5vMԵ5,:*<PQ6a Up $pj8q@^30Od؁{qܘysmGh 1ʃ7n<O~؜(^һoPK khPKE9@,javax/annotation/processing/Completion.classE @Dgb-[KJ؟ ]H.Y~[eeg|=rnӼ>Duۅ}+} YQvƖW6^6%6!cfD^+v|,2 ͐BZlv21PKPKE9@-javax/annotation/processing/Completions.classON@=Z"w%cхW .0u!CB,](D,H}{=mɔ/sT* 晊E1<z;|$h*P Nnr{Pe*FY$;%4i*ɄgRZ򬧱?'F` d*kӝ0qu‹'3l;V,7R_εAW]بQPwFQ6؋ءX+'Gx+.(kW1(͒^SWTi}_256dT7˭7PK[^O,pPKE9@'javax/annotation/processing/Filer.classN1ƿ" Ʉ^lu DNS\-x|(cwWt~)<Fb&\(V|b8ՐyzbpbfD2Ԥ!a8N W־f@SR^&}[8E4&ey'jݓY%MCv 5?_%zjCzl}[B(1$ig}aRlw!䟰04~'UL`h'C[``@rlr/\,:GyExP]VCscEi;~PK9g APKE9@0javax/annotation/processing/FilerException.classOMK1}Zmwooҋ(*kȚlZ< (q ^L`&37SD\ɵX/F,-U]ks/.uźT y m@hi7(B%Y>]Ƈ3B|nT6;HZڨ\[9_RV3t51Vҝ?.][z8D87Akӈ{=`E6v]݆PKz@+PKE9@*javax/annotation/processing/Messager.class͒J1OѱB]ƀ+*-. ]˘&5Ɉ/wPbGݨ E$='؈`NŭBkㅗF5)9'uƇAEF6F)HD8RZs+)AQKiLROz#I3\.*/ffBiO*-k?Zc>A?ABU,6SBq+]>NbMiuhܐK֌U#(tN֤ĐIL>^l~`c8Zy֡xt[޳u6tu;ķMv]]1PK =mPKE9@+javax/annotation/processing/Processor.classSJ@ت*7"%(RA[eK6R$n~L9xr/;33}9jF1BҒ3Fϣl" Tw,uMі*|:\<7{a1:::8C&n#,\@ }iLFPS Z J P2YH>uh)Q~r!qE՜Z3~MF#k+`2ݸGQ! O8Sr0@U袙[ 1lNg!-Flfje> E $do#%n~a%H:nה/A9񷔿wB5kוZPKz߁ PKE9@2javax/annotation/processing/RoundEnvironment.classRAK026ݜ"xԡ𠇊0dA+%5KF<QbnÜ^{_pٌ)BjtdiEL}h(f\I1A&o4a}2PhRRrOc,=rJĽ_y&,M~d'4@h<Lg UקkZAqnʦK<Md Tt`3uEh"q /;~X='I̕N8DŜ!GL)[Ou/"\,P3|yzg+dBAF&R@|"%D$k`{ocCbWM[9cc;c{_PKM֙PKE9@8javax/annotation/processing/SupportedSourceVersion.classJA ƿUO"RŅ^= Vv-6)ӝewWPba&/#%B{WQdrF~ؐTGűM6KBr LuQB=::K%TdLh^\vW̎\6RqRi[YH-ο *`h U ,DЎU!bKN\"l^}& 3lhj'v.CN卲v~{lM<2N̈GXzq0p.V[ *53b/3o/FmNPKji5PKE9@javax/crypto/Cipher.classWYWFcMiVbB 6I0:`iհ&i! R!@SڧӇ !K#KN3˽w߿Yв"p'eŊjR+ iEQFqmUlCϪ׵+kϪDD4vmٰ7eM1GrKK/ ,/KwSG0>~j}9Ǽ' eV]->(,sOSs궥Ra@b8!8e͠-jm[:%pfTd}S4wvS%0,{5CbC ю,O 5CQ*_x[xVڲ5L& :˲ZUu=, LvHIN^M嗺+d q^44;iE6pXpXviZ#`oܭa;78Ɨ(%9Gr;nQ! mK5t41$Y]M=0cq'|opҷ?,ÓƿS\"2˨ 0 _U~p 5*.!u$H inv O=+hhӞ?I z͗nlÕB7P_h;XjoӜoNu3B1ηVx֏xua=>A͐BG8PqKUVbwRi*.NKR';1Īh|$5sҸ_OA Ec,`͔KVd.[qw:YX;B}c,?`״q`Ql)җMX4ࢯguf{V ^ ('(f| +[ްj6Hoכ{ lO\l COPWݺ^ } a _nk;ڪdÜ$jT|$>dT|($G_0aބqst ՛.'4YPId&6xo]?PK(fPKE9@$javax/crypto/CipherInputStream.class}AK0߯tnC/2o*hգ/A(^&g5HזY@]5$o{&ovavT<~Nt,M RL\؄U_(Q&8*V%a{?۾zCOVXCh*d$E PDCѳC;GB7?cSOlU20N7HrJ Ysla6f:gm+_g4ׁ-)c 8XGĜ=?9- D;o4/PKPKE9@%javax/crypto/CipherOutputStream.classN0EKCP(m, `),(m*TYLH |xNj*<ؾ~_9>0/S=5I}ifFK1)TixN.D+Qn/}*XbC0z"f蟘]΄>%C:K╡ <#4K f:%sw1RǶ WOg`V_z`5ׁ*b#'xDĜ9=F9, F;ooPKPKE9@javax/crypto/CipherSpi.classT[SPr-/UKQ(N1Zq`t}r?qsI6#mlv7N 3zN/dnKUfu="k jVÓ39tSwr%Ufq+0C&u4k'~OO F oi(Q[w}Tc̬֞nRı[rbمHeN!y[f#IHEZ>nVX & ,Pa 5}V& aժe;^yS{T$MϼF`X:.*J7wPeD|Z:_[iM[wZ2Z~b'ж(952:HEGmԛK8ڴfc\bPa:V$%"~~ +w,[B{V#uqES?uEdyӈל ?P W`Q"(˫⮶.?ϼg4p( j9_CudD 8yDDg9MHFQڳ^a{su\xDYAɰځZCFHsMxsweaVeEwpyb(~nO&VP57e]-}#)\³PVpMzZ_My߶PKwTp5PKE9@*javax/crypto/EncryptedPrivateKeyInfo.classN@1 ZR ,V镔JDJˆqQ#ljU.}g&V֙|g?3`* c\{Ж]cx_CZ(a nz o-3jՊZv-v;eH^YRaSZlw;YԨ94_v S)`bIVY>sސ?ftSGfQOI5eXv2aE\ȍmga@t^bXq[w%m^^;#'s jTyGM:.I K8oAgغE\"34-/;~1J;[5G:l!.AXfH._'tE;F_;2hBe?_% B.A7zBzGGE/#T'Eۍ jaG4Z0Bƨˈ{cN*dKe@R*C d[K?oP*>uӪ %tlj B2f=Mc6[e& Sx/ƴY$m$..Hwna禤Xl}<л%OUݝ&5yB'2O\\+m*=-AI!OeU<z ~06nFa3Ve7׋?PK+SF PKE9@.javax/crypto/ExemptionMechanismException.classON0}NB3,(t Xjr*,&$>BnĂ@xw=; Cx3[r"PϘ|Ts>UӅ %4ҦWR IDha6n"xЏl ^RpnH CةiԔj:t;,>s~t 4=3k1a39T 1bŵ#Gebg-0mКwA73f]캙{NPKLPKE9@(javax/crypto/ExemptionMechanismSpi.classNAƿ x%ޙj41Yӛ^MC;devW&^>Rk&sf~ٙ{6.'&vG&F)C4e:7=_oJoU;ET"` %SI;/*_Oe*xչE.{BT >q@xSS=Ur>kmOҼaM+ =iŜe&Ɍ8\l⦝pnJ~iltm<8iGW2P,qz3/: 1OgeHtZXε7a?ӄ9f ^i>^A^Ѫm^ǥoXʓy,<8>, XcRafq6!%ί1 <-ԛؚ.x>aԋ)ݽKyPK0SPKE9@,javax/crypto/IllegalBlockSizeException.classO=O0|}}|8A/B؜fz11L^"{N+g|bD"5NyVja+LK %9A8".6Z :P|s}ƒt"crĴpu ̣8$ةT2h`iQ_ gc'>Qpa3{Ebu7?m }5E'ިŧ^[j:[PKOPKE9@javax/crypto/KeyAgreement.class[S@S7LIAKu: 2Ƈ.m6)}r?&M[;eO_6Va8 p.ˮy[ÀPkEkOθ2t0-}ɰtΖʹjnTӽqǗKfuL+N29G{х8CT= w>'E0gzPwLq1`VZg&sI1̶O۳[goUg!Ri*ABI%J%C /mUL0,eshȶf0JbG }ynqGwyKU5<JqQ)ä8>/&C"lĻheņҭ]N ڎY)sC]%r'Kb `!:> ×̳SY)F;\X} ~} >kn}M=j`\ p\!w. bX›%Jl&e6dbH򦁛ӛ­SaedsܯX)𰬥 PKPKE9@javax/crypto/KeyGenerator.class[oAC(E[zЛҺnD_j4цFL߇eB]2,Vde<3E`w!\9sf i$nyߙoxy.O#$\FaBw<ѷc{΍XR>V){Jm"d%ONx! F42 #q٪50yZvͥfһ K}!|\H*ap%aIᑍ٪NjU7u@zEqǢJM#xggN3e޲.R˺3Dz\46=fWp X؃ ;.3 FQ6VdX3}򒚈ܩu}W 0~.|2 8p=ܧF_h_KhTp&%j 1U * 䪁^]波cۺ/pPo@ΪĀ^4V#e?nHN*vC/orx2~HW^+}FvL,y3RԳ: l (=k`` Wv9Abwea+o 1>)15X ;LLuX7۞PK%;[ePKE9@javax/crypto/Mac.class[S@϶R &wL TAR O!]0%)}r?&-iX}HrrΞv? \7ꭢYwMTUMUQS>]\Q͖ J y=hU/@tW7t{@Q.a^JEwʩeUjzNؖn 3Jc8H'z}}ANѲ3ٿulD hQ iay@6(]gEIB %ޡ9vxѦFKINvlMݥyjc˹"Z>/r!+$'0SUbZ)רߨX\ڟo!\U2ZjhXԲ,Kõ;1+m IfG0kDa:D p‚XNP*Sfn,9Pi }K>һݖ;{KɸQzxH 싨>UI5;SRM y lxg?hbfU9TYC7M]Ђ8v ._bRb-y3O>xB/A{w`;ľ O,aR!KIHҐ ,jQ5<Jl}|EHqFHL{< =33XU{1`Ƈ[4a #.IIXEX[TVP8,3OBrx#:ů }4$¤$J?)6HK^M1%l3/<-B0槞zǼyxi 53fkNx ج<-o޺E߻X@| ⽋XD̸(Y {oIiUxPKxo PKE9@javax/crypto/MacSpi.classmRMo@}:1MRڴ@ABBT"B&[9^YGͿ~? 1x~ƧYDpjG<3jKKak5e,a"J l'ޏZGk_)Lg&QȮeUBw(aii GG!pb[Mkob5U-ܦ]Mmܟ~aHˢm;l3/`ꡍwmߣPKEe[nPKE9@)javax/crypto/NoSuchPaddingException.classO=O0= i_C 4%,n B.Ӱ\2! ÄWZ~W95T agmW9F1ɖ9Tq!I:'8O#;$:זP}::9vaXK?e$%z! 0!a_y-a$ڠ^KH;S|u<b0NUD{xa)QbSK[^eI~Ǵ0y0lr6zOЇ1 a=N='ÍO5APdIKoN6حJ%цXafX=7Kx6]W1%xOfXx=.4ܶ4ő|m~1d0J<М9~"q30"[cBrĔaV3(2fdβSQ" 2BI)̆ ),]"@be(ֈ1e艣˜cLR\!c5b\ZJ6s}ل`ъ)ޫiDڴ:6*1j0m^VBk_75jQjSs Ljަ䷘Mk?PKhPKE9@&javax/crypto/SecretKeyFactorySpi.classN@ƿBQPQ/ 8؄"H\Rfx,O&|8*jllҝog~;_^ph#p4|= \y P6,b;7!{+J}_pkc2*d8G"1A{ғtb8/PVfȶ d.fBF^hs=rWŴjg2&cՓqyY%LZ‡{K C+X*CSUS-dWE3b@FY9j!fX{M 9Z ZKma R1j2*~S_>PKGjPKE9@'javax/crypto/ShortBufferException.classO=O0#Nv&F٬IJ ʂ|̼Ԣb}JvFļt}FԒĢbFU MC R@|kFҢT̜T lH##30mce`؁$PK{YPKE9@*javax/crypto/interfaces/DHPrivateKey.classuP;N1}$, (-P@BDŋlo6RpYPG7;92L2~Ir>qxԆnW\hz *a&X%6Ȧ .jF_] 98]L9DW@Ac>MuQqgn:t/GǓY'uX-3B W0|ɂ! +F.:J]dɝ[ؖI5PKD0PKE9@)javax/crypto/interfaces/DHPublicKey.classuPN1=.7 PPKH!B@BDtpd|! >Phfvg??b@FM~U&4ϩR'pTz쬹@NXӾT T`բMljԌdP2rڍ8D[@焕Ǥ}iWs-?}]}=a{o]ӣr(%#BSXg"Lr/a:("RArk26PKi-PKE9@$javax/crypto/interfaces/PBEKey.classUON1C B%i8OAAiYN6}P =b/(F+|8žBp4Ozx.)ld d<:BЫ5I4 kΜ(.'CMvFKB7u6DmD_+?_EFBs0'۔uWĈ] _%e'!咠-8º )@M).Y%.5{PKc+PKIG@javax/crypto/spec/PKPKE9@"javax/crypto/spec/DESKeySpec.class]OA߳Xh("M!U/LDjM4Q.t;)n;^pGL/Iؙ9L˯ 6#qx#/J{qW/VPjr׺6n G"P}n󫎐oD}YBqTBydNIoG"V&Βy}zgxu#?$8{lݶL|\q}˜TV/4ѲG*y/)ډؗqQk&x ݁gl 99 iZuqR`2W k ܘLZe5wl++EKLN3,qoԓlJ' cVf_kikPK{;`NPKE9@%javax/crypto/spec/DESedeKeySpec.classP]kA=w6MMVmS*(6]!4T!h&C'IU3ImfwΜ{k>2.ʄ [dJOg5V~?w# K$δuOD,uB%;=B?H+溨7㱈Tȭyb+ e,WBH:*GׁL?A$ ˝$QObQQ7g:Ksp۴1WILΛ;潮Ox yex儇&yʚqx>%>ޘ QeE[FҳÒ]2:%p\,Zgys-k+Vp{J4h];1Fm:ڪUN_gj x9SofS:o4ѱ>`ѦW5PKer7PKE9@*javax/crypto/spec/DHGenParameterSpec.classPNAU\DoƸUcbEB}X'0ddM^u=5 ^݊M C(]=;eHxc%,1{U C\R_0XFaԣ'C+l8 骁Mqw}PlF;\IS~s'~1k$ }=Fu[>x[J"shs( 8Dc0$ffFa!6<ΰ` "a5y:琕>i㛋/ac8P7g*M PKQd5MPKE9@(javax/crypto/spec/DHPrivateKeySpec.classQMO@BQO@U~`ץnhIY+=x'}޼@:b =>/M5FCaMONb"BƐuF; KH2v$'4G.t:anU8-jA;sE q#tƔ:{䝾`șmIHMua ROwPpBꊡT'E3'T{ =-Pe5D7jbX$Z(@Y ֑ Rwy# (F*^grAn:F 8 sŹέ`*PKdSXPKE9@'javax/crypto/spec/DHPublicKeySpec.classQMO@BQO c+ƃƪ$nʒҒ%d2~F<{ffwӯO-H0ԆxLo66sS;}[|֥Ydm8rSH3TCvMrcCX8B0\P72@;֍#ŽFA9syIe"ːtNG}=}3t4`IEĄaOmO 2(CUONO {&sG_~Bb*Mw a5 SM laj3 <v() "u%}@`s07m\%BN8UPKi?XPKE9@'javax/crypto/spec/IvParameterSpec.classN@* 7o+hLĤ ^ VC@Id(DJW&.|xFqsO Bu$rrl*^<%2ý 2uI'0&L:s7@ wTתw Ƶ$3Hb# YBǹ;wq_G$uru`?gBB"lo<=%M>m [oju-tr䍫 K+cm*nRKu6q3 Ω2\$1c-H@Xm{)Ƙ[_RiD_]PM*\ wB+& r6nPKڕRAPKE9@)javax/crypto/spec/OAEPParameterSpec.classRmOP~:ts@d~1Yʒ՛rIȿJrslc@~잺lOD=>v]E$T3 Z\hȷ‹ Ύ7Q2:K9:ф`u†3kP9KBi W{1 UGp ԁ;]%8Mv6æs1G/Rr䷮L3U+cn/(OY{ 8 ۽f}Ƽ3=$8a gEO.a`SX@4;"GRūҤe&g'ܓH]=`_Ī8OY(_ER{؜2Y{ʻ{y;߸pka`xm԰e>6+ lV^AFWX! I=lXvkIA6rӄoC40~qh긎-+o~kJ_)s+(7f*3S͙ʛ/W6g( MwPK PKE9@(javax/crypto/spec/PBEParameterSpec.classPN@=*<5.n5&B4!!JajRZ2L ](㝖޹ǝ'sH1?;OtL'u:W|,P]ذFx8p,C=N*_! KK}EMѪf$rHc%yt͌ m鋻p=Pn.z\ICK .H=!؈3b( nk ut blb#lƕrŭ4˫'6%˄dޑ{&UYX P@!Ec: J$*QZ>fi J:kYӹPKȗ/S9PKE9@*javax/crypto/spec/PSource$PSpecified.classMK@iDcVzIEz" BB5Ok\JL%MEAG@A\؝}gvٯOXvP"܉GC z2Zn?JJ(y"|IpO/sj`0'*U7"uؽ y&L*g+Tn,HdJiyЈ\1aUB7H;A;TiRy&tytd@oh;D"^1Æ{15̳ fr/`6j'u9^~1 D F cHf%PKg#8:gFPKE9@javax/crypto/spec/PSource.classuJ@MFcC+běT)BBm[ҤlҢo'C4PP3~;_.`)_gS/$r Z(O*7mwp9fNyt]p/H0aT}fwi)l@ծ{}pm0veGz{ UPqnDa%` +9Yqkׄ{k-0]ul޺Tu F[eXu,Z#o]|ҶBeC֧ZbH5wP;e_AYz]!tg|AyNϵšTkeo2?h`Q)Z|F錑 0Ago@Φ0M 0=LZco!f1o?*ˑ>w'ba܄p0?dC܏]-~PKx.PKE9@(javax/crypto/spec/RC5ParameterSpec.classQMO@1P > [ VH RpqVaQbTks Jpy3o `k.r+q#n@]'_;="D&. Yz"z'+$.ec JR^7hI*cP}",!2\ g*ǃ~[3IBZ># ɥ #o~G ?ӲM0\}@]&SwNW&iku4.΃K̴U9tf4Ёzȋٕ(%/{7<)DXX4垲.jgOUY.Z/up@ Q&cC!Pg`N3ZVPlG+B3iuU(NC0n䳹|ϚEsbB{slgGʹZͪUiF[2Ṝ˼cowPKtPKIG@javax/imageio/PKPKE9@ javax/imageio/IIOException.classuN0ӤP(l6TRT)Uw7XQC!M"Qõ}Ϲ>\k8z+vBJhxKȆ)beOHB8Mt Φ0~R*ح#PqH=,3L,TM/e8{4ӹ~87 J&LJ /ɵљ̓Rjp2սh5)&;PKPKE9@javax/imageio/IIOImage.classTN@=@B)/ P0bn*R (}bQH*ۡ?ZMV[l : !$X5Dd UӃz'$RGne(V0@'-8;#et1w(}0h&IB0Mqګ PMxѢcEI:EMae Mq WaAd[9\HP""SH.rN%9-#NsTXjxAO# b Zgulg2O0ky>b؊wHImFPuHHߑJӜf/%իPKS PKE9@javax/imageio/IIOParam.classYO@gCJH}8\ HU* i6ȱQ;}ԇ~~lgS'ٙG;8 [PL@@/V5'@"05|*6d4솩A`@ 5F.Y6u1fٚAm4U0Sg[925F4+;zJ7U5q2 ۧƥE vHcVC)^x-̺Ugf٢]3jNYtֺ?x if& yɒ)<@3f'=f꧴9g/(W^hԝ ЊRM?HX`r{߹@7ܱì'b6X.R^!dKmJrgo4o_X4WP {A66nick ;*0YK0Άu!+4>Bu+#Nv&FIJ |}OOĢ\"vF*ļt}F̲ĒTFi XkF12p%ecZ@X@,v PKePKE9@javax/imageio/ImageIO.class[WIǫC,%  zمe n@OC$d|}s|ڳ=df\Kuկ]Uӝ6M?$> ݬej,!N[+Uh!,pe7*M-'{os:M"=w̚U[+⻵%p=gZQ=qZAXV4*'mߞ1ѰؚO|qb4G5sК}e\ϞY6n<%jx}xc}HdMubufЮܡp̊@c@,[Ӱa[]n3˽]5J%qXU*_%.5HИC`ҧr?9WDg]fǓD`U>1B0Pqv,0T}mX+<^HWrJp@v<Ϙ]P x#.ぬ[Yhv1m<m'w~ ¢9e6ʍG+=5?6aGrc)_5iF?5ER͟62TIY`05WZ=@pY4d hpCڛvފ/ %|3P HYXhq6nk16CjWd q|u%ـf"P-H충$ [Js rCInVm% #/~ V`nD'Il.I.D/RIlIvG"O]x~ =oPK1 ?HePKE9@javax/imageio/ImageReader.classX(kmɱXxHr5lٖ,8<('+(MwGڴn4Jik~0Cxͻw "=dY^z}ӈ֥r=PB)  GF9WamL;dQ-jI5%8dxYrtB `$hIPrWR-*іhZM1jhܞd`AM E;E5,8ȋUFJ.I NiyPX *>Of_)H0Prca$ؖUJt% ή}#ESR.M 18fL-x1YOSx.d Df\E5-BZ.fUdX][#1Ɖj O=< |hiۍ@D;x8Y r^)WybdIYF<<'AfT gvG]\pVJz0 PdM 'F &E3A`G<ջ$KeAصu4jg,XzX!iUhOKy?ĵǵ7FSQ1+Ea%iCmG["5nE}I 'dz" ͈x ^ MB&兣g*KMh4$7O\OWj;c\ބ:#MhҚފ,ל [$&=4LNK] H]Zn]WԝQ S?:N{S2]jY`T3h24k5~¹_UxF_8:d mM5g[j\ܭ5^m"ڨ1Ujn[Wtw3'^U:T@ ,c<)řlYEG{N _^ Z0G;Dۡ#m(^4+ xed׏1 "pQCP5TұHSָ]# otH*e]A8wY Nrk2%{x!V5k;o5.dUM;9["ܚ~(#9Dq?ouKF k3(vx{S@"wݮ=x)O!^#xm=6}[ Ȱ pChR8 CQQ AE " 1 iy'9蒌Xx*S,sTqԳ"}# $<-qAn"8!TjJ_ OA&8h.QKVq`&ΉSx&,#x N w0eY;nEkF .%JNY1j|d>aW"N"hxe 3&8-Z %rs $1,׬MVuZ\Xs |hہ`(KiX^Jp` &rSRn||#GL?2qyh~X7Y %Os% τ38aU#Xuڿ>q}*@1؎:vĠeˎ `6zs[veǨUE_*qjQgSZht[qjq{w]/պ8i2PS w#TӸBմ6C= vAPh3а^|0%jbݡeǬB} pChx*_ݸ/4h{I›!4(&U;~X0Xp(&'G#p낏pG@F#}/Pw'":bζ#&\=,cn?PKh& *PKE9@#javax/imageio/ImageTranscoder.classAkGw.&qulBHVf]Cxo<"}餻RUΗ @Ƃ:9Dn kl<N"p`ej*lM>`K!Y84v%}u"+VLmyDnd` Sln{rl^rJnYpIaQ^JPK)ΐPKE9@&javax/imageio/ImageTypeSpecifier.classYSA{r%^0nDѵP)C@ZI6YdeA&d*;1=? /C_7m,Դ:[J4S9ܤvzU2o/Nh!Yy`<n`|s)(wtB)OxmAftlkM i#]4}`)<%w`a[nKL`Us0a/ed]ҟi;&ph3ULtшLѝ?5P(cU,kYGDez畬Y/Va}*T,S:VqW@<Ś4DeǼeS_%"{Oq #n>0~cxh2fTò)$:))R : .TU9˃xY=+mJV"S:MSk&umf'Z߄% UK@ЎRB>Ԅ!v_;to;n Bƅ+p_0H%p Wp 8!Q/=EP0QW` %K.L@ ;8JA)}b W5@ˢ2J f> 3xF8Sz2,̵󠵬`Uy}byXk9S}Ĝ9 ;-m>|_{PK^{} PKE9@#javax/imageio/ImageWriteParam.classSFWcj1cH>R3b s[f$6:Sg@NN'!G%>{`~TstU2U<҉]O@DYK$֊B~rV>UϪfo%*La*RzC59L1X*MjѲU}TF\)T'{hsC5I4 ڑ eKJŠ6G@:* vmy;TzYʣ͏U)Z70uuw$aԩ1uIz9p71U]W;J@OfHFsGS_slrb[F% TbT9"H1KiP"K4bId[D 0,N#sDST>XцZN΍`7NΌ K|諬 xW5y4tŻJYtǡLn9W.wɥz BY6,{:^5Hw3YQԸ/U〣3ot<jB]0asNoK23fN 476u>r|ۙ41\uKd*t*҆fLP sK H #p$).?ier1y>e|Cy \~W\~7,<2PJ(o- ?XK;ʌXS<7( e&8Yˁt]М Xay BNwKB2\c!C*Ujeۄ-9amx%Dz ɧzGHw&$Î/.$w/!$T)$_+_rKHT-$K>THτd9\H@7]!Y @ sr}_>q%,YB1JԠ"c{,[F}9 BXMks,]5qe%x+ pAy_cѧc B\-9}{uPK]x\LPKE9@javax/imageio/ImageWriter.classX[G?EPEQ@E`Pi]!M6q_ЇׇTd7ֶ̦avgs?7o{ʺQJH+jPBZq$hH|M POG+Z!KQX(% -hPECD D`5iUS UK/uUJ/UډʀsE#_4 tw^ϥuZ(ԂA5-N pɶ'4J/EK N5#ƹ. ײ:UJ%?U-9_YYW?jqܟ7 f0P ; 昪*՗YǙwk3dUQoNuE"Pt ..E[R~~&06GféXt9Tp8Yz&hQ@uc.7Qƹ$jN+4@/=s|BD<֩7%i,PCI)yl,4qNM݄G KWIPkI;>?Z LW*o FMRz1)T{RՁԳtM)f ?A&43߼_Tt%;1:Z,JPN[JT/a3 X.5f6}Hb. =_Hy 2OݍAL B36f&p@F8R* 0[qQ DCY@V,v!ɢNרT9, ! ?"bIeÈ̪Y{:+:(QQ7n@vɰܤON|K5 Mq rk\e3gVZL5+&a.aa"bQ`:Ɓu{wNI3 #t.2%qb3l>C .MUlvgLd;"a(fc` tZ*e#{lQ.5fœ"+xPJX^2)ow@XD-/̇&ǯLoDsMA MЂ{ :aw:w9\kp; tIzo=ntA/m7 O}VL8-A1;C "b*<3Vz‚eK8 d@F|! !&BP !ąj N !;n')oB_g`#iX;ኔsD2#ʺӜs<{,,X7:ı[E|bNKRF%N[s 9_n v {o6 omJMOʵiK*x-W}9 PKF!PKIG@javax/imageio/event/PKPKE9@1javax/imageio/event/IIOReadProgressListener.classQN0G苦 i -L$ }g}-p|6=2hǑ>lUUT i 2M}9F?B*6bB&MW5i+@iVF21G|u1ͰfΆYb^8_%J/aٿ]İgPK56PKE9@/javax/imageio/event/IIOReadUpdateListener.classQJ1Tj*؋V*xv5%n<>IO |_p '4wcN%-)RaEhi K  r4h )gK0fD@@/u=KWv]lF9E{U .3CzwTF ml1 b̾$AmkdOk6Ukqů\1w~;M'QR@VQwu߀PK^ PKE9@0javax/imageio/event/IIOReadWarningListener.classmO; @}/ ,Zbk^V֍z6 ]ED03`v a'y 3Vk+(YmJg:Zl]/r3l B-+|(-ii AǛ ׄpU&ʙn. ^$7@#\ |PK#PKE9@2javax/imageio/event/IIOWriteProgressListener.classJ1O%Z:U֕B3gLH&S}6>%&up`CLPHiAs*HQ UHUJ2 'D.LM-&QPkrq=ou%ϐg/f8] =?@⁾}*ojmtԖg+̓{O7!]) URʻ"p_][o0{ }w!u﻽oPKpzPKE9@1javax/imageio/event/IIOWriteWarningListener.classu @EB;?@\M^6M,?JUD,,qXF沒2cu\"QhX,k6D!u&]Ω " _ҪB,!o$MKcxO_ϗ ƁdC讏Iy &yԅ!]5ݗh k>PK=)PKIG@javax/imageio/metadata/PKPKE9@4javax/imageio/metadata/IIOInvalidTreeException.classNP)UA/BW1`BBd!qhҚZ.+>exD7sf239o/eB#܉[/\/#HXVn(eslH På:!HQ{8PjkNl VkSpZm0k]E!5da0=O6~Sj,2XDP+/.// q2޵UOztԇ"ZB˥FLPKef4PKE9@(javax/imageio/metadata/IIOMetadata.classYSA{܇ G!AaYe;&!ޞg`: A`^+rhY0AKTPcCw@@o0ϰ[6.)Mܳm ,* WbiLCE_ |:KHp-Ҩ 5Q$ЯAj/[GJゕS훖k-\@X0^#s`Xu?g\3}B<80lM4F4ӄdڗ/+̪2kʬc Q/75,3? 72Ӭpe4JcBnR˹ J4v8wP.>j[ʹR(: fXlra-RB(l9ԒB҅uxN3߷Co9'-A۶!o1#0*ezASq o !xcG枒$zm8s 垆&_zI4Oaf#W &Ғs0ߒ֒9ȇs -mk-X}FI|!SK-Y-i k䜖\AkdNK Zr=% hASmqb'%« V5l`dSl]hw3I`Z+r{+ Gĝ_R'&Ŧ`P@$wPK%F PKE9@2javax/imageio/metadata/IIOMetadataController.class;o>#Nv&FIJ |ԒĔĒD}OO_(9?(?''AC?'1/]?)+5#1$,$A]Ç֚Q \Eɩn9@mRX@Y@,v PKTWlPKE9@.javax/imageio/metadata/IIOMetadataFormat.classV[wF-@Ҙ\H Pzp@C$Y2CYrdɕٕWOofwǫ`o>!POO{'>höV{;I4Dt#qg )svmϱqÌFV$+gp#TqYv/<h.[m TzձܼXuz-]Xh-s,%p^g˱JfDq֎YA2{ӱ }.rr;-7BsE fsc`nX. ZSt:'4K֩".cU eN4SqM10xTwƣd){Numa rn&p2#ÌQƚ8"+:N{KGQ>O'r"p:|$&b*ќev1&N*aV,*vy<$"eqS_Fceuxknj|gJasދi6Jq-J+s :+gxn Mwm;żQ滠M҈ު| l6 6)UVVێ WkSA=jakNЎPĎnNERP1'vBHWYNeY*q(-w-||PF5ę\55`c-*T;+ *Ax 4,rdlwPJ|cܢӂ%>.*3<+-!!m`rAg)7ևYo؝wM]$awѯSPŤuW<-qH1\Dg-Vro֬bA矼K76b5ERR? J&'{90&:%,Y|!>}&, %e+0̅uxiK5pϝ&D㙜6St >*Wվh<+1f)Dnbf^.6p\q8 !i1dư&-G`OY&cg"BC\])K.B=Q KU.YvV+ By.xв4ܑvaG '8 Op?!}7|Urod\/|[m8X ØДJx0#WKI*SEK2b}, (B;VX5$bc8XhTe®8c" WeЪ"XOjvØ צ=q\ni=+ !/`CM6412Qckژ1Km%-i}ri7Y}ƍm(( v5&5m F[EqcZxk03`j`+Pm0 ekƴa-hXSiXXKgt6AG%e /-2窃w >bEP}`|͗VEG< |=b.@?PKY7PKE9@,javax/imageio/metadata/IIOMetadataNode.classV[[I ( F o(]$Mę {E>>QmuO'Nf:tC2=}NU[ a9$GiDt%I:Y_5@[ـ7m^=yNt),Z6.|e@OxdM7isR4/J4$B粦M*]n]Еu&dozzL iĽϬV 8CejMbјSdkr02|aHƎyT&.]t&㙾<"|ySfd='_]PK &>w填ؼ\w LDs-OPElCm,n Bφ?1i4m6}ZbȌUcZvYRd0YMVqK2?vi9!;#3'?]Qtƺ&V.-[YիҴ{Ȥ덿cX^ bL!L#)-?9+I$滙@}2euK|V+.Xԕw.cyVVR$ -T<]6ٕ'r p @NA ;g y4yj/Hi> ?l'w $>=l`6fǂ&a q$j ႒!M" ?.rz\A1Kqs 16 G n-G=ۂmT\R(KyY;J)r*>Ȁ[RrHԈTfJiBR3 #RsE8yGPhT9aJdZ\| EeS TZ( Q<| k~W밡X^k Ho  Dk654ThJS o4vZle?kwܣ5n`1vsыl(ٌZTU\ȶQml DPIF1:8UeJ1QQ+"4pIj%Se,#{FcGM|ByK#(ꥆV\+*^H;pU>fXKpUQbMAQQS+(ὠ`fonԞDnGE놮q~PK,vPKIG@javax/imageio/plugins/PKPKIG@javax/imageio/plugins/bmp/PKPKE9@2javax/imageio/plugins/bmp/BMPImageWriteParam.classQKKBAz46-Y#A0ZTm~TVA~@?*:3^Ĕ9g{0_xS•+R|c|NMZdWfXZaȜ*OEg Ad) H#P(OP=1t$C㏄G24; f Ǒrmc*ZːSaϟ\ϞI=`ȇ2Cv}8+#V4:A:ПMݚjN:>| T3,cja@}&o&_C2(%2$z]Ҩ,ʤ=ce9K6PK`LzPKIG@javax/imageio/plugins/jpeg/PKPKE9@1javax/imageio/plugins/jpeg/JPEGHuffmanTable.classQn@=SӤ6C^pE\%OglؑkW"x(RU;gfΜ;8,`8^+~m% x2+Y>}fK\/J3U' rp8¥ x bXv[@iWs]O\_2~͐F a8DE&J)j(e"C͖,'"s]x$'YR쌝bZsyIG UOĶxJU(6~"(Tu$r;zohz$$U]UߕR>gCDAQ)eV,'gGYLXF j;r+"!SDx 9 u % ր!'H_Ř79ՑHNp/xGr]2@ǼqlڋsosLho=?DkNl[?gZPKBաPKE9@4javax/imageio/plugins/jpeg/JPEGImageWriteParam.classS]OA=nGKQ@MjX$ԘD4@OCʐB~?xgvKʲ&;s{g.gEO?Bv^'lK׷O{mZ}Ob{)`I0 2Tr@vf;`uJs<ފRC{QG:lڧnR`km)H}RF/@:H@&AM=C~/uEӿ[YÝj8ỏDzIsB+*oi @¨c{ZN7ZT7r@}*`"^ӜP;h] LDc5r=p 'vGBcRk"4`|i( ;LXQ/D l9֌,wsB!"rPƚF3sx4nb/J.Ⱦ:t` 8=9,c],'[ɸ:,FEL<'odאj6/ٙ'^Pwϸ9S?PKW]6PKE9@*javax/imageio/spi/IIOServiceProvider.classS]o0=βf ֍u"  iRV&F_'$(č7>k;ר[0y?;=!C'H-T"]^ ed;sٽnlİ?bx9 ާJ뎫+x V"T$Àt"24; f3 3X, ŰcZ$% ]w:O'1[X$IY(e^1,z"> 90" 쌝KQéPiXeP7N>"md-CE ѩ&z6ayBC~nW-EWp\NξHi]uoLX7`b^Gth,ʡ(}-M ,XUTh,g)an24x'ېYTd43հױ?Uc)-ЗjfzrG9f Q밭32C42i)eL_f?PK v PKE9@+javax/imageio/spi/ImageInputStreamSpi.classS]oAAZڂPwm-j M_&k/fX&i`'?xgv lLe\#h ppAgc3фێ1JW σE`?,q @FGTNu\ *!#P]O%w'f딀 &Et<`{:!v/蔆\IҒI%l` LIqרhLXkcsD(Jl٣Cĺ;g4<'ZI*b)4u?h W m7sPKWW07PKE9@,javax/imageio/spi/ImageOutputStreamSpi.classS]oP~Oہ0m ~90&M5b7PN@K 22~y9A;s&RfJߞ\8"dtx CaႻ],5;("k)sB}T=y1☀0A%(@@>{;X&g.А8I#u5e;E zĢ$JJ₆Ϥ<6GJ?.V\؀g5)Ċء OGɐZՅf~{ g*AMSr^ "e ;N۫ofWG`Iz.O% 6bf3&Zv J_UK9Av`W`b֤@ ҍհӔn6~Z ' cMF-ނAxܨ/k QKĐh9Vn73>V䡊PK 2?PKE9@&javax/imageio/spi/ImageReaderSpi.classT[OA>Z("[4i ">e!e.L|0>73g(Th~ߞ97g?@"1=1KeW ƍ໶yl@Dˬ} Q,6w7sһ-ya`TLllTL2йS;KkǠʣ`@^R]QӶfU Fn4A ܱ gG[2*6nZfetxVD z VU,cөi j$ Dvpz@+sӝWNڜy %,IX€H $,f)(WpQBtLgӶr'щm4o]ZvUNj]JY%kjca UWX٦-ɲSdazR!uc{;j4۾p6 FR-!2zzZ..q{f08 !F6hGlG!y1|J#O}/H4_ 8tST\ D! M~,L$Ib2z8ĿIS&(`H ӈ=Ɨ D$6,DlF#Ğ 6 cTcN)(g#Y Tt{y]RȺ1$8ѿ)<4U ~gaO~;LJjsC%ʨJGuTa|j\60)r&5U=ePK$EPKE9@,javax/imageio/spi/ImageReaderWriterSpi.classU[OA>EDnmk+PWk/FاQF: ,dYO>OMЗgg,/}{Μ9;gן? oC#L[:ǫx-רܡ3Zb*y S"ZXG /u 01*,状6$-*9f6-QԬ**(Ъcp)s2ZuUSbҤ6onEf)M)kXJ J6KѼעf^FѦfZ%M59NnEnr{?=#`J,~xQj NEEvI+gν 'emB™=+o[S$aYB^ŠU k%lHܱؔ/)\VWpU!,3{dڹNv8jxon̉KF1=8ZUq>M(fn:9[-tLm{v5'3;Aĥy-ʩe%183#ZӺdN n١̍ 2B {F*B¸~ ~U#!wORʰ nqTA#Ua'62(ֿPK,3DXPKE9@&javax/imageio/spi/ImageWriterSpi.classUNA lc¾$þdA,6D!4 =f@)D9D!9R]t{]]5A0: Meͮm[7p n]2k;k{G~(vwA]F:hE,hEݶ S:n3h ]vjr%V07:`[/f@!-#LS-s+9)z@|WU b0Z9.<&i&=Rg 78ȭ`%VtLg5-Ιʹf]saޅ]Xra;t V8pVy cWN:_q/M)\{q䍫D*(nw6mG7 ̡?w>ya#ʦdґaZMrI7MSW-ٙLmVdk9~=_Ƿ {lt'S"mjb,@XsMZl*=۸,r2m޹SRυ?^ d>*lf0b "B?? -_x !DNҠR!JDdL$@:J1v?% )ndb=!/^d>b}1.@l1Hlg 0#"YEBl Ğb\$vb) 6,> EDn]uܭw; '=xL 8:>p98r`2kw ,߫쯫\72PW{9xg=_j/_PK &*PKE9@+javax/imageio/spi/RegisterableService.class;o>#v&FլIJ |LԢĤԢTvFRļt}P~KjX}QbIf~#Pc &UZ rI,. cd LK,)-Jed"-;A|yA(n /-JNu-z @ ]V6 c9@ PK8dPPKE9@.javax/imageio/spi/ServiceRegistry$Filter.classA9rH1m3Ii0O~| 18S-tVZ%33x%)i\g3jd*duf0ߎgiFz=.U]˹j5_B[&laѠ臵}',aOO>x )D;;2Lā&#rOɃZBR"Qeq1a.~w~X_a&:fY8GWrI8Oa"4>~AЛ{ NT=D sDUS3ؗ!CAv أgl>C ")eRuzvаT! HaƊG#~)`9[+ULC5em{Q/'5<nP2 \ pgDi_M]Ѿ( ~;(j&~yw4Fw ކ;879wAx1q1w6F!s#YT^!b {b9 *.&Bu{#GrSc-U|dTn>D$Wglʸfd(Hw3xIn[\5f?N~PK&rPKE9@5javax/imageio/stream/FileCacheImageOutputStream.classN@q¥iTՀU.@* !Ƞ$PlX!uC!Ό] pX?3?!F/Q)uOd8>%.1q(+Ct]o'w5rF(v0`#a8*^ (aPٶqBE#{g2&Nn#nw 3//y_Z09'HHa]YNqQF|75*c>G.GPbJ;Y8i`|n% ç5EwRr w-'Քk9/VDƢe4jaoSn+|ʪ56|vA5)f ObYF&l4KX2ݴ'PK*PKE9@/javax/imageio/stream/FileImageInputStream.classN@ϔBQD5;1I D VCڒʍ+>e3E(.n̼útx"]~+_ @pr&V%tk]`N!u(=15V>(ҧ=Gt"{q}90'~K@&$&EIO\tݦnx-fjuHft'Cڿx@KqZz}{\mZa{/գ@ RS qRdaUUTP40ͳmWR( knE'o]W2~Cy虰wSF PIRl:>Pw}A!r:LoN ayjg0ly&Xy|:9r9D;VwrG2̲#=˹xn:XcUul&%tY*]X$>Ae()E#;~5܇D)#qho 'a<3r60 j'p^q|.q.G(*\A'&!fQׅ`VJ_Ю8$u7ݲt,ɟ}W ر, -o Bېr)r9 J\ZvM`-;m }Iƙ$t{դNI|nDj[P6Hr8}罃QZ]<{1p߇N2s?9=X<]ۅl>U!}kB}x*|IN܇L,EX7lYl<@POH|W  w @P Op7  ^Ezan 7m0+}_Q} 8by(8#!wr#>R>v?DM .3w@03d0@$x JK3p,zĄU9rPK0PKE9@,javax/imageio/stream/ImageOutputStream.classuN@rQ0 H2ĄE7fRJJS\>qBƸh9/(;_G"~2>[DžZ*0BQ&hz?D( ZF+ng(<,xYS=vJP{^bbx[!nrJod'Cuz,XawN6ɟ~>|CAucN*ێ߶jɗb֮q2TǛ~:16Dg;}08 0.8Q3j3)xWVnAũ3./j^8&NnzFr%5ӖA_L+ewDJC54k&2: {^d1H UmpJηK2Qzr:4n*يK>GVʚD)e>! y U-G49)";'sR٨zoP!. d~n )q*L_s\9퉖Iex^EY:CDkW;A+oR G!|/C.(iw{C E%S}i//{9V]+xvEIFI{OªvhQx5%]/] O*is|.߄7PKEb PKE9@6javax/imageio/stream/MemoryCacheImageInputStream.classNA]\E&A:hP 01,K;XX>,!S|2m '>Ӣt^q[zswzQ3lX [;3\ȁ .Z+J`ռZ D̜@܍ݶx/uMK.'G R K Hvմ##i|~0عVqԼѪ10',˄ixc#~S1}cR EsH TXd L8 lj@qlΰiIKiVc,R M127TYKi(ܑAvf,v_{TPKeqiPKE9@7javax/imageio/stream/MemoryCacheImageOutputStream.classAoAoYXE,PZx(d  )L%RwSP7=̼y~s!^ypBڗߕ(To*?/[rpQ:h2V+ۖj?rXG Z5cuං#d'dj&]l:TMa 'CmIҍs *ͱ@M"6 M*?;xB@" ٟ0k&,ڬ7f2`,GYodxO42PBJ\XKE=v\ %Fo\( s$Wc3`m38K_RZʹ+dGB"u+u$Pŧ\EpC^Ⳉ@bjS+&J)Ofd(P7ƈyk=ԨLEֹ9 kPvo=%>ƨy$N_%|7[c4EfhA6lY&e `E8۔w(v!{F%|IU(PCSP#s PK!H)PKE9@javax/jws/Oneway.classLMK@}SmW[?QD=Փ`DыmʆFMk?JKyϷwgSYW/K{^Za'9gAG8Z"` / PT󌯬cI;'[ډU$߶6'7]WI}lVK@%w8"GR3rI9IgZz(/Gšlt66`la; |1v1PK wPKE9@javax/jws/WebMethod.classQMO@BEA@bLh‡ Ē%yiLH XU҇6Qo&(3g7gï.<Ǿ COL0h6+w 'Ú(fzdָ(U%TO\)Vx\/ 7=vϴq |`k;?k &sk6Nlx4xh-v1 ^˦eTaV`mkpXO~F!Y8影AX"|x1Y_9H0xmI{qZQtQI܋* 3\s ,)֐"LJ2yOWWWDٱhlS-}_jdea UozU#"\Ax`r3lH (K!e "7]S3DwA!- vweU|鍝t j*;ǽ0#ir⾘&x3>))c%u o%zG_vjQX`y v.grҟ1 ?PK {LCPKE9@javax/jws/WebParam.classRNA1 !< +qFkqƦcڝv<~G!j0ꚪyxMٶ7n:qIc:RNq7Ц~oi +QmLd#BK+dwvfc Cat! +;;تxPG-SR*/*ϝ7-Rh3ѱHSV-%IG7Ϣnܔ?`2j*OF {$ F]KPkQ7oy~TJIauz}27KԬv֊^R<1:I$qr鶭8,Woop0lYycr L+' ُ; 3X"FK,/ ”o(Wbh\h@A-ꘒ+|M$,W\ W7Asџp/8ԾP5I-Nx(5`S|Fr ƭWXv]'Bi膾wBFd( TZIb$1 08]pU(u~eH[H gu [xR%hD9n1,<=fˀ"UTe(QN4&D@{Dh ]؃C87PK_QfPKIG@javax/jws/soap/PKPKE9@javax/jws/soap/InitParam.classMOj@}ciZRSo^\ PP xE6$loGcfޛΗSh>I%JU9ji[sY6aUݫ.ѱ !|4,[;v&6ږ3M}ȕgi-r72 29Os]:f :魩.ՍWExh~fƒ - >ԓt=,PKT#PKE9@/javax/jws/soap/SOAPBinding$ParameterStyle.classSoA}"Jki 6/`-iKzCGswT~hqB6Kff͛s~;u3 ?ON񣼾Wm֡a5npS1D$h -5;*,U᨞ //9T"4aNN|r9ļ )Co~ůT1%Fn "+3X#DՕS,H|+R, ۣ7JQv3~Jѥ?qdhEf19`W)*}$CkKPKrLPKE9@&javax/jws/soap/SOAPBinding$Style.classRoP=o c LS`d},LĄȏ*e5D22w=~>E,1lskX,#׏hƩft=U.GetfJư}[/6 V.Ȱ\5QQ?.;fh!$MWqpzaUB< $LʶIJr#} nxy g%x#fa'J[WBAGћYC*Y?ku=WJDr-O3G%l#SLSug#Nڱs[LDI-\ě$^JuŲr4On/fG} Hs(NֺbM*AmZHePMǓjxcp;BY7/" EQ~TqQcpeM \ $\NE0FHnX/K?tb1Gh X'=(1qؔ!&$əf#<h#c^H]QU]޷j]FVxb+< 6'vHs&!2"PKHB>CWPKE9@$javax/jws/soap/SOAPBinding$Use.classR]oQ= ,-ETEZAҀt`BB|ZK`ivʿRFc?8w%B"ܽ33sD,0l sN=כkv 2DU^`X=On ǕRoQl)Q7<^ KC ^(bzym֩ !:52!`$?6e:xbn%~l㑈¡׻vci !CrJ7G%"'+ Ͷ"NW{SRJFnsRd(mY4*g |FyEȫϿwzhIB!yrBj5ŠzկX@'&(6hhH92(1~ CIcXbIKEpzx!ySqE'5܊IQ{c$C,y?fBsk )$C|PKZ^BLPKE9@ javax/jws/soap/SOAPBinding.classSN@=J) RXqEXӪi KYG^_"ڄ>xgΌgvnod ŐK~ev+So6eГgeluE;20xA#/fYeD$f4÷R߹ >|V<#`tʶmUꡆoMVGu2Ŋ[JGFCZյraa[|ts w5 CƉeOygHC ZDK\kteNĭ-<蹃-_l⚨[q4SRG>WJ( 7K5a / GCs@ }iZ1ZdM;r}FO\(HaK$s-`E ,VzgcRTl&Y$sPK0h޸PKE9@'javax/jws/soap/SOAPMessageHandler.classmQMO1򵂟(`<Mr"!F"N%KEm([.Di3~|@#@NtJN_\^фȌc {)-LhʑPR8P2&ubUXldL ӘS7[̱ˏBEdi&J#?bP0P($fQTF|c6} sy+/3~NbB_c%wi)Oȋ2HYFEMA%u`G߀nkqʙ>PK'g%PKE9@(javax/jws/soap/SOAPMessageHandlers.classJAEoh| dt۬FQ:"Lh~ͅG5b \Oݪ>CPgַZ^ekՔhNqVf3-BmUN(6~OKS&4oF0N"-U9f."P9.qќ_#5Nvl2%=~p%7xyme~I);!ms V UA %ʲ/xUĎTI$/8!G8 PKfPKIG@ javax/lang/PKPKIG@javax/lang/model/PKPKE9@$javax/lang/model/SourceVersion.classTmS@~&-QjE^ʋmA|iUV L')&)ʿA?;&ǽkF"3sfٻ|+,+hczn*5Umʔ^;e^klaӤz!0_/gϐ ЧLg\gȯky̓oVse[ P*]b/OE{ ]N!)ݩ~XV.E۫T4D8!*@L1 1:8CM Mh8 E:wΐ(fd:r1or4-lp۳6-PQ◶MG/.l1 _r˚AXY""0JV;;5"ѮYs*v4n9D<0=U XM1ʵ=0e ,YǃMCfܲ5!|^-aCeܿ2$N%GIAtk6C rJ]. U|6ۘo;| OHD a`F"#A_X Jp:"#U%8'A*¡zt#@R7ԍHú40jt#NKi=QMm@8Iw!I<1,S$0)Ol)O! M . Hiv6'ȊЛ@d.Q1"rF!r˸GcoD'Gאt脘 ˡW#'F,Z|o,0ȻyiPK1}.PKIG@javax/lang/model/element/PKPKE9@/javax/lang/model/element/AnnotationMirror.class}jB1E'Z}j+ ABݾR(hW KsxD҉_sJ'j0sTƍJs,-ɱ~q3nlB!+ ?Гق VpWط) aPa1d UgC2ԎPf 3PaSԝuXЎ5Ά0##8Ҷ:6͈t^(Ŵ,hY欯 Ά]k1:D*FmXL)}!e$;+cAe=WƿYx,&U|)Ƈ老Uƛ<<~m&a 94Ӛ 30k U37[ȷȋd}x`x!<2~ V `sxaxه_!.-Y˛PKRPKE9@&javax/lang/model/element/Element.classTN@=mJٺPZHŃ-$,J5BTB HoSgMTk<QU8nJlR QQ×18Ò@Acx(11<cH0d    EAiS`q; xzk7nV׬zj:2iZ/r91ɉϧ]#\e75 6%]s|[Z g'-H`ӁMvtWCJuUΦ'{hy m䆤?6O5;fkr*tVIËʗrze<эӷrO-@z4iӈӨ1OjyOYa>h41ѼWR J(Ĉ-F`L­^ n%LJHHJJp7(!%aNkK$}3%=BҒ’%hI$CV%e5I9-&鱤Tд?}.jqw1iV.fUu1kV.RfU< H(Hr& X&IU5$q Jюkϒ9 Cd01E&#tH&ԓXH4io?_f>iH0[CebSUkx3\I&^d[]əݥ~d:(Y1˫QՂu 6B|`s;j:$nJ.i\!"ZMFRݏW4R#{ Ij:r)>pִPT^7{ز-y1QtITfcO]<T~Q4cC) 6;pIB 98CEކqy E](`0w'xwg/PKALbIPKE9@0javax/lang/model/element/ExecutableElement.classR=O0=hH@YZ@Xba(Uj@#r:P?$% sサ';S,\ GQaȊ~8ʠSdE{.ɠ჈ !V{jZaevA nZ43GV*>3K$w(}-ldbpvp,̄/Z"96+_IcBC F&|Id4&iOP+7u6+gk|\iad<68AMthC. T ^To63IPKpBPKE9@'javax/lang/model/element/Modifier.classrD_$˛D%M64{q6bUdc9Eqՠ/cw xP?C<pZL3gϞJkw0!t?:~? :tް> QW@/FnGQ k9e[ 픛V*VܤQި5f!-wlBI4ܭ Hs*5m3ZU[5mr:{˭_u;Wxz {pK k $+d#e@`N2)Rl2jaʵ2d(BZƠ3\2 Hd U !pS" HHIuI)S JL3 KH$f8A0h@`Nj@sR}wF nSAo0J|G-0OOgW;8 â);PjO)ͷ=w%, lQw9=tA ?ݐ7;lGa9*nSb|R-V=LFXeN:je.yb&^ ,(TpU)K ,+)XQ2v̱ᚢ 3hSg聙8a^*’#,ay3i6 ͭ=LM#RB}$=/P.b갂Y%1^i xE+*v>az]7_dxTc jb;Mj5oP''Xxʭ_&!CwGfx՘Wx'ĻMPrPK~HPKE9@#javax/lang/model/element/Name.classm@XEbWG!VMTmjų9x%H88L2̷`DI`賾( =EB2!I&6L*VgN]Jr<hyqyks8tb;/?c3-n-Kva9.Y ~56@;DZPKϲOPKE9@*javax/lang/model/element/NestingKind.classSOP0  @2AQ,5!tcIQLyAD#?xnmdY Ysso~ ` "B Ɖ)oQ:4iMYў3 i2HەjE/W5uCDUhY)(V}NU 9~y+ĹvPXa[m2l!\"q0Hb*TFjE\)fNȈ m"1e88#CBʈcaDin8Mjvp-}gFIjhͻ0}oHawLfG"=-kS#x 5N ƫf+^#}5 /WvP}dadv&ޫ[FZaT=+<:Ԭ#:.moYZ迈lM+ m"OG_-&aLOHa&}0A3Q̊? ]kzIMtho蛢UGX$SUR?#14sW$Q @$k5Z?BL/}= S") S]{BR/_ݓG<|7d 9/D#uPKʼnPKE9@-javax/lang/model/element/PackageElement.class;o>#^v&FIJ ļtԜԼTWA?)+5(Ƞ^ԒĜ̴TFE MAJ83CFf (FҢT¨NtP-=t3; \@Fn8PKPKE9@*javax/lang/model/element/TypeElement.classRJ@jkZCE0े'Xk2 [6و?' Vvfyy|{Sw`4œ\%^(=2/ځunwOsvˠVG3U!@g E)42,Ύw &o֙IOOM17B%7B ƵJ $q]>\xS2r' ~5]X,PG4hW\-7^]B7 ᕐ4ۈԢצM:I]t߂m(Aߞ;s ڵPK䖊-PPKE9@3javax/lang/model/element/TypeParameterElement.class;o>#~v&FݬIJ ļtԜԼʂԀĢԒ"W ; #H DRVj2PAAP %Ny)Ō B>`sJK2s}2K 3KJR1h`Qt$إEEEv@Sָe&íVρ@\Eɩn9@Hb =)@2201+0$Aqx \@>7 PK2tPKE9@>javax/lang/model/element/UnknownAnnotationValueException.classN@ƿPAœ& !zj4npݚEKO&|ʸ6!A0ݙo~7cTH 萎,̵<& &BJ.uCv9r؋βHh:oC!7 2g\pyNpQg2a߲ǎ7sd%HwL.m.uXpO{.#(پC. ΓbZ>WSٵ<48$h,ID3F ʵj>A3A%w燁î~9hcA3gYu҇:WQ * Xjd`H7",'MZO#B&nl%+Sɭ(PKBVPKE9@6javax/lang/model/element/UnknownElementException.classPKO@((xPc!xj4 .[S[gă?emJfg{~|hc 5p,14\9sD`܈{=^\&6{' 6*]". c.xpB8TĶc8] F:>!ו"/CCUbrCwkk0Bl[>WuwN=eԎ-Eؙ=y=T3ہPJi$Pg]Bfg\-ρ26A4e,ȪW̽$ Qq+&` "\C5 ɬ'VX#r&nVf*SQPK9MPKE9@.javax/lang/model/element/VariableElement.class;o>#nv&FIJ ļtԜԼĢĤTWA?)+5(Ƞ ^ļĜTF MtKS2s@jY`bL \PKu(PKIG@javax/lang/model/type/PKPKE9@%javax/lang/model/type/ArrayType.class;o>#nv&FIJ ļtʂT}Ǣ A?)+5A֠ԴԢԼTv܂Լv y̢"kFҢT>@Z3201+/@'3pX @ PK\RPKE9@(javax/lang/model/type/DeclaredType.classJ1OZuօ"pB"X_ M!%H&#j]|(ffB .Bnrw :'s>SE1#';N#Ö@?5k9aG`~7 5%\ Wт|8=;AԨݺ8Cq+JM㲑dC(BK`dV url˔O*Vn/ϺcޤGfsE]>\yk̰Tg^}aV;8騞PKcPKE9@%javax/lang/model/type/ErrorType.class;o>#Nv&FIJ ļtʂT}ע A?)+5A VĢnFҢT nH/ Ff feFv PK*xPKE9@*javax/lang/model/type/ExecutableType.classQJA5M/" iE1dm ]j5~%l"B0US 5D빲:Դa9c#8t./N}5:7_jمŒO*3=Bch\1[C kVTTZ2E%RW"-ѭ+qHHx FHK3ât)?{4LŠU9O] .! l"%$PK PKE9@1javax/lang/model/type/MirroredTypeException.classN@ƿ)j-i4)f0^Ѓ lpMiZL<>qmBbjt7ۙϯt`L̃PD`e$(c-]W$* MӐMD>r"\N13x#/rQ².t"y;~( N<aOhet,'p_Km& a ՑL ®O{O@^+3fpc6xgcFoo{ K<[YXM6jXcz9L5wF#ex3F5PK4($"%PKE9@2javax/lang/model/type/MirroredTypesException.classPN@} O@ 5&F! lpMiI+=x(HL=̼yL?>@hOyi[*&W>K j"\)Fo WCbi^ cZb".C--3\,3eB]R3(60fVQGӵ}9bPm Cn0O[D̐D+U}~-Ԓ/+%.@bBWHR!4B8zEꅒ( EN FӚ"e ;jƩf]z3j PKȜ)bPKE9@"javax/lang/model/type/NoType.class;o>#Nv&FIJ ļtʂT} RQ\Ƞ]HofQQ~#Wp~iQr[fN*#7D=6vFf feFv PKStPKE9@$javax/lang/model/type/NullType.class;o>#Nv&FIJ ļtʂT}Ҝ A?)+5AΠԴԢԼTvFҢT fH/ Ff feFv PKmxPKE9@)javax/lang/model/type/PrimitiveType.class;o>#Nv&FIJ ļtʂT̲̒ A?)+5Av.̢"FҢT̜TF!@0201+02I&PK]7}{PKE9@)javax/lang/model/type/ReferenceType.class;o>#Nv&FIJ ļtʂTԴԢԼ A?)+5Av.̢"FҢT̜TF!@0201+02I&PK"xN{PKE9@$javax/lang/model/type/TypeKind.classRV5&$ƅB֔"aQv~Qc1LxtE,iLם>AOs.ja,~sutLEm}fnUExMamsbvDBAw _Q[iyyhd؂5 `MZEk 㡑-iE\a/hg4C!Ű,bdXdb t1t3|*Paex HQ{,p M^lTEwVU2w+n6NIH;HXK4%$钲ZI$)%%ݗdjmV%YZ5IMdK*iʒj)I3qǠ} NǨD}ێ#m;1QhbH(!%IIZ},K$II|X#|$>$)/Ȑ|Fy 9IO"oW<͓)Mn>#?!?U|kxw7Ÿiv>'S ]^uWⴁ(% (^ŗNZEx5R^c(ok~PK9PKE9@&javax/lang/model/type/TypeMirror.classQMO@}B?^l.&&D6L11@}^KcVkkւ|ӭVJIvgӾ&/UЍ]~ԓy\'a[2 bNuqsk6Β`+8RZ2HsvQ V䳘u#ڏV}H3_uCqeG^jI!\,( fpxVBZ1KN~iv|+kE׊61-J{fSP+f6|ʑrtn9 .P[h =pBTWH lQzRL+N>eG}ȸ 91a1Q~.{z6+|-o\ aU~(Ū vckK] sDO ]6V$!!B܃ Qr 0!$L qmz33R=kw5󘚷OCǒ< GKp1L5d_mxEǚ9] Fԑf U#v&FIJ ļtʂT̜Ģ A?)+5An.̢"F׊ԼbҼF MBxK RڸKS2sR2 Ff f bv9A4P $ PKPKIG@javax/lang/model/util/PKPKE9@;javax/lang/model/util/AbstractAnnotationValueVisitor6.classnA R R[h텫DD ^4ԩ,ٝE}+2gcifϙ9sw>fv>g`xrGisul#aYy}]W\KGY%= l|;}A-Bis>!]JCrgb0^ЮGR'.قamqWhcxڼPE4ŐnmUjNCm'K{*(ۑNJkߥE` h݇ {Z JpܙO&<GgB \nvgdajb$;yh%zۑM(X~=u{: h\M4/uڪv{}åCXQU4XfsqNt-ZZprmf3!H7NϋHp/~<(*z NA-/gC=E)䅕Š'&;xϦV]ڄ$V\|,O17"̀YVtn0,+:+1JB9YM:ž3n2Y^{n{<.s<z}c,x*6%]QV^ 2t'P|M!9!ym O`SZx tXuߨ vOq<js$ǰ/!bsT?kΰu3δ5>}]*;n\+`Gt@w,>K+Iu&\T8lim,#4iKFHj[RwXP,+#H~ 4GqǕ: ė3g)>'\'q}vUM]iW F(dg]لВo/H\@|n P.k3$\Κ 8 j%] HT:J@E|1 ΅B\ ·B\ &C!OL=B\H\ .B|%A\ Z q#ĕČqS qK q[ V1;.b PKV PKE9@+javax/lang/model/util/ElementScanner6.classkOA^X[^Pk*%-&D (v-,dYW퇦I?G5=3vaaf>!3ϯh^'TLhJ5Sb*ӒC#n-͔F+YRR^גFg3gR&w%0FIUrR1 U8J|/? STvܪvJU ?+M+9GQ]S™E shvTġo?L XV{fFQ6&6?d7"5 PDX/$pXm#{*-NzK˞v\T0yZB/1I)rc˹s\/?r=X\ vegz|ɦT5!>8)uc׭cYy`wT.lIkVa Ow0lp#4U.o9pl[TJ[`FU:Օ'Jb+TSl5uMgFӚ@ˁ60BwSB6IXۋ?8p7<0 W1;μC!΂1;+aw= ڄ`'#b2"1& Bwa7S0-3&y Y0Jf}̡#7TKrd/ *<[ﲗ̌A Jgm)dK]nz$3SXĕ>i[b1qI\C% Æ$&gm.[C|ч8gKqA| IIC%rLžH8/ PK.eg PKE9@$javax/lang/model/util/Elements.classn@g mHiB r(\@HXBR!JRiZVqqɖnX/pP|3k`+<%b\u@wPzېa N2c>RJi˭Ъ)&dZJw!I"5*n#  9Wt`%A6ƺ9?L9I-P}^y AD^$r]re7}aHUby޽jY#TXZCuXOnL.# w5pGRwrcֹD]YޖÚCwC];il=nZ)Bc6. ?nA}(s?{ [ _%|fbDuvLD-I A ;E@ie}$brƆĎ| HOO.Y8UOhov̶td||%$m%>sg08S?4̐_"o N_١9@gaٳpnwE/Eg/egWakpp܂Ġ9PK(PKE9@9javax/lang/model/util/SimpleAnnotationValueVisitor6.classmSFl01y HZ $4 S8qZl.,ySUәtd[HtwIw?NBH-AkS=k3M*ZӼaLeiTݦ-1ژ>p%0S*WV[&0[Bλav`̶(h#9vӫ-""! 3 t\M%tT:-x0cZӨ]Oqo"9̱YBdz <4ڈԏT)q~Vm;\1~cU{a+F* q*Աs&A}z4_.5Xֵ{Yig= Q'N&@,TM\c.Pbqe"iTuZI)ޓq=;BnjrB`RU]"BdS[I\Blݢij0sv;/;c-/g+2^JzTzTL !DEHu58*ہU]aFʡi`2+ w,s ^8pѹa@͘p&˧3d`XjŴhcZ>zhƫcƶPW`gk|%^wkQ(y鈳,w4(yir+9~v{k#;8F (Z\ IC$\^±Yܩ$\;`-r.#5`#X`\RM\ aAro A "wɛEgVr"oĈ$򹻢j$.oyB$>ϞyOW#D*)V{Ғ';"G$>!$> ASI|CI\ A\Bccw='sQ^Jw>9$ &$'q+{A>EOb!%I,'b7Xqٓ"ǟ&o}<;!.}=((0w g PKk1#PKE9@1javax/lang/model/util/SimpleElementVisitor6.class[oA,V+ЫV@/^4M@Z'f؎uKYR>~(eҖ0g`gv 7 kڦ7A+a]2Cun4X` fҹeCF|m{%&?NE-_SyIcʭu\o0mMTxTզmiSqMScv 3PrM -u7u?5Z. JbR J !n&qbx?pGUHb~+gq/ ;$B;me2)}6:HYKʵ \ KBK^v,y֢STnIk]{ l_J x)W_CZ3C}5Xč!ąD$q{q/qgdb޸]8Nb2xPKhEl  PKE9@.javax/lang/model/util/SimpleTypeVisitor6.classkS1O on"U ZGggWqI TH9f !B h2Q{je\Y-Z\%`W!F ]-7nQ=VeͿ8O{(F` @x+}Ɯ JbO3Q Sq8}8Y2ElQM*yk1|` ̞U 4bl9:n񭋽P#74vBdM5;4y8Zn}N´ +k7ŗus3m? N*V 17iV%a^dQ;MYY/=tvPE/'jK(Lŀv*|0=!}S~O4FŜҋZ-_W,:%q*sX^i„M%HN-AD8*L{"tۇ+fUL:ڒrui#w+.7-;\.ެ?jچkMȋx9*Klf;x`eiL&m42 nnsV(o-O4 ˥]&Kr\{ 3x5؏8=WpeOo0gQ8GCD,,qc%NG2~d$[d$=u!>vvk1{Ar_z!_Oi8(bDEmRvm  qܗ8x8KA )E\!"/C375ċ[5K;pWi!k4)_FCxY qڗ801 Ol6Px PKPKE9@,javax/lang/model/util/TypeKindVisitor6.class]OA,jb[-Vi(Ƅ%@2iFe,I/ŭ.Ke%ag̻s^2a0l\56EYGr3[i3nիͥ!N -fd[5>< lV Q> 1!H(p;KfWLDUjs5\}tvدrb.}5ɜJ3R JFD:b;*F##dG!΅"ǏI\Ϻ\@Al0Цa:7Ʈ금{i m0uVyK!LF-gza >6o$ (^Qw|$˒SPI`_?d{AXQ>Z]c'\w[%p_zj}NDys&K%yS/ae I%w]C-[X͑PvZ-n*ۨ@ˡ5L/){KA}!^*8YGxob0ׄ.cq|r2{ LS*~Imr][u7@&4jN. IiN]8zuh!Q-Rl$ĹH+B .DB| ER$H!+_ FB̄ # `S϶W{ ;PK{ PKE9@!javax/lang/model/util/Types.classUn@-Ih^n-$,!ނѐJABDh׮Gc6MDd3eg?<.?Wq &R”,5^O n}o!AgbhIc54iA"cO^<kōa*R2<$=!%V$bJƻQeѾs@jln' mggfOӑ݈g9AtBsC*ծHvGւAsBA5=ycǵ pg5y5ef HWtRV!A MYhg$Us7>9+09UivC).Ka*.ROX(@ib) 8+{8$\%r-0Xk\ĩŮyj=089X `Ё2aap jw"Kp\9^$ ]͜w+{pA~PAPKyҙ!UPKIG@javax/management/PKPKE9@ javax/management/Attribute.classQKO@W'^1&S -n>%_'qm0ؙ 1|Ɵ,uT$X -uLD(1IWHD{;`(]@+Nэ/pS7f( {QAU2仺]e .n{cNQ5 A>2o'֌Ggai;e1PC;fJ\&˜{cnQq47RO[u8KH25 PyKKPxPGHnh&x&)Z O(k,^ĭvUV* PK5FgPKE9@2javax/management/AttributeChangeNotification.classQ]OA=S׶A,_***~%bLjb,}"1e,.Sg>G̮F˜3w9{_;V6DMb*a_8Ǖ,y⭻t^m0Lw_c:D+ UCQPuu`?T>֎mS+he`]Q9\Iq2RiɎ 3 z"vyz6.EK}z,ۡZk't- ^s8?O&>Ggzwp37M!Ov)*~:#PoBOCabN{X͹ۣVN_'P%J%O{^ap -3-AsŊAhxv+M8F P s64SqrvRaӶ +޶]̬+}X0ӵӹ1Tު9֩;{n:-8 5!p&8?\16p}4~|Ȃ(3m1gs7g%,f6@'(ekwn2{]fΙЁŰw'|Zpb ֵdwE{cq8 z\p,C)CbȾJ7 KJ!Np=}+-#G뉺RC͵CyfuƩ1o=ppa)8"Ia9t4h֟%m^i]kfOCb!};exUNz̲uVIƌsSWal1i|RblnNЬPK$+;PKE9@4javax/management/BadAttributeValueExpException.classPMK@MFcAzL&J==(%ٔ)[E.7;+S>% R.i~u%ZsByͳf5k2^iY*@hw"tϥz*73=9Jܫr:C v?o"ҜqQP%mt|3<1kV+஬}Ops=t :31;~ƓIlc D'i<1hev[PKPKE9@3javax/management/BadBinaryOpValueExpException.class}QN@ }&-@-,n)PCQ"@ٯ)J.QHW0!1|—*~u_αۂp|%\H$BވOGR. x<E6^"+dZ0ŋ?y),]EWh8t*l4puK%ngD| <x.5f(!uq3H1B>塸z~S->NgPdIE肼A:z[Io4ЅCvoYMl&aJ^iJ gV%PK  PKE9@2javax/management/BadStringOperationException.classNMK@}&jAz"xEOAާWMYҿIGA܁7_}7CxG^2)pJe䒧j͔ZWz+B)M|/smt}A?pL𯪩z"BTu;/'P^Ze\j A?nyԍv3pb@n{$-Jw&ٓ`Y n Vcf>PKPKE9@.javax/management/DefaultLoaderRepository.classQN1=-;0Acucb|&u* -+](B&vq_=7Xau\h eSqx7Ex)::FYpr/7 C9bHU6 y+`IO*Q ^F fIQDJ6KKz3d3XB@~|$i4}= q8br>q@+GrzQq0Olɳl%[_PK$PKE9@!javax/management/Descriptor.classmRN0t e+ XP8rR!n>BX-r̛p 9΄Oq~lߊ k)VwD8CKPr%?P ES/δ v -*bh3Cj=ywKW ]!9f鿶4ג8Ѹ{˴ QI9kI%^0v߹ɀD WG"Q)Z䰲gOu~EJ;U_:eS):ràHPF:h'v~ m8x#h<)Uf8oPKPPKE9@'javax/management/DescriptorAccess.class;o>#nv&FŬIJ ļԼ}̂"bvF2ļt}v6FyxXk12p%e22Fh5#3}t; $PK,3PKE9@$javax/management/DescriptorKey.classѽN0@* ,ʄ"-Ei`ar)r:UTx q@O>}|dݝ)"YM^:X' Dh2:h:2&ĸ7)Pq΄ËA6&&4I|c1?e{'z/:ӓ˻3٠y ~ g+B2!Sp)ap\}$PiVy~?^7XYPcF^@XQ?!鵃 j\MlIؖ#ab"}1PK]PKE9@%javax/management/DescriptorRead.class;o>#Nv&FIJ ļԼ}̂vF"ļt}FJ9>xfd /-JNuIedFE2X @PKPKE9@#javax/management/DynamicMBean.classN@g[7cJLlb≓DIH&pᴔ)[ۦ6;Mwps9Щ1lĸ0?89sQ"O"KmvE!N7Z7]4ػp< | /ġb1D9SP*+H ! J!|{lM ˈR4y#xW>6sAmlmKS͕[g~JE_Vm8"02HOM݀[g[&jj-/[2x9}oCB@R\"ת\ZT踢=wS r1XӐX?ƉN=_PK~Y$PKE9@*javax/management/ImmutableDescriptor.class[OARz\Ze[  %f)d%-G}{1?xf:Z;;s?gf cony`nP(ec^E'>t;>2rn M4{'gewNNΎO3wɸYm[ ~-yбS4`"Coƴrpθ!)t\wL~/';7%&kZCzSY3on١OfVsuL;"U~ Fчrߙ%2Ԙa҇[[wEzM 7ޯgH*{'$9h)-ټc ՝7}Ӱ.AԒJkոs*y^SWzhVS6JY[VKY"y)Nk.(o kQ7?TڡQ;Ry mh3RZ\#g(ÀxQLc!-E%. I w?08t7C@w@Fqq//iR?1~!!5TɄa?@T1}׺O:9)1;-0C3] hQS`(}ІRObm#J,rMY9Z_yX֖1֒ҾqE )<*_< ex(ϻyuY6ǰDRH3X&E +66QmtC[ۦU@ּbV>PK&_PKE9@5javax/management/InstanceAlreadyExistsException.classJ@MDcڪwCVoRD*A޷WMlK|,OwE=?stCx-XEs&Ys.5f2יl2Da @38 K!"hM1Xo G68A'.?}$Jz)i%d:p,q+]hTUo}SD̜fbh*jmaյ#ņQ oQ7xKC ۬m7s;PKBPKE9@0javax/management/InstanceNotFoundException.classOMK@MDcڪGAPM*^Ă6]J[6ҿIGtCx7f`BOTl,HVbJBs)BS?%Aps l\3^,gD4Rm^}K[ NzNTdD+.bINDY{kk9a39`h01`ݵ#+vg7lְ|̧kAmQnw~PK6ZPKE9@-javax/management/IntrospectionException.classOJ@}jU/փoR" BCm\J moy<~8 ^潙yog9!<>狸gw貮Djdn, 3*?JR*iZ.D;h#`&RY1OsKʔ͛oe0LaoqU*\1+]h\t*nyקևCI#FP ) a kQ \ pКyיlYnPK<\PKE9@2javax/management/InvalidApplicationException.classNMK@MFcڠgUFIEQ_Kݲل-O?J|E>53_^# Ωeʕkې4ZR {tE_ vĐ% >?ld=ޟTE`@gT[u3USf -$ U_C~Џ?YPu<$J+>g G.c gsp'.<15ǸI:6Z}l6[-PK VPKE9@5javax/management/InvalidAttributeValueException.classJ@mDcڪwC`7" BC%MĕdSMky<>8 ^{fϯxh1/ 犧"J晜^k]ʸ"Y%niY( 8%7J+8bpnz P*P(x ~X$B],@B>fv 1aA"),E&kU>!:OTiUZ ?dV;h# tSͬJs+$*DefꉰgcD6ƵQ:sa-!W3Ke~;dÆr0c+nq0ΒhK;KB#U=sPK`PKE9@)javax/management/JMRuntimeException.classOMK@}jՃoR"zJ۸ĕdSoy<Q6 X0o>7aYL,ʅ̥6}, 'Zb Fֹ\,ehEJ˻*A3IE"(o RV?YjhJӁZ,L ᰨD^+뷳`| 88\EqVŃrWsb9mgYgx :/<Ȉ4tf:%FKטl/&[d`pJoɯBl2M*oIǒ~PK6r!PKE9@0javax/management/ListenerNotFoundException.classOMK@MFcڪGAP&/bO*o%$ٔ-O?J| ^J=̼}}|~E/0xKrx*rL%0RU"F*p^mS2恡ѿ2\h`&Z X*1/| n\$vӵ6ۨC7黿PKqtPKE9@)javax/management/MBeanAttributeInfo.classTnA="UJKVZ Ո 6%AMڦF)f;yW&^>M f7swoqB ?r+t s]iQUGCa4qGpsCZamZ孶oCbS*1lk}P4+ztr"(.a!Ͱ=}߲o veW;nI%^: 35CJS1},=~ÇV!)wVCGLX=ݿć6OmWMg"cB^mQ CaJ% ?7f1d_ho'Ģm%HJo:Z,+IIoOfpxJNϵŎ4En<0Qu_$͖?^J!F1ƾ phLewfpUd$120(K(9S_rB {1'9;{mP(IqKꆟN8>&Ϝg#9)Yeߣ[sߧ#ӀüvCĝH * #S(G*S(#%Z PK1 PKE9@+javax/management/MBeanConstructorInfo.classSMo@}&q4m)_mBJoAH )JA=in#g]m6? NH(Ucݙ7Ύ _P"cF Mi`V'f>'jʄu cB'Ja, Wkq00:RagS?_Dh1F:SB*Vp5RGroxW+I S#gE9k}p¥-LIiE/?ta_lq/  k<DZ,J*Bվ}?1õPA*7Vldًn3K& ῨĻ 7;A?ODQvx-3Xm^S Vqp.^aD3S񰙱c?L1K[k wlg:=Wl8,?_gAw+klF36.diXQ.q,P]i+l[^ GC0T (=zOHB*HxXd-"=<2 JyiXQZN'}iUh =s~]]^u.9mڏZqQƝdVkK$F2n߶8Xf-^duRw:shjXYg*2🂏' g#e şx30P&2p ˶9N*xѿKp 6=6&Y*}ѲQu ,`#@@C df!,[Xs(t7 ݡ$d*;S1<'Sw[3Gkw }CBo!;r/z,y58jN@(Z6m ~^O"v{sD Pdal7b Jx1\=Lj2wبQڱWgܷp{ٱ1s )VPdo)B)Tg3;k.{PKSnPKE9@)javax/management/MBeanOperationInfo.classTMOSA=WZ>ȇ*`Ju!ђ[qB2GycJt?r+μ}b܏sϹ?~T45ِJg=BT^z1DK%LX.T-{J$De+R@yXS'Z('-p3D o\Ʉ/bUѸ=twoS?ey]oECjC=n#8v/++OԞmx Vc_& ^U#rO뢶~* CP -N% =6B/ߦ/MI}Xi`VIgEc-J[;^lskrRm;Ŗl f#]|쪜m+k.Vʌ6~PKF6goPKE9@)javax/management/MBeanParameterInfo.classRJA}LqK@AEE*Pr8H Wz<~X=F4xz^Uu>=XaJ4m.ʺTx-:Zԥz_].BgeKrV U-%E& M_f>[F;7se4:Н a}/O&!o_WQH}-mܺt̥C7K*P[ ϝ9_%L $tzٹO"G+NUiNci'AC{rϷ[/c֠c5|[)>8:a'GO$#z0C?zȆ#\a<{!`:aχk-v a8b-o B&ʶcrʉ0|PK PKE9@&javax/management/MBeanPermission.classQ]OA=w@[*Z-*_JHIELc|vvDD?e3;m}sϙ{?b:P e }Jj'44ˍ7T{*T>a3,_C0T8NW:}B,#[P&fjRO` dI |IX=EtndbfY=3ebO dHzɁ伹Yм5=ʓvRflP䥗Ymwf͹0H!#Tp+M5㩍|Ǔȓo~jfu#6_9KcmG- XEVmܱ Kk"9rUyab(>O(h٩skyX./YN,P3rpء8֭ƎFhTRjAs}mfgowc6PK$GPKE9@(javax/management/MBeanRegistration.class}PMk@}k)^57Bm"nlC?8}oۙ9xCK`y sdB9)~I-%iiV 3p ]C0;x{'ε=ruЭS>,=ƵXU]̛DMZNiF[+WPKޑ#<PKE9@"javax/management/MBeanServer.classWv5MIi BMIZP 4\bFe5Z/t$_*4iY7F//LXzN[iPAl0*Jo1߁3Dƥ;x*ҁi+r(=A2Vw=kBRdJb$ ImʞC6]&jWXSʋ@RQaH텢W '~І<[L'@1eHE}qH,uWژ p^EmFTAKc EVs;e,7i&N&r=_gzs?݉p %2|V {MmՐdMvbUW<.[“  t0G`mxK3.A(1}1e"mXڜEo1'TmC=Fr. G,7܊LL]bE.=j❋b<|6ohMA9fb*NIjb*mN'ú0Rby!Y]E#'E>#pԥX3UInn&6o\^0K 7¤ mqV<^n;0~K8$zKWSgnLsY]|ՈQB1GC]ޱ*vR()1 *CȪJQcLrۚGٝɷ };K9rg oǧ&H(= ˹yu1O{]`~oժڗ,S7dD__}LqχbFq*y_a<-;Jߖ^񕺌OfptGgHrs]$< ]<|8{4sؙVk&i%XA]FK꽮`*s ?*?nB+ @FnǐC{2UX?O3[i5w|k> ,1`;-F1LW8 <DHjlƂ,X2} 5V1F`?'/PKOTPKE9@)javax/management/MBeanServerBuilder.classQMO@}S ( Lbrx@T=`/%eIRYz2GwKUaf}, ސ1\>"ۜ!$Agµo{CSOx!eջ|<9GBz\ޱ %gg~IO{}g+-š3!_o@zm%j%. x,LG]?N;h4 Y"T!XV\g<}~߯.`WJej*fUe+$+^Tb b& PuƔ;uVz()u#ʨDźyʌ#fTm}PKmZ PKE9@,javax/management/MBeanServerConnection.classVRAAL ŻT!yd7; /?GYLMvD^v/Xl ʔ+3.R9fW8gyaX< %6eR^J-v-a<3NujY:ԹeNmVDœ(V(Je o'jؼ::^bbM @h$ wtMELf? vs(7R H]SlXej`ܑD2 ׏D*2HjrV͟A2B|,+VaE }>5 +$0ta[I`0rX >2W,aڶ U4F {EJzY@o.O`'dfA1ɧ7g8u4;w[ݭHIȸ6+[rlwɑ?sjUK\nGhۖZP浱i,3|]aa'0Bֽ WbJZ]G}  èҌ5/5193i؊ /}hekbIaGݔfwf_: p;:;hq_dʲŝVՍ0FJqxJaTWiptmO+ʇyaG dže:aXdHwb !MctDξt5u=Sc&!d3FR_6VԂf%ϛjf\/FsGLq>vJ]a3VͮPn^:lKUR0d{Ӓ_ F43^B {0Cתs2K8A1yRƭ0`0 {v;B;q;@ero[nړS3iڧ69 fX*l5;AؓFo #EOsF [Ff14 t(H84Jpxfa#*UH+,r ΣU&elUNw2ϫy,^Lje)ͅ %by-,h19-'y-悖܎A.jb rIKU-ˆ9:paU\ #"쾕=u}@PK֦PKE9@/javax/management/MBeanServerDelegateMBean.classu=OAE(l[;BHHKc,#JmanO2;?_q_Қ>Ғ,i.ed3vkvC.Xm(A]ӂN_gKνBGb[MTvB%+3O )yn(M mEڙk<{ e+;]_ޡ[YrB[!PP8Ax\ $gVyE8\_PK?PKE9@)javax/management/MBeanServerFactory.classRn@=6 4%i¨*AJH"qFMUx(Ĭk$5q,9/ث$R7o i@zo^2#22`Q`H{׻ l1V۟%y"xI`W=2e/L͏uQ.Β-_5J'-FҼp VEKc䕯 C^;u!H&>%Nlz4"a7^"w-દ3H&_+tg v쬠&g3%ȎxhPR4nC;=w28pWĵri d W3"_O+7U?ǼUzVjO17Sf}]6vYc\[yȯS1,܁gD/kY>ixBseZc)0%8/bɇ^Ս 7t{qX&!cd(w B_URqgHP51 r~] 6xFVZ2 ShR3I:=W^縉Ć?PK PKE9@.javax/management/MBeanServerNotification.classRoA8֊ֶ6$DIk H %&>6, '{H%h|73GP36ZDr,BwIV}PCaUvCgo٫^;Iak#Z:ah* ӷITJ#/[yS={/ ǕE sRm^2b,}B_"V +X'6Kg\Mqc˓ CPJ7@x/PK/uPKE9@,javax/management/MBeanServerPermission.class=O0_iPh ,| X` )`8!YLH ~Tbhw} c3rc UxU(t%Щs)6ÎzJ-WosJzRa0 WZ?2W٣pr] -v JܕL>K0"L?œk䨸>5M RGF ۭ-gEY=U>Zt;njcP4`>ŭFUS߀9@AH@&۠mX;G?PKin! PKE9@+javax/management/MBeanTrustPermission.classN0iPh  @5ZuwGr  C}}|@߃p%HH2Pp5EnNeLyp4E\hi^!e+ah]J%qTJg\%hd^gGm43뭝H*q_S|: (lµ5O2'nB2̹>Ueŭv8֌0Z&Z=BzucQ6ŝJullR߂@A_I@6ۢ[:{?PKɣ! PKE9@javax/management/MXBean.classMK@IZz(z1Փ Rh=mR6i758Q0eyfvzp-a{fOQ'l{8ge#ń)atNfW !J?H?q8].a%Pq6@m9 âdKC.2V$]&h\>PK.PKE9@3javax/management/MalformedObjectNameException.classN@-ՊIqwiM3;zpv|ʗ|\ :~s )z _4Ӣ!| d8#mdn=3w"԰@C/$ EB'91e1Wէ_Ĝ!kQ!qe2E\]a]hT.TJN5tP6kb\c89-$ TrE>dh)-C{:f Qfu4Z|8'\=$ H(6~Sk2i4Jȴ֘V ᨘ?;h=4Ϝdl`(3Z?ƻ+6\-cF-SFu lv=PKPKE9@#javax/management/Notification.classT[s@6IhK50h/CuCBM?}r?&e(>$9络sv?f`9#p#ܠ@\ )ԇ_s&^W0n&}*]1Dx5f SԳ;9Xȑ=TզtEktw;}]àܓjmg4$qFJs: ["#FB,BI2xLOv5Vؤe] Ӵj}| )q5⪝U\tGAM\Q%rRH-e%}'VEe=rfeKYEEDW\쪠vr oS!f#i)F,KPV,s72c7q+b>G#IJ2:h0$vJZ** U_PKnA?PKE9@.javax/management/NotificationBroadcaster.classJ1OWp!0Up  kvH$7`7~$-tJKZeY*b{h ١wTh : Hg3e2eN(ڲWtռ&B 5O '%&|k'N2ݬ4yCoHk\,FnaokqYcWA${I_PKMsPKE9@5javax/management/NotificationBroadcasterSupport.classTMo0~u+F]7(KIPM4Q.;eJ*M^GpBG!^;iM؎>~?Ӡ萎zڹ7N]ǎM \\ziHX ͢]t+vgRz4Vޛt?XRWR'2V&g^Üϴc1S:x&S9 p^pM5U45-M9FL\iJ_C!PSJ7 {r;d@,+r2V{%. S4'] ͆yDhhkIXHkCfQR@sOJly()ℂ Ŧ\',l<hu[ xSP1PuP vpfWR}!J{ʡТ!uq;cUzPKQKjPKE9@*javax/management/NotificationEmitter.class}P=kA}&F2Na,<-uoWUm)QDPf1cP!|n$eId[;?I]ݜoVl4hzqxeLp{|9ȽYSӦn oBsri7Bp@p̬!? ii"V]3&MEWjڛZ-+h_PK|PKE9@)javax/management/NotificationFilter.class;o>#nv&FIJ ļԼ}̴Ē<̜"vFBļt}v6Fhf~pjQfbNfUbRN*#hf11y F% YkF12p%$=@F8@,N PK]-KPKE9@0javax/management/NotificationFilterSupport.classRn1}ޤ MI V˦T,BKJSTr$joā*q(ر(Iy3x" ~ɿGCx,B,5\,#t;Rm3E P8J\2OӁ(!2xPiI%βaO%ayZZ3/I9I1D#eFK7KZ% %n*0?D]V ޖ& /:!XUg^wʰ"zi ڻuo,@Hk~R,=Edٵk쓀-<#nv&FլIJ ļԼ}̴Ē<Լ"vFRļt}v6FqhiIfkP?L #PFb^JN*y &>xmAZ3+8(9-3'A@ad`bVnfg8$PK7#]PKE9@%javax/management/ObjectInstance.class]/Pf/ޙ]B".&#%OŕąC aj}9O vrm 6 OTre nj:\IDe _rG>#rRaB_*=ټd ,qJO&&v:ε*~wŗ!Dc. XCcgR{/xR׳si^d&C;bmj} ]#3i=tV0lv:76`emtn8zRAۤ'KLN00DyD=@vS(Q(cz܀ň Q=9=Ov$ \\RܦS Vh2R9r5>PK)?fPKE9@!javax/management/ObjectName.classU]SF+;. @Hm8!%ҒЙ-QF\yԇv2LdKdKs=OJB`=&i5Kߝ}`u6YĂF=13Nj4[Ԥg'0#E{k#˸RT];b)xxR@`2)H㳦uy7BtͨS픚xc&9IpSeA޿W ۾Ďa6;'>& 14d0E^m㜚wE6>9ID "PVzA﹨NԆNyĂGV#鳁r zM/Һ#MT ?. 4RUF[SJ/uv (=IU%mN:ly1dG =l"6V\%! lևAٞ+|ILdzVTۖ)Y)\,]~rNjt ~h3~Qčyj,^B m}_x/A>8P` x\QQ`q|JmDOu$Ap^^(>0+ -Ȓ[QL\ç#,9W[Y"X%bւ!bHL?r#n]vدuUG+ȟAr̅pX-s7Ǽ䰾A`#J VB29pX%Ƿv8h"mH޻6ڔ/zn- Ϳks 5ϗ[u~!ڑMH+mxE,G@^DV" o"D@"w" oA> =#;½p߫O!`g؅g6W|.I_ EUEObAwe)?Up_Y Lh;PKL4tHmPKE9@*javax/management/OperationsException.classON@uL AB(PĈ ("(Ŝ!](EDQEbg3;_ _Ḷ\h\2zK#JUaQ&t Jtw3aNҔI䍲{Y>3>cUH7qȱql.VQN Tb< PKoPKE9@&javax/management/PersistentMBean.classeA;9s&AB'Ց5#;C<P>uU0FK! oI}9s.&BΩ(vG=Z'-:|5NB}絉yi^{P#tO"K^gI*u R RP"@U꿞FΣPKsGWPKE9@javax/management/Query.classW[W@M[X."-r"Vi[Nb"+}(l̷`A!uAuDuZd%ɣ4C@_KjT/&`l 4֭^5nSH n>,a, B~ Ǧ5UWuOV@z"gTJyVѼtfӊme8W3 "?O dwH]_z,%<Ln!MU/Ȼibf0!{d&;a?>Ĥn0 @ffbpو$woyf|eL'!%o]J.,pAժ)HgRSʽ~[a_+M3UEL)b{QT<fǻz+ZMW`g].D5L4TFᜏ^6FOQX:K x"o{6v$vh|O²G iN.)FaE'Od˵J.iBOq "Xz Mh5{-h?[mv|~v~?9ސ|o8Cc?Me3bn@_$ okq}s \AlH0,:8^9F(- +F[#!21AD{Bx^9džuԍ11h8Y瘴"™lI؆Ċې`SD3L GaRr>ıcT± +RǪ==൴u="b݇ plPaR¦ J&JƄ>zܴǥ|d0#`ǬcTps*žTyH dܗF@XC%<"]o](E8YrsPKڮɮhPKE9@ javax/management/QueryEval.classA/QnZU"":X8©TzI=&ļ%R̛͛WXq!ުDyC91G']8{ EI:ڿ϶O(8>;b Gf'Maho$*!׼ QOCkm9 Vd>'g$Ƞ$6o[J("*'CSd͒9e>s-Yy}&3_?PK%)<>PKE9@javax/management/QueryExp.classmJ@[[͂S5Hot[mnBy|(qRQ*a3;7_p桦p>~JbN8%g,2uNy'db?O9rNVU=l5% +4(˒ƭ?3*43gfaOvhwqxDI?CKᦊ ! @ +&3T6Uă)dI_fB=g01SUpDpۈu)Dd+lI4dg5Yv%k.6:R?±d5eNPKwrPKE9@*javax/management/ReflectionException.classN@ ( ,\hb c՝!0ՅCvjj!N"5;wOE c>3犻*ţ'Hjgg]R dtlZiy\\mAj&J nWlpG`ځý!f>z/ ,wI? C=C'BRsbj_KSj"s4Z?$tĵ̰~a<_2E44;XyE=Q`MkVLL-%%Ϊʠz <cZ94F&uPK$?GPKE9@,javax/management/RuntimeErrorException.classN1 ("M+bug0n. ¾`30S te𡌧3Cb8='s0=9_xWPƻ)#:ԽD<< ޛe!w)4W fxS|/uZ#l7|d^CiTnT0TOG\K'ɬy/ 1s}PIǧJ ʏ5*JUJ0CFZbWaD\KbO@_{2ȑStAC~962PCv܀M"2n1M+170֫*: 8Z@ֈhŸPKWJIPKE9@,javax/management/RuntimeMBeanException.classMO@-QA1~cx3= nM]?KO&(l0;>3?_αṗ|\qOBiaEZpu3-EpJ{LB̥TR_19 s幓ZÐ"cH9&]hH%~Wm b#~I2+Cjb3ys1T=VkP*/ބU3Tm]2\+=q+ͪ37:5 ȳ!nn XX"k:d7blJuYK0?S0` c"/OaorDՄhHmPK7NPKE9@1javax/management/RuntimeOperationsException.classN@i)((0q* хa?ऎSR tegPgq?oΙϯg`8|#>=+&) i6ްJY֑#`+BטHbf7.hU EQqrq61R{PK A*mOPKE9@/javax/management/ServiceNotFoundException.classO=O0ܢ#њ LDbp; \=ak>hwmcg>] 8t3 PKPKE9@+javax/management/StandardEmitterMBean.classURA=7 D^ k@01@b(Ƒ` #1LrOMĦ`HX\&S',%=mj/ˎεdل;4Q< , <l l7  ̸qV̭pJnmSK!V"Qb7nr DjJ6W< ~<3f]/dv=9g_ X)H{GO\trEjW^m0j I ըYce'nI[MZ7ʞyS8cU1,@a:lMY>ʬe)D`QݱMިtABѨiٌU`ma]p$7 H$Гd;KLk6tMX HD8ERM`XyT8A)7诬ȢRI_=7J-sq,n?I+.i-ț6Xxs3L@ʜgcG-uEfuu^67˪RYK9X8jKB$ǎkH1 IRC;j xgP_ $`,c'L8vX6UQrPN|\UY0-,ۆ:?XJ`Ume.s4.F51sgS_#=L Ϸc(nܹwuxDdޠe+9G܌VBސ*z NIT\twa[Ddڟ1-c۸{n'5=. }(۫m]^ *t7&p[<~F=s$hĆeϟA>vh)r>,<}lE[y86#͎Y1&rH<5KZ"mTlsnY!]xvdVģh26ģ㙹` 8)|O@ߵ{x˸J@?\ߗs B.z`6 W(\N 9sW&J p$qG n&0a-Oz#=}ngӸg|Og!"! @)_͡=I%f.<swA+{BXImR#l5y]J-ߓ\s5ݛBW~PрT/΁=s^'k|sx(;`kk%` G䍄w_-Cގ 9:Ħ2Bcew qȾJd-zIҴkKR;LjlEq?a4q].h'eNKsb?PKTOPKE9@javax/management/ValueExp.classmJA1uҬ򲻄j˼Z  #hECEg pÜs9'{Z39 7ZN)$mݑ R-bEzVv`<#:( 4VYC2J](8[WR[]Tz b"88iʉgQTn,qr,p yb22k"Ng=g1&@-!%Y9:H!&l[ iz{ZGv5%h7FmLaTfPulGCvϧ>UP8B uΟ 4s2w5yH\PK @DTPKIG@javax/management/loading/PKPKE9@4javax/management/loading/ClassLoaderRepository.classQMO@}[BzŤzM0r"絬uI%ۭ2LKR ={o;\pn%W<Kli>* 3JΥf0Dzy]2JU` &j])U{Z'beVY۱.ԼјX1Û{ԯݍě.`itwLw]X&cAkuZ(_qޅGcBNpڀoF(| PKZꙢ&PKE9@6javax/management/loading/DefaultLoaderRepository.classQJ1=ot!TG]ijPPt52MLFt%(NZR4ʹ||J=n+~+B7м!խ{,nxR^Siɤ 87 T05np'm-+Z;bm长 ,ֱK/qSol'$=P܈El$P)mCoj5#9)cf)s3C~Al !;#8&5Iqn,Va>3rSQ-qC[y-`֗:}PK4PKE9@#javax/management/loading/MLet.class[SF`0$Iȥ)IH!a:iwR[b2%USg#,$;3xF9ߞ_ ~HAG~/ nh)m^5ZqN  &HNáYͦ"B K]ܾtxE n0Xbmnt$wLJPn0H3 vU AnaFd膖Y#F3tMȑ7vU YǖJ 0-j ^aWxKSͽńsf6HJ|rm1(K" < vm*v`O2i5ɫU05e<LھsUV,ar$YS[V#ۅdp;ߝd TDggVͦm9V*\Ǥ Kb? ׄcO[3BPFk^6nP R.V 5;-ƚ&qp*#%B9!A=’K`Ź4{_ҘVerql I״ j3nv+Zc,`ȹ:mW|TkU7͵]7!OPo >AL_t5d}ϋ"y1gܧ{kDA4?VT EL" L`Di<&{|o>=-[-FSȍh4'D/Šgc2?b^z=עJωWbYnkEej.Z +R~QKD}CLuNȮQ}ӹQl>u{UBh!߾EZBX b6aNX),e&񽃁AߓoZѝiD v@PKE]jRPKE9@*javax/management/loading/MLetContent.classSnQ]Z-mjEUj|i̴Qp 3pQo'?ʸ wFa{Y3܎#İ{/Z+z”5N4!-SG!5eL%CP7uy𸢹SSZ~>jz_&RC\:`pݡ6vҐ6y#Gqȱ L!Cദ鵄 rӬ67U?#g(kAwVC{tl>Cqև󡵇-6AcX DRrGX`JC?01IaHOyH!ihϬ.#) n? Wp{gzm%]6HܔA9&76ᨕy? )n4,n ~ěsGꓤ*BS%,'{ߐJE BidEQdsQbhVQtb֩ ylXD,Ml,m UC싋\?)o:pWXqY,*P*p U@yͿl(nÆM |{۾[nPKx,SPKE9@(javax/management/loading/MLetMBean.classSNAAe ^ &nHif ;Kfg?2(eU]] `[R ?WPm.^x\ 3L'< 5Ð͵ǐ/x_hh.ogO542T C'WUGYw 3mM%KIޜ/'5ϧRP?3 doۏ*: ϝ~>[W rc(0S&ւ3#R'cTֵX`}G<*C\5cӢxBİGWT͓,9X&٫'._y}JߨdlP&;|YiQ{E'aܮDꋁ)ڥ0m>,!s<.RB*,c| l~PK}PKE9@1javax/management/loading/PrivateClassLoader.class;o>#vv&FIJ ļԼĔ̼t̲ĒTbXj; #H~N"PRVjr #Wp~iQr[fN*#8>=6FFf`d`L lPKEjtPKE9@*javax/management/loading/PrivateMLet.classRMO@} Q5 &V PO lR,O&(t :;7;~|~C>6]rxϴ4 C1h řLe8gVph&$CҴM(=R?U8 '?+\sg Y]בoQA9=G+ Đ`<8i :B%҆VKӫPs!ábsyJS#g  |9k3ܖEfxɮyN<.@;/BwưDq?$UQ (^$T#K /a,4d3hҠS$}&[uMM6:wwo] öRPK3}{KPKIG@javax/management/modelmbean/PKPKE9@3javax/management/modelmbean/DescriptorSupport.classOPnq0B@a^DĄd f1t'k#O&>G==:x? u/%2[aMN`sn8soxV;pNzYPbio.xNs Ѝ!rBƨ$( c5'rgg6G(̳½<-)}GUu|&WHxɼ]71z+W&vR;Voq_qv&Hw4$8(jY4̔" WS0-nBk鏜NEILR*f pL*fQF$1)YY pUeR ٬J쟆_{hs]y><ʧIBW!8Ma/c1ӸEK *٫|QʇO|"鬷y]ac6/r %%}bID*Î?Tj*l1EitMY=PK쾦+PKE9@Bjavax/management/modelmbean/InvalidTargetObjectTypeException.classN0?/Bi;ÀT:`CT !E0Vp8UpXLH <8'Ā?zuKr} 0Z @.w?PKBPKE9@,javax/management/modelmbean/ModelMBean.classRN1=Et<|n|--!JB"j/2)iL!k.?x iޞ{r|{pC9>sCKm2kVByסKa=1e&J 'ȳLRZ "<zJp'QPMmMa"$OյL&JWXȁcM=.3r:\ I fE q?aǦHδv&``N4u06g4TDW&ʰBkhؤ 2dPKE9@9javax/management/modelmbean/ModelMBeanAttributeInfo.classS]OA=_"XJE`1)!W$)>!B WS4y32Q2o~u|y, yyhQRyR(#ퟋ9ADP2"w.^W*!%ߔ8Н@*Ц& @0Ɂ*]eebnRVfeAYnk%-%*j4<Ąk!9Gj5 Ш JK_ PKj=PKE9@;javax/management/modelmbean/ModelMBeanConstructorInfo.classS]OA=ڮ"Z?x"ćDMLZ`H O:%fvJ[>Gn-]_f=;'M,y l3qB2~|Q|${6p7Qу$:NTPb_rׅ+AI1Enսl>(P@_T]l-,f}ltU&~EP& n'ix?}=  A*+|g59G7$} ^ ^9~5@ZבIHq1™51ĥ5 94&%ST+gXšFU%ٖmH%\n%9^iM^|w[r1EubmZ/]܋@ 16Hж&$-zhr:H**`C+~IIK94~b1EKOxtm+u͸@m1,#ש݄Uԍ]4l֥Pj\FxX=PK3<KPKE9@Cjavax/management/modelmbean/ModelMBeanNotificationBroadcaster.classRMO@E_FVbx ᾴ+].2Jξ}oqj!p#>vB.yOBj'T]4eFeK)E,lc 9ݾC%e9;;D& UidΘn;R|e/LCCa#-l1SY Hj$q { )LC>u5~"Z92 @sufuNnM!Jee8[ѭ郵0D=yiihh`-lnvy R@rRJ"PK[8>KxPKE9@<javax/management/modelmbean/ModelMBeanNotificationInfo.classJ1ӎZwԍT bU TApǴFڌLG\ .|J<Hgɟy}{~Pd1ڍv]hQu}^ZR m.Ǯ*rIX_gh_}pTOgW,[A73̎?$MP&:3Bݪ2~ΨY(ͪ|p4Hu 5koX E`.$4ʬ;M]B+#rG_![] XԖnc)ݷv n{HH  0\a7JɎh>#0R*8b};JX$Pd ȣJ6F`=V\.y9caKf2!d1⚵Wߥ9doo}ϷA`cC F)n{ġz%0\cnLH6f.jA% ڳf5(b rUf*ka~7g*9ZZF`w 8%V]fFVjj:>AIaK>LxjܙBS1Rٴ~t$:K_Gɦ%X >#xo:.5+ф$ϙ-:,/aPca߷-େnZUqiOP%{[V^IΚM>u&+.&;tV>N5R:Mz} ̸.O( $)jq8qQoj*x15*k=ׅ;.2x=K!/D-Hoz+;hp/v{vw{h̙"#hPlW̱vc\Fۓw>6vce8[܁ A{>1t,o(Nƣ(qk{7> >;] p gI]8*{0 H3%pÞ9x*fah]'྘NQ60”Ƕ3%dd3v}yVy蓑 tX1$ʌ`"˾j % '+~nwBM-ZWI:fyW1|s{D$2P 4l̢7+lYؗtQ8H*H?)%ߖ󋶃8ދԋ,TFmcy;`yn='? sn.wz rx/J/p'@+8"-LI‚R`$H8E% Gu`KJJ;l۠(!sJȒINxgƏ]V&6Q?KXWz_o W!EPK PKE9@3javax/management/modelmbean/XMLParseException.classOO0Ɵ(:gM-z3/DOӘ`ׂ l)`br(YR5`C :u2\bㅊ kٰ-|6e -;/Z-aۅ_~&~ z#:پPK.2gPKIG@javax/management/monitor/PKPKE9@-javax/management/monitor/CounterMonitor.classoP- cؘQ6F̘X{Bۥ4'-be@{'<8(JtL?5ia\X~bL캿J0x#PYYͨI %VnPO.KBn Ը#&mLa]O6U1rmIc$8e6[:#$z}H;b`]٬CXnw8:2MKP-s? hy/YG4C]1nTϜ j\y}&ƐauO|Aykl ! [2 \4,{Y0A &څ{uq\ִ r)9@Jε6nVskdw6^XE݉t Ryp)? xbH#,EY]\eSV.RI"qTB=e;Qq~C>2C}Os I>9aL< u/`ePʭPn*KxC;AXrc3yȝv2E&].{ %% ,?&9Ⱦ<$D,ޅЊZex!@iʅPaՋPK<vPKE9@2javax/management/monitor/CounterMonitorMBean.classRMO1"( dIzRF,f%<QeVؤ}{3|}| ]QWR8W*l\"92X2ˮsc`T4.bvAGoapkmnà@-/TfPJerԮ5}2w !|!\ml/u乥x{ʣ,z 2}xw]S9y=._ϤxQ:S # 9hcڳ4hyC Z9-ĞaeJ2Ƹ׉+ {1KSJ&cV $ﻉG8}:3pPKu`KPKE9@+javax/management/monitor/GaugeMonitor.classnA,,-XB[ZXѨ6bb `ifw@}'M 2]-l\9÷<htB?ujә!ipaZt<`&QkK8\W8nTmf%!S[`ͱaVvF@avM-.n0*&ۘrL3OXOe,WJ]QcPwZba]ZKX06Y4 SPM{|$Vfz߹`]Ѥ:; PJ_/ƒd~YC=0sbG_$)x,%Xt{wMEڞRW22klD³׹zH f j Dg7\H +x.񾀻:X$)U.r ,⊞BaYU.*q.N#ߦX9Kz%3`K5Gl ር캈xE QtW'P'yJkGNٹ. PK:&NPKE9@0javax/management/monitor/GaugeMonitorMBean.classN@gA ("/^Ń^9im,[nQ_̓C_vfl'pW⒛hTeKlǸ瞉١~\&! c.M;žJBٟeb?3.:*Nq}gO*aa[;)mŕˠ^xp"ݸ-ڵr5m*nMG@$3`ͯC̃0g/K" [_ =?S(=wmr+NOjڞ;1fZ\&Mzi4ړ$l@ 6R&(dҁjG@ tX{`?bP oPKVstyPKE9@&javax/management/monitor/Monitor.classU[sF>+I0IM8`;ֽ9MEv2Ba&- H0jgڧ??ӳ+f\w߿'PKF`z:zzup=Fe`E5ӨV;7s_櫪U:ߦ]EPM&,ǰҸg{}겜BG,ޥNGXD˒i\\SuA,Xh:XIօǝʥXW .Ƃ`yCa*s$.<ؽgbl@Yb-xWê^yצGq ML LvRFfUiІ;$pJ VvA_ot83bv%V)4s |%jH:tvS,_};w9[!Sb&/SXBJncs5 :] U;xYqrjIjG%i|B`Y.D?F~ M|bb5H" H΢| ͐} !{ t^FN^8E[U'YO 3\c Du6Ã#t\ v?#2 ,ߩYU/ {ćc8Pt8I|Di_'4468¿@cw%Cۄv(m՘d';c7Q㫵Zs؍d~O2<}Oɘ~3{LE}kBM"QDFQ u+@?rtNOᜉ>C(%%QEdĺ`"sPKq; PKE9@+javax/management/monitor/MonitorMBean.classR]KBAk~eYYjٗ\_ЫOFf$POunR~@?*]%3g<1.l^  l^#){c~0$rku51f39ݳP b\>y#)&FC8=_O3 |~LMPR ( i[z v!քĈK͖ =5FawW[z0cC^(׭6£lI ML0-G*[>4j빴IL/k)IGu8܀MY؂l;yISs]sTiᑉV8Ml18PKs~PKE9@2javax/management/monitor/MonitorNotification.classT[S@> m+1U68S@˴ Om4n>9?x҆v!aЗ|_Ξ??6![',jSY)˱pTy c0B`%SkeUj0VU]tSjQLm-cE:,QK'֙PJ:ӡqg19qsAUchB?*b_`B0؂[^FWU3Z0JpV=UW!(Whw41s֮*QLWa>EEɰBj9算B*.k7V:9_QQլ'z&LirI`y-h |r YaXu[.xLdOYc߫I`:L)8 f^kZy3iB]apD496Q)߁*hG~҃?Rv(޼zA,Q!+,\8xO`8`3xAM"A0)YAql{Tţ.%1X0h D$|o!-Iw$sϋn%?`Rh_e7_PKΚ)PKE9@6javax/management/monitor/MonitorSettingException.classN0?iPh\uCE,2 V0JńPTpߝ~ E,ĒBTRZZci2F:pBM*mT. :Z\13x!Z좍C/RZW\bI~T$"RٸͳzcG]up0tτNylJJO. Q켕,CU[e}nA}ytـ"NHgxwl}E[nZx/Hu^n枫PK&PKE9@,javax/management/monitor/StringMonitor.classoAg_kQlVQ}1Mr݆#{ I}2??8wxxfn~A tF?mP̑uutE#wV Mzen%pQ@G5YHC\ Phrv.bq a0-ϹGl.V & өU1u0 6l@%X0u$Y{ qWR]4HxiMmvQ@Z%r]#=Q=;K}LJ>JzF`%14u]{BNi̿J#8  E`2BbOx|ǝ{jwO|5\[hq^-A9ob2>*x}+P@K6AX@eh}g1Vie̱F^5{JY J_jeX#%FAKʍ~6`3dDH}16+ (+Z I-rc,s&сn2؃I+b?C v&@ VupCg3=TkdB/rIQ+ku)hGso`Ϫ6\cڈVZ>b4B?B 2-7yZ#wգܧtW{x/Z ifObBʛ )#%K}>I6pa3h 94 'Ґ4'zJiieO1PKۡZPKIG@javax/management/openmbean/PKPKE9@*javax/management/openmbean/ArrayType.classV[oA=@zZzm!DblR i ]?O&>QofWVy؝=s.3?b?W7yŨ7 V2~eYx00,@HFN!8:ؑI2Fu"̰9d!wxk C *&wofS982x#`K*7+c Yd45I*RL˼z-!b96 gɭmvwV2E†vX&Q"-Z9 DKna]uƐg5>7yk҅Qv23Y˞eHpZbxLRf6++H1Oӓ~T!)dv?1'ԢӴn@m-C5{KԄ#.2t*moNy{84[%fs\^O S%z2(S^m$ݛ!ꥰ~KPoZe㵐xۖ2^;HxrE,HBD]5 cq(a;}iC!1Cl4Ey8iM:X`QAFK-wot=B1/s"[|/]J1rZJ>xH%D|Xת)]]:q+JC{ky E3ZalQsk\W鞘5c\ \O4g?)u;ܒC {PKoJ\ PKE9@.javax/management/openmbean/CompositeData.classN@R~D+M!&n5&cb4qq!K!S"𡌷S(5vs&wNϝ ǰ@7>* yĕhQ=Mt, @0pSڗBv8aP 2(T| Z77S“G_\eJP !e'?9A%׈w :.$)|tGB R /ե'5y+ uHtMOgD2+ɫ0` Rr|;4Ӧ;yob_taamRE/S~094/x'e܏=Џ/K9=:O7o(pHk`` h}` ˀVJ$cͩ]űn9 阃aònRRr|ȝʱa9*o(yb۪t]{g6{~PKcPKE9@5javax/management/openmbean/CompositeDataSupport.classTMOA~ ҂ *"Kk AX$AO:C햀ɃL<QwfR/;_3_xD0es w]Iv9IU)b'1(H!5y&mKޱRirDIcga(MU*=CqLIwu ٫QtiPd?^6P64Qq@ sM;oÊqA"w=VWUy-3l OP ˢeXmm0W&Io(d3ݷ\,JAυbǸzϳu5kF>f*0FH/j##-FZH`t@2}d2Xf,V-8ְNTwHN,wɢޣ2JvHRl8Yd(ٲNV $ 6(Y!}s:/:»yw!-3#Nv&FIJ ļԼԼܤ<}܂̒TĒİrvFļt}F| a>RYjIR֌ \Eɩn9 b.@2X @PKo;JPKE9@.javax/management/openmbean/CompositeType.classU[OAN)m)ryCۊ,114&FbJxЧL`[wd?e<3!0s3_fBL -\єmjH},z(-/;2,aL !WU;T3 NKM}6aJ]>"_]4dG+ "$ -RCutnZٱ=dwYFG01˾-l\˕Cq&j^CTM<6  "L&$t> >2aZ(7ؗٔO] zdCۀ0ڔzO _E L3}V\;©NJ7JG5򣼬KM/EZ6qJajRu7ke7Ƭp»ke^X bi9eY+Rm9 "[_69&1N a)L[3,e49[yVZ"']>M|ZSL轪j~*1X%<Š/=3): tHļ1XMNR"¤3eqN|&B4F >C'ZܖdT n'\M^q/2=Dž:M*nǔ!Iĵ{ geU!#l`ٍCkF$ZF->%l%v%۬MOPKX<PKE9@9javax/management/openmbean/InvalidOpenTypeException.classOJ@}ۦjUoT=x Pzh}.qe 1 < ?JM0ofy3_N`8{XX'4T ÇZ1~IC6*X C=VF>N}-qVz,g3\qfkſn{*g)CMl"7prEWF12^øJMlP-^_VwxAX}VvoPKyPKE9@2javax/management/openmbean/OpenDataException.classON@sL @*PP (oϑD-*$ >B],+v1s  -h)&*fRSI:z ]/93|!:WZ p"_O2Dm4J9;4ͤ@7.&T*[WMjavax/management/openmbean/OpenMBeanAttributeInfoSupport.classVKSKz \Py"*#D4H ʤ4c%3q2pV׮uBWVŭGYF4*Ht' a÷n:UaW6d=Cms'ڛN^:g"0тn70a,V+-s͓]&DmU'V^ O:ƾY\r^&ƏҰB|EZUqs2XeuFr:yyIUcJe#^-Bia8<| l7U;#,xG;gru(z[EQ,Ǯg`[! |+b皲PȩQu&Uw qw,9*we*˩U;>kŵys mh=.3}~4F Chw:~("#$eeot7'u#Q)#ppۯYl^H5!#iдlFζp.@Fx~XDzޙ>ZoF-NQBU AtSw%Sm_Ћ %Gi4if ъIco1H$w~y.8@|?!@YT"P0VZ#8OYduᘲY?8N ZKd484>:QZ8My&@N,I4J&{H:[Z9OV% sB)]wQ|#V= ,i:KaO+b=駙2з6E3WG" pD0!|Q-CF 2,F02ĭ &4!Ǵ1ǵ;1'ȥȓZ2Y -r\!_A{ZEfPKPKE9@9javax/management/openmbean/OpenMBeanConstructorInfo.classuON@ `BN2AHAr,#.ψo(Ğ@ }3)^tM xm7l% a¦4޵nfmmqL5^!⧖F8N;Qܕ_Zp?:3JSLb黡²0['a?w7ޒB_QQm%L~-Pdu9_TOyE 2Ezwqp<'PKu@YuPKE9@@javax/management/openmbean/OpenMBeanConstructorInfoSupport.classSJ@=WFZ0jŠ Tq5i40+G7Zfc= y{yeCGJԥ/qP*N \pvvY9PM[ Vذ^6҄OypQPujd2ʥ—FkUeqBtmߘ'[oNLɋ]@Q6^-}PKwPKE9@.javax/management/openmbean/OpenMBeanInfo.class}QMO@EmABMrR vۭyoJP{lߛy.* ފ? G"Rj-d:\S]m$>Cǰ(W" x*x3ghFB_iB y0j}64c8`ht֊~Ȝ5FwRg_Xѿ֖qj_?҆ٓp1k(s,oW/Vu/$=RSZne\E#-IL*Z*,OKX,ttK}T.OK~)W/Vk\RAGB4?ݬk;p0G"R7M[q^{`W0# xWQs@scY(0{@@Q cfTYɣxR@0cLqɅ1]?s?h kPKzupPKE9@7javax/management/openmbean/OpenMBeanOperationInfo.classQN@}J [6zxPcDň'= b<~q41ef޾fw DAB"He4*HRAc8dT!u,neTc94e8THS98^-_`U0/L2K 8\R"]K3M%clhqլOu9bae/~壻"7Rѱ;$gkt,0lTx +(îÁ y\-o05ob#eqfs'PKA7$PKE9@>javax/management/openmbean/OpenMBeanOperationInfoSupport.classTMo@}cBLCQ-4B"!R)|zMQ N߁?~? 1E(%5v[Ϭ }xžxtJe8% ^0z-Lډ[i(>.C(E*2uJӆ etZU3OB4RB6&X$P jI0T=kz&(ޖ%2|%uiӑmn4vͦmFJ>O[x3nΦБaRB߱$fg˙Y!ew 7r4A|޻w%o?^foop 8g:lʩlƅ渌]F[oԣ6k򾓀Ey٦YZ;d=A ΞjJ|@ g0q4=FX}ȆD癮0>ӅgrCZ̠V( c^ LKәKyy)iӑZ<3.k1$V~)Mɘ\$ݠkQ^Zy":Rx.W3P܅4=2zl&;' cG$wi 6-W~$r8yrg $ Øe +Y9Op^S}E(M77UR6qW'uPa?T8PKf䲃PKE9@>javax/management/openmbean/OpenMBeanParameterInfoSupport.classW[OA>-]r+HHV41iÃ$&Cʒvn'O&>QƳۅB Msf͙i?2H֏ =JsT#Z8`T3J=bQ ./"x4B EU$T$ecybiCW\ΊĶ"hN+9emu"-=kn OtR44gH)*{]Fzq7])-K{TW̹4 M=8rP}俠-Zi_@ \-m&q}q{p̲p,+d!0AM @'2kL&p$:k{neK+묚{vSJ.JW̶nr!:/qjo7j@[w8 =ӍF=c6;弱Ge{"c`kNĕ %K33vͺ+[COU u4R 36RvRuyٷX \F+.mRވst-ig tB7 `P T2 q&A E_(/h w = hI Cbn}adqׂ8%r QB.a %`bŽoMr!2L d岾b>MV/ ,Ӛ{f q:J#N|kaV ?ؐ0$>oa]î,L=.,g?i!%;'?  BXu< /0$dXGÆð!  G>BdrL|9.D>g6r GIH%;%qm϶PKZPKE9@)javax/management/openmbean/OpenType.classTYOQnB7 [nQ& ńdijRn%ә:3%oAドQ89;̯?~4b g_-h '0ܶpZǂ;q˶H#0 ;ML44R Z*]ďm0Z1̓գbY <4 C] dKԥ/ 8n:>5+B vdY5ʹ m8kɦÃGY.Rz+K԰#2CP3$vUCMÐ)ߡyvS{ SU7fJo!ں;i2gU.}ayP=/v8ކ*i*flݨW*j)mJpzK]!e0dzL|fS$p` L(i 4q3gKM~ )?Wü#,h}4D\BV~1Nہae&ƾ܊0 ɊZ5I(XT: 't3lD-?O)O%xPK bPKE9@+javax/management/openmbean/SimpleType.classUrV'6E4\P )$J[۲S*pKo3'#K,g3}(ӇЏt8Cm{fKkm-ϖϿMD$0Z{ɏ\;kMϹ7kYC4^I3ZyO$2ʔ;jR+ihc[VЃ*4d\fs;_KQݩ6;5=!,V-5&Ҳ͕]U!/0PyB"]-5K#8N=jir?C߲s*$TyYH~r3;ܷ̹ Fۓlr|}nx\;S:]9zib4J{MmiK7x?lSkWoNצVd-YbZgz]Im:BǶ/2eЬfP%PZOSKShN ]3.KB }*Q^k}ВD!QIeJ0,l Qgp+Kv{VńːF Hrߣ4gr{HœZ(1f Cu<֠!g9p#Y>2Wз\g$%I|h̪ ć%.E*dJ;2ܖ9GZVGGC Q)ʟ3s3Z k:6:{}{K=7a?R4 i4,lj)X|6> djҟChxDŽI<8iO8gg1q DIu/輌^{\o** 0$Zi;A!*mX+jg ${6 8C0J sHŴn m=ъS>\&fc<Qءb]bK"1Fuܖ c5X~ώ lN>}W W WuŊ&ѳ25i7_zN-/tRDɵǤzڧVhP=2\DMлB9T7^Ue;T7̜z0iX{6w"R-Eӝ15Z@oLT\C)tԲRɐmã[U1 UR]9>岺sWD9pJ i6UcYȞhy#(`UXfz*"%G̝G>`s`cefnѢ&ka}kq$A<~X3(a|C\5\r?wh0wl+@20k2 f\ =0|7 }'30s>=?B| N:΋`X? &`Ї p7y&`u,a)vkr*2em+1.Eb##iEY, 㲢+Ƞ7lU茔Qn)aVkJ+ Fᶲ'܁a祖W^"<[>@fyUXηO{ii푏vW%ZF#Cc<@-FBmsیȎ?Uŷ L@c۲݊1ݶ`[4%dJPo/}WPuuv :PKa斺 PKE9@,javax/management/openmbean/TabularType.classS]oQ=w"m*!Vcb }4!%) 7peAL|swiCY p9s,`49cc-Cay=ְ#eorHg[$K%2$ҒCPVhy"7=#ەPkr!q#OږCuWiĐ uˎhhHKDLFawT$e(-}j5B\p番 ^>Ce7 [sFK_|nDsjj&a pT|OFC*i%|Q$ԣj'+NP+6;PfG )鶹铯{vHr};]ImN-Jfh.RrǨliRx K@Y@<iNЭWcp'nә` t s;A5Yza#K < mKyGbgrC!|bЈ3GAj'jeI-# sO7ߞ|B;K:Rݻs5djPK)q2PKIG@javax/management/relation/PKPKE9@:javax/management/relation/InvalidRelationIdException.classJ@ƿMFcڪWV\E ޷Wiky<>8^$0|~8 p$*"%72*4Jd*qru G 0t.VCkx0eDha6: Hiy7g0'v*C8)&.eymd8)#maՕC`lw@Nj m.jz=l[ PK#PKE9@?javax/management/relation/InvalidRelationServiceException.classJ@ƿMDcڪwCUp" B`mĕd#kZ>%n){ovf>>c=Z,x!d!uōEJot-r5kDZj'NV+ h_3cJs/dTa_=gxcy.tƓ(nZ%ܤZ-qj?ZGW )⤌}W.βt[ <"V_64v3w\ PKPKE9@<javax/management/relation/InvalidRelationTypeException.classN0i Ph[ #*bA !E V0JMXLH <8w<'Qτ̤.(T.E&>O"SkV\*+Z`_&Z~q*Qt$*ţ1G;ϰs,ON0J'}wQ)̉孲'tZplitA}e? r_!;ؠ\nZx/HUl7PK'd:PKE9@8javax/management/relation/InvalidRoleInfoException.classN0?iPhQłXH"uwSibBbx(F,(?'z +يL\p I1kGI߭R Bzn\9AZ(Q4'SVy6hEI|#INMt*bAp!AsT2Iaʆ~ 7O Ip>?w$a{]F6V;6|9=lY^7Xݶ >\7T:3|PKّ<PKE9@9javax/management/relation/InvalidRoleValueException.classK0ǿVtGT0xQMzϺP#i*Y[oy<GIVH/'ッO.^X͖4ge<窤KVBU3)BɊ-Sj+!|vp8Ap-(o:- q=v4{1;sœ΅K-MJ;!R4 ˉH9__PK ,y?AP$`ەXԠ(tU`e= a&=E Ϗ4`j{bI+$'~.s/4}OI$p6|n44S٦jηR$MʫWlĤkz&*s47U2n =f8+rQʐMgr˸ǝXK}4CuLji=+J`|hc)M /fpnr65(n LW e=8\c=-frQ7xqf)'x1v}QNKjxa_PKS /PKE9@1javax/management/relation/RelationException.classON0}NBB'#6TĂ`@nQ V-&$>B݈%býww?>#`8|s"ԖY*kr#1B݆W+Ck?a/GڈnVNyB2*D'pcx!t(saNܨF!W3k; @]B12;V|;bk;K:3o3/7X~~PKPKE9@9javax/management/relation/RelationNotFoundException.classN0?iPhD :E(V0JldńP ݿ9z'>狤&FJi;ԕ-2Bu-7 ф!36h1tRĨ* ?%Ȟ{t6}fqZd- 5QbbIkΔXVV߷^[~zgnoLҫ D8jf%:%G UEAF,4kjjXG4f[!@ j,kƲn,Ʋe,맇@n-yk}wQiVGt|5v:hOia|!ʉꘊ ngoG?"N"0kVm=UzQ<ը%M1cCZH)e5^$y x@?28X A>lwZr&OLs\"IW$=h Pr'x#,X8a Q/GO1eD!rrQc.m !;azo-mT[-}Jv-M̍eK+ؒnm i-خᦗ1v;l[]TjZa㵽rrgVx/o{2ԁr2܁r2_PK{"B9 PKE9@/javax/management/relation/RelationService.classXmWG " U@ F@jE5(.!twC//s??wf7Y2P{r$ɽ}3w?csk;fj9MM7mӼ1tz 56 [ٖ5ǥjPl7 *ffhp\{&@U%4&D|l<4ܫSCk6oeih6u)|p0Jq{<%оdZ~M _w Rl责uZ6[2 ЛĹMOuZ`NNafPբL-+X%$ Eq5SU4EY4wp^=OӗCp?M`\n隖/3T$޳L!ف(;# ''n6P,.>TpD`^؁[TrP-k9+Uʕ!aitiUz'fT 6\j*SV,4.*l &VݦKV,aQY㽠?!*f EsbY4XcTos5N5e9Ss6&K02g*QGnb1u\.m j,Qxnoz%/)]<Lug´$1+#yF=Ց!EgS̻I]*Ŗ-NхX9P;jSɰl[w'Z ɱz,vڼfeW+R_#pЊGՋ7(׎T+)1}l](rXr$Ψff8Jzh!"z^w=ҜM}FQKpfubn2Q0/`21ւױxc. [RDr 6-%*[ ׌e< 鳑:D']e:pt2 1w:|ͳB]&j;Ub0m+kSkyX% Y™ވ@9w8J87K{S>K?nCKox`]UϩG뷔Iݯ0zL2*hguO甂}X zE֧@{o񝩕y&cwKy;R F~o ȃy 6BAlHj3|u7 ԯ斊lnAsq-0|T>6LDGx a #L$ܸ\E``k3z['^1b5^Ԑ/h@r,ٯ~PKy-PKE9@4javax/management/relation/RelationServiceMBean.classWzFb`±: $]#P$:W}_}>T䕵@hϿ3?7MC]GMf{t+63[f>4UV_bT`lW6߾cK`jZdO` ,7 [7w8J`a5=u]K'p5Z3*۰U3En\RC9DIr{Ov M OttK7EDZT5&8~⹺Q&hSol$gз\H=< &4UGƜ?Qd< mRB0F&pEYLL$q9%x&2'⎇WG^2o03ܪ(dsnU8\*`QHg.fd5hVd2XPD@Bb lqΊ!ej 1(hXG) Ovr>M'a,F ͂ܥNQ1хtgQu.͌wHYN.Q6& ,L Y]>%Cm0e~!Coj7#485h8'vY a:I.+bd#%jg/'1GJ;\8Ѽsả;!,m\;iyVus5n vFqc;)\Miԟs~Gɗ F0'oBI# po.e+. 25|Cͷǖ\[/ (J案;p=/·^Py,fqth|Q.EA6 K({" jViPy3 ׬Clf)H!7^/cYےBODWx#S|h"D|?PKD~__PKE9@Ejavax/management/relation/RelationServiceNotRegisteredException.classOJ@=jUj#IEU袑%$NC˕ęip#]s!z5DcEϮro  ZN->7$w5ۨ]sPK PKE9@/javax/management/relation/RelationSupport.classVRF=k0$@‡! I[SH ubHkS:ZQFHYf:}>TW+a˖d9xl9g?C=+nZBfjTZi pUF]}w^Tiua-@rr(Qui[D(こI<Ȟfh>e\-ͨJ6S~% w(Q9Up֛ &vqEŹs%H#&100so4C.u/t0S2\?̽aRk2l[Cغ r_ܰmkac~O ڥ"kaέ'v0QK]w$r.IP͖n3 JUũi@XsF/jTEMHUL{U-[ޠr*Zv"G>2֑g/(>&e1nMnd|a7ۣ4 auY*탞}lx8Y5o'S>IOVw>6[_h4zĭfЁ?2̟+wʀ Jk͢c1.;$7hӷf~%,|1r{Ʌ+"J7ٰDMk NB dQǝ)KPOĵT7w#gzFNysCvE*ћm8;{PW̖UǚSl/S{X$Bnfi6qOlf)ܢя4Jw; Zv(y<,ݡ!9%` ˁtF#Qfe}7 6J;<%pF8IY{'LFG֓uNfMOt >6ڃL(Cy쏜E>V,r!hQ LD=D(ɖq{zF.v|PcưilKl$s|ᱥ7)|Iz;b&]Ya.XqX m=䖜6^z2>]rw$~տ{U yIK+,gXAC}F.oQ4K$HIzw(ߥHO/IPKw| KPKE9@4javax/management/relation/RelationSupportMBean.class @g Xiね gXB伓">C,e盝/WS<<ɳ8H-#>"a%mlؼ ;Mb9KDhzzIN.)WfAkJFr%%!/b < EWe 硊_7;GY`#ͨUb~gߎob[7V:xV}*E-{~ PKUYPKE9@3javax/management/relation/RelationTypeSupport.classn@I݆&m *Uo**UDpI;*oWH\<bv+Izfv_4R'gb ݮТ#Rn =*_FɗlDi8eSzBw3a+ j/JwvN Ρߖ!C9\ՄjJzmD4=&k~Kx"P]l "xfSogH|OOOyKLF{yݱOC N&dE}In$:2 .XݙIky='95u˫~xGk^.#3 TߌbCu@ I0&%ʌi{j@X6?;.Y"{o|c#6x-a X&O)^c{% <\\{Iy(V(փDV-(P'E:vzh%3m-Պ7Fi牭Z}Z*jR-M-PKU'PKE9@(javax/management/relation/RoleInfo.classSN@uB( p (p*J4d)) Pg KB>OGMӸ=;3Y?e_[z4A GNnJԙj\2D uNrtq4GrS9f:L/tF S9*w+{jy|Tuje90FU&SGƺٸ9Z:"K@Iz Vn6.uzdjT?8sm c[jJrS]J'^w!٪4p(t?j7P?Plyv{L=ȀvŴOn-5櫭87u1[8 3umrx|Вq[ DiDv) +ּFYBcii쀻V];0H  -%H@ q?$0u`qQóo|T|a YQI)D?vM.YDQT416-wk9*ZVldzv_ 0o\nƄQI l2R#6 !F\h,X_cE1G>ҘI/kx'JT s-@zL =27C0- PKAiqPKE9@9javax/management/relation/RoleInfoNotFoundException.classN0?iPh *!E(&%62NbBbx(F, x|w_Nэ=ӒIKC5/J;U[ T%7?Jv~RHa1Axnߏ} ^`={UbyW_N|5k[VQVew 566-PKmOPKE9@(javax/management/relation/RoleList.classoAg_KPhPګ51ib$MZ5adqvo<.;3?? '@"P72#հSթ b]mb% J ʙi[f oif Dx&!+8tW3wQO5?Оt}_QSceMw4[d7<&@:(N^aRԚ lsƺL 󬊓O2Sc]}VSֵ9+K#CTœ?$c gN8|BW 0mn/%P # `mŶ68Itb?\gsˍDE#h.W_kl(S3}G̓[[vs 3 Np5~x k_f>)Y~f41x r[?.qhϹtы%؄-%gv%gW'lvRie)Cxm2A-41GJqUdy'fdL*(dhzRlWY}2$S*7ǟOCep/ ."SIikϾ| U&j4 ƶ;PK5 PKE9@*javax/management/relation/RoleResult.classRN1=E(Wbqƍ+  df Ưҕ ?2vFI\m{9Slc>moBq_:Uu  9ʹM#& UJ> siK^]"=ۮ-޿c_:-3H!0Qp"mq6{$_q\qC0Ka7n}}cK>a8_W m넾YiZ/8R]{o{#DGL3]sznS\I=鏴A/Am&)Nd=xA61PL cV@@971 `X@14Q;{=^oM<"`\bb :;O=Y6Tiso^^EQmInok ̱tdpp`XS^;o0iI?h; kmwx0*tl-]h!dQdH ^#Άއv7-LXbL-⌸\-cG4haNN~vc=uY6Vtw.Ep$>Pep@`Ֆr'Inf:Z-gMUZͬk+tNWPKR;PKE9@2javax/management/relation/RoleUnresolvedList.classNA,ZO[TVMڤ`IS"imfmwE{դ}>T3ú lXR.v~;g쟿~1΂B`ѯ-55e̠nڅezqǺ- nhMD]7uA ̜Y]C[o@#ܲ:Ը#PmMc:)QiM`T.k:}c GZkp`V_'vHW.Ơ}:n^<#^ӑ],Ea 1>8P O @~(ՙeDC6땆όȅOQ 0RN wY70y4^mY-v]cdq1dmq=vykgG=Wߕ5t3fsi8㕟NH3!W1>8p)~&^{@lD8DPA JhvBvk_/79mEn J|=\?Է"]Bh#k;C)P9־e >]1Żb{B؈bnM͈PVez?PK@ PKIG@javax/management/remote/PKPKE9@,javax/management/remote/JMXAddressable.class;o>#Nv&FIJ ļԼT}/ǔĤTvFZļt}F2FM M<e&X5%e22Z2v2X @PK4NZPKE9@.javax/management/remote/JMXAuthenticator.class;o>#Nv&FIJ ļԼT}/Ғ HfrbI~; #H~Nb^RVjr #O"BU*#kM%ũɥE% -YFҢT4120203# l ;dbPKt[PKE9@7javax/management/remote/JMXConnectionNotification.classR]oA=CJj[ ưkL YB| )ٝ5g铉FW>{=ܻsoGasGJۡ-w@)jNt2̔) 5ô=FvORVHyM?ŭk5 &ZNBi!KP;~@-2xRoP?$T4 ~2oHw8ʣYN"eC"Q5l2MroCiprpàfx$6>-搁cilј#+y +Lp)Eb #'E˄WR2+)|>FX:EYd +%mi ܤuT^-l U6Ŗ";4R,yx4LhdnF]Kq60B_PK撣HPKE9@*javax/management/remote/JMXConnector.classSN1sIbAHBԭF^o|$dD-wϜ3<>?W8t`QWŀPYn-ϺV =K & mp0(Լm Vͳ`5H(wdƘU;ޠ:<)ˆQ)Rkm/%# Qj\doڥ 혔jax",|c]"`9y+㱕!o4Պ+%llȭ)ɬ_Tl#brL4 *#_RocW#b#.bȔg:J6;|" { եDձzLﻚLLkѾBy$(N%ڋ)IR6Ev`wGS| SEh}N PK Z(PKE9@1javax/management/remote/JMXConnectorFactory.class]S@mK?ˇ(QoaV`lZӤn++r ?lZKSٜyϾ'WH!wv}<(?(s`/.U;2N\86E`U*̋V[ҫo2*m42 ˧|W5">[0,ZGV2Tv~I*1\ |;$uAWx]Ә`Xj~RNk`-t񡹙7L-9$Y th]_aH0aJOk7j"85Wh}H6`XrVJ>oʌ-W퀦kLl~K0d/;x0DėCrKzRm3sQx fP$]CvS'yX)e8 8L`aOSiLK1Lsn!B A_B^L]P WYe$0 #W U΢*V)$n* wUlN |L#'SOF=5^LBǴ/ULx+&uo#:ck g]PKY PKE9@7javax/management/remote/JMXConnectorServerFactory.classTRA&DQjVn԰qp3L"\} _COVy|(˞(hDC7_~ `1?j\ @|-‹p8"h`,8ØIut U50B ͕.s)dX8c7=v=h=aW*{B>a? R+2;/QTU=1Z\jo?{}wgXU]m0L){ oWc+Kv&qSK*z;TpfRHj(ꊺb L3LoxYU\7k{{SV7]9{ڑ'̖.<-5_IZ'1n6+diÍEPuc CPBx_%<ցo$ƃ79ҥv{O7H|`7Iގy 茅"KpdKd̸H~~0LX"JG QPK1\dPKE9@5javax/management/remote/JMXConnectorServerMBean.classRMO@EQi=ы I0i)vv6qZ B/yz ƀXLPH o=*)1JwPQnPBvOYM ln <UPhAZo[bDLs0F'Wn:#5 dϑ2:4C)2~y=WZE A!2CG de(wӰ/mW'61 9nza8j'VZ >z;Uz9f]+ ͯNwlͫK4:= ځR'vB9!A/Pщ2LkoDf} &o3/qŋkXX~g;M+ΖhS6{J3 ^PKP=hPKE9@5javax/management/remote/JMXServerErrorException.classQN0}nBT0e b 0Un8ƮL> aB{ϯg PcϢs %2IP 7 m󔦅*u".5!RW 2F,TшG Qz>BzX*c2b;Gt6g2iþH>h2S<:ζP9Heq:mnX$ڡx 3܊*ͻM0wX{^L̎k˯-|kN>IB-Q֡+-鼋: "rWC g w2@*g8NSPDCB56W5,٠4pXѡN[ 'yAAСeB V} &StɃC) .2䶟ٗwho#,y\ʼVsVZ\PK^k|-VPKE9@2javax/management/remote/MBeanServerForwarder.class;o>#^v&FIJ ļԼT}_ļԢ"Ģ"vFļt}v6F s `dKO-APM~-a \Eɩn9 <2bFf fW  q2pEA <PK@.PKE9@0javax/management/remote/NotificationResult.classRNP=WQy; ƊqqctA1n\]ꈗ6 !L\~qcx$<93sϯ6vP̞tdzhӣlZ+Kj:W@L`7mtv,FU"OI[=ɶMc(}"pXoF]KC~<N;J!4 e4CAMu8(p-iH؝;w#f / aX ݁J IV-zc. yhh,Q>V{Tx+Ygz_{ l]OWߐz % 5,2 D8wdY؏rȳ(8e-+|:3?YS52,dn7PK8͑:PKE9@9javax/management/remote/SubjectDelegationPermission.classN0B[ؐq11p"T GUHSc1!1<8€s>_NP8ȩ|ReL)iJ3KO(הP,=T9gjFٗR*4ΕVB`{?,q0Fxp0]e䣊&[[tWc2r@;"Q7kIg?v}*ͱC/a6 ì0*\ܑcSᬎGw+|{Baqt&ǝ(Zs %7,\ř[tvPK0*-PKE9@2javax/management/remote/TargetedNotification.classQKO1kAª' F,Yvғ?8HdN;3ߣ~|~Ʃ@m,ŜHGhB6=̮FivzR d}iKgd>4\Cz}QNb9J7?ٖiD^5!%^ Rъ_Xʡl'pY@=/1u S67ޥٖ;/W YRSMy{b0nUWDnNvܙ7Z K ~4^qu7qfH!4<9/ ~fX8\ x{Oݥ2RPKC@-`PKIG@javax/management/remote/rmi/PKPKE9@/javax/management/remote/rmi/RMIConnection.classWrE=o"+v sI c[T⢊47f?(GQ=f]]VwO3ݽwKZbX|7EKHe)a-ǮlOZ8pV.M)9#6O ^pj\t%~-l#lX4qqzD-udPհ\|̐[;} 3p\'R9XcW&(u/؞b Y΀lv5+I%_f+u_pB[!aTU#cUu\"ݗRA<F/3LQ^kuT.3\K~*r? ??Ixc?BC^3](mdgҺ"U(jEPoGvɮLZ֝!d43IAf4}H$Tg8_XL)DU22EvcSKCd";lx _4 G&9LwbzFU:<~ /{ver9Q`(~bTDS/wLr7F;Ɩ>*ǵBt4%WO5_ zg赺C%6~o %=1D6hWvɤ Ur'E (Mq5FZy]#xP$e=,'J??Q BfmwAgR^ĺR>oiGpSx}z^ȑl~M>H1!>m#l?g=qw)#癚/H׮}#]͐a=C_vGZp f#-GS/PK*RPKE9@3javax/management/remote/rmi/RMIConnectionImpl.classXKwF< @ `'Bg֩RJJ;Y zdEaMAesXGH='-]D{g~'Lf.=R::mdufYWœl^ohI%0(ksLB?xWYdH7YL/Jņ"?}bIJwJ9ZVѠf=+;jo)Աו#8) t#[!tj;&#f4nt↠;gTX z`,}lѩ1!]ЇELjU^sHq&5LnCwΤwl 먚;m߼hh0GjdF+EVjr!e3^K͒EZgA!5ui0 * NJ9G-P KH.h#W-b Gi/whCӳMv0YvtD0茇d`}X5W6FQ_!šX 5DPcIRBⶆT}Q!mÁIah0g`iPn.m2jn Dv%b">섕%W]^ ,Wyj ^ft$W 1Yʽݝ ޒ0ߧ )-_ҸxEF"_!0rl'eU5TĖ7fztw:€4ٹf̡v限n)UXzl} \Y4vi5'˭-U}x@?w Y( 7I<v7eVWa_߉hnK[b1qvq `K4Jp\TKLpRid$Tdưd?@h8SAӡQ"wtvƩ]}$A_C7V|+TsXܴHx~A8]x;**%Sn2i*YfU;=@I^Hak~Fg?8yÝA: Cb08kyk2+Zcp')|vםH S owDDO Ǐyl%Dkr&zEk )q  xq/ ^F\ t0z7.& cC 9+4i0adDj&;d](5ϽHS-~>3Ra;s>5Yd/\!2LfO((ZP hU1Dp"] ?>bJHm6<A۰v*| k#=eZ =)yrK 2gS^w%O`ERL-mKx{&V?Y̆WI#s]*|ݶ˾nmc uo#B r-<"lHkMQWʝ ]+wwUmd2z ϛQ~S*b \ Tm Xb/[M7Z( =[tPK^0PKE9@8javax/management/remote/rmi/RMIConnectionImpl_Stub.classWVF5 !Ks .I)RJ,ڈՅ;9CtUYZYsúxvٙ_ > }zH5*1k,դJq^UV2$U)vk3iu>ͶwK㱤H,ܲvUfF7 ϫe6LCr]˒V.^]^VKTޤd;{N`z>C}LDhRE*Q `Y 0Ϲ >6r{TY6GPe$8OMc/aF+l;dIF ǒ|q͵$:T)1uQ5;`SW8NٷBC8؃۷ >i*ktTbX VejjG`g~JcRw4F Q /9 Cj˩ 0z$a@>4dt|p{2p$g$ ̆ykXៀ<U,ۥ` X!/.~<{NJmQNf;Tn$lL7eFUf(}4d Nx'90+Wk_JݨGӤfi V*e=QQ]/Xb_5*) `|t ,v+fc0hFJ`+1!v]d̉e#kh~yQVcax}u!){$9FPNH^׹V!v Y:h 3i"pߛL;拏]##=4$90832с, ۢCe,hOۧ==7;+E?^dz>tO®vHe*ؤɼ{޸G_UT4\*'09]5Ԇjj%(Y_I Sw?x=sc@w|HvW"^{eF;@mW㐯;pYa O0!|jO7 n-Zq *.oyos{y9oyH݅юoa8 Ҏ6ts (F9w^Q+6㊵ AEIJ<{< D} ɟq]OLA% *ΕL;hd臧J&4UDY*TY ]PG.g/9|y#@(Se9L*(,<DlwÐnuËC1nx:Y,]e#>v3ѷRgɗΪ ~Q<'{h 1 ά$~y `A1XhZ7ku(*Ix .w3 !%{9\&?80(FӡM1xxD(c6FmE{у-t"[ZuG0PKӻN/- PKE9@4javax/management/remote/rmi/RMIConnectorServer.classU[OA> hVKk hYoEc 0,S:v%`I eΙ]_:@X=QOjEZW,Z29USRX4 qJSZ^p$49Hrn, g2Q&J`(.X]5J[(nGxϪzq4d󇎍q.ǢL.}yÑa,1Bsbj)W۳_:FSm*rM|`|KMDFR-#Ut%YS9öx>aYL%vx1C'͊ʫ%vvww,^肉>"=gMVKyjeԼNŎgUtB`)sg}Z:\ XƮUcg?:7fTbFmmnrCfWtk ɶ@T;0- EÅE+x@Ǻ_9$_5l _l̵:>V kPy2LUKL\{)?0Ǐy1r޺u] Df È1?1{`\JLSPL]30 G0Gh!<.2 Dh3VcR4h%#Y>  3VR~.V~֛4v4B+/\4s9!5mI@Ulk0L:2Fvח#r]ur uP8RF&E5<2]'epw6_ɓ *vfsOQ"wy y["V5 ] Ai5)p̞g(6͋ ޮ|6RE,f\T^pt0ېX +0{}7Qk-Ve{aꋘ nqć8l 7+ԕσcis"; ^}T(KKsNe@uʪ*o{3E_L"dD4qZiehrR1 5_Gj?!=Z3kSQ)O0I+PUF5LܤW7182[FC諾T11]MP`,Y˒&&J!~e $1)23}t??ċ,1?᧺^pݳMnUx'۵V*H[ܩcaYdFt,5}a3dM vƴD xT<`Uͺà W+|g:ʎRc00E]ާ'լgFvT#gX=%po#*a*],O7 2!ú֋Vut9SC4"xS֓>M2 !%U6\ܓu_xhQ+.?b#*pr^ 4D Q \õ&R@it <_6Z{|\FH:r,2Yjh~Ah]]5h%%z j6V#}n)KE 0Y9"KAiG^qNҚ!701Z.Ți|4:d\E'ӘSɞ%d9%DI06UlR]T ć]Bg@Ӟia֨ܚ$B+<}gL{&X&B툰BIm| ގ:Ciɡd%1wU^ ]! 3/PKuPKE9@4javax/management/remote/rmi/RMIServerImpl_Stub.classNAƿ.*X ((^ ыF&UL ٝ%i "m\̜of'x" /3N*)x,3=" ({D=BiȮvSCyq0:0p5 '%ۄ'3`NɄU×X=ר)X#.a#tN涩,f7ٵm/^-x-;+2Jt,s 5J?dࡌEIx$V^5~'mJ іzE8Zʹ:ɽc3LM-263G8z}{PKQW3PKE9@8javax/management/remote/rmi/_RMIConnectionImpl_Tie.classSnRAZB)-U[=T*U1( %dq+g, |2𡌳{T8zqfvwa//4d=1Zi_ȱez?#_¥9->(9o>,Kľ ~lGƞ8(JBg8138LMi{HuˍӓJwh*hq}M g B5 ܌ѐ#Ңy'j+U_G;o Ch3x Ю<\A*l'p 6'p|C!S2FwSm<=0a=`׵7m火|+sTPle'ps%yk|c:`1 Ng;]}bo)]Gq+csPKϽQ7PKE9@5javax/management/remote/rmi/_RMIConnection_Stub.classWVG5 cQ# +pɂ$CX"b$Lmz!99yA~_9yuxp80:$̆9FSn 0U/E VY]s>ؽ?)m;bq2Ea?t[gvu;IQ^,H#8{Yk,B`ҷKea+#dK4A~x`GJ 1Y}:?4TdS0ݝJ;*sL;DQ[ nx鴐9>2"QIMzy'PV{ax~"uף;k$9FVNHҹR'rL? 3~"pG~tV,>&w=Ncx " ;Lv 3ٲ5,iO{N:+E?gNe<%?4}"K/ [sԚ`j VW{^x}U d[a l.Mj51l^ߕo~~GV)x'x?4'#< GZt'18wg|3Αw!S˜oً9rx0}z q|ʉaK<ŧntJ($ 8-Z>oy/z %C"W0.G7 BX :ď(="1 ġ^xT@ Hb'}X7H9 Ҕ^+Hpc?X?-FF厦#>HD%=Bɭ%O4*JnzhٕĒǧPl8K"U>"ñ _x srWD0͗XAi2}x1w^Zi,g3LXf`6sN{a6>%qTY`~hSоɎv!w koUm@yQ`K(ZUj{; KC_%P2q% WPK\n1ZPKE9@4javax/management/remote/rmi/_RMIServerImpl_Tie.classS[oA>D{mնTTO5&ĈAIŇu^0GL|gf7Pa a\g~ `["M곀灢T:.s[!pJKZׯCXջ}-(FS }!^H۵sp㲫Y l5>Ι_f'1"pN"G \QR.-G3j/?+ c8ƴh#ڲXP݆UtEuU8+1a s2]>M1<ʞi\4-'z,]^Ȧ z2Q$P]b<:ez*b^V8hsx\׎@;nRP@5EMXǕl18E!K)r #;\3m<1RJPAwU1eNyd7_J 2VRI,6Y.Aލ},Gip~IWQ.80pR^/PKܤ5PKE9@1javax/management/remote/rmi/_RMIServer_Stub.classMO1߮+ƃ ƃF&&(.Hkخ) d2v !J43Lobؼz\ \-y@F02QE,fPKn4PKIG@javax/management/timer/PKPKE9@"javax/management/timer/Timer.classVR7>2$-B @`~l !Dg3gWf]/8h:Ӌ>@Ӌ>Bg+{^IG#ɿo o~G/eJuZfU$תLQ7Jf[AK*83Z0]&-F#V,n [ %MJm>'@\6tSi:q+9} e#aտ'mq!X׮5eS,~*l? g׺k|@G`Lޑo(!vb&&8df a?!^c vk֦ʵ V4+]n ).pfbmÑ7Klߙ_K_&P o5D}<Sdy:bY]&0B0hq3ϙKxUcǨ%_9 +mLΐմ{E'*7jQ7UZL[ 63kwbh/izq|7O}>p|7aニa$%? ,o0~{ .`kS@>rf]ݛi1ED/ ܮݛ9 yW [EpW(l+ؽNjŶGuOh:o-Ğ"T]UۘTuXAڽ%ڃM ۪c-#*xU|`ۈ9*|!ԾP!16P'q+k)״چT?BI1±߄rLp fvF٧m R~Ȅy]sbt$0 9蔑8"Px-jGq{[{1/'syWw%<<, RNϡJ6 SJg}Ŧd9} 4,aKM)yxTQQÁ+R`IbPKRGPKE9@'javax/management/timer/TimerMBean.classTN@ r齴lT@)75"-ZdFM~~TƂqRx̙N`-"zAFTЀELhWi>eTXP ܐ=>`&P$5=״jc-}styXHlp*mz䶭v#3R#P3mdD Tw *=Yv<ͻj?jK,/f}ΰF97?d<6866UC(MQ.;¿r. 4Jyjd01RKlcnMى=V!_ޕ[ sf Z)Φ8gpn#SpB%X6%e\}cORSxfp5)`6Phe^e,n>nxd/PK/:?TPKE9@.javax/management/timer/TimerNotification.classPMO@} QOހkh׺I]?KO&(n-10fy@%:bSb:e6w+M)=;bȤ$J=O!^ W+BTs\J_5r?ZYMWrVO_{<$&\,%iٶpyg c1'ސ=x&R)q;ݛj4Lga:'_yC(Uk 7V_+Gv?ԑS(U2T6D#PTw:6! r+F%*+^6RJݙzF^L؝jPKwggPKIG@ javax/naming/PKPKE9@*javax/naming/AuthenticationException.classJ1lV[[E\&ADOK/+16+1[cy<}(q.9?Lf yTܪR΅|vI79KQe_HRieCxS> DΔj:枏 J7eh'( }O',聟?eH2B)7pۧΈBp'S2;|;6(&3o `yǛ@mvY?soPK(c PKE9@6javax/naming/AuthenticationNotSupportedException.classJ@ƿMDcڪwC`JoRDTrMnº)< |JAD=7~;3o|W ̅22F*-MVWUݬrQd:D^ki: dh'-lvFK%z1O 9/&\K7I#p]G Mz`2DYY\J;<Ü3 @><:lHQBHۧ/xvl}lHI-o l.v=PK1PKE9@ javax/naming/BinaryRefAddr.class}PMO1.ˢ+!ƈ7`LH6!& T,d]+=x==:ә €OS#5rFܟz~&CvT28c(9'U]+̺6bXL"!7C)Gj<w!x]>lq_:4ȰJ ß;b05͙}7sUX# v_u Ho; nzc+.T_J]0Z1BqX'=WBTMJo_ 9 (F7PKPWPKE9@javax/naming/Binding.classNAEo Q+P M\%`Ďҕ ?2VtP quvw .V2wA<ёMT:-?2cUt cґ aPQR[滬-\6_޸&Xgݖ@$"H KMjS^F&+ݦh_ W ZʠC9 mUK3tjtکN8|/蟵={a~ƠŽ/I0JֽwT74X{oW=FywKcE bϼa$y\ 4fД04W(aVi af4h0*,V܈=m賆^zNHtʳ+s7}6yV=uAt ,`T8ua.H6T%_PK VPKE9@)javax/naming/CannotProceedException.classS]oAPh)Z/kuL&T} )5l; +}22ޙne ܙ{= ̂A+ЩCC9wŅ>ح]4 B $#P&@.wĔ@eq`Su'@Yor$Zr*N06=66=-9ų8#2[ [y(YoC!e3PPD5~Br\ 2ӲҺZ)ckIܽEݭyJj >cr+Fp[7r%'L^mjKJ,WfۻXwco>Wr$7ªk: 㹠2/ MV2I$E*0_>gIo {=ƙ`jRn\s;GMʤFy?ݷ>ׁ=gǐXgX{qc.ZּU_]g_fml;,PKPKE9@ javax/naming/CompositeName.classUN@DP-au]h)B)\"Z)J}9vd;>OsP&-'g{3w?w~cxJ+\hfp B+ήXɌB`KFtNS\S?o 40jR׿w";\.;%:,A^#_*;UΘ~B0TJXbۋ!& &0*ohٶKj`# c-,Z /[ VS}R`D;:5+CVa:DX_Ԭ({dIbV[n,wQ$Ivq8oL uM`}E! ܓ]W%cpITtdDñ ى)6"'w#e37/\|A_/i9`Tzr«^1!GkK*(ʍJռ5GtV!o@5qߺi/j5qqc[EY<|! =/R0c~+y~BwD, ,0sɣJ8QfT$65J6&clBdM v`]“n MSŒCKmr?smmV0wiKw5nM ؅T*%rr]L{%X[gn'xS}vfz[[g5Q->;?f”'ǬxO-ǍiW76ṯpd}8ey:q6tW>:^9W;yPKj  PKE9@javax/naming/CompoundName.classTNQ]g*jQAP)@R(IK33%_>蓉&&>/qi3Ô9{^;XOCcA⦴v۬u"C N7DK#0V'3$Y3KXK aÐJ=i7&O rp$7J,2W g zQşw~ŐZVfe!pCf"jQi 2Li.ZܐʃVW" # =u$-nn -6Ȉ %B-pj oO H>w}@+mEXWkVl_YZܫ;$c5|9HrpͶ5X;2`-Vt Fp+d³S i5‹.zɊa[dŠ+u^+ Uh# `F>^aUw#Cռ'CwsaÕcHZȫE>pĎ/q'~R]3kޡZ9٭(T6Y5}ȔSl$~IZH !CWp;K{ 0@,.,\]AaəoGhM10D0D# Uqc"ԍ'XU1b 1O>Mgsu3F 1LLĪzZPKVN$ PKE9@)javax/naming/ConfigurationException.classN0KBXB* " KQw7b:MC }I"b$AMJ# E*m'|NBp* Ɉ{Di9(ci8v" l]]ţ|G:0S0sœ?h&3!xqkp Y~׎8 j[˼{+2۬m7PK]PKE9@javax/naming/Context.classVSFK G ҴIMӦIV8+Y,yNh=ې$L?l{owݎ4GwjG8!Sbeգ6Vղf)_"5#G;ԋYF'hn"m=Y&mq }8:=bF7[ݶWH$0'S4rBOlVz,`5b=zEu\Wچ9-u]ߍ\\YlՔ-FϴS0!”\SOꚕE7=Gǫojfn6&sVLSAg&8{8[ZCsfb*lTrp]Y2'FO:3?rt<1Y 6E {Y&p'Spzxg⪩WT*]!p;Sƻm$4lC5P]NI &{U>zw3N׫/Vwz}ͦh%4~Y+Cƴc<?{P/Vp@˔3ˎ'y8AXa/RȚk;2b6(<++n8݁D`%7P @tNrsYР뙙q>|gL6 "F-wߧQl3d`RQAwئJfOUC <<߰t/Y`sC ڏ[wF Q=U5ד!Ռ!sme!^Ng9߰q}&󮛻X<Z}/ ~g3gYApwYAVr=5ޛE!&%M\aD#.A񘄯 USF|M³Kxo"%%ğJ%|8/qQ«#X~ F~Td-YgS*s"F*&""Dd <ǕPNp_B%1*X+625;,ͯ {ʻ*yNqޤNM~KMOO?PK̤\<\ PKE9@+javax/naming/ContextNotEmptyException.classN0i @[UR)R %v*<C!nP%'۴jbUSzڥZMȉl\gIy L+eLf"0|_-=B >47k,1Z=WMt&/.o&(n,-\?:)g2;|8q+,7[㡳qn3C Jׯ4kTǏvh(ZV%i\&$.4B`>KԛN , tFcslb5;=hyPE.E(glRբEvOeZm j=X 4nFD0|)!Ta|k ̅J}|i[5EK\+!Dۑ}9zVK=cԱ ֫  8ٳQW˘wiaNslOUAM <%D τ:tV81I‰Z$z5UV?~A{U8U5hk )<>Xpk~`؁q:8i7<&Ik=0'@RR]UDZѶEi! Y]L@Nz!waaxlc{ValeEݕF~ƣ)gm 3cl{:ܸNnRc)vQP/ĠMN[%~:|,< ":I()5Tzg]c 8륀)a=>  g<0n38y$9!kwet=B.#Ғ ݅1hJ M^ݓi7mwE=s؇KϴC uYRP ~PZ Dɰ*xE&:Dq,m/$ڎci[h;sX|8s؈|8ɗH~"7#ݾ{|btVWR}[rﹶ;O_PKhPKE9@1javax/naming/InsufficientResourcesException.classJ@ƿIDcUO^KU4Tz6nu%ݔ)}-OgAQp|7gpGOb.Sŭ2e~Pv+_w*.^2@ rPN2DQd$2eU-UN81^ݵ@vc.SG ?ʼn^8|8 Y~g[8z6j :[Y*ܚhٞPK PKE9@-javax/naming/InterruptedNamingException.classOJA}\F vHI,r ^oY ~%nQ ż7|~@'Bp,bh1S1VSέ=sܪBGG?ĿJie noLnQf V4bKB;-2Q>B/jA׋\rd ~0}7OdN?w^ς{5W #16ް1ГlqlیμS/k|Tfgy}PK~©PKE9@'javax/naming/InvalidNameException.classJ@IDcڪ x)^#ޤEKmJ5 }-OgA08E?Ga:"Ҫ YdV;h# te:/܊i. D>Fٺ{D8HԈ3tX fƕatœ?h\M&օxq+p Y}g׎85%j˼̻K1۬M7sOPKͬPKE9@)javax/naming/LimitExceededException.classJ@IDcڪC#Jŋ)R},ldMK_˓𡤳 a|{pnp(bkQ(}'P"2էJ:O8|RiU] .3Di9Si4NR"l]_Ճz&$֐s` ƕaxυ9#~t ѸT*;և#:rkk/q e[+u՚j˼+6۬m7s%PKNZPKE9@ javax/naming/LinkException.classR]K069?D>SQP=avvuIoPQ)&'ܜ a' 怎nӡiuô.^{7; i+QB%iT 뷾svÆԴ@Fjĭ2s{(t̜F H;,)(3hcW/.shbQ랺&_K0?ۘ Vo8uDt3߈'SkwT$7O]UCz4J 1UTy.mEUOنhc,+:/n][DX|LWMAF̲uZ<摉,tqCb@*԰rq]j BRg O|A4X4 ,B3QT*\R*[l)+a\GG,r$*FE¨Va-beENX'[&XlfD_PK)33HXPKE9@$javax/naming/LinkLoopException.class}N0KB @*bA0E,E`!+V}-&$8K?}p^p"bj1U)͔~͌.s9+1BA+UyMh NƄ< lDDh3/ӉbRHB73(*waG Ϥ``TZ~BszKHFfnsyܨ~3g1p'-e%6};b[[kuՙw*%kyϛk2PK[PKE9@javax/naming/LinkRef.classMO@- TQo@1zj0})+,d2.({ݙy癙pCO@'×{f.d(*}9/*5OkCNNHתw/rH!"][_FҢ@8 {CE>vڟIh/i'\ڕ&TT[j@ޥ8C~ b .}kL}(9e8\&'!y'+_J;D>XȐuȻEw|` yZDĖdQ65j翨ZTѠJPM^@M8mV14w PKLPLNPKE9@)javax/naming/MalformedLinkException.classN0MBB* uCE,RM 2ibBbx(ĵ$aw \sUyAu56PG@h2/oH;1$Ȇ([WM|T/3Ԡ4 0vŏ)!Ske~aqrk +nq \5j˼; 2۬۹7PK8PKE9@javax/naming/Name.classSn@=[ -.r J"@2 [(gx/x%6MHs3m s G|Gn#w<* 5솜G"Pj +TP 0iqVrHOu3/L&'5{˰ęa.'־7,0\m{s=_t -Q 3 + S$/Nx EkdU28cGӄ"۾0!l;%(](DŽa.2a^ĽT_ Sliu"W2t;qi+\)o(k8#+&!Y2D-Q2&dX6MAL~x#6Y[_閭}[SdwmNd*,齅˸Bqn⚾X$d e M( 7gnA_۸c]xM\b>4'?h1)(?ǦliEvPK?vnPKE9@,javax/naming/NameAlreadyBoundException.classN0iPh !@*BSԥX`MXLH <8;w Ex!C<ⅸʍ˵TvHs) 3fI~B*Y^2GFg"B 0tĨ*i.zNy>FwG9c$lȰSq `ͩueRq'mX+@Kn Ő^1)#maՕ#KFSּјIemgޭlo]l[}PKVL PKE9@ javax/naming/NameClassPair.classMKPۦi֎߃QĪJqStp^JI,ɅxMP"=}ι>=/)5U{Y=mQs3a0Lx45Zb?z%oڮ`@'H}4}*8[ ObA4Y}9T8U?kڒmm.07u?qyoCŪ[Ъ =%Pa|(֗ K)sy_Ё&3 X] q.ʤ$]:A}-V"p*i{O9>S2gg1PA8ڀ$^W(EHXa$em `KZvWbs 6#z6{P"h)ʄLL*h2'MB>}3%r9I{Pq9#%EtOV[;_ sBGi}Ɖ\1M[޽{e ; p WtWv? qkE-4; _ʔc:PKefPKE9@(javax/naming/NameNotFoundException.classN0ƿKBb1P SZ`($U_ g7bpߝ|o\,b- T25zvcs,_!TZUWxBLFha6B7QZu1存KL&(KWO_ ;Ź`h\(]B46uɑ~}p^xCbVbm`ٵ#ccg ZFc`2o;h6br|PK1PKE9@javax/naming/NameParser.class;o>#v&FIJ ̼t}ԀĢ"vF~N"P?)+5$Ƞა .)0̚˵"9$3?A]+*/-JNupH##30y,@l&nPK\IݞPKE9@$javax/naming/NamingEnumeration.classmN@E86K+@BK$JP(bQ-*l䬑F|; Pb53g>G]\>Cmc#Y7PKhsPKE9@"javax/naming/NamingException.classN@@b ߶mqUTD*RA,M%vEW8u뙹;ɯ?~0 h7m:kLOC #!:1&Բ5 I]񌍂z/7 .~ħiq9%\Xk*}fgɀB"/k7G=ЮnDw+}g}W)&uf>1QOH Qf ԌNc̺LN"[)Gv|&tчCѩXWtDUok*ޜp%LEmsA"v"P[#?"8_c2[AX%e{2Lw| 3/77azP*u%~U[$nJq#hPb@lR$b+ !-Bl/D%bZ R%c'ư Le+UT徜T!e*R!g4qxϳ a@' qQx՟O8B;APKB@\IPKE9@*javax/naming/NamingSecurityException.classN0KB.HP )  2N>CU݈*;|_ˏOGb&q!xGNRUZ lD@h'j:^LrI&e&o+8Ͽ#\0͟ }ngt&_5`/1*f%;6\;8V65KVoyϙV@mY7soPKbdLPKE9@,javax/naming/NoInitialContextException.classJ1iVzTn&/EAXzA#Dִky<>8.HOf?3 X2bC26ZY%VUFGY/?!Tl"4'SB022Fm:rdq'f$tS|* u2O7ِWI.؂`)J'fQdF+?sV; 2#~%:}ګ/CacX7Yy6_6Vwyju{x PKH[PKE9@(javax/naming/NoPermissionException.classN0E4Phi PbCE,B  9NU> G! ûڋwc qy#t!Jj'CM;$Yy"s`h ' ey'"AC7Jb*-悡'\K;7y&nİ=t\sR'6)Cĵq|lm}vy'4Ť}wQ kT;KtԚ7y˙w@c]='PKW" PKE9@&javax/naming/NotContextException.classN0KBb` 6TRu) Rk1!1<FH} A,Dj1S.;4^U|!a; DJ+{Ih'phneV[h""3h>FL Id&Du1pa穴m^ԽKHf^Za{w&;x1g)+6O^ XZμQY޼jgny PKjPKE9@1javax/naming/OperationNotSupportedException.classJ@MDcڪ'/*&/޷+i6l7IP6" acf?^c8~sK>C|W ͍TeLVWFLnl3ϰ H|9KYJsk5ZXRt,=#o$zCₓ;3[c!Tsq+܃GZ`GE1*&eׁ=gǐX/Xyvc.;XXּQOY[μ*͚hoPKTL,PKE9@javax/naming/RefAddr.classmQN@-B ƛјO&B/ҚZTz2P)m4ov,/Skus>LZ:`RtuUe PeɵSY&1iOJ:ə@w hlꠂ5B+mW}t^P}IuyLn@ ͹J:Q0V_HELf7ۊݍfP]T5R cBVnjcq U%:jpEA"?RG5mb3gL7 \p94ZT_PK@<PKE9@javax/naming/Reference.classkOPǟuCprge\2nE%gak#g2eӦ]f\{.}?&zG _u$aD錆hr/oDqukŪp nw҄dږFI~u4Vf09d_5-6 J8ᘮ8R5UׁvMŮqװ-Tg#2cFNB^%h"M#a롊afR82Ge'8@Sux]F-wDFĶ0Z#uQfM{OƁL+3ۓ5SpG2\UqE^z8܉iJbmRZͺphAg{h.F~50OB史y,d'uV.GGowB3=PNMrjݔ~HFI>4(^!V04#4NX5O\'Lᚰ3 hfn 0s>V=30OЁy OK(.*c 1,<$p~Ě('xUa_?|̶ê ΂i͇P\ ˪ 6# c{F9 =S < yЖ=l,Û紉c(vd1-ڃHϝ<#=w{\Ôtjpķc-2+u:PK @PKE9@ javax/naming/Referenceable.class;o>#v&FIJ ̼tԴԢԼĤTvF~N"P?)+5'=hvC\+S J28dPT)ҢTB(dcd`d`fFX؀|v Hs1 PKwPKE9@$javax/naming/ReferralException.class}MO1"~FoH hB4[uה.ă?e%{tfwfCl&a|]s<$s-ZB)YKK"ư>\Z3$ғ-b'H!4H0dSCpBorΕ4~{aت?QahԴ"l;w7Dzl =u{Z4C3-6vÆs;ڌ\(ɶuXjKd}װ^gȅOuxMfe2;ǥ @5ř49?CL6ͽ$!KozM)Z6Z}lφ#I@(6,cE[fl w"!b}s!~'ZL~LFT**\3RB GCk!RZׄF|:&AFh`&B;UZgӉ4wv8(E|R^ر\XjiXw7Tœ=?hTL&o]z3+ 1X8؇%-bZx_2zpE6jcsPK@PKE9@-javax/naming/SizeLimitExceededException.classON@uL !Z(H(0CA4*&(>"?q(EDQ{7"q>fnv.NL\e?#^3n։N T\>\Dw9WׄF0&7E4BqDjjB7*bUɦnįA %2̪Ю0S幱5%bZόG`##ї*$;68f[[+චKAgxϊVZl6:sPK PKE9@ javax/naming/StringRefAddr.classuOJ@}DcZ[AORzRIֺ%M`?KO?g f{f)]X ;c>OA'2(݊$Q.l_1 Ι̤>g8hF{ ~KXQct uǣT04<+ipմ|d GWaaUɝ0x#yEv&XS+Y|gnɑcN3ϢK蒰;/j0|{kX/ԱQ62 Җ]ʆ/flFPK`5PKE9@-javax/naming/TimeLimitExceededException.classON@uL !Z(H(0CA4*&Q}E~ DTH|wq Wcfz>ًEp̙8~kkE% M$x7suKh{W$:@-4qMu9VTQtJ6utg~# n8$-9L0GU)]aKckJFŬ_-N gC3t`fP랎b""԰@C3J Y*OsJcM<9C/߄}c0"$ {۟ShT:wҶl}N@O]e$!U1)#cG@Kj $6>^*fM컞PKfPKE9@;javax/naming/directory/AttributeModificationException.classROKAZfY%bmaytw'GoUC ü7oϷw8$X*tHG=.ڮ%T 3$o |~=x .F{MlߨuS&.:%sMy`1 qHԸ`A mul-hI%ph8+h@1TK@hWM!_[mn12F);ŻYi+zZ?Gk]s .>ea@6vxM&qb%XWXxƂ 312VM^ XYuC.!YwX5k eaa~~ ]H@!uHruV452yD ^<4Mj& 0MV(ڝ..~ۗvҏ} o˾LvYBo:ORQ_VLcA߇7ⳜAޮWy q@{ۣU*JkEk<-X  ?4xZ:MGt~l #c!'9eC&1r gȴ 9 y2㈙qrс\r mȜß9?W ~^5s37g&gn E0w8sW̒Y~PK!;KPKE9@.javax/naming/directory/InitialDirContext.classW]SIbD|D ADW§`2& ^vןݧڇ(;=ct3=)Lwsݷ3_?i'DwnVW 5c/[5SS*+\MkvBPhgLs@n@l^É :ғ/tU;SN8E n!˵M StIgN25+ %WJbhֳ2jnkulyi6:0JR6-m0:6,q@?@U޻ް6˚I`QQ0i`tyכ' 4/3 ֙>?LkjKXK9ksULZjnCPhLRy-0OoQsۜPH-v✙䮌uk%uVx.\Qƪ|Vkڛ=wRg9 , S˙آTRS0id"wIhY1ڕ/Vn\|X3jt!QӁy|+tiGk%AM핅?MނRaf}%|ߏ~~s_;~B)OЃ,Od`#gc/Ћ{>[0q݇9f35|qu1=Z 8. b+T|gnB!hFK0Ca#c$኏`%0b6""0W w"7MäB?Wz-LCO9*PL9*PyQK[4nWy^Nhb m$@L(mrpC~SIM},>qWEXsp[^wJuߑ}Y;=^iΆmT9sθyFʎ&:LDfYôaZdL>LȴԖe8u*#} ~{S5cr{aztUȔ: O8L<]*s- Og9J:{z PKt*|PKE9@@javax/naming/directory/InvalidAttributeIdentifierException.classJ1ƿjV[o"(^*lӥ>'CtD1&3/3yx}pnٽ,"rFzdTbs t!3J/54[5HtK\-`)j{/@O@5< .T5Qj u41i5&I:ql, {Y;z߶'z>$#ioUHs& 4G$G2ܩp_-bVϡqKGv)C4,+i/{š ((R IiKnQ \tk5|Fo:x{aavn8PKkcPKE9@7javax/naming/directory/InvalidAttributesException.classJ@ƿMFcڪ'AU?'" B&YJ&$x|(qv|3ogz<'^yTII-RS^U<ٵ1Z&y*,Ta6t`h]J%C8foLh`&Z X*1,<C7.R]'}(g 0團9d> TQQTI}ǖhAэ+"eͣ7rH=Ql/ ި Ro݅MsPKqwPKE9@;javax/naming/directory/InvalidSearchControlsException.classJ@ϤiZmՕqS]D(Hd#LP˕; Ysǽ"V|*}K#RVUy*&J"*ϰ :r0R;1 DNt,#n_N<ס}C;.1eR=7W[>2 Ő6^5XZHI-QowYnw>PK* cPKE9@9javax/naming/directory/InvalidSearchFilterException.classN0?iPh[a P .AĢFbBP!!? )!<^EL8Zdx!TpModa^dR#'_ T\24cE[h"`h'R|6O Iʌco<ǚCMЭSq}bG2Di9יh~ǖFt$ȣȆŤyW.֪t[5< ~wja뵱f'PK " PKE9@-javax/naming/directory/ModificationItem.classQJP=WFQmER .*ߦzKH-7ЕIR̝y̐O4 Xyګ+Gcbgi $V_z]/ lo]l;PK yPKE9@5javax/naming/directory/SchemaViolationException.classN0?iPh €  .A]עFILZbBbx(ٍꀇws(u'*Y39Uȵ)DMu91B_OCt+]_39Cxc&*A 1tS]Ѭ+{/ƅbF"VIT?3\qȰ7/Ym Užq IffV;fԑ8(1EOް ' Y6n:x/IU .PKBQ PKE9@+javax/naming/directory/SearchControls.class]OAϴ ,P)&)Kl^ 3-# lwI22P64;syyΤ;,~ڴwY]8lQ~sl:@Bf-u%Šr S5 F+65$Zm.^ -眱!B2 0jr45}cSV1\5|!ּ$\DUe㚺[}pǟv $HWp[>g"4maIJ`=vuls8e(Rn)5gwLx~fKuSxTqLy {wizA3꣤.Rz9I$@{^=MwPiuv&Eqb0V0{m8##x3Y }?`*DZ_%S0c/դ0ՂpO*e4hHhs`G-"*h 2˰x9ڱTȍzCF_:@!u[9H=$3Jz  x"Q[::2rs?\Zm.?HBWE%a]%N&Ub@IKH5Q$Λm"0AxdD'0 WhkYh+8/I䵕CҠŰ(e-hɂP΀'XW}b +D-r7)^G64~PKlPKIG@javax/naming/event/PKPKE9@%javax/naming/event/EventContext.classMO@|*~&Lěr Rc†@1e!m(vyߝٝO87Eʹ -_=`%9 4d6T=;WO:{켺MQEqrr4S).Bi [tTFX>7:OB 7Y~{QZ* ܘ+WnnW{]{ܕCŚminM;)P*jǂ+D[)d%f|m$rsdž-FJ;#BҼFGv ~6 XC! x?SNX Lx?ʞm:e^wO;Q Kh`~Sy `I֍5lO!IDF[ |PKƶ UPKE9@0javax/naming/event/NamespaceChangeListener.class;o>#^v&FIJ ̼tԲԼ}TļTԼ"vFzRVjr ;#"vSfF|zǔFe z\Alk0F^2.8 /-JNuIedn=E@G2201+@3p0< @4PH21PKr'PKE9@$javax/naming/event/NamingEvent.classS]OA=.-BBiEEdUkJhWݎeӊ}22ޙl(/39~Eq!sj 5lg1wP*8te1Fv lvN%rsRVXaCam:#Q"0R]"ڕc,mN|/U5ǰXW81RǶۥk]~%K9C#.CuL] ~!kсo^+Цeа2棉-pٸgNN]!C6CR1vSoakMa"oZ|zټE9KBSě)YT]͉6C'RӢ 4Oh`|5ʀɝ*f#sNIs!<),> ؗ!MCBHolOth=XGFN6U1;F i=,6ҕ*!3l^ o'STi2TieȣQX~1U`ƋLr/*7"Pf#& e.RP?PKwKXPKE9@-javax/naming/event/NamingExceptionEvent.classN@ƿA,(CEј(cƃ' lp ,ғ2Nh6b)6SH[b +:mr ]mߘ2tdW+ϭ\ Zm ֹr \1<-{C])>PKE9@'javax/naming/event/NamingListener.class;o>#nv&FŬIJ ̼tԲԼ}?0'$5/AL?'?)+5A,ZZ 1е"9$3?/$(#nv&FIJ ̼tԲԼ}ļTԼ"vFb8T ;#"#fF|$3S5|pr5KS2sR$9Kd @ #Н  'dbPK'ICPKIG@javax/naming/ldap/PKPKE9@$javax/naming/ldap/BasicControl.classQNA/Ĉz3&& = F,fY=x(c&@=lwOOUu;]l$!,DO<іmnrEtYus ¤”mF2 3$R'}i [&Dd0UV=b=aw-FTH0[6$Ȥ1)B5XvDö,ׅ'9lVkoͮ !6o* #vn-1\cj_f a'eޅ*yv=:q槯-%50G 40)9~ '9WLp489 ʲ i\(sM&eJ`@FUyv gj,қz+snN릃P3O}5}ZPKh;EAPKE9@javax/naming/ldap/Control.classMAN0E$-)iK EolĖ"UD XU2 J]Tq4C!,,{' Eӵ|;Q]Țڶ!,dm\F8 L|W7PF˥Q^v?Ռ@O!?lUȡD͵@˦Rw:I|M貐p\8 2%!֛V$ȸhmr25xu`=>r~z'F'{&?PK_<GPKE9@&javax/naming/ldap/ControlFactory.classRMOA }]VE@OUO&/F Dae,'3Dk_+3;q/: At#aMG"4qO(XV dh}9 7 a|#sH!;! ݨJ"IơEl}sZ9A]x[F^G;ꄲiT[Lg}Q_J)ʎAۨ(8[cw0TRյ0w~r0@տaa i0r7C({ :4eNBy,_ 엂oo G{b?TyxȱM;]13Gc> d)rod)9GN{u/wƌ,\<.~`%e|PKX PKE9@'javax/naming/ldap/ExtendedRequest.class}PMK@mS*œoŀz*( MeKLbOG <>fǼ7opꢧpϺ rhU JJz/Oօpܕfr- 5EKetf^2me;.fڛoĶd1"_a&RZCb_G&|(Vb<)8Ag _LLD3L\4U"7eˍˮ+tO{\9C28DgFdi N>PK/~PKE9@(javax/naming/ldap/ExtendedResponse.class] @h/`l $K89/=bogfg_ =QT):iJ ʂlBɎ.^CM`t(m#ŅKu&Cʵ2"C앹2B΋}d avcZi21u>*P. W6~PK'yEPKE9@#javax/naming/ldap/HasControls.class;o>#v&F٬IJ ̼t}bbvFDRVjr #wzj L #f9P֌ \ɩ%y@9dP)ҢT̜THccd`d`fFX؀|v Hs1 PK7lPKE9@*javax/naming/ldap/InitialLdapContext.class[oA,m@^ 15&ԾIHXOS1Y*Vde<3];gge`J/i􂋎eij.9h8BLC9.kIǽv;E`mHq'0J/ VH8m.WfRsn.U 4Փܶ>P\*NKL rɜX^+&yIg9c&apսEƼ,`LY\a~ٷd:|Uw@;Lb!ZPnݬN.XEATAoY7'haCޚodFؘ潘4'Nm\ <~$*&l^|fgpZIB- -LsN;;qUbEUԸZ2KDpwp*A9X #%XX281xQ+;뚶YҞ"m06lN(2b,2agTnLE>1+Zc9#!VnڿPK£DNPKE9@#javax/naming/ldap/LdapContext.class}RN@hyl-qa*$$ Mqav$%uZ⯹(# ;79sΙsgn@Քӹ'kS_3p=.\*&P )Kq|2 7+BO@I7i3~|gpdB.t{w'܀HHI^UE;ʫZ˗G,)z^#+[HdBf)>!@vliQ:juaf@zMkT:wo,['eVffiQ;R}vRze!  %)٨%Ec{!3^C2(ߝɔA1 R@cj\ !XꖢKiH#Zu},-^U:-1/R! IEAKRlD~+Lo& *᤭Ui oCU ̟E詈pÐa r0-|^l; wn$eeUװ%S]]eZ{c!'ɴV>ͻ !BY5l\2"yϖV2ڗJn0>\]}iʉѢh YxNHaR<߸lvm]\WF15_1 e-XT>1n%nXNz(mžznʫ6?NߟdaЃ 8·Ї{8JwwƍiA30aG#'8k|qIn(7q)`?QK5 7SU@ _O, Op>ӆ[;U'a%OQ'fds na8/NoUF[sgx2,Q<8ܫ<>«<2J]%õ65_Qe.bLrƙMtK`HﷹUf?STۙZCs1~ɘ5xFalb6FJBEi1:vcQy}v?oc~PK PKE9@-javax/naming/ldap/LdapReferralException.classRN1}DQTbL< \@&A O*,oy2QL{73}o2ݷWg(؈0?)9J=>rnŃPi{6,!^5hf~O$E" Ds2u;`4.w\ISMK䘡 C *)W暥SjU=-f:4ux /F|g8.H~91,|^%E+YiZ.iOTW\J-uz=/ ˼6U!#DII:Ԝ@Ahě0x'Pl4FβHF|ߥ|/?PKw%cPKE9@-javax/naming/ldap/ManageReferralControl.classN@ XAEWÖQ0&&xZ`ŚҚ_˓2N 73wg@ $bg9''7ܑ|'N=*@n`nɩ3\2! 9˕ u!4^ГLN(Ԅ},NUa ۮԫ.FH4 ٰ\?R&LDP,hlxf6(}/ ۓ e)>RfyH(D|PKr}N$PKE9@+javax/naming/ldap/PagedResultsControl.classQN@=E||1# |$M5,`5Dִ[L\~N!nPc&9sϙ;|{PBD(ڢcIk8: 8 <aZj8{Jh &!s LbUdCY*Y;[lYcm;#0PtkUBӐϱb c\b۽)HcrYLe8^Qh=VyR:h*B^҈TDXxL--]0̢[/'nS!ϕvgiW8F49J!`b9cݑ٤4b%x4/`@OvZ/_16PI7_ԗCeIsv%XPKIᲇPKE9@3javax/naming/ldap/PagedResultsResponseControl.classQMO@}$|Z jU+*I[)RT9iIVax#{PSpC@TY;!J̼y͌xGR܈[?*a_ c1Bp(MXyHTo!8G`R'GiB%޻m/vz STaQn{rh񔰘[G;%1CmHeEn{"Xz B%_toD@YZ'4MQYPQ_v_ѣ'?+?FzvA`![ `c =#.Werv̹˱I}}_תgXw3pYe/9YaH*}enw)-eݱ/&η eQzZmPK\VPKE9@javax/naming/ldap/Rdn.class]OAYj-jZ^4i0& i1KU^G5=;, l2{fys|w8ӡ1doߙHek4-QUe9_oEcȨUiHޖ:#/ٝ.w<C\ZҽTFyQqJX<1$?5Dוӱ̰;Uҥ5,+8hn$"XM# C%pke5N__d!_mHy♂C(J5QNS|/Á1)rν%fCCӋH4q8Q )kv_ %}$#4 N>t:bў|kOb%_[]ɊwE6 -ȖݾC7r#x| &|V}Q.chXN1E4O,J4,K? k4hxF ,3J;Qa г6P Zskkݦq!&7Uxc-5?bhcF+UȎ:qcuHJ _borcJ9 Pʙ7C Q&p ہʫTͿPK_PKE9@#javax/naming/ldap/SortControl.classN@Ur KuR.jqJb$Հ)-)c2qPB11M:̙ @G1#]ikiuq+:B؝Fʢ/;<'j0{BXb ms`@Hj^=.T]/JQ0*-17mo"s%{L˛AwFAEAͯUWj2ݶ܊ixca6#|RT'djϫ /:^k4_섟x "U|TO l`8 Uc(WΖQcO> `:?@v $GI?47힘5oL2 PK~؂@PKE9@javax/naming/ldap/SortKey.classKKQgGfv*.@  2\gbJ} ZPѹ3]{;||~h Ceʗia?5{#oK*7MNT!vnX`(ִjO:h K{$c;( Jg4wP8|h fsPȉ1gjkhɝX[`æ9e`m1Bv$) )n zА\ +M\ֈrфM셣kC8V@DP/J^1ql[䄐$.RdK;H TWل)'X(/O!ʅ)[ED-ܔW t;PY t;ݨ PKoPKE9@+javax/naming/ldap/SortResponseControl.classRn@=71 i })>BvR@!REʢ]MQڑ=Q,`Ăw+Bs{~N q!.@GbH8 by: ,Uh[jaţ;R\_0#ƾ"3("}'MBs֞y;rZ/Z*P V:/rO-aUvudEܩ[Ů ar>ѱҨ H<+Z Ou^Ϻy:MBMX8fDKsz#H~+CMn0geI|m6/PotL9J , h(?(\-gǼLc_32y,rcKES[VvwlHjַ3L:5ӟ7}έL\l\ˬ275,~a2Zf-(PKsPKE9@'javax/naming/ldap/StartTlsRequest.classR]OA=Sb)iW&MHl\lg铉̴-Mx{ϝ9܏~PR{RNH^љru?L>憒x]ܞjʟ' t> lvz:&(J@pZNiԚSVA+W飑XF wHO.*aLɑ'Á/KwoXIGJl*v:%ͷa;e[wEaϗ2\M uz8uљ?Sy܊oɇrP3|0_X,h{S`S\؁cn'óVJ!41O{7.ϼr6k/ؤ-x[(MlZ-lmAcj4gs ٦ z]Z)6QnG1YO._`/m/PKհavPKE9@(javax/naming/ldap/StartTlsResponse.classRMo1lRZvG66m8RQ)"[ғ;.uvPWpBG!n*{ޛ`Dž Œ_ >M{T)tahpa ]`](MeF?l37 "| g!^=A=8Q?h4 JG".), ,V "w槼))cvy.~tP ڷ_ T;[ZPڅ 2B''dd,j~5Ёi²_ֆ R 65ԡRiE =#ck>/SơDṣHLx+FasA``s$rˑ1 FYzQEYsA Pcޖ2w)RdϿW Gs&a7vŒ=9Wmcc2]*\i\$u6t" -v6m-PK3]PKE9@/javax/naming/ldap/UnsolicitedNotification.classuOK1߬Z\zS(z(BKObvZRb$QCEy7wc r#d[Y2l h#3J+WF&y* C&md[s=8Xp=plBq*n>pTN8f㗸qy0O݉½z07٘PT]iqPKkIPKE9@4javax/naming/ldap/UnsolicitedNotificationEvent.classNAbQ\7pcL\N<ܛ& căCkz1h 8JWU_uUe @<ھ(i{ ѵ^)Wi٨Z=(Wh RRTcl ։>% fjQrOH CSy㦿0Ă|Yw2uO޽U)R=0Ur ½}&m^WhE8._騞 ԇ]5.vʕ +TӍ6g~,l /ɧ4,.0qk^}Sӑ:<835 <88$@-[bey6>WdX2+[PKRlRPKE9@7javax/naming/ldap/UnsolicitedNotificationListener.classQ[? H4nP_w{m<x(qW"ɜf 3}QVUZ4Ĉp;ىNb;Ա$@m*޳ظB+3N_m&G K!aԝM2Ƀǽ ωDL <%@|BOPKtPKIG@javax/naming/spi/PKPKE9@'javax/naming/spi/DirObjectFactory.classQJ1W7׊ jP'ưl%V'7PVno!0o9H?Jy=v>Sqԍ iCExhg2k,G+%~fiAH+0=ԗuK֨“$OӼ.}tϫ+Ғl잮hVN>Jl j~&͡˼2p~\=(=szog3$o;\&4`mF vPK HV7_1*j(Rq3*@s< !obE XPၺ5gbfE؍(eH ?2!(~~/$Ԇgm|j݀ ?DvdDԅNXw92ėa~_9$;\U s ^GN/ low eey++^t]w&10vUuŵ/Mw3Oʦ)})kKZq!۟`hΐ[м0;asIȜ&wi!hFʚk缔?xm{)ٷH&6z!BOҘuTHBG=l1);[t1b ;J 'yư0 $l髜)3|`,đ@p )-ӎaߍm@34th jaw 1B^:`}"M +ځ5`mV"^ >r$nL!2bfa2vdx|̵ nU1=v2,@ٖUXPK)̌rNPKE9@,javax/naming/spi/InitialContextFactory.class}j@IJϥڥ*'Òl7LJj=}M! eg~_\*ǟ%*tF iD2X;DЯXeك0H4OQ bZp!z5НމI]CkpBgmRdrj2[E빱dM \*/FO-B׫^PKVYPKE9@3javax/naming/spi/InitialContextFactoryBuilder.classPJA^cM:5`0zt&Ngl=Bӗnzp|ɯ\/.,Lrf:":fE|C8l(s/*FaT鴥T꼹Yyex6п#b>ЛE`FkͯU2v>IE%ĶEOGU]6 ]圙KB)IϸYלsGj: 0"m4)xx@֔nEt5E.{}Y#GHMǶ3VۻٹI ]g7]*%r.}4 YyTIـ/DѪ1%n#Z5ҩQ6Ma (&yhroOs74O_M*\7#}stX`~W9NuPU^GZB)|-gLW}3-M .SnPN`ϵ,`'.7kxPs527/%4ߠN.,jF8/2ٯh;?lr QVhw!0\wl8\DQxK[#QQ85Nw,D a9ʖkl93,h =Ћkb#(Ifq;"me9^%y𴐂1\P: mN(V܇5šu* V30CDWPDO+E['M rrǑ{9=%Ľp@&;PT&z ܓ<ȃ_ sWEPݧjLc ot̪/ 9N yF3!M#ޒfZzrEyyPK9KPKE9@$javax/naming/spi/ObjectFactory.classN@@=+7B 8ú)KʖSS_CB `92g?7 ΅r.Rڪ|i XK~Z%bnHhGFvz2a a|v''2gV/qb=rrǦ{!/YM\N;2 >cSl^:?͒#>v&FլIJ ̼tL}J̜"vFRD:FĒT- >J!"%9%I9֚>mfdrHN-(+fgddAJ83KJR|tQN /-JNu.-@f120203#0X؁<8 dYPKܭPKE9@$javax/naming/spi/ResolveResult.classNPcLBip^MUm@l"D*'=ȗvO+$}>Tc ޖ1])iyܕޕu!Bߙ '*Cgh5éZ )[bh$w/>pZ \.=s[\8y̰$]FdhTR:!Jtʰd]2=$Xz 1w Is=I=!C6f2( 2$|w1yIĴ.7?}Oxa.6HQw̜+ej hbtf70FY3Rc b;վ? Lͭc,!ht-C2*XA hv,;o頡AJxAZR&ZC;TqGT r; E > `E7*º I^>h&6vBb/E|H ckfÄ+ Ŷw lī"n.UPK{*PKE9@javax/naming/spi/Resolver.class;o>#v&FɬIJ ̼tL"vF~N"P?)+5 $9'U*h5X.TiN5#kErjAIf~^1;'# ?0WXRZGlQWZQbmG4|]J'1"r%ez }l \V6&v (g`,~PKb:FPKE9@#javax/naming/spi/StateFactory.classN@ aZb^MJ^P/BĆ? l\k2SnIU&/^bt' brJR% 2o[65ZZ;TOTjsRy!_Q]G8m !9֪/n2Ua?/K GPuB"}S[PKlI8PKIG@ javax/net/PKPKE9@#javax/net/ServerSocketFactory.class}QN@}[ HEA@1xcl11*I" Xִ ғ?2N {ؙyݯOg('1OLWH-۞(d_!roaKĹ:!Vu+' ĐJ#CvC|'`8h4Qi\&CZS s4`Ll, 1L50{UkEM^AP_a/䵸!DW]h{# '|IW@p%@u*"?z% E v;>hs_y^ O2/#!_hHՋ# bi͸pPnN~Rt{'88 Sv}ȵy4P4R4yZ-o;.RT[h-?&)l|w XdclfD Ja Yb(6)[2i4j kh0l [N}B\E݁{/hPKHpm o(PKIG@javax/net/ssl/PKPKE9@2javax/net/ssl/CertPathTrustManagerParameters.classQMO@}WADjNUI$ܗ:%M["JO&(4 vf߼}ofw?^\BF= hd0i3f:Qhn/'R9ҡ@5V؞'xFP8J5^ WWZ$N!Vfik zN Jf\8ʧh>&=cjNJo$qZ̙?n!醃 'd_lm-v≏8n3?{A9 \˱: @Cy|=i'G=(C AOPKC>jC<cPKE9@+javax/net/ssl/HandshakeCompletedEvent.classS]oA=mVhb0`D6&> ݁'(*mav{ιsEJ`DpHooZ&M9:f5ZF|9!K d^*GWj6]t3@\8H.q VaKgD}BJ[9nx!$v-iKOqL2dHz O*,HԠO9T7R7SNqEƅneIM߽zszJ5,S(&MGf>"3J8"tZ}RO^\l?[4lS!h$.q?]S6򜊧)P=͘u.~MwYFW6<0xrZBY^#3\Ϋn1ׁ !pˡB+X a< cG j)Z1T+DXlen&2K؞JdQ4G9D۬v('jgf%y{sD0 PKÄV'rPKE9@.javax/net/ssl/HandshakeCompletedListener.class;o>#nv&FIJ }ļT܂ԒԼ"vFjļt}v6FqhiIfkYj^ L #Py Z>,c_Zꖙ yz #nad`bVeg8$PKSPKE9@$javax/net/ssl/HostnameVerifier.class]M 0jN.κp.[,%ĢPb3px`"M:2F=[C,edc\%HȻR}]uU~7VC+VGTW_6LS7'H<)3?PKjPKE9@&javax/net/ssl/HttpsURLConnection.classMo@gIHmҦIIJN[aą".*Lsd&j8Qub9( G͞׆GQIpG|T),@xR.H5؄@-xG!m_܃e(&9_s0}v6gr>_Ę0mf֖ˆ)L Ck{#y#5Q^SW$ ; F,T؎M!A&kNg@5Oԙr&n FL|u:lbZ&:*8 ȃ &*3o|Òҧ%W)GrM&U=w-HM!RMuT)Z)w W/d4?!5ׂ+E~(e9}#vv&FIJ }Jļ"vF~Nb^RVjr #Wp~iQr[fN*#?BH)##302I&6PKFAcsPKE9@%javax/net/ssl/KeyManagerFactory.classUN@=kLCJp/rIb/ZUT@%O#c#ljڧJ}ήDdz̙93??s5o;Qq^7}׻ב` Nxq-LaX+O[0FMusmX s,Z,HaH"0Ǚg }`;qMng0_Y5^y .j?t71b_!!] D'[f0;5;& <ǔww-שgXoqU53 ?)XdXPæ]vV#T4 B_1(Cه~]^!a#޷N@[&F+ mO7y4} Zav{FT`m;vܶ.r;M`ɭ{8=utiGat!)$ҷN_&hMnwh4H{31FA*{Y܍cd1\HMDi[M֐wS犲yN*OM0Kz̵PB1H(bYK.,rS|K9ug6F,5mg-gbjS\z`A 5=rX) `K٥m%j Ϛhvv7զvW)SPK'gzPKE9@(javax/net/ssl/KeyManagerFactorySpi.classKAǿgN$ڪ"mR+F"ZBH6琬\&$O>g/MQ<|gv?{cF`J0d4ß4:Z&f)Xvxֺ V@`\i x%Bs ,Օ~El$P'(wwzR˕TJ,ћųj\34L)eGmp ^GÈzV%:Q4=| |NF?| ;G;/om(Jd\CX} {tOΥ]܂jcC۴tMd.'uLIDt4֞>G y)d+}k 59xk~ ]heͳt+xy.:3;PK?YPKE9@-javax/net/ssl/KeyStoreBuilderParameters.classMO@uB܄PR҂B@@BBR*3JZWā/+|<;33=r `./{@z/Coz-մp/>ұ@%-BuEAm 0wM(HUoI1Vw%;.7w]*!2\r4<쫈~&mҿe;$ d#JY0o(lpHM`jQ؆-ՉI4Xyj~@x#.\B`CO6w%.hCM=x_S@y3H24y\'kܬ O~wmwKs(ㅃ!5f[(0*]A)ƹ{jqquοu֥1+0+wV`y/ vSKw1/PK tYPKE9@,javax/net/ssl/ManagerFactoryParameters.class;o>#vv&FIJ }ļ"ʀĢԒԢbvFZļt}FҢT̜TFY\@ H21PKWMrrPKE9@javax/net/ssl/SSLContext.classV[S@> mE ^RԨ۱cu8O1l1&YWSgMDH`yfs;=ß~CԮ2q-+(UYQ>_R5L!>_UFA `ʉm52BReaV gV&  }yydQ;v^FKU4sc]鮆 ijli;F AM5FQuj0Df>R #" eULcXd H 5HQڰW:3;q#ҹ-ǖ/V+N/j-kK'(6Ҝ,-"h:L3u*ߣP{Ial7eжîقjҭ*K@B $S~*I6b(;tf Q}ktsR7yzݲ-*#; />H3 : 6C/fv8<% i):j&6PxŒr.`{1Z [ot÷M΂V (v~qvcO_"0O!|@ aDc(6 6)LqH{8rT|馄t9scyfqw-GtԒ0)S0GZc20,G12+4r#Әy9'9s]cCX4qe QʴPIQOA\aSwLWQ'!=fFZkޓ27PR#ɜ2ɜ2P= RH=FƖQ\G[q?fė:r%&CgSnpOG(8.?+xPc2k]8^7,oЧ9&w!͔q4Žx?Jbۼ(};PK~1PKE9@javax/net/ssl/SSLEngine.classVRAY"p5(x шAҧI2e63|'|(˞!F TsNwOg62 #ls&m!\PȯYzզR^_?$оpG>!Ж&ze68 @O~[2yDm;jm #&ҙ|AGO+v7Ct2S^t5SK*$ j,`9^^&Хiֽ&W*T{*߉^R1a]Ջٳ> 6"kSe~!p$Lr{+y.FVnARsdLA>$`0.K})gh\NHRY.ą]BPf[uR9,%NpX[e}]0qvadwjVӢѦ31'"lDHzEc6V_<7"ڛi 5g/l9a|QD8x'I liFq MOH*x_bkk/ϺTw'~ZS|s4wːPo\'qe%hO)l0mZ6!jX`z ao8xѣޢ#pNpAۋpIQc`\jWIvTjo ^+2m_9Vs,Ĭ'শL5Njok;m Qi{{ʏC_qMfp!zd$ <iE3raj?1-'K>mw?x-RHrK_ ś(4TiH,Xի5x6{#PKOT2 PKE9@3javax/net/ssl/SSLEngineResult$HandshakeStatus.classSmOP~.֮T EP2@mt  3HuK1mG't|h$~GϭU&[{ssv__/cID~Lۆv]+i]3mcp7^=w_oh]!tCeQ-j*C_!;[9m7oN!jZQ}Eyu{}+m5ٷ-U˴MoAH$ =CBXCLt3DAHlS1u31KG?}8aH]~cz5GE>Gїa嚡%[*`AXfn*pWQݩ/M>3<̚M 5Qd[ԼD5m/Ҡwe/ m@@o57 +V l42]|(#DA>7JK8S7> }0F|pO@V 5ЧU jH#ZEl`T;*Ն;Ez>q=Z t ɡ3L\E(A">yI4%o`&.*Yw]<&6OB ):ryU<3<PKclPKE9@*javax/net/ssl/SSLEngineResult$Status.classTO`~u[Q1q?&l(% %,~0eYR:vDHeVY-=wu?}=+" HXt8fQUj;]ͪvAaY45]!z"ᄅ5݊R{0 0S; ʛ ÐS6֕2̾4q2 pW\#0&!T$rESkVT7{KBDnK9p (ܻ#!!Bv:C\4a HpHϑfvurƐCADF0l[;nu>3-T'&zjjVO~P}IxE48^eLt^1/Zԥj-hSR)jYiiۗ2ҝa- >֒|ao#r;AA:pxÄ>柽o`p{ !<0@FNHp&f QO0p~ HSI,{^ҋ+Z~xGban/)>I|Y53>D-p,sB /ec$DiY:OcqV8C<ʸv"Z7PKQPKE9@#javax/net/ssl/SSLEngineResult.classn@ƿI )m'@iS*Ei˭U@XT$nduגw];qB]V$>gg|k}(OŅ)idᅈv;I#x3) gaH݉N0=UGd`4iXAW|{"$7ֵBJɸ v$5\L`N2Fgu2|}5/[PKqC\1aPKE9@)javax/net/ssl/SSLHandshakeException.classJ1YV[[MDPF&LCa"\wLSo!I˩?N7 >eS\1bŽ{@MWwl`vB٪'PK܎PKE9@#javax/net/ssl/SSLKeyException.class}AK1߬]]VEoV^ ^dZ'?%&X0C7aNLŌiXU,|)SĄ9gOHΔVyJG,wVQp@/̭̰&ۿؚG1,eͶfr?67(ªT`2fb yƟn8>|5zu /r~t} Vk->5PKHPKE9@!javax/net/ssl/SSLParameters.classQMO@qhHB-*V@H=YJ d ꡜzG!fV3;~ۻTA\+ v \Nd\s*PDX17`=^F(P^8y %(#=olpU/Iaɰ'B!t', {?|-E8>{b=!l.МzL!8?TOlg5r"#@,JiEbXCjEͪM6 ̳L%zWREw7tMUzI`Z !JTȯ-bw o2-+dLJC}VƂK9'֞3Q)fw\{L3vnd27f9ҡmep&t$:JlYno]ts\{PKvVPKE9@.javax/net/ssl/SSLPeerUnverifiedException.classJ@iZmQċx=ъ"BjtlWF6iky<>E"38A'GJ.be\Y$ꊍS<\X\ KϜ)sNW8.ΤIiF"p5@D g&k%Ø5 m2InLSIw~K$DI>7)_)g~ͱ!^h 9 Vmai;:hڼE`CjoPKt3XPKE9@!javax/net/ssl/SSLPermission.class}N0nBƟS LB d'<C!N%Zp>}zpAgeɭy&wL!=p+ʨ_ }*/BOxZ'ш!*d&V;h!b8X.&Jj:^sKL#a;ϋA,4/1a3aNbᮺ7dҢ2Q_7!ĭe-)tڠ=B!UR`H*kP*v-ǎ)˅q=<)!ǰ)~ĕ/^OC񥈄zŐZ' >(G uM~|^F (2Dď_x.<sZ/0zn ɰݻ> v2ayK]KG.W0l : R'a]) 1P7ǔ:DDC"nx*cRSc,xjL'8QJ#!?d+;mޒ\ڗUY2kӤ_ =4{Og}!_B22F+_)*EST5T3VaY`;R`wRA&e9v3#s kTpZgױ<n&aLܲo~ƻg}<0񡍞llH.ϏPKjPKE9@*javax/net/ssl/SSLServerSocketFactory.classMK@mj"HWKeOtlWcRJO?JBQ |<;S+(ީzclR̜L{}jE HE`x1! &IV!;+n33%,}22n <=|;S_`Ji!0^K7dz^ՋjL!E`Ju8 @#0ʑ20 7'` Ʊ(vON7Un&!7,!#vv&FIJ ļ"vF~Nb^RVjr #Wp~iQr[fN*# =b6FFf`d`L lPKiewPKE9@'javax/net/ssl/TrustManagerFactory.class]OA)-R|" dD11* 3)ƫ2Kdw+/(vݖ-mlҝ9yΜ3g`i$Vxuϳs sw4 9)-n70|wmjHHڬ* ~:Rb|״Cs)2,R0LhryȴIU9[pܺ)߃Ť4=;]_1%UɭI!O0UTER}_yۊh|n[-tce|cktl/%J?6aPp62z\^#aO[* +saXBaHP_-k/ /CYmAP)}BO󌻼%|ڱͰۏ:;2/Ã"A]Usڮ!MyK1uߑ(.3/$IzO1IS?;M4Ed+@ ){ yCΊyb.@o(U m;ٮ5.`>\U8YPXyl1bN'c2*R%b)2׵9ӌ)޳;{N+ ȞC[Y˅Z汆#=c=ױbjI B TT<`[Ö^v^ PKxXLPKE9@*javax/net/ssl/TrustManagerFactorySpi.class]KAխҴË"ւ65 >@q֑uWvGџUE?]E4"s}s|~Qе0TV~0i !)-{ [1/'C,# $A il]zqoۮ`}-(%5Օ!q?Ts|'ԢfP2c {H5ŤAmD%:q;@I ulw\pjh<3x_(:vΗ5o]ٹvn^hU]\+:!]-vdu,| +I LשZagB^ۍ{PK1`gPKE9@*javax/net/ssl/X509ExtendedKeyManager.classRJA}mDc4D="G$"AFԙ4I#=JO?kb^&m܃o qȚ,К|- ]/PKpyPKE9@"javax/net/ssl/X509KeyManager.classRN0.@R>YjPe"X%rF1|:DY+;> !N]D06Y\+_Kq:_8*EJbCGEe`AժM`\qvS]+gy~9{LCzPKg,PKE9@$javax/net/ssl/X509TrustManager.classPMK1}ixj{1"xО(+"x鸦.$58`IM޼yWLPSjOcU("_o2  s3}y7" OO)~sCCdY[ \K5L׺Y{%1hvr(nq,~WjHD u9 w]bL$hYPCަtVuְ.HaCZPK!iPKIG@ javax/print/PKPKE9@$javax/print/AttributeException.class;o>#nv&FIJ ̼}ǒ̤ҒT׊Ԃ#>v&FIJ ̼}ļԜĤ+?AF?'1/]?)+5AYK~2L #[2Ff 0F.׊ԂbvnF)d`]p@Eɩn9@+0 h8}t!; i. xPKޣǷPKE9@javax/print/Doc.class]J@Զ 1WJ q()1_ gcBYfvf~~aEA~fKyhNnfǑ% l5&',nTu\ +j6ڪ.Uy6{TDX{C¬dbֵ#SHWVlm޸)z[Rm"\h ?* p:7q„~.pw:p+9_ۖ8eIS;w ?PKRPKE9@&javax/print/DocFlavor$BYTE_ARRAY.classSkOA= C) R@D)}b)Mw!Yj55hA9{;wn ntyo؟"z+l5\88Rx?w@co:1Sy3e`.i=G! \i 'e&قeoXu+ehlf)n&Y[.m܍sT3G)ټvu=O&́\ʵjc7+glS⅁IpI5-VjVԼWERJ )XTD_MROz*03R z)0+pjpQiZE›5vnV6]1}PؙHͮ_F2rC7l":}UH7vsCĉ3r%]EN 5 zWWnk2fynC5&aff^Bsf~55iiV!:}c>:O PK7PKE9@&javax/print/DocFlavor$CHAR_ARRAY.classQ_KP=7mskiZV*"W%K'aŜ׊}wo ml{sϹU1<1.=.qvnWoU3Q uyc֕ɰg'Uf%ڬ6[ 3.C9 P(i@2]iNh0d^OJe"K;%R'"Or#idf fqVtyx"\`N&4} kҧG]CNDQN tR^@⋄蟔EqH FfB/F"coX{$I?Ki]x lRթ#+)+P*(RU+K(gxPK*ݍPKE9@"javax/print/DocFlavor$READER.class}QN@li (*&&&^!&%@C6XS[S >ev!zvfvzp] g)lN0:VOE٭Ҿd _[N!]s|/sd2`H5;Wa` Xe PЍl>]:yS eiy021U+IȡpC{oLeʣqꇓq۞0 ~,nx쒐2ا|I E\ZEXI#;*^LsEBHRhUy"䐟ӫ=7{!I3UEޥb[t. 6vKоPK`@PKE9@-javax/print/DocFlavor$SERVICE_FORMATTED.classQMO@} VMLb B1ՂdkjkG[ƃ?8=&;of͛S1> .>7*~?8hVǨըzME!3\ Sg(,1n-ٞ%,Y-tɑj:3:g Hտc`XҰEx+ԩBgmsm#YR)Ϥ3y9qޠ؃RGkXa̫Gΐ`ƒ!A߮;b *fxT]>$5Sȉ"!NEŷ^Yx"d^S V-0LD EN=b _E7dQvJIS6>-LaoPK,(PKE9@"javax/print/DocFlavor$STRING.class}QN@li (*&&&^!&EI*"4ěYj55x0QƷ уmoL* >Sy: hkws)LfطŰe'Se%m4[ {3$˕C޹ sP*c@mnd2~GOJm*X(K+σٍϠZHb@Y{C*c{(W7EO}8 pχC6K?H(Ҫ(N_!U14y /wF 5(O@Sz01_"u;2PU]*VF›cNPKT>_@PKE9@javax/print/DocFlavor$URL.classuSmWA##JZiYYڊw!{7AgEOӇN}:=3&q{Q!:>%?N̵ꅆur*;z mKFaL)߆V`,7hQ+gPy0V6f~׬-V$aԨ4,yz\VRYgӴg]7z/"sR Wi*)ڷ`q ~qGP!nsJ5']TI~8"R>ǠT8R=*1ǰTO8FpO՝]:gװ$VjT-keӪX»@ɆlpP:Dt>tN,w^D7hu"eZiنutdF>Ę|".NT\=C{s}ÊG(TU<8xXQ8.ScF,~[ W )-B0C% %2a&>{iCEtJiQsr_P9/1WkL ao1 K Hckhߡ0vC^ /0WN {z hSzEۊ-C3F7PK|v8PKE9@javax/print/DocFlavor.classS[OAf[X(+BWD-"E+1MJ!ۥ OdZ&epl*&>QƳ!assf?~K1?=_A⵷~: apSivca:J[105/;+qm{0dkF@U;F6ێte!/4eP᪁QdknKvym495AvLdru{ R1AE#g)Lr=GRGPI+ԣtD; Mwϻ">òouY狾pH-;߯Cm%;?;ZC%+(]ugXPxm,OCGBJ}: Քj}w>hؖYԱpSMxŴz:aZj<ڱKmV&t<uSZFsyuU!wi|S0vG ` Yb06&hH`NF^PbS Im;HCDY0,vQ!HW ØƾDjFM.*.t۸0jJ1gٵ4ST5u_+.Q|4GX \!\%|HX$\' |L0FPKWa~~PKE9@javax/print/DocPrintJob.classRN@}@TQHGBWN&hlK[&d n̓GgPZMag3{p@o^F2P81 , 7Oޜ|%pNkΝRE+ (xOG% R@12ͽt}kF*.-Y RDF{IW }$+JAlDb:'\ET\7=[hND>=O*P[4?7&,(-3:G3dș95tPK, T-PKE9@!javax/print/FlavorException.class;o>#Nv&FIJ ̼}IJ"׊Ԃ\*"TDL&ҰL-W"[BoY! JcSn!ZEmEU"*=r><>#瀙.=^PK>.PKE9@"javax/print/MultiDocPrintJob.class;o>#>v&FIJ ̼}ҜL+?AB?'1/]?)+5AYFV#6QDKJ2JKR8DSK5\+S J2+*/-JNuIedEH+ @ F'8#nv&FIJ ̼}ҜL/8,39AJ?'1/]?)+5AY/FĒTihš+8(9-3h$67L:Ya:bL \PKu ƔPKE9@ javax/print/PrintException.classPN@}SZE)Ec< 9Xf0^c`kjKJ!'~e]5a{of9vm'1 8T^I&؆Ipսx_2>^:` UB=qx;{F!$# D*U7QN A]^;(XEzJ gl<ֲj) 9Y: oz{Ɉ?͕ϙ8[W00pꦋ %&g%2qS[KB.Vm=lRFn66-ms$( ƞVPKQ|0PKE9@javax/print/PrintService.classU]OAR)PZ]P 4&5:ݎeɲ[ggyWG vn7ws=O؃,L(>Vqx߱YnezuBp vyxaꬬb܉<&0gsFS7~@0|{piȰ!utyB`Dԉ+VsiXtM׊-Nף"H߿R}5!jYUoZjϸ&HR@?cꆨwkCh$UΕE99v:u^ ;QNm \q°`HG קsG?&&&r\ٮM)RtwҾϭqf_*խsX}Ђd;XGK"0yJӚUe N_h*>2^^stEkFKr{ "qqfs<̧~mVw\6w%uZȀ|qdaR)V. nQ0=W9/`Eu*`%/b^(CXSuxl"̟MVqGD3xPK |MPKE9@$javax/print/PrintServiceLookup.classn1'Ӧ -$_bPX BBT]Tr&f*3C BL˂Yھ|se;'-a8 /k0B%2(:/px@3,>c32:ePZ*}9Po0 (W2]O6]Q^2l?E6z_|q m&:^IGtr!O"՛Z+9_ ugjP*v0vk30a͒qx&kLafo/(_tl;[HDG4>+ŭ+/iQt  q+P,0׋DHaVu,[4ZPvždz;\s%-^᱘뱂x4r=ְ\8ڼPKx'VPKE9@$javax/print/StreamPrintService.class}N@BQ;Pc;qaՈ LpʅL\>blߜ3Oבa86tU o&mCc(5;C [3줕i CJ:R]3V 4P fAq,֊Qd6pɒ &}=h˵=IPSOg8E33;aҟ>1KCd&\1TMoxHgJE~A hG uE[> QV~W] y]7FQx##uA2YPQ`Nh 6Fb ؎|pI^FI[B}^}S֖*w#oPK&AoPKE9@+javax/print/StreamPrintServiceFactory.classRN0}.i eZ6!q@p@H .*ąbH88|bT,>̛ϼy^^^lc[/22oBwd j<0J0LR/Qk4D` 2a18B0Q`H'Ч xxƵq7KyðV=m HLmNJfjCʨ-LfuRyC6gp"+ıF\$|iߤP$w)w?SϤnpP+l7JJ4I@}lVg`W2FpSV0>]-ǃ8"LB7-٤'Ŕ5u.@a`Ml8.݋G?WRl}TuŒ 6여jkt&_'RY'5=h[{0:9bJZD+eޭjSjg)Gb-P7IA՟=۱@5&!9GZ_vWg(P1>k2e#A8GPտ6W|o]kKЬ7'Z?fnc M/t)D ?!)B> ?~,G^aئFkL\`SA#ofaqG%||FOq{xO8EHf!)PS>p%rUfBYrU.*}EGH8"jCC@ R$Zth ={"bFdDz!;Eª#5_s%lֈBߜGG@n|- `\m8gҲki n|n{\Cd*PK! PKE9@*javax/print/attribute/DateTimeSyntax.classPN@=S Z)&cqg0n0]@OqC)AJW&.?x;%199zp}"e2!:qEx͵ȩ?%/ *ûx"FAmX}I3pPg=&j2 2\Keu;C lxX&C%(F$qOc ʜVrjJxIA>2EYK9hIc\EWwič,O }p-شK: W#7 hҹS`n>ڤ3lVƜLJFdx`5hPK9PKE9@(javax/print/attribute/DocAttribute.class;o>#Nv&FIJ ̼Ē̤ҒT}dGAN?'1/]?)+5AnVFҢT GX=^ @ @PK[.rPKE9@+javax/print/attribute/DocAttributeSet.class;o>#Nv&FլIJ ̼Ē̤ҒT}dG'8AT?'1/]?)+5(Ƞd݌ \Eɩn9 "hL Ĭ $8PK騧QuPKE9@&javax/print/attribute/EnumSyntax.classSn@=8qmVJˆT)Aٰ03q&BbQqBR̽<K( <9 ml M *85X9 ld fTh}TZ.㠧-#U"cEy?b@6ھg>BPƝ:V.PngFW> T1'nuPF}IƳg?aw䅀8YCl.NEPٌڗQ:w:nw>e˱n3# gRs6BXKq4aT;،}<<Jciw:skܴLMl-ݚhιXel}A4yua{Kۅ}]d-0w pn뿅^CGn~PKoPKE9@,javax/print/attribute/HashAttributeSet.classN@8[%iHR kjEjiY$`g]UЇzfXNb=3>?-(@#xKW榫S׵y2:7ǍQ)HZݠ|*8M -gͩi`)xF %}MH,\HXW0=K`CO™ȹUpM&X>W˧um=:NQIݪm#J>P{pf}1fFs*;V9w,&XQtPP ]h6'6ZXx] A>Kl?bHW`&WLr9cvl!|3F#q-B/ۻ{& QYDq#QZǶMk+*;[v3Ϻ0=h)q.x"8@W!$ >Bj]zMF>r~w:R; ; dj]+1T7*q 5Rv w/Ha9Ed ɫ'[ӅPh{}1 q@ Gon& :~$&dNg5B];Փ!l Pf9 i8cmxl8r;ro6&ȳM 5.D1{+.peZfU eȔce*<2XPf3PKsxRPKE9@8javax/print/attribute/HashPrintServiceAttributeSet.classMK1nZ~uE`V/RDEJ/hve_y<Q$]BWdwL?>4!4Tϡi_hDKZ&בTNGj.a/[!LŔWJK|΄̙)}NH2xY2|[';ӅPh}1 qt@ 'on.ӲA8Lu23I!Q>BL¾Rf Ts4<.G#Nv&FIJ ̼Ē̤ҒT+?& R\ VFҢT G l=@؁$PKK uPKE9@0javax/print/attribute/PrintJobAttributeSet.class;o>#Nv&FIJ ̼Ē̤ҒT+?&Z R ecdPn nFҢT̜TFIl6职 Ĭ $8PKexPKE9@1javax/print/attribute/PrintRequestAttribute.class;o>#Nv&FIJ ̼Ē̤ҒT?(4& Ҡ\ VFҢT G z C1201+02I&PKY2yPKE9@4javax/print/attribute/PrintRequestAttributeSet.class;o>#Nv&FIJ ̼Ē̤ҒT?(4&Z ң ecdPnnFҢT̜TFY\4Y@H21pPKAdbj|PKE9@1javax/print/attribute/PrintServiceAttribute.class;o>#Nv&FIJ ̼Ē̤ҒT?8,39& Ҡ\ VFҢT G z C1201+02I&PK0yPKE9@4javax/print/attribute/PrintServiceAttributeSet.class;o>#Nv&FIJ ̼Ē̤ҒT?8,39&Z ң ecdPnnFҢT̜TFY\4Y@H21pPK#A~|PKE9@,javax/print/attribute/ResolutionSyntax.classR]oA=,~@Vmhj\/5l 4<fݭM7O&>Qw?" es=}}e1 ~i{Q&Wʓ@ ];Pu/3J!״32gb2XbXP]In/o ~vI눁Y ;@h+T !KHòF[PjEbG:m/e4PWc3Ŗ> =83TFB<NnX Z>>h`,e<¯4J1w7nf{ xϐUnΈaװ:Y(s\ 8W.O= ;mА=QJV$T%R@A=&,VfMMāB̮- z村8c1͌k#'2~Fu[BOљBEU],F P%4/{qM*ϕVlz;YC 긂RhkهLdA2)Aߜ)`&s.Ga?DŽv8 tlw24}2'Snzhys3_~PC!?'HJE7RSQ(~fuσ;} ðdTIS,y} x!ýݡc=946u=iPzCUBRޑڲGBhh8)Ua  u~}S*NspESs_#Nv&FIJ ̼Ē̤ҒT҂ԔĜbG; #H~Nb^RVjr ;# 15@-{wf9;s|1l'zPZ\XSY>)rf1,@as>U(1ܟ{h|\YثsÒãP9tf1n B!wΈ`G ej0q &jO^?j֋\x,T%L*㪉u\< -'<~}O\z~펞 x[v-rƤ_Dw{V쒊A'4h ʖaƮZ={xJN]2rh){袵9P V u"VO}F' rX u"4RCSW_PF_-j5i!pMvqU-mhmcjj-iU9L;:PK PKE9@3javax/print/attribute/standard/ColorSupported.classRn1=NLNISʛ AQ%T)J#&95M<ڿ@bQkwx3{}3(0v2zW*˦#|P/[t̓!yqkXE5)a9- 0cX7"N9Cr Ⱃܵ+cMIT|:ǧQHFi⵴w]6)yQq ZsqZkhhbEi U)(`5N-m E9elۿ%'8 vvwaTXC[f}Kᴂj;wr5sg PK^O:PKE9@0javax/print/attribute/standard/Compression.classRn@=8ٚ6ei)-$ˆ$UE i<6I,3ȱ+{\>Bܙ=4s9E2a{/}@\HLڱG3#7E0A2w/MiG:}wq`ݳ>dDQ3E !CSLWPXxu ŅװPBae(w'nt'>XSy$T&sEdqBoELGO؀乲ǥC֓><8q .-"K EISJbjKt[I[uɪ>b5:( jDu QźF@H^PFr{OK#ˬiNc]ݎa+آA2֬ZoaZZ5ժ`i'3K u;PK}}4cPKE9@+javax/print/attribute/standard/Copies.classMK@mjc?o=ت⡥ !RDx%l+= (qVAe3l^ߞ_cFas27FNh\w#E`#ɰ6u{eFaci-.QR&7rVG^,bi41J8ZyPK^w^~PKE9@4javax/print/attribute/standard/CopiesSupported.classJA1cb\+xEP$"Fr12`JOk:QpAjW{Xsaع=uThNbUWR~Fڈ,w/MCr#+|![K : Cd(3 ٖTҴ]+#ԲuŐDC Ec(u$}9T5Os#cGm}ş1|a:ٞƔ+O|?J8vޕ)Yh} 쟶Hg16{F"ET1OҘ4ZDeT᠖.a?jWq\x{y%MPKɡ?uPKE9@7javax/print/attribute/standard/DateTimeAtCreation.classQ]KA=[fY=}f=)=D`>M1Άz z; 3zpC?27Fvd7\uzW܈{5Sׂ* ٴts H2F&l~* ɊTT6EFdŐ]VpĐiH%n^[{H!;.&̃37=i\2ObXSzh- WWxO7&ӈOK)WIťny44R>R0q-9N,%0Z"\}@!Jͩl`kq,A>fbc[^&VzkeI8v2Yd؊oPKFesPKE9@9javax/print/attribute/standard/DateTimeAtProcessing.classR[KA=fytB)A=>M1;+)ЏY5%f9g1oNeb8{>tõViᄚ=z ע%Z7Ta(}Fa{6qo|͇6 ; i!YW ݺ!9^,Yk3$jAO l,1dQ#Tw{E" S(bε1qCyaʱ! bϿJVfܝhI{}d><ɰg_PK1ݥtPKE9@0javax/print/attribute/standard/Destination.classRN@=S ">0Vݘ11 1 ::+](mA{9o/bb(];~hÍѲ6m@F*nlVGe8pigCrC` `Wf![BG N/b5-T $uIm }[ԽK޹Z_+3 daƍp=0[(\ODSdhQ-2De\lt»$rlz2|̗![`, #D[s.-zK'Y1Y DзAsGob?rW{e~ʹ!J-PK<PKE9@1javax/print/attribute/standard/DocumentName.classR=OA)ⷅD=Ԋ`؜k=WZXQwT,l737roN A(?蹏Fi kjV+tK{4öF$a{Vl9Hv& RgJ+{N-" uk2 ZjВiLa.3lMiy܊Ϯ~'2iUpPs+, sY7fA sUa>aX3al]yZpߌYG _ ;z,(F854W?QP52 lAhO.FJ_K[l2Ms븎v3ke}ëyًlUn啬Vn_dEw~PK\PKE9@/javax/print/attribute/standard/Finishings.classTRA=!. U$oɚWjVfC_i`~eyvg"eR'LOwOLW }bH3{vyt3=Ho؎zk;V ٳ Nzxq Qkg{"^^ȹ_`;և~D֋ŋDE"و(ާ2;++$?Jݖhs9g+-۰;7Z*pclF8sQxFaq.ۢ cXە [_Q7.,Hqd"_JpQMZ77sy̝K^^aFas27FNh\woFauUFxBxY)cca E`> T2$nMX!iT]7fMi};=%ﵹ5J N_8 ; ez48mCR9=edH<dZ~/űV:v.+ ;XP#I 0nY#rtN O5E PS e \욏79[V9ʽ8wgea)FoPKɁPKE9@<javax/print/attribute/standard/JobImpressionsCompleted.classQNA} Ȱ̓Qj"!1$&c1po3zHOcd5pRUޫ?^`B?=Rewhz\kZUOѳ`ؙu2|d!ɰ;x+ÐI%M!Qqr '2#*URְw=:\0&^ yA \10! ഝ J5R=\ x-]PS󳿈IpQ':x4J?4R.2mĕ ܞ3aH1a=RdՐ@|j/ L& D<`+@ʣ@Y*#B{eFac2d~a5![wWZQ ȠXꮛ"T3>iۑW\ˤ7Z xD;wP iq, F V1ѧ=*n.>hn1M7u<<<"/j_dڄw諓l#Oq&(73 t0C1G `>8(cHO^!JbZJ(-ëz>бW˨g[8AɰVPKWkwPKE9@8javax/print/attribute/standard/JobKOctetsSupported.classQN1=EdK|QcBcb0&(6 ԱfN_ąG4Qaq}x}U)[~ܞʸ-۱ndruEc ]ip'L󺦌2 #_-":2GRIs0^[ jY!<1*WWK%][KH\I=h͍\0Z?eT9 Gʺ5v|("դ'}M^18tSߑG采G$!녱3̹8d~hIt0A$UHQld)Ka* 0MZ6+h 1(2y_[H8)˵d]}tZ"o,Q2,jPKlńPKE9@3javax/print/attribute/standard/JobMediaSheets.classRJ@=÷.ąq"HAT#OGD'~%*f=s =,H1l:wZ*pclFF8u9 %w- mV[\e/Swmd cLG /}$Be`T!]q-< Auf.8nB_fzp eʹ!S>z c05N[tTYOœ6WSk0g=+n"MwVT7 CJ3~KoODJmCzѺRME(1BUF7,zB)LR͐(ȧTBn6q%[ԏ)#d?~VX29=ɰwPKs7UPKE9@<javax/print/attribute/standard/JobMediaSheetsCompleted.classQJ@=Fk}ַ;F]`$ DS3#L~%*ͽs=Ǽ8=Rek"n^@r%Iܸ݉ a}8SFBpuS C.4 Vۼ%Ɓ("lP2ӐJ\uMox3"nkƃeZ2a8noRq;)Bs& fUFeW62ʧ{UʹJՁVX29?ɰE+PKƑ&{PKE9@<javax/print/attribute/standard/JobMediaSheetsSupported.classRN1BBZHHZ~r1%=@TB8l .6S}N$.όޢ MƟO5ʬSK:$g\k)mdIb =Z_{HV[P8Z¾R P:UZَj; I(XF*h]^:dd4_hO(Qy>?,k |?v9Y؈7[ց3cґߍ)MYH 1͒.41{yLA+Y64m#B{XuO( Pz-~96j&UQsx5VTQGN92#uZs*v;i@)PKPKE9@;javax/print/attribute/standard/JobMessageFromOperator.classRNAAd7A&9D&e+=x(c^LOuWt!6-$K=A+dVH;0I y)Y~Aj2(Ȟi=C= )gG uvCV6 riR`=FPKDlGPKE9@,javax/print/attribute/standard/JobName.classRNP=*<ĕsq!1D#C^3W+~em8n9,+^[MUc*;͌R!}̸z'R,vg_=4Ua+1C x„Flٽ]*oJ46s ?ԗXE(t>m;bGLa=i\q zFF8fL`r@⬄If1i~gbl,ňXL;Eac?sWPKP_ǎPKE9@;javax/print/attribute/standard/JobOriginatingUserName.classRNAAd7WM!z0DMPL1묙%Wz2Qƞ]$>{3o/ ppǻ>hˍѲᆆuek?0d(%>W۠I'2wAdHׂb <L0ԥ}KkIÛ\K[is+C^_%.׻Vd7}̐q#@+_j>CL6GFFmz18t5P1mn3iRaʹiTR=Fd':!0)iisA0)XbmBXL=P-ƪd:P2Vf.`2UPK'\PKE9@0javax/print/attribute/standard/JobPriority.classNAfasApדq^<@H b t6أ==FJO&|X3"qA㥦3H0l][~\kÍѲ=44I񼫌n w6R fGFaL܄"0#C*45dlӧD&`ƝT4};}6.ﷹQ>,&ͅ v_FT\10! S_s9>3-)nBM_^MNyxRٖ8f>x7FJ`6ed)("I eY#tN`b S%0bbCH`߼JW;*` ûdX7PK$}&PKE9@9javax/print/attribute/standard/JobPrioritySupported.classQNA} nG/q!1$&c1ýf!==FJO&?X3 /U]~x}p ){푖-{vhp=ލfFQX0:Ohw e8Ou `6ɐ9{]J` HP"j +mD'=k.2s'C?fc0Wy=JOqiz7qG ԛbK>$7H#B "W2pk^qFcXOE9 Eyq?N L(fcbu VT%˄UU5q0zPKE9@.javax/print/attribute/standard/JobSheets.class]o0_!inCnX54TizV:[Lۿ~+E@}l/_S%G~,JePc0<B,]YLs|վqPaؼF| N > =C%<;݃ZvFI,cPncQ-UzaK0tēbOvg Z{큋2n{XA(i:Kǰ JDivΰjk KxO[ HrUd~󷢳ϚMv ˿1BɈnHjvR<6Q  =5-T&ijYU /)(aA@+ diШ+@RFgb<+5[ٸTSq=44,:eձn.{su᱉PKaPPKE9@-javax/print/attribute/standard/JobState.classSmOP~.6.L H%1Bv EH53(㹷E6y}폟߾x'?3qn~HB8le`ND|b|)d` P>َE$Ź@JODsa0v7]sl2ײUVo<g OCߴlױ+?hz.}v\:Q(2!C0Lr+mhDN O[#VM;%JNnա];c9qԙJ"2q9Gp& `nҢ D-YQ۴:ף ُ[mnA\qJp)wqw5<غ25UWEs$raIW.\SW_PKz6 PKE9@3javax/print/attribute/standard/JobStateReason.classTiSGsl!q# 0qbjW=$N (!9ʇTC~@~T*ov`RPttID.F+/Wv$iOj}\mITji5{)h-FL׽h(b4/0JQ 0*X dѝo:vdx1ʕ=viׇU=#]uB9=S7MsN5<-{.B߀y*5$aZ@9Ff#KM_<۴ oI ȴ\6umwv`ZY6#.\H(+aZAjJ#0vΖt9 C#rg 1yDCŽhEPfbi4E~ฮH`\p=G IݑjVo>8NvB"3" PVB,>r9Ly?,VLyOý D1!F.wM\;6f=b=(hS/ ĩ_NR8 Ju3NWUqKNY68 K4*iL*SN*S^mNR&ziR )NR=4#T!RsӜTr!wnJq%U6BXf>=9`jō]keT̛ {M5NO&y^^5Fd4X&:ޅZBqVq߯ךqrF{Fl.B^d'1v.f ~}T-EUaA%Ń+*RUQZ  =EzIǵKGCuz0]tja;/rIsqU\d'UPK"9F^PKE9@4javax/print/attribute/standard/JobStateReasons.classSMo@}|Im4mB*U-QAmX+ǮMEqG!fNIwvgy3Oҡ1<;yۮ0 w{^-[<@G!/1P؎'mKH3lΦz'D?0k=Q>fH6E9X`Xjٮu4t,8Xiy]sߖș'vݚ! !e4Gr5JF_ q=&2mr1I|j{8;ҁQ^4 1sB91 }K4 Upo61֫1./UNG|@)\hSۧ5csJ]Bt=wε8-+oq]sEMrtgr_rS~g#0ۙF7Bg4G^dX>7͇!-4; }^M$@ H1 'A"9ɒ)yU^Z]̥K\3C^W"7t!e8u\XOxOY@Ө͟/s?NZء&ed R.ɲ8ᑒ^B̚; 6z菈 }H,@CM} 4Z2rS?MaD(o3e墬TJc wp2LDj PKxPKE9@.javax/print/attribute/standard/MediaName.classQ]KA=aFCFT,a$أЄߊθA9wΞ{ُϷwc(?=:bָ:?w!wk{(Ƕ*j AJ;cH6;7=g skPm:9]5C4ze5=㿼 #19\2.C;  !%uYZGdeuD"ǖ|ܷG2透$PnV#,s t K! c?<ρS!@4 OaèB:IA({ABb"9ڳd :M*"$6e;%Fr[A&jKv82E3)} PKnIJvPKE9@7javax/print/attribute/standard/MediaPrintableArea.classSkoA=< BGn[5iCl0M1i ݆24~2?_0ޙEl -=ssm`0l3|Z4UHa%mGajZb<?C\ډ +Ş: 3v8°~MK#ڲG`˅CVd/8ڇVGc舐Cpϲ-gg)f.8 31$deTzd٢9 :ɒS*w-5&j3J}D>&5~-/l{!lQ=hS鸟2ҿK)xMcisqG{W;ݼR!Ca5%)fd/Vg7 {dqôjcR# oiA:>L_udtܺ8Խ|Cqaza ErAs8"q2bb`AJ31<ziBFK|$h(v+b=X.ֳ]K`Vm_)%ϔ'=v~HQ9ϗV{n ո}n/1ug9| C48Dcc ]'[tKZc[P(MAx[rPK ;CPKE9@:javax/print/attribute/standard/MediaSize$Engineering.classQJ1=ӨO[Zv᠈UAtNCM23ąěs|}|8Náxa8v /}-Jtԋ]xII$b Y] P:!;ehgu<&E8'\0<0D]Xkԗi0,pđ"Gr9RȑDe oތzҿ=W2#G]+&(V8T2W} duFcߑJfi;~yo"d6C}: OF%PTу1rzʖgI7G+b YBP ^MU#- "K$/#K7XgiTmmbmoc&a+F' XŚ_76-#B PK/yPKE9@2javax/print/attribute/standard/MediaSize$ISO.classRA各0@8" pF"M8DC&"*dB6eVVyFXvL-I;=;3?XƅMc]t].ߺpztU͢՚ ~hq^3z|eU\ MhSmsEBCs*g\au69lQ08:ë3: 3: KsJSҜ^1{O2B@C Yuݡ#'Z7U fZcKHZh$ KJI+:%mtIIXG^I)>Ii~I{%e$=K:T\`TRQ`LKqI&$-g׭urJffiTډ|}Io)h{3LrvCCއ`֩X6yw7hzr5Ѱ~PJ>k-m3Q76Aʅʻw+QޫOyʇ+Q>|L 哞7{<CCΟk;I)JZ$Hq2iN$="%I;]AʐI)O:& H'o^o(:4H-tF!jr4}g,18*汉(X.fCĐc(FҟVX%Qz=uv :9/Dko nx%B&&˨*>"PK}oPPKE9@2javax/print/attribute/standard/MediaSize$JIS.class[WW@#TDJ Q@ x(NQcdPkmE/ztµ-dyOf_S ܷNͯI7j~q7Z9}z q490+2\J锃~7+) &k! f4s.n#D…q++ueMƞ#q+{cd#d8HFSݼn2TFCa%j(ULW4^+ hFXRXZ$XqAk7mn ڭM :tZ+8lmNpڂਵE1k˂ NX+ NZ{(8em]pkgmYs筕y^ k\-b퍠1y-.zXtKneͭv&W@# ~' ۻ7}F6dZj[{8~qлyo5gͲк̥ ٢lU&/_3L0Yfe3$sfn33,3%Ya֘Gc)#)2el1o>pM'n5L7Y[,2Y9>mRAw1Yy,[EVGx2 doC猏XoxpC= w،3įPKK2PKE9@1javax/print/attribute/standard/MediaSize$NA.classSnA=-P:-+Z**\`֘liXE44`a2[LlRs'~ `{a'B9s,U uֹk*װ;Q͎eYlC۠ X9huͶ0k:ü~b[ !]մCDT uU~V]ֆyMFqhs6qjf UPաEi YiwC{^_Wg8|){m \ac`1f8B51&#PYqrprBsL j#.T#! GR5)68RB8сmVO[S3Z=!Fn8.P. ^platOҍEAѣ6,Wmөiy@ f җG;vR}H<.K<)9&9.9!9)yJrJris޾{2 .!1 a@X"(JX'l~KGAAZM;ä0cYXȡE|D=(4ܯa2BUːo[_eGhPKw[PKE9@4javax/print/attribute/standard/MediaSize$Other.classSn@=4(P @ں-`!)r rRO$> q=>9sg~g ,1l'ѵO2=ϵ3ϒLw$Z#lgV,7(CϑƦ^2cHoUz*CM_9C5!5zPzV詺Ѥ@ܔj[׍Fȭ:Ca>ujڢ2R^]*4VXMWnu:nhdm^0D=2Y)0\!@9Α tnqdu.rqd#u< 9vr;`l1La0'JM#- \Ȟ2l/܈Ԏt{2sց;g0pq,Wө5M CubFfPT?HɐS!C΄C^9r.%)H\gbd?BB(V 7 k; >C=EhtB| NQ"Ua _PWTCcc^D}\,b~Gw8-)PKH-(PKE9@.javax/print/attribute/standard/MediaSize.classT[oABQzU)TR&m JR5}PF.fY's?xf`wC8̜}ߜ9?}B /vuUBnp? +!0?Z#b "غe[jXfT 10FАPM~]8xE.omsǒfݳ: M-;Vei`(ɣf}!|0~%[vCm3 *<nvR@oqWZӡi5mv!mKն# u O W>ѼIHI#f슪%_X IönJt4di~nRFulÒobP{l#^u7Vfo7jCTýy q Z=E>@<a+!# 5fcP$T>E!M#T4.7b\$^ۡ]:S]."KyD? u/n*J)xe fUk;A*s G~d"S'LS>er}T)4G( _mw+$!IEIŃ"#V>w_TjU D2QA`!YٸUCqKQGgsP&|r ܌.Bq#Xe e]ŠQ5(ZsV_Bn@7fp ʷہ]wp{P}(~u:9BGNN@<6(BqFYF L44HGq2hɤYFT]5µ—G.6KiN]W4ZٱwOFg7PK"x PKE9@.javax/print/attribute/standard/MediaTray.classQ[OA=Cm)C\ mj|TBlD&>icjk-Ex 2]vs'W8bAUPOPQ8tqCu%,l{:@ݻkorm|xtN? X2q~t<#VˣuHgDOutBC6is6!&EΨb6%ڒXJԎL#DIX@Ӡ;6 B_ 'xśdBm>NnmGU8!H*|) \lwn*!!\6cĜOy)erʅ1/p̶""JD&D*}UXXcu+1w|?8rZ5-f37x/ǔv9^PKKX;PKE9@=javax/print/attribute/standard/MultipleDocumentHandling.classR]OA=~PEDi4$MJͲ4lʹ5]WL|w+Dh}pɽ=Μ)v?3~+T.oa!aԱ [8 ܱQ d +y I]~ ;h>>D\6L]?w^qr8uB[J;1lpbdUC3=@h/]-j!V ydì`a(lU"4M]}C>uo.d-,x > gZ #K4FPTgݑpdB^dL{r{3O*)d1i0IZ5XokGJ1GCmCdT(ciqPU~9UeZ+_ (0P b$W"jweG(HvFr v֮4r̊䔦x(f 9l1mJciJ-ei[I33 YUPKüC~PKE9@6javax/print/attribute/standard/NumberOfDocuments.classQKO1 +u >1YC@]kk]JO&(&*t{t}x}p-CyRe;4 W]N3췅;;a_(H2lOWOH>bؙNK}aHUƐ,~WdB6D(n,7nxG|-2'ͤqvu 0uN{zİZލWS [S܄=˨Ϙ{tSɣãE$!C2ZgH#0z49(ۘ$,{Dg:[X"%1XSys+ƪRx@Hi_^+;F'^9a}2leqa#6?PK^htPKE9@<javax/print/attribute/standard/NumberOfInterveningJobs.classQKO1 RAP55M0ދԵJO&(&*\t{t}x}p !>#QKelnvpc7Зw2Bʽ} Z +G ۳W~Mng_hU*ij ST:"0)XH8nH%&]vنw˻7\K6#^N۳BCÐtsc\]\}oIWq3t_Fuw$ߏPE75yJMЩW+X2_YdX OPK#ͲuPKE9@-javax/print/attribute/standard/NumberUp.classKK1O:m>Uqԍ aXuaLdDxgZG+n=ƢwNKKen'0\5n8uM$rwUFxBWw6R K!l~#N3P*I%C/h* \ Ppx'WJykMV:o^p-#)&ͥ .Ynd`.C|}0Vh8M-h((b52ߓJd ^t>2'%S {N{H7\Xv3?P$ s0N3Gzp7!^UuBĘeI4yٟVm{~'DqS~M O"Ge:skj rNw2f9K tM?!ͩ4𑞭Ly,6c)1|#M1ӴL1I&EK\gKTSejl׊m[ǔ߯X-˪e X8\~af_PKcG1¬vPKE9@9javax/print/attribute/standard/OrientationRequested.classR[oA=]K^ qĘX҄PL0jei(7n}p7e93;g3cxR(ZHN?|GKsc RL $-7ۧ81d؎FzYa Ű70/yN`HwC^tc}T?7\5lKkg X>9#!&" *+6M.&0`>f4Gl}Ga3YITaql;Ԑc?a`mM.O 6Úqwj5g|AӶ3u |~7^sHŠ|N4lSdl/ⵣf(GX{ Hq5YHa 9bjPTO}A: ZԌ&}K$ X$:H [PuT/I}̆攖Q6~i֎ۣbا?6 rjf9ɰ/PK%o PKE9@9javax/print/attribute/standard/OutputDeviceAssigned.classRN@=HvNPc}ĸ11 C~J'uLmtJte𣌷qs{9sf?^`@wx|T&ZI; 5&ҏ>ga(]_8r ¦F׼k ϰκU`}U'җ$z,2=fk+YVŐ( " 3ԥ/[&=r-%W2ƃbNɐ[$p[0 ]Z1W jCL4#EcelyH\ ?GpB#T[\x+i܍U2я3m Yc/(<1"<yLQS0 9b.('Cʋ~)!Fɰ_ĵ\簌P )J}PKyPKE9@9javax/print/attribute/standard/PDLOverrideSupported.classRn@=8NݖiJxJ(_bICqG*iv nuDN8%Q%ǶRI%ӾxD^8#eɂ(#rћ{pmj:zuy#z>QTN4C2a:f euM(9pї&մb'dr]8t>?%F/Pc=oe2+o&Zl,ӳ).BM^#GeuEj XF֕`wM1YM9{grp$5{JB=f;8+TSZO1jYq5e֏R'ٝk3:ǵ/PKp[G,PKE9@3javax/print/attribute/standard/PagesPerMinute.classQKO1 +">^Đld[+=x x2әљ 16]doiH޽QzdQ^lI62nKs4]8[%2&xԖ\vIH3T]y5VTלQO|. L~[J]G+Y܊Կ&zt썊ֿVpHP@M"(Pmf^t5L T ycMt I:dB>+U[yr胄#~.$8U2gw |`c@WF/1^aVR='ʌxUI #tU*ƳNQ 'PK:?sPKE9@8javax/print/attribute/standard/PagesPerMinuteColor.classQ[KAF-K^4zHaQmbYUOA~Ttv^Ιs˜3 {R |'-vhr=aW @[0/9Ohw X24q =qe6!Ss=J`(rH#_j ŶTBOr;pǵy3cdps}'Lv2TjÐ+73?zKrGK$!k/`X0z8%8[XBU(/g*,1 (n8(bHN% /^%l#Qm&ԏ)ëxfܫ-lg[@ɰTPKu3xPKE9@:javax/print/attribute/standard/PresentationDirection.classT[oA[C⭅V}(i,l 5`eド삨ws8̜oa7;Q\=ۑҳ[Ci):Fó#]Yma(Ng:~1D6**1*Z@ in7fvxd2I-&$%\ǓD[!jXM*t^:SuK bF7@_rjPO~6g>Bs'yfHL#[%[#E^(N DH EjD-)[7(Ru@7uV5OcݨjWQ[a뙅)M|tmZt3 v4`3Q?PK+<qPKE9@1javax/print/attribute/standard/PrintQuality.classSn@=v-IӴږ[B#^PiT)J)M$U7e9vk@< QS $ڝs̎?}U)'ͥ E?Iy8ߩ{BMd6^;%?7a0lMG/Dtz3{s;$0w OZq]a!~ySo1dkOB1+Ɂa<,uZ09ZXŰӎG}'<})z<OF-T^iܲp7( ?1&üc*^](s]\!iQ۞1˹I|D?4]AP: MD9ȑ]Wn]IEm3b ] ozih?S 5ڋi/m$Jȼ_q7e)OP;MlQfz))/UeMV d6sm U.PK`aPKE9@0javax/print/attribute/standard/PrinterInfo.classRNAAdo*Wx !&K0cY3+=x(c/]55zp} 1#267FV`3\uw! -fb`geB89Be[\te0Aʵ•[v#=淹'JMxC&ݖ Hu=7a=j̓1M>  16! SF~f8:z#Nґ&rQ.α:_B*T]L9~F[XxiH9-aFiT]S@*0+cPL2Ń!+ikna81rSތ"b{T3CtmL͟Ϙd؍oPKcrPKE9@;javax/print/attribute/standard/PrinterIsAcceptingJobs.classS]o0=nCvec]1S$4UJ4PZ(u&ǩ~? q{!?_%|%(1;R43K W3gމ-=Ha(ΌTQ2M]8 SU6..* Qn B+˰Ó`M7Uj/怡N?\TV5TֆRQ6 =ӘkdW:AwRG6Тy/SZ\?g`H%ao\E] d4i^oHťF|N4 t(J{.>< O4nmk}>"ZXj"O}Mk((aUE&bȪ26WyR?J.sڗlmjvv7gR2KvոZ븏E'30WȣG?PK\PKE9@4javax/print/attribute/standard/PrinterLocation.classRMO1}Ed 7A^<,!1DOĘ^Yk֮)]JO&(l *tf{} vd-q1Zvb#ܾuϽJB.72R {9bhGeA6e}+ξ T4+\Osxi'62t#7 Vy`s me|wBR-Z 2Gͬ}zO9ພrΎdzI 0-nDGJuB~0 7&v;M4J46~뮸&J?h?h ML8O93^c9kXBeVjPUBoXCB$ {Zt:R]&Ff0m PKj PKE9@8javax/print/attribute/standard/PrinterMakeAndModel.classRN@=HC`3V !Ƥ:Zf+](m.̝{ϣgn M )-267Fvh3\u %g{to!Pkq dVl ݗq9eȜJ%Makۉϕg+LB#} :CA\fUx>czkañH0r2׼ s0 n!Ca{Aqf])nBM)O~3NPK߀ RPKE9@?javax/print/attribute/standard/PrinterMessageFromOperator.classRJ@=Sk>Z[НQ7"A"o!L&~%$h7nν1'8=uk?hѪi}R_0$W} 5@[ Ȯq}C] 9ۑk*;V2'z,=]aw$2ʳA ^}|S(c֕,nEQ"'qUcŞXNʏVثNvVf8֒hPK7KvPKE9@@javax/print/attribute/standard/PrinterMoreInfoManufacturer.classMO@1i !|$z)GK%!HBr$YhȿjO8QY'Dz@;3xfG" ;9ۙSQ߱FgIjձJOdWqU6Deq<4C [E9;Vv;wPlh!(KBvU S-#4a:n^p'j+p8Yp׺Oh?o](}fT!ai}c$If}:1I*[og3CSF#IDPv7^8;ތ=,A 9#y&B},u` sr~)0 -" P]9o[ЏXUUǬ?;y۹(bEa_RKeS,RFfQ\#qe:G6Ã4ϐھ^0qowz=ls4 P0j"u6+9-ҫ:( ˰ #ӡ|8NKوO\fRĪw<Ҹ⠆mԛpNf#a(B`&ٝ(p[>\9? "bIOhύM<>%>%E^?H< wPg1m"M,EMM/|b Zt;HٗuHVEkt-@` tWI(B "WLLD!K_Sfp \5hSܠخa4z {֖rD[tY;pǼ~PKtPKE9@7javax/print/attribute/standard/PrinterStateReason.classUkSFb0,+7$C JKP%UMh*\ȩ-S+~i:QiM:z{ ;Z|GWre(wQ1Sp/exXs *:Š^ [EwqQpJ)=K=Q hir'gY^5В񿗵Pf[67F-n@;>޶BgR(y7N=WGDf4ԧv=Gsb u6e$`;Wᮕw4:jA sQ7ozG5ؖzWzz0Φ!񬮞LjT'E&YE9 U4Pekd&W᥅\826<-Vw+)<3[PEӤmF PڅZb!]FL:zQP+zQP0Je'ƨ_(h@' hX,FB}hL(ѸPyFBm1jE>f4%']*`tY]FW*2*T5ʌ 9B06Qf`X >>T A`jUnCˌ>[hf3zE_ àc;KH^֎&BV u|i\ QCoX/G!*x'ҹ.&lqnq03N^I;T K$wJ-Gr>$J<,yD1'$OJ(yJK/K"kK!y&\g&\Êߏʯ4 `<x du`x  ؀x@x|<>^;*`!M#ے:Hw#`HbGhk`ZF ZE#Ō b Fx ?/`26Uh/}"T9EM&g!lıߨvTbr3$ff[bqt^h$뫤qf?jMj11*kXޑзwPKNwPKE9@8javax/print/attribute/standard/PrinterStateReasons.classU]OA=VJ OXƯ"iB$V4}Z&eI6i#oM|0QKeln{dsݷom2 %2ڝ*' ěv˞2$RI`HTjR4da!KDH%hîw; mõ y3ank >a`Ci1_Ojdf怏FD_u 4yQ-{XtSɣ%v@ĕ w+8a7RW#A<A1QL(b挃6G<%ʑj3r<~_^+;C^yla{>reya'v?PKwuPKE9@Ajavax/print/attribute/standard/ReferenceUriSchemesSupported.classT]OQ=ϫA ֵIBM A%!Ը/pB.զMtM[K!ܙ3s _})G`Wژ(v 8iLaT72{r$l2+G#1 ȼqAak~:n4 1P!x>c>;i[ Lr[ Z:8jm9T]*w(^e e9b[{l#<]E8G [J7{{Ι;w<}9LϵVrj4O\P̅zIIH4?w0F_D k 8 < :'8woQ,怡ОE W=(hCimy(HLD? :Øک#f%V&]ht2P6%;9#7)2GBT-^~̓o|6KSE/E]2_c;<"N i D(TkiP3B֚f<֗/]G ^7_}Z(ClѮJT +yEs`7߱u˩/n0 4[M=ڷz)o9/m-&n̝LPKFUn5PKE9@1javax/print/attribute/standard/SheetCollate.classR]OA=n[V'b+/&Ґ fS }evWwg +&>Q; 탻ٝsޓOf!ǰ~ȏ)rRJ8c;B JX(0,O'; ?PdXڎF[ %qt.^WfjT$PwݭmgLPKQ C6΀ЋƢ 9zװq6Â+CO'Ca@]hăd ڻAyܲP2/.ÜOQ[~03wzOI?*IUDw}gnmlE'4hx }mHzEϞk4^yzB9=tZZ (a AF̾J_+9,D:Di*ZLo(s'hsFvp6ܥzpjˆbR^3s%ѲOVxu24DPKc[PKE9@*javax/print/attribute/standard/Sides.classRmoP=w` os G( SaY\h4~0?e|z[7_pr0_8_)%#oμs<>Ե {3w`@]b` X3*'}Z ckp;RnƄD5oF,s#nj)y0d2ϭ )N@C F+FRKQMGuY8 KM->!OHkVt!ў#q2* MYҌl`v3/|$qݪC6 ؤ PPm {R+P\,Q2PK!bPKIG@javax/print/event/PKPKE9@"javax/print/event/PrintEvent.class}J@ j]'G<SQA:Kme_˓dV 8'O>?c""lt_ԓW7EL6P ͫrf*OHNmc" n|:ޟdXHyas=6QVjgi>vN3kw$~'d7m*sa0]; >KqmSNqaULjX5'0jpH<  PKRaPKE9@'javax/print/event/PrintJobAdapter.classKO1ǧVA'zp' A9D{YF-YvR_˓?8]@aoϯ8 " j#>/v l![_ 1[vh F(  vnB%ę:gZX v :_1$& : 7T xOroa\^t1-XL B{zHG^jm.¢R׾Go,;| ]*{ T:z'j@/N"O[&NMA&Bq6ɦ yzdͧa=i8?\4(GH=/oF Q4 fDɀ(elFT JX_PK1!zPKE9@.javax/print/event/PrintJobAttributeEvent.classQN1fEEP cbDcFM0ܻk%kB|,=x|(c F0利JIJ ٓOZ|UKg n''la y(e!O[B $"#oϼus s};,5N<jo*͐{ܡ">xlUR] <%b 6 zTbRU-a߬+^Tf kȨ1J`"7RbFuk̠)B薉Б|l,TnPKgLPKE9@1javax/print/event/PrintJobAttributeListener.class;o>#Nv&FIJ ̼ԲT b{'9e&d3024$'e&02'T$22ja+HZ3+8(9-3Y@120203#= l ;dbPKRWXPKE9@%javax/print/event/PrintJobEvent.classoPǿ͡26+`Z.Il|'8}|{w`8I|  KL\suɩ)\A GEIߟLe*+O,]4J{G(+ ׈aމOxpD\uöTP|A0D;FO([YF*ۄyAk⇣=aVM35}?&#Nv&FIJ ̼ԲT be&:e&d3024$'e&02'T$22ji+HZ3+8(9-3h^ gcd`d`fFX@,v PK PKIG@ javax/rmi/PKPKIG@javax/rmi/CORBA/PKPKE9@javax/rmi/CORBA/ClassDesc.classuOJ@}ӦIՋx\jڈ`JmI*_y<d+ʲyoޛ]o\cE8Y7%x8ꪺ3U# :Qta:O8v*jfJ֖?tj q-}~1'xqlB!@O87ejʧmbs-S^4ٹ !23$z&3r;Q# S/R N<`5PKX8PKE9@2javax/rmi/CORBA/PortableRemoteObjectDelegate.class}QJ@}S۬ZV$ Ā9iՓXi&,5%-<~hIqaٙfTfWþ7@.r KDk>4s߅p $;s>Չ~(y •C(W+b(^X+|x,# \l0T=ˇy1Qt ‘ իcՌ魳epd$miNkWo㙋C+5lIi#Ǵm!3qzNY_%ԒC#+ПQQ,Q)3ʅwqb1mֱE *e쒪FgzHo?"p=PKٶEPKE9@"javax/rmi/CORBA/StubDelegate.classRMO@}V0<=( $-eSJ.[y 1n_3;78Q 3Q-wsme2>w:J0}=sGtGav:;5Elj0ֱFgSnB򅛠1t?uYG1b%XBlvPK%}PPKE9@javax/rmi/CORBA/Tie.classmPMO@}HiBACWOj4IxߖIY,]]~?8-c3y޾O8PhOUδnH@dD)CCDY>T| NO*d1B9 {ozX4wd=}5E,H#:] He>&ϙU:hP#RS Md2m0r&È t&yՀ3Sx+YHO0 UAV/D=#,喈Dfmӈ]x26#N3]}mFX5JJ,.y czLHvaļߊA+8a3xSr! b$%jb4^}v Bl*zTe'lz-xDdp// Ë푠~eΩw)H ޑ%k2)ԻҞ;JƴrN.pgaf /U 7@v \[ZǸ-2`u:AM:p!i=1<S<'S8,>W16>נPKF='#PKE9@"javax/rmi/CORBA/ValueHandler.classRJ1|Z= Ҁׂ`WąB+=xK5%)IV'˃Gol1 y3I>?N*Pbp6ObM,?DD*4e\$gA+B7#\h+6/ bJXmI-ir/cu=akqN./lJx } C>0a^kSqSz3pwZl6Ͱ{u$"Oxfkm\Jsn[ ܲOBCgd4. ?#G %nD\:UPIfˤ7CM)nǦALӑ\@{ }U \ePK8{8PKE9@$javax/rmi/PortableRemoteObject.class}MO@1&n!PJP=qAѪA7 /rlϢJ=PgEwf}gw-u)ȏCʼnO9P޻A%/s?S 0 Cr< UhLh `a{~ Pb%\'I:T_OX@DXtpHX]֮N*$?Jܝ-{s̹w^ߞ_lcуðv)zkœ$~6JXypJi3EK9R+{!UXm{Rߵr;*RfaZ;cpc #PlHuR 8ᙠ P Cϡ @KadV&׌*ԛYƨ8JheT"QPG$ElޏоjC/Ӌ] QX蛡LqL*qP͛:YdS\> ^N֐SNc4&)D9v.}аYzCPx ̷9?V\,D>4u TdFiPKPKIG@ javax/script/PKPKE9@'javax/script/AbstractScriptEngine.classmoP):9m sf2d&$D1{_J]%m!|,}e ?xm!z!})J r9]s47-C!d@{ l#dAn[1 Y?m l2-{o3$܃8^xF߻Unۺ6Mfڄ\m^zwXs.2 6@8!i_ g8z{LLtc虶*rDm*J/BKGҹB8;CuD&&b}:!AT~V]XclQHޜvQV_G)R!\ ըpDgrcJ9ᆓ͋ 2-V=rt? Wrgء]јJo/HiGc@ ЛD<l~=VG"JcvI3D\@/hN+K46+Ks7py$tY \6p,.,K\-[e䅌*g4eF!TS pc~Gՠ0êMY g᜗ Oa%$`U{3"`PrPK 9=vPKE9@javax/script/Bindings.class;o>#av&FѬIJ ̂}̼̼bvF~Nb^RVjr ;#/X$3G79=AM]&PyA)P"D41'Aj)֚a y%E Vh l1-ƴl[Qjn~ҢT @z m $Ɵvp   8d <@Y^, TFPK=2~PKE9@javax/script/Compilable.class;o>#^v&FIJ ̂}܂̜ĤTvF~Nb^RVjr #{2XI*#X:3_?(51%Za)`5#kErjAIf~^1;'# r2FC`K2 [_Zv!?;z ml +is2PK˺5PKE9@!javax/script/CompiledScript.class}N@gJ(*zj,AFK%%Bx,=x|(lhN?? h [ځIOgA#t瘏 %BFxB"dZ!Ǽ! 9%<0xF.GX! .Epb3Bd|\ZmGjL bJpZv'𜰻/XAhqz'Rnf.C'oJS;?vWMB4a0T;;ʳ#)4Cœ ނx;gPr}OqD9m/VΩ;-A;y=[پ[o1O(P1\,:=,|5r&MFaL0ɝ2/pd}- HȎPlFNRja 2hdQ$l*`cK.D"E,T)PK$.-PKE9@ javax/script/ScriptContext.classu[O@^@_ˋM|ŘI&h l5ؚݭGKR~{fz_p iXPdo2"4Kʍ &Ұ@98ƶh zctGw+  +'?Bc-sO9D`t j-lNaG68ODsIspmꎰ昅Z1=C":c{`Tp>I RŁI/R<5`E>#Wǁw4my^I$S\1Ǟ2j% 1T2□~ǐk;CumxiMOz|4n1 aw)C^u=UmX\!|Ӟ; T8i[ Rgΰ~5GߨzVXI 7U0d raZaӺY4yņ?sbG r8dV_Yג !vQbG Y;SKtd6xMv؎'f^v#9}w22P{tK]nK._^Wv[w m{_x&;!XJ/;]uWKnT|M^"snDq=qtѦ?}Tn3\zo & V .Fpj W"xF%|/F|mc3=S$Ga9HyS)QsȔI`Y`X/`߾fx~PK֊A$PKE9@&javax/script/ScriptEngineFactory.classRN1E%*W'qqcd#7،%CtX[.?x[F$ 9=>' >#'p|D{qT c_xȠDxA}QO9 P% e`ĠQNWFH+}1֔KBO0D^ |.xc|ઝNf¹KPЌyhR/a.rЌ\S*wW4>dpEg~ wrX{#7,Աqg0XsJ_+g$@E*R—m|5X\ӭԭַ [7a4 vr PK٩bPKE9@&javax/script/ScriptEngineManager.classN@gMHJ MҜ8T*J 2pY;Dުԋ>@zqaf'0g-imbn օޥ_Hs'[3Ұ+ IYW^7erc-uثÄ{v8MպK=ph{~ PpAC{aFwm5tyMvƏ@EWI٣+,gtx3M@L?vCKc7>-:=5} B}npOTMQG3jy"`73|%YAPD'=1P#7ďM^xW8"{)r.-g삋/ϙ"^t/x񛔇yw5p@V?W_jQ\ TXea]|99Rb 11CCF^2 0Ubm\DJK1 01J ۔g[1ݨ6(_ ~ X ."!V52 .m.{#aoa[ a `%cl'p|?PK!w_BPKE9@"javax/script/ScriptException.classN@E;; F `cJKJ!< ]|(i9?=_j8 PxV:[|dW;U]5y!x n_3J-zˠ4G- ?6 /t =4^CeUZ\nRo:MU!ױ-n r4Cɣy9Ӕ?Gg1&Cy9b S DPZ[%Rײ1j=%CcN&hfP'#"/ !.*x#LJ $74 -  m :JL$]Ye&-1a #yHu2ZHӰZx9!eA!+NU`Caq.L<'{NetPK>PKE9@!javax/script/SimpleBindings.classTKSAل, 0!$HE%L&Ih?ʲg,8lO_3RT(f`uK)j]~)CwP4U(/iْ!F`ά}t@vAK`tzڨSzQ#ZYT>1d-ޡ.شpPӔwj=cXEW<>B&e M//hMX炽yע@OYA\- maAG^5L(*Qp:҅&t? ^Gej轃ЗNM#(]1u&Nh^5oc1ƍyRVn({mEQ-ޤ< rW`"3 ^a=.G|xU#{O 6&aR(IӁ!c3*r2#,̩a^3^-$1fc9Ðo -%T2~R2Z]e,*kƎ4t6S##QUm rbr*>]M+䪂m;0ҁ<+>!WdkCl#xa[nXQ{}# 4=͔,)PKW3PKIG@javax/security/PKPKIG@javax/security/auth/PKPKE9@(javax/security/auth/AuthPermission.classJ@jkS "z*z "Tzƥ]I$E'CIH+avvow?>\"x3Zo(Q2&lž؍T@Ksh,ϵJFɀ`ߦE MV[[JC1J$$t4@heK;p?RTscZzn?-t${ g =OdY xwNޱ6+ <49V6U*sjhBD&Svz?PKPKE9@0javax/security/auth/DestroyFailedException.classO=O0➡~ZEGƒfwzf]D0yo^]Ŗ!8c-HD*<ՃP1עĩѡPC$r{(2ԍh >`nv-+q?8J|?f(vFJ2aO/ Jw+iI2ahujmzklgX.(.R%3S~P'eR_w.6LDWMD*)R'0$WmQ'~ l9lL..OoPKPKE9@!javax/security/auth/Subject.classVYSAIH >r$ (bJ˲(QB@f CjXU[|'|,{f5\;=O @`T*I)ʦƌd'y|Je BzAJBjֶZVL$}J5TflBb!w26?S-ʒr(! me8a:VG"eLA&FSjϱ*arn̒vј*3IIo2~tIV#K\YW6֬i`e ..=^J /`)kҋ[b -lN캻ekE`.  "0+z~.3TaJoY 99h]dKh8C-ߊyfs2lQ5'znė[kȆ(J6bJ 5k[uex[+s٭Լ geeI^WX0r_>O@~"Z$f5DsU8$Ve$Эx,O}W'pՈ5".Jb]f",}g)o 8MDXSъw;L#|(1_~e74&MldlIu^S"+W2n7g7f!㾿-PKYwǏ PKE9@/javax/security/auth/SubjectDomainCombiner.classJ@ƿIkjޤ"BSPҋm\64)Vz<>8RZݙ7pMxvҋC8"FH/ zBR M DtvnD:B\* Zv5I׃GYD%(rV^puZ2$TݦUg|qmq@DŽL/-!H>]DRkDadB-lTŽeO8Kġ'Uri#/(!`'&ΰwƫ;o10Ƕa` lWRPn3̥nia0l Xh>VմRVPKlhPKIG@javax/security/auth/callback/PKPKE9@+javax/security/auth/callback/Callback.class;o>#vv&FլIJ Ң̒JҒ Ĝl}g(AT?'1/]?)+5+8(9-3'ZX$PK%_k~PKE9@2javax/security/auth/callback/CallbackHandler.class@-:#!1X !XPi«Yx%{rr{~`:{q'+D>s!|Z&x*bji{WR'_AkE(NR @?nP"2~aiy?qsd$Tc7Um!t6eBEFY<PK<PKE9@1javax/security/auth/callback/ChoiceCallback.classRMo@}q hBI ".AH‡Ji,׮~8!qk k̛x|`[ :3ơ;<=oݷNoHWԂPSy9:ndU8CJ| 6Hc CF';gK. Ƣ"WQʋH$ A@<-T c ;D;=%yfș8X? P&؋'£!2Q2Zv'WFMON*IfQWapt+ٝ׳˼s˹ Jtj'XdC2 {_%:Z7PK IdPKE9@7javax/security/auth/callback/ConfirmationCallback.classS[S@>"-&r Wo808J´X-K ISM>3>QM_Z`O׆eoАUU͔ DsKc0Otw<2gk)؅2v!ɨ{d4~(m,09ÚzJ2:!C]:JXj:CSSy2LV|Re=V3e ƐLN<*䙚̾Z\nAāÅhą7W Jk԰vV𫸒(qf̜s=ϷwX2a0o=:=-ku[:& SZn9ݴ7V&b *]&<01ΰ/;mrOdyP3D+H $H1DJ:ʶ8[ ] K:FQu-; Ց={mkெֆGDaH5:Ww.C;+Muq=u(&jD걦;4Vc0cős} _|!@:33` fwɅJPL6,w0ʓe]@1nÞh쾆42C3F, ͜mq/SlpbYotB_PKerPKE9@3javax/security/auth/callback/PasswordCallback.classn@\\zOroA0 *bc*HA];Jv5vZXU%}>ĽD 93g ąCxv(N?X/E D(4ApQ&,ďD yTJ{56'B0j$a6W<1MTf:9:ʼ4 GNlcFzۨfjX2gnܱ6 \~*G5ympX lyy^&X`whY6:LV0ng4*Ys"fU7C? d\wqdg*yd{\J>ģ|mS\`g"^foPK QPKE9@4javax/security/auth/callback/TextInputCallback.class[/AUu]x-xH$ Jߧk԰ݕOœăCU%̜s~2o/d`ؼⷼcRYe7:mpAPK\^ 3PKE9@5javax/security/auth/callback/TextOutputCallback.classQMO@ ]J+ +U%R%' 獻 5~āI {;7/|S@'a*}\;<~rS6Jy#r"p CmBJLԙD/oM(? Ki'qE"ʥő9v=C`m0*Vr;71:UpkO( K5+,L s3|~QC/Қ ' zx]wĝGޛ(1'#fJ^YnܛX?\OzR]1v* پ?d]Ce[z6|\P}" y u$j* iYdéz 5P&dwUVZC~8F4$i$]C y&rdu66oz%@.U`=k~'1s?XhB k'ӨqZ=jBc4PKwRPKIG@javax/security/auth/kerberos/PKPKE9@7javax/security/auth/kerberos/DelegationPermission.classQN@MB !K@Q` eBHA/,8t#௨(> gG)ٝݛ}~8FA=zrdgWe}fM:#rj3$BضչJ8M9c _0Ԅ)G:{~U4rh*񽮡: #}MdbZӏl YIǜNT#kPKE9@.javax/security/auth/kerberos/KerberosKey.classTKO@IH )o»JB! R  J8`0vdoO=S{//Uk+)|c￾|PFCsF5e[-yPʮh'gu 0d} ᶛ o ONZrz5Ug:{p؞䶬q%~N.~ }L۔f=5mlrxYj S)0 bY2 :7d0 (m ʟ䳄9!-HBW$WL(|p"0,a,W$ ҁ3$C< {Li 9y uYENE"=pNG"/dcr&+rF"8"ڵHdAPK57vPKE9@4javax/security/auth/kerberos/KerberosPrincipal.classR]OA=--BK/AAmhqfiL nwv}22ޙn`mk/3ܯOE͡E /MtEZl49wH3,^<^EY雎$w'uE +*ŕ)՚/;vhZvj30a{Ð{a0\ư:vRPH=Sbo<'+\5X0dIOf*U ^``=l0eEv4T Ku6tx* E^@NTPRCl_6Pb2M`.vh] bQj4QI8Ha)3<^ \HE7x.^Ne߅tZ7}.tf9ܡ4rզɺ{dvbn/2kZf{0!]0E}<u/k5Vcxxy,rcjdrnNoPKXPKE9@1javax/security/auth/kerberos/KerberosTicket.class[S1OJ*Q҂ܽ/Vu}Zv#]&wO~(ǓvtNN/9$_؊A̱yj>Je,G(|c" @D t pLx{pL-V3aCcJ`XS}ϩ$2Lۡ~Ǚk\׿%df@3fͶ1?#]l&HB: 4cM#FSPYwo{XSWJ]SJnaE- y%JU-yG{LYD). EO~ ^99Ԯ(:GQTea ,TU)@*]787ƊcVq 瘇&ѲC]zV`brR>E^,^> jqnuɹP>*BK˪`~"v<~fr[]Du,fNjyնՈ{LQ15*K̯b%:^y*;W1LObV,bІbĶGOb< n|E.l[ ^(Hunf\ P5I5QnB݁P05U1TmRK5&{Љ;L- zbRp 8&+w4*؋RCT!yKK΂ѐӒs0ߐג !ВԐԒ!%WBvHK>G ;Z1<%>אwd&D*fzp~`lIFj;.WZٛ%Vj"& ?jB*i/ Zф "C t ]4M+A+4gՄۙtD0ȃVLtlT(l`O%ƺ6\J?v!=/ra28n߰ڙ$rY o;|8Zg惕10s/{PK | PKE9@7javax/security/auth/login/AccountExpiredException.classN0?iPht&TP"kF\ ńP͆*w XEZWJ3yIE8/JeFBj1U\,,T'n斠;L$h`&"v*x,_B?i.:iY>aZNf.WWNTq'&bhƢЮ9Cߍ 0)BtwYMQ^Rhg~קNcmp/nS ag?N(Fƚ@M;0MŇkB%vYs[PK4&PKE9@8javax/security/auth/login/AccountNotFoundException.classN0?iPhtbAEH)RM((uXLH <8 ?>:X_ȴ,}ᢴsLi~vdtvJUFGzr? kau& ᝙5l7QG(-GTbKvbROD\\%C;W ;BlYMUeǦ,R9TnɦS}p/ "QIiW_6|u.*4zxPka뼼>=F ^&"NjSPj}}I)e}w"svJi&*P|XEa< D3zmG iCix38}~ra'}Jj1~9c(wsa$*5\TGlEm\80DRno >(A(:4xkQBQ~)3sHcH#[t-" nH;gȪXc?6h2Zfjb-31Ez6fQP>o6X E*mŒ<10nG,XT-qGoݮ?nW PKa3PKE9@5javax/security/auth/login/AppConfigurationEntry.classR]OA=QAE*)qب)P«a26>?xgH$id޽g9_Z'?H;yl}Rofdnejkdf\Yn3ZX#uhRvNx+A5j)C#ml&u]6CQBwȡ̐t[jv]Ef+7}Ŭ=m]7׎!nR1dtc]c UaG>'gB#.?%gs•C+޽#=32f*uDKsXkd(ZQ$ ̞\8+RC ?R5K1WWJ2Gk"h7`3 Q$x1GT.>bxHG/ ljҰKUn\۹'}zϒu)[PKܶ`PKE9@8javax/security/auth/login/Configuration$Parameters.classK @Dk$& s Wi M5 {6am>yox MlL]C7nc*y_;ܩl;WSusd_ y{+U"|_rۯ6:Us7׃DnfLG?) EDJ{0c KXNmX#7Y2b['S1=dؒ<cR}7fP5C3ϴ0x<tBըlw*n+k?E.`QT,r"+Z~{LRL!c&X g %JPKzPKE9@0javax/security/auth/login/ConfigurationSpi.classP]KA=WW-4נ7hW#^ _zqfeY==Q]7q8r_ߞ_YBН{ *HvK!7Qj#0 PO"& xv'|3"xVf 5_u܍H~h$N돦zA8Q OԹrqvIj:7NJMZL a@ t|k}_sXJ0cGNr(s,Mlqd*yFkO})Z(`YPK=(PKE9@3javax/security/auth/login/CredentialException.classO=O0zp~Q,Ēe^e_팗U49*Q.slUc zKG]+ C+=3j*AC7SZOiĤ E9F)v <ײ[x)tG(] " a.ܰ_]dT&wM>sg1*PDƔqbF>}ƫo'/EY y1_|4fugy}PKB:Jb PKE9@:javax/security/auth/login/CredentialExpiredException.classJ1ƿۮj^[4EDROJ6l#kٲ>'CtoRso23_ Qc~+QL +,OC#gR[%QPD.uod04V;0|&#ԱBMv|,^`8ygB|lf2D0|Pn_:^\߱i :X9aZNf&6 np}szp~Q,Ŋ/d^e_휗U4 UYU.t!ݬfVMj&AC7SZOSiĴ E9FIv R[t1,i ɸM.Gʍ>5{yt٘"Nozl} N׈MC/>^3< PKqv PKE9@,javax/security/auth/login/LoginContext.classn@ƿI㤄iB)J !pAE\,re.c#g]Gmā(j78,y=3ff׿*J'T ݁X/HD}3zQPWQ&,X7a};&TPgFsXCBЗAW e/:5̠^9L;*O=@:/C+3-^XT -SS^. !acb \'w 덌"< d<ΤM؟n'Mm|P$.kxD-Mbj}G6[ cs_Q[j(}BkxWeA%TyV,jl=a_g~gkRbToˬ@Mߎ-0@sa!>ubf6"ۄwVOn{PK -V[PKIG@javax/security/auth/x500/PKPKE9@,javax/security/auth/x500/X500Principal.class_OA,-VX"nQق@HSJLxMleJL|wf@/s3_a_KjL{'eX4?NC#0,{M;Ms~j5< yY\mmKGaB;0ty_+oWF+5z r9r۷RH3啵rAZzp0iT9m#6 r`cY`aPE8V?[G[i5}.Tb;  b nZYmmՖ=%onULXє,q#OԎv2M{4':&FAj:iU~FGB7a\cdZw֮P_],۱J! SH#C=jRH~> e=KߑZ&h$ǤZU,`&b2!!{a7M*|ЃxBvRQxE9R4;`L+F`@  ,:9gE8&;9u|k tuү L:`Ec˒1kUePKtiSPKE9@4javax/security/auth/x500/X500PrivateCredential.classRnA}m,g3 91N$Rdąa"ĭ=nXj8 G!{& q^uU߾]9£#1P##s?n4wlh5F(P ,ZQ9P"lf)=CKBiOE<%'q 66; 9i3IBN[BkЕe1[ !_ ǎoK ='sFo79A7BZFp6*̻ Q׍BIW{Qoeaq'i1완 0o]7r{0ҡ|j#q;` "mw3l"@q+_amkg{+`bŋ2 .'/y/\&Xu1[{*^Eie'[,aws3wʼL ܜ\dnrSs=y۝PK)PKIG@javax/security/cert/PKPKE9@%javax/security/cert/Certificate.classMO@'iR>ChANZ" iYEFu?JcB"@aggr1F(_;J&F;_*c}^*B~(?m^)i ]iG TPDytMG$n*s."b)†0:=DǶuP('({I~on::.f ;#l: E=KꎰUZ^ n <ܽw{ C^Ě/O\*c@j)b1^KhuYҿ\_jB^24ғ)C8**A-413]a̍务RSa% CԻx.XCe%L}2$2R]i-̹]2˜:N̈/z0]6]bgޫOCo>j^PKOu PKE9@.javax/security/cert/CertificateException.classO=O0F_e%̹ːʥFG8.˜2N̈x0.[k63K'7Em{^PKYB PKE9@9javax/security/cert/CertificateNotYetValidException.classO=O0? 1=X* Ϥ6|@AݫL9,͝4zg"KU(sЈRPNd[h"`h'i,璡SoԌ<} y.)i߭3Z2DҙQplj;aGG12^8f[K&o B// fml;|PKKPKE9@5javax/security/cert/CertificateParsingException.classO=O0F)NW G?0lsQLj*3aݸo]dTF f3ct (c81#n`ٷX!,īμ֘Ơ޼4fugnx}PKO PKE9@)javax/security/cert/X509Certificate.classSOATKoEEDĄRL4hx^cz((ؐao曙/Ga픟s/~BiۭwtZ0\GBbؖrٍ;1.b D3!E4b-3Od°޸Ae)D_Z<b1}2<2x#;I%:*cE)y(h0,]Du>2GZBn2 &R5QQ2 2>m^$yҚ9ntfyiTڴV %TbH\'a*_|fGiU晦&\IsΆE=1 n 3o g}cչY3UjB.hO.:{ip!ghW DoCB':^~`띀*ղbj-%Pߥn{IܴVJձowp l69N k65(Ci/PK;C8wPKE9@+javax/security/sasl/AuthorizeCallback.classRN@=<\BhҼ}QZ&U%R]"%['XJ,> qgbrf|{Ι{Kxgb؞Sۉ; D<򜣩<yCe(V1W3 *'B=yƇdњƎέ5C՝GT("3d;( "V!p+}}z2O J7>=j,#.5! Ny3#TJ\ji*qι-űF2fZt[=:#%)݅^0 ]Uu4FEeB606VPsnQGy*t5*>:U dž;՜&jƭ8cc7zrc e#U/yB|W%4ƌ[Xxm6iXlk; )-Mi)6M5U18+9nqT<1 (lZoٵ $\yJ33'Էe?"p[e:z̀TQW7U^V*#,N`:~@AI&p#J;Nir ,j&'͍RI%&p}½=U+nT+fPQXqWYø]׶^nQM`@*zJpR3V}Bժvuǐm7G!{i`ɫ+nжPP'jUVW%x< ]ZN /h *:jM 7vЕx<Qk3|}{1]1,mP7+Ü}2/G` 7)EQU!g~DPf1Ui(!c曗e۴CVrImEobEͼK++9'`Yauﯫ+W_趱ي0-hKC6Q#={26TBg-z =0"*Ź܋q{1c,<4%xqֱ_a(%;UHQPK PKE9@$javax/security/sasl/SaslClient.classuPMO1}Ed?ԓ7 ă2YJJw"5q(&kơϷw88˩4Qn[i磣!/P8&_8olYjJ׳b"c='TT:ꌤdBV+4֠5CrwQvғ7[N.Q&h0GaK (Λ?VX6kGbWfem)ۉ&&DEn]_FJ(MQy.rC鿢- >#+ErkJp\4īdY!;J-qn00!pz먠(r7Pyl-lfwBPKCܽPKE9@'javax/security/sasl/SaslException.classPMO@m)((_g7B41!zp_l[ğă?e|4DC=7vft??U~ S8#*WK_>%* K(0 ܭ/*T%90ѽ,v ա m8z,d #_9gB2W1,}fx %Z]gl2ts4?&㹎M)%0GQ}yJwbhs ;P-щSgԽ^ 8(S-a;T++]Fϩ;VZ2AU۝2A-צimW j!ܰ7PKoN|2KPKE9@$javax/security/sasl/SaslServer.classuN0Eǥ4% 4Ffh #DUrʠi3A³8}cd8Cs?0p/'FL;?wXXռAtb4gI%^.=zQJhSPτN<%N>Q)#/'s1]e'h->RmExΠNEz2s e" [r!: sjvU% Kl֗69mhtK?:ڻt'PK6PKE9@+javax/security/sasl/SaslServerFactory.classRNAAde}Ż&'f0^ăa  %!𣌳bİp`ꚪo P8Є2c[f2ؗmY@JCi"{VS29^ۅ.vVI{u&w.\TdLԓ7>ֲ|i@x=U#nv&FIJ Ҽ̔L}"ײԼԼ"vFjļt}v6FqhiIf>Fda@- J>g'Zk12p%eup݌ @ #}  'dbPKjPKE9@!javax/sound/midi/Instrument.classSKO@+TDIncx0@e1m1d2n1h*zy|36SHŝwvG5lHHi*L"Uք9u]B, kR3^QgvMc "C Ngv]x—:J8co9% [cj0N"Ķn%6D!!俷p~K%M74BvUM3oE X$)c3^.3O`e3I܍0bԲ1 jZBp٘ םe=EMc=af^Shq grzPKPIPKE9@/javax/sound/midi/InvalidMidiDataException.classO=O0}NB[ Fl )uwJ BT ݽzp80xXyQTE{ˆE*_*t!r =? Bie.Z*2Md(&d%E*(͛oԜ8NC~ȔJOnZvП.C4*2N=Xut9C8!#laյ#+ؠY 7 y1z̻μ4f˺v3w PK]_: PKE9@(javax/sound/midi/MetaEventListener.class;o>#nv&FIJ Ҽ̔L}ԒDײԼԼ"vF:ļt}v6FqhiIf>F\1 >X-M-.NLO cd /-JNuIedð^d.Ff fvH21pPKM?PKE9@"javax/sound/midi/MetaMessage.classRMO@}cPASPUj(,%Q.9mU(DzhOz*̮i{ٙyv=8s1WAAp*hK-2Pz(EQ Y-BidZ$+tBJ~CpF@VbE< ,i,T"?/rW[i$)Œ2³ֿ>aD NODq0woXZd|H3JNh$aйvfUɤ ĕH^jŦ=<'4)L&"V/*G)"^+wIl'mX@Ǚ{ r5Xޣ~e:V<*ǒ_ُ,# .} }3hL l1YYe9[=j6˛S>/m_Z[PKܹmPKE9@"javax/sound/midi/MidiChannel.classmQN@EEob@ML[-k)YvM5?ʸD}سsv̜;\쿸ZȝFvKɅYUp/C0A  q 룊ʁI AyU yB⽘k=L >U mi%MR.84C3E9X$ lf)j>-h4F%E3`n2`n2[K0r7qkyeW۹Kxrs~ lC'PKb?VPKE9@!javax/sound/midi/MidiDevice.classRN@=< *>- ؄ƍpWHƔ)·(*Qsܹ3o/(%a(>C{d)o ;VOtՠ9 'eiڲk5O b)0W3,ty0P*W꿈4!Ke {t.WFƐo}[*p|u<ٹ'MCS!Y L䜺9Uyn$Ek]gȄµBlO#~N~픪!yY 1&:|":.TS}`zfjy¥d?HDjRr̵4j'i q~tbC_ &2` UE ([HZac#ؤu[FkɀpCfN8ά@ua$J-}ymxwŝTS wgj.cGgyw>İQ6K4`"Ml!qg.xYi1z[Ӓ35Fȣ c3-DW;؍+~GZ^)`{l/PK\PKE9@%javax/sound/midi/MidiFileFormat.classUKSA$@Bx#ț+Ady{r` $Sanj3?RKOVyogL6"ul?hIc4wn^ӰzU~#',sܪ))h -ӮGs^^{'XQ߮cץiSj%ܮ3Fɲu'5PPU\K] cX `FQ⻶-t>dNqy"4A(yQ-r,ZNɴNMWxv3Qg23,B/LwXź/6T2-Ьe=:cQMpQYmߐ+J=ry6[0k# ܼU-,aX/Z?69 a2quԸ+/=LSȴsz:aD5XP:6aߍg8vn{OHX"4o&(`iCQ&*>%q`i0,3[N#T1ᜠq; Ii}PJS4|@*mbU*ޞ沑e=m!}@G ;-)#4e/!tG"=Fj]s9DO׹ƾ 9^OMԖOur|G*ޚc emPK%tRPKE9@"javax/sound/midi/MidiMessage.classQn@=qbn)!%a`@ ɅEQ7]MQ:k؉Q,`ĂglTB,f3#:U3u43ׁs5\A"DTG`Ov?RF*9t 4)^ Y}7JnU/+;͍+:]6;/)9^,os%NUXT+(ܪC{PK8PKE9@!javax/sound/midi/MidiSystem.classUV@S D+rZ@#x4.|Ў:ڦ5IM>kQ.$)6}H9{sΞɟ~X cp+5hEQ/}zBaPe3?p$ gxԪY~[玃ֿxM!ڴ*J~k"qzSeϝ`8Y)Xז#p1Y+ 53 T.2esop7DoTEέNbV4)2$sFt.v*_YKGS3jc՚9*wPð枱j#8Ÿ*wisaJ3hS4C>bIR~ \Թ0Քa)V;V!-wOA+Q7nyi^ Uex߲?2,wuM W;o[a-wз%{imMDq,- kQI 1۵jx(G̑OGy Κώh.7fi32\Uˉ>13tesЅ{{/uпWAִN:m.K͐iY+Y4 ۝))LPKu,w PKE9@/javax/sound/midi/MidiUnavailableException.classON@ML ]ѡ  اp9#ǎ[TH|ػXPH\1ݽϯ4gK1+Ncx4\ՙdfR&G\dLO_j+B;[4 yFڷK ܧlSxF O~5nHsvsP/PK{T+PKE9@javax/sound/midi/Receiver.class;o>#nv&FɬIJ Ҽ̔L̲"vF~Nb^RVjr #krN~q*#f#Kqj^ #A@781= +8(9-3fH##D`Z( gPK]ɘPKE9@javax/sound/midi/Sequence.classS[OAf ԴRi}0vR]K?FL|0'_`fz݊/9sN2)˴mF5}Ϋ<]b\fh,*QNԨO]Ӱj8LEW [*/3jof oὣâ Uy4ʯ/lSw<9=E3`^Ò`:"-AB钏M\n[;(wvT[_jBt#0A :y=6kVY B0K <7SYez31QB-.pPuN8N8@WSkbz -S !ЧY:LG`,6:RLgmx3Hwsv83!K B>tNJx%pO*rW᪄v(rQm'R0}mҝwxLv_նRiԢ:3 ]9lr6:v>P^v!PHPKPJPKE9@)javax/sound/midi/Sequencer$SyncMode.classn@uNMMڤJaJTApD&rUuTN\@kB3;;7;c'xP°w\:h6&ƅ7>;&,CY$9wcU;h#/Ԏuj&A?:;m3x^2M}Ȑ5IDr xAEaޝ_y8p>{: =OHi_7ُC/8k2hh ] zK'|,hvhSթMEwU,AR;M}YR6]=^HeЬ ;Qģtƿ uKE]̘Ԫh_ k;!+ +OTPF`U Zy"Cv{FVrG_PFem)% ؑMܢ nNyḃF7rPqW2vq/e<$˖2%)=/*>ْ6q'PKQK#~PKE9@ javax/sound/midi/Sequencer.classkS1OP_"lQ)zJv3$uvRO3ۧysrI?` 6p}ZGI)*O~,o=!F`H'C}8tnYǯV Ւ$vι~LHH S_ \'0sV;dHG`Y¶P`e9,s]vr10?q{㢐 FD|Eaoƨ% R q=SCQpn̮eLTb ע3|`WGDPT٩ƝuGPN9zbXlӦ6N)eOpgT-MV9Y/*ɛ]-tu=:֘T!N=%Q< oeAoK s9nO|scGt3q >o~0!a1K0a8i)l8m5jy]wrn޲ w ޅ{m 4\KcxbԎs y=j1VU`0mbٲ -syMf PD`O/PKm .PKE9@#javax/sound/midi/ShortMessage.classnJ$m6gHJi(Rg8v ą&Vk:(q+.ya?p+W-L04"֬_55%3M F+\sKa=9V\ m!H}%%<6 Wq#"#&m4Q;xo,I4h1,nz wj;F rUU+>[Ϟ=ì:($ sE{]Pl|FF[2) ט)3meg\|IF;*ze-ryE.~dA-:+S2v|EgFCkeѨsqyCSֿ#/=ô;2IG*wTR(o0Jfs5`StM3f3kyi>h|lƜ %wCbft}ăi5c~# Al,Q46E7\Z:Pcgx Z0#?*MۨVFXS{жw_ASe?\nՂPNi>I:L66CÔA Z^xƣoox xcx7x{A4>_5>>qx_p5'<ީq&_)*{P :Go'zguFӥτbU'$.*e*efفkkPT^_ݠ[jC.1cBw7R} *]P;xP4lRwd4Ӫ(5p ,"i~[PKfPKE9@ javax/sound/midi/Soundbank.classN0ihCH"0dEHHTDbar+4]ij1<lJ3 ' qNUe]*kT§s9vƾ-B!4ũV3'鴓(] #h̪d5l&\ۍ&vp0[H!etĞn~$RWaBnlpTɵZ}AϽkap{q(ău}Q}#9a PK PKE9@(javax/sound/midi/SoundbankResource.classSN@=S ( Vc-1nbJ!W2qQ;<ąM:sϹNAh ;FٶFCVQRf[vE3+QV͸(߉8t 'iwٯ,9j?#:ork钬Yiۂ쟄ټ˩U3afU8bJKۍxN fܖs+[ z^Qn0O꼋:Tz#3tsG ё0{zqi pN ΘWGpkP=hb7Ͱ~]K\#WztP:ha W^aEљGłbCjd\ _Uְp({v}嘫e7u G#%4O?@@58kliI~ZyPK-'2APKE9@javax/sound/midi/Track.classPMO@m) JA%1k)]cTp|ꬫ 䌐zEwytbi={yS >f}.99,8#^v&FIJ Ҽ̔Lļ̒"vF ļt}FTFf 0FԒ̲"FY M 3a@Ȫ4(_ZꖙOmz }l @W03Щ l '3piN. N PK(XPKE9@"javax/sound/midi/VoiceStatus.class}J@f7N-UlAZ$Ɍ$kY >%)lw. > KъW^FTQYaڇu^=Rfa,2ZTg*l! _*3DIMI^3 ON2ޘ\b3:6&)SY=46(QwC.Tpw%C03M[Յ?.c!cD+=W5БuN}Q1= `45`;}|wPKjPKIG@javax/sound/midi/spi/PKPKE9@-javax/sound/midi/spi/MidiDeviceProvider.classRJP=օnA*B>@qWbRrJpQDTY̙99s M̛(VoE*(H|׾S9ٗrIʕ 0Ŷ'k}+PQw Z`4WZ(\AJQrזh{0 ᝋP4.&eƯl%aO?-'UItuo\SnY: БJ#YJeD4a?s?T<{ ~9\ٌسGN 82r}+) `0! 3ϯucA{9U3j7wʲ1g=լ$f0;PK,soPKE9@)javax/sound/midi/spi/MidiFileReader.classRN@=HQ^ cL@'2ѸQIHPQC;!eeJ-W&.?x[!@qzp= 1Wrv\ #} qLHM~hI0$.VaP3įP z|"͠2a=d|}ops'*!l`F"ɣNEX#w*_6mGU%nEaeߌ?9y6,5 7'J4$cIBXk6ʗ _FZA-u:+Q;Rձ/in)g |0%.GXڼ'Tx-[i^ga~y,}(^GYR-f$Uh c)g|ʍ3^ZjVc=v YyÚq*++PKC<PKE9@*javax/sound/midi/spi/SoundbankReader.classQMO1}UDA1`MGBJʽ6X]d'qv5 03My{yp1ScFwc ؑ“ +/7 S9c=tzqg}[0so뇾N9( utpj$ "Po_ ̠ODxr 7=l,rSL5;zq"$?7C)F.]~A ,V%}&vS?&DYMG\I,!tݦ]|*+*ZUUB ]W2ҨJMR .P[lϱ߰}#Qn5Ey˜v)P#%(J-iNԪqFjTgx'3<4hpc྽i๳O>oPK B6PKE9@)javax/sound/sampled/AudioFileFormat.classTN@=Ĥ ᖆ !I)`"!E2 D*-d;rT9}h*Џ:RpU);3soa5aᄟF-;]Gmَ2H3LKGn9<GغnJfq+lқ^KB69TM,oCCG0,;ܷ9RcPII_eh$")> bicP,Y+ pf` z,3|?_u 0䛮+Mz C-i@t',sNH$WB J3yZ c ʮcBMYҥURDM2}ɜ"i$"o涊tGQ:R( HqG|5xULRڴԧXY3Dj'ős 0YN89OCKHΊBBCuhQUP6H%WU&҈\ȑ dPKj)|PKE9@.javax/sound/sampled/AudioFormat$Encoding.classn@uή mҦJF\ VHQhQ"W+* H\<bv"97;wp<i1kwS hƓ ]/8PѶσcpr"t_3t e_^18#ū9xSi ]Qe%V7Pɴ+j2 0MDO|A1Gsgy//4罍H^(`ԋI衤N4>~90CR;> ~ad0ʹ"G4^6y~C7 rLmmw {Q{EU)֤Xb:x'zFRlH_9h/h-SrdRap'{9amI/dD`f7HpZ#ץﰵj*kEpb31c)דxm[5v ̩dl\mh aW; Bxɦ8 \njmivo1sV.gk+ñ:N>zݨ9uЙGTaU0èQ  9G0C GY`+* L9n8sW-mLHvS*BOh0/ rnefE#Q.*(l ɵ'IϠ  HT *jk2' f1QoqTH@"J~>ui^pHF`A :KRD.r72 DjMz"W`EnT<.䤼m@j^1%Og'rw])Q Μ3=lWZąFqHÁ ihNp KS8 &lSC=MD(}sflc<"ԬS%CREJ"h;wsLpā 4@(MzWϯx;lžQ̨a㧜ḡz,J 6H OK-zɌH֙8'XO*4grDr + ,DH7Ix=朠;O/A30}T3oֵJ/ő6-fMl )݃CBްZK6:mF`+"@DTtmEEQ%ڪl֭:{PKPKE9@%javax/sound/sampled/AudioSystem.classW[WF\L)@K@$ 5vց4&mSa+DH>LCsvv,K&pڙfۿ 6~"0s.]JWIC!]Tr)W-)ZaQt3 sdYRϒrdvpx$es}'R*wC #g)JYjDwyhI>Z{4K1grTOF(Æ$!-7cըV*nʥtÌ;dՋSY?N43׊RD^쾔MV" Mj9R5 .KZ73fi>0`u{=Tda="'B[t(ԥ`T:4N5 w?tZwCkɨEg z%gko1h(|2Di1Ja*̥(|$P|g®;ʕ/Wa gHNpf|ȓpXi Cq]y”VՋdJG =V B?Kӗs&>ae`Ϸv ׇI:=A~Zg~<4x/B4gF[k:PÍ-iӁiY E6tuzS~ 0=g6oUz'tǕt:BK* aH1xl$z~v2='g suX5mY!"]EU ]~t4_+FC|hhKdܖz,L_1$RY)`Kǎ[,:}SՑEX`K^3LwnQ3Lz`T34$%(EЇY|@CqkŸM^r>F9`I1J(cP(5P(e7i[ƅ򆰌o=M8X̼AƆAV0#_IlûՁDk׶7 0:1Ƭ%,VnΉ}w;=#Wc1Yc#ۃX[>wkdpy`QmKpYб@gDbjիzU CرLi\ExH;*FR\m4yۢV;ZOA8Ly ˞:04$#X@ oL˜;J!ܰGNGJ:,{OI)]W2lu8$4C22 ҫ ꀢzB=x@~ yo&G(LeOH|lګIO{tBi߇љFiXWPKouPKE9@(javax/sound/sampled/BooleanControl.classSn@=8vR zҒIU0KPBBTۦYWT|][MSZwgΙsfv.~Ŧ q$NřCbq|Ⱦ> )T3TI.l$^F 8|'{g͂Ճo'ѭwv3"r)!"asJ]8<<@I(CtD8KW?&TS ԧ!-yI.a5IAjƜٮ)0;I;lXuuD0So!%욹b;F򣯏nrϵ$I)52vNؚrhvы*r62ygQ; wt8%VRfq(8=;2WhL kE[b;QWͲǘÊqXJёeƉ;X4vLXƪ(h,ֲ7&Ϲ19ecp b'KxlߡlZsʕi?Ņ#ɏe8Zuyla(Br8,&69ʹ?A37;^΍*cMg(4b`@K 7EecumUY#4vӰP^ko "PK3[XPKE9@&javax/sound/sampled/Control$Type.classJ@Iެb/jUT\"F\RqS E-]C&5I ] .|J</ 3_^`;agNs9>b5,ӵ-cs?qDK39Ԯ{cwb纩 jvmk]h"H"tj6 {`ȷ>7e$HwZSǒK3n8!ϩ ͐qg${p-P}j[3/.u>(<6MS ;pd-$.w"Fq3 y'z(X"+@i%X*2R=G7`Ny1'C!ƪ(P8$2J#WF${ ML*X:6ȧ PKzBxPKE9@!javax/sound/sampled/Control.classPJ@}֪* oRRKv)$iѿғ4' ;o߼||~B͂A8xp^,&@v( ,.Fc, p+?%%T=FEy؄ӥlҗQWItz"5ϒfDŽel.KB}Hk$$4p 䝯r2B72WJF@ı-W9.WS`n1f4gX{OuZjp8VfjG e [d6)nzqz8 502ڬU PKZ43PKE9@'javax/sound/sampled/DataLine$Info.classT]oA=|Y j[T@-Z4њ&$ }qZv~4>GRe(sf9ܹ3` X kGT<'[]Ѫ>K[jvI ʰj ) iKY.;.jݤ}=WKM\|$Nyw4=%j 1(ޜm;;~%L9&w'1ltJc>bH{`ȝs) ۗhxM庬j?[ f:Iti듉aOktbiPK~x X:PKE9@*javax/sound/sampled/EnumControl$Type.classQ]KA=׏U-M2 $6zL!1G]lcYCC?YZ=wΜ{Ν7O!Fދx0}7cәcͶ -WT3+'媊uۃvpmn[%!^;2 HB#d;nbpJ㎄3KRk.m(tQc>\xg훜Y׶έ)-߷ʄ/ G|8_U i%dxUgTO?EuF` ϻl`Fq էEvŨP Ūl1җ͘*B]SE'PK7-lWTPKE9@%javax/sound/sampled/EnumControl.classRJP=Sc~?J+bTpUqSRJ7nۋFҤ!W\~87#Pܙ9sfܼ8 x+Ľ黡1}ٲc8a:4b(#˱cB\V|U3m\[#&Ar "OL]-G6nKzeKDm ) G!fm "qf̙/_<3;z̛uuS{Qໍk[F(6|361}Đi}A> vFbs֒tg %'J_/^.u<'zA*!v + VƑOXMb¶9 (%lcâxvovua¥ b#+p>uJi[V<*յKwyEXP-fg>uD4?<;VڡG]8Q*ӿ|gZP#%V1b!bJi}F뗮T%-J>qT2,PKKH<PKE9@&javax/sound/sampled/FloatControl.classTnA>[bkK ecbH6!AF:f% 1_&|(㙙mSnTrsf?}'!F`-ғNAݧuvirs$uUaSfvcִ,mںMa03lV;`i| Mo[?Au^NF=ў,v>Fp}K6vJ-RmR̎2h+̾x{}THH7 )'x@v<d*R{ϠaZs1^x=">t'^Y\,k'Ama^˦$488M$[#Qs \ID|D1 ߯T2 5O,"C-!2$y%M%$qp'tVÊ0#S@ˈ"4W 7ЊY1yF]A˪l_ ̧fQ,FeF`Re-eEP[2+`2gYe`=d8f״&y<[S/K'mðE ]u٢Zt7=M٣[hEn;ǻXPK?XrPKE9@#javax/sound/sampled/Line$Info.classKO@ϴ@- "FB5.@ؘ.4. 0BMiM['2qGL.f9g`+4 ~ůx;KWt}7`Irk.D;bHω q0UNch҈^m(Wb4tgDANx%D鷹{GC152^`aj$)C+ ^)3C+"VôU :FG힠5ԕ3?bϑLy)(ž@Eh`a7^ N$R`Pa &j'H+)&i-dS$i:gO*:1(w<l(jvmHaVٹ3:ri4JS=Z"i5 ePKbh7PKE9@javax/sound/sampled/Line.classRNAFdQ" $Mr2D>zZّ,Yf6; _QƞA05=U];/O Excj$}W{( p& 놞wK t" $OQyMJ LDHJ& '[|H$-&T$";^j/0pF)(Rq" y$ôA'$PR;X#NJ2](RX X! 5{,yYWB#Y=_ct;w*SJE9E<h%,..iU>Y7NHaîb, vٷʺ=dPK gmPKE9@(javax/sound/sampled/LineEvent$Type.classMo@uSӦIB a B U [9p$ƕ봶8 q3U wfv_xN ޹\N2G'8nBEipJ 8 et Fj z 3iߕ7],SRKrW"T~QXbo[o oPKICL'mPKE9@&javax/sound/sampled/LineListener.class;o>#nv&FIJ Ҽ܂}̼TԼ"vF*ļt}v6FqhiIfkYj^ L #[iAJbI*#. Z5KS2s:-i Ĭ@w3]b1pI&.PK⠀PKE9@2javax/sound/sampled/LineUnavailableException.classO=O0}NB[AP )b)twN$U?8 7ܻw>>?\"1\XuK1_2Ir1*J:[υ!VZU7 ل-2vC=Jhg2"DeWϪd$9kpO~WFݱfhwaqQT+dUyGC8!#lacw x_zćN|nh6b\uF\MW1JVH%ӧ /_qt0X(R6嵾Th> #яG<p-=/T& {ԥ3 oap4x?7~7FO̰:3n1l7@0O.}t{Cѣ'J\@U:e U+a P̱e%]%FnrJ֡?rh^&r a4VF %%[̝%BU\[d^v!sw ϝܣ_,&QPK}KPKE9@javax/sound/sampled/Mixer.classSMO1}Uto?PDĸWNhBzSK.قA?8-" z}鼙N 9,0lt˖k-B!m˶}f)ʐ}pќLȐŰDB"1\D*Α+N~Сdzh I&P: 5"T_1a Moq):nx ¿tRcqb,RB0KM\i#'1RWj0s-#op2"UAwKLV쓂O PK VPKE9@#javax/sound/sampled/Port$Info.classT[S@r/Pi+R@K+Sꐱ"`( &)r<E9{.wi~2^FbHǼ탼XAfw_R1mC0f}5J SBFZfVjyO2ĄV{͐J[FEŦeڦʠd; s`Ч"\WڠԆUĥ6"!1=0F}-*NSvt)s^VdW`hi xlٺv)=בṶvOL@iܥ:D8EdGt-V:o\nYʥ[0>u.V?2~!{00 sL[EC;O)U#5۔ِW&3jCjmZËpG\9ݫqXLӘ(W ŧ-!c2!Wqo IKo襕5@kWr0N$c d}%KLH`bCۂia^n}4TfDЏܜ(k'!##Ro% AS+$ytH|^dL{"<`̋3ؗ+Ca$jf{K&##^v&FIJ Ҽ܂vF~Nb^RVj2P ̼TFҢT dH1#g^^jsNbqqj1;7#,.U<X@6Ff fe&v0 PK\EPKE9@$javax/sound/sampled/ReverbType.classQn@=IIi<ڤHP 6HQڨ vdH\N !X!(Ec!ǹ{g~!Zydv2'+j%T)jTvYأ(*4QZ"s/1f=Bs3Bs+pq&c65RLLdI80PK%%PKE9@(javax/sound/sampled/SourceDataLine.class;o>#Av&FIJ Ҽ܂ҢTĒD̼TvF:ļt}v6FlaX RT4|s,Mw/M, cdrHN-(+fgfd dphP"3'1)'A- kXˋ2Kc׈vZ [fPXz 3>ed`bV`1CX4XMcdL PKDxPKE9@(javax/sound/sampled/TargetDataLine.classPMKA }iW֯JDq'-,|.JGXI#?8lcKG*UڅCX`?ɡ!T_P7r'8;HP\T ]x ԍ"Z}t̡J^6a@it4\}#0ѝ0NMh)6TrqYm9Oܒc}fo+yA,VA|oD{E;|h{BPFEa>M3Rs[VQ?JPmNJ$ Ud넵h~7wV PgKl+[p+;%xfZހyb[fԜd'Lr&`+9\e[I)۸Ñs".F0x|3X~PKF,PKE9@6javax/sound/sampled/spi/FormatConversionProvider.classTMo1}NҤ JJhR ZRTR''k6vݍpBG!f?ZҰٱZdv[m|4vXZڌj"+`Dc(,&CT{ÐmNrm"X*ayT9}G0Tznd0sީtfη>TcyFyF1"WmK5llҹ1DXo"'*N)} "cnh"9Je>J禩W_: bE[xN<|p˰=O3/)N sMWg&;s$ES\H@w>NJJ q ʹa#a?`[dEcf!#\/ddP1.V(Ev6bWj!jGlt9ȠΞ`H+[x&~PKGbPKE9@+javax/sound/sampled/spi/MixerProvider.classRMO1}D/?F5^LLH#pS%..œ?8-zЈüo/Qa:ZN=Ws!B]+ [Bٰk;Wh c!Z,3%R"F qLUzmu`Mֹ:LZ vj̐hNVwK $\bn B&{=_ 'qK7pu1T﫦8fj u ߪ6c9ԝfY^ydmBF{F≜Rd&9)p c0Y=7;"hQʍvGJ[əh ˄)䱊u$?PKmPKIG@ javax/sql/PKPKE9@ javax/sql/CommonDataSource.classmj0Oڹ ڛvK t8u,Ddkټ?D!9 ;^~g|l7alD)72 TؤBYY0g;-BU{,TGj(o{0RaN wZ?4]lKE,CщJ%nF=#v&FŬIJ }<ײԼԼ"vF2ļt},*v6FqhiIf>da9ũ) r>8 ZT_䟜\ZT_Zꖙ Ýz Ӂbd`bVgg`yDŹ@ PK_PKE9@(javax/sql/ConnectionPoolDataSource.class;o>#~v&FIJ }ĒҢTvF:ļt},2v6F)dݹy] % RS&32ih t[32pV$8 ܌ `A}r N>7e[c Xeq w|L ag8< Ab^Z>PK5ruPKE9@javax/sql/DataSource.class;o>#Av&FIJ }ĒҢTvF~Nb^RVjr ;L<( A as~nn~,F<y >pS֌ \ɩ N1;/#(\Yp\Z̼tkL@料t?¥z @/2203012  \@1n HEEAPK9-y]PKE9@ javax/sql/PooledConnection.classuJ@ƿmjSDѣ^ xQ)RCIIw5YC̓CQv||}|ʼn|J,z4&ٝњK8eJϣ)QIiaYsNZ%k_ؑ͡PK]b3PKE9@javax/sql/RowSet.classi[F)IWHҦgCHܦW4V8!MI[XňʒmziOgWw$pwfvgv?KG&{⾝]pJOCGfmT63*)uGu Y,XRp*S݆6gX)x,#yԶk:" S0 X/4m)Hmn}#*ϻ*s)ʌv/Tr!j&Jn3yc`ٔ0YyɅ@bC,۞].YF 9?sL-+CYܭ㲌 Y#)s6k yfqgY s SEv :ۘuӉ<;uIpQSgێKܿyL*2FYT H0- ଚrSAO& i$M)vaLUUev$*7}\ǩky;%ݵȁ6/tiuqa *Pz+I ] )ΌqOq`@u~7{=\vl Jk}"϶3UbBB5m'@5Gko;տu<F (kX w׸H!(ӄ2҆[J>M$A;$G(j:(3¡FgZ+x)qr/Q&INU t'E9nU } ץBgZՕT\Iش%e/xA|eb./(Ѓi~Br>8C0c4F'H$<v-:$mTӘ~1g9Myrsd42 c85NbX$\$$KxgZD\ܟ9_1fbb](;jTac6o-!ԅW SBx]>jFb)N uS?gQ~ZLe]I ky[CY5;dRU)uܝ: 6qq@D'7lmK; :z?PKWlPKE9@javax/sql/RowSetInternal.classePN0-mCZ  B$=*! 'TƁĥ6|X#QBd3;; =K6QEN^˥QC0rjɢSKdl1N0r„пڤ@G8ږ%wV#8/,W uW+m% keV |aɯްU*Y7#N{I2Y0;s%vVGAW'-0} f3cTgdȽ/PKh $PKE9@javax/sql/RowSetListener.class;o>#^v&FIJ Լ"vF~Nb^RVjr ;#8X$3Gߵ,5;87,5AJtzk0Fr E`Y8+8(9-3'Aaz 3`d`bV_.eg`Jsh<7dbPK,,9FPKE9@javax/sql/RowSetMetaData.classeN1On*(;H֕M&ApW t|4>elg ]43̜/Sؐjћ=jVgy!P5Tv!,Khb(X"W|C3͈@@ElNrccrF\)Hh1D L&U\&Ie 㾺b=S-Lx]DT|`2?kk6J+6x`tyF50DǩjR4wEB"J1k$L%S>vBM9EGkҲ8- 9 [1s{̶,dv^6 kTΨy ):dVHȆ8dqm95<;k!{wCͺ96 p PKǘ|8PKE9@javax/sql/RowSetReader.class]N= 0}WAuꪂP[p5HKH5G} ]0,QuQRRaB3"1 B-F߻VFh|#:'bh4'N񗳺Lr)Sh !۩"nh7PKH wPKE9@javax/sql/RowSetWriter.class;o>#v&FIJ Ԓ̒"vF~Nb^RVjr #g9H%$AV]gPo^bf#kErjAIf~^1;'#(8@P]p~iQr[fN*# +@:@(V6 c@d31pPKy PKE9@javax/sql/StatementEvent.classSMO@}((_~7!*//lXғ?8Ec5̼7u׷uTH1!n}%=搎4 B|KO7• xv>FDX E#W F# 042Y>Vl9 ɠ%o!.x|T4wǰ$ egȣ=oǬ .=':w3,'Ph]!'K DvVǾ ԟfʴAcO-u}[`cP4 4eGHYcOy(9s3f` ZD7#v&FIJ ĒԼ2 Y\Z R\ --G_ 39'85AVM֚a bpEEEɥEE \Eɩn9 ݨ2 Ff fz hv9A4P $ PK9emPKE9@javax/sql/XAConnection.classMO @uh6ZJ؞C$JMc3z?&h =_U"k l@N9(sτ@kk}]I{w#{ =M G˯>T&hJp执/) ,8Mm?u̱88uq"W$~@ʨƨj\@PK׊#PKE9@javax/sql/XADataSource.class;o>#~v&FIJ GĒҢTvF~Nb^RVjr ;#Bs~nn~B#zjIs~^Pyf~P9kF.׊Al#Hap\N̼tkL|A薙t O@zbd`bV`0qy,@ ,ƒ,ļ |PKyeKQPKIG@javax/sql/rowset/PKPKE9@!javax/sql/rowset/BaseRowSet.classZ~ 9l0 !3{mu6xm# ٕr@Nr_IIJ4nf$ڑ?~x7o\koT)zF=bηX渭9-mYͩ3jrhU`!fKVt5SZT`*okP5JOd:ZOjkV@I+0'eΠ/j I-hK-sgM Iz;*@٪cijA1m׼G!P -U-e~Ok)z|ڽ;NT&m enP`^F7baHg̜TQ(|5Ψn+<3Av_2hfadSyNjmR`i5:ZjAs4 $:1GtZ+:ggJm79)PPaFr]f2(n \c䊖 f͢z04mvNYfNmD\Nɍ_۲9>_ճv- ׂ#A>H|nJ; 3}l{ܴ]E͚ YtdGv-Rb4[aS6KLy,S:U*:zMuVV1ThpJQ3il6߳qj1Ѐw1`keM"GmVνFS`~r"Ul6ϰwmYj#0ӂ d]hișXNHgJm\_m(/K|e0K#~- 4'6w=hGڵ^Pml)c:fɛCuJ6"Dž $dȫ#$Oˌdg}?o#p4qu_L綪chp>k`a@Fo3`Mf^k+V_v'T+^ǔ )7),M>ij|X vPڴА)<$nS`m_`MyV]Z3-*,6(7{,v^ lNXoTv-."-1D0!#H~V_Pp }5𒋖M83{;ѮᦧpcwDΛBod5+P3-Y`_/|hX}.&_D_%ւ ~h!nğܸzn+`y;G[2qudOo5Ư55l=`X$ab7*P偞U*Qn&!B=oW1ZFRI cc-B-R[a[4FE^12zR#X+!UI!N\'KjBݰr۾ #;z71xg QZ#…qCɬk %Y.E(AG5fG脃,j6m,Kx4P n'6z 4a)`S7/Y:{+xɻ7aE;y~:n.Lu!WǀLuFu T>ru TiTǠzB3DwH}}λ["m4q)4rCNq/G |ƒI`ª0D=H``wغæ lGwaBy2z6/D>>L}->r rdayxr8P<Dg`6 `gel;B(\ x>y&RY鼏~8Zü/E!oa{z?y_pa'v_d$83 ?G(_/UBl<lsIӗ񩆇 ] %*]kt(*@PT#1oȜ@.Ĝ@>c߂wY01ͳ.1{t 5~O}Oغ?O؃  ̅jHf$?K?a#>OtC7"_  %K??_yL ޿~7tޯ^v9f/ ؕ8 TuH??_?s_zPf;dksʤ9SbN3?oPKɯz `;PKE9@#javax/sql/rowset/CachedRowSet.class[WJ`-/r(0TB[ ZY%&ufRr$@3 .Lj}}]_*U.r,BZRiЩ67>3鑄Ǝk f^^@7|F`nWכEۮVW5Y#P@Hԏ!̑ zL8dU>m+C& gWuvþf|ӰuAj5 J~ T6U$=T"H s ]Ob.g(f@`zߡpkط8ҥJ1r6)WHI6s##(w|vl]PV> "nr LTb&"_:cPG=$p%O8 sUmfE`8`ۺ|텽ȧQV^ ɵԕ+92l< ~IrhġƹnQ+ [r̷gA,=l}| tJ3sY]:&))3JM`霅9#%R)-_}?>"kuN@eęKGOp,|ʙl|^iűHøG=# #D'[Jb<+0opF97xƐ#)sBc9'Ȕ&I(2 r:Cd5ȹT>  r9CUPY2,7uap Ռm!w r/OsfAy y $dĆ%2E w۞z֖79emYɱ4ʐiw PKdkPKE9@%javax/sql/rowset/FilteredRowSet.class} @E'qZ+G@6 ?g,rCBxG﬒}蔰V j\2Tmjܰ/j.xr k֯IYn;Μ`>tm eB;M87:>`&ԿcuG2RY9HJrZ-(jFzIbTPKC;<=PKE9@!javax/sql/rowset/JdbcRowSet.classeN@JODDw&nYhMM@y6>e]Lf=瞹zpS%Tڎ$ھޓJMfZ`"TzL˿t#zE3 $ׄLޮ=9׾ c5BMtWK3b"'1 : W@j9&T"]k+9z! kz3:jyOy8>J؅?³C> ȑ&Z9rXi|8ʑsMx7PK(#PKE9@!javax/sql/rowset/JoinRowSet.classuSmS@޳hZV *QK0vh Z6LLj"G9%Mzu2}gn4.zmW 0p^p0Q%UI0<ꏌ C`k. ,%uî!@,+fsA}qB=XnvLv*YN!@nj9"H55{&1~]ZC6.**Cx>r,F`wA{v]ԔUrtౘ: CGLȺFx%YqGKAz‰fyx85wSآڇͤ阅hđov.sUϽƣ$7Às'Fڑ%l> b6*HzX 1^T{S)Ԝ z(2ی}k&|B CEWѯ(~5ſU\HMnzl!s!qن'9)젒 gy/sWC4ޛSfjN>j&>PK:'"PKE9@javax/sql/rowset/Joinable.classmJ0nft7R:"ovP;Dټ|(Y2Pic $8_.qGpbﬡꭤ(L-K#MK&r\LLr^eYE"yO ApdUR(&#X~8m=[[@3S]""VNKO6玲ޏ;,g]dʺmQr.l`f+} L3Qv# e(ǎvD'r8Qc0PK8QPKE9@ javax/sql/rowset/Predicate.classmO; @}c4M,ڸ`ZA["!dx(q7: ̛z0FB_X~Ys!2(RX:Zg1OBE (x|RBw0ֽpCp&@d&:-m5BςƗY辜 Y򎟞@LXiÏ$ 2/5 [ UմKa WzPK5Z@.PKE9@)javax/sql/rowset/RowSetMetaDataImpl.class[SIOK#7$xM AheZ[zC[ϴO[Cm鞘I2zeOߜ?5% R=/1R ; &cNppU$ HY,qjfI!0GE\N((s7̫H+eJvkr?B9F [k/i}ZӹRfewj8K5|:" S>o}(g[!@Jdvm*D'ݦt7ݞa `4Mezl5+ 's=VB:kNCOUewKNcu&ca"b>?C1izsWUf_|t}6=9plܐbԫk#hN'6s=$:Z%oz9q^Q^S2RšGQa Mz 4+)VQ GWOE2RT{s$N)ɶsZƤm$z$z$b$ڝVӔ&쎎J[E9*}z_=:ەNT R}ߖl(ѓdY93$`x“ *{h/HsXML0 SƦ|8DkZa6p=bdC0>}Ո6]R+=LG~v~7#0n76]f2v]Cc mވvSCk- mv[C 2rF9 -oD-5F -Ŷ=4Жh5VꚢtPsߥ>YXW0: <Оl6XlH &G`w2>݆cb`w9`aGEX/1.LjqFX4I;]Jl+".žIkDbI.B֤eOblҲ[,6vߤp\9ǩ2rՑf)?PK\A3)PKE9@$javax/sql/rowset/RowSetWarning.classS]/A=wEQ_m}FKă/BҤ$TyդV.ۏœăG;өPy{9޽}}{~P| anm+wo"VEDv9^=8!'9R9-k.r|s<''*!~_4bFIhIR+efU;pY'ѵ [FLű\۫[(YUi-aM-/A(DEt"f K {T_"Y7]AM9j_7G\IF dq$' <20$`CwG8JqFw8Y%wZ,(TƵ́G)tl$`d(Imx10 :_ %rgz^=N}1ihsOga$*;PK2DPKE9@ javax/sql/rowset/WebRowSet.class}Rn@=J-}P쀪XADJdMWZG8x$ >B\U(syit e_q!zulmu_ lwV&l7cm:LuIl"sRkk%Ӛ#jzP^ȏ}Z@K,5v8y64|Q۝(o6b6kl=u֣Uy/PKR˯PKIG@javax/sql/rowset/serial/PKPKE9@*javax/sql/rowset/serial/SQLInputImpl.classmSX*y~E%EVCU.ZIMR>ڙ}`?Ξ$e: $?r sG?؆"0|Y6͚v. 0z6wZӭ0*0< `[+Xa/5QHmlNSStu&}Cj9V5W*4%%5GYxE%jJc<`\S2Llh0+u%%<=PK'  PKE9@+javax/sql/rowset/serial/SQLOutputImpl.classiSG`68#YFb-vʘOʇTz{<.oO?}LX 7mwkJ+^|oxh5nI/e/1V}XҴMo[`5c{3!8nCٓơe晎]|'e/[z H=dtsM=~ȑsbL`S`Z`8WsmՒȒEqfrNYZBMq;59%tv~DC_KvTO>wMxB`G=S"IWl3dU`k:M:ZJ옕Q6XjB; L6 L71t/lrJ莪|%n&08eHؑO`ڱw2h CdcKTnlECng{b0՗}j@ %-;]|ׅ5ˁ8aaˑgX\b=ke5F9vŗwY !ʷCJ[s_ k栚ekVV0^4u>Ws=.1Lѐt'HMarb lV߅g ՞a:r{ZXc–,-$D=(: ldL-+V@7}G/m\qz Lj =_Ø1Y <(>E, l[en&=O9@E; `<ܢ_Aɬ数; U}XT [cؽl=#[T6%%bKvM 3î+aO1>ч-+aO)>ӇP>gRvS K0,†n)a gv[ {ưa+JXaϑ/-þCV?J.þGN1,}}ؚ^vu%a?>,İ#6ˇ{NW?ՆW~gDI@ +3>aö0agPK:cK/PKE9@)javax/sql/rowset/serial/SerialArray.classT]S@ R7!mQ 2:F<Ե &)}r?6$VN=gٛ!=Pm\aN $Ol J`UutHnyp =0X z$M2Y'p] 'н[Zs'vZfǮnN 1WZF igq` I 5dգfg 0YejS<0d;6("hfMUW7z,z-U/ذ5,nV-uFqCs5 >;!AOM9?&8fηUtv{+^w ɶ#2{}hSks6K]z{*|͜ᖘ5歞G\ar?rҦ[\q?_dU2{d@z8n^~ z }#(Fk)1P ݘHk|(#X焣( [q8"t  L"Ɖzf3;KX/GCBFAyY=tO \amI)Y1?_->:zکX{ /PK*%mLPKE9@,javax/sql/rowset/serial/SerialDatalink.classQMO@}[ |/ X`MD/uն Wă?enQ&Mvͼy3;`k4޻V?"BHZex]J1r׷zD2 5B>+ 1TmD`HOF 冭5<[.yWF1Z,᧣JkvפyIS 0z)M^ț9 Cnv5~-KBzd'xSDS:ȳx[ӫ)d ONA!=OJ""UTi Vg;C0ED|&45ȨEjPK ^;iPKE9@'javax/sql/rowset/serial/SerialRef.classooPƟ[o󿈺c .]2J_26hH{wsZ~ѡ1 ?5{%wL[^: t;1GGb(04ԩGq>:+bPVBT te8d42424SJ5FCurFxՒ؛gYޘ;>9̇dб:>Or6,՚ ǩDŽm]k>;;°BƊDǽȋOp',O+]E[N\| brL+x zp5Puv4dЏ.sh1][d{3,ɨ~%}"+ڠ/~kQQӮ Z=齯B IVlV۸@:E\/+]}^5 *ujuh+b=OY NKӨ73uqK%R,o+g)P~PK෮ PKE9@*javax/sql/rowset/serial/SerialStruct.classSMo@}OM| ---.UB)B^8m*r`KW ?]8%ʒww73?}p0l~j]3?B]tee9%4] #:|=Wq]qP 3:=rcIKnőH:!Ci_ {a1F3ue{XNj 7ɪxv{֞6ߊ1CPx :jò{G| ;" *=|s ͳ\n&Rl\N1, |(^$5aX+aTm\_*"cjxhM3QO5(46A׊<8Oy)@D X/ɢIVpW[Uֈjq:EFl_Eo6M;ʰBJ1Gf8n\O)sMnjfΐ5ʯO謒Wh9zmSPK *PKIG@javax/sql/rowset/spi/PKPKE9@&javax/sql/rowset/spi/SyncFactory.classS]OAS BE(P(EdD}%iZ%%>5e촖O&>Q;ہzgv9{g_c!uiuq }4+f>lD p-%%Z,5OiZ/k})룰zfb帊B%K۔n<: (vmz%<$P[6L Bsu>N^[􄩇 _=q!]cf+$nw"c NҐ˜eV[C3Jc9ЈEXB}f:,ߡRXU<_ 36| fBv!{@b&4ni ^R `ƈ DS. Tw@~"Oî^PK$,~tPKE9@/javax/sql/rowset/spi/SyncFactoryException.classO=O0Cz. !tΣrwC%N&!dq{Yr/*`+,C o eemjJO?u\)H\j|/8YMs wp, ې=$}TPI"!|S>Sԯeh$p,/PK_v1'PKE9@0javax/sql/rowset/spi/SyncProviderException.classPJ1lVmś-ňA*^DO+kuS۵>%Ne)03|?3#*Eb6O| yDÑk]+{.&EB%hh7NDx*>er P$PuDOjgJ{G"$uál> ԍ=3EԡvJ`^qC\ 8oȣ=3ˮ+_ #.}aAVKxv>` Y)*fM^K'EMCnN YWUX7"X(S32u4tU,6ќJh>[3$5'y[PKheM_)PKE9@'javax/sql/rowset/spi/SyncResolver.classmRMO@|+hA@o.Z.6@I4T[ċu%%M-_G_ rش3oh A96\b{3F&d|NL/@@9I$eL-.֒]4̠@+@~ֵJg@(ett Jߐ?yXd3p׽M%8#ͱ d6<I"Mx^]\n;j07yd*ND>aĉOB2u]T!5q+WuH6! `s!x' 1eT`*2YGL=!Gq9sgpGPKd&tPKE9@.javax/sql/rowset/spi/TransactionalWriter.classmON1 z z\NP٪(BY͒oQUEz{!/Fdt2m4IyPUT:Y_)l2AC4ҩ],K@0w߿;&l’C™=Rp$ߒt If'Qa'LoNϞ})d:+/4S8'a(#Is!f*v۝r=f,D6[k6ƒVO$oIUW@ksPK-&] PKE9@$javax/sql/rowset/spi/XmlWriter.classe1O@ Jlʫq[j0FIhldVYQ,,&3/ɼ/<®?;;q^Cg|p7/XTt 'v Ӑ=$J?by⌯n,umz3ff&{;RޕԚL]t*!,~d՜WA93,A7ccdGOOw l:hAu9MO`υ}ZxFg,O((<B8fVѬ=4T"!>SMHNKF P{!űXż 1 *Btʐ}Qn}[ZzȅD& SE#кh=T1̷ꏱ"_/ȥ`ok$;[˰~+cbO?PK<(2PKE9@9javax/swing/AbstractButton$AccessibleAbstractButton.classT[OA=[A~Gڛ֊h4зeu5ԇi҇,+ ,!ag9|י~ _ou")R5qX4M㶭JA j#]ּ6 nRBCJPsХCtgqEpȋ } IB0BgܙZ*sq ɓ%ܞnba& |Ơd"C,^uKrÍ[*2 eAuﮆF']乐j$`J?RLO\w|L˖E-mTc>e(N.JARuqǴ+i6VW+UśsF3u&]yEy_cuEFK^IS9Iz/o-OSoslImnp0ڲ4yޗ)stP!,Y! @?e'+0aYc 3J@[30S)WSsz0j9{/D@曽M̑.t5byi: ZUK>|=6[-u^d`kth OjLwXG9 6ugzrm>'slj3sG>̗xյKmpk7Ldn!PK{H^ PKE9@5javax/swing/AbstractButton$ButtonChangeListener.classRMK@FcmUzh+=)!A}[HUWDGoT7ovf7;Xs`?WэHu"uڭndR-#8 3ljyTƪؿzP:$~=Dvd彩UiiwOR-N_A?SW_KX"y޾kX#LqSuvqBǯ7H8BO@EJ_q+!f= uü),re˽IS*zQ:Y-i*SEB k! p@1?0<2ePLwY5IFL$v33f/Uʹv{Z3\r?+X PKp9PKE9@ javax/swing/AbstractButton.classWiK֌5Q4iSIh "CRG"! 6 (8Hٻޣ{3ii_O@ z~[{M1V3a. 'ckeXfOڒe{igXuZQeGm".e2G3ùh0OSlj"95|!OJюΫSheå9ˮv^3LG(?CƩlNΎ(l!t*GU"ף@g`ʊ l@L:U+[ǺΪs˥hAaDWnrnd-e k}ӹ\5dT(ɻP|Oޏ|A|(_ߎOK}e(_@>JG|U(_퓯A9CF!09xN<|;0>|uȿ& A,B;](=5Y% L w_GW8=pGv ~w3@n(#)TA1 7SG;y׊4FC-G 9b?%&[fa2HyDŽy Q\eLLy5đK.W3&Ef}MqO?U)50IdNTj!!Kpu. {o(DR0A2EQXi8gIOK~n%3Rmp;^$GȻnyLq)^/l 'y` g(EMR[ЬP g,E> gjR䣘1Q@{O\)דy ]|gY)9x{_ !Z!EJȚ)E~>F"-)-ВH_ҟO1Qڑe'ʗD~6Ǥ|#E~+R[@"@gez>Kܯ35gnHϵ9*%x-CP_(n*MqA5:Eqg$Ku.{ߤ}q7h{ oцGm~;tD "&}[|k$j$}{=IACEH$ŏ= ; x,"#(~?QHGR%(~AgD'}[x m3!o,qo=x>⏂Ot@$iפ__o_/|PKt ]'PKE9@$javax/swing/AbstractCellEditor.classSn@= M_Ii $0BMʂEPC3kW$ X|$g3s?H_$^/J KEʻ ̝ΰ&I</lt⫉LCWXdIX ȱJ,:]_@K73/oW2xQ1 +7QA**d˔7B:yYFvwTчM:Qp[tVb}POO#<扵X 1j`7ל3JS'%t|n0Jc_S2q0 _{)P-qu~w g8aF+SȻPKM (PKE9@#javax/swing/AbstractListModel.class[oAPhm˵kju/@HHDH_|`lS铉~?̰%R}ؙ3;gOG8`:>JkTe?öu)_w:Œr'ʺw0^ǟ:^YtlG/늞6 S>e`xİunw: ފ@i3]O]> ^=b _jȮK=*U_}SJY6T^$|p9 (2a ݶx)uvퟱ w`&w=cԁ{O]ӄW5FHj1 9tݼB?PKQ^QPKE9@&javax/swing/AbstractSpinnerModel.classRn@= ϶ $" Dݰ$C:TIU.(GIj( ϝsιşsoa/.ñniŇw"PO*Vcp|P7& d} }*f"x Xܖ%*J`U_x Tpϟ ypYև2bo9*G!Bvw ΃ZW{u oRZW#>zŵwCd:Ψ(je:T`D_qTQ~WlrouHZ]w~(?OK1Ԕ8 T E| ['C}6*E/L{z4ަGQ\zq 7m,@@ +:)XH)H\Onz]nb'n^e/p,zF|دrf0=J>RJBݰo-5T+%ix<'kW+'l"LX:'FC%rSY(0M`YSd'IeqX r[kK@I`Hx&({42 0d1KH6@h۾1|=Si0=ߧMkK5H`0j:ev\r}6:gZZ l31Y?Qh.;Sڶ:{**ȡiaպE;-{W 'Aui49HD-(*3 p;5Z)*l\%WWʣ$WK;GOXAJ4T#j}CFyּ~fcc^[p>Vxf0f]7T U֮QWDZRJ6 )0 VSy|֥8uߛP*A6SPBBr| N"q9!?E~k94^ߗ 5~ oԸM5wjܘ0GPK *TPKE9@javax/swing/ActionMap.classn@ƿДi@ 90 BHH@Ziʶ]9N>8!qx(xmݪvgo/q˅E?h*ފca>C[.%}b[&JDBI?UJloKp^{ [pqHd 8`NQ ݡ+9oaX "a#2%x霁AAg*/hދDF,L=P{'806 fkDS=t:+&4IW*k\x/ñNQ㿥ɑ?# c4B>\%[y.[\!\({ՒJps1GXrYmAfe6X9vh^1}s= 痥m*lg5\ap GZ ֟i12I)q kEc،zPKPKE9@javax/swing/BorderFactory.classUN@$%ChQ*R*/cScUT~TI'?xƾs.*sF^ݚe;} qYihT=7tnc7FL(򾗩J p@|:5uEհj d-]k>~ATl+Jjk,{K|(# DD1*#Xc:!]Һ62XRInHE 1Ec =KxpM̔R+'yh&3RK--书ukx}&M<8yulUtmEfh6/͑KB? L^XSsӮX?K'@:l)}cYu'R}GFN! KA ڬ6.|.Xw+c IкucϤ u 3WR$>w" ޓ 0+!ȷ9DEfHwz9[bd{F֙5 fqG FwB*Qo 9]#ShK5aqPfe!B f!qSm]xH# W~ UpϙK0'ЬPyTȒqdYZ۹=Ok[)M0~i-siBr^VEZ,q\ eͬ*eZ*QbBAOE`BH/=P# ;kz~@?*:E};cHvGI<=UwߗZXg"4M' X@F:0!?(8"Tz O9yK`u;`<(:Jw̳HJ=6'C!え!F[ߗIoIKe;4*`Xh-:,3"-M(ΡcwOPl`,X|,{'H +gvS(pPET&DVe+6x4a۰PK999PKE9@0javax/swing/Box$Filler$AccessibleBoxFiller.classuQJ1=iN ۊ+EA(n,uA#ӌLB~%ޙɽܓ76`hG>T[̛5ϥ u m> 7~Pnz]fHwR7)9J E֐y7"%Hbقʼ񷦨)ߗJ\N#8c(=C0*L +o;r"M~`](%˵DP7Dx!&6M0rp2bbޙ>;zpm BQ ų叔~ڥr0jWMj)B5 ۖQu6IH+iZbX/\}_m`4{s0#Cyһ|۵s'<cz'۳_zCՃOv܁gK&qf^ ZZKߗ _vj:/g[~b 3T'6Dmkd ר62P"F܀%,Q|TOQ"#V'KnK,M4&Pk(GoXgNUa|PKꣵkqPKE9@javax/swing/Box.classR]o0=κf-emՎn BE@QC}2k3JW~ƉX9^psNхC;Fϑʸ(3t;" dP0K% 7L( cQ ư%p},x? [ac4zfI<e.TXFj?".G: k17a4Ӂx-'^#$ CmÐDZ]:_jt}aaz H7聆U EkVCqui`2@imq 4Vfcf ]ěu;Z^2#l!gv(oΕʝUvi7Wcw9=_ГC/=B=TPK/jPKE9@javax/swing/BoxLayout.class[OAiʙr*CТR@EMbhRB tC@RM蕉R~gyg_lY SB\+/VIaL :SqB>Nk}M^v &ݢ UaK ~ ~cRe`e6n:\o$!%Jo&H2(: "FsiJLN v?`)[51$2C C2ң5ca{5$S'{ϲA" *RCۛ{-BZ͛([ƙe a_짋ZR;ժ$wu_rlձIq1j\qǻ[RujdŞ.AÇdI#Xs ӹ|_clсqGxkP- i4٪\L!-tB3[|-j)[VKtj&rW܁մOĮTj$8CtHt0~ PfP Q<P<QǩdcS)lw'-4=WcA3ZĒ[2TftXc˺uF5v;6{-NDwqχ=%_C96U}Cyr Uw'j#;D2Ҹ*=X\ClO|K?jBtEOgaX3Ym$w7uCk#RtZ:vP:`Xnˁ˵uRa+UwP3ҕ!hv^_jyV[aWRqI#Gɴ$Ia54)}U1W Vz-:\J DT=|W2)}∡puьYtCx'j =,ЌZD4m;2֡ܨ7v6ϒ(1d}~t1=`ܚxvF칶竞x# ,.q i-J#k[Qd:el/4-E3&p"uGgru,|Q16&|E96MfWE­d%&5~0l$2Kj"r\H|NJT̚XfQfL^DV*n(vnt lPKn].1;PKE9@javax/swing/ButtonModel.classeR[O0xo(xqDA}J>Aq W+!z8Ӗ^syB٦aAjt<MyQ#8wlYg(Ğd}HO_#̘\|FR$e uW&P[6JcYhK[ɉ\L?Gt򉠺zU3"ʳei3㚻 {rI'_4"wL1ķ-(fƀ BNav04j,j,i,k#Sc'pLc^+X(݈ nPKN\hPKE9@javax/swing/CellEditor.classmMN0h@ʏ'H6Xb%*H,*uMFŕIPƂp(T; *x}i?>!)5gp)Re,\8m Vɂp"cUO؋2YRLt7Ȕ0VfʥvOQ[p]K#\:vn>2u/w భG'm=qׇܤlPKvMPKE9@=javax/swing/CellRendererPane$AccessibleCellRendererPane.class}oKAƟK?eH.(9(uwgzA/}h(cavfvf` )f0SĴ\Hw,} Wz-@9C#fSBP(WZzW4!^C']yȕGU1\4,y ƒ˄GOglz;@0)l 3EȄD-KoDE*`q2 'TVGHB$DKb1R0򠱂g9Ctt`GLMݘ`{fs|oaE0AS/;Q(xO2}'b!L8=?sbL2ԮT{iG$LΔ9a9ev*V H{eɞcWC0G2}/L E%RvTfar}Y'$1;}7&fYؕt3E0]"U 2т]` \/"<#u}flz=דa.Hv~ 74zsn~$Lf.ڄaWt PI?AnUn\0Gycu+_T0}Lba#?ULܴ$ &Κ^AD1<:W {ԨNyFUn15o򟹍3w 1hl)12F֭ؿF*X2j񀣾en+p~PKloPKE9@ javax/swing/ComboBoxEditor.classeOO@ߠv&^9ĄăigCgv{3y7+ ]UR-s;On]1s7n5rJ]B7e0[p =eNʳpOP/}5[l?gi-pA } 6ȯ3\Ү068yt/ewav WA E"tF_C5'oPK" |PKE9@javax/swing/ComboBoxModel.class;o>#^v&FɬIJ ̼t}ܤ| vF~N"P?)+5AYOfq X#zjIpjPYjgIj.#@ E50i12p%e228PFf fz bv9" qPK>ۚ9PKE9@#javax/swing/ComponentInputMap.class}OJ@&h"oRRE}[nBT?KO?ߦὝ7fg??`(&5~RzD8R:kW`yC()sn+f.F`w{预e\B)0jF=܉PjaîHNԘ‰H ۋLg4k(KB ?E?s,9(s0:nqwoXz6qOXZnࠊu 69mzޔ-< PKϺ+PKE9@javax/swing/DebugGraphics.classWmWG $D*N@% A(@l$Zik$klA~zN?Gwfl6,NsN2wfs6/" ){ʇ^SVh*V)N)TcAܫ\nauamqe=_\f Fղu)fז!cOZa z  Tj4ά@N@?D ZU]n溲  FI7S\+z|ed% gS Nl3C55VmA: %]UUd3NaAk5+ k0,8{[jd*g#)q5/e򳿞5t5-K5T33I)C1<c1L5 ]DL 7|Gw2N.;:āVP1*=.)O(+lTq#ģhGU^}C5~gpNz+b1#L n0+mqynيb*%[5Ul̇1|HmlMyHa&D}\t+VWwF64U_b8_Zv鬕U;'ك^(5:}r{(-\J&I') 7QW[fkx Ari 'KDpңH ݾ^c5UƢwvTnj׍2SUvҠfVؠbXlNzAe=ٚƈ3{7rX\Vj$q%?B`7D<qp*&qT/5nԜƟzM1bk٧/ ADqMO^<5O5?/ { WR82FO\ spB8xPp9P`< LVkf*Z̐t.!pE\yn,-6c$rRF9)G1 \hܔev\Kb$BI8w% CRޕa{X/!4ˆEw. sq^98W*gY:d'coFֈqX#1K}\z籇K6I/8yYi{(3qzw{*mݸ]#GҸZoz]ǒ{79+]5%qf•̓{v[X&`-Lĉ$9tp#ayu7z,̅r'0l)3{7B\x{t6] gS>m"q :2Yj^²W垜pvW^4^u C>E;9F>Ers-=EnסSD;A/Im·~g|/O]|~juj`A%ve@oA)Lqnb0M~v/g뉛JRvs`+¢ Gø<ܻ|1«R$MĒAMPK ++EPKE9@*javax/swing/DefaultBoundedRangeModel.classUYoQ>wJѮҕ]NW$ZklBIpKo3 ,XM>蓉̝NaЇ9=w{.؁\$WNo *+vA-|Y2+ZL L`ЎTTt*ίX C/Q5tNU,  /s%ҥmՙfHv*1&ӘGI` B0fPj唀|٣<\co9ӋvUO)KnXw3/LNXrێq.!Z.;6*Raxq\g9*cfލ3+Cэ) }!pwvPqk Qql1kcңQ%{_7"nN ZU FSZiƋe8013|:R۹)QÛFC,{vt3lD,Ycp0]ĸJN HP{vwӞ 6J } !rOw-%Aٳ "a@p>ƜE8? mm ] $Mj2OCM/x1qk1 6Wd54H Ί uw:т &rZ-I_",,|J!Ôqٸ|>.k dr)~d5n m@1בb\PSPS,PP, sFak'JOO֞>Yς] 6 "+PK1fǙ($ PKE9@$javax/swing/DefaultButtonModel.classk[G "6(V&&7\"cJ[ tͳ/W}3\u|9{9g,?. Ni+~>JKZm%A0YLZS0a'0ýPSU47Bas3]0crxH*e+]S bN@x?DR\TOeV,3;v( U=3m F r?mb:Yhb6N2g+h'0/u^aLLS-Ԕq$8HSMCW&p)lZR T] T@ ܋AVܒUԬEguE);ΐV׷4yt I)NYZ[1w,kuw&Y6m+#sҵ\&uj9a6)8q ðl S r<S_eA^1#t/[6@ꍰL9 5,#p$}X%ְ]Pbr)%WMlѲUm|^2(erL7vVȼCFᵅՔz W72m8739[׍j sO:Բj M3ѝwӷMqi=x(ȞF$$Ι`Qf! (&ܫze~-N_CsWV0ay(z&٧ bhOоhvhq3YH |>ޅE>.a<D-~-VG_'G8w.:>cN<[ :=aa ˎڀM>l+Hîxy"B"r<!"sċ^/6qKt[&Cu2Sf!'T>T~BCOP)y*p T<8D}85z=BEp)kSG<ἂ陗 %aE[8ιPKE9@2javax/swing/DefaultCellEditor$EditorDelegate.classSNA=-j@LH5ovC];-oA~e3@l2{{Ϲs`7aw;<ޱ'xU5-`-+ aO2g((?S Oo%}.C%<d0(qz 2$wW~ .w;ԓ_2 ׶֯u'klɐ-1 ;9T)G!Uр|]z]P#3unxi-aF<7 #?8-rh~4wy@X0pyqCҏEfJOY,:Jc懜 I"6\, ?fUk~!lՠ6;Ư)fCЍlx+n 0a;1ꩡ4u)zƐ$,q 9PЃHn"y5M_tt}'fa}Yu0h͙,Q~G,<ŒĢ!ØX&΢&~E=Q7M" BӺ`A|Af%= ^3(祡TGX"gR'7QcOw1c劻eVf4)!PK9]bPKE9@#javax/swing/DefaultCellEditor.classTS@j *`0 9ptkشEIL3Xp&w]ai }Lƍ"ihwGPYܣn$$`;) ܧ3If` y:>C#4nK0 L[qE3G͂S4x827)G#F"gc#,FP-~'9{'ـ@QKmƮ))i݄\D)uL2k^z{[r-uUl*R.-SVɹ 뺲SёC#eͤ&):ۀPKкUPKE9@&javax/swing/DefaultComboBoxModel.class]s@ B[ZZM8jgƫ[NHdAoBr5%P]z=I@^H4fimj3`7zנqhq1` 3?%Qk3,'!$ I b&}?vA d[VO7::½WO!Z TFZeމ6:+kNR1!PmB( G1ed\H@RtHMw0gj@lHo&#MlҦ٧˫MPAQ&Cj(1. #3jCZ4oU1mgA[dfU%#s&s&R#"FV 4B.4\ +/ gLsg}XUIm^BaUC">H^B$${%f6=sADч SHl{^|0| ePQ 2"B<޼s}Rzι'zWr!oCo5'Ѿj1C /iڬEbw)k^7>0̪٬,Le.Ec n [Ӑϐ`m3oo^(:xOۮdR&zT0SQ >L6U.t@?: ag +? S)1oxP?QQ4+ÄJ)_FtᖈQxO"?)C -)hR#F5)=bLV-Y|fBxm"Y8k\s^zD-€X8]!-h`ꌐ_ l ֟Ӕ朖i bE m<#4Q=x|(cs{?>c'a:kzW>55\qw ϐ,T_`WÇ2D.w w6`S&b?qi9odۚa`T>6*.tuVV#.R^1Ļ=>VTt3ƛӃLC g& Cs9b)ʖi֋<^"! e{ N(JXyDA-X5P\Ȱk>seƙ{:,+HPP{3Ҵ,r.턢Iڴ1l.-`lٻPKiPKE9@4javax/swing/DefaultListCellRenderer$UIResource.classPN0}n҄@K bu B1W02ෘ> q5HeAY~w7GhGeSZWrUNZLɒݹ ɕPP`{-gI :QFU}`wo$XNcI](CݘkVtr"HZ5ɰQN_'Ʌf@:0lsį% #l[ ^ys䙃R'{XaL x\C PKZPKE9@)javax/swing/DefaultListCellRenderer.classRMOA}:(@Dok5M@8g&M7ïғ?XݳѕTzUVBTKL|sew@ thKwLf!hDR;>V6ޕZ]TƨrO¤۶7ڬd>l\&eT":0"T08IeM''8AqrJrơBɩ5jpiSL|LehvݵEW3mfiS&_=4,s[n _vr7nnu%Dcx'-\!Ύ)|ܿ? E@[1%}u;~{lk|iQY̲GCg5s^*CC'y4lzyӡ"*>ZU^𷌉?PKm8PKE9@"javax/swing/DefaultListModel.classUYO@uJowB(4TDTȱPoCTQUgƄd 57l`?KzMorWn]9w3'0Zm?u=M4os{;b n'!)hfb*SS:K<`3}.mazvF/S9%+y[25uV?] $`2<5VK^nenT2uāmy[nOhyY߭'|^yɬUٴ6H`0XT dL0PVr$ 8ʐU] 3c0^KjHSb4 {SUV8 3DF&ⓘ+ > Flq |"L+3X҄`)xy=dUOcY"zrY 6T[U0Ja"Ōs=I#H:YgJ,) kUV^yMiRWV~7|A_V z:_iډ(KWxӬ*=ZS[iPK_{l` PKE9@+javax/swing/DefaultListSelectionModel.classU_SFߓ Nv@LmSRJHFfxHu1BHK>uPd#gN:iv{˿lQ4˗V׺6_{ngV MMV<ȳS<75 >Dm L )&߬Ssi PMF`.<3ֲ6@AGR`fvi&w=9vB ' SEI}<ײ X/X@`D}h5]Զ.RZ&Zf'nH4G$uRmѦ[z0D8n67 LYؾf}S3Ѓ =d>C_sF(ע Mvet/^1u3Y:tdv|dqgxggq} p(.p~l,Fb5Gu/!fnZ\B,Fh]#ط/;A nड़bn@P8c_IDQ X)U;]y]*k9w)H0IG\JܑJ0jhn)k&t`&V)&;=:~aՑkg,vcPA>"p*q>~x[|~R`坰7PK(p} PKE9@/javax/swing/DefaultRowSorter$ModelWrapper.classR]oA=wYS@IQ4M@BySfKfg[Wd?el 6޹sϙ_Nz..ZxQ<gNnTz&l5OpB|eSs `,rͶb uO i By7]5i]ߗ0aO {7]f/a8sv̑8f7^dP.KXqqUc;;ŕ,94n]KOR[}]MMvn?Cq 8 ]PKrAPKE9@"javax/swing/DefaultRowSorter.class[sF6%q|ԮƱ/IcJ/NՀeF-QFIwCԙ>CuzVZd$$f`ogY&!F`t)]+YmoRG1_jW5M7Y"0ZU, S֤IQSYǝsץsh I9td|#+9 YWA w$EyFR[Ȇ^Rj^׵*A1#bs)[vSS^ݢfYhKdjyiœYBc5JfGǠY+TVkvaŦ_O҆G ݮ%\:ѝzK6gnmнa]Dht$+p0sqor3#SY ]dq̣$<ƉݔLjN󛄎32 EKA; vю&t!UF#(Z5EQ5P_GhPqF_plR"S[Oiu~8>q#lئ0b ƍ~26zd ų13X+Qp_^l2`zK>ՍѮ,i[j ZN82VKDoOt Zװ!`M At7YpgޗR+)~QU^V$àF~$"&ǵ# 쳄=o$Ė`; n85;i`{;=3S=;Ϭ1~QK.񠈃}eW9fao1@dhj#knNK1d˚Ƌ\r"]ez"}I0_FbavVķ1U20Fd#)0#23 㣈w"Dd=\hdVfSTa> u^t#<>^_?N8>A] ?ڋ𬷇}xSǡy)?O;kpɞ[N}mdu=sV|ہ/8, ʎn nrKFf'ͷܼT&W~ .?h?ߟB|2P>ՍC8`;KLbPKP UPKE9@-javax/swing/DefaultSingleSelectionModel.classSMsA}lLH|h DԒ*Tz fv&zʃ?e; "u??x#~vx!.xDCXɮk +! ]n3 Hn/e0Q KK/aFĐ [8uZ" Z/K[zXpΠW){1p +uip}zͭsN%yԽK2e^0D3Jf;Oۖ(= B:qOXjof n E4!x UnicM'+#g*'wvD1O;#Ȧd_ٲ;Bh==דdb7%xFz/Iё7 RXcPB=A 79VJ 7jT, \pA0 p p 8E/b Rik~OW f9gJ PCN=fP4xg*2<7G1\ffǧ YdF,u+%Ͼ&Fϱ-Kz=֫N烤ufP*!yJ/390*a.a\-I w$S%LK$JyIvOA0u¤n8[ iZ "dȷ!6jgi`Z1KwFQd[RR![VK4P1R527qNJ%rRQ>VjW8 mi-9Y6^d{[OāB݈.Gy޼wqC?Z\iLRs ]Bឫm7< qpe q2(pt28> N_1lﵘp+"A4m˭$K [=D^ Z e/W<<5irE~MxoG&LR=]6S͢>H)*[;ʴ(2+bl]Fw*6):5Nm8`-Rm{'F}~(>/v fZ`01W|wW[uPK&uPKE9@javax/swing/GrayFilter.classmQMO@}K[DA>5&c+ƃIMA n ,AO&(aͼ7oүOU&c|3Lrw>@ {s10H`ꖂdVlB\b.Zb'd rpGȁ (weD=1 3hcV:}ӭɐZ îűQ}ڤذ;&9 mƐE^D!'̦%,3D 5Q!5K*.ї5{HG2bac6MD[aPjOjqڕש:̶ E*@Kxc@V (4 Ѻ[wW'FSO0d)L}t3/BBz=CJ{HH3 f$m8U@"Rx1#MBhS_D(A"25jgT'{W-Laq6v!!J#pi%X `7 j5R@A3PKR)aY۶=ٱ܏41&lSMP 4POev.fBf y4-F(PW<'D:a-JBAɌRcY)bY޽㘣rEIwy}WaaPj \fs,$2j6>bHU=aU^%Vחyzz˪r8h$2W1\a5[#ۜfpVv;Q@YJ5,j&Gi[xiPKo&PKE9@+javax/swing/GroupLayout$ParallelGroup.class[S@[J\,\J !E]& 3b 2 J3>Pg7V i{{\7#]k_ú(9v}k[LS7ZC&HU G[bH4dо-ݪ2*BT ':@ٰ7S9NMZ,gy9%!\k͡d T*,3+*_v 4.pp@BaZH^R J(_܉۲ Tq;lCbxOXg2{ @IdDK ySn4CpUd1ɐk}:Mξ6&dYFIP wv9_I,KwMR+qg$=1Q_ƌ`\zAc4D$< {,{ Sz4|iyAsw[I}ٶ1^,2Ce՗dVU H;!J7mN)ѥN\W-@V-D*`{]X˜"꘻ a\ Kح3uyi+8J/CB-3RKVZ o]xF&"i o-jpPK] PKE9@-javax/swing/GroupLayout$SequentialGroup.classV[OAJSV`RV Đ@0`5m F?xfv(9;sLbTϟFx犅g i-#V2tɔ+O [CP;:JOrYgXVn\;+KˉauЛ tVY<>Ѝ] C+[C-im-z N5jsa6T*bLqҜVgHiʴ`Qu S*h}'hFWvc8vŰim3sQnL;-lgCm7n8iL:rWz ZLgӅ%{#D-| nݰ~`'FCI-#j7AY}w.$#L._2Gcơ<%1AOc*K7j2zޏ$CֺB:z#u>襐j? yWD+!5KfGh0[]q}hc-]km1ƴ[hT#&bXd 2CK!D#GkEhKn4;FR-i\A ▝1OJcnUcun06hbL ʂܣrL}+|Fcfo!"[:F:'t6PtPDڏ!Λv ׾8f4"vÂ4{[dkPc1~`5ĥ`WĠSca7mr;\vF.0]jslZFbK/"] ,T[Ԇ~b\*ᩗo h|Xi PK WsCPKE9@$javax/swing/GroupLayout$Spring.classuPJ@=7. FĝMA.*OSbRY.DpQ؅p3q{ z L[Ag!3wT&&E ] 9*ԼE`6VQ펡3&+U:NKi6\EgU &6۠0/Fc5,wI5iR 8}K½J&Tu]Gz[F`+ʦ#sNj.Zry gpm%̫MڱdQcTʞaZunCqđ:;y=R lJOZOD,"Y~L5BߜlC w3cXq?[3 \!p.j2ݦoxv[G^X ='8m|Td3d^1h%Mhv ֐Hd2p+,XS ֩9 6[QNy ֛嫷3&aň:3m]J\z)0*ڼF-YINyI#p~hF5 ؎W" `='as;'IKKsg#4$a O XI8(^GߥJ ϣ(؀Y<(ށs/\#Zh1-Җ%m.2 ZI&\K&,wDZndߏrIh,W}d`UK905|hy#嗁EZބ?Ynfީ[]>S)h5⫡-m9=TB'C+;jWNr{ ƃ `^{M+dTI%3p)x fVqwÈ== E\X㵺UJr?֬E$F'QoDɍXyl^_bMv0PKwldbPKE9@/javax/swing/ImageIcon$AccessibleImageIcon.classS[oAŖR.j[Zj7!ƈS*|c?e< RKa]9s?$b wsƻi^i-Pb|Da磰th7|OJb!$w'N$3^.TOcRӘ#Z|X8JpR\ \XIHt{b辒=<%H9UkSzLr[~?hR-oHC2牠0a6a0>ء#kHezz]D~ݠ}hM߰TWŰJyz cmVc_YFGLogDyq)4Y`4Rá-왝l`kT2;}uO7,A) >Sznzg>0KG,NC@^En#D: (+w s9/Zcie1U^⳹w2KsIstH^VLźu@Z\CWl=߁1um.HwREge@@N>]U&S6{}rTeOXbJuEIa#8^]FSPFPkJ)u0TS|Qp?`X:GGH 훲u_6ESu6uMt(:`PPӍ/gXpI*UPQ"|_bȭ?ָNsC+l|ݸ[{*t"Ky)5ge)?sFT7l.=>䖷V* Gx>Y"@J2 )潦ƌGJ✸r0,}ɶ[Qc^#iq Nw,$y|ݒ dՋE\'K~@&AIRf0M\%AOހv*㸂 |m ~k"<~˧Fe>MQ%C3hF&4:p]SƵvtMo5ՎX]ZL;X]Mvtbuvt*t݅9M83A^DЙ`%r.iBBދD.D.rKf$r3"p噋<~k$|K:WLMRTԅGP,+y׃txXuMS ק VJFNsEaXM5E^څ-@PKHqw PKE9@javax/swing/InputMap.classRKo@vbR}(/9€*C &ʶ]9N&pBG!kV9||3?}nb&>*w£iBp?5ڗE5UeD(#1iNal.ʗÑdA4`󠓼WBk`R x.?qJ'$$UƁ1ٓ a+I-2֙]J^c"!Sw~T@9@.pRkȠh& _]ϬQWc_mPFx,)NgߩWƞϖVn}C+,4x xod 8&[ZsE_ 5G.niW&̀Zƒ-le92=q,FTm41"{XϑOx٦x%˦\vzEF.rNv_sz 38IF\f4Rka؟ a\ލPKr:PKE9@javax/swing/InputVerifier.classuQ=OA}w(h4Vv`  梅Dn%-dcebGgLb|73ٟ߯ogsQ"N\z鋊xgC'%6n^$x; #8*V%jwCY*p5_&dr/F$4|h(ee*%kt(|P2 : ¸L2zGVK8Xύr$U2԰c0bocr1cPa&V یԖsƒX.ƫc_` ,?PK$PKE9@3javax/swing/InternalFrameFocusTraversalPolicy.classPKA}ZfY*%4 ].‚Dx&֙]:oV(_͛|{F^Lţ̔=JEX1&IߊM<¾b?JokneyWP@P WPھƒP M$⁰Ջީr!G2%?-uJh7W.W:p%ߨH>wrp,q3ck/ٸ̱5X/0n2P]sCߘ;..Nva-_PKh(PKE9@+javax/swing/JApplet$AccessibleJApplet.classmQMK@}ƶѦ_~\Ċڂ"/J۸JLJU<Qlڋ&,73og>cF(ū_Tx]'@N;}ߗZq  cH/ŜA9h}ʄ398At' ,PB+lZ:Pz4`E0E02@^Yp&žPY0 ZKm3= 3) Mu:Lױ̾ r|rR*l Lp:I\F侞k屆6&c/PKx5,PKE9@javax/swing/JApplet.classTR0= &aIHH  m @R&t(o"Qmplԇ3}:vcH9GWJo؈!<7IU1h Ig@*ex,4a_Vը*bhc5jGnbʹa +FȮMYX[ܬTrS؞(C^6ty> fDҥ[ʐ@+PHI+iدZ=X?$JuhbV=nX5Ȑ %)D;fvh*pJ .\{N8!7\J_I$ un0O8y>][ͨKRXRbfͦ>(x$1NP*T8 q xƭy-n\)>:@찣mZXp\5}$OGtxw|Zea8w%Ŝá;St"d >(sU;2 6ɅK1a1SqzT5CM}7aF?~"HQu#Š"?PafŤ\(sЗ9P/s593D(sؗF| e05LC2[yck`V18ża%꓊W=\DDc!L"(J<0@%j5<0@+ $%ݍr(Bm/]+>Io(Fٵh?PK+q PKE9@+javax/swing/JButton$AccessibleJButton.classuQJ@=FZ*j VWP R(OPGjT-"(&taI8{7clYv|W퍻70Vu1z4QA8LH7L0\MP:ctxAh"T%ld*a{5>&S %+$T+'C訞5E$&" i+Y0bsyy*O1XX'4/BPMQD('4aRel2yNڝ'w.3(r1щʨjk],54`6!PK\9TPKE9@javax/swing/JButton.classRMo1}l%ҴMoҪ!8"*RCo '$~buB>6Roy;? 4wT Nc›6Ɯ3Rض#9e8ɟD=Py:P24ch+ұVCSM*RWډ]0, 6 Qa(i$Jݐt=IcP3L<Na@/ib`[t )2 ʴ-XYBѐEoaͩe3i[w3d֬nV0%cN>WZGfcLʬSE&ȍ+|7̭\ =b mӣ{~^ P"dPKҳPKE9@/javax/swing/JCheckBox$AccessibleJCheckBox.classuQ]KA=M͏L ! ^mЩmvv˿C=Q%by3g?>`@yE_Hwֿ΅8KJɩ#5:|fA๫#uB6K>"4F1\2 R0 Az"Byh0aH7 -+nçs$TFm9˗Q[#^2$Y} }[\hCq9vkб@PO\N&"4SƢ}J㟦r9R+Zs"(t{ow{0_9͠6 2[3 D%Wc[C}#y&vPKp;W?aPKE9@javax/swing/JCheckBox.classS_oA=P򧴔RE ؈6hL AJ(!/d96tKZ/>C-rewvo~3;_p GP$?KzUqps\y]0SͺJ 3gYj׵ fqZʛjݓzwЩ6۽ɠѪj ^:N@ *,g^X,q1apвGPnl0K }M T, 5bQ`F=LߴtG p@VQ@(~ěQSAIPwᲉ{X(=6u-H2JeYNMdwJ 6LZhO`6(pGG..dEcnY5٥=ܗ=[ 0A--/s@RBn.e6\x(# =nߨhɽ&<PD { cPPK` PKE9@?javax/swing/JCheckBoxMenuItem$AccessibleJCheckBoxMenuItem.classR]KP~^].JڇQx Aa5M\<h~@?*z'uaŁyClH'wRҿo]}=+;#1yPJbΧC#g~m̨/U퀰$6ms蔰OlKNdA0L, CK&t,*gx˳,'A ehnB;y$xM0=q!sQm}W)tʱ17ABd$Ac$gY;B`45o0_XM!4A@ T6k/Ni eKֹtBPK'n!;PKE9@#javax/swing/JCheckBoxMenuItem.class]OA."Ee!*cMLj75\p7-?y㕉PZmzsf=`;8 /_o2#MPprN4,ޡS,# qpּqVHk%M}< l>YgZqW[wl4KXo f` UI1U <"Nn0wkHXѫg{] S߰a߰9f}*f0synĥ3M<|ś#l(H3=?1[xJVO3|PK;yPKE9@7javax/swing/JColorChooser$AccessibleJColorChooser.class}QMK@}ƶX"=h <)xQzObmտA8 TY7f)xg:׾t6"n^0F#1w`ڿ`GbNB~\r/ ^MQNmeNF"g,/YuƑaϥ`f2wJ^V7vZZT˵ i[2)= RlSTLݩj;I}z0إ%0Z/keeWnW6Cʃ\f23lk>ꃴ8yzak)O iR0 p@fXl9TfHujS`1xq-6)h^z%.L6D` G`Y|9SB-?+-"vٍ#sLnac5z{\+@4Y3\Yۅ0::1?9gB`*5p<%|oEu,Y^]}ГKXtxO.D#}uATGnRp* ͞J`6=7O=3e.n[^]%ߛnS6SUD0YYU[e8iqפmOs9'' yԾ?lݰ?5;Z"WޤZxE.ssPǮu>0u 'i~%㼷e~ -D mڰx଄#1S.TH+`%Rx\G|̥I6a&4cif hV=RLP&9(,G"㵿y!,b̥  ƝK(ePK Z.5þ咐`%LAtDD:"E"r#%|\WyPQȇ- 5kA jטrz[No[H&P t' YP6 .( (DgX[ $b,EQPo(Rl ;b)b)>$QTgVGu,ǃc4Lh|s6SP cظ:Sr:ByM\cwG9 PKBPKE9@javax/swing/JComboBox.classWwcƱAp@`R@@ F6@b@l?ͨF^k}ߒ6隥CCQ=h4|мM߿oY`쁽ao&w׊K^}Żme!cx ǂ yV7b9`Ej`8, {-LJl3Հ{n€GBlZeB`/ 3hcI!Ęe#G[ WQyY/Z_Cy U-!Ra5x{XK6Nn .MgC]{Mjwu:`ml̹RZ5\xY_6K^ Pfق>sk̗t)1Y{T(y&kչf&XB̀;%kMAv\:qYe6lLlBcSFK1-:#.n_Ƀ>(_ã%鼘 p/T=: ӝL@ՑhqN1QG#TŔ- 䕊HJ(fi]uhf}ZL_!+@v G.mHsms (0].dtkA {`Kd;9>RQץ[w0[;(!fZ۹v#ݲWQIwy- `Q ŏk|Y&` $DZ~3Sӊ!w0LpҚbPq 7|O!Q8ܕ3S3_iCѶHѳFtLܐkﶁ&MM:No0٣!pOd]kjV<] %\^D2vN2\>, 0&4y O&}N=N"̦Bdj2=M{Q ,zMʮqiPcbؔ[&Wno04Y.LbnB?_!;aدSu :}I> z!27~qp}_py s0$J/ UAN+ٕۗyB|;'TB ӑvING0ŝ0gY8<8i3 +I|f)d !(h *:>\UQI" SF+  6B\U%{\) /R#0NEݍ\"[J+Vx nS_2ZrF4e-.,~A` sF*#9j9k$gI:A1'7᭴]Oai۰B}MYA@ۗ VIe-׵7!9+Z<4twM- ./kCM ҂)Ք&USڠXjI;=[[4]b`YҺK;\r~yh9_ ~hה1}+=ֽFu߄oQ!zmz2| COo;.:WWe\9F}[{ߧ'b!ďD1 ~? " ~? V !k!z_J#5m9{c8 ާY';0!>TSI>z kgaOPK0Z; PKE9@Ljavax/swing/JComponent$AccessibleJComponent$AccessibleContainerHandler.classRmOP~VWV+cl:4&dqfDȾߵ7pIג(¹e-Ksyz&rHO'R.@Iue/0H dȄA(k-}x.D*qd"΄Wq"$3 ď*P'A{!΀`tBOAxfĒg_b-#?ګ9[‹94xgu4ihulxPKDPKE9@Hjavax/swing/JComponent$AccessibleJComponent$AccessibleFocusHandler.classRNP=11 [XR> e\dl~ЏBk"PEw񿇻{_"잉?E8[ CjDkq? [PHlB`_3f*.3_YiҙeJ(fJ/>=d▊UMX[ꉹ|BIS@Ee%T%(*?[ ' I(*w1OދW&1O7 3m^H7`R$:#I+ 2ώwFZj3rPN t0,0ǫ)T Zr,we->^sfac1$8z0FIE-s%/;Ds8GSoJXk#-LcsɁ {XI\ûl;2-kc#zuwe%2LM]Lz.<ݒ%1ic ? 4cR C)Mu\bwr0tZB]3&{"\]-,lvN. (k<q'0eXSӞ <]Op kV rZy[~Q)dO̺eQ?)SW&'Äc8Ȱ,O"+٘4=qGbKzEk2Tc8ew-YDJABW"^Q^xDfsc1%J9x$O^S2$0=WqȄ!sTP :Lԃ& HTh "# c1ll0fc!̚ %sƔҁ)Κܐjх C Fڳ&. Mrj".7MِѸy!|h\&)ڃ | yI|o-3@o?PK0PKE9@javax/swing/JComponent.classX{` !$H"p2,Ȓc6$Zzֻbwe0!gs'm6JۤWڴM++iw}hwf̼y~?o-Ф@UmQpn\BZ(Z&1) 7LWMbrغn%ƈk~K1H P`-gk3KY0#ndU\6Ω#ӹԥeԜf* a\XV8fQ"+`+sebtX7L t2Tsj66)c|*3=IrP69>ƸGT&׌Qhg>:I53TtcW̜]ienRb ʈ;k7t%4>3t#Yx$R7`Csf(ȵn)'%ifai l0C $׌ b̝zAEBaݹ]&,[} l_>6A\ZD!Uwy:3s-b*h]\2<i2a]<o&KEOw}SY&#U$SU<Zv~q75E):SqD+ٙ mK̓l l x>>sS!˾H v4?J$aҁH(0}PTHEY#д}D]MJm0v1|ֲ 4_7GϰGFNM:*({xK7P9l8ъx ˫AV`sW#VT&fI ѼP 6V1(7HfJse^1o"} j%e |;%W7ު՜:We<,!gLu' ik ?B"{iqq+;!ւW08k}f2dK;`PmmǢT@ђ "7`> UU0s"uwGUr_X:3bcv/d&*94"<4h&=$Zj/=.zE%I%1br?kL[#ۉ0m\M㨃Rne<1Y4)JF5?ϲ.Iꐡ];a뜭0 Iwܼ{@k5iigs k6.tV&[0hkY)ڎVwF.G0 ꌥ{+]dB =3oR(m,XvDnMX`mT@cř˻l#1dk&zrs N] ht%jP"$ v":jK؊D7֝(1 d(fwDJ,΢ƩW e]˛b:Uˆ-ވ1ul6UrP885MṦѹ,<[0XDw7zq-*`=oq큽2}B=hb> Ф8pAS/2rd{}M\GFS q 4GH T(W2CQ#ǸTqd':WB_Dz .BZqB1,@VܽQ5^;U7 ˜9[!F}Iz9:@KRH^')P6WyjO ?ĴMx5:KYߞ\{ @B{f9zWW;-ۀavLDE,Wu#\Iϕt8\,Juq%oMd+ToN+*v ns"2£ 顬5=-n7 y$J>ـ\ɧ|# 0&1xFY9VByb ρa5<#u`頑'+A Uaz}VI3z >[5ᥥL(kH_c$؏ώ)~j ׹)p8´}ZNgT3rA+YKu _`"|IqCe9M Wk2%!7d3o·d! ހ7emw໲z4Pq{~_$N$e a626XfϓB{~¶SxGXhO Ao3П?C<+RA ~-x^; BM̊}we/ !0?+˜Jbs-i)-_?PKʼn )PKE9@5javax/swing/JDesktopPane$AccessibleJDesktopPane.classuR]KA=-?23R z*0B"(|!tVvoA~Ttw psΝ3g6$^Y4?Z6N=OC9v`Z@4,d$Á2=Btw+vrN`w;!b,,,pLNI|Wiy5ep+#=1@EoҎY$(w*S-F2 18X#T&F&iaթP4<ج"䚭7dwg&[7s(Wb[*%,TPBXGPKb|N@mPKE9@javax/swing/JDesktopPane.class]S@RV>J[ jJ/ta8 fi )MQz&!mt͞s9?)> *VfKN-D /-Zwyy)4N p. 5}ncd`k #K:r8 vaakVi0$6;-F`afXb{v*#N:Mn6msߘp>a6ܗ p6LsgbZprmq/ [= %M^-vV^;B6oQ#TWY S4R9zuz֐$Nl9xn@c꺛T*u_GcNVWn*|D2X}ZMLVJZ`oH= ZTw\Rt Ӈ;{ǃGoe%MK)d k Au% r+'-M,4͇ {=F*Od z)&pw]?"d슜"GK(2y}QE0"}o9d[%(EKΣI XUq`lXSv oq) $`)Jb~cT7JJI+e~d؜^Zj4B5eI6P^Ѐ^?Fم`.8;EPhߑo?qAmA@ %nPF%W[C}# khh`PKZ 7)PKE9@javax/swing/JDialog.classYSG{7cqq 8ik.<*PFbnUb_w4_X4H?Z7JMRD^;`#5-m'zYwn2D`M7M5؆i8T7nC)Q,3kb9xFJ`^75rmMgt~0KɒߩIu h[58cs}mP ck;/Ĵ# Z  }ZVJ@bB`6)ĞY<ÛKYL/ظSteQG7,ۖ:8a!ώ@2ohZ:qLǪuڥy3'j-`}U<+, r\,ErR7\&0f5)uƷ,z;H`g\v"V(E򁎽òupoU=AMVBp8AbaM!(׏%mŐ=Sīև^iAvALm;tqiAnwWXor&[-OoŊ5+%H|2c!ݖ̛Qb &.oVv@juCBZ lK?\Gj뎁op96uܯ 88'p Gp%@K|<`CAx ,m.ZvB^m=ޛ?Rxm)kk`0$_#_z*Fa9jTrC hȇOc0PBChtP@:P4 @z!_E)Ƅx -jq#')3Uxi)lF}EoL)^x7O+| D۰}|}Y;Cb?Qa@03%G8CPBۈpq3ܴNg̥Bąe<349swί?~x=83etʯTpDa\5MkyOxJ T빞*4_Z#I؎X0\Rǒm&Ա /Z3կ0t'|(/=p8:d͵<W3T ,d!Q yM+C\5 cx2Їd0:1[ $ aJ'j:nqX.vO0ܾ0t-&MOmqn~Xb@X` O u]ÖVϖn}2X}vdLqW mEGt 90z)x:Xγ-wvW4,Lq pYQn&7FCc)`yA_+i >BF&ݭN>lL`O1A>v)2f>)AL@P]PKT.<(PKE9@Cjavax/swing/JEditorPane$JEditorPaneAccessibleHypertextSupport.classSn@=cM KK8D_ ETMePD}&`vxGPH93럿 8Fx랊`_x_u2 ա+wO20j}?Lʠ#¬w{ iЈ!̣L6n<S~ lڭ3.gsq,Z+hz&zrR$ΝS6\`b]Q˙QɌ<4]24JXс9.k_"Wv;oS&V^_Zb 4~WXp ʼ8 :Vb0nb.=XZR9?:M+ck |Nc3L4Q˰kٗp{Jeܹt?14M{K` *W٪PKzPKE9@javax/swing/JEditorPane.classU[SF>k !(q I Jl(k2>0B^RYH2!}L:=B e6+ZhF]:4ǴJA':ڑOiP! W,g|$~:+lVLZ8B6 Q T[t ,N]4 hvSW,I-G6[39[xW͝$ Ml25剡9h2F>)xڬ$܅Qd͠VZU\cSUSی;ʂ@!T7UvHZMGC %0ɵ4S} pX2 㞁A,sh)V}05E jC0R\KjQšztǍ{ Kd!"wՑ/GˇudZX%Ta 9yYYC|ғu-9h5 u:mnNy<;*>zh< .ӺbA;)?R@ uL+U6o}f5%`c7nk U~loQh<5X# (?SǴk[,֙0,}uZ`I67Ģ 4޸ZW25TgV2^ sv"Ey *F*fRƮʱu J@<:/cCU'MPq,%{"'ŧj6M sܗ,+YJGpMs{#HpU&?7$L4x<fg1q<6rMc #q\.6Y>6ׅ.pXmna@[&Kȃx.ߋnʃM7" ~B 98 A(B" s$:á$MZ ]a& e=$ ~2\*%"/0]$E-+ϯNjYb͖y/rt/y0 7.l/zZ_Ku@amX?PKPL>mPKE9@javax/swing/JFileChooser.classX wȲʲe[lَ e;aNۉiCe'a P$+NۤWڴM+=QYB=| > W[YfZ+Ͷ!/61`l/wl˰&!lft׳@jr5rbR,/Pmk|CɕRU+6'"%̶u4UsxNmWYb vK-v\Mŏk8ub%D- SZY8eIY .A&WABR]rT.Բ"svK0t{ո⺶Ue21Vq$8C]Q2U-64ĺW;{Ym..Z,l\ vw łL_ kFhm˕B1p A}LYF!Ϩj-wO0c:.1/Qy/<脬*WfԫeiFocXcԖ5+ƻC4+:Mgt/rh{.ͼEtiEHvsULN+T1jU)j8GCJ!-oTÅjUvW?'mt-0t|!?:a-^S54Θ-BԤ QR$6 s5Pj*tN׉k,ϚpӘj"S5qPY ίvE[))R-ٕ_0Zt$CQKcح-,sp;*n~p0ΛblLJ/-c0FeW Gӽ#gOnY1 K&E+&u473cYgoUwvlD|ӧfOyCZ `&~.R œ}Ct[EQknXŞ!۫`Ԝ}hs}5dE Q6ҌO{^kvEw|w}ks]ojatn7}e=S`԰ȊM[!fV.U?PYe/n.ᑚJ댰\"+g{<]v]GɫrcUм]c,p'io7\=O0,xcR'ol;Q1ocvt:-&=F׀/DŽX \˶;:Klٚ>tR @Rɳ©N^֗|b qdaJ#8XW1i Yl+4L©-z 4Is$K8:{㚚DsUL^PslV;?[&fҭxR#=I*Q\{äg9If(`_$$ٳ&G>E @l>&Hr^$Z%Z%Z%Z Ht%L%Uy|Ecij%e. Fi.M)3\-BE&.Gw»9]l$N{Rl|oX\R~| o"?ڬr 5.#QjX 8>"7g3|RE~*~>#>ǵy\ .)q_H|b \R/ |Yܾ<)h__'/_w6b` |S4VĿ9mHx֣.|ODH9b"ńGZB?SW`E~$ ڴ/≴xE+8 ?*lgb/:/^iA,~^)D $RQJ W_sEߊ(V)~{q81}>b.+}r?At~ .I̦}'C8w PKG{ ^%PKE9@7javax/swing/JFormattedTextField$AbstractFormatter.classn@gS7&'zJӴBZ4URUZ HrQ6*lބ+$.x {FMbdzvfwO"zNG&=C>ӫ;w>WJt[bΥʘTaT>60 Pz*^$^M.Yc}@8[ީ}_ CF i=cx01fV07,Rǘ"0CK Z>:E"ScrVR,YbK`O"1$BRau  VѠ{{>[8-{󯱷?rMfk6H U5W}Y}PK~[nUPKE9@>javax/swing/JFormattedTextField$AbstractFormatterFactory.classRN@} @œ!ldĘ& m&EۆJP.r))>lXMd[?OG9lBZb}Hv}#0E:a|E]FTV-kV B`ꖑsF ʟdHHJS AUQ 0jY t)](zB x.eϤG!8*c%UY07eiDsZJTl+q 9IDI|*@nR}ä:ma$,Vv zElV͑.ٶ8]M,'m$h:*(+8tAxF`US9&0qSa4Ce5]NmXaH}U|Άa?lJ"M1\mZ5憹)+Yٰq+q-A #t5 pMnYUezF a0.]Y뷤,ke? P  <&Pn(` N 5 \ !ML? 12)/Lq lY3BIЦ ͊'#f.44 6͢MJ&i,.sd <+ uҮ8z}bZ@&ڐ>w +rE"tEa[.HsjmhCUn!LJd[m+H<׋bǓšݤ38wړbϓbVޘ]i }*Cp2PKw @ PKE9@)javax/swing/JFrame$AccessibleJFrame.classmQ[KAnnnjE2(6@^{&tv4[=DC?Yȕs;g?>bF$ŋg*|𯻱F;j8sED_&bR@Q K= P;\p4 X^Ap\ W@k.l yS2 fC(@"V-Cpdnj_fZq :sؔܫ0qg$FPOccp8u^?Dgn`,X|Uyΐ8 ;Wv3(qPMl('J"`]f+Mlqk6vaPK_T6PKE9@javax/swing/JFrame.classUVF=c;Cl %ACZڦi*%i^&j!>O]~TWό!d h>}<5 )G-縶S q^~M`i8[71*a=_Q]ǧü,X C<#mQe3ofMGN'0{ܧ ^8xn <~H6KcihH} ̚W+z=Uyu"tPTiaVo <N m4ة{zdMjR0XXm 0m=;8-Y?Ro@5 K`H c1^1uHT"*G(CaD#ڶr{:yHWptش)BgAPq/~A=&tr3gVGr, }U—(w&LD"X\UiUƚ.+kŁ,[|O7<ҒQޠ\KD|OfraIW&!xثo(j]+D4r<rvT1Q5!ZI}5ن%ݲ (EA{ Ƴp7N=4syv܍eujd(L0dd!+m;xӧ.܃3 u#$e|Jp5)c쑇#PgqUה<*@ndLDfL+3d+lF"e@=RإY0#՛#6jLJe`.C(1"HH Y I8LaN2ǜe.R"s:Ld2)cu"A 39%vV2S^wJkpB?/As`$y6r4祿O‹؏25XOxؐ$h3SDM+1(%̠ZEDQv$.}%?/]MOPK% PKE9@9javax/swing/JInternalFrame$AccessibleJInternalFrame.classn@ƿuܸM i-MAK+$RQʁ6]EZۥ8 $<u$vUYޝٙ7aρTק*ZqDs_4_ " '&l @ ݄Ƌ ;#qK{`(Fe<`+;cdau[b{`s{.̗PT֧\K%9Id!\K㧋pxVR%"Zө3Xn]=GRR ~ Iz 󏪵fOjꮸ>0g( b='Ҵai&=UJPbNa- b@Xbl;EPɵ"%˨&vKOh61}"k7HkL܁g;+*Rͦ`ul$d}MIcc#a&#l\%-<PKޅWPKE9@Djavax/swing/JInternalFrame$JDesktopIcon$AccessibleJDesktopIcon.classn@ƿuܘ&Ғ@"P *ʁ֬ʂv)C!f+#Y+{fg>_Gn7,;3sf!GX7[|Uu`@Z4_g;',$mԁ"a#QgUmclP v +;|,K2, =QZ~IXDT*cg>TqODk;L[B2yBsj3d(Y'4xJiF:G9'6\q*L̢}t]Wh$} e[k]a4j=2 y1GP"9{s|69L i>`^spǀXf+MSF5OY5|#/MK760 AËXʒX+QF2/c xxΓ<'wPKXszPKE9@ javax/swing/JInternalFrame.classX(QÖ-ɒ%I0^In)RBRJ@IE pfGitMQ >|xp}& } ?qR-uSN-XOg XZCLyڬMvz9S5PUI\>EӴUMVuXqP_nT-TjTtaY(,2+bXHUA%B%{e }p@A ፙ]Fg|f%M>QEeT˥J>CJ4-sRfƧ3@V5)(pBv*xO];m֨)pUJ\&]S>JD\Z=Wbs|faie:U)݃Tyb4U * 0)Tܬ)0TΖs{ug}oumhBm֝NLKXO}4톸WN^tZjgS@-BD[=7n{D7t݉eeڬG3 aQ/4j*;VFrVUKg0fԱ ^c,¹MպSp|;?^Λ *45+0)h\@R \&fJ-;$Ťe' MJN,1URtmwnr, $ϚZw*Y mYa,;dSl C!՘\kB2 RVS7AjM%ǣJtâрG!&\k蓇QɇPɇQGP:擏 ||'Q' OBO>1p#w"[ϻ/Ew}]tOCz %W̡M^(%qUp9!|~)}aWθpOsn29&3A4']4l(: .aX '<(!dyus\+DQg8G#j.ƍ]#*QFfˎzP6ljΗBiJASRq˨Ky?񨯆5Tni. g}@ \,ԵuHwru9702/D> OIm.+Y ~. m&E>.DVHE!r%!rnJe!R[RU)rYuPCWHLͫBdgxX.pr !RBlKO ;p[\vϳ|Zh9x^aUrUx:@jB;@V;@!kB ׅw)@ o ߏr`U|M ?@ !m m ol#m;o#E3ړ=#!|Yv++*|]FaGRa< I, ߒQlFR߆("))nK\<*;e#)~)ޕWȳ y~,x.'3?I8(!&3)eI~ 9J$o9qzk1x~/x-aN-^{If$doERSEz[q?1PKP[ PKE9@)javax/swing/JLabel$AccessibleJLabel.classT]S@=F*@)PCД*_pKgt2oIP8?x7 Q2{{np=ӿ3MYm[-[,t_{u#`# fHQ޲-ɼAp:3@˰ұIynOfPX%Ü(05#F0(r9d0 K1R8ٰ{1 YjuU"VCRgBVOdIdkڜMKQNwr*#-ũ(P@{Bs}KZÐ1Ϋ9jn!Kg%oSUI۵0:{tf*I+;W|/ڒ' W,q BB<R&1 Œ z>r: SsMkKXx;J;j6}gAo <%cOڊ?f`ӅSnVhۮ|v; _ia#fA@ fQī`/1l\ S5,Lr Rjjsa5R{Dc|x=ZK\Hdc#b>QK`1`P KhlA\cj< 4 . ձv %2+) L;4i]]i?PKjPKE9@javax/swing/JLabel.class[S0O*(r-3 Di}r?$)e/)rrOWE~tGʂ=eݡ~ J Jxp4A`XG9g;g񱳖 ߉k% x1'plHtܯN@c,^&fm(T] m ]M޻8'6R =v#&ޓ`!gd.q~[M897ĖQEf *[PA m+\Z^àД4qEoa+z,.K2{F1ܞ=o0.XtUا}A0O.˺jK;-pg{Gې"8ʹ8rjcuԅK-ru"Tģ\Ͳ.Fe#?Fțm6:EM|lʰv_B1x\o'ϲ]9&Ki1jШ⻜S^,mЏ~TAsndTЉLO^/w_p'>Xp 2x.[%@/\%y[Y).D,1F$f TdQZ0*Q! l7xGUBp($zf<<{-5\ jDhVJVJv+m,'Ihȏ&x 6kԤlcBC9Uˡ*ir,CV9crB*ΞsV.L9ZLZl>hs9Y(k>9II3cI&,Öybތxj@<5# ,Vd\Œ%X6!3sf"V2_sLLĺDT^0#DXLos w^%PK۵ PKE9@5javax/swing/JLayeredPane$AccessibleJLayeredPane.classuR]KA=W77uKL! X"(|ס&t6v>~VGEw ;9sf?>`Fнk^xErx%l4F Fr6m"tz!RGii^aGuNm;} 2Brd2:%Kr2F0GE7it ,R;I3ϩwa\kFilj Ĵ ӈ԰reթ\5=X"y۝7ڝw8fPb&2['M+bw,j! PKA@mPKE9@javax/swing/JLayeredPane.classUmSF޳ ~I0@$$ JNL?0\R!e$Cg??ӽ,-x{N7,uӡWkƱs1k`oZ{Zׁ;j66SXDRNPB$9*FEpgݢ5ud#Cs$XtOVxO"KqcEkZdeƗYg=}җ9.;_|pJ+?!c<p](fR,' r@/d}<x %.Ê~ 82Y}$Va x8Z{Q<(C 5|32-8H#[#BǣUXP{W&l=QoہW#sq ,qgˀi{P"rM܇6Xo#@0HPhաix oFQݠexSxg]'{"9يgB45Qe18:(3#HPKPc PKE9@<javax/swing/JList$AccessibleJList$AccessibleJListChild.classm[G )7^$V-Fبдf ӆvw~6 /g33H1dYyp/K6lثqmp j ӡ׊EM qA' .0̚pw@S+ %IH8"x0׆Y^0 nwR/ݍ Y\* qo"CVbyBδ\<R,oaPp"Ê Vu_q{ a Ϗ( 6eb0rN >ζAI\mίd0* Tbfǝ[E 5Je˙iSEgT4 nfp#s9^7N#yߣ}S貑Ye\.)`ہHQ' NQȐbU.'li6$&Ӂ>@_~+>I=g^x~wZ) ҳ4e sH0Fpt*FiG{$lXS7I܌k+U?#uHQbLVL022d*4f"Ƣj2hĠk ikZ\s^:`ֹFֹyS\Ɗ9u9uޥ69oikoɖ@aF3Z6Zixb9Іs^|چsA|ֆsQ4_ sd#Ă bsӹ_h;rjOQ2!["^)k1!VZ"3l-e&ĝPWk҄~® B|csÙ·J,=T 7{PK5BPKE9@'javax/swing/JList$AccessibleJList.classV]OA=V*P@ *?@ &1<6m>(iٶۭk6̽s=??x$b ?O:-H˗UzDf%._0nDp-u xNpΰ-iJ=zҶH1u JUR`mд3nTzMiIo![/3$ &Ai c$8nAa:Gf*o'yϩR]1wڷ |onj!#¡&&NsUm͡tqUX.ҋ /4<[>nuaI7˵bڿvCLI bIDR6հ #]U*}unl%w4&̸l4QXi[?Wԑ]wTLi}P~h1LM 3\ Q3 Cn#Rdwn9q$p I bltTZ%QZh=r;Ɨ?01ܢuMLҚCm%ebƇ`-m[p->9E{^~ b~W} `<1[+zOnG1Bt/" X؋XzÿуN}x}pIկ6}i3Jqva!2 rZe UXܫ`\Fnlq1d<18`fP%Ct,-&t('f )B8@0UEbҿJev()j{usJm 1b8ױ"HPK KUPKE9@javax/swing/JList.classWi{YI2#cCVa}$N@ |#[$A h-=ӳ: bl+ 9ƇÇoʭv,1 Jc̠jeʬޘ0~IIu;!&Hfg * ڟorQxxK})s_ m3K7A)! 9VcV>l,0ϠuEA+G3k4 ynuKzOb3kV鳆D٠p4ؿSe%^dT^Zayۼ27+"BݭSHNe"N/2۞pkNʂ~a u b=Q 4DUiv!5kAⱑ~4]!LJ ψ Bq?_>)dU%f-7Qu !2)rkg!mBx\X\bn-H;8Ha3m7ԮML>RwsR؇ra喰ut2ȡ$Cbac7vG.[lc96m"*#ȅAv}G['1oۘʭ2/¤y7.MYSkNiT䈸#&j$#" ghf0qǨ5t 쉮=(vpND/kD'J퍋D>5ۼ!Zi,(DwWoָ aiκEE-yw磽lƵnb*z+RO}ktl uqF#=I3:K9eE?m<ֈţ-u8Bs(qUWɮ:S <4}͋7 W`^}sSeuOWPG~Q9YI\i|F* M5<5<56g2ZvQǓ4]/^:KOim>DC/(}&C_T"3 _R"'2 M%DNf@VU%lͭw)2ؼD2 ˲vE+!l *V4WզN`'ΣJfu[JP.e.wc.}sOR)>Ч:OS)>{g-{A_cyXK[C\g+ PK恔!PKE9@'javax/swing/JMenu$AccessibleJMenu.classRMo@}㘤MMSII|T!TEB \z:vcK?qBG!+Λގ_p"{|t-$#/'W.ȟmnQV9씱 -ĻRmDN|v/@qrh,SֲS-Xy]_Ƅ ;Ђsk]Hn3e+M}ȟ{`2;]tC1Bk0T3զ F"%mdPpC!@J\&^{){}N(Mmag~#UsCڣ)$PJN{5)jy&CinC~f vi bQoH?їM1OYz3eJ(S\%(TPJXKSUw@PKliCOPKE9@javax/swing/JMenu.classUVF=c&`%i.АĆ$$%N  d%ɤSڧՇ~@?gFFg̞=X_!0unfz_}jnv3 Tӳ,LYh6M]JJX&гl*eAsprUfͳ#[BթYe= gJE6|Es˝ㄩY#a 4OŶr59`)5Ze[ye\Q1*g0݌z6,]s`y( ,yMluuv46n­A'w;`co0d82!f{/'20="8 C!x k B0 cѐ,T<4AB"85+,4Ga#qd݁{ZGJVcw!x.}I91 Q݉s*".(lҢ0PG:o:NwOScZ/ŒT'z8 ^HEG;{9Cf"kW =BighQ]WLZL"S՟KKJ\"aE|!AVȗҚk"%RmFBA7xW1K7Ze%x oEynڂIGZoǷP:rUSW@I].EVN hFo]YuAgM6tl)%/|p?A>`PKWYujPKE9@-javax/swing/JMenuBar$AccessibleJMenuBar.classSn@=cM\B&MyGEl@HRP`Ӫ vS{rld;, >B\;}{;~&4|? 28~#Ku]Wı}ezN#W0.0U`@DX&icP_>eT'CylKDX^/V`uRFh;#W Z+6Рn7a(Xp3+ɼ0ФbBoVnc'/|Jߔ^c_K[ ͵V49ASNRh.t׊wpJekI^2{˧VLO^vp t<@H){DePK ?PKE9@javax/swing/JMenuBar.class[S1OJrQDjDP.Ee[AEOgvv}r?$6M$_[)HH?sg?/1Q[^ 2f~L)!0r>+ћRpf9lzs6dޭ>肓 }\]潡#p薩M=.#c2}̳+!tZ\VcC k'XP_j ~VC\ U=VdG6k"lu\ h]Qv(&  5GE̢wZJ?B֙S8kWJm^YGJz(Fljʿy&W!*b9,+.aS8[‡Î{!v1C`G-_u 6(j06IHSzNEҜvdtz</ؗ@vI}4OmT=dXrF;-Y"0i{Vrk>Ji+1]&p[ehN[m]-]4.F9rRenm=aujh}[n+\ޱ'ys[yy>Sn| Lx2tC ?J 7Gcp =x9:iCp$cBjȷRfH) QiHƵ(vDSD=ybFB;c|&cc0b2F14i &V9W{qP,XjFœ1oKY:sZ :jU.Hhk=dכԷG-:ļB̅<;p7 prx~܇&}}d.xPcX1!c yb)D! q#^`݄((sxaB,"J() GyooPKf PKE9@/javax/swing/JMenuItem$AccessibleJMenuItem.class]KA߳ٚ1o0"hz~H$zQ GIN$$=ϗ痿`?GދxG;WRV>DZ4F{r NMDl/t!@;9(Rz+tGFXeBٮ2DŽJ uJV,ZmFN"-[rԏE%ƯI? ԲXP$̽ ]ie3v@X Cs(c/I,/UFq%55H`fg?.e3΃=gyPl }s~9'dEk"XWGW/cy,ṮQ7VjVlՉ/y>;9I7ܵPKa*̍.PKE9@javax/swing/JMenuItem.classVIC "((D@ 2nЃWMh㸓BS?ZN|˜z1` LE#?h%xXV*#˶33/ls& N߱Y9c{. y$0R^;bEђ[,-{G?81@CLx(O1)bh)XIЉLXqi4>6"J`IIV1$=>>hu׭dsG`-jNqD]A1IY߲_HKxZA#{gy,2Re8Umd;|H8[M5ߎ0>YdcWfѦ zaY.ԞNXy14wv‡,ei3.Sֈn5b2rqjҏG,%&.?ҘDvɤDӄWƂ3{50yp^Vx̅ioA]Ui̫1j1A.uhUFVIƎ-.ޛ,ݠQp;Bvė!*t6J=VsOYbJalK# j宅)CQ|"99}<棤3~Qfj,u[\na ` b3M0[j1ԄQX~U“?Oկ0_R018#xj(EOn<*32 iyHLAO |C!o8ϔN^V:-3df$掰ĭD̆+R+bNX{aID\e=b^X#iA`UXT"nĚA#wEXm#d;HP/Hzlj-W-H,s?OZD˟EF,갼hyu۳ܞ/@"x7b! ~rÃߤ<dPKE9@javax/swing/JOptionPane.classXW6 IuRq a/,d -.`'}7}v+iO9@wfgW/"\g{;w N_A-uK3flc 7 jCC˴7nwjFmVwRܪkө\:]J>G(0LaΫMRf;v3IUeޟ)LPJ:[.LH`0Kolb=0D V CJn&_KQF8䔲.2L9̧C5jfMVR@l >JP)H&w .G Q^uߗ qOq t W=ҋZ٤$Н:+ S{C-+b!R}j%SJI`#U{ :+KX/ ^-L`x=GkB*W.-[@TbKP2`T]j}"rz$m;Am۰eqLLV^.LcZ/>8Vr+Z6ի5jݓ&YF*s*dC CKCA.M AɐgDJz5NBABǒ)s0Zka"\5}T7kuʶJ|Bpi 3|~2Sh- L#[7B G7 >lݣ/1ѳlkKe8:bu*y U.;..KY. e5'Նbk/yI&Jfu@Lɱ9+LUЌ8|Ddx7O)G(^; C{o@)Cch>D{Xxhh=+C9>18{_ O~I?/{oLOm=#pVxگ hOz:'7]v ` 18>Q>GO*q EJ4Fʠ5#E3c/ .ž?7:1)?J N0Hs<cGxXLghr4+࣡"KpXFxrx !qɨ+zm7!5cuXDű;, rra:-pqKp-"(ux AzQX'jF}ت_w8Y^~Pn}]iF3[l/g;DV9$M) iUX"/"kJ Vl 6ԽΏ<+1FsH=2܀#,G!7aK,"#E)yJ-"w?VW~q[4/p^/ ubY~91C)B)rk)%S,I(>Q\a_S%(x;"r%qTƯc/?66eR|Q|Sd)ߖQR\d"~ ۷:vs|ŝus.}~:+ӛ-~y5ή,"Gw7N#.u~UsW%J߃잴';IuX{KOx -VUUS|n4Ϥgmݍnteꞕh]#Fq?>wGGOh=ޓ( B7PA7x?_Ȏu A#C%~ MA?yG+N[`Yh‹FKgk ı'Y³O-b\;ɥۆҿ+Aow#?bPKT$PKE9@)javax/swing/JPanel$AccessibleJPanel.classmQ]KA=W77-ʹȠ2  mu6v[=DC?]CJ;ܯOذ#l='6Jߵ/a41qÆEhvcO^>ҝ]pcPV'Es(ǂ i8%JѠ/~7 DJߦH$lgqQ3pq{/se 1ب؎,lYoZ6ِ<ߏJ%Nt:2Iԙ UzfPJ;J#aqB(4/! Wa]HXEuDx"beXHUBjf&uMK? -2޶=D0!,O 蔷 2=nƣDT--&gLʇQ/=e0*-e E |_V7OW^_)J\7* a׊#`c\x<oq3V\sLlvڞ>&3Mc3kmVa0 cX{N\6 t6l<1`0`wgyAsoNܼn3/X"Yg[PKHPKE9@9javax/swing/JPasswordField$AccessibleJPasswordField.class}R_KP].VB>§"A(Fs^`WӯC=Prr;ܯOhΞwVS1"8ePo/֙Y 0[ LsTPdj%-9l3/PYPK <;PKE9@ javax/swing/JPasswordField.classTn@}8 MS )MC  aZ!!CR'Y5F-Nۏ'$|]/Qƀ%߼vfV_ǃ* B{^ɹo޻Ir_*LB3?*O_Jt:ʨ~(ލOE|G/5h#?!tute!gn@=ªv2,JJ2M!O {V_ETi@IfOX(rFnK"U@X<kPa|`2M4-GL q_p%?G.B"vN{'#~y"I||*Ja \<;t^es$o7jV"q_g"7323˸?6BY6nqMes;#\\ W[fa[fasbUuY?c7Jg|קfnLff_\eJ2ܘ-|pf9u94OxNr1}PKPKE9@1javax/swing/JPopupMenu$AccessibleJPopupMenu.classR]/A=]]ڥU4T$DR"!ާ5af7;gy?wZw{̙s:l+sEZޡԭFCMմauji#C T}ד~pWB֔ >!\*F%d̖*&/Z:#XU\Fwi댈u]k5!gWaѴB?4$W'̿I4f)j mKȞ-!T(2uj$861ؘ$ &r1SH*aKadj##P? A9:Q|x D[P'q("~l#ScYNfPKŽ蝇(PKE9@&javax/swing/JPopupMenu$Separator.classOJ0mmVW*ԃA"=Ԥ$[~%FeޛyL?^`5Bq'S.MTR7cY +jc#_nFV1;!#s- $d򢹟J{%$ 3DXfP*G*KsHHƦ3yZc#oTkiGpNÿ;=!brtƈY90{3?zHC\رTrwZCz[u 0HD,?67fqrـe2i0}ZE̵lBQ-NnJVP3M(%~.X̧ @\Хph#wJVfCOYIӀaT5E S%ahz0(qXnsk?'ѼhͲCˣoy┨MTfo-ޤ%JManvQ5+ԏφc?ogz',ڢ5p;WuǷ"oh]#fsXuXnFR y%3ήn^5`No*Q+w՘Gnv*$8VL?Xl(& sEa?YEWYSnx ĩa-'Y9 Y}Ksst~? :y6۽9ᴮ=”wPѭ{%'HC:G`Ms ce3,o}1 dF;g<( /G#^Oo?!: `Á3x|) !?s;!Mb#qbZ/!y-ǴcJp\@ObbFDG-:)QCC1QVźb6&E6s]CRqk*Ұt)xYOX W2!TߵP:޻nIWF{~kXVr B9/*8 C Icpjץ{btGEHyC|U)1lh7Mk-O p&&Fj O0)ATGvGI6F,hOyW'=)9v}eGx @9Կ &P«hu.„bסgo`e[xZI[P~?AjN} Hsq| 2_|q ?lo*m ̔y%EE>[%pme:@I?e&PQ(L%GAaCUzϕAGpP(>2 >0PKnPKE9@5javax/swing/JProgressBar$AccessibleJProgressBar.classNA].P*-EiqDo0$DR eRlw.;y! "nJmwٙ;sΙ{ ^Z0o_:\z=+LP|=h!ϰ5x◮ :]F!ˠðɪjKO flgb s6,<* (1Mjcp#=q N©5ƺ𢟐~WA;ݎj9tMN20TMYBP\29!\ɘ9$%tyȦ\ }v(#v1(<S C+9,pg- X?ԟ1 ӴeCJZIROԳ*2.ף,pIDEZt5> )BV~om<]I ]*e]%._i3ާ 070e3a*xG0 #j j15Ä?Iq)x:l ?ŀ95>G"n(ųxGHӑC,osQSW*,*\p #PxY\R |[·^g˅[-߄[1fK)Y$< &XP VmF0qǽ*bNp+%$IWUCrBkYoJC\ ms}ļ U(r[p_|\vU>r3Wۇnq{=׶uF M/[b1;X^{œ+kaϜ op߂?PK|T PKE9@5javax/swing/JRadioButton$AccessibleJRadioButton.classuRKK@m}X=h VOA)M& ?JQYff??bF0y?\݈ ( JԓY p+i ѝ}BgdjyQ'W)as;!X`& ,PBKl,fqu0X0RB}›P%JF  ]y:s/)Fp.}_COh-&eBX3ChG%4 6-ϟdyȼrrR*L 4Per5SJJXe^gťhc7PK7;|PKE9@javax/swing/JRadioButton.classn@q ^hKo\**B* Zu-NbĂgy3'A_kO?h .Uzeq! i#UpLI.o V,y3ƜڟS}2JF0bBb4't$Ƨ宽w噊FKNOkwGil,w1ۨ6M4ňȂββw? l"lya7 Y:;&DVPe]b+E,h&PKU>PKE9@&javax/swing/JRadioButtonMenuItem.classRMo@}qR%q~QJ$B5䆊@%R]"ǖlũ~? 1޶b>xgv7~0@Fa;WnC_~!O$ #Fڰ]ư8җO|P{/|`_1XBQţl,242dz鹈pXx$K5n<1  }"?ѻ[0m } dm}.%.^ te:)$O JN 0d=Ŋi㙑 dVv Q^ mb(AZp7#jnZJԺjj]+3n(i2mδWf>',PڿPKX&3PKE9@/javax/swing/JRootPane$AccessibleJRootPane.classuR]KA=W77uS󳴗Tz*B"*|_&t&voA~Ttwbb~;s||ņ w?OC(BW{9! ~Gz~PO|Z$[i;z>C!7!8#}- =,!W@+\?s`y,8[̧":ց?)`Kq,Jig;ރ(%7F-BΓPMhXjFd}T"i}=dx3Qa%q&ZbhrEkPK;RPKE9@)javax/swing/JRootPane$DefaultAction.classJ@MjhڂѫPOo㪑@m}-/DٴV/2ig;- h ßzw 햬9=1f( qyM\}(ʐQnQ0+QͻI;R~u;o=8k?6Ep͛-L}'{w嶨Cq^ IjlI'洔{ yOPJ4•ܔ gٯ< Vd&<2clj +&0$i$0EyDUL-^c[N{ LVCkeݮq#P}pܥڋQvKy,=lFQTeSBO<7e϶MBǩgn"CCq{W%A !ÌO5|߶<ԣτ/$Kn*LP8r'Ả{^Zr ť)ENQn;#vږfl*sK1y/)pKDU2m!˩2$=YݠCM7~`t3PwPwV(aT ng$,8|eNPz74l>005l|cڌmQf}fM+0bGZQ9Ţ|Z>GH%u`}swG| ,~oo԰*ۺm{;P|$TOlY^.XcckUe25MږuA]&\-ףץeIņk<6!W[ n3JꮢCiٶY;U%^5:1X@if{@g[ U.AzǣŜ\xmjDEߍy3AގU{iܮ~uvX>G~ ĐOCȉ 2L NE>"ǩ$JO4 դXK.EnCۆY=3~-)WHB"Gf~!-d}Wȟ䛽5BMX-hQ) v(ډiZ"EYPtHԵ {iuu)b^Q&Rky.c?']p;ĵPK|_@J PKE9@1javax/swing/JScrollBar$AccessibleJScrollBar.classMO0NCmXBKyn+]6!A%$n&XS 'vӤ(em*(wxm C+淝FzO]ƾ -@\‡@gw#ȠPe+@5'=洢Vb 6,Cʓ`4K=鉓hp.'i pϕ~4TS4d_a7Rv~يW븜JHc~+`st`VN5W S?R8Ҩ7><.X`e25LHHorY_3t{>{O~k)y*Qю"UԒ%^Ѭs1FVFJ.=eGK2V=ͺa#}dmMHmb-fsBVxij؂yPKh)3PKE9@javax/swing/JScrollBar.classU[w8NSBB)nJ/N u@)[h%=B'5Ŭcs,Hrq"747o,~58ȃA`=mOZx `&*Ac3? qfO[=Xjs苽tqbU>"`VU/>8fk*˹\ j;+w9j:Xi92) W Y;YUfMue6\KT[uy|-9).Qۂ|6CܐWdB:*dŅNE52CD3QwGh6vG@|*k>v=o0G٭>q;*BϿ%"T3j"wV!\6*DN"EpҚ8ƻ(Nx%ٿ0O*VՈwk4L&(ԅ|{I A3g8d#,#Pt|QKKp}' \Ii9[  (x<,m lmnsPN*>*&Z[h^) P1Xxױ "in4`/fGtT_A\ =Sz%r9L*ݦ̀;IRL%6afc GB1#)9 U-iUKj v |Kvthubȁ \#=Fhh5!|j ȅTDJEɐ\TJK=g5C;`]\NEndi"7s$(դb'잞bMCq_O؂:EIbSSC]Gq'Ŏx➦z]QlH'48UIx )6b_xCE~}isB~>WPKE PKE9@3javax/swing/JScrollPane$AccessibleJScrollPane.classSn@=㘸ͥ iZhHcO $PoUkڑugx(ĬS99s9_^`~qԵ;O8 eIq s^ &^ I03N e¡&8c)B h"BU"C[X#tyelgEXK}y=vq`Wrrs=wp au2"Lp*jUCۄ[qCr,ς5!4Hľ>Ϝn,kxɂi;:Ke"fi:z,LFsK=ͯD$r<#-j5V`*{_K L3ꇐ*] O,S(2K0pU`b:6n%# ^};}h`mA]m-W.HqY Mle48#, Rsi^Uw8] ]ЇPKznPKE9@'javax/swing/JScrollPane$ScrollBar.classuN@)JRQADD5^5$1!ƈr_p55[@_˃1Pi5v23g?>n 4TQQCɊ |A@N8M)HvSw*{)hMN)ȸDc7[a&z ds4z;Q1gkqG`h˰ o@TW (%\OBfR0 9#4t筆YQ. T5'*Irq9A" _NXEk~ ДQVE;mr<нRW%ű\ mBAf^\~O%LmFѪ.V,NGΉ=M} H3%2I7ۢVEa9 6Ih7s쪌H0iKe ݥhtϢx48RCIjǝnbINI󂒆o )ߴ֘6#tVTvRnWuv ~Wԛ{ 'U?4鏶Hz-!-`_$S tz[%Ss]ݍwB޵{OJQdM0&($~E ql > e={UGcl/'C̨,|;8R<X!<8b4>80{pH#]i$|i^㨄g4 CM'.:gQ~Rԋ\w1 V-V~`3@%d@"m"Kd"<}cAFA ֤GBy s]|2@ x*E>"7aK"4ϧB<5fG[5 !i!~񑣇PP A)R_TD,uS>$'g;4g^(vB)Ł\araw%¾/eP x-$\9˹'QR1cyE^J*NdUߊw1{OPKcB~PKE9@1javax/swing/JSeparator$AccessibleJSeparator.classuR]KA=-,{ |0"!(qjBgegVGEwXVs|~8Ž s<)}׹ˉDsϓƨHΊy@O|-u ^!K_t=JPo.j+s \,!V1SZ^OCG(|O"PQS#Ra? ,x'(ݏl;=gΝ?;.BDP4 .~p: ENx,QGWK+_X f(mV૬GU<@P*-?p_"1 ?,ֆxA|_h@K%T<*бK pS⛗) Xfr %p;ݻ}QpG X2e1Ҹ~wS2F|pP˿G+~8ҳA-ms& XHo9;Wcr3iHj+y/yzp W9Nf`sg,o5c2۔na>[%9zmPK HƶPKE9@+javax/swing/JSlider$AccessibleJSlider.class[KAY^kH#( *%}`G6ߩl)Ȳ3sy|.6, 7;^5y)Q+@^8"X0oB[^s-dOґKt;`ȆePa(5PteRF; f˻c`aa4 &m0D jɶtiԻ9m˝d=w%V'Lt8O '^^ }4/R-USG̋"Uv'HW~A  epK2Lk0#VB3 ^{͑5O VV&~j`,3(jrӤ۴+~ W1 gAd䬖|BӮ62?JLބTcf)֖B{ >ࣩX:gPKt PKE9@javax/swing/JSlider.classVmWHSW]Q4R^DEPR,Z]ܷ!lN&e?O{~?jޙI'C},Y=g<~Vl@nu,B 3jc]pWp(ğya>u|F8Α~w|˱<#DuWƗ)50)pg#m2lUgV2?D"w6r@evl&}|6h mکV-obzAԳ>tj7&Ṛ^gԛ&ЬjL,,s((ޠi?>óoxNI=H2j15 x&e> \Ϻ?HDŏ,ꩌ6)Mv^?bqSp,1DH<o6Q+bvݸ ]V ΕX5 v8&lp0]t=B G8ܗ{_@):C9Ď?-Ϲ`r A\RIJV̓*E)}Uqꦧ] ΢kNvUA].9OvE`nZ7X\iWŔf1Y\i(=7Wyq#e#]S7"ϽVram\ގ:g`eʘŲ15z=x`h,i mҠ:.a;7G^C;,x-|0gG<f#`YAs/ɋh {A@ _ *#GBmZ }\5 ѐ#$1A$HEWc! QCCyĖ)F(H_<ţp<2Lm6&#5##gjgj1 Cp09&"SQWŨO %rLFJ!Rr0T5C6C>"pxT))r^8ۜ,ER)r!rV|9'E.’R'RgKR:\\I\"WXRZ m.Ie;0U"EpmBAE:OPl[r"EQPl YQXUPSSk j/DDAņ"z.(bWMSSj-G^E6AqHQёOB_!;_!I<_жW?PK#2PKE9@-javax/swing/JSpinner$AccessibleJSpinner.classV[SF>k܀ |!MoICZNbJ."m`;FHkBSڇNgٕl\ym1w.1_p~LCO^{nZn-Ly?nQRםc3[ i$P hp\l\kT#-.( #4\%:; )OX{aLSw7uUECns@Ů|f!;IX5X$2WS6^tώ{(A tL>.WS2Lemi1&J 𜺘%i{LHAF-&—uk#sTFe Lw|<6Vh Cf;܆m T@{,8ALt<{ȣSqGj@L{XZLܠZB?%^p! ]EuCH`4/9̢ʥ)p%:ڕΆ}o? ySwظ;鲅cN|±K k'-A][7 !N-s:Id"fe65*/GxyIQbzj%1 ha˔ի;6$x 0Kosx? t]=rǶ4C PoSc^^Y-t3 1<` 'h&+0 3@Y9Ppq@?ӕ0Wc wAspf~&iMʳa^ܭQ5%p]&Mŀc\er/!6p'R:Ł$uلR;5dY^JRqcr׫G5Rll7cݍQ[:oǰ\ZJB(pCk (;|}OOcxz,eQk9FZZ>1,7btz)v?V,cG\9ƈ)=Co~x20'P4QTEſ3r)FI{ExL 4#_푯sUmHj%|E3@ERCpS PK۲/`PKE9@%javax/swing/JSpinner$DateEditor.classN0E+-e(X)bo4A ,X!(sD#9y' UL L݈;Ѷ{4r -/v4xH^CQһr-߮URЁlH5ȓV\zܖ{!3)6ZXی o0G`ײյǥ00VL_UB!5&L+!e[[uռ0|̇ !J``:Ww[ޅ"U̓&s9a nTr{RɆѻEOSP Rq+PRPa8$Ɣͨ3r5ȺN`,-@:5b,)؅2XM gqי 5`DN]umXyJ*Ŭ BQ3LBBV?A`c4U綜6q "`!)Yq@#q8}Afۣߺ\''9n: Iw|0{o}"pQoh#W^&F[z]`і])زBDQG^h혤d=yXOɷ7(",uI|:۶:YJ!b3ocLD`X)}[)O5bNJ[ČFz'^[ĆL?׀n+ PKuMDPKE9@%javax/swing/JSpinner$ListEditor.classmOO@lQb<1boC!Hs8"ꌀBc Eƚe"fCC)(Y[!TPKӀ;=@PKE9@'javax/swing/JSpinner$NumberEditor.classN0iK7VUl G@\(H@饨wS  Jc C!qXH$Wۘ!EX]P w]9i)ϓrӾ~CUr'LԒr9/ei K)Oچ•Ro )e0oTHXJTfx6 c6kN+ೆ8e-ږ+K(\K}m +eh+URm$y&xvf ~!"b-y}7L96+P9LFw|SXM';^s /]gxBĜN%/RȢ7:N:Hgtn% c$V\:=P;zBe :I90SSEPK`NHPKE9@javax/swing/JSpinner.classVmS@ -ȋHA *A,0S-|;INVW?QK4| ۽gooo 2HNh*7)/e̔!F`i'kʆt[NUUfYkytrOtdf bYȒR Cvt]*9CZŘ}- RBjixɴJ#Qh=qfC`Up9HOFHF"8UYnpCVvi1@J53PbZs콇dy\aE<#f7gSM5I#60P#0ҁFn VxъW'L`ԎɪܨX^d:5zXKidTYkVLXUNχ۔l%-WZ:N7!fΞt\ɼQ1Uɝ9̼'8YZ{LЄMG.ʀ Ӂ 78Ywda2iE˰饟ȰN`"?5Lх VW m|$ R;Ѝߔh0kr{[^&/4 %kȷ D D^H@97`&̜#@lq1&DP|p,K(;abR| Xw_ JqOLԢ_<8u@OR(T6 CڥVVM(J,Hi(Q4J:kBN8Iy ssگྔNpqˈLA+҈\#$b!1+ag ҩ,ԻL<}=bOd^H]RO0 ԰nH62=J {23U s=R JWac R& 1F@B"e9nl kXP3]_kk -`QFY ux 5]M׫);bV QCfx :FER1 ,Dyk֒3,cq >`窽^O"Y~Ũw)b X̛%F N ]ݠ 4*WZ^mqgk *y.I`ڛM}et%L_VQbZ J\  OߨfIwd 7 1342-aӁh{kPGt`&Yd4i MĨ&XM8Zo9埉]}͔_zsF,t]5x-Z*~~!0[|dndf c0=gx-qG<=xG??/Oyg<+ď=kxp#~/z/A8l|?qkNk)@W6]s`O&-sf7:l ȋq\2aYP+scsZdlr$pdIW:De&=8^FLGt\a7{]p} nS䏦࠙e퀹e0sLws˔:`2307o!`ߛ[\f 2<|\.f7Ui-}jK}$~R[ U毃c/ZjPKcPPKE9@3javax/swing/JTabbedPane$AccessibleJTabbedPane.classS]o`~ނ:`B`[hLF 1&3})i B/ԮbC~ï?~x*w|?jioh$3'GH3Ptgޱ'ID KtlvbN>X [ ")Cs"'z*m?chwW/c50b9**CkUH\J[MG%IK0T =dUI>M3HϹK5`a s[ ?5OZRiugfД%DH\-A\1u"5,+5\| $o30 sg UI$`-ySqDL6W4z0TJ%J#ZBt{DqR 7{|۴l!`N;eF,P-k!F4 hG=Ef܍ie0Wbs%6Nq)H+.a63QNvZջY'wC!zW锣AV'8EPKQ^qNPKE9@+javax/swing/JTabbedPane$ModelListener.classJ@Ic1XVX^)@]tKL!U|+/DٴB+ 3͐O{X`֛-Iw}ٸ,]28,WK@ozb!KJH@? ֲ-īsJ&*.8YtBU5YarF``(LY rU_F" &縛45acca@'ND";5kh]GJoZQ]*`J~,dJ X ܄>r200 zig0yiߍqϱwfm5@SlԷ1>ss iL[y,5ꗰ6&VPK$PKE9@javax/swing/JTabbedPane.classWYwFc; dҲZ;̾I,NU'AHG ]k>>GΌZ'k4.s .H{mi9V7s+ZJ닚I E`cشLj]I`VLfﴪ=KVQnN.qL7^2-X&5fʅRe%?\!@\̊f4i -=P> zj4sl(v%3Ax$ cêS.AԠ5[9ApU F7O7tS$3º! ~8t77Q%.Y5X0LW:@)b!p*SY9SldkzɌ:x.щ\D + 9C dM-2t&0VYRT}Vl^8j ԟlr\lXԞjoVӬnjz2,N8a3ֆY:xI".vwi9MDЎwzGgF<=}KrHb7 mLazh6g-DZ 8Je=]?9 9I@p D8 _E#emyq\3-Jڎմ-C*mDYjOAے$WŲYzN-g|vw"tw8ŗ5Or2n,v^㠑L]^da {[E\'͘f[h`]mzGN?;}:)۔[ n?vwObuD!ůhqW9h|<|Z;9B{fQPy A)998+ ķ> >;C SLf0J⪷_"gyT2\G "2G% G'pI$4W)O%兙>}!K[/&1]"+>')G("vZˏbgٲ?D(?ƒ~MY8p#A~Yy*#XHrܲ:%C\;!VI]@g%SRA [1VBvX*41bИˇWzށ%s29 ẁ7BbTME֧Bߏ|y;Ẏ2`^iEbhPY'wB#X\2o<xu>r ,+e62q eR}{))n/.fs G^z[IU-5XW-bZwH1dZ%C3 PUbTl9v,TJdR*Gr`yh[]ObxSϪŸ-S[V,FHYҎZylw*}|kZ࿁L[PKxAuPKE9@>javax/swing/JTable$AccessibleJTable$AccessibleJTableCell.classV][G>"$h1((|(bJ M[j?FnAԋOQ}zfvl6dgμ{|Lb!^; Gf^hG :ԶJшAּu`/d=wb0L`z04 ,N2 j8fϭ*!F#f01'P h\./DKfIx`, Hq 3@bZY=c@aHKaE4k@F]wsD~6z}ԛv5E`KA&Mc5f`X>=!:1[D-R+;e]2͕֨CP'{5Jfwӗ醸}M`)=^F=<ֵoXPs*_"W͡Uy@ "(T?[7.EJf Tw4Xlg Al;nop۴xKAˆ"vMD:7%o5u,sLyc 1r7'N6V+rtXZ 3@R[`ykTuR ~x~O R,;+߻(eh"$)E:. L{6. : Yw 7-_ ИiD0 4*4aAqƤX"X&F]4|}J\󺔹w>oHPP25XW2oJEP2oIQlnungM [J欔*sR6 ROS%sQ܁JfN,`.I๒2w3y[2_`H;RU)j/( =eaH|F{|(U8PIlBHKݾ_ P%W=ߨyOwJ~_ WIlAHht> uqD^G!?PKyxPKE9@Ejavax/swing/JTable$AccessibleJTable$AccessibleJTableModelChange.classR]OP~޶6 㣂i0sddJ!3m˜xGsZt~ φAxu_DFo{ $. ?}Ga"TU/d Q"g\,Cz#2N0E͇ 7[JO?ȤAXh ^H[F!EW8aK᪋Y90qE7fC9Tz2GG}k)~?[ZE_:ld "\.-]Yβջ0e'Ʈq8ёrV5FۼD$6X!ָ+aY`b %X1_9 UF*\Z}cMI|p- qlefjv}fS=`"=U*a~Zr<Qe{rDeDRegc}>Al+XyuXPK6@PKE9@)javax/swing/JTable$AccessibleJTable.classVmWG(* BkԶҀ5PA.7qw/==zzgvfN{2ϝp ~)@Ğa=׶M:XS5_(@\Bb7E-/.8̠M5-?u&uʮfКzԢN> q0 .N ^GS=ö O`25mcl 5el'Td.R$0UVlհVla\?Iืk7 ײ۲;exw +f6+y B,(5â6u835c`1B$pU?xDu NmkKM9B.Hגو7aIoFYhEsv ˧,:"rK#7$:a+vhC3" FALSԩhVeT&[ء^'rTv٭ LNWWJ CI[^9H Wų$Vq.Eu8QRI('*uU RMg-?--D$PD`by##lZT^O|Z=uM b ^ @I 9$0˾*uOfg0(T5ܘaMfHJ9ι!#p\-sF fBdtu.)aJ?JUsi îU'J>B;Y.ÓEըð,覼wE6IK;$NXz ={Ƚ)w:\Z.5ѻn:}` Ͽ3wYp2R3&,[xreg 5;eYt[a,.?\.OP^N{ezI@ 6Zs@p~vO;~c=J">y!Hڰ G|a`&`0@uģo㮾gY)u!>G"bUQ @< qCܒ⩤!I >CS>g0ZRkcܗQmr|tz\\_W<>Y_Scd BqNgfpgrN>,w#n|n|/eI!M8ж(+IUx-xխ*0#Uch\j lKrYQd]}UхOpYR3wB5eЀU]U|{| +WTQLU玴Tl/>a =f7Svl(Z (K%ۭ^KUR s juju.)[ '2vΞWFG*)0^<8K*2Dάb%.ܶB^wX q!  -l ZL5dc*"cCIGCG?0#(rk:{EG?g0O> XD!PK™hPKE9@"javax/swing/JTable$PrintMode.classR]oQ= ,,[hZEZ m\̂+n]HC(ܕ/6;w3s ,"f)m}ԍvYMmv S7R&tG2vڛWʓSU\yY*2w{X}SeXy=ͷ:ۛ BQ$bc< v9O 4߭aݱLB0)DPKPB:PKE9@javax/swing/JTable.classZwxߕ,K.%Yl˖-[~dl˲d?#lA$tNܝ$T iZ j5@衷@IJ^{v>fvfvfv|Bqw)*¨eX9jhz_떝ʾZՆ;ACWuh3d2eifjmg_t:c]Ѭ: j.יl,[UhŅ՜5Cc%1F҆iJF ;ЀȪ9/QbT׾k=ν{;wں-Na4-[^%7 y,靌LMo<>81No"Nڐg* A< 6^n QX$|6f nf麘9H>nFƳm >n/A!*'&]nf:lEKQaz``nV[TEF0WxNd!wved%INV*^&ɔu(riOWlHN$dܵa4h8o`2XXiޣ0-OFts#YjíܡA[_1+p5j;6Jut$r太YA"_ȐK'3m/;q=ToB'`d`-$}tiJ3XhΑhh?EOJtȓ<Ҍr< OFc)5NHxI%qAujYJ)?szibq7ض|MjetnB o 䭎[3pg@6`CHP|h'y;E;B;M8F⫱qZ>D NHysLzs@Ud"]`˞9 "%&=INƈwEQ+BVK"IYjË=;=V\b>e친`t+sZMml~ {4}ZW+<127:x+4f[*xIk`Ze&Yz%=^ /x6$o;X]ωյǃNS]w] p烝0R:#< C8A 9^ v4n思O:OxKG9~\\BXfRrEa\(0cȠH_ĪR\$XIbD?DB@w//2,5T]r!KƠ1Dd2ȩ:E<_,YYJ FCBWqD&аX\#bk!ru= }Ty } }2'>h?X7RI'O3-!rc EGC)d92vSPB#o;gi]s zgR!-jq̟ǹ !WJt=r^%!I.ՈrSZ/^hnjtb83tgo縜7A旛^|p ϱ^_akoX \n rgs5K\λVK\{$dWo\$;~l.p98wDl|X5.#s98%TE\%}6QOdOj'<ͽyRPoShH= KT#(SH8]_焗PƱ)d`(X`"T Ð1b݁= Y9-v/JFQ Y) ͹'o@.o(*|rR͕_J8|:R~C -}M)=o 3$.fȷZ"TX?zG,| ]q A^Bi*"0%󚯹& !ދ?AMgf"VX٢4\pXzD _MV19Sp@{i='}ѐx2O9Zk+GGʁMХe&O;v*K=|#N"]!hږ3)RX@u0axG&hJm6W XǺK-~ Yl3vo}q75?dT 1Byn)Za- [\ZTG~{Xؒa|{I e\%7PYA-~M}j.b22|/Cc;<W\XrZvD52}%T b+I]f Y[v TM3ccLY(<-.8Ӏ &0,Wx+d{'IpاbSpz7oK[Y{xbij+C>F.aF1q/3Vbu(`OH5iSNHI` 3f=x2}H̹sr ʇNEfʧWYq*eΪs~6F_e͑{ݓ-8f_'gk*b+{و ċl7olK{q[^CPK; PKE9@javax/swing/JTextPane.classTmOA=^-Hm/RԂH55*)ՐoK)g;rWqvo=.G3_/&"B{Թf a0J zװ 'WcFF+n`LWm}ϙwB[HV:mR8/j5 \=bCm3ev# LFC T607LQh@ K7\P98ϻa7EM DI9]uO].z=#6mՌ86=zyN9E `s; D~#4uNy/]G(9@̧8FM LyWJ/;(hB߶ x.rviL^NCmvkgpM'7(R;PXjn׫ myK/oxsJ\6w| qi)|NUg% <'i?@[ɜ DмU,m#%9V}oa!Ǭ[%Odۖh-* |$2E.b$2E.B + ?\u~k8Ѩ싚s8Ek%+3iG,d@6/=Q+F؀(o#Yxjhj)K?ޙ(=y]gDQ)RitI[DPLufؗPKk PKE9@7javax/swing/JToggleButton$AccessibleJToggleButton.class}RMK@}ƶjƃ`"hQP6.JM m[DGT(ٙ&o=vE_*"ϵ<+f\RG͂y#*BxrGXF7A!)#/,b%a3'T5w,a/UQ3y|a݉#ˑJa@Xsk6>ėwb=󣅘1*/_ؗ'PKPKE9@javax/swing/JToggleButton.classMo@qӸ ~Фmo E´7T"!\ZƵ"cKS ?]oVx1\8F|ү2z.0 ލ,\T gxDži*2٭50 THfo 3痄J/j:\2 > Bhr?Ex)Y>ɔ[=!4::셂Y9'R(`pɩ1hL)D R1@WY]?iOܜ7Q丹xa/P? "M:N,O /3~2!ai‡]o[W|AתvzGX`ċFc'-aYtŭ [A 43pSnkzn.ԺU5Sk 3lnX1 ,ޮF=ۜ n O|3PK[PKE9@-javax/swing/JToolBar$AccessibleJToolBar.classmR]KA=W77uM3{ R!#J %}܆XgbGC=Q%a8w3`>2; :QEߘT['a(UHNS>*&kL<1&} )i L<QRD7oμcTuh1O;Qضy!|lGGPʼn3e)ջxӾiĐ $!R {鈞) fW8?øw\N, Bp 1K5lxsD(.'ҋ3j%\7ݶGN_^)?m'١/'d-K:MStuT8Ģ /WO#1&߰ʍ4d0,ckfJ`2P|ʨ-WqiJ~C>\G!\sfenL- 8 <7ΘSdNbdXۗ, PKn\PKE9@javax/swing/JToolBar.classIS@_eMٗ [eAP)Yܚ nAOVy,_:!d2 ?3F/!ub|طms:%]RmY25Z*1!17162@oX %$ P-. Cr-;b.ΎOH}.Q:#{'.U\׋ I9HKWIݨUפz1p2)FIrZWƴy!%b ΩC=+il3f ;ͩ:yȫl ;7W?HEԷpi;eRnIVV#\l6ށlm[VtG&p5̊ :\U[\Z"V#N܅P's}߰g_8%XnجTI`"&. q;z2'&B]lЇ! O[# l u ;4^MA sB/c%)qg^t*Yz?cz|LAPAϠ c\@\ȏm04=UAR%/P$m.*p7 |R LSIH1PєEc,ᝑ12jG㉌ !3^Dh3`3&q"*zrfR}cFs2V9TrX;ܹg;CZC5Rv/ZG9i0F"1Op/pO'Z 5 _$ 4Bor̈goD% Ȣ m1˼9:BP/(tWxfPfcPCER[:Uc?pPK&L<IPKE9@javax/swing/JToolTip.classN@TZD0WCb!nD#:SJW&.|x[ *Yt̝{f_CcH&oIڷiql1d씝c ӑ`Xjz](%%g8\Y!q(m1K s- `<  SUiLJ+x@N[ܕ:LƼ;J5CVx]g b횴i)ӡҴ8=䤉B)԰՟ƅ⠾eM)[ˤΣ['ҿJrYm-P:V6.r:)֟*AHOILb| +M4$Cɶ0asHK0;Eidd Oc0 A~< JXQb_2E2+! PK^PKE9@;javax/swing/JTree$AccessibleJTree$AccessibleJTreeNode.classV[SF>kn k $@Lh:b*-(dC>4??ӳWY粻U-kovr/ 4ȡtz[ש'&A=Af4kpڶtJ1mYb0q `c\>M ә*z%j!^#>3nϦԑz*rtFqK:UW{k68ár+PiiBp~^鷂E](N\d^mڬCٱ~!.ۀG@kV DD {6OΦzl}Mt4 `25_Xsh%,8~a]+΋a,R:XXJR7x)/|p䞅I[ 7 mu-v"z!>/ A"0V$`(1vdo)0U_j$(;eX%(;O؄PCY.DXa.)e j0\A\&i=9TGw 5D UXcƘ/H5eX z'WRc\X=:CdaB xdy2yW|JSRV\M+r4ĺI?uH/`[ɜ2w d&]xdI{9/e~e}E\-Jgᵒy_܇7J撄̔!R!)(ĉ?_A^HP&sM6s];oGA(t%Pp=nq'T4xӮrLwd O ]ޡN/1\.1?1,{ƐE1$4RыK)q%>dFC1Ad`_ɰVh;:ՅadWtsOw a7 }z|oQYZ42نз"P v=C=}۱kNC:IJ܋ "ҿ{R(amACì8^A~d7xd"cܯfqGElk`?"qqfʐNUu뗑\3de[$'0hkZkPʞSxuYo Q]!UNSqE(-I]Iv?9okmaE9Oa[<‹ 8$Ɉˀ. ɵz1odp.k5-=iZ0P@Rp @5ZF"/h@{B&2pS{yPdLֱ X4f7Mg/!3@}saȷ %Eی(:jźxXDAEݑbIRVSWP,)vwe] UPv?CzЕ#x2U" eb0kMv pP/%5l#qL$bՉ+`|v$G(I#do"9=g14B_oz69sP)pPKFu\sPKE9@+javax/swing/JTree$DynamicUtilTreeNode.classRNA} ȀhDMDM:Xvt.X +?Uↇ*8P`;-uBz t_Yq:m 'eȵ_ O a@yS4;tePnjxI a,t&]q7w;ܓf(i-ӸZO'!6#EO@tTJ/՞|Y;q 0ۈdd0UxB1Z"I9a=!!@=B)o ,8"G(/&>JJ;YcqfelXrPD^J !5wqN4}~(I[#ഄq3dI kQBYlטI2%7 Oje , 822dcQw!ɬ3J_nrMq>(kׂ*SӠ_@Ueq*|PKOWPKE9@(javax/swing/JTree$TreeModelHandler.classRN@=[Jm R<*UJx$q&PU&Jۤey3{9#^]EGPlu0\49JR6ȕV]Ěa O& NC 2/o(!^ҌmQ6ײ碼s(r떿e;d{(d,I, Xf+X/a 1~tc/k_%S\P<ɧs(SKQ / 9җyPK̊1PKE9@/javax/swing/JTree$TreeSelectionRedirector.classRJ@=FcV7`DI((EvЕhV|?gc*\̞9+M;+WNY̼`L: Ocq؁M((Ԯ$ Oβ:kU A7axnqWtr1!^da0T頴#]tPZrNQ{@(x"$ P!7kJTW!BX|/eRA˗" 7D$Y|ߤ>yT,k/Vf\mȺu*$C$,ac[`^BPhDb=I%%g3̐ؼ` 2JrˣkOx5>FcB ?l0əPKvPKE9@javax/swing/JTree.classY xqg|(qع$IH8Ȋ-XFRpںyc/vm' J)B *wK)P(w(BjGf5ѕ *èhiBۮM*yYFMEutL9=b4X2YӔ]JVw,W8SJ̝Dr0G#Xw33ؗLE0jDCnaYa#JGF!@L)9IF+le40!Wbi.kߘ%Z'*['{ro4hts eC A ĺty2ӦN$v RRgR4d'XNby8#L첑׼!ND(SZ.턃> MkEdhm] E[rW75s EZ$mML] ]ve\HZa i{4وjkHۘQsrhjZ e`y6^W; 1>gX&/K*Άm3L^tf*2Ri UvCUUʹt֜25ݚ"βH67#hA1 e]-Y4RDF8d6a`GH! z'p0j1苚:npcf™U5YӉ[*@yħ`XiD̼4͑>D]yu6BFZF@ZbkZFXxm6‚B,Z\tp]nlo4' :amxN* 2iO ̺M3vX߀Ox"i^Ќ"vCHBY'e,IЗj->" jQ)MI(H;MkWkOR Bw#oQ'b%Yd% nbA:][3Ag K x5\59,rҨz sfx- g8A|tgmJ`~s*8; >a8!7Ax@!Th*C(fT`!4f\fxg2Y0͌[`<υ|fƋb/e/ f?ۙ*ax3>3CPգ ;Bh#6C3KoursmP'6ךtQ~P~ [P7vb/ .mcQ16 _œ>J{ e,8 d W`=lD۩4[Pa ~ 270? ̪'pĄ旞01a>kD97\0epЏ\T. 2a6Q'22A*S `(׌<`2g7A 1B!t7bʊ ~ 1J!rHA 1F!"Slv5Ws|py.p9ar9χ+Z.>8u\΋ [빜28ɑy\fZ6&NQ/Sss0wι" "FA^# [!VES"P_'\] $[_ے7@8tq.>tM%G89:c8+ѭ>8rC?._\{wuDg\λ|{w","\Q$A.!!C\·#B·#\œ '=b<&OqO'Vx\g|@g|@g}h W|p>|އ ~}hW|xE^K___"x%x DMΫMbJ^ &`oQnV0e5OF>yjuoM}7`o >Y-xG7wo߬+f $B_ک!=R|(b  B"P  w|7|j?PKh:o@PKE9@/javax/swing/JViewport$AccessibleJViewport.classuR]KA=W77M7]Tz*Bz)|_&tVv4[=DC?]bΜ93_g#G>@z\XͣxѹCLEVaka4GJ5|V$Rw͑SI%?` {QbylQ&eǧTf9.`v( 8e(LSwneKP:J)BhfߤnCaӒ%"%,i}x^ N*l |xl4.aմ_K:*Gy4ß6PKa*:RPKE9@(javax/swing/JViewport$ViewListener.classuQKAוfeQ`]DoEBPy+wFߪz+Xvvf3g?^aE{/!Hg* zJ:1M*52 m@L 26AG:f|(BB52Q"RIBܩyHs0rbe?^tPAXbC%E JdԗWJ" KDhoGB~Ich۴`ݎH͝an]]DS1 v_2o}QQPt-׍hc)NZbwncx$*~9<ҝ qigrc"齰TThdJp pPfPMwr.5l,YWd&uUЫF60ėF0Mf#X)}18E¯ ۽:abJ(t۵ukQ uv( GB0&qv.R8g{K#xݝO#re^J(f0(<š81&mz8%;[[爠S#YDf,*gN"K::B::rm(z||ZOԣ BLlI69냌sx @9Hu9*愮^†wX=+x/rҡȔ/2[%_dބ"}o"+wb^7G{՗}x? |\;I {d8 K!E&߰PlK =1Irq"UKgoS2Cl Ɔ s[>Exbn*RHY;f%~!lQ)GFIfCxdpv':]i'A=lpિ&0N0Y=.3|mنV:~ 5'9ڲK_6fcܦM։]p)r-JuM*sQW8I3LĩoKba螇~1:/wItR&R5p iv>"C>-QgklW!ܡg&0> dODۇ}&mY@#qk 4 @h]U3U\Mow)}S򞚂8G6sQi:CcPc΅y7yc!N mΩ9ל*NO kl1*HrXCD"V!f#O)!HDZ! XCE"zBEb>ReQZPĂo+^[ `'6PK1] PKE9@javax/swing/KeyStroke.classnAƿC(b[@V U*` ڄH &I;Jw2P}+2g nb|s_0ILWotsv"$O\iL"ϥlk~o!MHw3)__X b2{w:zsͽ_B9ZƾVF1hUe=i\ĔvKQ%V5#:"-vi8Jl)dvtHAv"}Mh94Gd%K+簆˻'c7P< ?U ƙgMKp S Ye*OU2-bP dF%(Ev[;;UfURV^Q5Qe\rr zٰ3's {6?PK"CPKE9@,javax/swing/LayoutFocusTraversalPolicy.classAK@ߴi1Z\ZR)6.:faT$xI,f؏ϷwFR?[ꕫrRkg9_E?JpHo`NeƳ .$tG'sB0q7&F[ "l)~X?[O Sk;ײEw3$>7SnFϚ8$ۓ"9MtSj=;}E"Ѱma[4YAPKeAzPKE9@0javax/swing/LayoutStyle$ComponentPlacement.classT]OA= UJo~P `.> tj,fYlW->h? b5)s̹gΝ?/Ħ)?_rϦ}yy׷Dj;o* 38vTwêR]Y߮w"e<]Sm^6O.-6-%i0v"` 1 '!%GK[*FJpG*AXE ad!(ìnڢ봄[-K0uͭwM(ȏ쒅ntfHᙊT͘~ ϑmOw;^AHB嚩<*tt͹d&s`UCk b;v 72j8=-Ly %4C{='1EiNtU;A._RA*PJʾhTcXE+Axof|F9)|Aw>H~R3F38@87=z}y_"s}ídXZV+gx0$͏U<5PxIuK7JYs LWx-iL $lSiR4}I7WW"L<֋*3J & RR~R :wJW6ሞv-r0$ui\V]+< CymX#[Òs_ؙEX!/n#HѮi&dk"%Fğ`| `I&9rؓA1ėl\4g6,)07 ٴKV-C1o8cpqDd9l ӌ)>PK{2Ȅ%PKE9@"javax/swing/ListCellRenderer.class;o>#Nv&FIJ ̼t}ԜԼԢ"vF DRVjr PSzj Z܂<^ >X{FEiBDKKS2sRDmacd`d`fF#Y@,v PKuLPKE9@javax/swing/ListModel.classe P O`XpuT* PU|4sD4C$_Nv0AB0U.EGN,T=r%.&Uh2)焑}pv%C֋n`w˔` GW&mgE| Se?65DE[heB%yPK}XPKE9@$javax/swing/ListSelectionModel.classuSMo@%i&!PH\9EA+9)"iTK<*5nBk(fi9={4pDļ~$%J0űN2bLPeN*(TI4䟣Q7:Qx4}3:ʤBHXԭ5OLV.a{"3JQqԝ# tp1F)2A%0+߲6ƹi&xUmR:G vrՍ'SiGD*̵}|I6953$jQ cWp/PIrfR`/3}-3TkRy/̗j`7d|2WLyUPnnR|oR|߁}-9vxY܅Ŧ}{[bZ|;yKPKՙ)PKE9@javax/swing/LookAndFeel.classVmWGb"6AZ$Ql J؞XzN4$S왝oSޙ yy 6 )~;'uPos~m3ff!CMXW^3,CHW{2McyHCn`@mXl;o2ۼK=* 3'!p=|&؏oJԜTCߵ|~U0lip@v}H+zn3!{?O+hrLfA%{ q|Z]z%NblΕr:zD`vw!_a&2֖6ȁ*|!fQ}u\uͅt7?b].yK5qIMsPU+&7@Ϩ"V - /akx&}W g@p*^HP09fMb>]hYv_v}R6: paT:tG9em'+4%\8 g#,kI.xz.d  RIK Uy3>D GYy0˧$H[?6z\`?i/WDG7K1N QP1?;k˶ @H߲,&t.j7чSDf w W1:p7\ >qqp3Pw=pAȔTt\Ff1ΩXf(R仪OIY[Ձ(^heͱJ=]9ϳ㈟ f'c8o8 ܄LfjcXO _" Gpٰ+zhyo`ny/~ f6DzU*GtB jUU ɪPZđ-j+%4e]X&Ub%pkM0&UO Z< |Ai%ϨJ+ \ԅ H`7ӌZt*7uP- e F1#[2w *3$LB 0,랣Mdayƅ!Ͼ1v f#\ m/ J2TSljDS\x `i׶E#[؆/oH$pnm VFDe4װ 6^`UާkKSڦI\{jGv>Ino aĮWRpp_{BAd#XLB\z>5X/ k='x[\ } _ɴnP2?2L~RvOȐ%5=I H? 0 3Yx@yM:O'vF/HTEZg1iMyXe#J&f19}Z!I/3١l; >}P b*_~\9 kAڦD唚XO;v~G 1sC6Yd>-vY6=,iUgq.s%QjDyĶ؉p1n^IlSPKWڪPKE9@&javax/swing/MutableComboBoxModel.class;o>#v&FIJ ̼t}ҒĤTܤ| vF*Dv6FId(SR\sRsSJD5| cd+N-*sâ(57,n$? E+8(9-3'Bl>t>#3EvW947 T$PK>-?PKE9@javax/swing/OverlayLayout.classn@qۄ֦ir$ @BA U(T,8X<xƤ,ޟx0c+դvlOmGI#j_ PKR0RpPKE9@javax/swing/Popup.classOMO1+7jta5@#%%-O&(kwcbf;oo"E(B< [=Op#cMo$!s].iz.2|Gz>^ƒPwELN4T3BkppT/ғd5Wi  #>=AvLj`̆zI<+ey6ʱ{|/~$Y|Fbt^$=70nZeXyܐ ˣ\XdģҖU9|^Jxȿ駟Q2PX[iܶ];PKt;TPKE9@javax/swing/PopupFactory.classuRNP=SS ]MF$$$DM0/FJ%m+](FJΜ;gp,4Bu gd޻ɸ)^ 5@Z!se;vpMH.AoE!ڶ#o'Do( mîoZ{QKBI*D1T)fpGcבNpk5> a=I;#P+ O>?ų -~Ǯ=c"\cNx?/mO&{b>|Gی am1J`̞R,~PXCJy2DeTag`#MlTvR !GqWs~Uj*kPK0HtAtPKE9@;javax/swing/ProgressMonitor$AccessibleProgressMonitor.classT[OA>T*EE+"*bVk&$1b|_`i>M>G5=3r] 2s9͙? #EUiUЫ5OƸn2XNV jQU?(-JN8A",J)6TJ T@r⥔ H'MoƕN5C6€!EW9BxA8~L`4DK3&-e~L`@$GpІǤUۜzJ:Q R<^j9qyH^v" !8Z-Fqu g{@("_3;7,!iǍaV8#߻1Ɍ[6S`ױM¢\qK#޶#3!}`=LŠ+sƑU^މsV2jWb#=yVK{P^=x`.:27%cp%.T rHh(ݭs;Rc^Xх=we82<8rdz`:2_k/n;kmVU$J7t"EgYA?PK\*i PKE9@!javax/swing/ProgressMonitor.classS]OA=SZ*ʇE (|-_EԘ4)He'?xgv]};s{ula>/+K] ϕڕGaT'XMg d aP8XK]z 曽QQ6A vV Ʋ/.[^݌k>}vQ=b /`w=v4ڭcFxS:{dB#g6,f&25]Kt[?c  9ǕdNy5jw Dk_VezBE%\WC;}y>E.C@C2y@K4ľ TSTlLn%N ZD[&@}zΥLW4CyܯR\AX}E&oa:9:Yq~P0lz;dd(b\(=wa0}L< < L5)*itG[,^jє*Kֱ C.u 37'xG|!} W@Z} WsxڡDĶ\ODVP5On6Lb )teڅWR uO F7Ԑ PKboFPKE9@,javax/swing/ProgressMonitorInputStream.classPN1ˢ ' 1rp!11A4p/`ɲ%>L<>q Aڙ~f_j(`8)™ ޽V-V(}'czRy7bfp$i J+j4VL=S!iiG2H"Pf[2ɨ'!R}w6$Ce뤘r}PXK^^ʙI3f3Crh$KwD}#nv&FIJ ̼tԼԢ"vF~N"P?)+5'=9? ?/5+J,/ч[32p%攦c_ZꖙT Yae`c9( gPKTѾPKE9@ javax/swing/RepaintManager.classTN@(BBa ;f)tBjC+ARdN~SڧJ}^OLp'.̓=/nHҗFeU(#23{ J`йWT`~unKg9 U f*#0thzFMw'n?l.ǴX}s JEeJ|v8,&kYaXz?hpan1t!P>ja`M%TkCqmj+kD( DJsB1lٞ<k m8v/eTZvC#ףVy!S#Su[6=ܸA&rH%lOؠ% kt; *Eяa?FxKAZpx#OzlT9&=x`3A$<0Rt0ԃ$zy ߩo4u BK LWJw$f.$DIHrkd1}KoU=U XZvk %n ųduR@L`xׅPKJ+ PKE9@!javax/swing/RowFilter$Entry.class}R]OA= R?j[&`RiX!m I!81묙_Iޝ]ڍ0sϹgd a:\J5m~/?KI}]ð|[*i: zctcQB2r3,_óC>Jϟpoĵt̉ {O\P{>ߥ ~k:vA0PFB38SM"Woa}ҋ>AUF{!qyqIg+3JOLDЂ$W=0rSNeUJǃ@RvOSg#b dQJH&Y +E ˄sWk"B1׶+ֱA&l|Ih+}Œ]-_PK6EPKE9@javax/swing/RowFilter.classUn@=M> }P }Ѧy-P*EH)&.XkWo`Ăca'i/=;w쟿 t.]kVIՔ  RZhIU. CES,@,~rbC yE_OOd(2C$$H2qJa6\di:kD.zdb1'f)4$ieɐhȑiCIfݠL3sWL҇i8׬&5sd{ dʍ:yǬgt5]@MEMSx7/]-$6pc*ZI=HLJcHtݒI$imi8M.[jE]QµΏs?]ꟾ7t1 Cȗ_ijWo _Fɺn؆!?NGNdcOj5#~·:ar ,Haџ &a+Mq;1B㨽&q "4pfX}i\i0L3C3fqŜ㘇Ns^%\ysPc<~ǜ<ˤeyW{hYk2֡ekYC\%%] q_<.CC;ShŒq{R.wMllV?OPK PKE9@#javax/swing/RowSorter$SortKey.class}NMO@m|) "Q`W&&F1 lɶ'z2G߶ay3p:s#9ް:8㎿H0d$hF2l\;0Tj-oŀfː0OAEҀZtr<~?x{.g[~vpN&''`8$  5C;{Q, Z}9'oY/r.<.L0V6gq jT4l3vwZl3 (`(@C!<9r!mxFSu)u#doK R{(LE} PK`ahWwPKE9@javax/swing/RowSorter.classT]OQ R-_[P~QILfcV^xZײdKY>GϽn]t33gflDNR4hj[I%]Wk{pQxf4l%ʾ4LcY$\V󀋚urF_=K8 yf*ŷM_:;fŧj;[țl;+N #øܓŁ-=Rkhr]A2q}ͅhz6?;aL=s :UF}S5o1*`WbF\E&Bkr4=EܗBG"Tv9+}Z*FOuu< = Fs|_PKw*BPKE9@%javax/swing/ScrollPaneConstants.classu[O@gi!&!M(zOOK[o6r#YQUɅAd=;gh?&1GKgs|G$DƓh0讠TL"H׋?hu nI#5dnRѬM7J.cڸg lJ}EVB[S_p`AlzRd+UU2UJ*h:0=iBqhILZVUٸzIUSEКѽYUydx@ Di.<[{؂ ׹,41%#Rff< ^GC/G<9r6;AWL˴ʁ2^ߣ ^?`8.EƩ2 mppq)x3}lW_0~ nM!wx (PKXG&7PKE9@-javax/swing/ScrollPaneLayout$UIResource.classPJ1=3qZJ7u[MA( "VOǨ<||+GwPq!rryx}~aFǴ|*3DZ'WWSUU9FDXɸ32YmuuHB8tJ |sn:o8SÊ^ri&M= k]?WGѯ6Fdd*Fb1s846ḌRg.ZH#?c1"`]_ PKmPKE9@"javax/swing/ScrollPaneLayout.classU[S7>2Z8P+!kb !'ة,lYK.>OC@Tg^2̮VGw.2?S oIRS>P\z&[A BGgVC4%m0 Sz{,ъRO Uu97Y)UG`?&p5aEȥOǺ9:5l"~@>"w&ر"O6oE>@;ڇVS\GwlshtgѳQ.(Gy_S<׃;ZP 8p@q\*;CSjCisx'c(~qC)tJ55wPK4]] PKE9@javax/swing/Scrollable.class}N0Dž6P~ B$  D5r A<B#PQ3gWy9g.̜7[BB4r:@yr(BR`A dOaF`W[oIOY::HSwth֡Czp~ɷdO`;SFmO p)9\o*G>,Mk{1@l`+w^?»5 ou )\h_N$<}FʕsԙY`~ҐAXn<{!;n \`*!B1G); AH:˖Z.xx]~ )@~("{6dRzHBD_(2>QCnvhXae oBo5ywP4"ytYiU#d'A\-Kd &וx#.b-ÊꙆU9{+A\Fz9ͲZWS.Ƽfݎ06 f̜msFa 0ck c Vϙ23CކtMEn+a5Nh&z2%"g^kv'1avgT17,sJPKWPKE9@javax/swing/SortOrder.classuRmoP~.ZXeX0ߧBC2Ր1H !~*.R+eh\24,Фss?oc_!~n\,li?C}p2`֨6K 6Z D2iN\oi:ǕR׷s dmetjJq C$2NݱX˶C!#M")|-#0zɠk'Fo2(Q = C@81I06LvU5a$|At/mL{/Suf9ڒ^Đ[҂JAvedb^oUDg'&v|g6Enx [gCÙ伛\ZxXa0I>5YhOG^L  D+_"悸 l\ &$;z'0CRDVťRӜG+vwv3ߙ?? 8Bg:_ȰնM[8w6 }@|j -j69c2D@D+]PGoD l ?W&#ݲuj^PngϨOCZQk@^Ձ0j)5WzZT 8+3 i-fZ]Cʏd2* GuR$ 2q@N+-R[]pXV҃K˛z@%(+W9N?[ֱݧKu#PU [JP@isd{d5:QoWNg9H.q"HYpǤde=@~6@uIxᩊ+un}ǍqJc nkW;)}$ A8xwmO$k{偕i;>2*JFSuUo3LeZ{*^{6GhiE ;TccL;R{}BUx<7CXE憐xCry_~} %(KPKz>PKE9@"javax/swing/SpinnerDateModel.classn@8nB!o-N) (PR(HAa=IFe*׮qx&BbP;!Ys9?` :Szn{lθ2%7aNL/FXhVe T=`>DG#}].X!@2p9Xs#濋rSgHi< /msK)Ppǖnw({8Q4yH GhyD1=0wBΜz8@ߵ:'eqEut"jعR'D?76([MZ@P_D^H6aVr)Mi՚$夨cvW{__\%ٸ\WvA+U5*.iL+ ~ 4,kPֆk1TU*y=|PϘ[8IZ"قTHa+l$KDrg%H$oMM>Q}ůZ4];kn4ͅeq'ݢbaA'bkŮ{PK.I-PKE9@"javax/swing/SpinnerListModel.classN0ƏҴ]7JӖc0TD&]L ivMbuF!AOWHЎ72i:qQ9ӿ>"vFҍ~q.ﳰ#58e E ! ԪT_Wk\ swPŃ5\KS\k<\GՂ6 V-R0 Mi' '``*,t`3]k&xIaa%͹poe-raZM2۹\s)\\>3dt$tdj&$&ԱޙP3LBl+PKPKE9@javax/swing/SpinnerModel.classej@ĿV/P7 xЫ [3ؕd}^>Tbu/o`aU:^'`yqA[7x[^@ES*ܰg?%'&M+Bwf O8 JPKyEzR4eKK}C~Mo/"[\by@GVoY[+T~= <]/PK"h_PKE9@$javax/swing/SpinnerNumberModel.classSYo@$ВnN <!VH҂d7aUrvB_OH<Q٣:q,egv!YHh])w>01{>{|evRatkFei1S_ѾdH1B##?+F ݣ{]L߸t{D k#}A *S| mQr W5[(n T/Fg|88qsf~Tc | l`O.rgi,-~aD7* ׭\%bₒ-c >1o9w>pqaj/ǁ]_⺆;#$kF7EHI/:F˒Zz^EvJZpʘ)\4LҋL* MjI ʤ*I}BF` LICl6yg ?jA'AG2[lD2,g6#W܊d>Xs;pϝH#xodkޒĪz;coJ'1t$ %RbI-PS{.PKƂS&PKE9@javax/swing/Spring.classSn@=8Ϧ4A Cl*HJAJ~ خh`ĂQ@C93s'S5|iq沶s"*ǩyԹ7#e%: !u؜3}ʴYBLTo؊.ZUU`$Cێ}VߛؙF@ܟފ0`O?lNBpٿPK2vdMPKE9@javax/swing/SpringLayout.classn@gӤMoz@m&=9RZBI 6Kȱ+)C!B̮MUαzfXG釔TEͦ3qG7Sw߱=VI[S֙L y?[V4ڱeGp3Fsa;pTo$ j3@\ɖ+IyE}Gӄq"_,JV{S iBģi*jG;C`,Y8y!1qsu[. $77_ō9ƆF`.c& ?l2Bwu&db*=c6Z`!'i*9q`xJsZ3-sFaFZiAw^l;Aerrqߎ:pvk)乎F_xw@qkVf~Z88:QΞd,Ը537h626nsLnsNc`boe:zғ]R(+J`/b~:xZa~H3c!4=u?Z"j`Or:mfSQO > 0I֎#>}q~I>Q~ >Q?ϡ~_lD\g7Unw4^| X2X`1 [ -%[š'򥋖b-ZEhpӣ %eaon.ROD`,06X2evĖ˿+%!l{2&$bucp7R J KuR=haMӳiYr >% PKK" PKE9@ javax/swing/SwingConstants.class]N0௲1(YHL,d+`c&Y @"^?/.K>޾~}-\;D2?z^&p48`(yu┿ ޔ@KF;p9%J@n d\'K#xԽg~CEh]5^ >@@y6G:!i a(p`koϋlܫ $oa.G̡;THVSⰣgoFJ?vX.AlHA/΢sy>1/^A. K7Лm2^û=8çy.PKcu[PKE9@ javax/swing/SwingUtilities.classWYWFc!@ %$N PK<#}^}9}靫,#䜼sƚ߿A15 tPwԽ%yљ:Z~& 9 IMc+ЪyW5 fMXLU`2=y4enL(ϨNfQQ^*P7eͳיM묉JWUK˺պ(Rrm4sΖ>31lAEan 4 +f0˙36VO˔%Fe{8 5 iIi"eC҈(*Z*_uXf1&J*ZlZk/X, ͘Zўʠ@TKܗ Ӭ`1 JNŢlUu 0/iY73ive3UWU)#@Omy$9"**MEVˆŲFeբ,ll.8!dI*h;D)TĺpT,Vɚq~c*Q?&{䒾iNb_Xu_(Li xIO+U("+" iU?#(hX-rz`LVZ:.Xd'ͩ"}A&Mb0A b<*c'Xq81_b5=Uu_ܣTIi@' .n XsC X.\>c<eB@0l<',f^E1#v=!e%g5Bݦn8Ѷp\Mc=6^>Ytr6ݞs< x"W?ZV7Yt aV]gy~z 6Ѩw Lm} q}VWqaqSb#v#g}cBkiIz#bNm$J\Y"RCpJ0zUuC,Uzt .EKc3:mk\b! -߆Yw Y~vM: $b1R!F+jq1Jv¸"FH~ H qP'3̲.OC7ɞby N S2 'HCl3OL GuZ@=Z9X],/X^Km(}f@E/CHCoNEީ9t>SWhO׊ \ͯ Z; 0q.#E70 *2CUH^JHXE-{Kw{7vc1za= `.Xw  td3 S0k^cII%gAdT!dc%$H<ȎF,j&7aP\E@xY!UQ.| o,vcmX c0jH3x'6wolCV!yS" (W}X[u!3>Hc“˧DʝiaZm*I+5/2vׇn Hywgy\q*nni|ORk/$!j'|‡[O~PKJPKE9@(javax/swing/SwingWorker$StateValue.classToP=o ]6&s!!20a Ŕ2RaQ22"Mw{w{q)vD1'ti5}۵?vBstǨ!ðyN,whu?ªcdKLלGj6w6ea{Rdzi㎡nn&?F[Ji摥;}wf1K%2lוvJ&7tu 䣼/c0{3C& B)k3,"e ".uA0DXkxh Q$2; K$"tauWK >:CeQX9ý%n,>*xQ#C墑9n~.- B3|U 1 r4c( ϰPKA;aPKE9@javax/swing/SwingWorker.classV[wF+8)FHh݉(]b`vsȓ,/@|VRGFڧӇή,RvW3̷sϿ w kosbڽR?;e*(渰d(zyK Oq{U2Wz۶ޱULd&Ԝ.̓ 34+ Ӧe-nG`֙❚.FBeˣvl*V.WxUv_0Ov҆zԦ&Jn)^,;-$&:cA-^_ 8.wP7]KZ1N>/ LvUA`qJ\j=[\ÔVdYױq jghiM!c8&O8 fndGb]Xm2= Rsw(B wFroC ;ԉ9j]@ #` /9֑Ȃ᳐D~IDHDOon P_)xC|({njoBn%4ΦvF8-p,6)y?PKl? PKE9@javax/swing/Timer.classU[S@>[r+Rnutԑ .&L6-oAr<ل !ݳ99i8\?WyqP Fլ8VnɩƿHi\XLgfV+~Nbc[@_'HH^Z PPF% zT(~U>I\T 71µc0#0 wi!r7t1OKHrNqIq.=2dF LtE&bW`ΥؒgD#ܺa!9\"!{w ; ˰Ui[ 14yPuW}i؀M7 kV:} c@ |.:vaХؔ%_lÿdXx,)(P1I,bVBBE\kN~XP@5ϣ@zPKN,7 PKE9@2javax/swing/ToolTipManager$insideTimerAction.class}RJ@hn|'E X|߶o ~%Mdϯ;6EG<ҷA=ºz8ZJtZ5ihA(ѸENSȎITH- !ܩxeP|>V!qT̃0Ű, >(P)- iJD-jZeб[[-]Jslx0?! 4割&[ٲJ9j(X. s.eN.kT,=p}+7q9S$`\B^_a){B15ٔ?tcgKpPKZ#xPKE9@3javax/swing/ToolTipManager$outsideTimerAction.class}RJ@Fc*^Ј"HQ oUWD6i|?ϦE{d쐏Ϸw;X#lދxGAz8z%nj@5>*lXHPv/멍a!Cc˶R#$ԄBzmB}H~ĵkUr6Qt1_5bUEլIZ( ո.k黠e>{-&M6'cSwLN\-]'e( iVB$2@(7{,svy~@g"##tn W>g1^ f1Ϋ&0;a {¹L8jGsl0S"/PK)syPKE9@7javax/swing/ToolTipManager$stillInsideTimerAction.class}RJ1=;:nuk-.>)PQ#ӌdo ~%LR 7oE[<A-š;Z\K'* uZ7i`iA(tVEPN! d[$*NKnTF(U{_ø]UG,\$8QS0E,>P d- _UZ޷D=j0ݦc67/\ȴdK//mˉ8wݛ[b'- t U&O`h3NA[A/="@.0i<.;fW]5SNea{v/_ lRA}# :\X&f^WLuULquk %I;nO l0q~:.5h/,&ՠI5˩h*Lcvw˹и& jDy5tP*BT4kNi|Bs]1}kLC؂m4I~z#3StQa^"Xwc71ـ}"`D0 pϫZO:` X`$LG|:O{ L^>YJYxpF,pf,s2w`n2a!bCmCIFDof˰&(j$Z(1i$(xb7zc]LTmFƞѸQ(OK$F ;2&(dzsBL`B-u+PKOJPKE9@.javax/swing/TransferHandler$DropLocation.classPJ@}6Vœ!-běTTD!`}ۮuK&m,= ?JM{ .0޼yc810I5 ^K:yd UcNܛX 2ҩT2;cQY&Ref$Cᢀ"\B`ڕH*q=y X0̢ǵ4ig2ehEu٦)Gdu 7!5m 9]2q!ziաΕRBwb"uŰ?t=`nRڡꄲEzkR40ãؘ\ oЯ-d( ,il]hX'pQPKo ?'PKE9@7javax/swing/TransferHandler$HasGetTransferHandler.class;o>#^v&FìIJ ̼tļ"ļ"b4QvF6D&Ft >xlfd /-JNuIedAedK-rI,.N-fgfdc(#(V100203# @&v0 *NbaPKXG(PKE9@1javax/swing/TransferHandler$TransferSupport.classUnQ]E(mER{A7F_0&؄j423>Q}Ό\&CA^kΞ_Ek>_jP7/kg67~ͮ!ҿV׳l7Ê Nע2$^akMCְnz)L>u]s$ۆWb +Rb)8R QMMd-Zpۺ|1Jw1P`n?cȅ5eJ͐תTx >ljU?͐0#{quTA~T}Y6LVmZV1NNP6'V dug<+?zC !Me a2δa1D#Que i)ϒc]N Xx({?1Ma7 8IA[$h Tto4'/MOq$蚤]4Pb`+@ˊ ,VT>UB'ܧEطۆbK{YǡxDFu<,,ܠ)i"7,"P{GwZ*橗BK(ȗ*N'H%-TjATDQ"rR3ꃳÄlM>3>Qg7imi8tsnwٳ)؎Ba舝39Cmf<0Bt F/(t")ni֙bGd /_#`;c`(2DqiWxE!uavפDz,SQ\M] ɢx p=WR^7Nx{n&WVEFّ)# [F)zWV'̞YJ-[ $e,2n(;LxZMXv:_$h$DJǪn,WԏA(ٜ ^5}o@'xB3dmv0rEltNnP S1-KkSWcYC/[>@X>/{-֥iF'󐋌U^e"' ^t_/#xUK]b< !;:uŒWls̅OYc2c'avO[Ѧ.$5&gq5DSRb2E꣰'& }~ %d|N]'|N%r|yai4Z֎oUܠN|L@aH}M/x֐_pJ^|[6`T܄);"e]6zI6QQ#=݃4aLb0rDdÚ3 ]c kE!5hh tT,R'> ;EN{wϿ9pe\q ?WGk;m6v^M{XH)EH#R#`-G>KJZZs᧴f;/[0PKQA= PKE9@(javax/swing/UIDefaults$ActiveValue.class;o>#^v&FIJ ̼tPOԴҜb̲԰ĜTvF:D*FF FYkfd /-JNuGedK-rI,.N-fgfdn:HNecd`d`fFY؀,&v0 @jx8PK@S9 PKE9@)javax/swing/UIDefaults$LazyInputMap.class[KQn^JRAQFdы[=TtN|z zm1̙3.5(Ǫ`ڷƑx~j];] qB.V-V[G{SX$mzBJ*MB޹)Đ@C+nԿoIB,F!p qt ?^RcyO8;҆#'ɷcʨ85!uCvA4l[:uKt5,FX:Bh'06>{}b װe<-mO߾a{oW=qΟ8n5CL-X71dCZ؎i.C:o|1ʞC%ť CT t' It G۪pNy"ҠQqS}gĻ6]E;k4Q;*87~fl0 NO+)KA猆e3$S9Z N+\YL0!?|@/N#J2JnۢU$Ks4hδB? R\b|LIQl+FZdi F€Y\n%V#:F;5A#1M_C=~Pk4MI"VXb3TPKJPKE9@javax/swing/UIDefaults.classVmSF޳ ` M[lBQp `pP4Ĵ M[>@#y$~h?u:;B%n+cZF+e9r,ThEh5FVD96\ȊVh]hpEmol m@^7=-x'n bنav#DzpEOqEPħg݁k'k](wwPӅs x)L^Or0חKQp}VgCA $[n_v~8EKpPKYPKE9@+javax/swing/UIManager$LookAndFeelInfo.classPN@=S(ZD##cbHHH*.PX,Ӥ-gąGﴍFeAw 41zQ}% K9l g PPԺˉxAȐ9w^0T?Mo(LdHU8o;Rtox Ep}Gݓa:wZg/AOٿ01v`DtytVydX1zS Z ^~D֖R l2fU;-vAӑjЭW,Pa,;1+E:(DU4XK Tƞ#7+F7z9JT`N3n` /PKقSPKE9@javax/swing/UIManager.classWYWF2d)@Xm HX8q-.6TH2>O=Q=3$FuF?`NӐҠ9#ѰNkbSjU|K7 n)~%7 U6iN&ՠ}˰ w[LX+Nh]k(ݯU~1nXbp4S;\ީAcX=JM 3RhoSxtFE AlV{{qӂԢӞuHrЙhY:gof.\I%lo.Kx2a,Oq]u"s1Cƒ3ya.뉙t(G@gvNkA L.fj&Nr)9΁IfWB͙qI'kȾL4r]jT ˔WDFic6D}EBJb>K< 59G1*oѼPqy05Y\bdgdNiv܄7[i #\ eN^X,jj=<'16^?R:ѫ+-h6`q 3 w\K˴io~G=n$N\ѡhcƦWR6nyV]5| twX/@7g܄[>y?|OBDR{WEz}wSڟ1PBLIÂLkw8w6^fcDH Q{G W(T+Q0՘T}&PiT} f d UjQ 2iit󰠌nFJT]%zV RexTSn}y )+ᑲOB}@z[`QcVzIS;J~r=fc*kƳ΄Ր{\Z>sŷvz[9˯W!?iD7 Zhe635 k7c{7}Kz[qx$-ߝ ; ~oh;fooW&H^kR@wJ 9PKOk;PKE9@1javax/swing/UnsupportedLookAndFeelException.classJ@ϤIڠ{EU4ŝ"vT&ƙ0Ծ+Cw…8܏ q/2IUU6Vg*Q\,3QZU!vII`hakv7cu."A5pn*\y!x1Fk[Y1p;7Ce!db"֑`d1CN({gI ?ˡ,T[C%t% q5q-uFZ+oPK?8,PKIG@javax/swing/border/PKPKE9@'javax/swing/border/AbstractBorder.classT]OA=Ӗ@R(X@, #QIɴL`H٭ ~d?e3,Ps܏s=,`Ar77:[ ](y=^W9^U68mD=vg( mJސ0-!F2^fNWwrBw DCφǣÚ?)@;Hs&6Nн'5AuObw=8l%ϫz{yVaXR@XD$OŚ2IWY1/iMȣ7— ddBMHh~&43ڇ: ys_#%еuVE \j`(x/"9pևcr!W͋ :Nondَ_($'{tup=tLzG)n?ͩ΢1٤SyE |% ѩa-c$}EV؏A[J:[qI AgL0FU ټmX-쭶 yfuGD[%.ŀa2N*)xXs1OM?Tٽ {( 733^# kB0[,;=~iӆei;i"իZX,eSݮnGk9\SntoWtŪYP2YϹ4nN\g۞3.z$yh?ljQ'FsWzT1`&k {.l4Τִ{9' Ԩf Fl _X\xeAFxX< ,` h(쒴Ƅ]šXg7hhC]H='XL8 \ozblJhi2B&$Lp/+s [hӤ7K{)Ť aJ33XI:!+7W֔ʌ|-0Y=ցp߁>)OꃞAxҳ>39=Oz}^Ok뉺˙PH %'k' ?腄GfC3 PK+PKE9@javax/swing/border/Border.classmO; @}/& AH!Xحq+s6 M"xDߙImD&rP!3%AЋ) фef4>%X}BW$|mK %n'{ja U|IC1G*bFF/lTQCVA= 4-c-vPKZSPKE9@'javax/swing/border/CompoundBorder.classQMK@}Vۊ/QoZY6+,= (qH(^f̛y3Eh 5MI#Ӗ='2tg]~Y )c0 ~'I2eW΄+s\;`{%`X2C/\~Nm[3rhM'"A Yk R&ԍxp~]d D݇>O< (*Ϣ;-237Ƅ2BUFR #"ԐLr#&$E5ϣNF: J+5{ӭ9'Elƨ PKNPKE9@$javax/swing/border/EmptyBorder.class}RN@="c1Q qF-i__+~eքj99;m?^QI!ưroIgٮu2#S0~ھxG}ɒ @fIj O|v_0$mW)w F_\)'{ׄqI/R&] ]FY&rLK:l4w϶_pHq4Ե* -B-~ 7r?4WODo"L1Ukmwuĩ ̎h:(= t0Ad4:ӴPt 2Db5Ii9ZwC4+ӬH,YX\21C7YjRM xEgXrdcfO< w#Eu PK]WPKE9@%javax/swing/border/EtchedBorder.classRMo@MҤIӔRgR[! = ")yb#׮M8QډQsξռvfAA|a mot<}]I a?uEԆm~l^@(=7m JKU/6S91U,s/2@ [mJ{mO$:PKiRPKE9@#javax/swing/border/LineBorder.classRMO@}@6|HrZ!HZ!=!UuvQ/;3y}ڟp Z:?#ob+u4{׎tt_@te~,P|~|(0* *Pb 3V˔kfۏ'(y287h0^Zվz_11/AݗΟ=d]Nٍ^˻ǴꙊݡT/g )c2I'CH^W>Gw6 '`cEl0ɱ IBLJX8{o0Kg|2shs,2tl"6YaZ_2̵\fw\enm7PK |RPKE9@$javax/swing/border/MatteBorder.classTN@= TDED4z{Rヨ "Fk5e>QF!I;3;gi`qD{n<ޥ] '@q1G7)0j~'*K<(Wv,y{ r3\zgJt,3E'@}d~`%ECʮOn<8:~ͩ;+ch+0[sڛq  Vh?;՜bV;8܆bXRڦ1Z>pɅjN']XnO?*#hHːg]PǮ$OQ2kW$_TŐ)"Ea &!2T!,yQ37FwL{[zZѮz97y&L=1hi)͸Cq+c^1fu͌Oͳbf-#f5}n-rc弊PKbPKE9@(javax/swing/border/SoftBevelBorder.classNAPRxv 0&$ 1 ,d_𡌳 3}|bEhȧ*oAS6څp!}%G238IRS$3Hc.,*TpSW{ C>P=vtG9f8VF)g E׌G ŞTmkiv+,,pj8eNT i.UuR ^%b텪6( Œua[1C9uGRV!fU˨>GtvW2,Y}sgvvv/(4,W[t]c~^vUd HbDzi2bޒźO l4,[5hqZӜ@б(U#m)N uDTjtFna,U>9o*rE.\E uLP*IfC,ɵ#$,Q* |tcF*m֔ nqLr&UfHuJܭmZ]9wU4>Rqq-̮:YP?yfi^1 25j ,[NTm4aZ:ǩCX6a<Vd^i3 w*P\U7ڠ;0/nK;ƄnaWn$p_P/ys!d(Ep3OYv} |& Tw*7S.;mx 0\A+Wih4㱾ZBLAgW{aaz+*,8.ìpCNXķ4/R|7z}EjNY4g|n A'F  hgXffUtȼ"mPyxO}>;4}a  ă3g=9"xq/a||H%b$-~2 Gl| +l t +*!1F?2kߙ$g%f؄-YlZ̲#ȔS ydp˜ b^1&^ \g;0AΞg d y 7 Bg/,܁Gmpǜ!viѿ Y _u&|x910+hE5"4 E8<9s'^= a)dlE'91ËvP2Ȱ2015D}65IkOC/ZYuvRPAEby?^iuc0L"o'c%BW2gghc5nRnJ^: y(mJ'$NC{w4}frAgSDݫh{PPB#61o @8X,X²<uylmPK -PKE9@;javax/swing/colorchooser/ColorChooserComponentFactory.classPMK1SV[SA<( E J/klSɦ+= (eZsxyy3C1 ?yT}/T@DhϷ_U,bQCJ:0|L屈f뮳>eվPK=/8=JPKE9@2javax/swing/colorchooser/ColorSelectionModel.classmMn0‚ nY"JRn2"L,9nl]p a@X3~<\Vr/]VlD6quF,}fűtVZ'NW“Le&e aF׫Š[bm؞]8- f7᭮fT=}kmb^e ½zC 4Oem9@{ \mPK0TPKE9@9javax/swing/colorchooser/DefaultColorSelectionModel.classn@ƿuݤmHB(P) #PKCP/6J" NHx 1^&1A\vf` KˏN|SӁ1EK: 饹>%JoOA@#@2npƧUT&ӧH@}X8(m47diz50h4IH8" eUP%/:ckXjqC`U!(zZXs'cx'dbC?ɷXБI6#sVg/N.eDEOdBّϾO).Nv?Ùk tkFt4_k}=鴏Oe[j M b4)8ݵ-MJ=sC]s=ʉ韝{[μ ɠM!rT+Q]s$j7}'g=tDo$ QW³`: 7WgT 1Ga9i(0ᵃc;]юD+ϱ-amMl)wOw a!,#C=2~9 1Gy]xM(]iJ`׏CVQygYNkx[2'e37.qX(;s?j򹾚ەDF/PKePKE9@(javax/swing/event/AncestorListener.class;o>#^v&FIJ ̼tԲԼ}Ǽ"Լ"vF:D*v6FqhiIf+H/L #o"ǔF 6Zk!i/iRs!"\Eɩn9 nYt#3= t<;P D幁$PK\PKE9@"javax/swing/event/CaretEvent.class}PJ@}Dc5ZO"xk=ъ D=(oRoy<~8 waw̛7zp~3|g]NjTiXe]! CVMd3[BxKmO0H[J!YbQ '`\ݫ>V:XBHHR])SNf"t*DO2zNM6b^#͡3M=إ?^"W<۪6nRwD=p9bF}z+GbZH@ lm~[PK, PKE9@%javax/swing/event/CaretListener.class;o>#nv&FIJ ̼tԲԼ}ĢԼ"vF"Dv6FqhiIf+H#L #w2ȈЂĒTFE Yk12p%e5@h#3t; $PK %PKE9@*javax/swing/event/CellEditorListener.classm @FQ;{[`E/IH.g|(q/hŲ07;|69h ,o,Hce"P uJoJ(2zFҷgpiϵ 'RnWG;,-h4rkM<]ma[fݵ:oPKqܴPKE9@#javax/swing/event/ChangeEvent.class}J@ƿ1XmMězpţ/EOAJ8[M< |Jzw`?zpa?ם~Qgc;NgN)b®GTLsɥ] p;܎'x\?rύAy]jaffA86͙=!ۦN=C$ĝT D@rBoX{*B{;ؐ$fPH~~PK܀sdPKE9@&javax/swing/event/ChangeListener.class;o>#nv&FIJ ̼tԲԼ}ļTԼ"vF*RVjr ;#8X$3G$$bP #.k5KS2sRQYgbL \PKiPKE9@3javax/swing/event/DocumentEvent$ElementChange.classPN0WJ҆E, XPiHHH0v SH:R|G! |}|~GpIUGn3 Z=n+cKÎ,>a,WoNke,֬ a~: UvOX^x[4ȰaW@N(k+S^%h[Cr0IUqcJg} Tq { p&F{s;7PKPKE9@/javax/swing/event/DocumentEvent$EventType.classPMOPGZ?ތ`UR_-?x0G=Ɠ6ٝt_!P:Ɋ$EGTآە5 nۃ!w~}޺:%Yյ;=*:MOlKj!]oy yZ2MeY4izoGuy ՚֡`@ :'^̠wqKOj-|(b0A15v!7GB\)ΠGHJLoB+ E‹)Iyded"ߊ(m,Ba\ÊSg[ll9 OT`~PK8ݱW3PKE9@%javax/swing/event/DocumentEvent.classQNP=ky(W\7.څ6q%bBlB6CbX~qn FB93sϜ||.nqP!\Y4a~zBG!8+ag3o޾Yh1hz=5Lؾ"=n2lũL)c(t̾p%g>n%3 {˧[ a ٮ3dpK: =i7Hv猹uʩ}σY{׸ uɄq-kqkEVHn/66ۃf r{0huZd-g}ʰ>J=c\ `, FzS.yT0]'}%kߪazFGei UA4R:u=Q\&~}dȹܙ\cR*Vɓ@*ZE7Ӟ'ٛegߠ_Fm9,b`[ c@2aBma;egE`7G8wb ;ghV|Yj$j1}T+j1BkY!D,6ZMJW8Zž.M1E^ !ɫP ZPKU$PKE9@0javax/swing/event/HyperlinkEvent$EventType.classPMK@}۴IZ AobJX(4i\45Ux<QVƠ}7{X3ah `'AteRNa82Pޥ,CI#`(j~u;`0Fݹ(|'n2h[}l{t) `(rhØFyTo"vA(ݑ}/dUԛJڄ:G&ɧA`Ʊ/IyG;Q$v%H 0,}إy5z \"K00CXI )gpYғɗ%_%_:8*t嫴귌M(r~uU\P-|Jl:ŢMվUXPKQ}r Y;PKE9@&javax/swing/event/HyperlinkEvent.classS[OAJ\B6U䭆hD\dwZ1)}22Ym$Μfw;'~?w2#nv&FIJ ̼tԲԼ}ʂԢ̼lԼ"vFBD2v6FqhiIf+H3L #̘ЂĒTFU <[k12p%e5aFdjFf fk2/d:b3¼5\~c_} n]>*Ա^jM!VqLJ> >Wm'VMI5~ڄPKbNPKE9@-javax/swing/event/InternalFrameListener.classPJA(*WOJqVv'Ğ0W3U5,7Up~PGI9peHf띶o'\DeF* |yq?3 a%r:)bUpТ/=(K* m񓞥lV3ϸNy aAߒn4?W3v3e\ϸq3oAPKʊPKE9@%javax/swing/event/ListDataEvent.classPJAqFc1TuS]uaM@M&qБu#$?y$x(g7HЀfϷw;XI!wj>m*˓MesH0LiR2"\50Z,*Nr~Y<) b=l**-a]`ێYF3oH;dB&C$$mƖ/ma' Bx.cubHtO;FMxnMc39:/PK)5yPKE9@*javax/swing/event/ListSelectionEvent.classQMK1cj[A"VoADaaC 5e݅lIG/l̼yo@9v|Gv"-W+#*Z!PN;Vҳx:T kuX3IF {,7?ᱞ5NFP u#H9~O}HuX&^,7#E+ ȷ8׮M.w7}2{@`w̽JaAse>K(bLP’[X uhT&6IYEmrHү*&T 3tVvcթmPKıIkPKE9@-javax/swing/event/ListSelectionListener.class;o>#nv&FIJ ̼tԲԼ}Ԝ<'5/AX?'?) A,ZZ 2,149!5ASÇm`֚a \Eɩn9 RX2 h?#3=t#; $PKlՊPKE9@*javax/swing/event/MenuDragMouseEvent.classR]OA=ӯ. V>T%*_-1P}ʤ,iwv[ ~<GY#%y{fs?~ٓ˝3kUOya@6k~vfYO ^Ttm}{Tw<NK5Zb_T#t}&=TAt TqH"#0D^%멽nPaK L:~Cduݎs'A&D@T $k OMxfs^҄WTTHHioHg{|SiMYt{ awݠ޹?iCb E$R4[-5Oy\avb)diۚI'ۘ$Uh4+٘$B)FyBJ3#atַqnc/Eω>ǜw?wHjԇx9]bw.k;,X«՟PKm`PKE9@-javax/swing/event/MenuDragMouseListener.class AAwO!1ekՕ_5޹x6 d>QHY̜t͙|0@CJUuQ@ҁS2(RtؒCFa*rX1^WwΰFO-wN!bDk?E@ڭ+!.^xj%V+=PKETPKE9@!javax/swing/event/MenuEvent.class}.Aƿcv qpAgTIf{r8x%{E+ԟ_}}~8(EDؙN;N]m/|"&ly@T* okD< v|0%=gXjHXn ntQ1aץ1 ?Ƃu9>'du۔|i^ȣ)HBIN;E$$W"d=5 =} 0PKӧ ^PKE9@$javax/swing/event/MenuKeyEvent.classRJA}q}_qFG҉MIfdDGO?{ƥUZקg#DuqrN֥vSۑ*#BSw[ gQ^ys4 'fEV8Ym(K/="D L"({*òWw(Iܒ Vq2Wq YY#^v&FŬIJ ̼tԲԼ}ԼRJԼ"vF2D"v6FqhiIf+H+L #_.ĐFe 6Zk12C&@EB* @\ҢT̜TF4l:Yd:N(@PKhPKE9@$javax/swing/event/MenuListener.class;o>#^v&FIJ ̼tԲԼ}ԼRԼ"vFD v6FqhiIf+HL #O.ļԜF 얀Yk12t5$sKS2sR2Ff fbv94sI&PKHľPKE9@)javax/swing/event/MouseInputAdapter.classAK@ߴi1Z१RBAA^,oۡMlZVO?J:" 2c7="G*_;U`mV|c煿g! KPI}!K=[vX/!!&6X+Fz4cB+z6Δkpc6/⬼t ?$%yD7ũ+yԐpۢ'4݊[PK&IoPKE9@*javax/swing/event/MouseInputListener.class;o>#nv&FIJ ̼tԲԼ}TϼԼ"vFJD:v6Fhby f>F%l*|K2`KS2sR1]2h#3+;02pI&.PKxtߔPKE9@&javax/swing/event/PopupMenuEvent.class?O0߅@(bA0?,p*_ B]ĀO:}~""Le+_YZegnv;2ELpVW" *-!k)y@*6`B{a ,#!tsmԕ{*Ts'Jy]j"0zN7bͱ֮)ՅߧG.G\{V^!kܷ:X 6 >o~PK~%mPKE9@)javax/swing/event/PopupMenuListener.class;o>#^v&FIJ ̼tԲԼԼRԼ"vFBD2v6FqhiIf+H3L #`ļԜFU <ց cd qJMM+,LIed" /-JNuq0r @ f8@\ ( $xPKKw4PKE9@+javax/swing/event/RowSorterEvent$Type.classS]OA= ~ֶZ-6i FԒ$>NX̲`W->h?RєMfg9;~uc'FnqZv+3e;.p;*< M7 NS+mH*YS˕B0vkoㅽݥV頠 ߏe:Jm5Id<1jAA,≊׌ڎljx%aF:rG'dLycTN@]HlPA\2/FKxxĝzc1oJ< c ܈V7(V,id[ W(1*s|%hC}(R_;D-4\`!7A"OO#c+1m`aj G0R }c l>hwJcG%}&Zy?h$iW!Oy y53 !Ff3PKhOPKE9@&javax/swing/event/RowSorterEvent.class]OA߳X K " ȶ1r5FhI# 7\mfh?e<3!emvfΞ}Ι7:4ډ:gVtǖH[ EF:ʄE,qox"F1%eAnPGf TPc\<K g/vOC'`xN8X?a?.kS'|BhLhЛTg=S5MaڄQ"߇"u$bAciYG֏Ÿ$>CɔI83j[Y' uk/Z uX!Բo]yGI0lasHD:U@NXr%GUUuCPO+ 7eyǻp[%NeMy"gIq:GQϫ,`;%x9ms5.hG*R # RtҷsJ=Nu\vνfܹ;+X+I-o6y(i~PKuI PKE9@)javax/swing/event/RowSorterListener.class;o>#nv&FIJ ̼tԲԼ"Լ"vFBD2v6FqhiIf+H3L #o1 FU BB'9[U e(U]zS1Rڀ! E2؃͐s/:gO}C F|6}|T1\I$ߒ%Є$S 2J>]`Uktp$v;AUjS]#A ߩJ {'8V !8BssڤvrSY+68ʣ@Uq1W>ݳ~~iRCߵ]H*E M)V6v)^d)/0|iKJkk#ǏDTF4Tj^p?zq7&Lo#scWzI?gZ| o]=6ݙ+!Z~\6W#tjV- XZdMH(Yplw ,T/>GwfWB n2;̜{ܹF!uOJƴ/c`خۖq3,0duNSi)b־2:.CivvRm0 bɱ{n-oBeUS*CZ,z-V ޔ8iT9cmf֝~hiUFpy#u[S0 X}KR,RqI3mڿn]!9j]cQv?=6<л!=^,ϐI_2f K-ryz1Z96.JHۻ0h_׹6vi{HS/"M"&^w c0h"qWFuB('@saGx@ !-$hl:eHSuNcã$PLUTńP,x[y! 팯}N;Bc̥ͣ, Y.mΩ$ˑO=$|]ryWsd'fL|:Gfvb@PKv7KPKE9@*javax/swing/event/TableModelListener.class;o>#nv&FIJ ̼tԲԼĤTԼ"vFJD:v6FqhiIf+H7L #O  F5 |V5[k12p%et͌ @ #u  'dbPKƛ0PKE9@*javax/swing/event/TreeExpansionEvent.classN@*(Mc,zxQ<5J"Ԗy,=x|(얃C+o٤NPKE9@-javax/swing/event/TreeExpansionListener.class @g v/i< \8.1fP❐NX>ffg_0MU*YܵH.:yșUBgv ǖs&a(/ݝRN@0қFC@m! ZeƨkgB<9 XG}vhÄϊ~Zw ty/p?PKPKE9@&javax/swing/event/TreeModelEvent.classRKo@ƸIҦm})}p) \J"U㬚\'~?ڕZpswf{_Ya?28H} q4 PyBH=^D(y}ZAOz`tZK" T:&.ǜ}͍s:bS"roe ƿS68 xr Es) Xvd > vExv}AXt럺TyiF}m9J 7r]68^oN+,/ 1w٠cg":wfx[з_ʹc3I7Dx0 =Q;?M:31G&^-FQ,g`h|9GTu1#P#@GUXЊˉg*.i71bVWkS2o+{-S+]zW7/UP O1YKenf`2=YOe PKbAaPKE9@)javax/swing/event/TreeModelListener.class}PI @q; A/x( xHL`2̓Qb3EUuW+̓g\')&_˕"[&n'e!%P1B,oh Ɠɡ1-3pgmZɟiO~c?$cfV#E)e)FG2]o.S,L /,d]JPK=PKE9@*javax/swing/event/TreeSelectionEvent.classSnAfYmiOV\jƛ&h҄P654Y+/|xfvC ,[C9̙I54GS|ݠys~羓K iųA m>eкuO[ܲg`Pnc"yCJ0btka`*\ӱn8I% [9ppb%.o?aΰsiBѢ Z6IӰ< G /Al5iSx.(7tzܠQf#=HYP'̲QFC7퐙2r T@\xBti>J:鏩/ CedUs,&}oQՃw4ɚ@ w{" @ea*"mMeQ;0P5]eʯ ~ԯEط9mvg^ZŰf*5U4 a7`|kXf晩s9?)7[j-*Ǫ: PKuJ1PKE9@-javax/swing/event/TreeSelectionListener.classO; @}?N[K*`_MlC;b~z?V yuM VJ Vy+9]ēQ?e 'L[ȭ7JF7W'3!ZZ::¤˔w0aқ|BM=E_ PKm| PKE9@.javax/swing/event/TreeWillExpandListener.classmn1Db MM,MR Х6*2||X_Dv4v^%Jq6䂚D?ڤ*[N䨔h [YŊ (0u0V%pa8rkuI`<_Y&w5s t*"%oדoL)@/$`,_MG6xj58D'vXyU^#PKpBYPKE9@)javax/swing/event/UndoableEditEvent.classN1EQEqĘ1w7.TehdIX2qP ;cl(vFb"񣊇Xw HvJwHࠟixPS+}F8i6 CNx#ϓ,cKJ(pX^e}2P PD=*bQ߫1a7:&>!f̽#֜[ܡ<%4[MT|̡x= & fVczר +_@ Vj *XuT-oF V4/w4?V5PK8@0HPKE9@,javax/swing/event/UndoableEditListener.class;o>#nv&FIJ ̼tԲԼмĤTהԼ"vFZDJv6FqhiIf+H?L #H)I@F  cd /-JNuIed0=Q@W0201+g@3pX @ PKUPKIG@javax/swing/filechooser/PKPKE9@(javax/swing/filechooser/FileFilter.classP=O0}nBiZ?bHZb`(Ӻ qпńGURG,ݻ ctNUlx9֕ ce-1BJ\*K]kwd!6O*ABnR* J1Fj&_2t 0O2BJì-ڴIП+wiiS3 >uI$^;s A+S}VϸamqI',Wp1& Ғ5U1o!kط"(Vӈ#kJKîpxw  MwC0Pk3S)ۅg\͔y 01u!"'sᚎy4\37{$E*k驶=vLr_!ޡ&#-7AuF_BT4PDݠd}8rX8(RhxB>͹|J"V&z5qyΣ{6`֟R_|PK$,xPKE9@,javax/swing/filechooser/FileSystemView.class[OA RoxԊ^lR Ӻ:fa>5C?@?Tӳn uF_`ކ!@`VkhyUW̠ &C6MV C74iG\SeLi^iu*0ᢉՊbbo_ 43xr)._@.cӸY&Cr4ӏcuR`fК%B;'n񍷵Ǻݹ%ڢf u~R[T 03 50:N!ݯ72K՚+iN0mnmT[yU97fo;rBnXoق2'3 [Gp'I" 91x17q0?xSeʍzJ{6Q'iZܣH{fh- g2|0qP,zMٮ~hIOv"s2O |+ &p* VOJg!'e$ >%Mxg }1ƖcE+0V%mƚX0vsxi}M:7~m9 PK  PKE9@&javax/swing/filechooser/FileView.classN@gPED@ xƃ5&&  ܗ:’%Vz2Pٶ`~M?? LH1֣pJ飲n `0(irG %tc`\A,-#!v&FIJ ̼t4}<ĂPϠҢTvFQdpE l  22de120kh128秤r103p03p02d&$&u''%ePAbF5b\l fe4K`Q2A0 f #$9<}0Uk;F Hx$D?XX PK=ZdPKE9@=javax/swing/plaf/BorderUIResource$BevelBorderUIResource.classJP%5Z/^0@D!\TO5Ik\>8'Ti,̜盙$o/d"Eػh^pmiWJFN]a;+Uّ~שּ akq#Q_& B[O8U!dV 6Jưhq-atXq ȓ]CFgs 7<w/3/&|+h@ae\E̶6;IcO <;,'dTEayJRX!dQ9*0b_O??qk"F,i oW.UX+Fw*g&SR¯hկʛfOO4^ wVm9E>PKӄzPKE9@@javax/swing/plaf/BorderUIResource$CompoundBorderUIResource.classRMO@}[((zzM!lbBxdKѿă?e.&*"3zof'  G'yѝ3s@HTuŎq yw+ _mx -)qÛ7iHvn9̗`Đkd'#q}RwyJfg0? C>2^;cq!}Q2k_$J( yBmbSd5"꠽1 0 s:{ϰ0@@a`(c 2*:ob,dU#X- ]PK U65vPKE9@=javax/swing/plaf/BorderUIResource$EmptyBorderUIResource.classQMO@}S*D@LH<hbAIuUkJ!mYL<QB"=켙y @aAţl:ϋVX/mYC3 a%&#/.Jߗ<疬(Sw5qvyXn Ϫ?V1ސ$RH~ 42" e%1r9dKAF:.9kXT%,ss›>PK C`PKE9@>javax/swing/plaf/BorderUIResource$EtchedBorderUIResource.classN@* /xCX ŅD& FiZL\>tZ#D9wΙt^<\0]%sDהvJzuhNwCe:_Brr!^^ے)1hrMCzga#Ss® ѡ־|v0lF P* hQum: cwX &u:9 BtUm1G(:2!(+?93X5QyFꉃҼ&yM (k`[~2„DȨ:&"00&&8+T &t]s)}PKnvePKE9@<javax/swing/plaf/BorderUIResource$LineBorderUIResource.classKK@mbjk`A|-ŅB!хi5r%;i҈;37| $b pw֓'n@vyݼp /;ΦtӀNXmG k"6$c ;%vl%İg/A]DŽ dyY5vh{LAGx-!]u7޽Nݹʄt B1- $(ir2MwdaV ?#Nj 5ͧt=ҴW/bk.4"D"Ƥ_HicԮ;Tc)"~P#L =%ڎ'unMN 7"X%еH`\P\k|w>UNjavax/swing/plaf/BorderUIResource$TitledBorderUIResource.class_OAݖ")U4[JM5iBܤ1Q7t5.>xgf Je߹{!p>}KhzR$S;ri+HC9>vQ$,~oi>qB!^Q{腂mbw6؍*pQ!ơXe=GidۍX^{Rm~un }vXL? y]0c_TJXiz=9^gLweBkܞ"o ^<%ϏP4=ERuC$2qDhs JIޭvxzLT(@;oLgVe~֬ 39װ5τ]` .Ö 쎵q^ϰYOc[۶V7p3ŪhY.R~ԊZ1m.SVЯж }emjtx:>&PKאPKE9@'javax/swing/plaf/BorderUIResource.classU]S@=[J -|* jg۶ IMRPM:mJNs{{&6GaL\/wi'Fm=[q>E3,A, q ]SX7QpZCa.Ậm[ cBC\!.7n1e`](CUC) HPq& M G Q7T0r"mK>jEF3z=Sm 7vcKe4K򸾜qKRP^H1F}az =8sE|`. [alSc~0A , ,uk{ekKU ɼmKw'=Y7T3HG9@*vx8[w7ϱ°ڂhi0:ΰ\6IE96[jtEK~tgn-Zg~'1ܦk2:04P(@i7Q5 p//iU9cW9csXi!UN_⏵U4! ھ74?DÞOgP;OǕvz xu,< eMb*,!є5MV\[ڵ%+A1xJ1ڞ#'\ \"TZ%TGpp9KtPK]PKE9@javax/swing/plaf/ButtonUI.class;o>#v&FɬIJ ̼t4}ҒPOvF i܂ԼPOF6̼;Ff 0FT.fNV6F~̼TܤԢĤTF!ĜĢL*RY 1֌ \Eɩn 0 =E@VIv Og```bl`Aan QyPK'PKE9@%javax/swing/plaf/ColorChooserUI.classNMk@}1ԫ ԃ/q_VWloTU:^ gͼ}|] @hIYMp[pkL"b!FK.&Yi noIpB*}QЈ~%\bIxZKaUoG'ݪЉD9ڵ|Q=NY7`9JO<|R&*իg-sUPKF"~9PKE9@&javax/swing/plaf/ColorUIResource.classPN@=" ,!iҤ1FVąGL$ͽ9̙zāc4F'ƺrG$t\ C^ >G*R _C 94 "P#l#;n6lo^Lnx>~2~F GiwSfF,jMj%dmYr(/dV--./2]oz"NeAG^ϰA߯PWI% t2آ"PFj#⠀" 6JPK/bCPKE9@"javax/swing/plaf/ComponentUI.class[OAlKM&E*D߆@lgmA?deRzڤ;әΜ?&咤1Z8u~;RURPa1IqF)/B79 ex&t3g VI SFijcaǦ`޷ nq[zŸ[^ K\*._ kg ~h[Tňiۂ+OQ&ӧ}iq$W(K(%iJ~Eri Uj w0*2wg? G~;ҲFDU*:cp1-Z;6iK AHa-NmR4*qiz#C(ځ**mղ4|/Dx$^UK()FV6k{b6=ѢR.qMFپ$Tz=Q JhY>cUL◎aI?0hτ8A#xo`ex(4o-I_JoFi56@h2!AhJc[SMhfBvxveW=%h.=u<ߴO˄'hi!2G3#3-zk;led!1X1c!qBcZċM@ /uB,5u=W;~#dGCuy(C4?PKHi PKE9@$javax/swing/plaf/DesktopIconUI.class;o>#v&FIJ ̼t4}POvF 5yy% l6y%v a ,)\ < l >y~IE!I9 B>ɉ9aE >T$#AKS2f4(2@td|V  &. f<@PKX6PKE9@$javax/swing/plaf/DesktopPaneUI.class;o>#v&FIJ ̼t4}ļPOvF 5yy% l6y%v a ,)\ < l >y~IE!I9 B>ɉ9aE >T$#AKS2f4(2@td|V  &. f<@PK 6PKE9@*javax/swing/plaf/DimensionUIResource.class?KA$ǜEEQ) j)z8wNeCi(Zf T 6냜/ufB?fx0'qd/|Bc'P8-`[ILyƌYs8=.buu PKփPKE9@%javax/swing/plaf/FontUIResource.classMO@ ~&G1& z*5%oy2G bН<3~~8ŮaYdw熷NX;3xw*Gn֍#PK7f=PKE9@)javax/swing/plaf/InputMapUIResource.class;o>#!v&FIJ ̼t4}ϼĂPϠҢTvFd05 l F 22de120kh128秤r103p03p02d&$&u''%ePAbFU"k fec*àt@>k#$ @]JPKHTb3`PKE9@'javax/swing/plaf/InsetsUIResource.classPN@@ !PPE4@!IABdQHCu 26ߢB(9l;;3ϯ=l 8ʗ>zN]gB+4HΪZ'ltuB;1*6љ:PW=蒰{8 P\ú'ysy]_IXb+s,瀻ir!|Ae΃4VfZڌ\yXoPKۮ PKE9@&javax/swing/plaf/InternalFrameUI.class;o>#v&FIJ ̼t4}ϼԢPOvF Uyy% l6y%v a ,)\ < l >y~IE!I9 B>ɉ9aE >T$#AɇKS2AE@(2@td|V  &. f<@PKb<PKE9@javax/swing/plaf/LabelUI.class;o>#v&FIJ ̼t4}ĤԜPOvF Y܂ԼPOF6̼;Ff 0FT.fNV6F~̼TܤԢĤTF!ĜĢL*RY -֌ \Eɩn t`.z~|8Ŏ0J= NJ?L}chP>Zsbe"3X2C=Z\gtxO Fb\uDG2%Kf R&7ǭ oEr=T1wF3o֡jtL6Y[ԝdSN; nxQ(4 Ii+/P,MT(V:6rm/PK3[,PKE9@ javax/swing/plaf/MenuBarUI.class;o>#v&FIJ ̼t4}ԼRĢPOvF y܂ԼPOF6̼;Ff 0FT.fNV6F~̼TܤԢĤTF!ĜĢL*RY kKS2AZ2z M, @G0#-@>c#$ @HUPKF |*PKE9@!javax/swing/plaf/MenuItemUI.class;o>#v&FIJ ̼t4}ԼRϒPOvFI N%%y l6y%v a ,)\ < l >y~IE!I9 B>ɉ9aE >T$#A[KS2AzRz m, @g0#@>c#$ @HUPK{*PKE9@#javax/swing/plaf/OptionPaneUI.class}PMK@mDczPoVHPAۃm\u% F[6{7}{y0Ʀa MXd:<-+1} + 2Ә;JCg81,wІM'u>ga#)fVV ;BCT+å2:BG9]Jd"51ٕ~VLő{[ (0O]Ḧ{Xzk}v>Way ݆ѣ9mTPKPKE9@javax/swing/plaf/PanelUI.class;o>#v&FIJ ̼t4ļԜPOvF Y܂ԼPOF6̼;Ff 0FT.fNV6F~̼TܤԢĤTF!ĜĢL*RY -֌ \Eɩn KWKOZx9 t1+NׄxB q"W%}iF|AYty 3Xy3obbr"=8+ٌB0=ସܪ[KsWCTPKnvbPKE9@$javax/swing/plaf/ProgressBarUI.class;o>#v&FIJ ̼t4bĢPOvF 5yy% l6y%v a ,)\ < l >y~IE!I9 B>ɉ9aE >T$#AKS2f4(2@td|V  &. f<@PK6j^ 6PKE9@!javax/swing/plaf/RootPaneUI.class;o>#v&FIJ ̼t4ļPOvF yy% l6y%v a ,)\ < l >y~IE!I9 B>ɉ9aE >T$#AsKS2AzRz m, @g0#@>c#$ @HUPKR-PKE9@"javax/swing/plaf/ScrollBarUI.class;o>#v&FIJ ̼t4ĢPOvl*s RJB=l22K54XSR8yX}2RJsRBrR|s2A| KIFf1#>X32p%e4 4(2@td|V  &. f<@PKԂ0PKE9@#javax/swing/plaf/ScrollPaneUI.class;o>#v&F٬IJ ̼t4ļPOvF %yy% l6y%v a ,)\ < l >y~IE!I9 B>ɉ9aE >T$#AKS2A%@ZYNaF :Hy`>v@d 3pI VPK?3PKE9@"javax/swing/plaf/SeparatorUI.class;o>#v&FIJ ̼t4ԂĢĒPOvl*s RJB=l22K54XSR8yX}2RJsRBrR|s2A| KIFf1#>X32p%e4 4(2@td|V  &. f<@PKE20PKE9@javax/swing/plaf/SliderUI.class;o>#v&FɬIJ ̼t4̔ԢPOvF i܂ԼPOF6̼;Ff 0FT.fNV6F~̼TܤԢĤTF!ĜĢL*RY 1֌ \Eɩn 0 =E@VIv Og```bl`Aan QyPK*WY'PKE9@ javax/swing/plaf/SpinnerUI.class;o>#v&FIJ ̼t4̼ԢPOvF y܂ԼPOF6̼;Ff 0FT.fNV6F~̼TܤԢĤTF!ĜĢL*RY kKS2AZ2z M, @G0#-@>c#$ @HUPK!gr*PKE9@"javax/swing/plaf/SplitPaneUI.class}RKO1* oMb`44$<ؚ}[_y2G+1L~;\‰ '> + b.[}L0Ve4/ |U }%|$ؘ$lg!iq QEv0KeP7i08uv _QR-gP!qseI:b5Ս D@UNVkDy Mԭ:+IP1JvW#v&FIJ ̼t4ĤTĔԢPOvF 5yy% l6y%v a ,)\ < l >y~IE`|s2A| KIFf1#~Y32p%eBifQd:  Z86L \@ ,( $y 4/X;X?PKƴm6PKE9@javax/swing/plaf/TableUI.class;o>#v&FIJ ̼t4ĤPOvF Y܂ԼPOF6̼;Ff 0FT.fNV6F~̼Tܤ" B>ɉ9aE >T$#A[KS2Axz , @0#-@>c#$ @HUPK T$PKE9@javax/swing/plaf/TextUI.classT]oA=CT+Z+KU&Tl 01]>~>G"F.6ܙ;{ޙ7@a#2;6?7-1O+  %(G8`?_0 u"9\NcqŪtq}&\قaܮsWiǐNRdH5yD;-  eiH]RъgNB*OR9{Ũ}(~)}徖>輅IĈ 19rWCWZ3T%>,jpó K?b,lKvtC9-K#vӦc.C\$[}İ4Kۖ }:Cc Ij$[ѻ)ԩ~턝R?8Sn'1l0tqbe@=T4&heedgĐ18W C+v)X *a sZ1ĭaWC1i,W&ȕ w\l6p1b"7'1M[ bw.d) PKKCPKE9@ javax/swing/plaf/ToolBarUI.class;o>#v&FIJ ̼t4ĢPOvF y܂ԼPOF6̼;Ff 0FT.fNV6F~̼TܤԢĤTF!ĜĢL*RY kKS2AZ2z M, @G0#-@>c#$ @HUPKf5*PKE9@ javax/swing/plaf/ToolTipUI.class;o>#v&FIJ ̼t4̂POvF y܂ԼPOF6̼;Ff 0FT.fNV6F~̼TܤԢĤTF!ĜĢL*RY kKS2AZ2z M, @G0#-@>c#$ @HUPK?*PKE9@javax/swing/plaf/TreeUI.classSN0}BKٷ/@+ HABln&5(UR~>B@ Bo=XBm 7{qSWw qaqXַu2g>CvS*i2e]y2VKP0 TtsIwf̵J_J`(\"ܫJC #߂lTX戛}YE#bXOKo^CNkIea5U%G8JQ`H=4ޱ WP|&ua-֥TZDH)TVG4 Džo bz݈/Z9~hli#dˏ| yZ9H@w@X}-=u؇~gqG0p %p8)Әq8k=TPK,lPKE9@!javax/swing/plaf/UIResource.class;o>#vv&FIJ ̼t4PϠҢTvFDRVjr #W0X-3'^X$PKX)jbvPKE9@!javax/swing/plaf/ViewportUI.class;o>#v&FIJ ̼t4POvF yy@ l6y%v a ,)\ < l >y~IE!I9 B>ɉ9aE >T$#AsKS2AzRz m, @g0#@>c#$ @HUPK%-PKIG@javax/swing/plaf/basic/PKPKE9@-javax/swing/plaf/basic/BasicArrowButton.classR]OA=]Z[ _QL 5 /x.kSg)G“ZJD̽g9wolq9')?ґh矢.OEXVk5d!CeDae2omKpiRIl ͐#0 a~H̖Q-as!nx0,tT\ {ς9$LJ4 F5E|d+߻^0O|fӻ޽b({z+dv40ٳZm\|p"٦ߑU\[#HhP;a ynɰ ܠEޤk9} 9̑SX<%_Xs4 'Ml?h,EjB ٩W=sOi-9fZ wp7)5'Cg=Ӹ9jB 8tx[NĂ?t~PK.FPKE9@6javax/swing/plaf/basic/BasicBorders$ButtonBorder.classRN@= "/_(.ЅUt1# q!>S0Z[3Sre𣌷SD7s}ͼaDa?'K ׳\~c\Umݗ]G |/L ,[ֱ;WXeQ@vt˻vw!CZ|X C/z}nx-$(1y(<14?K߼b0~I#|Pε mG^pۥ-+.ED# Pkw\˝v#EGj띝Iav؉!dt#[ dW_$0A6M2Iq0 6CaK6O"uT[aδ]/PKDsPKE9@6javax/swing/plaf/basic/BasicBorders$MarginBorder.classPN0iBC<. Cz!JH;)FAv '$|ظ E!X`+-g4W"щTdcaTɿ^q,C?$ {˩* ^Y!i-0J`amWm.hH xF#lW/t!"]p K\e\~a:Cg_:_PKcz1PKE9@7javax/swing/plaf/basic/BasicBorders$MenuBarBorder.classQN0}ZÅ LXD#!U XzwRF!Av[8|bTdy )4;ig5oZX#ދxr o@ܸ=IlG4օ(Ʊ МuPjavax/swing/plaf/basic/BasicBorders$RolloverButtonBorder.classPN@}8@!(8$"", @i6ߢB(ئ"0+{s&Vmb(h[17nWD֦/Mq@iX׆EhLR=^E:VOަTbi,Oey8%0E(*烇4WHB=tQ;=4{e z`zT%vYJ"ddc>v\Sٺf^`tlPd;a}%ٴ9Ӹ \ʪ)1;vc,E,sW|PK,EPKE9@9javax/swing/plaf/basic/BasicBorders$SplitPaneBorder.classRn@=7qi)B6lX4)B&ɐL4| X!(ias9s̏߾hA 9BH(膞xV}w/Yh #~z*~%|i%8٤d?.HX9O3K:G}I(p3}I/ZA0aD*~JXe!iYAUT1GLW'7|7 PD*٧N')MǠΉa͡mk3-/U?sDfZ(0eŇ4ݽ#LBaB3H#׭p..Xش5ʁg*l%tjeRP+2*QPb8(TjY y]ͯ y^E\ Zb"2hQUa1lK6zʖc5Ǎs,)0UM97q+_J|V S*e6G#nxմL1hQuFEμgcmMPKCPKE9@<javax/swing/plaf/basic/BasicBorders$ToggleButtonBorder.classPMO@}ZDA=XDCL0 11iHxZ`5k[L<Qi&|7ulb,h¡['"Zmi3&0Q0ٰYzsg*T9'ݞ^[4w V[dy8%0G(*W4 $u_]aTNESoXs,sA=cBZL_^a"@(]4@Dlvf=,A_^[F`l'YJXLE,TRVeOrUFYk<1nPK )sCPKE9@)javax/swing/plaf/basic/BasicBorders.class[S@-R⁃ jq:L I+?KrRܴ\{n6-y_79˿MȖ]ƚB ]Na\BpaR=cHm29c!ߐܹh uʛ`(5wϸQ}mï2`Xn,eR:a{=aRM6cMS,u{Pw_~c&שqշd)Q"cޖ~%O.]q&uN7?ɮ$Wo8Wa] 7g"wW$ӳ'~GD]F_ur'Ԟ˃@.=`X3Kɧ#$$SZeap\9:2úQHr +[,/#'^z-,`}=WqCRd;)} ,hͨZǁ_c-_ȀbR<خ"=.+q:"J{ UOYBʝp}Wm|*Cpe7)qC{[j`CV[lCsj`LʸN ̞ ] 4⇂ ǽPPnm;Ux~{weUue;Wc%C@-2<eF Tj Cek sHqvV%H,)X-1޲-lѠ{I7sՓMXlo' bX.җŨK|w}Lʱ_q䘋Bгi - 1G&B~3!&Q4#rDIW+b*KxbBO51m@<7#f e3`@Ī1g@0# 54!uaB4bܝ |oPKl2PKE9@*javax/swing/plaf/basic/BasicButtonUI.classT[S1>˭@Rw(Y(qpp(cŇt:ng7|'g|O˶чM$9ɯ?~@ C ލi_,LC~sp4Xig}D &̥yqm/L{"sځcQ@Wt@'iū,shbv jS/M|>%oXun Qif.d﫬]jp=DK\(]Swh3J;'UÔID#$ _D󵢟^DNey7.{- w"1ZxmxXe^tl6P@M;Kc9)_B7\?ri4]j_?uQ)sEԴJw{fp:{L^4 $)s&4ZQ+}Bq>WVٿ.REV屺ZS8E`|^U/-A+aA0O!Qӱ'ط.}G$1mrp`On4e2~"Gj )cR[o9(q? EԏfD03p9.`V=9T]UW>:PL-9ݣI6)۞RS)(  (^ ~b.y$5ɀDMJ=?لLD.chVj u,$DjJJR*) oZ@qBh%| ֑^T3H4P?ŴWPl)Rx&PK9)5 PKE9@4javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.classRMO@}R>Q8T$JzI`YR(:#(T0ovfޛY\] ` o(6TW]酎OvJuZ[=|\9g:/#{sWK(Xgŕ#W5߹"FF1aci59^L#h{Tf a*c;Aմ&8 V&U&anaӴn:)u%H` "VweEܲGGfuNgDh0?xa* IB+.x&Xl WOClYN /q -+; `=z\}LbJPOsf)J#~֛̓Ir4faY̹;`S[PK:\APKE9@,javax/swing/plaf/basic/BasicCheckBoxUI.classN1OWQ0n01L0. 1CDؗ@uNA|+]|(=No۷W'IbؿS>s{Nua {WUv= [5IUv!q&}ibr tq$r 鋫ɨ+ za\uaXP ڬ0\-aeM}n]) ?04 mZ匡PSyh4R ިQ`RGfB94~M,d(&X HI@n.`=/MI/DFgҥYPK|lF\PKE9@@javax/swing/plaf/basic/BasicColorChooserUI$PropertyHandler.classRN@NBLsy \X RĮ8 d8 $|q vWOU'q#l]͵f$PUwm (A#I' tҔ:=i$l~$X7A0UC)b㿩dUTRiC5J3aݶUC#\ Ar*K EJ(0PU< >a$ Cդ.N`G'l"w }^Ki{g\?u j[ØH cqPblZjc|ek4o9%m0ӭ,ë<. r,2G/] 3t\f±aGhDƟT֘i+PKPKE9@0javax/swing/plaf/basic/BasicColorChooserUI.classn0ǏJ[Fae] 2@ !AbS*M(s*; BiIT(>Ox~6gȥf*/hy')&? G~?DLq@yNC"c p(f+_RǏ`VI6gB܌ i 8c3ĶF1hgT(xN`9!+*\[\>ie*PJCcr^x#٫d ;T1=\BYYFxN| ,ar ܄r|a02 6BSoA:qo֓[hm;o,VSjt_ߜ@H `T) &t:ͲPNX;Y|*J0B1@ "zb_X/gr;}Åq6p,M:l2[p#B _d-Bs 73)*»d;1J̝y{$f=en* 6RF6L`+le{)V=ÝPKp-=TPKE9@;javax/swing/plaf/basic/BasicComboBoxEditor$UIResource.classPMK@}ӤڃI=BGtՕ4+T< (q =Adٷf޼7hQ,"!7Q*ʢQzSUrz|!o藆D Tp Bg,DsG7љ'T5N՝2_sKmALE!8H0X`<&33E g=a1`m[X@;DPKG~ePKE9@0javax/swing/plaf/basic/BasicComboBoxEditor.classS]oQ=wKA( RPkU>՘̦&Z~ٽ,BYd?e,H>0ws  -^%0ԯyTִ_zئ8'0}M ưUSZ~q[_}aj{fz=`(LekbLaGygڦaZ`5C4֐fXL[%2s낻fp1147aأG1UWE2}P2duWp_ IƱ G}d2N/731,;CRiG+ϔ K8e&EakXltplY8Y<e !ݶIiq^ _“BuU$ȋ!RJ}H7NFj' Gٸ >& IB6L>xM'ebn1L QR4B}}؞W KRl'AQF%wTg܋n{yi~ s(*lQڻ _UR⫨+X_PK:d'APKE9@=javax/swing/plaf/basic/BasicComboBoxRenderer$UIResource.classPJ1t6VkOz< ( U{nF$< ?J|L޼0yx}C7F^z,;׃tffK#d88FİCdNV3`woff,9,'ΕI!(*RtrSj$w3)p3 չ6 @kiJ8'Q6( &7E[Rρ 3 $ovB|]*~q:@PKXPKE9@2javax/swing/plaf/basic/BasicComboBoxRenderer.classRMOA}:7$@hav5M@9g&M7ғ?X=\8LիW]6VCDTql\m%vLe!$U,eB47|^h'TџdbTiBk)c~$ZQudRfEUl/E0Ozn\+s(Q[/T}[qc8sBsύTh/}Bm[~&![ˊsxLxqZyUyy7CC u"̠ɯƘY{b__52yFUn7<>c.NU3=3D֣%,pA1_FX xy#V0 PKmQPKE9@Bjavax/swing/plaf/basic/BasicComboBoxUI$ComboBoxLayoutManager.class]oQYRG[Z 4qQoԤ&X/ഞf?BJ/q@ה=333gfv340{gb,.L\9'fOo=pXO(x+q*,҄&`ޙYd*sFA_!4:e͞rTO^X<&@@Y@HaTC,u#FvOzEϒR XxJccZ_`^q%1D6tB3*)j`7ۙ4o4ގ%E{J('iR+k9ӑ9RNrm= 3w g|lu2<9FT$z̚*}JY{Oբ,0¸, p ٲ!*Wݎ/[0ӈ"2xP̙ k*7ZhY{bd_cȣsZEonܔL874zȞ$2Fmğ%f l3|{p>0r91Is0ҠQڰp+B-`cK)+icg_PKM!PKE9@7javax/swing/plaf/basic/BasicComboBoxUI$KeyHandler.classQJ@=Z] Uk I;H:)I\;AP\ :;5 9O~F|2~ gw|zBP34OLONN<.(Q j#4sfY>jr}T} r펎ppSqQ$<_F ھ`7/@/LeS^e #B1Rq [n#ƼWJ AsBzC VLQPBorOpp|IXEt>9, = (a{ŞIPU2'%"bj YQ*;>1aJژ@N/X {˩ܜэ[R7_L `ڷZwxtYk\4&cW&ì Xn O8.h-x_g/2I_aPKtPKE9@Bjavax/swing/plaf/basic/BasicComboBoxUI$PropertyChangeHandler.classRJ@=ƨUk_"^PTPk]Z?|(q6Rݙ=gv$_vd!E(?hѳ ;G+훳0h0~ ݐB2!M{=zl!K(%YO URːUCXkJշhFT[a؁Ai:!OHhUiyZx$Wk"T&&3eawi: tqK3FK\}^<'V-ah̎BԪb:$d^0ݲԬGwR2j:ԉ <@&TѪ1 8 gdʺּfُi˕-s0r:&E_ 'ڝNzj=ݎ^L8qj6nk&? Nx.YoGI9~)EK?%R?M,zYR9v8lP(IσG>^zC)8=0R1яÄ~g賐d)OÌG? ?GE?؏qџENaWV,>'9'/Cp?G" .'3$X$ jpI#/_4>x!=A.Gȡ *ɻR3$IẒ,I/K%y_J. %"%J,%oJrUJƔTkR"HQ̬e%Yw|%|(]五,cT#)d|"+jpC >TOhqf }k@:RY_ q*OXAp$υ9J ^ ė0Բ/l ^e^%>W,RPSoU @*10v9$R^EUԤn o|RP 8Miߤ#Bakc;lcO~PKͭaPKE9@Ajavax/swing/plaf/basic/BasicComboPopup$InvocationKeyHandler.classQMK@}hk= EԂV JvՕt7$i?˃(q6xc>ۙp,OfJ?Q(@$j_Xq`nM4Z==5C*УPJ%,THD I%Cn?LgNV{ho@(uHV@X򰀲"=8X!wmCߋ z7 "V6K 9ޅp$Ke9,7i-n(D&6 ;Dq,y"-jcsX6o3|{㨀*c{j^XE=ezPK fO9JPKE9@Cjavax/swing/plaf/basic/BasicComboPopup$InvocationMouseHandler.classQMK@}hcI(R-o~PEPzߴ!˃(q6x0vfvfϯXQb8~S'3(~9 $7:ʢv_MR+%⒫q(bÆYꋩPy>ʤ:#dz-ܴ=dzz,`Xp12]Xb(wLAm &x <&IZ цpnuą4Svt{!Oh1lehMML<`RPKE9@Ijavax/swing/plaf/basic/BasicComboPopup$InvocationMouseMotionHandler.classQMK@}hk/"Ղ JvՕt7oy?%⡄33v~}|8–'KR=zQ'r]8з:ʢVWMRƽj؆4<>M=1*x>ɤu=Sdz)ܴ7`|=U0,CA.l,1ۦ֓Jd@<CGK&-d˂3um;Cq%*%b?I" vfѣIrYn41,d*E(~+E%+TlN澃e4Wg:6aPKBjPKE9@8javax/swing/plaf/basic/BasicComboPopup$ItemHandler.classRJ@=Fh^"^HOEiW]Il>~8A BYvvfrC>Tn#G>x=P (n8&erh,ra)/c%x2PK;PKE9@<javax/swing/plaf/basic/BasicComboPopup$ListDataHandler.classRaOP=w++ D@dkN& !|mH.mW[~0&~u[5M{s9~ %[NM_~ W$s>؉zntfW%GO"0uu3Vz a>d:c^e(cB%QIa[lCP W C&X(f: j]AϕpIXFDt>:4Ȅc5/ Ytn3J&:PB&b1E*ng"xCm('E4=y婩_s D3bs7't֗388V'/,଄Es,qGX+#Ϧ;9peqԻUq$9ќS-M:s.fPsPż  j44|'49`QE\p\R߫hνf^kg8i/bJqecUNMKbSۮ%3MK{{]g8w ptVACcM4E`|*鵂5XPKvPG9@PKE9@Cjavax/swing/plaf/basic/BasicComboPopup$ListMouseMotionHandler.classQMK1}i׮]W[kz,7Ђ(lEPz϶Q#d-"xd LfM^>>aEM3!i;2-Fb_MBu,Bi>PPqAێlR>2?N,NyBPIlLϡ"=&n8}5U,CC>\,lA-_e',8A#P# Y"lt'QȼûQY2Nmj۱ K)yҏ\X#,FKm#A4׭փct7gD(n+gP3X15@u~{XF#_ɱb4!v$S`٬2~42ܠ eǔ'h5JO̽G=S GьaKCjJ\j FkX=؂PKڃPKE9@Bjavax/swing/plaf/basic/BasicComboPopup$PropertyChangeHandler.classRJ@=Fcz_"^EQ(*(}ԵMHҪ>~8E)XBfwΞ3;sOX#>x'^;y&G? Frӗuy&m ch*xޥ k:~k+*I1ޫdeV鮋*#fע**6z1EB~*Jˋƣ/0R k"X ZeQww~[tt)u)bk?.qM*؟k@$LlV0q0<=bZ09^7|8 v0F1+_v_n&hf7)9Lgf9,PKojPKE9@,javax/swing/plaf/basic/BasicComboPopup.classWi{F O JHmh88qpBE(T7-:ECQ}:RdkLGifwfwp~U B`zO/S־SʩOͱϴQFũ(#_Tw8JTl+H@W-[-(Em2Q۰Q*mhejֻmylxI`8`)pQjmjư5WlZjMuls};ETS:32vjjV\+ὸ%8jn*e ǐˆctB$`GаZ6lE"4 :-|ltR*(WLBMUzWՋuO横[U"tVϼfV\  -UU,#UVkX65]8hRd-s(v…N8 )Sd5857\y{1{W4NVWUռH[Ky}v؂"Ǧ6g8zb_5<%</+`򆾣2V93]k>+ 7J֙!6Z&Um tdR>'QnwAQ %ގ;|:Ѭ]1~1B`M(z~F$sM7#KHV s̵]̃nVbS`UaUm]vTыw†*q#h H⮽`k~ybLߠ5-L8Jux ,=ĎQ{ϜY] U~Te@O}mTSmqyeCs_QoBM< Raf! ׃@8|3:Ɩ.E->!0@U|-p3^U:(S+yc^9.7(O b=fVS[#ۧ{R [d9>SQ+7ހ-xJo[ϓ0ky LZm LviIp G:0 1v|{tA7Ǡz~.<9C\a0 r ƹI.O&=r36$Lr?SY8#gw^ϣx.g]2xw7cAʣ9%R,rNQz80#ހp;br#V?jڸ=n{xw3x=v'{e0VRj!R? C~(Ena,.KJ_+`!s!S)r|$E>i!=ϤGf& 7m6'I!yRIssRp`^ , 4hv}Sb8pG ?bIkw% 5i/8klhcvw D̑:^Ǡ6/ /UQD g(?G%^AQ'@?PKz+3PKE9@Ajavax/swing/plaf/basic/BasicDesktopIconUI$MouseInputHandler.classRN@=7 1³eC¼v$ر$Spf,  ĢЏ3FjKT)Ι;>Α` o<sWAziG{jl|/Ӌap2q7(t; dO,Ma}?V iF} \AO|x#-a4er($L6LKD"Q, {uLOW 3߂>M'6ݫ9=asM9ʏ!TnҒuۙZˤ4Eb }rm/?FժQ39m>+k7n_;82siT9W0I S;8&θТ̺wsn8a[zh_/-cʺPKQX=PKE9@/javax/swing/plaf/basic/BasicDesktopIconUI.class]oAY(Jbmhk0&5^HHC̒_W&^Q3˖u`f_<44g>_ ”}]kVpxյV:|NÐMה=?iIO8[ zȐ($%)ʦ=RHT4W ZAo=EY,ݐ,NObDR, nǃHp' ƃ{`%FPb`ujP{PKړ LbPKE9@;javax/swing/plaf/basic/BasicDesktopPaneUI$CloseAction.classRMK@}hkUhDUA("oUWcRi ?JM<&3oߛy;-,g"܋xrt_N7NKh:G&K 복hyF* ÖBF9!)Ih }B]IA[@1LibB|y}lJc?3p69l1b07& PKntPKE9@>javax/swing/plaf/basic/BasicDesktopPaneUI$MaximizeAction.classRJ@=k"FDATz}&Z+D٤ZA*ə `&[;xT}Wv]ʱwuܗ]ݟ W^-j'YuB& wwp oTB(dmURtI0L0da `"KH WSk/!s= g/^a=Gk)9Z`0ޭ5NGkh9bX 3PKƠ^xPKE9@>javax/swing/plaf/basic/BasicDesktopPaneUI$MinimizeAction.classR[KAn.F=hQAW,.:Քѿ!̮] 39}ƼXB1)j7ŵU}mprTK==;PAޫ' z'$[/ՁllJ8p2ˆ!$҈cDcxQ2UȳN. QoJBڢy%<~Ѝ/c78+<^W/!}v<[+jw/&'#}'1O( <a@XP6W(W;{Nټ| 9 dٚ!Nc9 g)\c_Lj?01b'PKs;wPKE9@>javax/swing/plaf/basic/BasicDesktopPaneUI$NavigateAction.classRJ@=VkޫBB# *BA6]jMJV|(q6J`r93þB G'|P^ŕrdxΩEX]ZV\|/ P4BW焔VaqP}.>%:raHeĈ4F #֔'w F[5K(H4N)"B2;$,8A;+=c"u#d'ʴ:q-PiV0} ,Vl(3eūd~MϬ9~4Y)Kq#1ѫi\Sah$stlT+`'PK$i(8wPKE9@:javax/swing/plaf/basic/BasicDesktopPaneUI$OpenAction.classR]KA=W7->-+"06z)@*|ױlVv7oA~TtgWH ss` i$[ONnSr}cepzsI-u Ӱ^ep oTP U.ò]UGX/CR#X^C0lc (!Y2lUiyp_$a깢U2~7h O:~eБC'&>j/!s=֍`h-1GX{.= xI*˙2Jr|2 3k/l^a?G,s"rlg0q f؊)\cWhLj?(1)`PKGrPKE9@/javax/swing/plaf/basic/BasicDesktopPaneUI.classT]S@ R> ( ڂDBvA 2oӥNEW3>Q7i M'38ݽ~RA!Jf㢪 zumy}&!˞ 3-a$.u$- $n1JV!0!$cnv0%6qWB3( \sPA4 Uyh}*hYCPkk\,AyV*`TM+=&(.O(!0T4jef}J%S1c{΄@$~≛ĭH\\`RrbsEjRL`<3cV"7rPMn<%)Ȱlb[9¾|[+a-0UE{XI!{J] ﺯ}u&T y nՉ䦱?`U[Tli6$eݍpPQ B?7Y9nJ%N!L :bq𱣃I!´)qjA9a!ܬaϚHP;lSI87 kM>-\L{VՄ2MJWQ}[<3s>D`B莣nSZ0644c O_}nsVL_6 9=>tJ?D}"^!%9@Ӎ!|Zw? ' cǬW~Gh0+H+ĐC Y x$` 0 c04vHY q?zI^^yc lpRy 1H75[ 3nhmUr,R[zb<ېZY@Z*Nu"rAW\?܁8[ވ!!b ƻr:ԕ+p+|m9]9~ Hptg j!/dr3CQ5kpSC.ƞᓿVş\ȹY[PK01‹ PKE9@.javax/swing/plaf/basic/BasicEditorPaneUI.classN1UA nu5W&M0Đpٗ`0% L\> #/]|O 8,ܝ`}>p{|"="}in@tq ut 3HsqJ]"iDc4d nmCrh_0l|q``LBB-_$a"Z L(3Hap6tCW936LdkITʵzc'vSb=-Cc;N<a0+AQd7l[(߰{͞"<eغ齀a52)(X;f%eVhinƈƻ 1zQ}UYDj'5prOPK/c-=PKE9@Fjavax/swing/plaf/basic/BasicFileChooserUI$ApproveSelectionAction.classRJ@=WU `Dt(Ei:#1)X-"(N҅2p; `KY7/^N%B:Gƞ(OֻAJ}yZz:˦6 P #-(y'd [X|6W["X-s A&4md1AHB|yvwےB.LPKcVxPKE9@Mjavax/swing/plaf/basic/BasicFileChooserUI$ChangeToParentDirectoryAction.classRJ@=Vk~GZ#OB}J&V,D٤P*ə ` Kyd#Q->7^CDm8# ooPƗ6Pj HFy,*}OGX9VxY~cT*32?6_9}I4E98 .` &0٭m\KahsL\R"oPKF$PKE9@Cjavax/swing/plaf/basic/BasicFileChooserUI$DoubleClickListener.classRN@}[*r2 bc^TKYeۂx(l7o&5 gGMep}~ s\; C%^,L{tE " &CMK8|;b"ع %:C>EĐGRܭZTv$:;E.[> "% + M(2W@D7d(>d~GFәJ32$aE v/ ϕ&Ccn[z1lӊ29Xot,,(jHW7/(fHXX_A5j lPKTPKE9@<javax/swing/plaf/basic/BasicFileChooserUI$GoHomeAction.classRJA}}GFQQA;ckZ&3F˃?J$P7k#Cؼ-E*qE|oCJCH˓#}rϏp_{(6wB.nh~T6vT]?t+B. ȢE%*ͺ4H`U" :qVmg(IsMS^fa<{%KݷeM#NɲUܓ0(QSrð8fPd(]X\zf)Mp0vϱD8>p8:1$&> PK4-rPKE9@?javax/swing/plaf/basic/BasicFileChooserUI$NewFolderAction.classRMK@}VkZ+"x=HEEA(EMW]IֿA8 }ovް_Ep ʿs=qtD\3}R_o,R7H~S脑n2ѽ v طYv|jUnV3)mL C36% !Rl?:R_' ލâe'ǿ~t9l#/bt!m{KH8b9/Iȧ'BI @(fnz" e26yi~9T(2JNr}}ST_9~9yF0oa1kƒX-qZ+X%a}PKI?vPKE9@Ajavax/swing/plaf/basic/BasicFileChooserUI$SelectionListener.classR]/A=]]*Z"i(M )4$}Y-˃H<~ꡲ;3w9{||Ʋ䄏ʻu\qEαʕ;ep}VlD*'!W0baH/r4OTX"[)3@y*:"l[ߔ# 01l!dɢʓ Dݕlo&Ͻ}<n1lGt'՝#nu0ACjO|MÎx#"xZ EtՕ&"Ql҇ 3̍|{,R;ONNKu=UA(u^i>E$n? PV[a%Lt&a1p}(_EGVV-hFm !Cc6'W !P<ܷ-Oޕe' ^fxѹׁmR2##Gv9 м_~ cL41l̟|PPK?tsPKE9@/javax/swing/plaf/basic/BasicFileChooserUI.classWk[E>!njVҪmFC/ P˲ȶNRV~yGxfwd=955Faګu4JӢ*c.unLe@#p !0hAKucMטmQ"}(p#ڂ 8c֢Y Գ[=LnX7`od˧ => +hN B^t@A?$]t+ _vѧG0~3H;8'~@@C(~ p ^A èz܂B|苲P@hp /w[,oiC8^7I8%Nlhw"$48N$o%l^[ނqq:eH5HAjY2eE@pcYaDvv.)W0ي[ U`\+8VWS`*0UI% L4o/IM9wK:+-פJK[j'Z. ejXJѩRJKGjA f KOjy+|oN|ɂGJ\p>$Jum5ĆbSqF$ci#?R87p+ >/իx%D*nM'[B~Q|6 PYΧrZjkj!h с?лq  ^lJ{Ap<5/հ=av5HA'PKixxPKE9@6javax/swing/plaf/basic/BasicFormattedTextFieldUI.classPMK@M[Uۃ')= Jb}nkT{1_^Ѷ`zb.Aŷ$7'ʷ2t4Z`$Q2 -TK˄ʉ>%:1&ZeTMWry2 /m7E8i;5%~*Y7aMXz5]̹H{UU2K},DG'A )-lfb.<댕csy 4 a!6񇲽4-f>u^>PKaePKE9@/javax/swing/plaf/basic/BasicGraphicsUtils.classS[OA>ӖKe.M5Vxhxnd%KkGW?xBZt7s9߹l" rۼ?~v]oۖl_ lO@AJM#me[Xs۵ :زWIgS]fo"^qޢgqgK[XP}3'g`T%o,}0Q7/\n:=Ǔ󮩮: Zh VpV9my <~Ҟ'sX}M܆;a"[OJdy|"=R=ڜ9{9NL1 )D=S!m%i L7iZPK'PKE9@&javax/swing/plaf/basic/BasicHTML.classRMo@}jB A Rrq֕c[8Qٵ iJ̼y3ov6aZHۡ'>C\ۗ{oE +e{1QQ$c+FU+᫁YBP>PcoHb)3P%uPxzJȵ;v U,/&㡌Г{o "WY0ܘJDR(+ W`>+9/s䉲5 DМǕ"}tsO6sX{NИۓz)6ƚ4X|X{d$#/T ȑ/\d[Oga (W4^ʔYv#6ݯXb l &l)ʨ?5yn*iMv˸sf8j[7ZFf9֜Ң F&nfL%OIʤn_PKW3PKE9@-javax/swing/plaf/basic/BasicIconFactory.classKO@gyUy 'lUc"DD mYa풲Wă?em)$&=tvofshh#p2/t3>sSo3ӥJuzoL)5H( }\N-J H]r+fkH #8fA>w؝g} * }aRkH 0!'|NՏx <2*ٍ=Km҈ME;7f3as[,"zA&E]W,]HI`W 舋'pX߄[fsM1۷=S#W/?6#/4t ȼ$Y)ac6`r~y~kVeɯ~!_~%"Ր_B~%zȯE>Ԭ PKҟ PKE9@Djavax/swing/plaf/basic/BasicInternalFrameTitlePane$CloseAction.classRJANbVj 9WD5(Ad3ёͬ̎ ?{vseϯ;X#EW<ɓҷC$AS$* N\P,!F 5G(74עIx#Et#ru,8+ѿ36Uiv)M;6",gdٕ噋0xUhBy+Ld#$2@;l?QY:wicSXd0 G?KøS^ggT8=]61:g1 y,PK(xPKE9@Fjavax/swing/plaf/basic/BasicInternalFrameTitlePane$IconifyAction.classRJANbVj |+xP !:ёͬ̎Q?˃?JA=@OuOumWo61!G8$J_hM08r4ZDFe]H -aU0* *P*Y l]SZ}Vq|)@уb y 0H/;B{Ȏ6'g>:"gJ r#/2Ӻ!U9D abם?*sF9x9Kk^?2"sIT8).aN #*l|lJdznCc\#NI9a3Y'PK"WizPKE9@Gjavax/swing/plaf/basic/BasicInternalFrameTitlePane$MaximizeAction.classRJANbV3"EAA"('#YWDQbnAPz{kyx}~#:!H n#qD`Cm":0-ϔrHr838P&[e'CO0I"SkaF6W~6ΥaѡWR8&RaoӠOPK&W7wPKE9@Njavax/swing/plaf/basic/BasicInternalFrameTitlePane$PropertyChangeHandler.classRKA&IsV)=K*I P}/ue.Y>@%/`Qݙf#4j6' Va:4)[}z|ӘئSeNL'f@(;0p3r;P$Th$ܖNR6l T'MvIgmtGBxx#% umi?b&̵m)? G1"ofp炰69Flұa жy_;Qc$xxGz\T=n/LmsK+\dbdgX]҄a'KYrN/Jl3͈I2ރnPK8E6YPKE9@Fjavax/swing/plaf/basic/BasicInternalFrameTitlePane$RestoreAction.classR]KA=7InL+؂+4 B(S6ev-D*Bdιw={eƻ%·_jRwNtx`[}F|]ex3ZN&@W;̜U+ Uw-N}/hcB<C)Vޚj ؞v'_.]c6.*=.|Ej? #dM/CaKTq`=?B}!>ȺQw.$s%ۑ$wƍ[9!*05W' 9_j7獯IG/FR}m.LrZhPK1iPKE9@Cjavax/swing/plaf/basic/BasicInternalFrameTitlePane$SizeAction.classRJANbVj |* BA}:1A~%[S]ULxoDS<ɽWm$.HTx4ZDGF4乲<ZΜGZkwzbmvN(k̬֪iVv1p_:}XB]>#!r /a yY=8X%d6 ɯ>FP '# ֞:svB2kIF#,?GJU;bZs`М Bqf왣d'Pl/c5# Bf J&hlKukHs۠_PK4xPKE9@Hjavax/swing/plaf/basic/BasicInternalFrameTitlePane$TitlePaneLayout.class[OAUJEBmM\&M(!!i;fv[O?xfwSK"dsn9ٟZ1"ՑwfSЊ;b_xǕv-i$c;(o;ǢKC)\_sŏfH_Yeh.ſJ/6M'2`CWH`& qiI% ܎BrkiX40\"NRaEBs*`EEFmNjZ;rrjR=ٞ2RN| 8UNS{4ìKcqnTA[~ԧC(w+/=EBkGL_N7ޅlؕfB0et ?G k'pbX X>oz)3z,zlWp IfcO }s(җzRLxEo&a`92Ɓf7[6(ư1J #6k,y1ưF k(c+_KY] +x6@ PKܕG#:PKE9@8javax/swing/plaf/basic/BasicInternalFrameTitlePane.classVySFkacs@MI&m 6PLB (%W9#H~~Ne#y~oݻ&7 b&zq k/S5nf9cEEV؆lZLN#Ar֮TmYx6Z\ \+cR)zNeWWrϤJ0+ZRzY3l|0)+<+ 7)-K1jŅVN:&.C]:fMAug=|#m=УkՇ+bs*̪Q S\P>Q dڦfd#街40U#UǮ2;cXp=f1<*m0jP%4rَР{27 t!Oi4,{HclD3kY|.L4* q\}^&П7,R0gSD{Z94/%f&0w{="B9sUFOUb" p<9q`> df"y$v٢|~5xZ6 40*E$eůg_Uה+0,1 }'M[H&"}[vtg0Ň# = &!Ge]tTH4HD^ì aDIHCe 1|7*ֈ{!, >%-dG`9"#/CXD EFh;@kb9hY6k}-H*%8a wL&ZDDȽN󦲫LjpU "ޱ 3³d_, T#6zŁVHkqp1桌Iʫa9;E0ՍCDytL񄏣p@jxf/2y@X+v9dꢽHxO/0]Hڊde ^P&Z*c*չ4sX}ϒP1>7"2uL[X){T=_h  ^o|Y*>f0ŧ=L Ϣ6 l8.@sCOQ vĜ`G-vļЎhX숅[%< _pPK63|PKE9@@javax/swing/plaf/basic/BasicInternalFrameUI$BorderListener.classQJ#A=7mQEіY h#TRkhCW35 pQ0:&3X#G.P6&᱓2">IŽ6'ӆ2Vj6sഓ@Ŭ*> TmA 88z1ICjA6O؝YQĆ uw{61P8RRJOɺ&'7 98I҂w!k;FyaK;FVَUqb5UGDVS{h ɿ:G6 zCWx[?ow*XXE~qp I^ĵ4z9&]ܓ(VKJ$K<-X.x_ pȊ%PK.ퟻPKE9@Ejavax/swing/plaf/basic/BasicInternalFrameUI$GlassPaneDispatcher.classNAƿi.,TPhM1zhӤ ~ep;l 1gvk$alvvs~9;ⱏS>9 9r#]*ZdWԮK1\mie,En:Ra+GMb'yrĵz|LS$oi%2"V"~]4onF\k+nkYh!wl=V\fVKG"0\~ӡŮ&ܞ-8mESnَ1U K LjΏ. <_@sDֿWR%\B1i }%\/ , x:?'.?ljvwh%7܈qǍx@]7bˁFDĪѼQ<]!jPK# PKE9@Ejavax/swing/plaf/basic/BasicInternalFrameUI$InternalFrameLayout.classo@ǿW1LMQEMeYBnJ0&2>6[$M}~}y'Ǩga11hRC=˾ʬm+޷3vFAi'ޑ7P 8\C2W :sMϥ fm>C D  |),C!U3 ě9Z;vM /i I8hySB hHn ݙ(9Ifs4}bI4Ncӡ,צ3cwK9)a#7+?8d_t4@h-ӈZXei]obO㹚CSPh+jp~8Dj8FTs`ŢʐC dm 7ֿK_ɲgOP籄2=I Tb);YFм-J'=B p=mfD ZnVآɲؗ)5aX0XFyQVmU 7{PKFpPKE9@Ujavax/swing/plaf/basic/BasicInternalFrameUI$InternalFramePropertyChangeListener.classRJA}ČGa.I`P{bN~<~X=E hz)iM4œ=*}7Bq"RUƒ"<6^^ ?3SoH?eRK Cۦ~u4j KXJ:; NE-F a{LWZBX9=8uƠ '4"%a\"y L@ ae8R-gMaxa ET屲F:)ݴ=^Ib(HF]e0%4=| 98<ū o / fc19zFy%aa7s7q?!D$4f,APK7L^YPKE9@1javax/swing/plaf/basic/BasicInternalFrameUI.classXYWFc {)&7MҤ,!qbB$Y ȑdM}hzNzzg$˒=֘rͽ}d߿_.VpLUYtPig{Zth3&p rHv*)8s/EAlqd]V䵺7[5dx@ k՚QĞ|b^QzSCGbܖE]W-nzƶB"(_uᖼ/ZnI@?o~Ю1x'0Uϱw 0zB`j=M,[lsۣisoעH DA[?: YQfWCi8ۥ M% {hr{Dd>)O3v @p@O^GK&g/2sP mPk:´mbvZ]MR:ajx.s/òfpZ`>F]vɤOgxv-(D'qzč'a=}b83=U5Z>E41h|mLGcڊ>e!udki% ^m6!_"|Hʹfm=R#f677 Q˒A}Fybv~`WeZ2(kt>!Cx4WDC5/1w8ҡlmҺ%$d٦NeF@H3]Dϙ .3eCGT+lKp9bW7jpWd?0̛[Cz1rn vwަA؁Cn<n<n4Yk4/|/e\+ < em U\ kM1TC^1/f s3M`\ӝ!p@Z #qA8! #T2&UT9s iRU_r i,oNCl4`!HC/S2pH0 AԊuF: csBj&\pT;'$~5k?@ i.k8 ܑHJ ! )f/5r@q7L±H \ 8J$ǐ 8΂Z7~h WoÙyYFS7 w&ה& ߓl.KA؅ {gM<18(%ņHApj/5"'P|S!QT>u%R=pO ,ߔ@CWS82'A&݇sxHcl4v *McLrD0Z/NPK<ؐ!PKE9@)javax/swing/plaf/basic/BasicLabelUI.classURA !@C%,W˪XTi+- 7&c- *?ʲgv8<3tOw'V> ze\ZuX5sz*1c% I5EVQ[<U/`8XނD . ,$1~ 0T傽oטwHk#0RumQPg'g{Jx{^wT-2ꘒ[ @ _Rljt=As, ZNhQP]\%wCCUv\%%Y,z)=WwLzCeP#NKm-̖xa ]C 몲7n4mmavXN;W s|Ȯ$mŽh,*Uј߰-l cgjB*r̛a ӐH򑮫F"SK  f{\ YuvWTTP\|z@32.w޻2PHV k~H$tNZ<0HIB- 9 !Fa$ 3D1i0@Lt{c?FCI300Xj%>+i`ݔRJKQ aVല0Ť2f|TM0T~]wdMtIEY,ȕɇEX%{{aS&?m /~pV,c{16098G}s!q냏CHX/QR2Ď?"0bNxeeܬ ?PKzgPKE9@8javax/swing/plaf/basic/BasicListUI$ListDataHandler.classRJ@=53NxY﷑o`DiEQQ$D-}؏#8 :Ut `5ƝHų?yŵr=*N.z8@`:\uںnbLX&S${^e #B9Uq}Po7md+BzB&Z&4T,Q ^uÀ5'q}+TЁOEr,Pq(Lއ>1ȕJ ?L qE\-~6sC/jlwmk/+q^ɱM̕_V~c9LbM cW2}ߦT[>GiZBfvvϙ=s/X2 .3܈2ϧkqx92javax/swing/plaf/basic/BasicListUI$PropertyChangeHandler.classRJ@=ƨ~ FDAT|( E/ꖸ-IY>GiT ;:f,[QO^W čH}%ŗZa\V }Bp;+[撬/ZSPjk|};UZ{KWLz-s t;i#^9tzKJ˓{_$T-JdƴJǽ{j 1ZtP:nP!{4ێKϫaY*ӱU#%8ǚ}/"dda0~Pˁ0Ǯ1_Tl.68Nj/Y~CKc2XE?m `W s^"n6f7Q8&$APKj<ș{PKE9@(javax/swing/plaf/basic/BasicListUI.classW[{FM8JJõPP 888! M"HFsyC??_ϮdYkY3s̎&7K=.nnBFL~ ,e)t"w2:Q(=d2yӄ4 &+jzPѠ }mԼ=FHԊ!]&C 8cW(,0:W(C 9ޱ 7ė{_ďJDye4R6,دgWL(/UŎ!c3xEZuه6,>s-y :Mkќ;;b4ൎ4(%ҶݴϢ+FYIiFΣZsjNUǩNHqWxK \iB2lf mp3s@mزee=uUP5yRWlԞ18Ii a?VhRKnWf`b9"do_8gTݹ.imBHzՐHۆr՜\;q` c&яpEyAu&|˪# :ְ]0}0"0x * 9G#d\4 @P!}X^R3m[5SmʿGs4#1K~cK0!)9K8wlp,aL.'^8y‹qP˟1\i|I؇#p?EdD~ I)4gsw67 tN?_"]RؿR`ËWqWwo XzS=~HL1B|o(vm~[/"'PŀIp8Vnj r< αU$E,,R:pU |AdHr|uW2ֵW!~7pw*Td`huжZ?.]V--tk-t-tk:C\}VJHQ ],=ecձbPKGyRPKE9@-javax/swing/plaf/basic/BasicLookAndFeel.classn1Ӥ rmܦblBPJ.]+g8S C!=C;),?w}_v0 ã3~ο8g:}8JyǖR~wO/ E-:R9mHɯ KÜ}`5UW1kԒx7uD>v˽CNO6 [Yoa DcЕFR m~9nTfƑdyTW3f RܷP'H7a'=U %S]+z}FT eOnJ-gjԁQ@jt=w"u墭~J'ݭ'_z+yiO=&/М3"943w~ h̚5\ho#΢qc5q*1褗㤀qF)=sJ|n6Zv9]&wI^@FTg 6p3A웃M@ b'zu wpZla[*[Z=ӌ&_PKjTkPKE9@+javax/swing/plaf/basic/BasicMenuBarUI.classMo@Mܤ mҒV$0TD}nۭueSWpBG!Ǝc=xgw}fwgVopPGOWӿܼr9⾴p Tp̽/o0z9igX/:PcgD(mS#*%-ɯj[3tRD ~PN{*b[h2Xc0 39m6wN'u4X7*n{k1?IE6b:_Y,N=yOf莯\E $]˜p)C |R;kqGS:6rwUXSM| $4 <[a}xcj43Pbd o$.<4`ZEcs*@kQu܉1\a3YInDRr3E\}aeٛYr؝rp- rp[^HHuPK~ZPKE9@>javax/swing/plaf/basic/BasicMenuItemUI$MouseInputHandler.classn@MLܺ.MKPi%H""%hYg]i_ C!fVԍ,|?|T1?cQ¿D}8zmmOcsKLtQnq5H1mup?QcheP&:-%4C|YVw&^PKyŰ3uу,C PBY[6a+xB~"i̓Փg[fx>/Nl0l9;]떽!5/I}phUFh+Jy"UAz4Yf|!?DB{icV/;C!:N8!2wO7 mR+`]]xsBl@W`lre, ?5  iO+Ea8)*2 bÍXu nĚqݍXw nĦѼQ"]ZPK7qPKE9@,javax/swing/plaf/basic/BasicMenuItemUI.classW[WFs 1А͍"!bbR mӧYrW2??,[rǚ|ΌF^k͹2V3Vk;zȬzeՏH 6 $3q|϶\@W&Y-6U]F9۴9qm1Cs*B04C!ʠhtOص+4FņВA*kʡ]wXp\f1N ]2˕) ;-F()޳M:!n*ZmBg!;DfyeƏa OL>qƸ9wN kI+1j9Q;*Pʦ6 2-)D.a腇#pcXCZbDTGT֩yJ!2tfMAQE@ gWkyvS%;qa5h)f[bZF4vwQmscngУdRe;g'$"[9W|͐#cҙC&z1YzE7bSWX4g䮁CN9m XKƸ&0V &&^+2,ǥGt%T]o`3lodpcTm4dMP}#iНl xmПNJ}^6,Dz'V<%x=Ᏹ=&ˆ+*ND6ޒm[2OP@vlzm[h30g~gfqsDV(w ~$!}Џ CJ-)G _HTr ƥI)waF{  i( ʾ?Gxg#PKE9@6javax/swing/plaf/basic/BasicMenuUI$ChangeHandler.classSMo@}㘘-WC J@ZdPYڭuāBn* Dgfo޼]']<:b($fqrIO%/}#u=X e'6+y;y;YIhMrɡU2NM%!TP H\N澶Zl GYm,+(gf-iV'ʴ; I es{WF([(.?J [W10xl 0T:BL#boۄTmq蓼a%<=ZZ=l O݋cNer$ 1?5ٷ˪ԘKA_i>Zh%ʙJIcUP^6:|E[9["ǬЉx-ɣ=Րh~픓=ɰn `&S5(K9 =ojؠ` r`7&Ƅ'e>o\-K˱Ѯn6E;nDӁFs ݈5bōXw V݈ Fl^QlUC _PK]3PKE9@(javax/swing/plaf/basic/BasicMenuUI.classS]o0=f+]ucmD&щ*!RĶw73[PTqRY?Nf_saDa#ϖSkր+ϵ^j29M XG6C=T8EpP12z>]z@0[`BTPu7<R ^ CIIw;oxϰ7J=۟hZjBƨ'lF+ccڏq2| tN%.v>L"W(V ~Yؒ\)Ll3OS+kk.O|D ,0Q–$3a?U``U:0@@bE7?3~ە;?U¿EE"cэQ>Z1ލl2#L]8"X0(qQ"45JmJݓw %suB;-VZZk9KzrZ(QĻ**%[VP*-סLOEKl7D|.Rec}OQHy?˴ײGhmde.O@($4Z̈́j^,Lf.֤# ^o) ^A g;]n{x?rkX8S-#>=6N^# AXXb_B#g,PK:e J4PKE9@?javax/swing/plaf/basic/BasicOptionPaneUI$ButtonAreaLayout.class[OA,jVTP`4PcҤ IަKvg-}22]K/ %>\wgli ËS~?%ͺ͏ {r>cqq/ 3t攼W9U0䕕fK~,J'Z+b{&l?_p~q~N#]v^UǑ2C(}_)l17}?TatAӨ#A#u ![j!4ަ]Aek?N 4Q1U@L& vƚ0S 6M͡OA{hYgzf$fޠlbgʞJGζTE,ň4QoahMd,߀ЃW+W2XX1\XVǽOr)4x4GM<_PK+PKE9@Djavax/swing/plaf/basic/BasicOptionPaneUI$PropertyChangeHandler.classRJ@=ƨV7V4"XM]ە)IY>Gi_Ԃ%dvg9'zy )ޝh'7zT6|qz"RUijF}.:Y> r]<Ɨ !oz>3NVc YbRБ[QQ, ٸ B;UZ{bkB,HcAyBhý'K0\ ¿2y1cy,e〰ԒѷæqKHSX}{+{_YQc{à~;%fF0pu1,oY!pC̞6}FWY0A`0oXlǫOK&ejP1Ώ \۳ԣRY8pS [Be4Q}fRN=νS9(}LA+ T+"Kc uinj ۆcTViU6N.iq(2\Eﰃjy'UYӸ@dR#vⲂi.tcSLF9S,|֜M i31{SiA<==^ 72 *ie_"Ԡ):u(yIYļZLu 82ʁKm T3QY 60)s4gUةit)ݡew9bTdmO?!/mCH FayPl:XD˰oiɉ.a bfW};),elTTcw@;/we&!\/ޯQ( mMH /ڞSfmP?9 ó&u]&'[ԙ_f~P!5cܤVbǴvo%^÷{? s5\aDb'-+wOCRNw4>P%BR;ci.Hr@4 7M-bz06|ǒMCqHcJEQb4bE9;(ݑg@;W{ ܋*“.p>ipXo-OCU1M*<p[8:rI7H;dzPwĂX}G!ȧ]\"PKEeT< 9_hBjծB6"UdOE:lfoW] ׵lExC$ H6gv"`K  _GZh`A ,Fw4@6jvjDӊ~ |5#S}?pqe@PK ɲPKE9@)javax/swing/plaf/basic/BasicPanelUI.classP[KAf]]5KFFFA!TXYGEg%L9gw\_^a`Xc`R#>cj{ΕpN, eK%Tc0;޵#\id]Y4 ]Pzw{ܗ$V f:5pN;p)vk^U1ihz iLx^PԜH‹|GKzyz-U=IݑE?<#xFy8IE9,7g)q )Nq`-Wbbm&-uT"I:/J~`PK(QPKE9@1javax/swing/plaf/basic/BasicPasswordFieldUI.classPJPIUۅ.]hĕPqa$W&%I+G'1o.fya'h۷b*v2S=ĕDyq"IfQ :a/@b`PGR=$ȗJPA;*g+pIXu"OC.zz®]BŋHefI{ڋF(am?>̯S~;@.Iɾʼdi0\\z@>[Fl`\xktE԰f8PKгPKE9@6javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.classPMK@MUۃ')=*,J&f6,= (%J0cώ"TvKy%2s+Ļ3E?9U1PK^PKE9@-javax/swing/plaf/basic/BasicPopupMenuUI.classN@ML\8Q'$EHAH,Y[.B1&d)?3?>a珺 ՍXZosONhOm'p .fzS Uchän) ڮ}%j(2* CT$贅{ۖ`hɭKЏ+=P pVBI2Rڳm s<|GSնK[Qb8N.F÷XB#I4jgvb_ojUc WЇ*t/GJN'oP'[c [. b#1EFK.E>=-)-5'2f>'LNetH.PKdAPKE9@=javax/swing/plaf/basic/BasicProgressBarUI$ChangeHandler.classR]/Q=VWע#"DxM$m{Օ{W[DmZT6;;3{3gr;ϾyRač_FU#/t1GB_"SVYKn;Y #eCߤd(5!*IX/v}>TC?x%B*_ HbCYBr*geD9b"֭f 'u|mg"fJX\ݯc77fr@ eQW䉲b'~ٰXC!18#v{ر$=lֺ˿W \}\ms৻ o /1fc1(9zqbkp>քϽı8|"lӘ_}PKCjPKE9@/javax/swing/plaf/basic/BasicProgressBarUI.classV[SF>kMK!B! qOZ`Bp0!}[rW2a>uQUd-#?H{t|߹cP^[7K/ ;u(ߧk TT+BRh9>zBC`4`/K ^qLRNSF%E{k]fK7Ůq~V+c)&@jZA+Iǝ6 x]Aw=\+l>Q3 ZK:uWx}֡6 mL~ vɄ`V8?rڌ>38s1X=/MqzǞ`F}Ro A;-+Zbi, rXz:iXf mW/{z'0p>IQN8NJGvnzäC1#0v861[1u5޵)!XFRN`)+RKu6n|&-{j37(8B*'WEdUm, ( PCzq]@ x/ W_0' 9R$GL4w` !8GA.Đ99="?⚗{ rM>5|ȶ69%=@I&{#J>HDy &挹,)l3QAeCa*eXLd>rY6#r\1|^xlD@k|bDn|jD>µhD>S8c+:DJi%;( *ijk W DgFA6p|/CZ $ꃿ8'6loϐ"7o!3D'G#ɑ 5u~_y5ߌ E5`dSXo)2(eƶ5;F`5ke Wc0OPKMK PKE9@7javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.classRMO@}-߅U u@rJTr1S :(Y;->̛f;~*J.\ǧ~;RJu8{Nɬ5پ*<›h7{kP^^9"xk(chF:YՌ0Q7Tݹw6O7 +n; vMmbmr_2W:*Y# r,彎 g= a_[]C Pc/K48j)'3}ZwX'?м( $,=>0YGuZuZX WOvDlUN P[Ƀ;R>sv]0n1Kø(F(ޖ9qHv[:oL$)BΛl~'KPK<PKE9@/javax/swing/plaf/basic/BasicRadioButtonUI.classRrA}HI"Q7@՜REI¢<>l&dR ; ~!] $$z͛uy`04.sùTcw3wCTNdV_y8 ͇z<şyGzZ1{.Z i3d!SQ@ca'MF"/,?䁴s25u/+q|'S2]ʿ͘ř} 0GGNTU^\*sN|nOK/lݔ3\ #9*e'j?ULIwo{INtxXZkw-}oQxzLYĆ5(s(ǤA;VFZ' ?(ɠH1xL MZ7')] ΰ﷐ ʨT29ӡj-Ev=[ͤmVNgx焰 + /cWPKo~PKE9@,javax/swing/plaf/basic/BasicRootPaneUI.classNA)K - J%1@KLHLjLj6r? 0fivJL|(:^柙OOU@nU3SݗQksȕ1;gh 'PwEh\P"d?J S; N["0WB3 ćޅ'O C}Ps1lwa7fxz][_tʴvyY08}3'REA͵ o+M]WTM<~r|iKbX;YԿ~6渒<t/#> hq\ӻ?PNJ4q h, 0grZط*DRWʃD+IauLWҨP#DݎYvDjo4lՉņŚ 툆X 6 u6PK)yĭSr^/ݠye\Wgj*/!'xQoI72"n(;ҏJ1KHEMw ڀ2H*:&lfoF0fİ$6F!$ )_?ep%$dkmWx7"P: -p0vHvhԉ;"`VcSNղ鬠곔'P&564(ѾJ`_-rywks_b)9dy$xgu(x%ęaWb<"a|PKȺ1|PKE9@Cjavax/swing/plaf/basic/BasicScrollBarUI$PropertyChangeHandler.classRN1=7I3dBFm0U|sߓ%0blzth͇;X.<ڴB(*{n^aNL-B7ƷC;-xAn֎LQс/$?7VXRf0SWM/F){-y.s7 KOwxX}ec{WP Vn_9W^pms&&0K45g;-a%o3eo\ƬyWԇa 6]#̱B,&k=qD,4;jB PKakCPKE9@;javax/swing/plaf/basic/BasicScrollBarUI$TrackListener.classRKA^יfٗ}PEQP%E=Z[םտC=GE==Ȱa>?b9Ϯ~yms-=B?ꢶRܻK@4,IuSGDn#kqR a$C+E8xj| ""%zm\߇t$3lm UdaGd0` $&d1Ő0\]۾`(C\Ic4a_yLjſmS\kXdXWGIz#{H|ެlV2N2GD]|E Y 1M܉u3s1G)`KPK9UnPKE9@-javax/swing/plaf/basic/BasicScrollBarUI.classWi{FM &&aQ ((vH N εqJrB}Stv%{ 4y_n4.Gu"nohF)^jH,WK`GvUs#hE4;eR M0eB+W˹j9^2zRZ&x˚dW6Losx@$V,,g3FkPr3jJ#ۂб'Yv\9 F|DB6=MŸ?unz*i& 6*48?*Sz]EsCZVZqvLh3\EVp|K% ?,Zx.Š?SH>}yʐaNtz1LE$r4L܄锷B)2I):NrZ)_X!XJU]Iv,F(oWcצ?)ƥjM`9,h&P jxێ䩨Yi[UkRsmMj  -|Yܛ|tYC5rb޲jQң K1m4v]H0$OK T;^hZzu2kʚV# }V#PoծuubTb̲Xћ1qZݷ=q !aX_9<`kU ktk٢)&dͪU`5~t5w] gpGIPn!B9B u "\Le K_W=1L=9& 5$;x\E~oB^ 2s(Y0!d Ep#yC @M%rn@yo.B66I` ݿ5!o+y~y\>Ye<%%Q0pY$\'T" >> n2A0~ \S? j `|,ޟb;op $(A>#B PKPKE9@@javax/swing/plaf/basic/BasicScrollPaneUI$HSBChangeListener.classRMO@}HV55F/J<@45A/u%˃1Gg 7/%:wg?n@9vEǺ]Rxl^ NTJO.fK:$aTّ^hs ^;RmX *+OG!Qm #m! !^ԀtMy)+t%avuв oװP۾!/۰cw7*%mk>K8XKA K+Kae2bb\`rj;&^#Lc14&9ZQnbkpC7a?s/1ݏ=f01?h0ePKz PKE9@@javax/swing/plaf/basic/BasicScrollPaneUI$MouseWheelHandler.classRMO@}qq&#mi!@CQ+B[gZ6Zld;!qNDRgwߛy- ̻({j.\G3~0da|W_>)0=u '.BD0sQ",:pmfqB(e':]^'4ۓ#tژ\]O=Q1 ذr[G&LP#h@ǶMhM|q2F<%, im>bl\whtm5[G1vJSN]#4&P bpQ'J,Z LM {͕+k9U%0-f0+;aQ/z. _RJo$-yPK "4 PKE9@Djavax/swing/plaf/basic/BasicScrollPaneUI$PropertyChangeHandler.classRN@}11\ZBA! FU9BHQ6K&*N.,̾7;  t72E$qZ8wL2&ioB_8(|#}eʄJ)Lji嬧.ٞv ;i Vr!+ yp0㢈bJW?CiDKb;D|.Xc}y,e~n$ioGC0sX{\H~Uv} ޱъEAИVDqbg9yW}9%2cu,r%,:/1Vʱo:6@PKwL[PKE9@@javax/swing/plaf/basic/BasicScrollPaneUI$VSBChangeListener.classRMO@}HV/15F/Jx˲3sf :f-;7)A+n]Ds=OGŚwAWB7|Zs=H/%},RnZUQ, ZE5BiZ;R紥!S 2B 6wC.@Uiy|[Ṩ0X CO(sWS-i~/HF NeFyqw(7.q668Ni_`f1I|C/D]a3s'q1!ZDbm ~Ia5'PK/PKE9@.javax/swing/plaf/basic/BasicScrollPaneUI.class[S@"R[V[~khK;N*ĄIo>uPlb$8f9{: @ VwɨTR荔R2krAUvu IwKFjZS A R4r"UoYF6L2lQ*L5f}aJ#0ڤP cFBJL7kqcT5$'D+24lG*{dU6tYV`a02>rLJs >TR]~;ƠY1;L8G:&;L5OtҘ v]dLD#!bFK\؉76ݕ4Ox.+T_c)zS$ۦuвb]x;h]#j9)cth3jjCqex^; 7 ۂbĎ+ b-b#* {mGĚq @"xg- Hd ;8vq8xG PKFJ| PKE9@-javax/swing/plaf/basic/BasicSeparatorUI.classRKO1 STDQq$1&j-gă?e]6ڙ|7i?^b-?^nq_`=Q4ax NץeNM*`H]~HOCd~`5Ս#BYf}KKrCQm^s-sLW uWm-A/)Ox(X\0T~H7u-ﻆ\(7[I977(6_n<9&A@" )ɳ m2dedS/z (cY0RDފ 4\c&02Ň̽0ɒK!qqJA#uRWH_a+='f'2Lt{7B/h_~PVP섡@ı]ljH&̋K>z.*pep㷰wo,fm1Jla :W2+bgOGx;Ӗ-m%-%}6? K̟[FoPK-PKE9@8javax/swing/plaf/basic/BasicSliderUI$ChangeHandler.classRJ@=۪FDW tc?Mv$oGw.0w9>a^tŋ?<iXyαWets^oEؒg"(lsN;{%ʄdWQ]'2U\!>`ơ UrDXqK(5:0l"* u *OM]f cn{ɒWN<'"Y'-Љɻ"byj@ U)J ڛ?0YPKTfnwPKE9@;javax/swing/plaf/basic/BasicSliderUI$ComponentHandler.classQMK@}Fc~ BVQ<(BR}۬nJ-"x z x3ofGr,D2^ Cy'z2}qa@ŷZ3 #Lz%MAi[B$~H*& <2'qNzFPjFa.`P[B z*P/î%.87N4Rg{v&kf(D%V .P.a9ڙ+X}PK]V68PKE9@7javax/swing/plaf/basic/BasicSliderUI$FocusHandler.classRIN@NBL! @@l` |BxgprϷwu#݉xoH\UUxL/O*IX"E2uP ̏Ϊw2 +3_6d(Xbvte0u;*V.aq=d n:]롄2!`z}UIB"2uY0r mma+6M5tSokL)3d9Dg<ھë=flj́- c ˄ +X+ǽyܳi6b*Q>PKϚзPKE9@*javax/swing/plaf/basic/BasicSliderUI.classWE+qlG8r$YLaI`Xc%A8 dž%M213#;Go|}ߏVwRݰVWUMuUw?eKd\W->l-sb-Vzgyò6w™RnntŬsU6`܉+ u/̗I1 qdug-dLt:D!esC\ved5h6jP30`{ atbSfTs͖_t|+6"zlb4b6(*lDmi-gz65`ts2Ux]'Fz7=׶cؑN}+`,-b5H Ѧpvԧ+KDh5n,5yyU1p?_ߣq%⾘@8yrAƥݱh@Vi/t]}p=JC0jUȒ2\rMb/bP Zbt݅5Lf&-$Ks8OǕ3 ORIo-iX+i4VXY:Ik([WimHV%3iq֣,Ly]': 3l Y?"X{D1{ 8!iÔ3[I~G$ۄvܗ!H)y4բyU޳xfi.vr"w e|m'~.4X¢& v&TbB6AJ8öwo.g,Ct6!ė C!'Y<YW!h)< t7c1FFłGDh5K7Tq,rT0>$"k*Q494:ggl̎XSb[,z)Z#-죡4][rW=nC]>)X~_ YeҤ;-GfD"j8ad,EY; oCb:z$h+1̽|5K.KM./{8=d\+ˑӡNEnyD Oluh^nbMġGƍ)ga}Yڤ2q}mY|[`YTV܂0A?&4^c-g2TBZa9b jJ7˦8!:e='--Ϥ;٦W `ߧ~7nA|~yľʉS<|wO'"(pHw}ԗ\s|h<_f?H n3υn<QWy"lĺ[>\'m0s0||ށl c|w=z/7| c-p+m|=m8clOblwN\Ź M!ƿN<#׽~B`6%N'!ESgjxL WG?gX!ް2ȳ"ꊊ+*I((9SpBqN1 '3PTr\Pp¶Sq!ET>(E@^"5OJ TI o*FnM)qhRR D֤'5u)h RҒfؕKRdUe)jԭ-E4M)tȆҕ"r%Wr4CЈKj8P}i @Z&UvkݰyO "FB) e壥pnWԑ*"[+ȮhD=#vW^U^OiŴ<ޞg6USq!8 iO eymE=k^HV@mYp+)X%չ`'E_iwuGjr/&979陌Jϥ+7[3l#C0!gZN [δWLyv%l) kþOdcnT_3}Nŀܒ̍12*,M-CUهek-t9%|L`ky:Y.,IwCP+ؤkP'!#wLg_,5U9礠NGr\7.,M-֞jQӧmvo@Hb+m^? + 1; 'ۈ`ÇpF f$YTt"KJxrKIEUkX-G9Uw`cMTB &[Jp'Vul9sWk.X:}iU`=-v",C÷xO\eQw-5[T%=V Ufь :PK?͉i'PKE9@@javax/swing/plaf/basic/BasicSplitPaneDivider$DividerLayout.classSnAfAR-ZE4֨D<$0ΒمO 23Ah1lo'hf0<=c O:r?t{<}ٻCOFr,Bד?(4C]mXIaX-?5WHhLAm"rO*=ci,m0@,rY\!FNi>BVR) ځ? PC3N+.e7ļۙq3zۄxvJ󰔧"NSGiDm_)30tgKk>_ e`ušZ )ZXl|Uut6[ʐ(PYcxHilfZM `(2H@H{Gprߐo}Ǖ$9X=UA2* sZ); ,[FlLVŚ3F=s*gȮp7't/}9Qp&΄c?8ĭRYg*5m_[pCz PK3!PKE9@Ajavax/swing/plaf/basic/BasicSplitPaneDivider$DragController.class]oAY"R?m6]5MHp#N%Gy12 "rgϼ'ǸP;Cً.y}<}_w\#9]VBޫJ0!oI}&:!?ɨᠹFgRI}Ь.&О 7 ͰvփXå"9dʐTdp{F3pCiɢk*cxQԞfu/0rjaFİSS6!j {B]SJȨ}ٵ "iR/uޙʞ#WqfC 5aQ$ n3/VƢLys4ZKL+4;c|4sF1M9M)^5:6;ؤ>{4b"Jq3\Q X ΘIX|?8Oi-`x܅2(rF gdڦc>LڞeLsR|JgX-> VS=3/_PK &@PKE9@?javax/swing/plaf/basic/BasicSplitPaneDivider$MouseHandler.classR]KA=ۖfTH[KAQF`>SMl;jz;Ke̝9~!*62 O|_d,Ճ7{wԷ\ 9h+P6,{|=1J{),m9Ive|hD̐ӏ234iiD*OjQw V+ D .l:Ȣ""Cf_*q3|BP><&L ͩ:%Mtad,O4L~Zj'Hll0MS-M KkX4:H9!;^)`|06J` JW2uaPKPPKE9@Ijavax/swing/plaf/basic/BasicSplitPaneDivider$VerticalDragController.classRMO@}+ **L8jb01AckjK<qxѠI/f|{pJ BAD ʛ8SW9CsnlFx"5::T#v}/ԾJEhs!ޫzDhiqTxJk]1I/tY me5+Heĺ4V q(P@heev"tcCb^Ԋf*&dL2Koh~}yR]2Hcp'! K˩cELB(i3qzz^a?s@mQ@ y%1l M%o3K-gPK^PKE9@2javax/swing/plaf/basic/BasicSplitPaneDivider.classVWG#Jmj[JHJl$ <$C2e7gwSڧӇz={3w{3˿}K7ߙ[i̎ŏ:dRjǒŶɦpSd0Sͼc\Ѣ=su:n|0FZe?R,V 5FhLm[]1Ṗj鰠ȒnToQVK1oi6p|ױ,PB[63Rh6e#PΗAcn7-EW`W"7Jve/`;3>\LVQ!/yᙴ1ɞt;M1Et7ChDV/1-pkn깲wZNoKXZ݇P 2vbmO]g7ЯJ(jZMY O=8^[R d0ZΎp\=#Ⱥk v{@@g$LKOOQH;DNU]åNgqE'݀3t f z|(U&A%/NICw,.%ǀ"FP02UunCRd[󄗢"{c)O#EeFk}e*c`%wHU4]I)) 45%mg3m貶W誶aܵnh{`gyny5sES}:p={xt$ҿ&lH7# 9 Z:i,-OĢe e3}QL~*oh5\LLz||`"ȉ#ȍXw}"r3VzDrY3H|'c 4is^ܜ5zGRlX9AE~$ņLA}( #)^蓽HE@gK؟a_?PK* PKE9@Jjavax/swing/plaf/basic/BasicSplitPaneUI$BasicHorizontalLayoutManager.classrFk+18ncI@ b~CZ04N{.#KIgtڋNgzCuzv["_h:g|j`ayOV'ŏkGܓsu-\т+;ϭ&r7H5sdR֯ Yl0[N=aq&3Lx }d}Js̨0uKrf4zh8m0ݔ9>?H2tZ:TP12uSRƗˣT$#QK|QT3G'>RQuۑa{ұ ߫W̡?d4r#Ӗ>$r,v5ڶM`~RWn)ܙ"#I_Xh_ |ШT#/B\Q[)d"8d 6R::mАj}B;ҎfgJK8bI(; /wW JL"ž3TWIt}оxߊb#d~?ߏ򡎯f4.'T#a<%S9LG;Da!=ӹ'kve2D[ і4:n]մ@;D["=#?QoƵD-͸=c\Ie1QҌc0R(uu(jhHcƀA X'Ŀ{c0n0jc0n0AZ9Vsw:G:X݁8C?1p+P&\Cad.a)6N˴4ˉiuӬĤgTյ?] (:@ȇ ^u_iK| ?PKx PKE9@Hjavax/swing/plaf/basic/BasicSplitPaneUI$BasicVerticalLayoutManager.classRMK@}ƶj‹PжjDxhE,DoZW$_ʃ(q6x*X"ogfw<V,; Q3č;M U'2T_xxGљb  xN@:c"d[Vw 57!*#fZi2By1c4*-G=\' eŻ"P&Mf̸|ҶT=2ԕӃ`Aa(C k_{:Li7T*Z18G (o_9La1ˏm/<,FK1yˠPKCPKE9@:javax/swing/plaf/basic/BasicSplitPaneUI$FocusHandler.classQMK@}hk~I(hULEP,oUWdֿA8<0ؙ}o#l:Zb*}3S bZhyۭw`b.2vP lY/f/R'~J8q"cB1yP$4zNXtJUЎF‚9]!k j4PE"V6)Єw$dGfCەuq;H`ю /Rkyg-8wo g90z2JUs oPK?7:PKE9@Fjavax/swing/plaf/basic/BasicSplitPaneUI$KeyboardDownRightHandler.classR]O@=wwݲC |k$Y5n(}0Lt؅!"4s95P#l8q&X*\9ΔZgq.L9_j~:ͤ nJ 3>$̖]1KmOUJ- iT1ثG&+Be.SQc>hh!$SZ89-L{y"]aG͆[UZڢtd[ɔ07i_\>-'&_[yNt5N&Bf o*"L' :@a濭u >LJ\r]_Z@t% &cs S$&$H4BL@$4J>mgu6f]g@Hxwl޹{?!|ꉑJ Ux߹c18eaOyeYw$Ώ?N6{E,?xPK˓PKE9@Ajavax/swing/plaf/basic/BasicSplitPaneUI$KeyboardHomeHandler.classRN@=IP(BBRQOJ-Z$.kgh9k6~R> 1"Y3s`CмP]uf /uF*qDG!Reii'l=T 7 LF٢l[ԴtaKuNXn @SH[+aui`H>ʨA(/9@ DlOT0a*9SV߬ ۃ%DF]f=OmۄuyOBWYqk5?Nl{m;|5%F>N3^Pyq,pU_6.|Coo ;UMJ  O,{N*} 4>I|=PKCPKE9@Ijavax/swing/plaf/basic/BasicSplitPaneUI$KeyboardResizeToggleHandler.classRN@=qc&riFHH\0FTEZ} "FkZԇ~@?bcwhz(Z窧~ٵ62Qga2\~x62dfsfϯ똶 lUD]<ҷn7'BUv ^| -NσjM׾ ,9#v}3"ˑ4a6zRQ$*!ݩp~Xls*=Jmb*Ten:m$uAB<}dp)<_ղK"Pn6Sfhv/o͌-~BkX3QA]\}Q}P['Z5zs+|20IXhgb lP.g+u6cW\'x_,%2щ61+ 1{X8x0Fc&&0PKE!ToPKE9@-javax/swing/plaf/basic/BasicSplitPaneUI.classWYsGA/+daar|@g-1p*}<$OC~@~T*j%jeWo8 |!(\ jKf%a>8'hb28d|Ne%Qd:@oգ⃓p4 OΎóHdjxAl(>>L cwPyJW"k Aѵ@(E9䴰(JkE9 iSS.*2_`)YwI贒NKt.,aB\i ӬJ7Ma 4!jDeYYTr.bat ]+K2٘0%TN1Mi1Qөl%O-,AHe=х/,BAMͤE4I#vOk=,tŽEuGA=y[͒1AHm8#*^ÆǨ~XzJ*ogV[ !e!X 7ٙ'F_fB%ɝAĚ\ןeQ@]`_7h#&x D:-`w /Tm zF6Wk51JIt^I HRX{KƫT$k"Rߚ:7J.e)=kTɿ FWTBn=1F@i+9[Kɺ»(+:~Tͩ\VaY˄ͱfh"D!ҡ(Tc?t5guN1 q>q )5z~aeEeMi@HT֨ϥ,Ԉ nԤcUq!P axͨv֣> hBTq]q"O$wxLIkwLEPXYT3P2ۙpZPX$?^`,v5ZN91YYꄽ$# &O$pV"rR+uϒE6ʑJi/Ew ^[j9h}Z ER& M[/`-JCfX؀`GVi3--:Гw9ZtC79ZfGVG6GvG]1=l s}l?`| Np_O8;æ12fp >v8>qXr|w9^ފ>i/l@b_t~κ ky&9$fŷ"(sdiȸk7l܈ zQHǤR1=VJ,~vIIv_ݬ߸݁9@S P*kz׫^:7p-\oz׻ẏ!PKBPKE9@;javax/swing/plaf/basic/BasicTabbedPaneUI$FocusHandler.classQJ1}ik׮VœChDbݍ5ff[DQdxY3eϯpP`8zSLG¨_X/k]Ջ:dİi\R.R<#bʄ>(g ZTi1˶ n <̡좈EmKW'_&$$C}"DYf8]h&$);g2x}eҍ18Xch5$oKlEQVmF`B! y%xBUU2qj^XF=;_ɰլkg6 PK|d7@PKE9@;javax/swing/plaf/basic/BasicTabbedPaneUI$MouseHandler.classQJ@}hkV$xA jfԕ)ٴ<A3zG9Ͼ(}#yҨjFWRmw"::(qPXR_NRƤS?#rR"PNYhZHi l6NR3PvQĬsŖ%T{J) {@F}([4K o^ǣd@gNko۹^WkJ:4@+![b.Znn3ӌP+ 24QcێvdMU,"Qζ/h{gs{v>?lcBpp'Z M_ܺU=2Zx^ -oV/FSs.tM ]e`!EȚe»BW=)tTI-B:puP(cYJ耰V&̀0B$d%$0\RZ?{2`/ FEe(w)#pQ?+푺vܒ:j`_5xu}ahCVut!Wﶹ']dQP@Z@ 8rȄF i[6svlȷsNxq&+eG6kH |%]cm'.7ҶFD=Tq̱/ꨢCdaU;*e.8!ծYox?b&%|ŔD/]LcFV,ʃ{)^+)?m6y,E,Ie^PKj|PKE9@?javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneLayout.classV[OA=jkr(^ [n*baM%V1m`^>(7;k)mfggs3m*a[-KT ILێkqRc&qDʈVma0ɇi1C Ey5\'\WR2*{ \^Ep{{C 9=:έq/Hw:-.4fz۲aHm gͦhq!RvGDKC_c4N Iy#B Y(~C_i8ô)$N 0<+*k> 7<%2Yѯ!vK\ .}Dؗ.-QmqcN8?lɬd\+ BdYj)wiV(*]Cd}u5O^^>B`PK?:!"]2R\sRJemm9$ p3O݌oomBnhI"7(m_4 w PK"mPKE9@.javax/swing/plaf/basic/BasicTabbedPaneUI.classW{k˖ml|b0$$qb+&]KcizW쮌;$!IiWzIJy|7yޛ7y?| q qZ_җY% >]#N9CL+Y5f)r=\ 2$O1ʘzI:[9 jН-Xްd\B:K| 9[0׳Y :J )۴Ǒ`AV48 <^ZC2GM-X$3k̙dȲlO ^^oɒ "4ۙ"2~pxhpe I(؜7ry"ny͌H2x`zyTh]0@o%Մ$sD䄔.NdI69R&hlt*H}{pzFWf 9DǕ^]|U62F^ AmL:<[2;h%jakm QcxK[dԾj]nF X6#EzÓjfFhpPh!КۢcbWA ꙅC j3s} $B{ R\[~\^+ssVM@i=m"1.+ UXzvepcBV:= eyhڿ 2; e;en2#kEKR;RYU殀*-Svɐz7Ppč4QQ4v[8q-H"[B  DF*q#cWz-?5e-b_ISp}[lġ fha:he}:hׁ%:KptC7qoMc~V_WsWDZH^#k`}_/7>);kh{k7vuW03>U 0^Nk?چ^)W]w0` [aH`2 cVaЯaRU"^mpO^VZ(M3<{: ܯ.;`L)yTr(%J W_I.([51Mg3ecvQǃ:0Sِ}"BEbV]1/u) r wEОj@nC*V>; , Ǹ2 alU={hQaQ.GXyUF NG3HY'Z*ֲS`XUUa# 5D+(іj T Sv6]@]^ӁZdRܕ5jeeSsw-+by9= hnNtա_p1/BߧeVܯxR'HAZ!jՂHUF v[̌ l.koeAu%OE<}=_q ~5g1 Q9s1syxA@$B9ċVe{[ ;);/pV_ାY}V2U˨5QJSkRMI(EMxKa?ԏEČJ3kR^s U^l2)N/tE\a 6!_o yaM|30dTbI駆·e:Шa0~i*|^>}5( >PC5+ ~ ި 1T7#߃~ ?U>[oW_HT +D-TWj%uky~c?a3bϰۿ@/PK d v*PKE9@Ajavax/swing/plaf/basic/BasicTableHeaderUI$MouseInputHandler.class]OAik.(5#a+ +&E *.dv[[^/(M͞wϞ93~ )8(ɡKP~2Q!Qؾ3d-9\wdq-B@w6 ˁVg@@<RK %W0B\ᛎ;=׿*U\ MX V9r+B*! 밑In: jކ;dRSv>2f$3^6 nf{}l|L0Ҫ6Z &VhfTp7l vC ? |:@PKQ;n_?PKE9@6javax/swing/plaf/basic/BasicTableUI$FocusHandler.classRJ@=Q뫾_P/𱟦D2i\;.ԅ={=s; 9DSNiˁi["T&#f'4dHߏR;!,tp }9<]rلɿ%\{m"஬[yE3y W.T [v~G,&nc\ KTaObz3Ә}PKnpS!PKE9@4javax/swing/plaf/basic/BasicTableUI$KeyHandler.classRNP=IZAJT#Ԯ@,@ "@7ɴ`vBY,P.(\' Y\9se ׆nx_nS?ݪ ua⹪z|qP:RqBPOmrPEѕK7}m/ f3 ;0j#Id ɲih7Ub!_i֔wmaʈ%37ھIauB%&@ }0&t챊F:Lj5A{'w<%RB !u,N&ePmRRg`Krڗ{8k0q'U9ifĹ(O ~9{ ,>d3$QlL170.EBF" @PK(dPKE9@;javax/swing/plaf/basic/BasicTableUI$MouseInputHandler.classn@$!n\OAH!*.@\g [uvҾ BAԍ,|??x a@LI+=9L ?A"?½tɞ>篅&x%o2= ,PNΣS{_e HS4ɾ0fKx2χ6f7QW9$lGq>ۢ], ýY?'rWXX[j/f32ˬ\*{HQhC:6|WfvCК1:lp|_5vFk.n1*|7Vpspb.pkSN{7 ZrjƑpݍr nwu7@t#Bv 6܈"*lhJu-]46|WzIҴ^999&  kyU+U~TPZT g<-M|8I!P%zQ mMմC*RDOHKiG / }e4tnDvmkl6ס<a-⺵k.4] N+šW^)gHHc YaaJƾl _(\;=g 1ԧ. -yT:Orذ>c?ݯ܏'a1eWDAw7 4-iۚE.yUKFyRuIy/p%r CmECuN6<5Iu0Saqa䲣9g8Eh ~`BpB>}[DlHaڝgv <4gOoD=$HM,[ }ȄO.N,D+KV#q/"WIT|ɜZ< ǃF:G'zNW\%RKѮakع Dw2iD#dʗAWz:B^l^.gF3-c7`0 |JŞ}BˀKPjв|qnxۛF3ŭf0֮V+#CB"qskN,8f;7n&>^=mdYmqYX"wfU PKe<UPKE9@-javax/swing/plaf/basic/BasicTextFieldUI.classMO1YOQxՋ`k<` _PK8=XPKE9@,javax/swing/plaf/basic/BasicTextPaneUI.classPMK@MӤժiEx*, J&]u%-gIG/i(afǼo/ỰςA` ⩌b]r%\ zO2fJ%#J3`{z('ndI;)=ewyOZ u;?})=0xWzbbq*s\MȏE7ZХ( fgԞGe:V,;b J*ֈ[PKgLPKE9@3javax/swing/plaf/basic/BasicTextUI$BasicCaret.classPJ@}ӦZŃ U`D[]doy<~8Y <,vf͛}.{$V<nŃr1OĈGBؗS3mYB' ahHAt~mΊ< J9ao nv#}1 C+T,"EPG'b E+阉 ?19窜ծy A/MeMR{Xb{*5 Hؤh>"еỤem E,PKǽ1PKE9@(javax/swing/plaf/basic/BasicTextUI.classVkW6~-2k4@ۍ͸[Doc;\>lv>GlLe-YzG/X#03=sej:zQ[v撐 l%0R?vMZt-@s#UbmHyd1"5o0t^*.Zuɇ0Xdx{ Ec ,œ=Ov,f$X1n^>5qM %Y Ãm !I4n/ -=j10xVj~XQf&]2:uVUBeELֳ\ ٵe A%u#hM5 @»HaV0]Qh6f=ҝ5"ڴ r)Ve%AcToEUfV&- EɎ: Ue{Yى~ı=r>"J{ }WƇ0CNt\j .C}VآvUQ$@?ơ yFo!>,/gM+«-U}0c^l؀[uƍw_bO` +/e۪%^ nxܫ;ftٍ+S*#I"dXH3Gʫf3$LՉ KR_'`iJӂX|_ۖ?wĠ߭bp3{Љ-: >xǐCHb.9MH9ǔ7σG}7+_H#8B> L8XuI ApkBJ̓ Oi?  mJо&1Ick&Jc "UĨV>̈e"8~G,kG.[a?8.C|aZ G }B,+c,J7yd$>U'gj8-OR<=)nC'L nu慼O\l77Zy_""`'[2Ngads װw/*HbKE%)0.Kջ>0lLZiBfw wmiJ}(uW7kq8@#\[l{PKQ9=0PKE9@0javax/swing/plaf/basic/BasicToggleButtonUI.classQNA#.r18dh0ă۽[h=dQ?KO&?zw4-U~~y|,RꥸnttŅkOf-wCX $d6Vf,\Fn ua!hKD=ELKǴTDXK0Riب|W@Kms-UB7B#65?Є+nNK݈L(|4}o<>:I3k:O?/lV, _=if9s9H!6_Nbp`?>Qz9EwߘO0+&Zd)&V^I$Q S̰443+PK|PKE9@4javax/swing/plaf/basic/BasicToolBarSeparatorUI.classPMK@iUۃ/lEL$T< (KkJ $xėX*̾y  ,/WD DBH/P&ˆL˳ l_esbJΘ`tQB2BWNiF"$aס¨7V?=B54Rd2r&?Icg_=KZvԄTv)8Xc&3Oetf+UИb([ J `昋PKm렬 PKE9@;javax/swing/plaf/basic/BasicToolBarUI$DockingListener.classNAƿi.,V PH)kLb(,Hnu`%kyaL|(i|'pc<=~g2y&C[$yUISr2S" SSCm(z"V^D+>磌|Of;)t>1T"l`BKW aRP_dV{ưՑNy%c^׏fr,&0[4n{^%Tum(2ݳHy; 3A舧RCGbFBM9=gzHa~=ԡ꣩zW4/MXT˩J+Ϩw@Gz|%)!e^cfq+S,tXg<s5GE, X&`!`";bނxhG,X+vDՂxdG,Z% fG,߈a`ͬZChPK W-bPKE9@6javax/swing/plaf/basic/BasicToolBarUI$DragWindow.class_@@uKAc7E q7q ;v63eC?x4 iO;Oh1}"'!}oz$e]R{ ԆŰi\>Ld(Bݵ1l%0PmJPݿFԱ+c?PGR{\ 󞊖`_bXԩH< ʡQ(D1^CΜe)W4#wx%0:cyQṈDy^ wC<naN:Zc1mxVN x%̝TNBumvBJytzIqjhͱ/D(U\̾zѤ`+K..e2*I5c%ƭh.Jl WWEq-"vόI5G4)]4|Ý&cq/V_hD׀ƒPK-PKE9@9javax/swing/plaf/basic/BasicToolBarUI$FrameListener.classQMK@}O"TqR[(k=o۵˃(q6x- }3of9lb.޼x؛X ^-=vHLDjٰēsIQi"#B!yQqpgRUrKh62 V;"k.VPpGɅuBae_iy? d@~8A_DI L& <΢(ӫL>5- nW38a&-BiI m*`ʫ|9D p' p9ʡX`DM}7fmPKM:2PKE9@<javax/swing/plaf/basic/BasicToolBarUI$PropertyListener.classR]/A=]]֢ *"!4$>[gy?w탏D3;s3s|{i)֭G'zPSĕHU}+Ah4 j2*/C!'yjl"CM~hoT4FX,uSv=B&g`KB х,!]Ѐ+Êp=Iȕ.Dt,Z0a{k߼ 5өFuO3a YpVz Zl}䳘'HF&& mO#̲ilV{?U {kq SZW>'~+q JByfOjB7>6z7)&1' LPKNk~PKE9@?javax/swing/plaf/basic/BasicToolBarUI$ToolBarContListener.classRN@=J%HSRDo9^dox(ĬZEŲ<9;wֱ`#G:=qŗ*<qE|oĦ+äD2agOl iW\&0 L(2G=q,c ˙42Xd|Ec9myXl1#Ծb&9xXG70O f <d0ǑuR0t7C eXOPK0XPKE9@@javax/swing/plaf/basic/BasicToolBarUI$ToolBarFocusListener.classR]/P=[[[JV"x ~.T+oy?sBMܹsΜ9;ULD]0&zϵ 8ظlM6a)a4x͐N` PKD3EPKE9@+javax/swing/plaf/basic/BasicToolBarUI.classX[wF5&'V8@qr &v %lYk$9zJڧӇήdYYQαƚۙovϵ e|f435k$}]S}E,0v4ӱ d3M̢3C`xaItXuN3F3E 6o7c{m='a j:{eӒl9yȔM.}E`o.S_MV5-LGoe+2M`J'@N gYC\UE WPivRYXY2k%R$ ZwDŚr^uJu B5{Å5́W\ηɬ:֛Rp:+l#|AB#tgbCjn$-7L Y`5 7jejTUpYU35K3鸣RU3(C䂂m4Nv| ar|Ь LY6=$jQTV1\n<E@9v/~Vl%fl0I;+Xs5" D;e;-.w@\`66"W?#rEw5މ]wuev;#Y QD:p7Gv%/쁞3!a߆8.$O / &,i|x-w~_1~ ;!L\>qNi`bfL 16S1>i=C.weOPmf[SZ'u䙴w7: Z~Yđ!$Cސ]y %qaR˰gk&C i}FuӲCl,&ŀsP[z4/EG;n/G(t=a EZ&;=q%Eʳ|fbth/IQ")zĐ 2V Wg|(>16\RP@ʓ @XÑ*R:#D%F#j"P_PKj"Pg]PKE9@:javax/swing/plaf/basic/BasicTreeUI$CellEditorHandler.classRO`=wu(CT%"& EolL-QuMIsNwW5%PE`dԷR$̧Yo8qP!%ސAоci'j6i l ~[G:!]P}0ce=Pꈿqrz 8TL%ŲbI:B8lOxs EJIl??VӚ%Y<Yy8>OBֽ+E#ҔSbh{kI,#ېDzs '2m$no7/e*!*zy̐~BsŜ؜<,[s%Jx_U͊PK"ZCPKE9@9javax/swing/plaf/basic/BasicTreeUI$ComponentHandler.classRQOAzqdlq‐8qrYnwtUה`rN4ēUt=ګ oJ"i(DDP& ׀P0z'B0ucɆR/J2 *]^';wx~WE*#,.|E(5YہNy:(%@"yVʤ"$q +(S#?a]צ>FnJmʡI"aK&#2N?)I ~finBk-L_a߯90ouØcW[+/pV^U}<d 0v6Ͻ 8Dess!2ȇT;ZvٹV,mҌZ\q E G([㣄P K g=O,!OЌ@D(Ƀԕ}B%c?J&46!wDyf]dQPOV-H%Ox'Ruy汴8c[k&]q)mgs2۸B;/"F6Y[fĬ93 ߷&cw1_ްb  dK.4jsc PKa DFPKE9@:javax/swing/plaf/basic/BasicTreeUI$MouseInputHandler.class]oA߁,l-~W+*ĥV/6P5~Y-/,6L/ygy9j)>S/: }kHvB|jQ$j8rEPЙ)}/:q4ObDȐ(2P +-'@Q.C& FaGQF\R*b/pgM5ݍctd\!%.eВJ "javax/swing/plaf/basic/BasicTreeUI$NodeDimensionsHandler.classRMo@}c1 MC 囶& H)AKQJ[nvO8QYۇ454fvlGGD|r x"QBX˗X۰)g;Ͻ$v稗v( P%eB{zU Rs.fULT Uؘ$M0U{2^ n`WJEҭ;zLLG4{I?m^ND'{H 7+ʑfFVGhn*o^WJϣ6PuPƝ@$Ll4 g0Zg0ϿզZMsF&Glc[fo @l~=SlKQc[pӨk6\LOkסr#-*5ťee023t`e:npnVxa~zi.8Niy,YgDXĝ.V/PK'D PKE9@>javax/swing/plaf/basic/BasicTreeUI$PropertyChangeHandler.classRkK#1=;;c}U薕*icӒ,?, ~ěi?Rޜ{# 8/E[ ?-)KǦْ&+7B"iURVy\ qZ[Qq"4|PqiP`ߕV{\Y>zp0"a% WBiNEIBҬ\en2gK%VqCWN=]Ֆ:=%'kSVWҚC;#2v0߿xφ0Ǯfy|ߚ?*q.69ꮬC)g1`EF/ݻ &7l|ν‰aWhwbSʟb@/PKPKE9@Ljavax/swing/plaf/basic/BasicTreeUI$SelectionModelPropertyChangeHandler.classRN@=11n0ІH\*UU@} )H\aEf>TG!f< );?bCpp[}"%Pd0AYCvZ#kkmJU!Ac);&07;PK^ PKE9@=javax/swing/plaf/basic/BasicTreeUI$TreeExpansionHandler.classR]OA=-]n邈ʗ@#a񁦄&

    mfmvG,5d̽{ιzb n]ˠ-6)66*Bw#8(|K"ԳvOvRE›r u(ʤR˄PL%Te|bgUSlOCi +K =8x"|B~*[[&Mю$a>;"jDY,R ;v^\}9x-"7Kmb̤6t@$</Ty|t䑲jݷz oh~Z$asrqb=};tݬ_){{?rc[d b]<X*dx=$dŻCKW%Na)/c%͊5PKf6;YPKE9@7javax/swing/plaf/basic/BasicTreeUI$TreeHomeAction.classRNA7^q+<$DP(LE8 $|虵!Rgw"G#O.T? ũ ZʓFq_#ayA7I,O(ØB[% BoSJ _G)hX Rݕ9{»\yȣ\BB~Mm %a"} ȎMS!,ԧ틋ԗ~Ķ@))#Q$a(D&.jכ#yyޥAT̤ o<Ʒ|; []FiW'&IL6|F3Y,>Uw@/ZVl&K>10oU|¼_#PKl[7PKE9@<javax/swing/plaf/basic/BasicTreeUI$TreeIncrementAction.classRQOA={,R bjUcD% !*Kwfh[>(1 77뿗WaEy.⧟U|ĉ j)y8Բ/l'TpڝnibOi9) 36ZF{zmT>RX dd\xc"ʄ̵U,.]E7J; EZx 0}b=@ykg/IGbrt СĔP XHL] ш^sO+PescY5FO~Y<c侮}m<,`S笷g%<Nj1{mcK4J##&װlX[ PK6b/(PKE9@9javax/swing/plaf/basic/BasicTreeUI$TreeModelHandler.classR]OQ=֮,,-5"&Qy`Iń/v;%{[[>(ܥXlv9gf_x}5TG=s>&]eu}hއ: R70<(&/MZ)k%M!Lz`IQ (ZG%;-T_~/U0+.9[̉{ p #"_bpqK,p] r%)>E ,^PK2PKE9@7javax/swing/plaf/basic/BasicTreeUI$TreePageAction.classRJA}}7*9AE1Dpw&33F˃?J uu׫ׯz}{~<2+^| &^]v h)Os '* p˶qyBlT%KW߿m0S*"jI^ rhfn̝ݨ! tG,(DBwM.[| ̽X6)ni FS!,HH_퉻ēM&^gbo{j_+)#a(n Xy 37GyYޥ !Jf.c,pQB׃0ej.h baT׬@Vl0M~2f0f㘰¼PKiNPKE9@=javax/swing/plaf/basic/BasicTreeUI$TreeSelectionHandler.classRJ@=ƨ~WQD,B/v+1$"QlJ2{왓||ĂaNԓ={ՍWQz&^Wy.j j>2א=_ r'-APQl\Q~//cO:\ pMȔ5΁B4ҫ0X5+^τrkjS73F*a{;%Ꝗ\]\#~#=EKbrw }hU>FCۺi RN%_EGKE4ݴ= 5&:[bT[R$ŵ8W <'!Y$k#LxvzB>ljSJӘI<}PKicPKE9@9javax/swing/plaf/basic/BasicTreeUI$TreeToggleAction.classRJ@=j(}F>H }ߦۺo ~%nE\Μ`Kkn{狖C5-iѼja/Va E%PKE9@(javax/swing/plaf/basic/BasicTreeUI.classYyE~dv'B X01n&$`3ӻdҽv$QD9 r)" }#xzQSU{WU7$3PC`ֱ^gaޭczWߍog@WORihM` $#YN`J*qG/ I5cHRuՋ}d &1A7h[lۺRJtv""2cG8њQHV t06e(՜1WZX?l[f@FB.Hsǖs-kȳYG;hkeE9Fڂr#0(\AISgD-m8mhЏ-bI%YE./i;;eTGܾ1T#*h"m]72J긶Vp]VeYQ':*fuu 8#ȣ&b]4_g;lct,ltǵ&xIwu1rRQK-=v8u?$tR8q|,cN`1aaZ(PؓV$0!7o3؇r07B 4huzVڬ};gPbXTL$;s2uvhPTme¶96per* F=)eJRڔϛn:&Ө1F1,Aˏe&SܼWqJPeChόl._fKHR \rQyvDi#:΋>"AOQϛd; )j>|}_$2'lm|(8utmZ"TE/lxZy<9 >Yw͸BԎ *[l8 s7eT&td9Ҙd\j Õg{dEو i.*4p5  w>L4܄A,X U[V-UWrru8(ʏIaRwEV[e!_&zaau-.96JWmmG KRn0Eg\NOwsᭆ0#v0#L2Umb0{7Zxnʻzbu\3L7b)CaU"*voyi1n)NdDDk$X!vM 34m~kNM8ޛ/y)$0TD}g㚍UtGV#^:jۛ&~'{x.'Z̭ mN,w,SORN(곒и9ݩxH0=sO=7ь`ݟW ,R< ۊkJí"P^1/!| 엂!d_t`!0X}$ cty`nYd4Cҝc/E8:!{rH [dȞW+gv򚿢]st(CfXTqkf܈n)FfHK4@q {^6`DO:CESXMoDs {;tNb}*{t1g^Z~gCx<χc6u![/EW0$6X cXUHVX;a`gIXX!]l!h6p(>M@UY ظ&URj>_O'2}$է_ S!O"#ӤAXD.E#3!xyȳȍI<[ G)ߔ"w+ߒ"{s@~[<ާD+E>D~G`]  PT" !Wd@(%|\'CËPc^c鎀Ǵci">o5 4KD]D-!Qc U .|KLCM )AM!0"\,'Lk'AÁ#wRgAȱ".]"h%H~\#ǥ~ԓx%r)C(r )#QW&ZŤ},K>*J}>%iȫ?it/O Jnפĸ}>ZU+AGrT/—"^quĖRP-j[nVqSM$,dIUP<%Ho ?z7t5RjmRjOR,s6ӪKO;K~*w&JobŒ0cձ+1Wb~V?O}Z5Xw_*mV<ZkPSLqOY)a/i]ܠfōD+i"I |X ӹ~HO糺L :nܪ`h"),ކR7,cSm",),f,Q{1W(X<Ȃ00+X~jC^Pe΂~>^e++6>X|Q_.P pG+NY:ˎ!0ϦNG6KCOo=#DL\\⤁"MDLV]v]#ur SFuNԓdF eGʪ$Oh\ٙZc ?7QdzAtmAwWOwPKPKE9@.javax/swing/plaf/basic/DefaultMenuLayout.classPN@ BP ҁkHpCiK[ N RX|m(b{OzUʡ(b}!"iXoI:l֜ѭ%"IT1aDOLO-T"; XN0\EB=`2a6 D<*殮TN=ǚ Ϳ uu*'J=v@6a?e:ɯ% jm&X=`uְ^18oVPKPKIG@javax/swing/plaf/metal/PKPKE9@'javax/swing/plaf/metal/BumpBuffer.classQNAXADN4^W Fo0fdh&z2QƙuQb=TOUOw~|(c5J~Aw{k&W}Wm$V2`RtѼ-`PX;"h=ah5j0OVelvFWɚ}3H`< DI]%k`nq2uKQi"}*6rx;;3YGW;~ (5şcar m0_6~Ciؾ'B-07Ўb @}I4ɘu+/PLȨh`YB&1] T[ S>ϴQS3r%(NFF ${sC{(0ģxf;[>Vļa;CvO&9Pbh͖E."coYaW4D$Cv#ahy꘡reO;}R'JET3Cȋ8ZD15m@}Uƿ%{hQoʽ\e&ԝX#U?a&E"9&Ft(`⒛h%, PKs/,.PKE9@8javax/swing/plaf/metal/MetalBorders$MenuItemBorder.classQJ1=k8>U uaS-S>ϴQ#IRo\~x'Pq{ss9 @J {(?$O xf{ ih* Il#-1lj^HMH2Eai C+\,/R #*{P2TX(c)@>C3R*. PKE9@<javax/swing/plaf/metal/MetalBorders$OptionDialogBorder.classQJ1=i;UQD]p!"hE( >LcMΔ$U˕;Bܓs|~ǚ@<nUT<"'ټYgJyZ46Vʪ 3%;7cHʔ=a(otvޓʘcL^w"NьD]U}T0C=TZgHkT&}QyE{E)+7k5&ŻyArZv,2:?zJB;i,FP] T_javax/swing/plaf/metal/MetalBorders$RolloverButtonBorder.classPN0}n҄@I(`RuBZ 0\Iᷘ> qIPaKݻ@[! G|_r,}]>We=c'ºk +9g,^T1R2}313I3Lr%(1*݈8 6Tw=Q^x &s=ڬ3Ky(VRgR{Z "c/[X-R[1dlp #aZ:ehBs j+ Xv6IvPt\" *= Z4GpWt*T-U (i|l1e>h] -ݍUvqǁ;748aX`]0B7PK vc"PKE9@9javax/swing/plaf/metal/MetalBorders$TextFieldBorder.classON@}S(R0zPm` z}[Vf d x0=5&oͼ ;6:3{aH)KxdtWu^PC(celUƲRMK ֥DyE0Gs܅COD٘C6&+Df9p! E=++>,@2VD-vc:Cjm͢ݣwWϱk:F>6u uf  PK B'PKE9@<javax/swing/plaf/metal/MetalBorders$ToggleButtonBorder.classON07iCB$ 88 $VBB \zw[\ [8|br(RaK;]#lh1?'gQl*J{Nu;SJ4zV 3.w1tΤ7df""xcaRj:vGJ0s5V1)Ctk*;n wN){tlG}]ڛ0 5ha镒"NS<2a<P\iWbbJI`7PK\ PKE9@7javax/swing/plaf/metal/MetalBorders$ToolBarBorder.classQMO1}uo<=7Qc$&$A{,[oy2GgM0bL̛8FEhS`e|#~Qp`CfTzpjiaꡱ7-PulX[baMZ5} 'aim2!2d,9Cvo4@xȢc>C-cq5BwyQJ[yZ&Wб4Ok뤭_ȤRyzc[q,t3Z& %@c"\џ2:4*a `0(S*XIWS\:^->PKX<3PKE9@)javax/swing/plaf/metal/MetalBorders.class[S@-, xF夀J8P+)%v-/(/Mۋ>޼ߛݝM2s$.ŕvoWr*J|qϥpt3 FG .e0nkvfGA/C*zS\((ɐPgwú&v 7`[LeRKUލ0>;-Ds:F##FWrm$kSӵ:Ju^BQJJ~QfpS\yI;xab}$K K6!YU .V2j 619H*닲tP9&,gv(3 ˶19#a&b\e\tqEy %i@xŰb+J9T±ȰiY+?YdUГOktUXgX RPQOn8^[]7jQ8-G/?.rZSU՘K^t*Ȉ=?q$_3Mc@ aZdzLԙCMa ɟlXFq w>.9S#8 )q8E!>#// p˗UqI|C"%ߡPK>mmVPKE9@'javax/swing/plaf/metal/MetalBumps.classSISA~ʖKXd`aa *V`0~&!Ϛ^c[GPM\dK_Wi_!o7홱Ne3);Je(8f-z2w?c= :+^Do:JOƓwHm[-+'@6/$Sh"@zJA7}w$5 @1QK(3g p$EPKVF-MtK09tgZu:G ŗ{93-fbX֍ndp^v{l~ ~lHz/LxSqW!\h]~]rQ? _x/̎ eHWkg NCEi1C)+DxjNb(63JS'/dİ|τtI/\ 3vu@tP+@k^7m皇 jP:`أb6 q߫ "?]^+!toк1?=` 5͝8ġn84[`Z9&y,1(NSRf'> Of)f,XFbG)O["N7ʅ>e %|(>N8:^4RJFraqlf"4*[Tƴb+PK>ap.PKE9@.javax/swing/plaf/metal/MetalCheckBoxIcon.classRMo@}1 m PU,nA @"m9o%x#gTM\8!q+PH̛y3oG)U敝56'i:%|tDڦ(c::QN=d+Hr гv:>Er0n1X6ÑITb[שE:<b)>%N=y8Pmϕ gJ(=,VuF~$uB|3+W8Ӂmdc l1 ﹝oXA E|pxc webłE :a7E6GwpX[+\ڰR51yoT;ݴPKRϣPKE9@,javax/swing/plaf/metal/MetalCheckBoxUI.classN1OWQ0n0!L0. 1!"P:3% L\>#m ;qX |§^}g =2Ձp*jڪa3]*ccTЪ1Ne CPl3U)DL#C.q5;B'^kE 䈡P_e7"d*rŞp]bɀ!PhТ' 87&JSM5֮8r+-@/pDhF/D1NCHH\;00 1x%r5,A5қqӖԞc g(g3oTyʍ7fM1WNDJ$$#%ҊZǽiYյM7PKXWPKE9@;javax/swing/plaf/metal/MetalComboBoxEditor$UIResource.classPMK@}Ӥ]A{0 B!zMJ-I[8Y y3o}|4QIw4a*5F&K̉Nte*ͬ+.Va~aH:1L>Xb%I،e:wҭuI85A\LnjgB0sUD,K Sn?/~?cYh9@W1vG>NcO2P9m3aՀ:,bm$2SoY딡q }ZOe*#XbhQ&͝rI֩/YsOŗV@^*o3Gs(Zil0,wH[Q.hk:FY15a/9P#|BB7BXEFf6PKl#PKE9@.javax/swing/plaf/metal/MetalComboBoxIcon.classQNA^/80& @Jy ⛸pB=TWw{oy"'<ee"o]g.ؤ!ʄ9-ɽBݳڈʴL&*dݹ*tgBP7GkB0֩q:!̷M,Cޜd~-tOY)[?AD/}dԩghz{!ϭ`IUj[uscȤ Bt/e1HbBx1"|rIkKLmI(6ݎ/gzhsD,ga_zP5]`6 owOȞבǖWa`[Qzf/} vC(M4b@{ XKBA g F4spuV ٭3Ǩ)1M@ z04$'gCʌs|9Kb|CX PK}PKE9@<javax/swing/plaf/metal/MetalComboBoxUI$MetalComboPopup.classRmOA~"T !3&VI0~^G\rm qV+~yfv}##<>S=ueڜFD}:Ty[ًÍAvnnKe:jhTj#½jm$S@qLW&ayLC~wZV„نUTHx2mʸAOh!L9Sƹߗsql+Wm|!})M9mһ8δֈ~DGTᴞ,,Uo vuqyT+oLNBL>? me[9na(9nK_l`J+%HJ, p/I+>W_kPKPKE9@Hjavax/swing/plaf/metal/MetalComboBoxUI$MetalPropertyChangeListener.classRMK@}ƶU"ڂC#b!iv%MJjYDG33o;CljH1twH1.S+ ?|2Kp!c@<)ιwϐ 20Z:texL\eȘ^_P1li,аO+#"*Z-n;ly=t/UQN8k$:M8v_]w\J6"аʰLC5}4lqP44?V*+LF2.}Yu6|ːz!4/ }dI,00~RA" rw{ä9>C|5D\POlH=٪'{nϜP܋bTWFę-y7$PfxQhK6aÄ ݶN% BazjuhxJR 2.PFž%Qn( 7R+jx%s!0r̟3|cC+åmc_w5%qzлD]7Nԅ}*}c] ֬E%3l@4 ϮcO7u*uzfЊ 4ied! diN9ܠy@&YzmJ ;dmnG(k}B>8LD cR|rcdq{"|2"k1!xQLg0yE/b)ȵw}B$)&Sa/6xY&viRH%4Vh< PKħPKE9@/javax/swing/plaf/metal/MetalDesktopIconUI.classPMK@MӤժ-[bēP`ED/jj IZYz<QZ01_^k`po?xL4W^, y'E~Wtbhm< S ֞LdP#s.-a1}q`XUȣϤΫYȜa>C#/ۛRTD$Eߝ],m39S,GR;]X m@T]J%%p3ܹ2~|UK1avҋ*XZ.~RFZg|;6#=[*\{1a05'Ɲ]~VGE3KA1psϝ||GA!|Ǐ"%cJ- IHMOԉ^R4 MAaw6 D&)d'#‡v$"35 @ % ȻbكlCd#}{ʡsZ;3/?{_A>YC/eeN$cTs3TgNmTk2f-Lt`n+geP4750Jwrz:6,3g[PK(T`CuPKE9@<javax/swing/plaf/metal/MetalFileChooserUI$FileRenderer.classQMK@}hk=A уo۩ݲM$IտA*^*o;`6rñxO^(;^7T(T쏢(S7۰YTLR H&=B+ױPvf`р ,X@A.l #(2)&T/TWe.N8'384ms2!ǾI‰*9wKm=w^/fx/굨r:gf94rdkc#MlPK)w6NPKE9@Cjavax/swing/plaf/metal/MetalFileChooserUI$FilterComboBoxModel.classSMo@瘘 iMCS$F)R H^8mʱ#{ ~? ։45jgg <;q}qW/0eYJɨexK߂I9.*mb5d e q\)y}O:Rd #  WǕN5"XI5ut'zq>ޚz "!ck| 룞+w% Ѣ^L>lx+T۾@m)BnVM7l+qLdؕM%{E;ciY&[c\ԱV%bK񤥒}֑+GQ[ 6|6Mᨚ†/XRGoB._L  j,3CFJymr1tbjҬ$6)q7Ik=ۼ;1 PK =#PKE9@Fjavax/swing/plaf/metal/MetalFileChooserUI$FilterComboBoxRenderer.classQ]KA=WmKz|7"@zQ51Z"Џf p=y{y ѭ?yѵq*jD*nN8 K9zrрc[ߧPU$ XFB>Im gv7ЪCrpsȻbу%BnlnBe=^'^$AИٜPfYT*م̄y1' ˠh0oz%4w|eXV APKDoM<lPKE9@Cjavax/swing/plaf/metal/MetalFileChooserUI$SingleClickListener.classRN1}]VVp 5^Q !1,^PV]-oy0&?8x1r4yy}STX |Ο=7 7^ D!o>Q(ɗJPlB{b.B1j3TSMj;-v}We>`;Xdb ,Rt`!U3/Cq= E|Ç`(шKm-ΞFR\!ۏfH_cvC\)3WEO/1CQfN&`0CY Vr=j}B0MVyՈm$*bjv~ jpPK.''SPKE9@/javax/swing/plaf/metal/MetalFileChooserUI.classUkS@=jXA >[PȻڢ38qD̶]!&LW?QwXҚ2v{ϹwEdU( ɏSfNu!USr|"wbSY963D75Cs&y?/C@Un-0NaJ9p,SV4(JWB_wDhqOIԼ(M4qưp:Lx4%i}Ι備5H6}یj3OZ#W BPc,IL*Q(.Tn4^qS֢5a-d5)HS_Vh+$CX8Ze֤.O(9-}se*"Vz͍cQS*g=px^uD4Ӟ+IvhVŞ<ʾa:majQOv;m.`%?hꛖ6 +W*jq/Ul0luԂ C*sT^)Cr?Z =;OFJ (/rMv` i< !>%xLRjF"A y4K¾4!W|H-B\Vi1ʱ1PqUa#P L"Ӂ;myi=[ emv`0 D>l /L@y3ovfv@]8α8L7đ7FD;{AE`־w_V,Ec5B+DH}HX,uJ+P~|Hl&hJ˃P&l~Ppm gՄ*%.au,Hkj#1xmG52!aA8R M>v։'Ό׋'XKm7*H}*g2(r%x >Ii'$g'j2E"Mebh&xQp?T-~6>/$ O$e>yVp%?.V x%[skd{r\VJ?']Fgq djp_jwXnVmX6PK~PKE9@:javax/swing/plaf/metal/MetalIconFactory$FolderIcon16.classKo@qR]@[ 0-U/AH(RRCP9omL\8!q𡪎.Ty3s7}lpNR q̏0"aXGz_&)avi3,yHxNadL>«h?D #yLKevw,?7^GZ ebo>d}.~Ɠt2(є%xg`~ndhiN: +%NT.6Lyjavax/swing/plaf/metal/MetalIconFactory$PaletteCloseIcon.classn1L3MHii)w( 0 6 #35'q[ذBbPcpQȢB#ǟeoBxx {k3D#ee";ũّM](kU'Isa"̾؆zU2-Qb<+[qKpDTf"kBucst}@MB0F8U%",vX&{;9Qn:҃EfvH6^ lmtB[IG(cuv$OWpU\8oUዻMPKh]PKE9@=javax/swing/plaf/metal/MetalIconFactory$TreeControlIcon.classRn@=1ISJy?ZZhPCABUHK)]*RwwHrf"{ذBbQ;cR 6s;{o61<',Nꇣ$ܱgkcTV&3YrpDl:TD~DT̪020+y7ShCQE 5Lc԰lG*xgX'ҽ}3Vwl O2[JcD }/̀2R|f5 z8J(Ih Evyg xyql9yءͫ]}b[Zܰr4~H 2x~A Y+02T/|5:gEѳ/t c+,lhK\-dNҧ1ӨBO&2FY{_c p-pw#-SS\{?xVF1>Q PKjPKE9@<javax/swing/plaf/metal/MetalIconFactory$TreeFolderIcon.classP]K0=Yֺ~ `q_AűI?'?J̧assMn>>`JGoo(J.+F)s`'MU9>QgK%|sL6?}9#p#ݡ{.?nkLS^ V,<-k>;'0iA}B-u8|n F ˬ&@6 w%*l#EolEs@ja 8'V-6ZEYD1%#e\WytTO1*+ʽIuZ' pMOZZ\0*e&n_sAX^ S-T{۸vn낣e-l/5S>yEk,# 5ZxۈUs8XdoW`!Hc۴I޵+"6G(%nE`4Pl^.Mi)4n(\Y7Amۼ^S|':1±HWb#vSLzx]6UEHxϔ+h<"0o ]  q{:HAu߅GR6/hʁ vG@3g|[t$-\7v xg!Q=m q'` ;j( #3`k$q c0rND|%$ OZ?e?3s?g/y _3.El4|֘\ Ǖ󪅧E9^t3EF) `g3+e6Y h?;٣g"Ӫi΂cw-?o3{Zp} yH<8OP.|r Y.ʗ(( 0PK6vhw PKE9@8javax/swing/plaf/metal/MetalInternalFrameTitlePane.classM/QSeV}0ҰA,HP)i^\e%(qGdΜs322Hʷ#/kqŤwjl%P<]{t ÄW0 &>:⦩4BH@=ɗ vV/Ax] \Uq5$7}&/X,LM:)fғ;moJMGFLweƕFD\!b^)oBI-n׹gz {˰c+msoa-OpN8(Gs?GZ+Nm!mKnk,fyUb3R槜Gq#|4I5 SL &E,i|Cm+=Op$5GtJȄ&ISoR<5&F(VXZgPKm_AuPKE9@)javax/swing/plaf/metal/MetalLabelUI.classPJ@=7M6Fkk nEV) ݨO#y$~~%N n}{Ͻo/vгao߳Nl+@"8aLFaړ `B0ɥpP  B˓8EHϹ BKNx*L <$&৴Ϣdy:$5%4ݮ]puz 갔g(_",)[|ˮBK'XT~4`Iӛha$od1{6:ZŠPKzoPKE9@-javax/swing/plaf/metal/MetalLookAndFeel.classSFx&4҆7D o มCNM~;_%I"CQɒa=cn{{7amYg˿+?+j:j@8{<}Vd}ym'9U 8-|Ы!nbl±rI8T9cG¾|VQ[KȲ<e/doґZxZ^h/tk-rz?"}/Զ3YUxYÞnr!x=@{,e.jgo#𝺨;8Js q,O V*qZK7<;Ti[U3P ;Zj:^kIųC?OQi3ԕN i_@6(K7<%5eIEp}><_yRuiQAr"6u~֪!vMwp+MuiQu)[=4%O܍*"tQF1gi6r7<@Y|R͉TWl'B8b[zGbpVrX)dUIWa@#ܖpI jlzz%.'qD8{%&xҹFg;ynlA rx̂ؿ'!xD{O?]?@}X:~sXA̯]Ϣiw !9,G_@2Ydl/#~LW_"_!k_%_#CTuB6r+" 𛈷#o-?"ۈ"M 1rO?G3N_"!Ŀ$E]W_#~ _}Ŀ!ì|-˹wFe|j|jU؏.PK1R5PKE9@+javax/swing/plaf/metal/MetalMenuBarUI.classPJ@=IUӅ[b+b+AIݨO#ɤQ,] .?JC>Ys_rGdžugbk U yzybm4 (u(̏jބ%WA ھT⬈^  ~hSh2cpSs-tT$&J|n,36Z'Ec]6 㡟AMhS33Oe!ʢ%2q+hWJloUӧPKH*PKE9@6javax/swing/plaf/metal/MetalPopupMenuSeparatorUI.classPMK@M[Uۃ')=*^ P}W]IaTT{1_^tt`:wb&齊n8n( uC# #m.O؄ݿT ˄ҡTrD(c=W*5Q"=ɳ4Hs!&$lzXܪ)7nPZ N:u$5]02BuSc^ 3$Ȟ?>ÕLŽgq7Xa}.02W\?[C\PZX3:PKIMPKE9@/javax/swing/plaf/metal/MetalProgressBarUI.classPN@SSy  ~(#iʹ+~e3Ҥܙ眛'@፸E 2nUNO2ϫSԌhC=nuU θ9H&7.KAiB@&ibZI6\Ǘʛ$Lɨ)Mñ]G0*>@iK/Ϥ:~Ƶn^m Ln|}MѝH=8i+)PU=O#ǓHxFXp5pq1 d0'daGŐyZZn8T]%IQLC,/VXY0KPKs}oPKE9@/javax/swing/plaf/metal/MetalRadioButtonUI.class]OA߁Q)@k41TI z ve ?^2=lZ3s}yg_~=j ~χv0ޝwy ]܌#qna͒y ،rBGεrϰ2l>vi0d x!pSғ!Y2XMY$CY|Kz"쵅mNb([K.ֻ{k;ZFjYSnԧK݌XgXWҝ'FkiI{: K/^填ݿsGmW7'RSiL[ghlU搢t磘"= )2sۏ=$X17`û1`?_12>D(S-ruiQmrm&r}(_<^f Y a#PKyb(PKE9@,javax/swing/plaf/metal/MetalRootPaneUI.classPJ@=IU[7Ҋ8J (QG8H)IZ,] .?J,ιs9w^^lwa1܈J(<c}oUw ~28*UC2}!=lTPfg"%b#EL^Z  ((=l} t2ҩL~羏fŞla ީgSƦ?cȰ :Yل.eWx(S;!l71v%^R_@LZf7PKP9;PKE9@-javax/swing/plaf/metal/MetalScrollBarUI.classR]OA=l? R/İ'T!K nG:f΂?KL|w@ćgs{w~s<.cx/Az"``( W{(J5xa2r2 6#3̶67ם7[{;Tl[}8CTSǩr2&g^2m%BDˆaD浾SȌ1ڕk2w>R1id^S+0̜OL*d=ɣKKabe7u_T0U-鶌E"=%JuU'y7I+ZY~vP#{rAÑEl6.1<;t.1O1,ˀ,DK>Y:<-huPDG ѻ*rƌ%`7;ȃHq־/R,"(VO i.19GC,=u٣?PK/6}vPKE9@.javax/swing/plaf/metal/MetalScrollButton.classP=OA}'"GgA$VLXaqgQ6V&qX@[̼yff?>TpBy3NtBsϽ1WզZ~ qvOd߭{T0 K}Ii6C i$`3\;͖s\ TͶ/nP \+sÕ4"#9a(zpzf\2f"WL!3:b>ȁ1XNى %D[s@3 TECm+N^85K3SmA`M:)Џ%y87e>?c"?!}2o\j6Mi[V vw6uiT&=セzE@, aH Q:fk3yK#&ZTru@r@>+vLɨ|JesDuL0I`_/ybFQ itk]*:l*q_ErOٽ-p+~^!Gdppk\ݝ;_Erk+.q M{ MvFs+;TrWN##1Bo IQ܀)?*z r0sPL@֗27Y0!3O<f1?%UEL+,(,(z[PK)ePKE9@-javax/swing/plaf/metal/MetalSeparatorUI.classPJ@=IU[+[# TQGb2~~%މAj,ιs9s?>b~S2sa/y!#0s$Sjf7C pځL$ a,փ,+ih{Y004"%a|%yT,i[)W -`FDETF[<"8KÖ;hm),XAVb=)3J X#ÖY PKV(PKE9@@javax/swing/plaf/metal/MetalSliderUI$MetalPropertyListener.classRMK1}i׮mW[kE(b[pEŃPl%gy?%.*9,73ɼI>?`F?'7|jN}~ND}"ƞ/BtItѳ'H(mX&~rv\9WC_h\4a}aKS11R脡Ҹe:PPt0\Y,8h14ȔCXeif| &Cͤ`4,-V.s=X4yyW78/fP"QPEI"PIΗFB^+XulPKwUPKE9@*javax/swing/plaf/metal/MetalSliderUI.classT[OA=VZJ[KAZ[b@fuBM|!C;tG];|b?ef%%6Mf??Gi$JdEo[{߶vZuODarGiaW6k0Ͳyb#ds58".;qi{)^kO2W MFv~j9JSM: ¬4D0Gv!۱ʀL`&)gɯg39ۃ>>s= X\=3hF  PKBM BPKE9@-javax/swing/plaf/metal/MetalSplitPaneUI.classPMK@MӤժՓ[< %P}W]Il?KO?J|R=̼y̾ϷwhT=/ɸxyH*3Ӷ ^80P K͘#yRP!<:=,,^h(NVlf(Z+%^XVy'bO1M`FآO1֛y e(yCza. ؄VXB=/ :EE4kPKCZ>PKE9@.javax/swing/plaf/metal/MetalTabbedPaneUI.classTn@MMSzI[J7 P!HWRԷMM 77-|uX9g:Eko %lhd/832Aqs FpL0 i0a09¾udNeF`nIf5zfPfNGÚ#M!Fŕ30~ έhY!Ѳ6@ B b -MZFGhnc =4֣ {^y/%-\YROZK:DdF_;4--d <|ۻ+,S0 X k l PKEPKE9@-javax/swing/plaf/metal/MetalTextFieldUI.classQMO@}[ʧzxA"}[VXSڦ-JO&(lK ̼7_ưG|lOm\+lqؔ_/*6y -\T1CT:2!o w=ύ>wz4N0wv&{1&*bݹCM6PcZ VJAM!Ja* a0]&E yBs}e38[#b%NNZ*DY9|PKjTYPKE9@'javax/swing/plaf/metal/MetalTheme.classYSAg19$x@HPGfHV6;_U>Q=,i˦??1lk Yl?_Jgk]_ꈐha]Pn%۽O-6xNb',Ȧe'$XvěngO H(Y+3a ,6BV-f酾#a T]7 V⎸d|m W<~Mˮ״Bqqt^۪t:ءhNˆkE&kDrMe@bL$-v|%X3ȆF;H%Qi`[VԎVEpChjZ΁ܯR4l{#1XԌa B1c`|-4iz{N0mIF@w`'uϤ鵠Kgtu9%SJ\QЙ23`5f1܀N_]kŦ1 C ”쟚zw/i?evVǶ+x_|_pBW)?L86 3h=jܲ%xOMXf u JZ/ClÑrs‰D;NFTlԠzƢ|:qGqH>O>I 2OМS299y93JeD 2UhY9sJ^#(9O Pr@^GJ 7Q&,d@.f [6'^!C m@.2\F2, \A:au#BGh- cT)!S4ªFV@>Cs?rg Bh%Ju ݱ !B]%U$(YWPK5=PKE9@0javax/swing/plaf/metal/MetalToggleButtonUI.classN"1ƿ(?ށ1;d6&1z_ݔ騏^m>et zӞ~Ӟ}~yYv;ﹷwݾ0\vl^O8™oPzG x0 tд\~o8Sgul(^ՙoҗ!]]38 91 r A˞PljkHN!^ҽ@p#l'_#ECo/|S|ی8w>bDоwc߻ڞHց]\qH(O #фA8CP,ӌvB.Ua〰㤚[SQMٳ7$=JA(ZC,,XL$99%O'# ȕ㏅;оt]6[X* lna(C+TvIL'&ԓ9z:˞~bB J9Pf⼈%TXkXX,:VMX/PK#r2PPKE9@@javax/swing/plaf/metal/MetalToolBarUI$MetalDockingListener.classRKAV//JSA`T ]h^[mwqwZVBG }3_#psg>싀湲]׵ܻjCĵ ֑~ '=Kl*CeH/3lwbFtdp؉kވ4f L!AtEGz#q1=[0;kI参C=^7;hCKa\R,k)vHeseX#N'Z9bTGؤ$釲\NF&&AY7*7d*UdS#[0< (R,_"( %uVPK'5b$PKE9@Ajavax/swing/plaf/metal/MetalToolBarUI$MetalRolloverListener.classRMK1k׶][G"T\RЂPXE֨tS۪?˃(1YQP7üŪA㎎ z XDwb#hRuٮBy)? yk8SrT%D<lyhhxtDPۜ%ZeAw0Li81d?)<`A FPe.U_p2ɓս.H17ߤm#M]4 Yhc`}nܿaNrLPN5=Zu͜MKyZY!՟_<4ƌ.*p5:q})y^Q XX PKVPKE9@+javax/swing/plaf/metal/MetalToolBarUI.classToA\RU xHCiLjP}_ ==nޕO&>G @_fvgfٽoP5 ?j׶hYzc}?0Jwlk?RBV^p@zR!%{ :ù˚!(FRxuUW[Lxmys<'xEHV'NeI,g4aޝwR+ k e Dh'Fp\ྛ"SZJu>)K }p/*c~SWs:-ht= # ,28Т!W;RN؄ չk'pn|Oj~*oH؛J6f5Fqa5ho{#6"Egxe"f{w{ ~"#d[Xa Ոf W!r3bKcs&8,V6 ϣ8@2#` We~E|D)12+0PK"*PKE9@+javax/swing/plaf/metal/MetalToolTipUI.classN@IL!J @˅CERDB.IsqٵMCО*C!vH *3{.@xU7?ʏBu٩?Kcڰ/U(RB=RN>bwl:."!.I2%UB6f+(bTmm|4sU mb֓箵\~L f8}uڲ6naUaapȱr6"FJ+NO`&[ұ8c[]VJJR0OeK&so3XʚkXNL. ^J^*jxo ,z:6K֧N2 Y>Cn TC )$">rqMāBZU–g3޼Y_lc.qq qODoh!>tfx!Df" c>vbuqqʩhW$4hh:fؐHu9RjKW#z)s.3ZiP<틜kn*u<ߑI>$Hʌ~Z_DvC޲ݸ E=V-&lO @l%Wpo .`->t #,G>ryM\u/#mT'J:N7Jۃ)xGVZ)hE.LQD\-'<'%r ":q@CPKRvPKE9@'javax/swing/plaf/metal/OceanTheme.classNNP 4~ ~$&-}toNG#?̃)egp5[I) "٥,s'AMlesB|8'DcsbBJ&]f .͹veׄ߀BwfcoH[C(&L/*ḏ-@vUPKN"EPKIG@javax/swing/plaf/multi/PKPKE9@*javax/swing/plaf/multi/MultiButtonUI.classQM/A~fTJul"ҊqT4rA/N5jdwΖIQmj.<>3`,{1|o?(6FW'Y SȯcT 嶅(wgtdPCod)EV<.EחVF{H~:d4'PKd@kPKE9@0javax/swing/plaf/multi/MultiColorChooserUI.classQN1. pBd񲉉\ $aZ>2.A DJm IBޑAM!s"V0yR,C"y \n(DF~6t]l;-FXZ9꙯C(n5'*X}_tɞ$(7:1ؤ4c;f!{(?xfv!a9sWGQLŅ|Rљ? _HGx" 2}T@{ҁTzȘNw@(TQ:W|G2>Pp be.XLMNr=s "HFi7iUS?$ g~{JcdI,2Nv۳cCBsI7zM*QVt6^0!=J7so>[bv*_Pu |Vs6Qc-\sї9n[hp|s{$6 [ MγWoj;hEi<.v~i;Vbm9 -fn[PKPKE9@/javax/swing/plaf/multi/MultiDesktopIconUI.classQN1=((L1jqeq12V S2tҕ ?21"1si4A>80x"=M_4\9 !!Ceq<6*mRG*T056!<0Z*q#+ Ѿ"R]soWvgH # Խyñ;>C/cWUk"ܥ#_*{=GbcIJPM/F1K('_{Abj<,ab~ Xڔ;%;sAc %/bn0';MmWPK#jDPKE9@/javax/swing/plaf/multi/MultiDesktopPaneUI.classQM/A~fTJ=Iz"F$HЋt;v,N?lQygf>>좚݋xGvy?FSq.|ÐՀܲ8 }*s@fpF\YJ-ʳבѥh_m)ۏ+6[vNs~$I''MPMK~&*PD; տ]IPW{׳ :|y֦}o[>jH#CUjz1y8eF9 3ɰy (QcKc֘_̕Le,'*4\`v2n PKO#DPKE9@/javax/swing/plaf/multi/MultiFileChooserUI.classKo@g4iӐB4}RBQ H BI4ͅk"iVpBC!fVɣ+]7??3x :vp=z{y*DQ+)ͩC=\%d!\QLEH5g9XAg1c#\:ؘR:NڕSW2G1]ژ}SgjԧNCI raA(N <䝉#5\dC_L਄qBԾ벁!yb5{0bކJ n"r*I~sO:\{Y"Vu9;CJ^Z4۵^$ \oRK3_6fAPijsϨc0i:-ҙEziGw:X5mEAk. <,Mb M(o(-()HHSdʒn5G)@42TH v2ʆV4+!z"ظc5 wƖ춬%b ܅{_ҖmAoPK@PKE9@1javax/swing/plaf/multi/MultiInternalFrameUI.classQN1=(ㆄnT6Xdtҕ ?2h9瞶oQNbr29;~i\ P⦕Ͱ3GA1$"9d( ҉pu SH}Fj`7;CKya(e .#+5zȄ.:\IO~0+pO3\OSF@^>UWG =AP2XnH)Ŷs~hP@)TӫQRPfȽPa!O1KX,V6!O{an`Z(b=P"st[_PKd͊DPKE9@)javax/swing/plaf/multi/MultiLabelUI.classQN@=SSATĘ!qeqCbnn\McJK,](h H nk91_bycGO*a :“Y6Cc2d5b9J_Gq!wBOj v/%dRFBy <_ /F&EX<-u1-u-ZَZs^4F u(8Q">4Xվ]&Wؗ,Tx0]~#EJdq|v W ,&:VɖBuTSr'%[ssiu/cn1=UM PKJ?gPKE9@(javax/swing/plaf/multi/MultiListUI.classRMo1}NҤ )I?ٔ %BOHA iMs&&mG'$~bPI ޛ!a7; 'oZzoMȱ> 1TpȐac^eD_Ő!C_1j V ,2;2ѩ4FFy4{wӟM|t qrV3PZJGOj7 0,n xp@C-߷<~4A`mzH#.'>͏Le8]e 45齒mʁtoDnMrZV+87<_e} uЗOH)/Aqvօ(~$XXF%Ta_S̍ fXK,ӹe%f17枭VcөUQh-ʲtzw:^sducrf涭ij9*V(>d:E4n/+S>0Jne 6ϓsf*$BV;ݞ!W閣3ŻݿPKAPKE9@+javax/swing/plaf/multi/MultiMenuBarUI.classQN1=(  #c+ IL4Fe㪌kAJ,](-"9瞶_QIa~CO*/yFmƧBߜ2lA X -Q>HD:V2'; n39$GBK2R_/L #db/Ǵ7i)j3fPQTܡ ~=IPVo客X{L+f=[.H"EUjz)Y8eF9+SacVP*& a/?(,i1d47PKv6AoPKE9@,javax/swing/plaf/multi/MultiMenuItemUI.classQN1=׈J⊍CqeqCb7*WeX32tҕ ?2Dbps_=*YX {b,Q>cO+5+f]R1:c<ޓ&CDJV1حV:Ha,r Ŏ Eet%42+铡͊Ziq΍;B2D萡]p Jު292#W)sCFVKidJQMoE1O(_Pa@13J0` Eyc#!7Ş[J؜X(|s{9hj/PK<&AsPKE9@.javax/swing/plaf/multi/MultiOptionPaneUI.classRN1=E|"ǘhL0nHL4HTc՚%3\ąGocs{{{ι}{y  ~N+KzF:{64+qAa aH2`, p+ M"L\gHU"2gI%ƹ'vW羴2׶bupjݨFS+ ̕ ~1+SvA /n%nT)m,Ĥ] ׅR/| <Zy#ؖv.[.@/Gf>)룜^Z.>#DI98!F1iMXN91 Әi<#!ZK{(ttB} ?Sߘ13ע:պ/\ڶYla6}PK>PKE9@)javax/swing/plaf/multi/MultiPanelUI.classQMKA~f]]54+F4)0AEPy4nM쇬ϪSСЏ%4 _<1_Pw`1l=x'L_22T]V>JOGq!wB luNt'`yBy=_/L +behbǴ5Rhif;lp:Q0Bvk^qbDO%@%AiFuHx%'OY2=a 5F92ӕ(X(͍5,-MXA|ݔl_)*#Ԩ1ÜdT57PKZh?gPKE9@-javax/swing/plaf/multi/MultiPopupMenuUI.classQN1=(,ܰƕ U+ 0E?KW&.?x jps_=*i8 b(Q=+޶B&l\2lO!F -&V>H/Q!uV0M}+sH`)42 wet%2~GD?]IK6;k~č_G*PD =IP2Wo.|TA|qoO>KeB0$"5d(,GF#=CHV0VRid -˨ߕJt}ieBO'C?]挧0;Λa20_cw$>C/aOUkErviO*{=FZSIJPME1K('w^{Ab*L1?`YbmBޝ<,O1[(|sc9hj/PKT~BwPKE9@.javax/swing/plaf/multi/MultiScrollPaneUI.classQN@=SSED6.bDej#:dhҕ ?2bDbps_=soPaD< |F:T<]/E Opv?! HʝƣPiޓ~hl!skܶRD9RG"}-c Vlf翾iuηRCox6Ñ dw">C/:q J^f\k"_U]Q-ڎ42TSfW^pPIR,NXCrؘwgd=bn`:(c3P2fu9I%PK ^C{PKE9@-javax/swing/plaf/multi/MultiSeparatorUI.classQN1.  'k<`h SY+,tғ2~b5x:3ߴ|{paA>80_ؖaxՐв(:V2': n3Y$4CByR_n L䋠#t{kڜFZG9y3PX }PKnؓ%sjf\ڗ^z߲Q-G)TkQP)3ɽWd_pX< ֱ1%קd=/0K3Ll-i5ǜd4PK$AwPKE9@*javax/swing/plaf/multi/MultiSliderUI.classQN1=($1ƕ ݠl\b0CJ,](F$7s=m?^ðs/⑏TC_A/ll'Y.!Ce!<2P7R*P0Zm=CKya(T /AW+ =wV]sgWf<-Qut 0iվcw,C/^_UErviO3-;f$*A5,u2 LJ $ՀB C((EikoE7q~? 1qpޝݙf_9<,A:fpssС醎Zciy*]e;Y- 4oZJ`=)tϘ8gS4E\˼UcUK0*u}Wp۾;=V ԩY*-"@_ݣܓnc 8J؊ xĭ- yF`#3Ö́ROr-DMvrL/sHW ;`/YU <{ ,oiB%HyM}!0T{&#}Q(6"kx2q'< hPƵ/7:(n߄[1I 6:4Moe%Sniླྀ(*!چ"iP/)6J}jPK9)}PKE9@.javax/swing/plaf/multi/MultiTabbedPaneUI.classSMo1}ޤIB[JIS(DRBD* Th.]m-?8Qڂ6KZ.3cϼfpQOL ?{>McKgߊP_ -zeϗ0Ru°we<*9&0*3i Ů VE +}t: qј"Qn6ho^%Rج' -KT$ y Չ$¤zL=hj\Y~H'$$İ910b KZakTKTԣֻ\bo1Xi:7K&9CIWjxHzJ(7@vV<#W "TCdX!U/3[p3ka=yh+e 6P'Kׇہ1 g62`Yf9K}3C}Y\tdoPKj9PKE9@/javax/swing/plaf/multi/MultiTableHeaderUI.classQN1=((L1jqeqCbԠ2TfH頟+~e}sOۏϷwe0xb,Q}> āQk =oβp3TF بwo"dPc4ۊz"PjP^ƃԉ|tV]soWv|-acyފ(iz߇;zݱ/ J v\*/OVuz11Z42TSfۯ(PH1 +XX+JdIU)k(/`N{ܜaZb#Fḙ9'ɶPKzp=gPKE9@(javax/swing/plaf/multi/MultiTextUI.classTmOA - "B;"p( C KcB4YڥޒkGA?2w?3<;3?}<OF/u[eܤgzj\ߗy+vpP4D aY20'F̚gxZbILڠ.U't m  @w|]Ʊz<;kKO zᾒЇ랧_\5WަRZC5iVi+[h톷VZC0 A QC=QiۭXfbQ4T P}@Kjb2 ʃlҺR!vX)PyZ)PR>B(B.C7*q,_VYZYxwU;\rI`3j4AâVW`Rƨ,2D*Vy 2PKy#& PKE9@+javax/swing/plaf/multi/MultiToolBarUI.classQN1=(  #W&hЍU+LI頟+~eBDbps_=!*i8 ۏ|ȟz^?^Fz6 N9OeؚN0[F^GFCXFҜV0Mu'rH`)42 Uvnn yZ~2t̓]cڛFXwGES}4rÑ;ݯ'J֪"ܵ/ΤRi z)!Z$RT%Σ('wߐ{Abj4,cb~ Xڄ7!;sA217f㝌PKZ #BoPKE9@+javax/swing/plaf/multi/MultiToolTipUI.classQN1. Jq01x2x!1ѠVYd颏'>e |G1|(~ic[렭7\!!Ce1<6*5R'*T0Zm;E+9xH3[*Wq+h_)Oy+ZrL{~$quuehEX萡ݯ' J*2쵎#_){ERCIJPM/E1C('oȾR G15J17` yccJޟ頀B˘[sNFSmPKB`BoPKE9@(javax/swing/plaf/multi/MultiTreeUI.classT[oA>Ph\{*TR 6hLmyЧ)tͲKvAL|gfea̞s}PB` _U-cjkp]}+ K- a8I 5vnu]!y:1b@j5Y B_(,X&{m_1^LX jԩwׂI j6q9HFD`EʹvbfTv2+IEԒI bjXs{ʯO-[u$Pit%[1f Rxm1J@ af/ ]=XPe"Ŧ[=Ǿ-<\E|h.!"_Y!F1.5l^)h$t'`4?3p8w4í΀/ vW6l To@_*KSKpb?P`׈<` X@kpK~,l>Gxoe1p9__Tݪ{\%}6ehT3'oojwWrGU*'ՑΦL !U]I v5bqf/vL2Tk5847\oݢQ{Q#虮ը l[m;a8 ;eGDk=3jQ1]Lך1v5Z\4F̘k81j=i%\E 9CQe&\kr͇t#c{z8lXcsإwM;67fۉ n,/n,Q<F\W8uH͑'ضK۲$@psQ]n. ;b?Y ˌA ;7c1\^"n[8"fDwP9!E#ZJ5b`רOw  ܫ7`ܠ dHd׮äqm{qxKC]GXn#u85qTfP9MͩiJw7i4 =SQi,ed0e 1LB LyBQ|!nf*J0jd/T(t [& T$1 %& 3MJ1M`*f*i.B=L3d*c)4T&i~Bw3i}Lg/  =T.(SLBO0-ziLKeZ*S L˄^dZ.2"B1ziЛLkbZ+:w ϴAjj1m:ϴXTl`W[MuPVO{)۪ٛ3F]y51H⺯)ЧLi33ۓ]/pxm VXr/.єt_b7C jԟz|֣J$+g)P)/V>IdSOU^|g(/U>SyYg+|y+_|r+/RXKW)_|W*_|5*_| ʫ(ߨ|SMyՉߟy A@PB[ۡmPuB;. Bhtt:=CAG'31y8tz: ކNCAgta -EBV1jjP:PQ3Rr&U±ΥFԣ@,Gbt b+a a;fvH|?C Cx >Eb!q$weѬ733/W8Sh.nu6+KuQT.rEU*4 ]q0}gӊ"Ɉ@B7?q2 #14ۚ훔uNP\P HĄ 4gyFo})[VαKfm=v>s}|,nPKtJvPKE9@)javax/swing/plaf/synth/SynthContext.classPNP=T Ę1V h"Fw&bIi \_BW&.?8m *v1sΜ3\JC܋G`9ufQ7fEǒ(4дN YS=˱>2_sTr#U,?uuB۞zE=ٲxvN+D $ Ѽ~-["BilAXjjx $H_4f!n|껏>hbb?e<3;]hȢMdssf'b=m_;T+ȩ傶V +LXn4t~٣E3D-![.ei ~h'е ZPs[(v4B`b3fKrբiD,k I5rɰ衕Nv`+A1^^#\C9M`>Qhf DݱmW x~OݩkM÷ٛ@K";2o[,[̫Q8O ֆvȊr^3W)t&qz$Cc_8H7.˚^2D5ǬH CSuvlPRűsv¦IwiҬ.hG |RNpsн@S^jͨ?7W~>PRd3d9b,dZҽvm5ˁ@tjt[7|N`Ё?E( Jw~EE0~b/\耲%V"ƴ}ny*# ׄ]̮-}Q0 䨍mtcO !\F/먵 jS¿7lcK6A$RqtL0^6v9> Ґ_m빻svkLT8(N5S6)p1wKc7ॱ{' v}-a7鰛 LfwEE?~LÌd76Xq*};XtV(.tIΡw:P5'>7] cx1G\ވBqڔ.ksZPKk: PKE9@-javax/swing/plaf/synth/SynthLookAndFeel.classT[S@>JTJP 3XdNZ_tmiI6@M(M 6t{6{??&!F` WsUgiZ4ͯF1= 0shZ-4C3YaTtA7fc~\gMgķ5!\e@j3Y@`'͛u4s!Me, jo@C樶fq4d!z9{P)xCӝ4X_YWclǐnB:*7L5 k1 LGSr-˴9 ݤf*r1z)y:NN d+9IxF]qTcJZՠܵ&&0OL]p cG?q|ZDIX6=F9ZD-{.85+eWSNCe5̌a[5^1?Azɕkq֬HP=-#MT-4 N)5_ J+zq^\0<3@e %ކiA`PSG@"c!uD 2QO#nPi9}Ǥ<l{omSEclqX}3]\/\-Ռ> BF 4٦Cq'*E5t)\)B>nqЕ"k~+)v!Smy=i3Uil1c遛Fm56y]ƪyޘͦYs46]cݦm*NV 9; VfIcTZ45[]mznءIGib1G1G/RK]48AI1iL ۃˎSc +N?]1*΋)5A#7Ǣkd%L4rk GC[id8܆*ϓyVGҐˋ]9 1-G |1jyN<.I2RPì@ΰF>+6DiXhc,.ﶳuч /HI)k4YpZO>`XԹp3XnF;VJ,ej<_1?}kdE ѤZxZaizRiTDK E3CxjcC{^pR)V8QV ^=oT!WąX:a'i!{9wR#+Rrژf,A񈌦5:"o\_\o&3)ݸ]byK#%*TӲ⵩OaV(M6R ,Zfb$Y8>b+#ZXG/*x0 9-[::OeD1FtN)If~ދʚ$PEj64|ڣ8*JtWFVĮI B5HVY^(o!JI97_* 4]Zmsɭ蒘k,WcHի+-"eTK+*h;nrq%dv/;9{GefoW51 y?EK|3_qu?Ec ->t/Uc_0 ~O;1LZs<_SV-g&CVhM[ DCȡ ٢zKL@$zŢ5C\` 䞗br2 m$.Ѕ& ]D]ɡ+1t 9t.%e5CȡCWCc*r ]M݈kȡ0t-9t36C3CדCbr6 Hݎȡ;0t39t'fȡ0t 9t7n%mнCwC[0t'9t?"ЃzCCc>rh+C0t?9CC`ArQ =Dcڪ Kئ𿄝s;NB]T!8.yyO`1rh7vCObh9' VwIw3i{1G!(gx{S,%|{>s?O# pu/(\ ErK =_ pɯ|U5rϗ =_x]!*(_+#_ks^سA:|Cg{.{ArhCMrhCoC RRo`B|mA|M -Cob-r:P CK p 0\&<=(lcR<w4xUz :u]{ȡ.'19tCCG19t CCocr }Jȡ099> >З J!CBϏaz~='{#' =?Ş!{Vgw䞟c9%H}?C_c7 9-J}CPKBQjMPKE9@'javax/swing/plaf/synth/SynthStyle.classNAl*ڂP*cMMcD/:%nݝ}'/ 2]J-&3g/V czB4T7A5eVm @RiEcVOtSO D=jq(DE7ٛfX5jQ[ߞQu!R RTG 3t.Z&ggPk.zM(VC1]M>8{nY&eU4yH-Ze0F spdUN9n` M%LL`;" qy^ڴQk{xB CW/,ʇ^Vieui};Ƅn: vHؙl6;; G՝h=IUiXI_y[P5 ʁ%q)1Ұ'؏8P mTo5l]cO$gT!|S2rٝ"( r^I+8i {UEhӒQ naV3p;Pe*YPT&> u{/uFRSY%Ě2 +p'6*iw^. Y9b@PJmB >/r4ƒ /ledd<PKR:4 PKE9@.javax/swing/plaf/synth/SynthStyleFactory.classPN0}nӤBHli,T"J*q|G!΁!+t~PRvSmJ95Ucsl^ ^fK[TiexMͭ = DiyYeY)FE9rWѳ U3L3 iM|jVkod RM˙rZ?v9v3# pC7*\-;ؖK UpLAiiL7OG9݄4iRӇd7gs6 PB`yV/i,wfrVzۨ1-QC(ޝ]*A/QiUcfTS #0gn1HhəΌ +n8a:w+-K")>!  UgG3d4#Fjo嗪I`ҍ| Zpl& o? sf{̎^ohͺ Xs} ٲP3cSUR4urV#Г)E"l%Mm!/BV/I6EYrDi7n1bc.&3(w̨YMcqz5٣rU-i WH1WBTvDLÃtJ@]1z125yGw'K>IPN TGS̺z;bk*H`` KqS5o qFFӨת }=] a/Ǖړ ?p{q x+$mG[cR:CQR`ܦx@)om)p(h0es'FZRY49)"*DXGM2@1'q.dk!Kd]-MuM^<  0qheVa}|!䓗\o<\\GMW  -|j3f \JBDoHnzM-㑮%xAsO5yQ\FfΘ,G>{b? 2ۆ!2[ډ8-،9kn"8ᵦ:ʚ9;Jl BLani}:;Gc̦(x8YTCK "RJ%k/ sumZtG\" 1*9?%iQšH ̖$q ,vWUY."-oUٛx@^]26W̵M6?BJݕs z7W,RU0TkXհjkpf;zyuj_괘tiU ~5{ Aѫ8G3j),zi"yd %޼J]߉ p͏q]G;=i, 0wU؂W:WֈAvC:_V;kk$0%wdZ䄽ݢ M4O;oѰbxvtYM#sNl鐹+̷E1X7[V>M f9adaF8 >^|c|/030 m&d ԟu8ͻ0pĿ0h^c~-@I(LXoaŃXRȐ?"7B3FVyL%_-q{TbibFqCv߇g.1211peENeC!Ƽ {`!1]FX <rJ{gn?V>SBK{ k!:ˉ^Kn$F~CYM|ՃZ91 /!߳Ů7uWx-w o?FB7#p(~ 6/%sK@GIq7½?/"{+("cXܖrPK|ePKE9@)javax/swing/table/DefaultTableModel.class[S@φrHPW@kՙTQ/27- 6W~l&& n~"X,1D^dKnx tȱ,0 ,%I1e*qVQ"1rcB eHWBOUsՇWęׅ#h兮95MK>+ %@xWH/3Gs#D#0ssgZvp6c@{x"KbsN]M`G`#`NݦmģQ2)2{XsB0vxY(Dvzz-bN6+#Ad ` nm\83M=\c?q>| ` ͜gB#q.r tfClyS+ Kl-18K2rf|09Wdgõ^tE i!lrr]bH( Crߪ.3\pK[o\eHVoJ;Ys A3?O:Lxk Ͱl`X9w@#_$`zjњoݐIaV0εam:T$N si*mK,gFu{h-\|\ 8A絀s-A09riݔd,uʎoy*PXM߰Qz+ LHbǑϋ!Z}}2)l:xBK > sL NV9*-ǎgCWvt9ey$7On{m[l’,I˓h5Ng}ђբ.?qNyd |9LK+މA!^WT׻pZU\aL5wQT9hn2O$I6T1\/\3ŷ wQeoY+Bw&߱@$TMuɖ ^&ڥ΅xnf^SZ+C1|X8_$}'quI:RtG\iw!Q#pt 0^I! &kXnӕ?NB#1b5FJ$ g1aLcF˸є1"HWYQ f :|(gC1s7EƼt.!u+X:o+uQ:PsJ:6λJHMMcm\M)?'Zj3Jgm8g-<:JgO?tnW:wp.(Op.*{l*bA+Kج9>4_J"vZXiؓuզ/$/uMJt~b)"8:zSw>-R# M!JI8PK_9nPKE9@;javax/swing/table/JTableHeader$AccessibleJTableHeader.classR[KQF77uKfeE>BF ERHEzz6v.?z%j/~||Ʋ~kޛ5Agּى0;)Zp]ɆYFS wg+pʏn["F}w@X[qEvGAH@,( &$ZR~-&!۲-{e:׿3ːYv߱ıeM$8UJ81GM 4%6|<片?‹UWii6WiH Kz~/m3+ I~잛34Lzj14]s~+W; ],BTM5m5a\m VtX۵X/C5ObHL _U]7/Ym1[{f~ȔB ?K7;oSۚ`Toj]tDtB Y7 x/Xu`nٺ٢ 4~&$y`91b-\P_J{sX.. F)7 sCS(62hF 5:<YA~ @?^pcu{tr4s$λw$ϕŰvkӝjpP֊x2?h0ۂ#6{ #7O*mM 4>r۸B`X+ pŰѳ1:Ɉ9u#4<0ӽ6o Nq7۰ùN_w\c`յ?89qȰns*"k7ߖl~1zȃw+fsH=WGڒ&t,oK,%B-euⴔVfQU(vd5̞b{Oi&xXNmixA`k:ؙ 'LW? W!#iȊ:㭳9ȋu^9 ?Gxwe\ ?G0Vf\nŋ(\O-a<2x-Dt@ <^&C#3Xu(xFI 6oH&Ո ;xMb3^[$!g>BUʺDI1Kňy Un~A +G:P_{u$^͊hp_!u T ^5o[XwJTYOI2>?> s4r`O#=C@#nv&FŬIJ ̼tĤT霚㚒Y_ RT䟔\ A:=܂ԼF{ d^`>VXGyzjBDKX32p%e22٤t#3=; $PKu%ߩPKE9@)javax/swing/table/TableCellRenderer.class;o>#Nv&FIJ ̼tĤT霚ZZ RT柔\ Z9? ?/5(lXAQQ} ֌ \Eɩn9 b4120203#С l ;dbPKt?PKE9@#javax/swing/table/TableColumn.classVmSF3\0(^&-Ƽ BBlp1 iKuRF oSg? ?ӽ!8Mϳ{Y|`~;3N"RM46-/PY.d4+TN( iJz4MI2N5&/w/.Q&oy~8kuDWN-['o N̮N:8抆eDD(\R +Ft?M:P*mc-Mx m^v]`]Kzx ůqd~pדdJk[Юr=Yp8wO: XcŊwПošocYi`]l8`ao7`?C>/(ncK:+PKD] PKE9@"javax/swing/table/TableModel.classmN@ϢQ3Z/l-MHP1\x )Yڤ݂CgW"E'szη/]\˥U|-'7~RE ԍWL4M0L5ExpGKoyct?V"+ w 7gY'PH,!]ogxzʿ, hF:99^fkZgRetMdv` >)vmy|$thANEnX&nQ%Sz A)Q"NX/}Vjkmqf9.lmM8SYBPKM^A9'PKE9@&javax/swing/table/TableRowSorter.classN@8!@J B@qI"K H\n\r6\!qPٍ1_̎g~>;އǻ{[XN"|mؼtFQ+G:/k~dFح!DU*;lB~LHd M`)Bx.'LUSa1Ν&a! Y{swZRVٿ[G9 OVT7EIXz>jC X{mٙFa=nw M aW`b-&dj~+8{lw5pRno]v{0+})%Gpcvx%]ݸ ' d8L1qxSqs SVv`AY;d>F4й:躏?emE?ir[wY2 X2E0ZޏB|3¢_BKOPKPPKE9@,javax/swing/table/TableStringConverter.classPN1}.('^ xBbBý6PlRd]/Û?ܢF^ʭ|W]̅iijǩ̌LU)! y%+ҥ!B{BۛyQ18jNt&UlٖIL&dzM&s3 4Hݟe&ǽyUL=hoo*Oj|#Gظ@|Ò1cp<_)ڜ"KPKe>PKIG@javax/swing/text/PKPKE9@7javax/swing/text/AbstractDocument$AbstractElement.classU[WFvqp`(WsI lC4JJ IBcGD9DuCOC@TOge yu,kwf6[\9?inm帶v妻zq`p"Pa5CM# n՚5CYk"ǶnMja|& O&Y ;[׈Y 2ynL$[su$Ѧ~jjgS$8(4h]t KFL%}봾jE֑K}f_L ֑%$ MrT[:rñfˊB'bMc2ɨhPtYd@͙՝=͠bu#]#+<ȊF Fq>DWڻVOO\6'4LuCsdAstMLv,FqPCsdCzyh =G,=oyQt@~mKdL^=',6c!u5JΉR쑏!{+`K4jPtLT Ja=@{L))lhʨlƜ0Pi[Lv3Ojq*}e'R)VJ R*V{b,J!4C|d~+]?C0- u;T|ˉuٞ`pi=|\Fֱ#<פOLպqˊ VI`2axU^PϢPT5ꈞ/Cq bs D |&N >%k|aPK ] PKE9@8javax/swing/text/AbstractDocument$AttributeContext.classJ@j^օn BAFP$j.|J (%*f?s7sr+.3> 7zjXGGBQHqLdUfs}n\' {呠a:3 ej r6:4 G 2`8:]疡ER.oS5S|)I**mܵv_Y֒AƐQG2(2,6)]>ōԔeĮP}tkA0 p !!цtqS{Bó}ߑ2k$gzTgԔ+1'0`I a\ ͶRt+6~(TqO+ҝ\٪ܔAuQDtYo-qNEr>G蹫.4?$O@nFY_8ܦ/-Ʌc3FzmodV4r\WuxPL4'4|iR)1w$ AzC~@C%~"F̐ t.Dyan&0IV)܉X}a{:ֈ.{=Fȧt17BTڭ p?1flyKO+ȗ ы}DߊXb~,ZB(.vHQ,IF(=F@%bI)*n%.PKFMzPKE9@/javax/swing/text/AbstractDocument$Content.classRMO1}E܅1j{q㍓"&hB^,yӠDwyf78tQb|~I04bn6ͭ!Y[ICEaaʉ|0Lp#NL$ÑBxclp^ AWR\Pg؏bZŭJ($BB'%Dj-yW~TdTTH梨3H UqR!fİ`8]+i$_tI)vʵh '@`CC\CK^lk9RFi`Slag%й]4zpT?PK?R|PKE9@<javax/swing/text/AbstractDocument$DefaultDocumentEvent.classTn@=1N ZruCU AH[h;&1JʗPx@H<|49}3c-ljP͡ynx,k74=5[  {cq\ѠLrUgpWk[ IMBdtigyMZ#1]lM8.΀ B{LN ji YhA YRE XhX8Mម; ,6?5]Kƣcl{PuhGh"TPA 3.'.e;UJV+_0K'.U&vmGo;O0[c_VCX/ΐDc'p[%dyR۶p}󄧡\<+b Bi4ֱaOR sg<ͱ y.)W#[8Rpsȶ Up K@-6wT xpoͫD)uJ ԍ4ºyGG/8N0F# 43e>!k0Bx]>>(uk0zPKG,PKE9@3javax/swing/text/AbstractDocument$ElementEdit.classR]O`~NQ6 ZE0&ddpխoFI6i^xG3ys'=:4³s+fpȁqhз;? n\ޖ:IH_1V ."b^mEgB#-\Y,O]B٢kQ# ^8R| {?Ro]wT&̫34gbd/_.$P;q+9?^s\MX3P HL!U`miq/\x(bQ;R]پ2ss9{g?c7a#?n95)V|pd)x*NAg؋\$4bnẂa>$H A *sM/ӎ^- M,u&u5?ZEϸGc_fa#Aa<'R9lP erqi۶{7FD!M+Y/嫌n+o8]'{ԉ Upz=_z-=yHZhgLw'f86}Pe،273_"lKy(RO1YZԆfW+Uƾ!r& EԀXDkN8-a9VV)!nŶiW4yL]T >L|cdƐv-R2WiU+ڝpxWTq &Q/NމT7ӌdޟbZBE TPKͅGPKE9@'javax/swing/text/AbstractDocument.classWwGc+VH'<8m䤉4MeV 4@YKc{ծ]9v J[Jii (88|3+ܙ;?׿-K]N6IioL|۟]|( N^嶟 Cb٤e`ۼ ia)5wM2k~Fمg ׯ1:\..;jXu"YNM[7LrFsf\fTpQclӢ#@Ħf}8VfQ8!Ē%56\sQo-֜)/#(wx3zE,Ɩ!(=Ӧm3.ڴO2;GtfN8M_W׸,R'Z҉q((l#߃eC,mOlAg2}FGJ%lNex' /V̘*S\Nj Ϲ] ъ"%*QJNdt) 2"7ܻB[gE\b c 9D42Y9R )+j}.}P$72#ht&WVjkWl$i*_=UgGQ!W\4ӕ7*bLdtbul8HC5-ǚѕ"yasqF!TVStvs#˻yH(]ؗ`"˛HE+#MK.=ּ1͈ MaA =fŞ;LɃ_j&:-un܁'\o];(=E1Bo:@sŶǕ1'  GAv[I%X # `tK " |b 0=' ]AR!ۺ p[]-_+r {z =)c,ЖާDs%` |hu_f0 =%m] vl+/8'6~jdiD= bKQC@|>N(p~1?jؑaaNKdUh2 jYE^+JZj~UMV%9ה}AʾAxY0DӗmtP(5ר"m:1osm0$S6N"[rOU.:R )S)`:JeS[q r7$`XŠ)pq7>Po+ص7;pp-v ]*KX a6`N"Cæo绩X ,h CR{;v֨ї(DR7ԍ4Y^\66Om@ xG5%"yJ vҟ־0Өg&j_S .[o\5B-!ADM] L*~ {0+*}*~PBJy~SKWb;3PK4PKE9@%javax/swing/text/AbstractWriter.classTYSGY)g8l q$'X5 $ 집4+)UyȏJgfj ==Ͽ ;P͂A`#=8=Z'Ù*4)>:'=,T2R"0Rj>.?@uSVE8"-VT31j 0܀QX8.;՘֚DUc9b,XZCϩms1N l]'1ۖ!V])HM-l65Ȕ\=m VuO<e ^a) 71!ܼ̒[ G`Y E!vX`>CQ*vΚ 6c+B`^emHOҪCrK,.A[v+W6wd6D'n,(NviIz'<~>#Y%}ԣGZ4*S, 1QU[^8՚8m FskJ og|K`ӘÕ!\)qk2d ` /a@&q4D w0pZ>R1btfYRd.)\i\J:"<-f `栀+BșE.!'!g{FC9-r'"$)k5;Zj yWDWhQHu m1m =ɡ.mt=&%H`YcO^Q`%At_{A"t{$|{~QPKhnS%PKE9@0javax/swing/text/AsyncBoxView$ChildLocator.class]OAٮjh*|TIMM#FLہYw?y ?xfmMc{=?$,1?bt.-U܋U|Ԕ^\a6è=NpCբ= \sUHQyÐ#KF=?< ;TqҨՔS۳zŰk v)h!Pip?2ieH8Z0Rx.O ƫP}2ߥZ5m\,51`SUOLg<$O2GB.+ Y<&?> CΩtQjt5!Z{C }: \XfL{픵|t jcҹ IS={{J'V =5Qn 8 ]QƮ:t.al$$[2:g ]`bU{0d<bLcہE*H'ƾ8bƴY0I{z 1a]wIlDqlb.FŠ \CLȁ`)$;PbfPq(JfCdNG^@yP1Mr!tlzv1J)+o3w#IpTY;s<&7VcB2vCIM厽ob\$獔ܫ;o.}RF٘g вtaL>AW0` E)(Й% P"( sd܈z[1R9֣{a5A8sSy?y{f9ygV"s}D]؈3cDvP1_ң|¸=&ns{): Kڨ2XQOhVQ*hTՙKm:SR+ / PK84DPKE9@#javax/swing/text/AsyncBoxView.classUmWGPAE]P@A$YmP$)*~'Mw7SOOC@TO.qٗlܹ>o?Ґ p=uzv`;4 )"nuj&Ǖ( &o5*u׹M`N :[t;-H$d! HwpZ:{mdf~l1E5˔y# 5ձY%@4uQ|6BKa&A0VsdTjRavIET1mmM-Uxh"4emaV;TQ+9)W*zft7]ŠJHLEA#%/DN{ILvL5"}~<ɠ\3:4PW @E ;W/9"|Rl! h21*㊜QlۢX A*B-]DECB/_"iシjF)S;[m@`ܫ0ҀD:o#4jP

    4iV%Қ |Rd]J)BMBY`ͳ VfTT0c-_Y5ƒWYg*/kކ_:3K-jY gnO{4(Î,-.tl EX=~HQm< %Lp t K(L H4̸8ڊDq}ݔnH2O(+! =u|B|<N,H7$9돞͇}^B r!1D6B=Ã،7C=4SV !2>4?;*3{,[pŚ8h>dE범Om ,(" $ӰQ~.іmDxEK6zdN?cKŸ d^%|@#!ʲhj<@^C1^ *1rBs=rg`+Wķ/ {賏O_9wpPK݆hqPKE9@6javax/swing/text/AttributeSet$CharacterAttribute.class}1 @ED͚hv֮x V9& "N4gJ* 8 zH! Js6v>hVFY#,&UOxJWcYɹ؜Eńwқ ]]M*;0MB 0x1o8PKN!PKE9@2javax/swing/text/AttributeSet$ColorAttribute.class;o>#nv&FIJ ̼tԊ}ǒ̤Ғ"; #H~N"PRVjr #Wp~iQr[fN*# z Ō #nv&FIJ ̼tԊ}ǒ̤Ғ; #H~N"PRVjr #Wp~iQr[fN*# ~=bFϼ"bvNFY22XL `Hs188PK0ԅ PKE9@6javax/swing/text/AttributeSet$ParagraphAttribute.class;o>#nv&FIJ ̼tԊ}ǒ̤ҒĢĂ (; #H~N"PRVjr #Wp~iQr[fN*# !z Ō G9'BI~{/[0_0*U?4҄oѲCaښ1'3! 3mH"o7RIp3:ɉP.^2ԁT0{D<>ZZylD2\4f]̧ >;ehXǬGϱ7f'#йvD n?Mr&C5<52 zBMa}I/X‰19PB@9N8UC AĔ‰ILT7cQk F-F9xKЖr-4,NL;J/!KY4w1ђn/)l2@8ei痌f-g61밌 a<Šj8sHF+ŭ9Ξy*^=E+gtA3~; hVAB {:=TTvKb?u!n[sED^@T|À -ozJUb# t|z}ӆ}|F`TҶ*e RÄ́_(6 h2 F`҇砇 S0]Y琏rt=_{<aAu. s>2 aH+Aj;*4{Ճ yV|AxeT53(#h +ŝ1 +ZM`x l$7Lœ#x\[+ &<%Xdrnkv6)PKd# PKE9@javax/swing/text/Caret.classmQN1UDh2lĭ;1 F"24Pfȴ𣌷si?^NmXaP j*LU mCA\c3fnQJ@D Νo1,]UZ R]!38[ϸW8 Z2=}  VJŔ{#ɍPI-ÀAީ˧mT 4W)|4m-dFR#(pjFVȓsq_zt#az_*XۈHYa XWvidXDt! Ch1@`V9 a0i3A߷,1HX2v̻wc܃}8$<2q_OPK'qPKE9@.javax/swing/text/ChangedCharSetException.classN@ƿjAo^1^&&j8p[VkeA|'z2Px@L|2zp,R -=yVbC1+r=1V2 H3T-CG`Ȝ@s>lWEl]t; a"`X]td }/Nq#뤙V#9ah:ݵE5B 턁 C;CjSaI2?97Fzѽ?9DLǠDbv7oX{$ Z*S_ ``RB7&Cb/KjL/ԄPC}iQS-aOvd!!!Usec8҄}ȏg#QGfݶ O8z NOXI҇DV/焅umO@Z l* Ks'2R7'?Kϓ͞pxAQA:-74f7.SѓդWr%j9@^eO,q-%Ї,8Iԙ^!һ^/){蝪_Ύc[G!lzӍưT$nl`זue.5| Ǒ^#|_OF<#ay %p9?3_ A?q,duy`,!qOa )â1=ȅو1̏dbعͣVfM|u-֝70>`%Ry;o+ar%ƖL",!E9<}ъ*\\\4ZX:oc( >MPK:O"hPKE9@$javax/swing/text/CompositeView.classV[oEm$ͥM+NMC F&jH !M=hkN.' ~? qfvcl6v;߹ǟPJ!J:͌*wחJԤJb#Hu,]l:ܮ1Xy!&1;S$ÃtELxU~f [v{RMK|T}(fCAfC>bU`K)gϕ-8w=)卼OjLk}E^WG 4|A̞hbE0*TB¨i{NFd-ƎR鱩[x:XϰL3_#͒ (8}?l~[S6Iq.OZ?KK^Jqi&e6v ‡f_El%4Ct,[1$&Dl:Ae,f\G B=(M2K'rM߶s9Bl3=Fb` >G4X(kx2Z;F-8Ϛ0;7+de/TYPe2'PK42PKE9@#javax/swing/text/DefaultCaret.classVk[G>"!1񖘫Q%A])ikGqKwbɇ>=3+, s,oߢ"p3ӓN2;5PQ*)NmMƢ!pgu۩wFfe3Qجn,v#0nhJ~.s[t!K^-$jPƺ0Z 4nzb`d]. px E^a9SCte+Xx` Us>54s c;bw07 6jfƐr(Rm\f>V#ͦbkTrAɖѝ*IrujNaepp_ \wܜ# t) -ct%E=5@">3FjR 9rmfVP ŤtNɅ[mΑef/i\?Dwئy>sاN2,h&:9Fǜr$6oX\LaB|4ѐV*Q˚syj67H/Ԯ|avB|0nZ=`(:-X$n*dMYJe]9yCiiزhǦ8Mes4F[&%썼"NKJ6{ȑ[W9`"nnyxE\:ncyɶic)ڲIrD1+ˉqn )Vqfd%RDTTs/X 'DrMՒW4au^dcGb/:P}HDM&i7\QqܠG,wK6 s ,_y'>{(;fl˨E DBk:"YQgq,j6c^N $-_.B7\\+#U^|r? pn{+[(M}a/4ψܼw`Ɉ?#0?h8$ CPaxT7[B$%ĘV[0bRx%rB@%xI|"3ݖ$i5= uހ1?C ^*-G}hkULZo[)K>GU%ı:+Khj,BP:UL#P/PK:keqPKE9@2javax/swing/text/DefaultEditorKit$BeepAction.classJ@mxEiUEZA "~ۮ&^+ gӀPAq/fgfg?>cF艏ԋ'2|jRQ[#u#}-ІŰCѡ02![=2Xh dQpPFmhHÀ+ h{`(Q]ӦePcAy u0FD{b,BK֘:oӎF/WwQ3Z: j/ZAF li<ѝPPĀanO'&"^Bn[&\~18pJ{EUep@ϣHD6v.@W@tR"AMY-΁{K_6y\-¥& `~:ӘOEa)n'͹Р )Pߡ #n/PKWP]PKE9@1javax/swing/text/DefaultEditorKit$CutAction.classPMK@}ۦZ?"USEZA "m&ٴ[ *(a{|{p9g:3/ѓl&k6I C.#qA+WɣІECU!%/x%A~#Zѐ9ȣR RwPK'>]Aُ4Qu5-cj;5聉Q$lHS GքA7Ӊ1`7\̛8Z6 h4YlcP:()T@QE[U S#3_ԵV ,aYeu fsWynL*nQmPK PZPKE9@=javax/swing/text/DefaultEditorKit$DefaultKeyTypedAction.classPJ@=ӦUࢺ0E 4Hd,W ?gXAYǹܹ8Ɩ #щypH6ӡ/hrM6mOwٓ< L?meA\^d+zB9XO%jR%v82Ѧ]ݰG\)hܠ~qtD?3ѱt؈I #*;V8=vف &>" (W۠ uhQQyeMU=yle턁,*T}6+, u5BwOPK3W~PKE9@9javax/swing/text/DefaultEditorKit$InsertBreakAction.classP]KA=}h!X>AD>XS,̎~@?*'ι3sp}):s7q*6W-щZCyU-B&Սdzx lXK®1 {WWIjC \8gO~aa23٥}`@IR<${pп=29 ?t\6eB1ep̚RY#8Gt;n\͜-A-M! m4 9)2h@c-ꯚCDI H#PV]钦7|d<`(}f<Ɉ&]v/Cbp;3)nyKM31Dō>vNQJVHDY2T C釿2JPFb {ʋ;_VQXXX:4l㩷,90l E 2y0bPKHugVxPKE9@7javax/swing/text/DefaultEditorKit$InsertTabAction.classPJ@=ӦUࢊR+-O۩ Lr%(NUY9;_αc#p'|FS/ZI /uj0̝DKMOքo<U_J㯼hhܻ08mʟ0 0/C(䛵"U`5=#hʠg"GcR)8a kw4#Vbtɵ\2n3+)_mf> 2vu ڌ;[\>HtIna'Q ԑƮ[I+/ڜ\NCk=p}AM{3?A9ymYS0߉8ȳ\)#$w~s傦lt:AФ|ZFrzN 53Snǣ݈+$bk@÷bI{I:&9ONjjsl]\ۦnf#Ѕ<5U ƬkjwfY;U̽wzHMiUآ||'h]P3TBLUj8BՔ]@`kA:|M^,'PKdVL|Qch &.(kT͂;,!!֑&$;~LX!S|iX.#cVM^%qt]5J:b>YX?%}5!&- "px6#`d#ZsdUzFA ?p9$[Ppې-&^=ͣ4Q T4gg1 ø<|a`|$%e0`q:>qx'ObĸdpSOw0ocθ|3; >q/Xa'~]Cup4c ~!_$$u{lGw-Lc[FAOSJ׹Hy̳|)ٗYzg^酂y=_ zjy=_W@VE^_ԇۼQA7M[/- mzLPR qSGIe<)vu2+qR_WCI64n &+hЧI /x0g` PKpòMPKE9@'javax/swing/text/DefaultFormatter.classSOA*ȯ*j $T0iov%fo[п}2??8=;r37lXh^sPw3mj_U }+̮/V]%i'ְ2,Mh mpC E%!)$waQeADqKm5/]:prƚ M@RCʭfSHlG*Svm[N+Nd0PWs#{u:6+&0.bEX5Ɖԡ% ^Kn@NQ2ӍY0W[稈'GUYds]]w(W5@q42#~!5ap>HO_ hp'O~o![g`ls7m c4K oPK@MPKE9@.javax/swing/text/DefaultFormatterFactory.class͔nQg-+JiK hUڵm4h7mz̖5Km}BL񍌳gWK!1`gvo3{~v`K3$:ǺǺS38ܪcZٯHWho9ꪵLBjAA*:q~ʍ#vqBȴcfbo+#&ANC (3^^ĉJn"NőIK/Z߹*Vu3 DǃJ"#aKf,!K!sOVTb(qWr)/UE!VnZL)o#WkUVNLB,sk`uyNL9 'dΧҟ>G(B7[=*jєt{}d.|}ñE*+smk58Vy]2^Anl65je Kin] k|A04[':&H=V/"U5^ENKun5fn:B2٬rO$$ of6#QD͖fepGCXSIsoa^ =%L .M'ir A9ܡx-m 1< n"R9$] xD¹U!KB7a KƩ!'D 4DR@J0B9"˜'"w+:st &d9uMaG%l膝% .a cUSmTmi{mh 1bNBKL_bJB7=~=,]BXJK,1KOiWЩ K82q ƅCoUH[ީ&Ri/}$Tkl6.zJܽfOhy<VLn@mBst& Ρ0@XL}UQrS$'az?SNϟE\if ;w*ZmZ ZDԩJK(Gc]L6aۑ0 لK|En,m]G#WN`3$`PbV@C c٨ƄYd0n5JYILPKeGPKE9@:javax/swing/text/DefaultStyledDocument$ElementBuffer.classTNQ]gZZ[*TKJDL5Vyi:`0Cf*}0&>~q͙iei}^{@ihKzC?)yM{)W/t–%U}oOi$gv( ?5RUn_%R ; Fgm[;]x$7]ҸE9dHmӖoG5~yl;n̅2$#!1dCw)2y2bre][1Vå,-@.dxWɭǰ뻘5S$߷/G7#KSIv.tTCsV e 7e]-vIi#n٪Sw ߡX $+- K<饱;a7>֗-#ޛtӊ@ :a" m3d9@vnrs?' 78h cm 71-u'pw# GCQsc Bzg=n Z"ΫQ BX1G/Ty)ωEHS9 PhXS<)LGU&RV+p %( 0yvgT6vk7S;ayZ QUg9!`^{93Y $O,y߸hTmvL}GaGn?cBwW5-HԺCQUo"WqœsF:>Kb$8ڧ-aŮMK%qWE`H@:T}삻뒷/C g+*UB W [籥 _1ux@ UqX0',hzLӆg0\s9k)u=++Ş:/\$0gD FUJ]ơU *+U#JVri1%%BP~\ s9^LH֘hT~|1|ĩ]dz&z]|A7NU!8g'3~ `6!zFpq_G#!<,DK7$P%FyXTEѷT E/U+rͬiSeH`2&:ܘ*Kam&3^?=}#38<~+' -W c{.ÚSum,]PKv; PKE9@javax/swing/text/Document.class}SMo@}[$M4miBK?(ƦP#$N9 R$KTM酓c/u?$Ċ-N;͛7_uk ęZw_ -ɧn2BPW8~sWRE_FuxFX1]{'iBKG;'Hx Xkvˀ/Jbؐ*Űx‹ǒ 1 ;OVimI:w=?qG:5J~ƾv8 \N]O&.bTIZ9s2TW(УP#P1Kd $#o(Юw%ڗS vkWQۨ븃]bcC4#Wu<±'8?3<[nYwev4Y==Q["j9;s#-lȎэ \C]^I9Q!ևۖp}z<#U2{BB9 /)83H )0^Uu@zҿZ+k SY`̛B`P3*Hќ.T`}ÙzPL>z2* ؖIyiw-{vxDRRZawm]_*r}vK+5}vV %x1;QXvCw!1#'110Bcaqa33o f?3}w<ӽ PKM!|PKE9@%javax/swing/text/DocumentFilter.classROA=UQ@Ab8jH5ч|^7zmk|"??8Hjvfwfo>!lEg}U z23oTjlR Ny9!T_L#ΓSBpwe *a2vH^tRIXlHOVv?> 'U m4 uRќCHv&lys/~2KÑȶ4MzȾQyVX$lJE )?sYPgzu {wߎԷMPפe/WlZSp}wvcoHFd?y, ?8ˤ>ILlN Ea=~¼9}eg5^Z lo%=̹7w3 VN)tM%zkJz2g)[mIJ׬ Or[~ [0mA!J:Rf )La6i*VCxG!Vŵ]$O(W_earC &Be=g,Op%@Cj:G+pV巄CHiM7t:6AC#J+2,_ bH Ru\yf!XuY8:k_S#\]>3˪ /'Ni2< FioAPmjg.i D֘[ F"@ G2&]O*+A OOe\߳ľ 8ӟ՝} ĐArn%hI;=t!CkR0Gk:`7iC$"f32g%m,GJ/4brZh)LF VHj Z}:ox@-!:={0{:ێ~PKHPKE9@javax/swing/text/Element.classmQN@=S+(-j՚]ĭ+#!i ;wS:J*wi#,89{.|}|Ņp׼4O|)j?eb)ri)8qBDy/e*)Jx/c+cqU*ɱIڔPAmhwU{q>fhS"4KAj/|)!-'4#+/(gi]9B aDXW{UUD9hk|7*b ߇lh<Wc=}sp'gpN?PKx' PKE9@&javax/swing/text/ElementIterator.classN@VDTzCEtXhxIL.4KuHi0EʅL\>t 1)E973_Q7bwl`)3w. C)TYMv;@[=q}m3䎄'1CN t FXk _67Cd;{kKbF=>!v`=?.İsJ_:͐u 0f+:,jN %)FI;Sz 'S#C'@=p"ynx6A:NQv@k; oIab@̡<1$s"Ԙ 1;:'7{048 KX׹\A5LDKg.:8Wb XgMg?PK݌PKE9@ javax/swing/text/FieldView.classuN1AA]Jq bL  3ҕ 22isL~\a/ pC1#۾cW Zu%GI@(muw2w1=MT'aKFk٪ykU4IWæ"R6]Q}2}̮.99>BM8CbdZGri[4P'i"xsj jʊvI In3l:P&؁4&dYwsͫu9ؙc83ÌQ`G8V2v'tN][PK@NfPKE9@,javax/swing/text/FlowView$FlowStrategy.classSMsA}l@|5h%*,JB>,Sde] Od?ʲgvag= 4 YNE`eѾtѽLAgؐ)s'̀!rC\i1nGd@:$#> m-6\-Yr3SScHNoWJِ{1a VмdX5ϩjCq]pk|08&-jRcii&Cn^2C) ouԀnג/d-^0nWA, Fg݋/BD1O5%\j\m"\":vq?bxMV˰, 7.!"W mΔ:УSv FqJxyŻ7Xþxڧ PK:,P>PKE9@javax/swing/text/FlowView.classR]OA=ww趥KEBZB, D $4Xi5ٝ~|?xgw Rܯs={?xU帙4jlu5 kSzlr(|:$utk_ʈ@>Xտ"ԧ&k6iH) #lޱt #!cEbyT R]nՖɰ#yS !v9_ !BE#={!\%Zt*;o9Z$$b:*sP)vqrr`YeVDn&v= FYF= @3h)|(r؍e1բipǸDjpk?5[o8xΎSh>2~|&^SPI ;/NFBe-|$\C}`<$0ws!`$08A'{g[h\;A'n4oFB~s6y t~9@,wxcCxl4qcC9QLGk Kt0P&IXiIa) o/ 3(8 !wn`t0W*մƚx[[ Ӎx5#/p/35.iU6!y x'xWѢd4uJuXҊ馄CǶ2vRS&%؄ ؂LPK3 PKE9@ javax/swing/text/GapVector.classRn@=q郴iZJ# /E`~+cWVH,> qn:jDS?ZiXd*jMn d~e3`܇}{{?,y C~["V`lٟ'3Z AaH ]PTґK|ĐZw"$zFtn,^[v{RTP>C~zk"xWCYL8&zm:UQs}HauL3o1dsCDDt[ZR~ۧQM=b#wOg$nد(ZyL7[Pg~f;|xUu_Aΰc-2ť ݒ +48P)5C;$#.|Õ$G$Br״ו$nPhwK#DsGNsl֐Ck9j{w0Fb\&)ҦȚ43ސ(uTXǐcN9FhdUZQC8uhj'FC kP2Ջk⌷ÍÖc[Mx^dPmyV(Qq.1 JJn In:B z/3b.+#~#* FewϰT%ރ3N\jA/Gf\ۀ$hݛns䡨QVoௌr?n#;WVG86L; u;ݒ^hV;`v'mkqGr n݉IlbѢj&:ZQ~N[n1*|:Q\ML?s;f~Zh[/Zp·ͧњ},=2 lMqT,K8%@~f4`2Yzz4Yzh/i)ƚ4,X*#Fʆh&mt_M4h] uV(Jc3w!qoBS TD5!ȼ>w7f*n"0_/W3o=3-`a}jxkjzOjiZ.\r\\\VPű2peZ4?#jY`Kd\Kdn ,$27i }38~rS<Ǩ3UR c{GU>vlueD = b= 6/Ppb|y> iJF?.jJZ4PKAcKH PKE9@,javax/swing/text/Highlighter$Highlight.classPjA }QnZz,ثG(QveagZ6~4#*{:yIH^^{<xCGިo.qdyoqbD(UR9[lxi ^k; !J03-BMVeη_ْGI"#EDkΆ2uk&!mLݥ0/=+ʥ]GQ@xQlG PlxPK/PKE9@3javax/swing/text/Highlighter$HighlightPainter.class}OMk@}GQУ=B9 } YI7!Q+o;~F< sPz',];\ nT!\:rڔ++Yf*5qL/.NϲЬm<UUrv7レx6h4ư !TPKɒpPKE9@javax/swing/text/IconView.classooPƟG9dss6 iB&#ðY፯:W&綀NGC{Os~}ιoaAŴNuVԫ4QrDux,$l͈h !V{2%\ a,|x*8HjAG8Jdz1\F>WeX8 @~&G#{ljC7hAW5*bUZ}1(vlkP Z RGӮia78=ݳ,A7Op3#,gvĨn5 @c<=Yk]:.O K xp-ʺ`yϏt!Ӱ,u%$lD=װ3BħS#$Ga$W@JǜH=(OHV8ϛ3?H 1n0 ># 9~(ӎy*|Z9Fhzu ٷֱ=ncs(hni%aUkdmͧ= ,.L& W =nb)G PPK`5PKE9@-javax/swing/text/InternationalFormatter.classMo@q6~iҔ@!@BE\"E \@m?*)YpBG!kXC>3//ȄAx|..Ŵ}UY?Ӹ?c"V/az"愉 ;'~'?2BU Ap*mam|a8v%asP*9gJEE; l;Z~¥'U ֙J|מ3͉u4:Mh82͒bGh]i\ޅt<*\;*N?髹`ȡJ)޳D|_WDL+ʧab>[#Tu]GYΫɧ>GX}yc浦[k=p11̯9 mnְ̜fya 6.0a0cK3HO>BFD;K;5Rg;Kڅ)o #:Ewq͙.!PK"PKE9@>javax/swing/text/JTextComponent$AccessibleJTextComponent.classW{Fv&ԎM$Ndm$ԥmC65NE;ծ%W:n)7](QP WPov=+ϟW{wӇ. 7mث-#Oߒ{ҋFG{*[7ca"}Ȕ`0x߭}&ׇ,SNWȦ'ԇM*酅}r {&2X͹!!ʠ $ ߩ-KBo膣G,e8}ov=74:@Z |^ysHijybo3Qg,3])e/Ew9]T_xP9\k:jA7-,mV}O`]G͕y|TT~($W^.Zo$z ~ꀨLȭ"/KM\Oՙʹ ttCeٙ^A?<͆'In~-p &2|%3ɿn+-.w7z}؈~lAӐ5Eø~?| lXÎ 跗@WѯPI bo jgܪ͘F~1#~qc bث7[ jus<lGn n'} ʄu] µ8cR&t5Sđvcm2y\cܪʄqU1r]Y9vF>|CνFgdD9)c_$nk:bI8InY;BR3[bb{LGĸL94h Exq3p q Yj)'wcq0W؍֓d9},44;naai<4x4} iB#4Ƽ&Zxh(6yKZ@i66-M+49Xޗ&|(M &k>fDG|* ,KBɘ/󨱤Es}-M &O1ݠiX3ibh7A%c84M, b~Bi,O}1;J?߿n a߰PKчOPKE9@2javax/swing/text/JTextComponent$DropLocation.classP]/Q=ӭݪHZHQiD^ueݕE$?J--j=gfμ=XǢaR܊v)SU e;,յsw]D< JW|s t&8-)I'^ 1g8ۄhkJhUiy|sՐ~M4\Ln]hxsg>xJl|BwVn'aa<LN3*nweHv*>!QZeW 2}# L9#,BO_аvY7l#qЃANeW1đM`Wi(7QFأƯLO{Qo}S_d'11,Lcc #;PK_|PKE9@0javax/swing/text/JTextComponent$KeyBinding.classQN@=JEAPPHU>61Q\@e"ej\(m!Acf<3oNm"PѓTcm6:1PB;1CmC1>'}'<`qO@@09C;cHń~"^}ATR_2Vd=h1NX#e+m6yOnxoPh讌H]vo2&,;y7Jy&D;h/ 1XH<-93\s2P 2p")+(IT&"DLYK&Q!o%BPKO"G7PKE9@%javax/swing/text/JTextComponent.classXF8ZRSZvn[8PBG KF@Oz}}vQ73-#~{3r$vaU %՚mQKBDPh!Q:u]c0 F:㿙4 {#ئgrB &65&9(?K஬mfyY{.2GZJ&r*# #ƶl2[Lh휧7yڰ u]Cw($p`Xt^ݤNIXy`뚹9{޶.(P`CX* Ldfq 9U"&0JпV#0ZE2Lon#~&hy8=_k,VΓ2pp "f}KpisAsPp>]ܒ0Q6c>%3$ 1="o Ilwg̋S1DƂ\깾/KZèS7LnC2+b~+ݢCڶnНxE&DPo>ц剢;Ǖ-b *tv7`1to23n q& ;I1HЎal=*dV:uLs]k@6D=O-dpJ4~9T+(\3l.˛W0&8/{$Ox>1j3GYV6bpɚF`hąA1M֘pD-bJ`C]F70BA֩\Ir;:+TnS DN'Wx %ݻ`aXD;X\`+i/bC+uGx* n.1i, y KD\b+T]4yxvfh,8{D/i`:L >?~31\I7\d? ܃B!a8Osy\8pBl@t/܇p)>L%‘ p!rsLsh疘q&`?ip R9>Aʧx?NJ9)K'1%rAL(xS(E>vIR|R\Z)UZ4|ZsU|U" "S"K!HugN\ZW!ץf yA<'~)؉"|IEKa1eF,W_S[qPQKMN-XpTR_߇(^!XEz,O8O"::T/o)(~o+j*wb)~)~ M:zự9k{'.g` 0pow'JPKKjK"PKE9@javax/swing/text/Keymap.class}RN@=J!P׮,-+a#Q# ]0biM[~ͅGLKEvѓ={9N5#>峦fXæ'f^JU&CN&H=" .a[!jsл˝JױlC gQ:5Cm{bdC?ܰ++OpI?)b%uc 'QkSqaeTWZ?)0ܮ9'7%wT Ghր҆./ܠ_3R?!GWHgR/:IBC 8䓦?x q?Yö SQFFa9+CAa%e+<@Ea58I PK'ւu]PKE9@ javax/swing/text/LabelView.class]oA~)j/1&XcRxXw.dvW&^Q3RΜssv 3b~706DЕbC*]u4Ya3/N6CA!sDi* TC!uItTh"FiB8ջd?N vO:Uz&(b pul&eqELOmɏim)mZrDR3Fy鹋l6CD٩6Ec+Iuob[^G'aJq(01$Y)nl@g85]˟bϤ9CRm3hu+ bф#:"l'JrCR{2b9P7%JZغ yГnd7danA+m)Fvuo2GywO "dmԴaf8À}zdbYd3 OgPOu,,`5ՕR\#ϐbe=O-hPK\ `PKE9@)javax/swing/text/LayeredHighlighter.classQN@} JQ`/$*QgKʶidj"Mُ͛ٙϷw5Q`8'>sҩTCGv<,1 $"1a0ldB'$MRI}PlV4XabI%&H 瞹_N"5C>ֽiu_}/N"*-N@t}i9CR 'H"G ia*x;`(N[m2hz " z-=14Om`ےjrNm嚢 $/IHM޼Ԭ,AGxnuwO^B@+Щ'.xtI6G*9%0:e #P~#.(ۏ%X](X}3= ~p@-G\ou@jRDʹ~ǑpFi#^ل&/TkBjgL~&4CD+=A HQH6ázF*_Gwdmq$)D 1H?@˜i $ٮ^T”J*8 !Ӿ2 /@Xg'wʳ_p'Tp-} um<2djZ1eTʽyyhXĭ\42[e.3̖禑 ;[F殞b}edz0i+S Wg@?%ڹ{)"N-TPK~e&PKE9@*javax/swing/text/MutableAttributeSet.classuKK@Tmlmm|݈cŀI{)S Lm.(D$sq SU,L$#f@duĞb5∷M}](˫eC@.,WʍQAԳ8K dDrHgѸZE:7o%zb9˞ }] cg%)kh'#|OT<ܧ-vyoA;=م}zL5 O/PKPKE9@4javax/swing/text/NavigationFilter$FilterBypass.classQN1} *$$kb<1!!h^edŋ50o:}/}3 U1D 7v\h/j, jԗ~ah"q+.9҄>#28Y$$zʓt(1t%G@gw*$EH@JޘgOƞpڜQ049qdg:[&oa lutwL+o3vڄ=ܝed]#u$RR&Os)ILkpp}Cx 3PK3PKE9@&javax/swing/text/NumberFormatter.classO=KA}sML6jc$Dlp(7qѕl61Jٽxog@E,2*Z|:fXV!dEuU])5;›Q&a:"B3SZ#8vVLD>F*Y =Zm a.4侘*7sg pć0Ɯ\?{ƛo'/v(μS/u7&Z~׷PK;-PKE9@(javax/swing/text/ParagraphView$Row.classJ@MbbcV)VMŅEPDT֡&B>% nDi7g7sg>?bǁAg1kfS[A*.:?e2·* N|*Va`|v(K xXĪk"9q宊dܓEP&}"U9{B~'/U82mG"d`W&:oiǐUuW]\gq A 9LU(j"Va 5PK<#f* PKE9@$javax/swing/text/ParagraphView.class]SF CIS &!p&vp*LpkHiNL/:}walYs!z9Ͼ{Y?7= E!YA Y8? xu^lFK#>3iF?ݿp!F M7eO2b駮gVsՑ8g1. ):G34ਈ -~yE[ܐ(m(ExFe4o|c1p+:ZlC\fxNRfF;9ޓZwD1? U-F(Vtf(_nAh] t NNNʌτ,)?_XeC"~J|F?朘t%ŨvdR/ꢣVmDxCro!)c38 <6%(GP Y*naLl?iL-Z{D7hO BDz1]âO5b/ D)˴m@dGK\kv ܌Z]צ5b˚;gM:*)lSF"Wt亱)ڼTNe'2ciincu2inY2ou w{(oj]~RXֳfLa\{ 6 xn F:[$rYݣϢ:Fh:>/&vfL$/q'd"'xJ_iz=rf1|93ISUܞ311 շ-PK%~!x PKE9@#javax/swing/text/PasswordView.classuN@,(# 1ąUt%M 1&CȘҚi<W&.|x;%b9w{2_Zh`0<[a,G+Ⱥaj4"!XiJint[xb"0d`$`5 Şt2χ`({dh,CUr65θ:`(;8\q7xY?n: ?t9sҲtc3rEW&KOePE?A{iNaUDTI{-@[`bEAik*μbT52u17hJUO0KUFW5a_7PKJ OP?PKE9@$javax/swing/text/PlainDocument.classn@qChz- pJpT EPEPfI96% B]c4;|dzGxl l}bP?)Wr맮PމD}i9BJα@8OaUlZʎ`;&`Q 6}/]F"y-,2 f%+O%;Y ʘ"a mcLG t#~\ M;@~3R)ӨN}.')0‚H|/"W}S6IKW{RJ6-1v* dz ڴZE(u(p+RbPny Cx@8zgmG"&,£<2GMx;Tn ϞxKCM~G x!S%I$ۼ/Rثo0n$x"%UV#uI X`d6y-:ݔ|K 62WNj}܂Z]oPK/gKPKE9@ javax/swing/text/PlainView.classV]oGYǐH!188&|ÇbF[%&/* ,ZZu7!D*?? qfvػJU4ٙwι;#̒h=?Gt+8+mn9{8̒h1aLӌ SlO0mK ?+ w*'cX=#v Mљ9:M3m[x5Hm,7uB$z%wR;ǻBr alj5y_T5w33`|0 ,k@xP3#/=ߗrdb<hBfH bE߷\g]O(;Rp)3#<s쏂QN Py\=inmZC)CkM#Y>ޑ>(-+QHx߸Kzmj9YŕIg@`Wf}Fb>)H+NK{np_ld;~l.W dRo(MdT6 M@={#heb PD/HzmѰp6wAh:j6 Z:.>hVE%B t O9,VI*Lr ;rwDjv.(Z q XT1%,S!KGrDS'A1"E9EpV`+aOUE+fӒeCkQ2Zĥ\rv unPS+B܀A#|ɥ^2zen^Na'<\sZur%}=?TIh0 wYᮆJƳ pm7xjOw-:= ўaL]+#`W]J~ O TC[j?4RZ5zlg*)\ZJiJ4 x|6iPK#i@ PKE9@$javax/swing/text/Position$Bias.class}PN0#IC8pDpJ*@DJRB8|b8-?^`F3bd \U\%^_FИ d"vGKaN/T3Bq`L( y(Q̓ PX^&2HZ$XJ߿V( w*#< PiXԑXHd6}g;1+kڪ8<{oGƫd ukF`%tFü|j ZT$,1{|-PK}R;PKE9@javax/swing/text/Position.classuNA 0x>AA詂/%-)%&j(1<;3 `! 䭸 reUB˼N,/,!n-H'MAHuQu[o%r8tiߓz.=2EX3;EPKs?PKE9@javax/swing/text/Segment.classT[O@=S\\]DPxu#&%f˰N[>G+YJi6w~<,s~ɯ*gW* + Ѻ2#PՊǩy.&gg\5ħHHG0~RGYS03hwBjW Y`W)pH ƐOOAA+C]>dT1>L Q+ś)=)Xwwȕ8 ܀XM}\,\mNR'ZصiW elNzs=UEw["|)ZqewI(vGW˽"4#j- ($t],H+eD5D0gԓd 4H9ի:/ޖ9zYb9ҌacG%`cU2ٍN{͙$= 3S64d3 x= k!~,͑;BLOV׬]ӆw]Z;l,b)،Y[5aVGX +)UD%"S S 6=ȍ+|R"r3Ŝˉȇ)+ȭ'x `;3y\k(X1xS<7Kn8mh}Ah/PKPKE9@)javax/swing/text/SimpleAttributeSet.classVmS@K)Z@iiD*23eoi{1iRӤ:~p%il>w??}؏D`Ri(Wr.d^rUk*7M,.I( .]2Z rLQgqsǖɽޔǧgo L⽁[z*ӘC RX:'uWh/LH8b=%jL+X4cC HA?RXBHbH(#hC[8~oI yIhϩ,뚩0B|mZ^n:5=u.,ҋ;-UDJNY&SCͪRC1!So]hi~S& j*9{Y9}7B`$xlL5ZT?ZwؠUA= lDQBM<>Ʌpc?ҭSt]kNR}u(3Zt0#wb;˧R}Џ-_QA! 0 ]V qƔ$:'J#0 Bc0'©)҂bvg ? |ptkhl'xi%+NO$cm :=qT|iCf=R$7J\)s0m:xymg)f_{[69@[( D㟃O(COf߸ũτ&< َC` x3<꥗*⡚HۮFny搇|ȐS,PPKv: PKE9@$javax/swing/text/StringContent.class[O@Sʖ]W@;T xI ƨ+&5D(dRZ"3O&>P3Rve.gM<`0xމ|aӑD:2s- %aX8G'iaTKEXxnaaov)3Pg }Y>\/Ўa==r_$ ՝"MՎx ~=G" & :}'FiGXbXR~5TJ%ehrYbtv*i0}2C%n:E5mm㴤=j[oYfBU"Q1۹TNJe&<nVg1[a#r>Ѣ:')hP 1?)<ːQyizDbz:ffMPnxI©ԙ9Aa+ѭktshg@; Z h-  ڕHfv"Qm<*dTsLM̤ۤ>΀v6F3rӦ1EsB>ڸ9e0uO71G31j͞ANq;\F5;J\[X nX/C5}*Ù%,w ۚ{vV{}_Ѧf*sf:E{=>6= _w_oHulPKBEPKE9@javax/swing/text/Style.classeONP# $/ʉpzh&l ?2aw3;;;_OOh ׾gEq|䴸2˽2oɚK1xPTⓜ32K*aL1]`i0GŬY;N6 IEt풛m;*g9FZ6hj\:h!8ls+@PK+/ $PKE9@8javax/swing/text/StyleConstants$CharacterConstants.classQMK@}ӏh5z6\uaqouzR=lr3\%AC!52&j=c αOݽ1Ȯt u,p@hGmK,QH妬?MA8of*Hiy=~Hs#1wԣd(0*Dʮʦ4f04a,T0'.ά=( 8/s'W/jloVm`=gĦSMlF PK2JPKE9@8javax/swing/text/StyleConstants$ParagraphConstants.classQMK@}ӦjǩA=)A PDK7hY8Raͼ7}}{~ź{-$EVNlۇT2[mu!q;R:.aZXگS)13 8Jc>9BndƆSNo:&kҜ7b$6:.1%d) RdP51Q&HXH($9 w ֋HIq:Bä.'퓚+A_+4 0+l(gˋ1/AUj0GIfJq_|X0j޾/~)q65ܯ~ k徎zqzs}3,߀k6aE9 ˰mhѺzѢhhІЎG;6G;DA.Yˑ¿p RaOqp qKp˱h-N'؄ڄچSى^L;l. alpZ(8 ! {@i3r 7[9y+ZZ} iB&)]A"'<pENȳp.Yr!ኼtEaȻ|<,\^W#$"<|dd+ix#7դK9A }DV "3RhQ$␠)^(^EC3RaQ o(HE+8:#=r,M=.Cʼn)>(>oI~"Y#))bqy1"B#;rALP|)H (.%:#Weq#7DN+M.ͨ W;߫П7#~uWPK:PKE9@.javax/swing/text/StyleContext$NamedStyle.class[sD&&8!u.M{*;\ mq0iMaI:T$94|&a>+Y[e"ywާӔ`/%g<+[j^Lñ0.v]$VrpG(]WiNx! Bc@4^3 EvlOH`TTT 7Z֛KUkM+f#Ұy]Fϸz!^Ӫ^Is> #X!A ۤ-daxbf(HDv|Yjh'b,)1%D?D?]iNҖi^PTr3@=F@4wd!XQY!&W#ސn~r;Z rC al6B5T̿{j a32UWK=c 6Flj>ScOd&GB8/J(6HT}6bk;~vbIٍ?OYb/,?2= j-}G?PK,hWPKE9@5javax/swing/text/StyleContext$SmallAttributeSet.classT[OAf[UQARr! IiZFY>(㙥ewhy=? ,1?etJrM٢:ژ5mo+zDM  *ۜ ǢAnUЭ>JjaڶnJG-bd8Ztc!]qE F)E!U UY[^Cmp{R-gZϰԾHO{fĵNzW5 ] u) R. b2P򝞑R ]X7ivckOtEMzo7P  Dq7pT{>oNFO1P.:ASx\I!lM9\*oE~#|>'tͬwZC!S4w?fkR/e_t;4Ʊ8«jFa% _X i"GM`Q+@=ɲGg7Ks| P\͵|%םkw[\}qhF[fƐ!yEZlM1NYllk-ن'0Q˺QCLū'O>V{x3(5JfdF<wF vmrh-#)6wPK{wPKE9@#javax/swing/text/StyleContext.classVk[G>" *(륨Qj"7Wd ]O}~wf7aw~9ﹽ,J1:7>Mȗā[~d(hH-;yNUɗkc 1m\ة (%ܨq[L-; ѴhpiyeaDj vuB ۆ}4(S;myF=mFE³C'gth|QUpʆm|ik+vL 0*V*vvb41+ o7b݋ΣoۛE: 7]~w /um2A|XhN^Q :1ZʵS(q{$o.hU Ѫ.15d`$cRͰ'_`#H6LaU.UiF737>F0uYTvj{.MˮcUT[bk`0.4(k{@%0V# 4VߢiNB |) 'o|F|cGbe$J."` *07(+R0ˁu94"b]!?@ukbӡFM10C…=džlɬچh03$wgfChJICOk6$k1 .*=i!dCFӰhB-)Fy·?w}@/4+zxU%JAgWmq>F X"S_'2m2S)Qe9 q.dFPK'EPKE9@%javax/swing/text/StyledDocument.classRMO1""(z2YWN hB[Y\v?8QVKޛ׷ btLN0m)0ڊv@ 1yEOp%pn/^J4ZH}.P#ԕL\֊݌5Ȳ*anpfeg^ߥO)~ֶ*+}KcO"^R!3CGA; 3W{e;hqhPW"yq ෆkm jk7 1 )iԘ1,li69ј]X}%uG21PK$W?pIPKE9@6javax/swing/text/StyledEditorKit$AlignmentAction.classJ@6j+PFW B؎:&0V},W LE,&s͹+}!މx{F>iC٭u2'z22'G+[,6w"e ͆`shfַڄL5#k{m3ƞ>nkց9x#xB1㈳ܛaؼR Y!>-,;.a9| LPKeyuPKE9@1javax/swing/text/StyledEditorKit$BoldAction.classP]KA=Ye`E=AA$(OT.̎ά4w;g'Slf`8|#>q \-&W_x-OPJwe_0a8+qZ!}./ =C"eΰ3> Cav$(K!M1Cn1>`XxEmuy%,MAa>| VXSVQPh-T,YdPKJȣ0 6d$7BP0Tg\Ks%cֿ=׈z  6Y4O'B_(}#.+Pl3[*C0`se(.Pbw1Dq ;bDl2?1A1G4 PgPq oPKE|PKE9@3javax/swing/text/StyledEditorKit$ItalicAction.classPMK@}ۦQkm ZASOAJbmJf$xM҃=Λyox3_.g#CpBt3>ͥۓuF\F㮤o|ɣІEpTj%2&XYP$== ٓBniCv?a^`@8-ZmZj>5AΤ˦,nBxT4 {DkgZJtÐv@6 -EV (-GPg~WVi0?!Xy3UMGE'a` WA)U_- FXKPg(WPUXae]PK/7{]PKE9@7javax/swing/text/StyledEditorKit$StyledTextAction.classNAƿ,-U* %RL4hB*&HcHJnk]3;-VzeCq6w33gf;gf]< ? YZ^j?{uOxk֎aV =sf+Z`Y[+V7jwe3(0ax#Չ踒PnpOryhuB౔Ա3eЖJO[1 b'r#ay9/6'jNǛS)k!x;C;PRk@`Aƹc[YTq m,%Y1SSj.Ŷ?P|5S9vP:<񘰖u|hY .ɱ5y/n7}e@1QOqj@ 7-~ XL8/x U}a<0Rrĸ-=1ɰ2w0h:v"V"(A=D fcXkXG0 PK 6PKE9@6javax/swing/text/StyledEditorKit$UnderlineAction.classP]KA=fiAPACkOFbI;ĺ G?~@?*A<9s;_ص` 9TO3t'ܶ+un>z]<鋫ob8[yJ!}!}/> \ER28jEFw@x s% '-,Cz 5 {5.|>Վ_;mp45ư! j(0ɩ2n|_P6Ppl BMq }ޱW Q anj݈[46"c%.΍mH1H_B"$i *APK+^PKE9@&javax/swing/text/StyledEditorKit.classSrA=MCFcJb@\"$TQ 7В鉉_+\~!P{>s>[0?3~nw>Kղ87v\8yԔկeX:ACTҼddO%)Ayhu"2#G2[jqcXV&ϰ9*rK)׼aya5N9hfgΉ(KoraHVNGt,2&Fё-Xl9R u\ٗHu,3'ˮ2eޖE_c!J&倅thҮC\Yf؝T1ܑJrص7M/]R^! ij :h'kg2٭FdcA Mv yzWEY4 _-ZubNR{6Fp&2aFX!<P.G&&#,.#GPK0PKE9@"javax/swing/text/TabExpander.class;o>#Nv&FIJ ̼tԊ$׊ļ"vF DRVjr #wP!P]pI~##Wp~iQr[fN*P1z @h*+$8PK+}PKE9@javax/swing/text/TabSet.classN@ƿ-PP{Bc`b0&ӂ+.ɃL<>qmРCwwt?>a# |`=Hk)1PoJdesN=!o!ҵZ“ܖm ġt:bX\4*y`KB 0*;۔8ߴw gnʐ:Mu-JJ!eX Er J ϨGgԇ5(}oJù1&.G@]Zn눺f㓰j8IL:IW^``* 0Mk!@9@f0K:#=bCG c012e,hF 吱mbO#fd5dCh_/j+XXs5mPK.PKE9@javax/swing/text/TabStop.classRn@ӄ$N[J@oR7B XNIH0/G{{+g"s+` e< h4艺Tsc5ci*)T.N`4gg' <|#R7SRzS~x 3ct`RWlK΂&Zum}u=+GcdVVRcĤHmv9u$;e?:/ܦTƥ;YPK #&$PKE9@"javax/swing/text/TabableView.classm1 @EFc4x+6"6,Qjr6 ]l,yz?ݩpg#IO}5~/+΍ds(مj?Je"0%|%mg낛|krNfkѯ:g 0?PK=jPKE9@)javax/swing/text/TableView$GridCell.classuOKN0WH-Kh7D @ O+cKCz6C!^ag>?"ňpuPoXN}jR1)N X%݁@9δtj]f2Êu4RDY=Z턜jѳkaM04{)s$c@\?dJ 4b,b0G s\^XoPKKPKE9@*javax/swing/text/TableView$TableCell.classRnQ]; Z+Ոfj%$ćjxz0cfG1FHZ Lr.{gdԿ8gΤwڎ$jr]j\r,R "#_>##DuX$-?d3isUE쭫ʋ[}ATKEd+ Ry]->*Tz@8NAcE)W ~g*hu V&GXP 8>ͮ%i菂NvΈQ_EnQVe<Ϗ0oY+mס96]SAuPYܣC?I~61\iHl>" < 7$Y<$b;.ǵ-To1:\Uޮٜ:c< #vNj5S4d`^Yys fm!s2_pQݱĽ)8pTU TH0kdg?VU!FLZPK*yPKE9@)javax/swing/text/TableView$TableRow.class}Q]KA=\65+3 R(ˆH Xwaw[=DC?YS܏sϙ{ 9v-b,F8Qޠ8j<+JNO,Ə5^TX=#u5w<].kJ/jw fYV m 9?ֶw'GÞ 9B_jK9 eEWGͩn!8mϓAa(C ;LX`oR=>2l]sUם;:p8N!6(u&RJ%lm'eT@PKVtJ:HPKE9@ javax/swing/text/TableView.class]oA߳,,EJ*X[kQ(mDcGHH/pӫ)Lt̲ѢJLggZRj"dfޝssΙYO;ض`*đ4ckr4ߊC[<`{$rϕ;+[6dE:#E,t#t9Ů;@x*zN6 +Ӵ{ wzqNN8bn[6aoVS3VSc /GO<",B'Pc:@PĦ-wÄҙz.mQZs} /'?p__%u|L0/Ok@n k]_)-aF(vGzm[-T 3zQ|WiFRm1;O7:lSw ^e#+uB2W+ f=0 C+}qi7Dx-w.x(9Mu-#&dpK#0;Ͷ+#P+_H2RQu vSDo3+߇8S|1Cw4arDW] 9 :'~n[*A&,QLiVVk10IQYSrfO0 `_A7anS" ZHF1fd٤0gP t qPKEuZLPKE9@ javax/swing/text/Utilities.classTKSA !H@@,K,JB@U fH<*e<6k~5KZUTfN* \pV i GKB6S]`a^n 4S`,-R˽{y^"0q<8>æ0#6R,wLO&M۴R"5 fǓ ILLEsdgqN Ҁ1njmbsL،~2 [zKgduo]kq,LC, 0ۀ]h.fYQføjU%bFԦ9D lYwz}lLm*,ε7v %vNGIPv.GQ @א:@(5S23ʐz/rHEn;V':I6Z@iU`F!4 'pS\\0i< b܌bB-А5X.Q6w;遲c/B@[6ၶ\N>\.K+z)α7^2bj0li`4bVnh5YkF`]6PKB PKE9@javax/swing/text/View.classWVWw 'ϊԈB$6DZ;$&]]UzUOo d E}흿/":M?%)hmI[IWus!'=$m[iCƭ'$)hoP /3Yq4ө0<m=E1T;0UhJ7y%a-k^іհ/csy ȁ00sQoj) `|tpQi4cFu1΢w7Ł%>E;_rE UωTekZqNYwx(,x\"_GkV*\Qy -;VFZ>NQ-kk Ȁó T1ڇ4D'aӼe/kKe^M22I!5 hG]Ӗ = )&= PĪ\hTH%y.2u H &c'1@9e2:5z; Hа6Ts8WKwk8݁^);ڿƒ xk~I 9u[+/dgWЫڲ)mE/UKfz . 7aoFT5UErUb4%ίڑq]4;P%!]k$M2:$ etH%0Bٲ=a%}8gynۼfm נ&`sw4۩UK,L[1@*󀴹IHݸ7 uy2V: 9lj*rf0xpYKk7]{@P> ps5F6"8.;U/qOb4-Gb 42f:( 1ZHu<ҹ,w(x%"B! %W9hrǵ %m^6w!vO&WV{.q-h8!*mIF^ϝ}!%]s / Zw.ikJ@\*Y]Q줐BP9T*щ ETnϮN38óVJP% v㬻AG܏Q?F19:J"G0c?E>0'KCfCr {!T'褧,^R!ϡh()O[^f8,;9;9;9,2d8HJ r<=H:ip(|肧㸜O`tQYHcÁ*GUcFޤQe=.[CLWGC%ҘRr Tr2M9=*y&6SuhP16",;R%B0,]vw#0#k'67mzWy3#co"{:z3t ?م!]8,>=hI"uDu:4*gB%I̬Jg_!q#+5=Vi+HVo_ m+ͩo pp0x<ڂ'(1’UKbI44YzkC,Ȕ" ?!#/*ŕR^_ KLHs{U1,CTbVt9TUD]6_T~_S2_ЇJ:Fш!"}q>Vzd>ADkt76ʧqaS9L~/+&N#PKm@8PKE9@"javax/swing/text/ViewFactory.class;o>#Nv&FIJ ̼tԊrJvF DRVjr #[rQjbI*#~לԼkML)֌ \Eɩn9@#`cd`d`fF l ;dbPKRSPKE9@'javax/swing/text/WrappedPlainView.classoOAƟ R("ڢRE)bHhKY-wJ?1~?qvh]!1ٽ~4,Gq.zvW9/{~'Z-Yo *M#Iv^M18Z©Kzonb<_.ܺ 1AX&S{ʑo:gcɦ$5<f?UmZ{BXZŽL+ yJ#m+!lhs?uOtu3,ۆ^] c 5(* J\ 5;AH YqFBKS5s_"K4O3~i9C[RH{o6o`ہ>B7^X+l} x`p׈~`+5K-Z2[AV_?,q?#sG"ZFk"ZI<@!riH&\b<X]= PK^s.PKE9@javax/swing/text/ZoneView.classn@uLݚZ*`SH u7MFeĖlL,`ĂwƓI9|w??x'BB\I;Ry;}PoÉV kTׄf7:ʑ NGp߅#<`U88JBŰ'"vMgpQbo|cK9m͙Xso9ڶm2,/Hj/,LVLܠfѰfO4 d@xQvV!K5]h܊ ~g PKXLuPKIG@javax/swing/text/html/PKPKE9@%javax/swing/text/html/BlockView.classu]KQ-,K ."[#P$=z_UE?QCq933_Α">8}gT<|u!3Q QP%=B%W'X=GR UᛞiLHU֝@|Rt[u '-wSI*xuM?\k3kA67_Jo[|J@5zep<6Z{Aʼ 3㉱>r!і$ۇ~CJ4e{c1G6Ht+X )aǖDz-D/Sn#XYRMO:dHiI#acDm~PKw9X^PKE9@)javax/swing/text/html/CSS$Attribute.classU[sSU^)gKCZ$=pRDKچ6RlS 8csj;:cg~g:;DnWPN#'3@>= edrgzG *Q;1MaZh/6#/폆|vhDR8FÌ:_4ٱ?#bhzP<+Ԣф7 +o%B&Ԉi9N-QtY!G_C ;nhrBŠcʴpmyI5, ڦpYTqH؎XGw'ltX6VyQ:(Zg/41eUڦ{A+<ۊ=㏫m+YX? *0hc^yXxT#`_c9yHOZC+F(mVUHPcNcpz ۊ;% ٻ!MkId8Rf±=^n9w~xϲqoġVe3L~4tP|]e0U 2U2DEEYL~QXTSS;D%Eg*inbju7 Q=L3Efc-*(ji \Q2ui!cZ(jiQŢN2-u?SziGziǙE=")fZ%YբcZ#^d ziW֋zqzud$-͢a"]g&>bAɥzN7Uc`@:JIf(F[;;874?AfF`z8O{=xdג4n0}A6C}p]wZ$ljd$=RA?\IVf r+ʬ\\\\9sʵI{%ĽV43e+o%kn7kEPK`^ PKE9@javax/swing/text/html/CSS.classQMO@}  ŏC1ocBHL.&ғ?8-FBa̼7 :" >?Jk*1VfO lfY:4lP6mNf/:JGfkZ“ܖϼm tdVsD Q#KG4&\pũ Ӥzg(^ URlO1bM AܨjQVKF; ܡW2,AʓDGx5u0,1!9;cd1')2 a W:D&X% aYOa4埲*#dE䐟?"(`#oa0E"Y oPKP0gPKE9@6javax/swing/text/html/FormSubmitEvent$MethodType.classS]OA=" *Eol-6 XlHQ,>-85Y*M>G5!Mܙs=w?߯lbS3O=?zK8p,QqWh"0#Ymv}ʰYZ!bw- W"*4m˵Jgj>!LF0!{ Le£DR&윆ICPeԠ"(W5&^l؜!Vn7Mfz̒Ѳ:g]Nj1xhxC,'Tazy7&Q-J\{OQΰ_:dxA?l/6hV]C'#"FQb~cfx?)R33$s#=gc ,b<~c0fW/4$ I*Y27T'0_dhOYģcj쟅0Fvi$Ʋx fBhZŚ?DN2 cc{/PKH[MPKE9@+javax/swing/text/html/FormSubmitEvent.classQ]oA=[-&Bix ɢ avOOMxg!-&y8w=s.^ZHc1r*;Z3о4o ch »KM _%#OG `" אO0#V2{$*߆~WFm%=uDL>y聊 &f%ߔz JcFD DH+iyCӵ҈9+)%Hفnm~'}b~mnè'p{C!<2Iع|WySbr5x0'ͷ2ZHStb&s㯰̑Bە :wȜ3R(N) O,`co)>PK;h?~PKE9@7javax/swing/text/html/FormView$MouseEventListener.classQJ@=D`|A!QILB~% RZ.szp 9I*~ oQJA[q6jy= 62 i16 ]ij)`J׏̽P2,^4,cy|X$PU,LD'jtEOұ'NgG?'ô+[N*r(3 vFؚ/;1Ej=8,t"Ggȱ+r(3Pa3Y}9V,b7PK\2PKE9@$javax/swing/text/html/FormView.class]OAiʇU*Ŗ"\b,%!)P0fwN[ ?xfZ,Z(Ξ3}9~ H0}~C=-w;#0 綘F\J(=q*&CjX %"I?=CV08Ld 42ayd[R+SNG;<;1RkMU鋀SD)"ӡBRTww}DZlj ?r"XCظv'"cGTg"ش֚%:?PK5t[PKE9@*javax/swing/text/html/HTML$Attribute.class{xe4Mri)M) ٙlԊM҅nISHPrU\*\E ~sN\2};&Vc&XԶu؁cFWw;Է wf룵jR#;p\8:T(m;-ˬ| z,jآ9׵vzQX rݕwB?p0ʹyA^%I2Nuz\vlzǵq~ sM֠.k_rAr7'gAbŢbX'NTΎm&.ؐp\X~7pFi76ltGvtA')]p|wH"lgM8.*^EE}D֠b]'#".Q Ư"}^..E{yB\;[Wq1 J*~2lFnۀ} ,/2J"Ln~CNE 7H淩D'o1[v}׉׈%ӕLܧ!yL9\W9.8afy[7c/6S:VwׄrT׍I{u{uuCõZ} Ծ<}s,Hic2b3e615 25mfj;Ŷ0"iWab#LbG3&64IδرLv2!I=NdKSLSNa*ib2M;iؙL3>4Klb2;iؗ扝4_B6}iإLľ.v9b+]Ŵط]ʹصLĮgr [Jۘi=L`V=)!b3{Pǘ֊=d=%4#K3LدŞcʋT{=ab/1{(@UPuLTS,SMk#`Ƕh<08\h}h`w`fug3Y\@ez[jcJvaM#|:ccձ`Ѵ0?M(1%TK6,܄YeY٢d.]ݔ+'+PK9E9U9M9]9C9S9K9[9G9W9O9_٦\\\lW.V.Q\GL١\WBrr)VVv*QQ\]JGSne^YPzÔ=J_YTPYRSFʲ2VVN@z}\+@lfG>|2 !UHlC# c8x$dgӐ3# _@|*52 7o# !7 EnBnF܊܎܉c^~AϐGǑ'#@~<y-;ȟ?#E^C'MSٍAXt),,bMN4,X23,fP٨t.8uJ6 Px-Xpf,-X XG u,(()ک(((y(((U(((-(m(](=}(C(#((3(s(K(+((xwPJQB,_VZoMFkJ66Zm(Z;n-Eٖ&k% Nn-x'Qw'6.pkssr '2{ mPK@~׫ PKE9@$javax/swing/text/html/HTML$Tag.class |\Uƿ7RSJi)Mw(-Lf$I:m$03])NŊZwEqI&~w9w7Ͽf{f*4'SY?d:F'rFtG]టLw'XՒHD (+9X!=o4cd ɍT]@63_% PX᳣! ZWPCn)$t-C.w3YЛ9Cz#kY_)>׭ЪR+< hYiEDA{mJ' Q*JÔ +PST:YRU0J.Q0Fi`iqJg+%tst`ł.LV\pҕCt`Ônt[J *)tH{ӕ`VAÂJV.`N<'v VzRpSJO UzFPEJ S`s㕞 ATEAL˂KJ/ (}SХ RWJJ RJ?^d~**!X&`)aT-*%#bX-klZ64W_rv_|ʯ\m,VgjarVGpJE~ZgehSpdy\V{VeCՁb^ZІj>3ܓ c.3n>|?2m>|80h~$'l~S3?v̏4n~ g1k>|ǘ/0?|"o~yI} Ys/R_B}: [ԷRߣ~@1grB9n>'X0rj۵-Y㶫skm-`3T.i\ӹ~qZIa01Lgv̜ٗקg(+q# r. %V8hw]ۑ*خyg Сm| S}`<Sm/JUߴKmΗYcVʳZ]%RUWN Zͽ# &0XQ$1F8}#OeKB>ĽK-ЏP_Rj7cs^S!4L7ܮg}+h*v-#-|_:Ł _EI()x|t  Y^}@J=_Db2`iGIdBo3Лg#3o(r)PKGB{iPKE9@?javax/swing/text/html/HTMLDocument$HTMLReader$BlockAction.classRMK@}ƶ~h~\EZAKkiV<'Q7 f̾ݏϷw-HţXm ȵ.WGHїAG+3!$wL {NT#)}Lhm%nߗ9 &f#9f E[yzˇ8.r_y]U,c%.^eLqf PKjJPKE9@Cjavax/swing/text/html/HTMLDocument$HTMLReader$CharacterAction.classRJ@=m}h}Ս҅h .|!Q.t?Mv$M j˅.?Jҍ;9Ιyx}º^<>*o`i9P\smx$=]}CG d$:bE&dP=e'8d>!rL3Ɯ 1Lac59q^@ x,%Xj,^eLJ PKMPKE9@>javax/swing/text/html/HTMLDocument$HTMLReader$FormAction.classRJ@=ƶh#(} "H(Dl.v%IRo ~%N$a`v3M )x#xVIhB6.gJ1~ι*Ր!{R dÑ LfrUxFh& 79 :# 󄒩\y3vw$TM@*¿L:$Y=o[", R%W+-@ iX%OV$. ?omZ䢈'>)6h"hAa,PbqeTj:akx1ř 7PKqrQKPKE9@@javax/swing/text/html/HTMLDocument$HTMLReader$HiddenAction.classRMK@}ƶ~h(=h "h"-o]I7ڿA8$a`v7-)ɽxS+xTzhrZpZ} &cZnp_(Ǒ|*ObE&dÑ jNqԖ*<#4wrzLsd9dHcyBVZL}wEߕ w2Nh%+gx|7REYAK0~A +D vp+$.;'!f桥PM.xrsb 3 '),!DP+_2\UUg6APK8IPKE9@Ajavax/swing/text/html/HTMLDocument$HTMLReader$IsindexAction.classRMK@}ƶ}Qr CUXKn I˃(qEI}ofg @RֽxS;xTzhrڣpڗ+ORVnHJ*O tLȆ#XIb*<%4wrw{LsFфyBQZ^Ow;WnO*L:$Y5 iV#aZmW ,U4J­řF W-hvQƳcctP77^`>1La}J8.J_"x]5`-18PKB{KPKE9@Cjavax/swing/text/html/HTMLDocument$HTMLReader$ParagraphAction.classRJ1=ikǶ}h}oڢ (ttF2SoG7v#C$瞛c@a? ]${#NZԥs XVP+?$rKG2 h3䪵gdOC*(ϡb_i^ 2f1 k2>PKZPPKE9@=javax/swing/text/html/HTMLDocument$HTMLReader$PreAction.classRJ1=ikǶ}h}o.E "ZQDK443\ěQdܓss7MXH1>rGn-F/ܓ5v#O@Y0%#wEg꾌j >Qaȴȁ`c<ҘaaJ%.ۼ xP1퓉+oaSi3LQ\)|E"0ǰHjeL"OQeai7T2F1Gh)@xFxD0iY:Qhy%Jg0KIT1XJ؈T PKŪIPKE9@Ajavax/swing/text/html/HTMLDocument$HTMLReader$SpecialAction.classRMO@}H|(~_4$jb0FAl`MiM[xjTNdv7m BN 6 Wo<#[o@b4(ף8"J~9XuKTH˜PKKPKE9@=javax/swing/text/html/HTMLDocument$HTMLReader$TagAction.classSmOA~WzP@Q ֊` $Ein`.(#Jm6}ggf8~z#_sn HLMLj-qhG.!` 4UZ$͡3Hhԇ;qGAxazp1Fp0Tu2iv( 8HɼinnÍ82uaOEAX%Z$<ὁw3m:QLoNZ?tgI ?+3gn^d'i*SuHӴamqLXLnIEbÿ EpE^# (`s ;G9-0@g&0i0G}7Ϲ?8s %lYhX =Cv0cx 瘵UK{\u/PK9PKE9@3javax/swing/text/html/HTMLDocument$HTMLReader.classW[WF+6&mJ!M&%`8$)m^b+JCOC@TNgײj%#ͬfof"w`1yTRlM٭ݝu GJL lT,z,~=_xyn%^~p\ު6@-sHQ20RW kё  egDx%Q'ۙlYۢUa u/E9LqY=t;B[Xr!'pkȻåFJb0 C0m9yp\ޮj[,eʕ!qLR[Q𴿴 .n]^~6۸=`ɐJu$Q1|A)v}e}jɲNC[ u8%-ۮO X$tȋp([ze)<a*GMvsU˗j֫ QVW!eiN{i*UOd شTZ1*TqX ģNI-jbN⨝")4p|ڞ tQOZOZ5|M-F˩&``Rk1A`wKoV- eU*iZM/r|˩&)īGo5^ẍ&\"M0p{6q0pff"t& pW>}| 00qFǐWBS46t#k?1>&5N>#\#/|}4> Ɏwz ;a)3t>FI\SJT,&i<LLĴvMS)!ld|K*mi7n+z:,h0zD_"=r-3fV|gCzؒK 0ܿULB^}^xG]jBbˠ ^ӎzH;evM2ԗ a0l|CEs$ߒIvIH'dP?$PKoc7  PKE9@1javax/swing/text/html/HTMLDocument$Iterator.classRN@=# ߢ.@MjLHp7CJ\(W;7眞;=l[9p;uRrn:ʉGeR$?a LDǕL6Ei:K obHGB [ў*˦%݆ tt~ZtC?" d:b}X0$&͚S]eqH1N.;YCm2=m6%tb%g){ ]*$l,U_eZcsߎ'Q0Ʒ0zR\fx17co2 qS1cp]"9SnXE]װn%_PK?*~PKE9@3javax/swing/text/html/HTMLDocument$RunElement.classRJ@=cbZw}ۛ",DF[>GiѢ =3sff_^l`BaV܉;k[eߨo8J\*/5` s#pjRƋkӾ6wSw/?9-n =7V,vxA0k :J@oE|yW] חSB>7!@4Dȣ]fNi#N P7 r-+"edL)d(iBLyMB0׾o9 Q9rzgm772a<#Ȯd٦ vS0  4pR(LNOM`yF0PKsPKE9@(javax/swing/text/html/HTMLDocument.classmwGDF6**4j! &5u!l1~h?~GBxم2>e _X!W=XU}/14Y/(ӹaVY4^_4Vk^T:rƁسp(3E7Lt-NuCqǪ'RQc1qBTQAeZј UPSkg3*ZMG~lV*7iŒ+HR1,?m7m;x"Mⳛ#YjaNΤ!güs[L QzЈ#ڻ..v6*3>; SS3r$&Q2u qFm $E6i1SduWyҖG Bd8bֶԍ:b-6|њ?LsT*D+@mP( øΞ$6g6z;jer30}Tu4Wx y3]qe)pY)FYZFHtD|*qjbSV I?;ԥCӨ2\3[rLM՛#ْKêECƗ 3jψDwDdԈxAי)r˨uRn]Bf%<)#jd*[SK# NӨe1,Ҿ'.wJXRm2(R f`jFyĻ #pC,)vP# W PZzBF+P'Y|80YX6 9gx2%c~<\r,pwNpv<}"} ɑy횙kp_s>77 5﷞~+Q+cW2OvNӝe9&f&̼soQ̼wռ wp$BpKSd>"Ih}0o|,;s_2\`za OF!*K[ gL4 zUQ'WX(Ğ'"-3)x[lH_"eQwW]O(c%x p>DPK;6PKE9@5javax/swing/text/html/HTMLEditorKit$HTMLFactory.classKO@υB(\XшD6iJW&.(mB%&==s盜; 51r,-gc]vn;Ҟ~Zfh FzCikiQ]%1GH+W BZחY$Vz# Ŷg +|x ^/3Ntӑ#zm1;K{cߖ-0+ו~A [?LB}k//` agk稝皎KX暟o X3DnLEGL)redFPKZ]PmPKE9@8javax/swing/text/html/HTMLEditorKit$HTMLTextAction.class]OQ.][ RE/Qb(c҆خ& 22~=sg_Ҡ~6VASYhˎYدVzV} iؖ=W_L< 0Baa!W 50?"e)!tհĻnX8u#1<;\Tep OGcw-FpUV.UFҖul2V" Yw% C`javax/swing/text/html/HTMLEditorKit$InsertHTMLTextAction.classVRA=, ! .x)")!a.n&_>YGYnI@ |ޙszLo$~ȏʑtl%ʎ^xV_Kɻ+=W\QIύbHv}CJ0<=C:r%raRwmfUfyfmܶ 'qҕ^lh>Cx%D])pܐx[- w}IK ܭ$?CEKQ ^̢)fweQb w- ؁k7C/['/ٺ^RorW*y+V36hfjn@r2@ZZ8EZNc`*Y;""\S\M͟tR.0C2S8D',$Z tItaVHP?˫P;hK.\re[WEdSB>I6TtR-sFDŽmnJtS:d3˕{SLlh@tAUO(FTSVZBS*2U\4amzi׵\6k{Cy&{(RqCsgQCy0p@I4ٸj7'Cnh'dMzqBFc-vgɦcdsk֟G"q:e lcdKPKNoPKE9@8javax/swing/text/html/HTMLEditorKit$ParserCallback.class]S@MUPQ`A%EPkEibi$[o9^8?xv+JΤ{Osvlʖmn K{Kf m2(isRmD]2$J5CܽgXۖc5Hnn!Zpb R!ΐ.[nՄW5[([6,UI"1@(ٴ|gCvdHb_Z'00s7TDʥ0NDٝ0a#4Ǯv]_)p H)xH PK0PKE9@)javax/swing/text/html/HTMLEditorKit.classV]WF B!Mڦ -$iӐ5B@Ӻ-&D5!SC~@TOﮌ`5{g̮> iѝ7ցu qH퉦Z77\ Ebnvc#QF7BUA}*Fšg+錩EF3 eCzdsabrZv.0I%SOZ5=DЍR[)AS.)Rs<ú/t)t k\ 7[O ʚV(J =ZosE gt9J-ou]r-ArI6 54]gtU1yjI o$<вY=O{^8y7d4E>q\3JY흣lCZ2ḮVccBRQ2iR6\蚢;^,'DMoKVz.o&+*b$w66ϱwKZa.{>. /,n1e=NpW.ܵfMKu!-1wZtaFJ*ŅEЦBbٰ3-?dS; 8x{޴@Vnχ:=Fg 6] )9kfZjG[ 7ƪ,xf Ǯ(43uKlͪJFX} Yl Jhah:*h[{~ܪ69:@FA 頫CfD/jdHݳ)Ծ=P_\,q]kk uv>gm`ꌮF*VQj# QwW ʠ&m#N"uNSTn;NfoIGp- ~Yj q:07j"E(~#4I(N OD3|Jq|#?#._'#x3s,Y(UNs"$7ѷ|<<DӾ?nR=F{F=#(U!QA4Bm9G59鈐 rXhD6}RW:VꙺlG#ݗ*pP4-KzOՙJbvu?3%~s~U ձF6.f`99.;+oPKI PKE9@3javax/swing/text/html/HTMLFrameHyperlinkEvent.classœQOAS۞ HEEzT D*Ol +[*w'~(P 07;e#<qd'PpC}ܗ*hyQ4Aw,J"Jb{syaHMX^]"% POtаcb-g$Ր.$<[(%]@==DŽAuepwnI7);B/θv'U9]j~z!r v ŖP_8FjʍȼΙSC#$'TkHSzGX<{+\w@Q`"[go+_$3WpQbp6}0 ㍣l)>&0%MewؗTU5 xsMg}eNXfEYN-}OʱoV\Q1֔enᶵ>L>]fa7PK8$PKE9@&javax/swing/text/html/HTMLWriter.class[OA XrkR"BM*lCÐ(tyI{K =zfɏa%#0k2eUμLsȋک,S6 U[τaNc 'Trx)zeS2<Ү4NtpOOG9~ mI&|߷_$+x4k; K'evRnUSs4\uPߓ^YْRѭ{GxGTP|NQ=aߗK;(4ff46k K0}h]tGAxL#GYX*4Pqi)+/8:o0]!x6=QzY䙸tRpbRMJd;UJeTGst,.DC:E] ,Yze ?Pl(%W: Ml;ȳSQy2-t \CX_1[*=ѨY?V9Ck֤]EbgWp ,=2=ne-oU|<]r>,:nCW_r[ 5mEd,86ly4o4=e+)-& 4vOwS7 W{FiωAtA+Bc~ ]tn=515Co nDݘ ʜLd^8sy99gN%2gJ|1%Ɯn쏁Ÿ9zL bx54hZ-Ju21L^f7eBgSnh?GnEbF\[Ίyei- mf;$JͼzhYfVtP~SPKcI@70PKE9@&javax/swing/text/html/InlineView.classuPMK@}cjAPJ1ъQH:+JO?JM af߾7of5jx75Vp8i7jaÉL&Z|̙)GZCk;"KQmtNh`&94V""&vWӷ]~'br&a﹄ঘ.m>qn&ZXy⫇5V}Y>t^GtQm|PKPKE9@-javax/swing/text/html/MinimalHTMLWriter.classTn@ !W m{/T4iHZ J[ ,S_T~Tٵ(6l93gf?Ȅ!@`jN+*g\浪zZV Ϧƙ@|XsD [{V5C|UV~o5%((!D =T$fPNEVdfh(%557~ ;A-5 ?lXHc,]"]QO h@0-'%v5Ca@+!vM03tdg7XSmUyn"ByԹM t'U+G,f(o!!GFڍc1B й ~% bқk=)y@ĩ%EC *%LrhYdQh5c+/ ]Т2ґi+},^CL4o4;ےpfXELl C.VRVLO3?22 ;XE@Se Rz)DZ9۱O? !77ʙǿG 芸9'ϐ7+^!r6x~`q6PKPKE9@"javax/swing/text/html/Option.classQKo@!Mi*T#$( !q(*ʵ QSpBG!EQvwƿ-7r!QK\[}1: ,j1%#FM@#Au*w@y'pnion̠?(|TyTa*chi~sj[%9 ZN/Za@BF/ Ts!k0Y[)GuyrZ|h$մypbS6w*lTvpo(;$SNpbQu֢,NiqYPK ׮PKE9@)javax/swing/text/html/ParagraphView.classuOMK@}cjAAThExETD侭Ce_IG4 5t3y %j85Q34qϷ<~h5 \AN!x:_ow9F@po\ KXGt~͓DLi * ]$D 0rm۾F-Xb{06]iօϓqd8r%] v{/&Xx sJ(6Q33ɄCoU@*ʻZѲv IQxBЏB#+̱gnL^ɡH: Fy ZgZ}A4&uhT#KMD sGP:-k_(DOF(CX6OZ j[uB0yG|3ʠ-ףͬ)׸JƟppAN>]uѣIeg8^M"nM#F 0J4(m3F#щXt{1fK92(px^Cxm7UyTl:=jbv.FsmGx,Rn:6u0/*H߫܌spvnR@äϲ?㋽9,mZZEj8,`v_جJV:r;<(·3x`0࣐R4{&wvh&*6(hs j |AFe7A䲆sʢx;h%SsJ`qRIg\Rh wY3a6 1b2{ʦ(/KBb-YKz53Mf ("G`Z>Vs ~f pߡIkpd3w+ t GCa#8bIX\_X+ޑE3Po0!`*jk0'#pks;j!W ZB pޕǝTĨDƘ 5Ƙ[ =5%jFw%+͠q/!0]ux0s҃y> 8cc>Q  J =䕌te7 YO+ρ(}YH塴>UbjkKg9mKo [S4;Hyӝo&e' #6& @ 4,h,] ݘ{c:7 uO{wq1<99βP!lHƍL:b;}mCN$"D.N%"P;ti\0/hRճSfZKUϵ!.?6PKUPKE9@/javax/swing/text/html/parser/ContentModel.classKo@8O҄MP^ .R EUJa;' T9X ?((t3s9=r{ >*hyd_K_綾CZ`!;K7S9dxWNS'I\' giߘ9Bd}B#>HS'I),QUa-÷qr#^˥6i}/ɐ#᣸eO11U߆COڝ٤ n;Z}PယoYd"\WjQ is^iaH>ٟ-ʓGT~tK}z `vKoa.C>-zXΡH5O34ʡ*fj߰&4fyk4c ec>f^as-s4+* 5LA2z;LA Ukp& lb`~YcDQƸS|snLqnc}Dnkۢ3{:f<~JQѼ],D+fƫ]Rт BQKw\fɮ126㉍gN399N:SQYh4^/ȟ1k\r5K\l<$ZBTfLY%ӮW&KFpa|,[[ŦC`,/廪Q cFfrEn %ȝVu,l @.@+f,{ 7F@^+x:hԠc&3{`PԫA6hPqTܜA`=6 V'#Uz1ë""r,ͪ%[ }eVprŊp3u'L-N嫀kڧ^&Փ(N#Q'|\ m%Ou.rüj)nڹ5_;o|kx'Ѽۋ~1q¯aK8'.g9Xl߯S堰6zn&r^ GܮhRWI*Gm |cTK@7Rj)I,ߴ0_'](P7 ~(DWUpI{%|4÷Oלn4:5-wWaMiό!~46gSX,bˤX2#GbbYKp&Q{{+N4OhN4π)8]D$ҞU^7]зW޼GЁe,64Ѿg/ N)wg$H? J  ih)am6_q1cHbĈz#O)?^RAcL* 5K4geW2U l XMQU|_PK PKE9@/javax/swing/text/html/parser/DTDConstants.class]r0`)uKZCRCwXh`+ 4R&qC1G_Αm֩gٷȟ}ߛ|?_l:˧~dVdbVcZ3݂Fqҿ0/5μn pΪ8JdjaH` {bKf zDkm$(bYIJ+ Mn`D_IaShi)pKa@s-q U6+U"JBcPQ2"6PfI*6 ( )/dJ;M䟰|>圿n4tƩsy%˗ W૖-߀7-߄oY ߱,o-?:z3}_8~ʩI3PK#5q mPKE9@1javax/swing/text/html/parser/DocumentParser.classRN0WJeWE8QąETEPq%.8!q(ċHE9g'>=aBt-DwikYB;SJOh!IQ_$6ansBi'pNHnFZ3hFYTPK=/xPKE9@*javax/swing/text/html/parser/Element.class]OA)m"h&T(»i;)C 22uӖ9qw?ⅅ?;$݆DG٧-·Kh WY3LLz&jdȚ]Kϼ E wUJB/V)_VJe^2X5UF{ՅC\g,ވҢSsځ.3J:Ta2/#!ݺ0CuyS\PnCJn>2$>5W-4Û|f/EGfUݚW 'hnթ~ Z SW޿8NƮVIAtv 6+PplldPjԅAɦvskt'ZkJeMYktzmN nOn;=V(1$`!Mx pqLx'21igp{ao34{4>G<1I{,3Sa0RChXrQ0(9鞆 +XHGk#_zȅH25#ɍ!j.El$#`$W w=Dnw "Ș'Bw<˲{&PKuzPKE9@)javax/swing/text/html/parser/Entity.classRN@=㘘<@ @렪lIBJEYM r4(S~3T5,|{ǧj=8 W7]ZRX`?R{pJ`+ FŚG:fp\sNq{aGT+٣;d~ԟ*z~WlSc<Ӕ8鵅jvh_+iA՗fjq3-W;M\aws~5m$48휓g C[P W9]-BYF:@   Uz&0Ii"o}EMa e_Ȼ'/f <a2 2UHұ" .ay A9ǐn@a#TT:^ 33߇Kx3a[#1˃OfPKSSPKE9@)javax/swing/text/html/parser/Parser.classYsG{Vp >_^.R |OvUAj L3l)Tv'﨧 VtlQC #0 {/޶#!+ &UpfՉѮdC~)ZqmjgBʆd0$DT`-F9\{a_Ɉ-o'"zS}['/ntօ\hˎtEV 2ŶW6KЈ5\QlxE6wwK~1f^SJWR_ mLg9rsP``G.j8Hq:O৴C)^{{I"lG`ɽۇ;afb|:KgYm ^ PK>j PKE9@2javax/swing/text/html/parser/ParserDelegator.classSn@=8 -M^ P ň Uogi\7% >Bi%-3̙߾hQ@8c'=G˱v(ژaTEhngPz5'T|GNOFJ,.(a=:Ȩ"`'W1a{>\Bывo$d8xOG6 byG"zHX>oS9IJ&F?05 }pw/m=yU\',w^Dd^@X|'F6(Q*hejXI5 EKJX9 ~gO>uqPY+kȞÖ_Q› l^p3if1gy,LOf }BV FQf&]K`Wػ:sͰuд%CLɮ&ns6tXC;E[5»famwY`*:PK K{PKE9@-javax/swing/text/html/parser/TagElement.classMO@q܄@MG@m@U]U .QQRDā&l‚cWGО*Bu,E &;?{r_;E*h{F>t|Б^]#"Kb,޸MC;P2Jm *oRA L^j*'u%a6.2kT뵾ϖ;?ލ"aga.iK B>-4* 4P ׎}L>+b ;&Ute+adYxH,EA uQ$#5\ /kx|Va~.G93﹝?x4E^L`2P-f:T|*f6Ƭw06RdzKŴb7ЈOu.`I %,u.:WFv)M*έD?PK/oMPKIG@javax/swing/text/rtf/PKPKE9@'javax/swing/text/rtf/RTFEditorKit.class;o>#v&FŬIJ ̼tԊ47ה̒"vF e%9)pU l6y%v a ,)\ < l >y~IE!I9 B>ɉ9aE >T$#AهìKS2A:%@aF :Hy`>v@d 3pI VPK{?PKIG@javax/swing/tree/PKPKE9@9javax/swing/tree/AbstractLayoutCache$NodeDimensions.classQMK1n[~YūC"TP[v m6 $xķ[/f&o@%'3$=TzDJ206KNe{?+5ڨXB=5z`M0%ϔVtg.y+(HJb^$48X$*DN!'4&Ү;n8|Xbi[V,&ŋ$*Mx!qj#TZd c$Ehzf$M16߯pjviPiȲ@=T:SKeZ_SIR&Ͳx*Ć3sun%^*HSBN }bwu }i Gƅ.hV|5߬3n_>Uxܓx.צ(FPqqNTpjãr~}kSEI݊G!h"2TnxTC/ ŏ;Qc ?cy]i"]V)HƵ[ ͺ%Ha%3v医 NaAڦ8*ރbdG %EΛ[hWq@W=Te/:yTxukf;>RڕnGjz'< Ap%(1Oa]F\ky j,FrS)T"tJUv/-3Ψv =J+5_95[)E.8ȳBex;4dm-ÅGaQF1Oh|1(J` k;B1mGiLqz y$,_Kn93t ϘnӇnܡ!ـA@a411E|&|W\Ҁv 9;lToBވ~>v3[ԏ<3\~֠ .J܄"5f^uT"RFs5P5լjh_З]wp5:~m 3;z1_U6̠grh+!G z棲VW(V+Cthz[AMG(6R kf[xEn[m)&t @@?};PKZe PKE9@-javax/swing/tree/DefaultMutableTreeNode.classWYSGB܇1cl@2[8•'qi%.Za*)I!UyȏJgvH31evg`Dn^&򆳛wsԞ5&ʌ4@@խua%`4, ^Knw}q#НyG7fښ[2#ԜYJ:my)5ðWIö"Sݲp!0d/I 9j|EjEJMY%P'Z uoΩ}ьS g *lA*J#o9 ɣ)]4ecrmܦZֹSqzc;_aUXy,hgފ((pT WƅCm ⮰{Vqw0KU"),b^XXVU!ff8v x܊@Ƃ}jEeMYzҩ$Zu/⛗U-Qõۣ]avfotĦLXsE v4,9mDK(;ݓYj,/x*߽웅sMxA3Z= QhvNq{^=W|$=wD2T +E0Ca)_(7M@t9$Zr#.C6P&mnf?3lN"mGFC %Obt7`({ѐ}>~ AƱ~YJ3\e4RCѕڟ݄> C:c1lf O#3( !QaQSga)TP\%XX2*TQTS VST߾:;PKZ NPKE9@<javax/swing/tree/DefaultTreeCellEditor$EditorContainer.classQMK@}zT FDDPDxmWHֿA8H}73_r`'I8 0GIrRB -#yGʻpOȏᾐ0$ 杂Os**gG@3@fs@hD1 @3C@-b}h]e *HvFC ~ \.zO%^_Cs>Cgb lEѰ{(!e[(r"_fdd^2bDk0٤l /%VD-.W m_%,g.*%XE92rI>\VFVc| 2 eBc7&%Zݘnc7aYԷ5f1=Lz׉AD27[9 (;w,: :P)NʇRߟ PKPKE9@.javax/swing/tree/DefaultTreeCellRenderer.classTN@ !  p%RR!"7Yvj*Џ:^os1̞svvf7 FW΃n^]Wz6 25Sj֩MD ڳ*j1#{Tەm5eQjne˰0:T$[dHXN,epB3,5Z+EyjƯURťAK?=nQӥu>rSvtSww ( ѲU 聱$!C`q[Z3WƅjޚQZ sM\Qwg;XAʨy#VxiL%gZp69~[)ުչx8 ]ٺLjCy%iIJjL'ޫ*a\/;$غo6|-cv$cVSnbyvN9;s(O;sr:t#Sj=н0үx@- /MpIf%|=+x0Mh ON^㷏o ~~da-At89BmH99)dN`N 92sBL洐99#d΅` !sBB漐ʂT,r6.dԏr-2W[a*>歡e:zۀM-bކw|-cMgS`ۏþK,J$>%$$X*d;r'DQ"+Ūk=PK_C PKE9@'javax/swing/tree/DefaultTreeModel.classV[SV#n6ׄk67sI( %1Kf“P*$Sg鞕֑3gt9o?74h &>7ٰ.y-kW=4t '~AV xC7_3>lǠWwrLn_fA4\[)t9o߉k9b 6A1(om2ͷ+ 6>uBe blX|v}Ɲ(yc,+e0\XFw82\VCzJ(9YM㖔36${a8UzX?,$Do|AO|vZWH,;`H_7by|9s0#2T*1dm,^N]@.+YUEo} AA-DMu Aja686.-]`mhCިT7o zbq7*C;Խ}DV%syishW Yr<2H"bl{5W(ٙTfge_$d[|<2Vԏ*)!ewjk]᦭  Ǿ>-,p|w>s%9Ryڄn]:}7Y;#$h)!-a$3<t5brǢp 4i:xO!<(ZuA7^{5ߛz rxme~+ 1`)t14L5|~ O#Xl8uX1O[adF NDJ|Ow"LԞ4e70ryuw PPxr fa.&P~o0FF'9-b2y\ c=aQ c&2`֞nAHd(x"_87d"b);0F4ОJX¦sZ 9Dt+<&[ZiF!ᾛ7}(( v5IN1p/4uxW 6wk|j|bMQC6u BDJ,{u.Þ ESqIq* b9 ~PbEQ#<6ZYMJ%lH'PK=ڪPKE9@0javax/swing/tree/DefaultTreeSelectionModel.classVWGQ|a+J">BbiնtIX}G&lf39=9gg_ B`P9VN3։glSͮ{jfaԩ(a='pKU#ShʮFcp@ uHzP,[;RyT(W?Rl3WlY. ݲV4^!Y~J VF0mE#vKѠ}룍Uz .bUm"0 <b"dNP`ϢO9n'JEv.Sm U?<*Tz@4N܋L*:tvYeg3j`'E`Vh=1^SRnRE2b,wX1 PG-7ܬ'S= 1xЉT2 Du}ٔ B]Δ[ ;VÑ; \SܓuZC%ezd3Yiֹ 8?Rbp3m0U+9dӰ*hO5)nrZ11<\S.bOa<1 l&qe?*XV6"تo+꾮؎1]UWVBuWsjvqu%0ٷgf4iAP;7Q(9urВd+\RAyqe!rs<Y\Q~ &L; mNGzghڕ~/*Z{Y_.s j!mM3j[a1 ݰս3wSE`!mfV2ݐ\74FZշJ#UH`YĻ.JJہZ*b~n+`Ĥ/v4[?!gY Zg9 x%CNشG4X1Fߪl0$Cy,\A K5! 0Q ^k| Mނ|$_^ 9>WW?}|qxϸSWi,Lr਻4p{0')=)&C)bewB)GأXƕiE~ pqDZύ(sܓp,q'gは H sZ5F )fS>Qx\< Kn( |ze_sws>3̺}~|ۇ_3B} g ؔFqN܂9/DیY DVE! %!r" G)򱰱>ɻY\G,z t vB9gP\]e/^fP^XH_{}Ё"J.RU~$"}!H_=/R^ tWos4dC)Z"ILy=K5amPK*PKE9@*javax/swing/tree/ExpandVetoException.classN1ꊢ Qc {FkKy-O&|8n&\әm?>\G"L".\HLjᄓPs iapkKmT044 ^'ylĐor9J͞Bp"*Q<gdw%ޜsM2A..CЋgz$nuwę1WCErؠI+ZsZ^\{b>v(S\S0옕%ͪtUs/PKPTp4`PKE9@-javax/swing/tree/FixedHeightLayoutCache.class[OA,^*jୂˋ^$Դb|m L6h>5C?@?T3úRSr3g/8`H[]7˘Y׬zCgyZma ѓ.vf:6b9Scq 2ى߼dP1]v:. 8 #+!:o߮ơ:20OYUPn\ hQw@*N'菘D[OԮZEP/.wMr<3@:[*F R"0{\'iD( r5/WH7pـgCžvfm}C#x2u4wd(-bQ o쨮VwVX#}Ƣ1`M5HiXyݭԁ !GaxrG=IXϭ{׊r%=<^jU{,Fb#av&FIJ ̼tT}ҒĤ /?%AJ?'?)+5AC/L#[f^qjQ #!+=5À:RsˀZY4|U"4 @$dIpDxP gd%a\Eɩn9@Y7 f"0l8@a4/:$PKs>PKE9@&javax/swing/tree/PathPlaceHolder.classeP1N@M6CBMDXDBVDEl-*$ G! Uv -`{\L%s<|luq@N[-tYML5Uϰq6#"$thr9ѩeB/)2m4ozn*2|,ewn@r#Nv&FIJ ̼tTrĂ"vF~N"P?)+5?=-( $AA#Ü ֌dd /-JNuIedۡ@+Y@,v PKRPKE9@%javax/swing/tree/TreeCellEditor.class;o>#nv&FIJ ̼tT ᜚㚒Y_ RT⟔\ A*=܂ԼF{ d}^ >XGEEyjBKX32p%e22Zt#3=t?; $PKTPKE9@'javax/swing/tree/TreeCellRenderer.class;o>#Nv&FŬIJ ̼tT ᜚ZZ RT䟔\ Z9? ?/5(lH1QQQQ} ֌ \Eɩn9 v120203#Й l ;dbPKt PKE9@ javax/swing/tree/TreeModel.class}QN0-BP ?@r!k*E *āiMKyƁv/yND$?rN8%ضًKNrw7r ւqK07BG4Eb G)h֚J{'ˆ2'Y/ JN"bqtpƳ-PKzR=PKE9@javax/swing/tree/TreePath.classR[oAfBS b[}015&1!!ڤMiI6R/}22F }9/OJbKB8wȃaqj;#Nw3H0uUzΑ%/7 ҕ :aH!i$q!ەx;9 xw>pR)ƃ3ԻJvw1ځ6^2+$3BH(7Bkvw^n;]t}]uÝE%f#=4#5Z>PKwic PKE9@)javax/swing/tree/TreeSelectionModel.classT[S@>k+U,U-bH_ƒ>0KaBɦN/i /zsr "yFGRwczl^^37iyᨻ:gh%P6:{9ydMZ6bX1| ;d)-{aZl4~/,SÚ[ZSoOfcI@Z:q|^GDC5`-ZbduYJ"J^Gq9E~|n øE #B˶? zb2SP۰RF)y{Sr*xV '}K,"%2Z;@7bmn>QjA_:]yv+mlAJ}avkyF4c݄61d$]$Qp]opf2-:vHZQ&s%o jQd춑{|NW_JܽoI7t(d2~ߏo`+IֿBbPwf䣲O#0K3ִ[2p,}`%Q=ʊ\~_4ko WC0>8︈A!Q 8L!LW>4Fu)Jr5ipY܋*\{7D#3u4Q*pR`Q6QJ9Ze8VƂ@Z[M=2`,j21XW M54MO(wBQA:&+X%JϤ+sb?"g*بVX]ճ3⤛i+0r dm KG n.5tqE[Po|Wq%=7dϚeu4_tK]C9qI=Ï,í'a$:Ba;kR*䣀%awP%2-d5+aѹNnF4G!M:Ks-:kq6Ѧa f_fD6ׄD$E7qHhT/L 73iӧM|Mܟ/ɾ͑[%sۙQr'|c@Lxv3˱_\|/IuPK!qPKE9@*javax/swing/undo/CannotRedoException.class1O0ߵiP bCB0RWKSPPw7FC(9E:`Kߝ!/MbYնpju~l wͫggD@R 7o !¤hcbB/ckTOzZQr]Nt5#?'5!}tu{'[AX3H0Cr%h"N5\}`]RѸicOo PKN7^FPKE9@*javax/swing/undo/CannotUndoException.class?OAq'' ؙnb!P],CscOZV&|>a0V&of_+W%hN^^;'UٙSCmRylpHUh*yn~-yv>!DC73)hwBLflm5AO Cg.DO3ϼ fIuMH]Ufa2|cH0Cr%h"Nh]|bCRѸn`WݫkPKFPKE9@#javax/swing/undo/CompoundEdit.classJ@gڪU"=Vŀ[ R"Bod+i"P$x|(q6-%$ ']a='zĉ/t1׹'T ,8R 6E(pJBc'VwFU Tb0KpriN]C0#z &,P*Bm ~O\hP/1)t=oZ^ВygCEt\p"y%weEjvtkaK__OkZ@Oh9(@r*T>uHp{2B4סFў *>LjF F3hj"9i^3K[DjPKh^PKE9@ javax/swing/undo/StateEdit.class]oA߁-PJ?bR?e56!5*;i];[^xG,[Rbfy{_pr) [+*++\rW̕* NU_(^,eXl:[q;*rB=H(usHWkӮXvŪq^֫rϕyv;0 s#l_QŁ8ɰ9Yyx=8* HӘ9wOqt攜r@$ RS9T 󠟷<*` C^mIO\D>kq{mH'IC]ːNk yPa~mK>F PбɆ^!@E.Eњ˰CI%KwWZPKc䃤PKE9@"javax/swing/undo/UndoManager.classR[oA>˥H[@U6&>hi# VcM ]2?}22~3lqΜ2g_CQQOMt{͑xͷ^rʑŨ:q vG reMciK?P+'v㌑u9@iR-+NFs:huy+a Kf_-v#xFDwr֎\4[v#IkP'ԁ P Ck%|TsORsh R *dw`wN0aj8>Z߼?g- eAXj]P>`TWǞ AQY}K >F{HGW&Oc;ji #[ mǂ{vP|S@kКI3vK*z 6MxR:( o [@jeE2l&ٻxgT z4M.1 ٶS4||x|b_T4إs@Zdii0g_)7#X{fV#{ފTLE3׶.ÀqX{5d`'cW4=~&+:0L|V NX (e븗fNp_9[!y܅m\_nE(iO PDb^JL%Tهp%QS$N4U\#rVDOybA1RLcߣ씇 O2SiSyfeZ]:R#K.)|/PKFhPKIG@ javax/tools/PKPKE9@!javax/tools/Diagnostic$Kind.classSkOA= U| hX j$J["B"ͦt .Ͳ['ZiSQML6bMv=39wf￟V.!z`_nh%,n7[U߶}>>^lv=ۇ \\*3LnwŭlT?ϖ[_TɑD.GDo3_vsԇ;Zò-wAū$7+`!@+ &4ױz:6@2c*dLr`ZE*x6*Cbpt*^$fhT X *&gE掌Fۤd&[KXaR->aCWj\@icAy!W7>e( >f2+X `hHPK a硈rnP{mZMH7Riv@*yRd[a hw2Gleh T5_q4ɃPAɗ6Rp;>I/Ry!j${OjXRJD#6?ÐOH+CBER9̣D.c+i Tx+6xM"|¦]ʱ @&r΀!NE 9(UP&P>fF<p-9u͙3\Pg}88w{DXySv#ceep3ф>\J2]ۦŅ҆aܵ#ϊ(7KYzCJ}5#EQ5 `?-2ޯtZ Vh F#Ҍʻ[n\L[xI#v&FIJ b}dԼ"vFļt}FԂ" CZ ֚a y%E Th[ہs%e5c:Gd#M0@V6 cbbN0 * PK_PKE9@javax/tools/FileObject.class]N@AP|ĭK %vc{Ē2ejx6>et:Ӈ~@?ӥ#YuI \^kˑo"ڦiJ0)FPr!ͧX=鈫)iJ1f6'gF7zK.f>fe94+k!YO-O+Vb#~U١[J4Q\FFJ݃PKX(qPKE9@*javax/tools/ForwardingJavaFileObject.classoAǿ mm `i=j>B4$$*D|[V~4w>e!hgvfoq P#E~!:mIS/+0n2ܟJRuiKpgժ=ծԋVxi:!;y(XcKrmi M"m=@3'1iEG}ʰ?b2׫/N%7&ɰ6+]#a2cr{YSkC~¥@J`8GtJ'ϧDaD!Dӱ/Z_DbKε~u-.j3uE``8'M1cd"m[M{,(Jʠ@pW )BIh"=e?A4-lZ4ߦX;!Y=LQJ1^qjxb8!#G4PK|T(PKE9@.javax/tools/JavaCompiler$CompilationTask.class}QJ1ֶjՋ7- ^P,(TK([cRm?J|-zޛ˛|{pi-mtKxWeZ=pHrKuLFVinP.s)\ ZJ$oh*fp&W,ƃGqNX 'p-w!mER̕Ү/Z~ģB1ӹI$;te&ɦ)q!-.ȇT)aƒ[+l#ӿahoC10TPU*.|d!Ž&u[ԭ`u+]݀W9D~PK7'PKE9@javax/tools/JavaCompiler.classSN1(x1/kL0k8,4KamI[xPƖeɂ`CPs xHB cS&wzCjN9f{l,)uw͎QhDo $kF".fϔJwb싐tfLp@{6҂V.B"NDRϫ.YտtLD$L Yf郶 鮶5TNY",m?,melG;O@LdH-j6iQ\ۋRT9p.<Ō, 8fsf P4A軰7fURi#:>PKu=PKE9@*javax/tools/JavaFileManager$Location.class}O 0jck\bQ7XBDT|6Ao;v0A# ¯Qk.y&JJ2 =L .d{8X&̆?WΔ̦meΕ(jxOw*S,wBJQ mϱ'X p04;ha#tPK/PKE9@!javax/tools/JavaFileManager.classnAS[h-mZKj5I($Fغ6ZG=|(y5779xb`a'r]ǷPl;-%< rlY#PVv:~cN1䆋ԎR[4> a%T_uy34(T'0n fu@6ȐaH*8P s+ϖS,H0MG*z}zzULOJ?Bj|Α/owz5}9T4S-gfeԃx<=?D]js٤ʚ X%<\h0$vKrxlq;^:b) L^ْ{_OIJ/"c:U] M8OO.T`TL78;S )Ĭ芙n9+R O_#!?ˬz]66z-[F]$@)z\𑹄eM5A Y֐X\Ոr['6:n7[-!~d7"Ow]^'aPKH7>>PKE9@%javax/tools/JavaFileObject$Kind.classSmOP~.uM)[A&om.e` K?Q|鈁h$~G- BFs{N~`9 ] {~ji=%L{GB;-M>C0_Z4R C`^re j|A6=n)]f<״w) jru˴M/ $SUJwva0D )ȶ]bSU|! q0@ }!d*!դ= }%66ۆ[ѷ-u&ftދ>'0*?jc|0AAq'!V jƴ¸vۅGF`#0ED=KE[Q) \2gQl:gP(~2RP\)/0Q[ԳZK^FO1=U؅f͡? Gz_` ^o_5$ ,PK^K_PKE9@ javax/tools/JavaFileObject.classN0+@(%P@ڥX*! \9 Mų1<I-[;>>cEp4fѫ0Eka2ظp~*S}F8Xc:+Y6:GV$+87H2 yB8!j2Mk#zZpZ֗ze<,ȉbE/?tlJkv$x⥌ ]*}\U5k]фV; 먆MkB:Zخw;V=ڵwyPKKPKE9@javax/tools/OptionChecker.class;o>#Nv&FɬIJ b}<"vF~Nb^RVjr #`fqpiAA~QIj D#BapIQf^'#Wp~iQr[fN*#z l  b`L PKkI%PKE9@&javax/tools/SimpleJavaFileObject.classTkOA=-T ~iAebM |[uwJQc?xg- ,4|`gz9gΝ;~ #:1ھ-Q䭰/ i2m90V0,!Y8%堩u,3Ī`HSuE8BdX̞M5٥sn#T7S3m`L"jI pFϽ־ SpkyBP fWFǖ7, TI\ra*=u}0+.s$J;|'倘;HJ1 ff@Tmʝ"'x"H:~ ])\300r uݯɆ:"|e[IWlXe4 ۖpjlp_үUM _irŒBd){cO58\ʭp'TB*3֫PvPfv*C8QP-nGmh4A ! FAIדҾV"W2G9`H{9}Nku#V i`b5AO$iƒE>"Fkj:fOV2MNvqt@X@C/'ywtAA ՎO Vj [Scy&~%g]1ͿXѧ5zljNNS>"`A9@$sMdӌC1WӉpgʬ> =HE2gJM $_haq:[a,͈Ume_7Q1)Nؖ{<Ly+xPKd]TPKE9@javax/tools/Tool.classn0?/DZ1c%H At`2Ԋ]9k_ЇB\DQz8~;OfEh C}Jr(cΕB\v'\Sqd6ue SLS"g&icW+ݛfz,Xx4ɥ}*t<.)xĸ 7/yTewcwaM.PKĶGPKE9@javax/tools/ToolProvider.classPJ@}h[B/zj=4U A7R$YIҢ'Gi(A0{o~}|@߂0\5v ܝQ~ZF"`hԍyp Bӗ-aJd,2د画 OETܭ@d349U9ϤpkOb9|6W 2i]T h2g8z-ZenhNA{.hQoQwFU^uV9OO@޿o+KUw J!.UӒPK`!PKIG@javax/transaction/PKPKE9@3javax/transaction/InvalidTransactionException.classJ@ƿMDcڪx[tśT<6]J6< |J={ovf?^#`8~Xpk̪R[]\MߩE&#ds7(2DJ+{«r"4BC;UZ͋4C1%C'-3Q.}P3k>N#<z(=E*aNݰUdPM&o':GW)⤌yg_NF>ֲt5|No{xwPkcOPK# PKE9@4javax/transaction/TransactionRequiredException.classP=O0-u&]#Fp4eQZ5e.V=0L&a:"f[SibKVZf"\]5C{  ^s|dd%LϹ2$ri2yu/[{etŘ*Ng/zbmPllNW/ć^|!Tb5=< PKIk PKE9@6javax/transaction/TransactionRolledbackException.classN04P(XKaU7TĂ`ڪZŐ8uC!>:j +nsYUj>·ei*ǛU&\+Bp(n Ň(2J+{PNr*cԱD!C+QZ-THsNLaf`՜AS<zG(=[ߏ)C<*&ʙmqxj(FTqRF8{ƳC`bs@M {pP.ka{'PKPKIG@javax/transaction/xa/PKPKE9@&javax/transaction/xa/XAException.classYS@{X`YXAP< ނh. E6fB%BpZ!P-'²%ч0yha0Jў_KFʚjւyhe0@QJݏ :1ouGg,z#K( w|||E+AKf,d3(㸞JW ,mK[fxO]MZWdr-p$qb6ё0\#.:"W=\! ⚦VWJ@d0Uveti:k=-3孓N-NfC@fkۚ/rͳ&f=:tfb\8nzc 7>Fa2 W2h% 9+cx ĞYnj~QU?5 r[R~<`d\J,M*,fTvap 0 mЎGjĝ]%AEx瑇%.J| WJ<<*5#ߐ&-KO ߖSʩ%ER蟜xD3#y|x/Mj3-yJ$dibSFkC1E/PKxPKE9@%javax/transaction/xa/XAResource.class]S@vۤ@E6~Kn̔T#Mdx,aeiIR./(dzH"{=~?`ުP#vXSg<$\?0<%4* ,"= 'mXp|7>Fwo OpN]ˡЖ4ێb-]`0+o{&۳M,xηox~і8a{ݮOhw'p]I6J !nfӿCm@ &Оrjev5IOfXR.a?ÁHFv4M`}ŝnia*<j*Lr7yz1H(:7̛]ؾo%zaI&7d˚eh"ՠ'ۤdk^.%!E}$D<غ_ ,2=2V4umX?Qݲi;C2^ A.owqK7d lOWWT-|\7F 4L|b8VcSF`G`pFpx&;ѸNqXǢe wC (O Ɓ ؽ4xţCx*{3cZaӐ}jC:cdg8\(ȯ>2I6JO!&CFTpiYutiw쭤'ZfTsfeJk+|yu&w|zcfOlkf4X-:APK_HۻP>ޭiU=YF$^lǝ<漤2S*eQY%D#Zt+h_Ľt!Nkn!A@},HxDMi"6vK5 !${8LtmM5I/^N XՐ겕=OJyM7䕚NPK,bkeYPKE9@)javax/xml/bind/DataBindingException.classN0?IPHiL T:`CA "ZuwR5JbBbx(D}{x}p `hQ\+Kp1X v 8wHyľt9< uo M$N!sGz?3 5,7`"uUqngPy l/h8 Wu)$8+3+ԟJ턠=wRA%jy_؃h23PєU,=JZhȸ[`B7*E) ԉԕ PKWs}*#PKE9@&javax/xml/bind/DatatypeConverter.classmWG'BDD|5`T0 l|>9}$ÍrݙΝ;ɿ: S!=U=@7ٚ2?`*ˡnzY}jT-=؍69C`&S>UVv!k_(.8hTIIuohb4&[]. 4vC9&0d(;XM^ix&}XkayOMTFV!0=RVޮGZk(dY$4A*: F9;R%<'Jn7RVg~#mNU.U6"*E&1kCQd\ZKqRIU=[e*`G۲.ۓMu ESMya%q;ȞҨ$t}(:*|>DOdIWPE;""pw3AL"2:]p_|&?j0T\+N-$Ľf(xg,i>AO= ðE-hJ-5}F BE@e }ϟ<~M?'r3ga5ɟq :FN(4J.L^D(9s1P"D87F~912J^+SWqͫ(9 %k(9 7"r_SL)n->mutL Md6F@s1NJ Jށ#y[#-I.wɌF.K.ɬFޓ*7@cs(rFr^#KKxFG#ԸF%<-< \Ȣ$s#%I c5,oa^W^@{;xe{E[{z%~یчhnŨ}V1NzMD1Gm Mo<1VdN}#$,UPKxa&!PKE9@/javax/xml/bind/DatatypeConverterInterface.classks@V-*wj jm@F:LKi kN0!trܜ삤F7Y3?4@rBO]N}SkrqN;, Pn_NX'PSomarklͭjM:`ͩ7& 2uF9e@2}1GZ)7;mǨQ.DIl1QuuWQ0mKzEtuGN\u)t51.4UZ֥rSG5msטZS0 2cW }6eQMǮKj=<{ W2 Q[wPE}P?'ﶬkJ_-ȋu>PKY CycPKE9@javax/xml/bind/Element.class;o>#vv&FIJ ̼}לԼvF~Nb^RVjr #Wp~iQr[fN*#TH##302I&6PKY anPKE9@javax/xml/bind/JAXB.classmOPse8_|snVtE31sa3֔bJkܿ>-هe^J--퇙P9<Ԟ?=x }[֒ޟ~y$KH*ծƍ4T^SzNz#+\* :-TYf!5P1*wTS]aV0vG]Ƚ\4[ӨLۼ 泮΁;H`ӷGp E)o8ɆrK'CⲲeE:պ_;z[]S58@fg*vKa6QU4j:ڑw͉=J' L{6e}`ܾG.;\"p0).\tAZ2C+Q5 |M- e}IK!%-%Ʀeڲ,OԧfG5{pمPyyss??*lC`^ҪT-RNnRLV5}%~IZAJ.l1gQf4s̤?J݄lRRº`!c3d-ʦn\J(bnGI=RƎ*3242NTRC5H \˓yʺz ]:H:Y^]oL-_a|o8)_6H|V&=ePj w^'sC5 8ҧA#;&8w-^O!}&/Ӽg;q ЅwyxE;{g!x Ah |s <6:C:B !(B0G6L:&a\u4̠em^?F<,8,O)f-@f&:zNؚ"1L64B+eFv- bp,7h ڮ7-Pg, ?cM1 ~EƗw`ơfM&U۬ܬCzyE /PK=>so PKE9@,javax/xml/bind/JAXBElement$GlobalScope.classOJ@}ӦڋE*%Rnl$IIQ&zEpyzpAaw&_B,2#Sqsp~a8c[\\I3NgZ+N8:%{7ʧ^-3ŽT $OBUO$ msLHR Dr12, 'lM.A;7O C)u\^k 67PK3PKE9@ javax/xml/bind/JAXBElement.class[s@BR[(7zP޴"ڛU'Saovj:!tHT?~~?M Hs{N8S.K鲢IEU/Kow?jBu3!4E?h ~1URTES?+EiISjtӈX)C/Ya<O;LtI!ysD,U9!3JUB8FV,iUW bxn{d@öP~LC0 8>K C̚ C?5AUf"孊DjI V S0?ܹJm֬a6X嚰Xm=ׅy]7u/vMm:,&oiԱv:h3sVs2`g tOLP#ZT4{%V5jdYGTՋu Ăx4F//U} ( [G o#2.o'Fi_ 5O`s,6 ѽ/KM@[c|>'/YXnzlqJ`+{aq38}Ƒ560 ZD=[Kíeܺў=W.y̵\J PK6MPKE9@%javax/xml/bind/JAXBIntrospector.classJ1ƿlmVI/J1"((KE"޲PSvew[Xz<>8{b3/$_Ű7S1~sx~(K(f/ߺ#r'J!jp KȠXF9MWF%C =ELvb]P& Nz" /o9su M]Xx! B?Ϳ$p*#3ӉO pyJ6uh}6"([qtBSYFp$q匠B넥 uMow;&a?D\C]|I^%5Żs( y+l9ZĖ4h` NL"ғUW4BcjѐʌXaU .J[X!X|PKaPKE9@(javax/xml/bind/Marshaller$Listener.classPMO@ Q9Xc ĤA} ,)m-ă?e|[&esd?^m#C8X9x*;BGSRw\2چEɹfr*P!=A8%dQ,#<@-ԏ%#VOV6ñpp&좚/<6̈́Z/SjKO=~oeph?PK@@;QPKE9@javax/xml/bind/Marshaller.classUr0Be/ekYPeO)0i-:"uKRJ5>J!Ҳ s9}`-GL=oMJcC}!pZ> [\A[skaegy^%p2D셭Q {wXrYQ9.(gjryWxW RԏQP!Xs6v?ʦZl\?ƴ)7vYjfjkVlTY_w,%p]Ȧm겚Z\*($p^h ))O-&&m X*$SKJjiFB qc+zj^+3/ fiT'qݑ68ts=>A1]aSu,NRQ]֖<S(8YゅrDnx8KevdRRI5OOьCJݙ6b9%YE)Sz.eм[u&Y^.AftE֐컈+Jfc9p }0ؓ%yOuتV 'TM*|tR406Bii=]2UV8c"QRV/*-sHct+vO_ 4n)F֤AGNmHUL.u̬8bBdk+n>O1q2,D#Nv&FIJ ̼}ϔԼ̴ĤT2 AP?'1/]?)+5( =,1'3%$3?+8(9-3'Az #F1201+02I&PK_fPKE9@)javax/xml/bind/ParseConversionEvent.class;o>#Nv&FIJ ̼ĢTԢ<ײԼvFBļt}d(#Ĝ̔NFҢT̜TFIl끌 Ĭ $8PKoPKE9@)javax/xml/bind/PrintConversionEvent.class;o>#Nv&FIJ ̼̼Ԣ<ײԼvFBļt}d(#Ĝ̔NFҢT̜TFIl끌 Ĭ $8PKPK]%PKE9@,javax/xml/bind/TypeConstraintException.classnAEot oፃIleȊdm豚e,eGEMx`XtWW:S%xFҾb:B5o9r*[HkW82CMk-G֏tŔuԹPw뺮rtv|h9CAOH"t#$> gw=o?pb{F7inއxpM ;5,ezcJF*`hlRvݶRңf(֏>>O*.]63]gл9X©jEIL31SS:u( Kg@9Ƽ1-);OQ|7Q6<ty|]fXa̰}sbUzUAxh~hA`Snvm6 lkPK7$ PKE9@'javax/xml/bind/UnmarshalException.classN@[ hEQUBL{0 x]55 ăCgKcT(v7~ef>>԰Py>5C o9Cܾ'_N*`H5#3ashp[X l46)W#z`Έ%FNbj1jXs,EQX PKm QcPKE9@*javax/xml/bind/Unmarshaller$Listener.classPMO@}[ D?/EVb@bbA待Eld[˓?8[H=̛f>?\bρP@ spRB='"ځP1D'a]P& InE]QD1=a }%ֽUkiӢep-ɰ{п]7oXI->76E/bF uGJc:0BrR2p%,k5bfmڅoPK@YJPKE9@!javax/xml/bind/Unmarshaller.classVV@Ji/(MZ. H ÿ]K0Mj"?|솶<&ݙo:??"l;ghl"pS=99@T\nX5Ć'Kב2Ӵ\IУq'eI:$H*5$x2+aQiA˚ZlJr)yISe~(FG.r$N~HW!z1YZw\nD_Tlmi&e\[7 '?xPaUAL+5WKBM7oi}SP@;Ɲ%p|Pe١bv"(ciS/YExeL d%ʙUq& ~cRF`2nw h,]b0v,/Uܥ`ЕsudRz)-^[N e)]SS%;OfTnCX &6Yo4Sgwmf:_,H3V5PǦ!6u-s.>,@/h*+ߠTXZ2М&Pot49sz 4>M 8mz*? sg _C7ø\G ⅯޏoW@[p繃!'=aXUcaT$C< ir>i.g f)< 5u\s@˂byXҕ^?ҳ`W/祂}]M`_KOҏE{ )GѶP/PKhhBB PKE9@(javax/xml/bind/UnmarshallerHandler.class;o>#>v&FIJ ̼мĢĜ"ļ R\ _[ 49?$53=$(4ADCkF.׊ԂbvnF4x9F8%e22H`qH?] @ '# @'fbPKP PKE9@$javax/xml/bind/ValidationEvent.classuAO@XZDQ3\l1`H,eRֿ֔26$|;zpRğKD"BT rVEд#M`hDh\jƻfDŽ>Of{&ɍ bcx1("~+ nombx ftcJLhu&UlaB9t{,LO mQ]gt}Kby,Z#Nv&FլIJ ̼Ĝ̔Ē<ײԼļ"vFRļt}F xS:1ݟp=Fovܸ޵5ƻŖ]|oR&%]EpYqxݪsnNf'qܹWd( FY?XDo/Ա#շMKceyncM "D"A q~Ћ?X*$=L~PKPPKE9@(javax/xml/bind/ValidationException.classN@[Jъ@jLTV9 14\  )y-O&|8[Bff/3 {>Ss:r̮pf;Ӟ T_5+3pw`_aAHCg|C{]ٜ%\9um-/NBѥ #Þ u'?YN>6(-5BKoycg9ʂޏOJSFgS(^L;P@Ҍ*B]z6"1XO1lψ9)F#4VgFNRjK 5jDs,X'PK{օXbPKE9@javax/xml/bind/Validator.classJ@ƿimj0$ 8p IB?rX޲؏ ؖ=w sxZ$2[ZU({LrQDr!'T0\{RkS]*Y}3[3-z;xkk竞043FD9M^oH:/j[R0TTzfPz݊]} vP+>\PKC)PKIG@javax/xml/bind/annotation/PKPKE9@*javax/xml/bind/annotation/DomHandler.classJ0O6]]9 n؅0pUX;tټ|(tݰ0 %||\.qkN$_*Tjĩwi2EJ-8`/"Db)`hF<uBx80P;qF^RҌtqZ0~v$'EB }ʫG TpZNiA9f6r5%}۫6kzxu0hC1C"Ղ#]k}LNk}FY/PKf#PKE9@-javax/xml/bind/annotation/W3CDomHandler.classT[OA=@Wjxm D! $6mDzd/fE~`ef:ԥtm|ؙ_k6,#~OܓwK^XqyF1(t_lG+V|!m2 `a-rl#0NϐB/bq /ȢWsqaM=( |0TSf7>j b7D'.kBHZ0~^ iM\2vNRX 96YtZus߫h];DŽ?SK>F2p+Qn~+ju?]1dLüʂB-2r_h/fFs__Bƌ^5s\ 2M&w̹{ +ddx'ezfmX,oe?̢A /CX&ٲ51(EqTTR]r Fu|PV6uyxy4,)0Hd[w|!0,)??괈cV7WI6),~ QWn3Dվ& ệ!HX" gc@YO9iHQSTȌ{ azm5}ZDל\冣*}b(Ј<%$I*DXmJV^(:6.h56OBb‘q%^=ChOc۵;PKu8MPKE9@-javax/xml/bind/annotation/XmlAccessType.classTmOP~.n _PTTIx${!t,6~0]Xue + יE}uh1LkZ2&}~ۣ |ߵ6Vh})>|سRF)2D~C7L3a~U3  dH`&Y!qMu1.RbV;WCz&6`vG X +:؏~!UBz"18sW$ @/I"4O{kOOv1zWY/FȒ%XOğ/IPKywPKE9@0javax/xml/bind/annotation/XmlAccessorOrder.classMO@߭`@Eh!jMrj"b4Jqɶ5 <QƩ1vgfwf [:43rSFO} vbƭLץ( VاPGFr ɍu NO@v䨄N(Q"PjTIT-G mVZiUAT)}4U$~,=)֏3ʘ#_v;aPtvؙb;b&g[<ִ'OʵK2]* w:8q% KhX W Ea=u6PJwPKӨA^PKE9@/javax/xml/bind/annotation/XmlAccessorType.classQK0/u:n:D`=upR;Q|;gFJCW'2Q%]׷8  5 gq"͵uJ;0I? 9 $W};@0`{%4\C,_Ay"q< G|[}iA*JOR*;tlz"kI FcWP,BAH`Lu.fa5=q5!i~܆ڍsr3`0C#O߁ۚ0GTt"^=l>=8þOTZRsl;;KԬ,%a!j7C#op].| ~ɧ$3Cl(JO!0 L>X|<1@qIO/R*W})F *=/. zbJ#^dUislvo7fH՗~MK8O5H\ZחFQf8Xb@8D-mAJ\/1e,]]nSkX%+D09"X^6Ɉbӛ"-Ay-lcSŞ'oPKdP_~PKE9@0javax/xml/bind/annotation/XmlAttachmentRef.classOMK1kWU4WPDБ(+"f`[?߸{ka[UZv=}PKnW w PKE9@,javax/xml/bind/annotation/XmlAttribute.classQ]KA=Ge$kOJfE:h~@?*J=̹s'[\X1'|S#ZO 7rOՌa!zlwpuvC\[A`W5Oz|ǐ[S⍇0K G`]H=1+aC? }W4"Jns웨Cj#=,(n0[ #th䜫PJKXA`.p, 1Jx9XDԿj ;[/39N'I_,(JGQ %v&1!EBGT>|EL UPKkfM3PKE9@2javax/xml/bind/annotation/XmlElement$DEFAULT.classOMK@}Ӧhj{*^Aj BЃxݤnl J'?%:o|~b?Bp/|VbsƵ 7Tc%JMz^fSChT)X'RmydtxA;tw=ɖ@C2ru]{t=-P{*-8X;&x+eiO gU j: fsS,AE{FYs% oryeF5wM4nPKKڪ*PKE9@5javax/xml/bind/annotation/XmlElementDecl$GLOBAL.classOMK@}Ӧhk+wՃK*`JIݲ@-O?JMxx3o>}~8NA\eaDLHkK'.x,̕QRf&\B #퓘ds;Bxvg`JLhc=A!jEEe.TVduM !/U3u[kU56UO+\],c7rB6]l0&M}.zf|}PK/1ZPKE9@.javax/xml/bind/annotation/XmlElementDecl.classR]OA=ShW *|} lR O m:]>QƳl4A&sܽ PؽW:NLֶJkS/NmxQb`Z`>WFnh_( _(0Q23LL TvDCϩk 0zoV&8[[{MiXُF:Ǫq jET\v^,W*9mIʧi֏'mfk͛Yun5 GT5WjS旓q]`u%]ܜuSF?Zտ]r2 Zx|%>0r(%cO1ObaTHbiT xe/3P _!^a)(Y@PKS7PKE9@5javax/xml/bind/annotation/XmlElementRef$DEFAULT.classOMK@}Ӧhk^Aj BPZnQl6l˓7k/t̛zp \TVZU服ǽ>ݺIhiM:g({NhNr&Vc&tez\eKL,U͗>Oy)!+e#:+chYU\.#j!7csuW49l?ήF}[PK{HPKE9@-javax/xml/bind/annotation/XmlElementRef.classR[O0=u7n^⢯>d^ӘTF!#]GX!|ߌ $$CsN}+S :|g_ O5MTe>ҒJE C*yWc(1dQ #{=O#iEx_jD;r"@az%< )c=z~o;I+̄8JcJ{xB!!CўZ~]h DSvm =wH~Ԯ,BroWu*:Z ܕ\X)%z=m;~21K*N<*Dqb%,.VȜ"C ei;'5G 1 i[JMcPK"=wPKE9@.javax/xml/bind/annotation/XmlElementRefs.class_KAϵtY>Ib-SJfl[>vYqgEZ}>Tt7" z;߽0 UBcfjc}򕵉SN'M`8fB~N=*9eG~o0P"/O_}KBqLƄiOKB.ɦCni#y10NS=04M `!;!J Å^xhuK#vB-&,P:MBD׽f@XU!yh el^-.rGQ~^>PKNPKE9@1javax/xml/bind/annotation/XmlElementWrapper.classQJBA]ݴ̲$A$h{u9Z}@]ff5k+sZ0왣}k=2ȑUVܻ|<COa8^.!#RbmmWCr)-') gOƼGQ-]E0X(v4 uų']gFK83d6wr"l![[9OS!D\yGz3R7y{ݮ GSCʓScׯT˵C^n_5JyFo?YR(8A:66A ئ3KhSHcχ#oPKYZYPKE9@+javax/xml/bind/annotation/XmlElements.classQMK@M+ɃXIhJ"Kٲٔ&)_G/"vf5XH+ cB*3K}-Si&f L  ٪{.t) (ϸB1+g)Bw-Ue@8 KST>\ZVP)0bLdD'|pZ/l,?T2Kh nm|l;bda6w.s=㠂#X.rPKD PKE9@'javax/xml/bind/annotation/XmlEnum.classKK@alڇDǢ nA4PQW8 S&I&k.(F,ws~|8FBaw|bOBe~֑FF~ Ba:# tw+cR?IrP@sDg5K12 ob(}q%~^ n ŃL@<2a+Й?H/Rҟhð58Ƚ!ezWAP{9"22,, uTDFhT7Id 4D+`kXPK%0PKE9@,javax/xml/bind/annotation/XmlEnumValue.classMK@ߩՊQ<I0B EKزH)_G}}O8EM0-N:]%74X'j70fdR'A8m+ͷHu2j+nQQhNuUm:QMpS&Q %"~~H!᤽%eQ9g&wŒ7ѝO x[d`bcv._+HPK"PKE9@%javax/xml/bind/annotation/XmlID.classOK@DhWy]IHJ"xġllݔy*!ξyo.p" NB.Ų"WYHc*+x,u$tIhi&bO!u# n u 9q.~PKPKE9@(javax/xml/bind/annotation/XmlIDREF.classAK@Dhz zt'! Z+1ie6)_GCy̼;Kù\ɵXZdʼiLYJF<:0K;4s^hη?$tzs4?#&Tj2[nI8uEhm]U<ܦ$$5#\̸a=\t(= ӛi0"vka΁U{;`#'1zvPK PKE9@3javax/xml/bind/annotation/XmlInlineBinaryData.classJ@_UB4֕-1jR/ed"4E91s>?\bCp> _}ufRj%5H-' tWBOQ2"~d\"}R1"EBD*bN8TDlX;"4B8SrRZ=0 U[bOy8qƮ5 ۑF<B&ܩ5R6¶;8u PK3fPKE9@'javax/xml/bind/annotation/XmlList.classMMK@}֪UOG^{ b!%FezxoiگOwhz(Z+i?VVX5h=v ZXUŦR$4oxlgʤ8_U[…\zQskq.Ciq \d͠>?EA@8/n,ɫ@ˌ=t{APEm ;a@(G]V%~c{X3IGN, '.PK{kPKE9@(javax/xml/bind/annotation/XmlMixed.classAK@DhZyK=Փ EIevSҿw;yۏϷwW8 zs -2eBSZiUiscU4.}BK3lι $\l_Ih="LhD^zpTƪRe7ܒoNزXI]?R|0yKGqD8ߎr1c뜽Hs2+h< 4( Ž{ ~=unCq 1:|PK@6PKE9@%javax/xml/bind/annotation/XmlNs.classAK1筶j<^ xɃBVٶ"xʮ%%-ٲ5T 7 e||~p2sY:"VYHcr+ʍx NxҤ.rbC4?կ$̸Ʉ'Qppv>X2#[(Y/&FyU$|4" GQeA*ּ( ز%4RW?\a4ׄX)^@Xs* \S!6Z} m7v.: PKPKE9@)javax/xml/bind/annotation/XmlNsForm.classRmOP~ )eܫ/tvl1 Y,2OXM_R ?h~Բs"hBs>9￟W-ca償3̶Զq\먟lޫ-#0'U;]mƞV*ִ)hJ DUQ+G[7V{Z3,ZXc; R.dF8 #)R9m@=jfrBYQDjYA qytzno[CRs;jr8،CB_I8VߠE.[XF6&4za+x5{to¤K[jGr û[RMydx=ɲo^t:F-dO7Q\JNiHc誇v|(FELdLEY(MX<{Z9H`1tMH"BCVx%D2GM)_@4$⥋:u racOJH 2 ߐOQ" Ze@^be 6v-!F,8 #NIVf|U b?PKSPF]PKE9@+javax/xml/bind/annotation/XmlRegistry.classJ0gRDYpEZEqKɐҦ\>pfQ0COfjrQj&SNV>&\׮jQJl.gN`p]a"aP6UmKV%ču'] '7ې. 27NK"~Ko#Q7*g盧pIξO^ј@Xwpz6\APe0&ªȸ/v  Jv0#q0ӌc^BBPv7TIoH%x"(d[yVH G^b 峊@,<&uve?#nS pxi/*Xdӑ<_/&Eiy>EMJfD $QPKL(PKE9@)javax/xml/bind/annotation/XmlSchema.classRN@= IBʝp}}ҀPUC1C0ZFk<cQΙ9gvzxpM #ky+@__RHwEA`:M]޹&XX/~(w?jJ=;i"_wLTBMK J.i!4I Q.e~83A}r3NrR6$dU|zjx2Fz\X`kofayt+O e 6~@-?;&zm4ȰRgvI= 3j;iU`e8ŕQ gn{Cir[#x0pxa!8L2!LaYy /y>ah?_|ڋGK|LX*Ұ AXoPK&"4PKE9@5javax/xml/bind/annotation/XmlSchemaType$DEFAULT.classOMK@}ӦY*wK{U ZM-$ԟIGo:o|~cA ,V|i(3˜ $L/Ozirx*ݾ*[7bgM0 {JNcoH:HmXjL* f$p:~2K|!yWɈ<lf +mpF9?N?Z&?'S%$h!Cgv.C+*KckcO i\&}Ch;wxJhbλ a;,U)߫\Śg9aSXȖM\BiL(»: V["9uAy9u5n&ٕ97OȽS5,} ,uǩ*ְ^>PK4PKE9@*javax/xml/bind/annotation/XmlSeeAlso.classK0cS"2b!HSYӱkWCCoO^}~Įtj/Rھ)3?f7yI7NxʉJ8Np -DMt4J鍵*Y')Mq?BeΟ0zD́;8igt6u.zz};PKBRPKE9@'javax/xml/bind/annotation/XmlType.classRN1=pw+@LWbbj4'WvM[ji@۷rzie_4 +KaH(-x (^vحqD)0Ε =bZ$.1u0\M K0U ]: fb@Ƌ`0Z`Wls}f,r2`kL0kwPKm PKE9@(javax/xml/bind/annotation/XmlValue.classAK@DhZyK=Փ ievSڿc}o?>mA,f"ה_4HBDp$tc'l,ByQb?#t)Ω0F[igIfkve+x!?l{' z3Bnr ϳ("oWYa-䁲+MNUGh`i< > W]|dэ <:" T 11;"p~̙=OVC?' ސsGNPn=JܕsyX~z<=Ҥ)ŦLa ^,y PKiePKE9@@javax/xml/bind/annotation/adapters/NormalizedStringAdapter.classKo@I4$Mˣ,G:x̣a{E{:|sNh<մ{L|?(s[2ɔOL>.(Vf)cvk X/[Z#{;~",KP_pL칍koPK+:2PKE9@3javax/xml/bind/annotation/adapters/XmlAdapter.classRMO@} ((ŋ&ģ4x]-)ă?e, \ؤ;3ͼ+H0\+cvMs_61uh ;ap3:}5_gHV6v"$29f[R`^wP.wܓa<5ELk EzRV;A$Pmݸ#N-F/a8Xoj,C ٻqW ^#{ YN0dx4n2՘O@i3ʘ+M7^Nvfjqȱ iG—XAM`=#Ms[d< H@FL%P"`%S0/PK]WnPKE9@Cjavax/xml/bind/annotation/adapters/XmlJavaTypeAdapter$DEFAULT.classPN0M@ E%&T*"XqE屘x æl_2bSƵ 72׌|bDQLXW:{y5?ЩZ0"1Tji ͽr\B;ZNX tw|,K,XZ?'TQKcEiqL؎GΛд-| B1{v96?(ԚTAt߼%M =f>B./nëF )˧,=brZNXs1PK PKIG@javax/xml/bind/attachment/PKPKE9@4javax/xml/bind/attachment/AttachmentMarshaller.classRKO@-Q^* q WI#bӴ]a&eA~O&(ni(y|e^oPr N|\D3!pGcaLyC==ڲ̑R\pyB Qv 2,$!E gq#f #P.\1h>8WnC,L[yБ|^+βf}tdEoR hVeҗ$,;OxQB,޶mtǢ}tQKh2@L+*M4 +/0 d*KdvAuGX#]Va3&ݏI1eTVmPKsZPKE9@6javax/xml/bind/attachment/AttachmentUnmarshaller.classQMO@-Q=yCc\c=M˦,dO^oKbtQO EBAɑJCWt`lj< eRϚ˘A:_e#nNhh31Z*~dpĹAwzH.Vf3rFF/pEQOvWEgN4ԞV<8b*NQΞ~; sis6(7!-( ԧTl&feޖ* JT^ZPKP6tO<PKIG@javax/xml/bind/helpers/PKPKE9@3javax/xml/bind/helpers/AbstractMarshallerImpl.class[SFbBC `BmnҐ6BHkB(mm2dJSڧ*ӳ+ٖ>XVew?C%]+z-]W5TQbZRh&-Դ*TZ'HiRM`r$нꪽM Μ 1 K?IZT3ZyDsj" os@oYs2,tUF-+$R]7lj.Qϒ.@bOA-ԮV-۾rlX5W $lZ7I1ݶiRUt;+iMCI䃸{KeC.‰[ME~ftTy?9Tkfkﺤ +;r;M'ZO䙀Y|X5׺U VdPT&E^lEg%Klunanvb RlB >.+8{ 0̲FIivNZL>[$7(F IӶ)9@ӺUjf"ZpoLZfkQuG`FЍ|cUMrQMF~7y;+ rJRM7v5<$!<TQN%t[ 7(ZkA<(5t۳h&\$GwZ~K%fO? #%ƕ=XA Dž<~ĩ`yOa <|  =@>/\:鶔=dIO_'tA^C}܇~G9G31a[`'t62SynjKnj՛װ'5a,3)D5 |z)x0Fѧ`ØͶx2C*Qa]x,B|]`,Ew =xH?Va- a?#s>T,p6o^=o;GL:/M#s@ج݊=Xcg#`_/c"`snvc#`w]Wѱ=ބ}) jw::܄"sλ#77^xƃ x6{C}pXD5* p$[7!@XsYDsěpʍ}B D\,ކ7v5?"p.ʹ[ '9,~6n, ܾ2∂RxPK}#!PKE9@5javax/xml/bind/helpers/AbstractUnmarshallerImpl.class[WFgpiB0p h]!!qpKVlYv%AwCsٕ,˖ֲr`]vw~ٙVC'.5nJUTՊR*k:͙gZF*j'D 0#IZA:^9:5ܦz䩩h@GRs@{,~N [=zM>*eefUP9n7F̢bXIHHN);={79b*ev,] f $q:FW^#T_&0*`L ӊKºRzV6)egHj3}4j^dj3$`ˣ!yJl%x%0H`~M>V2O"e6M+dͬOwP ܻTsP :󯬹Up脇 _2;Egi0e9yVG&,#Yi~$0c].D' L5xR\4x+%J`N ptuXy6(sbCUXX=+w2٦p0^6e^j%YD qƯ{ ϘU'Fc,x ʄoz w=NKk w5T!o3Q+X:aJ8w}Db̬:3`,=WTٯ ܩDk+g*Ӓ=ߡfk }G4k)jip`{ Ϙf?|WeV/$O7r;J/goOձZf #z&zM=e7z񾬗x3 CpL}uriNʗKC+"ŁuyadǗp.zN/7,\׉GBäm+3]4YN?kڋo o- } ൃ7ޅ~Y`!6{!4XVmɞbs8 mE9EFQZ9} *[[·i>O#Yx=k9.ﱀ >EX q߹H,fe%O9- Ԑ$8`tA$aOk1'dNoۘ/퐭s#IW}_!MH@:!lZö`;Hό-G`Ǔp b .3 R6+T+#H KL\}s{e!hBkvmQZ\H{aCvSYƩ@x^y]Y祲5kppPB IG?藄ߵgx\zYgCDlEHiyWCUe?PK5w.PKE9@:javax/xml/bind/helpers/DefaultValidationEventHandler.classQ=OA})("1 C#D ʒewecebGgb{3;M9X\'Fb̳B=it c˙񵴁Qa1Ic5=Smu|FȷB< TyTBU7Wѽ"PBq@*(gfw??#B0Hq2n]:^mڞ|i#˽C#’mIǞ !,qBRһ&\+aX5ϕvT i*NKx[:im&r :RN]yQ .銴4ݺ*2c5O5)j^W_]bHg*iA9#8+( r3G#$kmwR?SE/UG W1`i~`D*aӷל?|7/W!Ž PKٵ,e-PKE9@5javax/xml/bind/helpers/ParseConversionEventImpl.classRN@}LBpQ)0MR$ q) &Y%5oQ!Q|b֦Cfvf3k>=`9 w{Tv#M=/kP>?P@j_E%߉JpQ,QSR)//h00mYFǐ]܉/c<5M´ aߛNU}N25f@$ݱ_H*?.v ߮F(\%e|[U3a 9psu=|yQx! f0P$gS(1fmk_OX~/IfXPK{?vd-PKE9@5javax/xml/bind/helpers/PrintConversionEventImpl.classRKO@WQg<*+ B4!i i֔R[L<Qٖ"(ٙ1v4DH,)5[W^ű}.c_U{}KCPAjK O৉Җ%j(n 8c-PKE9@0javax/xml/bind/helpers/ValidationEventImpl.classSn@=< I%ٖN0Xؠ"EJA"UX;(ؑO,`ĂwVH] b;{?a~bN͙1Ocĭ w=kZb`±[㉥!ɰ%eC]} iJ͐~!lbx%:+a}1Mq.C3$AC!f[cgqdY]=L&тL$t3V>fלx@<'9_`u ·'>'Rז3duf#yl/џ%LO+Cy/t܌`]$%(-[qN>#䕪ܙGR ACѓ-CK^#ړߑFК4pWilb P5ybȨ*J J*R3 4h 5R*Ӱ.ndb{YeRa&DX UrQ#X F22UK%JJWI,(( UK%JPK)**5PKE9@7javax/xml/bind/helpers/ValidationEventLocatorImpl.classSn@uҘ5MJ)*P)jW٦|l'x'$> 1vֵe3gfg^A"JS:5 ׭dƈ9.>P=ݶN&򺶦z1G Y+F ҳ<rBd$rotK(=`"prW372=9pfK%pTn#!f:y;vFIOQ `EuAv_CurqTc#^7b}Cش>w,d588h6 |&%8D ?7q Xĵ,p|W)#} j,M%444uAӠR[~Ҽ)kM #r= DF$r'HdZ9"0@~g=Q2E#|lc)vb)U(K?vr!BIn,wD?PK(]PKIG@javax/xml/bind/util/PKPKE9@$javax/xml/bind/util/JAXBResult.class[KAfYvoFoa&R%:^bw?V==Pڇss 0e-iwq]i^ o`b )\n{kUcI[sb-mUVbʥ~9j'%K ɰ 0ĪNG"%hѷk7%{2C洹I1zcڳL䐻4ͼI4ރmqqn\!ٲR@&m/-zmq%1|#i#e1StJQ+_(`85̏`5PiP?@0萇=lw'6 PK[dPKE9@$javax/xml/bind/util/JAXBSource.classN@ƿ*U =X1Az۲ʒҚBZL<>qIvf~3_.ph Cp2Zȵlu]wp2HA#+PNr^m{Y.^G{8oBJ{U?YY бNF=0LC\2`HT-dsD 0PhJW ﹭C鵹jq_j;r&0ԛ!A$xR}1\7=453>t#3ί<"Ħ|1){ zݝVtR)$3dY"ByйEIP MEcdi4d*NS҆%bZH'шԷEt2(}cQhӉ/>)fm}PK 0rPKIG@javax/xml/crypto/PKPKE9@&javax/xml/crypto/AlgorithmMethod.class]@-ea,Y0!TWJ,h8˓\c<7&KTm KB:ʎ0OE%!&!/0[,h uJdI%IՇH&n*}{M.CV9; {8 #PK ˯PKE9@javax/xml/crypto/Data.class;o>#vv&FѬIJ ʂ|}ĒDvF~Nb^RVjr #Wp~iQr[fN*#'HH##302I&6PKս`jPKE9@*javax/xml/crypto/KeySelector$Purpose.classPN@=ãR !F]ĭ "Ae-)-i2.L\~Niԕɝs̹g92" / w5햯︵;cfv79|lǽ!Q?>4#A vk̐i%CdDsϓ`T$XFf*kSĐ6.fIq )pS(]?2p[e~=LdcP۶݆{d0T MYب3c($"GFW"J 6Tgi9h"RYbB!m +J?RY FԵ;kv=B%!_PK`iEPKE9@"javax/xml/crypto/KeySelector.classRmkA~&L6}FP~eLnv^I~RGs AC晙}wp'F>Ki2$sIK,X#" FS3L^$O=QF)!7PE5=eU>{56{6KiTϓQ)O[CGO7u03e>#ʊ{or7u*Fv-5srs ӌ'AYclR2Cu㋛H(؄1: {s˄xEAU"q,Q"Hkgq*h\ۼ ^A1W." Աyy }V{Vp[ Yۑ/PK )PKE9@+javax/xml/crypto/KeySelectorException.classPMO@-Q/#r`xp_.Y d2]4$ۙyp<g>Sozb=YG"bK2T y4 !81m$ `,r %_Fq`(*akiЍ_+Otb-Ap}a,24S4&ݡVo&+@KciύǠW\赨2l8(Pa[Ts6$kBgj9!]3ĦdKY9ateX:+sUlPK'ŰCPKE9@(javax/xml/crypto/KeySelectorResult.classeM; 1jV6z+m ( bx,D#٬lf<:00D ,нVǒ-!as[N&QqHa|>MƎ0-] k˄&w0@DV PK PKE9@'javax/xml/crypto/MarshalException.classPN@-Qh(R9Pf0^6d)ăGn4޼};3oo.pXxsp$;.#,`8*d)h./ W"5C93!(!2(0T< =>PKE9@/javax/xml/crypto/NoSuchMechanismException.classPN@=QDwUw課~:RZrewM 93dZ/|sM;|D < ᾜzs[L" nOIO,җC2Yv 9ʖE/F"+*V`swCdhD2[[0ԛ֟~J&f#nv&FIJ ʂ|}ĒDvF ļt}v6FQ } %E%E b>`%9PqkFҢT̜TH達 gd`bV3`g8$PKvaPKE9@&javax/xml/crypto/OctetStreamData.classQ]/A=nTiU?|O%b& H}&5vYFO~%޹{f.MdV|k9|QBT x+n`(krc]Q& WғaiD[^0G( "LM.^[W ;ܽu4ԝgXrO!lt׍#NJ'hi4eu&{j'zv@߼34>q y^_2Z pĉORq-M*e/ib8U{tftw'J260)@MBs-3˜i&S e6"@BFgU%uʴfcp)PMc]9ɬ2\ PKUPKE9@&javax/xml/crypto/URIDereferencer.class;o>#v&FIJ ʂ| OԢ4 KN-bg`adIKOJM.adNA(bdfPL5t3土WZQb%$њ˵"9$3?A ]p@Eɩn9@7Ld ##30=y,@l&nPKkO 7PKE9@#javax/xml/crypto/URIReference.class;o>#.v&F٬IJ ʂ| ϠԴԢԼTvFļt}FԒʂTF M|pIQf^5#P FҢTbAd@@ h+Jv 3pPK+=PKE9@,javax/xml/crypto/URIReferenceException.classN@)7E.(S`MH RGԂV2qPƙ!rŜ33e~~qBp65yШ5ueЛAi[ \u+2kZl#"BEGuZzO um1Y^ݞB+B^AM1nET0֝se敠4'fsW^`y j벖*ԅƻԝVJ`iޚsg}(}1 3/$;ifCOl|0GAT$n3˃wd%ʢx̽8vE$*kI ̱'p/T0%w3XKK3u@봜]rRþĜʱ+#75sşy^PKlgPKE9@'javax/xml/crypto/XMLCryptoContext.classSMK@mTkZ?[PobbQ0--iv58I/yff,BAkl١N\@]ھ'1EX`PQ4˵:FG2 ]D>=0qN_7$N8SW``2(Sg}tI /1U)'%taNd+^r9KSAew9H'X29g߫$!bègLs!hK"޾?0& ~*FߟrG.R~4 2]E( q9BJW`Uc4V`]c64֢x65nE ;qDPK.0kPKE9@#javax/xml/crypto/XMLStructure.class;o>#Nv&F٬IJ ʂ|_ҢTvFļt}FbD҂FQ Jy֚Q \Eɩn9 Գ120203#6V6H21pPK%]PKIG@javax/xml/crypto/dom/PKPKE9@+javax/xml/crypto/dom/DOMCryptoContext.classTn@M iiKڤM)P Exumpؑ)_|ݘ(q6lw9sf~}x9 1wƽU[7fz٭Wguma䡺m8tGM"!|Q:"0n2M0(XWKhlJ YpMþ1<q l"i>t7BXqw o疜%yZ'<˩`LcQ٥Q~0Goq<{k*ui3_&z)r׫_LQP~ܭ3"QX Tu9#HDM;G`i=F= -A=jsBrLU˪E!vb3Dݨ3>oB#D zJՊ#$oF^ hG fKޞ}?4)Y9T4w6]1DuٗDbx (Ò(uϤ,I; ?&|{o:> >@;.b0!9> q'C|8| !2: |DNpRǓ@@/G#{="g`V{6  _fȐ\id%\pQZdaUY˼5XW" Tׅ S….ET\\a)ijc)Qdv밋8'AI|+밫RWٞPJ"3WСBPKRh PKE9@'javax/xml/crypto/dom/DOMStructure.classQN@=SUDy c&&FêCLjIi" ]( sϹw {:4>1%oqjZA($C^ {H3/ 7 C\1}iOVD{V0$o( ,tdUΙ'+T4}.doxiDn@ J/@WLp8e zQBRgתJb̐iDQw;Qh/EFy+dW)$O#Fui* 5 <EϨ_iG)N1]Gɋx-0YSfoGj;QPK)dsPKE9@*javax/xml/crypto/dom/DOMURIReference.class;o>#nv&FIJ ʂ|\} ϠԴԢԼTvFJļt}v6FY SK<F Mtrd~)֌ \Eɩn9 5hL Ĭ@w3]b1pI&.PKMoPKIG@javax/xml/crypto/dsig/PKPKE9@2javax/xml/crypto/dsig/CanonicalizationMethod.classMO0ǟ"/xE-3 Hul-يC??ةA5O_^ e2NGL4 =ǃIgK&C>P anߏ+XCpD< ;qk׻RGbg%Y,]L NB/0N* V! *Kޘ9.J.}PKqI=YGHPKE9@(javax/xml/crypto/dsig/DigestMethod.classJ@ϭj[ĂNmA]((mL$%Mdb꫹|(qRt37{"rlMt3[LdȆ簮HtayB%1 v4,@؛; OoV#ι-c K7w OxsN(_A$@>X~5 G3ƒ$i&P8u'i&|<}\w KGoDe 1[m ?_T05lRfBiWʨfoe ajc %Êҫt5kJod: ۳'PK(7 PKE9@$javax/xml/crypto/dsig/Manifest.classmPN@3 h( *D !9ұwU+:w7wYc@t^Ke^Vuq4 $9јoM tW3})=ʛRSzE2uir6F ,1q]p"k$ rB?7PKÔR\PKE9@%javax/xml/crypto/dsig/Reference.classu_KAϘf-^}K %ȒiwFYٝ j=PazX2O8rc871q}bBEFRAx oG5~(qMI]_$Fz EP)h>]2ѡ,#ޯbMIbc * *s/k1o#PK ^PKE9@/javax/xml/crypto/dsig/SignatureProperties.classmPMK@}#xЃ'/ ԣ( .qKLfb_G(00ͼ7O`P/j)ϹLkE& E3[Vڒѵ\y\| ;r'dԝ>.wQSdgItF.0}"Nl6lfrENwOi ;K~h \Ʀ&& 49 ,ڇ5紁\^)|PK S?}PKE9@-javax/xml/crypto/dsig/SignatureProperty.classeOk@j5iͳA^qYV&l&b?@?t6Sf~qXa#0?9 屴F&8E>/:“krF~tJⰋU#i;ҎqCf2%} xb{x7ΰ=d{<+Ò،VeXL]?5}:ϬPKf8)PKE9@&javax/xml/crypto/dsig/SignedInfo.classu1O0 !P(-b@b FAHR!8*AG!.`p{w~~x}pәzR+R d4LMn)ԅԔ,Ì%pG{?IR_VW% 䯔uhU即.8%GW?(V^ }9Idl HY YÖhmcsn}GS*jZ D-VyS,=CCu~RlM]Uj1'66%bu;6u{Ma} 8ໃPK/HPKE9@%javax/xml/crypto/dsig/Transform.classSMo@ igB/ Y@SH8*׭u\9e8QT- aexx?}`╆ 3>M* az% U\z~)]aaT (xr,8ivJ$sUH]jcزw?: (Lՙ2c`TtژmDM0M"5˙eO# WJQ,GuB4<>76?zY,Ըf٢W:1Fƽ~J&&Cu *MtGBNotJT/ +̕-^P7ϭ@׳G8S4RLӉĕvit%hQ 1wVTpZ,- !0OT3gv /PK1 PKE9@.javax/xml/crypto/dsig/TransformException.classPMO@-QOz\f0^/KtR'Ҡ ÛogM y8 ދ_#I`*E<}VzI"UP1lxW ;!]ܶd_D9/i6+QPU Ҝӡ䔡PHDxزB_=k`ߤ;$Z]ӞSoQ3[c=l0K=<8!#6?N՜Vp@$Q*%tV\_RJ8;8Imi65ks$٘L9kX%W}kU/PKYBPKE9@,javax/xml/crypto/dsig/TransformService.classT[OAf)])E(Rn^l]䁗!KRB|t!fvڴJL|g]B3s\Ι3vֆŰy[NCN%ULq?T$TKFa.u#Nv&FIJ ʂ|t_<ԊvFJļt}d(#"~Vg0 +8(9-3'Ah=~9 @ @PK>PKE9@7javax/xml/crypto/dsig/XMLSignature$SignatureValue.classQJ@Mkmz"DCfQ(D<iMnJ)<~R*"=,K9X*U/Kq&m8K-LM7lBJ${Z8h:&/Mh&Lco^Hu2&^[lJ4'^U_[LY@pH.MlC7 fϲ2Mzs!tZ|DQH6Nz >Mꠍ:uA]Fm=Xsoa}.j[OPKaPKE9@(javax/xml/crypto/dsig/XMLSignature.classS]OA=KT@۪@cbxP&E4Ʒq;.l;Kۿ?e] arw9sϝ~-s#y"Gbt6$ ėN7 i<+'4HCPQ;S KXy;4.ai/2NU 7Ckfbj[wlMe}BE22oT9g65"r* aWi*I%l^f1&ħͥ6Ԣ&QatYjΕE^+}X,+pŸ\(_U#q#_ lȷ1amF/P) þ3g6 O鏥<޻m<(q;(QP',.r2 Cqe[Q_zYJ d{`(ǃ.WRЎrpUp\c%CilL:׫nS8&I05V2 h88!b+i.&)JJ: ),bojK}/t3Cuzvv$[$BŒ9|ٳտ=֠'CfòE%]uT5ʶ`[Ԗf M`R[ ԬGO- Nn)8;awv.o0%צ=*7iY؂ 1YtSitq;v"RXm1]JrdU3a--yp|URf"FJ@m[5VtЭzQsܡ6M\ bXYh^V~vO rǓ k̓: PB mV{2A(^ᣙ@%]Ji@~9&yܯחqur{hהL-!jkń cblH(|U}#C7yUϹd[`bݔIAm- 8Pv]AM'"bz`5?JX e^7j}s0~?'hTδ&^6 Q(Xq,"\;QB=u]G>xm mqA6rҿhҋ{ބ Yh 73E Dyg`Đ?YLI 6?㋔)6ȋx4>U*cVsuu f3:9.Er)XWe.KjS~$r>NQȅQ$~^W#Q)9=vcd즎[[c[FX5vw{AC#Xuc'n|:2vk<v >3_>##{+TPK$.7SPKE9@.javax/xml/crypto/dsig/XMLValidateContext.class;o>#Nv&FIJ ʂ|t_Ĝ̔ĒTԊvFjļt}d(#"@`T3#Wp~iQr[fN*#8z 3f1201+02I&PK4<ՃPKIG@javax/xml/crypto/dsig/dom/PKPKE9@.javax/xml/crypto/dsig/dom/DOMSignContext.classRMo@}OJ@r#Rq p HAWYENIz菪&vkޝy_82r wĜ[r#/l}Mw#a} <(lt -1C:y8'|H_ffd*eN>`8V̈; N|[eKQrF4UǷKl"{PKEPKE9@2javax/xml/crypto/dsig/dom/DOMValidateContext.classRN@=@Q|]cJ\aԸCܖ212(L\~vZ]083~|8ƦhA5 =mu뫆튖-u%H IQF6UM3o0CTt<#n,ǝ/иêmU5ūCҤ,)f!0%4c7]ΰdy6l_uL;c8U=!H-f裫U.wO$efq{7ߑ{}"x 0})}tj8C&@jJ6y!9,*[Ē'F X`~`1&XJ$Og0KZAeiưyԋ(*b1`d#+PK~ҤpPKIG@javax/xml/crypto/dsig/keyinfo/PKPKE9@+javax/xml/crypto/dsig/keyinfo/KeyInfo.class}PN@˃ DHII.DpD a.\"{_(< լ4;CZRRPܦT?uc9DG`PK>UkĞ΂EHȌ@/54 'h7[ N6HˊJl,x)rI;(,4]sBIOْ >8[|Yxf,13w,W g rmIbu^5x>Gvܷp PKwPKE9@2javax/xml/crypto/dsig/keyinfo/KeyInfoFactory.classVmWA(R*ojZR}@8y<4,#-YU:~T;Â`q3s޹,~ +:>gDϵv(,-yji;@ܦr$C3>fΘ.&o tE 7,.n!0&u fЌNCjs9E;#Пc"a::D#s #ɋM\cQ&)-}uV2U]k]=g[%evͶ2+ITɝ6~v+<5S8(h#^&+[% )^ Și V˝mFk[,Z`YVMqI7o=#WpCKrG(ĽqKja3vd!5\ڌ4&\Gv$H,X2Xג2{[TP uڞqLn$i.o/ 0ŬDy+{N ҬSЛzF+踥\ yR qfx;h T8%Lrm34q<5joHQ*]]mVX'0doߴ:;|.I ,<3 v[p>!@6b/܁A pڽ_K%kp_˜hf?P#R8 =Q8 O>2ٚ' >pIQs/`USz׆(PKe PKE9@+javax/xml/crypto/dsig/keyinfo/KeyName.class;o>#nv&FլIJ ʂ|t̼|}JTvFRļt}v6FY "|}KJKJRSK@F02hh *Kfd /-JNuZR4YfbL \PKPKE9@,javax/xml/crypto/dsig/keyinfo/KeyValue.classQMO@}h+"~$j<=6xROF"Fɔum]K?8EAٙyoV-;g8t'!2v}#-9n^_ maaφVWFhK{|wun2Z?rv=1ǰutyto8Ý\&7EKGH-ac_$I6=_ 1l~L0m92Ҋ<[XbX %@nhb!ϔO2b=(Q,)DuyP"uk'PKW &,PKE9@+javax/xml/crypto/dsig/keyinfo/PGPData.classeAO@g-"(Ƀ'czS16lIj_G_ăIvg7;?_h;( Mԇe>3ҏs8 9ՋоEһ.)faF@޿NO6-x(N}Jc-Pyxk mp&иlBң2b[N4?2˲^v܋@]וI(3 Mtl=Ӗ&u+VJ0!&Uz7c龜 W'j(}}\_#z@gg[\a 5:(RgoiPKOHqPKE9@3javax/xml/crypto/dsig/keyinfo/RetrievalMethod.class}J@z)nJ]ۺ B*''qj) '*.lqu.|}T/tY_٩z-Rbboi1K$͈u)8^YƔ:qMW+O$?h?F`yx\iCumhDO~a^F|uQJ*%7'nl>=c |tBvP OPKPKE9@,javax/xml/crypto/dsig/keyinfo/X509Data.classAO1.(≃' FDDZKo]k(c!xФӼ7u?^Ա p0/b!bF1HTBEN P<Q'k {FԧTKju;>cv;]5lwmJҬ(8g(yqF,`hvyeQuris- &5Q )l1o*C1dHFd!SR!梅 bqڗrfL# +"*}4C_fZF('PK0(PKE9@4javax/xml/crypto/dsig/keyinfo/X509IssuerSerial.classe?kAEB&6b" -]/zdoWC)x?_h( ꠎ2gnɤL.G4=ِQqKq#cjXm)r*w,tG[hhrW\%&&ۮ>Y܌rf4uɲfFnbtd<ܺ#Nv&FIJ ʂ|td}gC?ԒĢԒԢ`8; #H~Nb^RVjr ;#!BrQ cd /-JNuIeda` @ @PKQXϒPKE9@:javax/xml/crypto/dsig/spec/DigestMethodParameterSpec.class;o>#Nv&FIJ ʂ|td}ԒĢԒԢ` ; #H~Nb^RVjr ;#&X85(bcNz>b#Wp~iQr[fN*#N@Ffd`bV`d`L PKuߜPKE9@5javax/xml/crypto/dsig/spec/ExcC14NParameterSpec.classQMO@}[" *~޼1/FcbPO#A/e%%ۭ'qZߚxؙyoN_Tjb]q#|o&Puxؗ.?مТ'um 1{fWFTs*u`^9 E]n;{ SMCx`!֒my!|e T-h,P!)|yR_'!+*G`\so kfʹ;#f&C0e/PK:/3PKE9@=javax/xml/crypto/dsig/spec/SignatureMethodParameterSpec.class};0Dc 4XJCMC@ r9q8(P*VڑfV?Xr$ Rd/ &8F!%2k:O' /ˊ,9 ,8_KRcΰ-Λ0|Q]tEaXeHtIaQ,PKt"PKE9@7javax/xml/crypto/dsig/spec/TransformParameterSpec.class;o>#Nv&FìIJ ʂ|tdļ܀ĢԒԢ`0; #H~Nb^RVjr ;#&X85(bcNz>j#Wp~iQr[fN*#4v@ed`bV`d`L PKh4HAPKE9@:javax/xml/crypto/dsig/spec/XPathFilter2ParameterSpec.classQMO1}kWA@yccb0^L*TWEm-sb1FjZPK~<3PKE9@9javax/xml/crypto/dsig/spec/XPathFilterParameterSpec.classJAc&Ƹfq($%)F!"^;c;FOG$x|(fqS{}U ]0-\Dz}}*=+ m]q}s,-Wdt(a`-{=6e;W }ғ\m}B;ZIר]0MJ1LƪQx%=]y -W2ӠodȰǥ jj'BưIdc ٟhEzBiZp[PaZQU C#=G-wcNAG8i9ΐ|B Hf) 1M`@lab0`"2u0a_hVH)aKvV\wPKE.#PKE9@1javax/xml/crypto/dsig/spec/XPathType$Filter.classPMO@}KZPJL8ě(BRH[ ,ă?e-̛Λ_p!p>_L\nY8`&lh#s9 !ΐZސca zӬ;pd{o$5m[M*UlA991īӁH!m UFUe * /|껂!טږ۳|G?E֡h Ƈ#'`;ӹo ڌ2U/y¯V@C/B•TӮ =AQIJ0a06(&'^aeȲ/Q[|qya`>WZ~=A7~jT܉(ƪ/aP8DPKl=d9PKE9@*javax/xml/crypto/dsig/spec/XPathType.classmOASzByRESt5ĤB|=6e%[+_P!>T)񒛝ofovaTɾw#%ꎰ ҝ"a+E$x>U#ԱvWuwQotilXU0r*߮t{ݶ2)\+ et$fѝhKx2RϤyY4^j‡=,t$d a~j: aY ">QeWTfJ Pqg^GceVV [h/Y` |#lK/Nl}*L)Lf ρ{\73?[.LͫWon5\pS惡L)seHfyޮ!=w KPK-8PKE9@;javax/xml/crypto/dsig/spec/XSLTTransformParameterSpec.classN1rED%cqcj$C2T2x+]|(㙁9=4|{p})󱘊y.|>!'=tç@yB Oj, dʱX@gC}p0W;*udeG[(0qd:Tw%C lvrz2\^ 0ꔡfRPjK] ZO "e[''1-ieCS lPܤrrD.RQ6J(n%8͞1 P }PK0M>CdPKIG@javax/xml/datatype/PKPKE9@7javax/xml/datatype/DatatypeConfigurationException.classP=OA}{')8`lP ~wdCYV&qv `t7޼ݏϷwgbh<)xģp {9dbA6CQ\CwqRՓ. A 9a{2w'T|P>\I]'M;Gsޚ ) ̔Sp閡I[[5hZcR?Ե@ }lBTt/,83Y|6eMIu!W Yp{S{Πa^Kg}]u$umoKc2}lk c>QFbw-c`z PKjPKE9@*javax/xml/datatype/DatatypeConstants.classT[wU4WN-R DjK 8MNҩv."IWͿ]>M,; e4k߷>:H0jn8 GDF d8 ѰHcNKZ&Oj^1i1b&7ޝ0>rH;#h/YXm$܏a/mـ+J7Bo{nX'G ꢽ&\Ko:6ZxsL_G_b+0,yp)p%&niF6BLtJc5PbJU%s19םE&÷mjZ Öّa#TEm!q)-y ?in}]M]#]2ʵ ,“?">%n;uIiunMسkh>>؍ʘS%jpרChӤmptF#ӌFirtQK=tYG~F9-ie~洪opGx~G;ѡ^'k Nxؗ<5VUN=@!k'zRWa/jeyܒaq3Iz>ڄ?,Fi ƪ4My*O%rW&i$"Og>LϧR}&g΂ែOgg`3sMR/u]y'~{W3 3 ^/ou,f_/2d7˩݌}|5:O-؟'d@[ q [@lC~B¿TXL9ŔbfX VTyx1EVewJˮA /oqE]ځR_˿"C4PKPKE9@(javax/xml/datatype/DatatypeFactory.classVmOG5~)!BBl_'i ulB19??U?Tsk]N33 ːO@+ S?.w^ ^sm,Q:V]5B7rjeEik\*nl"_1+aWLvVvWts%aM2$3m. ja:!- 08 1-n5SG7cȱ( x PĊjaqW,rkYm3V`֫QXD7ỳz%]̊gy♧ ~=Z ύzrE]8lAԌ7CvU! ? K=`BM;[`Ȋ@˃'s&_Ӛx-1 3(lF]1ŅɛͲ͏au3 `mqDsSXa_bYJwe@g Ac]V\{ 573]T <:x %El;dn95a7gfdPt!|#0%_0 ;0\$\řZ_i5;:D1fvVҿ8MޠG  Nἴf~B$]ŝț=w`E.z^EɛC/F 7݇wCMâDŘ%}%Pܹ>p/k9 ##07|MerOdn.6M1Z}''YX?Z ッ~%z3I_UXS hc S0 _>2?0zhg.v *\_zʕPKKPKE9@!javax/xml/datatype/Duration.class[OA,- rG.V(Eo 1B5cJ6l'!dwJϤ>C.) Ιs~{4ox[90SzfYf4}*'r!ЫLY@v .t d:+@tuC'd T`MaECs53 )lKhN`||!c6%wm0QugJW3_E,=>1ZL@Kj)nIʸLjF5a,a*c)"c#賂w#a #U]-~OdL]Ќj\:u|I30R͞3 6%PK9RGPKE9@-javax/xml/datatype/XMLGregorianCalendar.classTn@M@R8I&J9 x >B̎7i(c>=#aKcVu#Ö"(PАń'QS\Ll^rI;RKhoȞxKzu}ۧe 6;q(nW(B+@I̻'xO$<ޫhZElPIHGE1"?aK{!Шsbew?s9p͖dɸɈɎɎ&ۈL\' {/3`~j&brq̟ν;>ઑ0:MG g ܬ[1zvaIG0C-KX 6f,,4Uç7^\y &)|O =~8G2&<3G,'D9Ɯ-N6RbnHgئ',RL~=*45.D5awz PKBBPKE9@javax/xml/namespace/QName.class]OAYJ"~I4zĤ -w0fYe!^xjzfv*Z.9sy=??;CvlΛZDaF-;-q)CVgeת Wr[^-# RiUʧ H!iH3J*JGp}\)':dkC9rRއ1(Qv'D#vވ'I4C%S݌04#WP ,`eT9vej,>Q*մ7PK{PKIG@javax/xml/parsers/PKPKE9@'javax/xml/parsers/DocumentBuilder.class]OA)-, h FEؤB" ُfv[?yW&^Q3K)VCΙs39_aX<Mq/<ׅn4_޹PY#  *%h7|I@\ P'0o]qmFq'{ 1|!Ѯ{ 5q&:>Ⱦ/D(r*r299E@΄"b gCc 纑yX,Bʻaw%/~m"4~uvaV: k@P "}ֳ;abwC %F<&~:Јmþ;>^ -YШn0j'iF S)3$ޗ|J / $B!iIavUTuK|dP"d 0/TTih*e_]L3%U120F`ʫ4wt3|*KJTc.e`ZUc&ME " ښGӎ&%/x2qAeA`+`}rh'cڗ w UG$J[Ш>QYQwJJ2Nʊ(uNb$Ux-ɬt7TiLA V*3#0.yL^P}u-zR 9pdKeӱ,rEQ$}/+ZĻg&&c\+]NIͻلn_!c%x5Զ.VfGdҙކr[~y-o+'_,-H  '}o~moC0%qE8BmI'6a9b9|'=>? s><ܱvE}W{&, Zg!ZE{Ӂ*Yx=G .Ez|OF{]e+]w,p &U:b+ |$e;|/|߉RO߅@/Gw x'x78\# [.U3&nx {IJ,PKOV" PKE9@(javax/xml/parsers/SAXParserFactory.classSN@cLLB6B}lRUBHHQ@M!v35;qhW^? cp̽sι~]xB`^kg}*$RojJtڦ~tv @-X!;]1a2ffAbfAܳCsI`I@d@ TkަvFA wcK f l KA= Ia LL6ºhS#@SoG TjH]?=`.[dlzb<oe.Omt&mvuhKZEG ͌x-*eӡ]&#*Tl{S v*n4  ) "Ƚ)'z"]Wkg{QRF:+7EDОPy(o1RDO pq|4s.x|3 K2W:|+! J"~ǗSJz z h H|K`$,UV4;%봝E%%tjĮPK?^PKIG@javax/xml/soap/PKPKE9@#javax/xml/soap/AttachmentPart.classTN@ iBaS t"ڊHaQxipF`ؑ=IC}ԇ~@?ꝱIb"s}۱Va; sI[zfCԸ1Q'A!ݢ~xv N`h˴MM`@N(N`aM4jg=g#0Vv jP #0_MZ5hr wM|#JKcsd#0zeu0}N7-ęKb,ckk%S[sӱ$LT99jCm։k֮!#e)UGl%fwWu;>QN]N n6eޅ@Sn\`44fC>b1c+_BgRTH *w&Z94YTY]d\(#%5V)kA^HJ+͊' /* /"z&D/Pq‹YE^=-J7L4\}1'af0"mQŽ˜0I*hsyneze8A~D滲&x?{ȹ;DFb`>DڧYOa1QAx ʄ}+ײvú}e-ràyq odk)>)( x+[}}O`3"-PK*(9wPKE9@javax/xml/soap/Detail.classPMK@}VW['k'Ih BJed#yIBvvޛy3psbcM237) ASΤkxp r23SOժ <(5 Y>K:`+Qsm #՞-;?K5c$\FW:0>+YU< Vut7/) :4eN:)Ƃg{~PKS5PKE9@ javax/xml/soap/DetailEntry.class;o>#Nv&FIJ }Ԓ׼JvF~Nb^RVjr ;`לԼFҢT̜T~$@؁$PKivPKE9@#javax/xml/soap/MessageFactory.class}RN@= T'4}Ę#R6nI(>Q&ݙ9;N??d#PG>p^ }sErW !gZ.WmW3Oa{`-23Da&{MfW0k˻qNi|{p])P>ʩ;nɱm6ȖM?;qN|CȞP BVetrHc= Cu3U|'"ȗAOs(̃N]4P=UȁCYkbRRj꫱Q8(V;Ea-ZGu)JvI쫖3WW;Kؓ;daeKl3GX{O 9~3XBI`[bRAuݞUPKBJ/ PKE9@javax/xml/soap/SAAJResult.classKO@ϔBQywk 0<ҕ ?8S H.nϝ{STHg:mbС֩o72}2b]SAܰ VI }ñ=IB _:B 4HdZ#3A٥!pQ ܈@ cͤu|װ8<L 8,fו Q&1` bE)HeQ4f/PKwg~\PKE9@javax/xml/soap/SOAPBody.classN@g- (7у&"$&h=M]n2NJf2_ ΠA@mXHCǦdc:ﯥA@5:6s- 4 pqk G@ft\j (|qJ8%p<~ e$6TSd'EvSd/EyR`|PK m PKE9@$javax/xml/soap/SOAPBodyElement.class;o>#Nv&FIJ `JלԼvFļt}d(#P] \Eɩn9 "htM`d`bV`d`L PKw"tPKE9@#javax/xml/soap/SOAPConnection.classQ]KA=WWҴ"zSZ#-qldݑ]V==QѝUL~93p9m$=1gHj^?4tHot`" Euҗ*P+B\i~$E iBU;2|_ 2 *"+Mԙw}[^ƼQ$.WV 'F"Q -a)]'GP+[fF"{iQ[eR=3÷N0LS7r@c:8orgOm3RsvH]p0 SuJөN\ۏoPK5"dI}PKE9@*javax/xml/soap/SOAPConnectionFactory.classQ]KA=WW7WK/^^ $! iuFvײUOA~Tt"!Zq3wg_^bG7wbNGQX1{˖5FT[2Pq0&OkBV(CPh.& RjJE]zNrēXTͷzw5˂Tc$>o hIRa$XxANbBցj\q 9\KO\dp59> geF*yWQ`:3ޝ؏n\3kWm~PKW>3)PKE9@"javax/xml/soap/SOAPConstants.classT[S@> ܑ;(*7ih/hLD˦6iN;&M:i|Ϧ) 9_sv i-&NsB(;b3+I9sh##DtEY-FGryd-K?یv7t7芦s$fRLy@=U)@dfٶaT YBqS! "E kJű-3=7tLptLT IQN~7Z E`<7ĪbW&'LWhߤlhe9piQ!Lt \+|[+< }S=ɐw#Zzi(Dj9O ,Ae] +$V[A*L.5!ssSVKVCʪ-3P4 8OSҝoԕKy-o);J}av>b{y.?{[ŭW.όkߋ <}|$`nI [rꖒi)kogNm#g۶È+_9[Qx:+"G{p?X ڣ4c&"d4OEt4 g_^DZr 'p j B:ߠ%;Xy=*7D~&-q|‘lRR`'l/: vCKPKHb PKE9@ javax/xml/soap/SOAPElement.classU[s@>UV [ VmVyg:2JNHd|O6&@!%ߞ\wp R~ǤvirV5YY< s:5UMO[LC%IUu`;mQU+;FJms:k TXr6>2T.7lMmqUEva3X7ԇU)3;y#pҔhKMzQק8 cǕs&/a*g  wHi7K`E% pڮʶWA͢4(K^-I_!\ĐudfF6飨Zc DIN=r氯FB&LtB`{쩖mO@X Žgs ܃}P"RKxfy xPKDujPKE9@'javax/xml/soap/SOAPElementFactory.classJ@IcZza\E*x?FIIGoW>%T 6u dY 6Sn=o94p*E_ԅT'UA0kv+\ŐtC`,:ފ =yVcH[h(/⢿B(X4BR+(ْ'E^a|<6k2O{Nj˾uP/_6KnE6N{to\làti0%$=Da22,B% ]qNunh:@_I}H"&itn=:drs2bYca̱3XaG.I*N0ur}g>I05mdf -bM;f 䟿MJ& h7`aޜ PKGVPKE9@!javax/xml/soap/SOAPEnvelope.classN@ EKjylx vRBCbEIU5|𨪀&H,\_oq!RAgen&fYQBw & fsBp֖q"~p4mqOKfKh-OcU١G3a4~"UjqY/JخfI~/Uwi&Ȁ [۲,AaGnܺraC9aCo(7GXNPK9(PKE9@"javax/xml/soap/SOAPException.classPN@-*(`* =5j`kJKJ'~e|mPCk۷34'O<{ݽ~4o@g0%? K芡`NQzEݻd=>\ 硐tGc1c8pfhXwn V{<<+ ͏Io2d\eá{+O ~"58SGCՠMWPL&6V&o B-O\WfBHŲb[,b'2m0!ȮF95eXOfn.Sj(~ PKr!<PKE9@ javax/xml/soap/SOAPFactory.classT]oA=C`VZV]q%ivΒݥO&>Q; ȂDf{Ϲ_x3楸=sxÛo>ԅz sG6?m]J+dHfX0k [Bf<fXnJtݖDˑ g \>A#d /E(PC٬. , mOHyB|HW*jkl {mڇdF̠g( 3d_#~%\t%2gq+3lCGX\>p`M$1EסWiZ8ds_)y}P(*N%})$oz]ߒu[?6v@W 4:qOW2RҚUh;nc"a+NYEu": R:'2y#ʼ{̑`~9yTH{cUPCq?Uv QnTQU&K0/+)CEǿPKPKE9@javax/xml/soap/SOAPFault.classmS[o0>n]n cK,>$jc+ao^ju8ݩ5(ĉCt|>_#|=}so>4FotU %Ļg>OU|gMYx)p[;Oq6Y<#SxA!ƴkF9:q8'}T)g}GE,4F[_ Ɉ̻OfiY|%bl.λd&YE$)ү ռ5k2*HYZ'k{T(Y5q-s=] =d C)S5_ vqopMpnQْv+~ה ]F,#1}vc;M>{s__ WGom&,dV-d vR]m7`S^oXnF}ľ#m_ñ'X ĞŅ7@ w%PKK`[PKE9@%javax/xml/soap/SOAPFaultElement.class;o>#Nv&FIJ `ҜלԼvF"ļt}d(#P] \Eɩn9 ꁴ`d`bV`d`L PKGuPKE9@javax/xml/soap/SOAPHeader.classSMO@E *zR.6G8M4ݐvl2Na- nͼ7o6ӯOrNc+=+ hh F& ('iˣ|l &̖lhfH3WޒϢzg[iA B<2H4 9F2ajcw_P kySz֣d@G6_ٴb껜u-PKFPKE9@ javax/xml/soap/SOAPMessage.classUmS@ޫ"By񅢶X():~ad¤ ^~r5iE?4}vy.ן& Sɏk>?45 )H2UqޞQ=@K2HW b2k;zZ*epr%-^ 'A893gs-"̢g62xY;*;%Xru}F$Yr6Z.I p.8&K҆h=+=NS3oܳ]a1Z* # U H^h:ړAo=&z!.ȊR֪ &7 yؐTNY)(2S97ouEFJOnLi /A"0靮Cz,#{7S.s@/NEz`|'K^&he ŕjþt!NjpTߦᚎ'`2m6D{L6mJ[4&w֒dod m]=䈐q gд.ݐ8\61?0H$O੶1:uB?>.q:XHz! ac%kfPhoPKgׄPKE9@javax/xml/soap/SOAPPart.classSR@[B%EJ$EeQ'gđRËOd-alg,}r?r>$w=^ GvɆlDGGCszpvƤ*Aǂ=^ryKS%m!PG#|N@-yN8D|fd](oo.Y[f9'IC]!?(19q}3KVknۿѢz\x޸;Uf (ףNJK6E@E[OP"%Y~ҧ16裑AX20zz%"Wq&!DOJHRE SrNi}ʰ)ی&f$VE"/|Hq:o9h1LRݺ4 'l7L鋘}})sw-]]Mg4` 8w9Qw0 🏒K03`Wy+**~`-)Z;sT\DPO4G8| 7؎);x@elD"b"_&ŸNѸujqN?PK?1KIPKE9@javax/xml/soap/Text.class;o>#^v&FIJ ԊvF~Nb^RVj2P S_~J*;Py~Q~q~J~.Fb< YC3+8(9-3'( R2h.P+;i@9@,n PKL?PKIG@javax/xml/stream/PKPKE9@"javax/xml/stream/EventFilter.class;o>#Nv&FIJ ⒢\}ײԼ̜"vF ļt}F CUC*H~$k(FҢT@ligcd`d`fF l ;dbPK2IPKE9@0javax/xml/stream/FactoryConfigurationError.classN@g E !V" R׺f)JO&|84Dڄvfgӟ߯o"z/tIWjH0:GԍB6 '-x " TdU@<%aJ2P@vMxS9K \u1=9=Ѐ@rրV.{@3\+#/x3a .Åpو˙d\ j-H0OĀn>F)>kFĭAeVӄCm3l6Mes7lȬ2llk6\LzUU\- zyYLvGPKgkqPKE9@javax/xml/stream/Location.classENn0J P/\+GJHQA8f F#9NƁGU {  : ӣ'~27ޑ0< z QZ؊o#I0ȯ mٝ /QukgkJr Y`re1¼mKz6 x2q)-IP½GE kꇰ} C'w|"8_PKX PKE9@#javax/xml/stream/StreamFilter.class;o>#Nv&F٬IJ ⒢\`0喙SZ R\Zdj`1#(51%Z3+8(9hj*# z l  b`L PKˎfPKE9@&javax/xml/stream/XMLEventFactory.classV[OA>S rA@QӖI H1&e(]2;5>蓉Ж^C}{N_ =y-55GpFdYbVI:}tAcݰ A-#,m A7iX,˦ߥiH:5(7ZmšN^G%u<Hd1ܶ2ʝp8ʎVBl]ZWo;Tbf,sδ)|lZ+Q4F%V%:Cʱ֌;(ԧ {zԖ͢==Jwz:4~cb f͸<&.:z/8PRTtST~¹XO?Ru$j[E~ntT.}EA7Si*o*x^gDz([L9时KԤ>Ee0B;["0ZCw6o^M*F50c6 y*eArSwFq˻" bO|ws3@y- 8Èpśp1p\ᄋw`)ş g\]U!+S@CaApQӉǘ|cn9\ {Y-ZsO9<<3x9 l/PK_3+ PKE9@%javax/xml/stream/XMLEventReader.classmPN@} (*WS.6&&umv!<~qZ Z0ٙ7μϷw8r R~h?U?ތ%3a$Z4кh-e3Ch:˙yn,]t '6ЋYbʅ% witI ds6pmrʾ7Y;Չӟɵ+#D▒ΜEd UAݲr#&H4xb[TAvouȠH %o PKх,PKE9@%javax/xml/stream/XMLEventWriter.classRMO@}`Pσ xxH^2`I[vK<QƩD&&v޼; '#9jEҷo;)I@-I= 9@3CW |R+83;j=jY=j;vh]fX8#uwLCb)3QxQ*P>kӴ?v:%Pnϝ}paB@#ޛeg=Z,&*yJn;C7꿛~0%2O2*|*Zed)d3ldc74Bqp򾀣/PK$vGPKE9@&javax/xml/stream/XMLInputFactory.classVmsF &v^oK($!h TE61:(T"yNSg??ӽ(>h¯y 0W gtbVV[#sҫQT[A`H3͚5j -o-8~(/k 1X1 V8^kizPBc`\Tîk,g Lgt-0 ZFd5ڨ4> P6,v.XбXˣ2 WYlq;,$p%wzj(ՆaU53HKghV+B })qWʲ455TY. ݠB &Rޜh+Of6l0vH`kˍLL9)Ё3wsfrzE^gA=&^I+Xk۸]6,F7d볙dc"YJ;Hii|ƮZ[Y[z`٩E~=sLB2&$ _r*e뼯@?b:qRG;yĎGGyfA;/Kݞǃxz'ћ>#=V>qB/Oб-&Txo6xFP΃bŠh#m i(guTVԘG? zs"\t:mMJ#g_*$C [g#VS58] C38$PnѲHJ)uBǣGL ;{A:0VهHIt[ۏ 8(VQsӀO|Ah @==}1{1 1*Zbuo)| r·(;k0<7=X@>b9\ y@D)} !>N PKE9@'javax/xml/stream/XMLOutputFactory.classTn@MݦMJF$@\.B"RQں۰c[uh x(x/33Ǚx[IHX9Mz6,ݓцaKחԔ8KF`*-jfJ EZ^ E!Ij|6 #6T΅sܫ2R d%tF@;G,01)%0Y6+C&C%8&jTjGҕ=c&H7&{%渣 C)lgvPQ2U85+9,%;$GƸBzޱ#zy%R;3,򳓋&"Oo"`NDbdE8. "ݫ D ,w]GHvVw$6\T3h0WvyI k]H/hO-뒽[J=nѾ4ZxKvuZ*Z$e80.6\Ԁ\VW.M0Cx&-0ZCDǓ9_U$>8 S LCXgǼix+z Y!7"MCnǐ;1d),Êk]#6T|zL)Jte.+|x DU= X}x>@NoPKx)8PKE9@"javax/xml/stream/XMLReporter.class;o>#v&FIJ ⒢\_Ԃ"vF ļt}F"F lpIQf^5^ [}K25\+S @bvNFel *KS2sRFH;##30}y,@l&nPK PKE9@"javax/xml/stream/XMLResolver.class;o>#v&FIJ ⒢\_"vF ļt}F"׼̒JF ̼tkD4}mfdrHN-(+fgddP`0 +8(9-3' $_遴120203#Г l@>;9 fbPK?2/PKE9@)javax/xml/stream/XMLStreamConstants.classeN@YDxynmB[]>J#)@1|~ekV}3ӝ;\åkZ5XQdi/#6` X'PQQ0~6a8 d¾INɋ )K@YTR2Ʌ2`pW* ,i0O]oy3*;($+ullQ@Ұ2ΐAg5ytQs ]\Aoj4ۚtS.jO>@!H1D)L ΗPKxMlPKE9@)javax/xml/stream/XMLStreamException.classN0EЖR^-}@y ! `@lbU`Ăcǔ$lbo^PE0U!7ްԙTDZё%]0!-SiMӢ>~s_:M8g;a-uۑ_ޗY 2L(+gApp]i-A$Y #\?ܞb ބX0YrSJ4%/@xIM)t͎1۬Jƈ^P$cӅi\F¨\nT|*v[mTR#J%6x=7QaV+ sPgbU:W3cCvoX ׀NRhDY[njLeumiR+J[&z-PƓO7+}߷sCl1F8&IC F .鿃wzcNX_pdUAMA)^L`,=ts2,7+qK3^Yrޡǫ*D58C!6aLjHVz <2`A橝-U,x`x9ocO؀uLe<ٯ/l~$kuƠ>L]1W^Jj nROLW<r]1B%R`ָ q[W2XLAbI/Z1Γiܘ֑B9b~UYY&j_QnK)$^)VWAX\x$82N@i[yn+s> j1E*Xɉܤ@%Z⭘.o9 )qQ;q'Ǫ.N}%+{>ZiWq] RAۀM\Z-$uBa[zZ <҆]-ҁ= ܬ RN{Dst+s!!G8 sdHVh?5~PK_PKIG@javax/xml/stream/events/PKPKE9@'javax/xml/stream/events/Attribute.classu?OA"57"A+И#-xYrw^~5 >VV;7;Wh4Fk[RSRlfd#ҭj/MALjܯ{OM)tl^x2 O4;8?9kUac1MEѦ5ѮBbEhkNFE$N :0@ ^~sIE&G^Kk,+9/V6pZݻ6ҾMղר"/֯؈(ZPK$d+PKE9@%javax/xml/stream/events/Comment.class;o>#nv&FIJ ⒢\ԲԼb}\ AH?'1/]?)+5(ȠKk+ZZdhh L .)Kfd /-JNuIedکRYe:bL \PK[j= PKE9@!javax/xml/stream/events/DTD.classuN1!p! $BTPB%Z #%1#(CzoF;|{piҬZ3'2κ\ ބZ?-r=dլ{)em#J$.xɅZa$Y`ǎԲr ry#Dև-Lr_믛E76YqB^vDQؑڕ?Kt1@C=L6PKCrFPKE9@)javax/xml/stream/events/EndDocument.class;o>#Nv&FIJ ⒢\ԲԼb}׼\ AP?'1/]?)+5(ȠK{+_Zꖙ 4X=^ @ @PKXm{PKE9@(javax/xml/stream/events/EndElement.classu A Eo|OJ+>q ̮;fQbF+@89 7`Fw4Ws[l9s*8LvXB{lM(o{3#{q  ~~,;HxcBk~hFh}婓ԸSbu}LV6ATVQie**!F8N~r\,np&B?e%uzyZ-73 oj(Y^*K7i'@~+BybbOܩPK[kTPKE9@-javax/xml/stream/events/EntityReference.class}; AD <耩k41vYaeP ACӼ?7#4r^U&4GkXϬQ! -DH.{@e 2M?1A8J~+_1:r@u}8q♯C/pI y7EW?[UPuBQPKZ> !PKE9@'javax/xml/stream/events/Namespace.class}jQMN\D#ݸ˕ܽ쳥Bf!hbfΙ9?_fFh^\reԙRuV7.ȱ䩢e# e[UaنÅn|fMo^B PK" PKE9@3javax/xml/stream/events/ProcessingInstruction.classuO @u&ZXXYYj*B,lpK,?Jܫl3 `@T^rVBFWɳ-c]UI'ut#"seye:v=x 6)x6?|Y"gYfMx,gB.5aS4ZlOo3|PKfPKE9@+javax/xml/stream/events/StartDocument.classuPJ1T*[vHR̓G_ʪxL&M>np#pk!zҍ5{gV Tږr$÷]<Ϧt5lh"pQR[hM$?͂8f*znרy,rfOC@ <-t,7̕[yCUٟhɈs`k5!R#;oq _PK*+]PKE9@*javax/xml/stream/events/StartElement.class}QMK@hK Dҋ ^{ hnR!II?J͖x؝zK8r%le˜4DSʥOJ4Ƅol Uζ6_ゥ9 HD:7+aTɼN^Fg"[' b9#Ԋ2@;Yeodn/zu癀sk~ݦ߯:(q\6-^;<6ǁ]0sڃN᠊]8bUw yoPKi@PKE9@&javax/xml/stream/events/XMLEvent.class}N#1 LaaPrWN RX3Hv BBfZrU#Vnĭ^[?ǵ_e`Aѫx[&?AIl%S=bm8 rҡvR{/@|Uݨ1Ѿ|aN,pUMtd\9bZ,Sfhk 'u]0IaڎOhIuuIKzjY^N|e7)(:3N FZbzO`Q3KVӕI5*i xAվ;S7S+OsPW1fT' W%qH _'qNk#$ِEXTp~y׺!P𶑒@Ƚp}WDTgW9 s`-qۢ)Z!,5Ds1+/ߩkqj:@v Fi{Aq az Ȇ"žzw aCQ4+j㺮ww"Br 9׬bAB26j`Mn_X}D^aT YI@Q=O<#!u5]_p6qUK?RV ۼP;'Wu;Ƃ9~e5aWE^y&W4xjw2gӪ<`d Jc YuDҰu؈o3fdnV|aYJJ`qG3_F4֍wuSoνadރ)i؟Jc˨q*mA2Gg8:!~b9;LzW4PKs:2PKE9@0javax/xml/stream/util/StreamReaderDelegate.class[W7G~'=k { &bHCvH< [ctԇ#iq]>`i$3ϟzMo7tsL=΋)% KB@_P" +zIh#0Q& жk;GLHd%-IG7g;~y=0jVΨksLxeF`)w]0# Zj #8)+Ϯ:$i6V`ށycjDf,cz~M+}T d2kW|&v?qg&vpF+u6FGP X%0eҢ#X-tXf|CR pv%ŭk>)6@;}Sո4Jj]Rf'"3P(ߟb+FvDOCQ@]l2uV-sW#?^%HOYLSֲ2+gM6}0ǜ ,yہNiM&ǟ}[=Ȑ]k~6+X,Ntٵ`h9%nTt#L (\W\DŽ#}@r.n׍uak};Z}jGZwQ 5a 0%׊>VgJcKm]:~ǎ]&^l9;!>{0 |b H5, "!H?%F˯!r$@ r|r߃A~ 00pG0 FcB#c1c444jLdUBcRјOy{`>\ e}nĂl;i\_GPSȾ T]Y~rw_PKPKE9@-javax/xml/stream/util/XMLEventAllocator.classPJAk$jNWrI$!!`@c#fgew6y('B n03TWu1N#kѵ3J_TS醝67EajOk6fɼ!&:3&OsOsWF8"-co2ފc1ow wBU^gֳ:(6in u䍷CAc[8PKSpfPKE9@,javax/xml/stream/util/XMLEventConsumer.class;o>#v&FIJ ⒢\Ғ_ײԼ"vFZļt}FĔFU  cRAڋYk12pV$d egddPT fUu%e22Ld#- t(+i PK[]#կPKIG@javax/xml/transform/PKPKE9@'javax/xml/transform/ErrorListener.classO A Z߈`.Z`د*'Vo(1(B2Cf+1 BogN&>֞K7 u,JuJN>cz6" _Wg9B{Q&BW-ҍ&{ٰVErNǏr PDE`%$*Li|2M h=PKM0?PKE9@$javax/xml/transform/OutputKeys.class}Ko@g41!mJ)}l "$cMDO^ڭudcqBC!fR}3<<_[^WEnȊkYFi#?Y݇.1r*ΌprRI`ݲL"NJ0H zHV\XJQK* H3*^c5^ `BЊO;ϵ4b,+S92}LrDi;Ւ4'B >hDZf88w"cfjp`*߉?/#nv&FIJ ļ\ҢTvF~Nb^RVjr #wzjIpeqIjg #BMpIQf^5PQ1"Q L5a \2sRZ =J6FFf`v#'H PK! PKE9@'javax/xml/transform/SourceLocator.classUI @E;Edc[ rNlCBvDx(ϫ\oLKvbgzZ񠍤Lc1McT0mZ snZTRm*rCP5qyW{Iſ[5o(- if~EWÅk2hv:z 'PK׼PKE9@#javax/xml/transform/Templates.classJA1Q`cce h%D0/c7l>%ΊI gϯטUVfhdC5 n;o cqA1B8iXY,O)vqO8|a8o?Yڟz lz?܉AO9 #a障llsy[6݄@A%u=t}8PKRAPKE9@%javax/xml/transform/Transformer.class]o0_oiJҕ1>FWIDⶈ4$Mؽ)M*ۙ ~? q얬伱}s?~x6/aS9SP5x £ CLy˰twمc+ TPeXd*>þPg(yrΕgHЉ,GDpu #Q@C2ImD*N-Mu# =(7* eS:̍LZW 6(zC /&$ɇʒ[La%3-o=ж.3qP%Z9WӒ7,ZN`Sy]Y,RL1ʑ,WQ<~8,5 'tR⽴wyesx}콢~z!)#ǝo:nnLH^&Z]ﴅ5mw>:qtEק6_hc+ mӧx96@Kl9Qz{Ժ.PK5 /PKE9@;javax/xml/transform/TransformerConfigurationException.classN@ϔZQu11"шqB6 ZL\>qfZ .ΜݹzP~Ӊ9MS{ql(Wú#N]w,E:A~Aꯛ rl'M(Nf6"AgLe3ugۖpE>ZGZ ~W8^8S!įD 5*"4naU(  H"&֘&[f+S*;9l#%'sn'I+΁H4EL/E,AĬOX$f9ʉۆXj9wPKqhPKE9@.javax/xml/transform/TransformerException.classN@ɅJ@[Z 2€DEU vtC~`hl +$<83v4j3g;t`_sH1~k;Wg-.|ur0rc /ێ`(#_Ng!s i䑅6{a;eD? c.muꍤS[ET9iIZeJ'6u)`؋cy^ʶP:%xw?V $Hw1n ĮdX 5/QPSxt`lL8p#pգE=Mgde1EkNhOўaЪd19W!0Gb^`5ORXL,%B`96iXUZ]M2J z5, }hv3ƨjF>  XY#"#?%ȹ~jidTl8*U/Z PKpOPKE9@,javax/xml/transform/TransformerFactory.classT]OA=SVJ-R?RPYhL#ф"M,63S,JL|wc6ޝs']H!Wi7k%y kqK@^`1LZ~TfHq}Wc+l0XL1 Ƒd*بU<O0̔{'\fNZU h1WT\ZGt^f_)1!tD]Rax1V_,C Iд+B\'݇@ӄۗ2%Wi ɰV̴NuC\)C> xW}%'}Wo`"7G G+K3C9bLJ~F]mcֿre -ű=+9P4Ձ]4"]E{?= c;vՀGZ`ӪˤSSU}.]6i57oktjavax/xml/transform/TransformerFactoryConfigurationError.classQN1^(۝bubYM@ؗ5Ck@te𣌷b}NOo?>s`|3:w Tc1ե^(KG\;A@Q 1E.xxK e7d  v?a\`@y\L|B6.ɛ{YwF֌3dR*.׹~J/1 ^uFI'c]᧚`GAOt[oXG52-Dwk^ BoW  `aܙkKh`FG%i&jku*"x7yQ_ZXLdPKJ|gfQPKE9@%javax/xml/transform/URIResolver.class;o>#v&FIJ ļ\ Ϡ"vF"ļt}F"F' tpIQf^56KS\+S J284RʁZ!e#t=l  +i PK8PKIG@javax/xml/transform/dom/PKPKE9@(javax/xml/transform/dom/DOMLocator.class;o>#nv&FIJ ļ\\}_Ē"vF:ļt}v6FElKSSK23K2SRD44}ˍD z2sjNYgbL \PK?PKE9@'javax/xml/transform/dom/DOMResult.classOAgҫm) *[S!1)%m#a(y6vf/8vFtd[Tx\Ϧצ.XB %F- y1%PO*O'[Bu|eVsP pp-7*T#ؒD8 dߚ)ku daP-q,.q2ϔQ0#MNk4rzCU_]*~˼U`nTQ^͔^@iEDYxE`C@W_p LOXqɟ~87Ԕ;*;0d2lny|jC5C}?%PXRUXƳ&#|%.G#Zĕ0!KUUMTf+L^ ?OS, j\gh3iUJo{ـ"ZFMpkc?AYOTn~ZI*!mC w#6 ³iTDN!ݿPKv+PKE9@'javax/xml/transform/dom/DOMSource.classRn@=qHI ]") PB+!VjJdٓR VH,> qg(uqs9򟿿~xCB\+~{\E"?I46 =B"C3ÃO6=xa o"K0+ F!U'Suh$'I&5)uWcXj p$XzU0u@MNzp(\}Ou ;݅iv7ˡy:LW'9\ձezVt̴sdFQ!O gѹԔžϨmM92Gp!s; ╩Sm@c*`Y\hPK,CR0PKIG@javax/xml/transform/sax/PKPKE9@'javax/xml/transform/sax/SAXResult.class_OPƟS63dcj1-1B1&@4i4ax{FIךS2^xCߞ:F=y{qC3<.Cw"4?(U9D<9עCnD9R"%%qD%R( ƶ`gyhR&o{PK8*:PKE9@3javax/xml/transform/sax/SAXTransformerFactory.classTMo@}ۺq)-|Jx%J* Cc6ݤ;Z!,NH(ĬLUDhg޼?c3 ?ObG-Oi[kbŅ,ක{&Òosx(>o~%FD#TVqaԘ6Y*xyDyxO jɰ8.oau>{*4R3TvU+fُOd Xc|wX@6wEZY :T% ܟj4H~` #": gK.FI9ʡQ4| [n6%eXbr)ēvܙ제,ô|unx&hu?{e4y9Ye3riuKWóh1ӞP!ͼ*sU]XBdٹpkDg%WLg,7ȷX%a5BnN[@]@A80S7PKPKE9@.javax/xml/transform/sax/TemplatesHandler.classe1kAh%&Icl`k)`q~&_9 ޛ}{8xP!$+7j~Q\y|q6:j;7"<Z%|x"<څ_6\T8n}|4'%# ni!u!Bݿ늈$}ߓ)?nƃa3} @J[2ʰϨ{rVrPKAPKE9@0javax/xml/transform/sax/TransformerHandler.classmAK0N6S7zy0uG( ;oHSH2_̓%u$ //o0 \,D)97dcs+L $J^(q4"&(׹vʵM8x u '&\TKIEqv7#7CLZdm-B9Y[ }[O2׃T;&T1xK#l-!M_n;(KEZЫ}xp_PKPPKIG@javax/xml/transform/stax/PKPKE9@)javax/xml/transform/stax/StAXResult.classR[OA=SJ[KPixbR1$>(ƄXy,ًm_铉iCkY,s;sΙ}`E.@\0Z(9UMOd<Ò!@D}{!{ֳCCPsjO+?1,RY_^sn]ru\gRTI?[;h%EO޻큌gkv: T1 *Xfk]E7&uAG(ߜG`^ S"^0lLF=ȿ9ưЗh;eXid}e"~YkC䣦hdzz2SeًSՓizuSǰl4i4QD;[PF,|WhRِܣ1$Щ]tolncSѦimqdܞI;My4Gex;`x3GxB̮$ 3gf䟿p2 |'dZ2^xC+j㋶? z@aM-{cZV=b1Og-=cex#ߣJpw$Xa8eiUTͩL3S֥rPs[=@un'PhMzF:TڭHmM / X½"0,5Xv/ER {%>yP8|hKwXLkELNgmvH-ǝ 4'3Oz2`)Om/鋣K(yePOٗBƙ ZK‡˓(Xr%nw'B#4v}.uezy)(Po/Ta4#~@јQMX`A ͩ$sUk 4o55KXSK4CLkL=bڋ`lNyoSf,T.t԰HH툥3}_zc%PB8*W.O j$kJklXK C>6MXoLfOLLD`V%Ȧ! +Vۚ.&3hOgq]jj7EY}M`cdtL1;Ip.0g\(s0뤧kǸ LJ ۔wMX3S?Iš/SalM;%^x q\(,>H=;*/X)BBsqUdWl? rbJ.bZLA`N~*)WQ $UWY+.|Upؘc 1] ہgpPY T>s'Py[{x"hռKU)©v&)bOpnRľQp r /DPKGpPKIG@javax/xml/validation/PKPKE9@!javax/xml/validation/Schema.class1O044BL XA,H!(XԕcK!-[LH ~T{Yw|{pÅX5_ךVh5|Ve-B ZG~_,d2ʨ9m+v!q[օlD%~fKs(oL'.b#޷ 4dn$4DhfM)ots`8໅㤌tx Q :3jHwvN'#/PK~ PKE9@(javax/xml/validation/SchemaFactory.classV[OA>S b lX.hM6hOv,K;춀}22]ae)I;};̙` =uzUlNmD=;z’`3[.q<+S ret |$ z5F42',ɪҡ{„WL^v/tan6-֪U.%FYbUf?>N*9V#la5a29u ^vuhqsk iمj7QĤmtmh hΎM]ഄ;!3FېŠ|,i-[cXCeC\Ⲹ^l-}\5$p7:%gN ^Te.&}AG'-*ߎjTKs(vj Uk4RC\+[<8܅|q#{$GmC8 F )ڎ(MyJ$d fP>@/"g OeTtr6  z0;28 w r':t۸s*,,ހm-ÀmlSmٖUMwtXUi 4W~eFĪM.2Y6A< lěO`K*gPK! PKE9@.javax/xml/validation/SchemaFactoryLoader.classPN0}צ B,li,1! u`~IUjK-峘> aJ, pO}}|0A-y[]5bÍ)EQ-䊧\9c_sõ "iP\PKtPKE9@+javax/xml/validation/TypeInfoProvider.classQMK1}iֵAl=У"(ZzMklZ'?%NV 0ofdf [%b.|G|." tM6sʴa<ɈcJ9cȷ;BçDAOOP :4yWib(k/ޞ7Es>F$v BHo]U?CR|-E#C%.G+z-'\n_^PɻJ=2|éxS= okSXe؞.]!Jro=T I|/E `;&W+;J#;>?k-1]ߴjz5;-KmƧ>q"OL΅l}F~V"v*\~ec;qɇ_j=Z PN7dRdv~ 61*r4@6?,阣<(wyB4*)S|!ւf- CV{Y|[oeֻ:>¶% ~hU>lJQ&HUCx?ks?EyO3PK`PKIG@ javax/xml/ws/PKPKE9@javax/xml/ws/Action.classQN@=* [W$@41PݰH -S_sQ;6$M\L{e)/YN: OŐ7GqFiJhnNe^x4Y>l4oZᆡcI-Xh ߐ hK%rWPGS$C9R" .:h^4$s Mւ@%{m^).&er]2ݖ{kV$MϢh6)1Y~!v)@ p< 5+=$HQ#w&p/PK_bC<PKE9@javax/xml/ws/AsyncHandler.class;o>#v&FɬIJ b}ʼdļ"vF~Nb^RVjr #_X>( ?8AJf#gpfz^bIiP<6!!v`\Eɩn9@Ȯddа Aw##30yL @ fqAEPKGuPKE9@javax/xml/ws/Binding.classPN1\Adp/,%$]<>a*`O3_~B܉ݻL8ce$phlL!D3$ʠa(y^z.=D4SWFJ&"D=Lk} ť'pP2J1.m9V˟+|pyg M+D5Wœ "^Gyx3N+ Op:FreԢ{9VqE\ +1}uսc7`mzшS yqEw|$e_3&b3l"y3SQliq=+v=`s2nfKd"`oQ+1 @Naw%DkPF\[x[U4\CHû[0'`<38Zc':tPK̳*PKE9@javax/xml/ws/BindingType.class=OASD ZiĖJ&&Nc#YnYQƹƳbN&oj3ִkH'0 'f#ƙ- "oQ~):zi5}e#),+u \y:N_\ݹ#ݺtp8Y*mxBoCqf$MIR*1AkTP=Eӕdc9KkA4&9#Gr7YTR=n^2cVS3he^ }}iXۦ\6=`$'ږIЦv+ U)Ϗd{e$)< (!A`U]qRG0Hp\ ?$JN8-L` 4L%"t3Dyg9,2#j܇o!Uȟxg\/@1^NK(zo5š|;51ހN-PK'pPKE9@$javax/xml/ws/EndpointReference.classSKo@6q& Mn-B8(Xنu^?~? 1~ f<kưwg>#,_i"ıB a##DїJCp`%F5J%^gq σH0lIȣ12K|)C]ahNyhE˙F HH8ˬ,/=vLL%Rp#E{2H5~G~*2&ǢV&Y6iFz7~C mn\+H$NQEfQī En*-.5&ٹ}w=T$W$ ;s -쇅~~PKPKE9@javax/xml/ws/FaultAction.classKO@πPuAtc@4aq5+2m "5jdnΝ_p 'p8 tvb+mZQQ`MbUWp'3򍃢@#0)Jq< /z  ?U8eNkӋM%8J>ufkWK;ChFb5єN{ۑzgO&britF8ζxr>%YdyWbxvS7x9^uUPw16Öl]eDE u[>A PK-P5PKE9@javax/xml/ws/Holder.classuPN@}[@AAUG%$x zr_`KJKJYL<~qv&f{o 0Ko9 w#g+ x81L ]1{r$I}B̶ eҡ=3oNeX }:@GCy,UII^2km+hd7!Mz^Cq+ceq*ܶiلp)X@>vABȵV7T_.ESQc5[Iid lmH񟭭m U7G5˕nr5;PK<;DZPKE9@!javax/xml/ws/LogicalMessage.class;o>#^v&FIJ b}TvFļt}FԒʜF9 M%EyiEEɩ֌ HIy)^Ny%%p#Y`a Rae22[X4'`dL <PK_^PKE9@$javax/xml/ws/ProtocolException.classPMO@-Q 9Xf0^1yXSf)˓?v `יyy8 |bU.K2qŠ+Lbb]H7 im'Q@Edc(ud$=>Cx$'wCa9~ȣߍ-yq_\1鍴K ڳpب,tTNy+ό'\荨2l [8(Pa;T pЈRI\b/!bӕowfqڴlkmj֦VlLW5'1WY PKłCPKE9@javax/xml/ws/Provider.class;o>#v&FѬIJ b̔"vF~Nb^RVjr #[f^Y~v*#&#gpfz^bIiPFH&32p%eya `dа 4Sfe`ف<& "PKT¡PKE9@!javax/xml/ws/RequestWrapper.classMO@WA=+'0aJՃdaEk(T μ375؟ȩ3O/isBdRd`I&hEFJn?dGnf-jƷI&J *pvƤ$Ji$C{೴΍ݑK,p]8Նg*LJb#_.:ՠ-pH3@ΜAú׽bK;ptzl5+ϧ_2n0bXX+:9lwUAD 4#la;'PK0uG=PKE9@!javax/xml/ws/RespectBinding.classJ@mzZD B=P^mӱl7%Tj^>8b-||{p gٓkG{/WK=QLAN`><-Mۻl>s4&Ҫx?CF65 bdm }:U 1zlЭv6k4d&[IsR:W!c.1k_U:YF9br*3o.gu']R 8ZL?yMaOH8u}do-rYD "[$[\`K<geGSf0~"Y.=B汀$#eV]/PKE$BePKE9@(javax/xml/ws/RespectBindingFeature.classPNP=S (,\`LƅB &.pהִY2qQƹ573y̹o/P l݋:ӡLBZ*(Y[m`z2sBa+ӊ8"|/;9,|ڬfOB{+!s<RF`}i!<,,MɫѰ+u{m@9Yѝ fEG!=V7楳Z(wPګ6W4샓H#=˓oI'ÝwQx!ExY2 bA y-&WfG{V&7K뀍x~PKT\PKE9@javax/xml/ws/Response.class;o>#>v&FѬIJ bTvF~Nb^RVjr ;#4X$3G?9?/(5D߭(+=9?$APC7383=/]aepIQf^#퀦p%eᅹZ& 6L!<^ /#3& @'`TPKtF]PKE9@"javax/xml/ws/ResponseWrapper.classJAEo'HJEЍnQC&.\u2Ly0_sQbptsϷwط8ɱؓ@ٯvHQ1qL%rFJC7g,, f HG} zJjݕ T3C$~8lTf|^dة"OgdH&Kt,=V(MuhVT϶BݖG q"ܻ+#R K?;^:CDt5M HЩceDbmxϖ2> 'SԢ`ȆpKD sE"^b;1֐{Za۴x/zEpO]!9#$KBaϣF8=>NioB4Ч^ak< '{8p!IzY(VPK&Ѝ;%PKE9@javax/xml/ws/Service.classWKSV>ט8 1M({E"AVE)/hrVdϷ2{A ht.Tn*{ؕʔ@+rlLj@F Gl#dl"@J."4(%c4T `a&B‚o6ԫגlS9$M̠Wr|΀WvM6kFcaXWVDvwm(}QyK(?f&XW^Kg7(hvnW^=Ola!mp˴j%+f   5c![?wHNHB׵ґjfSjʅ-?f,yo}uE)"K<ZkB 'T=PŚEEהjM>=cSJejiU/StCk0}렿|Ş$0۬V}# ?v5["Zz5j)[R^*+%9f[ofk3e{MgnԐ:h(4I8 lS1Þ߾\G;kҚ*.اn6DUwǙ"όF7j@S5<(⶯fPٷwo4Qj mN0@>wx_p5^$ pz8fMtB\NHC?zxـ[O4`ӖÍ1B~Ѓ]e 7( ̖ 6p܌eҀ_9.1fL1nr17a0GGB a]‰.D30c.4>"x3@!θ`Yc1IȢF?7v͹{uk8FŖs9'67H؄i&"LE}#%{0Y㞺|Dw{6=ҝ[unt9sݝ蓮GrţE0']eAy?Zِ:C*?g0.GԔXS+3둞Ӂ^Ww\}]mr-B̄B|W?mA=}pҍ$5!'wyS{pjU1FlqX6vn2WD uJ ?PKaw(PKE9@javax/xml/ws/WebFault.classN1OqE@A]8[V 1A$0j2^ɐN0WsP;$:ѐhzwOoڏϷwطL~a[FX#[I=ocr]%:0x/JKqEY'iG r7i @ OE##2]DA4u))d~ӽzCEIt(pY9Τ8d5R6bB g^Kh5'(WLAzV\pfFܨ ~4,_?:\Bkl2BPa%>.?AJUbPKHR`<*PKE9@#javax/xml/ws/WebServiceClient.classKO@*A=+'# i)#YmI<PƩ1 7|{p )ș=='(("X TH߾52H|vZ=*X(-X dڜi4Эqҍ,|t8ƾQ=H5-ZEɝޡFő@bےB)pJ;WM}(f#`~3j۫ \1,=ScN]qA}b$w15#-,:AY~(Bַ F㹈9cQ5_.9Ȼ 'y⫗`#eLl;YOPK[m:HPKE9@&javax/xml/ws/WebServiceException.classPMO@-Q/'z3/DO!x^֔,-c)TbRI3-Q͈L橸IFj`e! ksJ>9 <ZtⶺFhGUl:AO7Uos)tqS_;ɴ` +ݰhYJp& g`1uP5%` _ZXwjPK%S ,ijO]bU wk\;Ls`N6V)m|PK 0cPKIG@javax/xml/ws/handler/PKPKE9@"javax/xml/ws/handler/Handler.class;o>#~v&FIJ bļ"} R\_ȠUojqqbzs~^IjEf#7D-4xQ y%E@4B P \Eɩn9@z +llݫl V6P3p9L \@>72y,^PKStPKE9@*javax/xml/ws/handler/HandlerResolver.class;o>#nv&FIJ bļ"}ZSZ R\ZU꜑`ϼ|kM~iIfOfq5#gpfz^bIiQ*#C mh>Wp~iQr[f4遴120203#Ч l@>;dqY\PK% :PKE9@)javax/xml/ws/handler/LogicalHandler.class;o>#nv&FIJ bļ"}AP?'1/]?)+5Av>FҢT̜TFaTS@Z83KJ*l|781=9?$UصC qY@Lr0pi.PK#PKE9@0javax/xml/ws/handler/LogicalMessageContext.class;o>#nv&FIJ bļ"}TԊvFzļt}d(#2VSP32p@54}Pti T_ZꖙT.Iz 3201+_@73pX @ PK|cOPKE9@/javax/xml/ws/handler/MessageContext$Scope.classSmOP~.m ^p,sn K?]uti;JD#?xnHXss{O~`*F2~ֿx>wl5y-]}lu? !6wzuFK[[F\ڮnrƭ RQ@,NmQ2v*&ǡhŖm9Ơ3 P'0aw"d:m\` L#FI aDPe0AEDzw5D#*rD6ߵC趸%`1$߷+' J;1'GvBd%FQb5c)'HT(R)H1R fQfMa )a^#_AH-b"9B W Œ{?HEc4+fQ*)gx '!FtO9O!rXse&!tPKTSPKE9@)javax/xml/ws/handler/MessageContext.classiW@J@\pcW꒺ hIjP>  5?QoR4}yw_x?>l?DJ:Uy& %ߗCpxs`:`a5moe|ziCAz L=Xr z<5q Lծ^HM4 %ntt &e]RqV 05:vVfwEֺEri)cg'urTw+ۙi0E`+ްhu5Z2<שalaWIgRrmR~5Bb ᵂHoKJKTjG~kRtmhxil f,Ju&k~:[%sLkM o"i3C - .Hqh |<,s5fI1\l `yA K(x5lE< Ӵ9ԴF4k}DAG7[(eq̢gږD%+\c.($p6Q328cl^;1Z<;VyZs '`/G1=k&o6LoЪ\erA*@O[=&JmqF\9?xf(\ׯL6bV8zH&8꒼4F0q&`Bp1^N&w< u&`@xgGPx/)<+ _E ȋ /!Tx·*#S>C!?Q)s_ R5 +nV3->L_hrGPoPKUg7JPKE9@#javax/xml/ws/handler/PortInfo.classE0 Eo(Pb`eHl!!!6TiB~G!ƒ-ǾQb'" ^_O L |Zw sV,22b (-' MܧH%)}(BɷnMt@ڋ dgʹԴFG VPsuWhP.PKnPKIG@javax/xml/ws/handler/soap/PKPKE9@+javax/xml/ws/handler/soap/SOAPHandler.class}P]KP MG]`*>e : ]6(1e IIr>?!\.[jΌ*^Q:}# ֣d4}YH8D)BDx&C8N6"/ #~Z}S p'ꖗV =?jUSr_e<\q6% q!whl6Y{-Yiת&;oPK-PKE9@2javax/xml/ws/handler/soap/SOAPMessageContext.class}QMK@մDH@ "U"z&CLnJvm(qR*ݝy͛78-YXL|:RIaz@ȘRm4tK*crtIޟ:?:1 eFʐ抟~-5JtJ&/񪠀׫IoSEldbnb yZZfҀu1VE^Z@ 53amסonjPKA",PKIG@javax/xml/ws/http/PKPKE9@#javax/xml/ws/http/HTTPBinding.class;o>#>v&F٬IJ b}̼̼tvFļt}v6FP < N~.~ B>%E@%֌ y%y%a9 ܌ ʍ L ,_Zꖙ t;@ Ĭ@,9~eb@ټPK13PKE9@%javax/xml/ws/http/HTTPException.classJ@јZե]1ŝ(nD4v$͔dZPn\ .|JnŽs9p}3_2,giRS}oD̵Tp-4̕VJ3 +I}cj7Q`̸L<,f| vy.ʂK.yg`#0˫4Gj'NV֞<(̱A#uAݢc㭲C@`@E ;3]cN+M?NVn`D6PKBPKIG@javax/xml/ws/soap/PKPKE9@"javax/xml/ws/soap/Addressing.classYK@V-(b(蓠PjUԧm2֕4ɦ_?J>,;oϯ;XXxQ &jC.'0^BF`$!m, ,|=y,T%G 0vӓ\>@_@Itd(T$kwOJ ̖"PsvP`ص dzʍ8jwĥyܬÙՉrwDQ\]m7J7sκ=طr/U)hh)瀔io=S?2|)da_,ewd )^ZSp]z|zxQ)Xg-,: Ha(!1`ݣ1c"43ΆüoPKx[PKE9@)javax/xml/ws/soap/AddressingFeature.classQ]kA=w06mJ&~!HDF"m):;A(f Fe93p pT8"KD3*JM(iS ?P>V}MhM25яȎd.X{L,˺٣nl{,zO\8HC)F*/tKBs0"8Pup6wl9qA|,Ñ4 8x Nu;^5iJs!ο塍2*9G.sCy\7l~ͩ[|V|6\6NSKŭ[Pn[6w 6㺍"G_VH-Ue󊲽Vy+GPKIUj#PKE9@javax/xml/ws/soap/MTOM.classN@ƿM.Ph @6=pBHIAm=m̐,x-{CU1Vd;3?l㓇+y72KdbU$[QCE`&I®<\R< TG^)m(c\y&0; ӅJ+B`bJz FM!fqjyOv:ݧ:`T6Xn嫸KnW`lL֊C} @`mcoL?[k~UWSm#9ӵS]"-QŐri9yzE;RfYV>lܕY:TbȜ۲R܉V,~w=w To*# gdKw40s1*x"cXdCX | PKu'חPKE9@#javax/xml/ws/soap/MTOMFeature.classQMo1o6MRZJ6~pK+)CTiMjvlo'$~y*%˾7?}pGx ;b*(Ic-f|?(gߖTKaoZxD*dXn06"4]L"Nƌ_p$I-yZрxy5D(2,! up Tk\7,"JXfXiP2~ \])ݡo*fk3 Zǯ6w"[Գ46TJt OzQNzݚuHCy,*h>C={ʨbKJH[uV'TT\Nl2MRټfTMí>f+ncg*72iF=W_PK !tPKE9@#javax/xml/ws/soap/SOAPBinding.classS]OA=.(X*택ƘQJev̺|w >Lfs=w>~ @EL0,⌟C)bqʽև _Dd(<[EL2_H&{ss>iw mKx:!kqSCXW U%q'>İ`j[Q5 k V'y1<eYVHVkڋNgм&am|R)mqaŭ_D.pBP8$t ?:M7rfI49|Շ7(s# e[9"E-rHrٽ7k4i/NBdIgLNhD(¡ Lmw,\"\]LW0_f(G~ VǼ5Z=WPKbwPKE9@*javax/xml/ws/soap/SOAPFaultException.classOJ@}6Mj 1M*=-TzEWnIғ4(U03oޛ7o/j#Gؽc1&{y#-^I_L9(gH:ᧆPViCHoN54u"}H_3HOJZLGLQr(W(J\J;Ԩ"7<SK^ mhIO;˽Ƴ>֐>Fm*\o{wή-t_ӧE|1_\ĐvސShP85^Q7gZ΍c2D4,ifLRj  ef))2O@(y9MXpޢ|qDqF5cl\4lƒ6è"ٗƵq,E(PK#}rPKE9@&javax/xml/ws/spi/ServiceDelegate.classWKSA@ ` * t $%VDM"XfYjw)O^zл'<Qd%/0P0t7_YXtCeOٴ.dkWcT:M)E`u'r!i|@ Z6 I?1I'W:%o(f|ok L>5L $gJZJg%Rzl}Iqఆ\&QuŲŌl'cb]!N;3&N](>)Mlpx<Ven&U*f{HJ>CWlrƒ/ i7H_P#GȧNWXr-jRvZ{;E(BqzRdI`\yj05c"[.LËԩQt9 >{?wNJe+9PΒa l%Z>v+ m(xbCeE^Vv9FJCKeUV㕴-uή+;Tm85^p&vѢ]B`6cHP3i,k~\~:XqRc߯V(Ioc_{`@c"0R +Jj|q ?w b7"%A1GxЃmo L}/DW |J<,<"G<\q`\H?\thI_>)8*_iˈÌ3 sBހBނhQ;ݽ_{g]<-,R;zDXҧhuQw䉴R2 q` ]vTT[R|˰2y}_# 3o85=>oa(SZ s/ ŖIds]CJQ6' cU!$L9fMomOqڝYǙ΅m2l܄c(Vy3*v>*Ζcя*l}qT댴W+>hmv3cteҎ1 ԡcQz-Xz%P͚/pWTB/AK_yȖ)*`Űl(2;߰5B[:з6`+Qk#>LسN~dkSRZ&y>rn9Tx=oPK!7gPKE9@;javax/xml/ws/wsaddressing/W3CEndpointReferenceBuilder.classRKO0YŲ-1 TP遪Rzi}M0JxwYlڢRc{؞?.LM:"$ݺ~(^X<\!xu޷s%MtB׊ȅLy@Kc,s`RĔh`4'4Kݝќ8i{8)w1GjsG4]24 S Z251V0Z*SMeSDfj`[:؀]>xGXM|PK//dPKE9@$javax/xml/xpath/XPathConstants.class}Qn@=Nn--ECV*&5ȱi"ުj\B0N_L7i"A M>&ʨPuxUy^帚c=װN]g}GEb[&L^@ [ԾM#vddrLx=6VVlf-|. 2[>U\2ϫTLJY(.Ch4q(~''R!$^u Yq#԰܀1f"B0 Hy>Zm薙cI%C-lLƋ~d^1թ&E]_`C7uBcUoK^!44A**֬&։76ijӲ6շ_PK# PKE9@%javax/xml/xpath/XPathExpression.class;o>#~v&FIJ Ē ZQPZ\ R\ZSXȠ.o$\RnZZP4Ap XAhKM-.HLN2Qfd/J/+(- /-JN\I -3^"hi`cd`d`f`2 papc 1/PK'PKE9@.javax/xml/xpath/XPathExpressionException.classJ@iZmxQV{0ъ BKK&aּ'CA3|;],y엙("̴s&2Y pR^yεJTqC8"Bd68IzV xq1em*T)Ax"2zUH~W<,ɫ ;e=aX5ptY]vתm4nEp [ӭWv|PK}v PKE9@"javax/xml/xpath/XPathFactory.classT]S@=[-CZD(#vL)CgI&M:'g|)֖_vsO={ݛ'8b gwN6:m.O)]KÌb6wFL!](njʻBV/W aua~ =in2L]ǗܑGD R_b~ۢӎl4|jeP}m L|[~ c-ǒoF2#-6D#n1L,G-q,G&O-at]dSȢ2(i>3܃1 SEc!w(u < ߽2UdI`p睰&yXdoMI9^0|$Z$os/!;ew1,^!ÐTU.gjDRS*|>F tzt 3IgpC@Mr ibx%(Nij &Ġ>3Bc!8۴Nv C,`aiB:h"0T+tf> gpP`4V41jFj}?@jzGad <%cPKhJPKE9@8javax/xml/xpath/XPathFactoryConfigurationException.classOMK@}[DcV$x`xSx5YIegy<Ql{x;o͛קgm}KFoPKY )PKE9@#javax/xml/xpath/XPathFunction.class;o>#v&F٬IJ Ē V\ R\ZSXȠ/-,.A`ZZ2A p@Eɩn9@˄PT`cd`d`fFcY؀|v Hs1 PK}iPKE9@,javax/xml/xpath/XPathFunctionException.classOJ@}DcVEmRb1zb y#Nv&FլIJ Ē V\ZSZ R\_QS`01/17 19U?ȴk5#Wp~iQr[fN*#V`cd`d`fFX@,v PKyaPKE9@+javax/xml/xpath/XPathVariableResolver.class;o>#Nv&FլIJ Ē XZSZ R\_QSȠ01/17 19U?ȴA7š+8(9-] z ml t +$8PKh PKIG@org/PKPKIG@ org/ietf/PKPKIG@org/ietf/jgss/PKPKE9@"org/ietf/jgss/ChannelBinding.classMO@-TQ#& 1VhLH4^<-e-Kꖴߥ'qAMavfy+=l`0lgK#/!WJ]Ry%F|m+Ͼ쏄3LJ%#hUQ8 BEn놡x DT`PvՑJ\2SKTYLgL?Qb`b"uT(a>Tu:tA2>O%nd: ˤm]=~c,kF%U3 :ܹ\PK'{ PKE9@org/ietf/jgss/GSSContext.class[S@Bm*(^[E LTgI2!/~/~(l64q`:;wΞ?}3q&Fɱ;)Hߣ4gQc@T>TkZW(n|6^aj- fyVj0;9n.EH[ҕCكݥW@`H)zvH U^AMIö Zh2QETt+ `PP\V/35%A,l5.1-8nQ? 2Wy ߝ&%h<6;i-T%G3E`:vM^ L _*uLmN Ŧl4-knPyٿ%S056}ti_YB4}[r6kI;sv޵ג1={r*7P w4Rk07ȣ^!m)yFeº=  0 M&T"=lד?BTǽEmYEn׹_'0|\|{}d?.~<͓X#m8k5.5 _9;ghf $1J4he`(g2!0!Sp.B<ȇZg: sʋ*s .<,D*J,YR]ZFR,܌[p;F*QVpTn,snɃy#b1~A@YQy!;JRXBo.fW CP*,Pq& 2 }wu~DⲔԱ-B#e^5SoS;XPODy$LtI|TmӺh*v%,.d8碔Nki.p(JvUc:v=q/FnkcO'I%-;uZQt:S *:>4Y:m&l&B"`W#m=x)O38^jG&{PK^PKE9@ org/ietf/jgss/GSSException.class[S@ "xֶ+WՆ054}aMi:~>OC?@?T,vPf|lsf-ާYJ Cvj 3J-$D3RQ Le0*7ܖg^Ūl-Y .oKl/XЗK1BÔ̲AAqʱYUKꑒp.\MU 1f0Url-0usf@)aȖK*KRU4J$Os&F R7?`vYՋfC3XB(P_(ldKesx~hc-e4| 尫b0㸎 T*8ȍv2 O@qqmˉ4`\kZt`k6V]Xu3IUպ[Iᅩ^:k4 .ɥB%arz) :dEy9߄5EѯY!x# A8<*p 9.rBq '3Bxw|OE#?!##?8$p yYUא#o#+ 1_'/٢À__ `v ϓͮoS1&mR+64Y[0Ȁ[V} JQ\ݠ z]WNKsB;9>9>R  qPKQ7PKE9@org/ietf/jgss/GSSManager.classT[OA>S okX6Zqb/j01N z\|[4d'b:ft(sߘ-DQ3ڲvܐw7~틍wq|==i(+._2d2\w>bF#LrHJ}q#ۗ&dP}²۲z:b׸$o}yUr' AԓyP( kŖ xؕ$܊|12s"ZSy#mBufP֓ }02!vt:M‚Zp _Pw;3~I2 s@apv4}yEse+1` wd S91qke` EJXLPev+VV`}.c$'yf8X5| iޢW&nB#|ӗPKJL4PKIG@org/omg/PKPKIG@org/omg/CORBA/PKPKE9@&org/omg/CORBA/ACTIVITY_COMPLETED.classNPCŊ"E&ĸ@VX`IbWI酔B\|(9m7v13ofN>qE컖 zrO1Աj?(Û7YG*mR:=L@h Dl呆Dp^̅);gz؞QeSr|ᤂf{v>0JP(X۴M -vUl?j9ƶ $ݟ:"Ցϸ-Da1G~rM"Y62S`՝PKyM!vPKE9@org/omg/CORBA/ARG_IN.class;o>#nv&Ftt}g 'G} xO?vFIJDļt}FֲĜTFFOF^ļ03HFFҢT*naz s؀$X؀4;PK 2PKE9@org/omg/CORBA/ARG_INOUT.class;o>#nv&Ftt}g 'G} xO?vFIJDļt}FֲĜTFFOF^ļ03TfFҢT*>yz ؀@$X؀4;PKBPKE9@org/omg/CORBA/ARG_OUT.class;o>#nv&Ftt}g 'G} xvFIJDļt}FֲĜTFFOF^ļ03Lq\Eɩn9@U{r^ڦ硿='? Ao R\iY<8,;̝XٶyP?a?^4o+9>5hpXjK%\ [{t;̗]jW-{)ip<JmY>qw ֌rR~°Bv Wo%eL0^V[1"c fK߳lNC "ۧwl+C=%%44X: V=8[>w^?ž2G1ҖLosy`y5ҡLd_ {Ayq׬0<6]ROG86nYv=呰E L󗢍qRo,1w}ӶkDkN{Jk0V+H{-4I+J8\P,DAVHrCYYؤgQݥ!+{#A4 gN+~u? 9ȘIRuYG>+C~e0:3^N=q6ԍOKzڔ"VƱOKy8QMэZܔEHpW8 'KYnn aVF}:QPrkt6(ZEcx/Uosm(]Yv"D@_K,~O)pHX#ׅJ e *lmX C8#D WB 64<'lJR"MڵCȉtd\RPK Cvmy0bk ie0,Ƒa.ۮuwꖨzseGɔ|=)oR@b꼧 I\յeZ@P ~j\6 Ba5'aKBC+/$CEúդ_ib1F/B4}'f_( hOyLӞ ,<Ԇr>Dd 9OP(`tR"M($ X$v64(|A{X_CWPK%ďhPKE9@ org/omg/CORBA/AnySeqHelper.classR]KA=&&#jjPHD\-JAR!0O8#n:NW$??dޙ{Ϲ;?>a(ݶw\?;:CtzBH1-:o{hí0V^0+H#0U8wBfG0Ԃ\p%= Oyð\KV{i[EW/cT]ؤ# jeVoS.#V\fvnj&QSǯъ@i 5I4{f=Zm{?y'¤:HS뗢I3o͐k}ߥy1O~$ϥ@d]y3> g04hyبyN*t9.&ԭ0SoC4 ^cX=PE p?X=5i΂6QP}_W'C*N\}[['O!9tN@qNBյWd^(0B1iYRD 8<wiz 85`MZ3K͎Au7E)Q E1zlb]V O5bs PKx!ڕsPKE9@org/omg/CORBA/BAD_CONTEXT.classMO@mˇC@19Xb%ě5 YL<Qݶ avvvgfv?>4QIA xxnGv.opܻ ^:)$ۖkbdB =!b+dh, 6\Sr@[3),-NjK cΦ͛-~R` _hURZDnÀVXG&{ J SA9ļ̦/g ]'"yEM=dD9.۹>L/nC}5ʉ!3 21͘f)dfsI@*zFuʬOECPK7qPKE9@!org/omg/CORBA/BAD_INV_ORDER.classNPӖEPcLX@VXpMH0԰%ljM/ąCii0.s'&2]P\Pzit;h2D吂Lp[S*u E=1Z#59OY8)> { K'(Z3%\1ՄEZ5Ի! 0mTYÊ$5w-,RGbY i3g ['"yGYLcX̅?/&Kj"?ώPECfL!YPcwN#=#I J@R8]!Sasz0NPK@pPKE9@!org/omg/CORBA/BAD_OPERATION.classNPmˏEPcLX@VXBB)xSkCJ!XL\>޶Sb:wz73_8@ 8w=CqmC鍧ݎ?'ig62.uS+tttL@] He!ඦ>[]tP435TОk,yu^Po/,JPTݥnu(O暍&,"ս2 A/A9[MYs7ޒ`ش܅ؕ?RH ~?:;o,b:#b.?`~1_ PyvB,B,E6c r̾s&$%*jvHtO)I8PK pPKE9@org/omg/CORBA/BAD_PARAM.classMO@ߥÊ"ȇL8x@V8x*YpSkAJ!3j 盪jfԮvq7FU2<s4e\Tr@ wH" ମ?%Umꚪk*93 `1o RN\vp&̿toJ1-I9xUK j(/J@$%#(p=+#l@1?e}K̿=P K^)ng4D^y~ܦ>f`B}6苡z!3 G"dcf3YjV%~.HJLrTIfMVBPKkVnPKE9@org/omg/CORBA/BAD_POLICY.class;o>#nv&Ftt}g 'G}'GOHvFIJDļt}FֲĜTF`F^ļ03XFҢT*~z ؀$X؀4;PKPKE9@#org/omg/CORBA/BAD_POLICY_TYPE.class;o>#nv&Ftt}g 'G}'GOWvFIJDļt}FֲĜTF`F^ļ03l\Eɩn9@U"h dffdd`e` `1N0 PK0 -PKE9@$org/omg/CORBA/BAD_POLICY_VALUE.class;o>#nv&Ftt}g 'G}'GO0GPWvFIJDļt}FֲĜTF`F^ļ03pfFҢT*Qtc@&332H22iv , fsPKMD_PKE9@org/omg/CORBA/BAD_QOS.classN@b"E&,\ +,@L%!iDak*N^H)D˕ 2δ!3g;gf>pExF{p;P YD F, 2@ ~D5(ґFp^7_mV2ieh?.<+-Hyz=~t)A &;C&ֲFlFP5Mp\W;uagdM_6~ok'`rmhV0'tTFOY35k| y}<;K R% Y=R1$Lm`cf%,1|_4I$ufLW}*|NW1PK>#kPKE9@ org/omg/CORBA/BAD_TYPECODE.classMO@mˇE#pp1 I#OBgy2Gw$(y|{PA 益瘊:nvs;vADp|?t&tXKlZ\1zT  .*ڣ0pME|5}mzԦF058)Y.;ww6%kİdžoskFp>G H?rkd&j8 dݛڳ͞qj` $%d6?*+/l2"l&XczqQNr13j!3)aCf)Yb='1iHR)$UR].Sb},2PK(sPKE9@!org/omg/CORBA/BooleanHolder.classQKK1Z߂*xEPA^Jچݔ$xIv[zH2|;,f0Id᝔/c)3ԅ"0z x{QYd:i-4»J *;Phݙov{/-T\8 za7~z{a 4šBH1|tF\t4C aNRa a@B/a'\Is)[^2|b7ZqӺTMwiخ`gpCZ?= R(.>m'&FJpb&Pi0(4 ދ-iq̗ۧ̑c&}&D_y! #Lrfv%a>Nn.<|z G6c';$'Lkqgl+1̰[X|n{cIE /Fɸ9Q"E#Ŗbly|)LW,;B,RPKsPKE9@$org/omg/CORBA/BooleanSeqHolder.classR[/AfUK՝kH%bx"Q4xAV;5f+O~%nmR<̙圳` )X RY9ŋ/SUJ!0rϛ_s{Q)$ڙ 4/{)i%x݄ MtZ7 w!CvŐ8UF3Gaz&>@7'B7d^)0D{2LN`LF4䱘GՍ< &h0dvC&IwJdH#l(1\,a=X1ylh6PK[PKE9@org/omg/CORBA/Bounds.classuNMO@} Ղ\Uoc"DO&ܗkJl[d2n{1ޛf) mW M.D21<\P:cU `MRhb|n2yS܋E*zE:Fٺnzţ_oFѓX ,¨,{ka_SpKkeUGVпѠ$ ČuW7 }Mة[ּ]ψ<f]츛NPK5ՒPKE9@org/omg/CORBA/ByteHolder.classQ[KAf3-] (" z#H! $!WuՕi_SC?]%f̙rΙϯ'L`ȹcݎU/׮2C^Ǫ4DK%gR#wu09G'+2힭.&̽:CEMaIt[n;u.m}1uo?2Q%c}GTD j3划oz}Ou4q{V}*)oj(x"i__ ɪɖ`?#8cЬiMbH`>\4mgf/CsҴ2SBFy'g@H"U=ȜL`C FY_bP l`/#+z0="y.|7[PKsGPKE9@(org/omg/CORBA/CODESET_INCOMPATIBLE.classNPӖEP&ĸ@VXIb [S5R>+>eM*kDi򗍠eSo#l@Լ?5z[m+fFf $iLtwsا1֏1ipCflQ?_HYv\\,er;ŐY4+"HbLRT IHA}JtNVOB/PKvPKE9@ org/omg/CORBA/COMM_FAILURE.classKO@KÊ"&< +@L@BRPjԚ>H)D?'~?q큇A0;;;~}| kj{4}LpxN|f_Fl웮Ch_Hr iġ\g:EC}tzW[*c S: RF3v=̻C4wDLqdNss N)ϨwN@[%(%#(2V!F)F7{&D?(ĒGdk *D"Hq?MnA|inawDKk@_ s"v9^#05B,9 $%"rT H0gvyPKƯMpPKE9@&org/omg/CORBA/CTX_RESTRICT_SCOPE.class;o>#nv&Ftt}g 'G}琈 O`gWvFIJDļt}FֲĜTFFOF^ļ03x~FҢT*qL@f `i`dd`e`@XPKhlPKE9@org/omg/CORBA/CharHolder.classQJ@={ZV^@PLE >"h@-}mHuSI$Զawggef6h^mջ pq9-K`{}n8mƣՔi6G9=OHp,^ wUȐsǧ 3۵9Ä^3$Lee0,aUl׺ KBv5SV(T+0X8"Î^)2TTG%FyR–c!si]j0!hִҘW1Mi ewߑ}@, 9ө|BG^ ȅU@U(EB2% Cl HH,IEmhuLcym JcWPKeF GPKE9@!org/omg/CORBA/CharSeqHelper.classQKALrMj&QVSO=( F|iܥ> >*;i>|ͷ3Ƕ /nG7Ep)Ak/erTgLvJ,`Yd#7T mOD' K#zB3B H8 "[Ag+w GZ'-U\NC2̷c=VM6ѯ`02L/E?9h*ǟp<0c?2 {sdIc; p;[‡hp-oh.<>[Ë[8(2^_cIءTeI,%f+mfRk[X|_1cĒd(PfG+SŖSbWm5*D:6]IKxk[PKO`#PKE9@!org/omg/CORBA/CharSeqHolder.classQKK1AqqU P,XA6ԕml'?%NK$|~R| NШ;nq, Faf)UEUbXxNYI:dHiݸ C#{!5FBa5Eبy'A\z'{dX,RY7isM[ưf}l**@WEeuJ>IOk_ U꿐 rʪ8ĺư?;JbHc^4tڇn!JQS&91ڳ㘠S'c>V?!"@LU= &IJ~H#c6،۰KFGV92k>o ~PK;IRPKE9@$org/omg/CORBA/CompletionStatus.classn@ƿ N[H @0pCTHmjHn*RO&V&āBn- ,ggv~0GؔYߓh{ 9H"˴ K Kb,D}=z"ak$򚇁X}",6ZG? |^C-B=LWQj4HUG$b,NA",SugiZC}4']]nE 4: QvIGd!0Na֬ Ȟ c-tm1{2,lԡ %W'yPk4Oj%e8?Ob#D T,S)mƉ&i\zHӍ똚Ȗ<0售Ԕt_mD?-.ۅ*1TQXY<#{sh0a>V4d=oiJlxAvf@% ^a6H kϐ0o Tqܴ'-ұ5ڍJ0%2:V\K| or.?ĮdĮ#PK.PKE9@org/omg/CORBA/Context.classR]KA=wi}AokA &ᫌ밎J(˕cva 3dx4}TB_*G|C11?I_%# jsw&L-wDA:!][2D3wa, EO-11ߚ[aa6baĞ7mq%qǑL4^D+Gb*{$<Ō*‚@XDPXƺ "qu[hh3PK!bu`PKE9@org/omg/CORBA/ContextList.classuPJA=nmee>=ЫKB3oQѝ-Ȉ{{K<:OCaл Z6\C0+θJd*b^I%5C38}elWQPl"G> zc>\t̓\0tɂ' C\k+^*SBiDfŃ_9HhUBy\dzeGzNF ᜁaO:z?UY[ԔSu ;T_]دCIG1I69&CYl>PK)#1PKE9@org/omg/CORBA/Current.class;o>#^v&Ftt}g 'G}ҢԼvFIJDļt}d(# P[Kvj>j)XlQMhk0 b8!}]lcǃ¥VAǖԉM ݹWB(tO~VvLM"^|)e[;^x ?ֳ%<`;x{ 0wSC?2-UQc[2V[[Wt*s9\gX*s lNYܺ#PKxPKE9@!org/omg/CORBA/CurrentHolder.classRJAf+2 (.JI6Fleݕi*衢3$u1gΜ~ΙϯXIb(e]]ڕ@J m B!=nkٵz[4T IAZח]a()xG wڋ_=ǎXy!^"&3G![u؎ưːF V,e>?Ҽd̖ ~PKQ|PKE9@%org/omg/CORBA/CurrentOperations.class;o>#vv&Ftt}g 'G}ҢԼԢĒbvFIJDļt}FҢT̜TF1 mz l  $PKݙ,lPKE9@!org/omg/CORBA/CustomMarshal.class;o>#nv&Ftt}g 'G}\ĢvFIJDļt}F\<#~ĒDҒҒ\k0F<%l:8PK ")PKE9@#org/omg/CORBA/DATA_CONVERSION.classN@cEԅ da VHH05#6uLH)D˕ 2δ s{@ GY=R=Rt';m4`4Bސ/tz3s0%t˂+~6%5T a+4˺DWTkF3ju9s<#r\stMBm{3jO9.#[艫 Nj+A@Q$e#6Eҟ}&(\VGYg yC)l 4. !_JC-~3KG*dcf3S JȬF5f$%&r@F E>U>ī!PK2wpPKE9@#org/omg/CORBA/DataInputStream.classun@IHHMKvw"THHuJp 4֋>@ b 5y1gQaaC-CRs`ǫN癞k.3$OnibʐesgybHHDPz.ox l03̓M-֤i=4*ޗ~*OYuNd((=- rnO+}NauWpҲ-'u4nf}㣰Vs .mqR6ay䟀Oـ/H_84?oI H >G(gPPK;ufiPKE9@$org/omg/CORBA/DataOutputStream.classmT[S1ѕAQD Lg0teeIvOrLd%=sNNҤ/ 33>o Mb@pJ]u|F?&h(\@=2.H?S$#@q#A$ԼP3z{pKj2NN"kl Z0׏P8:rN+I2q`e:LPT':& HthTBs}?":M?&AGp37)w 9'(.}vL.f\zA+ad n2=I ^]ϖEi?r ' iA-_?Zs 7Ԩ7<ƪήڱM QzJ RzJ jPZʯ1sKnJsio+WN:AMJVYYp"o[+yb jKW+[*q-e/ B}C|^s)+=lԬݒw71Y`Gi݂jڼ[̺{rJr E7|]u25g#S2Gq,q,k h['1kVlL4jZ3Fjcla1GҦ;m UhT 7m7V G\AuqLP`MP|2Ȼp9I#4 5EIcKl#A9I& ڔ4i'iʠR%MH1螤YʒU$]5eIsJy^`Л z[ҒAJf PҊAKZQq݅jߪz 9愞,֏r遵&`tƷp ⺧+o붍0iO=sAN><۸ܨilq bV6xxŻ-~G{- C? ŏ?b}1?ş?O?cAŇOY\ςy >lKc/syISS9p| y 9/qy UuZn~\+Dc?OUO񵇑Vw7|X),/uk˜DԘ5TT t`̾邾PKBt PKE9@(org/omg/CORBA/DefinitionKindHelper.classROAlEA4x|˜ hllm%^lQ+}2??80;}3̯?~xfL0Nxv;ޕVV%҃wr4&BHX<g" =ٷk}CkN2U̡2ʄtܓPFIbt$r4cuJx)VEk+alY 󔰜%j@ڝ=F!>̫{uY.^(H*vU&a{=Z%Ÿw]fp>Q 9ʘg,;I;_yՃdjrOmi7pp_'^Abľ;}C*۲.: BJ~a.1,g.q_=3fWi^=ܩQ(v%#vbW/"%#^v&Ftt}g 'G}<ļ"vFIJDļt}v6FU< RK28DP bdP@)/*ILItq+,dd /-JNuIedBF0S$PK>5_PKE9@+org/omg/CORBA/DomainManagerOperations.class;o>#Nv&Ftt}g 'G}<ļ"ԢĒbvFIJDļt}FԒJFI OMTSR֌ \Eɩn9 28,@Y@,v PKwPKE9@ org/omg/CORBA/DoubleHolder.classQ[KAkvQ EkD[AQD$T*.4k)ЏΌR*,03g|s|}|8z!'ZiŹYc]yNqDmݖY#ư1zBrwRXBh;>;][1C5˜Mb TvS}=_yVA2"'Jp'2ڤ>Q F%k~'9 P ˗.U0c{ʫ = [rk"$CEúh2CSмiEi11E߮b83t3 ewޑ| 9c:>idTX49K? H̑fDvHJ0jA!:!2 W٪ƯPKrMPKE9@#org/omg/CORBA/DoubleSeqHelper.classQOAh{ Զ ?h O144eSwuC(%ZafwolѰ췿(dG"#}\vT Q|"LG~t"KBqys-ʃxؕP0!aHhei0g3z"v0Zz^4Lv.;r܎1Zm{;6w׏J(=Y3kxkG/|e'x/Jl .i3 SEb.-~{t,߫0grMWUz_WNcXqJL[UE԰4Ql5#v5bkĮbmإb /~PKxPKE9@#org/omg/CORBA/DoubleSeqHolder.classR[KAf5-b=-0J@2zAFlcum5WGEgvIafΜ.眝OX`Xrerux}zb]−xpqD&x[o֭bATU1nb˕*))xC Cmxtwyؑݴ1Cܼe5@cI *Mq5*B[-ɨV #s.ܥk1l>_6[ i @-^ZTؼC@̾EOudH\OVŹǓĎy-8O(, eޑ|81?Fd&䩐|Hя<3 $hОiB2>{%2$XGDƗb60kFWF9g>|7[K?PKԖXPKE9@org/omg/CORBA/DynAny.classV@'R(ޭ^AbUpB@ۓ@}4|(ɦM6/;7~yԠO1 ֬|(vhv4PH0iX%A">x@t]NK2fg .Zٌ$rմ:1tl5T: L곽3+0jPobOF\axBkn\bXV'^d<&h0;-lMӳvH|[5I:6άAAGE8n0IID5PpQ1#A\^'&jb``V; +2l0h *>͊:<ܵj*wBvPp?BUmfTcD0Sa~RmwRqLYla5M7d$TaJ9eɈ^ɂeb'I|p}\(IP;Rn!Qb*jXH~=g4bϴsG1!؉MъXhdJ{2m;kJT'RXkqy3M D ս7,shj-X25 .R|lKěsB)]sPK?1PKE9@,org/omg/CORBA/DynAnyPackage/InvalidSeq.classOMK@MFc5ڪ=M*B BP16]j4؟IGi@D}̼y`m)U.d*rzŒrz. a̟<?cO % Bn ܞr57QG р68A+R L [WM7c0a0g)s-d)/(޵.~&:gZv,{0}&z+^ʱobl`bsF0hЊ*A/j)^*,+%PK!PKE9@.org/omg/CORBA/DynAnyPackage/InvalidValue.classOKN0iP.!RBnjC 7X! aY^y{oP#2lɀ@ίYN/dR1XZpO݌?""?&;3&GM4B!e1su)'Y҈)abF Z`3XhdBG2Jϯ)? saL?5lC_j:j$W,رk]\4j4J|xÊJl֭g;_PK!PKE9@.org/omg/CORBA/DynAnyPackage/TypeMismatch.classOKN0iP.!-ݻJ S9iE P;x|{p OUD$>=/d_,|bbƯD< v3.C>E* !E~JP }jXmɯɄĜ!L SWM;w<1JȨW`xtB~)iCK`3}F}K9ttfk:6xko%ҳU_PKK[PKE9@org/omg/CORBA/DynArray.classmJAliYY 4ЭW[M1?͎ECI!?|>B"\4V}:K:%T/JUzVL;L0 7}P5|<\#Qx0ugMZ-+mPKPKE9@org/omg/CORBA/DynStruct.class}N@A (eeI3Nqh 2b$3  R`\;]^6BB9@n,vpLoJ4Ά;1ÁO`H\?4oS3*Teqƥ/LZ{"Heb`Vg B^ t3.7z.=5 2]+~@*=2hffgfKzhwVAPej.E߁#4jֆ@ uקj@!,qBRr-.إ2dۣ{L[>&l5 ukHjT8VW+.|Nq;ݮv {uLib6l@1ǹBȉ'8fC[ZQWffʀ ı_Ęƛ`N=1`L,`N1X\Dޏ18,N1ceXA|8j]lC$f(Rc$eN!~PK/NvPKE9@org/omg/CORBA/Environment.classuPMK@}jT1(e&fk1dݯ m긇x[OPKKmPKE9@!org/omg/CORBA/ExceptionList.class}PMK@}Cc~[3/X  n'o|(EW~QO>aT0q'l4OeTgHm'mYJc(HXME3zщʞӠo~3R"v 0Z x/ݨK<2ZBosO Z.3V- 7.v'DK>fmoqo.E7է08/{<n1Sa?4>i~kOGI_䁲] e%V:L ]lKP K*vE&v>#vX_PKB;PKE9@org/omg/CORBA/FixedHolder.classRJA=IScVPq# >EPTX &Gva:ۿj >%Хy;w9;#=l04#5p/O3]FA_" ;>^ݽ=]Ds(Rw]i%xhB1b:Nɐ C9!nQ_ë2^PP\aW넲G=p%=Mưg!.𘫏oz3~(։E |7O!?Fۚ\S޸6+͔o\ (V=q&͸S`fO'@wEy ewKl U,iN' ڂIA 6 ua4T[$QR4(؄ERb-xp)C_߰bolPKdytPKE9@org/omg/CORBA/FloatHolder.classQJAf3~!(Z# #(A $!uՕi*衢3̜9svth hnm7fqu%t>{mXM#ΰ;NBc5),U!;{b1 ۲bH0*vϺ KJmr [dL>/ Ț2ʾǀ*j1z}Oqoo}i(LW (*lI(#Ҿq 뉦Ud#38V_Sдib1Gb7 t3~"A%~24T䕐|AE^UJU( !sIғ 6`$%rȇGa{ȍ {XHMloPK_9JPKE9@"org/omg/CORBA/FloatSeqHelper.classQOAh{ -m!Ѥ%0&Hh^xږM]r忒'{@/33|xma=փ ΗA+od8Gx..Ehtzo*Ram2ӸFZ fkdѣXs4bH{Ո2'fLVA;wv iՃR7l)+=>xl}~}~]Cmxv>¾XH_TVnUzX3WČIL\vWߥ1J:x5I쭊"X)ꚯa}-ϱ1KJFX PK PKE9@"org/omg/CORBA/FloatSeqHolder.classQJAf3?.*I uuצY.̜9sM l~eV.OsUgD!{ǻvײ+;P& +/®*)x[ ]t7%9aڸfHME!Sv#^v&Ftt}g 'G}OʂTvFIJDļt}v6Fy RK28 bdP@+/*ILIWYR_ZꖙB$PKP5UPKE9@!org/omg/CORBA/IDLTypeHelper.classR]OA=wniEA(-QAHZAdc Oˤiwa ?xgv`mه;_{?b^%8o70w*΅aoOe'&xU⏄FE')fPG T(mD' Ac9nCV1%gɻ@w˝f>Я 9$NF3wkvSԜU^l'8BmdI^(.~V97|'RYAch? c6'E}1Pod.idIa|#: ȯ۝ 6?]O+7;RE>0}e\3 ׇ)y+%;taVn1eγb\/yEt,§.lU &i"Ʊ%,O,)nDRjOl[6cmzPKPKE9@%org/omg/CORBA/IDLTypeOperations.class;o>#nv&Ftt}g 'G}OʂTԢĒbvFIJDļt}v6F4A9^Fa R>A8秤Z32p%eUa8@d76Ff f:"vH21pPKxPKE9@org/omg/CORBA/IMP_LIMIT.classMO@mˇE9pp1Q"Iম)d2 A=;6jHU?5ߵ兦w>G(<ӔB{.XxN 7JϿ*dl吂Jp09gkf0*3 Zbo#l@5?]&~z!$?&R@T_ kD&Hp_.0~ ({gc}-BD9^x+>eT 0w8盙'JЖϖˡ^= ju,ef#' w }bJhQA"y[{6W욾-Qv_֡J]Ȍ>#U5ǷKojsZu-a;E!zr-->q_}5IYvF %ճ#`ά֐~|ʌ^,#Ь"3PFs4.*4V M_M#sJ4e;:FP&Ôbf3Ѭ1%ĔtKIB:&CJ}tNVbPKˑsPKE9@'org/omg/CORBA/INVALID_TRANSACTION.classNPmˏE&] +,@LjդIS %lMB\|(m7v1;=盙۟߯o--),HԻ@ Y}=dYf"˻X |l膀o^%xD) ຩ SrMߖ(t|jP%xFdFY[[AY &;2CӢ833m:]Z 3" j l52Xy`;ÉMkfd^AhA\+ȷO>9]q {اo/7+hR?PJeڃ٣Ln3kfYILI$l bR+ѬJiգQPK;v PKE9@org/omg/CORBA/INV_FLAG.classMO@mˇE*L8x@V8x CҠYpkAJ!_g!s^lr#H v2$к#ӡb+tLt710ޤշ]ߝ:L쐆YK`XpOG#(Z:Cp'I-|3-ڿi ~6kn'atm?Ƭ;J 4ᥐ6l7+66`b| A_ո&KoY=YJmT60ӈkeq.IzB$mɈHfOWHbNUd"FPK[XlPKE9@org/omg/CORBA/INV_IDENT.classMO@mˇE9pp1QIম)d2 A=;6jHU?5ߵ兦wU8@!8\=4!uOS: c98(=C *YxXa<О*xfhyGpNh0&%(rVD$ j/5PYZ)cEPKFPzV\O6j`JL̿=PK^ in3g6L^}ᾄmnQ~9nsq vw'H_kPHECLi1+q IMH7l U"R3Y#>>̳ՈqPKmnPKE9@org/omg/CORBA/INV_OBJREF.classMO@mˇEML8x@V8xӀ)kAJ!3$[XZg8j_inؾu{)(ǫ3):GU48% z*?'`pm(?&g ߭ Z d68&+r/OaLE|-l] }9D/fHErrfj 1qIIHCNא笐I*SѽQPKm*pPKE9@org/omg/CORBA/IRObject.class;o>#^v&Ftt}g 'G} vFIJDļt}(#vE%y  "`0$&{dT22p%e22l9Ff de`gdFn PKPKE9@&org/omg/CORBA/IRObjectOperations.classeN 0=>Z.\| B6-5 G N~<LwFJL X.\'Pv& 䖰*/$df:p[乐71%V N]uWv  ǜ {ƅgB?PKǃݢPKE9@$org/omg/CORBA/IdentifierHelper.classSQoAzphkHY&FI%1mB$Vv_O&}LgK(p37ǎz~ˡ?PG?ʃ˰r7ڧҟd g [ "%drH!Ͱ\6jv_0p%> .ƦV2s!gpdPI$ep&ժ$aG@MIBTC<0T ?#Mpɭ\iy1nR[&KIMwi4ir2dHuWin{-~{& zF0G+z>d=ԛxpE Yi!@ c9"1 V2W)ㄹcOkX|vAcqE /NBfU: Jؘ+v=&vӹbK>Cy؍3bPKC#>PKE9@org/omg/CORBA/IntHolder.classQ[KAfYf7ֈ*I5F]leݕi_SC?]Ą%f̙rΙ/LAc(kqո0jq)R3z| ;]mBa/e [i40y_ !=:Y!yf9Yu1o~;_w~R0O3CQq zwrqH5B Y D s3IzR8&F$D +~؆&4Jc=hX|%|7[PK;m݈DPKE9@org/omg/CORBA/LocalObject.classU[wFu8p=$L(.!&1Ц:9y:{Ee]>/>qNQfWŬ}胤||;?: i7 nQ(U;ۅ[v=9viNp2;D`[PB`X3F@ Q0Kea{fJ[_Mf-'VD.wnh/Osi5ýòYbCjwX1-UFK&\F#Ak& I߮5-׉)rlm;90ی iV 5@`НB37nZ٢m0Z0iu`ȋiSքZ0rb(8z$o]fzM"oٺJc8Jow|!HnC]]k vB4 9@AU֢kR;4'WbgRFT"߸Zf/_Ta-zChzt\dǨI5]~$ˆhRlF=&jXemX޷_OZ\VO뷉 A0)L.ut=D '-g*M芳GLɦvŕT|/)XUXujd{irϽwW ^Ż_۟`od`Cr\h`~(̐4Dn )FW[&09iJ3CSa\z9Xh䜇JJDOF2aFf*r2ySȥ>ӱeXQ"g$rB7қyc1qw(ųcwOԘ9%lrHx 9~ze"yr!jXE> [Go7{$>g )cz2ELa{e[ĥmؒM.cYr,soEڦV7R6VhW Je3!kɶׇ2ȿ7_PK/20 PKE9@org/omg/CORBA/LongHolder.classQ[KAL,-0bIHUF]lcݕi_SC?,03g|s||~8f/jեi^w#0;t4'.1lrھfI T0n@'c;#/& C7&04 )UE^:w+\8KF̐JƸ.*`5ov uq?@%,_TR#)#P"I(#ԾQ!%?uQI Fp> ǠYӚ}iڴ/@h2R'cNE^ϴ|yEӔUDU(eBteN5%C/H"%2$zmDۘFfHU2φiuPK) ۤGPKE9@%org/omg/CORBA/LongLongSeqHelper.classQmOA~h{ h &Hb\lb _-sI{W-/J?2]5咛ٝygg` >ǣaz)Aځ\x.+,.vȌ)ke!MտP&cݗ]OE+4|>| /<%\C)#e<\V:+Gz<fL+]fR咫ʷ.Q^bki2kdO5ٖT)M۸%9^LzG,aPKlPKE9@%org/omg/CORBA/LongLongSeqHolder.classR[KA>,LnEkD[AaDɒ2`+MF"j>̙圳 ۚmk7+M\e|g-#$>LjRÚ"a;ԞmL+ hWB}j:x*"a@@W oBc0Qqݰ؃m0^InRJ!~2(ק^@{Vt㵎ﭞ# ; P Sc e _!N/9bo&$hvxr@8?NG+@4 f>!Kd <$`OINsYF+XL!“9s(=.  iW"Y_oC!cAkfhm?PK+1^PKE9@!org/omg/CORBA/LongSeqHelper.classQKALrMij)=[蓥Bih/>mr]I⺱_SQs{#m܇ݙov{!E:~=? &{] Jx=^s.PBeB0:%L8< y_ߑXtzG];Z43?%a=+qj=oMz<&Op\o?i€s^JܵqܧM?&4Y & CRioq3̧cfLVA;GDga v4]UYxp-oh.<> /Ķ`˘f;ϲ/biءLeym3&63t,̯)QVb+I2m*-b^M[IbW2b7%PKA:xPKE9@!org/omg/CORBA/LongSeqHolder.classQ[KAf3-vhh+!HX2z!Flcݵi_SC?]D9s滜s>VS0|ٰf:+_X5*wB`zmnkXꃨ k/ª()xS mt%9a,0$Hc"0i; U!#zkܽ8PÊKE6oKM]QUuMPwk**jaҢBG%e/_HtdM;ĺư?{Ői贏 _(&hOYLҞ4ɇts!9bf 9KH dtDKu$IB RVg.͝1ئyݛ8A%x`3#9TA@:[%8KFPaB˯#l@5?m&F}o\PPp/$HWL^~ᾄMna|n3Qw6kPz 32 1f1d%f !BR%Y!E:%ާ̣{!c PKSSqPKE9@org/omg/CORBA/NO_MEMORY.classMO@ߥÊ ȇL8x@V8x(ēYpSkAJ!3J1kjg4TAw0&! ݧ$ڦcRdB w{@Nq(5푮jQPu3֡מ[LtEKҞ2N-F&3E%e\T_."8n,MEwތL1{S@)!̽8&1"vMM5CB= Dz#1G,`"f3c[ŀY k֘E~.HJD$y a).)9%-/PK>oPKE9@!org/omg/CORBA/NO_PERMISSION.classN@cE.n &J iRP֌1!},W&.|8v`]޹=N?>tpG-s,?\d0 C Nuen.sYpE 5fr{4H*" ಩?5UmZ̵=gag4X-TҙkV΃$ޜ33qrĖ|L=e.i_M5/m_6/+ Xea;9dbiυ m+xde18q -"wx6"Hb57"M1{dBf5f83¬zI0k )1iIr ZfMWPKX~oPKE9@ org/omg/CORBA/NO_RESOURCES.classMO@mˇE#pp1 Uম)d2=HPt>3 $}?5ߵ5?zA􎙁Bpxo>OCvt2#Hsv<$PtC *YxXa<5N*xfhiKhohpcJP4 sT6%80~EpTWMen _2 Xq9cς1bbfO X RHs~MlKX6ŷ6`||zyqN kH0ۜ)`#f%Y` 隓JD9KBRyt'b~PKqPKE9@org/omg/CORBA/NO_RESPONSE.classMO@mˇC@19Xb5\MM]R џă?em{fgg}ff@$[XZg8ûq F7dx^><`Kl3WrlBt{BN 5\mf>sV__vS}L{L?>bCa?/ۼ+r ™J{0'b.x(92r US^בQfRc !; U-5w"e.Cei(PU$PiEB+[/$f_l9'sOb[F@+"E::mA(g^sYb2 %d ,V#7 aX7;PKo3<PKE9@'org/omg/CORBA/NameValuePairHelper.classRQOAlEAEMZc<1FIC o˦.5¿'(R9afwv?lb#Gh&z&Q~wXEoB/2H',cF"B@k*PG eBWr'HPD}=gA|WGB![@-,f+؎Oa,k (SZݽ|*]YGR3Yײ0z<-k9&6Yx%ŸnRĶt¿R)pҧ ha;ߨ z(?+;'~ xdz6SȞؗ^­Pe[vef;?M`}w_f`rEs%8EnY%]z}z]+l+h`PJN#bWĮQ՜%8S~X$2dmtg&_ܧLghnoJmRXa+'Diklm.. {=#1oyciace>A~PKK:B3 PKE9@$org/omg/CORBA/OBJECT_NOT_EXIST.classNPmˏE.4,\ +,@LӀ qG*6?ąCm.s|3s 8?dߵder׿'}6izF{];x=|oM 4E*!಩>kCv ϒ0=;R7.W.#U3+ t1 ?7^4]FpA@FqNS6-.`nm{sfDbf9i,Db7sئ1Qk]frR?EFI,C%aVi.bf2 1f)$&[J2HԊ5)R<]%Ssz1PKdtPKE9@org/omg/CORBA/OBJ_ADAPTER.classMO@mˇC@19Xb B WSkAJ!͌O] ޤل@ ;) \VG}+{1}uqeprऴJviO oO- 3ݚ((tAp:FJ.H?tkdf8 d]z3Gos j` $g6|?*+/l< l*Hczq>aN^وc5M0 1 잓4d$i a).)>E= G_PK9^pPKE9@org/omg/CORBA/OMGVMCID.class;o>#nv&Ftt}g 'G}_0_gOvFIJDļt}FֲĜTFFOF^ļ0/#Wp~iQr[fP/8=Il@m U l@cbq\PKmMPKE9@org/omg/CORBA/ORB.classWi[W>(jEV(*ctH.8;}#~C@Tsf& d"93;0 ơE.C%ZrjadSZVyU_K.YK뚮Y & ĦhV;M}s.K!ՕP`UiUj,Ƭ@O묭/e`3YuY8̡Ѭ%2iI5ke4rU͊U`"1W.eIM_ xЗ7\'|ܶQ0 .ݐ0muhwU &x=RlXb(qpVTSfr7MXӛmQFV-8P+uM$gu,S3-[..OY4&eT- ҚayMaMQrU-8f&*Ćɣv;e6Ju*a\ZPʞMEdj*p^*(p uIYťfRuբYD? yT1MFԤ"m򰡶}()k XA5SF^Wm(r.S>IrimŶ@x[mچȱTuNvVmw^W]-Ҳ/am h~TIFMy8TʶYn>jM>FN0ݑjbɢ>*vY_^L.0g`P4ZðoE5hkFJCbbf')Β4)n;/`VIh8 / nZL#A2fRyjI, 6bl)thoِ҆F:6EL{=p_N<'"mif喷{MX,ɓ[&̉U9P"3HBC\ 7ĿDeM[^[n%N,JUƁ4u_syPL!Zfު! ?f.eVe^ա̘:] b1/$JO.Jw&Lg6BO@Š[xٌytqԼd4xJg,& 4Y7+V8ު&La\0eQ1NU!i3r(:f3N׹4rtfYª7s4 7Wݾc!.ZפP%9L5di(Y9c]%ЊtǍ1OJJsbSFIfmCw#"v0P@~oߒH;C o/vnA}%5` 7Az.ַm]-^8aV0Z[Z;?}LvA s $#r4,-bAA=gMsheAږYpn[g"G??? c>H/W-`:#c=2Q q~&ނ)2@'^iyn;hq.˖=\u?k6>8|gSExiD=l)Xf4 Y;8luLA{N]V\}OHqwލĝpb 5ؖ;З WN!~8nל JQO;' dCgs#p'OUX^KxZPvIozQ]`@A;;A.0yO#rqK]vtaEb<`j10eX8m&G/GL?Oj)<q %ӯkơ2w}T= -Zz W _PK$PKIG@org/omg/CORBA/ORBPackage/PKPKE9@3org/omg/CORBA/ORBPackage/InconsistentTypeCode.class.AƿnwYH T$4$ 隬if Jx(qf7 sq7眏ϷwhvMsusz\Q_Leyy,;N6#gOhHi3TZ[}a*+-/'=1JFl1 \\&^e <~mV Ny7Jb{n؏*C5s&o񮣰: y9dC8)#nb(Gd"ڬtK%|HWr1so|PK<PKE9@*org/omg/CORBA/ORBPackage/InvalidName.classOJ@MDcU/^EWIEТ *V{ߦK\MMIPia|{paK4SNp-GK~"QHan*s$r3Xe*?auwF n_Odch*Y:Vu$0Քa;ϳz A'"07*{e~!̾ezf"yl`}{V'`C=Ч3+^u@s25T#b/Ziޘ *hPK!JPKE9@org/omg/CORBA/Object.classSMo@}[ڦ$_}tH\sRРbOݭݰD_'pUOͼ?:֥=;I{'7{ïWv\2eҊؑ#I:6<0.[O yMگ %VM(lFn-t^z?Z"֬J\9t{M̦\mudJ^&veTJ.xuR޲C) C3B$h19Z(:PHߐ*Xsmv? l0/jF"w '#㒨.U.#)s: UϢΪikJt=]r793{ꭒ>.Cx&`]&Zsی;e>}t!1'὆gPK)m[PKE9@ org/omg/CORBA/ObjectHelper.classRmKA~ַ5VzV'EBi!4Pĕ.~Gg7>3ϳ36xZaV\vH'̞KDMr➊'L'0>eL4a-h$awDDheI7gꂰWK~*F&qۄ SJ|zܑ*r o+/΍ ̺: FaR9h;VO7:heh?WQkhóQ<]ύ݃`O+ 'xl.lG_/5fV&!=b!2YE\}oI:J&DT2QRJl͑Dcb$+)k%GPK-gFPKE9@ org/omg/CORBA/ObjectHolder.classRJAfS2˂H# "(! $uՕi*衢3(u13g|?0 hY^eUj7gVd76ma"°{ry1֭6o!Ok:!vty0U*3D*^ӎc s ΐ:omqH.Vwp>LFPktBf2s=*o2lB]u zč|RRypGyնHB&|9/$CEþp}ofW=/A@#J4}32Kq-{As)W2Z9.d3!aBy2t>$,6 ; fWuEXk>aF ۸RKa۽y~O(Niq;,q)0h[#sO$,ЎF+Mq| ;vr a7^5[_{bٟ|P`s"쟳أ҃J x*1tI\%~I^I#{+6*.+X*@kM>&7PKuPKE9@"org/omg/CORBA/OctetSeqHolder.classQJAfҬ̂hh+" (nQX]fު.z*:D 3ssΙϯX`(euZ*X*])d=q᝖Uߋ#ưR#uqǣӸ-1Ď쎭ȩ a* $Re#.v]>[vܹ0Qw#Jmޖ|tQYM Fɹu*ǵ$A/ #ARNKc!0ˀ|aoVPKٝޒUPKE9@!org/omg/CORBA/PERSIST_STORE.classN@ϴNJ"1&,\ +,@L@B5!},W&.|83Ts{w~}|h$,w-7jc:sPΒunea.C]۳q1#PzBN nPҌ0=3ԓО.󌐆UkwnS:wL/3qQ SOYCpWSeC+2A/A9]mbĴ܅ؕ? 2Ȳ?|7Ke1+(X4>{s1_NWib?PeCJ2¬ f-$UԘ4f$%Tf"Eӕ>56̪GqPKjãoPKE9@"org/omg/CORBA/PRIVATE_MEMBER.class;o>#nv&Ftt}g 'G 0x_W_' vFIJDļt}FֲĜTF`F^ļ03hFҢT*aTC@530J22iv , fsPKC"3PKE9@!org/omg/CORBA/PUBLIC_MEMBER.class;o>#nv&Ftt}g 'GP'Ox_W_' vFIJDļt}FֲĜTF`F^ļ03dFFҢT*!3@Ʊ22H22iv , fsPKmf3PKE9@!org/omg/CORBA/ParameterMode.classRn@=RBzIjB HiSWk.c&$> 14XZsvajA:ɫFp,J-az! p Kb,X$ӻ}]@=K*-z Zo鏄qqs~F(eU*"irE"IS|//byqD%ջɻGEU|C؎y4:3 /P'``"Z;>6€~]q xa%;s.qiei:R}6SK!+Ɛ$.瞲9&zq^T Y*#9L_./M;eB >#+֔r{߰}M[e o6;W x8y‘uX~2Χ9fuN٪PKҁH<PKE9@'org/omg/CORBA/ParameterModeHelper.classRN1=l$喆@K!\!RZR @; Fnd.E*Џ:] X?9s?v!TC~o>B4ROWH%L D[31(0V#Ca9 M~[#IL3ޱ*:'Aלsj3S.WF}׻NJ0ܽz0;Jp T7ozh |WLn7%OKiAM,[0%E?kO)zPK;x#.phf;֟TP< #hN*#&b+* AD[O>{bqPdY4 DF:V/ jV)7+ŃH`c 5rcRs(G5t$={tWI%xܙ\~Pz7vFʗSkN4=p2` !``u "h01 b y%8qF86x`-R3.͑B"0Er)R$E ŮgC#/CZdO_Vb+? PKl=ԕPKE9@org/omg/CORBA/Policy.class;o>#^v&Ftt}g 'GJvFIJDļt}v6 0F9l&%d3p12()/*ILItq+,dd /-JNuIedr rFf de`gd PK8#PKE9@org/omg/CORBA/PolicyError.classuN@-* B=Xf0&QcR7uM隥},O&|8 Q.3;~}|8ƶaGSo/νu ×H3q!PDݠ>CR2 Z"2(L#xl}~}n/Cm)a&!K^WY09G5N1_8%~%Q;MÝ;s/#l&&~|{ &?hO2J',3F"B񭊕yG7~+9e̠4Ѡ+FNz":ZswuJslynڻ `&.ay cBh_?hSYto+GظۚDۤs<6$ )a>rj?1Zn9عWB lTW5~x8| y%^ /0{eE\sy-S˔EYE\斻|옞W4IsXu2*V8\+N|Orͮ0̮enckPKr dnPKE9@%org/omg/CORBA/PolicyErrorHolder.classR_KA=YiDWAQ%Ed*vr~z zٽCԸawg~ff!&muzxu?0l9gY-O ֡[ˍ!ؚazEpveH 0gsF xnLqA/e0hva/&j&|ƺ1 UÀCNGpZVYRX Xs&_"T1/ R@TӾlIfqc%@>9 .!?G*/MW_07 4X= qe<%9OԼȫt.YF+XL ‘9QLHIAHAڕwFjmd3O{gٺoPKɮ\PKE9@ org/omg/CORBA/PolicyHelper.classRN@=c)@AJZJ}!j }V"ǎ*OH}זHW>Ξ33gvlѠw_@Ɵd0 p)w}0lBV1Jm/AW3 $aDp.JӍ+z=BYHҾmZpe3Ͻa9CplŝZ}~Tx%5˗δ'ԋ ButCص}-bRKBHIp2)Nk<_k4@gOF1bVA >ztOd'Gg7ZwIhWt@>ݘD^*[."!|#$Q̀K0h,` hdf03 DUm_PK1\wPKE9@$org/omg/CORBA/PolicyListHelper.classS]OA=wvmEA(-MZA!4-:dL@>GL76`sνޙW 6R n'o~~McFo>ɸ'ux"NE6['m7*Qa8",cyP$,D*_ݖԇKRE|$,OxMWK–ޮ{p}l &B$,!&]PKIBWPKE9@$org/omg/CORBA/PolicyListHolder.classR]/A=wHH<  ŃLIl͘W(>iŦlPKQmPKE9@$org/omg/CORBA/PolicyOperations.class;o>#^v&Ftt}g 'GJԢĒbvFIJDļt}FJF MlX321kh12peK* Rb \Eɩn9@!Qt@ֲ12U33) l '3piN. t PK PKE9@$org/omg/CORBA/PolicyTypeHelper.classS]OA=w| PQĖVM| IcާeRlw<GL76hه{gsf lkq~ġNN&y$Á>s1A(^ˮ!wU!So,"r[*G'JR+Thec|SC«U|haKW)~4i49Xw=azu˱*q,Ԝv_ks'-\oA*hFRYpUxo`˘܅VAoMR'}APB8xl}}n]Cm= b>!M^2,bzXc.q)sE8FW)f1=/mQZb`RȞ-`+3RbW]gx>S-/6KJJ;borPKpi~PKE9@org/omg/CORBA/Principal.classuN1O?ED+w`cL\iLj" Vehd%Cte𡌷D.mO FGnm5ݧH*_NxC4s\`,|ÐJ;TcHPvdTqD`({AGôySco7dQߌTLxYCaj0̟ cFaop&"[Ca61A,ckavVeA*i?2t }=uaQgJ%0'bWG y,ȋ9=Ayœ 'hpx˼L.Ja<&I0 Ϙ&0iSq,ۓ4e:_3Ģq!*D6Y [Jygbeعإboa+PK.|DPKE9@org/omg/CORBA/Request.classuTKsA !ļ+5˪HJ Pnn\fpvgyʃ?e3B |_{/x0`U*ߑ]ߩ=qkCAr;gKt5@ LbKB f!`<TM rC@݀=:$9p}(ҙ YJ `-XXNq -VR\Iq5ߦa&lmqv-6]ʙ%G1p` 54ӓwO->X/l/PK̪CPKE9@!org/omg/CORBA/ServerRequest.classRQOA-V >11IcRk|j iM_Kz^S>GgKEݝfۻw_ҡot>7.!^*!\IàQHa>1;81(z0K0+m!8U=ge]$ 3Z`0Pnǽ kct5U8ZJYDG4`=_)5IuRiD=)2%Ķ jOQfPUR&ԮBvf5HEcyOTU[[ dǣ })2/a-JXG](.SdV2{n@#і6c 7lѭ.b/PK_hh9PKE9@'org/omg/CORBA/ServiceDetailHelper.classROAlAUKAQ x cUIcKxߖM]rkmJL|2n/.cfvgop:_]'/I#TQF#S1a$Aʾ!_X7FිYJ (HXlX~{R^$ +/c=A|UgvB -,~#8/7a?9auBl_>k|WTLr퍬7'OKZYQmV) b')b1_hdq~)ε2:csY4*C(wImD<_3 '?qo<]pl /S^ {Ye\S䶻˯i*QVbեW)UƶsŮen8x+vE&]ψ}|M,aPKI{~PKE9@&org/omg/CORBA/ServiceInformation.class}N@ƿ_Pb^ЃM4,e%KBcy2P 3}M 5m5\z ^T8ZB8sn<HxBfP/lZ74|ͥ?e8kGL&|B=!s%.C"$ y'̕x"|\0\qCŔ~$yswkyxCf'e4*{}I4@{ГF # R*-ٔ"Ō)C17]#n1"MՐPKN7I:PKE9@,org/omg/CORBA/ServiceInformationHelper.classRmkA~zəXmmcUTOQ MM-^nWI?%nZ0;;<̟~xF818 ݸ+T*r8&BHX>Sĝީ[Bʾ#,4[DŽp/9U,ʄdԓH􆒰Nbx,r4/lSC7k:;J\# :O l/ݵFߕ>Χ_/BBf?6NuIJ<)FŞH%ח1g-zqk)}5r+u&hyTM&/?(7E[W3p>$RBINN~rN_cSA?o~?;[BdW\J*YV~s/& ûi҆w᷌|`C"Z73dNd(WT~͐>W=C xC!Cq :BcՆkiI2mB˸B2.LEP=q .ad>8sV<r>ChS޶vAKC\fdB2Z*]q!m+:o@EcC/s٘W e?Fiθ: 4cVVK^MGz\ Fkt NXcDqB%I&Jħ ؜װ"\l+PK#]PKE9@#org/omg/CORBA/SetOverrideType.class[KAͽ-jK Zm&I@0} 8#]'>CLPvϜo9Vz^yzk ] h=ދ w|Ƚ=޹]Bag@xrj܋r]+F\a(;딀f5̵*JQy} CJ)M n CC!^nD2y)iEi eT0jQ>W`l0~P=p颀% ̐4VE 5U;14b$1ی+>6]ݡ78'1`Xʹta 4DE5Obޏ/l0rմ&5ʫ x~$i_THzaj2ّ/ hڴfh1$1Kb7t3|"AE~2 ,T\H>S"B*Z*g̙$IˆJ0(Ea{( {X櫑٦PKJPKE9@"org/omg/CORBA/ShortSeqHelper.classQ]OSA=si{mEhiˇ D1IC/ᅧmٔ%u"+}22 Xafw̙3[>HF;d 3("a"y4t>$,; ̹$akm\kd^4d+O*f+*qK>4tdLi)EYV% K1Hz NfCYac 3&]+àG4Q(,#ݕMy| vrMa7^5[_{b'?Ķe={O*[<\xn]$ M \mJ"W]aJ !H>FfH9mG3-C̫bHc )W~*MHϔwot=JսP(V!y;rC;*ΰa~*PCu- uJ=IGj_U )eM;z:9l.hFh1$1J߯c;tn!JIA2)!ӘS3Ncy6 υ,U=se&IJH rZbHb+j`/==?=,`/Pl9|PKMUPKE9@ org/omg/CORBA/StringHolder.classRMK@}kZjA1<" ^eۆ&eTWz<Q&h=d{f` @Ӳ*ק'֍ߺ#2H1ڼ--Ro; Aa'랣塚aǽ΢M2\ߕ CF!u4,0( ySwD5+A{5.\u)y3,.Hl݂VqCRMuNuwCy*bإ.JyeYMADJ(!{᜻jVSV.h b`~ >F7K r=Ӟ P$ \tI .E1XESԅҜf_#zG(Q4,b؆8f<_QK|.Q|A-OPKKDΑoPKE9@#org/omg/CORBA/StringSeqHelper.classR]OA=wvmEA(C!ưB⃩1IcKxiZ&eH[)ȿ'(M͖=3w→k;Vc A/o} Fז?P>aD/^Ȯ!?HOZG)Q@0T6t>$5 >-X֚hhak x7h4o<&l&gB#:"Tjd cm(¯pd.`i6B#dWdw\ƹVAvZ#st́_?L(x%s[~I_+~Aޅs%ᅇ2Ǣ+1 b&%M0+f1cp 9|w }ZŪW]Uȱ%,O41ğDK̮$kw^9PKh+@PKE9@#org/omg/CORBA/StringSeqHolder.classRKK@6jk}+b*bT ( VxmHuS_IGIQz{ ̦a0a͆uP>߳*J:^"n|.dIk˽U^J#0UWh:dis7=ajD s.C,3$ ,aOͪg^k=8TW-Ük'W4(#tnsF^Ru%۱ T`H\P U:i:gmi\IGj_w!2?5qy:&gu=CCFtL7Ak?e} 0YaЮɹEэ< &(OUh!"͐Iҝ/C^c =th}aw5 ͦC;PKL>zPKE9@%org/omg/CORBA/StringValueHelper.class]OA~*@A%UIcKzK6ôJLg.9{;3 %vlX kl9AU>8U%ߪ^^KIS:뷜J748 rws`H _}DTcHMAYظ0S>m׹< sz5W N&qưQP.ϕt,FRQ'&ssxD4rXkiqIIqIbf3( m8"]}UnGUv 褧a6DT9']Ji\SL^UwXiln6)tu3ՠ+w5V>6@_=)3v,i39f0!4-=BFH s0\#9CrӬđyCZ&~KapE-|1,QQ0 V'(aX/^ˮ!?H/FoLJ &Q@0RBӗVݧABc3%_kd75 J$xPi4[7ez|VTщ̺>!R]#,R,06*܍a}L !?B#[n59K+I_NMѼ^{TBy/NtW~SvBjwg}%<|_+:Bľ O.y̶肳xvrc*H]d[Hx3\qqȗ Fe%V]zutU5%a>Wl-#vbع[b_MإPKwp}6vPKE9@#org/omg/CORBA/SystemException.classQJ@=&}YQw ]Z QGLI&E?˕ěDtss .6(0lȳTY٩C& b°c79$1 U cJ}pԶpt$C7ko`DP|U,0)ܰe(`,>CV.G%4ZF+M"VIS$t-XPK-8y:PKE9@org/omg/CORBA/TCKind.classuwT'u{\@)E-"PDBK)emJ4i Gy;.9әd;$/]&w5Mp>N 뛻ZQr #nsF}KԓH !g rq4Q톙_'9ta!5.rAp^DСZs5 aPID5N,]O$8}7ҩjtw͵5UASTgd`/R"]SQ%sqԧ¡%.('ʙZZ sEYj& ߫3eK}|^&e~ć7]Myp=GݖNgbMβxRZ=_0z>8do/WD5.tfO'_-^DA֡%tCjXڪcq4LvF踢vTCvrNUuqtZnTӊp􌢽=hG/(Kp􊢃Go(:[z8zGSrG)8DQ}q~UpД wd?rŞvIYU-҆\݇F(=7m̢4(N?V~ǬS N{ܯnc5H̢d9S,rYa tIR9&)./*Vb/PKZ `jPKE9@$org/omg/CORBA/TRANSACTION_MODE.classNPϥNJ"HQ.n &X!!`(ak*ԚR>+>ekΝ'6xxuONz#NHp_u/s,%u- ٌ@TG*AVYH Xm嚝 U=gaS#X-;T,VƃM *77[ZԵ]:׆A@QJ6-9,G6{+N_C=97vȲ,r,?@I3f1Qdi]R0⯆z&dc'Dj, 19]Q9s{اo'>_5e($"ERP&YX,$&;J6*kVHtOQ8PK(5wPKE9@*org/omg/CORBA/TRANSACTION_ROLLEDBACK.classNPϥNJ"1&,AVX C [sB\|(m7v1;=盙/ 8|SSVö"J_WQo4sV4DU6 :5fZ-PdHEMU{K*5e=-lU93<=b䤜fFL D'APм)Է9.5'Qm^WwqIkҋ:A/AiîVX/G{ jt-汯uKD%b1S~25"dY.~,H=7b-bDϳcfHbl1fb 2ˑfYb9II$n!CR-Ҭq2S`գq PKWcyPKE9@+org/omg/CORBA/TRANSACTION_UNAVAILABLE.classNPmˏEPMXhDVXlMŦB\|(m7EΝ'&2|ג#K2;M}U e: M21{ _hౕC "uM}6%a`{V.Cߝ:&g-Fʫgjs FƃcUb8c#9) =#8W7ZEpZۨ0+ҏA?AeZMQl?d~4@hBL[ Oޑ}9mQ}9s;إo'k_5e{($"ERlS&YX,$&[J֐*kVHtOA8PK3zPKE9@org/omg/CORBA/TRANSIENT.classMO@ߥÊ"ȇL8x@V8x AC 7uM?H)D'qmLavfvgfw?>PM#AP|KKݎodhJpyh>/lp%Hu˃k~>%P{=Ӡ`/$4HTkfsjMhs6<3jٖ]6Z93OfÛS{J}.8|IP5~DdM_2דv:¶4[s6rI/M\H ?K@A̋6揑6b\C_ &KY=!3;,rT,sIbҝ ;HԈjHtOY̩l%d|PK8ܝmPKE9@org/omg/CORBA/TypeCode.classSMo@MAiB I "6)jDzbm;&J~'$~b츂ĩ8xv͛?~!à{:|x`NB >˥c.t1ؘ=W#PMޢDRy@"pr8z"8jv|gY00Xo4-1PP řuar͠H*QE]eҡǃI+?HR됻 T5.w5Xئ0&2(L|"֊#iހ[SM11 i]Ɠ)#GuN<]5z{&6rC$BF*${z-"\*kjd=]IrGb;ԨӦ]J6Qdy+H d;=YU*鳥& bv;Kb %ZGB*a2!k) wZ*.|$ރsRCbr7`s9Bs̑$Q̀KPVi,rn`/#ف F?"͗} PK%@\nPKIG@org/omg/CORBA/TypeCodePackage/PKPKE9@+org/omg/CORBA/TypeCodePackage/BadKind.classO=O0U;P)1ݙov7m\8 "x ߾y~?E0𚝞jܮ 0Uo2ѹ(` dce(GP' ~6Wܓ`F_+?I+~hMJ= ovgGwG1yG3 9-dP.'+:>ȷ6R[=FJyp^A,m9H3! fd>şPL0Jj{sHck2ZHuWiSwfza~.hd]y/LAlL |0o$,=tPĜ'Ƹf3*_JKtKK,[x9N&̩ |ͷ35|xDGA2{0QR(Oę"nD Vʼ#,ڇ~r,+X@yEKɨ/%a%Lbx(,X0_)a#]/-lF+݋wG:zP'xPkVqĹOf, bHKlF?tH1YGT"D$2IWbHPyq{0g/f!~PKjQUPKE9@org/omg/CORBA/UNKNOWN.classN@iZE.LX@VX(c6R re3l̙Ι/m TC{ûK1f 6mubOc7 ]7p q2"PzᓭBƖ TBThV^O=Y ={6A'kQTgwFP3CpW;eA32HA/5j9Ŷ T+G51)ףv² ,gk $2@Y&}h,j;e/ r⯧Yb=Y.cJYM5K $UnI@&fY!E*SfZ8PKkPKE9@&org/omg/CORBA/UNSUPPORTED_POLICY.class;o>#nv&Ftt}g 'GPЀWOHvFIJDļt}FֲĜTF`F^ļ03xFFҢT*qL@f `k`d`e`@XPKN֔PKE9@,org/omg/CORBA/UNSUPPORTED_POLICY_VALUE.class;o>#nv&Ftt}g 'GPЀWO0GPWvFIJDļt}FֲĜTF`F^ļ03ҢT*Y\Lf ف<&'PKgqPKE9@#org/omg/CORBA/UShortSeqHelper.classQKALrMj՘D[kO >Y *B=Oĕ.]7ICQٽ0;7Gq~?XP*{}'L=uVDv IE|&L^|$K@qySM~[}IL3ށʾ`SR" 0Zz]n7C&;z0;"O\o4. *:kCC&dHKl,zo`h^~"Sv|1cZ>ڽ54wOJa<E3kX-{|  ]Cmgd`}/1]e**=L㕫aƤreFUιJJ[i+^Ii#{ʶNJf.f=x;N|FwPK PKE9@#org/omg/CORBA/UShortSeqHolder.classR.AfUKVU H\ FKozLIl5f+ފ+ ęݍФ3gs,&`0,xiyuR<>O*[ܝynCb [MTu@a'C4^se+)xK ]t!~u0` !h H2N[\W!=[-s{akdnV]TWa,UX&c 5 =+. >HGk_O!˺8uxr=?۠Ői| R=$sHӞ `NMF=:~ɀYGT" $+&$I)LGQ{јփ f2k>OPKDۑXPKE9@org/omg/CORBA/UnionMember.classuQN0iвvBbHl="*u`Y8|٩-7`.2 3qzq3/.%cu&H\8 ^U] Q. KݢVhD;=򏕖͐x "q; M0҉T9Uz״{ b ݽx`aC$R~W*+4h b %_*ql^M\-OYw6(~wj_>f [ 9i|9Z3fN_UQ8afW:J+V0j'4&Sh +t5{eqŊSBGlr%U钬ȣ0o-|PK#W4(k˫TXX*rͮd̮{ <5zc<31YS__ PK}%)nPKE9@(org/omg/CORBA/UnknownUserException.classPJ@}hւxՃQo)(=K]mw6Y~%N9Tda{3|{pM/҃^Ժ:mFmj9{J0Zp x OXL?yM|cdvB(5;oEB#Tbx&a5i$FyQt;9"l{ /v$1{ZM*e>z}֐d`/F97y";^l;b )KA> !_5+O 8G+GPKuΘ PKE9@.org/omg/CORBA/UnknownUserExceptionHelper.classRn@=:q ¥S! H<@R@,"&]mWG!fK-V3s̟~x!LL/JhNtOtrNyѕU(4|ܱ8Q_^ˮ%T([T:$ɑc TP%J/AG}KBtEPyз)a+.g k*,vvg<#,a x[ՏYtߪJ3W=zYøsbsb}вD)eP,=M2AE}sN(IC{EZGdhrvH&;_%Z\QߪCV2kFܹ-O& *a*LyթrWQP'o$sOTٍz1k[!s qf*yw>;00`NA$ȩ|1_5`?š+lU~PKǟPKE9@!org/omg/CORBA/UserException.class}PJ1=i3ZG}AwՅ)"h VO0Fڤir%(1I.r}s!oшP R:j)p}J%#G6ctdF BEXiCN/ϓ4<B sBPl e#A%_MGo L W< v6A|{-dggL_SrOMu/?у]X8߶ZH,_Q~7kX1E'^G ^9'bmo<PKxPKE9@org/omg/CORBA/VM_ABSTRACT.class;o>#nv&Ftt}g 'G0xG GvFIJDļt}FֲĜTF`F^ļ03\\Eɩn9@UH& cdA8b`6PKϹ׋PKE9@org/omg/CORBA/VM_CUSTOM.class;o>#nv&Ftt}g 'G0x_vFIJDļt}FֲĜTF`F^ļ03TFFҢT*>yz ؀$X؀4;PK7@|PKE9@org/omg/CORBA/VM_NONE.class;o>#nv&Ftt}g 'G0x??WvFIJDļt}FֲĜTF`F^ļ03LFҢT*iz ؀$X؀4;PKPKE9@"org/omg/CORBA/VM_TRUNCATABLE.class;o>#nv&Ftt}g 'G0P?gG'WvFIJDļt}FֲĜTF`F^ļ03hfFҢT*aTC@5332H22iv , fsPK5ZPKE9@#org/omg/CORBA/ValueBaseHelper.classR]OA=wviEC!jH&M,Ln3_O&>Q;MMkه{gsϹ_c3GXKt7Lz8l('b eԗ:O"D +1⡊9"LvZ4eL4ٺ姴זB#IX'Vv}E 8 haj9q|wSwU6% D t[˞" b& {I[1l2NT`AG0L*'zu]&.U9>1>̌I$MjσLP=yeWe9OP|-'P|n*^3 Kkx˾kpr[\ϋdyTqب9NSZF-RZ%p~ϪfgPK,9<PKE9@%org/omg/CORBA/ValueMemberHelper.classR[kAv5[Lojb!ⶂO!D!%tS6a:OxfкÙ3_^b'GJ(LƣEʏr<&R \Gaop*P~be暭>$'9TQBUZc1$a EZsuFht lhav|yغ@Nf{#U<⻲ϤfуYhavkZ o'6Ix6$ŸBa~9o4lǜ?kJZ.h+҂FމP=JR=S :/OǀO!kUe\}^ZC,d ѷv aǨS䎻|䐞iZ*Qbݕקձʱ5]͙px\hv'xZdv=gvmW PK+nPKE9@%org/omg/CORBA/VersionSpecHelper.classRmKA~h_RzZ(`Bh|%]I~**I33^kq#PDݠѾCHBZkg," r*^[K%awDZ{̚/j@ة_ߌuBFZH+BZ߽i˫h 5x(ͻΌ_/`s uB2)f<s+{.9b.;%%rSq.A{*{PU2s!!Dz9GR2v>݁$, ; ̉:#a˟F ۸`Q\B# :&TW:FϹΤf4}3k`F= >Gaz)WAi\x(+,sq;aheygܐ&_ K(uɏuWe%V$FVEmu,[ˈ]q͟au-ϱ6KrF ~ PKO,PKE9@"org/omg/CORBA/WCharSeqHolder.classQ[KAf5-Vvhh+!@2ꡇuЕյi_SC?]"9s滜sV0J7+x+/=$1A{:`Stjr&"i "u*4!BI?$طJ9-\$a>܏@l)/PKcAUPKE9@$org/omg/CORBA/WStringSeqHelper.classS]KA=nMjjߟ($"n+ D!hD|!$qڧB(삺l̝s9sgmzpCN?׵A.nD+aq̓_k\f@o C{^<FYѪ I7ڂa6y+iqWaOҊR)+ɈM$/ )G^2J4bVBX9M,E6ԾZ%8&uCM/4kwtSʛ{"L槒@vj=RρEfÞjCi|2y[zK0G3zC=Z423M)fmr)G?јFcfLv` -s*FUƜL ;q%--mBfV13T@ӯ.`qٙ٥7f?gPK^q0CPKE9@$org/omg/CORBA/WStringSeqHolder.classR[/AfUK]H%bx"A"$MTxLIlwkV+$?JT59ssf?^la.aΗU˯UuUPqw!SH0 \U|VU I̺//"k:dnp7}҈,v{}.s!qWD]Ϡix,mK.} u3ۿB9:BTnJ0,vNzCZX=֩)spAyݷGA:PfG|/ ɐ.,cGl}4z(}1CDt Pvg К Қ<wh7:Br.dPsv$v\kJۣD,a6f|th6g?PKnZ}PKE9@&org/omg/CORBA/WStringValueHelper.class]OA~IPZZQZb\5! 144^m;C0+/(鶴bbgfg쟿~x,/۶iO{皒k?pe qخj7U IIK4\ng5&P R?[<f3H\Exipy%*~q=/┡XV6C)4Y yʅNL ձh1dKג;咒^nPqTE;$&6^(;hO!:q_o!M ߮qLCtK*O2G4?=$J(합=u+z_e5Ɇvo2N]e<]{ }X3!Гkn3fSϨOlD ,dMEܦ63Q?y l!2;FZX %89̙EE i9l|^3\ģiB7& Ɠ@=(u#Q,@lPK& n6PKE9@$org/omg/CORBA/WrongTransaction.class}O=O0c&47g* R>wm!s*,!8J ޘ{Tj63\0|̍uY0&gtG>qUK#Uwsnzv)C43Ki:?XA}et;Ő_5XXW xz7xkA6kbyn8~ PKN6 PKE9@*org/omg/CORBA/WrongTransactionHelper.classS]kA=wɚXmmcWKDUTZ($)lLW$Gw& Kdws=g/! &Qv?;?T'=#D JŅB'q.P}o )!9;̈ܪ55cPZN'½Bǃ"9 PKrPKE9@*org/omg/CORBA/WrongTransactionHolder.classR[/AfUKuEX$HI M=ʴv'?gf7 9ssf>>b!!+d}Z:9okE^QυWud1=or~.J ΰRJ:C&0]UG =CTT$z0B? yw.zّP|4/*+qs;aa.纕firMRkUvR pP U?[o#)G't(]E\GB~ ɐ8g;+>I.:e7^zq04FhшOՉk ~ PKPKE9@ org/omg/CORBA/_IDLTypeStub.classQMO@}[*'"4PX`LTbBl$)t%d2ΖB8{3~}8Ŏ !lru%kji1썾=?0+ ʭ"EUÜVx`]{Ob)gX1:k.ú5ṂX,vj 1Em;6^ EtM., Ƌ5utmµyOWZ Za^?Iso Ahop8iFɪFHkN쁆J+NH}2"?D RHcTePՈ|FQFɛ}@D5=ӄ94(}FfH2ف05.;;Ddb[3[&̇PKJPKE9@org/omg/CORBA/_PolicyStub.classQN@=SUD񅀸!qQXhL|Ą# Rʤ)LSɅL\~4̽w{ϙpCI)yU0[w[C: k_n{ܬj]ӑf 0DOsQm2$dgR:r~̓-ú%kځ0 CٚaװfhwmO# vpD 7ֳjs͆ D ǢQ'/*Z򣳖zy5LC߈ꈙp* }V"=T2h `˴g G1$,fDbra=AAX>&zGhCy:5YޏjZ #D6$Qx`܎?PKBRrl*PKIG@org/omg/CORBA/portable/PKPKE9@1org/omg/CORBA/portable/ApplicationException.classQ[KAF,3-/om0a)}\mbYQYGE3P+9g9zpZ)}!=[ =}{wٲC!n]]$ AspuApVw<Ό )atl2m1`9AnEf43yot%GQM73?ΚQST?Ϟ`';,@`yLuz#ɬ`ੀ`W2uH욛5kI{y؆d0'3 :fuՎ_u²5!`Bna %@K_n-?Ac7*UVQ PK$@XLPKE9@-org/omg/CORBA/portable/BoxedValueHelper.classuj1ƿhmmKZ U BJt%dU|4>%&"Hw3o9GhŨ1tܬ%%?/^Be3K.x`hFp-rɓŊ!*cx79uVrд$&>zӊqyQ:o"r)Y%ڇzZY KJwj)J{ZQ7!!>5\PKľ q[PKE9@(org/omg/CORBA/portable/CustomValue.class;o>#nv&Ftt}g 'GĤT}ܰĜTvFIJDļt}v6FiTME9  8X_Zꖙ ٫h #3+;02pI&.PKOPKE9@%org/omg/CORBA/portable/Delegate.classV]WE~'"*Elmi)%֢).EΐLnB< (n,]nLNvvf*(Q5_v~[47֫}_|M.E.C^u׭sGƖ{u#&iNgtxb{d4Qx8Fsm)֒@eC+V3VC,J뚂{ 'Hoqw jec1o*ö臎& ӆX1ed`@ޱ9̠Z5?.Yڿ2'RWqwk6?ZE ΁xhR}xytKH xphު %6wxdKjhg!M^*Ԗw$ӓ Jtqh`Q2E)z\MtϕcqUrWx=a]#)ZU徝k0$x0*kbḢLVp2v1^[3ȎnAVQL {}-=>v#cX'/Ef) V.{!MyIgkC!Oq3VwECzO[&.[pɀD-~Fki@3G]:*VdqP>sxfU 4;^ 4^D9 `&uQ:G/ o0}V@G~f~sx9|oڜFvM40$fvRX9}J^B]&ÔWF1&-bvKh3X^Yޡtt>ͶJw3^=`(U"36724}c=O4\b1O$Q+ѮŕbNG'աIv:7IrT$75ɧ,x^PK) PKE9@&org/omg/CORBA/portable/IDLEntity.class;o>#Nv&Ftt}g 'GĤT}O׼̒JvFIJDļt}v6Fhf~pjQfbNfH'#Wp~iQr[&7HY@H21pPK6=>PKE9@1org/omg/CORBA/portable/IndirectionException.classOMK@}ƦjB[U4KE!Mq%ɖͶ$xZ/o}f}TGڤӠwwub ,*]\?'rVBMF YtUk}.== T҄&=2QAl*N-|I[a'e%"UI>-L،t"0gUI8qfۦœD(m}Fjsθ̪ C+XeΏ-31foPK]}PKE9@(org/omg/CORBA/portable/InputStream.classUYSAA /riL&sC # ;Բx<$OC~@~T*=0 >7==_!0Xv9.kxJvx*9t-x-AGM;f[cLC^c07-լd{63`vTluH7N QwLi5B0ߢ0R!ii9a0ۡP}ґ09YyS*WF1uD0|۶ifWwl9Έ- lNr̚3&v1iY Q-W;)Y]d0ב!:I,$eUpe@7p} ۨp8G-NlIeF lf"2nD_S%ԋw*YìtyU2MnV*_kn\.JoljQzp[MʯL?ɤz4鷅FHVKnݑi\ys5ƴp3Si|;X'~lچȚj"cU"PKo!<bq# :0ۅI-2Њqy4jLAHO )Lì1Ua˭vs0OYUl5^n u-"M|6. ]TVxV Fy.Ȑ1g> — \W [H M ,#|zq[  PK3PKE9@*org/omg/CORBA/portable/InvokeHandler.class;o>#Nv&Ftt}g 'GĤT}ϼTļ"vFIJDļt}FL2FV tpIQf^N JKjRsq J-.+9ZBi \Eɩn9@G xB@6FFf` b`L PKC|jKPKE9@'org/omg/CORBA/portable/ObjectImpl.classV[WF5BBCS78M8M&76}Y썭TTI!SC@TOgWYIIvfv/x d-U:Bz|T-ǣ+]e ܱ |hfKd`܇`#Խr:tj)ӐI3d%sι3A:ut.'^[w lV%Sk8zLs] 'K+X9**zYa:5WOQ>׾g|! r #keUٞnQ0U, ̾!!>Liͮm K9թ_,hwCk1Ok2f4(i9eunjjs67ry rV u꼡 .&m #+^%2qM65M=}GTQpk/Zgw=0 '*}# p7X1#O `cU֡ۦF`N`{$<4Qp(nu7G fz<хՃ5b%z"25v'hӚ\c$Ķd02* LnlhyĞƇš$`Pnk.szz0o>ŝL \9lM?S2WVʓ~M'p- >)򛂜U"h9Q^j &PKюD[PKE9@)org/omg/CORBA/portable/OutputStream.classTmSSG>ш "jնƪ$645J>0Ifn6ԙ~G9={v8e잗JHE'!.2o"-b[v%z-4/*Mţf8-g0elvN谚Ĝ<:zÑk!Ci(ܜW֘g;<9wo+?)W6/dwUl3K*ۤ3^<;6{lE(n]-ŵ)n3ѫ>[KEͣƋȩcN>7h7S"RHOפԽ2z)3 l]: s϶v}ifC~+s2gm?۷'Rb]߼[e }o wyD8~/8'.g ~'mY0L2#I?C2z0$q";,"G9tf5w2IDq:(ɏ| HKp+g JG*]+p*5Nxn0xޅ ӑFJ$ Ɠ0  DX P!܀;3Ss< dz.o˵ҵmxP+PK,)xjPKE9@/org/omg/CORBA/portable/RemarshalException.classNMO@}8D7z S Kݔ%m,z B\xZIjHX_S6WUDZf8lnll^f}^Ƥt%{10t*n1|PKkPKE9@*org/omg/CORBA/portable/ServantObject.classPJ@}ӦI"Jz -&.qKIɦ=cޛ73 Bpil!̺|$ތu2+X(e+;)JYQ Ѧq!|ԕvCBfIEh8A.JMLh\Jk~7?Ql0[uꔸG? ~#11\0^< cp{PKL*_]PKE9@'org/omg/CORBA/portable/Streamable.classuO @Dk;+[+A؆SIr(GwZ[.3qDK1FlK.l]]T#?q,b(P @x?,/[ho-C_rAyec3ycU [ڋy^c}h];B&Il"׬a>%PKǭ߼PKE9@,org/omg/CORBA/portable/StreamableValue.class;o>#nv&Ftt}g 'GĤT\3,14A +,Q?'1/]?)+5A  8wJ,Ned /-JNurD\h#3+;02pI&.PK PKE9@-org/omg/CORBA/portable/UnknownException.classN0mCSB @K+$DJwX!+᱘x Qr|8AEt$7Hi1TSٙ %]8E8|J OdqgFlfMB%0g?F=PJ.*ӟlhQ*XV(Y03Nsj $'}=a3P>tPF= Ƕsz/EfSe]`|rQlY>"{sVKjXŠu 6w[)>PK9+PKE9@&org/omg/CORBA/portable/ValueBase.class;o>#nv&Ftt}g 'GĤTĜTTvFIJDļt}v6z=]|\J2K*KJ)Ō >K2ҭKS2sR끔-cd`bVbg8$PK=PKE9@)org/omg/CORBA/portable/ValueFactory.class;o>#Nv&Ftt}g 'GĤTĜTJvFIJDļt}FĔ2JF y5ZkN-Lɬ)_Zꖙ4Oz l t+$8PK|e+PKE9@-org/omg/CORBA/portable/ValueInputStream.class;o>#.v&Ftt}g 'GĤTĜTϼҒ\vFIJDļt}FԼ2bFf 0FĢWp~iQr[f#n@6F^`ZDe8@ PK`PKE9@.org/omg/CORBA/portable/ValueOutputStream.classe 0Eo.. u1꤂PU6)19~ ^I UZP zʮ6LZY3XYaJlȨdY,x_F& ͗˯䦚^}*Ε?7҅/ng!"PK1PKIG@org/omg/CORBA_2_3/PKPKE9@org/omg/CORBA_2_3/ORB.classN@@ H.TTQUH"A%$xdJ]PUVEċ9gfb;=9;}~SCX (03{-sz(#u&:$T=aKC\}B0K0ힼ"z7b PD{atG{P5,vBG$Zm|D(@0^icw[V{JFaTi3F;S<Ԟ / ?BiyVG +q\qcNBź+O\klد^>Ys~g'R,crv-aLmjqHYK6SZoKI*'15HYsFJoGk+]rΝ #%īIgiOI_PKGY/PKIG@org/omg/CORBA_2_3/portable/PKPKE9@)org/omg/CORBA_2_3/portable/Delegate.class=OA߁A1(\ D1VIВss.9̲2~n1|=;3ozh#&,Ť792RU%xo3h{Nȷ;c7HUylVP@Pun@;~x,v:='جODNB9wN mORX&YYo)17B(҅ յv{U}p/ȶđ`%BY̶%b[Y5VY ۨS֜c֪&l`=PKr PKE9@,org/omg/CORBA_2_3/portable/InputStream.classRYK@MZTH_*D(Xk٦k]IW?%Nbhbfɼ@ ֓ضE_}qu}zҩu-$LcْAT8#nqyL UԆciL mr]]&n6\6٦;{Pw|D@k:"^vGRPCv%j-i=PݤV_3C"aK6L:qꄊ}ShisB1ڔmNӂoB jh?ĭ~887%p??X<Ĭ2]fc:EȹnyԎr/Q;ʽ^܋"5ʡeOQ Xq5V'PKPKE9@+org/omg/CORBA_2_3/portable/ObjectImpl.classNMK@MFck ".ԣ"hA+M\$[[_xp3}yo^ߞ_0jr|<>?F_hcEI>2"2H1NT)Cc01c}+}4F- TZ47Dd3aTCީ%^t (6JZ,7sq/x&OQEJ2W&<|m8,nsu7X}j C̰6f=r9OVmPKUv PKE9@-org/omg/CORBA_2_3/portable/OutputStream.class]oASV[PZ?REWkzƦ4 %-#Na6+Lgi 69gww_UkHh8ύa7@z،b1Zai›{ *󉐪ֺt3yxd -xؗAWheb|ScBcBF+#{?6ZB#W3Tm]vZع:֧b&&yNzp@tgf ^> 3E *8PqvXXpV^u_`$#V&;Q}yi;k$|E`,g7xq$O<I HxD|yp b" n" J  NMCbZAجVXXelgn[{`/?PKIrIPKIG@org/omg/CosNaming/PKPKE9@org/omg/CosNaming/Binding.classMO@ U%$Ѓ)4(laK.)ă?e~Ę(yw̼~~@@eY{RTCRҘ/5c1 ?PucMpw"s,L7'HVB`9%$֣rWR!83dl=yQ4QPt d(;z'}$31Gڍ+1y\p<&CQ 3= 9"E4MI -Hqn)#͞a5z]P4)`/h  S 'tPK^N]PKE9@%org/omg/CosNaming/BindingHelper.classR]KA=wdԪ6B"B,( dHG0hWЇTم]83w?|Ǝz~# z e(p%|j_Ɏ!俪@oj6®,bY'7U OǃݗfKUO]CfC'-":;t &B JZsscb^#Y`3+z@xޚPII06$ ^R"j{^|Hn2 j,LMiD[AQ)D(*.68k)Џ.–3sw9~|~F@#gnzzUY=Ĭ.5x}:Ic7:"ajtm.h4Ȑ@hLM|@YLM5,C@, oɊݡfr&^2(r{BƔa-Kh ?5t۲",u5 9Brr. 5G.$Lsf>=pp52}ocaLA )I|GT 2*g ̥bDzJL$JDĉ׆F42S=h y<̶~PKzPKE9@'org/omg/CosNaming/BindingIterator.class;o>#^v&Ftt}b̼t}̼ YZX_ XOJM.ag`cdkrrp02($&{dT3p12hܿDg32p%eFSr I @ @PK'0PKE9@-org/omg/CosNaming/BindingIteratorHelper.classS]OA=l[[Q*EED5UM L26YO&>Qƻk:J'rZi3gxes}vE( qa%'# f;KP+ @wEL"WyܦZaJj1J ,c$F Nv'#y`i*cK6ǿP4 E>(OI >C\IMT܋Mv1TH⭌۷ۤOq@(ӊ><ͅGp+-T ]Lhfױ`} ka1A37yțJzrū:VɖbW3b|"2ys\] \[h0;PKPKE9@-org/omg/CosNaming/BindingIteratorHolder.classR[KA>ʬ.4( "AR|QYwd5WGEgfQIa9]朙߯o8XlڢݴK۴oWLR%pL L ٢]j;AZU {#5e%m@KNa%w&wLC|kLV|TAԩS}P gB 7МK =6p})ݎQ$@-:C&"T*BTv}S{! “uv$3X?8'".M:;'$>0`ר).< IXɩ|E^6:[Sh%D2熉> ғ (6+HmX}Hcdƙ4_7fPKnɞPKE9@1org/omg/CosNaming/BindingIteratorOperations.classu @g&O`e SB$}5 /V6b0B'@0`|N)+qV:'J'NVa٬/*y*{7g'y 5 xa%Z^p,TsH3vb- #1"OpPJ(!ܮPK ]$PKE9@*org/omg/CosNaming/BindingIteratorPOA.classTNAfvVADJH\Ę)nz PG;t7} 2]VzsΜ3Ϝ_tSݎ+ÎWa~$4>:"I Ba ;V;z4xv + /[-UgȾ^3̹c{OEs$,Q[΅V>-v)g\ٟpPXe<88?\#̧)١f-s;&mge:_](kjg*XX*rͮd̮['5zS<31y,oPK,h{PKE9@)org/omg/CosNaming/BindingListHolder.classRJAfghI"VHւ5 -, 2Itd&)}EUzfv6ek.fΙ93OUŰʡN+HC\?dY-rn* ϰ3w>wơT{Υ!7~DqM5;aȟ@3ݼbȶWD%Ex܂QA 6(ua4Ǩ"ٳHnȶP&#dLpsDa Ovb~ PKW"ޚPKE9@%org/omg/CosNaming/IstringHelper.classRmKA~Ljk#-" H-D!0M\ҕ.l6ZUQ땸fvgg/#lƺvxEWEo4SI'߈[v_֛7eO*R3a}EkY 3!OHM/E# %:WB+{NJmB -l7~qtF۵Ȇc2ǿa1O5T$UԗkUjp3bmYB\m?kc'EaV^=iz㹮r[KGbLN+àUSQn_?K(6nأ wy| L獇"ۼ . ۙ!,b.!&dLx qr7Y9|OC^IJI!+cmX(v)%v_Dn$+)cb /PK^ =PKE9@%org/omg/CosNaming/NameComponent.classPMO1+ 7$zpūDWML6^Bd2vaߴ:;SaSzxjLF>TBRVA~{naOaaQx%*$F|+~'H%VҼcXh/U, ]IGa|t4r̰-$!_V֌;}7D¿9:'/jvw3) ݕe<JW:'YD|J68'xTO$-I3[vNqf”hit_q%-5{R1TDi1gJMl®v4d:,~*ٲ ٥)]rJ~=-ìbzXcQ)scwLkt_1Xw2-dwul\[<۸%̈G,Î7PK3MPKE9@+org/omg/CosNaming/NameComponentHolder.classR[KA>y)25@EEPBBF1`+;2z z3$Μ9]93?_p[I0XXRu,X=1OrDb]ڧCRovYK&!A`{ Pz\HtՐQW}oW# $.lϖf̽G oB E S=V&rHa2&QAcFSq=awmb| Aw*aKjjFO–2'}9_ I hϬ3c/$R1xBqMd2da wE^gȫ!YE+X!"9LIA(@180Fac̋׵نoPKÅPKE9@"org/omg/CosNaming/NameHelper.classR]kA=dMM?bamm*BEiKh-}iqJvgLW$Gw& i>;s9{kx JCÖH8D>%Sӽ=P|/ci>05 ~K]2PGEJ[xu>݁`Xns-= 2la!ߌ9{wh(Q ~ɰ2 jٞTrE=5P%T Nj}0NF y*i\'4 z3 UKC;uFfR4P>U#ݝdC^ة;u: g ~:x(- ? _*)yJ zaKL̺Lc>tLtߤ1Xs86VɖbW3b7\G؜)vؚ%v=#vX'PK&"PKE9@"org/omg/CosNaming/NameHolder.classRJA=IMSSе|(-B`_|I2+;aMS~%3Dćsswna)ȓk˫ȣC`(Ty%p/ۿ]Dak~Ky?^O+C2,Lxӹ}J[cHf(|#_0ܝ3|[E 9(c%JǏI:Mk9Wɼ_1lf(&Ho1j\![a8:qooRh^swf7C0|MUn|7귞TPX ġoWyzZ xFIhN7~(\FrR*^iN' b ua4"ٷH?`S FuKFJ>ᰛGX'_bM[PKr"+PKE9@%org/omg/CosNaming/NamingContext.class;o>#^v&Ftt}b̼t}土WZQ XOJM1299e8Pe JrR=]|\J2K*4 X_ZXW_Zꖙ L8s$PKJPKE9@(org/omg/CosNaming/NamingContextExt.class;o>#^v&Ftt}b̼t}土WZQZQ XOJM12(u99$&{dT3p02AC RK2KS2sRDU\ t#323p2#7dbPK\PKE9@.org/omg/CosNaming/NamingContextExtHelper.classSn@=: 6m­ТBxVH%V}EgnIh >BF)!އۜ9gfg3<,bhj |,L0\9h"T6C턟rwɫ?fpve +vQ*(aXd q_C e/+C[)öWTC"^g{^p)ا\=aXɉ`CfhE!ΑT(b^2l\a7˙GѤh?dOBrHS %,+n uByVSXӟJΔԄ)Ow*zFoeŭ^}w$GV9Ȗih.mÕP%\%8|c)?JA/!-p )bon7 2u%302%W ` sŮf6 y "2yw禹~){46s5n)Ѓ DoPKz*4PKE9@.org/omg/CosNaming/NamingContextExtHolder.classR_KASfieZZA`tJtEPRHBb'l{Vߪ}hvDngvggv>`0h[۶Jvmm]^ՋN($;O-"谦B@rya0A F*%SØ/O6<%9][1 5oB F Q]vuLT}2oRFA1$')L.zלT}*:&yҟ&*a.faPźTYQX'wB=pO4ٵfbI!UƏ@f/ yYVĀE\#qIX¨1iUP)D2ǚң?d AP"%2HmmD#c:d'5i PKҜPKE9@2org/omg/CosNaming/NamingContextExtOperations.classRMK1}^ZS]ZJ[Cl&%68B=0/Lf;:9r ڌ=9bsZYM6*3\8XzPap.5 W?Ł5i:rfRPn-<9M0f U Isl1d>$&m[ϔ*3ܥ}(]=j%UIDH6Z@"32ܧَY]i@ό'AHøg7qe2MkQDQ2؎툽]%dK!pJQg_PKgUQPKE9@+org/omg/CosNaming/NamingContextExtPOA.classTn@=:1@)R(p CP@jP_m%oDx(Ĭ:9g.;_DՁpW'})G|D}/QMiq_֖a(tG*Cj"g"CuJmly4{M'GP0l?qk(ׁF gA snmnQΗq%y?x/;/{<*0vڮoa7 z{] Өu|½i[+"%{CaG VPV34iF标cM1fѐzڬXa3hM7oM nVZ"ӓ$9 PR[UO \Xf h-aY$ϑfƻ tpd1v.`d9 E\"Mc&~}9\iNX-TLՔ-i;m)f[Onb6eNҜVp7SލӼcYV\4lcoPKcPKIG@*org/omg/CosNaming/NamingContextExtPackage/PKPKE9@=org/omg/CosNaming/NamingContextExtPackage/AddressHelper.classRn1=n$zKPZQ"m*.EHi)j$VpIv#_'$|Tձw4ˢTa3sf?׿ºu:~0:=t@s\#jD}ݾP\~.'Ry"Z!^R`l3-@a92^S# zc9'AWcZqyemWPV8)W sxGJLb^PTUo 1g QS7lPi3!Kh n]f}25?y<ΔzO5&vN\a8P-Iڿ1[&\0ˣ}*||/IEy}1org/omg/CosNaming/NamingContextExtPackage/InvalidAddress.classJ@Oj^|UOjEX},q5fZ>%ΦE?_ϷwGQb8&:HTx:rf3{#'I~"Va? ̲:* ;Eg f|J 3*{P*ee,7QETD;1%Cׁ(/2SQ#k; @^*D^m|q sͰ:%/#Jў\ґVΊ2J"iLGWNP; z1%8 c"puwORbii ߔ$3ғ+`(#ڴ}a20G3UhhSd ~Mi,Uܤq1PEX3þ眕KN˸c+1unٓiλX}VeU+Y!3bQ ݰLKpl-XVPKbnOYJPKE9@Dorg/omg/CosNaming/NamingContextExtPackage/InvalidAddressHolder.classRMO1}^B҆P(QDPU]@P *RD Zf9*q*U"罙y;xǰtW͆_VCޔQOLYEF\eZ?UCawrVknr2,w҆B-xӺ ݪ W춌e)1d*y`3LTd$fMӤTEyxƵ41daoVE :\8$TQ+6DKlZ4BipJq+UJWcge2OT⇴?gzTZrxAw7r<=Ә$`ZT Bqb5)#tH(P.#\J)c}=3xsu]PKTrAPKE9@@org/omg/CosNaming/NamingContextExtPackage/StringNameHelper.classRmOA~lAA(^)BF!|ߖM]l_'>QٽK <;;W/.lb=G؊u'{EOE0q82̼?3Eh(}q*®`^u"ۆPQ2Dz P@0PZRVWfq[tV}U ;WM6n/܋η7# 9Яs9x Z.\Wok{m['DKfcmlOQh.E/)Onô>s˗Y7ǘw 94}z+.|u[~Pv#h 'p'o<]plK"%{#ì\cz}ǜ s1s 4FYU&i!bm X+v!#vc.^lj]ʈ]!kPKvPKE9@?org/omg/CosNaming/NamingContextExtPackage/URLStringHelper.classn@qBO!=pl"ET"HVMJ$vٔ B̮-5Fo'^$&^JFb^VybޞYdi'5P>aH/kwdʯTkLcsිY *(LT,ǃ{ӗ(ʮM&!`$Q{V67d?1a@O(*I͵E&\wہ"#Z gpPK sPKE9@+org/omg/CosNaming/NamingContextHelper.classS]kA=lL6mc~EMD\T"ԀZ Wltj&W$GwgWR<=1?})a15r}>ȍnkYPE ~1'Dxy%}_3,;G v72PZFJOb? :䃱`Xq%sric9c%fH#sPÛ]w?,rD.S3g,9d;yZτ"Y M C3LJg /lq rZˆ%8E.{(󧡦b(*hwRt5TB;'1'3%59OZrb([5l=-Eb7A(ю>E:2Z WX(u\y96_J~-%^@Z` cc^ 2U:ϒ;X31!v5l\B n6 /DSyy!946256 JݿD?ط~PK^ PKE9@+org/omg/CosNaming/NamingContextHolder.classR[K0>۪suyb* QT:-HیNW$G'is8CrI?>llvvdas̡aDO$J"b h,`zXbya1[1PK PKE9@/org/omg/CosNaming/NamingContextOperations.classSN@}KݘPZJ[ZRrԜHH *qZQdpv&q*fcCh x{3n~Ŗ6@{ASG^Vlw@FXԇ't.G2H$u)Y"za!5u)[$tO9Cv*0׺ i<HY2= C2n衊| 6R1nIdGdG3/#mۮL7aY=EC\*pJp%#JOSoXzIrM'Nbkg{):'u䉮ެib(a :^PeeX|CR;NXz?v"| a XtK_uخrd o6ޏ,><~FA>e 3ؼPKتzaPKE9@(org/omg/CosNaming/NamingContextPOA.classSn@ubmR~JK a(R/A&d5Uz!ڦK08hxNHx 1k efgvo~v?bؖ^ׯ!qOU]Z|G6yܑTF)H((kyʘq\;Y&O5"\adm:!s#0Vk'ƦVH<' æQOVf\ _ˌb͌9>M!ެPe3XeJEkbȵӇqyOE$W M9T*4S܋fha!Q,ZCI37:XA28WL&n?L þN W6C*Jɽ2H2݌-i{*[)aMoa7fOҜf(k2oBָ ;E"d9y$vbPKdPKIG@'org/omg/CosNaming/NamingContextPackage/PKPKE9@9org/omg/CosNaming/NamingContextPackage/AlreadyBound.classN@ƿ-(_=`0&A#})Zfi >'>e-11^|3Vñ6ӈz6SD|)NRHE("{bY2en=~7bʧT;SJJ뉬J X24x$qt{5c8 ea< `:sa_UPg&ovtsȣcV(⤌\%֖ (SR/x+w l:6󙍼PK cPKE9@?org/omg/CosNaming/NamingContextPackage/AlreadyBoundHelper.classS]o0=҆Vm|nڤ!H{@EH]%Gm mƕ ~? qDE{}sO_;gJ}5m59#$Uh?[|0=PQ8x%\3~;}P|.Ci^0, n[ DK(-"JG0>@0uT\K[(' NnM[Wo3Aof#8ɺ\?fX#C̎hҤ 'Br1y°wl>iǑ|v/#n}:ߪ72Dg- >p723Ǻw)yt_ok6# 6I~)P)3ʅq )u\(_\u)a_3U܈k0wy̛1Ӊ~:Dz1,Q5%l`sZV-^hv;f콿2܏PK %PKE9@?org/omg/CosNaming/NamingContextPackage/AlreadyBoundHolder.classR]KA=ƴ~TтEܶ T"B(-SU&W7;aMj >;KH"!3Ν{ν<>= pN긲qwF*-~u;-J}EAB`X}`h4R JIynCI׸ >Cǵ:(1Ng sKDUEsx+dk^ nSJMɕgq0;,]D:P/3 asԸ2q!QPGZ4Xh΍F4Oi*N,_hݩ22 /;2?AI+I!yƧ}N_d )\"(KX&k+13 f(!-uajRFDslD=N` F9KG!8p1 `ulxabM[l{PKPKE9@:org/omg/CosNaming/NamingContextPackage/CannotProceed.classRMO1)\! D7zB$)K]WٖB[L<Qe޴ͤ_PD sLK sc` D5JfZsR،`ؙ2on/! +8=Q k2 UG'~rWaAaKC34l1Lnesua~J?zvNP15-%Q[8Hc*|ۿoJ2#i+WkfCT'8fDbǸ' yӄq},LPeR ׈_&g 2: |Ci+?WwT:G̭PKN~IPKE9@@org/omg/CosNaming/NamingContextPackage/CannotProceedHelper.classS]kA=dM+il*-B [$d3ĩLLW$GwgRHý3w9sf??x möT0MmjyEJi{ht,D 3,38:S[TҾdXhN*PYD eH*q0v9݁`Xt'd}IwBzל*u޿n:glrc'D#->qgbovR #=1x-mhGI;[ hD/b@2\zWCbpb |rױfd}1k☫2, F,źldT: ؘkv=gvm~m\0{wșY{PK|5-PKE9@@org/omg/CosNaming/NamingContextPackage/CannotProceedHolder.classR]KA=ƤM㷍1~Uk -hJ_e0Φjwf%3Ν{νw[l0Ixx5y0d5Wq,uKI_Wu* ǰx܋8+ ;O^O*ۑδk\>Ӵ!ơ0^0j#\ OQdXh$ݶPiytUhY07 S*AӍa;su@\8WCTĽDZ$bGV19ōlF*ԔN,Lhd(DKhG -ib( SkN-Jq0O{W@{)M"r>$L?rB]ҼH(Q#XC%pد1 >T2-iPKx1hPKE9@8org/omg/CosNaming/NamingContextPackage/InvalidName.classOJ@=jknF*!T4h)4\ .?Ją8>Ι{;.58 ]mbӘzb@g"zY!5e]4HNr3Te*?ct nGuT14B,Is/Fdh:PeeՔ8=N$ AAnH+)9uH^);+$PD(Čze5B@NlK y4,Kh37K} PKyvtYPKE9@>org/omg/CosNaming/NamingContextPackage/InvalidNameHelper.classS]kA=w6ڦ釟- kEA5 VBSl2Itf7L&+}|Ļ k$ea̽9{g?<<=?F4<}$4/Pt>ñTk R{p Kgb,@0>C(T2s mD]YJ (HXlPmE;f*^Iל!E3]u-bSN=/<߭fUw,cEJޜ4hZQCͻin f;;9FK?d "m``dmؽh'~>߬3cǷ1Z}LD h;ol+(- <ϑ8|78(X\q!pʱkXLSC_3%\eVL۶2jWx9ZZx5)ų*x,a3ͮenoLYf72fepPK jPKE9@>org/omg/CosNaming/NamingContextPackage/InvalidNameHolder.classR]K[A={ӚҤ^-JAR!RW$KnM_S?J:b$;s̜+_. a]閯--Ö 85?yo /@6NPAS, ~ U"Yw6he#j l2dd(wT|Đ!y#0Y؏uSUҞ`]'4@22IqL4> n/D&VhY\(Y%ji(4|-2/=(!w"j]#g{zEZcxFOw7 r<=3='d-x*#:p1NH֛.lʈi:$QS(XEQa>! p__bo\PKdPKE9@5org/omg/CosNaming/NamingContextPackage/NotEmpty.classON1=nta(d4،ՙ)ąGotc\=qNϽozh61i:E/a3+ZDO"γgΟ~xÎPEmɸb#EVu[1H3,S8I:3 2%Bq7ձ(cEPdXjXGQWCҮM|C筹v:'&½x۸1Y\?eLc1ChMJr`4YQC 4K6<'֏yDic!x" F?}6SOtR>5C@tOK۟ ľ j{/;BbO\Aen4. Q,:2L9e2n8 9-w2My)=_Uv5.3aY9{`PKh+ PKE9@;org/omg/CosNaming/NamingContextPackage/NotEmptyHolder.classR]KA=CcZF*F׈"EBHJ|I2;aI]B&;s={f_SáT[z,smekq%*oI-T Rk^N#OXݕJ+V{&dH^L~̐:q|G2eMs0,T_T)T#R[wϸr9N&?h͇#ɍ6˰_n#BI |AycZ9ckߘ!Sjqyyض]bP]}IҘhb>Zd(=Қ 9,К wR J5Wleh"9 D=J:@4+ 1N!{ 9R]5~B`mgZObZkj5\PKCڄ|PKE9@;org/omg/CosNaming/NamingContextPackage/NotFoundHelper.class]kAn&V[~Q[,$"BHĖdH&;a2[+ ?J<3v^̙^`;ǰt?T~XWʨ&"#ERN FBO$Ω+IaZ;f'X@a92xwa|p̵t7'r9>C@[Fub N ΰ _54/¾J ziv~?v<ȇ"jsGTT"r >Aĉr2)_N D"hQF/ ~,Ӕj> M1LG#Q`)ìc K.]AY'+1. 1,TҼ`CE5˨XFm°ܑJtG@$i$X8Hf>Js.S2c<&>$:KE<+ϙ%IhwzXVVfo]ɣGu@=JO<_qlVJ7 =%k2u:ߝ-zW){hndl,;S;J-KׅN}[46:Oq017gYuCPKewPKE9@Aorg/omg/CosNaming/NamingContextPackage/NotFoundReasonHelper.class]kAn&V[ۘ6DՂxj(w"dS0ǿWxfw!u${1g>3g~ .<8 u{5@=? qn>7~S}G*|/C= '}NVDt C y˰P3 E, K E3>`X TvN1 @3x$rq=/fKOS3NH.CZ sh4e GBI@37MD/^~$-8qr 6ad 渹뤷p1:ب2#EEܙD_܊8s */m W&3[&~aPȧ(qP6O&-Rj~vq8,N\s+^;X_Qα,b9t#+cQ ݈7Saׯ>i `ͿPK1+5PKE9@Aorg/omg/CosNaming/NamingContextPackage/NotFoundReasonHolder.classR]KA=ƤƴZ?a?@PEZVB !)&*dHnvd6m> }Gޙ]B0sܹ{_3:vܒWy :ndJ2[xGU2 WeImRH0w}NZVt I!mۓJ/ܺVw˰8~H2Wg ^ 5C$"<` ijm ՈjUd\yg8H }qAlIҧfk\A/ԑ3K!?{4VqoРy]ySB=^wLt]%ʞQ/ ߚ#sZŐƧ}N28xF{7B{&J*5|J֙޴lN][$QORdG(ؐER䐏)1v7PaPK<Ո,v)rBhc#B5B7UZN\1/$L3aUS0[NYL^:b/^< oޑov g.ZXMx?PKk(PKE9@,org/omg/CosNaming/_BindingIteratorStub.class[kAgfcۚ^$*҂R` '0S5C%4Α'\Dm-R{4,PKxnPKE9@-org/omg/CosNaming/_NamingContextExtStub.classUn@=^(PhKKo)0-z D/]l7' ,Y';_9Yer;0@Lb񄅾k Sz0@* Vdc?^oڰyK@n MyJNy+krRd+F6uDNe}K ?r aeDzӦO0z[$le|p?yKt7SW6TIB:UR3c-hbC\8B|]_L b -t" o[ ^K"e҈Uj ʿPK+=f PKE9@.org/omg/CosNaming/_NamingContextImplBase.classAK@ߴi1ZD x6"JK\JY(q zey !Z-sPE%xor|>FZ'&O#QO ^boe6"X!tSedgBD1Wsw" ^y3Ul܋G#^<*@g/-D~S:knkOPKXdKPKE9@*org/omg/CosNaming/_NamingContextStub.classU]S@=[JAQʷZ>$P::Ё3`&mvj0vmOG9lbCzsϽ{frx!ư ܪ.jU Fr ‘BfYC!FluJls|+X Oov1$[%?0e' 0y}f^ђZs2.X (+2 ?ɞ΍AKH/]!9 ! Vwdԩ/@[KrNCCaFQrüM0`8pNS EeؖL n_=oLRek s p<*^O. IwE1VViYFW?C{Sd~"nb# aP݈AJPcoT>VkWcr@qaVL07GSDd@qN4z%OE W Xec+mv_ |8=Pl˪kȨemAX (*IU';ָ^㊚%V6ѱPS #kz& .nQmB a^+PKߒS PKIG@org/omg/Dynamic/PKPKE9@org/omg/Dynamic/Parameter.class}QMO1}k%Ƅ#zG &&5,%쮩ă?eExLg潙7;#4,$vy๼7~+B<3'wy8ah~ ÉW=7BSOjw C %r5 9U2g ހX]JD< %[f ~50T*ɔg{4EfBƮ͐ڑ*Z\wD4d-d#֐#fh#q|zŗ\&5l-TP䱹 w1+܌ rxaj"PK{/F1PKIG@org/omg/DynamicAny/PKPKE9@%org/omg/DynamicAny/AnySeqHelper.classR]KA=&Ym5Əj5*RR!4`&q8Nl?%3Yj\6ąw9sܙ'{Xs0=)Z\${-7J)!u(}1K Jd0$H1L/~u5y%fA.fZ2#l0Vh'#<(]IEG^1䊥ZIAk) Ejqjqb$K{1'ů;Ҧީj x{؁5uts"L򷒚@CTuagx!S .~Hs6O@ siDK328PL,&(N?PN#BVHv}`:F2gh>sͮ1?Yc9aE--<_ (9icaٹE+K#]ƗQf"fWޘeX?PKFPKE9@org/omg/DynamicAny/DynAny.class;o>#^v&Ftt}ʼdǼJH302d%%$'e&3124999e8Pe JrR=]|\J2Kr12(Կ ($3?+8(9-3'"r @@@PKPKE9@&org/omg/DynamicAny/DynAnyFactory.class;o>#^v&Ftt}ʼdǼJH%&U302d%%$'e&312:99e8L$&{dMbd"dAjQbIf~^1#Wp~iQr[fN*#2=ad`BVvN`dL <PK* PKE9@,org/omg/DynamicAny/DynAnyFactoryHelper.classS[OA>gnmE)PK)@ 14MjIlga'(5<|e~vP pP[NM+M- >?Y(]( {V!_0Ro4' /\O+Z |U={ Wi hfa!?H~I!뗐`"cܰ/YX:b%6y#~L̮+4W bWRb[| n")- wr\[-JнD_oPK=PKE9@0org/omg/DynamicAny/DynAnyFactoryOperations.classPJA1Qw)^b4 VNecvf?{ŀ ! M|{p^‘U/Tˆl!5w m)+t0ez60E6 pr0^ۋx駾BrfS|OTvVnydSC?ac26{~t;,ʙ-鸑Z"::RgR%nHf;_PK5#PKIG@(org/omg/DynamicAny/DynAnyFactoryPackage/PKPKE9@Borg/omg/DynamicAny/DynAnyFactoryPackage/InconsistentTypeCode.classN1ƿ(ЃoB(F R ->'>el<'{ofoNP+!G&zTzIqMzT\D&V(;HE Y%\p99[ruJ_CgY5gˋN=O3xwѰWfs+~PK8%PKE9@Horg/omg/DynamicAny/DynAnyFactoryPackage/InconsistentTypeCodeHelper.classn1o7Y -mHzP+%UQTD;$q y+BcgE*U*^x|n8qtx_FGjldxd=~ϣ<[%j(F(IoDo ta_U6;"2 RIsȰP3VQJ(ȰԐJ;By'VI{\KN7}INIhnZOBtPϕ\?gX]J޸*Vhb:+J5ڳa Ԃ-YAa ]K~r$0lP/Zrx-ysd0[HGLnߺ{ٮw@ hFƀV!YFn}2E4.N![],⧩c2ʔ29 E(w,}VW"V{ur&*h,asa2.< >nd`ev;PKlPKE9@%org/omg/DynamicAny/DynAnyHelper.classSn@}:I Mې P%SRB EDUh-m8|bvh8>ξ7ofvqNn0o&>IO;1 P:rv{g җ+Fn}Q +aXH_|F=yo(;LJ'\I}:T3;i2ŗPqow?n;l^W{ )DKʍf̣PI@wυ"49+PsKIUI$Zɨ@{T GЏ9ӛVz@S|TxEߺsJk_i7 t2zPQ)Oz fgm@;iZtr2'qm,ius˴7 VSž& s"&y0-/)L},b+TH*ؤ-lg&HjkJ0=d=SrX7 sTK4 wPK_OIHPKE9@)org/omg/DynamicAny/DynAnyOperations.classk[0OlCrSwmL!*0 ]2{GcҦ[%E݋%9?_<|IB3ԮQ׋-@Z &kR$AU n!R+{pH 1Dim0}Gn` ̞}VNƮCm4)2GXSZjfK)- mE56mnCֿ@ώM~Ab ˬm LOAL6 ۔Z_5ÙlX9Qo>*s َEQPĒaQRW` | l}IyRx,Ϙ8h8R;8\ YMa4Vէ9e-`?!Q`ka/j?s?'>YMWm2!V0aPQp>8 IU]/x@  mQ"a5wT HE`/Us4E©Z5z M.\mلT"!(7s\2ZVJ$56w0^KcT~J=%9* >gnHyT60?A6c030"v$ 20&q$LK|[E]g3pYbWĮ&,\ )YV19^1~<{%'{{%$Ċ(+(Kl ^KlV$&FK%FjL&jLcc=߉ 񎼇|d}'PKr;PKIG@!org/omg/DynamicAny/DynAnyPackage/PKPKE9@3org/omg/DynamicAny/DynAnyPackage/InvalidValue.classOJ@}ۦjm^*7*AjtFIIQlZAaޛvf>>°IOZ$*멥"|"Υ a294gϡ|TGJ옡 A:Xl:CWZ^H[1%COC(ϋNv& ~= c#>̌Q\feinByws`_Aѥ2+^ʶG^;Xؘ  yen>$e^+3lYVoPKPKE9@9org/omg/DynamicAny/DynAnyPackage/InvalidValueHelper.class]OAY][Qj D׏p1AhXX:mj^xGL7kMib|gϜ Ød͔;|nGx-P\S>~ouNEd,sz']QJ(ȰДx:BN$I6WҬMWg ;vO6E'}?.xo ݿLZ>ZӾi>)It_VϓPJP>JRWdV{h^;ьڜFV>EF WAƢ\UG(p y;3;KYtֹDGM{2y:jXjavUQN`p{";; v5{/Xu PK:.~zPKE9@3org/omg/DynamicAny/DynAnyPackage/TypeMismatch.classOMO@}[ hEP/4UocAKݔvKd2Ζaޛvf>>Uð'qZ*깥"xD^4Y0enκ>9L%rNJ!Kk(Px$@"@DCa͋Ualb&x$tQ:̄9~u~25TvrVC9!FgPR ayK/yۣXɋ-P-ּV yk!(̖ձlPKPKE9@9org/omg/DynamicAny/DynAnyPackage/TypeMismatchHelper.class]OA߳l IkG˜ h4t,f:E ?xf\kJs<{'X&:(wTî>P|z0kJ%̟SwD L<'w;9e̠4~Ԗz_;L9Zuc#l4@$xXl޿Y̖٘ SGuDͳrϊ*I /GLȑVIAKDM"B2J˷vY8I+IEm͙Ew!cBy/@R'kC*a?gsLKw%<:L٨E,a9SbJkLKwĮc#KrJ{b /~/PKTwPKE9@!org/omg/DynamicAny/DynArray.class}NK 0/Z-7n*BAOPRڤ(j.<E<fͼ?-BailMѢRYF֊a@!x)tΓcVm\vu"-%?vy\{: d')oj6GUJB)6m1_;0PKZ6PKE9@'org/omg/DynamicAny/DynArrayHelper.classSQOAZ Q+`Zc<1UIc uSۻf?8w \^avvwOxTCc鶽vJ{1UP>qo /'W 1Ca+=1:`X.s%>>yưP_5n;xv(~5+ s1TR 0Teސ;h_d5! Wʿ`KD=Ϭ#Jp;UM€|ɲ=O oJѹ){"bo %½^\d~g4 C?Tx'PVOS=v4_cI5^.c"հJ5g]M D%y3\R94S56 m$uAC?PK[ZPKE9@+org/omg/DynamicAny/DynArrayOperations.classQMK@~7=4SA!<%&k((Ԉewy|{pAvVttʌ0Q@gD#R>_h P“*v̽;ul&<ʽV)-[i1g$zo @՗鷯uکP +5((Km22e Lr&fk5PK{&PKE9@ org/omg/DynamicAny/DynEnum.classuNK 0/Z+Օ A'HK()mRb*j.<[Н΃7o3ailMѢTint]2 \/x2u #{ϻW:Sr Ø GXW m*ct"~;C0LЁ0m PK*>PKE9@&org/omg/DynamicAny/DynEnumHelper.classSMo@}: 6mZ-%aZ ""ѪWqVxm+8!q㵡e0;޼?~2,@c}qQN GBa3N9w\ nTx!J*fi/Ae%8 sć }{C0 <>T^6(a{5BUpH41'evD)DxEKZ;o()TQA=V6raA3GML;VFkwF*Y.&@-C4%[kY´PÜ s1eu%˦0Fr ^d+XradF|̥ aǃ26E׍dZw0?PKxƧQPKE9@*org/omg/DynamicAny/DynEnumOperations.classuPJ1}ժA$‚Pk1lR6?'Kax{3 -W*{\Y^h`Wں/d+1|3í/s)  6rՌJmC?I6&tYjk/Isme+M ỐS=sƕrFN%=[ϣ$oN\] 9҆(W;+ڧ`#*!BdGh7xmaKx 9-\PK$PKE9@!org/omg/DynamicAny/DynFixed.class;o>#^v&Ftt}ʼdǼJ-"5A +,Q?'1/]?)+5A?Q $1)'U5$A@AE%yŌ \Eɩn9 0z  $xPKܨPKE9@'org/omg/DynamicAny/DynFixedHelper.classSQOATZ Q+bZc<1*Ѥ ^)]Wd?e;.g0;;|M<+bhj~twvñP ~Ɲ!Nw"܀!Fz2x0l1m/JCq9:QOC ŎWRC;8 L!; q(7]wZӒ>C%`>C\z( ./Sv+v* fXːR9v%yf}t PSudޱ 'oTL$;֛D!ar*_֞;W2 ܇jOf7fJP:C=rs^ꑰYь-Ρњ{cD6o+Mv> B ~--^CZ(A.Rܤ!e⫴3X32&^ KdXJإغ!_ŃLrf(̕ke>Ac=Uc0LmjA7D?߸PKZPKE9@+org/omg/DynamicAny/DynFixedOperations.class;o>#!v&Ftt}ʼdǼJ-"5ſ ($3?A +,Q?'1/]?)+5A@ 3=$,14ADCaTpIQf^5PI1B (F.׊xtqZ423% d.;?1ZB* R}3sK3V%e%4z ÁYA +vPq2pEl L < |@H PKNPKE9@$org/omg/DynamicAny/DynSequence.class}M 0'E[7ҕoP  JJԘ t!Y?l0,͘)35Jic"/BRf9qVp8ͥpgs!u<-$;Fv5C(q%-w+A yPH_Ct-LPKu PKE9@*org/omg/DynamicAny/DynSequenceHelper.classS]OA=l[[Q*@Zc\5`LC0ilB fv`>Gή>ǝ{9c SlV`1zzXz;j{C('h"t6CqwO0_H% 3D 3΢2\G*6>`q-{bcyʰ)e">GZ1݃W;.A9q(}c 4% Vsp/R ,թ,90,+<׿HN6dh)ͽt良+5 [q"qVO'f?${4>Sw,bWJZn\FH jOhRQ4$@UDOkn.҃/jqWihf1&`}J!a1F3/Yțibď QtrHkKX4+\J!oMsR4635h%U~ PKxs{uPKE9@.org/omg/DynamicAny/DynSequenceOperations.classRMO@}HQ*=x)m~%$.ubE<Qi7;of~|8A@A }jx,KBZQ{@C{ }9/kb%w0*.XYf©9ڑ:؟Li1Q}n$`5ZR5Y.s/_ ƫnYdH^+ lrƋ+Ќmz`h>n4jjN ]y> gxȖp,G(ٻr+上5ZϺP@\Ts\+2V9v9/` PKB[=mPKE9@"org/omg/DynamicAny/DynStruct.class;o>#^v&Ftt}ʼdǼJ34A +,Q?'1/]?)+$Ƞ__TWYR t ȠrԢĒbFҢT̜TF>=Ӏad`BVvN`dL <PKPKE9@(org/omg/DynamicAny/DynStructHelper.class]OAYڭ(j(5cIc!ܚvRf ?xfvܬ|9ba#}/C缾Y:÷b0CsoUtO2kf똡D3(Ϣa-x B@0,fyưΏd$>gͿ^Û]D/ι~̰28Pkڗ(U\΄&YemyH Z^Z /:qSgsO;:4oS($?e6bwqJ$`a;~v}}|bPcc =ɫ*NPG$);x/ܝ"QU*?PKUPKE9@!org/omg/DynamicAny/DynUnion.class;o>#^v&Ftt}ʼdǼJ34/3?A +,Q?'1/]?)+5A?Q $1)'U5$A@AE%@F1#Wp~iQr[fN*#/La@020!+;'02pI&PK9;PKE9@'org/omg/DynamicAny/DynUnionHelper.classSn@}: &mJP0TTH6*ݒݒ>B׆yofǿ~ `x辚*>ޞFG%}V&Ba3T)wG\ ^Xx\*`Xh?e,T}8 }#=>:ZF f7W.CQ| 4ط[އ{.g%!}jZ=/u?R ΑDh}E;x2ls?cI=ϭ #Zp;u=NM€|r$N'V;@ѰPL%Tޑ>δ Z{apΓ0P{⍌zyG#a7A+G3NH;VFkw\F2YVqb@5([k YP \1B4Hh$g,-neByu-akbWRb|r)AƝ2.ywLM0Am^j&~PK}ZPKE9@+org/omg/DynamicAny/DynUnionOperations.classRKO@E>AcRī'DM /Ͳ]B%BySffΠAۆHRWO:q.Rá6.gJ ,0_BRfOH@IMٵEhn1sN kse.p#!'ߡ)=2%tH[+0ux*Cז͍9ZpF  gCj(_H;Dh4(iQߋu{gZ5?$P |Ư? 5Wc'<=I\ \$6 c1MB$H<DJ-"xяPKvlolPKE9@!org/omg/DynamicAny/DynValue.class}N @~,{:tm70-*jz*҃Wg`0!MrSZPKE9@+org/omg/DynamicAny/DynValueOperations.classRN0>Ed:AA@A%zS# K),lqCt@hOO\Ù %Oن](+XMѱCo A@OpFYAs]OedH).n+k d@RdmhOxsC@`|8 &p&ejsQ#zoBiC,|=I@3 6K|WTK^PbIBV~eQҢ2$P^#0J|WUѹ\բťWqgv)Z Vs6ub>M҄I{2L_nvs1/Z% _u4'-;J"ԏT{e`T; Yx2z|ʣ7l6lgp+qFv[ٸt5\3f,bްL|_d1KlZxsv2&6V͜m[&nm]{wnG,PKXPKE9@/org/omg/DynamicAny/NameValuePairSeqHelper.classRn@=:1 67n-TJ(€*B*EA OtnK +xBVP쇙sfg<ÆЌÁvPw/BA*? ; R{p L~w, JE*yMi4w7>U̠2ʄ~>@Zq_]gA79RVaAO~M0*^4w۟n~gB?!,NH@p!hh SI ԶO IR|aF/ ",2 yJ܉3EA+&I 6hP2B/)MkW汙^V/)[o>{b_zWAmq c.#?}1kq28㘹a_&1oZc5ϳ%->~ SKl+XTK9nM|Amܙ&v%'%{PKNPKE9@+org/omg/DynamicAny/_DynAnyFactoryStub.class]oAY(ZZ4F0mLĤMl7^laĩdW/LgZKn2s>fgΜٟpIߋryĮ{d0q2Q7~}Ů7ûRhcؚC2x0l|8dX B vZ"TZ Fm=YX`X򕖯GQW&i e?<T *svLtE"Aor QDi;nr1> 90* x 6Q'e}]91".1VhaC͓蓫^v ۪$`HoUH-ڨTW;@UgF&n"]*ۖnyͮZ.-:kvK>75֪3^q[UՌJu;إJ_)+G/RuX5ŽjVW8(w{mE BB$sځЉ,L*U N0™hߴUkaVQ q}Yؚ{(\2:YC?"yf\9X*< zђ#GR`h\FpGp*sO+|L:?{5LNNj4>ķx;CMVEwX.AY%W=igkDVt{ ]Z6딬ѭk58: Q>2]fv~IL:{`ՖWO9s'? @ J#db2S, T5i/*!z}2I}T%[):;ap\#(k{rIOή:ftᧉ{ÇJ ~[&|o$qGx$VOH'1I<\zn 2x$Aw,N'{Iۀ^j3I7XY˫048Y?F" S#p1_War6O`ky-gA'阓`ނp1nCuEEEwYq<*Q=ڃ +2̭L7KrK:rd(1o(\@'ӄk2&4Kۧ-.)<62 BսågP!Bq&ŕĄ:^IqK N!`5S lG,I+tPKb ePKE9@&org/omg/DynamicAny/_DynArrayStub.classvFǯ& d!+f-aI PLںTOFqf,&8,w 48W.ekYY-|X]ˀxVnlsb劓XҠUcM3.2i״;f,vԪz+.`g/d`}˶KVkBk0Yj6m tC B?t#*ܰbz.acYSз1Zj0ih֦iw^Yڞd`BLY"' y`e360M?qX^ WuC&"[^EgL5s" BCNj:IK}[rtf17H LUөb&w P_53kYGC;^ vsb͍轴ERFU0,y3h&MDwQu3-0-q6jDs;hO ¥m%ڦ`/3sV Y!Q=l^=Tw6UY7iq^m/'51m+JVje7׍tj>At#0;@\1φF%)X`Shp5 ăKlpyԍ96#MoPV;׉qtwk [Sxڟޤ`+naX/Y԰_00K!fM@3n|[,,SuQ8Z08Bлatq~cBChٺ9c\8\$k P2^SO4v j$`4'$~;N>"L;ʶEN )Y8D/Wm%[ 倐r^'A!"&&N -/ÕDB˫x!:B4̴E/-cB q!Vʨ!œR,SBJb9!܁%I!bO )3}ZHYTTt )ˊY!b ) mGuhGM%EJ X\sj#mV}+V_"M_e~"ѷuFu?w,H,`tAJã9fim u0a ;{rځ/U ȩݰ\avF&GB;ؘ,@:@,ѡ/#:%Be%Gt tpc"AzHqCFB, V`jJ;P_9Zdnڃ]ժa1d0R Y7Y]lj~DS&+簪dK %vu}ϷKv?:IE&`yhA1E҃q|)?C݄ ڱ[x%ҟoЅ pdn 8' ^ zkaIy 9Ea_g Dy52P (be#YˎXc-?70Ns8GlAnyl@4c˸j9[?S( wu%Bh @Jg#=JqpGqъpX?Fc7rn427(\-4GI~kRyEpw#q_Pkx#⾂E+P7d EqEp8ⶡ$P"=3,YgʣBBy+fB"HGqUT6/V(K1r»"+"~K?ԥ"n7f,_FVvܝ"a~Zؘ<?UJV+ eeMVtj Q5 TVV&TvYj]+0e%KWVUߝ+ ?Je z CV8MVK~ 9_@*!JsPUINqMNtDȑV,R2᜸cy%#Ylk$cgŒ 1<ۈ汇p0]vպS ׍Q*ghY@8c˸h?Eۜ dsxq- DYq*Q9I*2 3(R0+Dƥ?cMwYGC;*N]e=E,Rìxta(5 qQAyTr*M',UndKpG31+08|ԩS[TtA;|5{VuЫJwe;mdC͛G\]_՞ݨXQ"@-Tm 5yMY^6UgS`p3 lpuTY6#z.^Nj2T϶Rsa&5sERWTXkt(d$Y)a\,&O֜fT&JB\Ra#U6y.0 =B^eE)x;5@$^ҡq@kwfPJދ!Y *-ky|w cO_|s]ǞnlMu*@x]?W=B?f{#^a?ie̤'f<C7(X,30`kUleKaP·bG >܎Á0:~ja 8~#Bhٺdƨq$I,}oP 7׌pcee|Yji5ؗX wWŒ3([9.倐r_EL0oׯ-BʅH'!!"&MJU._Z(G؛B)1!enb-BM%&܆)-L )P儐2wb9)]))!dO ) >#,Jf ܇%RHc焔>/<{\\Hy\<Ne[xS}FucQ/+†i#BX=đ foneݪk5!nVRWPMkS.6 h ~b%;v3V"Mף}ƺ&v*$vrhkr esa9vI6h@T-0]| ̿Ͳ/JC'RP96uvjlvw@8j<0Ua#>RƳFMRjyB0LNy@!J =bor]|aΙj4h)\K*s*&pKX=U=B6R)yg{LѦތx1%T:u.4R,bXN5ȜIOAh 8>[׊!IӁqҿVoRTn 8'2Ҭs?3 & d?3n݈}pHw33*2wSí){p`n g#0KpepwcqrBNJUN(3 BٔKE.![J7fr^BXN(s BIdO?D?D>7!2!(sB& Qᾂepcq0ܷn( w$GBYPKT PKE9@&org/omg/DynamicAny/_DynUnionStub.classVFǯÒY&H7 $И6i y0 H2t_釞}>TOF˜pf{h?e i-er);meӘaP8->VW-]\}M \2V`@ Y tSsᵾg-F&SaO(Ф ("iC(pxɳjyԿ] [+k6L3L+4AW;t@+u.$-P fhCjip8њ%\IMD[[5HGFb/Ɔ^" yjze71MݽY p&_0͢T8 kiT]702E]E3\lں︅ .*W 57UJJK >z:Z \j$cnݪbP_={Bfcf !>c]wYGSE;v%K*Nxl5уp%۠s1|XLiK p{?qG1*ЍI8|ԞNc{ ct3A|U{MЫde;5mYfۊB]׽t77ILGoDSt)X6>U-@X5UfC;zPfԙ|pUe slpn˫jSlkGj_1xIoBg;ܣ%RH GiBF5Q "š31kb-YY+-s$t(?>{PlId!AQoާCBUˏD|w{Ti\zީ1ak3x<6ij}@+akYx8*ta 8#26;fiLڃ f=ˍ/s{eOe*< }{[fT^zwN0'T}M?1 8ҹhYxFq6%,Xa]^^STIw*Jw*J pRNV/~F., WY)!*&PN )P L*w:ʠr+fc=+܆;Q~Rbe2z^Hc:!eKrQHRՄ0)ː29Xix$E$HVX#B )0'2/L",HVI'53",nc琗݌-3 X5pbq3NCNx^^1G n,+2n bqE#&ŕnLXkK7+3 A,po0A(P&ɕb*>TepX&m=Po(A(ۻ>f_g<2>FO8f_$ ?Ǿ j>* _|/$߰ݰ5=[3!;|J ZV{TlPK0]PKE9@&org/omg/DynamicAny/_DynValueStub.classiWF8 @ d%lξA0!1m`dɑd釞Q=3ٮY1>s罯F?7\SP3N޶iLۙ'?[*[)H*0$,:NZ)3\3n#v+k°L(Ц(fv!;odRZ%2_yЭ5iw&'ڠ7 Љ(i㖋yyiciq8ٚE[#xwio:!E^zdtXD6udpJe&73f1p ƚ 9F}a_P]P``9GS0fM2 s`9 ]N^Tt+Nh5)ucdE};V\EXu6GueY,>(8Hqm;w֚Af8r4hBP DX@%KbuQyݫ%0X )!iK "o;Cs\Ֆ/Gx+ppp!(za%ܤ> e:]2_M"m%cn9uG\n=Q=Q]|,Z `w6͆kjҼ[Afإ35|BUexo\ jSlG 7xoѐ3pU-f*٧鵽<\U CU@!N 3for]|a͙k5iU"-ֹꪔ튅x&/qʤKΪzlQu NESЉNie_r6?lZ9 3&{| - / sw@'tak ]ҿIN<za/# l?'’s? I d? ~|'""0AGGgc" #?~| @g\gMO3E9}_#q_1<JM|0[|^;R\0{?PKB.$PKIG@ org/omg/IOP/PKPKE9@org/omg/IOP/CodeSets.class;o>#nv&Ftt}O}ԒbvFIJDļt}FֲĜTFFOF^ļ03HFFҢT̜T qz ؀$X؀4;PKЅaчPKE9@org/omg/IOP/Codec.class;o>#^v&Ftt}O}dvFIJDļt}v6Fbg 'G #LA~QIbRNk^IfI%;#4eE%yŌ \Eɩn9@XZ Ō @ @PKIn7zPKE9@org/omg/IOP/CodecFactory.class;o>#^v&Ftt}O}dJvFIJDļt}v6Fg 'G #LA~QIbRNk^If T.F%\v%d32p%e22"9 Ff de`gdFn PKTPKE9@$org/omg/IOP/CodecFactoryHelper.classNAƿY[[Q*"IHX#[3Nb `JL|(UpnwΙ?}`OBwa=wÞB9~+#!*gNLxyz0l0ؚ,cy0,@]!yw ۡ'\z?gXoGPZm|uwNkb .281TUGJA?844'K F^`N /:UfHZ NII;R麻(R|dzx8k61kdSTxD㟬 WM +zo䃡|F\jmD+jisif4~ÍP1KI|l@-B?K`}Ik rRmf17cO=8ţ8aBnD O(yxU3}'PKsi*PKIG@ org/omg/IOP/CodecFactoryPackage/PKPKE9@5org/omg/IOP/CodecFactoryPackage/UnknownEncoding.classN1ƿ.ˮ( @VHL6BDҬhMYP˓2zxf?o6 ճ^u{ǂwOy1>a5QQc>7\^\Ԋ 8Jw]#^BA9J\/f#anh**l:dF8O靜4nxJ[ْ)S eUq~ ^.:ͮy4`o{-ֆ6V+^ KVamiU`uӪrĪ\UA;lNV_PKYPKE9@;org/omg/IOP/CodecFactoryPackage/UnknownEncodingHelper.classNAƿY][QjIk+& $%/:4[镉>e<sfΜߞ_ k< mPpn뮈<ڌvytc~PGJ*]ⷢ7&0Ox*۝CY }0So0ΰfQ@a%x7w睞`Xhn%}Y3׊ eTH;FWVӿ 3z;PKv[{PKIG@org/omg/IOP/CodecPackage/PKPKE9@-org/omg/IOP/CodecPackage/FormatMismatch.classON1=FGeԍ `LHb2 e_j3Taj@-W&.?x; cL8ۏϷwGx &L~W'H;ٕQa[ޜ񻩲R=eڤ 씡h|7-D UQa:U׳P[1+zl./~6SfZ [A44i'̅=pk~u¾Y:~wz< e^CJ^BX]Wy0{7sBP]Tzs#׿PKPKE9@3org/omg/IOP/CodecPackage/FormatMismatchHelper.classOAǿs\{ B'D֨&>a0HB$ }{lnQ+}2??8{^j|g>_<“"b/;鱊eIJ즦';=`Uݾ2|<+XSYBN"5[GbyP&,u{eeK4#i;AߞAg$5ґl5wovrٚ ϤyFXScBj_|W@Fx=ajl~0Qb~jKC˰Jfǃi ; 5[CSl L#{8UIB HjS:3íw|}w\U,lG 쯱:r\ׂvIa72W)7qʛk|cTDgeXa[*aW kY[=vܝ(p?_PKfPKE9@5org/omg/IOP/CodecPackage/InvalidTypeForEncoding.classN@ƿ-hEQP/zpј("}i7u쒥4XL<>qԓzpo||QC@t0Ѯx8b#9Ȍ%"~c! ;{ˡ ssgN2b"j-b%d[VFZxό:9|.(`հ_PKMPKE9@;org/omg/IOP/CodecPackage/InvalidTypeForEncodingHelper.classn@qI =1 aTqQT*"RѪˍ2[;:\!qPYjH_̞xb݁E؎F=o{QWz$|CY_6#* 72K&̟pns"P|B L1, (Z*oGHb+Dp,2lӎ?S³Dp;G~0D^]w71e[ AaQ zo|PKPKE9@1org/omg/IOP/CodecPackage/TypeMismatchHelper.classn@qBK8p2 qՂVBTJqEoܕ%ͦз+$.x 1X8~DG~ҋ`Ie/"y_AOOř"s*CC(oX7fZ*fPE e\[בPtNB=Zu5 #nv&Ftt}O}W?gO?xgx 1 A +,Q?'1/]?)+5,1419?$1$ $ 4+8(9-3Jz Cـ&005H22iv , fsPK[k]PKE9@org/omg/IOP/Encoding.classuPMO1}uD?.1!Yňjʲ%lkBd2vxCͼΛy'6ljREThWrEd"L؂)&a(;{H4++YB@Mz\jƥМr\\ t<$:r:ȣEsQeU_l:dg>#=L9xY`4Vmg *y:7} &XHδ[7uE5;ozKǢ!f F͌qh75,iV׮ 'g]8񞙱PKWGPKE9@(org/omg/IOP/ExceptionDetailMessage.class;o>#nv&Ftt}O}׊Ԃ<ԒTvFIJDļt}FֲĜTFFOF^ļ03>FҢT*ie ف<&'PK^ϗPKE9@org/omg/IOP/IOR.class}MO@P>G`ūDQF.k]RZ.$,O&(lh33o/k!PSi;tR _p紇12 f{qBNҽ K{{G[u{w 3q' ek[O+xΜ@3d}jcE@M[+q3ZkJln eh#PK1sHPKE9@org/omg/IOP/IORHelper.classRkKA=wdM>cHDmP*FT>CIv8O~GIL-qasΜsgo#źvą;"jlBD֎ n|"Aa9 uonS#HL=nαΓoN9R&haתwp'ޮL/~C̙̀圳`Kq YWL2+gӴDQ;;-R2T]WH^w,J U0GgR?`[1D7 ђ۴`"1$vǺuK\j ɨa~kTam2}BwĕaJX>vBq=DjV͠ lI@'dH\hXd"[gb4wZ#b;|^-h'PK$ˑ`PKE9@0org/omg/IOP/MultipleComponentProfileHelper.classRMo1}n$Zڐ~-- %Uy*B*Ah ''1wz WpBG!fU۬B7>f=aӃð9'q(Z0P@Ge(މ0ڃ0Orޱ+y0h1h Ae%Rɰ'tBЎ<Q;KS03wsΜ;suXcR: T/ ,62ECRjC⋊BWPb?}o)2143y$N9hQ޶v\KCUXff꿚z2={c?ށ4 f٘ evIG4]r s4cV ^,;zO`=[X%i>8$QRԇ(؀EQ,c.lxbcyȃ7𰊵Ğ7PK;PKE9@!org/omg/IOP/ProfileIdHelper.classQ[OSArlAA-K4p' OX"m%4˖Hx|;O#,&$^vHݯ2H#O>"D ZC1'+󙐫7 +ȡ4a-hG0L:"Zw̛ꈰ /Oolg+ 0{O.Ro4o>k{+Hj.]t~ǵȶRpY ~)pq)Nˇ <xq;\N2 jykhn:%w/n[~mW\%_<]pl'GٗS)mJrf4: W1\sta>sL+?1J:xuL[5%a~ZFkcg.KXq?PKSPKE9@*org/omg/IOP/RMICustomMaxStreamFormat.class;o>#nv&Ftt}O _O\Ċ\vFIJDļt}FֲĜTFFOF^ļ03 AFҢT*Y\Lf ف<&'PK[PKE9@ org/omg/IOP/ServiceContext.classuP=OA}ç)D Wl5&rjrE Xw\,+ ?8wžy;o~}8A)aD0 *\hOفoԛ#C(OBG3(Rٝx B#S%7ڼ,/GL7ʲνsνgfn%mTxWmǪ+qdYR gb,¾zas&S23 oħfC0T< :RN_qWOV6N f]BV/zG{j0 4I)T7o6ZE=˫\j=}Mp-z8-+8Hw؋ Ȱ$)Y}/z y}0uFh]l> ؎G+?);!iξ?/ۀ=ϽGx6Kxvv`}O1&d~;LXpE8aV43(-fȮXf[ *bSbW]5g]#9^dľG,a~PKxPKE9@&org/omg/IOP/ServiceContextHolder.classR]/A= Q"!IWZ6cW ] 5S&@zz27QTi)wU2$ ~ ѳiNkzZH4w6_(zhziOC?<Z 8D` RZs*B-$f A"m(F0QF6,v1Ńa 0b~ PK]IPKE9@*org/omg/IOP/ServiceContextListHelper.classRMo1}dI(! JbSR@TZD^89\%āBmWi7>f=v#$&^xl&LFOD}VDv Jʼ&,G2PZDERba̝sϝ:w8 Hv{^SzjWrFAWr 3G|Ľ=>]@| "y;^S+&d Vd[ !CuExQs}_q-A\&s2|z@ɾw˶2i.gϰbxS 7֗1xZJjr3I f!YZ1Oo>s21St~9C/i,i-%+ 7hws\I R^SFs*u$q vCb)汐R|Mm8dc"_c5PKۼPKE9@!org/omg/IOP/ServiceIdHelper.classQ[OSArhE%ZB<`I'im)Kse[?O&>Q ZafwfWVc ~7#Ֆa %^z"օlByKTkgIܑEdPFyL]EߒTz0_ۢw&$5꒰V#/-lr/qp]B4@To?4ZE]Ut)5>S6 xvz `}0b0=b1☹2o)cz_:QZbdʨ-` VRbW\U<(v5$v9%vX†oPKvdPKE9@,org/omg/IOP/TAG_ALTERNATE_IIOP_ADDRESS.class;o>#nv&Ftt}OGxG ?xOPKkp0; #@VbY~Nb^RVjr #kYbNi*#'#s~^qIb^IHh 3#Wp~iQr[fP#nv&Ftt}OGxg`א`vFIJDļt}FֲĜTFFOF^ļ03\FFҢT*!3@Ʊ22H22iv , fsPKaePKE9@"org/omg/IOP/TAG_INTERNET_IOP.class;o>#nv&Ftt}OGxO ?אx; #@VbY~Nb^RVjr #kYbNi*#'#s~^qIb^IHh4#Wp~iQr[fP(z ـ%X؀4;PK WRPKE9@#org/omg/IOP/TAG_JAVA_CODEBASE.class;o>#nv&Ftt}OGx/0xgW'`WvFIJDļt}FֲĜTFFOF^ļ03lIFҢT*1 s@F332H22iv , fsPKǒPKE9@)org/omg/IOP/TAG_MULTIPLE_COMPONENTS.class;o>#nv&Ftt}OGxPxg?W`vFIJDļt}FֲĜTFFOF^ļ03FFҢT* f ف<&'PKXPKE9@org/omg/IOP/TAG_ORB_TYPE.class;o>#nv&Ftt}OGx WvFIJDļt}FֲĜTFFOF^ļ03XFҢT*Ad#@20UJ22iv , fsPK'PKE9@org/omg/IOP/TAG_POLICIES.class;o>#nv&Ftt}OGOgO`vFIJDļt}FֲĜTFFOF^ļ03X\Eɩn9@UFLcje)edd`e` `1N0 PK ZPKE9@2org/omg/IOP/TAG_RMI_CUSTOM_MAX_STREAM_FORMAT.class;o>#nv&Ftt}OG _xx_Lj WGx7 _vFIJDļt}FֲĜTFFOF^ļ03*5FҢT*UBl` ف<&'PKV]IԡPKE9@!org/omg/IOP/TaggedComponent.class}PMO@}ç"ƘpDx՘HդI#F f)Z]R'qD;vޛ7 y:y݋<5l<2D.D5=t\FJM`|J(k4v i#=ل܅撡рXF"Jn1ijvt C?W`Q;ۍলýq=g_('QEQ'$ھD>aXp,trh WJ+jNF}v#uBx-4KkSi%tz{l}Y<#Ρ<5"ZXtweOad/UM{ú E졓Hbc]}L-bRW)+4ZISleMyvBĹ;}ㅇ*rzg78WpKIFkY[)s+Θ[<f-Sx}v Uk+XFٵF*~w ͮ_0{Ef7rfc 7PK#_PKE9@'org/omg/IOP/TaggedComponentHolder.classR]KA~ٗeiD[AQ%Ddƺ#Ӭѿ~@?*3I3s=sg?>Vb`X2y2KkF-.s%wZL L`vP2+{֔13Å U)m@K\y1@(_y! 8+`3'˼I:ɰS}j~hS.{l <܎'}1J"O;/jWCP}Ī@'oTI ^h [M/v>"1TLۯx)ܣ:i~, Gx  P#"CA)R5dA8z<!xf[/PKhKPKE9@org/omg/IOP/TaggedProfile.classuPMO@}W JpTx՘jҤ Zԅğă?exa{f>a!Ch'™'nOI/ ,\JTGtbFF|%60ڼy4F26!kG Pԁ6W\::rpȢlPvu2cd|U̙J8t.qa;YZcN'Hh#ha"ǸF8cskaTȔ"w1kLVVc`}n/PKS8PKE9@%org/omg/IOP/TaggedProfileHelper.classR]OA=wvm|(HらO@P" v\lwa?xw}3s{ܽ5v<8X~< A ':By(ñ\ҹ~(oU;\yFpP1< (;*ǓQ_臒҉"<Z%4P8 x"k߷VtuмK3G FsSU]QER,;4mWXuy5-뷲DZ6Ih<1lHQ+ߧD1~{O~$c _2 jj;1Es{"i<A%Q1_sx+ZxAc&W%Moe-V-:L]kKa=ZV O4zf ,PK*DpPKE9@%org/omg/IOP/TaggedProfileHolder.classR_KA=YZYDWAQ%D*nɶg)Їf2ʇݝW8\467tkrEQ` oL]V $:t@u 찖@'P>?6i1*8] -=S͢LB@dؕm2^suJvZuMyAqka]^nOQa@^6#{}G-+8@),Xs&5Ba^@ΥqM}?7BVm؅)'eJaUpp;2w} og=a aLB )sO͏)e4UH$"\CDQԐ (R$v6488ԃd3Ogٲ¯|PKS|PKE9@$org/omg/IOP/TransactionService.classeA 0D緶ՊNx^APq !Ҵs<EX b/PK>PKIG@org/omg/Messaging/PKPKE9@+org/omg/Messaging/SYNC_WITH_TRANSPORT.class;o>#nv&Ftt}̼tH?p GvFIJDDFֲĜTF`F^ļ03FFҢT* ,& e ف<&'PK~NPKE9@'org/omg/Messaging/SyncScopeHelper.classQ]OA=w|%E0&@b46q eRAL|w ý3s{}6|xfA2h$*$(I{9HQ$,3 SByK(DŽar"(2ʄ' $aDbp,,X4_Ԉ3Sߌ{p|Ǔv΄%\&xPk; ^+x$5n\W:t/ dh)v&؏tlCk6@;ISYgWG#fLVAw梨u+(&cw ;bswWؗv~a'_-!Xb"1\x%q3o>CBZ+~΋Vx:Cy#Ü(FsQA&Jk^L, !PM,C E. _EQ?PK慓PKE9@8org/omg/PortableInterceptor/AdapterManagerIdHelper.classRn@=\܄BK^5ACOEHR IVfĶS >Bn,ZA)~ٙ9g66}xDGA2O67al$:hDHp^S} GDCGAw$P~be ! dTQBQ8>K/B+gɢ /;lSSo{N+'B?',O)<5 ԚVqĵ֍iCwi@v{miv ӱRG5xysƔhe\4u_ J'c~w>xfW '}w}デ*۲K. MBF~yYێ'MW}185&WY^ATGm+X)憯L+YbWsb\KxPKx]PKE9@3org/omg/PortableInterceptor/AdapterNameHelper.classR[OAfviErIZ `jL*F/>MIn)O&<Q3ӍMqΙs/;X 1tG.i#Z=26}Eb 3T:mÐBe>2LTG nԑEL0 A%akDm;Z:i:a2Uc:Tw>y=U7n=.S3 0*,b^'RX5K,C˝ mZ-Oϋ0K#餗igԷFܙV@vs;tĆDf(Dʾ?i7E1Sfs?1yE Eyל#SCǔ x&!{2,azc!sb>uLKT K[,;xy32(fRf3<kvx9R= ~PKݮbPKE9@4org/omg/PortableInterceptor/AdapterStateHelper.classROAhEA(-OI|˜T#IcGx߶,[x"??0=|̷O[X6ba?k#:21=pag9H'c DڝC5{)󁐫7 'ȡ4Ѱ#Bk]1Z8Ḿ:"lO6?VJ4F͏$Q&xG뻅FϵֵZ--Zb*n 7bthwsYmSaP#sIu/(#~O>TGذ˯=[=/9<]rN/fRN3 Y#^v&FttĤTϼԢԂ"}Լϼ|vFIJDļt}v6FAANP=]|\J2K*8Iο ($3?Af$m \@ ̜TF1 s@>Y8@H21PKY%PKE9@=org/omg/PortableInterceptor/ClientRequestInfoOperations.classRN@ /@И66q 41iƅ.^ҩ@\~v*=s}op 90,.3ш$ cɅF/SH#r3FȀGl3(Nk`A_%7cpx-RΞ..'\2h5 )tȠ! Ў!28oGJHGH+v#uq#'H_(\L_{9/y ma-E%.R'y<̠\7Jux *_p_ I]U) DZ\&U2lѷC痧.$W=Wx ePQXDO@ PK zuPKE9@:org/omg/PortableInterceptor/ClientRequestInterceptor.classK A D+/x;ĵad_%F -LsX2TVDVTHe:q.B>ޟ^Є{O̓XXU:v0~nP&=H*iɧi-Ɓٲq.Ei 2,d/9d ҁ:\1Eʘ"7MA:&A4iüĦ oQk2*L9-Cf"Wryn,sL,4 56h-נDķPK|wPKE9@3org/omg/PortableInterceptor/CurrentOperations.class;o>#v&FttĤTϼԢԂ"}ҢԼԢĒbvFIJDļt}v6FyAANZ8SKsK4<5}P58UZ32pVȠyye9)`#9ᦋkxb1\3 h|p~)P[fN*n Ff fп @'"< "@RPK_]PKE9@,org/omg/PortableInterceptor/DISCARDING.class;o>#nv&FttĤTϼԢԂ"}`g O?wvFIJDļt}FֲĜTF`F^ļ03\@2sbjd)ddd`e` m `1N0 PK%PKE9@0org/omg/PortableInterceptor/ForwardRequest.classN0Ol(ʟ㍗ƉwcDE (,UKA_+/|uik{ίg'l;BޭF:TLٓk B͞l vV»0yɹ AVoN`sTeKn"}]>u:LG>!8__~PtF $&ی?FSYnvT'i(oq>QD  zd`.; gNL7Xjul o@6s#/4y/$B!2R<ճ  怶ѻ?PK KQ~PKE9@6org/omg/PortableInterceptor/ForwardRequestHelper.classmOAs\{`{ow*P=a8#G@" (Z*qO} bt&4jBo: x4Gao5{)amF%JѺiĩ*]QpE񆰛^K,A #K1ۘwi:ݬ72]•Vlh޽SUB4̱X5]?]xz|«7lIp .N?`_C,T׌rK`+r+N;,D$>Mߦ1"V2}Xg[jsa3d.-اx6<PK*/PKE9@)org/omg/PortableInterceptor/HOLDING.class-A 0D緶Ѫֵ{^AQ b`Ĵs<W0}l0e+w/yQi/]-:~,N|`(^T=!n%J|k 㯽Ҷ鐚i!D4\ :PK>ٕPKE9@*org/omg/PortableInterceptor/INACTIVE.class5A 0D緶J{nTt,1p.<ӂ?yvX2Duۻh,o/OZaՉAp-禓'$н$PE k^_^&bBV>7RIiaHa>yIg?PK>PKE9@)org/omg/PortableInterceptor/IORInfo.classM 0\x*i&%FJl {`C016NF)E }4 -0WsDC0p.aK=FF\:(j5.L, tҕDAb^d"{M{EaɚgQڄRV#ƃ?I0ؠVq IG$ 6ӊwL&hCcK { =>+Qf.Hӈ s[@1=~*Kƀ[ J 5piסQ4K܇5x)NHƠg_PK";LoPKE9@0org/omg/PortableInterceptor/IORInterceptor.class;o>#^v&FttĤTϼԢԂ"}O $.; #@VbY~Nb^RVjr ;#g 'GY.>y%%  &_ZXWȠW'_ e22r;е @ @PKp!PKE9@:org/omg/PortableInterceptor/IORInterceptorOperations.class;o>#nv&FttĤTϼԢԂ"}O $AjQbIf~^1; #@VbY~Nb^RVjr ;#!^ Z RY[W!踴|k0FR[fN*#,.g\ t##3CvH21pPK>jk PKE9@4org/omg/PortableInterceptor/IORInterceptor_3_0.class;o>#^v&FttĤTϼԢԂ"}O $nq; #@VbY~Nb^RVjr ;#$g 'Gy.>y%%  Z`A RK2KRn9 j@:Y8@H21PK>&+PKE9@:org/omg/PortableInterceptor/IORInterceptor_3_0Helper.classS]OAl~`LHhXn'e JL|wfW~|s<,X^v. /zph~ޮ~dlSzN>=9e"悫7f*{<@n2kpއ:~JNWiȲJR-]/^+.w"}Neb w +ƕ!GJr;3&Q~ISQS*A %SJgBQLn]BL8.r?s]Sw¼OPBro*4qc,f#?D>םv]?ѵg/+l9sq&8g c&Qη 6l/ dqiA r#Csc/.Ē /Eq"*9Xbb&*\N ̕g>Cc9U_V= PK^lPKE9@:org/omg/PortableInterceptor/IORInterceptor_3_0Holder.classRJ1=Yk޵A *bEגlwKV+}|(q]asfN` X ۾~j_R+r,ʗvpt,ng[2op^.DY%gX;)\վRR h;g82+7 "B H2 OסH/sKGdL: 6NOmle:mt2KɊ IY91\O&Vun:J;X|L[B~/!y4=kߺ~8]"}1$CRt6(3hiM0<hځ 8D`RZs*B$Vt`D6(֢1,14=l+>cfM'PK>PKE9@>org/omg/PortableInterceptor/IORInterceptor_3_0Operations.classN0F?@[XDwHHA-ba6Mؑmx8>@ }e}p=[cEhWRxc4ky5d/vF+J"f+}m3xjNd*:<|x tz,pY'_NdIDuS1`BOrS7FN {K 8Yq` ˊκ]olJmgvb=s"p}_PKIaPKE9@-org/omg/PortableInterceptor/Interceptor.class;o>#^v&FttĤTϼԢԂ"}$6; #@VbY~Nb^RVjr ;#g 'G #L }O׼̒Jv.FC"_ZXW_ vI: Iȉ@G120!+;'02pI&PK޻PKE9@7org/omg/PortableInterceptor/InterceptorOperations.classm 0h]|v1.B{ZChiFWs|(1t㸻~<l1gc7'c([yNJX^ZjhMVh󲑕#5w(΄XNiv gkv0W[YlBPKO PKE9@-org/omg/PortableInterceptor/InvalidSlot.classOJ1=>FkU7~ cIEТPT>m&r%(& `9||8B3Fİgl$7:1e_;iGz.r5Nsbvɽ3~?s ;e(bόeVQB(-fwމ*_/E 䟗u[ɣ Yn8a.졷5efF.w"~1U_lbbuA \'⍥0K; Rs3_PK_ PKE9@3org/omg/PortableInterceptor/InvalidSlotHelper.classn1l7Y -mHkVJtR Q)"@;\'oWH\<bhYc?V4ѽ06ɣHݑItxE(1dJ',#fLv Jjtes(ͣ"ab~oK}l/!,5NVv%}s ac&=B /d| #nv&FttĤTϼԢԂ"}gOx7p vFIJDļt}FֲĜTF`F^ļ03*fFRn9@ULdjg)gdd`e`@XPK iePKE9@.org/omg/PortableInterceptor/NON_EXISTENT.class;o>#nv&FttĤTϼԢԂ"}?xWvFIJDļt}FֲĜTF`F^ļ03Rn9@UFLcje)edd`e`@XPKqDPKE9@-org/omg/PortableInterceptor/ORBIdHelper.classRmkA~zəXmlc[[*x*bE1d[c?Q&ڈPb#uO&QVR q&Q{"{P~be1?HTQBV0u> 'B+{΂N r<7ZX cbپ{hτ~JX)<'BbYŧRsֿ \HgKV å3>E6s#a1E+àWU>K&c;e^%ۀO{b_z ׾CmWp nb)#?])n92g0Mcz_"Q^bˬ5ʶ5ݙbצYbsb%[PKѹKPKE9@-org/omg/PortableInterceptor/ORBInitInfo.classM 0 .<;wP*zĒR\x%;lw\o&2TCcSn)DP;iY8cyZP CY\Gq& '枟~&a<\)wa?BZGB3'T.4*SC ~WyPK] PKE9@7org/omg/PortableInterceptor/ORBInitInfoOperations.classSn1@B(.H V(pX9ű׉WPYXi5~ߌ/_9<c no[EOcb<:CoO;o|b6^YSaֹ )x;G<ϤVh|KY2/UZ!334]TI v[O@v4J TXu&igV\/[Bk[aJm)oZ' 6+FjV`/?͆N9ʬ/$dpS$I|:{ͺ^K~K5$|DOy%4C#Ϣ!b-럏h8ČVdvS(CK3qQtbUZ=ƫOЊڵ#s4Al.]*[A{tjtm 4l.hn[w܆ wa/{?q4Mx,hB!PKm3 xPKIG@/org/omg/PortableInterceptor/ORBInitInfoPackage/PKPKE9@Borg/omg/PortableInterceptor/ORBInitInfoPackage/DuplicateName.classQMO1(ŋ7у+ތDQD{YZ]ZRd2`i:훙K??!&({| 8ƿ9o+Ճ¿#XtHx08~M|R+"Cg܏ ~l Or IMtm@ԖyVbG*ѝhF<p#9ďrgS-tf1^.3zJ_IkV:ht F+4!*|oȿH@5.XZ3򰙈OhO-W:'$b\ڔVOٝl,&"\v7PK1^.J}PKE9@Horg/omg/PortableInterceptor/ORBInitInfoPackage/DuplicateNameHelper.classn@uBKҴ[ J=)j*~lgmmׅ\!qPƢ J%bvwvoG_[X~< X>DWX{]%MWGvh<hNjIvq@-Zk\<;kAٸt;VB-{3Ky*ߠ4McEĦ oN/Bٮ55>va+pz? mPKGpePKE9@@org/omg/PortableInterceptor/ORBInitInfoPackage/InvalidName.classON1=A*;(d QXZSąGoLL>@ 2<ccn1Q"CJ;O<* %u&5鉩,gw|og^<;2Q?e(4 ~LdV+(Pt$3gGf,˦ޫC'mf 2c>Hq;*923'K֨q: yITqBFXK>(fk+ :o,DŽ_\ ,.{nPKBb"PKE9@Forg/omg/PortableInterceptor/ORBInitInfoPackage/InvalidNameHelper.class]OAY][Qj!Ƹj$& E OqniW&^Q3ӍZS݋3_{3?}%6x o mx7-e$:4-!9ཏ<aKx,| މ8:0G:vVY~̜_a5:q p;цw"RFHMw&R6~۝C5QBf1\-C$DSL2LK*q8k2̷.q-9 @1m @|5[ems3T'v*&Z=zXHh,7M=S(j/laҡ!V_i}ԗq.EKCTݮ]PI W}l3+?")$ȗP%[v_#_udGcrY9KAwyG_~5ZX?qS(8 mVH}0+17X1a#nv&FttĤTϼԢԂ"}䒠ԴԢԼTdh%; #@VbY~Nb^:T;#4g 'Ga9Nũ ܹ٩`= :>K2ҭ4}Ṕ`_ t[f$it #3t/; $PK4<پPKE9@>org/omg/PortableInterceptor/ObjectReferenceFactoryHelper.class]o0_giC`c+@j"@B&*:m.ݸ)Z'A\!q؏vFlDNű}׏o/cXu7p+ֆwzБHLvHDf[|ZHlg='org/omg/PortableInterceptor/ObjectReferenceFactoryHolder.classR]KA=ƬTGc-&"JŪ`QĐWlƸ le >JnSUvsνu` K6,Ol9a圆R/N%+:*Nq%\UBGܥq7b].w|4JI3%oa7ϐ0T,RaSd07Y"0Q-j7ʡ:>'ɔ^DS|.d9dX+gIЉT!P M9W,jזi'oUXx!sFÑ^~u Pc1BUt1(X5m35$$dMS !bm$~# ֓`$7($kӘ}4՛W0)`PK бPKE9@9org/omg/PortableInterceptor/ObjectReferenceTemplate.classj@5jŃ|s1GBA7aIvv|}(q"/7o> 3cȔYawئ\9cUrԭu[.h*t |-(EG{Dk*Ya8w}lB$ ql|= t7$ky!>&5DV$ZO6{/uyOr7PK\TSP@PKE9@?org/omg/PortableInterceptor/ObjectReferenceTemplateHelper.class]o0_giC`c+@j" T4&!E[ąԉ"8q5fGEcH2Q9yOVNxzXSdewԴpY^JmwAz) @WR iȷ6CrЖ[`HF3D7x$,F~\:'ڹene3:%9SaXRj BhsjauМB4trMB s?$#NDŽ5НNC ZuLJklKO3gXlƺǃ6FvCڍ %&~{H=GISԣ PjW&=sX^"e}w'>*PA e@Ef8g qORt-: qCFukbߎN6ԏx 8@hgi>UtDyqJk]?#~ z<ܗPKE9@Borg/omg/PortableInterceptor/ObjectReferenceTemplateSeqHolder.classR]KA=6USMRJW)]-(HC Д$$c\n)W$GIn Cvsν]6,Z(n8Cx@  ꝋjS!E]1|DG!mdV>)F?ݣVnGIG:dȍӾ@5/T!l3d( 'E#^v&FttĤTϼԢԂ"XNfr[b2S X\ 3?.Ƞ*SD5$h*#1ю/H-J,+fd /*rIedBQr&a @ @PKxPKE9@9org/omg/PortableInterceptor/PolicyFactoryOperations.class;o>#v&FttĤTϼԢԂ"XNfr[b2S_ZXW X\\X_Ƞ3?Q1ZM b5#k^ Թ]閙 Ýz '120203#٬ l@>;9 fbPKTPKE9@-org/omg/PortableInterceptor/RequestInfo.classM 0'E ΝAo/J=AXZjRWJLAEwa?7t9* Cc#aKr*_{"TB1y":.Q{h0 M?Nad /KM1]8<AۚEVqWhT":(S-vPKMYQPKE9@7org/omg/PortableInterceptor/RequestInfoOperations.class}RMO@@JB|H.X YBJ9у85uuBDow罙782,0!Ua>FWhT&Z*3L+:"-">NEt0 \Nڿ/rQC?TIuƆ0Y:OHDYƱaJ2hM:wn;D z+B V0J5Q8ST(@b~˝n F Yd>+&ƒ[oSEn:| u'Wx=*N [23:iVs0?KZiBqB"rǠD,"ӀƓb}EzѣZU*,[\Ua7F/^$ܤlImر M=طx`=PKPKE9@,org/omg/PortableInterceptor/SUCCESSFUL.classEA 0D緶ъpi+ >-Xb"1\x%ݸ7 `%CDZr{o:/k+ר(BՉaFtr\KsݩA^HV5O/^F@ȄZ")#A. _-&PKH@PPKE9@2org/omg/PortableInterceptor/SYSTEM_EXCEPTION.class;o>#nv&FttĤTϼԢԂ"Wxg׀O?vFIJDļt}FֲĜTF`F^ļ03*FFRn9@ULdjg+gd`e`@XPK^PKE9@0org/omg/PortableInterceptor/ServerIdHelper.classRmkA~zəXmmbkbZ VZ)I%;hU89ls$afwyf_/xa'0/63Hݕuؖz,uIc1@D9]C(S2 #d (-"a"y4H}h+VqW V}Mv+#xVSjF+~g]&hJ,oPKqTPKE9@3org/omg/PortableInterceptor/ServerRequestInfo.classO; @o.X'X3$ݸWJ300r0DK@IX6){ڱ 9s5ۀG>8Oo@NITHC'P!tAS?el9.vg*N*} qʄΗu|o&s!PF4PK:%PKE9@=org/omg/PortableInterceptor/ServerRequestInfoOperations.class}RN0\C*PޯɅ.8 H,8|bmZ!{w=;;a+7J0uQ:ŧg,L(U;G͍P(CJxqncSY(ǒ1TA F1ȠNoÎB yD5*H1u|1 HLؾq~(N_w j)w*+Qzsپm\v9uBgͺ珓V+P&'Kx,\a5elzr+r5"fp<鷇r3tgpm]"V=aU_&JP&TU] `@0&zȍ6Vy1j#wl26[>h LX%t}+P#^~3w;*W"= _AaϋnFP'Gӧ^1.E !4]BPK3:PKE9@Dorg/omg/PortableInterceptor/ServerRequestInterceptorOperations.classQMK@Ѫmxb7 PikئϘ6ֿ_-1R3f?^qap[~-w3OQY오$Ӝ m0IO8+4 z3W:,Ɍ"`|b]BYyo/N W|ptĀtT9DF^cv ʦ!U&jE P(\IJGzR3ҟjim+jVf՘N*to`PKt| PKE9@1org/omg/PortableInterceptor/TRANSPORT_RETRY.class;o>#nv&FttĤTϼԢԂ" G אHvFIJDļt}FֲĜTF`F^ļ03&Rn9@U"h dffdd`e`@XPKdjPKE9@0org/omg/PortableInterceptor/USER_EXCEPTION.class;o>#nv&FttĤTϼԢԂ"`נxg׀O?vFIJDļt}FֲĜTF`F^ļ03"\@#2sQ R AZ8b`6PKqGRPKIG@org/omg/PortableServer/PKPKE9@-org/omg/PortableServer/AdapterActivator.classM 0՟hUp{w zP'Hk())1 TЕ30 =0&6V )AV/V:BTd1DFIO,4-_/f]eV Ktv">HU* , 0Q)A PKu]EtPKE9@7org/omg/PortableServer/AdapterActivatorOperations.classu=@j7ƍT4V$٘7dwsYxeXX1d˼?>#^v&FttĤԢ"}ҢԼvFIJDļt}d(#(L#B#Th}O׼̒Jv.F V%d32p%e22@聜t#323p2#7dbPK:ɥPKE9@*org/omg/PortableServer/CurrentHelper.classR]OA=wٶ| WM0&lB0i,i!n3Wd?e;Ý;{/SChzwh##ٓz*9%s1HC?C(S2 s)mg9P@QRDڄN0SUtN.<J"j`~pW VpB$`uF6[k=?仢/ofU*lK"lf7Y%mVyf3 -C7=N$r3R>FVɅ9v nv] .sWXuw_5+Ɔ%C/nħ wxoIX}VPKrPKE9@;org/omg/PortableServer/CurrentPackage/NoContextHelper.classn1o7YZڐ8)ASJ%R)j*Rqx#[<;+ZVAi3{Oϱ!`JL̓~cE' ~I#V~odo MaD  VDv-C0G a#9e̠4 M~Hs.cXl&];F8 Gu96CDhWzjUI2 aiC*z%mk鬨4zʕI|_eas0R< So /E>={Z?}76Slm\tV>4C+Jn➺gAsEy'Q3q-f΍_'_ gO}UV.TXM_H 2 |~QVU^fUdKXD욿6L]{&`PK*PKE9@2org/omg/PortableServer/DynamicImplementation.classPMK1]]z z"]Z"J+FwM ,O?J|ي'=L;Ct#4%%:9iL"=kYx̩ SFGpx GJ+w,MM,B(I˲~nj2OU^w?ҕy;jtz,#z*i~xlJѹ ~ؿ vx ƈU,[XzcưnbH`^5tX _PKBLjPKE9@+org/omg/PortableServer/ForwardRequest.classOO0ƟQߌň8f0&J䴈j(V-ZL<PƮ"$fɻp- #ƾs+dH{#arƤ~=O$&6ZK~ǞB. v",]] ThLG>!wuQuF4N(ygԱfTD[k5r{#cME-g9A݀z LեTn@U5r 9|GM5rzuUskH mލ9 (&RXNgo,hǂ9QzPKBX~PKE9@1org/omg/PortableServer/ForwardRequestHelper.classn@qBO!mʩZ5d@T@ 5U7**fҷ+$.x 1XXAq|1;;O/!<u]ShdSQ/ϑw7ڃKX<#Ds6 yCN aؑE̡0򄅺 Ǩߒ$nAXm;Z$35$<πGE̱_+=l=˽Zr\ 2QBZ_~ht, z@a7;>>DApYv9w[R'srZNj3\Nb3t[x*Y&xxpzܣl6l o/6DהtM`KV-{2Iy*_8U4b٦LJIxU*P ]Tصk`l%X†PKO&PKE9@4org/omg/PortableServer/ID_ASSIGNMENT_POLICY_ID.class;o>#nv&FttĤԢ"}Ox`Ow?_WOxOvFIJDļt}FֲĜTFFOF^ļ032aFҢT* f ف<&'PKQrzxPKE9@4org/omg/PortableServer/ID_UNIQUENESS_POLICY_ID.class;o>#nv&FttĤԢ"}OP?PW?OxOvFIJDļt}FֲĜTFFOF^ļ032!FҢT* f ف<&'PK&PKE9@:org/omg/PortableServer/IMPLICIT_ACTIVATION_POLICY_ID.class;o>#nv&FttĤԢ"}OOgϐxG0OPd ; #@VbY~Nb^RVjr #kYbNi*#'#s~^qIb^IHh#Wp~iQr[fP^;@Ƴbedd`e`@XPKKtfPKE9@/org/omg/PortableServer/IdAssignmentPolicy.class 0EOp!uƀ~A} /5HLJͅGB8ýL P!͘9e,6aIh%kG   YDyJI}O ,+T0["ʅN]ډ9T/;yz;BoZxoPKst PKE9@9org/omg/PortableServer/IdAssignmentPolicyOperations.class;o>#nv&FttĤԢ"}ԼJԢĒbvFIJDļt}v6F9qAN:XsJS44}: ǚ+8(9-3h">'\t#3=t3; $PKԑŭ PKE9@4org/omg/PortableServer/IdAssignmentPolicyValue.classQ]kA=MٸJkhhEU"4B[>vS63|P||;k.s3?} (1| :ֹL$"<F#9PC̱dzX(3, 2Q\GaSAN[i.]r~݋:WO޻bV#Õq-j`cPfRI2[LTY fj ě/S+)Ϻ<6.t%JrDf=>ÞT)u^}:N8[O8O+i5lk [G2 -*vGgF(/E,QAdXsk[</` Y<UǺ rw p#Qbg8G8:}-ܝEzf \t7PKH΍51PKE9@/org/omg/PortableServer/IdUniquenessPolicy.class;o>#^v&FttĤԢ"}ϔмԼJvFIJDļt}v6F!AN0 2PK=]|\J2KvAjQbIf~^1#Wp~iQr[fN*#8Z=[cd`BVvN`dL <PKR2 PKE9@9org/omg/PortableServer/IdUniquenessPolicyOperations.class;o>#nv&FttĤԢ"}ϔмԼJԢĒbvFIJDļt}v6F9qAN:XsJS44}: ǚ+8(9-3h">'\t#3=t3; $PK7 PKE9@4org/omg/PortableServer/IdUniquenessPolicyValue.classQn@=Խm@Ej a7Zg}'t{Il3K:JwxM"ԺH'29LYPAx+\T LhԌHY%HI`y/,n۝{h`Nٌ#˭ߪlЕ&<ʫ@il;8/\;F*a?\>%y0ޒavy0?<3X"#uF5K_g[9+^b2SXؖsS+=ej)+ܴml2F>MiY oL蛸3t>N16 PK%"9PKE9@5org/omg/PortableServer/ImplicitActivationPolicy.class;o>#^v&FttĤԢ"}܂̲Ē|@%; #@VbY~Nb^RVjr ;#(g 'G}zFTU.>y%%@U\ $:ſ -fd /-JNuIedťCnK$PKآPKE9@?org/omg/PortableServer/ImplicitActivationPolicyOperations.class;o>#nv&FttĤԢ"}܂̲Ē|@Aj[ X\ 3?Q]'#kYbNi*#fd /-JNuNعz  Ĭ `bL \PKPetPKE9@:org/omg/PortableServer/ImplicitActivationPolicyValue.classR[@쭭^T1*",.B Lc%; AAL#j)>l`r9$?~~1VP`x"ө#gSg(S'qtY:,PP+!$"<Ȱy3<:i =,WuD u }F;C?Tlǰ\DxN3qD aPt廨FĖ kۨʰ$g(Q yT8ǹ`; pF[LӇtT"Q GTyM2i9OН@jр$ML{y l XxxUlb!ƾIgS֡:DhmZN?"ҽZ6Ci/ pt[v'iIch؋acLsq;mPK{PKE9@/org/omg/PortableServer/LIFESPAN_POLICY_ID.class;o>#nv&FttĤԢ"}O7GOxOvFIJDļt}FֲĜTFFOF^ļ03AFҢT*qL@f `i`dd`e`@XPK܋PKE9@+org/omg/PortableServer/LifespanPolicy.classM 0ԟhUn %ڔ4 ;g`6<_֘0861׷X2U|%LQ ,^2 &`]¢?2lEK#YAp}7#nv&FttĤԢ"}̴ļJԢĒbvFIJDļt}v6F9QAN:XsJS44}6 ޚ+8(9-3[@YdbL \PKPKE9@0org/omg/PortableServer/LifespanPolicyValue.classQn@=}Mx<0CTH%ɒFqm410&N  $|31P"`i|{f}3~ӱ6qVAa'KԿ̹uN3]1Ժ^Dvp nwډ ]^'bjKӌmwHq_C$Nd* အRoKmTEa=&#f;zb &Γ哜xjppC)9OhVL3:O|in4EjcF >qPH]AhyJڵxUl`2u<%k>}m.`va+#odMt~C˖uBv c3]{iD}XhXoQHt/! PK"Q'PKE9@ org/omg/PortableServer/POA.class;o>#^v&FttĤԢ"GvFIJDļt}v6F.g 'G #LT}O׼̒Jv.Fܶ%d32p%e22p%@ $xPKۙePKE9@&org/omg/PortableServer/POAHelper.classR]OA=wniE>k W>aL hXB 2)CfWd?e3.p{`;y8PpBN_Kd(u.aBAou.d7"xTZg搃GXh@~ :RfS'nt. fViawk7Ao)9펅~MX$8P՛FۑVA<\Jͪ{Tڇa]@h^ޤ52Wby-[;H&YpW)Y"az?[S>7m˜ܕV>(M;B(ÑʏʴMo2nf򊛘cw>s~煃"GǹC BB~b0,b29c̬ڛIGX|w1mrF^/!*cckX,v5UlŊ?F&s-|bO,ʲYI٬cPKkPKE9@'org/omg/PortableServer/POAManager.class;o>#^v&FttĤԢ"Gļ"vFIJDļt}v6Ffg 'G #Lp}O׼̒Jv.Fm%d32p%e22#t #323p2#7dbPKAPKE9@1org/omg/PortableServer/POAManagerOperations.classJ@IFUOABO%^t3Ԙm<> Z]Xf矙ozdR?f2Ҫ9L-+6ds]<WkVV`@ Y؉&wsf(p璄ԃrRe\Ô~Xq׊L4^Uemi4y;s!0wn8*/7WZChLwy2ŁSBn){m)8@gϊPK*PKIG@)org/omg/PortableServer/POAManagerPackage/PKPKE9@>org/omg/PortableServer/POAManagerPackage/AdapterInactive.classN1ƿ( @V=$BDYKKJZL<>qE;CK1s3yX'KJ{"''RJȩT0lӝyOx)J+wƐo 2X"C5TZCihZh" U>^$ 'Wm1l6G JǭlT}?W73Khs8rQdKqRFZ}KV.-f:VV ^[ǤFoXfnd/PKRY"PKE9@Dorg/omg/PortableServer/POAManagerPackage/AdapterInactiveHelper.classn@u Bچc+*%U7UJJG5geMlk B:-VP3|^'g0: Xˎ#yonD`HDj.҉ Q C񥊔g7܃'˘Ci[*G+J+DXheY5ël{ bh~o&oF{kwH' 28P7Z1ZE!Ut&51'1])rzbR<]Q24;R fGW`<#g %uKEnyJ=ʝxF٩Mv@MЛ Ff hV?R \QA Fc4S{LXpOvPŰhM'IVh= d0-x՞ {vFG~JyEfgj!zZݍP TߋQVSjkZK{S˄ xE F]bdճ~Lg&:|%j $!!bT䁎xʽ$/<*:౞Fy_U2O2}e_NUg{Dg\4]ܼTgxQ?PKjti#PKE9@*org/omg/PortableServer/POAOperations.classVkWFK !hMH 4IiݗIIK pr|6"Dmɑ z:Z !$ν;;3+/`a۶u hTxzZ 3LS^nq* #`F`@4]m+n wJ`CttsOn_mygUI, cx}㹎Uw[qpGt/;8j&|`-S^ ϲI$u饍Hp\/j;krJh\YO^`' ls[ުm6ۖNoS eìa=:TOpbߍs~c vƠ|JR`Ӳ"vSElj\D8 =q(<T SaV/K.i6DSzAGE8 VjvBP=F bp6Y"kD\RHɴVN_ҿVHDu}߉Ktr.2,nтI3h0zh;f8V~t\fx{:nR1Ky2<(f=cX&vQԩG~J\aHvpQ}|'h&n5gi5xoq9er޺3$:r} T]4lQ^2侚$s:'Q)2{zbT6 YبjdlEK\Q(%b:.sD9s;KW$qdLJ4MYڝ8- IT߽pһxxi( >oҗ0BzFqlW0myU['q-yd[QLwqOciQfq_yjüZ?j-`YPGx-,+2Ty?W=ZA/=~H~T5HdA[޺_lGola[WjAC=!??PK+"E PKIG@"org/omg/PortableServer/POAPackage/PKPKE9@<org/omg/PortableServer/POAPackage/AdapterAlreadyExists.classN@ƿBQF1O4ܗvSWKl˓2<0||8AETIL4'|U ^'sElYܟLg.o7}U2%^TKr`Ddk(c  _f6sug4}dĔ2[KYhҘi-6ʙ:ST jC9S!v>>:0]ƺ&F+V^rjlaQ o,s]4,a5Y*_PK;$PKE9@Borg/omg/PortableServer/POAPackage/AdapterAlreadyExistsHelper.classSmkA~zəX[L_|-)=pE!6)(nlb?J))}ٙ~ ,HnF4o)@(Q}}zk@ = X(6p7[g{2zaR=a(bYgP-MOZ Wi֧ǰ_F.#.Fا?[nlz4RZPS+taO(Rt8Nm%&I/LS&dUD0k M cZJ5SLyYT/j%4ݺQb3꫶x/&_;f; c:#!Pgsw:X('%%;;* |1Sže+H XH8Bn&7ԗ(տNs,+Gi#s*cl+X(v9#v-i&]"1LXI_PK9ʘBPKE9@:org/omg/PortableServer/POAPackage/AdapterNonExistent.classN1:(xYŠ1&c2\M`(24cuhI)re+.n_9_.Ш@ptJ8҆ 3s=F b+K9 Flb)]T]@\w $AFHan ͓Q#*J(B!yo6rClp*g1% f9)2m̙>w3ת~f:-pcЂ gob#jX-c-/֖d[V V:xg_[-a;|^_PKh3"PKE9@@org/omg/PortableServer/POAPackage/AdapterNonExistentHelper.classn0?giCV?0`H-BMHejv n x(4b#)8񟿿~xmëH~4V E[~hW z?RoOeދ~,a阏*c5 ]y0W1{QO1 (2,RѠ#=a9ĵ/rȰ'aĉb}Ski uSϥN +S4cyqFK^QLɇ1}!-8QRũA#C|lniL-Qgob ߴ4RȜ+3Hw;iw|b{=ϣ= |G?qM .LhNc 7&?N=Y` 7eRdn';2o%N_$EcYj^lYdKXL Frmܙ vvwgg`p?:PKLu2PKE9@5org/omg/PortableServer/POAPackage/InvalidPolicy.classPMO@-PQxDx3$4X徔M]-]'q}3;cTaPB*!J8>W)W=<ӫ8ex2seo`xsާw3.J *" S䌠rk(a*V|:6NteS"f93k{N}`)C'Ja7Le~YW?r~)}K 32jϨYIgڠfT^Q{щic=` #TfA⿒ۆ rmYnke[~#%AۘhPKe'JFPKE9@;org/omg/PortableServer/POAPackage/InvalidPolicyHelper.class]OAY][Pj)IZCX1!^`L* jd6ôW&^Q3 দн3}3<ǖa?QB(;h 5o5-|Cn+d0z+P\3>~ovD/e,+j=L9Ca!c~ul.cXn$NfnT3hwZqCtT09l~x]vSct\=cX`.CZk\C:\(By3 $IJǰ7o(c:?/xo:=yQ^zZӾi}QRSҧ6tRn_˚N*GgeB횧w7Ay4ѣOQ=[iHcn`ƅq T-,]Q:X]\&DZr˞LR޳Jh5OXl"3+c*X ]ǃ+hZvX6/PKe PKE9@1org/omg/PortableServer/POAPackage/NoServant.classOKN0i.P@! VQ V01rӈkBb8v/޼ό罏Ϸw'pJ4`ӌ\\haTLD8q{o*V aV?"X" (Z*aOCaHhei7'l/F K_[^=OQ.O~NXQcBVo]k#+LjhEzy2Ru> CK1ݛGW)j|ĿYg9nGs 2(};W*K(w˷a%3]7[]x| 7l.l o/&RT׌rIar+NfSz.§i4FYĪKN/Ӈ쮊5%cc.Zv=~w®_`72%4uDL;SdD=UPbF;ݛMI_>EhJ3JsPl J5"E,WQP eJ׳ɐPU$ŋd)I= [p,2ƼoLvP&LGt%;{ `{٫؈[eVXz˾^l`U-Sޞ7,`հ_PKw#PKE9@Aorg/omg/PortableServer/POAPackage/ObjectAlreadyActiveHelper.classSMo@}:q -mH?B+€8L%!QSYm;nWpBG!f+UćfG)vX Dn V4D-P(Z<8ph/RwG^PQ_(6 r7q/d,+Z>HP@aٗ0u:2-V$1WY֟K G|Պ]~_kQ>[y*lz̰6(% Z?O[+tWP$$A3I'M0xv <ŐcBhkB^+Tjٛ%.ieX97YЭKxVٻZzKஃ__|ƒo2r;?pc!M~&;%Y`7%vdn$+2o&Nl(XMbUm X %홰`,ص 콿` oPK0PKE9@<org/omg/PortableServer/POAPackage/ServantAlreadyActive.classN0?iPh ! F i\7bBbx( Xp>>!8*rH*F* XRNm:g Ѣ\o?>픫?j!sƩȅ>#uwn_A EίfW7v0A; ˆL WIW߉)qE{f,Oi^QԾJr~) [}g)㙻LDW,eF`Q TQ/x7 lV˙ke PK,J"PKE9@Borg/omg/PortableServer/POAPackage/ServantAlreadyActiveHelper.classSmkA~zəXmmcKmQHD<p-Bl)X\s.l7+$g7G[>s쟿~x-N"?E~+Uwbj(j-~M':Qj9Dʃ˰x‡܏yΉ5CqG&R2G ~e̡4 A#ԡɰHCq%M%]Y26fѸoZq#Ckq/d]&?1C^0,O`epdR7J&er*):躂IK73 >4Y*f F}ZZ=WHyYTSOjn9,}r v:Px+&o\vytGB֣'čtpP&[e$;?. | e`}!+q"qܲ7w-ұK2kdNU-akSŮĮp b4k9exd7PK}UBPKE9@8org/omg/PortableServer/POAPackage/ServantNotActive.classON0=NBR~0`XPR`ڈ@w7XƕFG!4, org/omg/PortableServer/POAPackage/ServantNotActiveHelper.class]kAn&V[ۘ~բ8VĊ ЄBluj+3%{qf9 q[+aV?bcY J(0TRI(zGB+NN^7m1Bl5x#>ߪ&U$3 :f͋tVqD{EJM4'q&M9/ YA*-ëh?~>Zgob gZ _\+3;PrGَ]܇Om'4@6Xx׾Cl9q84psi4c_3Kqe.8sLʼ2=_8ecYĪ 7Ӄ쬊%%,ce*Rv;Sa/Ži+2t”0uմ$[pH YhʲFY2,7)_S/++a[??6Ny:+6^ʱS6;ұ&hh;Tx dM얞PKhPKE9@:org/omg/PortableServer/POAPackage/WrongAdapterHelper.classn1o7Y =-VTJ7EH)"Nb-.u}+BcgE6{1cg~;<DZy< y+Ft-Xjj[Qq"1RD> >Qț#3 g*R9Ba,bEgXjH RڻVqO :B+O6acgzY|^킺菅eX>CZk6mB:˫Xj"9FrQTByȰ;Oh)%IR:JFХӤѵ{#oVkCۉ' %/ksdNEιx{@ɬ;o[ZѰ h3{p+-<]p .N_!_U,b}TTzXƊ\%I;VyUz.DI4Ʋe^Ucc&l%.3aĭY2q[PK>PKE9@3org/omg/PortableServer/POAPackage/WrongPolicy.classOKN0i.P*B*"(k7XM#8+$C!4HH^y{o)R5Mit&.h䁥h%He"ylKq}\(I )ZwgL-PruxPH~1N~P%,3-l]5NhfL4εi\`넟 ߾%s sLf075H w_RA+^GxkA6kUzPK"1PKE9@9org/omg/PortableServer/POAPackage/WrongPolicyHelper.classn1o7Y -mH[ 9WEH@HDJ{leN oWH\<bhYd/foc;$O{oڈn,;RV-"PINc^˸/uaX EVXT%h lOY)nr 2t_wUI:?>v/M9ـv<#_ ClWq8%%\R&=%QzX\c;ꔞ˯nXҫ"bl ؘ t_g`o4؍쭿`nPK+?PKE9@9org/omg/PortableServer/REQUEST_PROCESSING_POLICY_ID.class}MK @}ce]:YTJF$1õ*=@}>FGAc4*jIpI}GпŐ`VӊRnyL}Y?5qN1٨\I-]uL,`1ea{{?PK]uPKE9@4org/omg/PortableServer/RequestProcessingPolicy.class= @  V $ab6nVYx%&` kޛ?0t xBbhc1+… (T:UA0JUTf GA0/puK~'ح*[\??g#YApb"ު  ^E]r᠇J~ PKpP8PKE9@>org/omg/PortableServer/RequestProcessingPolicyOperations.class;o>#nv&FttĤԢ"⒀̼JԢĒbvFIJDļt}v6F9AN:XsJS54}H? њ+8(9-3hA t#3t=; $PKꀲPKE9@9org/omg/PortableServer/RequestProcessingPolicyValue.classRn@=K+-m($pM* D. 2IxW $> 1qEPji=3g朙?~x<.0< N'Z?g!<ӌI? ]^0釾X?y( |'h1wZ4KNjGCۣeؽF{dvkexjc B8ԏ̑=4hQ0&`r; )ubȱJ' \ %CٲvI< «(. kl:Ha ]Ƿq RiiY%dP /&3wG4(^0|raRT[JY-xì8Fey_` sHr9цyw؄9]?EFB%`ː&H`-|a|XNzm'1"վ:& RyTS6~ײ{qw:&S6Se_BB]F \DK]tj_htZQY|edG,؄纘)U#}^ eT ^ d_;IqjzRYd)vP&խJYfՖR(wBw3]6`y@aX•-~pb@bp4V@?۰k|$E"SXQ0 HUQyYK! EyTS5ZC}MFa% kq Ԍacnܫd6k5g=܆*[ccTTsj:߁J(8\YPKx)4PKE9@-org/omg/PortableServer/ServantActivator.classI @E9#qF AP"Є-mj.<Ѝ x&CiY9JU\,^gXlD{Ãl*Oo\/6K㵿 ?'kkMwmˆ^\V:U7tT窄rU4P /PK%צPKE9@3org/omg/PortableServer/ServantActivatorHelper.classSo0>giJ`V׀M40 ihLB UtiMΣu*OH<GFh;|/矿Y@ i0҃@iWSqL궯Ŕ@ WEp TNؔCp_^)f눀 x4,tqCӄR')aq"K?k ~ë6mVւXʝ2rJ6[K zZ 93OS4 X3yh{)h'G(HLq t=&qIVNBp6Qf@'8'f+q3tS O|&3%4w7ԗ}rL% {A|ZAoO3V:;pmw=A_׾2Z:( 1x;;KYt#{eͯ.߉c$IfkaȬj6Jl6oEޅ{3v3pr\+P#!ÿGb7.PKPKE9@7org/omg/PortableServer/ServantActivatorOperations.classNA  7d"'z"9IHOel% a5>2v\VMNw  o4+xR*btB1~iНSI t6ga#ʠ񕅩ȿ1N ? Zw$ov{ONj׏ k&A>H^}˨sü=}^V*UƾަB[65iT8PKeAPKE9@0org/omg/PortableServer/ServantActivatorPOA.classTn@ubmP E⒪"YjP/9Dt m7~NHx 1kNe.3;}c'-X Hh<"a zBByFPZ\Gjv`3]P?w$ބqYQ + w'Bq-𘡼-Cw p02CJ~4Wؙ%m" PPswA; x8zZpDe?dYykgN[S V.r9Aֲg+ZO=JPK-PKE9@+org/omg/PortableServer/ServantLocator.classK @DF q7 B$bN CH3a^ͅPbp]е{Cajl")cG -uv+"2.YD@0Vq#wk]]k&(e}~Ys, j0FjJЬ҆@o`PK,?PKE9@1org/omg/PortableServer/ServantLocatorHelper.classSKo@qBC&B!e@*H RZmU%YGuJ8Qٵ2a=f<nAPi.W|31at^ᘫ"C6aɁ@#x[B aCpw>/B[H.5wǔ0A{KEI+f|l5@w:^nd S2HG6[Z 9;O#,9mc;-{)#H+fkdJqFM+BGh[yLS7V*~MQL%>zЄu'ҧ:3\nYдn|%Z{H;fp+B 4zp 8|/BBV %\$no-ұUO3L[Z|U i, ԧ]NmXU2B^kp}j3i᱑q*@@@l/PKfVPKE9@5org/omg/PortableServer/ServantLocatorOperations.classRN@ Bhy8" +q DTM(MXg ~G!QD/Q`Yv|{s3`Y2ˏMXvWA%;Wi+".$x:5%je􁁓Ąe~GOK⦼&yGwew^A_0؅6 uӾ}}PK O2PKE9@.org/omg/PortableServer/ServantLocatorPOA.classTn@ubڦBiv0K*DS Hՠ^r n x8!qx(Ĭ$/3;}cm=8 ҃P ҆%#D*.M(2l\P?kvQE8PHhnb%O;K?8dpԱ`׫ bK~<<%deYCckN|mI=$X? s"}&\Žѱ;)e,m1xՎ?hl(Fܘq2>J3lv3$lhM ^\{0\',_ftXPmjIء턃GwfWI#{=sg>`x JF4"Y'5N&PMa>kіu(TԒ k+4֞HoQRtl0QB R0俄qh2 j"Fq0'I!yJWFB%sG xHe9'$M- ?8&&)K"9F.P?}-1Jb]%)v3[d]PV6";A7Pv; yox΁+iA{C E=S08y,dۙ pi5|/ m-GPKIEPKE9@+org/omg/PortableServer/ServantManager.classM 0ԟhUnT BKMJx( x|0xGc2J[H˫JZ&aBLhŃ(ch\aRo[7%_A.p6$aTߛU%QN ]T"JPKntPKE9@5org/omg/PortableServer/ServantManagerOperations.classu @ED͂',›DH0, L,J4x;pDlٮ/EK$dM]`y XvIr/mkw4$%݇e ~6_W?PKG9wPKE9@3org/omg/PortableServer/ServantRetentionPolicy.class;o>#^v&FttĤԢ"}WZW\ X\ 3?QAUj+*.Fs_Z32p%e22HcWr3Е @ @PK PKE9@=org/omg/PortableServer/ServantRetentionPolicyOperations.class;o>#nv&FttĤԢ"}WZW\_Z302d%%$'e&312trrGZS`Ca }֌ \Eɩn9@ST 9UJyF8@,N PK艴PKE9@8org/omg/PortableServer/ServantRetentionPolicyValue.classQ[kAN6&ֶ "]-EB $%-y uS6; Gg&[lPЅܾ3GaGHF by,ӉLC "1]idbNtGt*&"E2 ;SEBR=?ga]e9Óf_U5j:93LuoJ?+.(V2oNo̙>JZ PFRlGՖD~,gNw԰I1LD[LCxɕ~ab 7x9Oy+]V0ǹ_/2%,sʑ+7ՕWʔ*6\ O_jѩ;ڴtֺ)cL)eˌƆYǴLbYƜv'#nv&FttĤԢ" WGOxOvFIJDļt}FֲĜTFFOF^ļ03FҢT*Qtc@&332H22iv , fsPK6JPKE9@)org/omg/PortableServer/ThreadPolicy.class;o>#^v&FttĤԢ"ĔJvFIJDļt}v6Fvg 'G}zFT.>y%%@U\ DX_ZXW_Zꖙ J>$PK^PPKE9@3org/omg/PortableServer/ThreadPolicyOperations.class;o>#nv&FttĤԢ"ĔJԢĒbvFIJDļt}v6F9AAN:XsJSt44}4 ښ+8(9-3W@.YcbL \PKǚ\PKE9@.org/omg/PortableServer/ThreadPolicyValue.classRn@=獛II^myHi!*d*&r,qlYwQH2yl\Lgc?PKK;PKE9@2org/omg/PortableServer/_ServantActivatorStub.classnAƿYj*;@lbB)CeBYvqT/L|(RldwΜs~;g>JIX oR'BN;z侪8ʝpȦw3ib#nt/^^ OːQjOqkWa\U b!^ z"$Ȱ\w}f< VK1dý3.]= L1d3XAJsd SKK7t>:RpDb:OQ)ϋEVˬz3] [f3䯫f``|I>W5H舡rc9q ?p;bkccW敧1zѷx)ɳDI|!Min!,2l5x \3H&L"ka=w#bg%ҚL&f% x#fћ&p[*>mj@ޤxHYَ=2xUF5FTՊT7oPK gPKE9@0org/omg/PortableServer/_ServantLocatorStub.classS]oA=|mZU7&-ф)M_! Lp˲ (- Fݙs;-e0t-eՔ+󳹰 Ͱ~QWe}TVp$D/沘7Ň <=Be?mjM e8jWLe4zbP3N0)rNyZ/ƾ 6ۤ(ҘQPfѪW,upICRA,ip!x39dfi+X ot%K.kn З 6)jwtC6>PŢtzE]ѪAvjU1V5H5TPK P?EPKIG@ org/omg/PortableServer/portable/PKPKE9@.org/omg/PortableServer/portable/Delegate.classJ@ϴiV[@ƀ Q\R.$)qLgsPd9s?;+91 J=z34s IHySN)_r.R/WhwAKu4 & BѾ3 RQ&4%O(2 7 \5M+?dVHǣG"lIE-Q`v< ulsZFW?XY V%.l22[-mtZVq1oN]PKv!XPKIG@org/omg/SendingContext/PKPKE9@$org/omg/SendingContext/RunTime.class}N 0_uNY%NP 䒄1`hƦLJ}P:lyP%C0LILQ*c!>M%L~”VDn0V}$8XnT& ;0{5`B'PKPKE9@.org/omg/SendingContext/RunTimeOperations.class;o>#vv&FttԼ̼tԊҼTԢĒbvFIJDļt}FҢT̜TF1 mz l  $PK5}uPKIG@ org/omg/stub/PKPKIG@org/omg/stub/java/PKPKIG@org/omg/stub/java/rmi/PKPKE9@(org/omg/stub/java/rmi/_Remote_Stub.classJ@Ϥi1ZnA B+ݸv#IX\>xC)n\=ppMuUQYn2ţt!]] Ae~zsa譡ap.U+hqvBChřݙo?^ b^*ݣ*ѡ4`xpAZUI;F(Y }%x TW~JJsh!¦ I ."s!yA O $3YH%u!QeY lUO>yLbHM!/H?-3٣'F pr>a/bsbw3ۮYE⮣؇K?PKw^<>PKE9@Borg/omg/stub/javax/management/remote/rmi/_RMIConnection_Stub.classWVG^5# ],NK.(ɒ"b$n2:;cBrryH~P9ggz.,عluWU=/ymMh5vWt*-&k1VL2l-U\],jjk8>Nk#0ׁFﶪ: GUU-;-f>[#_5jT[߽?{m"0Wݏ[gZ6әIr5¶ їiͦ%jZTX5vS*Ա55X.)'j(ߒ!qݲ^c#x5?&0;lڽItݽx,wPDY 26Ln&3Q˙d>Iqi}f2jZ&g&Hsf6׶kJ]\7+WL]#0ٰ`h*LՋ uH~Yw]8n$UFrgo0$AˋElo^e%(6=o-ƒ}aGʺÜ| }4(/~>oc[9*0(PwȜk@iv|ʉQG<^tJ(%h镊?%x']ϛC C#pQeыoaJ863e`qh S/v)Aki{"g o_TaiO(䉗Q%B -XqTMgI'i$Ucw43sϗQc_243M| R&`x } †"OK'vɕ $/B$cM%Ku5X=vk]F)XG(8WܒQWPK vu]tPKE9@Aorg/omg/stub/javax/management/remote/rmi/_RMIServerImpl_Tie.classS_oA BzT*'D4b6V, }?8wB#4fvw ï?~@ $sHMg1㾢{Tz:F o8p:g E/qSsa 8mvyO BzMf)rHP$q9HPKE9@>org/omg/stub/javax/management/remote/rmi/_RMIServer_Stub.classkAǿ{x&jdCB!B,AV].+nXO?+}*!@=IBngvgٙۻ7>]ᳱ!7QGb"x$e$ṷL,}?mI;Ӣ>C1$zF2 f$̡*>bXT ~e+X#C1ݡdlU~zjpxl;5btTJ(P:J΅2nK;RFSœ)ḛr\ˮ,̐W}V Ǖ9X;LnDdreis?v/?-3=M%,>n"{зJOބ,8YFvur5| 2<ųTқ)7Q,D?Bsl1^8>yBF1itHWxqPK'NPKIG@org/w3c/PKPKIG@ org/w3c/dom/PKPKE9@org/w3c/dom/Attr.classeMN0Ki)Vpd%XbR%.`gip8URq5C!&QQY3~h>>\b,eWF%En/%ڬ.Vv=-xvZ$$ SSs6 ֥߮ؗ}f[GmF99/pAM!y\?h]aW+2va) GŹ6Qۮ'e_1 tbSCʅ/X>ld[$TtЭ!zu#Nv&Ftrd\}g]=JPهpCC9< OSv$|w0PK[ ByPKE9@org/w3c/dom/Comment.class;o>#Nv&Ftrd\}ԼvFIJDļt}d(#$Ģ"ĒDFҢT̜TFYz c؁$PKяuPKE9@"org/w3c/dom/DOMConfiguration.class1o0Q RnR`AL) Ef(DC!e w}O~~!P"=aKe蕒;˝2C_mlXX|+^UZ"8_^`$.If) BH9$c gL@x@~l x'%LKhPKdž~PKE9@org/w3c/dom/DOMError.class]N@ZQObH$mqe2iJj ʫ|(V:p=T~:tFW),3T|ɝ3zP3T|wz|L皧z̓(l3vMvAVS&J}r˔ܖg Gv*N#b*x"ZL:\].چs?B1כc|*+BEZ V3ZirBэn"S4p")xCG[&](eT`?A58b/q SˬPKf#Nv&Ftrd\}_ע"ļ"vFIJDļt}F #~v&Ftrd\}_܂ԼĒ#nv&Ftrd\}_܂ԼĒҢTvFIJDļt}F - >%Ey֚>xfdfOf1s i[fN*#  gcd`d`f&oY@fg02pPKk#Ϧ=PKE9@org/w3c/dom/DOMLocator.classMON@=*eA8Q6씐T@mJN2L5 ?2ޡ{r}/}dkDr}:VVTPU&b+Ⱦ~[tOoFw7]e-/+:R FSgmL/U6kll<=?^Ĵ ^\ ?撇.vvKkx}Q|)YɷD+o2x[Xi.*{<%VA*⪞2åYF3y?)Rv@/ ^}4KUN g/skE3۲ Z;~DjF7T33j>y RZVj+tE S-tڒRȍF W2CS/A9LXXbebILˈv!$&C!V4ׅ# Sw=jF ԙ9멨,QCY *]i9/<+~4L\}tC %~Ha& (" w`.#I)O>>0C,,<&|bOa0gyKxE 2ŷ:PK7%iPKE9@"org/w3c/dom/DocumentFragment.class;o>#Nv&Ftrd\}Լt X e"OIed /-JNurD Ĭ $8PKO9qPKE9@org/w3c/dom/DocumentType.classUPN0-H8pR%^RYEJ6>Bi$aw<_iNc[kgؘW0_7kj*\,ɱX۞X´" Spv~Oc*Ѯn2/SlEGp"[*j&,"[1t[;&IѽŗmL@aGfOa,-5`gpG w,{PK9GN)JPKE9@org/w3c/dom/Element.classTN@=⫉n4D vƊТ\~MR&]'s{ϹL;#Fѐvږr\3m\5-Z^i4͖e=EG)L/9u!n ڍG,SeCA^DP+٣Ŷ>%0/^z7ҽ|Vɴ~dbH#Ґ+;Mڃ( szoz (FfN;&; QvoEnP;fwQ!+= 7tO2tw*5dB="(Z*2%Y S!6;*vceӮFS ^Je(GqqI$dF1 c"¸5uM-?r:#PK DEPKE9@org/w3c/dom/Entity.classMO 0'Gŀ=+Rxi()m"uk?JЂaٝ<1<ڠƇ DO(HlHnͥ6&f0v?{9+C , "#oCqNF% WTcb,K+0C[Rmtn-ɠNI=[Ń6N *;$߀ PK9Lf*PKE9@!org/w3c/dom/EntityReference.class;o>#Nv&Ftrd\}׼̒ʠԴԢԼTvFIJDļt}v6(6TFҢT G(=)@} @ @PKZtPKE9@org/w3c/dom/NameList.classm17l4ai/LHLl쪚#3ŻYx% .Izw{y@&bױ`(83JΞ_8;pb"ц:#w4j 2?XMIJ̎P3g_=YKoGvB 9k~ [!pUʨP͵?:6Ze{PKϽP5PKE9@org/w3c/dom/NamedNodeMap.classPN0sn .H#U*ݡOOYA]ƁВhbɑ?_pðP)TcQP^ět+D)uKfJRo2d 㔡.~URџbuqԢ<ӫ l}TT~9k067j/o%J9ߑIzovg`F@vlC^wxu'~ÙE47wGPKkPKE9@org/w3c/dom/Node.classVzD"7MM.afKT`KB&,fbORYZ£3ѹsՒ?8XW拇(7pVU>ǴiZ4 &_si#3-fcVxƒ0|XJ;R(p1'LlĽ{4Utoӄm]Mn"v.)P$^JicQjrG%Cv8IeS7DuKpH}^$üuna/S;16P+P0J&m◌o拀DQ2,_cpC%u|Y2ɇ'bH8O`8R['3kϭAּ6; z|]{iO.Vt1[LcKȯNIUr'dQ)9?bH_hv ů巋U0S=_]L+f Mf6gi7PLwb=Rӟigq1 F>oK x:w{  w\)8l JWx _G~7/q\K%~5^/o-K owKů}h%mxG@`>>|,ߧ?m?/~)WkK*&9x,P |+ =-߁-W`_.<Tֽ'u{?HQO0g3PKHq PKE9@org/w3c/dom/NodeList.class;o>#nv&Ftrd\}TvFIJDļt}FԼ Ff MOF̒\FQ OMtKS2sRxaLfcdL@X@3pEVPK,!@PKE9@org/w3c/dom/Notation.class;o>#v&Ftrd\}Ē%EyE% E\Eɩn9@0k@v0201+ЕL@w3p0 \ qnPKJ(PKE9@'org/w3c/dom/ProcessingInstruction.class;o>#>v&Ftrd\̼tϼ⒢%ζzH>o& :  zeSX{z]qhoB=.Ɋp&'  ^SPe1Z57VT8T,(SSK ;Y #^-y~.ͣL2m͋.ߓ r=H_>k=$` PKIPo&OPKE9@org/w3c/dom/TypeInfo.classePN@VP?(lBJVbMI%mk?`܄Ӿ7p#*>v*wśp[p3Q$u%/Qy~H XU-z!l53Fn1 :(c].F䧓ZE.Ɋ3 2-lIiDV.!Ç PmXNLέ7)6vp4 Y:4ZO &1ahP.zW4׿PKz6wPKE9@!org/w3c/dom/UserDataHandler.classmN@g@[参zq=r"LPjvS!MʂExef7 wpC (S~xcO+]reHIK:KQ,Sy— B+xp2#WFfM[7a xpʅSuI8]TQBבr}/݂"9B#*enm v+UN8">vAtEv -օPJm=pq0l;].w [â/Xfr3``&t:g ^kV?2ԙϰqK=I/՞GPfU# +dD~Q}V.?T1Q1LX& C^1c|_$9:v=#ݶ)VnКj+'ő[kXY!]e7+&+vG87ȉ(sp i[q{9//mXsݨٳɎ;`|Xnǰ8nEzX7jt7Sړil˚Nz'3zkn OV${0War7Ѫ:\pt'Fk@)[0>0;<{4wͼ+_lBq6[p[6>8Z/݊$M^(hW-p~?3^k-0Rhf/-6zvi~D}B?h܋TØ]h_$;t=9w#ǖx:Ayд(ןm3xl#%[(YnIkm3e-gL߲'{FkbKZYgyo0K6^x}zWO=]hgp2ٓ}T߿ R2s]u\ejs]\W%Uujr]\W)Uuʹ\Wm6Uus]\WM&U*rrkF|6Uur]\W!Uur]\W>Uur]\W)Uuʹb*ra*床\W}*R**Q*亊B+*J*jJa&Uur]\W95ur]\W!וur]\05us]\Wmʹb&Uur]\ UuUs]\W9וur]\ɇG1וf؏4)eC~Si8sKlr_cV܆qwNq=gx*^ g5x-6^ px< 'x3C> G|,>O'|*> g|.>/|) _W|-_o7|+ ߎw|/^b ~? $~ ?g9<~_/W5:~ow=>?O39_o;=?_R+ ⿬IR;4?PKhPKE9@$org/w3c/dom/css/CSSCharsetRule.class;o>#^v&Ftrd\b}`ĢԒҜTvFIJDļt}v6Fq,:AZSK\S2D44}Ej` cd /-JNu+6=C)&c8@d3PKd_ߪPKE9@%org/w3c/dom/css/CSSFontFaceRule.class;o>#nv&Ftrd\b}`ԠҜTvFIJDļt}v6Fq,ZAZ8SKK*ALu M,.9E%y֌ \Eɩn m"hh'#3=t; $PKH1PKE9@#org/w3c/dom/css/CSSImportRule.class;o>#~v&Ftrd\b}`܂ҜTvFIJDļt}v6Fq,AZSK#~v&Ftrd\b}ԠҜTvFIJDļt}v6Fq,@ZSKSs BR+JD44}e[32pTU`1,뒚XX_na \Eɩn |R#3ÂMvw947PH21PKq6PKE9@'org/w3c/dom/css/CSSPrimitiveValue.classms@Y-G}F[U+@#t8 CB5?G9ݻ$ި}h33kg}=n&0Omm4iaQ@rXl6{ñ2)GopݲCS4U68mB4嚶E+*h'AF)KRZ@d Ik*lʭ#j4{YLNR@diBŏtRL@RptU40ˑţ3Bj<.1ttn˒B4';JܦcZܲj^^!"-$fz]_&C;Rq3_=i>>̯ yPÂPw7+uAY VH xOLrKӵEmd'Po$*L (˞pSY 6Ǿ$+2f q*C0RRtTPBa!bުڝU6r mֻabrڗh5cg.w$F?@u-VSv}d [wI$X)`~ nOTRzpMo[~lRv-hArHBxfBΧ\Lq v;)EY|H4a?-8bxNoPK]bPKE9@!org/w3c/dom/css/CSSRuleList.class;o>#nv&Ftrd\b}ҜTvFIJDļt}FԼ Ff MOF̒\F OMZ32p%eEHd#8`($PKPKE9@)org/w3c/dom/css/CSSStyleDeclaration.classQMO1}ȇhb xĘH\ýͺdٚnAymhЗf:'UgBe/ZVRi|gMB{ޕl1:$#"f&Hc;NO"2ƄZF+#;h +{KPn絙Ѡs99uߨr5ļxChrPKOu8PKE9@#org/w3c/dom/css/CSSStyleSheet.classuJ@hZz""xJ..ǂ\!v_̓CIgC;0} g1fu_yj*3 Ƌ4mfJC!fg9q2!J0OEBOiV1Bx-H٪cA鄝ߢizt$rlt?4:m0t=ž}M*b"DqdSm1N =x PKt\PKE9@$org/w3c/dom/css/CSSUnknownRule.class;o>#Nv&Ftrd\b}мҜTvFIJDļt}v6Fq,:AZKS2AaT@fu3201+02I&PK_yTuPKE9@org/w3c/dom/css/CSSValue.classeN0EIi h RTF!XQ8k,> a$"̽;'6vN:/>T4i6:M"-s߈!p W#^v&Ftrd\b}ĜTvFIJDļt}d(#.} %>y%  ,% >Y32p%eMDv @[1+L@3p0\ad3PKlȢPKE9@org/w3c/dom/css/Counter.class;o>#nv&Ftrd\b}Ҽ"vFIJDļt}FϔԼ̴"F M̼tkF2ʜT78 ($+8(9-,Qd ##30r;@@ PKV}PKE9@*org/w3c/dom/css/DOMImplementationCSS.class;o>#nv&Ftrd\b}_܂ԼĒ<`vFIJDļt}v6FYdzRKRTg02j L .)KAw1֌ \Eɩn9 ؜2NFf fvH21pPKYګyPKE9@!org/w3c/dom/css/DocumentCSS.class]O0.6ёQt"2 j I)_𡌅@rr|>xVd~4%UE#-=2Ø &aJ`=U!!ڞẔ3I)&O0}5meD"nsBӵx;A]+a^0wۃ PKPKE9@+org/w3c/dom/css/ElementCSSInlineStyle.class;o>#Nv&Ftrd\b}לԼ`ϼ̼ʜTvFIJDļt}FFu Mte]RsK2KS2Aڤڧֳ2X @PK妘PKE9@org/w3c/dom/css/RGBColor.class]N; @h#qAKL#(d ,l>x(qq7xb!,.}\,k[vIXI}ItDBtaZquY]9+7=!0D <^DNSLJif΍0;r`(&:?PK)IPKE9@org/w3c/dom/css/Rect.class]N;@}ZXxmDK;MH4`W\f#Nv&Ftrd\ԲԼb}\ eg`adJ,KIKOJM.adN.JM,IadA( .)Kb6X5#Wp~iQr[fN*#z @V6H21pPKPKE9@org/w3c/dom/events/Event.classuN@R[SQMtED цlȀc-)mN1 20b33op' \p x(J434pф9pm&oAiOYH-=޷֍aD!Pl eLG#%25i0f>>cˡ1F3sLg0IǕUL19qtɁ;_#PƯt` \^*A-D=璎q1adaD]ʽ00I`fbA N:zuk7|4|<@bq%ؔR R+PZ=p P($ PKjBPKE9@'org/w3c/dom/events/EventException.classPMO@}˧"xxA֏#K]MdxL,r F:actAH^'(,["mK*ϣjg5F {/PK& -?PKE9@&org/w3c/dom/events/EventListener.class;o>#Nv&Ftrd\ԲԼb}WY\Z X\ V k0FҢT̜TF! @f120203#>V6H21pPK"Y5nPKE9@$org/w3c/dom/events/EventTarget.classuO @hTmZ, ĈIr(. -vݙe?u02\0K8/-lH3O,҈'ڬD 5hT}d "<7RO EIVПo]U|&c'j20`f25ЄUbΆPKuq7&PKE9@#org/w3c/dom/events/MouseEvent.classQMK1ԏڮxڽ4Ǟ([WK[הui̓?%f[` yyo\i* SU';9&:tm~:TECR73"X5 zugP'&~d޲bVIjaH#BI(" .\SIP!&eBqC&RM` ~_+D Sp.q8JzHW@Ϛ7$?~:S!42zD{FLljP7 oZl=߷x`pDY_PK*V_7%PKE9@&org/w3c/dom/events/MutationEvent.classQMO@}k"_^<…&z4PÁ+ljI&e2&Baw̛7;&$3k/-RZqƲcoqXB̈14Ц9ώ20܍Jq&nAk(nB of3MAS A3K1v:zԪ{{ H;g/!5i@j#:#F`EH}s ,MrH' Z5n ֝m0NEL|D"}RiR' 2"h;unЬ9m1%m:y3<ڲKqQ3Q g<(hRkDz?N 8K2e]D<iJ}Hڀe͉3uЉ2.VtԔ0PV7HgATg y\?J 7GA4 d|Sqc7cn&ρ}XHN1Y?VX’VX’V(y\ytn-<.`ZEK1rL`2ט fbnCk6b0w{}#^v&Ftrd\}_ לԼvFIJDļt}d(# VP} %9E ">#K2ҭ**D50h12p%e22L Ff fz Tv9" qPK窽wPKE9@&org/w3c/dom/html/HTMLBaseElement.class;o>#~v&Ftrd\}_TלԼvFIJDļt}d(# VP} %Ei ">K2ҭ8 B$Pq1LZ0bjҢT̜Th.i:YezN( y@4P/dbPK =LPKE9@*org/w3c/dom/html/HTMLBaseFontElement.class;o>#Av&Ftrd\}_TלԼvFIJDļt}d(# VP} %9E ">#K2ҭ؁*S!* KTSfPq1\[1LWp~iQr[f#z fd`bV`0= ' <`Jh>~ PKŖ]IPKE9@&org/w3c/dom/html/HTMLBodyElement.classm=O0GBh@ c` F&@ A 2i[S>?8S@~|9|{38pb(l%J]:뵖4uY %f2M{!VLK3G b\Ҩ e\90BjueupVNo_pJzF}2 ˛RKJ&aFklSHb&mfa7=> 9}[pPKʈNPKE9@(org/w3c/dom/html/HTMLButtonElement.classmQN@V be\'%+Q4,MI-ST~ͅGo b`1sc9'w>z:YH߯|1}cA,N'֔1*Xgo}n譝!ϯ}Kږ=Y} |uI ذ k4 Z])ˁ'eC9eםbh CSsױVc4kRurmC.Tt| L+˽(4q&bPWSNU߅VU QحC8Rx\sw NPKԆ0 PKE9@%org/w3c/dom/html/HTMLCollection.classm @gbm'IざZq\ n>%^lTpbvfv0E0ѕ`E2]ܔmh)r$ O%a2Q'+#^v&Ftrd\}_לԼvFIJDļt}d(# VP} \%@fPIE#J3 (_Zꖙ nf]@t&{8@d02pxPK$uPKE9@,org/w3c/dom/html/HTMLDOMImplementation.class;o>#nv&Ftrd\}__܂ԼĒ#^v&Ftrd\}_̢JלԼvFIJDļt},<;# VSKs f (P1FfP,8(9-3'A@Ĭ@/0r'P$PK &<PKE9@%org/w3c/dom/html/HTMLDivElement.class;o>#^v&Ftrd\}_2לԼvFIJDļt}d(# VP} %9y ">#K2ҭ**D50h12p%e22:MFf fz Vv9" qPK8PKE9@#org/w3c/dom/html/HTMLDocument.class}KS07(|\;GO 2:SqF{-҆I _̓-Qq|67;= H( Yc >.:WvS#}ɱxC"P~H\(J`άz4< ܞ@ͬۿ5XDKCNCq&FΨ`rCC}Jx:)| k:eOw߶R/ZBjZw<6 0TJ*rIaxwcCUcF5[ǘVfɱd!҈.{+Fҥ-mf/0*O`@I@6fNsc.r̼fVbu^IsUsMknhnj-؎嘻{_ PK{<~PKE9@"org/w3c/dom/html/HTMLElement.classeMN0FiiSBПh7X%K jVMjTN"Ƣ4"fypQἪ3~UU_X5['ZieuIK8!ʌڹ]p#nv&Ftrd\}_ԜלԼvFIJDļt}d(# VP} %nE@44}fd /-JNuIed=33201++@DZ3pX @ PK*-PKE9@&org/w3c/dom/html/HTMLFontElement.class;o>#Av&Ftrd\}_לԼvFIJDļt}d(# VP} %9E ">#K2ҭ؁*S!* KTSfPq1\[1LWp~iQr[f#=1@3201+l@O3p0< 47| H21PK9%HEAPKE9@&org/w3c/dom/html/HTMLFormElement.classmMO@gQ?hHM&ElڒKv̓?e.K3;w!#6&"bhR\[oy佌ӽ8cvP$MNDΠ1P PvJO)7ۅ&nj/-2c1a`adT7 dTJna+W+[JZvfYSq``\XXk􆧊splA:ц6w`pqxMh'SС6PKJ>=LPKE9@'org/w3c/dom/html/HTMLFrameElement.classmMO@g%(*jMMpLh­RvE?8mGC;y\gR s&2t& àUnoXeP/pgjAacPȠHov8A pŠ#}HtQ \%}15OZy'f}ѡCa XyJ3RqIiiڏh#~v&Ftrd\}_לԼvFIJDļt}d(# VP} %9Ō ">K2ҭ! ˁ ؋aJE50UjAT@r%e22H`qa8@^\ `DI&>PKK.A#PKE9@$org/w3c/dom/html/HTMLHRElement.class;o>#Qv&Ftrd\}_ לԼvFIJDļt}d(# VP} %9y ">#K2ҭ*3SR54؁BU)%@f1$Q L4ÀF#Ţc/U 7+8(9-3(.U=@Ĭ0 \`Ҽ |`AL BB h0dbPKvPKE9@&org/w3c/dom/html/HTMLHeadElement.class;o>#^v&Ftrd\}_לԼvFIJDļt}d(# VP} \%Ei9 ">CK2ҭjԈj`* * /-JNu>=c5&8@d02pxPKKpPKE9@)org/w3c/dom/html/HTMLHeadingElement.class;o>#^v&Ftrd\}_Ĕ̼tלԼvFIJDļt}d(# VP} %9y ">#K[UUj`* cd /-JNuIedtH- @ н  ws2pEA <PKAvPKE9@&org/w3c/dom/html/HTMLHtmlElement.class;o>#^v&Ftrd\}_ 5'575A +,Q?'1/]?)+5( U/T#WzjIXjQqf~#̼tkb$5J4ÀKS2sROFf fz `v9" qPK/PKE9@(org/w3c/dom/html/HTMLIFrameElement.classmMO@gQ)_" *~b=zR`z蹖ͶMv7q CC̾3}'/3 R ΕǕkTh{QؽA<2`Ay;vHa?4T #xtB2HR\3NNfe .6ߠ[G\3b}a]}%EA /$"GlƠU/8lgL2L>K?`VݙwfɝYsgVݙĝYvgL.7TË/.>[pd ^nrS).EbX&+]bjS։{qx@<$6G)8PKXVPKE9@'org/w3c/dom/html/HTMLImageElement.classmIOP\\&zQ ń[-/.Syvu9߼y||0@>97Cr )nl7P!@idmR Yjs9)Kےen |˕ d5OMa!86Lka+05 )\y-ЌIקXpD|B ??ød !Vé01%)aL3Z?,/cLcbScLcB{Mqkٔix/zhU 9GgEӖQ*-]ױVw/K3xQ\Nh+GfY xKpқjBCm/98<{If8҉D@1e黽/`.B\Uqj+k_-oM[TM;R=\qEײA|L'?g;(]ۣJ?g?PK PKE9@)org/w3c/dom/html/HTMLIsIndexElement.classm=Aq8D 9Cnoeߦ(1'&;ϓw@e BS_\h% x9Np#@*F6="pC_{k}XFq,r;wE ^PKf:PKE9@$org/w3c/dom/html/HTMLLIElement.classm PDj4_h'I- C/QI$F_(q| Z. sr0@SEF? ] }}ɧ4b Cc.V'Ǡz";t󓰈M dy GV "/M((Ex\1HZ_irY.* H:QJoVQ#CvPK~כ&PKE9@'org/w3c/dom/html/HTMLLabelElement.class;o>#Av&Ftrd\}_ĤלԼvFIJDļt}d(# VP} <%ɩީ ">cK2ҭ؁rT  (FCT 0b$=\Eɩn9@#3Ê  dP>/@@APKHfPKE9@(org/w3c/dom/html/HTMLLegendElement.class;o>#Av&Ftrd\}_ԼלԼvFIJDļt}d(# VP} <%ɩީ ">cK2ҭ8@r2؁L\FZ ifЊb\Eɩn9 bY! =;(847a| H21PKd~dPKE9@&org/w3c/dom/html/HTMLLinkElement.classmR@@{b Y\b$q9Eѥr e<6X <~e6 .x =D $ ȚdQhm&3 S>VcߺO޿ǠjS)0 ^.2 /@q(<+9ba*R= p5 EXs j/$PA_we1REM.$ ,$dIB.$s D53㳊7ykP54s(_#76q؁:tsPK#Ğ"z_PKr>P1<PKE9@%org/w3c/dom/html/HTMLMapElement.class;o>#~v&Ftrd\}_לԼvFIJDļt}d(# VP} %EŌ >X;ϳfd`jKMedGX\RRP S )_ZꖙT$=@3p0x2 @PK>.PKE9@&org/w3c/dom/html/HTMLMenuElement.class;o>#^v&Ftrd\}_ԼRלԼvFIJDļt}d(# VP} \%@fPIE#J3 (_Zꖙ fbU@p&s8@d02pxPK×tPKE9@&org/w3c/dom/html/HTMLMetaElement.class;o>#av&Ftrd\}_ԒDלԼvFIJDļt}d(# VP} \%y%`̼tkF2Fv /17 NH 4G3 hR1IpL /-JNurD|2-Ff f  \PJ0i>(@4A PKLͰwPKE9@%org/w3c/dom/html/HTMLModElement.class;o>#~v&Ftrd\}_לԼvFIJDļt}d(# VP} %Ι% ">K2ҭ \KRC2s؋aE50Uk# /-JNurQt!#3;7PLh:^ PKߋn!PKE9@'org/w3c/dom/html/HTMLOListElement.class;o>#Qv&Ftrd\}_לԼvFIJDļt}d(# VP} \%@f#P($",HedA\Rn 4(0)pSX40 :$PKa>fcPKE9@(org/w3c/dom/html/HTMLObjectElement.classmRA{0< (Fx`*WbHE"Vq7ٝ,j^>eLEM=_oQie;&ȣ\,SL#w%k0*6RR#1uV=ms'٩0GNU']dvO r6-#_2_1 )m׿PK4PKE9@*org/w3c/dom/html/HTMLOptGroupElement.class;o>#Av&Ftrd\}_לԼvFIJDļt}d(# VP} %.ʼnI9) Q @1ĤF M%Ey@]ȺX44ÀڊD50up%e22H`H@1+0X>cg` Ls3i^> F~ PKΕ:PKE9@(org/w3c/dom/html/HTMLOptionElement.classmQ=O0=BBK|uB ɂ%BE:tsR9 Jocvޝ{'Ȁ4 O4/2q^e&<4 tWQμG`Uuz!B\v,{IZQ#^v&Ftrd\}_ĢĂ לԼvFIJDļt}d(# V8SKs2D44}Fe[UUj`* cd /-JNuIed@=>kA&8@.d02pxPKirϰPKE9@'org/w3c/dom/html/HTMLParamElement.classm90El{::h%5Mћ`$P 1B,F'}+tB!Fz6;u-vJb#^v&Ftrd\}_TלԼvFIJDļt}d(# VP} %)% @bf#Wp~iQr[fN*#0z ;u1+L@3p0\ad3PKPKE9@'org/w3c/dom/html/HTMLQuoteElement.class;o>#^v&Ftrd\}_TלԼvFIJDļt}d(# VP} %Ι% ">K2ҭ a D505KS2s@Нt#3t+;͜ \@Fn8PK) PKE9@(org/w3c/dom/html/HTMLScriptElement.classm=S@ "*ge4 CcƂ.5sw5 ?q7,vs>\XPp@]9đMǮ…Dcb, hͽ'#/ }\;sۙ4RѶר0 ne;`YΏh05*\ 0wç^3uMHuӢSK.]trW0nܔ =۔uY;ȹsd0[ps0iFѻ?PK'PKE9@(org/w3c/dom/html/HTMLSelectElement.class}R@{4T 7@ SGTJPP%d & GP=ASz=]gPWa@l[#鷝V2ڋnu( 3ósA V:eZ]w (&ܓߋCyFNhZ"H@E_\5>]XТD3Y M " g@{8RW> ,,)`I`j5=$mMw 3џAk Ek"qL=#?c]|/C?C2(=pxVx&[ٕT?, (˂X\5( CIpC7%$eގdv`_@*UII8}3}PKqD9PKE9@'org/w3c/dom/html/HTMLStyleElement.class;o>#av&Ftrd\}_ʜTלԼvFIJDļt}d(# VP} %.ʼnI9) Q @1ԔDF M%Ey֌ @!@Y44À R^ 3+8(9-3EH7@1+0T؀^eg`y LsCi^0@4P dbPK(ȗXPKE9@.org/w3c/dom/html/HTMLTableCaptionElement.class;o>#^v&Ftrd\}_ĤTĂ<לԼvFIJDļt}d(# V38SKs2D44}Fe[UUj`* cd /-JNuIZÍz @1201+ЛL@G3p0ad3PKE ` PKE9@+org/w3c/dom/html/HTMLTableCellElement.classmN@g, **(-jlGOJ4$B RJtl|ʸDoۙ|;Q`@qMm|ѺP{CՆn0Z=3:@@jmS XG@1h.ZkL`icbd¤,K'b@TԯzA(t;TRWe`\}j8gD&&>uQ*6E2-%>g)qzN福Hj >g&"j{ >\$·ۡ/9Eg~+I/puY~{ PK{Ґ.PKE9@*org/w3c/dom/html/HTMLTableColElement.classmAO0"8x]l"GOfH016mf8QƯڧ_}Okj yAy2i<3)\>HPg, x!3\7s H22㎶ ,,chPtzx`4Cꩱ趗d^ qjwJrej+W3=cW{WE();B/RKZ ʴM)YhBe Юxh#ct*[gsMzPKp4PKE9@'org/w3c/dom/html/HTMLTableElement.class[S0OeWVT+* ^ TA}IwpFsh3L0IWƯxUV_I%l0)g[q<<.s HR(0`E~<:1z0Xk01e AZ6*+kO%BZKA39=Tg f$d$Tdb"S+*uVB w줻J*٭t"__,N:Vccx`9lcsx`*؞[>p$=F<7;*DL=y]dޗ,)Q0BNmOL]ySSԔ__xc&7қ\JSI'ij](g"5ұdv'gn?9>q^Wp;s WxuxH-d!%ރKd? >$#XvWh};>ψ_F\'nCKxIܲ~5goPKO1PKE9@*org/w3c/dom/html/HTMLTableRowElement.classmN@g,DPT4!z(ѓ$! dMU|6>e CN?n҂knNE ^o$M/$.PEdއJOno41Uw4R`OPbmR@鴆>F2𕀪n~ۏ@GWT?j4Qs`Yo:PWQ:*TDO*y8;Ph5{fOd7`58m jփ̖_c|$ &P"zrɂ<*܃|/1p smz#E$<[ҽ]F ιC{N% G[PL,ue $R2\SO@ vM.O7%/t<4ﯿ Vin {LpJPo*eJa>KRJEfpp5͹87V$3Z[8PK.),!PKE9@*org/w3c/dom/html/HTMLTextAreaElement.classmRMO@U(~WDJ$$JG_PKH<PKE9@'org/w3c/dom/html/HTMLTitleElement.class;o>#^v&Ftrd\}_̒TלԼvFIJDļt}d(# VP} %!@„̼tkbQ Ly0FҢT̜T"t Ĭ@o1r3'P$PK44ةPKE9@'org/w3c/dom/html/HTMLUListElement.class;o>#Av&Ftrd\}_PלԼvFIJDļt}d(# VP} \%@f#;P( ADCahpIQf^5PO1(0b&Q L= \Eɩn9 E>: f%v847e`dL PKr0PKIG@org/w3c/dom/ls/PKPKE9@(org/w3c/dom/ls/DOMImplementationLS.classmJ1ƿhju[sM-]da/LpkgeD_l.L(MySƩ*TD=Wi2'# 4 W\f[ GZp#6R܊wσ#%'UX΄&uY3:QqBa[R p|*UMW}`i#qHApXain킳G@f6mU lc&h 6:s/PKFPKE9@ org/w3c/dom/ls/LSException.classuON@=Cy **>BjBnP:̘ҢąGQ{=>>?b CSǡ|C=rUY?#BKU"GOxsx VD/4h zw7Y_T2`h'TaO. KP+Ue+UpA|+Q_9Ma6&">3! %.Z[1AgCPPK D2aPfO ܟ;|Cu*S4F5{3ֱLƼ&hq6PK-E?PKE9@org/w3c/dom/ls/LSInput.classmN0ǥB_ ȍMT ĄTY}5<W4m}'53 ~Oަ Eք$ J@iGtz+X3T$FЙ t^S&—S6pz#^ #l^^3ħLJm⥾(~6H6 $S4Vj/Di9Izϲg:k(WRl&MYUsqRSѻ0jfgE |WPǒ[݄aKs*Ui֍ckhـf ښjHQNr,8PK|}OPKE9@ org/w3c/dom/ls/LSLoadEvent.class;o>#^v&Ftrd\b}`ײԼvFIJDļt}d(#Tb}FϼR SJCx5#P_jK~ri.Xj P-Wp~iQr[fN*EHNFf f fv9" qPKPKE9@org/w3c/dom/ls/LSOutput.classmJ0L]tvt7;EA좠1 m$M>%d+N].Cwr> LtNۥ.yQY2oKc2 UBT?- LU5J t\Urz,V6GSȐJ42qHk(YV)yԿ=Yo=֛&HKBWse`؁;=p{ 󹏾p<đ!}F.PKW)PKE9@org/w3c/dom/ls/LSParser.classuRNPiIP(Җ"a,L⨖n"c.7yZ~TK:>3s<aVxh7Gvɇ , 0P{מ6@k_/Fl=1fOw{t ]rG"q RL8k8ݞtQIױj;>XzCYT)tSCyThZ;C(L]+/a|H^ffegl<!%R`1֋B(>?:ԌFHt"AҢ:&^z^+0 U<xni?>a%6;y{&ږSqy,}1`_1MgjF4\2|l/g<^|RgK ?qVJXW) 7aK,l7wPKX0-PKE9@#org/w3c/dom/ls/LSParserFilter.classUOO@ZZ@Q?p=$UM[hֲ)5"̓e4\v~yo~~\å,3wssrʝ!/+QNs%J-r7E>-Ez`abb,* hٺ1=" $/A4j&a86jx;֛3^\%2^ 5 ]2S*?+Q᚛y'2 /p÷)!s\`mR= 4tt`QCpl'Z?PKtPKE9@$org/w3c/dom/ls/LSProgressEvent.classe @ƿJSCgPB`/`bnjУuzhu1yO+ h Y&Y^x> JBm#@aEMHᔉٷRˊw3_\kJ箷;6 6RU* |zGYEyʺ.ͩ-[0B!-Y ׀{vi0PK_ PKE9@'org/w3c/dom/ls/LSResourceResolver.class;o>#Nv&Ftrd\b}ҢTSZ X\_QSPP\RnM-M zX32pwAz @V6H21pPKb)YPKE9@!org/w3c/dom/ls/LSSerializer.classN0 -P``aڥ`H[HM*+סP{O8p"Ud/B{"gv]Jx窎m4x 8H"{P3"Grv-W1n2R-d04q#bZZhF#Nv&Ftrd\ļb}Լ A +,Q?OJM.adN.JM,IadbX֚+8(9-3V|=l  b`L PKlAȆPKE9@org/w3c/dom/ranges/Range.classuS]S1Rڂ{OE`:l^Mkm$?nJwPΞ''&7~ ;7_wEqlJx yt!cP;8?{ʝl"KJݓJ k4+'`ȴrVPs_>ˢ%T9kb_ eҢs.:2Xz|ɍrƛQ6He&]Rʩt\|fДߜ D:V]%u|a|c.@c=Wz,8n\ؘjSkm4'aDo盪YUҌz+[*?"||=9360 ƔO-;1lӉ3#5̏l6$#(Ä⶷qM(#9*[^C>_u ހ6&EX" ˄+Jxڄk׃.lރM> ,`灿2| oP/PKV$Q*PKE9@'org/w3c/dom/ranges/RangeException.classPMO@}+ `8bL2!i iSה)-"7FCmkzif -%PE)#aFHޒ}W0r\=AbI#]XEMnCrp2ĔDwU"xp.ߟyR{'yù !X'T?8E-´*:id(nj,7d_E%S<^0q@ F͔ PK'hY PKIG@org/w3c/dom/stylesheets/PKPKE9@+org/w3c/dom/stylesheets/DocumentStyle.class;o>#Nv&Ftrd\ʜԒb}Լ`; #@VbY~Nb^RVjr #_z*DA0X#. }2KKS2sRP,@Y@,v PK/aPKE9@'org/w3c/dom/stylesheets/LinkStyle.class;o>#Nv&Ftrd\ʜԒb}̼`A +,Q?'1/]?)+5#=$AMC9`3KS2sRVLgcd`d`fF l ;dbPK{PKE9@'org/w3c/dom/stylesheets/MediaList.classmN0ǥ$?Hܒ ȽR z7u&U8PۂVv>wq#p۴Z=lGEvIV>QiTn, WUJZ>`Dm6Tۮn̸5~+"_s5/l7 aszwiHkBubOLf41 Ue$_䚝#ozA `trPKeGPKE9@(org/w3c/dom/stylesheets/StyleSheet.class}P1N@ !6q @vIP"D#t{1|(Ğci~|~ĉii2JdZʮs^l%c.-Շ*29],)AFFWjS*Fskwa4i55Ȯ|&S3^S&,d*<)mo\YzT n.pό56v ѓ@?.MBqm '{>_m=ykCqP5x#8v0PKPPKE9@,org/w3c/dom/stylesheets/StyleSheetList.class @7ӲK;^Zc@:f?nE֡衢c4<_vXk=Jq{aCiEkl[%T5Hq:w\[\i$rBZ 4ϊBRXULXncDp Rf\ Pbh$$ٖ IДؒVUgx䗣rhqG'36D ?_َH!G5=J?TTP:PKYY}PKE9@&org/w3c/dom/traversal/NodeFilter.classUR@{TWңc4*\NS+\|J cn=wϟO8%ң,W#W{^|;R$!險1jڲ#@,:8ڐF^Qqm'u6'.[[4KG 73ճ&"A9l[xjxԠbT\: 9j()_ A(/ԙ]@Ap5͢L;W"a ,UUbfs)L]fu\{ yBhYxR$ \!6yȃLgƂL@)cJ8<)4< <N3vBWr{ [Dh 1.J%7WokB,'Scρ kwofY YyYX^fYom{f6bg^A2_, B;>:A8z{^%/GPK_]lPKE9@&org/w3c/dom/traversal/TreeWalker.classeMO1,ߠ̓ =LL&@$VvX[>k(t`>; hzaptn?To|:j=8dP%%#i<0(LNLw*dȠj?zT!2Dh 166àIza8A 0apj0Sŝ5=՝=_#Nv&Ftrd\b}Ǥ⒢0 A +,Q?'1/]?)+5;=%?475S4&2ǚ+8(9-3'A=l  b`L PK݉PKE9@$org/w3c/dom/views/DocumentView.class;o>#Nv&Ftrd\b}Լ0 A +,Q?'1/]?)+5/=%5-4AIC(Ǥ⒢dkFҢT̜TFAd{@V120203#ZV6H21pPKfNPKIG@org/w3c/dom/xpath/PKPKE9@&org/w3c/dom/xpath/XPathEvaluator.class;o>#^v&Ftrd\Ē ZSX_ X\J.JM,Iu((J-.cdA .)Ka_pPjq~NYj&.5!12kOIm 22r4X"L A$c0KS2s H=##30Þ ` ( $xPK5PKE9@&org/w3c/dom/xpath/XPathException.classPMO@}kAA/ =X?5!iYJkʖ[L<QY ~ădv{of RXa@t~0gc N1sq$Bȧ\V,#1Jsc6nFeݸov b`6CIep?4퇖8  7{ WBюB!cu"fa3,*M!f#Nv&Ftrd\Ē ZQPZ\ X\ZSX`l_~JukML!FҢTA"hv4120203#) l ;dbPK ΓPKE9@'org/w3c/dom/xpath/XPathNSResolver.class;o>#Nv&Ftrd\Ē ZSZ X\ ]ZZ\ȠP\Rn)_Zꖙ fH##30]b1I&PK7PKE9@&org/w3c/dom/xpath/XPathNamespace.classUN@"$o&x@ mnd)iwIYgPxd @MBזڽjn _kPXr ެu.*&Slũp%nhLLb4G~? PBh8mX[ CE;esO^ n˔ߖ)DJ\Jo 8"j6a 58 #/\0b*Kא ~akM +߆q|{:[Pw^QX/'k|֞_PKvw-PKIG@org/xml/PKPKIG@ org/xml/sax/PKPKE9@org/xml/sax/AttributeList.class;o>#~v&Ft }ǒ̤ҒTvFIJDļt}FԼ Ff MOFv_bn*#BK0иtk 5 LyZ8ZsJzKS2s!GtU&'12l@21<94A|&02PK ),PKE9@org/xml/sax/Attributes.class;o>#v&Ft }ǒ̤ҒbvFIJDļt}Fϼ FQ |0Pc^'#:q*9楗d020kDx@"ɉ9~ +<51B\QdTYj܃MqĦ h[h'a9@{KS2s~D12<ee`c``Ls1pi( 4? i>( $$PK8sPKE9@ org/xml/sax/ContentHandler.classMO@gޭx3b$!QO˲bmv5q G@lҴ;')5\'Ӑpa\Y&P7Tmw!e}(3\ihN7#I-$PWԟr\.% X=ڎ1:۳<^Bb" )E74!=WHE>{2فkY- ٸ㕚uK%F*n;2~x= UfP~Oݹ; a7SOZK$|vd|8|Oe2[$ C!A`;AK:;PJ2B<{K5 z??PKa/nPKE9@org/xml/sax/DTDHandler.class;o>#>v&Ft }ļ"vFIJDļt}FĒ<FK ̼tkbD4\+S @f3p22H $1. TWXTWYR ۛLq&8(9-3'z l  V6 c@.nd ePK#nPKE9@!org/xml/sax/DocumentHandler.classmN1ǧȇb|׋kz"d$j⩔ɲdi7ml|8lzi3ҁ+o<×@d>s9P;PfМOE\d2\XԆ~ rJ\UEuQ2 Ot-aBl>9?xvB/iiyhrn/9ۿ~ux1W2gFƦ,6 C)=̇)D fSaE ِ3W!0Q_3.be|@!ϹwuS/ ӋGBVE w0w t?%,Gw!q m|@D;jq, y1XUiakq&甯8wu,_ 8tJYّca}L D`>]hry|55H+9#zŴ.]5-AeyimD$x[m-xMs[ S" rgs5"f&Vkr1RDn 2jQ{C^#Z/0X Vm:%;wͬi)ἻpŖ&p[R ]yYV ae>m!z||-h ~#:B0U C+0 WKN҅V&UL i͠,kn*|q$9oR'} ĨˢcJsth P-6~ XQL`XO:&¦<ؔR~ &UY'١ǰJ]D$?ppn xXuUh;鶓ZSZeg|wz6m Ѷ=A^s9$%n7>UPK:$R PKE9@org/xml/sax/InputSource.classQKO@5yЄ@p¨RUETBڪT7*,rl WpBUuvm\rr|~[@;#v9!u<&ee(_x9W̕Jgs `*0o%K}o_t1v?pwAW}<,K :AA F#LOFLhR}z1PCs1ڈ/wE6ޞF%ԕL<|:2vPK5IJPKE9@org/xml/sax/Parser.classe]O0"0/Q\K$$1:22ڥ5/(cۙnzI{>A-ݬ7ʈIE撮PpK)Rh0Aw0™>_]TGE66i+Uw<^K{#|"vZ cI)d:r@kT1 2+?pf|% 1I,̣{0WBY}*}Tm_Ce7дSԵ_@f/PKdÙ;KPKE9@org/xml/sax/SAXException.classPN@=S^(FWb3CtոNҒR+~eNH#99_.pP|\MsWv5@znY _rm0䯤+kL;b'QD%g([X|M3Tfg9g8Ny+~v3F"q0k昡s9CA̔VrIq-ѕO 'U u&ewlQaH1kءXw)+&_R6܌2Ý9T#Hj'&4C!:eP l$x1/VcmL+?PKuU}MPKE9@+org/xml/sax/SAXNotRecognizedException.classOMK@MFcڪx<Ճ+ޤ")`xݦK\Ie$xķA)1ϯIy9T<~^&:ՋݖJ|_ҟ.CR媸bu 56QG\g4bIv Q6~ Gѿ1tg1<y¨<œ! ag&wN_t([81#aյC†+vF\׉y2_{μTffn9}PKɈ PKE9@*org/xml/sax/SAXNotSupportedException.classOMK@MDcڪx Tx KxݦK\Ia)[ {x>fzp~XֳYMۧIURi>S^j!>/ϔ 7S(Mzdb|̔uӐ`o9+2h%lL]X?S(J[%`.}%&^821p>6L, 7 ZV#2:ЈmŶq7PK陆 PKE9@#org/xml/sax/SAXParseException.classQ]oA=vR*Z}j'Lh$ACi|膎.fYO>蓉6t00ܯs/#C؊7XLɇ(!fJe 2Y| D8zI,asHwJpZљ_@pQ d*\7>a Dp*b|ts9&lw;J /DD\{F{<#P; x%v=53 TM/(\kp(W~Ҋ(L7NUQ8GЋ&-6vV:K\γ'غX eUXC+ \pG]ehQV5hTajdUޤ7Sh5bV~h›ܡ·lyUM0ONRca}l}*:ûyi,Yvn3msڹ@禵PKA APKE9@org/xml/sax/XMLFilter.class;o>#^v&Ft _̜"vFIJDļt}v6L A)E %Ey% >XY#IiP_Z tP*#iz W Ĭ@0r3'P$PK! #PKE9@org/xml/sax/XMLReader.class}S]OA=SmA M|$ULkmm'%ffJ ??xwevu_nsν{O??x* REGp\~y8#& PDk>4 70\O%\1l+wD:v<%l}absZ&7:Dje$h)N5"Ќ?۹"dSK=,3_D|GS2t0NSd_L2 MPy_xxɰb Ν6 9ӴD:69VCN.{y7yQtУ`~j[|3FM;XUkמ;V~kqBQUd_nlUdᱍOP66$|UTg{Rn /:6l]maس5mG*xPKIa]MPKIG@org/xml/sax/ext/PKPKE9@!org/xml/sax/ext/Attributes2.class;o>#>v&Ft Ԋ}ǒ̤Ғb#vFIJDļt}v6F1dm- \.9E) ,Q >CjҭAXı,.HML_Zꖙ t@cd`bV7ـ>`g``ӜP LsCŹ q> PK#-D)PKE9@%org/xml/sax/ext/Attributes2Impl.classn@ &ͥІ . ] .!Eu$AESذE8cZ& 9o9+G`g]N<7KW.CSjepԛ̽gIљXW$#ߩ r1!yv*mP{oPГj6ޱ~7LN?.#t΅ؤ!*"G)˝ z)΅a:m5v]kBYJ_[dx[Dډ>IlW2Bt?͑}~s9‹ ؿ9PmnX͏-Gky'2c11ѝ۬1o Za a1fTF}#c01:n8O0t⼕FJW ]5Sje誕6 ?ZO LS:kI{ ۏPKGHPKE9@!org/xml/sax/ext/DeclHandler.class;o>#Av&Ft Ԋ}ļ"vFIJDļt}FĒ̤ҒTbFX `T^5D4\+S J28$fdNIM+8L(z=(/15$ݒL 4+8(9-3'H!2X䳃x@(&&‡l&PK5XPKE9@%org/xml/sax/ext/DefaultHandler2.classUn@YܦM5mYBE-UҊHH$>89veOWG!g+8M*s6??.RAANMkM՛kr-> ӭK9*ڝy7Bajj'7׏̵BX;YӨ-"2!B,qٗ,1!F+{ߨWS+&CHm"8/pVaD1* μ./UJdjK)uҬknؖ,l{Oѝm/"iۑˮ\䲏VzYPPKPKE9@org/xml/sax/ext/Locator2.classM 0ϭ?VAG@Wg*q1@Pb  =_#0NRZ4\5gV o]%LJqFT3 'OH#00[,_9.k8\]XCs{uRmJja Qa?q#yPK4?SPKE9@"org/xml/sax/ext/Locator2Impl.classN@)7"r)b5$. ƍĤ&PSZ2-ҕ 2^$A]tϙϷwMS:L3Wڢy;)!7\8ߪ@d+Ð0,ýd)C4bdC^3,~?uxл&g(zхdþ9QߖzSy!3ճ5`(+ Iꪩ[ ʒ(G;CC0l ' O\\YY,n7wBZ'C K%)hݤJQL"B P5_p4Z\5b?^g?I=(ig F3Cg[#n=Vd, *c'> H|SnGF`7P6Ġsrd7pGӫU`ddT2q>!Wsbvt)b)?G8PKeeZ!PKE9@(org/xml/sax/helpers/AttributesImpl.classOAgER~(pPAIQ7LJ>e=w37ޯ?~@ @#vFi5.}ExyUx-7 ]צazIk^ ,Vv@ !C2E;*uNͪM W5>3=wa!P<$0Wr צM 7h Yz *aJ G QjPܪ.2u%l0*.0f6cIbRRJދe)tO?_)TMdTjwWpf7f&GKP^e'02B}F`CmSݛ&ݛݠvǩ7;*wCPJϡųa|20  xO=-}Ƞec~3ڠ<9+{| \!0<ѽI8/A$COz1ЋsoڙM**œxždN/1}K>(F3myP MjтZ+S ړ93eۊcV((0椌U)c^2Υ3{V`73?M]])^Θa32섖 EK2y+3MD L`2:m7Qw T3͚B>22.=F`ι[W#UdQt=ydKi`yK\7CLw&vF9 D\N&f4f 2>1%iwɹ,f,tw]l$7 nn6#ooى~6!;z,dd;;rl:YW?5-.t TCYb%t0@b648H(g:46皺ɪu"Β38J\c@zUnr{&E%'1ZEmVMy+mHU]꠨ɲ\E|a%:L[^j]~zFRndQW׺l]0 J@: w_8+ݸJHpX =?p@@u>5D!p5`rjZ>r6 cN`&0B&qq &XT> +844q.DŽ1qL(Vu`P%(C&  T` 7[hE6^lE6zo%/`L%rI@` ;Dž \Q݆{ xrCxyV˽YW)[)ng7bZAƦD x7[{ie'HyJ6mPKT`W PKE9@%org/xml/sax/helpers/LocatorImpl.classNP8!~TaT*U7H"Y){'\# AN, CU{mgwx翏O` q:Fh¹AhԊ`^9U K2˛'K1i4AgG?%}P>E %,Q"aڞ5w'"mMAhI9[ޓb9C,7$t3PM#B'Dt;s׋ )# _m~:8ttNXׅføi|F•M0+]GI0;lN SkcLO[ZӡD1!? 873q^8x@+ z܀hpp3qނ܍XVR3|N $1pDhZr/arQS`7CS'A37B# PKFPKE9@'org/xml/sax/helpers/ParserAdapter.classU[SF>+(`07Aӈ7Ҥ@i!OB1IZ3Sgٕ*tEk;v? úyOK\<`e唩P&pqa=U$08fawzJtÛW#jt(#0̲-@I[{M`hҤ.Sa@5 ko  CwC"0ڲl??8Q-4z f ;X,3#*w滷D mc I0m4mHӟnCMC,Z=u6gݕƺ7_K1GvwBLp "." ƨ%!tDO,'Ա#j:]vBXJom]a<O#2X J^Lյ&ũ&f> 97H̓HZ\]Mg&g<Ů1aJMo)g+hKe^N+U+Ӭ%AVڸ Aj-XTL_eR*zMW}-_ςpZ{Of '(O/*ςԙ|-Bюx`vldGxey~kX/=K>ͱuP`T_:w*5 Lq`' wP.ރqКQT+_'$xld*LiJ $*lwdx0#-Pp(c##dT: )A1)8c]= HJ,"3+ZDjVDc I(_,HߔoJط x|_*|ޓP5"Ot3_'X-r>t_M,$[ lzAnfdf_"\.XʥVR4`b9bWRwE+/%E}9~ԂW!n@/nܮe>ͥ~̎dfm<PKf PKE9@'org/xml/sax/helpers/ParserFactory.classN1rZ@Dql}Y(]oW&^>] ؋i1Jlîpm&zL*Jd::A˽it ]zFNbyϛ4Oj賞ad]T5ԕ463Sk!XsgJMf]4МE Uw!>u*?rjYӒ?ޕPydR< ^ޫgJ,H"ts/}VѺSC;8.YO2jD f#$R1YidÜv˞yySV| ~J/GtnT"ۼ(t?3O*֢z7iPK}*uPKE9@'org/xml/sax/helpers/XMLFilterImpl.classVYWFc7,%@f fKZJBX7f B7!#"$ј>O=Q=3R,Kps? : #&+dnf.nQfgwrۚ)^[zj (tئ /2ȓ$tgT5 =//Zɸo&G{,YHF1dXnZ0KSRT0"oRUGXb%ff{$K5"ϛERIH+6bJm36gEՁLU̜uVZejv(}iE1KYݗ"f|rUr!R4w\BuZ* TNyʲHG Kޫ;ۧΐ=ubk!I;ffYI^6WǛ䷷{N^҅ugEԣwd-9#8!lmEC Mۇ 3dG=x#D0x:K#hf2$ ė/ܦKJPKQ"PKE9@*org/xml/sax/helpers/XMLReaderAdapter.classYSA{B ryp `@e<<0xB|ldqݚP|?ʲg6&$@vz7UbnټKϴ:3]GFT#O@czJ5Z5]"C9U5e%A{] !Ȯ)m ' >n]e#0W`F\){80~H+&KN# i7'nVJlw E{Ro !!N9k&_rŢ̋}yɛHneV5o,U0gfKU/ nX~fjxHW u#0a ?i,}ձ<fZ]R-!vLQ"\-W!oUIw HzX̹KE'X< jOK~\>6rans^;z\CNy*-1a]Pmxp*|0]dMy& NSf8z-(WdL%$@d}_ ȓ"Z҈/ we]J 1ShC(Zq24+?pk;&'aǼ+1+wJR3^@3Yf`V65Ee"i[> l^ BJ-̈́.vaV%Hq6Rcט5fpY ԱY/Rǹ2jJsH=.C"둸U[3m3K)Xsv9"w^YTi T-XD(}x D)E7Jx*UݟZɠ[{ kթ0/d %Cz"Rl{2bw]歍p -Oc' J] T)Vuzd~vlh5k *@à ͆)Nhqʽ1h 81ssnqr$pK\@R9R|1$@ &`X:ǰGZ<b);0d6Z~wnӧ1^ePEdOF9=3 lO3wn{2g=vzwpA nK}XߒI\E9G.ó^zщ}hT׮0BwE>@6,;#{YkTZ--; meh}8B/11j,xjPyPS:j:ڸ,<@uF.q `?ME^a%&%L H03(aVQ s  cHXy$-kjIiqI$j5-!$]6$mjII8`qL;`YǍs\%@qc8F{$OBxG$j,I"c`$p^b7 ,ٙ$C9٩c %| kGϘ/_1 ]g$WY"Dc!Cܺ ۧŢpkQ"o_iGlۑ̉#a~q48=h Eķje^c/ zF?VWZ PK%MAPKE9@sun/awt/CausedFocusEvent.classS]/A=w۪VU$JH& mZVjWO~%6Hsgݙ0S~cPЗ'n= rw)4-UMl W[ŽpիNUݲ.. {-SL#aje;,IB0buѸV1>aLei o0*bwT`UwGɄhL(ߓXD~M;O~LO6u^]RRB8ҫ4K?E|"$t"/]=1F Lj  910j0j &&2j0FX(ƴqfM`-_@eQ) zjZ^myLK\ʉfϖ՚9cc+y~ GOPK\`iPKIG@ sun/java2d/PKPKIG@sun/java2d/pipe/PKPKE9@sun/java2d/pipe/Region.classW[WIAQ%74F/&^0%(Q͎0$0a7aÞlu0aGZ_U}]U?_ B;x 9QHI*cZRvh#G#A>Y@0mqU"uD γT2n$YҶ xi''ЛdRi H*Yp*%:6&`{8NP!ڍbs+ ]ћެJ%QΝwφ+ M, RQoAkN.Gvͣ^:|N+JEΩt2A<ܑUdMdՐ@rRAtrV)Uqy>o*[7s~vhӰ9GyF9s8p-jU;T 4R8ɂIUCTA6gn?3XFM}0|^,#=8*t+:5t})S Hv.RD Q'7BI}_J1cvy\lw43QSB0'h9o魡^zLm,ZftLpT!0v2&h`$LcPsfl,Y9ge5Y41BYk(^f;iLi7Ry]E~ڻֹixRk@SX+N, YJQ*yVE-UJm, FV:ujl} WQ?CD 83M><7=/a aPn(&VLh*gLw`ڀx``xiz!f$3!G3]g@J c8*cp.8r10j-30i#1&j"WzW#`ɖ4|B2l#du4tM.W repmVcZ 0a#Y16[E֡h[ce\[8cQlђŢ]E#̢}o%wQ9("V8yxZD[\hXmI!$Qfͯ]d.$7l$ $ 'G~x=:C;Sŏ]0ki=r۶̅/8e\%]hiIÅ wmps|8E=2˝0 5C bDL~+8hIPKlJ^;PKE9@$sun/java2d/pipe/RegionIterator.classKO@[("Ob5$zxh%ВR~'z2CgKCfggvf~PNhl=>᥎9CaEW:v.70CJ>m',!i9×=QqáQ[(6e#6k7A[wݧtͱx]1=*2EN{\A5:1fghU ZJ(xHRһbf! KQ gZ"UU,O'MGd3:+k$ čOcOfHOb#@6eFg$ހA[G*<[Bfn6k˯# 3@?@nq!?jPK$wlPKE9@"sun/java2d/pipe/SpanIterator.classMN1ECT&|q!$cItosQFޢwqO;?_fnΈ<٫p)vҔ^5&E0ًAU0+$>pQL 97+퉐taZXĘG/iߵ{fc "bvMV|\. 0 ;' b^"9($PKMaVPKIG@ META-INF/PKE9@eYS,9META-INF/MANIFEST.MFPKK>m^,LICENSEPKIG@ tOSGI-OPT/PKE9@ƀOSGI-OPT/bnd.bndPKIG@ pOSGI-OPT/src/PKIG@OSGI-OPT/src/java/PKIG@OSGI-OPT/src/java/applet/PKK>%$8OSGI-OPT/src/java/applet/Applet.javaPKK>h S+[OSGI-OPT/src/java/applet/AppletContext.javaPKK>& ( OSGI-OPT/src/java/applet/AppletStub.javaPKK>'g"OSGI-OPT/src/java/applet/AudioClip.javaPKIG@}$OSGI-OPT/src/java/awt/PKK>l##$OSGI-OPT/src/java/awt/AWTError.javaPKK>=Q`#&OSGI-OPT/src/java/awt/AWTEvent.javaPKK>d%.*OSGI-OPT/src/java/awt/AWTEventMulticaster.javaPKK> 'i0OSGI-OPT/src/java/awt/AWTException.javaPKK>,V\'2OSGI-OPT/src/java/awt/AWTKeyStroke.javaPKK>Ul(5OSGI-OPT/src/java/awt/AWTPermission.javaPKK>ʺ&7OSGI-OPT/src/java/awt/ActiveEvent.javaPKK>[Y % :OSGI-OPT/src/java/awt/Adjustable.javaPKK>wI )<OSGI-OPT/src/java/awt/AlphaComposite.javaPKK>t5)U@OSGI-OPT/src/java/awt/AttributeValue.javaPKK>3([-&yBOSGI-OPT/src/java/awt/BasicStroke.javaPKK>0} 'aEOSGI-OPT/src/java/awt/BorderLayout.javaPKK>o;-3IOSGI-OPT/src/java/awt/BufferCapabilities.javaPKK>!LOSGI-OPT/src/java/awt/Button.javaPKK>29Y!OOSGI-OPT/src/java/awt/Canvas.javaPKK>'^ %aROSGI-OPT/src/java/awt/CardLayout.javaPKK>z< #UOSGI-OPT/src/java/awt/Checkbox.javaPKK>j((YOSGI-OPT/src/java/awt/CheckboxGroup.javaPKK>oAܡ:+[OSGI-OPT/src/java/awt/CheckboxMenuItem.javaPKK>sa@^!^OSGI-OPT/src/java/awt/Choice.javaPKK>I3?- aOSGI-OPT/src/java/awt/Color.javaPKK> S$_fOSGI-OPT/src/java/awt/Component.javaPKK>@˟/sOSGI-OPT/src/java/awt/ComponentOrientation.javaPKK>N3$vOSGI-OPT/src/java/awt/Composite.javaPKK>o.+xOSGI-OPT/src/java/awt/CompositeContext.javaPKK>$+{OSGI-OPT/src/java/awt/Container.javaPKK>N\e=yOSGI-OPT/src/java/awt/ContainerOrderFocusTraversalPolicy.javaPKK>g:[}n!IOSGI-OPT/src/java/awt/Cursor.javaPKK>:Ɩ6kOSGI-OPT/src/java/awt/DefaultFocusTraversalPolicy.javaPKK>D-} 6OSGI-OPT/src/java/awt/DefaultKeyboardFocusManager.javaPKK>PV;"OSGI-OPT/src/java/awt/Desktop.javaPKK>US!fOSGI-OPT/src/java/awt/Dialog.javaPKK>AR*8$OSGI-OPT/src/java/awt/Dimension.javaPKK>`B4&OSGI-OPT/src/java/awt/DisplayMode.javaPKK> (OSGI-OPT/src/java/awt/Event.javaPKK>+A%!OSGI-OPT/src/java/awt/EventQueue.javaPKK>_nB %OSGI-OPT/src/java/awt/FileDialog.javaPKK>[V%OSGI-OPT/src/java/awt/FlowLayout.javaPKK>&/OSGI-OPT/src/java/awt/FocusTraversalPolicy.javaPKK>DOSGI-OPT/src/java/awt/Font.javaPKK>ɂ.OSGI-OPT/src/java/awt/FontFormatException.javaPKK>~6 &OSGI-OPT/src/java/awt/FontMetrics.javaPKK>Yy 6OSGI-OPT/src/java/awt/Frame.javaPKK>(eOSGI-OPT/src/java/awt/GradientPaint.javaPKK>e#TOSGI-OPT/src/java/awt/Graphics.javaPKK>R2˦j %OSGI-OPT/src/java/awt/Graphics2D.javaPKK>by=B1OSGI-OPT/src/java/awt/GraphicsConfigTemplate.javaPKK>o0?OSGI-OPT/src/java/awt/GraphicsConfiguration.javaPKK>W$o)SOSGI-OPT/src/java/awt/GraphicsDevice.javaPKK>qU^.OSGI-OPT/src/java/awt/GraphicsEnvironment.javaPKK>'~9 -OSGI-OPT/src/java/awt/GridBagConstraints.javaPKK>Q$ (OSGI-OPT/src/java/awt/GridBagLayout.javaPKK>,B,OSGI-OPT/src/java/awt/GridBagLayoutInfo.javaPKK>3T%OSGI-OPT/src/java/awt/GridLayout.javaPKK>B\6,OSGI-OPT/src/java/awt/HeadlessException.javaPKK> dU9OSGI-OPT/src/java/awt/IllegalComponentStateException.javaPKK>h KOSGI-OPT/src/java/awt/Image.javaPKK>rj,OSGI-OPT/src/java/awt/ImageCapabilities.javaPKK>ĕ!OSGI-OPT/src/java/awt/Insets.javaPKK>O)]OSGI-OPT/src/java/awt/ItemSelectable.javaPKK> h(OSGI-OPT/src/java/awt/JobAttributes.javaPKK>6--OSGI-OPT/src/java/awt/KeyEventDispatcher.javaPKK>k-L0OSGI-OPT/src/java/awt/KeyEventPostProcessor.javaPKK>5ax/OSGI-OPT/src/java/awt/KeyboardFocusManager.javaPKK>5/d OSGI-OPT/src/java/awt/Label.javaPKK>b(OSGI-OPT/src/java/awt/LayoutManager.javaPKK>w)+OSGI-OPT/src/java/awt/LayoutManager2.javaPKK>β#.OSGI-OPT/src/java/awt/LinearGradientPaint.javaPKK>vn~aOSGI-OPT/src/java/awt/List.javaPKK>U;\Y'KOSGI-OPT/src/java/awt/MediaTracker.javaPKK>!`Gz OSGI-OPT/src/java/awt/Menu.javaPKK>$`" OSGI-OPT/src/java/awt/MenuBar.javaPKK>G~kb(OSGI-OPT/src/java/awt/MenuComponent.javaPKK>?%H(XOSGI-OPT/src/java/awt/MenuContainer.javaPKK>xЎD #OSGI-OPT/src/java/awt/MenuItem.javaPKK>m0+'OSGI-OPT/src/java/awt/MenuShortcut.javaPKK>5}F$OSGI-OPT/src/java/awt/MouseInfo.javaPKK>}]c0i OSGI-OPT/src/java/awt/MultipleGradientPaint.javaPKK>F)b#OSGI-OPT/src/java/awt/PageAttributes.javaPKK>LƢ  +OSGI-OPT/src/java/awt/Paint.javaPKK>L35'!.OSGI-OPT/src/java/awt/PaintContext.javaPKK>^s ^0OSGI-OPT/src/java/awt/Panel.javaPKK>9 2OSGI-OPT/src/java/awt/Point.javaPKK>8; &85OSGI-OPT/src/java/awt/PointerInfo.javaPKK>=e"7OSGI-OPT/src/java/awt/Polygon.javaPKK>د| $:OSGI-OPT/src/java/awt/PopupMenu.javaPKK>˖(:=OSGI-OPT/src/java/awt/PrintGraphics.javaPKK>Ŏ #O?OSGI-OPT/src/java/awt/PrintJob.javaPKK>Z;3 .AOSGI-OPT/src/java/awt/RadialGradientPaint.javaPKK>Hmd $DOSGI-OPT/src/java/awt/Rectangle.javaPKK>8#)HOSGI-OPT/src/java/awt/RenderingHints.javaPKK>qY4 MOSGI-OPT/src/java/awt/Robot.javaPKK>:)%POSGI-OPT/src/java/awt/ScrollPane.javaPKK>i/TOSGI-OPT/src/java/awt/ScrollPaneAdjustable.javaPKK>m3X $FWOSGI-OPT/src/java/awt/Scrollbar.javaPKK>?{) #[OSGI-OPT/src/java/awt/Shape.javaPKK>,Gm~']OSGI-OPT/src/java/awt/SplashScreen.javaPKK>!m`OSGI-OPT/src/java/awt/Stroke.javaPKK>Q|0&~bOSGI-OPT/src/java/awt/SystemColor.javaPKK>TZ%fOSGI-OPT/src/java/awt/SystemTray.javaPKK>& \ #iOSGI-OPT/src/java/awt/TextArea.javaPKK>.* (5mOSGI-OPT/src/java/awt/TextComponent.javaPKK>b($ qOSGI-OPT/src/java/awt/TextField.javaPKK>² 4Q'=tOSGI-OPT/src/java/awt/TexturePaint.javaPKK>z Q"vOSGI-OPT/src/java/awt/Toolkit.javaPKK>YA;'~OSGI-OPT/src/java/awt/Transparency.javaPKK>K^% #OSGI-OPT/src/java/awt/TrayIcon.javaPKK>Uwg:!OSGI-OPT/src/java/awt/Window.javaPKIG@OSGI-OPT/src/java/awt/color/PKK>ʙXh- OSGI-OPT/src/java/awt/color/CMMException.javaPKK>N +8OSGI-OPT/src/java/awt/color/ColorSpace.javaPKK>; :>/ߎOSGI-OPT/src/java/awt/color/ICC_ColorSpace.javaPKK>( PV ,SOSGI-OPT/src/java/awt/color/ICC_Profile.javaPKK>:'n/OSGI-OPT/src/java/awt/color/ICC_ProfileRGB.javaPKK>US5ROSGI-OPT/src/java/awt/color/ProfileDataException.javaPKIG@#OSGI-OPT/src/java/awt/datatransfer/PKK>1OSGI-OPT/src/java/awt/datatransfer/Clipboard.javaPKK>T!6OSGI-OPT/src/java/awt/datatransfer/ClipboardOwner.javaPKK>hFI2'OSGI-OPT/src/java/awt/datatransfer/DataFlavor.javaPKK>ŭK043OSGI-OPT/src/java/awt/datatransfer/FlavorEvent.javaPKK>z^^6dOSGI-OPT/src/java/awt/datatransfer/FlavorListener.javaPKK>1OSGI-OPT/src/java/awt/datatransfer/FlavorMap.javaPKK>5G3OSGI-OPT/src/java/awt/datatransfer/FlavorTable.javaPKK> >>eOSGI-OPT/src/java/awt/datatransfer/MimeTypeParseException.javaPKK>y38h7OSGI-OPT/src/java/awt/datatransfer/StringSelection.javaPKK>U~ 7}OSGI-OPT/src/java/awt/datatransfer/SystemFlavorMap.javaPKK>P4OSGI-OPT/src/java/awt/datatransfer/Transferable.javaPKK>i0BiOSGI-OPT/src/java/awt/datatransfer/UnsupportedFlavorException.javaPKIG@OSGI-OPT/src/java/awt/dnd/PKK>V)OSGI-OPT/src/java/awt/dnd/Autoscroll.javaPKK>b8=+*OSGI-OPT/src/java/awt/dnd/DnDConstants.javaPKK> |nfl/OSGI-OPT/src/java/awt/dnd/DragGestureEvent.javaPKK>J_2OSGI-OPT/src/java/awt/dnd/DragGestureListener.javaPKK>646OSGI-OPT/src/java/awt/dnd/DragGestureRecognizer.javaPKK>⊪%0OSGI-OPT/src/java/awt/dnd/DragSourceAdapter.javaPKK>ŐX>R- 0/OSGI-OPT/src/java/awt/dnd/DragSourceContext.javaPKK>2}652OSGI-OPT/src/java/awt/dnd/DragSourceDragEvent.javaPKK>?Xx+2tOSGI-OPT/src/java/awt/dnd/DragSourceDropEvent.javaPKK>#1#p.OSGI-OPT/src/java/awt/dnd/DragSourceEvent.javaPKK>,*1~OSGI-OPT/src/java/awt/dnd/DragSourceListener.javaPKK> 7OSGI-OPT/src/java/awt/dnd/DragSourceMotionListener.javaPKK>)$ )'OSGI-OPT/src/java/awt/dnd/DropTarget.javaPKK>##I0OSGI-OPT/src/java/awt/dnd/DropTargetAdapter.javaPKK>E1s 0}OSGI-OPT/src/java/awt/dnd/DropTargetContext.javaPKK>o 2NOSGI-OPT/src/java/awt/dnd/DropTargetDragEvent.javaPKK> {t2EOSGI-OPT/src/java/awt/dnd/DropTargetDropEvent.javaPKK>h .\OSGI-OPT/src/java/awt/dnd/DropTargetEvent.javaPKK>Dz1OSGI-OPT/src/java/awt/dnd/DropTargetListener.javaPKK>wS;OSGI-OPT/src/java/awt/dnd/InvalidDnDOperationException.javaPKK>0C[9lOSGI-OPT/src/java/awt/dnd/MouseDragGestureRecognizer.javaPKIG@eOSGI-OPT/src/java/awt/dnd/peer/PKK>Bس 9OSGI-OPT/src/java/awt/dnd/peer/DragSourceContextPeer.javaPKK>6t;?9'OSGI-OPT/src/java/awt/dnd/peer/DropTargetContextPeer.javaPKK>W}s"2OSGI-OPT/src/java/awt/dnd/peer/DropTargetPeer.javaPKIG@OSGI-OPT/src/java/awt/event/PKK>$1G OSGI-OPT/src/java/awt/event/AWTEventListener.javaPKK>) 6| OSGI-OPT/src/java/awt/event/AWTEventListenerProxy.javaPKK>f͈,OSGI-OPT/src/java/awt/event/ActionEvent.javaPKK>AL4/OSGI-OPT/src/java/awt/event/ActionListener.javaPKK>̨ 0OSGI-OPT/src/java/awt/event/AdjustmentEvent.javaPKK>O3OSGI-OPT/src/java/awt/event/AdjustmentListener.javaPKK>П]1TOSGI-OPT/src/java/awt/event/ComponentAdapter.javaPKK>%IdG/OSGI-OPT/src/java/awt/event/ComponentEvent.javaPKK>;2VOSGI-OPT/src/java/awt/event/ComponentListener.javaPKK>pX1OSGI-OPT/src/java/awt/event/ContainerAdapter.javaPKK>nsH/!OSGI-OPT/src/java/awt/event/ContainerEvent.javaPKK>FO2$OSGI-OPT/src/java/awt/event/ContainerListener.javaPKK>74u-&OSGI-OPT/src/java/awt/event/FocusAdapter.javaPKK>?UR+))OSGI-OPT/src/java/awt/event/FocusEvent.javaPKK>Xk9.+OSGI-OPT/src/java/awt/event/FocusListener.javaPKK>DS8r0OSGI-OPT/src/java/awt/event/HierarchyBoundsListener.javaPKK>Itg/2OSGI-OPT/src/java/awt/event/HierarchyEvent.javaPKK>c25OSGI-OPT/src/java/awt/event/HierarchyListener.javaPKK>Zx+D+ 8OSGI-OPT/src/java/awt/event/InputEvent.javaPKK>Fp1|;OSGI-OPT/src/java/awt/event/InputMethodEvent.javaPKK>??ta4>OSGI-OPT/src/java/awt/event/InputMethodListener.javaPKK>HZ0 AOSGI-OPT/src/java/awt/event/InvocationEvent.javaPKK>R>a*(DOSGI-OPT/src/java/awt/event/ItemEvent.javaPKK>4M -FOSGI-OPT/src/java/awt/event/ItemListener.javaPKK>+IOSGI-OPT/src/java/awt/event/KeyAdapter.javaPKK>`')^KOSGI-OPT/src/java/awt/event/KeyEvent.javaPKK>wb,gTOSGI-OPT/src/java/awt/event/KeyListener.javaPKK>n!:-VOSGI-OPT/src/java/awt/event/MouseAdapter.javaPKK> %+!YOSGI-OPT/src/java/awt/event/MouseEvent.javaPKK>S3.\OSGI-OPT/src/java/awt/event/MouseListener.javaPKK>D|3^OSGI-OPT/src/java/awt/event/MouseMotionAdapter.javaPKK>F]/A4>aOSGI-OPT/src/java/awt/event/MouseMotionListener.javaPKK>^LJ0cOSGI-OPT/src/java/awt/event/MouseWheelEvent.javaPKK>"\>3hfOSGI-OPT/src/java/awt/event/MouseWheelListener.javaPKK>XDf+hOSGI-OPT/src/java/awt/event/PaintEvent.javaPKK>&Il*AkOSGI-OPT/src/java/awt/event/TextEvent.javaPKK>b> -mOSGI-OPT/src/java/awt/event/TextListener.javaPKK>eg2.oOSGI-OPT/src/java/awt/event/WindowAdapter.javaPKK>yEޥ,orOSGI-OPT/src/java/awt/event/WindowEvent.javaPKK>Ȓ|M4uOSGI-OPT/src/java/awt/event/WindowFocusListener.javaPKK>)Z/wOSGI-OPT/src/java/awt/event/WindowListener.javaPKK>(4"zOSGI-OPT/src/java/awt/event/WindowStateListener.javaPKIG@a|OSGI-OPT/src/java/awt/font/PKK>_e1|OSGI-OPT/src/java/awt/font/FontRenderContext.javaPKK>x$6pOSGI-OPT/src/java/awt/font/GlyphJustificationInfo.javaPKK>;g,vOSGI-OPT/src/java/awt/font/GlyphMetrics.javaPKK>[:= +wOSGI-OPT/src/java/awt/font/GlyphVector.javaPKK>#E0OSGI-OPT/src/java/awt/font/GraphicAttribute.javaPKK>n?5OSGI-OPT/src/java/awt/font/ImageGraphicAttribute.javaPKK>q*3OSGI-OPT/src/java/awt/font/LayoutPath.javaPKK>8kAi1OSGI-OPT/src/java/awt/font/LineBreakMeasurer.javaPKK>Ǩ,+OOSGI-OPT/src/java/awt/font/LineMetrics.javaPKK>ԍ.ԖOSGI-OPT/src/java/awt/font/MultipleMaster.javaPKK> ^R-COSGI-OPT/src/java/awt/font/NumericShaper.javaPKK>X/T` (OSGI-OPT/src/java/awt/font/OpenType.javaPKK> MV5OSGI-OPT/src/java/awt/font/ShapeGraphicAttribute.javaPKK>4'qc-_OSGI-OPT/src/java/awt/font/TextAttribute.javaPKK>%>~q+WOSGI-OPT/src/java/awt/font/TextHitInfo.javaPKK>})*!OSGI-OPT/src/java/awt/font/TextLayout.javaPKK>R}Gk,3OSGI-OPT/src/java/awt/font/TextMeasurer.javaPKK>\ 2OSGI-OPT/src/java/awt/font/TransformAttribute.javaPKIG@xOSGI-OPT/src/java/awt/geom/PKK>"=ْ/öOSGI-OPT/src/java/awt/geom/AffineTransform.javaPKK>m<%OSGI-OPT/src/java/awt/geom/Arc2D.javaPKK>1q $AOSGI-OPT/src/java/awt/geom/Area.javaPKK>)K,wOSGI-OPT/src/java/awt/geom/CubicCurve2D.javaPKK>b"+OSGI-OPT/src/java/awt/geom/Dimension2D.javaPKK> )OSGI-OPT/src/java/awt/geom/Ellipse2D.javaPKK>g6I6OSGI-OPT/src/java/awt/geom/FlatteningPathIterator.javaPKK>E,p+OSGI-OPT/src/java/awt/geom/GeneralPath.javaPKK>xqEF9OSGI-OPT/src/java/awt/geom/IllegalPathStateException.javaPKK>A.0E&OSGI-OPT/src/java/awt/geom/Line2D.javaPKK>[F3"?[OSGI-OPT/src/java/awt/geom/NoninvertibleTransformException.javaPKK>) iR&OSGI-OPT/src/java/awt/geom/Path2D.javaPKK>[WBCW,HOSGI-OPT/src/java/awt/geom/PathIterator.javaPKK>sNW'OSGI-OPT/src/java/awt/geom/Point2D.javaPKK>es3+OSGI-OPT/src/java/awt/geom/QuadCurve2D.javaPKK>k9T+|OSGI-OPT/src/java/awt/geom/Rectangle2D.javaPKK>нyl 0OSGI-OPT/src/java/awt/geom/RectangularShape.javaPKK>HՅH 0OSGI-OPT/src/java/awt/geom/RoundRectangle2D.javaPKIG@OSGI-OPT/src/java/awt/im/PKK>]qˍZ*OSGI-OPT/src/java/awt/im/InputContext.javaPKK>R2OSGI-OPT/src/java/awt/im/InputMethodHighlight.javaPKK>IL1OSGI-OPT/src/java/awt/im/InputMethodRequests.javaPKK>5j)iOSGI-OPT/src/java/awt/im/InputSubset.javaPKIG@UOSGI-OPT/src/java/awt/im/spi/PKK>M6-OSGI-OPT/src/java/awt/im/spi/InputMethod.javaPKK>T\z4OSGI-OPT/src/java/awt/im/spi/InputMethodContext.javaPKK>Sԝ6 7?OSGI-OPT/src/java/awt/im/spi/InputMethodDescriptor.javaPKIG@ OSGI-OPT/src/java/awt/image/PKK>ϲ?N2& OSGI-OPT/src/java/awt/image/AffineTransformOp.javaPKK>009m OSGI-OPT/src/java/awt/image/AreaAveragingScaleFilter.javaPKK>%(ab.OSGI-OPT/src/java/awt/image/BandCombineOp.javaPKK>v52rOSGI-OPT/src/java/awt/image/BandedSampleModel.javaPKK>'q/OSGI-OPT/src/java/awt/image/BufferStrategy.javaPKK>9xl.IOSGI-OPT/src/java/awt/image/BufferedImage.javaPKK>`43OSGI-OPT/src/java/awt/image/BufferedImageFilter.javaPKK>%s0OSGI-OPT/src/java/awt/image/BufferedImageOp.javaPKK>Te 0 !OSGI-OPT/src/java/awt/image/ByteLookupTable.javaPKK>*H/#OSGI-OPT/src/java/awt/image/ColorConvertOp.javaPKK>4J +&OSGI-OPT/src/java/awt/image/ColorModel.javaPKK>XnG4*OSGI-OPT/src/java/awt/image/ComponentColorModel.javaPKK>8k 5m-OSGI-OPT/src/java/awt/image/ComponentSampleModel.javaPKK>+0OSGI-OPT/src/java/awt/image/ConvolveOp.javaPKK>dF03OSGI-OPT/src/java/awt/image/CropImageFilter.javaPKK>D+^=/u9OSGI-OPT/src/java/awt/image/DataBufferByte.javaPKK>'^?1<OSGI-OPT/src/java/awt/image/DataBufferDouble.javaPKK><<>0>OSGI-OPT/src/java/awt/image/DataBufferFloat.javaPKK>Oȓ8.IAOSGI-OPT/src/java/awt/image/DataBufferInt.javaPKK>C>0COSGI-OPT/src/java/awt/image/DataBufferShort.javaPKK>?1yFOSGI-OPT/src/java/awt/image/DataBufferUShort.javaPKK>>'1IOSGI-OPT/src/java/awt/image/DirectColorModel.javaPKK>7C147LOSGI-OPT/src/java/awt/image/FilteredImageSource.javaPKK>֧.NOSGI-OPT/src/java/awt/image/ImageConsumer.javaPKK>7#,QOSGI-OPT/src/java/awt/image/ImageFilter.javaPKK>T 4F.TOSGI-OPT/src/java/awt/image/ImageObserver.javaPKK>_X.aWOSGI-OPT/src/java/awt/image/ImageProducer.javaPKK>z3YOSGI-OPT/src/java/awt/image/ImagingOpException.javaPKK>}N 0[OSGI-OPT/src/java/awt/image/IndexColorModel.javaPKK>g@&%'O_OSGI-OPT/src/java/awt/image/Kernel.javaPKK>P#)aOSGI-OPT/src/java/awt/image/LookupOp.javaPKK>w,dOSGI-OPT/src/java/awt/image/LookupTable.javaPKK>;2gOSGI-OPT/src/java/awt/image/MemoryImageSource.javaPKK>G޹<:jOSGI-OPT/src/java/awt/image/MultiPixelPackedSampleModel.javaPKK>=IDyR1]mOSGI-OPT/src/java/awt/image/PackedColorModel.javaPKK>Y漎?-pOSGI-OPT/src/java/awt/image/PixelGrabber.javaPKK> <[sOSGI-OPT/src/java/awt/image/PixelInterleavedSampleModel.javaPKK>Tpc/_/uOSGI-OPT/src/java/awt/image/RGBImageFilter.javaPKK>$3/'xOSGI-OPT/src/java/awt/image/Raster.javaPKK> P6 }OSGI-OPT/src/java/awt/image/RasterFormatException.javaPKK>>$;)FOSGI-OPT/src/java/awt/image/RasterOp.javaPKK>:}.OSGI-OPT/src/java/awt/image/RenderedImage.javaPKK>u5OSGI-OPT/src/java/awt/image/ReplicateScaleFilter.javaPKK>0˿* OSGI-OPT/src/java/awt/image/RescaleOp.javaPKK>⠬W,"OSGI-OPT/src/java/awt/image/SampleModel.javaPKK>/۪!1!OSGI-OPT/src/java/awt/image/ShortLookupTable.javaPKK>k2=OSGI-OPT/src/java/awt/image/SinglePixelPackedSampleModel.javaPKK>%Kj~-OSGI-OPT/src/java/awt/image/TileObserver.javaPKK>D.OSGI-OPT/src/java/awt/image/VolatileImage.javaPKK>k / OSGI-OPT/src/java/awt/image/WritableRaster.javaPKK>&;2i6pOSGI-OPT/src/java/awt/image/WritableRenderedImage.javaPKIG@'OSGI-OPT/src/java/awt/image/renderable/PKK>MvcWJ]OSGI-OPT/src/java/awt/image/renderable/ContextualRenderedImageFactory.javaPKK> xx:8OSGI-OPT/src/java/awt/image/renderable/ParameterBlock.javaPKK>+8ۊu9OSGI-OPT/src/java/awt/image/renderable/RenderContext.javaPKK>/K; OSGI-OPT/src/java/awt/image/renderable/RenderableImage.javaPKK>AU_=OSGI-OPT/src/java/awt/image/renderable/RenderableImageOp.javaPKK>BAzTUCOSGI-OPT/src/java/awt/image/renderable/RenderableImageProducer.javaPKK>):@OSGI-OPT/src/java/awt/image/renderable/RenderedImageFactory.javaPKIG@6OSGI-OPT/src/java/awt/peer/PKK>#*OSGI-OPT/src/java/awt/peer/ButtonPeer.javaPKK>4Iಽ*OSGI-OPT/src/java/awt/peer/CanvasPeer.javaPKK>44ĸOSGI-OPT/src/java/awt/peer/CheckboxMenuItemPeer.javaPKK>Q,OSGI-OPT/src/java/awt/peer/CheckboxPeer.javaPKK>rʖlt*EOSGI-OPT/src/java/awt/peer/ChoicePeer.javaPKK>){-OSGI-OPT/src/java/awt/peer/ContainerPeer.javaPKK>Gzs  +OSGI-OPT/src/java/awt/peer/DesktopPeer.javaPKK>0}*VOSGI-OPT/src/java/awt/peer/DialogPeer.javaPKK>in:].OSGI-OPT/src/java/awt/peer/FileDialogPeer.javaPKK>rm1(OSGI-OPT/src/java/awt/peer/FontPeer.javaPKK>cK/ )OSGI-OPT/src/java/awt/peer/FramePeer.javaPKK>L,e8aOSGI-OPT/src/java/awt/peer/KeyboardFocusManagerPeer.javaPKK>gF%)OSGI-OPT/src/java/awt/peer/LabelPeer.javaPKK> c/OSGI-OPT/src/java/awt/peer/LightweightPeer.javaPKK>5TT^(OSGI-OPT/src/java/awt/peer/ListPeer.javaPKK>>=+OSGI-OPT/src/java/awt/peer/MenuBarPeer.javaPKK>?$*1OSGI-OPT/src/java/awt/peer/MenuComponentPeer.javaPKK>&C,=OSGI-OPT/src/java/awt/peer/MenuItemPeer.javaPKK>ٷr5((OSGI-OPT/src/java/awt/peer/MenuPeer.javaPKK>21 -OSGI-OPT/src/java/awt/peer/MouseInfoPeer.javaPKK>g!)OSGI-OPT/src/java/awt/peer/PanelPeer.javaPKK>V- OSGI-OPT/src/java/awt/peer/PopupMenuPeer.javaPKK>8%T)3OSGI-OPT/src/java/awt/peer/RobotPeer.javaPKK>.OSGI-OPT/src/java/awt/peer/ScrollPanePeer.javaPKK>:HU-OSGI-OPT/src/java/awt/peer/ScrollbarPeer.javaPKK>I*.\OSGI-OPT/src/java/awt/peer/SystemTrayPeer.javaPKK>ъT#,OSGI-OPT/src/java/awt/peer/TextAreaPeer.javaPKK>4E]1OSGI-OPT/src/java/awt/peer/TextComponentPeer.javaPKK>'W-OSGI-OPT/src/java/awt/peer/TextFieldPeer.javaPKK>1S,OSGI-OPT/src/java/awt/peer/TrayIconPeer.javaPKK>_ad*tOSGI-OPT/src/java/awt/peer/WindowPeer.javaPKIG@-OSGI-OPT/src/java/awt/print/PKK>h).%yOSGI-OPT/src/java/awt/print/Book.javaPKK>k@|+OSGI-OPT/src/java/awt/print/PageFormat.javaPKK>߽"f)OSGI-OPT/src/java/awt/print/Pageable.javaPKK>b*',&) OSGI-OPT/src/java/awt/print/Paper.javaPKK> {* OSGI-OPT/src/java/awt/print/Printable.javaPKK>@6 OSGI-OPT/src/java/awt/print/PrinterAbortException.javaPKK>.ӌ%1LOSGI-OPT/src/java/awt/print/PrinterException.javaPKK>0OSGI-OPT/src/java/awt/print/PrinterGraphics.javaPKK>CfV3OSGI-OPT/src/java/awt/print/PrinterIOException.javaPKK>1 +OSGI-OPT/src/java/awt/print/PrinterJob.javaPKIG@YOSGI-OPT/src/java/beans/PKK>/R2.OSGI-OPT/src/java/beans/AppletInitializer.javaPKK>+OSGI-OPT/src/java/beans/BeanDescriptor.javaPKK>5bPX%7OSGI-OPT/src/java/beans/BeanInfo.javaPKK>vƢ"!OSGI-OPT/src/java/beans/Beans.javaPKK>ab2$OSGI-OPT/src/java/beans/ConstructorProperties.javaPKK>Kk'''OSGI-OPT/src/java/beans/Customizer.javaPKK> "7c)OSGI-OPT/src/java/beans/DefaultPersistenceDelegate.javaPKK>{3H-'+OSGI-OPT/src/java/beans/DesignMode.javaPKK>04BO^$.OSGI-OPT/src/java/beans/Encoder.javaPKK> kVr /3OSGI-OPT/src/java/beans/EventSetDescriptor.javaPKK>Ͱ.6OSGI-OPT/src/java/beans/ExceptionListener.javaPKK>7'8OSGI-OPT/src/java/beans/Expression.javaPKK>Se.P;OSGI-OPT/src/java/beans/FeatureDescriptor.javaPKK>M*7>OSGI-OPT/src/java/beans/IndexedPropertyChangeEvent.javaPKK>jv6@OSGI-OPT/src/java/beans/IndexedPropertyDescriptor.javaPKK>mh 3hCOSGI-OPT/src/java/beans/IntrospectionException.javaPKK>')EOSGI-OPT/src/java/beans/Introspector.javaPKK>JT< -HOSGI-OPT/src/java/beans/MethodDescriptor.javaPKK> 0KOSGI-OPT/src/java/beans/ParameterDescriptor.javaPKK>$Do08MOSGI-OPT/src/java/beans/PersistenceDelegate.javaPKK>J40OOSGI-OPT/src/java/beans/PropertyChangeEvent.javaPKK>;3lROSGI-OPT/src/java/beans/PropertyChangeListener.javaPKK>IS #8TOSGI-OPT/src/java/beans/PropertyChangeListenerProxy.javaPKK>Bj82.WOSGI-OPT/src/java/beans/PropertyChangeSupport.javaPKK>/ZOSGI-OPT/src/java/beans/PropertyDescriptor.javaPKK>`f+]OSGI-OPT/src/java/beans/PropertyEditor.javaPKK>Zl4 2_OSGI-OPT/src/java/beans/PropertyEditorManager.javaPKK>$2[bOSGI-OPT/src/java/beans/PropertyEditorSupport.javaPKK>$dw2meOSGI-OPT/src/java/beans/PropertyVetoException.javaPKK>]rdWS+gOSGI-OPT/src/java/beans/SimpleBeanInfo.javaPKK>oҩ&tjOSGI-OPT/src/java/beans/Statement.javaPKK>7A=3lOSGI-OPT/src/java/beans/VetoableChangeListener.javaPKK>'k:F81oOSGI-OPT/src/java/beans/VetoableChangeListenerProxy.javaPKK>2qOSGI-OPT/src/java/beans/VetoableChangeSupport.javaPKK>Љ6'tOSGI-OPT/src/java/beans/Visibility.javaPKK>(Jm:e'vOSGI-OPT/src/java/beans/XMLDecoder.javaPKK>/  'oyOSGI-OPT/src/java/beans/XMLEncoder.javaPKIG@${OSGI-OPT/src/java/beans/beancontext/PKK>ӆ4$|OSGI-OPT/src/java/beans/beancontext/BeanContext.javaPKK>z&9OSGI-OPT/src/java/beans/beancontext/BeanContextChild.javaPKK>~GOSGI-OPT/src/java/beans/beancontext/BeanContextChildComponentProxy.javaPKK>N-L @OSGI-OPT/src/java/beans/beancontext/BeanContextChildSupport.javaPKK>(_BOSGI-OPT/src/java/beans/beancontext/BeanContextContainerProxy.javaPKK>:9OSGI-OPT/src/java/beans/beancontext/BeanContextEvent.javaPKK>PY,C`OSGI-OPT/src/java/beans/beancontext/BeanContextMembershipEvent.javaPKK>fF*OSGI-OPT/src/java/beans/beancontext/BeanContextMembershipListener.javaPKK>9OSGI-OPT/src/java/beans/beancontext/BeanContextProxy.javaPKK> AIOSGI-OPT/src/java/beans/beancontext/BeanContextServiceAvailableEvent.javaPKK>l 7ICxOSGI-OPT/src/java/beans/beancontext/BeanContextServiceProvider.javaPKK>DKOSGI-OPT/src/java/beans/beancontext/BeanContextServiceProviderBeanInfo.javaPKK>JabLGSOSGI-OPT/src/java/beans/beancontext/BeanContextServiceRevokedEvent.javaPKK>C;hCJOSGI-OPT/src/java/beans/beancontext/BeanContextServiceRevokedListener.javaPKK>겎<qOSGI-OPT/src/java/beans/beancontext/BeanContextServices.javaPKK>w 3 RCĥOSGI-OPT/src/java/beans/beancontext/BeanContextServicesSupport.javaPKK>"6;OSGI-OPT/src/java/beans/beancontext/BeanContextSupport.javaPKIG@OSGI-OPT/src/java/io/PKK>cI -OSGI-OPT/src/java/io/BufferedInputStream.javaPKK>r ].cOSGI-OPT/src/java/io/BufferedOutputStream.javaPKK>vPt (OSGI-OPT/src/java/io/BufferedReader.javaPKK>ٹs(1OSGI-OPT/src/java/io/BufferedWriter.javaPKK>֑H0a.OSGI-OPT/src/java/io/ByteArrayInputStream.javaPKK>4ow</OSGI-OPT/src/java/io/ByteArrayOutputStream.javaPKK>: )OSGI-OPT/src/java/io/CharArrayReader.javaPKK>"Mfo)eOSGI-OPT/src/java/io/CharArrayWriter.javaPKK>#xw31+OSGI-OPT/src/java/io/CharConversionException.javaPKK>݉#aOSGI-OPT/src/java/io/Closeable.javaPKK>%Aq!tOSGI-OPT/src/java/io/Console.javaPKK>LZS#4OSGI-OPT/src/java/io/DataInput.javaPKK>׶e )OSGI-OPT/src/java/io/DataInputStream.javaPKK>ѳ/$OSGI-OPT/src/java/io/DataOutput.javaPKK>np*OSGI-OPT/src/java/io/DataOutputStream.javaPKK>g&eOSGI-OPT/src/java/io/EOFException.javaPKK>bnk(OSGI-OPT/src/java/io/Externalizable.javaPKK>JOSGI-OPT/src/java/io/File.javaPKK>X  (.OSGI-OPT/src/java/io/FileDescriptor.javaPKK>Y$OSGI-OPT/src/java/io/FileFilter.javaPKK>E@)OSGI-OPT/src/java/io/FileInputStream.javaPKK>Zi-/COSGI-OPT/src/java/io/FileNotFoundException.javaPKK>&W*uOSGI-OPT/src/java/io/FileOutputStream.javaPKK>*R:B($OSGI-OPT/src/java/io/FilePermission.javaPKK>BQ*Q$OSGI-OPT/src/java/io/FileReader.javaPKK>&$OSGI-OPT/src/java/io/FileWriter.javaPKK>i(OSGI-OPT/src/java/io/FilenameFilter.javaPKK>[e+OSGI-OPT/src/java/io/FilterInputStream.javaPKK>$4h,OSGI-OPT/src/java/io/FilterOutputStream.javaPKK>d&LOSGI-OPT/src/java/io/FilterReader.javaPKK>r&OSGI-OPT/src/java/io/FilterWriter.javaPKK>7J#OSGI-OPT/src/java/io/Flushable.javaPKK>/!&OSGI-OPT/src/java/io/IOError.javaPKK>k&%;OSGI-OPT/src/java/io/IOException.javaPKK>R%nOSGI-OPT/src/java/io/InputStream.javaPKK>aXF+OSGI-OPT/src/java/io/InputStreamReader.javaPKK>N0 OSGI-OPT/src/java/io/InterruptedIOException.javaPKK>/ OSGI-OPT/src/java/io/InvalidClassException.javaPKK>s0<OSGI-OPT/src/java/io/InvalidObjectException.javaPKK> A//pOSGI-OPT/src/java/io/LineNumberInputStream.javaPKK>n%*OSGI-OPT/src/java/io/LineNumberReader.javaPKK>h.,8OSGI-OPT/src/java/io/NotActiveException.javaPKK> @2lOSGI-OPT/src/java/io/NotSerializableException.javaPKK>0 N%OSGI-OPT/src/java/io/ObjectInput.javaPKK>pZ+OSGI-OPT/src/java/io/ObjectInputStream.javaPKK>ka&#OSGI-OPT/src/java/io/ObjectOutput.javaPKK>z,<&OSGI-OPT/src/java/io/ObjectOutputStream.javaPKK>GJ+H*OSGI-OPT/src/java/io/ObjectStreamClass.javaPKK>`Ŵ"7/(-OSGI-OPT/src/java/io/ObjectStreamConstants.javaPKK> </0OSGI-OPT/src/java/io/ObjectStreamException.javaPKK>qD+2OSGI-OPT/src/java/io/ObjectStreamField.javaPKK>eM x/5OSGI-OPT/src/java/io/OptionalDataException.javaPKK>p_:&8OSGI-OPT/src/java/io/OutputStream.javaPKK>6H-,:OSGI-OPT/src/java/io/OutputStreamWriter.javaPKK>\P *'=OSGI-OPT/src/java/io/PipedInputStream.javaPKK>:U)Q+?OSGI-OPT/src/java/io/PipedOutputStream.javaPKK>"%BOSGI-OPT/src/java/io/PipedReader.javaPKK>gj1%DOSGI-OPT/src/java/io/PipedWriter.javaPKK>bZB %FOSGI-OPT/src/java/io/PrintStream.javaPKK> >UD %JOSGI-OPT/src/java/io/PrintWriter.javaPKK> ,-/NOSGI-OPT/src/java/io/PushbackInputStream.javaPKK>C(POSGI-OPT/src/java/io/PushbackReader.javaPKK>*SOSGI-OPT/src/java/io/RandomAccessFile.javaPKK>8v WOSGI-OPT/src/java/io/Reader.javaPKK>Y-YOSGI-OPT/src/java/io/SequenceInputStream.javaPKK>jdN&&\OSGI-OPT/src/java/io/Serializable.javaPKK>^0&^OSGI-OPT/src/java/io/SerializablePermission.javaPKK>IR@2y`OSGI-OPT/src/java/io/StreamCorruptedException.javaPKK> \)bOSGI-OPT/src/java/io/StreamTokenizer.javaPKK>c@O1eOSGI-OPT/src/java/io/StringBufferInputStream.javaPKK>GG/e&hOSGI-OPT/src/java/io/StringReader.javaPKK>wj#HJ&jOSGI-OPT/src/java/io/StringWriter.javaPKK> -umOSGI-OPT/src/java/io/SyncFailedException.javaPKK>o00oOSGI-OPT/src/java/io/UTFDataFormatException.javaPKK>[RB6qOSGI-OPT/src/java/io/UnsupportedEncodingException.javaPKK>;n#P/tOSGI-OPT/src/java/io/WriteAbortedException.javaPKK>;8c  \vOSGI-OPT/src/java/io/Writer.javaPKIG@ yOSGI-OPT/src/java/lang/PKK>qaH"</TyOSGI-OPT/src/java/lang/AbstractMethodError.javaPKK>1{OSGI-OPT/src/java/lang/AbstractStringBuilder.javaPKK>gx&OSGI-OPT/src/java/lang/Appendable.javaPKK>eg0/܁OSGI-OPT/src/java/lang/ArithmeticException.javaPKK>:OSGI-OPT/src/java/lang/ArrayIndexOutOfBoundsException.javaPKK>vzZ0/VOSGI-OPT/src/java/lang/ArrayStoreException.javaPKK>Od*OSGI-OPT/src/java/lang/AssertionError.javaPKK>o #ъOSGI-OPT/src/java/lang/Boolean.javaPKK>q Wn OSGI-OPT/src/java/lang/Byte.javaPKK>ؓ-(OSGI-OPT/src/java/lang/CharSequence.javaPKK>e ]%OSGI-OPT/src/java/lang/Character.javaPKK>}!OSGI-OPT/src/java/lang/Class.javaPKK>bXW-.OSGI-OPT/src/java/lang/ClassCastException.javaPKK>[;21.OSGI-OPT/src/java/lang/ClassCircularityError.javaPKK>'6#,bOSGI-OPT/src/java/lang/ClassFormatError.javaPKK>..Qu?'OSGI-OPT/src/java/lang/ClassLoader.javaPKK>:2OSGI-OPT/src/java/lang/ClassNotFoundException.javaPKK> M>6 OSGI-OPT/src/java/lang/CloneNotSupportedException.javaPKK>+%DOSGI-OPT/src/java/lang/Cloneable.javaPKK>&AOSGI-OPT/src/java/lang/Comparable.javaPKK>8H$TOSGI-OPT/src/java/lang/Compiler.javaPKK>. #&޻OSGI-OPT/src/java/lang/Deprecated.javaPKK>mi " OSGI-OPT/src/java/lang/Double.javaPKK>?X OSGI-OPT/src/java/lang/Enum.javaPKK>Ajb ;OSGI-OPT/src/java/lang/EnumConstantNotPresentException.javaPKK>Up!*OSGI-OPT/src/java/lang/Error.javaPKK> ca%QOSGI-OPT/src/java/lang/Exception.javaPKK>P)]V !OSGI-OPT/src/java/lang/Float.javaPKK>Z"39.OSGI-OPT/src/java/lang/IllegalAccessError.javaPKK> 22OSGI-OPT/src/java/lang/IllegalAccessException.javaPKK>34OSGI-OPT/src/java/lang/IllegalArgumentException.javaPKK>rڭ<K8>OSGI-OPT/src/java/lang/IllegalMonitorStateException.javaPKK>OH1OSGI-OPT/src/java/lang/IllegalStateException.javaPKK>WP7OSGI-OPT/src/java/lang/IllegalThreadStateException.javaPKK>NTKG8OSGI-OPT/src/java/lang/IncompatibleClassChangeError.javaPKK>7IB5MOSGI-OPT/src/java/lang/IndexOutOfBoundsException.javaPKK>02OSGI-OPT/src/java/lang/InheritableThreadLocal.javaPKK>6a@9.OSGI-OPT/src/java/lang/InstantiationError.javaPKK>22 OSGI-OPT/src/java/lang/InstantiationException.javaPKK>~: #<OSGI-OPT/src/java/lang/Integer.javaPKK>B}!)OSGI-OPT/src/java/lang/InternalError.javaPKK>,0OSGI-OPT/src/java/lang/InterruptedException.javaPKK> ap$"OSGI-OPT/src/java/lang/Iterable.javaPKK>Зb(3OSGI-OPT/src/java/lang/LinkageError.javaPKK>!R ROSGI-OPT/src/java/lang/Long.javaPKK>c23X& OSGI-OPT/src/java/lang/Math.javaPKK>E6OSGI-OPT/src/java/lang/NegativeArraySizeException.javaPKK>$}/0$OSGI-OPT/src/java/lang/NoClassDefFoundError.javaPKK>k1P3,VOSGI-OPT/src/java/lang/NoSuchFieldError.javaPKK>aj,0OSGI-OPT/src/java/lang/NoSuchFieldException.javaPKK>p˩6-OSGI-OPT/src/java/lang/NoSuchMethodError.javaPKK>bY/1OSGI-OPT/src/java/lang/NoSuchMethodException.javaPKK>&Y30* OSGI-OPT/src/java/lang/NullPointerException.javaPKK> 9"_ OSGI-OPT/src/java/lang/Number.javaPKK>Mܺ>1OSGI-OPT/src/java/lang/NumberFormatException.javaPKK>j SqX"OSGI-OPT/src/java/lang/Object.javaPKK>c*,OSGI-OPT/src/java/lang/OutOfMemoryError.javaPKK>.sJM$OSGI-OPT/src/java/lang/Override.javaPKK>y:#OSGI-OPT/src/java/lang/Package.javaPKK>nu#:OSGI-OPT/src/java/lang/Process.javaPKK>Bx`*OSGI-OPT/src/java/lang/ProcessBuilder.javaPKK>)$V!OSGI-OPT/src/java/lang/Readable.javaPKK>/$w#OSGI-OPT/src/java/lang/Runnable.javaPKK>ZmI #}%OSGI-OPT/src/java/lang/Runtime.javaPKK>h,)OSGI-OPT/src/java/lang/RuntimeException.javaPKK>~Mv-U+OSGI-OPT/src/java/lang/RuntimePermission.javaPKK>--OSGI-OPT/src/java/lang/SecurityException.javaPKK>~̉ +/OSGI-OPT/src/java/lang/SecurityManager.javaPKK>(hC!3OSGI-OPT/src/java/lang/Short.javaPKK>j0.6OSGI-OPT/src/java/lang/StackOverflowError.javaPKK> .L-/9OSGI-OPT/src/java/lang/StackTraceElement.javaPKK>7 PѨ2&;OSGI-OPT/src/java/lang/StrictMath.javaPKK>W4"?OSGI-OPT/src/java/lang/String.javaPKK>#= (DOSGI-OPT/src/java/lang/StringBuffer.javaPKK>~` )%HOSGI-OPT/src/java/lang/StringBuilder.javaPKK>lH;WKOSGI-OPT/src/java/lang/StringIndexOutOfBoundsException.javaPKK>Է/G,MOSGI-OPT/src/java/lang/SuppressWarnings.javaPKK>* "&POSGI-OPT/src/java/lang/System.javaPKK>>"TOSGI-OPT/src/java/lang/Thread.javaPKK>'XOSGI-OPT/src/java/lang/ThreadDeath.javaPKK> A'[OSGI-OPT/src/java/lang/ThreadGroup.javaPKK>ܠM'm^OSGI-OPT/src/java/lang/ThreadLocal.javaPKK>/X%`OSGI-OPT/src/java/lang/Throwable.javaPKK>5d3ZcOSGI-OPT/src/java/lang/TypeNotPresentException.javaPKK>'(eOSGI-OPT/src/java/lang/UnknownError.javaPKK>/0gOSGI-OPT/src/java/lang/UnsatisfiedLinkError.javaPKK>9˜ K8 jOSGI-OPT/src/java/lang/UnsupportedClassVersionError.javaPKK>_9NlOSGI-OPT/src/java/lang/UnsupportedOperationException.javaPKK>8 \'nOSGI-OPT/src/java/lang/VerifyError.javaPKK>./pOSGI-OPT/src/java/lang/VirtualMachineError.javaPKK>Sb rOSGI-OPT/src/java/lang/Void.javaPKIG@"MuOSGI-OPT/src/java/lang/annotation/PKK>']1uOSGI-OPT/src/java/lang/annotation/Annotation.javaPKK> C<wOSGI-OPT/src/java/lang/annotation/AnnotationFormatError.javaPKK> FDzOSGI-OPT/src/java/lang/annotation/AnnotationTypeMismatchException.javaPKK>,1|OSGI-OPT/src/java/lang/annotation/Documented.javaPKK>Yٝ@2OSGI-OPT/src/java/lang/annotation/ElementType.javaPKK>: DlOSGI-OPT/src/java/lang/annotation/IncompleteAnnotationException.javaPKK>goS0OSGI-OPT/src/java/lang/annotation/Inherited.javaPKK>0 R0GOSGI-OPT/src/java/lang/annotation/Retention.javaPKK>\p6OSGI-OPT/src/java/lang/annotation/RetentionPolicy.javaPKK>-ҊOSGI-OPT/src/java/lang/annotation/Target.javaPKIG@"2OSGI-OPT/src/java/lang/instrument/PKK> |6OSGI-OPT/src/java/lang/instrument/ClassDefinition.javaPKK>E{;OSGI-OPT/src/java/lang/instrument/ClassFileTransformer.javaPKK>(wLBbOSGI-OPT/src/java/lang/instrument/IllegalClassFormatException.javaPKK>6Uy6OSGI-OPT/src/java/lang/instrument/Instrumentation.javaPKK>bIAOSGI-OPT/src/java/lang/instrument/UnmodifiableClassException.javaPKIG@"0OSGI-OPT/src/java/lang/management/PKK>םS9OSGI-OPT/src/java/lang/management/ClassLoadingMXBean.javaPKK>2qI.8ܜOSGI-OPT/src/java/lang/management/CompilationMXBean.javaPKK>,m,=*OSGI-OPT/src/java/lang/management/GarbageCollectorMXBean.javaPKK>8m/yOSGI-OPT/src/java/lang/management/LockInfo.javaPKK>{ 8OSGI-OPT/src/java/lang/management/ManagementFactory.javaPKK>-N;OSGI-OPT/src/java/lang/management/ManagementPermission.javaPKK> 3KOSGI-OPT/src/java/lang/management/MemoryMXBean.javaPKK>:OSGI-OPT/src/java/lang/management/MemoryManagerMXBean.javaPKK>r7E=OSGI-OPT/src/java/lang/management/MemoryNotificationInfo.javaPKK>R~7OSGI-OPT/src/java/lang/management/MemoryPoolMXBean.javaPKK>S*1OSGI-OPT/src/java/lang/management/MemoryType.javaPKK>d 2OSGI-OPT/src/java/lang/management/MemoryUsage.javaPKK>8FU2;OSGI-OPT/src/java/lang/management/MonitorInfo.javaPKK>y=\<OSGI-OPT/src/java/lang/management/OperatingSystemMXBean.javaPKK>_oP 4BOSGI-OPT/src/java/lang/management/RuntimeMXBean.javaPKK>1OSGI-OPT/src/java/lang/management/ThreadInfo.javaPKK>g2{3(OSGI-OPT/src/java/lang/management/ThreadMXBean.javaPKIG@FOSGI-OPT/src/java/lang/ref/PKK>-0OSGI-OPT/src/java/lang/ref/PhantomReference.javaPKK>މ)OSGI-OPT/src/java/lang/ref/Reference.javaPKK>¬.>OSGI-OPT/src/java/lang/ref/ReferenceQueue.javaPKK> 2SJ-OSGI-OPT/src/java/lang/ref/SoftReference.javaPKK>բqJ-OSGI-OPT/src/java/lang/ref/WeakReference.javaPKIG@OSGI-OPT/src/java/lang/reflect/PKK>_l dJ4`OSGI-OPT/src/java/lang/reflect/AccessibleObject.javaPKK>GdZ 4&OSGI-OPT/src/java/lang/reflect/AnnotatedElement.javaPKK>C  )OSGI-OPT/src/java/lang/reflect/Array.javaPKK>q/OSGI-OPT/src/java/lang/reflect/Constructor.javaPKK>ӌPfA )>OSGI-OPT/src/java/lang/reflect/Field.javaPKK>(l. 4OSGI-OPT/src/java/lang/reflect/GenericArrayType.javaPKK>6/OSGI-OPT/src/java/lang/reflect/GenericDeclaration.javaPKK>o/gz?jOSGI-OPT/src/java/lang/reflect/GenericSignatureFormatError.javaPKK>z@5OSGI-OPT/src/java/lang/reflect/InvocationHandler.javaPKK>P"g=OSGI-OPT/src/java/lang/reflect/InvocationTargetException.javaPKK>T\ G\OSGI-OPT/src/java/lang/reflect/MalformedParameterizedTypeException.javaPKK>x p*OSGI-OPT/src/java/lang/reflect/Member.javaPKK>Y"G*OSGI-OPT/src/java/lang/reflect/Method.javaPKK>HiQ,OSGI-OPT/src/java/lang/reflect/Modifier.javaPKK>ʙ}]5OSGI-OPT/src/java/lang/reflect/ParameterizedType.javaPKK> U)OSGI-OPT/src/java/lang/reflect/Proxy.javaPKK>H5OSGI-OPT/src/java/lang/reflect/ReflectPermission.javaPKK>gd(OSGI-OPT/src/java/lang/reflect/Type.javaPKK>}Sf0OSGI-OPT/src/java/lang/reflect/TypeVariable.javaPKK>N8B@GOSGI-OPT/src/java/lang/reflect/UndeclaredThrowableException.javaPKK>H.0OSGI-OPT/src/java/lang/reflect/WildcardType.javaPKIG@ OSGI-OPT/src/java/math/PKK>ϾeA&0 OSGI-OPT/src/java/math/BigDecimal.javaPKK>h"&OSGI-OPT/src/java/math/BigInteger.javaPKK>BR'$OSGI-OPT/src/java/math/MathContext.javaPKK>,eA(OSGI-OPT/src/java/math/RoundingMode.javaPKIG@!OSGI-OPT/src/java/net/PKK>(gOSGI-OPT/src/java/net/Authenticator.javaPKK>0'%(OSGI-OPT/src/java/net/BindException.javaPKK>l:'OSGI-OPT/src/java/net/CacheRequest.javaPKK>(OSGI-OPT/src/java/net/CacheResponse.javaPKK><t$+B"OSGI-OPT/src/java/net/ConnectException.javaPKK>K )p$OSGI-OPT/src/java/net/ContentHandler.javaPKK>%Ϳ0&OSGI-OPT/src/java/net/ContentHandlerFactory.javaPKK>^~3((OSGI-OPT/src/java/net/CookieHandler.javaPKK>O,?F(+OSGI-OPT/src/java/net/CookieManager.javaPKK>i '$.OSGI-OPT/src/java/net/CookiePolicy.javaPKK>&0OSGI-OPT/src/java/net/CookieStore.javaPKK>dzs)2OSGI-OPT/src/java/net/DatagramPacket.javaPKK>V&t05 )5OSGI-OPT/src/java/net/DatagramSocket.javaPKK>+m -'9OSGI-OPT/src/java/net/DatagramSocketImpl.javaPKK>kn.4<OSGI-OPT/src/java/net/DatagramSocketImplFactory.javaPKK>*&>OSGI-OPT/src/java/net/FileNameMap.javaPKK>J6M1%@OSGI-OPT/src/java/net/HttpCookie.javaPKK>l{ -COSGI-OPT/src/java/net/HttpRetryException.javaPKK>!(,SFOSGI-OPT/src/java/net/HttpURLConnection.javaPKK>T5ROmKOSGI-OPT/src/java/net/IDN.javaPKK>Cn;'NOSGI-OPT/src/java/net/Inet4Address.javaPKK>1~('LPOSGI-OPT/src/java/net/Inet6Address.javaPKK>QI &(SOSGI-OPT/src/java/net/InetAddress.javaPKK>8VN9,wVOSGI-OPT/src/java/net/InetSocketAddress.javaPKK>55݊+YOSGI-OPT/src/java/net/InterfaceAddress.javaPKK>8+[OSGI-OPT/src/java/net/JarURLConnection.javaPKK>˴.0|^OSGI-OPT/src/java/net/MalformedURLException.javaPKK> Pw0 *`OSGI-OPT/src/java/net/MulticastSocket.javaPKK>D((cOSGI-OPT/src/java/net/NetPermission.javaPKK>?G7t+$fOSGI-OPT/src/java/net/NetworkInterface.javaPKK>R61iiOSGI-OPT/src/java/net/NoRouteToHostException.javaPKK>*Erh1kOSGI-OPT/src/java/net/PasswordAuthentication.javaPKK>;<3mOSGI-OPT/src/java/net/PortUnreachableException.javaPKK>#όW",3pOSGI-OPT/src/java/net/ProtocolException.javaPKK>2 JH brOSGI-OPT/src/java/net/Proxy.javaPKK> :3(tOSGI-OPT/src/java/net/ProxySelector.javaPKK>OG(wOSGI-OPT/src/java/net/ResponseCache.javaPKK>>G. zOSGI-OPT/src/java/net/SecureCacheResponse.javaPKK> Hܫ '|OSGI-OPT/src/java/net/ServerSocket.javaPKK>*TP@! OSGI-OPT/src/java/net/Socket.javaPKK>Kiw(BOSGI-OPT/src/java/net/SocketAddress.javaPKK>tf*eOSGI-OPT/src/java/net/SocketException.javaPKK>L , %OSGI-OPT/src/java/net/SocketImpl.javaPKK>p,OSGI-OPT/src/java/net/SocketImplFactory.javaPKK>Q( OSGI-OPT/src/java/net/SocketOptions.javaPKK>;=<G+OSGI-OPT/src/java/net/SocketPermission.javaPKK>:+<1}OSGI-OPT/src/java/net/SocketTimeoutException.javaPKK>4_ OSGI-OPT/src/java/net/URI.javaPKK>V-#OSGI-OPT/src/java/net/URISyntaxException.javaPKK>J OSGI-OPT/src/java/net/URL.javaPKK>: >>)OSGI-OPT/src/java/net/URLClassLoader.javaPKK>&T(OSGI-OPT/src/java/net/URLConnection.javaPKK>Ue%OSGI-OPT/src/java/net/URLDecoder.javaPKK>c< %OSGI-OPT/src/java/net/URLEncoder.javaPKK>D+OSGI-OPT/src/java/net/URLStreamHandler.javaPKK>Q 2ͮOSGI-OPT/src/java/net/URLStreamHandlerFactory.javaPKK>tX +/OSGI-OPT/src/java/net/UnknownHostException.javaPKK>XD1421OSGI-OPT/src/java/net/UnknownServiceException.javaPKIG@jOSGI-OPT/src/java/nio/PKK>z"A!OSGI-OPT/src/java/nio/Buffer.javaPKK>(2OSGI-OPT/src/java/nio/BufferOverflowException.javaPKK>^Y3OSGI-OPT/src/java/nio/BufferUnderflowException.javaPKK>ڴ%OSGI-OPT/src/java/nio/ByteBuffer.javaPKK>u!v$$ OSGI-OPT/src/java/nio/ByteOrder.javaPKK>=b %OSGI-OPT/src/java/nio/CharBuffer.javaPKK>Pw'KOSGI-OPT/src/java/nio/DoubleBuffer.javaPKK>pY&OSGI-OPT/src/java/nio/FloatBuffer.javaPKK>gs$OSGI-OPT/src/java/nio/IntBuffer.javaPKK> 2/OSGI-OPT/src/java/nio/InvalidMarkException.javaPKK>,܇;%3OSGI-OPT/src/java/nio/LongBuffer.javaPKK>M3'+qOSGI-OPT/src/java/nio/MappedByteBuffer.javaPKK>{xt 2OSGI-OPT/src/java/nio/ReadOnlyBufferException.javaPKK>NƘY&&OSGI-OPT/src/java/nio/ShortBuffer.javaPKIG@jOSGI-OPT/src/java/nio/channels/PKK>m=OSGI-OPT/src/java/nio/channels/AlreadyConnectedException.javaPKK>OSGI-OPT/src/java/nio/channels/AsynchronousCloseException.javaPKK>xs /;OSGI-OPT/src/java/nio/channels/ByteChannel.javaPKK> 9_OSGI-OPT/src/java/nio/channels/CancelledKeyException.javaPKK>+OSGI-OPT/src/java/nio/channels/Channel.javaPKK>H,OSGI-OPT/src/java/nio/channels/Channels.javaPKK>zs >OSGI-OPT/src/java/nio/channels/ClosedByInterruptException.javaPKK>L:OSGI-OPT/src/java/nio/channels/ClosedChannelException.javaPKK>?Y ;OSGI-OPT/src/java/nio/channels/ClosedSelectorException.javaPKK>XXK>XOSGI-OPT/src/java/nio/channels/ConnectionPendingException.javaPKK>u3OSGI-OPT/src/java/nio/channels/DatagramChannel.javaPKK>|} /OSGI-OPT/src/java/nio/channels/FileChannel.javaPKK>=c,OSGI-OPT/src/java/nio/channels/FileLock.javaPKK>2{ AiOSGI-OPT/src/java/nio/channels/FileLockInterruptionException.javaPKK>F]o8OSGI-OPT/src/java/nio/channels/GatheringByteChannel.javaPKK>3@ OSGI-OPT/src/java/nio/channels/IllegalBlockingModeException.javaPKK>-z<POSGI-OPT/src/java/nio/channels/IllegalSelectorException.javaPKK>18OSGI-OPT/src/java/nio/channels/InterruptibleChannel.javaPKK>xT$@ OSGI-OPT/src/java/nio/channels/NoConnectionPendingException.javaPKK>:و? OSGI-OPT/src/java/nio/channels/NonReadableChannelException.javaPKK>/ǘ?>OSGI-OPT/src/java/nio/channels/NonWritableChannelException.javaPKK>Ŀ8OSGI-OPT/src/java/nio/channels/NotYetBoundException.javaPKK>rM<OSGI-OPT/src/java/nio/channels/NotYetConnectedException.javaPKK>P@OSGI-OPT/src/java/nio/channels/OverlappingFileLockException.javaPKK>f(COSGI-OPT/src/java/nio/channels/Pipe.javaPKK>ۚ 70OSGI-OPT/src/java/nio/channels/ReadableByteChannel.javaPKK>-'9vOSGI-OPT/src/java/nio/channels/ScatteringByteChannel.javaPKK>jD5OSGI-OPT/src/java/nio/channels/SelectableChannel.javaPKK>3&0"OSGI-OPT/src/java/nio/channels/SelectionKey.javaPKK>7_W,%OSGI-OPT/src/java/nio/channels/Selector.javaPKK>(M7(OSGI-OPT/src/java/nio/channels/ServerSocketChannel.javaPKK>O[{1<+OSGI-OPT/src/java/nio/channels/SocketChannel.javaPKK>>_.OSGI-OPT/src/java/nio/channels/UnresolvedAddressException.javaPKK>yu1 C0OSGI-OPT/src/java/nio/channels/UnsupportedAddressTypeException.javaPKK>ܦ@!72OSGI-OPT/src/java/nio/channels/WritableByteChannel.javaPKIG@#:5OSGI-OPT/src/java/nio/channels/spi/PKK>VED5OSGI-OPT/src/java/nio/channels/spi/AbstractInterruptibleChannel.javaPKK>UvAD8OSGI-OPT/src/java/nio/channels/spi/AbstractSelectableChannel.javaPKK>2 h<a;OSGI-OPT/src/java/nio/channels/spi/AbstractSelectionKey.javaPKK>.8=OSGI-OPT/src/java/nio/channels/spi/AbstractSelector.javaPKK>JL8@OSGI-OPT/src/java/nio/channels/spi/SelectorProvider.javaPKIG@qCOSGI-OPT/src/java/nio/charset/PKK> );COSGI-OPT/src/java/nio/charset/CharacterCodingException.javaPKK>rN*EOSGI-OPT/src/java/nio/charset/Charset.javaPKK>!8v96 1hIOSGI-OPT/src/java/nio/charset/CharsetDecoder.javaPKK>:)& 1LOSGI-OPT/src/java/nio/charset/CharsetEncoder.javaPKK>S8cPOSGI-OPT/src/java/nio/charset/CoderMalfunctionError.javaPKK>ϚO.ROSGI-OPT/src/java/nio/charset/CoderResult.javaPKK>w#:4UOSGI-OPT/src/java/nio/charset/CodingErrorAction.javaPKK>Eg>XOSGI-OPT/src/java/nio/charset/IllegalCharsetNameException.javaPKK>I:pZOSGI-OPT/src/java/nio/charset/MalformedInputException.javaPKK> S?\OSGI-OPT/src/java/nio/charset/UnmappableCharacterException.javaPKK>ԃzug>'_OSGI-OPT/src/java/nio/charset/UnsupportedCharsetException.javaPKIG@"aOSGI-OPT/src/java/nio/charset/spi/PKK>956aOSGI-OPT/src/java/nio/charset/spi/CharsetProvider.javaPKIG@;dOSGI-OPT/src/java/rmi/PKK>TP*dOSGI-OPT/src/java/rmi/AccessException.javaPKK>BN.0fOSGI-OPT/src/java/rmi/AlreadyBoundException.javaPKK>U.S+hOSGI-OPT/src/java/rmi/ConnectException.javaPKK>)Y-kOSGI-OPT/src/java/rmi/ConnectIOException.javaPKK>L5^S+VmOSGI-OPT/src/java/rmi/MarshalException.javaPKK>mv+oOSGI-OPT/src/java/rmi/MarshalledObject.javaPKK>]wou!qOSGI-OPT/src/java/rmi/Naming.javaPKK>{20tOSGI-OPT/src/java/rmi/NoSuchObjectException.javaPKK>ٶk",vOSGI-OPT/src/java/rmi/NotBoundException.javaPKK>+/ yOSGI-OPT/src/java/rmi/RMISecurityException.javaPKK>D-[{OSGI-OPT/src/java/rmi/RMISecurityManager.javaPKK>Ȩ!z}OSGI-OPT/src/java/rmi/Remote.javaPKK>L+*qOSGI-OPT/src/java/rmi/RemoteException.javaPKK>F@N&OSGI-OPT/src/java/rmi/ServerError.javaPKK>OP*OSGI-OPT/src/java/rmi/ServerException.javaPKK>G~1OSGI-OPT/src/java/rmi/ServerRuntimeException.javaPKK>Ub0gOSGI-OPT/src/java/rmi/StubNotFoundException.javaPKK>pSy\.OSGI-OPT/src/java/rmi/UnexpectedException.javaPKK>>}Gr_/OSGI-OPT/src/java/rmi/UnknownHostException.javaPKK>BY-OSGI-OPT/src/java/rmi/UnmarshalException.javaPKIG@!YOSGI-OPT/src/java/rmi/activation/PKK>@ 1OSGI-OPT/src/java/rmi/activation/Activatable.javaPKK>es=OSGI-OPT/src/java/rmi/activation/ActivateFailedException.javaPKK>e; w4aOSGI-OPT/src/java/rmi/activation/ActivationDesc.javaPKK>-9:OSGI-OPT/src/java/rmi/activation/ActivationException.javaPKK>YL5OSGI-OPT/src/java/rmi/activation/ActivationGroup.javaPKK>f9OSGI-OPT/src/java/rmi/activation/ActivationGroupDesc.javaPKK>Dvn7OSGI-OPT/src/java/rmi/activation/ActivationGroupID.javaPKK>C3G:OSGI-OPT/src/java/rmi/activation/ActivationGroup_Stub.javaPKK>&J2OSGI-OPT/src/java/rmi/activation/ActivationID.javaPKK> w<OSGI-OPT/src/java/rmi/activation/ActivationInstantiator.javaPKK>/skS&7OSGI-OPT/src/java/rmi/activation/ActivationMonitor.javaPKK>r 6OSGI-OPT/src/java/rmi/activation/ActivationSystem.javaPKK>>݃/OSGI-OPT/src/java/rmi/activation/Activator.javaPKK>-((;bOSGI-OPT/src/java/rmi/activation/UnknownGroupException.javaPKK>U*<OSGI-OPT/src/java/rmi/activation/UnknownObjectException.javaPKIG@OSGI-OPT/src/java/rmi/dgc/PKK> "5OSGI-OPT/src/java/rmi/dgc/DGC.javaPKK>$_$OSGI-OPT/src/java/rmi/dgc/Lease.javaPKK>A?#۽OSGI-OPT/src/java/rmi/dgc/VMID.javaPKIG@)OSGI-OPT/src/java/rmi/registry/PKK>τGm2xOSGI-OPT/src/java/rmi/registry/LocateRegistry.javaPKK>;:,EOSGI-OPT/src/java/rmi/registry/Registry.javaPKK>q 3OSGI-OPT/src/java/rmi/registry/RegistryHandler.javaPKIG@COSGI-OPT/src/java/rmi/server/PKK>I;3W1OSGI-OPT/src/java/rmi/server/ExportException.javaPKK>Bt oX/OSGI-OPT/src/java/rmi/server/LoaderHandler.javaPKK> \j+OSGI-OPT/src/java/rmi/server/LogStream.javaPKK>.>9'OSGI-OPT/src/java/rmi/server/ObjID.javaPKK>O+!OSGI-OPT/src/java/rmi/server/Operation.javaPKK>|s0jOSGI-OPT/src/java/rmi/server/RMIClassLoader.javaPKK>dAB,3OSGI-OPT/src/java/rmi/server/RMIClassLoaderSpi.javaPKK>l8>OSGI-OPT/src/java/rmi/server/RMIClientSocketFactory.javaPKK>]93OSGI-OPT/src/java/rmi/server/RMIFailureHandler.javaPKK> 8OSGI-OPT/src/java/rmi/server/RMIServerSocketFactory.javaPKK>92OSGI-OPT/src/java/rmi/server/RMISocketFactory.javaPKK>sK1,OSGI-OPT/src/java/rmi/server/RemoteCall.javaPKK>;' ."OSGI-OPT/src/java/rmi/server/RemoteObject.javaPKK>` w?OSGI-OPT/src/java/rmi/server/RemoteObjectInvocationHandler.javaPKK>ge#XM+1OSGI-OPT/src/java/rmi/server/RemoteRef.javaPKK>a_5#.kOSGI-OPT/src/java/rmi/server/RemoteServer.javaPKK>ڱ2 ,OSGI-OPT/src/java/rmi/server/RemoteStub.javaPKK>6cOSGI-OPT/src/java/rmi/server/ServerCloneException.javaPKK>~>:OSGI-OPT/src/java/rmi/server/ServerNotActiveException.javaPKK>9+OSGI-OPT/src/java/rmi/server/ServerRef.javaPKK>*OSGI-OPT/src/java/rmi/server/Skeleton.javaPKK>7q;OSGI-OPT/src/java/rmi/server/SkeletonMismatchException.javaPKK>c;\ OSGI-OPT/src/java/rmi/server/SkeletonNotFoundException.javaPKK>|9 OSGI-OPT/src/java/rmi/server/SocketSecurityException.javaPKK> %" OSGI-OPT/src/java/rmi/server/UID.javaPKK>nx5 OSGI-OPT/src/java/rmi/server/UnicastRemoteObject.javaPKK>(.a OSGI-OPT/src/java/rmi/server/Unreferenced.javaPKIG@y OSGI-OPT/src/java/security/PKK>B4 OSGI-OPT/src/java/security/AccessControlContext.javaPKK>obk6: OSGI-OPT/src/java/security/AccessControlException.javaPKK>px0 OSGI-OPT/src/java/security/AccessController.javaPKK>a;l OSGI-OPT/src/java/security/AlgorithmParameterGenerator.javaPKK>-%H>p OSGI-OPT/src/java/security/AlgorithmParameterGeneratorSpi.javaPKK>}v3 OSGI-OPT/src/java/security/AlgorithmParameters.javaPKK>@{D]6 OSGI-OPT/src/java/security/AlgorithmParametersSpi.javaPKK>o-d- OSGI-OPT/src/java/security/AllPermission.javaPKK>{"N,e" OSGI-OPT/src/java/security/AuthProvider.javaPKK>AA/ % OSGI-OPT/src/java/security/BasicPermission.javaPKK>ّK<^+' OSGI-OPT/src/java/security/Certificate.javaPKK>A *@* OSGI-OPT/src/java/security/CodeSigner.javaPKK>F6*, OSGI-OPT/src/java/security/CodeSource.javaPKK>:Er/0/ OSGI-OPT/src/java/security/DigestException.javaPKK>B&21}1 OSGI-OPT/src/java/security/DigestInputStream.javaPKK>;@'724 OSGI-OPT/src/java/security/DigestOutputStream.javaPKK>_vJ..6 OSGI-OPT/src/java/security/DomainCombiner.javaPKK>H88 OSGI-OPT/src/java/security/GeneralSecurityException.javaPKK>rD% ; OSGI-OPT/src/java/security/Guard.javaPKK>5vR-%= OSGI-OPT/src/java/security/GuardedObject.javaPKK>\(p? OSGI-OPT/src/java/security/Identity.javaPKK>ġա-B OSGI-OPT/src/java/security/IdentityScope.javaPKK>8 BE OSGI-OPT/src/java/security/InvalidAlgorithmParameterException.javaPKK>3H OSGI-OPT/src/java/security/InvalidKeyException.javaPKK>6|FN9OJ OSGI-OPT/src/java/security/InvalidParameterException.javaPKK>}Ka#L OSGI-OPT/src/java/security/Key.javaPKK>CU:,O OSGI-OPT/src/java/security/KeyException.javaPKK>*MQ OSGI-OPT/src/java/security/KeyFactory.javaPKK>-H/-YT OSGI-OPT/src/java/security/KeyFactorySpi.javaPKK>r$q6V OSGI-OPT/src/java/security/KeyManagementException.javaPKK>'Y'QY OSGI-OPT/src/java/security/KeyPair.javaPKK>nʞ0[ OSGI-OPT/src/java/security/KeyPairGenerator.javaPKK>(8$3^ OSGI-OPT/src/java/security/KeyPairGeneratorSpi.javaPKK>N@&$a OSGI-OPT/src/java/security/KeyRep.javaPKK>lŸGv(c OSGI-OPT/src/java/security/KeyStore.javaPKK>EmF(1Ui OSGI-OPT/src/java/security/KeyStoreException.javaPKK>m +k OSGI-OPT/src/java/security/KeyStoreSpi.javaPKK>{-o OSGI-OPT/src/java/security/MessageDigest.javaPKK>Kj0r OSGI-OPT/src/java/security/MessageDigestSpi.javaPKK> "a8tu OSGI-OPT/src/java/security/NoSuchAlgorithmException.javaPKK>qL7w OSGI-OPT/src/java/security/NoSuchProviderException.javaPKK>L*z OSGI-OPT/src/java/security/Permission.javaPKK>OR&)4| OSGI-OPT/src/java/security/PermissionCollection.javaPKK>L/+H OSGI-OPT/src/java/security/Permissions.javaPKK>k& OSGI-OPT/src/java/security/Policy.javaPKK>|M'M) OSGI-OPT/src/java/security/PolicySpi.javaPKK>y+$)v OSGI-OPT/src/java/security/Principal.javaPKK>Q>* OSGI-OPT/src/java/security/PrivateKey.javaPKK>pd0 OSGI-OPT/src/java/security/PrivilegedAction.javaPKK>jjAU9 OSGI-OPT/src/java/security/PrivilegedActionException.javaPKK>P*9_ OSGI-OPT/src/java/security/PrivilegedExceptionAction.javaPKK>B.0 OSGI-OPT/src/java/security/ProtectionDomain.javaPKK>X:Ľt (5 OSGI-OPT/src/java/security/Provider.javaPKK>1 OSGI-OPT/src/java/security/ProviderException.javaPKK>"v )L OSGI-OPT/src/java/security/PublicKey.javaPKK>6~F1 OSGI-OPT/src/java/security/SecureClassLoader.javaPKK>"x,/ OSGI-OPT/src/java/security/SecureRandom.javaPKK> / OSGI-OPT/src/java/security/SecureRandomSpi.javaPKK>\q"( OSGI-OPT/src/java/security/Security.javaPKK>';2 OSGI-OPT/src/java/security/SecurityPermission.javaPKK>)} )ת OSGI-OPT/src/java/security/Signature.javaPKK>O} 2 OSGI-OPT/src/java/security/SignatureException.javaPKK>} W , OSGI-OPT/src/java/security/SignatureSpi.javaPKK>SOq2, OSGI-OPT/src/java/security/SignedObject.javaPKK>FY&L OSGI-OPT/src/java/security/Signer.javaPKK>  ) OSGI-OPT/src/java/security/Timestamp.javaPKK>Lnj,H OSGI-OPT/src/java/security/URIParameter.javaPKK>dVX; OSGI-OPT/src/java/security/UnrecoverableEntryException.javaPKK>U9 OSGI-OPT/src/java/security/UnrecoverableKeyException.javaPKK>q42 OSGI-OPT/src/java/security/UnresolvedPermission.javaPKIG@ OSGI-OPT/src/java/security/acl/PKK>*Rq'T OSGI-OPT/src/java/security/acl/Acl.javaPKK>!<, OSGI-OPT/src/java/security/acl/AclEntry.javaPKK>{t8 OSGI-OPT/src/java/security/acl/AclNotFoundException.javaPKK> f) OSGI-OPT/src/java/security/acl/Group.javaPKK>fO6 OSGI-OPT/src/java/security/acl/LastOwnerException.javaPKK>b(\@5D OSGI-OPT/src/java/security/acl/NotOwnerException.javaPKK>)q OSGI-OPT/src/java/security/acl/Owner.javaPKK>Т. OSGI-OPT/src/java/security/acl/Permission.javaPKIG@ OSGI-OPT/src/java/security/cert/PKK>/ (A OSGI-OPT/src/java/security/cert/CRL.javaPKK> a!1 OSGI-OPT/src/java/security/cert/CRLException.javaPKK>d$0 OSGI-OPT/src/java/security/cert/CRLSelector.javaPKK> -0 OSGI-OPT/src/java/security/cert/CertPath.javaPKK>^YЌ4* OSGI-OPT/src/java/security/cert/CertPathBuilder.javaPKK>hFh= OSGI-OPT/src/java/security/cert/CertPathBuilderException.javaPKK>Y+$:~ OSGI-OPT/src/java/security/cert/CertPathBuilderResult.javaPKK>/Ř 7 OSGI-OPT/src/java/security/cert/CertPathBuilderSpi.javaPKK>slL76 OSGI-OPT/src/java/security/cert/CertPathParameters.javaPKK>~m-6o OSGI-OPT/src/java/security/cert/CertPathValidator.javaPKK>Մ/?_ OSGI-OPT/src/java/security/cert/CertPathValidatorException.javaPKK>5'< OSGI-OPT/src/java/security/cert/CertPathValidatorResult.javaPKK><9= OSGI-OPT/src/java/security/cert/CertPathValidatorSpi.javaPKK>p$1 OSGI-OPT/src/java/security/cert/CertSelector.javaPKK>v . OSGI-OPT/src/java/security/cert/CertStore.javaPKK>: 7 OSGI-OPT/src/java/security/cert/CertStoreException.javaPKK>s\Se8x OSGI-OPT/src/java/security/cert/CertStoreParameters.javaPKK>G9)51 OSGI-OPT/src/java/security/cert/CertStoreSpi.javaPKK>[Jt0F OSGI-OPT/src/java/security/cert/Certificate.javaPKK>OAq OSGI-OPT/src/java/security/cert/CertificateEncodingException.javaPKK>59 OSGI-OPT/src/java/security/cert/CertificateException.javaPKK>dg^@3 OSGI-OPT/src/java/security/cert/CertificateExpiredException.javaPKK>ip q 7 OSGI-OPT/src/java/security/cert/CertificateFactory.javaPKK>fT: OSGI-OPT/src/java/security/cert/CertificateFactorySpi.javaPKK>5YjD OSGI-OPT/src/java/security/cert/CertificateNotYetValidException.javaPKK>uKp]@ OSGI-OPT/src/java/security/cert/CertificateParsingException.javaPKK> ž` Bm OSGI-OPT/src/java/security/cert/CollectionCertStoreParameters.javaPKK>;*< OSGI-OPT/src/java/security/cert/LDAPCertStoreParameters.javaPKK>hZ0:m OSGI-OPT/src/java/security/cert/PKIXBuilderParameters.javaPKK>ߣ;>/# OSGI-OPT/src/java/security/cert/PKIXCertPathBuilderResult.javaPKK>@u8% OSGI-OPT/src/java/security/cert/PKIXCertPathChecker.javaPKK>4E72@( OSGI-OPT/src/java/security/cert/PKIXCertPathValidatorResult.javaPKK>\j 3Q+ OSGI-OPT/src/java/security/cert/PKIXParameters.javaPKK>*2 // OSGI-OPT/src/java/security/cert/PolicyNode.javaPKK> 81 OSGI-OPT/src/java/security/cert/PolicyQualifierInfo.javaPKK>WxQ.04 OSGI-OPT/src/java/security/cert/TrustAnchor.javaPKK>ԋ),6 OSGI-OPT/src/java/security/cert/X509CRL.javaPKK>s]@ 64 = OSGI-OPT/src/java/security/cert/X509CRLSelector.javaPKK>N`O5J@ OSGI-OPT/src/java/security/cert/X509CertSelector.javaPKK>UY 4D OSGI-OPT/src/java/security/cert/X509Certificate.javaPKK>mx 2xH OSGI-OPT/src/java/security/cert/X509Extension.javaPKIG@&J OSGI-OPT/src/java/security/interfaces/PKK>ip1;K OSGI-OPT/src/java/security/interfaces/DSAKey.javaPKK>dyl>^M OSGI-OPT/src/java/security/interfaces/DSAKeyPairGenerator.javaPKK>p'[4O OSGI-OPT/src/java/security/interfaces/DSAParams.javaPKK>]2Qg b8Q OSGI-OPT/src/java/security/interfaces/DSAPrivateKey.javaPKK>+`7dT OSGI-OPT/src/java/security/interfaces/DSAPublicKey.javaPKK>U00V OSGI-OPT/src/java/security/interfaces/ECKey.javaPKK>̛ a7X OSGI-OPT/src/java/security/interfaces/ECPrivateKey.javaPKK>Myz$e6i[ OSGI-OPT/src/java/security/interfaces/ECPublicKey.javaPKK>h1] OSGI-OPT/src/java/security/interfaces/RSAKey.javaPKK>KlE_ OSGI-OPT/src/java/security/interfaces/RSAMultiPrimePrivateCrtKey.javaPKK>%%.';b OSGI-OPT/src/java/security/interfaces/RSAPrivateCrtKey.javaPKK>Wp8Pe OSGI-OPT/src/java/security/interfaces/RSAPrivateKey.javaPKK>=n7g OSGI-OPT/src/java/security/interfaces/RSAPublicKey.javaPKIG@ >j OSGI-OPT/src/java/security/spec/PKK>%;j OSGI-OPT/src/java/security/spec/AlgorithmParameterSpec.javaPKK>}25l OSGI-OPT/src/java/security/spec/DSAParameterSpec.javaPKK> G >6&o OSGI-OPT/src/java/security/spec/DSAPrivateKeySpec.javaPKK>OPU<5q OSGI-OPT/src/java/security/spec/DSAPublicKeySpec.javaPKK>E ,s OSGI-OPT/src/java/security/spec/ECField.javaPKK>AC&8/v OSGI-OPT/src/java/security/spec/ECFieldF2m.javaPKK>"g.x OSGI-OPT/src/java/security/spec/ECFieldFp.javaPKK>sZ7z OSGI-OPT/src/java/security/spec/ECGenParameterSpec.javaPKK>M~i6_4?} OSGI-OPT/src/java/security/spec/ECParameterSpec.javaPKK> r, OSGI-OPT/src/java/security/spec/ECPoint.javaPKK>*5A OSGI-OPT/src/java/security/spec/ECPrivateKeySpec.javaPKK>v4 OSGI-OPT/src/java/security/spec/ECPublicKeySpec.javaPKK>f|hy2 OSGI-OPT/src/java/security/spec/EllipticCurve.javaPKK>ʱj3 OSGI-OPT/src/java/security/spec/EncodedKeySpec.javaPKK>_\2< OSGI-OPT/src/java/security/spec/InvalidKeySpecException.javaPKK>OcBD OSGI-OPT/src/java/security/spec/InvalidParameterSpecException.javaPKK>l, OSGI-OPT/src/java/security/spec/KeySpec.javaPKK>%b/6 OSGI-OPT/src/java/security/spec/MGF1ParameterSpec.javaPKK>f[f88 OSGI-OPT/src/java/security/spec/PKCS8EncodedKeySpec.javaPKK>5X)5 OSGI-OPT/src/java/security/spec/PSSParameterSpec.javaPKK>2E!/-;[ OSGI-OPT/src/java/security/spec/RSAKeyGenParameterSpec.javaPKK> c6C OSGI-OPT/src/java/security/spec/RSAMultiPrimePrivateCrtKeySpec.javaPKK>[r"6ǟ OSGI-OPT/src/java/security/spec/RSAOtherPrimeInfo.javaPKK>e|A90 OSGI-OPT/src/java/security/spec/RSAPrivateCrtKeySpec.javaPKK>ls6ؤ OSGI-OPT/src/java/security/spec/RSAPrivateKeySpec.javaPKK>S5@ OSGI-OPT/src/java/security/spec/RSAPublicKeySpec.javaPKK>*Id7 OSGI-OPT/src/java/security/spec/X509EncodedKeySpec.javaPKIG@ OSGI-OPT/src/java/sql/PKK>.>a R OSGI-OPT/src/java/sql/Array.javaPKK>ṵ93/ޮ OSGI-OPT/src/java/sql/BatchUpdateException.javaPKK>LvCt OSGI-OPT/src/java/sql/Blob.javaPKK>)r', OSGI-OPT/src/java/sql/CallableStatement.javaPKK>n8I9+| OSGI-OPT/src/java/sql/ClientInfoStatus.javaPKK>8`M OSGI-OPT/src/java/sql/Clob.javaPKK>;%^ OSGI-OPT/src/java/sql/Connection.javaPKK>,d) OSGI-OPT/src/java/sql/DataTruncation.javaPKK>Na A+9 OSGI-OPT/src/java/sql/DatabaseMetaData.javaPKK>ňg_ OSGI-OPT/src/java/sql/Date.javaPKK>̟)'! OSGI-OPT/src/java/sql/Driver.javaPKK>^_(! OSGI-OPT/src/java/sql/DriverManager.javaPKK>T6-O OSGI-OPT/src/java/sql/DriverPropertyInfo.javaPKK>e OSGI-OPT/src/java/sql/NClob.javaPKK>jhW, OSGI-OPT/src/java/sql/ParameterMetaData.javaPKK>: ,a OSGI-OPT/src/java/sql/PreparedStatement.javaPKK>Lx OSGI-OPT/src/java/sql/Ref.javaPKK>z=$ OSGI-OPT/src/java/sql/ResultSet.javaPKK>?|, OSGI-OPT/src/java/sql/ResultSetMetaData.javaPKK>6~u OSGI-OPT/src/java/sql/RowId.javaPKK>;R( OSGI-OPT/src/java/sql/RowIdLifetime.javaPKK>4R14 OSGI-OPT/src/java/sql/SQLClientInfoException.javaPKK>x" OSGI-OPT/src/java/sql/SQLData.javaPKK>)ۯr ,+, OSGI-OPT/src/java/sql/SQLDataException.javaPKK>WRaZ' OSGI-OPT/src/java/sql/SQLException.javaPKK>TL:G OSGI-OPT/src/java/sql/SQLFeatureNotSupportedException.javaPKK>êf# OSGI-OPT/src/java/sql/SQLInput.javaPKK>C OSGI-OPT/src/java/sql/SQLIntegrityConstraintViolationException.javaPKK>x?l OSGI-OPT/src/java/sql/SQLInvalidAuthorizationSpecException.javaPKK>rt{:= OSGI-OPT/src/java/sql/SQLNonTransientConnectionException.javaPKK>Ƴ $ OSGI-OPT/src/java/sql/SQLOutput.javaPKK>,( OSGI-OPT/src/java/sql/SQLPermission.javaPKK>n_2? OSGI-OPT/src/java/sql/SQLRecoverableException.javaPKK>Kk2 OSGI-OPT/src/java/sql/SQLSyntaxErrorException.javaPKK>i.8 D. OSGI-OPT/src/java/sql/SQLTimeoutException.javaPKK>Ɲ: OSGI-OPT/src/java/sql/SQLTransactionRollbackException.javaPKK> &: OSGI-OPT/src/java/sql/SQLTransientConnectionException.javaPKK>=,M0v OSGI-OPT/src/java/sql/SQLTransientException.javaPKK>!&b%! OSGI-OPT/src/java/sql/SQLWarning.javaPKK>ܫO;!U$ OSGI-OPT/src/java/sql/SQLXML.javaPKK>7"$& OSGI-OPT/src/java/sql/Savepoint.javaPKK>8$) OSGI-OPT/src/java/sql/Statement.javaPKK>.ڗ!- OSGI-OPT/src/java/sql/Struct.javaPKK>5~Y/ OSGI-OPT/src/java/sql/Time.javaPKK>XVc$1 OSGI-OPT/src/java/sql/Timestamp.javaPKK>^ b4 OSGI-OPT/src/java/sql/Types.javaPKK>Eұ_;"7 OSGI-OPT/src/java/sql/Wrapper.javaPKIG@9 OSGI-OPT/src/java/text/PKK>c7 &@: OSGI-OPT/src/java/text/Annotation.javaPKK>aH7i< OSGI-OPT/src/java/text/AttributedCharacterIterator.javaPKK>z\},? OSGI-OPT/src/java/text/AttributedString.javaPKK>=b ~B OSGI-OPT/src/java/text/Bidi.javaPKK>ˎ*?)E OSGI-OPT/src/java/text/BreakIterator.javaPKK>A"-H OSGI-OPT/src/java/text/CharacterIterator.javaPKK>*^ٖ(jK OSGI-OPT/src/java/text/ChoiceFormat.javaPKK>~8םj4VN OSGI-OPT/src/java/text/CollationElementIterator.javaPKK>@P(6c$S OSGI-OPT/src/java/text/Collator.javaPKK>}& W OSGI-OPT/src/java/text/DateFormat.javaPKK> -.\ OSGI-OPT/src/java/text/DateFormatSymbols.javaPKK>& [ )+_ OSGI-OPT/src/java/text/DecimalFormat.javaPKK>m 0b OSGI-OPT/src/java/text/DecimalFormatSymbols.javaPKK>J5V)f OSGI-OPT/src/java/text/FieldPosition.javaPKK>6Tiۚ"jh OSGI-OPT/src/java/text/Format.javaPKK>*V@ )Tk OSGI-OPT/src/java/text/MessageFormat.javaPKK>7IJ;&n OSGI-OPT/src/java/text/Normalizer.javaPKK>ڿ.=!(Qq OSGI-OPT/src/java/text/NumberFormat.javaPKK>r1*u OSGI-OPT/src/java/text/ParseException.javaPKK>@m)#x OSGI-OPT/src/java/text/ParsePosition.javaPKK>.@ -\z OSGI-OPT/src/java/text/RuleBasedCollator.javaPKK>Hq{,| OSGI-OPT/src/java/text/SimpleDateFormat.javaPKK>YX3 OSGI-OPT/src/java/text/StringCharacterIterator.javaPKIG@ OSGI-OPT/src/java/text/spi/PKK>@b5Ђ OSGI-OPT/src/java/text/spi/BreakIteratorProvider.javaPKK>/S0G OSGI-OPT/src/java/text/spi/CollatorProvider.javaPKK>F%2 OSGI-OPT/src/java/text/spi/DateFormatProvider.javaPKK>X!n9 OSGI-OPT/src/java/text/spi/DateFormatSymbolsProvider.javaPKK> w<q OSGI-OPT/src/java/text/spi/DecimalFormatSymbolsProvider.javaPKK>R_4ڎ OSGI-OPT/src/java/text/spi/NumberFormatProvider.javaPKIG@R OSGI-OPT/src/java/util/PKK>;"]. OSGI-OPT/src/java/util/AbstractCollection.javaPKK>@%(R OSGI-OPT/src/java/util/AbstractList.javaPKK>)Gn&'2 OSGI-OPT/src/java/util/AbstractMap.javaPKK>qg)^ OSGI-OPT/src/java/util/AbstractQueue.javaPKK>ww7x2 OSGI-OPT/src/java/util/AbstractSequentialList.javaPKK>$}' OSGI-OPT/src/java/util/AbstractSet.javaPKK>8,&6 OSGI-OPT/src/java/util/ArrayDeque.javaPKK>Jj%U OSGI-OPT/src/java/util/ArrayList.javaPKK>06Zz"q OSGI-OPT/src/java/util/BitSet.javaPKK>hQOp|$] OSGI-OPT/src/java/util/Calendar.javaPKK>8.S& OSGI-OPT/src/java/util/Collection.javaPKK>߁!>'Ʒ OSGI-OPT/src/java/util/Collections.javaPKK>~UG&Y OSGI-OPT/src/java/util/Comparator.javaPKK>AcT; OSGI-OPT/src/java/util/ConcurrentModificationException.javaPKK>tI^$ OSGI-OPT/src/java/util/Currency.javaPKK>3^7W   OSGI-OPT/src/java/util/Date.javaPKK>%X! OSGI-OPT/src/java/util/Deque.javaPKK>$& OSGI-OPT/src/java/util/Dictionary.javaPKK>$\9 OSGI-OPT/src/java/util/DuplicateFormatFlagsException.javaPKK><"/I OSGI-OPT/src/java/util/EmptyStackException.javaPKK>vS;r#q OSGI-OPT/src/java/util/EnumMap.javaPKK>hE̥ # OSGI-OPT/src/java/util/EnumSet.javaPKK>Wha' OSGI-OPT/src/java/util/Enumeration.javaPKK> ) OSGI-OPT/src/java/util/EventListener.javaPKK>kaZ. OSGI-OPT/src/java/util/EventListenerProxy.javaPKK>iT'Z OSGI-OPT/src/java/util/EventObject.javaPKK>k]ڲB OSGI-OPT/src/java/util/FormatFlagsConversionMismatchException.javaPKK>' OSGI-OPT/src/java/util/Formattable.javaPKK>I,B OSGI-OPT/src/java/util/FormattableFlags.javaPKK>a׼ % OSGI-OPT/src/java/util/Formatter.javaPKK>34 OSGI-OPT/src/java/util/FormatterClosedException.javaPKK>--& OSGI-OPT/src/java/util/GregorianCalendar.javaPKK>]c58#' OSGI-OPT/src/java/util/HashMap.javaPKK>'5<# OSGI-OPT/src/java/util/HashSet.javaPKK>iX%3 OSGI-OPT/src/java/util/Hashtable.javaPKK>h2-+_ OSGI-OPT/src/java/util/IdentityHashMap.javaPKK>2nDG; OSGI-OPT/src/java/util/IllegalFormatCodePointException.javaPKK>#AO<9 OSGI-OPT/src/java/util/IllegalFormatConversionException.javaPKK>փP2 OSGI-OPT/src/java/util/IllegalFormatException.javaPKK>+X7 OSGI-OPT/src/java/util/IllegalFormatFlagsException.javaPKK>n*G;X OSGI-OPT/src/java/util/IllegalFormatPrecisionException.javaPKK>l;7 OSGI-OPT/src/java/util/IllegalFormatWidthException.javaPKK>ݮ?2 OSGI-OPT/src/java/util/InputMismatchException.javaPKK>L]Mh</ OSGI-OPT/src/java/util/InvalidPropertiesFormatException.javaPKK>V$ OSGI-OPT/src/java/util/Iterator.javaPKK>?&>) OSGI-OPT/src/java/util/LinkedHashMap.javaPKK> ) OSGI-OPT/src/java/util/LinkedHashSet.javaPKK>]z&| OSGI-OPT/src/java/util/LinkedList.javaPKK>>B  OSGI-OPT/src/java/util/List.javaPKK>-ΐE(9 OSGI-OPT/src/java/util/ListIterator.javaPKK>HƮ;'. OSGI-OPT/src/java/util/ListResourceBundle.javaPKK>ͤ|-" OSGI-OPT/src/java/util/Locale.javaPKK>O "} ! OSGI-OPT/src/java/util/Map.javaPKK>h:$ OSGI-OPT/src/java/util/MissingFormatArgumentException.javaPKK>Jb7& OSGI-OPT/src/java/util/MissingFormatWidthException.javaPKK> x4Q) OSGI-OPT/src/java/util/MissingResourceException.javaPKK>}h(+ OSGI-OPT/src/java/util/NavigableMap.javaPKK>W7z(n. OSGI-OPT/src/java/util/NavigableSet.javaPKK>d920 OSGI-OPT/src/java/util/NoSuchElementException.javaPKK>]o(N&73 OSGI-OPT/src/java/util/Observable.javaPKK>Y$5 OSGI-OPT/src/java/util/Observer.javaPKK>>ͮb_)7 OSGI-OPT/src/java/util/PriorityQueue.javaPKK>@`f&: OSGI-OPT/src/java/util/Properties.javaPKK> xNe.= OSGI-OPT/src/java/util/PropertyPermission.javaPKK>L(2? OSGI-OPT/src/java/util/PropertyResourceBundle.javaPKK>ؕi!yB OSGI-OPT/src/java/util/Queue.javaPKK>_jM"D OSGI-OPT/src/java/util/Random.javaPKK>S(KG OSGI-OPT/src/java/util/RandomAccess.javaPKK> (*NI OSGI-OPT/src/java/util/ResourceBundle.javaPKK>K#M OSGI-OPT/src/java/util/Scanner.javaPKK>f5Q OSGI-OPT/src/java/util/ServiceConfigurationError.javaPKK>!cK):T OSGI-OPT/src/java/util/ServiceLoader.javaPKK>x~V OSGI-OPT/src/java/util/Set.javaPKK>gjeu*Y OSGI-OPT/src/java/util/SimpleTimeZone.javaPKK>B%\ OSGI-OPT/src/java/util/SortedMap.javaPKK>Qu%s^ OSGI-OPT/src/java/util/SortedSet.javaPKK>in!` OSGI-OPT/src/java/util/Stack.javaPKK>qn=9+c OSGI-OPT/src/java/util/StringTokenizer.javaPKK>/)T J$e OSGI-OPT/src/java/util/TimeZone.javaPKK>=Fu*R!i OSGI-OPT/src/java/util/Timer.javaPKK>kK%k OSGI-OPT/src/java/util/TimerTask.javaPKK>.=};5m OSGI-OPT/src/java/util/TooManyListenersException.javaPKK>$Nx # p OSGI-OPT/src/java/util/TreeMap.javaPKK>I=#js OSGI-OPT/src/java/util/TreeSet.javaPKK>j~{S v OSGI-OPT/src/java/util/UUID.javaPKK> g<Sy OSGI-OPT/src/java/util/UnknownFormatConversionException.javaPKK>;X7{ OSGI-OPT/src/java/util/UnknownFormatFlagsException.javaPKK>*s"~ OSGI-OPT/src/java/util/Vector.javaPKK>bVU'd OSGI-OPT/src/java/util/WeakHashMap.javaPKIG@"σ OSGI-OPT/src/java/util/concurrent/PKK>>! OSGI-OPT/src/java/util/concurrent/AbstractExecutorService.javaPKK>X9? OSGI-OPT/src/java/util/concurrent/ArrayBlockingQueue.javaPKK>! =4h OSGI-OPT/src/java/util/concurrent/BlockingDeque.javaPKK>X;f4 OSGI-OPT/src/java/util/concurrent/BlockingQueue.javaPKK>UA==Ϗ OSGI-OPT/src/java/util/concurrent/BrokenBarrierException.javaPKK>9-/ OSGI-OPT/src/java/util/concurrent/Callable.javaPKK>!F<B OSGI-OPT/src/java/util/concurrent/CancellationException.javaPKK> L K8 OSGI-OPT/src/java/util/concurrent/CompletionService.javaPKK>M=8 OSGI-OPT/src/java/util/concurrent/ConcurrentHashMap.javaPKK>k?X< OSGI-OPT/src/java/util/concurrent/ConcurrentLinkedQueue.javaPKK>31)4 OSGI-OPT/src/java/util/concurrent/ConcurrentMap.javaPKK>R+V=! OSGI-OPT/src/java/util/concurrent/ConcurrentNavigableMap.javaPKK> V < OSGI-OPT/src/java/util/concurrent/ConcurrentSkipListMap.javaPKK><Y<w OSGI-OPT/src/java/util/concurrent/ConcurrentSkipListSet.javaPKK>6!* ; OSGI-OPT/src/java/util/concurrent/CopyOnWriteArrayList.javaPKK>?G:I OSGI-OPT/src/java/util/concurrent/CopyOnWriteArraySet.javaPKK> d#5ΰ OSGI-OPT/src/java/util/concurrent/CountDownLatch.javaPKK>OP4T OSGI-OPT/src/java/util/concurrent/CyclicBarrier.javaPKK>-1 OSGI-OPT/src/java/util/concurrent/DelayQueue.javaPKK>3Z$. OSGI-OPT/src/java/util/concurrent/Delayed.javaPKK>y0V OSGI-OPT/src/java/util/concurrent/Exchanger.javaPKK>9ý OSGI-OPT/src/java/util/concurrent/ExecutionException.javaPKK>B/ OSGI-OPT/src/java/util/concurrent/Executor.javaPKK>0S_@G OSGI-OPT/src/java/util/concurrent/ExecutorCompletionService.javaPKK>(6 OSGI-OPT/src/java/util/concurrent/ExecutorService.javaPKK>] 0 OSGI-OPT/src/java/util/concurrent/Executors.javaPKK> - OSGI-OPT/src/java/util/concurrent/Future.javaPKK> 1 OSGI-OPT/src/java/util/concurrent/FutureTask.javaPKK>d^ : OSGI-OPT/src/java/util/concurrent/LinkedBlockingDeque.javaPKK>5: OSGI-OPT/src/java/util/concurrent/LinkedBlockingQueue.javaPKK>ht2< OSGI-OPT/src/java/util/concurrent/PriorityBlockingQueue.javaPKK>-rDA OSGI-OPT/src/java/util/concurrent/RejectedExecutionException.javaPKK>&? OSGI-OPT/src/java/util/concurrent/RejectedExecutionHandler.javaPKK>Oe5 OSGI-OPT/src/java/util/concurrent/RunnableFuture.javaPKK>7> OSGI-OPT/src/java/util/concurrent/RunnableScheduledFuture.javaPKK>^#7 ?U OSGI-OPT/src/java/util/concurrent/ScheduledExecutorService.javaPKK>QWN6 OSGI-OPT/src/java/util/concurrent/ScheduledFuture.javaPKK>S 5U B+ OSGI-OPT/src/java/util/concurrent/ScheduledThreadPoolExecutor.javaPKK> *0 OSGI-OPT/src/java/util/concurrent/Semaphore.javaPKK>7 OSGI-OPT/src/java/util/concurrent/SynchronousQueue.javaPKK>w4 OSGI-OPT/src/java/util/concurrent/ThreadFactory.javaPKK>N!9C OSGI-OPT/src/java/util/concurrent/ThreadPoolExecutor.javaPKK>lS/ OSGI-OPT/src/java/util/concurrent/TimeUnit.javaPKK>U+7 OSGI-OPT/src/java/util/concurrent/TimeoutException.javaPKIG@) OSGI-OPT/src/java/util/concurrent/atomic/PKK>!;K OSGI-OPT/src/java/util/concurrent/atomic/AtomicBoolean.javaPKK>UP; OSGI-OPT/src/java/util/concurrent/atomic/AtomicInteger.javaPKK>JIg@@ OSGI-OPT/src/java/util/concurrent/atomic/AtomicIntegerArray.javaPKK>tMG OSGI-OPT/src/java/util/concurrent/atomic/AtomicIntegerFieldUpdater.javaPKK>ea8 OSGI-OPT/src/java/util/concurrent/atomic/AtomicLong.javaPKK>`^nK= OSGI-OPT/src/java/util/concurrent/atomic/AtomicLongArray.javaPKK>̈́D\ OSGI-OPT/src/java/util/concurrent/atomic/AtomicLongFieldUpdater.javaPKK>W^<ER OSGI-OPT/src/java/util/concurrent/atomic/AtomicMarkableReference.javaPKK>&,[= OSGI-OPT/src/java/util/concurrent/atomic/AtomicReference.javaPKK>zqFB OSGI-OPT/src/java/util/concurrent/atomic/AtomicReferenceArray.javaPKK>8r^IN OSGI-OPT/src/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.javaPKK>#";D# OSGI-OPT/src/java/util/concurrent/atomic/AtomicStampedReference.javaPKIG@( OSGI-OPT/src/java/util/concurrent/locks/PKK>3H(! OSGI-OPT/src/java/util/concurrent/locks/AbstractOwnableSynchronizer.javaPKK>Y8K# OSGI-OPT/src/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.javaPKK>HSQyG#( OSGI-OPT/src/java/util/concurrent/locks/AbstractQueuedSynchronizer.javaPKK>S"+6, OSGI-OPT/src/java/util/concurrent/locks/Condition.javaPKK>BU1/ OSGI-OPT/src/java/util/concurrent/locks/Lock.javaPKK>yсV81 OSGI-OPT/src/java/util/concurrent/locks/LockSupport.javaPKK>A|(:=4 OSGI-OPT/src/java/util/concurrent/locks/ReadWriteLock.javaPKK>\:u6 OSGI-OPT/src/java/util/concurrent/locks/ReentrantLock.javaPKK>tN C9 OSGI-OPT/src/java/util/concurrent/locks/ReentrantReadWriteLock.javaPKIG@= OSGI-OPT/src/java/util/jar/PKK>,XV*= OSGI-OPT/src/java/util/jar/Attributes.javaPKK> q ?(B OSGI-OPT/src/java/util/jar/JarEntry.javaPKK>,D OSGI-OPT/src/java/util/jar/JarException.javaPKK>OZd|C'F OSGI-OPT/src/java/util/jar/JarFile.javaPKK>.-)i.I OSGI-OPT/src/java/util/jar/JarInputStream.javaPKK>J6&/2L OSGI-OPT/src/java/util/jar/JarOutputStream.javaPKK>8{Y?(N OSGI-OPT/src/java/util/jar/Manifest.javaPKK>gj '@Q OSGI-OPT/src/java/util/jar/Pack200.javaPKIG@U OSGI-OPT/src/java/util/logging/PKK>D2U OSGI-OPT/src/java/util/logging/ConsoleHandler.javaPKK>M%3+0X OSGI-OPT/src/java/util/logging/ErrorManager.javaPKK>=?G/Z OSGI-OPT/src/java/util/logging/FileHandler.javaPKK>vB*] OSGI-OPT/src/java/util/logging/Filter.javaPKK>n*-3_ OSGI-OPT/src/java/util/logging/Formatter.javaPKK>sG+a OSGI-OPT/src/java/util/logging/Handler.javaPKK>r)d OSGI-OPT/src/java/util/logging/Level.javaPKK>B.g OSGI-OPT/src/java/util/logging/LogManager.javaPKK>FE-j OSGI-OPT/src/java/util/logging/LogRecord.javaPKK>3Ŷ}*m OSGI-OPT/src/java/util/logging/Logger.javaPKK>ݠ$1q OSGI-OPT/src/java/util/logging/LoggingMXBean.javaPKK>kk5Et OSGI-OPT/src/java/util/logging/LoggingPermission.javaPKK>K W1v OSGI-OPT/src/java/util/logging/MemoryHandler.javaPKK><ML3y OSGI-OPT/src/java/util/logging/SimpleFormatter.javaPKK>-Dk1b{ OSGI-OPT/src/java/util/logging/SocketHandler.javaPKK>tgH1} OSGI-OPT/src/java/util/logging/StreamHandler.javaPKK>b"F0 OSGI-OPT/src/java/util/logging/XMLFormatter.javaPKIG@f OSGI-OPT/src/java/util/prefs/PKK>R"P35 OSGI-OPT/src/java/util/prefs/AbstractPreferences.javaPKK>cOM7. OSGI-OPT/src/java/util/prefs/BackingStoreException.javaPKK>}uCr OSGI-OPT/src/java/util/prefs/InvalidPreferencesFormatException.javaPKK>61֋ OSGI-OPT/src/java/util/prefs/NodeChangeEvent.javaPKK>/M4C OSGI-OPT/src/java/util/prefs/NodeChangeListener.javaPKK>7 OSGI-OPT/src/java/util/prefs/PreferenceChangeEvent.javaPKK>W%: OSGI-OPT/src/java/util/prefs/PreferenceChangeListener.javaPKK>c-I OSGI-OPT/src/java/util/prefs/Preferences.javaPKK>Uv4 OSGI-OPT/src/java/util/prefs/PreferencesFactory.javaPKIG@ OSGI-OPT/src/java/util/regex/PKK>=I- OSGI-OPT/src/java/util/regex/MatchResult.javaPKK>6P )J OSGI-OPT/src/java/util/regex/Matcher.javaPKK>cC)ס OSGI-OPT/src/java/util/regex/Pattern.javaPKK>+q8! OSGI-OPT/src/java/util/regex/PatternSyntaxException.javaPKIG@ OSGI-OPT/src/java/util/spi/PKK>O:n4 OSGI-OPT/src/java/util/spi/CurrencyNameProvider.javaPKK>Q.92D OSGI-OPT/src/java/util/spi/LocaleNameProvider.javaPKK>H$5 OSGI-OPT/src/java/util/spi/LocaleServiceProvider.javaPKK>Pk4 OSGI-OPT/src/java/util/spi/TimeZoneNameProvider.javaPKIG@h OSGI-OPT/src/java/util/zip/PKK> ' OSGI-OPT/src/java/util/zip/Adler32.javaPKK>A}M% OSGI-OPT/src/java/util/zip/CRC32.javaPKK>/2i OSGI-OPT/src/java/util/zip/CheckedInputStream.javaPKK>L=3Ǹ OSGI-OPT/src/java/util/zip/CheckedOutputStream.javaPKK>x(' OSGI-OPT/src/java/util/zip/Checksum.javaPKK>vr0-3` OSGI-OPT/src/java/util/zip/DataFormatException.javaPKK>ؽ( OSGI-OPT/src/java/util/zip/Deflater.javaPKK> >"3 OSGI-OPT/src/java/util/zip/DeflaterInputStream.javaPKK>+:4\ OSGI-OPT/src/java/util/zip/DeflaterOutputStream.javaPKK>b>/ OSGI-OPT/src/java/util/zip/GZIPInputStream.javaPKK>şuB0 OSGI-OPT/src/java/util/zip/GZIPOutputStream.javaPKK>mKN( OSGI-OPT/src/java/util/zip/Inflater.javaPKK>bB33 OSGI-OPT/src/java/util/zip/InflaterInputStream.javaPKK>mw<4 OSGI-OPT/src/java/util/zip/InflaterOutputStream.javaPKK>`[,! OSGI-OPT/src/java/util/zip/ZipConstants.javaPKK>#i(_ OSGI-OPT/src/java/util/zip/ZipEntry.javaPKK>ܥ-(W OSGI-OPT/src/java/util/zip/ZipError.javaPKK>tr,| OSGI-OPT/src/java/util/zip/ZipException.javaPKK>b' OSGI-OPT/src/java/util/zip/ZipFile.javaPKK>A)SHi. OSGI-OPT/src/java/util/zip/ZipInputStream.javaPKK> ;l/6 OSGI-OPT/src/java/util/zip/ZipOutputStream.javaPKIG@ OSGI-OPT/src/javax/PKIG@!B OSGI-OPT/src/javax/accessibility/PKK> =#0 OSGI-OPT/src/javax/accessibility/Accessible.javaPKK>3^&\6 OSGI-OPT/src/javax/accessibility/AccessibleAction.javaPKK>ax>A? OSGI-OPT/src/javax/accessibility/AccessibleAttributeSequence.javaPKK>B<\6 OSGI-OPT/src/javax/accessibility/AccessibleBundle.javaPKK>E9 OSGI-OPT/src/javax/accessibility/AccessibleComponent.javaPKK>eڨQ7> OSGI-OPT/src/javax/accessibility/AccessibleContext.javaPKK>ɿM><K OSGI-OPT/src/javax/accessibility/AccessibleEditableText.javaPKK>ǧA OSGI-OPT/src/javax/accessibility/AccessibleExtendedComponent.javaPKK>[ b=W OSGI-OPT/src/javax/accessibility/AccessibleExtendedTable.javaPKK>^/}<OSGI-OPT/src/javax/accessibility/AccessibleExtendedText.javaPKK>9COSGI-OPT/src/javax/accessibility/AccessibleHyperlink.javaPKK>'PY9OSGI-OPT/src/javax/accessibility/AccessibleHypertext.javaPKK>Xk g4 OSGI-OPT/src/javax/accessibility/AccessibleIcon.javaPKK> E:] OSGI-OPT/src/javax/accessibility/AccessibleKeyBinding.javaPKK>1l F 8 OSGI-OPT/src/javax/accessibility/AccessibleRelation.javaPKK>TtW;KOSGI-OPT/src/javax/accessibility/AccessibleRelationSet.javaPKK>rb s> OSGI-OPT/src/javax/accessibility/AccessibleResourceBundle.javaPKK>}HBc4OSGI-OPT/src/javax/accessibility/AccessibleRole.javaPKK>^49FOSGI-OPT/src/javax/accessibility/AccessibleSelection.javaPKK>l+5OSGI-OPT/src/javax/accessibility/AccessibleState.javaPKK>v!B68?!OSGI-OPT/src/javax/accessibility/AccessibleStateSet.javaPKK>1<:#OSGI-OPT/src/javax/accessibility/AccessibleStreamable.javaPKK>j{55&OSGI-OPT/src/javax/accessibility/AccessibleTable.javaPKK>+F"W@)OSGI-OPT/src/javax/accessibility/AccessibleTableModelChange.javaPKK>Eq4+OSGI-OPT/src/javax/accessibility/AccessibleText.javaPKK>@[<X.OSGI-OPT/src/javax/accessibility/AccessibleTextSequence.javaPKK>E>50OSGI-OPT/src/javax/accessibility/AccessibleValue.javaPKIG@2OSGI-OPT/src/javax/activation/PKK>64Q~ *7J3OSGI-OPT/src/javax/activation/ActivationDataFlavor.javaPKK>KS#&.5OSGI-OPT/src/javax/activation/CommandInfo.javaPKK>XFyX-;8OSGI-OPT/src/javax/activation/CommandMap.javaPKK>eK%0;OSGI-OPT/src/javax/activation/CommandObject.javaPKK>L5V=OSGI-OPT/src/javax/activation/DataContentHandler.javaPKK>N<@OSGI-OPT/src/javax/activation/DataContentHandlerFactory.javaPKK>~9.DBOSGI-OPT/src/javax/activation/DataHandler.javaPKK>{-EOSGI-OPT/src/javax/activation/DataSource.javaPKK>=1HOSGI-OPT/src/javax/activation/FileDataSource.javaPKK>O .JOSGI-OPT/src/javax/activation/FileTypeMap.javaPKK>J\4MOSGI-OPT/src/javax/activation/MailcapCommandMap.javaPKK>r+OOSGI-OPT/src/javax/activation/MimeType.javaPKK>oDJ8ROSGI-OPT/src/javax/activation/MimeTypeParameterList.javaPKK>O}X99yUOSGI-OPT/src/javax/activation/MimeTypeParseException.javaPKK>=}&d7WOSGI-OPT/src/javax/activation/MimetypesFileTypeMap.javaPKK>H)Z0GZOSGI-OPT/src/javax/activation/URLDataSource.javaPKK>cK?\OSGI-OPT/src/javax/activation/UnsupportedDataTypeException.javaPKIG@_OSGI-OPT/src/javax/activity/PKK>g;j_OSGI-OPT/src/javax/activity/ActivityCompletedException.javaPKK>DqK:aOSGI-OPT/src/javax/activity/ActivityRequiredException.javaPKK>K9#dOSGI-OPT/src/javax/activity/InvalidActivityException.javaPKIG@fOSGI-OPT/src/javax/annotation/PKK>"(_,fOSGI-OPT/src/javax/annotation/Generated.javaPKK>mwn{0iOSGI-OPT/src/javax/annotation/PostConstruct.javaPKK>=x-kOSGI-OPT/src/javax/annotation/PreDestroy.javaPKK>'E=+0nOSGI-OPT/src/javax/annotation/Resource.javaPKK>>T, qOSGI-OPT/src/javax/annotation/Resources.javaPKIG@)jsOSGI-OPT/src/javax/annotation/processing/PKK>@ǣ?sOSGI-OPT/src/javax/annotation/processing/AbstractProcessor.javaPKK>P 8vOSGI-OPT/src/javax/annotation/processing/Completion.javaPKK>]9 yOSGI-OPT/src/javax/annotation/processing/Completions.javaPKK>!Z>P3{OSGI-OPT/src/javax/annotation/processing/Filer.javaPKK>T~<)~OSGI-OPT/src/javax/annotation/processing/FilerException.javaPKK>W 6lOSGI-OPT/src/javax/annotation/processing/Messager.javaPKK>o-!COSGI-OPT/src/javax/annotation/processing/ProcessingEnvironment.javaPKK>sz57OSGI-OPT/src/javax/annotation/processing/Processor.javaPKK>/.(,\>kOSGI-OPT/src/javax/annotation/processing/RoundEnvironment.javaPKK>I-wFOSGI-OPT/src/javax/annotation/processing/SupportedAnnotationTypes.javaPKK>t>OSGI-OPT/src/javax/annotation/processing/SupportedOptions.javaPKK>mRDOSGI-OPT/src/javax/annotation/processing/SupportedSourceVersion.javaPKIG@OSGI-OPT/src/javax/crypto/PKK>E{?2ӒOSGI-OPT/src/javax/crypto/BadPaddingException.javaPKK>tC%OSGI-OPT/src/javax/crypto/Cipher.javaPKK>x0OSGI-OPT/src/javax/crypto/CipherInputStream.javaPKK>^=1OSGI-OPT/src/javax/crypto/CipherOutputStream.javaPKK>MZI (SOSGI-OPT/src/javax/crypto/CipherSpi.javaPKK>`76OSGI-OPT/src/javax/crypto/EncryptedPrivateKeyInfo.javaPKK> 1OSGI-OPT/src/javax/crypto/ExemptionMechanism.javaPKK>~X{W:mOSGI-OPT/src/javax/crypto/ExemptionMechanismException.javaPKK>cRr4OSGI-OPT/src/javax/crypto/ExemptionMechanismSpi.javaPKK>a>]Q8OSGI-OPT/src/javax/crypto/IllegalBlockSizeException.javaPKK>fv +OSGI-OPT/src/javax/crypto/KeyAgreement.javaPKK>s<ǐ.+OSGI-OPT/src/javax/crypto/KeyAgreementSpi.javaPKK>I+OSGI-OPT/src/javax/crypto/KeyGenerator.javaPKK>hD2].OSGI-OPT/src/javax/crypto/KeyGeneratorSpi.javaPKK>}tB"OSGI-OPT/src/javax/crypto/Mac.javaPKK>R$%OSGI-OPT/src/javax/crypto/MacSpi.javaPKK>_wH5OSGI-OPT/src/javax/crypto/NoSuchPaddingException.javaPKK>͗hA)6OSGI-OPT/src/javax/crypto/NullCipher.javaPKK>l??+uOSGI-OPT/src/javax/crypto/SealedObject.javaPKK>'q^[ (rOSGI-OPT/src/javax/crypto/SecretKey.javaPKK>g/OSGI-OPT/src/javax/crypto/SecretKeyFactory.javaPKK> 32OSGI-OPT/src/javax/crypto/SecretKeyFactorySpi.javaPKK>s0B3FOSGI-OPT/src/javax/crypto/ShortBufferException.javaPKIG@%OSGI-OPT/src/javax/crypto/interfaces/PKK>ˏ/OSGI-OPT/src/javax/crypto/interfaces/DHKey.javaPKK>@1^6OSGI-OPT/src/javax/crypto/interfaces/DHPrivateKey.javaPKK>]5{OSGI-OPT/src/javax/crypto/interfaces/DHPublicKey.javaPKK>9^0OSGI-OPT/src/javax/crypto/interfaces/PBEKey.javaPKIG@aOSGI-OPT/src/javax/crypto/spec/PKK><*ZyF.OSGI-OPT/src/javax/crypto/spec/DESKeySpec.javaPKK>9=EX1ROSGI-OPT/src/javax/crypto/spec/DESedeKeySpec.javaPKK>Ҋjw6OSGI-OPT/src/javax/crypto/spec/DHGenParameterSpec.javaPKK>c&3[OSGI-OPT/src/javax/crypto/spec/DHParameterSpec.javaPKK>44OSGI-OPT/src/javax/crypto/spec/DHPrivateKeySpec.javaPKK>3?OSGI-OPT/src/javax/crypto/spec/DHPublicKeySpec.javaPKK>T0|{3OSGI-OPT/src/javax/crypto/spec/IvParameterSpec.javaPKK>1 L5OSGI-OPT/src/javax/crypto/spec/OAEPParameterSpec.javaPKK>d)8l.OSGI-OPT/src/javax/crypto/spec/PBEKeySpec.javaPKK>zh y4KOSGI-OPT/src/javax/crypto/spec/PBEParameterSpec.javaPKK>K#=5+OSGI-OPT/src/javax/crypto/spec/PSource.javaPKK> ͍4OOSGI-OPT/src/javax/crypto/spec/RC2ParameterSpec.javaPKK>ho*a4OSGI-OPT/src/javax/crypto/spec/RC5ParameterSpec.javaPKK>ϵ\d1VOSGI-OPT/src/javax/crypto/spec/SecretKeySpec.javaPKIG@OSGI-OPT/src/javax/imageio/PKK>_G,\OSGI-OPT/src/javax/imageio/IIOException.javaPKK>;ɡ(OSGI-OPT/src/javax/imageio/IIOImage.javaPKK>(OSGI-OPT/src/javax/imageio/IIOParam.javaPKK>Y02 OSGI-OPT/src/javax/imageio/IIOParamController.javaPKK>rDT M' OSGI-OPT/src/javax/imageio/ImageIO.javaPKK>V~.OSGI-OPT/src/javax/imageio/ImageReadParam.javaPKK>waD +OSGI-OPT/src/javax/imageio/ImageReader.javaPKK>T/OSGI-OPT/src/javax/imageio/ImageTranscoder.javaPKK>k 2OSGI-OPT/src/javax/imageio/ImageTypeSpecifier.javaPKK>R@A /ZOSGI-OPT/src/javax/imageio/ImageWriteParam.javaPKK>7+y#OSGI-OPT/src/javax/imageio/ImageWriter.javaPKIG@! )OSGI-OPT/src/javax/imageio/event/PKK>+=Z)OSGI-OPT/src/javax/imageio/event/IIOReadProgressListener.javaPKK>9?2;+OSGI-OPT/src/javax/imageio/event/IIOReadUpdateListener.javaPKK>Rl4f1<.OSGI-OPT/src/javax/imageio/event/IIOReadWarningListener.javaPKK>\ >0OSGI-OPT/src/javax/imageio/event/IIOWriteProgressListener.javaPKK>>)<=z3OSGI-OPT/src/javax/imageio/event/IIOWriteWarningListener.javaPKIG@$5OSGI-OPT/src/javax/imageio/metadata/PKK>Y;@+6OSGI-OPT/src/javax/imageio/metadata/IIOInvalidTreeException.javaPKK>j^ 48OSGI-OPT/src/javax/imageio/metadata/IIOMetadata.javaPKK>+o><OSGI-OPT/src/javax/imageio/metadata/IIOMetadataController.javaPKK>:>OSGI-OPT/src/javax/imageio/metadata/IIOMetadataFormat.javaPKK>F0F>COSGI-OPT/src/javax/imageio/metadata/IIOMetadataFormatImpl.javaPKK> QI8GOSGI-OPT/src/javax/imageio/metadata/IIOMetadataNode.javaPKIG@#LOSGI-OPT/src/javax/imageio/plugins/PKIG@'LOSGI-OPT/src/javax/imageio/plugins/bmp/PKK> #>*MOSGI-OPT/src/javax/imageio/plugins/bmp/BMPImageWriteParam.javaPKIG@(OOSGI-OPT/src/javax/imageio/plugins/jpeg/PKK>4)=OOSGI-OPT/src/javax/imageio/plugins/jpeg/JPEGHuffmanTable.javaPKK>T,<?ROSGI-OPT/src/javax/imageio/plugins/jpeg/JPEGImageReadParam.javaPKK>wc@!?'7 XOSGI-OPT/src/javax/imageio/plugins/jpeg/JPEGQTable.javaPKIG@ZOSGI-OPT/src/javax/imageio/spi/PKK>'aT /[OSGI-OPT/src/javax/imageio/spi/IIORegistry.javaPKK>Y_.6]OSGI-OPT/src/javax/imageio/spi/IIOServiceProvider.javaPKK>q{7t`OSGI-OPT/src/javax/imageio/spi/ImageInputStreamSpi.javaPKK>Ԉ8`cOSGI-OPT/src/javax/imageio/spi/ImageOutputStreamSpi.javaPKK>=X2NfOSGI-OPT/src/javax/imageio/spi/ImageReaderSpi.javaPKK>2\ 8iOSGI-OPT/src/javax/imageio/spi/ImageReaderWriterSpi.javaPKK>.^!16mOSGI-OPT/src/javax/imageio/spi/ImageTranscoderSpi.javaPKK>؋V) 2oOSGI-OPT/src/javax/imageio/spi/ImageWriterSpi.javaPKK>=M+n7,sOSGI-OPT/src/javax/imageio/spi/RegisterableService.javaPKK> &3yuOSGI-OPT/src/javax/imageio/spi/ServiceRegistry.javaPKIG@"xOSGI-OPT/src/javax/imageio/stream/PKK>< @yOSGI-OPT/src/javax/imageio/stream/FileCacheImageInputStream.javaPKK>Y)A{OSGI-OPT/src/javax/imageio/stream/FileCacheImageOutputStream.javaPKK>=4;7~OSGI-OPT/src/javax/imageio/stream/FileImageInputStream.javaPKK> '-<OSGI-OPT/src/javax/imageio/stream/FileImageOutputStream.javaPKK>Z*4ROSGI-OPT/src/javax/imageio/stream/IIOByteBuffer.javaPKK>!>7ąOSGI-OPT/src/javax/imageio/stream/ImageInputStream.javaPKK>yHwG;OSGI-OPT/src/javax/imageio/stream/ImageInputStreamImpl.javaPKK>5v8Q8IOSGI-OPT/src/javax/imageio/stream/ImageOutputStream.javaPKK>mi <OSGI-OPT/src/javax/imageio/stream/ImageOutputStreamImpl.javaPKK>T< BOSGI-OPT/src/javax/imageio/stream/MemoryCacheImageInputStream.javaPKK> &dCOSGI-OPT/src/javax/imageio/stream/MemoryCacheImageOutputStream.javaPKIG@OSGI-OPT/src/javax/jws/PKK>>1 (^OSGI-OPT/src/javax/jws/HandlerChain.javaPKK>KL"OSGI-OPT/src/javax/jws/Oneway.javaPKK>%"%"OSGI-OPT/src/javax/jws/WebMethod.javaPKK> 5Qa$OSGI-OPT/src/javax/jws/WebParam.javaPKK>%%:OSGI-OPT/src/javax/jws/WebResult.javaPKK> $.W&OSGI-OPT/src/javax/jws/WebService.javaPKIG@4OSGI-OPT/src/javax/jws/soap/PKK>qE*OSGI-OPT/src/javax/jws/soap/InitParam.javaPKK>wt1,OSGI-OPT/src/javax/jws/soap/SOAPBinding.javaPKK>,}3OSGI-OPT/src/javax/jws/soap/SOAPMessageHandler.javaPKK>+E4OSGI-OPT/src/javax/jws/soap/SOAPMessageHandlers.javaPKIG@sOSGI-OPT/src/javax/lang/PKIG@OSGI-OPT/src/javax/lang/model/PKK> Dk+0 OSGI-OPT/src/javax/lang/model/SourceVersion.javaPKIG@&OSGI-OPT/src/javax/lang/model/element/PKK>;;OSGI-OPT/src/javax/lang/model/element/AnnotationMirror.javaPKK>AORQ:ROSGI-OPT/src/javax/lang/model/element/AnnotationValue.javaPKK>OO^~AOSGI-OPT/src/javax/lang/model/element/AnnotationValueVisitor.javaPKK>/ǜM2OSGI-OPT/src/javax/lang/model/element/Element.javaPKK>OT6OSGI-OPT/src/javax/lang/model/element/ElementKind.javaPKK>揍9:OSGI-OPT/src/javax/lang/model/element/ElementVisitor.javaPKK>Nzb'5s<OSGI-OPT/src/javax/lang/model/element/ExecutableElement.javaPKK>t*3VOSGI-OPT/src/javax/lang/model/element/Modifier.javaPKK>tC/OSGI-OPT/src/javax/lang/model/element/Name.javaPKK>F6OSGI-OPT/src/javax/lang/model/element/NestingKind.javaPKK>*B29SOSGI-OPT/src/javax/lang/model/element/PackageElement.javaPKK>.YL/6OSGI-OPT/src/javax/lang/model/element/TypeElement.javaPKK>|<o?OSGI-OPT/src/javax/lang/model/element/TypeParameterElement.javaPKK>OaJOSGI-OPT/src/javax/lang/model/element/UnknownAnnotationValueException.javaPKK>ayBOSGI-OPT/src/javax/lang/model/element/UnknownElementException.javaPKK><Ҭ:}OSGI-OPT/src/javax/lang/model/element/VariableElement.javaPKIG@#OSGI-OPT/src/javax/lang/model/type/PKK>1OSGI-OPT/src/javax/lang/model/type/ArrayType.javaPKK>#j4HOSGI-OPT/src/javax/lang/model/type/DeclaredType.javaPKK> 1OSGI-OPT/src/javax/lang/model/type/ErrorType.javaPKK>l, 6OSGI-OPT/src/javax/lang/model/type/ExecutableType.javaPKK> K+w=>OSGI-OPT/src/javax/lang/model/type/MirroredTypeException.javaPKK>.x>OSGI-OPT/src/javax/lang/model/type/MirroredTypesException.javaPKK>D. OSGI-OPT/src/javax/lang/model/type/NoType.javaPKK>WD20$OSGI-OPT/src/javax/lang/model/type/NullType.javaPKK>\5DOSGI-OPT/src/javax/lang/model/type/PrimitiveType.javaPKK>0kY5jOSGI-OPT/src/javax/lang/model/type/ReferenceType.javaPKK>/60OSGI-OPT/src/javax/lang/model/type/TypeKind.javaPKK>J2$OSGI-OPT/src/javax/lang/model/type/TypeMirror.javaPKK>f=|4OSGI-OPT/src/javax/lang/model/type/TypeVariable.javaPKK>XC3OSGI-OPT/src/javax/lang/model/type/TypeVisitor.javaPKK>^` <OSGI-OPT/src/javax/lang/model/type/UnknownTypeException.javaPKK>4|gL4OSGI-OPT/src/javax/lang/model/type/WildcardType.javaPKIG@#;OSGI-OPT/src/javax/lang/model/util/PKK>KGOSGI-OPT/src/javax/lang/model/util/AbstractAnnotationValueVisitor6.javaPKK>TTF?NOSGI-OPT/src/javax/lang/model/util/AbstractElementVisitor6.javaPKK>n!<OSGI-OPT/src/javax/lang/model/util/AbstractTypeVisitor6.javaPKK>F T 5 OSGI-OPT/src/javax/lang/model/util/ElementFilter.javaPKK>xٚZ ;p OSGI-OPT/src/javax/lang/model/util/ElementKindVisitor6.javaPKK>d27OSGI-OPT/src/javax/lang/model/util/ElementScanner6.javaPKK>4 90OSGI-OPT/src/javax/lang/model/util/Elements.javaPKK>EOSGI-OPT/src/javax/lang/model/util/SimpleAnnotationValueVisitor6.javaPKK>Ζ5=@OSGI-OPT/src/javax/lang/model/util/SimpleElementVisitor6.javaPKK>y]:AOSGI-OPT/src/javax/lang/model/util/SimpleTypeVisitor6.javaPKK>Z8m OSGI-OPT/src/javax/lang/model/util/TypeKindVisitor6.javaPKK>_/&p= -Z#OSGI-OPT/src/javax/lang/model/util/Types.javaPKIG@&OSGI-OPT/src/javax/management/PKK>>o},&OSGI-OPT/src/javax/management/Attribute.javaPKK>0G$kB>=)OSGI-OPT/src/javax/management/AttributeChangeNotification.javaPKK>*.oD,OSGI-OPT/src/javax/management/AttributeChangeNotificationFilter.javaPKK>0pPn0.OSGI-OPT/src/javax/management/AttributeList.javaPKK> V=1OSGI-OPT/src/javax/management/AttributeNotFoundException.javaPKK>-mV43OSGI-OPT/src/javax/management/AttributeValueExp.javaPKK>Lx!@6OSGI-OPT/src/javax/management/BadAttributeValueExpException.javaPKK>~hwd?8OSGI-OPT/src/javax/management/BadBinaryOpValueExpException.javaPKK>>B;OSGI-OPT/src/javax/management/BadStringOperationException.javaPKK>c"(":=OSGI-OPT/src/javax/management/DefaultLoaderRepository.javaPKK>;zQ-@OSGI-OPT/src/javax/management/Descriptor.javaPKK>;1W3BOSGI-OPT/src/javax/management/DescriptorAccess.javaPKK>3p 0DOSGI-OPT/src/javax/management/DescriptorKey.javaPKK>ѸN1^GOSGI-OPT/src/javax/management/DescriptorRead.javaPKK>76S/IOSGI-OPT/src/javax/management/DynamicMBean.javaPKK>ψ 6/LOSGI-OPT/src/javax/management/ImmutableDescriptor.javaPKK>U7bA5OOSGI-OPT/src/javax/management/InstanceAlreadyExistsException.javaPKK>%-}S<QOSGI-OPT/src/javax/management/InstanceNotFoundException.javaPKK>,j>J9SOSGI-OPT/src/javax/management/IntrospectionException.javaPKK>>VOSGI-OPT/src/javax/management/InvalidApplicationException.javaPKK>BCbA`XOSGI-OPT/src/javax/management/InvalidAttributeValueException.javaPKK>.ZOSGI-OPT/src/javax/management/JMException.javaPKK>*f45\OSGI-OPT/src/javax/management/JMRuntimeException.javaPKK>PS&_OSGI-OPT/src/javax/management/JMX.javaPKK> 9S<bOSGI-OPT/src/javax/management/ListenerNotFoundException.javaPKK>`iƊ5dOSGI-OPT/src/javax/management/MBeanAttributeInfo.javaPKK>!7VFZ7gOSGI-OPT/src/javax/management/MBeanConstructorInfo.javaPKK>p1jOSGI-OPT/src/javax/management/MBeanException.javaPKK>1q03lOSGI-OPT/src/javax/management/MBeanFeatureInfo.javaPKK>n L,ooOSGI-OPT/src/javax/management/MBeanInfo.javaPKK>XHC$8OrOSGI-OPT/src/javax/management/MBeanNotificationInfo.javaPKK>S2YA5tOSGI-OPT/src/javax/management/MBeanOperationInfo.javaPKK>U?,:5xOSGI-OPT/src/javax/management/MBeanParameterInfo.javaPKK>{ݗB2zOSGI-OPT/src/javax/management/MBeanPermission.javaPKK>^M 4C}OSGI-OPT/src/javax/management/MBeanRegistration.javaPKK>u9=OSGI-OPT/src/javax/management/MBeanRegistrationException.javaPKK>B(f.OSGI-OPT/src/javax/management/MBeanServer.javaPKK>ߩB5؆OSGI-OPT/src/javax/management/MBeanServerBuilder.javaPKK>:%;\8:OSGI-OPT/src/javax/management/MBeanServerConnection.javaPKK>6]OSGI-OPT/src/javax/management/MBeanServerDelegate.javaPKK>N;zOSGI-OPT/src/javax/management/MBeanServerDelegateMBean.javaPKK>/ipn5גOSGI-OPT/src/javax/management/MBeanServerFactory.javaPKK>NM?OSGI-OPT/src/javax/management/MBeanServerInvocationHandler.javaPKK>xY:OSGI-OPT/src/javax/management/MBeanServerNotification.javaPKK>̀T8[OSGI-OPT/src/javax/management/MBeanServerPermission.javaPKK>h/7OSGI-OPT/src/javax/management/MBeanTrustPermission.javaPKK>T0 )OSGI-OPT/src/javax/management/MXBean.javaPKK>>`\?xOSGI-OPT/src/javax/management/MalformedObjectNameException.javaPKK>MV=ˤOSGI-OPT/src/javax/management/NotCompliantMBeanException.javaPKK>ii>|/OSGI-OPT/src/javax/management/Notification.javaPKK>߯z:OSGI-OPT/src/javax/management/NotificationBroadcaster.javaPKK> TneAwOSGI-OPT/src/javax/management/NotificationBroadcasterSupport.javaPKK>ua6tOSGI-OPT/src/javax/management/NotificationEmitter.javaPKK>$5߱OSGI-OPT/src/javax/management/NotificationFilter.javaPKK>&-K<OSGI-OPT/src/javax/management/NotificationFilterSupport.javaPKK>X37OSGI-OPT/src/javax/management/NotificationListener.javaPKK>|Jv&1OSGI-OPT/src/javax/management/ObjectInstance.javaPKK>،! -}OSGI-OPT/src/javax/management/ObjectName.javaPKK>K96OSGI-OPT/src/javax/management/OperationsException.javaPKK>V2a|2-OSGI-OPT/src/javax/management/PersistentMBean.javaPKK>j5(rOSGI-OPT/src/javax/management/Query.javaPKK> ,OSGI-OPT/src/javax/management/QueryEval.javaPKK>8{*+>OSGI-OPT/src/javax/management/QueryExp.javaPKK>,6OSGI-OPT/src/javax/management/ReflectionException.javaPKK>s8OSGI-OPT/src/javax/management/RuntimeErrorException.javaPKK> 8OSGI-OPT/src/javax/management/RuntimeMBeanException.javaPKK>- =OSGI-OPT/src/javax/management/RuntimeOperationsException.javaPKK>tәP;SOSGI-OPT/src/javax/management/ServiceNotFoundException.javaPKK>cpϨ7OSGI-OPT/src/javax/management/StandardEmitterMBean.javaPKK>TQT0OSGI-OPT/src/javax/management/StandardMBean.javaPKK>IwE1OSGI-OPT/src/javax/management/StringValueExp.javaPKK>N 6?8+OSGI-OPT/src/javax/management/ValueExp.javaPKIG@&%OSGI-OPT/src/javax/management/loading/PKK>m_tS &@{OSGI-OPT/src/javax/management/loading/ClassLoaderRepository.javaPKK>Co-*BOSGI-OPT/src/javax/management/loading/DefaultLoaderRepository.javaPKK>mer /OSGI-OPT/src/javax/management/loading/MLet.javaPKK>@_6tOSGI-OPT/src/javax/management/loading/MLetContent.javaPKK>qMmr47OSGI-OPT/src/javax/management/loading/MLetMBean.javaPKK>>5=OSGI-OPT/src/javax/management/loading/PrivateClassLoader.javaPKK>x)6,OSGI-OPT/src/javax/management/loading/PrivateMLet.javaPKIG@)OSGI-OPT/src/javax/management/modelmbean/PKK>-:?OSGI-OPT/src/javax/management/modelmbean/DescriptorSupport.javaPKK>FNOSGI-OPT/src/javax/management/modelmbean/InvalidTargetObjectTypeException.javaPKK>NS8OSGI-OPT/src/javax/management/modelmbean/ModelMBean.javaPKK>cI E<OSGI-OPT/src/javax/management/modelmbean/ModelMBeanAttributeInfo.javaPKK> (sMG3OSGI-OPT/src/javax/management/modelmbean/ModelMBeanConstructorInfo.javaPKK>$$<OSGI-OPT/src/javax/management/modelmbean/ModelMBeanInfo.javaPKK>y DACOSGI-OPT/src/javax/management/modelmbean/ModelMBeanInfoSupport.javaPKK>`` RGO] OSGI-OPT/src/javax/management/modelmbean/ModelMBeanNotificationBroadcaster.javaPKK>oC>8H,OSGI-OPT/src/javax/management/modelmbean/ModelMBeanNotificationInfo.javaPKK>j+^eEEOSGI-OPT/src/javax/management/modelmbean/ModelMBeanOperationInfo.javaPKK>i @OSGI-OPT/src/javax/management/modelmbean/RequiredModelMBean.javaPKK>#?OSGI-OPT/src/javax/management/modelmbean/XMLParseException.javaPKIG@&ROSGI-OPT/src/javax/management/monitor/PKK><\ 9OSGI-OPT/src/javax/management/monitor/CounterMonitor.javaPKK>R{[>OSGI-OPT/src/javax/management/monitor/CounterMonitorMBean.javaPKK>(7!OSGI-OPT/src/javax/management/monitor/GaugeMonitor.javaPKK>-^k`<$OSGI-OPT/src/javax/management/monitor/GaugeMonitorMBean.javaPKK>l= 2'OSGI-OPT/src/javax/management/monitor/Monitor.javaPKK>GN&`F7+OSGI-OPT/src/javax/management/monitor/MonitorMBean.javaPKK>l /`>Q.OSGI-OPT/src/javax/management/monitor/MonitorNotification.javaPKK>:@TB1OSGI-OPT/src/javax/management/monitor/MonitorSettingException.javaPKK>y#8B4OSGI-OPT/src/javax/management/monitor/StringMonitor.javaPKK>:t,P=*7OSGI-OPT/src/javax/management/monitor/StringMonitorMBean.javaPKIG@(9OSGI-OPT/src/javax/management/openmbean/PKK>_9`6=:OSGI-OPT/src/javax/management/openmbean/ArrayType.javaPKK>ѕu38:]=OSGI-OPT/src/javax/management/openmbean/CompositeData.javaPKK> kABOSGI-OPT/src/javax/management/openmbean/CompositeDataSupport.javaPKK>G/>EOSGI-OPT/src/javax/management/openmbean/CompositeDataView.javaPKK>oxU:GOSGI-OPT/src/javax/management/openmbean/CompositeType.javaPKK>I@JOSGI-OPT/src/javax/management/openmbean/InvalidKeyException.javaPKK>j*XE,MOSGI-OPT/src/javax/management/openmbean/InvalidOpenTypeException.javaPKK>&G[FOOSGI-OPT/src/javax/management/openmbean/KeyAlreadyExistsException.javaPKK>K=>QOSGI-OPT/src/javax/management/openmbean/OpenDataException.javaPKK>9g5C;TOSGI-OPT/src/javax/management/openmbean/OpenMBeanAttributeInfo.javaPKK> JVOSGI-OPT/src/javax/management/openmbean/OpenMBeanAttributeInfoSupport.javaPKK>4aE+ZOSGI-OPT/src/javax/management/openmbean/OpenMBeanConstructorInfo.javaPKK>44L\OSGI-OPT/src/javax/management/openmbean/OpenMBeanConstructorInfoSupport.javaPKK>Se7H:e_OSGI-OPT/src/javax/management/openmbean/OpenMBeanInfo.javaPKK>׋TcAbOSGI-OPT/src/javax/management/openmbean/OpenMBeanInfoSupport.javaPKK>*G9 CdOSGI-OPT/src/javax/management/openmbean/OpenMBeanOperationInfo.javaPKK>Ew\JgOSGI-OPT/src/javax/management/openmbean/OpenMBeanOperationInfoSupport.javaPKK>.YCTjOSGI-OPT/src/javax/management/openmbean/OpenMBeanParameterInfo.javaPKK>Ǯ!= JmOSGI-OPT/src/javax/management/openmbean/OpenMBeanParameterInfoSupport.javaPKK>A5zpOSGI-OPT/src/javax/management/openmbean/OpenType.javaPKK>{J 7sOSGI-OPT/src/javax/management/openmbean/SimpleType.javaPKK>E̓8wOSGI-OPT/src/javax/management/openmbean/TabularData.javaPKK>7C8  ?tzOSGI-OPT/src/javax/management/openmbean/TabularDataSupport.javaPKK>1>و8}OSGI-OPT/src/javax/management/openmbean/TabularType.javaPKIG@'܀OSGI-OPT/src/javax/management/relation/PKK>fF3OSGI-OPT/src/javax/management/relation/InvalidRelationIdException.javaPKK>q`uKOSGI-OPT/src/javax/management/relation/InvalidRelationServiceException.javaPKK>:lHOSGI-OPT/src/javax/management/relation/InvalidRelationTypeException.javaPKK>WwU`DGOSGI-OPT/src/javax/management/relation/InvalidRoleInfoException.javaPKK>k@cEOSGI-OPT/src/javax/management/relation/InvalidRoleValueException.javaPKK>}s,IOSGI-OPT/src/javax/management/relation/MBeanServerNotificationFilter.javaPKK>mB 4OSGI-OPT/src/javax/management/relation/Relation.javaPKK>?<=ܒOSGI-OPT/src/javax/management/relation/RelationException.javaPKK>wO[EcE#OSGI-OPT/src/javax/management/relation/RelationNotFoundException.javaPKK>oG @zOSGI-OPT/src/javax/management/relation/RelationNotification.javaPKK>;ښOSGI-OPT/src/javax/management/relation/RelationService.javaPKK>p˝\@>OSGI-OPT/src/javax/management/relation/RelationServiceMBean.javaPKK>)fQOSGI-OPT/src/javax/management/relation/RelationServiceNotRegisteredException.javaPKK>˙C;sOSGI-OPT/src/javax/management/relation/RelationSupport.javaPKK>|#\@aOSGI-OPT/src/javax/management/relation/RelationSupportMBean.javaPKK>X8OSGI-OPT/src/javax/management/relation/RelationType.javaPKK>oI;OSGI-OPT/src/javax/management/relation/RelationTypeNotFoundException.javaPKK>]]?OSGI-OPT/src/javax/management/relation/RelationTypeSupport.javaPKK>?0cOSGI-OPT/src/javax/management/relation/Role.javaPKK>-|4OSGI-OPT/src/javax/management/relation/RoleInfo.javaPKK>+cE0OSGI-OPT/src/javax/management/relation/RoleInfoNotFoundException.javaPKK>Ti4OSGI-OPT/src/javax/management/relation/RoleList.javaPKK>a =WATOSGI-OPT/src/javax/management/relation/RoleNotFoundException.javaPKK>`?6OSGI-OPT/src/javax/management/relation/RoleResult.javaPKK>a6(OSGI-OPT/src/javax/management/relation/RoleStatus.javaPKK>«Q:OSGI-OPT/src/javax/management/relation/RoleUnresolved.javaPKK>8r>OSGI-OPT/src/javax/management/relation/RoleUnresolvedList.javaPKIG@%OSGI-OPT/src/javax/management/remote/PKK>5e8OSGI-OPT/src/javax/management/remote/JMXAddressable.javaPKK>|n`: OSGI-OPT/src/javax/management/remote/JMXAuthenticator.javaPKK>wjCPOSGI-OPT/src/javax/management/remote/JMXConnectionNotification.javaPKK>qX868OSGI-OPT/src/javax/management/remote/JMXConnector.javaPKK>/=>OSGI-OPT/src/javax/management/remote/JMXConnectorFactory.javaPKK>>hhk>^OSGI-OPT/src/javax/management/remote/JMXConnectorProvider.javaPKK>S<OSGI-OPT/src/javax/management/remote/JMXConnectorServer.javaPKK>JHtPCNOSGI-OPT/src/javax/management/remote/JMXConnectorServerFactory.javaPKK>QAOSGI-OPT/src/javax/management/remote/JMXConnectorServerMBean.javaPKK>ˍRDDOSGI-OPT/src/javax/management/remote/JMXConnectorServerProvider.javaPKK>Q[W6OSGI-OPT/src/javax/management/remote/JMXPrincipal.javaPKK>{2>$OSGI-OPT/src/javax/management/remote/JMXProviderException.javaPKK>f{2AOSGI-OPT/src/javax/management/remote/JMXServerErrorException.javaPKK>?7OSGI-OPT/src/javax/management/remote/JMXServiceURL.javaPKK>BS>}OSGI-OPT/src/javax/management/remote/MBeanServerForwarder.javaPKK>M#<OSGI-OPT/src/javax/management/remote/NotificationResult.javaPKK>15 ETOSGI-OPT/src/javax/management/remote/SubjectDelegationPermission.javaPKK>Tu>OSGI-OPT/src/javax/management/remote/TargetedNotification.javaPKIG@)>OSGI-OPT/src/javax/management/remote/rmi/PKK>tlV(;OSGI-OPT/src/javax/management/remote/rmi/RMIConnection.javaPKK>&|b?(OSGI-OPT/src/javax/management/remote/rmi/RMIConnectionImpl.javaPKK>4ZjD-OSGI-OPT/src/javax/management/remote/rmi/RMIConnectionImpl_Stub.javaPKK>{Pe: OSGI-OPT/src/javax/management/remote/rmi/RMIConnector.javaPKK>Bތ@AOSGI-OPT/src/javax/management/remote/rmi/RMIConnectorServer.javaPKK> ?OSGI-OPT/src/javax/management/remote/rmi/RMIIIOPServerImpl.javaPKK>x{?xOSGI-OPT/src/javax/management/remote/rmi/RMIJRMPServerImpl.javaPKK>~7OSGI-OPT/src/javax/management/remote/rmi/RMIServer.javaPKK>;OSGI-OPT/src/javax/management/remote/rmi/RMIServerImpl.javaPKK>$<{;3@DOSGI-OPT/src/javax/management/remote/rmi/RMIServerImpl_Stub.javaPKK>e<D OSGI-OPT/src/javax/management/remote/rmi/_RMIConnectionImpl_Tie.javaPKK>W_fA#OSGI-OPT/src/javax/management/remote/rmi/_RMIConnection_Stub.javaPKK>MĆ4@(OSGI-OPT/src/javax/management/remote/rmi/_RMIServerImpl_Tie.javaPKK>CN^86=+OSGI-OPT/src/javax/management/remote/rmi/_RMIServer_Stub.javaPKIG@$R.OSGI-OPT/src/javax/management/timer/PKK>4 ..OSGI-OPT/src/javax/management/timer/Timer.javaPKK>L-32OSGI-OPT/src/javax/management/timer/TimerMBean.javaPKK>aR" : 6OSGI-OPT/src/javax/management/timer/TimerNotification.javaPKIG@8OSGI-OPT/src/javax/naming/PKK>I68OSGI-OPT/src/javax/naming/AuthenticationException.javaPKK>Q6mB#;OSGI-OPT/src/javax/naming/AuthenticationNotSupportedException.javaPKK>ݔ@,|=OSGI-OPT/src/javax/naming/BinaryRefAddr.javaPKK>H$.&?OSGI-OPT/src/javax/naming/Binding.javaPKK>5Vj5fBOSGI-OPT/src/javax/naming/CannotProceedException.javaPKK>'>53EOSGI-OPT/src/javax/naming/CommunicationException.javaPKK>eR,qGOSGI-OPT/src/javax/naming/CompositeName.javaPKK>b+JOSGI-OPT/src/javax/naming/CompoundName.javaPKK>5>5NOSGI-OPT/src/javax/naming/ConfigurationException.javaPKK>f&RPOSGI-OPT/src/javax/naming/Context.javaPKK>`RD7TOSGI-OPT/src/javax/naming/ContextNotEmptyException.javaPKK>b -WOSGI-OPT/src/javax/naming/InitialContext.javaPKK>q˒V=ZOSGI-OPT/src/javax/naming/InsufficientResourcesException.javaPKK>P J9F]OSGI-OPT/src/javax/naming/InterruptedNamingException.javaPKK>ل483_OSGI-OPT/src/javax/naming/InvalidNameException.javaPKK>>5aOSGI-OPT/src/javax/naming/LimitExceededException.javaPKK>M,dOSGI-OPT/src/javax/naming/LinkException.javaPKK>L-0fOSGI-OPT/src/javax/naming/LinkLoopException.javaPKK>G]&hOSGI-OPT/src/javax/naming/LinkRef.javaPKK>?B<5FkOSGI-OPT/src/javax/naming/MalformedLinkException.javaPKK>p#mOSGI-OPT/src/javax/naming/Name.javaPKK>G8pOSGI-OPT/src/javax/naming/NameAlreadyBoundException.javaPKK>+y4,rOSGI-OPT/src/javax/naming/NameClassPair.javaPKK> E 'iuOSGI-OPT/src/javax/naming/NameImpl.javaPKK>J;4hxOSGI-OPT/src/javax/naming/NameNotFoundException.javaPKK>c5)zOSGI-OPT/src/javax/naming/NameParser.javaPKK>7ĹXu0|OSGI-OPT/src/javax/naming/NamingEnumeration.javaPKK>9.OSGI-OPT/src/javax/naming/NamingException.javaPKK>~\J6OSGI-OPT/src/javax/naming/NamingSecurityException.javaPKK>~G8>OSGI-OPT/src/javax/naming/NoInitialContextException.javaPKK>7WOC4OSGI-OPT/src/javax/naming/NoPermissionException.javaPKK>]I52OSGI-OPT/src/javax/naming/NotContextException.javaPKK>CV=OSGI-OPT/src/javax/naming/OperationNotSupportedException.javaPKK>'l(>5BOSGI-OPT/src/javax/naming/PartialResultException.javaPKK>R$ &OSGI-OPT/src/javax/naming/RefAddr.javaPKK>:(OSGI-OPT/src/javax/naming/Reference.javaPKK>gY.90OSGI-OPT/src/javax/naming/ReferralException.javaPKK>hyM:OSGI-OPT/src/javax/naming/ServiceUnavailableException.javaPKK>lQ9OSGI-OPT/src/javax/naming/SizeLimitExceededException.javaPKK>D9m,&OSGI-OPT/src/javax/naming/StringRefAddr.javaPKK>r8Q9wOSGI-OPT/src/javax/naming/TimeLimitExceededException.javaPKIG@$OSGI-OPT/src/javax/naming/directory/PKK>f#02OSGI-OPT/src/javax/naming/directory/Attribute.javaPKK>1rK@$OSGI-OPT/src/javax/naming/directory/AttributeInUseException.javaPKK>@vGrOSGI-OPT/src/javax/naming/directory/AttributeModificationException.javaPKK>Ծ3^I3OSGI-OPT/src/javax/naming/directory/Attributes.javaPKK>5IG 7OSGI-OPT/src/javax/naming/directory/BasicAttribute.javaPKK>qo8OSGI-OPT/src/javax/naming/directory/BasicAttributes.javaPKK>1%3OSGI-OPT/src/javax/naming/directory/DirContext.javaPKK>) DX:wOSGI-OPT/src/javax/naming/directory/InitialDirContext.javaPKK>oL#OSGI-OPT/src/javax/naming/directory/InvalidAttributeIdentifierException.javaPKK>s`GOSGI-OPT/src/javax/naming/directory/InvalidAttributeValueException.javaPKK>nTC߿OSGI-OPT/src/javax/naming/directory/InvalidAttributesException.javaPKK>뷓`G3OSGI-OPT/src/javax/naming/directory/InvalidSearchControlsException.javaPKK>"iZEOSGI-OPT/src/javax/naming/directory/InvalidSearchFilterException.javaPKK>;U9OSGI-OPT/src/javax/naming/directory/ModificationItem.javaPKK>NAVOSGI-OPT/src/javax/naming/directory/NoSuchAttributeException.javaPKK>NAOSGI-OPT/src/javax/naming/directory/SchemaViolationException.javaPKK>dp>7OSGI-OPT/src/javax/naming/directory/SearchControls.javaPKK> J5OSGI-OPT/src/javax/naming/directory/SearchResult.javaPKIG@ OSGI-OPT/src/javax/naming/event/PKK>WEQ1OSGI-OPT/src/javax/naming/event/EventContext.javaPKK>bB=64OSGI-OPT/src/javax/naming/event/EventDirContext.javaPKK>hfl<eOSGI-OPT/src/javax/naming/event/NamespaceChangeListener.javaPKK>60OSGI-OPT/src/javax/naming/event/NamingEvent.javaPKK>;;*89OSGI-OPT/src/javax/naming/event/NamingExceptionEvent.javaPKK>R]%3\OSGI-OPT/src/javax/naming/event/NamingListener.javaPKK>Lq $9OSGI-OPT/src/javax/naming/event/ObjectChangeListener.javaPKIG@OSGI-OPT/src/javax/naming/ldap/PKK>4[&8A0*OSGI-OPT/src/javax/naming/ldap/BasicControl.javaPKK>MxT,|+OSGI-OPT/src/javax/naming/ldap/Control.javaPKK> u&-2/OSGI-OPT/src/javax/naming/ldap/ControlFactory.javaPKK>g3OSGI-OPT/src/javax/naming/ldap/ExtendedRequest.javaPKK>43OSGI-OPT/src/javax/naming/ldap/ExtendedResponse.javaPKK>}/~OSGI-OPT/src/javax/naming/ldap/HasControls.javaPKK>6OSGI-OPT/src/javax/naming/ldap/InitialLdapContext.javaPKK>,vf/OSGI-OPT/src/javax/naming/ldap/LdapContext.javaPKK>I8 ,TOSGI-OPT/src/javax/naming/ldap/LdapName.javaPKK>#9OSGI-OPT/src/javax/naming/ldap/LdapReferralException.javaPKK>$ &.9POSGI-OPT/src/javax/naming/ldap/ManageReferralControl.javaPKK> IP7OSGI-OPT/src/javax/naming/ldap/PagedResultsControl.javaPKK>?8f8?OSGI-OPT/src/javax/naming/ldap/PagedResultsResponseControl.javaPKK>E~'fOSGI-OPT/src/javax/naming/ldap/Rdn.javaPKK>s<^G/9 OSGI-OPT/src/javax/naming/ldap/SortControl.javaPKK>x!C[+ OSGI-OPT/src/javax/naming/ldap/SortKey.javaPKK>9{~7>OSGI-OPT/src/javax/naming/ldap/SortResponseControl.javaPKK>7Z[3!OSGI-OPT/src/javax/naming/ldap/StartTlsRequest.javaPKK>KCrS4OSGI-OPT/src/javax/naming/ldap/StartTlsResponse.javaPKK>\q^;OSGI-OPT/src/javax/naming/ldap/UnsolicitedNotification.javaPKK>o]!@AOSGI-OPT/src/javax/naming/ldap/UnsolicitedNotificationEvent.javaPKK>4hۓECOSGI-OPT/src/javax/naming/ldap/UnsolicitedNotificationListener.javaPKIG@) OSGI-OPT/src/javax/naming/spi/PKK>Eo3w OSGI-OPT/src/javax/naming/spi/DirObjectFactory.javaPKK>3`2"OSGI-OPT/src/javax/naming/spi/DirStateFactory.javaPKK>U>3%OSGI-OPT/src/javax/naming/spi/DirectoryManager.javaPKK>Ba3+8(OSGI-OPT/src/javax/naming/spi/InitialContextFactory.javaPKK>(N? +OSGI-OPT/src/javax/naming/spi/InitialContextFactoryBuilder.javaPKK> 0j-OSGI-OPT/src/javax/naming/spi/NamingManager.javaPKK>=`00OSGI-OPT/src/javax/naming/spi/ObjectFactory.javaPKK> =M73OSGI-OPT/src/javax/naming/spi/ObjectFactoryBuilder.javaPKK>WC0p5OSGI-OPT/src/javax/naming/spi/ResolveResult.javaPKK>+%8OSGI-OPT/src/javax/naming/spi/Resolver.javaPKK>M8e/~:OSGI-OPT/src/javax/naming/spi/StateFactory.javaPKIG@<OSGI-OPT/src/javax/net/PKK>Dl1/#=OSGI-OPT/src/javax/net/ServerSocketFactory.javaPKK>Iv>k)?OSGI-OPT/src/javax/net/SocketFactory.javaPKIG@FBOSGI-OPT/src/javax/net/ssl/PKK>{p>BOSGI-OPT/src/javax/net/ssl/CertPathTrustManagerParameters.javaPKK>g%7DOSGI-OPT/src/javax/net/ssl/HandshakeCompletedEvent.javaPKK>ɬȍ':GOSGI-OPT/src/javax/net/ssl/HandshakeCompletedListener.javaPKK>09JOSGI-OPT/src/javax/net/ssl/HostnameVerifier.javaPKK> 92oLOSGI-OPT/src/javax/net/ssl/HttpsURLConnection.javaPKK>59*OOSGI-OPT/src/javax/net/ssl/KeyManager.javaPKK>b=G1QOSGI-OPT/src/javax/net/ssl/KeyManagerFactory.javaPKK>CMoJ|4TOSGI-OPT/src/javax/net/ssl/KeyManagerFactorySpi.javaPKK>@ 9\WOSGI-OPT/src/javax/net/ssl/KeyStoreBuilderParameters.javaPKK>'dl8YOSGI-OPT/src/javax/net/ssl/ManagerFactoryParameters.javaPKK>^S *[OSGI-OPT/src/javax/net/ssl/SSLContext.javaPKK>!:7-M_OSGI-OPT/src/javax/net/ssl/SSLContextSpi.javaPKK>ʭ&i )BbOSGI-OPT/src/javax/net/ssl/SSLEngine.javaPKK>X_m/fOSGI-OPT/src/javax/net/ssl/SSLEngineResult.javaPKK>e%{,hOSGI-OPT/src/javax/net/ssl/SSLException.javaPKK>ק95 kOSGI-OPT/src/javax/net/ssl/SSLHandshakeException.javaPKK>U -/YmOSGI-OPT/src/javax/net/ssl/SSLKeyException.javaPKK>9k5-oOSGI-OPT/src/javax/net/ssl/SSLParameters.javaPKK>mC:*rOSGI-OPT/src/javax/net/ssl/SSLPeerUnverifiedException.javaPKK>[!-~tOSGI-OPT/src/javax/net/ssl/SSLPermission.javaPKK>W74vOSGI-OPT/src/javax/net/ssl/SSLProtocolException.javaPKK>oT5/yOSGI-OPT/src/javax/net/ssl/SSLServerSocket.javaPKK>)6|OSGI-OPT/src/javax/net/ssl/SSLServerSocketFactory.javaPKK>rm*}~OSGI-OPT/src/javax/net/ssl/SSLSession.javaPKK>Q6OSGI-OPT/src/javax/net/ssl/SSLSessionBindingEvent.javaPKK>"w\9OSGI-OPT/src/javax/net/ssl/SSLSessionBindingListener.javaPKK>S1eOSGI-OPT/src/javax/net/ssl/SSLSessionContext.javaPKK>k )ʈOSGI-OPT/src/javax/net/ssl/SSLSocket.javaPKK>h FN0#OSGI-OPT/src/javax/net/ssl/SSLSocketFactory.javaPKK>R^p,ǎOSGI-OPT/src/javax/net/ssl/TrustManager.javaPKK>J(_3ҐOSGI-OPT/src/javax/net/ssl/TrustManagerFactory.javaPKK>U-&6ГOSGI-OPT/src/javax/net/ssl/TrustManagerFactorySpi.javaPKK>Aq]3C6aOSGI-OPT/src/javax/net/ssl/X509ExtendedKeyManager.javaPKK>UC.OSGI-OPT/src/javax/net/ssl/X509KeyManager.javaPKK>1#,0OSGI-OPT/src/javax/net/ssl/X509TrustManager.javaPKIG@OSGI-OPT/src/javax/print/PKK>Rq!0aOSGI-OPT/src/javax/print/AttributeException.javaPKK> 0OSGI-OPT/src/javax/print/CancelablePrintJob.javaPKK><!ϢOSGI-OPT/src/javax/print/Doc.javaPKK>믈7#'1OSGI-OPT/src/javax/print/DocFlavor.javaPKK>}M >+)$OSGI-OPT/src/javax/print/DocPrintJob.javaPKK>(4z-OSGI-OPT/src/javax/print/FlavorException.javaPKK>wF&ͮOSGI-OPT/src/javax/print/MultiDoc.javaPKK>HT.OSGI-OPT/src/javax/print/MultiDocPrintJob.javaPKK>ĝ82=OSGI-OPT/src/javax/print/MultiDocPrintService.javaPKK>f,mOSGI-OPT/src/javax/print/PrintException.javaPKK>Md *OSGI-OPT/src/javax/print/PrintService.javaPKK>Xo0޺OSGI-OPT/src/javax/print/PrintServiceLookup.javaPKK>-p$'OSGI-OPT/src/javax/print/ServiceUI.javaPKK>};.$OSGI-OPT/src/javax/print/ServiceUIFactory.javaPKK>u!wK'OSGI-OPT/src/javax/print/SimpleDoc.javaPKK>4)'0OSGI-OPT/src/javax/print/StreamPrintService.javaPKK>"9]7"OSGI-OPT/src/javax/print/StreamPrintServiceFactory.javaPKK>Dw*OSGI-OPT/src/javax/print/URIException.javaPKIG@#OSGI-OPT/src/javax/print/attribute/PKK>V=1lOSGI-OPT/src/javax/print/attribute/Attribute.javaPKK>^ }=4OSGI-OPT/src/javax/print/attribute/AttributeSet.javaPKK>|Nw =SOSGI-OPT/src/javax/print/attribute/AttributeSetUtilities.javaPKK>C^6|OSGI-OPT/src/javax/print/attribute/DateTimeSyntax.javaPKK>vx4OSGI-OPT/src/javax/print/attribute/DocAttribute.javaPKK>Xļ7OSGI-OPT/src/javax/print/attribute/DocAttributeSet.javaPKK>T.)W2!OSGI-OPT/src/javax/print/attribute/EnumSyntax.javaPKK>-ʏ8OSGI-OPT/src/javax/print/attribute/HashAttributeSet.javaPKK>~a:;OSGI-OPT/src/javax/print/attribute/HashDocAttributeSet.javaPKK>g@-OSGI-OPT/src/javax/print/attribute/HashPrintJobAttributeSet.javaPKK>VDOSGI-OPT/src/javax/print/attribute/HashPrintRequestAttributeSet.javaPKK>n5jDOSGI-OPT/src/javax/print/attribute/HashPrintServiceAttributeSet.javaPKK>a.u5vOSGI-OPT/src/javax/print/attribute/IntegerSyntax.javaPKK>Xh9OSGI-OPT/src/javax/print/attribute/PrintJobAttribute.javaPKK><OSGI-OPT/src/javax/print/attribute/PrintJobAttributeSet.javaPKK>*=.OSGI-OPT/src/javax/print/attribute/PrintRequestAttribute.javaPKK>@XOSGI-OPT/src/javax/print/attribute/PrintRequestAttributeSet.javaPKK>(9=OSGI-OPT/src/javax/print/attribute/PrintServiceAttribute.javaPKK>z@OSGI-OPT/src/javax/print/attribute/PrintServiceAttributeSet.javaPKK>N~|I8OSGI-OPT/src/javax/print/attribute/ResolutionSyntax.javaPKK>{KVE:OSGI-OPT/src/javax/print/attribute/SetOfIntegerSyntax.javaPKK>r4oOSGI-OPT/src/javax/print/attribute/Size2DSyntax.javaPKK>In@COSGI-OPT/src/javax/print/attribute/SupportedValuesAttribute.javaPKK>52sOSGI-OPT/src/javax/print/attribute/TextSyntax.javaPKK>_N1OSGI-OPT/src/javax/print/attribute/URISyntax.javaPKK>lUK@G OSGI-OPT/src/javax/print/attribute/UnmodifiableSetException.javaPKIG@, OSGI-OPT/src/javax/print/attribute/standard/PKK>=e= OSGI-OPT/src/javax/print/attribute/standard/Chromaticity.javaPKK>X?OSGI-OPT/src/javax/print/attribute/standard/ColorSupported.javaPKK>hQٯgo<OSGI-OPT/src/javax/print/attribute/standard/Compression.javaPKK>q 07XOSGI-OPT/src/javax/print/attribute/standard/Copies.javaPKK>lyB^@OSGI-OPT/src/javax/print/attribute/standard/CopiesSupported.javaPKK>x1$DOSGI-OPT/src/javax/print/attribute/standard/DateTimeAtCompleted.javaPKK>H0"C@OSGI-OPT/src/javax/print/attribute/standard/DateTimeAtCreation.javaPKK>.ѽ2&EOSGI-OPT/src/javax/print/attribute/standard/DateTimeAtProcessing.javaPKK>ݻ[68<"OSGI-OPT/src/javax/print/attribute/standard/Destination.javaPKK>e<A=&%OSGI-OPT/src/javax/print/attribute/standard/DocumentName.javaPKK>1QV`9'OSGI-OPT/src/javax/print/attribute/standard/Fidelity.javaPKK>^te ;*OSGI-OPT/src/javax/print/attribute/standard/Finishings.javaPKK>*<C=-OSGI-OPT/src/javax/print/attribute/standard/JobHoldUntil.javaPKK>i4-?0OSGI-OPT/src/javax/print/attribute/standard/JobImpressions.javaPKK>i0H?3OSGI-OPT/src/javax/print/attribute/standard/JobImpressionsCompleted.javaPKK>^6A/H5OSGI-OPT/src/javax/print/attribute/standard/JobImpressionsSupported.javaPKK>&4%;8OSGI-OPT/src/javax/print/attribute/standard/JobKOctets.javaPKK>gY. D9;OSGI-OPT/src/javax/print/attribute/standard/JobKOctetsProcessed.javaPKK>N_N@'D=OSGI-OPT/src/javax/print/attribute/standard/JobKOctetsSupported.javaPKK>w5'?@OSGI-OPT/src/javax/print/attribute/standard/JobMediaSheets.javaPKK>9`2H-COSGI-OPT/src/javax/print/attribute/standard/JobMediaSheetsCompleted.javaPKK>C/HEOSGI-OPT/src/javax/print/attribute/standard/JobMediaSheetsSupported.javaPKK>o[UGZGHOSGI-OPT/src/javax/print/attribute/standard/JobMessageFromOperator.javaPKK>Ei8JKOSGI-OPT/src/javax/print/attribute/standard/JobName.javaPKK>zGZGMOSGI-OPT/src/javax/print/attribute/standard/JobOriginatingUserName.javaPKK>P2'<POSGI-OPT/src/javax/print/attribute/standard/JobPriority.javaPKK>T3EMSOSGI-OPT/src/javax/print/attribute/standard/JobPrioritySupported.javaPKK>79g9XOSGI-OPT/src/javax/print/attribute/standard/JobState.javaPKK>o?[OSGI-OPT/src/javax/print/attribute/standard/JobStateReason.javaPKK>h`[!@`OSGI-OPT/src/javax/print/attribute/standard/JobStateReasons.javaPKK> 9<6bOSGI-OPT/src/javax/print/attribute/standard/Media.javaPKK>h7:eOSGI-OPT/src/javax/print/attribute/standard/MediaName.javaPKK>Ӡ:C"hOSGI-OPT/src/javax/print/attribute/standard/MediaPrintableArea.javaPKK>q8U-:3kOSGI-OPT/src/javax/print/attribute/standard/MediaSize.javaPKK>RT=!>cqOSGI-OPT/src/javax/print/attribute/standard/MediaSizeName.javaPKK>!YJ:#vOSGI-OPT/src/javax/print/attribute/standard/MediaTray.javaPKK>'IxOSGI-OPT/src/javax/print/attribute/standard/MultipleDocumentHandling.javaPKK>pF0B{OSGI-OPT/src/javax/print/attribute/standard/NumberOfDocuments.javaPKK>z1H~OSGI-OPT/src/javax/print/attribute/standard/NumberOfInterveningJobs.javaPKK>3yg8E9:OSGI-OPT/src/javax/print/attribute/standard/NumberUp.javaPKK>+RJIBكOSGI-OPT/src/javax/print/attribute/standard/NumberUpSupported.javaPKK>#y}7EOSGI-OPT/src/javax/print/attribute/standard/OrientationRequested.javaPKK>czHVEOSGI-OPT/src/javax/print/attribute/standard/OutputDeviceAssigned.javaPKK>J]E=OSGI-OPT/src/javax/print/attribute/standard/PDLOverrideSupported.javaPKK>A#W; OSGI-OPT/src/javax/print/attribute/standard/PageRanges.javaPKK>Z<.?͑OSGI-OPT/src/javax/print/attribute/standard/PagesPerMinute.javaPKK>o:?2DhOSGI-OPT/src/javax/print/attribute/standard/PagesPerMinuteColor.javaPKK>Ot\F OSGI-OPT/src/javax/print/attribute/standard/PresentationDirection.javaPKK>f>kd==OSGI-OPT/src/javax/print/attribute/standard/PrintQuality.javaPKK>[h*BH<OSGI-OPT/src/javax/print/attribute/standard/PrinterInfo.javaPKK>9cGOSGI-OPT/src/javax/print/attribute/standard/PrinterIsAcceptingJobs.javaPKK>gb:=AP@OSGI-OPT/src/javax/print/attribute/standard/PrinterLocation.javaPKK> 2HXDFOSGI-OPT/src/javax/print/attribute/standard/PrinterMakeAndModel.javaPKK>JfKOSGI-OPT/src/javax/print/attribute/standard/PrinterMessageFromOperator.javaPKK>5p)1@êOSGI-OPT/src/javax/print/attribute/standard/PrinterMoreInfo.javaPKK>8/LbOSGI-OPT/src/javax/print/attribute/standard/PrinterMoreInfoManufacturer.javaPKK>=hAH<OSGI-OPT/src/javax/print/attribute/standard/PrinterName.javaPKK>+)@nBOSGI-OPT/src/javax/print/attribute/standard/PrinterResolution.javaPKK>Go=oOSGI-OPT/src/javax/print/attribute/standard/PrinterState.javaPKK> zCIOSGI-OPT/src/javax/print/attribute/standard/PrinterStateReason.javaPKK>uyDOSGI-OPT/src/javax/print/attribute/standard/PrinterStateReasons.javaPKK>b- ;rOSGI-OPT/src/javax/print/attribute/standard/PrinterURI.javaPKK>*0?OSGI-OPT/src/javax/print/attribute/standard/QueuedJobCount.javaPKK>f\MOSGI-OPT/src/javax/print/attribute/standard/ReferenceUriSchemesSupported.javaPKK>݀ BVCOSGI-OPT/src/javax/print/attribute/standard/RequestingUserName.javaPKK>x)%V9YOSGI-OPT/src/javax/print/attribute/standard/Severity.javaPKK>X%_=OSGI-OPT/src/javax/print/attribute/standard/SheetCollate.javaPKK>(A6OSGI-OPT/src/javax/print/attribute/standard/Sides.javaPKIG@OSGI-OPT/src/javax/print/event/PKK>j,.OSGI-OPT/src/javax/print/event/PrintEvent.javaPKK>jbK3ZOSGI-OPT/src/javax/print/event/PrintJobAdapter.javaPKK>v :OSGI-OPT/src/javax/print/event/PrintJobAttributeEvent.javaPKK>Q7 =ROSGI-OPT/src/javax/print/event/PrintJobAttributeListener.javaPKK> ]uv1OSGI-OPT/src/javax/print/event/PrintJobEvent.javaPKK>rKGE4dOSGI-OPT/src/javax/print/event/PrintJobListener.javaPKK>_>OSGI-OPT/src/javax/print/event/PrintServiceAttributeEvent.javaPKK>G/jAFOSGI-OPT/src/javax/print/event/PrintServiceAttributeListener.javaPKIG@OSGI-OPT/src/javax/rmi/PKIG@OSGI-OPT/src/javax/rmi/CORBA/PKK>\8}>+OSGI-OPT/src/javax/rmi/CORBA/ClassDesc.javaPKK>b!X>BOSGI-OPT/src/javax/rmi/CORBA/PortableRemoteObjectDelegate.javaPKK>i=e&OSGI-OPT/src/javax/rmi/CORBA/Stub.javaPKK>d)dJ.4OSGI-OPT/src/javax/rmi/CORBA/StubDelegate.javaPKK>B%OSGI-OPT/src/javax/rmi/CORBA/Tie.javaPKK>L_ &KOSGI-OPT/src/javax/rmi/CORBA/Util.javaPKK>if.OSGI-OPT/src/javax/rmi/CORBA/UtilDelegate.javaPKK>e.=OSGI-OPT/src/javax/rmi/CORBA/ValueHandler.javaPKK>z n9OSGI-OPT/src/javax/rmi/CORBA/ValueHandlerMultiFormat.javaPKK>w֣$;0wOSGI-OPT/src/javax/rmi/PortableRemoteObject.javaPKIG@OSGI-OPT/src/javax/rmi/ssl/PKK>9[OSGI-OPT/src/javax/rmi/ssl/SslRMIClientSocketFactory.javaPKK>Tpf[9OSGI-OPT/src/javax/rmi/ssl/SslRMIServerSocketFactory.javaPKIG@OSGI-OPT/src/javax/script/PKK>?~C3OSGI-OPT/src/javax/script/AbstractScriptEngine.javaPKK>ii ' OSGI-OPT/src/javax/script/Bindings.javaPKK>Uxp)& OSGI-OPT/src/javax/script/Compilable.javaPKK>D@-`OSGI-OPT/src/javax/script/CompiledScript.javaPKK>.c"g(OSGI-OPT/src/javax/script/Invocable.javaPKK>},KOSGI-OPT/src/javax/script/ScriptContext.javaPKK>8+"OSGI-OPT/src/javax/script/ScriptEngine.javaPKK>ƢS+27OSGI-OPT/src/javax/script/ScriptEngineFactory.javaPKK>1U.p2OSGI-OPT/src/javax/script/ScriptEngineManager.javaPKK>nz.OSGI-OPT/src/javax/script/ScriptException.javaPKK>&4!u-/"OSGI-OPT/src/javax/script/SimpleBindings.javaPKK>ne2!%OSGI-OPT/src/javax/script/SimpleScriptContext.javaPKIG@1(OSGI-OPT/src/javax/security/PKIG@!}(OSGI-OPT/src/javax/security/auth/PKK>/hZ4(OSGI-OPT/src/javax/security/auth/AuthPermission.javaPKK>18<<%+OSGI-OPT/src/javax/security/auth/DestroyFailedException.javaPKK>*c?1n-OSGI-OPT/src/javax/security/auth/Destroyable.javaPKK>3;*,/OSGI-OPT/src/javax/security/auth/Policy.javaPKK>URQAA2OSGI-OPT/src/javax/security/auth/PrivateCredentialPermission.javaPKK>S<<5OSGI-OPT/src/javax/security/auth/RefreshFailedException.javaPKK>uT01J7OSGI-OPT/src/javax/security/auth/Refreshable.javaPKK>x*|-9OSGI-OPT/src/javax/security/auth/Subject.javaPKK>o+N ;<OSGI-OPT/src/javax/security/auth/SubjectDomainCombiner.javaPKIG@*;?OSGI-OPT/src/javax/security/auth/callback/PKK>7?OSGI-OPT/src/javax/security/auth/callback/Callback.javaPKK>W>AOSGI-OPT/src/javax/security/auth/callback/CallbackHandler.javaPKK>ic= DOSGI-OPT/src/javax/security/auth/callback/ChoiceCallback.javaPKK>`CFOSGI-OPT/src/javax/security/auth/callback/ConfirmationCallback.javaPKK>`?JOSGI-OPT/src/javax/security/auth/callback/LanguageCallback.javaPKK>}mS;LOSGI-OPT/src/javax/security/auth/callback/NameCallback.javaPKK>Wx8(?OOSGI-OPT/src/javax/security/auth/callback/PasswordCallback.javaPKK>ڣb@QOSGI-OPT/src/javax/security/auth/callback/TextInputCallback.javaPKK>eXV ="ACTOSGI-OPT/src/javax/security/auth/callback/TextOutputCallback.javaPKK>IߓKVOSGI-OPT/src/javax/security/auth/callback/UnsupportedCallbackException.javaPKIG@*lYOSGI-OPT/src/javax/security/auth/kerberos/PKK>UCYOSGI-OPT/src/javax/security/auth/kerberos/DelegationPermission.javaPKK> :F\OSGI-OPT/src/javax/security/auth/kerberos/KerberosKey.javaPKK>Rj@v_OSGI-OPT/src/javax/security/auth/kerberos/KerberosPrincipal.javaPKK>ձX6 =NbOSGI-OPT/src/javax/security/auth/kerberos/KerberosTicket.javaPKK>ϲF]@eOSGI-OPT/src/javax/security/auth/kerberos/ServicePermission.javaPKIG@'hOSGI-OPT/src/javax/security/auth/login/PKK>5E<hOSGI-OPT/src/javax/security/auth/login/AccountException.javaPKK>lI^\CEkOSGI-OPT/src/javax/security/auth/login/AccountExpiredException.javaPKK>n%PYBmOSGI-OPT/src/javax/security/auth/login/AccountLockedException.javaPKK>8<_DoOSGI-OPT/src/javax/security/auth/login/AccountNotFoundException.javaPKK>}'AKrOSGI-OPT/src/javax/security/auth/login/AppConfigurationEntry.javaPKK>]㯢9nuOSGI-OPT/src/javax/security/auth/login/Configuration.javaPKK>/<wxOSGI-OPT/src/javax/security/auth/login/ConfigurationSpi.javaPKK>4N?zOSGI-OPT/src/javax/security/auth/login/CredentialException.javaPKK>9A hF8}OSGI-OPT/src/javax/security/auth/login/CredentialExpiredException.javaPKK>J^kGOSGI-OPT/src/javax/security/auth/login/CredentialNotFoundException.javaPKK>c0Q@OSGI-OPT/src/javax/security/auth/login/FailedLoginException.javaPKK>PC8COSGI-OPT/src/javax/security/auth/login/LoginContext.javaPKK>I' =:OSGI-OPT/src/javax/security/auth/login/LoginException.javaPKIG@%7OSGI-OPT/src/javax/security/auth/spi/PKK>;4}5OSGI-OPT/src/javax/security/auth/spi/LoginModule.javaPKIG@&#OSGI-OPT/src/javax/security/auth/x500/PKK>t8yOSGI-OPT/src/javax/security/auth/x500/X500Principal.javaPKK>3L@SOSGI-OPT/src/javax/security/auth/x500/X500PrivateCredential.javaPKIG@! OSGI-OPT/src/javax/security/cert/PKK>R1^OSGI-OPT/src/javax/security/cert/Certificate.javaPKK>[cBOSGI-OPT/src/javax/security/cert/CertificateEncodingException.javaPKK>`,I6:cOSGI-OPT/src/javax/security/cert/CertificateException.javaPKK>x`AOSGI-OPT/src/javax/security/cert/CertificateExpiredException.javaPKK>b~lEOSGI-OPT/src/javax/security/cert/CertificateNotYetValidException.javaPKK>g`AROSGI-OPT/src/javax/security/cert/CertificateParsingException.javaPKK>_j05OSGI-OPT/src/javax/security/cert/X509Certificate.javaPKIG@!ͣOSGI-OPT/src/javax/security/sasl/PKK> '=OSGI-OPT/src/javax/security/sasl/AuthenticationException.javaPKK>yW<7yOSGI-OPT/src/javax/security/sasl/AuthorizeCallback.javaPKK>3OSGI-OPT/src/javax/security/sasl/RealmCallback.javaPKK>g 9vOSGI-OPT/src/javax/security/sasl/RealmChoiceCallback.javaPKK>|<& *OSGI-OPT/src/javax/security/sasl/Sasl.javaPKK>N0OSGI-OPT/src/javax/security/sasl/SaslClient.javaPKK>/45!7OSGI-OPT/src/javax/security/sasl/SaslClientFactory.javaPKK>h*m31OSGI-OPT/src/javax/security/sasl/SaslException.javaPKK>IK0{OSGI-OPT/src/javax/security/sasl/SaslServer.javaPKK>y5/7$OSGI-OPT/src/javax/security/sasl/SaslServerFactory.javaPKIG@OSGI-OPT/src/javax/sound/PKIG@OSGI-OPT/src/javax/sound/midi/PKK>j 3:OOSGI-OPT/src/javax/sound/midi/ControllerEventListener.javaPKK>,-OSGI-OPT/src/javax/sound/midi/Instrument.javaPKK>v?; OSGI-OPT/src/javax/sound/midi/InvalidMidiDataException.javaPKK>n% 4fOSGI-OPT/src/javax/sound/midi/MetaEventListener.javaPKK>B^Z[.OSGI-OPT/src/javax/sound/midi/MetaMessage.javaPKK>[*f~ -%OSGI-OPT/src/javax/sound/midi/MidiDevice.javaPKK>&d,YOSGI-OPT/src/javax/sound/midi/MidiEvent.javaPKK>~0 1OSGI-OPT/src/javax/sound/midi/MidiFileFormat.javaPKK>iP<.OSGI-OPT/src/javax/sound/midi/MidiMessage.javaPKK>"-D-aOSGI-OPT/src/javax/sound/midi/MidiSystem.javaPKK>e?;OSGI-OPT/src/javax/sound/midi/MidiUnavailableException.javaPKK>Z(EOSGI-OPT/src/javax/sound/midi/Patch.javaPKK>p`+vOSGI-OPT/src/javax/sound/midi/Receiver.javaPKK>k+OSGI-OPT/src/javax/sound/midi/Sequence.javaPKK>KO/ ,OSGI-OPT/src/javax/sound/midi/Sequencer.javaPKK>fK~c/LOSGI-OPT/src/javax/sound/midi/ShortMessage.javaPKK> , OSGI-OPT/src/javax/sound/midi/Soundbank.javaPKK>hz"4rOSGI-OPT/src/javax/sound/midi/SoundbankResource.javaPKK>,K.OSGI-OPT/src/javax/sound/midi/Synthesizer.javaPKK> ߫t/OSGI-OPT/src/javax/sound/midi/SysexMessage.javaPKK><51*(OSGI-OPT/src/javax/sound/midi/Track.javaPKK> @L!..OSGI-OPT/src/javax/sound/midi/Transmitter.javaPKK>&oF.bOSGI-OPT/src/javax/sound/midi/VoiceStatus.javaPKIG@"OSGI-OPT/src/javax/sound/midi/spi/PKK>f=79OSGI-OPT/src/javax/sound/midi/spi/MidiDeviceProvider.javaPKK>s .w5jOSGI-OPT/src/javax/sound/midi/spi/MidiFileReader.javaPKK>6H5OSGI-OPT/src/javax/sound/midi/spi/MidiFileWriter.javaPKK>76OSGI-OPT/src/javax/sound/midi/spi/SoundbankReader.javaPKIG@! OSGI-OPT/src/javax/sound/sampled/PKK>^ջ 5l OSGI-OPT/src/javax/sound/sampled/AudioFileFormat.javaPKK>ؖ5T# 1OSGI-OPT/src/javax/sound/sampled/AudioFormat.javaPKK>\R6lOSGI-OPT/src/javax/sound/sampled/AudioInputStream.javaPKK>vwP5"OSGI-OPT/src/javax/sound/sampled/AudioPermission.javaPKK>7Y1{OSGI-OPT/src/javax/sound/sampled/AudioSystem.javaPKK>(#4OSGI-OPT/src/javax/sound/sampled/BooleanControl.javaPKK>];y*OSGI-OPT/src/javax/sound/sampled/Clip.javaPKK>T4j5i!OSGI-OPT/src/javax/sound/sampled/CompoundControl.javaPKK>m47-$OSGI-OPT/src/javax/sound/sampled/Control.javaPKK>HO-.&OSGI-OPT/src/javax/sound/sampled/DataLine.javaPKK>DR\f1)OSGI-OPT/src/javax/sound/sampled/EnumControl.javaPKK>r. 3 2y,OSGI-OPT/src/javax/sound/sampled/FloatControl.javaPKK>Z* 0OSGI-OPT/src/javax/sound/sampled/Line.javaPKK>Z=/2OSGI-OPT/src/javax/sound/sampled/LineEvent.javaPKK> 25OSGI-OPT/src/javax/sound/sampled/LineListener.javaPKK>Q_ B>8OSGI-OPT/src/javax/sound/sampled/LineUnavailableException.javaPKK> n+f:OSGI-OPT/src/javax/sound/sampled/Mixer.javaPKK>? 4*=OSGI-OPT/src/javax/sound/sampled/Port.javaPKK>>=B`"0@OSGI-OPT/src/javax/sound/sampled/ReverbType.javaPKK>FN 4{COSGI-OPT/src/javax/sound/sampled/SourceDataLine.javaPKK>J) 4EOSGI-OPT/src/javax/sound/sampled/TargetDataLine.javaPKK>6|QCRHOSGI-OPT/src/javax/sound/sampled/UnsupportedAudioFileException.javaPKIG@%JOSGI-OPT/src/javax/sound/sampled/spi/PKK>On.9JOSGI-OPT/src/javax/sound/sampled/spi/AudioFileReader.javaPKK>rk\9MOSGI-OPT/src/javax/sound/sampled/spi/AudioFileWriter.javaPKK>%6`BSPOSGI-OPT/src/javax/sound/sampled/spi/FormatConversionProvider.javaPKK>^ 7#SOSGI-OPT/src/javax/sound/sampled/spi/MixerProvider.javaPKIG@UOSGI-OPT/src/javax/sql/PKK>+9r,UOSGI-OPT/src/javax/sql/CommonDataSource.javaPKK>% +0XOSGI-OPT/src/javax/sql/ConnectionEvent.javaPKK>SQ3ZOSGI-OPT/src/javax/sql/ConnectionEventListener.javaPKK>LGk4\OSGI-OPT/src/javax/sql/ConnectionPoolDataSource.javaPKK>}&:_OSGI-OPT/src/javax/sql/DataSource.javaPKK>c L,aOSGI-OPT/src/javax/sql/PooledConnection.javaPKK>AnD&"cOSGI-OPT/src/javax/sql/RowSet.javaPKK>.*'iOSGI-OPT/src/javax/sql/RowSetEvent.javaPKK>Wd*kOSGI-OPT/src/javax/sql/RowSetInternal.javaPKK>ֺ_*"nOSGI-OPT/src/javax/sql/RowSetListener.javaPKK>~r*`pOSGI-OPT/src/javax/sql/RowSetMetaData.javaPKK>1(*sOSGI-OPT/src/javax/sql/RowSetReader.javaPKK>8(WuOSGI-OPT/src/javax/sql/RowSetWriter.javaPKK>@l|&i*wOSGI-OPT/src/javax/sql/StatementEvent.javaPKK>"LL2zOSGI-OPT/src/javax/sql/StatementEventListener.javaPKK>d~!(I|OSGI-OPT/src/javax/sql/XAConnection.javaPKK>u(~OSGI-OPT/src/javax/sql/XADataSource.javaPKIG@рOSGI-OPT/src/javax/sql/rowset/PKK>oy0-OSGI-OPT/src/javax/sql/rowset/BaseRowSet.javaPKK>7Jx /OSGI-OPT/src/javax/sql/rowset/CachedRowSet.javaPKK>OS1OSGI-OPT/src/javax/sql/rowset/FilteredRowSet.javaPKK><)-FOSGI-OPT/src/javax/sql/rowset/JdbcRowSet.javaPKK>*&>y-ʐOSGI-OPT/src/javax/sql/rowset/JoinRowSet.javaPKK>O}c+OSGI-OPT/src/javax/sql/rowset/Joinable.javaPKK>w,gOSGI-OPT/src/javax/sql/rowset/Predicate.javaPKK>_^5OSGI-OPT/src/javax/sql/rowset/RowSetMetaDataImpl.javaPKK>ۮJ0yOSGI-OPT/src/javax/sql/rowset/RowSetWarning.javaPKK>&W,OSGI-OPT/src/javax/sql/rowset/WebRowSet.javaPKIG@%ݡOSGI-OPT/src/javax/sql/rowset/serial/PKK>t61 62OSGI-OPT/src/javax/sql/rowset/serial/SQLInputImpl.javaPKK>Tu 7ǥOSGI-OPT/src/javax/sql/rowset/serial/SQLOutputImpl.javaPKK>$' 50OSGI-OPT/src/javax/sql/rowset/serial/SerialArray.javaPKK>R4%OSGI-OPT/src/javax/sql/rowset/serial/SerialBlob.javaPKK>(,6κ4 OSGI-OPT/src/javax/sql/rowset/serial/SerialClob.javaPKK>1k?8<OSGI-OPT/src/javax/sql/rowset/serial/SerialDatalink.javaPKK>l<-9OSGI-OPT/src/javax/sql/rowset/serial/SerialException.javaPKK>] ):OSGI-OPT/src/javax/sql/rowset/serial/SerialJavaObject.javaPKK>H@L 3wOSGI-OPT/src/javax/sql/rowset/serial/SerialRef.javaPKK>ο"P6$OSGI-OPT/src/javax/sql/rowset/serial/SerialStruct.javaPKIG@"ؾOSGI-OPT/src/javax/sql/rowset/spi/PKK>u;&2*OSGI-OPT/src/javax/sql/rowset/spi/SyncFactory.javaPKK>"|9;VOSGI-OPT/src/javax/sql/rowset/spi/SyncFactoryException.javaPKK> ׾3OSGI-OPT/src/javax/sql/rowset/spi/SyncProvider.javaPKK>+A<OSGI-OPT/src/javax/sql/rowset/spi/SyncProviderException.javaPKK>Jysu38OSGI-OPT/src/javax/sql/rowset/spi/SyncResolver.javaPKK>0: OSGI-OPT/src/javax/sql/rowset/spi/TransactionalWriter.javaPKK>mt\80iOSGI-OPT/src/javax/sql/rowset/spi/XmlReader.javaPKK>Ɇ90OSGI-OPT/src/javax/sql/rowset/spi/XmlWriter.javaPKIG@OSGI-OPT/src/javax/swing/PKK>G,MOSGI-OPT/src/javax/swing/AbstractAction.javaPKK>Ez$,TOSGI-OPT/src/javax/swing/AbstractButton.javaPKK>J~0yOSGI-OPT/src/javax/swing/AbstractCellEditor.javaPKK>U/dOSGI-OPT/src/javax/swing/AbstractListModel.javaPKK>9 V2HOSGI-OPT/src/javax/swing/AbstractSpinnerModel.javaPKK>Aw\ 0$OSGI-OPT/src/javax/swing/Action.javaPKK>{>']OSGI-OPT/src/javax/swing/ActionMap.javaPKK>&D4 +OSGI-OPT/src/javax/swing/BorderFactory.javaPKK> R?/AOSGI-OPT/src/javax/swing/BoundedRangeModel.javaPKK>?!OSGI-OPT/src/javax/swing/Box.javaPKK>DMu'OSGI-OPT/src/javax/swing/BoxLayout.javaPKK>CNU^m)OSGI-OPT/src/javax/swing/ButtonGroup.javaPKK>So)OSGI-OPT/src/javax/swing/ButtonModel.javaPKK> (~OSGI-OPT/src/javax/swing/CellEditor.javaPKK>w`b.OSGI-OPT/src/javax/swing/CellRendererPane.javaPKK>B  ,OSGI-OPT/src/javax/swing/ComboBoxEditor.javaPKK>#+OSGI-OPT/src/javax/swing/ComboBoxModel.javaPKK>XJ/N OSGI-OPT/src/javax/swing/ComponentInputMap.javaPKK>]4a+ OSGI-OPT/src/javax/swing/DebugGraphics.javaPKK>EJ6OSGI-OPT/src/javax/swing/DefaultBoundedRangeModel.javaPKK>4 E 0bOSGI-OPT/src/javax/swing/DefaultButtonModel.javaPKK>ʛh /pOSGI-OPT/src/javax/swing/DefaultCellEditor.javaPKK>p625OSGI-OPT/src/javax/swing/DefaultComboBoxModel.javaPKK>{:G@ 3OSGI-OPT/src/javax/swing/DefaultDesktopManager.javaPKK>Mq%1[!OSGI-OPT/src/javax/swing/DefaultFocusManager.javaPKK>PUg5#OSGI-OPT/src/javax/swing/DefaultListCellRenderer.javaPKK> ] .&OSGI-OPT/src/javax/swing/DefaultListModel.javaPKK>)Ei 7*OSGI-OPT/src/javax/swing/DefaultListSelectionModel.javaPKK>\ .-OSGI-OPT/src/javax/swing/DefaultRowSorter.javaPKK>e91OSGI-OPT/src/javax/swing/DefaultSingleSelectionModel.javaPKK>l ]J8,4OSGI-OPT/src/javax/swing/DesktopManager.javaPKK>Z0&7OSGI-OPT/src/javax/swing/DropMode.javaPKK>Yp*9OSGI-OPT/src/javax/swing/FocusManager.javaPKK>5&(s<OSGI-OPT/src/javax/swing/GrayFilter.javaPKK>̘)>OSGI-OPT/src/javax/swing/GroupLayout.javaPKK>.V:T*"DOSGI-OPT/src/javax/swing/Icon.javaPKK>  'QFOSGI-OPT/src/javax/swing/ImageIcon.javaPKK>mC&(JOSGI-OPT/src/javax/swing/InputMap.javaPKK>Cb+LOSGI-OPT/src/javax/swing/InputVerifier.javaPKK>?OOSGI-OPT/src/javax/swing/InternalFrameFocusTraversalPolicy.javaPKK><\%~QOSGI-OPT/src/javax/swing/JApplet.javaPKK>aJ%TOSGI-OPT/src/javax/swing/JButton.javaPKK>`t'QWOSGI-OPT/src/javax/swing/JCheckBox.javaPKK>)fi^/9ZOSGI-OPT/src/javax/swing/JCheckBoxMenuItem.javaPKK>˕9 +\OSGI-OPT/src/javax/swing/JColorChooser.javaPKK>bS'`OSGI-OPT/src/javax/swing/JComboBox.javaPKK>ߙ.'!(8gOSGI-OPT/src/javax/swing/JComponent.javaPKK>*LoOSGI-OPT/src/javax/swing/JDesktopPane.javaPKK>Pz~<%^rOSGI-OPT/src/javax/swing/JDialog.javaPKK>ӂ)vOSGI-OPT/src/javax/swing/JEditorPane.javaPKK>%Ӧ*x{OSGI-OPT/src/javax/swing/JFileChooser.javaPKK>)Rh 1VOSGI-OPT/src/javax/swing/JFormattedTextField.javaPKK>e $SOSGI-OPT/src/javax/swing/JFrame.javaPKK>&5~),*OSGI-OPT/src/javax/swing/JInternalFrame.javaPKK>#N( $OSGI-OPT/src/javax/swing/JLabel.javaPKK>o *OSGI-OPT/src/javax/swing/JLayeredPane.javaPKK>1!"#ژOSGI-OPT/src/javax/swing/JList.javaPKK>ߒZ#OSGI-OPT/src/javax/swing/JMenu.javaPKK>m4TM &%OSGI-OPT/src/javax/swing/JMenuBar.javaPKK>v$ 'OSGI-OPT/src/javax/swing/JMenuItem.javaPKK> S6#)OSGI-OPT/src/javax/swing/JOptionPane.javaPKK>-C?$"OSGI-OPT/src/javax/swing/JPanel.javaPKK>|_",OSGI-OPT/src/javax/swing/JPasswordField.javaPKK>>RŇ(lOSGI-OPT/src/javax/swing/JPopupMenu.javaPKK>j#rc *IOSGI-OPT/src/javax/swing/JProgressBar.javaPKK>5W*KOSGI-OPT/src/javax/swing/JRadioButton.javaPKK>N9.92OSGI-OPT/src/javax/swing/JRadioButtonMenuItem.javaPKK>'qOSGI-OPT/src/javax/swing/JRootPane.javaPKK>,z (OSGI-OPT/src/javax/swing/JScrollBar.javaPKK>s{8)_OSGI-OPT/src/javax/swing/JScrollPane.javaPKK>8.1@(OSGI-OPT/src/javax/swing/JSeparator.javaPKK>5/%OOSGI-OPT/src/javax/swing/JSlider.javaPKK>Bz&OSGI-OPT/src/javax/swing/JSpinner.javaPKK>v|k@):OSGI-OPT/src/javax/swing/JTabbedPane.javaPKK>[A0 N$|OSGI-OPT/src/javax/swing/JTable.javaPKK>J )'OSGI-OPT/src/javax/swing/JTextArea.javaPKK>Lp (BOSGI-OPT/src/javax/swing/JTextField.javaPKK>WV'OSGI-OPT/src/javax/swing/JTextPane.javaPKK>k}@+OSGI-OPT/src/javax/swing/JToggleButton.javaPKK>}p*L &OSGI-OPT/src/javax/swing/JToolBar.javaPKK>(g}c>&OSGI-OPT/src/javax/swing/JToolTip.javaPKK>1D AF#! OSGI-OPT/src/javax/swing/JTree.javaPKK>^3 'OSGI-OPT/src/javax/swing/JViewport.javaPKK>" %>OSGI-OPT/src/javax/swing/JWindow.javaPKK>f5ls'OSGI-OPT/src/javax/swing/KeyStroke.javaPKK>S*6_58{"OSGI-OPT/src/javax/swing/LayoutFocusTraversalPolicy.javaPKK>=MYhv<.x'OSGI-OPT/src/javax/swing/ListCellRenderer.javaPKK>Eys')OSGI-OPT/src/javax/swing/ListModel.javaPKK>(0 ,OSGI-OPT/src/javax/swing/ListSelectionModel.javaPKK>p@Lg )/OSGI-OPT/src/javax/swing/LookAndFeel.javaPKK>D@"')2OSGI-OPT/src/javax/swing/MenuElement.javaPKK>2>5OSGI-OPT/src/javax/swing/MenuSelectionManager.javaPKK>)2[8OSGI-OPT/src/javax/swing/MutableComboBoxModel.javaPKK>hYU+:OSGI-OPT/src/javax/swing/OverlayLayout.javaPKK>|/J#=OSGI-OPT/src/javax/swing/Popup.javaPKK>ߔH*?OSGI-OPT/src/javax/swing/PopupFactory.javaPKK>$y( -;BOSGI-OPT/src/javax/swing/ProgressMonitor.javaPKK>ۼ8SFOSGI-OPT/src/javax/swing/ProgressMonitorInputStream.javaPKK>&HOSGI-OPT/src/javax/swing/Renderer.javaPKK>f,KOSGI-OPT/src/javax/swing/RepaintManager.javaPKK>f /ANOSGI-OPT/src/javax/swing/RootPaneContainer.javaPKK>U}&'POSGI-OPT/src/javax/swing/RowFilter.javaPKK>c'SOSGI-OPT/src/javax/swing/RowSorter.javaPKK>OtM1>WOSGI-OPT/src/javax/swing/ScrollPaneConstants.javaPKK>.n .ZZOSGI-OPT/src/javax/swing/ScrollPaneLayout.javaPKK>%(>^OSGI-OPT/src/javax/swing/Scrollable.javaPKK>H%k2`OSGI-OPT/src/javax/swing/SingleSelectionModel.javaPKK>ȁt. cOSGI-OPT/src/javax/swing/SizeRequirements.javaPKK>XH*eOSGI-OPT/src/javax/swing/SizeSequence.javaPKK>um'`hOSGI-OPT/src/javax/swing/SortOrder.javaPKK>5E 9ujOSGI-OPT/src/javax/swing/SortingFocusTraversalPolicy.javaPKK>dq.pmOSGI-OPT/src/javax/swing/SpinnerDateModel.javaPKK>gb9.=pOSGI-OPT/src/javax/swing/SpinnerListModel.javaPKK>H*rOSGI-OPT/src/javax/swing/SpinnerModel.javaPKK>t0+uOSGI-OPT/src/javax/swing/SpinnerNumberModel.javaPKK><"}$xOSGI-OPT/src/javax/swing/Spring.javaPKK>-y *zOSGI-OPT/src/javax/swing/SpringLayout.javaPKK>12N,~OSGI-OPT/src/javax/swing/SwingConstants.javaPKK>[і,zOSGI-OPT/src/javax/swing/SwingUtilities.javaPKK>qPjOM)jOSGI-OPT/src/javax/swing/SwingWorker.javaPKK>e%u#OSGI-OPT/src/javax/swing/Timer.javaPKK>Io,OOSGI-OPT/src/javax/swing/ToolTipManager.javaPKK>#GS -OSGI-OPT/src/javax/swing/TransferHandler.javaPKK>N (OSGI-OPT/src/javax/swing/UIDefaults.javaPKK>rx'dOSGI-OPT/src/javax/swing/UIManager.javaPKK>|w =OSGI-OPT/src/javax/swing/UnsupportedLookAndFeelException.javaPKK> C,OSGI-OPT/src/javax/swing/ViewportLayout.javaPKK>!@/m-OSGI-OPT/src/javax/swing/WindowConstants.javaPKIG@ OSGI-OPT/src/javax/swing/border/PKK>,o38OSGI-OPT/src/javax/swing/border/AbstractBorder.javaPKK>I0+OSGI-OPT/src/javax/swing/border/BevelBorder.javaPKK>YԷt+FOSGI-OPT/src/javax/swing/border/Border.javaPKK>ڳ L3OSGI-OPT/src/javax/swing/border/CompoundBorder.javaPKK>W'0OSGI-OPT/src/javax/swing/border/EmptyBorder.javaPKK>Ca1OSGI-OPT/src/javax/swing/border/EtchedBorder.javaPKK>EW /UOSGI-OPT/src/javax/swing/border/LineBorder.javaPKK>UdG0 OSGI-OPT/src/javax/swing/border/MatteBorder.javaPKK>v:Y4OSGI-OPT/src/javax/swing/border/SoftBevelBorder.javaPKK>δv 1OSGI-OPT/src/javax/swing/border/TitledBorder.javaPKIG@&OSGI-OPT/src/javax/swing/colorchooser/PKK>טZD;OSGI-OPT/src/javax/swing/colorchooser/AbstractColorChooserPanel.javaPKK>$n1G0OSGI-OPT/src/javax/swing/colorchooser/ColorChooserComponentFactory.javaPKK>>OSGI-OPT/src/javax/swing/colorchooser/ColorSelectionModel.javaPKK>=nqE?OSGI-OPT/src/javax/swing/colorchooser/DefaultColorSelectionModel.javaPKIG@ OSGI-OPT/src/javax/swing/event/PKK>LU1oOSGI-OPT/src/javax/swing/event/AncestorEvent.javaPKK>b4#OSGI-OPT/src/javax/swing/event/AncestorListener.javaPKK>i?g.mOSGI-OPT/src/javax/swing/event/CaretEvent.javaPKK>s6f1OSGI-OPT/src/javax/swing/event/CaretListener.javaPKK>R6OSGI-OPT/src/javax/swing/event/CellEditorListener.javaPKK>9;]f!/IOSGI-OPT/src/javax/swing/event/ChangeEvent.javaPKK>]t2OSGI-OPT/src/javax/swing/event/ChangeListener.javaPKK>FH1OSGI-OPT/src/javax/swing/event/DocumentEvent.javaPKK>"a4OSGI-OPT/src/javax/swing/event/DocumentListener.javaPKK>>P5OSGI-OPT/src/javax/swing/event/EventListenerList.javaPKK>):2OSGI-OPT/src/javax/swing/event/HyperlinkEvent.javaPKK>G5OSGI-OPT/src/javax/swing/event/HyperlinkListener.javaPKK>\8:OSGI-OPT/src/javax/swing/event/InternalFrameAdapter.javaPKK>3Bt6OSGI-OPT/src/javax/swing/event/InternalFrameEvent.javaPKK> S9OSGI-OPT/src/javax/swing/event/InternalFrameListener.javaPKK> E>1OSGI-OPT/src/javax/swing/event/ListDataEvent.javaPKK>j&4OSGI-OPT/src/javax/swing/event/ListDataListener.javaPKK>|S(6OSGI-OPT/src/javax/swing/event/ListSelectionEvent.javaPKK>;9zOSGI-OPT/src/javax/swing/event/ListSelectionListener.javaPKK>D܄l6OSGI-OPT/src/javax/swing/event/MenuDragMouseEvent.javaPKK>L9OSGI-OPT/src/javax/swing/event/MenuDragMouseListener.javaPKK>R9-OSGI-OPT/src/javax/swing/event/MenuEvent.javaPKK>,GK0%OSGI-OPT/src/javax/swing/event/MenuKeyEvent.javaPKK> 4&3OSGI-OPT/src/javax/swing/event/MenuKeyListener.javaPKK>ם{0 OSGI-OPT/src/javax/swing/event/MenuListener.javaPKK>65\ OSGI-OPT/src/javax/swing/event/MouseInputAdapter.javaPKK>Q,6 OSGI-OPT/src/javax/swing/event/MouseInputListener.javaPKK> *R'2OSGI-OPT/src/javax/swing/event/PopupMenuEvent.javaPKK>v5OSGI-OPT/src/javax/swing/event/PopupMenuListener.javaPKK>H%j2sOSGI-OPT/src/javax/swing/event/RowSorterEvent.javaPKK>mJ5=OSGI-OPT/src/javax/swing/event/RowSorterListener.javaPKK>&R>}OSGI-OPT/src/javax/swing/event/SwingPropertyChangeSupport.javaPKK>Ex#9OSGI-OPT/src/javax/swing/event/TableColumnModelEvent.javaPKK>  0<OSGI-OPT/src/javax/swing/event/TableColumnModelListener.javaPKK>IČ3 OSGI-OPT/src/javax/swing/event/TableModelEvent.javaPKK>'/6#OSGI-OPT/src/javax/swing/event/TableModelListener.javaPKK>W f6.&OSGI-OPT/src/javax/swing/event/TreeExpansionEvent.javaPKK>_W~_9(OSGI-OPT/src/javax/swing/event/TreeExpansionListener.javaPKK>!?V`32*OSGI-OPT/src/javax/swing/event/TreeModelEvent.javaPKK>5-OSGI-OPT/src/javax/swing/event/TreeModelListener.javaPKK>F60OSGI-OPT/src/javax/swing/event/TreeSelectionEvent.javaPKK>q,I=93OSGI-OPT/src/javax/swing/event/TreeSelectionListener.javaPKK>o:H5OSGI-OPT/src/javax/swing/event/TreeWillExpandListener.javaPKK>057OSGI-OPT/src/javax/swing/event/UndoableEditEvent.javaPKK>e%8:OSGI-OPT/src/javax/swing/event/UndoableEditListener.javaPKIG@%W<OSGI-OPT/src/javax/swing/filechooser/PKK>ASB4<OSGI-OPT/src/javax/swing/filechooser/FileFilter.javaPKK>=e %A>OSGI-OPT/src/javax/swing/filechooser/FileNameExtensionFilter.javaPKK>$ 8AOSGI-OPT/src/javax/swing/filechooser/FileSystemView.javaPKK>ӫH2DOSGI-OPT/src/javax/swing/filechooser/FileView.javaPKIG@nGOSGI-OPT/src/javax/swing/plaf/PKK>KIx!6GOSGI-OPT/src/javax/swing/plaf/ActionMapUIResource.javaPKK>X]'3IOSGI-OPT/src/javax/swing/plaf/BorderUIResource.javaPKK>L+*NOSGI-OPT/src/javax/swing/plaf/ButtonUI.javaPKK>q1PPOSGI-OPT/src/javax/swing/plaf/ColorChooserUI.javaPKK>Nŷ2ROSGI-OPT/src/javax/swing/plaf/ColorUIResource.javaPKK>B 9 -TOSGI-OPT/src/javax/swing/plaf/ComboBoxUI.javaPKK>N{>eWOSGI-OPT/src/javax/swing/plaf/ComponentInputMapUIResource.javaPKK>LJM>.YOSGI-OPT/src/javax/swing/plaf/ComponentUI.javaPKK>0\OSGI-OPT/src/javax/swing/plaf/DesktopIconUI.javaPKK>R=0^OSGI-OPT/src/javax/swing/plaf/DesktopPaneUI.javaPKK>l06$aOSGI-OPT/src/javax/swing/plaf/DimensionUIResource.javaPKK>t%Z0hcOSGI-OPT/src/javax/swing/plaf/FileChooserUI.javaPKK>dN1 fOSGI-OPT/src/javax/swing/plaf/FontUIResource.javaPKK> ^+1hOSGI-OPT/src/javax/swing/plaf/IconUIResource.javaPKK>A9K5(kOSGI-OPT/src/javax/swing/plaf/InputMapUIResource.javaPKK>{O3^mOSGI-OPT/src/javax/swing/plaf/InsetsUIResource.javaPKK>+2oOSGI-OPT/src/javax/swing/plaf/InternalFrameUI.javaPKK>|8X*qOSGI-OPT/src/javax/swing/plaf/LabelUI.javaPKK>o4+)tOSGI-OPT/src/javax/swing/plaf/ListUI.javaPKK>Yګ,tvOSGI-OPT/src/javax/swing/plaf/MenuBarUI.javaPKK> -xOSGI-OPT/src/javax/swing/plaf/MenuItemUI.javaPKK>2/zOSGI-OPT/src/javax/swing/plaf/OptionPaneUI.javaPKK> *&}OSGI-OPT/src/javax/swing/plaf/PanelUI.javaPKK>,fF.JOSGI-OPT/src/javax/swing/plaf/PopupMenuUI.javaPKK>̓0ŁOSGI-OPT/src/javax/swing/plaf/ProgressBarUI.javaPKK>u/5>-OSGI-OPT/src/javax/swing/plaf/RootPaneUI.javaPKK>{.OSGI-OPT/src/javax/swing/plaf/ScrollBarUI.javaPKK>M//IOSGI-OPT/src/javax/swing/plaf/ScrollPaneUI.javaPKK>r H.vOSGI-OPT/src/javax/swing/plaf/SeparatorUI.javaPKK>1e+OSGI-OPT/src/javax/swing/plaf/SliderUI.javaPKK>·q,ǎOSGI-OPT/src/javax/swing/plaf/SpinnerUI.javaPKK><B.OSGI-OPT/src/javax/swing/plaf/SplitPaneUI.javaPKK>/OSGI-OPT/src/javax/swing/plaf/TabbedPaneUI.javaPKK>0OSGI-OPT/src/javax/swing/plaf/TableHeaderUI.javaPKK>^Kk*4OSGI-OPT/src/javax/swing/plaf/TableUI.javaPKK>K&')WOSGI-OPT/src/javax/swing/plaf/TextUI.javaPKK>4 ,jOSGI-OPT/src/javax/swing/plaf/ToolBarUI.javaPKK>i,OSGI-OPT/src/javax/swing/plaf/ToolTipUI.javaPKK>j+)OSGI-OPT/src/javax/swing/plaf/TreeUI.javaPKK>VF-{OSGI-OPT/src/javax/swing/plaf/UIResource.javaPKK>G-OSGI-OPT/src/javax/swing/plaf/ViewportUI.javaPKIG@$OSGI-OPT/src/javax/swing/plaf/basic/PKK>Z%Tz9OSGI-OPT/src/javax/swing/plaf/basic/BasicArrowButton.javaPKK>YMp5OSGI-OPT/src/javax/swing/plaf/basic/BasicBorders.javaPKK>%f-<OSGI-OPT/src/javax/swing/plaf/basic/BasicButtonListener.javaPKK>g 6OSGI-OPT/src/javax/swing/plaf/basic/BasicButtonUI.javaPKK>IlA"@OSGI-OPT/src/javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.javaPKK>mR8OSGI-OPT/src/javax/swing/plaf/basic/BasicCheckBoxUI.javaPKK>tS<!OSGI-OPT/src/javax/swing/plaf/basic/BasicColorChooserUI.javaPKK>,<@OSGI-OPT/src/javax/swing/plaf/basic/BasicComboBoxEditor.javaPKK>p>COSGI-OPT/src/javax/swing/plaf/basic/BasicComboBoxRenderer.javaPKK>qlN8OSGI-OPT/src/javax/swing/plaf/basic/BasicComboBoxUI.javaPKK>/8OSGI-OPT/src/javax/swing/plaf/basic/BasicComboPopup.javaPKK>t;OSGI-OPT/src/javax/swing/plaf/basic/BasicDesktopIconUI.javaPKK>pK& ;OSGI-OPT/src/javax/swing/plaf/basic/BasicDesktopPaneUI.javaPKK>SZ<>OSGI-OPT/src/javax/swing/plaf/basic/BasicDirectoryModel.javaPKK>y:OSGI-OPT/src/javax/swing/plaf/basic/BasicEditorPaneUI.javaPKK>u ;EOSGI-OPT/src/javax/swing/plaf/basic/BasicFileChooserUI.javaPKK>.-BaOSGI-OPT/src/javax/swing/plaf/basic/BasicFormattedTextFieldUI.javaPKK><;OSGI-OPT/src/javax/swing/plaf/basic/BasicGraphicsUtils.javaPKK>ߕjf2OSGI-OPT/src/javax/swing/plaf/basic/BasicHTML.javaPKK>?>(:9OSGI-OPT/src/javax/swing/plaf/basic/BasicIconFactory.javaPKK>[D<OSGI-OPT/src/javax/swing/plaf/basic/BasicInternalFrameTitlePane.javaPKK>D =OSGI-OPT/src/javax/swing/plaf/basic/BasicInternalFrameUI.javaPKK> 5OSGI-OPT/src/javax/swing/plaf/basic/BasicLabelUI.javaPKK>VZ4OSGI-OPT/src/javax/swing/plaf/basic/BasicListUI.javaPKK>pdy699OSGI-OPT/src/javax/swing/plaf/basic/BasicLookAndFeel.javaPKK> h7OSGI-OPT/src/javax/swing/plaf/basic/BasicMenuBarUI.javaPKK>X7-8OSGI-OPT/src/javax/swing/plaf/basic/BasicMenuItemUI.javaPKK> 4y OSGI-OPT/src/javax/swing/plaf/basic/BasicMenuUI.javaPKK>\rfe:OSGI-OPT/src/javax/swing/plaf/basic/BasicOptionPaneUI.javaPKK>ڨ5AOSGI-OPT/src/javax/swing/plaf/basic/BasicPanelUI.javaPKK>$Cw=OSGI-OPT/src/javax/swing/plaf/basic/BasicPasswordFieldUI.javaPKK>دBOSGI-OPT/src/javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.javaPKK>U`{A:9OSGI-OPT/src/javax/swing/plaf/basic/BasicPopupMenuUI.javaPKK>-l ;&OSGI-OPT/src/javax/swing/plaf/basic/BasicProgressBarUI.javaPKK>~FԇM<;$OSGI-OPT/src/javax/swing/plaf/basic/BasicRadioButtonUI.javaPKK>ib8'OSGI-OPT/src/javax/swing/plaf/basic/BasicRootPaneUI.javaPKK>oE^a9\*OSGI-OPT/src/javax/swing/plaf/basic/BasicScrollBarUI.javaPKK>l}m< :^0OSGI-OPT/src/javax/swing/plaf/basic/BasicScrollPaneUI.javaPKK>n#:934OSGI-OPT/src/javax/swing/plaf/basic/BasicSeparatorUI.javaPKK>Q/66OSGI-OPT/src/javax/swing/plaf/basic/BasicSliderUI.javaPKK>7=OSGI-OPT/src/javax/swing/plaf/basic/BasicSpinnerUI.javaPKK>VNmo>@OSGI-OPT/src/javax/swing/plaf/basic/BasicSplitPaneDivider.javaPKK>0z;!9EOSGI-OPT/src/javax/swing/plaf/basic/BasicSplitPaneUI.javaPKK>S%:LOSGI-OPT/src/javax/swing/plaf/basic/BasicTabbedPaneUI.javaPKK>ӣt ;TOSGI-OPT/src/javax/swing/plaf/basic/BasicTableHeaderUI.javaPKK>3*m 57XOSGI-OPT/src/javax/swing/plaf/basic/BasicTableUI.javaPKK>8[OSGI-OPT/src/javax/swing/plaf/basic/BasicTextAreaUI.javaPKK>P2R9<^OSGI-OPT/src/javax/swing/plaf/basic/BasicTextFieldUI.javaPKK>֢IOn8`OSGI-OPT/src/javax/swing/plaf/basic/BasicTextPaneUI.javaPKK>dQƊ 44cOSGI-OPT/src/javax/swing/plaf/basic/BasicTextUI.javaPKK>0<gOSGI-OPT/src/javax/swing/plaf/basic/BasicToggleButtonUI.javaPKK>=#o}@jOSGI-OPT/src/javax/swing/plaf/basic/BasicToolBarSeparatorUI.javaPKK>]u7lOSGI-OPT/src/javax/swing/plaf/basic/BasicToolBarUI.javaPKK>hfh7rOSGI-OPT/src/javax/swing/plaf/basic/BasicToolTipUI.javaPKK> P :4`uOSGI-OPT/src/javax/swing/plaf/basic/BasicTreeUI.javaPKK>;pP,8OSGI-OPT/src/javax/swing/plaf/basic/BasicViewportUI.javaPKK>83OSGI-OPT/src/javax/swing/plaf/basic/ComboPopup.javaPKK>Mj:OSGI-OPT/src/javax/swing/plaf/basic/DefaultMenuLayout.javaPKIG@$fOSGI-OPT/src/javax/swing/plaf/metal/PKK>V 43OSGI-OPT/src/javax/swing/plaf/metal/BumpBuffer.javaPKK>Rv3V:;OSGI-OPT/src/javax/swing/plaf/metal/DefaultMetalTheme.javaPKK>mn" 5OSGI-OPT/src/javax/swing/plaf/metal/MetalBorders.javaPKK> 3~OSGI-OPT/src/javax/swing/plaf/metal/MetalBumps.javaPKK>iW6xOSGI-OPT/src/javax/swing/plaf/metal/MetalButtonUI.javaPKK>H Nq:3OSGI-OPT/src/javax/swing/plaf/metal/MetalCheckBoxIcon.javaPKK>=8OSGI-OPT/src/javax/swing/plaf/metal/MetalCheckBoxUI.javaPKK>Sl<fOSGI-OPT/src/javax/swing/plaf/metal/MetalComboBoxButton.javaPKK><iOSGI-OPT/src/javax/swing/plaf/metal/MetalComboBoxEditor.javaPKK>?W%:OSGI-OPT/src/javax/swing/plaf/metal/MetalComboBoxIcon.javaPKK>*8vOSGI-OPT/src/javax/swing/plaf/metal/MetalComboBoxUI.javaPKK>muu;ަOSGI-OPT/src/javax/swing/plaf/metal/MetalDesktopIconUI.javaPKK>N6;@OSGI-OPT/src/javax/swing/plaf/metal/MetalFileChooserUI.javaPKK>[[9߭OSGI-OPT/src/javax/swing/plaf/metal/MetalIconFactory.javaPKK> @?FD%OSGI-OPT/src/javax/swing/plaf/metal/MetalInternalFrameTitlePane.javaPKK>@=ִOSGI-OPT/src/javax/swing/plaf/metal/MetalInternalFrameUI.javaPKK>25OSGI-OPT/src/javax/swing/plaf/metal/MetalLabelUI.javaPKK>ݎY9OSGI-OPT/src/javax/swing/plaf/metal/MetalLookAndFeel.javaPKK>i7OSGI-OPT/src/javax/swing/plaf/metal/MetalMenuBarUI.javaPKK>2 :B;OSGI-OPT/src/javax/swing/plaf/metal/MetalPopupMenuSeparatorUI.javaPKK>^X%%;OSGI-OPT/src/javax/swing/plaf/metal/MetalProgressBarUI.javaPKK>U;5OSGI-OPT/src/javax/swing/plaf/metal/MetalRadioButtonUI.javaPKK>RFpl8OSGI-OPT/src/javax/swing/plaf/metal/MetalRootPaneUI.javaPKK>'$9POSGI-OPT/src/javax/swing/plaf/metal/MetalScrollBarUI.javaPKK>Jn+:@OSGI-OPT/src/javax/swing/plaf/metal/MetalScrollButton.javaPKK><P:OSGI-OPT/src/javax/swing/plaf/metal/MetalScrollPaneUI.javaPKK>Zo9wOSGI-OPT/src/javax/swing/plaf/metal/MetalSeparatorUI.javaPKK>ʵ6OSGI-OPT/src/javax/swing/plaf/metal/MetalSliderUI.javaPKK>z?o9,OSGI-OPT/src/javax/swing/plaf/metal/MetalSplitPaneUI.javaPKK>~&:OSGI-OPT/src/javax/swing/plaf/metal/MetalTabbedPaneUI.javaPKK>%WU9OSGI-OPT/src/javax/swing/plaf/metal/MetalTextFieldUI.javaPKK>Sp 3NOSGI-OPT/src/javax/swing/plaf/metal/MetalTheme.javaPKK>|W<OSGI-OPT/src/javax/swing/plaf/metal/MetalToggleButtonUI.javaPKK>)7OSGI-OPT/src/javax/swing/plaf/metal/MetalToolBarUI.javaPKK> nHE7OSGI-OPT/src/javax/swing/plaf/metal/MetalToolTipUI.javaPKK>y?be4OSGI-OPT/src/javax/swing/plaf/metal/MetalTreeUI.javaPKK>jz3]OSGI-OPT/src/javax/swing/plaf/metal/OceanTheme.javaPKIG@$OSGI-OPT/src/javax/swing/plaf/multi/PKK>L86OSGI-OPT/src/javax/swing/plaf/multi/MultiButtonUI.javaPKK>M<ZOSGI-OPT/src/javax/swing/plaf/multi/MultiColorChooserUI.javaPKK>D.M8OSGI-OPT/src/javax/swing/plaf/multi/MultiComboBoxUI.javaPKK>k&;OSGI-OPT/src/javax/swing/plaf/multi/MultiDesktopIconUI.javaPKK><; OSGI-OPT/src/javax/swing/plaf/multi/MultiDesktopPaneUI.javaPKK>:H;OSGI-OPT/src/javax/swing/plaf/multi/MultiFileChooserUI.javaPKK>рW=OSGI-OPT/src/javax/swing/plaf/multi/MultiInternalFrameUI.javaPKK> d;5OSGI-OPT/src/javax/swing/plaf/multi/MultiLabelUI.javaPKK>MgZ4OSGI-OPT/src/javax/swing/plaf/multi/MultiListUI.javaPKK>3¥c9C OSGI-OPT/src/javax/swing/plaf/multi/MultiLookAndFeel.javaPKK>$Z b7 OSGI-OPT/src/javax/swing/plaf/multi/MultiMenuBarUI.javaPKK>#l$8OSGI-OPT/src/javax/swing/plaf/multi/MultiMenuItemUI.javaPKK>}B޽Gd:OSGI-OPT/src/javax/swing/plaf/multi/MultiOptionPaneUI.javaPKK>35OSGI-OPT/src/javax/swing/plaf/multi/MultiPanelUI.javaPKK>`[9'OSGI-OPT/src/javax/swing/plaf/multi/MultiPopupMenuUI.javaPKK>2`;OSGI-OPT/src/javax/swing/plaf/multi/MultiProgressBarUI.javaPKK>8#OSGI-OPT/src/javax/swing/plaf/multi/MultiRootPaneUI.javaPKK>999OSGI-OPT/src/javax/swing/plaf/multi/MultiScrollBarUI.javaPKK>6b: OSGI-OPT/src/javax/swing/plaf/multi/MultiScrollPaneUI.javaPKK>9-T9"OSGI-OPT/src/javax/swing/plaf/multi/MultiSeparatorUI.javaPKK>a@6%OSGI-OPT/src/javax/swing/plaf/multi/MultiSliderUI.javaPKK>'S7'OSGI-OPT/src/javax/swing/plaf/multi/MultiSpinnerUI.javaPKK>79*OSGI-OPT/src/javax/swing/plaf/multi/MultiSplitPaneUI.javaPKK>X @]:,OSGI-OPT/src/javax/swing/plaf/multi/MultiTabbedPaneUI.javaPKK>;/OSGI-OPT/src/javax/swing/plaf/multi/MultiTableHeaderUI.javaPKK>[532OSGI-OPT/src/javax/swing/plaf/multi/MultiTableUI.javaPKK>3<%;44OSGI-OPT/src/javax/swing/plaf/multi/MultiTextUI.javaPKK>:Y77OSGI-OPT/src/javax/swing/plaf/multi/MultiToolBarUI.javaPKK>^47d:OSGI-OPT/src/javax/swing/plaf/multi/MultiToolTipUI.javaPKK>o4<OSGI-OPT/src/javax/swing/plaf/multi/MultiTreeUI.javaPKK>J8?OSGI-OPT/src/javax/swing/plaf/multi/MultiViewportUI.javaPKIG@$qBOSGI-OPT/src/javax/swing/plaf/synth/PKK>#F62BOSGI-OPT/src/javax/swing/plaf/synth/ColorType.javaPKK>\ m Z/kEOSGI-OPT/src/javax/swing/plaf/synth/Region.javaPKK>&7"JOSGI-OPT/src/javax/swing/plaf/synth/SynthConstants.javaPKK>FG;5LOSGI-OPT/src/javax/swing/plaf/synth/SynthContext.javaPKK> e ;OOSGI-OPT/src/javax/swing/plaf/synth/SynthGraphicsUtils.javaPKK>mtr9bROSGI-OPT/src/javax/swing/plaf/synth/SynthLookAndFeel.javaPKK>IR5UOSGI-OPT/src/javax/swing/plaf/synth/SynthPainter.javaPKK>~ = 3ZOSGI-OPT/src/javax/swing/plaf/synth/SynthStyle.javaPKK>NZGe:^OSGI-OPT/src/javax/swing/plaf/synth/SynthStyleFactory.javaPKIG@p`OSGI-OPT/src/javax/swing/table/PKK>.C6`OSGI-OPT/src/javax/swing/table/AbstractTableModel.javaPKK><!dOSGI-OPT/src/javax/swing/table/DefaultTableCellRenderer.javaPKK>  ; gOSGI-OPT/src/javax/swing/table/DefaultTableColumnModel.javaPKK>Qw 54kOSGI-OPT/src/javax/swing/table/DefaultTableModel.javaPKK>E0nOSGI-OPT/src/javax/swing/table/JTableHeader.javaPKK>X?%\3XtOSGI-OPT/src/javax/swing/table/TableCellEditor.javaPKK>j:O5vOSGI-OPT/src/javax/swing/table/TableCellRenderer.javaPKK>> / yOSGI-OPT/src/javax/swing/table/TableColumn.javaPKK>%4H}OSGI-OPT/src/javax/swing/table/TableColumnModel.javaPKK>ބ<h.9OSGI-OPT/src/javax/swing/table/TableModel.javaPKK> !2тOSGI-OPT/src/javax/swing/table/TableRowSorter.javaPKK>D-JK8LOSGI-OPT/src/javax/swing/table/TableStringConverter.javaPKIG@OSGI-OPT/src/javax/swing/text/PKK>~+3OSGI-OPT/src/javax/swing/text/AbstractDocument.javaPKK>-;v 1OSGI-OPT/src/javax/swing/text/AbstractWriter.javaPKK>Co-/ܓOSGI-OPT/src/javax/swing/text/AsyncBoxView.javaPKK>Hj/OSGI-OPT/src/javax/swing/text/AttributeSet.javaPKK>$vE7oOSGI-OPT/src/javax/swing/text/BadLocationException.javaPKK>` ƕ7 *ŝOSGI-OPT/src/javax/swing/text/BoxView.javaPKK>ٚVd(TOSGI-OPT/src/javax/swing/text/Caret.javaPKK>Ň :OSGI-OPT/src/javax/swing/text/ChangedCharSetException.javaPKK>7V*S0OSGI-OPT/src/javax/swing/text/ComponentView.javaPKK>[aw 0nOSGI-OPT/src/javax/swing/text/CompositeView.javaPKK>8Al0POSGI-OPT/src/javax/swing/text/DateFormatter.javaPKK>|'3/OSGI-OPT/src/javax/swing/text/DefaultCaret.javaPKK>CI+3OSGI-OPT/src/javax/swing/text/DefaultEditorKit.javaPKK>!".3OSGI-OPT/src/javax/swing/text/DefaultFormatter.javaPKK>-*j`s :OSGI-OPT/src/javax/swing/text/DefaultFormatterFactory.javaPKK>Oc5 5yOSGI-OPT/src/javax/swing/text/DefaultHighlighter.javaPKK> =8OSGI-OPT/src/javax/swing/text/DefaultStyledDocument.javaPKK> o-0OSGI-OPT/src/javax/swing/text/DefaultTextUI.javaPKK>V+OSGI-OPT/src/javax/swing/text/Document.javaPKK>m;v1OSGI-OPT/src/javax/swing/text/DocumentFilter.javaPKK>`,OSGI-OPT/src/javax/swing/text/EditorKit.javaPKK>8o*OSGI-OPT/src/javax/swing/text/Element.javaPKK>He2rOSGI-OPT/src/javax/swing/text/ElementIterator.javaPKK>Q/,OSGI-OPT/src/javax/swing/text/FieldView.javaPKK>X+bOSGI-OPT/src/javax/swing/text/FlowView.javaPKK>q^rO-OSGI-OPT/src/javax/swing/text/GapContent.javaPKK>J_ ,OSGI-OPT/src/javax/swing/text/GapVector.javaPKK>g ,OSGI-OPT/src/javax/swing/text/GlyphView.javaPKK>*ϼؑ.OSGI-OPT/src/javax/swing/text/Highlighter.javaPKK>hKH9r+OSGI-OPT/src/javax/swing/text/IconView.javaPKK>T~09OSGI-OPT/src/javax/swing/text/InternationalFormatter.javaPKK>\&D"1NOSGI-OPT/src/javax/swing/text/JTextComponent.javaPKK>ebA)TOSGI-OPT/src/javax/swing/text/Keymap.javaPKK>[3v, OSGI-OPT/src/javax/swing/text/LabelView.javaPKK>u@5OSGI-OPT/src/javax/swing/text/LayeredHighlighter.javaPKK>&8.OSGI-OPT/src/javax/swing/text/LayoutQueue.javaPKK>E\t-0OSGI-OPT/src/javax/swing/text/MaskFormatter.javaPKK> ;6OSGI-OPT/src/javax/swing/text/MutableAttributeSet.javaPKK>:?z34 OSGI-OPT/src/javax/swing/text/NavigationFilter.javaPKK>z>2 OSGI-OPT/src/javax/swing/text/NumberFormatter.javaPKK>Kc$0HOSGI-OPT/src/javax/swing/text/ParagraphView.javaPKK>2t/=OSGI-OPT/src/javax/swing/text/PasswordView.javaPKK>e0OSGI-OPT/src/javax/swing/text/PlainDocument.javaPKK>J^,uOSGI-OPT/src/javax/swing/text/PlainView.javaPKK>b32+-OSGI-OPT/src/javax/swing/text/Position.javaPKK>󃤩,*OSGI-OPT/src/javax/swing/text/Segment.javaPKK>^5 OSGI-OPT/src/javax/swing/text/SimpleAttributeSet.javaPKK>9E0#OSGI-OPT/src/javax/swing/text/StringContent.javaPKK>R|(&OSGI-OPT/src/javax/swing/text/Style.javaPKK>0Q 1A)OSGI-OPT/src/javax/swing/text/StyleConstants.javaPKK>Y&/.OSGI-OPT/src/javax/swing/text/StyleContext.javaPKK>ںKx1t4OSGI-OPT/src/javax/swing/text/StyledDocument.javaPKK>1*\ 2K7OSGI-OPT/src/javax/swing/text/StyledEditorKit.javaPKK>عD.;OSGI-OPT/src/javax/swing/text/TabExpander.javaPKK>#2)-=OSGI-OPT/src/javax/swing/text/TabSet.javaPKK>; p*?OSGI-OPT/src/javax/swing/text/TabStop.javaPKK>w)b%.sBOSGI-OPT/src/javax/swing/text/TabableView.javaPKK>ᖊ,DOSGI-OPT/src/javax/swing/text/TableView.javaPKK>l&,8T-GOSGI-OPT/src/javax/swing/text/TextAction.javaPKK>l=q ,zJOSGI-OPT/src/javax/swing/text/Utilities.javaPKK>9<9'MOSGI-OPT/src/javax/swing/text/View.javaPKK>8>.SOSGI-OPT/src/javax/swing/text/ViewFactory.javaPKK>VY$r37UOSGI-OPT/src/javax/swing/text/WrappedPlainView.javaPKK>1X[OSGI-OPT/src/javax/swing/text/html/BlockView.javaPKK>Zn'+]OSGI-OPT/src/javax/swing/text/html/CSS.javaPKK>L]w7bOSGI-OPT/src/javax/swing/text/html/FormSubmitEvent.javaPKK>:Rg0eOSGI-OPT/src/javax/swing/text/html/FormView.javaPKK>4=,xhOSGI-OPT/src/javax/swing/text/html/HTML.javaPKK>V14pOSGI-OPT/src/javax/swing/text/html/HTMLDocument.javaPKK>/]5vOSGI-OPT/src/javax/swing/text/html/HTMLEditorKit.javaPKK>ND^u?s}OSGI-OPT/src/javax/swing/text/html/HTMLFrameHyperlinkEvent.javaPKK> 2>OSGI-OPT/src/javax/swing/text/html/HTMLWriter.javaPKK>yz1OSGI-OPT/src/javax/swing/text/html/ImageView.javaPKK>l2OSGI-OPT/src/javax/swing/text/html/InlineView.javaPKK>?B<0EOSGI-OPT/src/javax/swing/text/html/ListView.javaPKK>s6. 9OSGI-OPT/src/javax/swing/text/html/MinimalHTMLWriter.javaPKK>o}<2OSGI-OPT/src/javax/swing/text/html/ObjectView.javaPKK>d/I.)OSGI-OPT/src/javax/swing/text/html/Option.javaPKK>D~E5OSGI-OPT/src/javax/swing/text/html/ParagraphView.javaPKK>L, * 2OSGI-OPT/src/javax/swing/text/html/StyleSheet.javaPKIG@*uOSGI-OPT/src/javax/swing/text/html/parser/PKK>~v<ϚOSGI-OPT/src/javax/swing/text/html/parser/AttributeList.javaPKK>j؛Ify;ߝOSGI-OPT/src/javax/swing/text/html/parser/ContentModel.javaPKK>&"2OSGI-OPT/src/javax/swing/text/html/parser/DTD.javaPKK>:;OSGI-OPT/src/javax/swing/text/html/parser/DTDConstants.javaPKK>=})=1OSGI-OPT/src/javax/swing/text/html/parser/DocumentParser.javaPKK>6ŪOSGI-OPT/src/javax/swing/text/html/parser/Element.javaPKK>`҉[5OSGI-OPT/src/javax/swing/text/html/parser/Entity.javaPKK>L{8 5ѰOSGI-OPT/src/javax/swing/text/html/parser/Parser.javaPKK>bcx>lOSGI-OPT/src/javax/swing/text/html/parser/ParserDelegator.javaPKK>u$p9;OSGI-OPT/src/javax/swing/text/html/parser/TagElement.javaPKIG@"ƹOSGI-OPT/src/javax/swing/text/rtf/PKK>Dr3OSGI-OPT/src/javax/swing/text/rtf/RTFEditorKit.javaPKIG@DOSGI-OPT/src/javax/swing/tree/PKK>  6OSGI-OPT/src/javax/swing/tree/AbstractLayoutCache.javaPKK> a,#9OSGI-OPT/src/javax/swing/tree/DefaultMutableTreeNode.javaPKK>L|,@8}OSGI-OPT/src/javax/swing/tree/DefaultTreeCellEditor.javaPKK>) :OSGI-OPT/src/javax/swing/tree/DefaultTreeCellRenderer.javaPKK>=ĩ6 3fOSGI-OPT/src/javax/swing/tree/DefaultTreeModel.javaPKK>"\k<pOSGI-OPT/src/javax/swing/tree/DefaultTreeSelectionModel.javaPKK>[6EOSGI-OPT/src/javax/swing/tree/ExpandVetoException.javaPKK>g9OSGI-OPT/src/javax/swing/tree/FixedHeightLayoutCache.javaPKK>ۧC2OSGI-OPT/src/javax/swing/tree/MutableTreeNode.javaPKK>rrd2SOSGI-OPT/src/javax/swing/tree/PathPlaceHolder.javaPKK>}+,OSGI-OPT/src/javax/swing/tree/RowMapper.javaPKK>Gvj1OSGI-OPT/src/javax/swing/tree/TreeCellEditor.javaPKK>ti']39OSGI-OPT/src/javax/swing/tree/TreeCellRenderer.javaPKK>16,OSGI-OPT/src/javax/swing/tree/TreeModel.javaPKK>ߕ+"OSGI-OPT/src/javax/swing/tree/TreeNode.javaPKK>>;o+OSGI-OPT/src/javax/swing/tree/TreePath.javaPKK>^X5KOSGI-OPT/src/javax/swing/tree/TreeSelectionModel.javaPKK>t<OSGI-OPT/src/javax/swing/tree/VariableHeightLayoutCache.javaPKIG@OSGI-OPT/src/javax/swing/undo/PKK>u7(OSGI-OPT/src/javax/swing/undo/AbstractUndoableEdit.javaPKK>nU6OSGI-OPT/src/javax/swing/undo/CannotRedoException.javaPKK>mk65OSGI-OPT/src/javax/swing/undo/CannotUndoException.javaPKK> z/iOSGI-OPT/src/javax/swing/undo/CompoundEdit.javaPKK>h,OSGI-OPT/src/javax/swing/undo/StateEdit.javaPKK>w*0OSGI-OPT/src/javax/swing/undo/StateEditable.javaPKK>tPI.DOSGI-OPT/src/javax/swing/undo/UndoManager.javaPKK>}v'/:OSGI-OPT/src/javax/swing/undo/UndoableEdit.javaPKK>\ۄ 6 OSGI-OPT/src/javax/swing/undo/UndoableEditSupport.javaPKIG@ OSGI-OPT/src/javax/tools/PKK>_Y+( OSGI-OPT/src/javax/tools/Diagnostic.javaPKK>Fk1OSGI-OPT/src/javax/tools/DiagnosticCollector.javaPKK>D0OSGI-OPT/src/javax/tools/DiagnosticListener.javaPKK>5,=f(-OSGI-OPT/src/javax/tools/FileObject.javaPKK>?}Л2OSGI-OPT/src/javax/tools/ForwardingFileObject.javaPKK>VWd 7OSGI-OPT/src/javax/tools/ForwardingJavaFileManager.javaPKK>!b6=OSGI-OPT/src/javax/tools/ForwardingJavaFileObject.javaPKK>ۛ*!OSGI-OPT/src/javax/tools/JavaCompiler.javaPKK>Җ-$OSGI-OPT/src/javax/tools/JavaFileManager.javaPKK>tZ?,S'OSGI-OPT/src/javax/tools/JavaFileObject.javaPKK>W!]+*OSGI-OPT/src/javax/tools/OptionChecker.javaPKK>&u2+,OSGI-OPT/src/javax/tools/SimpleJavaFileObject.javaPKK>C?5q/OSGI-OPT/src/javax/tools/StandardJavaFileManager.javaPKK>ř{H.2OSGI-OPT/src/javax/tools/StandardLocation.javaPKK>staa"4OSGI-OPT/src/javax/tools/Tool.javaPKK>E%N?9OSGI-OPT/src/javax/transaction/InvalidTransactionException.javaPKK>&<Q@<OSGI-OPT/src/javax/transaction/TransactionRequiredException.javaPKK> WB\>OSGI-OPT/src/javax/transaction/TransactionRolledbackException.javaPKIG@"@OSGI-OPT/src/javax/transaction/xa/PKK>d`2AOSGI-OPT/src/javax/transaction/xa/XAException.javaPKK>RK13w]*GOSGI-OPT/src/javax/transaction/xa/Xid.javaPKIG@IOSGI-OPT/src/javax/xml/PKK>)-E(0JOSGI-OPT/src/javax/xml/XMLConstants.javaPKIG@MOSGI-OPT/src/javax/xml/bind/PKK>&\'MOSGI-OPT/src/javax/xml/bind/Binder.javaPKK>~j5POSGI-OPT/src/javax/xml/bind/DataBindingException.javaPKK>il'2 SOSGI-OPT/src/javax/xml/bind/DatatypeConverter.javaPKK>/z ;WOSGI-OPT/src/javax/xml/bind/DatatypeConverterInterface.javaPKK>x(ZOSGI-OPT/src/javax/xml/bind/Element.javaPKK>G%\OSGI-OPT/src/javax/xml/bind/JAXB.javaPKK>=E,_OSGI-OPT/src/javax/xml/bind/JAXBContext.javaPKK>2Ao{,bOSGI-OPT/src/javax/xml/bind/JAXBElement.javaPKK>had".fOSGI-OPT/src/javax/xml/bind/JAXBException.javaPKK>t$1hOSGI-OPT/src/javax/xml/bind/JAXBIntrospector.javaPKK>b 1jOSGI-OPT/src/javax/xml/bind/MarshalException.javaPKK>n+N +XmOSGI-OPT/src/javax/xml/bind/Marshaller.javaPKK>!H5{qOSGI-OPT/src/javax/xml/bind/NotIdentifiableEvent.javaPKK>~f:5sOSGI-OPT/src/javax/xml/bind/ParseConversionEvent.javaPKK>e5uOSGI-OPT/src/javax/xml/bind/PrintConversionEvent.javaPKK>Dr2wOSGI-OPT/src/javax/xml/bind/PropertyException.javaPKK>F#h5hzOSGI-OPT/src/javax/xml/bind/SchemaOutputResolver.javaPKK>C@.(8|OSGI-OPT/src/javax/xml/bind/TypeConstraintException.javaPKK>73 3]OSGI-OPT/src/javax/xml/bind/UnmarshalException.javaPKK>( -ɁOSGI-OPT/src/javax/xml/bind/Unmarshaller.javaPKK>@iW!4…OSGI-OPT/src/javax/xml/bind/UnmarshallerHandler.javaPKK>q/!0OSGI-OPT/src/javax/xml/bind/ValidationEvent.javaPKK>5(?7OSGI-OPT/src/javax/xml/bind/ValidationEventHandler.javaPKK>CR7ŒOSGI-OPT/src/javax/xml/bind/ValidationEventLocator.javaPKK>!͐  4%OSGI-OPT/src/javax/xml/bind/ValidationException.javaPKK>Vr?h*OSGI-OPT/src/javax/xml/bind/Validator.javaPKIG@')OSGI-OPT/src/javax/xml/bind/annotation/PKK>6OSGI-OPT/src/javax/xml/bind/annotation/DomHandler.javaPKK>Kjk9OSGI-OPT/src/javax/xml/bind/annotation/W3CDomHandler.javaPKK>^ :ϙOSGI-OPT/src/javax/xml/bind/annotation/XmlAccessOrder.javaPKK>u9OSGI-OPT/src/javax/xml/bind/annotation/XmlAccessType.javaPKK>R'*<EOSGI-OPT/src/javax/xml/bind/annotation/XmlAccessorOrder.javaPKK>d8.;٠OSGI-OPT/src/javax/xml/bind/annotation/XmlAccessorType.javaPKK>5ƆF;pOSGI-OPT/src/javax/xml/bind/annotation/XmlAnyAttribute.javaPKK> M=(9إOSGI-OPT/src/javax/xml/bind/annotation/XmlAnyElement.javaPKK>n\ <|OSGI-OPT/src/javax/xml/bind/annotation/XmlAttachmentRef.javaPKK>6 + 8OSGI-OPT/src/javax/xml/bind/annotation/XmlAttribute.javaPKK>&t6OSGI-OPT/src/javax/xml/bind/annotation/XmlElement.javaPKK>YEn:XOSGI-OPT/src/javax/xml/bind/annotation/XmlElementDecl.javaPKK>gd Ty9.OSGI-OPT/src/javax/xml/bind/annotation/XmlElementRef.javaPKK>yy:OSGI-OPT/src/javax/xml/bind/annotation/XmlElementRefs.javaPKK>+65=`OSGI-OPT/src/javax/xml/bind/annotation/XmlElementWrapper.javaPKK>מ 7OSGI-OPT/src/javax/xml/bind/annotation/XmlElements.javaPKK>cO3sOSGI-OPT/src/javax/xml/bind/annotation/XmlEnum.javaPKK>ܽ:|8OSGI-OPT/src/javax/xml/bind/annotation/XmlEnumValue.javaPKK>e)41POSGI-OPT/src/javax/xml/bind/annotation/XmlID.javaPKK>[='4OSGI-OPT/src/javax/xml/bind/annotation/XmlIDREF.javaPKK> ? OSGI-OPT/src/javax/xml/bind/annotation/XmlInlineBinaryData.javaPKK>3OSGI-OPT/src/javax/xml/bind/annotation/XmlList.javaPKK>Hu]7OSGI-OPT/src/javax/xml/bind/annotation/XmlMimeType.javaPKK>g4]OSGI-OPT/src/javax/xml/bind/annotation/XmlMixed.javaPKK>Ds1OSGI-OPT/src/javax/xml/bind/annotation/XmlNs.javaPKK> 5OSGI-OPT/src/javax/xml/bind/annotation/XmlNsForm.javaPKK>P2>_7DOSGI-OPT/src/javax/xml/bind/annotation/XmlRegistry.javaPKK>e:OSGI-OPT/src/javax/xml/bind/annotation/XmlRootElement.javaPKK>X4o5OSGI-OPT/src/javax/xml/bind/annotation/XmlSchema.javaPKK>,l9OSGI-OPT/src/javax/xml/bind/annotation/XmlSchemaType.javaPKK>Si :OSGI-OPT/src/javax/xml/bind/annotation/XmlSchemaTypes.javaPKK>zz62OSGI-OPT/src/javax/xml/bind/annotation/XmlSeeAlso.javaPKK>F8OSGI-OPT/src/javax/xml/bind/annotation/XmlTransient.javaPKK>oh3OSGI-OPT/src/javax/xml/bind/annotation/XmlType.javaPKK>.4OSGI-OPT/src/javax/xml/bind/annotation/XmlValue.javaPKIG@0-OSGI-OPT/src/javax/xml/bind/annotation/adapters/PKK>(%KOSGI-OPT/src/javax/xml/bind/annotation/adapters/CollapsedStringAdapter.javaPKK>1E.OSGI-OPT/src/javax/xml/bind/annotation/adapters/HexBinaryAdapter.javaPKK>!r38LOSGI-OPT/src/javax/xml/bind/annotation/adapters/NormalizedStringAdapter.javaPKK> ?bOSGI-OPT/src/javax/xml/bind/annotation/adapters/XmlAdapter.javaPKK> P/p GOSGI-OPT/src/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapter.javaPKK>.1)IHOSGI-OPT/src/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapters.javaPKIG@'HOSGI-OPT/src/javax/xml/bind/attachment/PKK>^`@@OSGI-OPT/src/javax/xml/bind/attachment/AttachmentMarshaller.javaPKK>2#BMOSGI-OPT/src/javax/xml/bind/attachment/AttachmentUnmarshaller.javaPKIG@$OSGI-OPT/src/javax/xml/bind/helpers/PKK>h<O?4OSGI-OPT/src/javax/xml/bind/helpers/AbstractMarshallerImpl.javaPKK>ʸ.~AdOSGI-OPT/src/javax/xml/bind/helpers/AbstractUnmarshallerImpl.javaPKK>ozF OSGI-OPT/src/javax/xml/bind/helpers/DefaultValidationEventHandler.javaPKK>*E} -A OSGI-OPT/src/javax/xml/bind/helpers/NotIdentifiableEventImpl.javaPKK>"/AOSGI-OPT/src/javax/xml/bind/helpers/ParseConversionEventImpl.javaPKK>^.AHOSGI-OPT/src/javax/xml/bind/helpers/PrintConversionEventImpl.javaPKK>6P\<OSGI-OPT/src/javax/xml/bind/helpers/ValidationEventImpl.javaPKK>p~|HCOSGI-OPT/src/javax/xml/bind/helpers/ValidationEventLocatorImpl.javaPKIG@!OSGI-OPT/src/javax/xml/bind/util/PKK>Qg0OSGI-OPT/src/javax/xml/bind/util/JAXBResult.javaPKK>0[OSGI-OPT/src/javax/xml/bind/util/JAXBSource.javaPKK>HFR>OSGI-OPT/src/javax/xml/bind/util/ValidationEventCollector.javaPKIG@="OSGI-OPT/src/javax/xml/crypto/PKK>"@2"OSGI-OPT/src/javax/xml/crypto/AlgorithmMethod.javaPKK>@'$OSGI-OPT/src/javax/xml/crypto/Data.javaPKK>|Q.&OSGI-OPT/src/javax/xml/crypto/KeySelector.javaPKK>;)7)OSGI-OPT/src/javax/xml/crypto/KeySelectorException.javaPKK>bp4E,OSGI-OPT/src/javax/xml/crypto/KeySelectorResult.javaPKK>i>3p.OSGI-OPT/src/javax/xml/crypto/MarshalException.javaPKK>7;0OSGI-OPT/src/javax/xml/crypto/NoSuchMechanismException.javaPKK>14.3OSGI-OPT/src/javax/xml/crypto/NodeSetData.javaPKK>QMz2H5OSGI-OPT/src/javax/xml/crypto/OctetStreamData.javaPKK>UW27OSGI-OPT/src/javax/xml/crypto/URIDereferencer.javaPKK>:[t/:OSGI-OPT/src/javax/xml/crypto/URIReference.javaPKK>ە.8-<OSGI-OPT/src/javax/xml/crypto/URIReferenceException.javaPKK>a3>OSGI-OPT/src/javax/xml/crypto/XMLCryptoContext.javaPKK>5/eAOSGI-OPT/src/javax/xml/crypto/XMLStructure.javaPKIG@"COSGI-OPT/src/javax/xml/crypto/dom/PKK>Fg<7COSGI-OPT/src/javax/xml/crypto/dom/DOMCryptoContext.javaPKK>e3GOSGI-OPT/src/javax/xml/crypto/dom/DOMStructure.javaPKK>g6IOSGI-OPT/src/javax/xml/crypto/dom/DOMURIReference.javaPKIG@#KOSGI-OPT/src/javax/xml/crypto/dsig/PKK>A>LOSGI-OPT/src/javax/xml/crypto/dsig/CanonicalizationMethod.javaPKK>2e9n4NOSGI-OPT/src/javax/xml/crypto/dsig/DigestMethod.javaPKK>#-ut0\QOSGI-OPT/src/javax/xml/crypto/dsig/Manifest.javaPKK>+\h~1SOSGI-OPT/src/javax/xml/crypto/dsig/Reference.javaPKK>[q$%7VOSGI-OPT/src/javax/xml/crypto/dsig/SignatureMethod.javaPKK>8Y;YOSGI-OPT/src/javax/xml/crypto/dsig/SignatureProperties.javaPKK><.>9[OSGI-OPT/src/javax/xml/crypto/dsig/SignatureProperty.javaPKK>M*2]OSGI-OPT/src/javax/xml/crypto/dsig/SignedInfo.javaPKK>3#1h`OSGI-OPT/src/javax/xml/crypto/dsig/Transform.javaPKK>o=:lcOSGI-OPT/src/javax/xml/crypto/dsig/TransformException.javaPKK>8m8eOSGI-OPT/src/javax/xml/crypto/dsig/TransformService.javaPKK>v!1hOSGI-OPT/src/javax/xml/crypto/dsig/XMLObject.javaPKK>%6okOSGI-OPT/src/javax/xml/crypto/dsig/XMLSignContext.javaPKK>xīO4mOSGI-OPT/src/javax/xml/crypto/dsig/XMLSignature.javaPKK>Jǹ=pOSGI-OPT/src/javax/xml/crypto/dsig/XMLSignatureException.javaPKK>Ez=;sOSGI-OPT/src/javax/xml/crypto/dsig/XMLSignatureFactory.javaPKK>.:wOSGI-OPT/src/javax/xml/crypto/dsig/XMLValidateContext.javaPKIG@'yOSGI-OPT/src/javax/xml/crypto/dsig/dom/PKK> ]Je: zOSGI-OPT/src/javax/xml/crypto/dsig/dom/DOMSignContext.javaPKK>_i00>|OSGI-OPT/src/javax/xml/crypto/dsig/dom/DOMValidateContext.javaPKIG@+WOSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/PKK>  7OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/KeyInfo.javaPKK>e_ "EN >-OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory.javaPKK>n7ޅOSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/KeyName.javaPKK>08OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/KeyValue.javaPKK>#(7OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/PGPData.javaPKK> ?AOSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/RetrievalMethod.javaPKK>L 48ŏOSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/X509Data.javaPKK>䭏9@_OSGI-OPT/src/javax/xml/crypto/dsig/keyinfo/X509IssuerSerial.javaPKIG@(ǔOSGI-OPT/src/javax/xml/crypto/dsig/spec/PKK>ThDOSGI-OPT/src/javax/xml/crypto/dsig/spec/C14NMethodParameterSpec.javaPKK>FdOSGI-OPT/src/javax/xml/crypto/dsig/spec/DigestMethodParameterSpec.javaPKK>B ')AOSGI-OPT/src/javax/xml/crypto/dsig/spec/ExcC14NParameterSpec.javaPKK>b _>GOSGI-OPT/src/javax/xml/crypto/dsig/spec/HMACParameterSpec.javaPKK>BIOSGI-OPT/src/javax/xml/crypto/dsig/spec/SignatureMethodParameterSpec.javaPKK>GACOSGI-OPT/src/javax/xml/crypto/dsig/spec/TransformParameterSpec.javaPKK>FGOSGI-OPT/src/javax/xml/crypto/dsig/spec/XPathFilter2ParameterSpec.javaPKK>c,EOSGI-OPT/src/javax/xml/crypto/dsig/spec/XPathFilterParameterSpec.javaPKK>Ǒ6QOSGI-OPT/src/javax/xml/crypto/dsig/spec/XPathType.javaPKK>7 GFOSGI-OPT/src/javax/xml/crypto/dsig/spec/XSLTTransformParameterSpec.javaPKIG@ OSGI-OPT/src/javax/xml/datatype/PKK>SCOSGI-OPT/src/javax/xml/datatype/DatatypeConfigurationException.javaPKK>}\ 6uOSGI-OPT/src/javax/xml/datatype/DatatypeConstants.javaPKK>-eh4OSGI-OPT/src/javax/xml/datatype/DatatypeFactory.javaPKK>eh3w-^OSGI-OPT/src/javax/xml/datatype/Duration.javaPKK>ıGK 9OSGI-OPT/src/javax/xml/datatype/XMLGregorianCalendar.javaPKIG@!kOSGI-OPT/src/javax/xml/namespace/PKK>wJc6OSGI-OPT/src/javax/xml/namespace/NamespaceContext.javaPKK>*;MN+OSGI-OPT/src/javax/xml/namespace/QName.javaPKIG@OSGI-OPT/src/javax/xml/parsers/PKK>,oj3OSGI-OPT/src/javax/xml/parsers/DocumentBuilder.javaPKK>#C :-OSGI-OPT/src/javax/xml/parsers/DocumentBuilderFactory.javaPKK>ooD=OSGI-OPT/src/javax/xml/parsers/FactoryConfigurationError.javaPKK> pԹL@OSGI-OPT/src/javax/xml/parsers/ParserConfigurationException.javaPKK> -gOSGI-OPT/src/javax/xml/parsers/SAXParser.javaPKK>˚r4OSGI-OPT/src/javax/xml/parsers/SAXParserFactory.javaPKIG@OSGI-OPT/src/javax/xml/soap/PKK>  /0OSGI-OPT/src/javax/xml/soap/AttachmentPart.javaPKK>QfI'OSGI-OPT/src/javax/xml/soap/Detail.javaPKK>UG,OSGI-OPT/src/javax/xml/soap/DetailEntry.javaPKK>9/OSGI-OPT/src/javax/xml/soap/MessageFactory.javaPKK>0ZW]+OSGI-OPT/src/javax/xml/soap/MimeHeader.javaPKK>T,,OSGI-OPT/src/javax/xml/soap/MimeHeaders.javaPKK>/%xOSGI-OPT/src/javax/xml/soap/Name.javaPKK>=%OSGI-OPT/src/javax/xml/soap/Node.javaPKK> w10 OSGI-OPT/src/javax/xml/soap/SAAJMetaFactory.javaPKK>VO+nOSGI-OPT/src/javax/xml/soap/SAAJResult.javaPKK>P`)OSGI-OPT/src/javax/xml/soap/SOAPBody.javaPKK>=0OSGI-OPT/src/javax/xml/soap/SOAPBodyElement.javaPKK>ߤM/OSGI-OPT/src/javax/xml/soap/SOAPConnection.javaPKK>h46'OSGI-OPT/src/javax/xml/soap/SOAPConnectionFactory.javaPKK>)h@] .OSGI-OPT/src/javax/xml/soap/SOAPConstants.javaPKK>>:< ,)OSGI-OPT/src/javax/xml/soap/SOAPElement.javaPKK>GRX3OSGI-OPT/src/javax/xml/soap/SOAPElementFactory.javaPKK>YKOE-=OSGI-OPT/src/javax/xml/soap/SOAPEnvelope.javaPKK>VT.OSGI-OPT/src/javax/xml/soap/SOAPException.javaPKK>~E,OSGI-OPT/src/javax/xml/soap/SOAPFactory.javaPKK>jA * OSGI-OPT/src/javax/xml/soap/SOAPFault.javaPKK>G1 OSGI-OPT/src/javax/xml/soap/SOAPFaultElement.javaPKK>DZ>M+OSGI-OPT/src/javax/xml/soap/SOAPHeader.javaPKK>Ɲ$2OSGI-OPT/src/javax/xml/soap/SOAPHeaderElement.javaPKK>`dxQ ,=OSGI-OPT/src/javax/xml/soap/SOAPMessage.javaPKK>hMR)OSGI-OPT/src/javax/xml/soap/SOAPPart.javaPKK> %OSGI-OPT/src/javax/xml/soap/Text.javaPKIG@FOSGI-OPT/src/javax/xml/stream/PKK>ED.OSGI-OPT/src/javax/xml/stream/EventFilter.javaPKK>fKz k< OSGI-OPT/src/javax/xml/stream/FactoryConfigurationError.javaPKK>޻=+6#OSGI-OPT/src/javax/xml/stream/Location.javaPKK>N/x%OSGI-OPT/src/javax/xml/stream/StreamFilter.javaPKK>;1^h2'OSGI-OPT/src/javax/xml/stream/XMLEventFactory.javaPKK>Ξ'1a+OSGI-OPT/src/javax/xml/stream/XMLEventReader.javaPKK> \-B1-OSGI-OPT/src/javax/xml/stream/XMLEventWriter.javaPKK>p'20OSGI-OPT/src/javax/xml/stream/XMLInputFactory.javaPKK>` 35OSGI-OPT/src/javax/xml/stream/XMLOutputFactory.javaPKK>% S.Y8OSGI-OPT/src/javax/xml/stream/XMLReporter.javaPKK>Fm@].:OSGI-OPT/src/javax/xml/stream/XMLResolver.javaPKK>-bA5<OSGI-OPT/src/javax/xml/stream/XMLStreamConstants.javaPKK>B\3Y5?OSGI-OPT/src/javax/xml/stream/XMLStreamException.javaPKK>oZ 2LBOSGI-OPT/src/javax/xml/stream/XMLStreamReader.javaPKK>\u2FOSGI-OPT/src/javax/xml/stream/XMLStreamWriter.javaPKIG@%IIOSGI-OPT/src/javax/xml/stream/events/PKK>( _3IOSGI-OPT/src/javax/xml/stream/events/Attribute.javaPKK>A4P4KOSGI-OPT/src/javax/xml/stream/events/Characters.javaPKK>N=1MNOSGI-OPT/src/javax/xml/stream/events/Comment.javaPKK>,RKq-POSGI-OPT/src/javax/xml/stream/events/DTD.javaPKK>Tc5ROSGI-OPT/src/javax/xml/stream/events/EndDocument.javaPKK>@kE/4UOSGI-OPT/src/javax/xml/stream/events/EndElement.javaPKK>9S;QWOSGI-OPT/src/javax/xml/stream/events/EntityDeclaration.javaPKK>vǎC9YOSGI-OPT/src/javax/xml/stream/events/EntityReference.javaPKK> TR3 \OSGI-OPT/src/javax/xml/stream/events/Namespace.javaPKK>JyL=^^OSGI-OPT/src/javax/xml/stream/events/NotationDeclaration.javaPKK>b|^6+?`OSGI-OPT/src/javax/xml/stream/events/ProcessingInstruction.javaPKK> 7cOSGI-OPT/src/javax/xml/stream/events/StartDocument.javaPKK>lH!$6seOSGI-OPT/src/javax/xml/stream/events/StartElement.javaPKK>LB2gOSGI-OPT/src/javax/xml/stream/events/XMLEvent.javaPKIG@#jOSGI-OPT/src/javax/xml/stream/util/PKK>Ajw;0kOSGI-OPT/src/javax/xml/stream/util/EventReaderDelegate.javaPKK>} =d<nOSGI-OPT/src/javax/xml/stream/util/StreamReaderDelegate.javaPKK> 9/rOSGI-OPT/src/javax/xml/stream/util/XMLEventAllocator.javaPKK>{8tOSGI-OPT/src/javax/xml/stream/util/XMLEventConsumer.javaPKIG@!vOSGI-OPT/src/javax/xml/transform/PKK> 938wOSGI-OPT/src/javax/xml/transform/ErrorListener.javaPKK>`¾0yOSGI-OPT/src/javax/xml/transform/OutputKeys.javaPKK>Vg,|OSGI-OPT/src/javax/xml/transform/Result.javaPKK>y,,OSGI-OPT/src/javax/xml/transform/Source.javaPKK>F*3AOSGI-OPT/src/javax/xml/transform/SourceLocator.javaPKK>6@S/OSGI-OPT/src/javax/xml/transform/Templates.javaPKK>p1ՅOSGI-OPT/src/javax/xml/transform/Transformer.javaPKK>U GOSGI-OPT/src/javax/xml/transform/TransformerConfigurationException.javaPKK>C:ROSGI-OPT/src/javax/xml/transform/TransformerException.javaPKK>{Xe 8OSGI-OPT/src/javax/xml/transform/TransformerFactory.javaPKK>hV MJDOSGI-OPT/src/javax/xml/transform/TransformerFactoryConfigurationError.javaPKK>(;1ǓOSGI-OPT/src/javax/xml/transform/URIResolver.javaPKIG@% OSGI-OPT/src/javax/xml/transform/dom/PKK>' 4`OSGI-OPT/src/javax/xml/transform/dom/DOMLocator.javaPKK>C8Y3OSGI-OPT/src/javax/xml/transform/dom/DOMResult.javaPKK>]@3ZOSGI-OPT/src/javax/xml/transform/dom/DOMSource.javaPKIG@%OSGI-OPT/src/javax/xml/transform/sax/PKK>R3POSGI-OPT/src/javax/xml/transform/sax/SAXResult.javaPKK>Ki3OSGI-OPT/src/javax/xml/transform/sax/SAXSource.javaPKK>!5Ā?ͣOSGI-OPT/src/javax/xml/transform/sax/SAXTransformerFactory.javaPKK>Z}^:OSGI-OPT/src/javax/xml/transform/sax/TemplatesHandler.javaPKK>ڹ:<OSGI-OPT/src/javax/xml/transform/sax/TransformerHandler.javaPKIG@&OSGI-OPT/src/javax/xml/transform/stax/PKK>ftG5OSGI-OPT/src/javax/xml/transform/stax/StAXResult.javaPKK>`Y5OSGI-OPT/src/javax/xml/transform/stax/StAXSource.javaPKIG@(SOSGI-OPT/src/javax/xml/transform/stream/PKK>k]9OSGI-OPT/src/javax/xml/transform/stream/StreamResult.javaPKK>Lt&s9oOSGI-OPT/src/javax/xml/transform/stream/StreamSource.javaPKIG@"IOSGI-OPT/src/javax/xml/validation/PKK>V`-OSGI-OPT/src/javax/xml/validation/Schema.javaPKK>+ 4ٹOSGI-OPT/src/javax/xml/validation/SchemaFactory.javaPKK>dC:YOSGI-OPT/src/javax/xml/validation/SchemaFactoryLoader.javaPKK>Mv? 7OSGI-OPT/src/javax/xml/validation/TypeInfoProvider.javaPKK>N0OSGI-OPT/src/javax/xml/validation/Validator.javaPKK>ihPn79OSGI-OPT/src/javax/xml/validation/ValidatorHandler.javaPKIG@YOSGI-OPT/src/javax/xml/ws/PKK>.U%%OSGI-OPT/src/javax/xml/ws/Action.javaPKK>c+OSGI-OPT/src/javax/xml/ws/AsyncHandler.javaPKK>Z&COSGI-OPT/src/javax/xml/ws/Binding.javaPKK>/_.OSGI-OPT/src/javax/xml/ws/BindingProvider.javaPKK>K *OSGI-OPT/src/javax/xml/ws/BindingType.javaPKK>m}E'OSGI-OPT/src/javax/xml/ws/Dispatch.javaPKK>5n'lOSGI-OPT/src/javax/xml/ws/Endpoint.javaPKK>1=J0OSGI-OPT/src/javax/xml/ws/EndpointReference.javaPKK>|}*wOSGI-OPT/src/javax/xml/ws/FaultAction.javaPKK>E]%OSGI-OPT/src/javax/xml/ws/Holder.javaPKK>Bi- OSGI-OPT/src/javax/xml/ws/LogicalMessage.javaPKK>gv0dOSGI-OPT/src/javax/xml/ws/ProtocolException.javaPKK>$JG'OSGI-OPT/src/javax/xml/ws/Provider.javaPKK>D&-OSGI-OPT/src/javax/xml/ws/RequestWrapper.javaPKK>J:?-KOSGI-OPT/src/javax/xml/ws/RespectBinding.javaPKK>~ 4OSGI-OPT/src/javax/xml/ws/RespectBindingFeature.javaPKK>&T'SOSGI-OPT/src/javax/xml/ws/Response.javaPKK>̼k(.OSGI-OPT/src/javax/xml/ws/ResponseWrapper.javaPKK>aL &OSGI-OPT/src/javax/xml/ws/Service.javaPKK>*OSGI-OPT/src/javax/xml/ws/ServiceMode.javaPKK>/*+OSGI-OPT/src/javax/xml/ws/WebEndpoint.javaPKK>;'OSGI-OPT/src/javax/xml/ws/WebFault.javaPKK>Ni'/ OSGI-OPT/src/javax/xml/ws/WebServiceClient.javaPKK>*>B0 OSGI-OPT/src/javax/xml/ws/WebServiceContext.javaPKK>R#2* OSGI-OPT/src/javax/xml/ws/WebServiceException.javaPKK>eBU0z OSGI-OPT/src/javax/xml/ws/WebServiceFeature.javaPKK>X 3 OSGI-OPT/src/javax/xml/ws/WebServicePermission.javaPKK>޹/,1+ OSGI-OPT/src/javax/xml/ws/WebServiceProvider.javaPKK>n=N, OSGI-OPT/src/javax/xml/ws/WebServiceRef.javaPKK> -a OSGI-OPT/src/javax/xml/ws/WebServiceRefs.javaPKIG@" OSGI-OPT/src/javax/xml/ws/handler/PKK>̣cY. OSGI-OPT/src/javax/xml/ws/handler/Handler.javaPKK>q! 6c OSGI-OPT/src/javax/xml/ws/handler/HandlerResolver.javaPKK>N385 OSGI-OPT/src/javax/xml/ws/handler/LogicalHandler.javaPKK>5uv\< OSGI-OPT/src/javax/xml/ws/handler/LogicalMessageContext.javaPKK>8wa 5 OSGI-OPT/src/javax/xml/ws/handler/MessageContext.javaPKK><//! OSGI-OPT/src/javax/xml/ws/handler/PortInfo.javaPKIG@'I# OSGI-OPT/src/javax/xml/ws/handler/soap/PKK>})V7# OSGI-OPT/src/javax/xml/ws/handler/soap/SOAPHandler.javaPKK>+7>% OSGI-OPT/src/javax/xml/ws/handler/soap/SOAPMessageContext.javaPKIG@( OSGI-OPT/src/javax/xml/ws/http/PKK>cb//( OSGI-OPT/src/javax/xml/ws/http/HTTPBinding.javaPKK>Gk*1=+ OSGI-OPT/src/javax/xml/ws/http/HTTPException.javaPKIG@- OSGI-OPT/src/javax/xml/ws/soap/PKK>--]J.- OSGI-OPT/src/javax/xml/ws/soap/Addressing.javaPKK>?F50 OSGI-OPT/src/javax/xml/ws/soap/AddressingFeature.javaPKK>v]fE(-3 OSGI-OPT/src/javax/xml/ws/soap/MTOM.javaPKK>4WKR/5 OSGI-OPT/src/javax/xml/ws/soap/MTOMFeature.javaPKK>%P/8 OSGI-OPT/src/javax/xml/ws/soap/SOAPBinding.javaPKK>:\6w; OSGI-OPT/src/javax/xml/ws/soap/SOAPFaultException.javaPKIG@= OSGI-OPT/src/javax/xml/ws/spi/PKK>A*+> OSGI-OPT/src/javax/xml/ws/spi/Provider.javaPKK>}  2gA OSGI-OPT/src/javax/xml/ws/spi/ServiceDelegate.javaPKK>-1>D OSGI-OPT/src/javax/xml/ws/spi/WebServiceFeatureAnnotation.javaPKIG@'xG OSGI-OPT/src/javax/xml/ws/wsaddressing/PKK>jcb@G OSGI-OPT/src/javax/xml/ws/wsaddressing/W3CEndpointReference.javaPKK>V&5QGJ OSGI-OPT/src/javax/xml/ws/wsaddressing/W3CEndpointReferenceBuilder.javaPKIG@eM OSGI-OPT/src/javax/xml/xpath/PKK> Qu'M OSGI-OPT/src/javax/xml/xpath/XPath.javaPKK>[s0|P OSGI-OPT/src/javax/xml/xpath/XPathConstants.javaPKK>T"80MS OSGI-OPT/src/javax/xml/xpath/XPathException.javaPKK>LL1U OSGI-OPT/src/javax/xml/xpath/XPathExpression.javaPKK>}:W OSGI-OPT/src/javax/xml/xpath/XPathExpressionException.javaPKK>i:.TZ OSGI-OPT/src/javax/xml/xpath/XPathFactory.javaPKK>]D] OSGI-OPT/src/javax/xml/xpath/XPathFactoryConfigurationException.javaPKK>G/_ OSGI-OPT/src/javax/xml/xpath/XPathFunction.javaPKK>89b OSGI-OPT/src/javax/xml/xpath/XPathFunctionException.javaPKK>e7d OSGI-OPT/src/javax/xml/xpath/XPathFunctionResolver.javaPKK>T$17f OSGI-OPT/src/javax/xml/xpath/XPathVariableResolver.javaPKIG@i OSGI-OPT/src/org/PKIG@Zi OSGI-OPT/src/org/ietf/PKIG@i OSGI-OPT/src/org/ietf/jgss/PKK>%.i OSGI-OPT/src/org/ietf/jgss/ChannelBinding.javaPKK>ݳ*Vl OSGI-OPT/src/org/ietf/jgss/GSSContext.javaPKK> -ap OSGI-OPT/src/org/ietf/jgss/GSSCredential.javaPKK>. x,}s OSGI-OPT/src/org/ietf/jgss/GSSException.javaPKK>:#r *v OSGI-OPT/src/org/ietf/jgss/GSSManager.javaPKK>7xc'y OSGI-OPT/src/org/ietf/jgss/GSSName.javaPKK>a֞FiO+| OSGI-OPT/src/org/ietf/jgss/MessageProp.javaPKK> a# OSGI-OPT/src/org/ietf/jgss/Oid.javaPKIG@ OSGI-OPT/src/org/omg/PKIG@M OSGI-OPT/src/org/omg/CORBA/PKK> O%2 OSGI-OPT/src/org/omg/CORBA/ACTIVITY_COMPLETED.javaPKK>qqP#1 OSGI-OPT/src/org/omg/CORBA/ACTIVITY_REQUIRED.javaPKK>>HmW& OSGI-OPT/src/org/omg/CORBA/ARG_IN.javaPKK>=) OSGI-OPT/src/org/omg/CORBA/ARG_INOUT.javaPKK>'ҋ OSGI-OPT/src/org/omg/CORBA/ARG_OUT.javaPKK>-# OSGI-OPT/src/org/omg/CORBA/Any.javaPKK>0:) OSGI-OPT/src/org/omg/CORBA/AnyHolder.javaPKK>v 8,x OSGI-OPT/src/org/omg/CORBA/AnySeqHelper.javaPKK> 1 , OSGI-OPT/src/org/omg/CORBA/AnySeqHolder.javaPKK>;+ OSGI-OPT/src/org/omg/CORBA/BAD_CONTEXT.javaPKK>OY - OSGI-OPT/src/org/omg/CORBA/BAD_INV_ORDER.javaPKK>B-r OSGI-OPT/src/org/omg/CORBA/BAD_OPERATION.javaPKK>) OSGI-OPT/src/org/omg/CORBA/BAD_PARAM.javaPKK>?*_ OSGI-OPT/src/org/omg/CORBA/BAD_POLICY.javaPKK>p?ȩ/ OSGI-OPT/src/org/omg/CORBA/BAD_POLICY_TYPE.javaPKK>"U0 OSGI-OPT/src/org/omg/CORBA/BAD_POLICY_VALUE.javaPKK>HE'٩ OSGI-OPT/src/org/omg/CORBA/BAD_QOS.javaPKK>농s,H OSGI-OPT/src/org/omg/CORBA/BAD_TYPECODE.javaPKK>F"- OSGI-OPT/src/org/omg/CORBA/BooleanHolder.javaPKK>jz';07 OSGI-OPT/src/org/omg/CORBA/BooleanSeqHelper.javaPKK>Vv!0г OSGI-OPT/src/org/omg/CORBA/BooleanSeqHolder.javaPKK>#d&O OSGI-OPT/src/org/omg/CORBA/Bounds.javaPKK>h:H*| OSGI-OPT/src/org/omg/CORBA/ByteHolder.javaPKK>'%4 OSGI-OPT/src/org/omg/CORBA/CODESET_INCOMPATIBLE.javaPKK>!Ps ,v OSGI-OPT/src/org/omg/CORBA/COMM_FAILURE.javaPKK>~2 OSGI-OPT/src/org/omg/CORBA/CTX_RESTRICT_SCOPE.javaPKK>* OSGI-OPT/src/org/omg/CORBA/CharHolder.javaPKK>t149- OSGI-OPT/src/org/omg/CORBA/CharSeqHelper.javaPKK>P-% OSGI-OPT/src/org/omg/CORBA/CharSeqHolder.javaPKK>Fsr0 OSGI-OPT/src/org/omg/CORBA/CompletionStatus.javaPKK>掵<6o OSGI-OPT/src/org/omg/CORBA/CompletionStatusHelper.javaPKK>)4' OSGI-OPT/src/org/omg/CORBA/Context.javaPKK>.*+ OSGI-OPT/src/org/omg/CORBA/ContextList.javaPKK>J' OSGI-OPT/src/org/omg/CORBA/Current.javaPKK>ME- OSGI-OPT/src/org/omg/CORBA/CurrentHelper.javaPKK>~- OSGI-OPT/src/org/omg/CORBA/CurrentHolder.javaPKK>\1. OSGI-OPT/src/org/omg/CORBA/CurrentOperations.javaPKK>s -> OSGI-OPT/src/org/omg/CORBA/CustomMarshal.javaPKK>v2  /r OSGI-OPT/src/org/omg/CORBA/DATA_CONVERSION.javaPKK>L(S/ OSGI-OPT/src/org/omg/CORBA/DataInputStream.javaPKK> k#0E OSGI-OPT/src/org/omg/CORBA/DataOutputStream.javaPKK>j_.v OSGI-OPT/src/org/omg/CORBA/DefinitionKind.javaPKK><4 OSGI-OPT/src/org/omg/CORBA/DefinitionKindHelper.javaPKK>v_S-D OSGI-OPT/src/org/omg/CORBA/DomainManager.javaPKK>7s OSGI-OPT/src/org/omg/CORBA/DomainManagerOperations.javaPKK>q6, OSGI-OPT/src/org/omg/CORBA/DoubleHolder.javaPKK>MF;/ OSGI-OPT/src/org/omg/CORBA/DoubleSeqHelper.javaPKK>:W/ OSGI-OPT/src/org/omg/CORBA/DoubleSeqHolder.javaPKK>ONf&0 OSGI-OPT/src/org/omg/CORBA/DynAny.javaPKIG@) OSGI-OPT/src/org/omg/CORBA/DynAnyPackage/PKK>s`J*%5C OSGI-OPT/src/org/omg/CORBA/DynAnyPackage/Invalid.javaPKK>P..8!OSGI-OPT/src/org/omg/CORBA/DynAnyPackage/InvalidSeq.javaPKK>ea4:!OSGI-OPT/src/org/omg/CORBA/DynAnyPackage/InvalidValue.javaPKK>3C4:$!OSGI-OPT/src/org/omg/CORBA/DynAnyPackage/TypeMismatch.javaPKK>hR.(t!OSGI-OPT/src/org/omg/CORBA/DynArray.javaPKK>IS-' !OSGI-OPT/src/org/omg/CORBA/DynEnum.javaPKK>wk n(3 !OSGI-OPT/src/org/omg/CORBA/DynFixed.javaPKK>!+!OSGI-OPT/src/org/omg/CORBA/DynSequence.javaPKK>/ !R5) !OSGI-OPT/src/org/omg/CORBA/DynStruct.javaPKK>Q3-(!OSGI-OPT/src/org/omg/CORBA/DynUnion.javaPKK>q4(!OSGI-OPT/src/org/omg/CORBA/DynValue.javaPKK>Z(5!OSGI-OPT/src/org/omg/CORBA/DynamicImplementation.javaPKK>ʟ|^+4!OSGI-OPT/src/org/omg/CORBA/Environment.javaPKK>-v!OSGI-OPT/src/org/omg/CORBA/ExceptionList.javaPKK>@P( !OSGI-OPT/src/org/omg/CORBA/FREE_MEM.javaPKK>ϹK3/D#!OSGI-OPT/src/org/omg/CORBA/FieldNameHelper.javaPKK>&+%!OSGI-OPT/src/org/omg/CORBA/FixedHolder.javaPKK>Y+S(!OSGI-OPT/src/org/omg/CORBA/FloatHolder.javaPKK>O:.*!OSGI-OPT/src/org/omg/CORBA/FloatSeqHelper.javaPKK>Iw".[-!OSGI-OPT/src/org/omg/CORBA/FloatSeqHolder.javaPKK>{U|'/!OSGI-OPT/src/org/omg/CORBA/IDLType.javaPKK>]'JE-1!OSGI-OPT/src/org/omg/CORBA/IDLTypeHelper.javaPKK>RTF14!OSGI-OPT/src/org/omg/CORBA/IDLTypeOperations.javaPKK>)6!OSGI-OPT/src/org/omg/CORBA/IMP_LIMIT.javaPKK>iU*=9!OSGI-OPT/src/org/omg/CORBA/INITIALIZE.javaPKK>7a-(;!OSGI-OPT/src/org/omg/CORBA/INTERNAL.javaPKK>H2Q* >!OSGI-OPT/src/org/omg/CORBA/INTF_REPOS.javaPKK>i:"0@!OSGI-OPT/src/org/omg/CORBA/INVALID_ACTIVITY.javaPKK>t x" 3C!OSGI-OPT/src/org/omg/CORBA/INVALID_TRANSACTION.javaPKK>SӸk(E!OSGI-OPT/src/org/omg/CORBA/INV_FLAG.javaPKK>p) H!OSGI-OPT/src/org/omg/CORBA/INV_IDENT.javaPKK>*}J!OSGI-OPT/src/org/omg/CORBA/INV_OBJREF.javaPKK>\^+*L!OSGI-OPT/src/org/omg/CORBA/INV_POLICY.javaPKK>s"(hO!OSGI-OPT/src/org/omg/CORBA/IRObject.javaPKK>D2Q!OSGI-OPT/src/org/omg/CORBA/IRObjectOperations.javaPKK>R130S!OSGI-OPT/src/org/omg/CORBA/IdentifierHelper.javaPKK>)QV!OSGI-OPT/src/org/omg/CORBA/IntHolder.javaPKK>LPz +X!OSGI-OPT/src/org/omg/CORBA/LocalObject.javaPKK>P3*\!OSGI-OPT/src/org/omg/CORBA/LongHolder.javaPKK>'z:1_!OSGI-OPT/src/org/omg/CORBA/LongLongSeqHelper.javaPKK>`C!1a!OSGI-OPT/src/org/omg/CORBA/LongLongSeqHolder.javaPKK>6E8{-d!OSGI-OPT/src/org/omg/CORBA/LongSeqHelper.javaPKK> -f!OSGI-OPT/src/org/omg/CORBA/LongSeqHolder.javaPKK>d:'*i!OSGI-OPT/src/org/omg/CORBA/MARSHAL.javaPKK>MI,k!OSGI-OPT/src/org/omg/CORBA/NO_IMPLEMENT.javaPKK>jB)n!OSGI-OPT/src/org/omg/CORBA/NO_MEMORY.javaPKK>pq-p!OSGI-OPT/src/org/omg/CORBA/NO_PERMISSION.javaPKK>Y,r!OSGI-OPT/src/org/omg/CORBA/NO_RESOURCES.javaPKK>◥a+vu!OSGI-OPT/src/org/omg/CORBA/NO_RESPONSE.javaPKK>7U7'|&w!OSGI-OPT/src/org/omg/CORBA/NVList.javaPKK>St-gz!OSGI-OPT/src/org/omg/CORBA/NameValuePair.javaPKK>e=3|!OSGI-OPT/src/org/omg/CORBA/NameValuePairHelper.javaPKK>ϦD*Y!OSGI-OPT/src/org/omg/CORBA/NamedValue.javaPKK>G#0!OSGI-OPT/src/org/omg/CORBA/OBJECT_NOT_EXIST.javaPKK>I^+!OSGI-OPT/src/org/omg/CORBA/OBJ_ADAPTER.javaPKK>(!OSGI-OPT/src/org/omg/CORBA/OMGVMCID.javaPKK>kI?ڎ!OSGI-OPT/src/org/omg/CORBA/ORBPackage/InconsistentTypeCode.javaPKK>OQ.60!OSGI-OPT/src/org/omg/CORBA/ORBPackage/InvalidName.javaPKK>?z&w!OSGI-OPT/src/org/omg/CORBA/Object.javaPKK>z`6,p!OSGI-OPT/src/org/omg/CORBA/ObjectHelper.javaPKK>ӡ,!OSGI-OPT/src/org/omg/CORBA/ObjectHolder.javaPKK>$:.t!OSGI-OPT/src/org/omg/CORBA/OctetSeqHelper.javaPKK>!/vS. !OSGI-OPT/src/org/omg/CORBA/OctetSeqHolder.javaPKK>1 f-!OSGI-OPT/src/org/omg/CORBA/PERSIST_STORE.javaPKK>W?.!OSGI-OPT/src/org/omg/CORBA/PRIVATE_MEMBER.javaPKK>qs-(!OSGI-OPT/src/org/omg/CORBA/PUBLIC_MEMBER.javaPKK> Q;-P!OSGI-OPT/src/org/omg/CORBA/ParameterMode.javaPKK>w;3!OSGI-OPT/src/org/omg/CORBA/ParameterModeHelper.javaPKK> 43!OSGI-OPT/src/org/omg/CORBA/ParameterModeHolder.javaPKK>y &!OSGI-OPT/src/org/omg/CORBA/Policy.javaPKK>Gj+'!OSGI-OPT/src/org/omg/CORBA/PolicyError.javaPKK>}<5t!OSGI-OPT/src/org/omg/CORBA/PolicyErrorCodeHelper.javaPKK>%4:1!OSGI-OPT/src/org/omg/CORBA/PolicyErrorHelper.javaPKK>|*1!OSGI-OPT/src/org/omg/CORBA/PolicyErrorHolder.javaPKK>E ,*!OSGI-OPT/src/org/omg/CORBA/PolicyHelper.javaPKK>+,ɽ!OSGI-OPT/src/org/omg/CORBA/PolicyHolder.javaPKK>%N=0=!OSGI-OPT/src/org/omg/CORBA/PolicyListHelper.javaPKK>4x!!0!OSGI-OPT/src/org/omg/CORBA/PolicyListHolder.javaPKK>DM0W!OSGI-OPT/src/org/omg/CORBA/PolicyOperations.javaPKK>o807s0!OSGI-OPT/src/org/omg/CORBA/PolicyTypeHelper.javaPKK>O)!OSGI-OPT/src/org/omg/CORBA/Principal.javaPKK>14I/m!OSGI-OPT/src/org/omg/CORBA/PrincipalHolder.javaPKK>&!OSGI-OPT/src/org/omg/CORBA/REBIND.javaPKK>u+52i!OSGI-OPT/src/org/omg/CORBA/RepositoryIdHelper.javaPKK>kq'!OSGI-OPT/src/org/omg/CORBA/Request.javaPKK>RN- !OSGI-OPT/src/org/omg/CORBA/ServerRequest.javaPKK>nq-!OSGI-OPT/src/org/omg/CORBA/ServiceDetail.javaPKK> ;3!OSGI-OPT/src/org/omg/CORBA/ServiceDetailHelper.javaPKK>S2!OSGI-OPT/src/org/omg/CORBA/ServiceInformation.javaPKK>9=8!OSGI-OPT/src/org/omg/CORBA/ServiceInformationHelper.javaPKK>#M8!OSGI-OPT/src/org/omg/CORBA/ServiceInformationHolder.javaPKK>v6/p95!OSGI-OPT/src/org/omg/CORBA/SetOverrideTypeHelper.javaPKK>b+k!OSGI-OPT/src/org/omg/CORBA/ShortHolder.javaPKK>bBTZ9.!OSGI-OPT/src/org/omg/CORBA/ShortSeqHelper.javaPKK>{.r!OSGI-OPT/src/org/omg/CORBA/ShortSeqHolder.javaPKK>7 ,!OSGI-OPT/src/org/omg/CORBA/StringHolder.javaPKK>P#6/f!OSGI-OPT/src/org/omg/CORBA/StringSeqHelper.javaPKK>\G&/!OSGI-OPT/src/org/omg/CORBA/StringSeqHolder.javaPKK>ih1|!OSGI-OPT/src/org/omg/CORBA/StringValueHelper.javaPKK>%s,C!OSGI-OPT/src/org/omg/CORBA/StructMember.javaPKK>ip92!OSGI-OPT/src/org/omg/CORBA/StructMemberHelper.javaPKK>h8:.e4o&"OSGI-OPT/src/org/omg/CORBA/TCKind.javaPKK>0&'4 "OSGI-OPT/src/org/omg/CORBA/TIMEOUT.javaPKK>v0 "OSGI-OPT/src/org/omg/CORBA/TRANSACTION_MODE.javaPKK>I¨$%4"OSGI-OPT/src/org/omg/CORBA/TRANSACTION_REQUIRED.javaPKK>e#E%/6"OSGI-OPT/src/org/omg/CORBA/TRANSACTION_ROLLEDBACK.javaPKK> S4'47."OSGI-OPT/src/org/omg/CORBA/TRANSACTION_UNAVAILABLE.javaPKK>DHp)"OSGI-OPT/src/org/omg/CORBA/TRANSIENT.javaPKK>(' (+"OSGI-OPT/src/org/omg/CORBA/TypeCode.javaPKK>c.U"OSGI-OPT/src/org/omg/CORBA/TypeCodeHolder.javaPKIG@+"OSGI-OPT/src/org/omg/CORBA/TypeCodePackage/PKK>V''7""OSGI-OPT/src/org/omg/CORBA/TypeCodePackage/BadKind.javaPKK>)$6l "OSGI-OPT/src/org/omg/CORBA/TypeCodePackage/Bounds.javaPKK> ;2""OSGI-OPT/src/org/omg/CORBA/ULongLongSeqHelper.javaPKK>"2L%"OSGI-OPT/src/org/omg/CORBA/ULongLongSeqHolder.javaPKK>hv1L8}.'"OSGI-OPT/src/org/omg/CORBA/ULongSeqHelper.javaPKK>=#~ .b*"OSGI-OPT/src/org/omg/CORBA/ULongSeqHolder.javaPKK>$4r[',"OSGI-OPT/src/org/omg/CORBA/UNKNOWN.javaPKK>KĞH2L/"OSGI-OPT/src/org/omg/CORBA/UNSUPPORTED_POLICY.javaPKK>FZ8|1"OSGI-OPT/src/org/omg/CORBA/UNSUPPORTED_POLICY_VALUE.javaPKK>:/3"OSGI-OPT/src/org/omg/CORBA/UShortSeqHelper.javaPKK>` /O6"OSGI-OPT/src/org/omg/CORBA/UShortSeqHolder.javaPKK> +8"OSGI-OPT/src/org/omg/CORBA/UnionMember.javaPKK>:1D;"OSGI-OPT/src/org/omg/CORBA/UnionMemberHelper.javaPKK>4a4="OSGI-OPT/src/org/omg/CORBA/UnknownUserException.javaPKK>TK[OA :@"OSGI-OPT/src/org/omg/CORBA/UnknownUserExceptionHelper.javaPKK>> B&W:B"OSGI-OPT/src/org/omg/CORBA/UnknownUserExceptionHolder.javaPKK>V-VE"OSGI-OPT/src/org/omg/CORBA/UserException.javaPKK>eH=+G"OSGI-OPT/src/org/omg/CORBA/VM_ABSTRACT.javaPKK>p<&)I"OSGI-OPT/src/org/omg/CORBA/VM_CUSTOM.javaPKK>JX'K"OSGI-OPT/src/org/omg/CORBA/VM_NONE.javaPKK>P.N"OSGI-OPT/src/org/omg/CORBA/VM_TRUNCATABLE.javaPKK>^>//P"OSGI-OPT/src/org/omg/CORBA/ValueBaseHelper.javaPKK>jx&/R"OSGI-OPT/src/org/omg/CORBA/ValueBaseHolder.javaPKK>=+MU"OSGI-OPT/src/org/omg/CORBA/ValueMember.javaPKK>{9:1W"OSGI-OPT/src/org/omg/CORBA/ValueMemberHelper.javaPKK>1 11|Z"OSGI-OPT/src/org/omg/CORBA/VersionSpecHelper.javaPKK>&9{0 ]"OSGI-OPT/src/org/omg/CORBA/VisibilityHelper.javaPKK>-:._"OSGI-OPT/src/org/omg/CORBA/WCharSeqHelper.javaPKK> .9b"OSGI-OPT/src/org/omg/CORBA/WCharSeqHolder.javaPKK>?)70d"OSGI-OPT/src/org/omg/CORBA/WStringSeqHelper.javaPKK>M'0Jg"OSGI-OPT/src/org/omg/CORBA/WStringSeqHolder.javaPKK>`i2i"OSGI-OPT/src/org/omg/CORBA/WStringValueHelper.javaPKK>(20l"OSGI-OPT/src/org/omg/CORBA/WrongTransaction.javaPKK>=6n"OSGI-OPT/src/org/omg/CORBA/WrongTransactionHelper.javaPKK> "C6xq"OSGI-OPT/src/org/omg/CORBA/WrongTransactionHolder.javaPKK>;0,s"OSGI-OPT/src/org/omg/CORBA/_IDLTypeStub.javaPKK>% '+v"OSGI-OPT/src/org/omg/CORBA/_PolicyStub.javaPKIG@$y"OSGI-OPT/src/org/omg/CORBA/portable/PKK>o<=\y"OSGI-OPT/src/org/omg/CORBA/portable/ApplicationException.javaPKK>r9{"OSGI-OPT/src/org/omg/CORBA/portable/BoxedValueHelper.javaPKK>B47~"OSGI-OPT/src/org/omg/CORBA/portable/CustomValue.javaPKK> tO 1f"OSGI-OPT/src/org/omg/CORBA/portable/Delegate.javaPKK>2o"OSGI-OPT/src/org/omg/CORBA/portable/IDLEntity.javaPKK>)q="OSGI-OPT/src/org/omg/CORBA/portable/IndirectionException.javaPKK>O 4"OSGI-OPT/src/org/omg/CORBA/portable/InputStream.javaPKK>\CX6"OSGI-OPT/src/org/omg/CORBA/portable/InvokeHandler.javaPKK>ea@ 3 "OSGI-OPT/src/org/omg/CORBA/portable/ObjectImpl.javaPKK> wS 5"OSGI-OPT/src/org/omg/CORBA/portable/OutputStream.javaPKK>=;"OSGI-OPT/src/org/omg/CORBA/portable/RemarshalException.javaPKK>ծw08"OSGI-OPT/src/org/omg/CORBA/portable/ResponseHandler.javaPKK>#%6,"OSGI-OPT/src/org/omg/CORBA/portable/ServantObject.javaPKK>I3]"OSGI-OPT/src/org/omg/CORBA/portable/Streamable.javaPKK>^ 8"OSGI-OPT/src/org/omg/CORBA/portable/StreamableValue.javaPKK>; 9ԡ"OSGI-OPT/src/org/omg/CORBA/portable/UnknownException.javaPKK>k 2H"OSGI-OPT/src/org/omg/CORBA/portable/ValueBase.javaPKK>_- 5"OSGI-OPT/src/org/omg/CORBA/portable/ValueFactory.javaPKK>o q9Ѩ"OSGI-OPT/src/org/omg/CORBA/portable/ValueInputStream.javaPKK>Ɗj:"OSGI-OPT/src/org/omg/CORBA/portable/ValueOutputStream.javaPKIG@J"OSGI-OPT/src/org/omg/CORBA_2_3/PKK>~>9'"OSGI-OPT/src/org/omg/CORBA_2_3/ORB.javaPKIG@('"OSGI-OPT/src/org/omg/CORBA_2_3/portable/PKK>uMS5"OSGI-OPT/src/org/omg/CORBA_2_3/portable/Delegate.javaPKK>Mz>;8߲"OSGI-OPT/src/org/omg/CORBA_2_3/portable/InputStream.javaPKK>ӃA7"OSGI-OPT/src/org/omg/CORBA_2_3/portable/ObjectImpl.javaPKK>~09ܷ"OSGI-OPT/src/org/omg/CORBA_2_3/portable/OutputStream.javaPKIG@s"OSGI-OPT/src/org/omg/CosNaming/PKK>9r+º"OSGI-OPT/src/org/omg/CosNaming/Binding.javaPKK><1""OSGI-OPT/src/org/omg/CosNaming/BindingHelper.javaPKK>#"1"OSGI-OPT/src/org/omg/CosNaming/BindingHolder.javaPKK>}-&3?"OSGI-OPT/src/org/omg/CosNaming/BindingIterator.javaPKK>-Gb9{"OSGI-OPT/src/org/omg/CosNaming/BindingIteratorHelper.javaPKK>A*J9D"OSGI-OPT/src/org/omg/CosNaming/BindingIteratorHolder.javaPKK>աS="OSGI-OPT/src/org/omg/CosNaming/BindingIteratorOperations.javaPKK>Zq 61"OSGI-OPT/src/org/omg/CosNaming/BindingIteratorPOA.javaPKK>l+C5"OSGI-OPT/src/org/omg/CosNaming/BindingListHelper.javaPKK>O)25"OSGI-OPT/src/org/omg/CosNaming/BindingListHolder.javaPKK>D9v/8"OSGI-OPT/src/org/omg/CosNaming/BindingType.javaPKK>pϠ=5"OSGI-OPT/src/org/omg/CosNaming/BindingTypeHelper.javaPKK>0%65n"OSGI-OPT/src/org/omg/CosNaming/BindingTypeHolder.javaPKK>G+41"OSGI-OPT/src/org/omg/CosNaming/IstringHelper.javaPKK>`1"OSGI-OPT/src/org/omg/CosNaming/NameComponent.javaPKK>\y?7"OSGI-OPT/src/org/omg/CosNaming/NameComponentHelper.javaPKK> IY'@7"OSGI-OPT/src/org/omg/CosNaming/NameComponentHolder.javaPKK>KUC."OSGI-OPT/src/org/omg/CosNaming/NameHelper.javaPKK>*)."OSGI-OPT/src/org/omg/CosNaming/NameHolder.javaPKK>p"16"OSGI-OPT/src/org/omg/CosNaming/NamingContext.javaPKK>س34n"OSGI-OPT/src/org/omg/CosNaming/NamingContextExt.javaPKK>6b:"OSGI-OPT/src/org/omg/CosNaming/NamingContextExtHelper.javaPKK>wp*O:r"OSGI-OPT/src/org/omg/CosNaming/NamingContextExtHolder.javaPKK>FYO>"OSGI-OPT/src/org/omg/CosNaming/NamingContextExtOperations.javaPKK>4p%7"OSGI-OPT/src/org/omg/CosNaming/NamingContextExtPOA.javaPKIG@7"OSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/PKK> TrCI"OSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/AddressHelper.javaPKK>4HJ"OSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/InvalidAddress.javaPKK>u9QqP#OSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/InvalidAddressHelper.javaPKK>*8P#OSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/InvalidAddressHolder.javaPKK>ACL#OSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/StringNameHelper.javaPKK> CK`#OSGI-OPT/src/org/omg/CosNaming/NamingContextExtPackage/URLStringHelper.javaPKK>BE^7 #OSGI-OPT/src/org/omg/CosNaming/NamingContextHelper.javaPKK>'@7 #OSGI-OPT/src/org/omg/CosNaming/NamingContextHolder.javaPKK>/5u ;k#OSGI-OPT/src/org/omg/CosNaming/NamingContextOperations.javaPKK>#o4j#OSGI-OPT/src/org/omg/CosNaming/NamingContextPOA.javaPKIG@4;#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/PKK>dG?E#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/AlreadyBound.javaPKK>COMVK#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/AlreadyBoundHelper.javaPKK>C&כ2zK#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/AlreadyBoundHolder.javaPKK>a&^Fr#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/CannotProceed.javaPKK>SO\L !#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/CannotProceedHelper.javaPKK>,G4L##OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/CannotProceedHolder.javaPKK>r<D&#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/InvalidName.javaPKK>-MPJ(#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/InvalidNameHelper.javaPKK>z3uJ+#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/InvalidNameHolder.javaPKK>m3AR.#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotEmpty.javaPKK>9`aK>G0#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotEmptyHelper.javaPKK>b1fGl3#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotEmptyHolder.javaPKK>\.A6#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotFound.javaPKK>{dxK>G8#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotFoundHelper.javaPKK>;1fGo;#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotFoundHolder.javaPKK>y_G>#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotFoundReason.javaPKK>֦PbM@#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotFoundReasonHelper.javaPKK>5MC#OSGI-OPT/src/org/omg/CosNaming/NamingContextPackage/NotFoundReasonHolder.javaPKK>`O`I<dF#OSGI-OPT/src/org/omg/CosNaming/_BindingIteratorImplBase.javaPKK>RdA28H#OSGI-OPT/src/org/omg/CosNaming/_BindingIteratorStub.javaPKK>9^K#OSGI-OPT/src/org/omg/CosNaming/_NamingContextExtStub.javaPKK>&jC:N#OSGI-OPT/src/org/omg/CosNaming/_NamingContextImplBase.javaPKK>\Y 6/Q#OSGI-OPT/src/org/omg/CosNaming/_NamingContextStub.javaPKIG@mT#OSGI-OPT/src/org/omg/Dynamic/PKK>o+T#OSGI-OPT/src/org/omg/Dynamic/Parameter.javaPKIG@ W#OSGI-OPT/src/org/omg/DynamicAny/PKK> %>1]W#OSGI-OPT/src/org/omg/DynamicAny/AnySeqHelper.javaPKK>W=+Y#OSGI-OPT/src/org/omg/DynamicAny/DynAny.javaPKK>0$2*\#OSGI-OPT/src/org/omg/DynamicAny/DynAnyFactory.javaPKK>Y>a8g^#OSGI-OPT/src/org/omg/DynamicAny/DynAnyFactoryHelper.javaPKK>Z+<.a#OSGI-OPT/src/org/omg/DynamicAny/DynAnyFactoryOperations.javaPKIG@5c#OSGI-OPT/src/org/omg/DynamicAny/DynAnyFactoryPackage/PKK>=XNd#OSGI-OPT/src/org/omg/DynamicAny/DynAnyFactoryPackage/InconsistentTypeCode.javaPKK>rPTxf#OSGI-OPT/src/org/omg/DynamicAny/DynAnyFactoryPackage/InconsistentTypeCodeHelper.javaPKK>@b^1Ji#OSGI-OPT/src/org/omg/DynamicAny/DynAnyHelper.javaPKK>vl*5l#OSGI-OPT/src/org/omg/DynamicAny/DynAnyOperations.javaPKIG@.o#OSGI-OPT/src/org/omg/DynamicAny/DynAnyPackage/PKK>9?Yp#OSGI-OPT/src/org/omg/DynamicAny/DynAnyPackage/InvalidValue.javaPKK>9SuK8Er#OSGI-OPT/src/org/omg/DynamicAny/DynAnyPackage/InvalidValueHelper.javaPKK><=<%9?qu#OSGI-OPT/src/org/omg/DynamicAny/DynAnyPackage/TypeMismatch.javaPKK>wfK8Ew#OSGI-OPT/src/org/omg/DynamicAny/DynAnyPackage/TypeMismatchHelper.javaPKK>LJD4z#OSGI-OPT/src/org/omg/DynamicAny/DynAnySeqHelper.javaPKK>-/}#OSGI-OPT/src/org/omg/DynamicAny/DynArray.javaPKK>q`3a#OSGI-OPT/src/org/omg/DynamicAny/DynArrayHelper.javaPKK>N#qT$~7"#OSGI-OPT/src/org/omg/DynamicAny/DynArrayOperations.javaPKK>wS,#OSGI-OPT/src/org/omg/DynamicAny/DynEnum.javaPKK>ert^2ۆ#OSGI-OPT/src/org/omg/DynamicAny/DynEnumHelper.javaPKK>≯ 6#OSGI-OPT/src/org/omg/DynamicAny/DynEnumOperations.javaPKK>#N-#OSGI-OPT/src/org/omg/DynamicAny/DynFixed.javaPKK>P0H`3:#OSGI-OPT/src/org/omg/DynamicAny/DynFixedHelper.javaPKK>pv7#OSGI-OPT/src/org/omg/DynamicAny/DynFixedOperations.javaPKK> c%0f#OSGI-OPT/src/org/omg/DynamicAny/DynSequence.javaPKK>1.E4`6#OSGI-OPT/src/org/omg/DynamicAny/DynSequenceHelper.javaPKK>e07:a#OSGI-OPT/src/org/omg/DynamicAny/DynSequenceOperations.javaPKK>B_!.#OSGI-OPT/src/org/omg/DynamicAny/DynStruct.javaPKK>]44#OSGI-OPT/src/org/omg/DynamicAny/DynStructHelper.javaPKK> R8#OSGI-OPT/src/org/omg/DynamicAny/DynStructOperations.javaPKK>X-#OSGI-OPT/src/org/omg/DynamicAny/DynUnion.javaPKK>_3ޤ#OSGI-OPT/src/org/omg/DynamicAny/DynUnionHelper.javaPKK>>W ]7#OSGI-OPT/src/org/omg/DynamicAny/DynUnionOperations.javaPKK>'-`#OSGI-OPT/src/org/omg/DynamicAny/DynValue.javaPKK>Kƶ-0#OSGI-OPT/src/org/omg/DynamicAny/DynValueBox.javaPKK>b&:Ю#OSGI-OPT/src/org/omg/DynamicAny/DynValueBoxOperations.javaPKK>+3^#OSGI-OPT/src/org/omg/DynamicAny/DynValueCommon.javaPKK>J /=#OSGI-OPT/src/org/omg/DynamicAny/DynValueCommonOperations.javaPKK>2`3#OSGI-OPT/src/org/omg/DynamicAny/DynValueHelper.javaPKK>cLzW87#OSGI-OPT/src/org/omg/DynamicAny/DynValueOperations.javaPKK>R:4f#OSGI-OPT/src/org/omg/DynamicAny/FieldNameHelper.javaPKK>ʜ@3#OSGI-OPT/src/org/omg/DynamicAny/NameDynAnyPair.javaPKK> B9e#OSGI-OPT/src/org/omg/DynamicAny/NameDynAnyPairHelper.javaPKK>јK <#OSGI-OPT/src/org/omg/DynamicAny/NameDynAnyPairSeqHelper.javaPKK>Ӽ-(2#OSGI-OPT/src/org/omg/DynamicAny/NameValuePair.javaPKK>(+B8##OSGI-OPT/src/org/omg/DynamicAny/NameValuePairHelper.javaPKK>Y]I;#OSGI-OPT/src/org/omg/DynamicAny/NameValuePairSeqHelper.javaPKK>pye7}#OSGI-OPT/src/org/omg/DynamicAny/_DynAnyFactoryStub.javaPKK>%G0G#OSGI-OPT/src/org/omg/DynamicAny/_DynAnyStub.javaPKK>oI2#OSGI-OPT/src/org/omg/DynamicAny/_DynArrayStub.javaPKK> fI1l#OSGI-OPT/src/org/omg/DynamicAny/_DynEnumStub.javaPKK>w462#OSGI-OPT/src/org/omg/DynamicAny/_DynFixedStub.javaPKK>:gX 5#OSGI-OPT/src/org/omg/DynamicAny/_DynSequenceStub.javaPKK>׹xs 3e#OSGI-OPT/src/org/omg/DynamicAny/_DynStructStub.javaPKK>- 29#OSGI-OPT/src/org/omg/DynamicAny/_DynUnionStub.javaPKK>ь 2&#OSGI-OPT/src/org/omg/DynamicAny/_DynValueStub.javaPKIG@#OSGI-OPT/src/org/omg/IOP/PKK>&[#OSGI-OPT/src/org/omg/IOP/CodeSets.javaPKK>gy#q#OSGI-OPT/src/org/omg/IOP/Codec.javaPKK>)q*#OSGI-OPT/src/org/omg/IOP/CodecFactory.javaPKK>SH[0#OSGI-OPT/src/org/omg/IOP/CodecFactoryHelper.javaPKK>w.4~#OSGI-OPT/src/org/omg/IOP/CodecFactoryOperations.javaPKIG@-$OSGI-OPT/src/org/omg/IOP/CodecFactoryPackage/PKK>\ AA $OSGI-OPT/src/org/omg/IOP/CodecFactoryPackage/UnknownEncoding.javaPKK>MEG$OSGI-OPT/src/org/omg/IOP/CodecFactoryPackage/UnknownEncodingHelper.javaPKK>2p-C$OSGI-OPT/src/org/omg/IOP/CodecOperations.javaPKIG@& $OSGI-OPT/src/org/omg/IOP/CodecPackage/PKK>qb79 $OSGI-OPT/src/org/omg/IOP/CodecPackage/FormatMismatch.javaPKK>cG?c $OSGI-OPT/src/org/omg/IOP/CodecPackage/FormatMismatchHelper.javaPKK>r-AOA$OSGI-OPT/src/org/omg/IOP/CodecPackage/InvalidTypeForEncoding.javaPKK>?hLLGy$OSGI-OPT/src/org/omg/IOP/CodecPackage/InvalidTypeForEncodingHelper.javaPKK>17:$OSGI-OPT/src/org/omg/IOP/CodecPackage/TypeMismatch.javaPKK>=D=$OSGI-OPT/src/org/omg/IOP/CodecPackage/TypeMismatchHelper.javaPKK>Wе<s/8$OSGI-OPT/src/org/omg/IOP/ComponentIdHelper.javaPKK>Aj1$OSGI-OPT/src/org/omg/IOP/ENCODING_CDR_ENCAPS.javaPKK>Ey&$OSGI-OPT/src/org/omg/IOP/Encoding.javaPKK>$3w4R $OSGI-OPT/src/org/omg/IOP/ExceptionDetailMessage.javaPKK>OE!"$OSGI-OPT/src/org/omg/IOP/IOR.javaPKK>057'$$OSGI-OPT/src/org/omg/IOP/IORHelper.javaPKK>'`'$OSGI-OPT/src/org/omg/IOP/IORHolder.javaPKK>kP<)$OSGI-OPT/src/org/omg/IOP/MultipleComponentProfileHelper.javaPKK>A6W<,$OSGI-OPT/src/org/omg/IOP/MultipleComponentProfileHolder.javaPKK>cL:o-,/$OSGI-OPT/src/org/omg/IOP/ProfileIdHelper.javaPKK> 7^61$OSGI-OPT/src/org/omg/IOP/RMICustomMaxStreamFormat.javaPKK>Jg,3$OSGI-OPT/src/org/omg/IOP/ServiceContext.javaPKK>W>2M6$OSGI-OPT/src/org/omg/IOP/ServiceContextHelper.javaPKK>sٌ&328$OSGI-OPT/src/org/omg/IOP/ServiceContextHolder.javaPKK>"g:E6q;$OSGI-OPT/src/org/omg/IOP/ServiceContextListHelper.javaPKK>b_-C6>$OSGI-OPT/src/org/omg/IOP/ServiceContextListHolder.javaPKK>5_:o-@$OSGI-OPT/src/org/omg/IOP/ServiceIdHelper.javaPKK>:R8@C$OSGI-OPT/src/org/omg/IOP/TAG_ALTERNATE_IIOP_ADDRESS.javaPKK>+xE$OSGI-OPT/src/org/omg/IOP/TAG_CODE_SETS.javaPKK>ɍ.G$OSGI-OPT/src/org/omg/IOP/TAG_INTERNET_IOP.javaPKK>*S/I$OSGI-OPT/src/org/omg/IOP/TAG_JAVA_CODEBASE.javaPKK>55K$OSGI-OPT/src/org/omg/IOP/TAG_MULTIPLE_COMPONENTS.javaPKK>ުƨ*N$OSGI-OPT/src/org/omg/IOP/TAG_ORB_TYPE.javaPKK>Li*m6>ZR$OSGI-OPT/src/org/omg/IOP/TAG_RMI_CUSTOM_MAX_STREAM_FORMAT.javaPKK> 3e-T$OSGI-OPT/src/org/omg/IOP/TaggedComponent.javaPKK>yx2"A3V$OSGI-OPT/src/org/omg/IOP/TaggedComponentHelper.javaPKK>p-'83Y$OSGI-OPT/src/org/omg/IOP/TaggedComponentHolder.javaPKK>Q]+$\$OSGI-OPT/src/org/omg/IOP/TaggedProfile.javaPKK>!M] ?1y^$OSGI-OPT/src/org/omg/IOP/TaggedProfileHelper.javaPKK>U_&.1a$OSGI-OPT/src/org/omg/IOP/TaggedProfileHolder.javaPKK>!0c$OSGI-OPT/src/org/omg/IOP/TransactionService.javaPKIG@e$OSGI-OPT/src/org/omg/Messaging/PKK>譼7f$OSGI-OPT/src/org/omg/Messaging/SYNC_WITH_TRANSPORT.javaPKK>K x>}3Eh$OSGI-OPT/src/org/omg/Messaging/SyncScopeHelper.javaPKIG@)j$OSGI-OPT/src/org/omg/PortableInterceptor/PKK>4=k$OSGI-OPT/src/org/omg/PortableInterceptor/ACTIVE.javaPKK>0*EDkm$OSGI-OPT/src/org/omg/PortableInterceptor/AdapterManagerIdHelper.javaPKK>wB?"p$OSGI-OPT/src/org/omg/PortableInterceptor/AdapterNameHelper.javaPKK>&,C@r$OSGI-OPT/src/org/omg/PortableInterceptor/AdapterStateHelper.javaPKK>aQ?u$OSGI-OPT/src/org/omg/PortableInterceptor/ClientRequestInfo.javaPKK>X_Fz$OSGI-OPT/src/org/omg/PortableInterceptor/ClientRequestInterceptor.javaPKK>y_2P }$OSGI-OPT/src/org/omg/PortableInterceptor/ClientRequestInterceptorOperations.javaPKK>UQ+5$OSGI-OPT/src/org/omg/PortableInterceptor/Current.javaPKK>a;ف$OSGI-OPT/src/org/omg/PortableInterceptor/CurrentHelper.javaPKK>0D?$OSGI-OPT/src/org/omg/PortableInterceptor/CurrentOperations.javaPKK>\Հ8 $OSGI-OPT/src/org/omg/PortableInterceptor/DISCARDING.javaPKK>ex<A$OSGI-OPT/src/org/omg/PortableInterceptor/ForwardRequest.javaPKK>xefI+B$OSGI-OPT/src/org/omg/PortableInterceptor/ForwardRequestHelper.javaPKK>V5i$OSGI-OPT/src/org/omg/PortableInterceptor/HOLDING.javaPKK>pC6$OSGI-OPT/src/org/omg/PortableInterceptor/INACTIVE.javaPKK>\Q*5˒$OSGI-OPT/src/org/omg/PortableInterceptor/IORInfo.javaPKK>ҞoR? $OSGI-OPT/src/org/omg/PortableInterceptor/IORInfoOperations.javaPKK>9 #K<ʗ$OSGI-OPT/src/org/omg/PortableInterceptor/IORInterceptor.javaPKK>X̙MF$OSGI-OPT/src/org/omg/PortableInterceptor/IORInterceptorOperations.javaPKK>nƭV@c$OSGI-OPT/src/org/omg/PortableInterceptor/IORInterceptor_3_0.javaPKK>q?j/F$OSGI-OPT/src/org/omg/PortableInterceptor/IORInterceptor_3_0Helper.javaPKK>-wF$OSGI-OPT/src/org/omg/PortableInterceptor/IORInterceptor_3_0Holder.javaPKK>j"!J/$OSGI-OPT/src/org/omg/PortableInterceptor/IORInterceptor_3_0Operations.javaPKK>gc^29Ȧ$OSGI-OPT/src/org/omg/PortableInterceptor/Interceptor.javaPKK>8BYC$OSGI-OPT/src/org/omg/PortableInterceptor/InterceptorOperations.javaPKK>ӥC19K$OSGI-OPT/src/org/omg/PortableInterceptor/InvalidSlot.javaPKK>9:F?$OSGI-OPT/src/org/omg/PortableInterceptor/InvalidSlotHelper.javaPKK>y>P$OSGI-OPT/src/org/omg/PortableInterceptor/LOCATION_FORWARD.javaPKK>f\:$OSGI-OPT/src/org/omg/PortableInterceptor/NON_EXISTENT.javaPKK>WN:9ɴ$OSGI-OPT/src/org/omg/PortableInterceptor/ORBIdHelper.javaPKK>L29j$OSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfo.javaPKK>=C$OSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoOperations.javaPKIG@<ͼ$OSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoPackage/PKK>%N9$OSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoPackage/DuplicateName.javaPKK>ORT$OSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoPackage/DuplicateNameHelper.javaPKK>[ysDL$OSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoPackage/InvalidName.javaPKK>52ʳQxR$OSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoPackage/InvalidNameHelper.javaPKK>"$GO$OSGI-OPT/src/org/omg/PortableInterceptor/ORBInitInfoPackage/ObjectIdHelper.javaPKK>_8<$OSGI-OPT/src/org/omg/PortableInterceptor/ORBInitializer.javaPKK>ӠJF$OSGI-OPT/src/org/omg/PortableInterceptor/ORBInitializerOperations.javaPKK>cn1D<,$OSGI-OPT/src/org/omg/PortableInterceptor/ObjectIdHelper.javaPKK>h;D$OSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceFactory.javaPKK>{ P[JH$OSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceFactoryHelper.javaPKK>v7J$OSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceFactoryHolder.javaPKK>cdfE$OSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceTemplate.javaPKK>PaK+$OSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceTemplateHelper.javaPKK>sF7K$OSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceTemplateHolder.javaPKK>VoN$OSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceTemplateSeqHelper.javaPKK>m=Nv$OSGI-OPT/src/org/omg/PortableInterceptor/ObjectReferenceTemplateSeqHolder.javaPKK>{6;/$OSGI-OPT/src/org/omg/PortableInterceptor/PolicyFactory.javaPKK>*j?*4Ex$OSGI-OPT/src/org/omg/PortableInterceptor/PolicyFactoryOperations.javaPKK>M29$OSGI-OPT/src/org/omg/PortableInterceptor/RequestInfo.javaPKK>k`C$OSGI-OPT/src/org/omg/PortableInterceptor/RequestInfoOperations.javaPKK>&ht8$OSGI-OPT/src/org/omg/PortableInterceptor/SUCCESSFUL.javaPKK>|>R$OSGI-OPT/src/org/omg/PortableInterceptor/SYSTEM_EXCEPTION.javaPKK>Ґ;<$OSGI-OPT/src/org/omg/PortableInterceptor/ServerIdHelper.javaPKK>3pQ?7$OSGI-OPT/src/org/omg/PortableInterceptor/ServerRequestInfo.javaPKK>jա~I$OSGI-OPT/src/org/omg/PortableInterceptor/ServerRequestInfoOperations.javaPKK>˳_F$OSGI-OPT/src/org/omg/PortableInterceptor/ServerRequestInterceptor.javaPKK>HVP$OSGI-OPT/src/org/omg/PortableInterceptor/ServerRequestInterceptorOperations.javaPKK>Q O'=z%OSGI-OPT/src/org/omg/PortableInterceptor/TRANSPORT_RETRY.javaPKK><%OSGI-OPT/src/org/omg/PortableInterceptor/USER_EXCEPTION.javaPKIG@$%OSGI-OPT/src/org/omg/PortableServer/PKK>IF29I%OSGI-OPT/src/org/omg/PortableServer/AdapterActivator.javaPKK>_C %OSGI-OPT/src/org/omg/PortableServer/AdapterActivatorOperations.javaPKK>1(!0 %OSGI-OPT/src/org/omg/PortableServer/Current.javaPKK>jWLI6%OSGI-OPT/src/org/omg/PortableServer/CurrentHelper.javaPKK>:%OSGI-OPT/src/org/omg/PortableServer/CurrentOperations.javaPKIG@3-%OSGI-OPT/src/org/omg/PortableServer/CurrentPackage/PKK>P5A%OSGI-OPT/src/org/omg/PortableServer/CurrentPackage/NoContext.javaPKK>1UK?G%OSGI-OPT/src/org/omg/PortableServer/CurrentPackage/NoContextHelper.javaPKK>!V>%OSGI-OPT/src/org/omg/PortableServer/DynamicImplementation.javaPKK>e 7 %OSGI-OPT/src/org/omg/PortableServer/ForwardRequest.javaPKK>: E=z%OSGI-OPT/src/org/omg/PortableServer/ForwardRequestHelper.javaPKK>/"@* %OSGI-OPT/src/org/omg/PortableServer/ID_ASSIGNMENT_POLICY_ID.javaPKK>"܎@p"%OSGI-OPT/src/org/omg/PortableServer/ID_UNIQUENESS_POLICY_ID.javaPKK>; F$%OSGI-OPT/src/org/omg/PortableServer/IMPLICIT_ACTIVATION_POLICY_ID.javaPKK>Wn6;'%OSGI-OPT/src/org/omg/PortableServer/IdAssignmentPolicy.javaPKK>(Ojw,EJ)%OSGI-OPT/src/org/omg/PortableServer/IdAssignmentPolicyOperations.javaPKK>A@+%OSGI-OPT/src/org/omg/PortableServer/IdAssignmentPolicyValue.javaPKK> 6;G.%OSGI-OPT/src/org/omg/PortableServer/IdUniquenessPolicy.javaPKK>)K,E0%OSGI-OPT/src/org/omg/PortableServer/IdUniquenessPolicyOperations.javaPKK>aNE@2%OSGI-OPT/src/org/omg/PortableServer/IdUniquenessPolicyValue.javaPKK>5BA5%OSGI-OPT/src/org/omg/PortableServer/ImplicitActivationPolicy.javaPKK>'8K7%OSGI-OPT/src/org/omg/PortableServer/ImplicitActivationPolicyOperations.javaPKK>J2F8:%OSGI-OPT/src/org/omg/PortableServer/ImplicitActivationPolicyValue.javaPKK>DG;<%OSGI-OPT/src/org/omg/PortableServer/LIFESPAN_POLICY_ID.javaPKK>AD.73?%OSGI-OPT/src/org/omg/PortableServer/LifespanPolicy.javaPKK>xmm$AqA%OSGI-OPT/src/org/omg/PortableServer/LifespanPolicyOperations.javaPKK>O/mc@<C%OSGI-OPT/src/org/omg/PortableServer/LifespanPolicyValue.javaPKK>,bF%OSGI-OPT/src/org/omg/PortableServer/POA.javaPKK> %,L-2H%OSGI-OPT/src/org/omg/PortableServer/POAHelper.javaPKK>v&3?K%OSGI-OPT/src/org/omg/PortableServer/POAManager.javaPKK>iq=|M%OSGI-OPT/src/org/omg/PortableServer/POAManagerOperations.javaPKIG@6O%OSGI-OPT/src/org/omg/PortableServer/POAManagerPackage/PKK>Ā}JJcP%OSGI-OPT/src/org/omg/PortableServer/POAManagerPackage/AdapterInactive.javaPKK>FHRrPR%OSGI-OPT/src/org/omg/PortableServer/POAManagerPackage/AdapterInactiveHelper.javaPKK>m^@U%OSGI-OPT/src/org/omg/PortableServer/POAManagerPackage/State.javaPKK>S 6lX%OSGI-OPT/src/org/omg/PortableServer/POAOperations.javaPKIG@/\%OSGI-OPT/src/org/omg/PortableServer/POAPackage/PKK>|qRHO]%OSGI-OPT/src/org/omg/PortableServer/POAPackage/AdapterAlreadyExists.javaPKK>;PmN_%OSGI-OPT/src/org/omg/PortableServer/POAPackage/AdapterAlreadyExistsHelper.javaPKK>*LFb%OSGI-OPT/src/org/omg/PortableServer/POAPackage/AdapterNonExistent.javaPKK>/OaLd%OSGI-OPT/src/org/omg/PortableServer/POAPackage/AdapterNonExistentHelper.javaPKK>eAg%OSGI-OPT/src/org/omg/PortableServer/POAPackage/InvalidPolicy.javaPKK>uKCG)j%OSGI-OPT/src/org/omg/PortableServer/POAPackage/InvalidPolicyHelper.javaPKK>GP1=l%OSGI-OPT/src/org/omg/PortableServer/POAPackage/NoServant.javaPKK>YG+C>o%OSGI-OPT/src/org/omg/PortableServer/POAPackage/NoServantHelper.javaPKK>hOGq%OSGI-OPT/src/org/omg/PortableServer/POAPackage/ObjectAlreadyActive.javaPKK>t0PgM`t%OSGI-OPT/src/org/omg/PortableServer/POAPackage/ObjectAlreadyActiveHelper.javaPKK>ACC+w%OSGI-OPT/src/org/omg/PortableServer/POAPackage/ObjectNotActive.javaPKK>[ MOIy%OSGI-OPT/src/org/omg/PortableServer/POAPackage/ObjectNotActiveHelper.javaPKK>Un+mRHQ|%OSGI-OPT/src/org/omg/PortableServer/POAPackage/ServantAlreadyActive.javaPKK>~OmN~%OSGI-OPT/src/org/omg/PortableServer/POAPackage/ServantAlreadyActiveHelper.javaPKK>6FD%OSGI-OPT/src/org/omg/PortableServer/POAPackage/ServantNotActive.javaPKK>|Tm?LUJ%OSGI-OPT/src/org/omg/PortableServer/POAPackage/ServantNotActiveHelper.javaPKK>:@%OSGI-OPT/src/org/omg/PortableServer/POAPackage/WrongAdapter.javaPKK> K=F%OSGI-OPT/src/org/omg/PortableServer/POAPackage/WrongAdapterHelper.javaPKK>O7?Ƌ%OSGI-OPT/src/org/omg/PortableServer/POAPackage/WrongPolicy.javaPKK>! 9J7E %OSGI-OPT/src/org/omg/PortableServer/POAPackage/WrongPolicyHelper.javaPKK>.=,Eݐ%OSGI-OPT/src/org/omg/PortableServer/REQUEST_PROCESSING_POLICY_ID.javaPKK>,@@,%OSGI-OPT/src/org/omg/PortableServer/RequestProcessingPolicy.javaPKK>LC6J|%OSGI-OPT/src/org/omg/PortableServer/RequestProcessingPolicyOperations.javaPKK>^sEӗ%OSGI-OPT/src/org/omg/PortableServer/RequestProcessingPolicyValue.javaPKK>-D%OSGI-OPT/src/org/omg/PortableServer/SERVANT_RETENTION_POLICY_ID.javaPKK>r{!0%OSGI-OPT/src/org/omg/PortableServer/Servant.javaPKK>&ŊBC9%OSGI-OPT/src/org/omg/PortableServer/ServantActivator.javaPKK>g?>%OSGI-OPT/src/org/omg/PortableServer/ServantActivatorHelper.javaPKK>s! C%OSGI-OPT/src/org/omg/PortableServer/ServantActivatorOperations.javaPKK>j9<%OSGI-OPT/src/org/omg/PortableServer/ServantActivatorPOA.javaPKK>A ?7u%OSGI-OPT/src/org/omg/PortableServer/ServantLocator.javaPKK>Ae=%OSGI-OPT/src/org/omg/PortableServer/ServantLocatorHelper.javaPKK> n>:pA%OSGI-OPT/src/org/omg/PortableServer/ServantLocatorOperations.javaPKK>Xi/:1%OSGI-OPT/src/org/omg/PortableServer/ServantLocatorPOA.javaPKIG@:%OSGI-OPT/src/org/omg/PortableServer/ServantLocatorPackage/PKK>[lS4(Kl%OSGI-OPT/src/org/omg/PortableServer/ServantLocatorPackage/CookieHolder.javaPKK>*.7%OSGI-OPT/src/org/omg/PortableServer/ServantManager.javaPKK>NA[%OSGI-OPT/src/org/omg/PortableServer/ServantManagerOperations.javaPKK> >?%OSGI-OPT/src/org/omg/PortableServer/ServantRetentionPolicy.javaPKK> Pk4I;%OSGI-OPT/src/org/omg/PortableServer/ServantRetentionPolicyOperations.javaPKK>k<D%OSGI-OPT/src/org/omg/PortableServer/ServantRetentionPolicyValue.javaPKK><9%OSGI-OPT/src/org/omg/PortableServer/THREAD_POLICY_ID.javaPKK>T6L*5%OSGI-OPT/src/org/omg/PortableServer/ThreadPolicy.javaPKK>`  ?D%OSGI-OPT/src/org/omg/PortableServer/ThreadPolicyOperations.javaPKK>RmJ:%OSGI-OPT/src/org/omg/PortableServer/ThreadPolicyValue.javaPKK>7lv>;%OSGI-OPT/src/org/omg/PortableServer/_ServantActivatorStub.javaPKK>YUN<%OSGI-OPT/src/org/omg/PortableServer/_ServantLocatorStub.javaPKIG@- %OSGI-OPT/src/org/omg/PortableServer/portable/PKK>)6:i%OSGI-OPT/src/org/omg/PortableServer/portable/Delegate.javaPKIG@$%OSGI-OPT/src/org/omg/SendingContext/PKK> 0[%OSGI-OPT/src/org/omg/SendingContext/RunTime.javaPKK>MX=:%OSGI-OPT/src/org/omg/SendingContext/RunTimeOperations.javaPKIG@%OSGI-OPT/src/org/omg/stub/PKIG@%OSGI-OPT/src/org/omg/stub/java/PKIG@#L%OSGI-OPT/src/org/omg/stub/java/rmi/PKK>۶D4%OSGI-OPT/src/org/omg/stub/java/rmi/_Remote_Stub.javaPKIG@ %OSGI-OPT/src/org/omg/stub/javax/PKIG@+I%OSGI-OPT/src/org/omg/stub/javax/management/PKIG@2%OSGI-OPT/src/org/omg/stub/javax/management/remote/PKIG@6%OSGI-OPT/src/org/omg/stub/javax/management/remote/rmi/PKK>e*IIQl%OSGI-OPT/src/org/omg/stub/javax/management/remote/rmi/_RMIConnectionImpl_Tie.javaPKK>cLqNx%OSGI-OPT/src/org/omg/stub/javax/management/remote/rmi/_RMIConnection_Stub.javaPKK>xAMe%OSGI-OPT/src/org/omg/stub/javax/management/remote/rmi/_RMIServerImpl_Tie.javaPKK>FmBCJk%OSGI-OPT/src/org/omg/stub/javax/management/remote/rmi/_RMIServer_Stub.javaPKIG@%%OSGI-OPT/src/org/w3c/PKIG@j%OSGI-OPT/src/org/w3c/dom/PKK>P|? "%OSGI-OPT/src/org/w3c/dom/Attr.javaPKK>6&*%OSGI-OPT/src/org/w3c/dom/CDATASection.javaPKK>(+ %OSGI-OPT/src/org/w3c/dom/CharacterData.javaPKK>ly%%OSGI-OPT/src/org/w3c/dom/Comment.javaPKK>#.%OSGI-OPT/src/org/w3c/dom/DOMConfiguration.javaPKK>Dn0 &%OSGI-OPT/src/org/w3c/dom/DOMError.javaPKK>ʎt-%OSGI-OPT/src/org/w3c/dom/DOMErrorHandler.javaPKK>5u*%OSGI-OPT/src/org/w3c/dom/DOMException.javaPKK>l +/&OSGI-OPT/src/org/w3c/dom/DOMImplementation.javaPKK>(30&OSGI-OPT/src/org/w3c/dom/DOMImplementationList.javaPKK>\5b&OSGI-OPT/src/org/w3c/dom/DOMImplementationSource.javaPKK>J(&OSGI-OPT/src/org/w3c/dom/DOMLocator.javaPKK>C+ &OSGI-OPT/src/org/w3c/dom/DOMStringList.javaPKK> &( &OSGI-OPT/src/org/w3c/dom/Document.javaPKK>x#j.&OSGI-OPT/src/org/w3c/dom/DocumentFragment.javaPKK>ː*&OSGI-OPT/src/org/w3c/dom/DocumentType.javaPKK>Du% &OSGI-OPT/src/org/w3c/dom/Element.javaPKK>}$&OSGI-OPT/src/org/w3c/dom/Entity.javaPKK>Q4&-&OSGI-OPT/src/org/w3c/dom/EntityReference.javaPKK>%7~&0&OSGI-OPT/src/org/w3c/dom/NameList.javaPKK>Iᣫi*w&OSGI-OPT/src/org/w3c/dom/NamedNodeMap.javaPKK>9/ "&OSGI-OPT/src/org/w3c/dom/Node.javaPKK>7-&T$&OSGI-OPT/src/org/w3c/dom/NodeList.javaPKK>&q&&OSGI-OPT/src/org/w3c/dom/Notation.javaPKK> `>53(&OSGI-OPT/src/org/w3c/dom/ProcessingInstruction.javaPKK>xv"*&OSGI-OPT/src/org/w3c/dom/Text.javaPKK>& &3-&OSGI-OPT/src/org/w3c/dom/TypeInfo.javaPKK>َ* -/&OSGI-OPT/src/org/w3c/dom/UserDataHandler.javaPKIG@#22&OSGI-OPT/src/org/w3c/dom/bootstrap/PKK>(]~A2&OSGI-OPT/src/org/w3c/dom/bootstrap/DOMImplementationRegistry.javaPKIG@5&OSGI-OPT/src/org/w3c/dom/css/PKK>#B(05&OSGI-OPT/src/org/w3c/dom/css/CSS2Properties.javaPKK>"0t<&OSGI-OPT/src/org/w3c/dom/css/CSSCharsetRule.javaPKK>-{ 1>&OSGI-OPT/src/org/w3c/dom/css/CSSFontFaceRule.javaPKK> nR/@&OSGI-OPT/src/org/w3c/dom/css/CSSImportRule.javaPKK>~.9C&OSGI-OPT/src/org/w3c/dom/css/CSSMediaRule.javaPKK>CX-E&OSGI-OPT/src/org/w3c/dom/css/CSSPageRule.javaPKK>3]3G&OSGI-OPT/src/org/w3c/dom/css/CSSPrimitiveValue.javaPKK>ƯrV)EK&OSGI-OPT/src/org/w3c/dom/css/CSSRule.javaPKK>nN-M&OSGI-OPT/src/org/w3c/dom/css/CSSRuleList.javaPKK>MQ25P&OSGI-OPT/src/org/w3c/dom/css/CSSStyleDeclaration.javaPKK>3Y.R&OSGI-OPT/src/org/w3c/dom/css/CSSStyleRule.javaPKK> /U&OSGI-OPT/src/org/w3c/dom/css/CSSStyleSheet.javaPKK>*>ɿ0hW&OSGI-OPT/src/org/w3c/dom/css/CSSUnknownRule.javaPKK>~!*Y&OSGI-OPT/src/org/w3c/dom/css/CSSValue.javaPKK>^K,.[&OSGI-OPT/src/org/w3c/dom/css/CSSValueList.javaPKK>Nm:)1^&OSGI-OPT/src/org/w3c/dom/css/Counter.javaPKK>ǜeE6a`&OSGI-OPT/src/org/w3c/dom/css/DOMImplementationCSS.javaPKK>EWJ-b&OSGI-OPT/src/org/w3c/dom/css/DocumentCSS.javaPKK> c{7d&OSGI-OPT/src/org/w3c/dom/css/ElementCSSInlineStyle.javaPKK>;*1g&OSGI-OPT/src/org/w3c/dom/css/RGBColor.javaPKK>Ppg&_i&OSGI-OPT/src/org/w3c/dom/css/Rect.javaPKK>w@?)k&OSGI-OPT/src/org/w3c/dom/css/ViewCSS.javaPKIG@ m&OSGI-OPT/src/org/w3c/dom/events/PKK>2(n&OSGI-OPT/src/org/w3c/dom/events/DocumentEvent.javaPKK>ߣFf*Xp&OSGI-OPT/src/org/w3c/dom/events/Event.javaPKK>g3s&OSGI-OPT/src/org/w3c/dom/events/EventException.javaPKK>L82u&OSGI-OPT/src/org/w3c/dom/events/EventListener.javaPKK>A?U0w&OSGI-OPT/src/org/w3c/dom/events/EventTarget.javaPKK>>]t/ z&OSGI-OPT/src/org/w3c/dom/events/MouseEvent.javaPKK>[2|&OSGI-OPT/src/org/w3c/dom/events/MutationEvent.javaPKK>H ,&OSGI-OPT/src/org/w3c/dom/events/UIEvent.javaPKIG@&OSGI-OPT/src/org/w3c/dom/html/PKK>\^-4H&OSGI-OPT/src/org/w3c/dom/html/HTMLAnchorElement.javaPKK>W?4&OSGI-OPT/src/org/w3c/dom/html/HTMLAppletElement.javaPKK>2:2&OSGI-OPT/src/org/w3c/dom/html/HTMLAreaElement.javaPKK>!0C&OSGI-OPT/src/org/w3c/dom/html/HTMLBRElement.javaPKK>&h2&OSGI-OPT/src/org/w3c/dom/html/HTMLBaseElement.javaPKK>H6ӎ&OSGI-OPT/src/org/w3c/dom/html/HTMLBaseFontElement.javaPKK> 23&OSGI-OPT/src/org/w3c/dom/html/HTMLBodyElement.javaPKK>A4i4&OSGI-OPT/src/org/w3c/dom/html/HTMLButtonElement.javaPKK>cٵ 1=&OSGI-OPT/src/org/w3c/dom/html/HTMLCollection.javaPKK>a Q3&OSGI-OPT/src/org/w3c/dom/html/HTMLDListElement.javaPKK>Z 0/8Ú&OSGI-OPT/src/org/w3c/dom/html/HTMLDOMImplementation.javaPKK>ϐV7 &OSGI-OPT/src/org/w3c/dom/html/HTMLDirectoryElement.javaPKK>b "1S&OSGI-OPT/src/org/w3c/dom/html/HTMLDivElement.javaPKK>Ts[e/&OSGI-OPT/src/org/w3c/dom/html/HTMLDocument.javaPKK>7&.W&OSGI-OPT/src/org/w3c/dom/html/HTMLElement.javaPKK>(*6&OSGI-OPT/src/org/w3c/dom/html/HTMLFieldSetElement.javaPKK>42&OSGI-OPT/src/org/w3c/dom/html/HTMLFontElement.javaPKK><2H&OSGI-OPT/src/org/w3c/dom/html/HTMLFormElement.javaPKK>PU3&OSGI-OPT/src/org/w3c/dom/html/HTMLFrameElement.javaPKK> #xh6&OSGI-OPT/src/org/w3c/dom/html/HTMLFrameSetElement.javaPKK>Ib0&OSGI-OPT/src/org/w3c/dom/html/HTMLHRElement.javaPKK>{Z'2U&OSGI-OPT/src/org/w3c/dom/html/HTMLHeadElement.javaPKK> D&5&OSGI-OPT/src/org/w3c/dom/html/HTMLHeadingElement.javaPKK>渴'2&OSGI-OPT/src/org/w3c/dom/html/HTMLHtmlElement.javaPKK> ڶT4%&OSGI-OPT/src/org/w3c/dom/html/HTMLIFrameElement.javaPKK>ZV3۾&OSGI-OPT/src/org/w3c/dom/html/HTMLImageElement.javaPKK>Fմw3&OSGI-OPT/src/org/w3c/dom/html/HTMLInputElement.javaPKK>U5&OSGI-OPT/src/org/w3c/dom/html/HTMLIsIndexElement.javaPKK>iqJ0&OSGI-OPT/src/org/w3c/dom/html/HTMLLIElement.javaPKK>eQ3O&OSGI-OPT/src/org/w3c/dom/html/HTMLLabelElement.javaPKK> 4&OSGI-OPT/src/org/w3c/dom/html/HTMLLegendElement.javaPKK>lA<?2&OSGI-OPT/src/org/w3c/dom/html/HTMLLinkElement.javaPKK>fM1&OSGI-OPT/src/org/w3c/dom/html/HTMLMapElement.javaPKK>x`l2&OSGI-OPT/src/org/w3c/dom/html/HTMLMenuElement.javaPKK>Ur2?&OSGI-OPT/src/org/w3c/dom/html/HTMLMetaElement.javaPKK>nk1&OSGI-OPT/src/org/w3c/dom/html/HTMLModElement.javaPKK>2@(3&OSGI-OPT/src/org/w3c/dom/html/HTMLOListElement.javaPKK>4[&OSGI-OPT/src/org/w3c/dom/html/HTMLObjectElement.javaPKK>2`6j&OSGI-OPT/src/org/w3c/dom/html/HTMLOptGroupElement.javaPKK>qr2~4&OSGI-OPT/src/org/w3c/dom/html/HTMLOptionElement.javaPKK>-(7\&OSGI-OPT/src/org/w3c/dom/html/HTMLParagraphElement.javaPKK>9Z3&OSGI-OPT/src/org/w3c/dom/html/HTMLParamElement.javaPKK>D1&OSGI-OPT/src/org/w3c/dom/html/HTMLPreElement.javaPKK>."3A&OSGI-OPT/src/org/w3c/dom/html/HTMLQuoteElement.javaPKK>|fr)4&OSGI-OPT/src/org/w3c/dom/html/HTMLScriptElement.javaPKK>@ {4&OSGI-OPT/src/org/w3c/dom/html/HTMLSelectElement.javaPKK>/*3&OSGI-OPT/src/org/w3c/dom/html/HTMLStyleElement.javaPKK>TJ+:P&OSGI-OPT/src/org/w3c/dom/html/HTMLTableCaptionElement.javaPKK>T;_x7&OSGI-OPT/src/org/w3c/dom/html/HTMLTableCellElement.javaPKK>[_N`6|&OSGI-OPT/src/org/w3c/dom/html/HTMLTableColElement.javaPKK>%D3&OSGI-OPT/src/org/w3c/dom/html/HTMLTableElement.javaPKK>@6 'OSGI-OPT/src/org/w3c/dom/html/HTMLTableRowElement.javaPKK>$p:'OSGI-OPT/src/org/w3c/dom/html/HTMLTableSectionElement.javaPKK>V0mv6;'OSGI-OPT/src/org/w3c/dom/html/HTMLTextAreaElement.javaPKK>I2"3 'OSGI-OPT/src/org/w3c/dom/html/HTMLTitleElement.javaPKK>>Y3P 'OSGI-OPT/src/org/w3c/dom/html/HTMLUListElement.javaPKIG@ 'OSGI-OPT/src/org/w3c/dom/ls/PKK>ue%4 'OSGI-OPT/src/org/w3c/dom/ls/DOMImplementationLS.javaPKK>j |,{'OSGI-OPT/src/org/w3c/dom/ls/LSException.javaPKK>- C('OSGI-OPT/src/org/w3c/dom/ls/LSInput.javaPKK> ,x'OSGI-OPT/src/org/w3c/dom/ls/LSLoadEvent.javaPKK>_ )'OSGI-OPT/src/org/w3c/dom/ls/LSOutput.javaPKK>1V)'OSGI-OPT/src/org/w3c/dom/ls/LSParser.javaPKK>%c"/'OSGI-OPT/src/org/w3c/dom/ls/LSParserFilter.javaPKK>/%0x'OSGI-OPT/src/org/w3c/dom/ls/LSProgressEvent.javaPKK>LhV3 'OSGI-OPT/src/org/w3c/dom/ls/LSResourceResolver.javaPKK>x/T-"'OSGI-OPT/src/org/w3c/dom/ls/LSSerializer.javaPKK>>sG,3%'OSGI-OPT/src/org/w3c/dom/ls/LSSerializerFilter.javaPKIG@ ''OSGI-OPT/src/org/w3c/dom/ranges/PKK>W2('OSGI-OPT/src/org/w3c/dom/ranges/DocumentRange.javaPKK>x*3*'OSGI-OPT/src/org/w3c/dom/ranges/Range.javaPKK>k3c-'OSGI-OPT/src/org/w3c/dom/ranges/RangeException.javaPKIG@%/'OSGI-OPT/src/org/w3c/dom/stylesheets/PKK>770'OSGI-OPT/src/org/w3c/dom/stylesheets/DocumentStyle.javaPKK>.3h2'OSGI-OPT/src/org/w3c/dom/stylesheets/LinkStyle.javaPKK>˲t34'OSGI-OPT/src/org/w3c/dom/stylesheets/MediaList.javaPKK>+46'OSGI-OPT/src/org/w3c/dom/stylesheets/StyleSheet.javaPKK>t8a9'OSGI-OPT/src/org/w3c/dom/stylesheets/StyleSheetList.javaPKIG@#;'OSGI-OPT/src/org/w3c/dom/traversal/PKK> 9;'OSGI-OPT/src/org/w3c/dom/traversal/DocumentTraversal.javaPKK>Vt2R>'OSGI-OPT/src/org/w3c/dom/traversal/NodeFilter.javaPKK>Kef 4DA'OSGI-OPT/src/org/w3c/dom/traversal/NodeIterator.javaPKK>їR4w2C'OSGI-OPT/src/org/w3c/dom/traversal/TreeWalker.javaPKIG@CF'OSGI-OPT/src/org/w3c/dom/views/PKK>զ0F'OSGI-OPT/src/org/w3c/dom/views/AbstractView.javaPKK>P0H'OSGI-OPT/src/org/w3c/dom/views/DocumentView.javaPKIG@J'OSGI-OPT/src/org/w3c/dom/xpath/PKK>[2-K'OSGI-OPT/src/org/w3c/dom/xpath/XPathEvaluator.javaPKK>ߗ2M'OSGI-OPT/src/org/w3c/dom/xpath/XPathException.javaPKK>no3P'OSGI-OPT/src/org/w3c/dom/xpath/XPathExpression.javaPKK> +3]R'OSGI-OPT/src/org/w3c/dom/xpath/XPathNSResolver.javaPKK>02T'OSGI-OPT/src/org/w3c/dom/xpath/XPathNamespace.javaPKK>(k/V'OSGI-OPT/src/org/w3c/dom/xpath/XPathResult.javaPKIG@Y'OSGI-OPT/src/org/xml/PKIG@AZ'OSGI-OPT/src/org/xml/sax/PKK>9z\+Z'OSGI-OPT/src/org/xml/sax/AttributeList.javaPKK> x (\'OSGI-OPT/src/org/xml/sax/Attributes.javaPKK>+dtq},6_'OSGI-OPT/src/org/xml/sax/ContentHandler.javaPKK>~A(b'OSGI-OPT/src/org/xml/sax/DTDHandler.javaPKK>}|X5-Od'OSGI-OPT/src/org/xml/sax/DocumentHandler.javaPKK>s>,g'OSGI-OPT/src/org/xml/sax/EntityResolver.javaPKK>)0*Ii'OSGI-OPT/src/org/xml/sax/ErrorHandler.javaPKK>9)k'OSGI-OPT/src/org/xml/sax/HandlerBase.javaPKK>Y>c7)n'OSGI-OPT/src/org/xml/sax/InputSource.javaPKK>6^%Oq'OSGI-OPT/src/org/xml/sax/Locator.javaPKK><$s'OSGI-OPT/src/org/xml/sax/Parser.javaPKK>M* v'OSGI-OPT/src/org/xml/sax/SAXException.javaPKK> #B7Ux'OSGI-OPT/src/org/xml/sax/SAXNotRecognizedException.javaPKK>H?6z'OSGI-OPT/src/org/xml/sax/SAXNotSupportedException.javaPKK>;]/|'OSGI-OPT/src/org/xml/sax/SAXParseException.javaPKK>Rԁ'r'OSGI-OPT/src/org/xml/sax/XMLFilter.javaPKK>dY!''OSGI-OPT/src/org/xml/sax/XMLReader.javaPKIG@|'OSGI-OPT/src/org/xml/sax/ext/PKK>yP-Ʉ'OSGI-OPT/src/org/xml/sax/ext/Attributes2.javaPKK>ro7y1'OSGI-OPT/src/org/xml/sax/ext/Attributes2Impl.javaPKK>j& -'OSGI-OPT/src/org/xml/sax/ext/DeclHandler.javaPKK>DC' 1'OSGI-OPT/src/org/xml/sax/ext/DefaultHandler2.javaPKK>+#13'OSGI-OPT/src/org/xml/sax/ext/EntityResolver2.javaPKK>#R\ 0'OSGI-OPT/src/org/xml/sax/ext/LexicalHandler.javaPKK>:n*#'OSGI-OPT/src/org/xml/sax/ext/Locator2.javaPKK>).S'OSGI-OPT/src/org/xml/sax/ext/Locator2Impl.javaPKIG@!Ș'OSGI-OPT/src/org/xml/sax/helpers/PKK>S7'OSGI-OPT/src/org/xml/sax/helpers/AttributeListImpl.javaPKK>9e; 4ћ'OSGI-OPT/src/org/xml/sax/helpers/AttributesImpl.javaPKK>/[^ 4Ȟ'OSGI-OPT/src/org/xml/sax/helpers/DefaultHandler.javaPKK>3i'1/'OSGI-OPT/src/org/xml/sax/helpers/LocatorImpl.javaPKK>R|6'OSGI-OPT/src/org/xml/sax/helpers/NamespaceSupport.javaPKK>RMXRq 3ɧ'OSGI-OPT/src/org/xml/sax/helpers/ParserAdapter.javaPKK>-IQ3|'OSGI-OPT/src/org/xml/sax/helpers/ParserFactory.javaPKK>Jcj3.'OSGI-OPT/src/org/xml/sax/helpers/XMLFilterImpl.javaPKK>W 6e'OSGI-OPT/src/org/xml/sax/helpers/XMLReaderAdapter.javaPKK>Ys-6ȵ'OSGI-OPT/src/org/xml/sax/helpers/XMLReaderFactory.javaPKIG@Y'OSGI-OPT/src/sun/PKIG@'OSGI-OPT/src/sun/awt/PKK> ʎl*߸'OSGI-OPT/src/sun/awt/CausedFocusEvent.javaPKIG@'OSGI-OPT/src/sun/java2d/PKIG@@'OSGI-OPT/src/sun/java2d/pipe/PKK>ȶ('OSGI-OPT/src/sun/java2d/pipe/Region.javaPKK>F:0'OSGI-OPT/src/sun/java2d/pipe/RegionIterator.javaPKK>TKi.b'OSGI-OPT/src/sun/java2d/pipe/SpanIterator.javaPKK>sq 'about.htmlPKIG@m'java/PKIG@ 'java/applet/PKE9@3)'java/applet/Applet$AccessibleApplet.classPKE9@jB h'java/applet/Applet.classPKE9@A'java/applet/AppletContext.classPKE9@tqgp'java/applet/AppletStub.classPKE9@C'java/applet/AudioClip.classPKIG@ x'java/awt/PKE9@$8H'java/awt/AWTError.classPKE9@iqX'java/awt/AWTEvent.classPKE9@D7nK+";'java/awt/AWTEventMulticaster.classPKE9@,CWX,'java/awt/AWTException.classPKE9@?0#,_'java/awt/AWTKeyStroke.classPKE9@'java/awt/AWTPermission.classPKE9@zt'java/awt/ActiveEvent.classPKE9@T%h'java/awt/Adjustable.classPKE9@YEdh'java/awt/AlphaComposite.classPKE9@'Ds'java/awt/AttributeValue.classPKE9@{x*['java/awt/BasicStroke.classPKE9@6yU /'java/awt/BorderLayout.classPKE9@)Oȉ.n'java/awt/BufferCapabilities$FlipContents.classPKE9@ !S'java/awt/BufferCapabilities.classPKE9@U_&i)'java/awt/Button$AccessibleAWTButton.classPKE9@$\ X'java/awt/Button.classPKE9@%4))Z'java/awt/Canvas$AccessibleAWTCanvas.classPKE9@.t'java/awt/Canvas.classPKE9@j={ (java/awt/CardLayout.classPKE9@?n1-T(java/awt/Checkbox$AccessibleAWTCheckbox.classPKE9@]b(java/awt/Checkbox.classPKE9@&*0 (java/awt/CheckboxGroup.classPKE9@=n^= (java/awt/CheckboxMenuItem$AccessibleAWTCheckboxMenuItem.classPKE9@2A (java/awt/CheckboxMenuItem.classPKE9@-\5)S(java/awt/Choice$AccessibleAWTChoice.classPKE9@9t(java/awt/Choice.classPKE9@ @(java/awt/Color.classPKE9@]D[gM(java/awt/Component$AccessibleAWTComponent$AccessibleAWTComponentHandler.classPKE9@~i5I.(java/awt/Component$AccessibleAWTComponent$AccessibleAWTFocusHandler.classPKE9@/> (java/awt/Component$AccessibleAWTComponent.classPKE9@kI[/1%(java/awt/Component$BaselineResizeBehavior.classPKE9@F*(((java/awt/Component$BltBufferStrategy.classPKE9@LhL+*(java/awt/Component$FlipBufferStrategy.classPKE9@H.O`-(java/awt/Component.classPKE9@3#B(java/awt/ComponentOrientation.classPKE9@ƕZ>?E(java/awt/Composite.classPKE9@Ẍ́'F(java/awt/CompositeContext.classPKE9@'M~JG(java/awt/Container$AccessibleAWTContainer$AccessibleContainerHandler.classPKE9@^-Hh/(I(java/awt/Container$AccessibleAWTContainer.classPKE9@LDJ(java/awt/Container.classPKE9@l /1P(java/awt/ContainerOrderFocusTraversalPolicy.classPKE9@dxF`R(java/awt/Cursor.classPKE9@4B!_*WU(java/awt/DefaultFocusTraversalPolicy.classPKE9@y)Q*V(java/awt/DefaultKeyboardFocusManager.classPKE9@t"Y(java/awt/Desktop$Action.classPKE9@ꎩ[(java/awt/Desktop.classPKE9@f1)/^(java/awt/Dialog$AccessibleAWTDialog.classPKE9@`r(_(java/awt/Dialog$ModalExclusionType.classPKE9@P"b(java/awt/Dialog$ModalityType.classPKE9@U(˞ _e(java/awt/Dialog.classPKE9@"@i(java/awt/Dimension.classPKE9@GVIk(java/awt/DisplayMode.classPKE9@@dE Pm(java/awt/Event.classPKE9@rJ`Ds(java/awt/EventQueue.classPKE9@kvAu(java/awt/FileDialog.classPKE9@s=c=x(java/awt/FlowLayout.classPKE9@p#{(java/awt/FocusTraversalPolicy.classPKE9@NUVzS }(java/awt/Font.classPKE9@^#m"s(java/awt/FontFormatException.classPKE9@V (java/awt/FontMetrics.classPKE9@0'(java/awt/Frame$AccessibleAWTFrame.classPKE9@so 5(java/awt/Frame.classPKE9@XI(java/awt/GradientPaint.classPKE9@kg5Sa ֔(java/awt/Graphics.classPKE9@%hZNn(java/awt/Graphics2D.classPKE9@lfpx%>(java/awt/GraphicsConfigTemplate.classPKE9@$(java/awt/GraphicsConfiguration.classPKE9@ Zԡ(java/awt/GraphicsDevice.classPKE9@ho"Ƥ(java/awt/GraphicsEnvironment.classPKE9@Oڐ!(java/awt/GridBagConstraints.classPKE9@RY^ru(java/awt/GridBagLayout.classPKE9@!5=B (java/awt/GridBagLayoutInfo.classPKE9@M#EyT(java/awt/GridLayout.classPKE9@~G  (java/awt/HeadlessException.classPKE9@$ -n(java/awt/IllegalComponentStateException.classPKE9@VgҶ(java/awt/Image.classPKE9@IwEQ (java/awt/ImageCapabilities.classPKE9@Us~(java/awt/Insets.classPKE9@o4(java/awt/ItemSelectable.classPKE9@$zq[11(java/awt/JobAttributes$DefaultSelectionType.classPKE9@MS),(java/awt/JobAttributes$DestinationType.classPKE9@B-e<'(java/awt/JobAttributes$DialogType.classPKE9@x|9h(java/awt/JobAttributes$MultipleDocumentHandlingType.classPKE9@vxY&K(java/awt/JobAttributes$SidesType.classPKE9@ڪp(java/awt/JobAttributes.classPKE9@B=!(java/awt/KeyEventDispatcher.classPKE9@)p$(java/awt/KeyEventPostProcessor.classPKE9@R](i#{(java/awt/KeyboardFocusManager.classPKE9@p5 '5(java/awt/Label$AccessibleAWTLabel.classPKE9@ ,(java/awt/Label.classPKE9@n(java/awt/LayoutManager.classPKE9@2(java/awt/LayoutManager2.classPKE9@BYX"p(java/awt/LinearGradientPaint.classPKE9@+<(java/awt/List$AccessibleAWTList$AccessibleAWTListChild.classPKE9@]\]N%(java/awt/List$AccessibleAWTList.classPKE9@|(java/awt/List.classPKE9@C5& (java/awt/MediaTracker.classPKE9@s/%n(java/awt/Menu$AccessibleAWTMenu.classPKE9@(java/awt/Menu.classPKE9@48F+(java/awt/MenuBar$AccessibleAWTMenuBar.classPKE9@#(java/awt/MenuBar.classPKE9@{|#7v(java/awt/MenuComponent$AccessibleAWTMenuComponent.classPKE9@ަ=(java/awt/MenuComponent.classPKE9@ >BG(java/awt/MenuContainer.classPKE9@Z7=(-(java/awt/MenuItem$AccessibleAWTMenuItem.classPKE9@ehu T)java/awt/MenuItem.classPKE9@}(:)java/awt/MenuShortcut.classPKE9@Ks)java/awt/MouseInfo.classPKE9@( R3l)java/awt/MultipleGradientPaint$ColorSpaceType.classPKE9@Y0p0 )java/awt/MultipleGradientPaint$CycleMethod.classPKE9@UV$ )java/awt/MultipleGradientPaint.classPKE9@qS' )java/awt/PageAttributes$ColorType.classPKE9@U0W ')java/awt/PageAttributes$MediaType.classPKE9@gdLcN6^)java/awt/PageAttributes$OrientationRequestedType.classPKE9@޵V$(%)java/awt/PageAttributes$OriginType.classPKE9@M41mQ.)java/awt/PageAttributes$PrintQualityType.classPKE9@g&  )java/awt/PageAttributes.classPKE9@Z7x$)java/awt/Paint.classPKE9@cò%)java/awt/PaintContext.classPKE9@հ4 '&)java/awt/Panel$AccessibleAWTPanel.classPKE9@6  ()java/awt/Panel.classPKE9@{))java/awt/Point.classPKE9@] +)java/awt/PointerInfo.classPKE9@{JR ,)java/awt/Polygon.classPKE9@Z-1+/0)java/awt/PopupMenu$AccessibleAWTPopupMenu.classPKE9@;"h2)java/awt/PopupMenu.classPKE9@iX[k}3)java/awt/PrintGraphics.classPKE9@G@4)java/awt/PrintJob.classPKE9@: " 6)java/awt/RadialGradientPaint.classPKE9@](9)java/awt/Rectangle.classPKE9@]{)r!9>)java/awt/RenderingHints$Key.classPKE9@?)java/awt/RenderingHints.classPKE9@߯ G)java/awt/Robot.classPKE9@8J:M1I)java/awt/ScrollPane$AccessibleAWTScrollPane.classPKE9@`D^tK)java/awt/ScrollPane.classPKE9@j#g#O)java/awt/ScrollPaneAdjustable.classPKE9@T/Q)java/awt/Scrollbar$AccessibleAWTScrollBar.classPKE9@׹L S)java/awt/Scrollbar.classPKE9@a6 W)java/awt/Shape.classPKE9@e?mNY)java/awt/SplashScreen.classPKE9@]}[)java/awt/Stroke.classPKE9@3$7o D\)java/awt/SystemColor.classPKE9@!m%a`)java/awt/SystemTray.classPKE9@z<O-gc)java/awt/TextArea$AccessibleAWTTextArea.classPKE9@#j d)java/awt/TextArea.classPKE9@YM7h)java/awt/TextComponent$AccessibleAWTTextComponent.classPKE9@C84k)java/awt/TextComponent.classPKE9@C :X/n)java/awt/TextField$AccessibleAWTTextField.classPKE9@0!}p)java/awt/TextField.classPKE9@gcs)java/awt/TexturePaint.classPKE9@ԘkA !u)java/awt/Toolkit.classPKE9@-+ʿw)java/awt/Transparency.classPKE9@y1}#)java/awt/TrayIcon$MessageType.classPKE9@Z"3hc M)java/awt/TrayIcon.classPKE9@D7)))java/awt/Window$AccessibleAWTWindow.classPKE9@7"})java/awt/Window.classPKIG@)java/awt/color/PKE9@3~Ok!')java/awt/color/CMMException.classPKE9@GOm)java/awt/color/ColorSpace.classPKE9@dU`8# )java/awt/color/ICC_ColorSpace.classPKE9@ Q E )java/awt/color/ICC_Profile.classPKE9@@"!$)java/awt/color/ICC_ProfileGray.classPKE9@  #!)java/awt/color/ICC_ProfileRGB.classPKE9@ ))java/awt/color/ProfileDataException.classPKIG@\)java/awt/datatransfer/PKE9@)%)java/awt/datatransfer/Clipboard.classPKE9@/*v)java/awt/datatransfer/ClipboardOwner.classPKE9@jaN&e)java/awt/datatransfer/DataFlavor.classPKE9@~')java/awt/datatransfer/FlavorEvent.classPKE9@c *_)java/awt/datatransfer/FlavorListener.classPKE9@߼%\)java/awt/datatransfer/FlavorMap.classPKE9@Eo')java/awt/datatransfer/FlavorTable.classPKE9@2 2Դ)java/awt/datatransfer/MimeTypeParseException.classPKE9@@+A)java/awt/datatransfer/StringSelection.classPKE9@eR% +)java/awt/datatransfer/SystemFlavorMap.classPKE9@ћ( )java/awt/datatransfer/Transferable.classPKE9@56X)java/awt/datatransfer/UnsupportedFlavorException.classPKIG@ )java/awt/dnd/PKE9@ CX)java/awt/dnd/Autoscroll.classPKE9@/\= ޿)java/awt/dnd/DnDConstants.classPKE9@:<x  #h)java/awt/dnd/DragGestureEvent.classPKE9@#l&)java/awt/dnd/DragGestureListener.classPKE9@*iuIR ()java/awt/dnd/DragGestureRecognizer.classPKE9@y)java/awt/dnd/DragSource.classPKE9@(O$)java/awt/dnd/DragSourceAdapter.classPKE9@` $)java/awt/dnd/DragSourceContext.classPKE9@p7&)java/awt/dnd/DragSourceDragEvent.classPKE9@g&)java/awt/dnd/DragSourceDropEvent.classPKE9@XN}")java/awt/dnd/DragSourceEvent.classPKE9@Q0%[)java/awt/dnd/DragSourceListener.classPKE9@y"p+)java/awt/dnd/DragSourceMotionListener.classPKE9@_*ڳw4)java/awt/dnd/DropTarget$DropTargetAutoScroller.classPKE9@fWMB)java/awt/dnd/DropTarget.classPKE9@-]0$,)java/awt/dnd/DropTargetAdapter.classPKE9@||6)java/awt/dnd/DropTargetContext$TransferableProxy.classPKE9@To$N)java/awt/dnd/DropTargetContext.classPKE9@UQ&)java/awt/dnd/DropTargetDragEvent.classPKE9@ce&E)java/awt/dnd/DropTargetDropEvent.classPKE9@4&""0)java/awt/dnd/DropTargetEvent.classPKE9@!3Ez%)java/awt/dnd/DropTargetListener.classPKE9@7#/)java/awt/dnd/InvalidDnDOperationException.classPKE9@ΪD?-C)java/awt/dnd/MouseDragGestureRecognizer.classPKIG@)java/awt/dnd/peer/PKE9@ | ^y-$)java/awt/dnd/peer/DragSourceContextPeer.classPKE9@FL81-c)java/awt/dnd/peer/DropTargetContextPeer.classPKE9@0Zk&)java/awt/dnd/peer/DropTargetPeer.classPKIG@)java/awt/event/PKE9@\1%)java/awt/event/AWTEventListener.classPKE9@ȖL`*)java/awt/event/AWTEventListenerProxy.classPKE9@l3 )java/awt/event/ActionEvent.classPKE9@Z#@*java/awt/event/ActionListener.classPKE9@Έ+$.*java/awt/event/AdjustmentEvent.classPKE9@t]'*java/awt/event/AdjustmentListener.classPKE9@PI%*java/awt/event/ComponentAdapter.classPKE9@0#=*java/awt/event/ComponentEvent.classPKE9@ŧ-&*java/awt/event/ComponentListener.classPKE9@|t-O%0 *java/awt/event/ContainerAdapter.classPKE9@UEDG-# *java/awt/event/ContainerEvent.classPKE9@& *java/awt/event/ContainerListener.classPKE9@ɱ'-! *java/awt/event/FocusAdapter.classPKE9@U`y0*java/awt/event/FocusEvent.classPKE9@2"$*java/awt/event/FocusListener.classPKE9@y}D7e+*java/awt/event/HierarchyBoundsAdapter.classPKE9@Q޵,*java/awt/event/HierarchyBoundsListener.classPKE9@ilP]#*java/awt/event/HierarchyEvent.classPKE9@} m&Y*java/awt/event/HierarchyListener.classPKE9@LJ*java/awt/event/InputEvent.classPKE9@[Qb%F*java/awt/event/InputMethodEvent.classPKE9@ȷ (j*java/awt/event/InputMethodListener.classPKE9@xQe$w*java/awt/event/InvocationEvent.classPKE9@/"*java/awt/event/ItemEvent.classPKE9@k]!8$*java/awt/event/ItemListener.classPKE9@S}5p#%*java/awt/event/KeyAdapter.classPKE9@2T y &*java/awt/event/KeyEvent.classPKE9@1! D3*java/awt/event/KeyListener.classPKE9@i!B4*java/awt/event/MouseAdapter.classPKE9@PȄh66*java/awt/event/MouseEvent.classPKE9@a -"9*java/awt/event/MouseListener.classPKE9@d.G':*java/awt/event/MouseMotionAdapter.classPKE9@s(<*java/awt/event/MouseMotionListener.classPKE9@9#$=*java/awt/event/MouseWheelEvent.classPKE9@'?*java/awt/event/MouseWheelListener.classPKE9@NTO+@*java/awt/event/PaintEvent.classPKE9@G+9B*java/awt/event/TextEvent.classPKE9@g!VD*java/awt/event/TextListener.classPKE9@u:"AE*java/awt/event/WindowAdapter.classPKE9@"Ho @G*java/awt/event/WindowEvent.classPKE9@CwF(#J*java/awt/event/WindowFocusListener.classPKE9@9No#(K*java/awt/event/WindowListener.classPKE9@(XL*java/awt/event/WindowStateListener.classPKIG@NM*java/awt/font/PKE9@%M*java/awt/font/FontRenderContext.classPKE9@T[i'*O*java/awt/font/GlyphJustificationInfo.classPKE9@J]4~y R*java/awt/font/GlyphMetrics.classPKE9@}* nU*java/awt/font/GlyphVector.classPKE9@g3Gc$Y*java/awt/font/GraphicAttribute.classPKE9@O7k)\*java/awt/font/ImageGraphicAttribute.classPKE9@MUp5:^*java/awt/font/LayoutPath.classPKE9@åA %_*java/awt/font/LineBreakMeasurer.classPKE9@{eS!b*java/awt/font/LineMetrics.classPKE9@/e"c*java/awt/font/MultipleMaster.classPKE9@~+ݘx! e*java/awt/font/NumericShaper.classPKE9@a(Uh*java/awt/font/OpenType.classPKE9@SPb)k*java/awt/font/ShapeGraphicAttribute.classPKE9@aX', !m*java/awt/font/TextAttribute.classPKE9@/Wpzmt*java/awt/font/TextHitInfo.classPKE9@ݱT*~v*java/awt/font/TextLayout$CaretPolicy.classPKE9@uh]*x*java/awt/font/TextLayout.classPKE9@G| ~*java/awt/font/TextMeasurer.classPKE9@A7|&C*java/awt/font/TransformAttribute.classPKIG@*java/awt/geom/PKE9@6\S #Q*java/awt/geom/AffineTransform.classPKE9@88 U*java/awt/geom/Arc2D$Double.classPKE9@XxFc*java/awt/geom/Arc2D$Float.classPKE9@0  *java/awt/geom/Arc2D.classPKE9@ ;< Ӕ*java/awt/geom/Area.classPKE9@)2r'U*java/awt/geom/CubicCurve2D$Double.classPKE9@$x &*java/awt/geom/CubicCurve2D$Float.classPKE9@X3q? *java/awt/geom/CubicCurve2D.classPKE9@iD>SDۢ*java/awt/geom/Dimension2D.classPKE9@¦j${*java/awt/geom/Ellipse2D$Double.classPKE9@1O!#Ǧ*java/awt/geom/Ellipse2D$Float.classPKE9@xq9*java/awt/geom/Ellipse2D.classPKE9@L|*N*java/awt/geom/FlatteningPathIterator.classPKE9@L*java/awt/geom/GeneralPath.classPKE9@#)N-0*java/awt/geom/IllegalPathStateException.classPKE9@g~H!*java/awt/geom/Line2D$Double.classPKE9@W9 *java/awt/geom/Line2D$Float.classPKE9@=*java/awt/geom/Line2D.classPKE9@%$I3ܹ*java/awt/geom/NoninvertibleTransformException.classPKE9@11wp!9*java/awt/geom/Path2D$Double.classPKE9@ N*java/awt/geom/Path2D$Float.classPKE9@@ 8 *java/awt/geom/Path2D.classPKE9@M8 *java/awt/geom/PathIterator.classPKE9@,Et"*java/awt/geom/Point2D$Double.classPKE9@s;%!K*java/awt/geom/Point2D$Float.classPKE9@͖z +*java/awt/geom/Point2D.classPKE9@N:;&*java/awt/geom/QuadCurve2D$Double.classPKE9@ih%*java/awt/geom/QuadCurve2D$Float.classPKE9@րS *java/awt/geom/QuadCurve2D.classPKE9@}D@m&l*java/awt/geom/Rectangle2D$Double.classPKE9@.`d%*java/awt/geom/Rectangle2D$Float.classPKE9@eO *java/awt/geom/Rectangle2D.classPKE9@AqO $S*java/awt/geom/RectangularShape.classPKE9@GH5z+*java/awt/geom/RoundRectangle2D$Double.classPKE9@K$ e*R*java/awt/geom/RoundRectangle2D$Float.classPKE9@.7$*java/awt/geom/RoundRectangle2D.classPKIG@ *java/awt/im/PKE9@Jsc*java/awt/im/InputContext.classPKE9@Ml&*java/awt/im/InputMethodHighlight.classPKE9@WV4^%*java/awt/im/InputMethodRequests.classPKE9@~3gF*7*java/awt/im/InputSubset.classPKIG@l*java/awt/im/spi/PKE9@O@!*java/awt/im/spi/InputMethod.classPKE9@az3(*java/awt/im/spi/InputMethodContext.classPKE9@#1+D*java/awt/im/spi/InputMethodDescriptor.classPKIG@*java/awt/image/PKE9@K & *java/awt/image/AffineTransformOp.classPKE9@(al-^*java/awt/image/AreaAveragingScaleFilter.classPKE9@ 6"*java/awt/image/BandCombineOp.classPKE9@5)z7H& +java/awt/image/BandedSampleModel.classPKE9@ƪL!#+java/awt/image/BufferStrategy.classPKE9@"4+java/awt/image/BufferedImage.classPKE9@e"+(] +java/awt/image/BufferedImageFilter.classPKE9@ؾ[$ +java/awt/image/BufferedImageOp.classPKE9@!ݫc$:+java/awt/image/ByteLookupTable.classPKE9@ #+java/awt/image/ColorConvertOp.classPKE9@]BW+java/awt/image/ColorModel.classPKE9@)(+java/awt/image/ComponentColorModel.classPKE9@1H ) +java/awt/image/ComponentSampleModel.classPKE9@s+java/awt/image/ConvolveOp.classPKE9@ + $!+java/awt/image/CropImageFilter.classPKE9@$Kg ;#+java/awt/image/DataBuffer.classPKE9@}#&+java/awt/image/DataBufferByte.classPKE9@2z%)+java/awt/image/DataBufferDouble.classPKE9@l-$N++java/awt/image/DataBufferFloat.classPKE9@ԍ "-+java/awt/image/DataBufferInt.classPKE9@\$/+java/awt/image/DataBufferShort.classPKE9@ PO%1+java/awt/image/DataBufferUShort.classPKE9@R4;%;4+java/awt/image/DirectColorModel.classPKE9@q倩(J7+java/awt/image/FilteredImageSource.classPKE9@ao:0"I9+java/awt/image/ImageConsumer.classPKE9@+y ^;+java/awt/image/ImageFilter.classPKE9@9d"u>+java/awt/image/ImageObserver.classPKE9@t_H"?+java/awt/image/ImageProducer.classPKE9@`!Q}'@+java/awt/image/ImagingOpException.classPKE9@Wº- $IB+java/awt/image/IndexColorModel.classPKE9@IGE+java/awt/image/Kernel.classPKE9@ ,pG+java/awt/image/LookupOp.classPKE9@'? ZJ+java/awt/image/LookupTable.classPKE9@MO^ &K+java/awt/image/MemoryImageSource.classPKE9@I 0O+java/awt/image/MultiPixelPackedSampleModel.classPKE9@ċɷ%R+java/awt/image/PackedColorModel.classPKE9@ !T+java/awt/image/PixelGrabber.classPKE9@$y'0X+java/awt/image/PixelInterleavedSampleModel.classPKE9@0#NZ+java/awt/image/RGBImageFilter.classPKE9@){\+java/awt/image/Raster.classPKE9@*b+java/awt/image/RasterFormatException.classPKE9@<[!d+java/awt/image/RasterOp.classPKE9@? "Ye+java/awt/image/RenderedImage.classPKE9@_P!J)ng+java/awt/image/ReplicateScaleFilter.classPKE9@VJi+java/awt/image/RescaleOp.classPKE9@" l+java/awt/image/SampleModel.classPKE9@7ӈc%p+java/awt/image/ShortLookupTable.classPKE9@Z1r+java/awt/image/SinglePixelPackedSampleModel.classPKE9@z!u+java/awt/image/TileObserver.classPKE9@6MI"v+java/awt/image/VolatileImage.classPKE9@Ւ #6y+java/awt/image/WritableRaster.classPKE9@睈 #*}+java/awt/image/WritableRenderedImage.classPKIG@~+java/awt/image/renderable/PKE9@DB>~+java/awt/image/renderable/ContextualRenderedImageFactory.classPKE9@.+java/awt/image/renderable/ParameterBlock.classPKE9@ĖH-+java/awt/image/renderable/RenderContext.classPKE9@f5;/b+java/awt/image/renderable/RenderableImage.classPKE9@}g:1`+java/awt/image/renderable/RenderableImageOp.classPKE9@YI7+java/awt/image/renderable/RenderableImageProducer.classPKE9@ 4ԏ+java/awt/image/renderable/RenderedImageFactory.classPKIG@+java/awt/peer/PKE9@<+java/awt/peer/ButtonPeer.classPKE9@^(u+java/awt/peer/CanvasPeer.classPKE9@HiQ(Ē+java/awt/peer/CheckboxMenuItemPeer.classPKE9@op +java/awt/peer/CheckboxPeer.classPKE9@Дs+java/awt/peer/ChoicePeer.classPKE9@w"! !ϕ+java/awt/peer/ComponentPeer.classPKE9@!+java/awt/peer/ContainerPeer.classPKE9@- +java/awt/peer/DesktopPeer.classPKE9@'et+java/awt/peer/DialogPeer.classPKE9@ɹ"g+java/awt/peer/FileDialogPeer.classPKE9@2_oo+java/awt/peer/FontPeer.classPKE9@+java/awt/peer/FramePeer.classPKE9@,}+java/awt/peer/KeyboardFocusManagerPeer.classPKE9@hS+java/awt/peer/LabelPeer.classPKE9@'Ax#+java/awt/peer/LightweightPeer.classPKE9@pW2+java/awt/peer/ListPeer.classPKE9@%0l +java/awt/peer/MenuBarPeer.classPKE9@sױ%+java/awt/peer/MenuComponentPeer.classPKE9@*U +java/awt/peer/MenuItemPeer.classPKE9@ʆYh+java/awt/peer/MenuPeer.classPKE9@!+java/awt/peer/MouseInfoPeer.classPKE9@$u +java/awt/peer/PanelPeer.classPKE9@ &ߍ!̫+java/awt/peer/PopupMenuPeer.classPKE9@=e+java/awt/peer/RobotPeer.classPKE9@Fd"+java/awt/peer/ScrollPanePeer.classPKE9@rd!0+java/awt/peer/ScrollbarPeer.classPKE9@C`"1+java/awt/peer/SystemTrayPeer.classPKE9@} +java/awt/peer/TextAreaPeer.classPKE9@Tved%]+java/awt/peer/TextComponentPeer.classPKE9@;T!+java/awt/peer/TextFieldPeer.classPKE9@-eG H+java/awt/peer/TrayIconPeer.classPKE9@S_p+java/awt/peer/WindowPeer.classPKIG@+java/awt/print/PKE9@-zZ+java/awt/print/Book.classPKE9@^7-g+java/awt/print/PageFormat.classPKE9@9]D+java/awt/print/Pageable.classPKE9@AA+java/awt/print/Paper.classPKE9@7CN+java/awt/print/Printable.classPKE9@>q*P+java/awt/print/PrinterAbortException.classPKE9@e%+java/awt/print/PrinterException.classPKE9@4݃$+java/awt/print/PrinterGraphics.classPKE9@l0L'+java/awt/print/PrinterIOException.classPKE9@Xil8+java/awt/print/PrinterJob.classPKIG@ w+java/beans/PKE9@Pm"+java/beans/AppletInitializer.classPKE9@C:+java/beans/BeanDescriptor.classPKE9@mYu+java/beans/BeanInfo.classPKE9@~#XD+java/beans/Beans.classPKE9@&+java/beans/ConstructorProperties.classPKE9@u~J+java/beans/Customizer.classPKE9@q=g\++java/beans/DefaultPersistenceDelegate.classPKE9@c4+java/beans/DesignMode.classPKE9@(e(O?+java/beans/Encoder.classPKE9@uߐY+java/beans/EventHandler.classPKE9@ tt_#+java/beans/EventSetDescriptor.classPKE9@S"t+java/beans/ExceptionListener.classPKE9@'-vJ+java/beans/Expression.classPKE9@-D R"!+java/beans/FeatureDescriptor.classPKE9@ Q++java/beans/IndexedPropertyChangeEvent.classPKE9@:cl*m+java/beans/IndexedPropertyDescriptor.classPKE9@6z'(+java/beans/IntrospectionException.classPKE9@EΥp+java/beans/Introspector.classPKE9@P`!`+java/beans/MethodDescriptor.classPKE9@h<$+java/beans/ParameterDescriptor.classPKE9@FT$8+java/beans/PersistenceDelegate.classPKE9@ZQ$n+java/beans/PropertyChangeEvent.classPKE9@.'N+java/beans/PropertyChangeListener.classPKE9@:Hk/,<+java/beans/PropertyChangeListenerProxy.classPKE9@HWJ&+java/beans/PropertyChangeSupport.classPKE9@oSDf #+java/beans/PropertyDescriptor.classPKE9@Gh++java/beans/PropertyEditor.classPKE9@b~&+java/beans/PropertyEditorManager.classPKE9@&,java/beans/PropertyEditorSupport.classPKE9@c\.C&,java/beans/PropertyVetoException.classPKE9@!j,java/beans/SimpleBeanInfo.classPKE9@!\T,java/beans/Statement.classPKE9@3#' ,java/beans/VetoableChangeListener.classPKE9@S+Sl, ,java/beans/VetoableChangeListenerProxy.classPKE9@`{&x ,java/beans/VetoableChangeSupport.classPKE9@ ,,java/beans/Visibility.classPKE9@$|,java/beans/XMLDecoder.classPKE9@Jkp,java/beans/XMLEncoder.classPKIG@$,java/beans/beancontext/PKE9@^(k,java/beans/beancontext/BeanContext.classPKE9@T V-,java/beans/beancontext/BeanContextChild.classPKE9@%&ߕ;,java/beans/beancontext/BeanContextChildComponentProxy.classPKE9@QKUp 4,java/beans/beancontext/BeanContextChildSupport.classPKE9@|26,java/beans/beancontext/BeanContextContainerProxy.classPKE9@;k:-,java/beans/beancontext/BeanContextEvent.classPKE9@p7,java/beans/beancontext/BeanContextMembershipEvent.classPKE9@ ;W,:!,java/beans/beancontext/BeanContextMembershipListener.classPKE9@I@Չ-",java/beans/beancontext/BeanContextProxy.classPKE9@ }=#,java/beans/beancontext/BeanContextServiceAvailableEvent.classPKE9@]7%,java/beans/beancontext/BeanContextServiceProvider.classPKE9@eb?&,java/beans/beancontext/BeanContextServiceProviderBeanInfo.classPKE9@WbU 1;',java/beans/beancontext/BeanContextServiceRevokedEvent.classPKE9@ ,<> *,java/beans/beancontext/BeanContextServiceRevokedListener.classPKE9@;1 j0!+,java/beans/beancontext/BeanContextServices.classPKE9@6g88 -,java/beans/beancontext/BeanContextServicesListener.classPKE9@uOEA.,java/beans/beancontext/BeanContextServicesSupport$BCSSChild.classPKE9@*wTP/,java/beans/beancontext/BeanContextServicesSupport$BCSSProxyServiceProvider.classPKE9@RK2,java/beans/beancontext/BeanContextServicesSupport$BCSSServiceProvider.classPKE9@ [k7p4,java/beans/beancontext/BeanContextServicesSupport.classPKE9@ K<K89,java/beans/beancontext/BeanContextSupport$BCSChild.classPKE9@72a;?;,java/beans/beancontext/BeanContextSupport$BCSIterator.classPKE9@}L/ =,java/beans/beancontext/BeanContextSupport.classPKIG@E,java/io/PKE9@٣>B!@E,java/io/BufferedInputStream.classPKE9@Y("F,java/io/BufferedOutputStream.classPKE9@ EH,java/io/BufferedReader.classPKE9@GqN(J,java/io/BufferedWriter.classPKE9@A"K,java/io/ByteArrayInputStream.classPKE9@Od#M,java/io/ByteArrayOutputStream.classPKE9@aSP,java/io/CharArrayReader.classPKE9@iR,java/io/CharArrayWriter.classPKE9@_%U,java/io/CharConversionException.classPKE9@IOV,java/io/Closeable.classPKE9@}W,java/io/Console.classPKE9@XQY,java/io/DataInput.classPKE9@ ٭V[,java/io/DataInputStream.classPKE9@뜙*o^,java/io/DataOutput.classPKE9@W0!C_,java/io/DataOutputStream.classPKE9@l4eb,java/io/EOFException.classPKE9@*Yc,java/io/Externalizable.classPKE9@qQjd,java/io/File.classPKE9@OE>Mptj,java/io/FileDescriptor.classPKE9@Hrkl,java/io/FileFilter.classPKE9@Lh#m,java/io/FileInputStream.classPKE9@Ǟ%#.o,java/io/FileNotFoundException.classPKE9@Mp,java/io/FileOutputStream.classPKE9@$T 7g9&ge-java/lang/Number.classPKE9@mV%f-java/lang/NumberFormatException.classPKE9@kݴ6>h-java/lang/Object.classPKE9@&z( j-java/lang/OutOfMemoryError.classPKE9@GVOzk-java/lang/Override.classPKE9@KƠPm-java/lang/Package.classPKE9@wAJp-java/lang/Process.classPKE9@e^q-java/lang/ProcessBuilder.classPKE9@y4St-java/lang/Readable.classPKE9@s?h6u-java/lang/Runnable.classPKE9@#'ǚ u-java/lang/Runtime.classPKE9@g4 y-java/lang/RuntimeException.classPKE9@pf!E{-java/lang/RuntimePermission.classPKE9@_:!|-java/lang/SecurityException.classPKE9@>Ź0~-java/lang/SecurityManager.classPKE9@s-java/lang/Short.classPKE9@"-java/lang/StackOverflowError.classPKE9@;q!-java/lang/StackTraceElement.classPKE9@OK҉-java/lang/StrictMath.classPKE9@ׅt!-java/lang/String.classPKE9@2{ e$-java/lang/StringBuffer.classPKE9@>xho$j-java/lang/StringBuilder.classPKE9@#k2/Ϧ-java/lang/StringIndexOutOfBoundsException.classPKE9@09 A-java/lang/SuppressWarnings.classPKE9@X* ȩ-java/lang/System.classPKE9@y ʶ6-java/lang/Thread$State.classPKE9@;x/6-java/lang/Thread$UncaughtExceptionHandler.classPKE9@TQzGH-java/lang/Thread.classPKE9@`}-java/lang/ThreadDeath.classPKE9@+$ -java/lang/ThreadGroup.classPKE9@շa-java/lang/ThreadLocal.classPKE9@h;g71-java/lang/Throwable.classPKE9@{,'-java/lang/TypeNotPresentException.classPKE9@y\0-java/lang/UnknownError.classPKE9@+=$x-java/lang/UnsatisfiedLinkError.classPKE9@,-java/lang/UnsupportedClassVersionError.classPKE9@1A-)-java/lang/UnsupportedOperationException.classPKE9@8'-java/lang/VerifyError.classPKE9@ڀO#-java/lang/VirtualMachineError.classPKE9@XN-java/lang/Void.classPKIG@-java/lang/annotation/PKE9@c%-java/lang/annotation/Annotation.classPKE9@.0-java/lang/annotation/AnnotationFormatError.classPKE9@&eR:-java/lang/annotation/AnnotationTypeMismatchException.classPKE9@@%[-java/lang/annotation/Documented.classPKE9@ك=k&-java/lang/annotation/ElementType.classPKE9@wv8-java/lang/annotation/IncompleteAnnotationException.classPKE9@9Fq$-java/lang/annotation/Inherited.classPKE9@N]$-java/lang/annotation/Retention.classPKE9@2=b*q-java/lang/annotation/RetentionPolicy.classPKE9@ok!-java/lang/annotation/Target.classPKIG@[-java/lang/instrument/PKE9@Skg*-java/lang/instrument/ClassDefinition.classPKE9@1/_-java/lang/instrument/ClassFileTransformer.classPKE9@! , 6-java/lang/instrument/IllegalClassFormatException.classPKE9@Qi*-java/lang/instrument/Instrumentation.classPKE9@ՄS5-java/lang/instrument/UnmodifiableClassException.classPKIG@-java/lang/management/PKE9@8ii--:-java/lang/management/ClassLoadingMXBean.classPKE9@pIi,]-java/lang/management/CompilationMXBean.classPKE9@hЅ1v-java/lang/management/GarbageCollectorMXBean.classPKE9@#-java/lang/management/LockInfo.classPKE9@ ,\-java/lang/management/ManagementFactory.classPKE9@E/-java/lang/management/ManagementPermission.classPKE9@8]' -java/lang/management/MemoryMXBean.classPKE9@`.H-java/lang/management/MemoryManagerMXBean.classPKE9@L1Z-java/lang/management/MemoryNotificationInfo.classPKE9@ >UpC+-java/lang/management/MemoryPoolMXBean.classPKE9@9=\d %-java/lang/management/MemoryType.classPKE9@ʀW&-java/lang/management/MemoryUsage.classPKE9@B&-java/lang/management/MonitorInfo.classPKE9@ѻu,0-java/lang/management/OperatingSystemMXBean.classPKE9@(.java/lang/management/RuntimeMXBean.classPKE9@@{%.java/lang/management/ThreadInfo.classPKE9@R!'.java/lang/management/ThreadMXBean.classPKIG@.java/lang/ref/PKE9@pS$,.java/lang/ref/PhantomReference.classPKE9@_f$.java/lang/ref/Reference.classPKE9@{" .java/lang/ref/ReferenceQueue.classPKE9@IsV!b .java/lang/ref/SoftReference.classPKE9@zsV!$.java/lang/ref/WeakReference.classPKIG@.java/lang/reflect/PKE9@"((.java/lang/reflect/AccessibleObject.classPKE9@C(.java/lang/reflect/AnnotatedElement.classPKE9@b#E .java/lang/reflect/Array.classPKE9@>+ #J.java/lang/reflect/Constructor.classPKE9@[} .java/lang/reflect/Field.classPKE9@G[6(Y.java/lang/reflect/GenericArrayType.classPKE9@9g$X*A.java/lang/reflect/GenericDeclaration.classPKE9@Ԉ`3G .java/lang/reflect/GenericSignatureFormatError.classPKE9@$)!.java/lang/reflect/InvocationHandler.classPKE9@q:O1".java/lang/reflect/InvocationTargetException.classPKE9@bx;;$.java/lang/reflect/MalformedParameterizedTypeException.classPKE9@Ո %.java/lang/reflect/Member.classPKE9@` &.java/lang/reflect/Method.classPKE9@aM{f *.java/lang/reflect/Modifier.classPKE9@X$պ+),.java/lang/reflect/ParameterizedType.classPKE9@6y-.java/lang/reflect/Proxy.classPKE9@T)W0.java/lang/reflect/ReflectPermission.classPKE9@]BZk1.java/lang/reflect/Type.classPKE9@q"$j2.java/lang/reflect/TypeVariable.classPKE9@KJ43.java/lang/reflect/UndeclaredThrowableException.classPKE9@G/v$[5.java/lang/reflect/WildcardType.classPKIG@ F6.java/math/PKE9@փg&6.java/math/BigDecimal.classPKE9@ut=.java/math/BigInteger.classPKE9@K C.java/math/MathContext.classPKE9@fYE.java/math/RoundingMode.classPKIG@ H.java/net/PKE9@}'O.java/net/PortUnreachableException.classPKE9@x .java/net/ProtocolException.classPKE9@hQTP).java/net/Proxy$Type.classPKE9@' .java/net/Proxy.classPKE9@ z.java/net/ProxySelector.classPKE9@[m.java/net/ResponseCache.classPKE9@yg"P.java/net/SecureCacheResponse.classPKE9@VEr +.java/net/ServerSocket.classPKE9@jU9.java/net/Socket.classPKE9@65.java/net/SocketAddress.classPKE9@Gua.java/net/SocketException.classPKE9@j.java/net/SocketImpl.classPKE9@4P .java/net/SocketImplFactory.classPKE9@.java/net/SocketOptions.classPKE9@LFih.java/net/SocketPermission.classPKE9@) %O.java/net/SocketTimeoutException.classPKE9@ 9.java/net/URI.classPKE9@Őa !۲.java/net/URISyntaxException.classPKE9@Ry%.java/net/URL.classPKE9@zԎɸ.java/net/URLClassLoader.classPKE9@-Ե.java/net/URLConnection.classPKE9@۾/.v.java/net/URLDecoder.classPKE9@?q^.java/net/URLEncoder.classPKE9@h.java/net/URLStreamHandler.classPKE9@ &P.java/net/URLStreamHandlerFactory.classPKE9@@q#2.java/net/UnknownHostException.classPKE9@&.java/net/UnknownServiceException.classPKIG@ .java/nio/PKE9@b.java/nio/Buffer.classPKE9@W^B&;.java/nio/BufferOverflowException.classPKE9@c¦E'k.java/nio/BufferUnderflowException.classPKE9@|$X .java/nio/ByteBuffer.classPKE9@:.java/nio/ByteOrder.classPKE9@Mq .java/nio/CharBuffer.classPKE9@a.java/nio/DoubleBuffer.classPKE9@T$X~.java/nio/FloatBuffer.classPKE9@^D.java/nio/IntBuffer.classPKE9@[\>#.java/nio/InvalidMarkException.classPKE9@zq.java/nio/LongBuffer.classPKE9@D5&.java/nio/MappedByteBuffer.classPKE9@g O&.java/nio/ReadOnlyBufferException.classPKE9@`D~.java/nio/ShortBuffer.classPKIG@.java/nio/channels/PKE9@Q_1.java/nio/channels/AlreadyConnectedException.classPKE9@wk2R.java/nio/channels/AsynchronousCloseException.classPKE9@&>#.java/nio/channels/ByteChannel.classPKE9@VS-i.java/nio/channels/CancelledKeyException.classPKE9@E.java/nio/channels/Channel.classPKE9@ҕn {.java/nio/channels/Channels.classPKE9@nGRo2.java/nio/channels/ClosedByInterruptException.classPKE9@TI J.+.java/nio/channels/ClosedChannelException.classPKE9@pFY/a.java/nio/channels/ClosedSelectorException.classPKE9@Gb2.java/nio/channels/ConnectionPendingException.classPKE9@&Q'.java/nio/channels/DatagramChannel.classPKE9@}p$Z-+.java/nio/channels/FileChannel$MapMode.classPKE9@z\#?.java/nio/channels/FileChannel.classPKE9@%ú /java/nio/channels/FileLock.classPKE9@ј_5C/java/nio/channels/FileLockInterruptionException.classPKE9@HD,/java/nio/channels/GatheringByteChannel.classPKE9@#B9h4/java/nio/channels/IllegalBlockingModeException.classPKE9@JY_0/java/nio/channels/IllegalSelectorException.classPKE9@Jw,3 /java/nio/channels/InterruptibleChannel.classPKE9@h4 /java/nio/channels/NoConnectionPendingException.classPKE9@Loe3K /java/nio/channels/NonReadableChannelException.classPKE9@#8e3 /java/nio/channels/NonWritableChannelException.classPKE9@$P, /java/nio/channels/NotYetBoundException.classPKE9@\0/java/nio/channels/NotYetConnectedException.classPKE9@\ޒh4W/java/nio/channels/OverlappingFileLockException.classPKE9@g5g(/java/nio/channels/Pipe$SinkChannel.classPKE9@Qg*]/java/nio/channels/Pipe$SourceChannel.classPKE9@A_/java/nio/channels/Pipe.classPKE9@#E+/java/nio/channels/ReadableByteChannel.classPKE9@YӐE-/java/nio/channels/ScatteringByteChannel.classPKE9@g)/java/nio/channels/SelectableChannel.classPKE9@z*$X/java/nio/channels/SelectionKey.classPKE9@  /java/nio/channels/Selector.classPKE9@pA7+/java/nio/channels/ServerSocketChannel.classPKE9@9kL%!/java/nio/channels/SocketChannel.classPKE9@@Ge2O$/java/nio/channels/UnresolvedAddressException.classPKE9@M]t7%/java/nio/channels/UnsupportedAddressTypeException.classPKE9@!^,+&/java/nio/channels/WritableByteChannel.classPKIG@'/java/nio/channels/spi/PKE9@2ug8B(/java/nio/channels/spi/AbstractInterruptibleChannel.classPKE9@hk[hm5Y*/java/nio/channels/spi/AbstractSelectableChannel.classPKE9@g? 0$-/java/nio/channels/spi/AbstractSelectionKey.classPKE9@z*X,./java/nio/channels/spi/AbstractSelector.classPKE9@&,1/java/nio/channels/spi/SelectorProvider.classPKIG@ 3/java/nio/charset/PKE9@s^!N/a3/java/nio/charset/CharacterCodingException.classPKE9@zM= 4/java/nio/charset/Charset.classPKE9@zxlZU %28/java/nio/charset/CharsetDecoder.classPKE9@r %;/java/nio/charset/CharsetEncoder.classPKE9@]}/,?/java/nio/charset/CoderMalfunctionError.classPKE9@@"A/java/nio/charset/CoderResult.classPKE9@:y6(hC/java/nio/charset/CodingErrorAction.classPKE9@k/"2D/java/nio/charset/IllegalCharsetNameException.classPKE9@$.vF/java/nio/charset/MalformedInputException.classPKE9@ޏ3G/java/nio/charset/UnmappableCharacterException.classPKE9@!()2dI/java/nio/charset/UnsupportedCharsetException.classPKIG@J/java/nio/charset/spi/PKE9@z4@&*2K/java/nio/charset/spi/CharsetProvider.classPKIG@ L/java/rmi/PKE9@&#L/java/rmi/AccessException.classPKE9@"$NN/java/rmi/AlreadyBoundException.classPKE9@O/java/rmi/ConnectException.classPKE9@ !Q/java/rmi/ConnectIOException.classPKE9@oEuR/java/rmi/MarshalException.classPKE9@S/java/rmi/MarshalledObject.classPKE9@U/java/rmi/Naming.classPKE9@0x$W/java/rmi/NoSuchObjectException.classPKE9@/java/rmi/registry/PKE9@kŻy&/java/rmi/registry/LocateRegistry.classPKE9@h=< /java/rmi/registry/Registry.classPKE9@N8z'K/java/rmi/registry/RegistryHandler.classPKIG@/java/rmi/server/PKE9@Kj%Ғ/java/rmi/server/ExportException.classPKE9@`~#D/java/rmi/server/LoaderHandler.classPKE9@ڽ)9*&/java/rmi/server/LogStream.classPKE9@cj>/java/rmi/server/ObjID.classPKE9@&D<2/java/rmi/server/Operation.classPKE9@28 $/java/rmi/server/RMIClassLoader.classPKE9@5'X/java/rmi/server/RMIClassLoaderSpi.classPKE9@ф7,Z/java/rmi/server/RMIClientSocketFactory.classPKE9@͈'k/java/rmi/server/RMIFailureHandler.classPKE9@!7ů,J/java/rmi/server/RMIServerSocketFactory.classPKE9@ ƿ:&S/java/rmi/server/RMISocketFactory.classPKE9@h_V: E/java/rmi/server/RemoteCall.classPKE9@x"ׅ"ͧ/java/rmi/server/RemoteObject.classPKE9@3ƀ3/java/rmi/server/RemoteObjectInvocationHandler.classPKE9@t/java/rmi/server/RemoteRef.classPKE9@Q$"Э/java/rmi/server/RemoteServer.classPKE9@*&T /java/rmi/server/RemoteStub.classPKE9@Vo1=*Q/java/rmi/server/ServerCloneException.classPKE9@ .ڲ/java/rmi/server/ServerNotActiveException.classPKE9@;/java/rmi/server/ServerRef.classPKE9@"d/java/rmi/server/Skeleton.classPKE9@\%-//java/rmi/server/SkeletonMismatchException.classPKE9@R/t/java/rmi/server/SkeletonNotFoundException.classPKE9@ {$.-#/java/rmi/server/SocketSecurityException.classPKE9@Q4ms/java/rmi/server/UID.classPKE9@@)\/java/rmi/server/UnicastRemoteObject.classPKE9@·y"/java/rmi/server/Unreferenced.classPKIG@/java/security/PKE9@G,cY(/java/security/AccessControlContext.classPKE9@ jJ*/java/security/AccessControlException.classPKE9@]VG$q/java/security/AccessController.classPKE9@*//java/security/AlgorithmParameterGenerator.classPKE9@hƐJ|2 /java/security/AlgorithmParameterGeneratorSpi.classPKE9@KA6 '/java/security/AlgorithmParameters.classPKE9@516*/java/security/AlgorithmParametersSpi.classPKE9@;$/java/security/Key.classPKE9@Z8? Y/java/security/KeyException.classPKE9@!wh)q/java/security/KeyFactory.classPKE9@ݘr! /java/security/KeyFactorySpi.classPKE9@@*/java/security/KeyManagementException.classPKE9@"K/java/security/KeyPair.classPKE9@'gl$)/java/security/KeyPairGenerator.classPKE9@ȊYkx'/java/security/KeyPairGeneratorSpi.classPKE9@OeZX/java/security/KeyRep$Type.classPKE9@[0java/security/KeyRep.classPKE9@<+=$50java/security/KeyStore$Builder.classPKE9@Lmi60java/security/KeyStore$CallbackHandlerProtection.classPKE9@3a3"g0java/security/KeyStore$Entry.classPKE9@g#r/D 0java/security/KeyStore$LoadStoreParameter.classPKE9@l hG/g 0java/security/KeyStore$PasswordProtection.classPKE9@, 0java/security/KeyStore$PrivateKeyEntry.classPKE9@B;+0l0java/security/KeyStore$ProtectionParameter.classPKE9@FUc+c0java/security/KeyStore$SecretKeyEntry.classPKE9@0X40java/security/KeyStore$TrustedCertificateEntry.classPKE9@Xs0java/security/KeyStore.classPKE9@ЭB%0java/security/KeyStoreException.classPKE9@SC 0java/security/KeyStoreSpi.classPKE9@ !0java/security/MessageDigest.classPKE9@l$1"0java/security/MessageDigestSpi.classPKE9@qAF,s$0java/security/NoSuchAlgorithmException.classPKE9@3+&0java/security/NoSuchProviderException.classPKE9@wn{'0java/security/Permission.classPKE9@t(~)0java/security/PermissionCollection.classPKE9@YFuH+0java/security/Permissions.classPKE9@ 7}% -0java/security/Policy$Parameters.classPKE9@ZAo$. -0java/security/Policy.classPKE9@Aqt+W10java/security/PolicySpi.classPKE9@e#30java/security/Principal.classPKE9@ l40java/security/PrivateKey.classPKE9@ &$ 50java/security/PrivilegedAction.classPKE9@O1ث-50java/security/PrivilegedActionException.classPKE9@Sj5-p70java/security/PrivilegedExceptionAction.classPKE9@z~.$80java/security/ProtectionDomain.classPKE9@&q$:0java/security/Provider$Service.classPKE9@MKE =0java/security/Provider.classPKE9@0>B%1A0java/security/ProviderException.classPKE9@" B0java/security/PublicKey.classPKE9@%C0java/security/SecureClassLoader.classPKE9@5hW E0java/security/SecureRandom.classPKE9@B #H0java/security/SecureRandomSpi.classPKE9@QXJ0java/security/Security.classPKE9@4u&L0java/security/SecurityPermission.classPKE9@< `N0java/security/Signature.classPKE9@ rGB&R0java/security/SignatureException.classPKE9@?2 }T0java/security/SignatureSpi.classPKE9@% W0java/security/SignedObject.classPKE9@ @Z0java/security/Signer.classPKE9@/Y3Ud\0java/security/Timestamp.classPKE9@\m ^0java/security/URIParameter.classPKE9@oۚ/_0java/security/UnrecoverableEntryException.classPKE9@kP -*a0java/security/UnrecoverableKeyException.classPKE9@GZ(b0java/security/UnresolvedPermission.classPKIG@d0java/security/acl/PKE9@ܾj=*e0java/security/acl/Acl.classPKE9@!OwQ f0java/security/acl/AclEntry.classPKE9@.8oD,|h0java/security/acl/AclNotFoundException.classPKE9@mQAci0java/security/acl/Group.classPKE9@NJ2>*j0java/security/acl/LastOwnerException.classPKE9@9ũI;)l0java/security/acl/NotOwnerException.classPKE9@u?m0java/security/acl/Owner.classPKE9@}"]n0java/security/acl/Permission.classPKIG@Go0java/security/cert/PKE9@0F8o0java/security/cert/CRL.classPKE9@,SB% q0java/security/cert/CRLException.classPKE9@Q$r0java/security/cert/CRLSelector.classPKE9@-s0java/security/cert/CertPath$CertPathRep.classPKE9@7n+.!su0java/security/cert/CertPath.classPKE9@Q(w0java/security/cert/CertPathBuilder.classPKE9@M1xz0java/security/cert/CertPathBuilderException.classPKE9@IKJ.$|0java/security/cert/CertPathBuilderResult.classPKE9@>p3)+,}0java/security/cert/CertPathBuilderSpi.classPKE9@nY+~0java/security/cert/CertPathParameters.classPKE9@-ӍJe*0java/security/cert/CertPathValidator.classPKE9@L|3b0java/security/cert/CertPathValidatorException.classPKE9@00java/security/cert/CertPathValidatorResult.classPKE9@Nb5S-v0java/security/cert/CertPathValidatorSpi.classPKE9@k^%0java/security/cert/CertSelector.classPKE9@5v@ "0java/security/cert/CertStore.classPKE9@)nD+70java/security/cert/CertStoreException.classPKE9@l]ɕ,Ԍ0java/security/cert/CertStoreParameters.classPKE9@z%Í0java/security/cert/CertStoreSpi.classPKE9@~30java/security/cert/Certificate$CertificateRep.classPKE9@=C$0java/security/cert/Certificate.classPKE9@aaD5#0java/security/cert/CertificateEncodingException.classPKE9@-bF-ʕ0java/security/cert/CertificateException.classPKE9@fj4 4k0java/security/cert/CertificateExpiredException.classPKE9@O&/^ +֘0java/security/cert/CertificateFactory.classPKE9@Oq.^0java/security/cert/CertificateFactorySpi.classPKE9@ؗ|8+0java/security/cert/CertificateNotYetValidException.classPKE9@5kE40java/security/cert/CertificateParsingException.classPKE9@n6Mׇm6H0java/security/cert/CollectionCertStoreParameters.classPKE9@B~׈n030java/security/cert/LDAPCertStoreParameters.classPKE9@C(.0java/security/cert/PKIXBuilderParameters.classPKE9@u2k0java/security/cert/PKIXCertPathBuilderResult.classPKE9@S^,@0java/security/cert/PKIXCertPathChecker.classPKE9@E[4a0java/security/cert/PKIXCertPathValidatorResult.classPKE9@Wܗrb'd0java/security/cert/PKIXParameters.classPKE9@CY#0java/security/cert/PolicyNode.classPKE9@j_,0java/security/cert/PolicyQualifierInfo.classPKE9@jr6$h0java/security/cert/TrustAnchor.classPKE9@,(3 0java/security/cert/X509CRL.classPKE9@%λ0java/security/cert/X509CRLEntry.classPKE9@< (۽0java/security/cert/X509CRLSelector.classPKE9@ER)m0java/security/cert/X509CertSelector.classPKE9@u:LD(C0java/security/cert/X509Certificate.classPKE9@\&0java/security/cert/X509Extension.classPKIG@0java/security/interfaces/PKE9@=%50java/security/interfaces/DSAKey.classPKE9@̩20java/security/interfaces/DSAKeyPairGenerator.classPKE9@R-((#0java/security/interfaces/DSAParams.classPKE9@gR5,0java/security/interfaces/DSAPrivateKey.classPKE9@2+U0java/security/interfaces/DSAPublicKey.classPKE9@*r|$0java/security/interfaces/ECKey.classPKE9@2+u0java/security/interfaces/ECPrivateKey.classPKE9@b6}5*0java/security/interfaces/ECPublicKey.classPKE9@I \%0java/security/interfaces/RSAKey.classPKE9@^=90java/security/interfaces/RSAMultiPrimePrivateCrtKey.classPKE9@Y/p0java/security/interfaces/RSAPrivateCrtKey.classPKE9@evC,0java/security/interfaces/RSAPrivateKey.classPKE9@° ?+'0java/security/interfaces/RSAPublicKey.classPKIG@k0java/security/spec/PKE9@6Qmq/0java/security/spec/AlgorithmParameterSpec.classPKE9@aqj)|0java/security/spec/DSAParameterSpec.classPKE9@d6*=0java/security/spec/DSAPrivateKeySpec.classPKE9@;fc3)0java/security/spec/DSAPublicKeySpec.classPKE9@JHo{ 0java/security/spec/ECField.classPKE9@`1java/sql/SQLPermission.classPKE9@x$ &a1java/sql/SQLRecoverableException.classPKE9@&c1java/sql/SQLSyntaxErrorException.classPKE9@笍I"e1java/sql/SQLTimeoutException.classPKE9@*.|g1java/sql/SQLTransactionRollbackException.classPKE9@X*.i1java/sql/SQLTransientConnectionException.classPKE9@M5$k1java/sql/SQLTransientException.classPKE9@aYrm1java/sql/SQLWarning.classPKE9@sGo1java/sql/SQLXML.classPKE9@$>Nq1java/sql/Savepoint.classPKE9@T|/a@r1java/sql/Statement.classPKE9@u1java/sql/Struct.classPKE9@DuTebv1java/sql/Time.classPKE9@iYx1java/sql/Timestamp.classPKE9@ժ_z1java/sql/Types.classPKE9@iu}1java/sql/Wrapper.classPKIG@ ~1java/text/PKE9@YQ?'1java/text/Annotation.classPKE9@@>>x5u1java/text/AttributedCharacterIterator$Attribute.classPKE9@$0W+1java/text/AttributedCharacterIterator.classPKE9@~Ӝ Ƅ1java/text/AttributedString.classPKE9@y[+W1java/text/Bidi.classPKE9@;~T1java/text/BreakIterator.classPKE9@_!,1java/text/CharacterIterator.classPKE9@a1java/text/ChoiceFormat.classPKE9@%$(^1java/text/CollationElementIterator.classPKE9@ҖƔ1java/text/CollationKey.classPKE9@M1java/text/Collator.classPKE9@S ə1java/text/DateFormat$Field.classPKE9@Y31java/text/DateFormat.classPKE9@  !+1java/text/DateFormatSymbols.classPKE9@ne 1java/text/DecimalFormat.classPKE9@7pV $Ȩ1java/text/DecimalFormatSymbols.classPKE9@|tp1java/text/FieldPosition.classPKE9@Kk,1java/text/Format$Field.classPKE9@pF1java/text/Format.classPKE9@,P.#=1java/text/MessageFormat$Field.classPKE9@@Xs2 ޳1java/text/MessageFormat.classPKE9@l[1java/text/Normalizer$Form.classPKE9@A,_1java/text/Normalizer.classPKE9@̶%"1java/text/NumberFormat$Field.classPKE9@SsJO01java/text/NumberFormat.classPKE9@~\1java/text/ParseException.classPKE9@Gp3n+1java/text/ParsePosition.classPKE9@`!1java/text/RuleBasedCollator.classPKE9@f| 1java/text/SimpleDateFormat.classPKE9@0'1java/text/StringCharacterIterator.classPKIG@1java/text/spi/PKE9@N$)L1java/text/spi/BreakIteratorProvider.classPKE9@m $1java/text/spi/CollatorProvider.classPKE9@t&1java/text/spi/DateFormatProvider.classPKE9@}b-1java/text/spi/DateFormatSymbolsProvider.classPKE9@*z01java/text/spi/DecimalFormatSymbolsProvider.classPKE9@%(K1java/text/spi/NumberFormatProvider.classPKIG@ 1java/util/PKE9@~ee"1java/util/AbstractCollection.classPKE9@, L1java/util/AbstractList.classPKE9@L'1java/util/AbstractMap$SimpleEntry.classPKE9@ZmR01java/util/AbstractMap$SimpleImmutableEntry.classPKE9@&k=1java/util/AbstractMap.classPKE9@M[Yk1java/util/AbstractQueue.classPKE9@mىl&1java/util/AbstractSequentialList.classPKE9@(1java/util/AbstractSet.classPKE9@21java/util/ArrayDeque.classPKE9@8sL)1java/util/ArrayList.classPKE9@gi)1java/util/Arrays.classPKE9@xԳ1java/util/BitSet.classPKE9@o1java/util/Calendar.classPKE9@˻I2java/util/Collection.classPKE9@6@ /z2java/util/Collections.classPKE9@O'2java/util/Comparator.classPKE9@/2java/util/ConcurrentModificationException.classPKE9@_:Mf2java/util/Currency.classPKE9@nN =2java/util/Date.classPKE9@-e2java/util/Deque.classPKE9@V<đ@=2java/util/Dictionary.classPKE9@X-2java/util/DuplicateFormatFlagsException.classPKE9@NRi8#2java/util/EmptyStackException.classPKE9@؀Y!2java/util/EnumMap.classPKE9@Lo !2java/util/EnumSet.classPKE9@0a~ %2java/util/Enumeration.classPKE9@6au&2java/util/EventListener.classPKE9@B"j'2java/util/EventListenerProxy.classPKE9@pӊ(2java/util/EventObject.classPKE9@\]Ew67*2java/util/FormatFlagsConversionMismatchException.classPKE9@4d}+2java/util/Formattable.classPKE9@7S! ,2java/util/FormattableFlags.classPKE9@@8}R..2java/util/Formatter$BigDecimalLayoutForm.classPKE9@%k[ 02java/util/Formatter.classPKE9@7eL(e42java/util/FormatterClosedException.classPKE9@݉H!52java/util/GregorianCalendar.classPKE9@F1E82java/util/HashMap.classPKE9@IE*;2java/util/HashSet.classPKE9@ z =2java/util/Hashtable.classPKE9@A2java/util/IdentityHashMap.classPKE9@S\ /C2java/util/IllegalFormatCodePointException.classPKE9@It0NE2java/util/IllegalFormatConversionException.classPKE9@^I& G2java/util/IllegalFormatException.classPKE9@+RH2java/util/IllegalFormatFlagsException.classPKE9@]FK /I2java/util/IllegalFormatPrecisionException.classPKE9@%A +)K2java/util/IllegalFormatWidthException.classPKE9@@e &L2java/util/InputMismatchException.classPKE9@Ca0M2java/util/InvalidPropertiesFormatException.classPKE9@7aaO2java/util/Iterator.classPKE9@}2(UaP2java/util/LinkedHashMap.classPKE9@`R2java/util/LinkedHashSet.classPKE9@N4^+T2java/util/LinkedList.classPKE9@2X2java/util/List.classPKE9@@ z xZ2java/util/ListIterator.classPKE9@M%qk"[2java/util/ListResourceBundle.classPKE9@kpN* |]2java/util/Locale.classPKE9@> b2java/util/Map$Entry.classPKE9@ccc2java/util/Map.classPKE9@j'.ie2java/util/MissingFormatArgumentException.classPKE9@Ɇ%+f2java/util/MissingFormatWidthException.classPKE9@R>n(jh2java/util/MissingResourceException.classPKE9@[Xani2java/util/NavigableMap.classPKE9@5/_}@l2java/util/NavigableSet.classPKE9@kE{&n2java/util/NoSuchElementException.classPKE9@"co2java/util/Observable.classPKE9@?P|>q2java/util/Observer.classPKE9@Dr2java/util/PriorityQueue.classPKE9@! u2java/util/Properties.classPKE9@ p& "~x2java/util/PropertyPermission.classPKE9@a` e&y2java/util/PropertyResourceBundle.classPKE9@ɹf{2java/util/Queue.classPKE9@F?|2java/util/Random.classPKE9@1V?`s$2java/util/RandomAccess.classPKE9@rgsT &2java/util/ResourceBundle$Control.classPKE9@@e  2java/util/ResourceBundle.classPKE9@.pg2java/util/Scanner.classPKE9@#C")2java/util/ServiceConfigurationError.classPKE9@xQ`2java/util/ServiceLoader.classPKE9@؍+Ȑ2java/util/Set.classPKE9@(}, Ñ2java/util/SimpleTimeZone.classPKE9@]';2java/util/SortedMap.classPKE9@ \Ez2java/util/SortedSet.classPKE9@[ 2java/util/Stack.classPKE9@2java/util/StringTokenizer.classPKE9@3d/2java/util/TimeZone.classPKE9@V&}2java/util/Timer.classPKE9@Ρ2java/util/TimerTask.classPKE9@u3]i)02java/util/TooManyListenersException.classPKE9@~N2java/util/TreeMap.classPKE9@?yhi2java/util/TreeSet.classPKE9@E)i2java/util/UUID.classPKE9@Kb-"0>2java/util/UnknownFormatConversionException.classPKE9@&+2java/util/UnknownFormatFlagsException.classPKE9@3 62java/util/Vector.classPKE9@"L'm2java/util/WeakHashMap.classPKIG@2java/util/concurrent/PKE9@$5+ 22java/util/concurrent/AbstractExecutorService.classPKE9@c -{2java/util/concurrent/ArrayBlockingQueue.classPKE9@:Wzo(e2java/util/concurrent/BlockingDeque.classPKE9@[H>(*2java/util/concurrent/BlockingQueue.classPKE9@x 12java/util/concurrent/BrokenBarrierException.classPKE9@"Һ#2java/util/concurrent/Callable.classPKE9@dV02java/util/concurrent/CancellationException.classPKE9@7CW,2java/util/concurrent/CompletionService.classPKE9@eF& ,2java/util/concurrent/ConcurrentHashMap.classPKE9@}/0:2java/util/concurrent/ConcurrentLinkedQueue.classPKE9@n}}(2java/util/concurrent/ConcurrentMap.classPKE9@0‰j12java/util/concurrent/ConcurrentNavigableMap.classPKE9@oP02java/util/concurrent/ConcurrentSkipListMap.classPKE9@6ڡu02java/util/concurrent/ConcurrentSkipListSet.classPKE9@.//2java/util/concurrent/CopyOnWriteArrayList.classPKE9@*.2java/util/concurrent/CopyOnWriteArraySet.classPKE9@A])2java/util/concurrent/CountDownLatch.classPKE9@H(2java/util/concurrent/CyclicBarrier.classPKE9@%%2java/util/concurrent/DelayQueue.classPKE9@Hj'"w2java/util/concurrent/Delayed.classPKE9@$2java/util/concurrent/Exchanger.classPKE9@y =-2java/util/concurrent/ExecutionException.classPKE9@|(Ȇ#52java/util/concurrent/Executor.classPKE9@2 4 2java/util/concurrent/ExecutorCompletionService.classPKE9@"O2*12java/util/concurrent/ExecutorService.classPKE9@uh|J$2java/util/concurrent/Executors.classPKE9@[4=!2java/util/concurrent/Future.classPKE9@wG % 3java/util/concurrent/FutureTask.classPKE9@m.v3java/util/concurrent/LinkedBlockingDeque.classPKE9@Pd/ .l3java/util/concurrent/LinkedBlockingQueue.classPKE9@Dc> 0, 3java/util/concurrent/PriorityBlockingQueue.classPKE9@1u8L5F3java/util/concurrent/RejectedExecutionException.classPKE9@Gty33java/util/concurrent/RejectedExecutionHandler.classPKE9@f4)3java/util/concurrent/RunnableFuture.classPKE9@]23java/util/concurrent/RunnableScheduledFuture.classPKE9@uj03+3java/util/concurrent/ScheduledExecutorService.classPKE9@AퟲJ*3java/util/concurrent/ScheduledFuture.classPKE9@p63java/util/concurrent/ScheduledThreadPoolExecutor.classPKE9@n$3java/util/concurrent/Semaphore.classPKE9@ HR_ +3java/util/concurrent/SynchronousQueue.classPKE9@ɕɑ("3java/util/concurrent/ThreadFactory.classPKE9@ 2x%j9#3java/util/concurrent/ThreadPoolExecutor$AbortPolicy.classPKE9@j>R%3java/util/concurrent/ThreadPoolExecutor$CallerRunsPolicy.classPKE9@ oA('3java/util/concurrent/ThreadPoolExecutor$DiscardOldestPolicy.classPKE9@=8l;)3java/util/concurrent/ThreadPoolExecutor$DiscardPolicy.classPKE9@-*3java/util/concurrent/ThreadPoolExecutor.classPKE9@Z.W0%03java/util/concurrent/TimeUnit$1.classPKE9@0%}23java/util/concurrent/TimeUnit$2.classPKE9@_Q0%43java/util/concurrent/TimeUnit$3.classPKE9@0f1%53java/util/concurrent/TimeUnit$4.classPKE9@7xi1%73java/util/concurrent/TimeUnit$5.classPKE9@_W01%83java/util/concurrent/TimeUnit$6.classPKE9@.?2%:3java/util/concurrent/TimeUnit$7.classPKE9@pf%Ȏw #;3java/util/concurrent/TimeUnit.classPKE9@+s@3java/util/concurrent/TimeoutException.classPKIG@A3java/util/concurrent/atomic/PKE9@!0+/B3java/util/concurrent/atomic/AtomicBoolean.classPKE9@װ^I/'D3java/util/concurrent/atomic/AtomicInteger.classPKE9@"T74F3java/util/concurrent/atomic/AtomicIntegerArray.classPKE9@__=;fI3java/util/concurrent/atomic/AtomicIntegerFieldUpdater.classPKE9@c4,M,jL3java/util/concurrent/atomic/AtomicLong.classPKE9@XA{1O3java/util/concurrent/atomic/AtomicLongArray.classPKE9@w 73java/util/concurrent/locks/ReentrantReadWriteLock.classPKIG@3java/util/jar/PKE9@뮗#υ3java/util/jar/Attributes$Name.classPKE9@k+_ 3java/util/jar/Attributes.classPKE9@Ol3java/util/jar/JarEntry.classPKE9@Bܥ M3java/util/jar/JarException.classPKE9@Ƞh1S3java/util/jar/JarFile.classPKE9@285r"3java/util/jar/JarInputStream.classPKE9@j6Z#ؓ3java/util/jar/JarOutputStream.classPKE9@lL$v_3java/util/jar/Manifest.classPKE9@Z5="͗3java/util/jar/Pack200$Packer.classPKE9@4_!d$R3java/util/jar/Pack200$Unpacker.classPKE9@'_<U3java/util/jar/Pack200.classPKIG@ 3java/util/logging/PKE9@Y< \>&K3java/util/logging/ConsoleHandler.classPKE9@$t3java/util/logging/ErrorManager.classPKE9@΂#d3java/util/logging/FileHandler.classPKE9@jG73java/util/logging/Filter.classPKE9@iQ!3java/util/logging/Formatter.classPKE9@A3java/util/logging/Handler.classPKE9@#qvx3java/util/logging/Level.classPKE9@P."d3java/util/logging/LogManager.classPKE9@(w !n3java/util/logging/LogRecord.classPKE9@3.R03java/util/logging/Logger.classPKE9@o%P3java/util/logging/LoggingMXBean.classPKE9@`d)3java/util/logging/LoggingPermission.classPKE9@ LڨH%غ3java/util/logging/MemoryHandler.classPKE9@%+a'Ӽ3java/util/logging/SimpleFormatter.classPKE9@n'%:3java/util/logging/SocketHandler.classPKE9@SȌ6%3java/util/logging/StreamHandler.classPKE9@ $3java/util/logging/XMLFormatter.classPKIG@3java/util/prefs/PKE9@=*)))3java/util/prefs/AbstractPreferences.classPKE9@ߨ+3java/util/prefs/BackingStoreException.classPKE9@$KD>73java/util/prefs/InvalidPreferencesFormatException.classPKE9@59u%3java/util/prefs/NodeChangeEvent.classPKE9@k8+(D3java/util/prefs/NodeChangeListener.classPKE9@8za+D3java/util/prefs/PreferenceChangeEvent.classPKE9@kڙ.3java/util/prefs/PreferenceChangeListener.classPKE9@& !3java/util/prefs/Preferences.classPKE9@"ؓ(h3java/util/prefs/PreferencesFactory.classPKIG@Q3java/util/regex/PKE9@ۓ7!3java/util/regex/MatchResult.classPKE9@hEa 3java/util/regex/Matcher.classPKE9@~})3java/util/regex/Pattern.classPKE9@RY_, 3java/util/regex/PatternSyntaxException.classPKIG@3java/util/spi/PKE9@]N(3java/util/spi/CurrencyNameProvider.classPKE9@eO&[3java/util/spi/LocaleNameProvider.classPKE9@0r)3java/util/spi/LocaleServiceProvider.classPKE9@ܼ(3java/util/spi/TimeZoneNameProvider.classPKIG@u3java/util/zip/PKE9@$X\s3java/util/zip/Adler32.classPKE9@_po3java/util/zip/CRC32.classPKE9@h *?&&3java/util/zip/CheckedInputStream.classPKE9@ +F'3java/util/zip/CheckedOutputStream.classPKE9@S۰$3java/util/zip/Checksum.classPKE9@A D\'3java/util/zip/DataFormatException.classPKE9@QA)i3java/util/zip/Deflater.classPKE9@łu7'3java/util/zip/DeflaterInputStream.classPKE9@uU(3java/util/zip/DeflaterOutputStream.classPKE9@q}#3java/util/zip/GZIPInputStream.classPKE9@MR$c3java/util/zip/GZIPOutputStream.classPKE9@!F3java/util/zip/Inflater.classPKE9@&e'3java/util/zip/InflaterInputStream.classPKE9@8(3java/util/zip/InflaterOutputStream.classPKE9@h>  3java/util/zip/ZipConstants.classPKE9@j㼑 4java/util/zip/ZipEntry.classPKE9@Z4java/util/zip/ZipError.classPKE9@[Ҷ "4java/util/zip/ZipException.classPKE9@-lr4java/util/zip/ZipFile.classPKE9@>6T"' 4java/util/zip/ZipInputStream.classPKE9@qZ# 4java/util/zip/ZipOutputStream.classPKIG@^4javax/PKIG@4javax/accessibility/PKE9@|$4javax/accessibility/Accessible.classPKE9@YYJsW*4javax/accessibility/AccessibleAction.classPKE9@} 75y4javax/accessibility/AccessibleAttributeSequence.classPKE9@P `*4javax/accessibility/AccessibleBundle.classPKE9@-4javax/accessibility/AccessibleComponent.classPKE9@+-+B4javax/accessibility/AccessibleContext.classPKE9@7>M)0M4javax/accessibility/AccessibleEditableText.classPKE9@AV3i54javax/accessibility/AccessibleExtendedComponent.classPKE9@ɌǶ#1 4javax/accessibility/AccessibleExtendedTable.classPKE9@WJ0#!4javax/accessibility/AccessibleExtendedText.classPKE9@ 5-"4javax/accessibility/AccessibleHyperlink.classPKE9@_Y1--$4javax/accessibility/AccessibleHypertext.classPKE9@G(F%4javax/accessibility/AccessibleIcon.classPKE9@6k.^&4javax/accessibility/AccessibleKeyBinding.classPKE9@w ,W'4javax/accessibility/AccessibleRelation.classPKE9@2Z/|+4javax/accessibility/AccessibleRelationSet.classPKE9@. P82-4javax/accessibility/AccessibleResourceBundle.classPKE9@e_b (t/4javax/accessibility/AccessibleRole.classPKE9@GF̸-54javax/accessibility/AccessibleSelection.classPKE9@it@)64javax/accessibility/AccessibleState.classPKE9@sp,y:4javax/accessibility/AccessibleStateSet.classPKE9@J.<4javax/accessibility/AccessibleStreamable.classPKE9@@m)=4javax/accessibility/AccessibleTable.classPKE9@^{4?4javax/accessibility/AccessibleTableModelChange.classPKE9@3 (A4javax/accessibility/AccessibleText.classPKE9@y +0B4javax/accessibility/AccessibleTextSequence.classPKE9@ϴB)}D4javax/accessibility/AccessibleValue.classPKIG@E4javax/activation/PKE9@kD+E4javax/activation/ActivationDataFlavor.classPKE9@rs"G4javax/activation/CommandInfo.classPKE9@$= #!I4javax/activation/CommandMap.classPKE9@P/$K4javax/activation/CommandObject.classPKE9@ 5-V)L4javax/activation/DataContentHandler.classPKE9@0}N4javax/activation/DataContentHandlerFactory.classPKE9@$Q "uO4javax/activation/DataHandler.classPKE9@f%Z!S4javax/activation/DataSource.classPKE9@"%@T4javax/activation/FileDataSource.classPKE9@i8Jz"kV4javax/activation/FileTypeMap.classPKE9@V)b(X4javax/activation/MailcapCommandMap.classPKE9@2-ZZ4javax/activation/MimeType.classPKE9@,c]4javax/activation/MimeTypeParameterList.classPKE9@/D -_4javax/activation/MimeTypeParseException.classPKE9@S+ a4javax/activation/MimetypesFileTypeMap.classPKE9@qp)$b4javax/activation/URLDataSource.classPKE9@(3d4javax/activation/UnsupportedDataTypeException.classPKIG@Nf4javax/activity/PKE9@~H/f4javax/activity/ActivityCompletedException.classPKE9@֐G.2h4javax/activity/ActivityRequiredException.classPKE9@˻H-i4javax/activity/InvalidActivityException.classPKIG@xk4javax/annotation/PKE9@_ k4javax/annotation/Generated.classPKE9@;$m4javax/annotation/PostConstruct.classPKE9@t̴!n4javax/annotation/PreDestroy.classPKE9@~uQ2 p4javax/annotation/Resource$AuthenticationType.classPKE9@о+r4javax/annotation/Resource.classPKE9@jٸ t4javax/annotation/Resources.classPKIG@2v4javax/annotation/processing/PKE9@ kh3~v4javax/annotation/processing/AbstractProcessor.classPKE9@,Gy4javax/annotation/processing/Completion.classPKE9@[^O,p-;z4javax/annotation/processing/Completions.classPKE9@9g A'{4javax/annotation/processing/Filer.classPKE9@z@+0X}4javax/annotation/processing/FilerException.classPKE9@J}*~4javax/annotation/processing/Messager.classPKE9@ =m7!4javax/annotation/processing/ProcessingEnvironment.classPKE9@z߁ +Á4javax/annotation/processing/Processor.classPKE9@124javax/annotation/processing/RoundEnvironment.classPKE9@h%Q:.4javax/annotation/processing/SupportedAnnotationTypes.classPKE9@M֙24javax/annotation/processing/SupportedOptions.classPKE9@%8"4javax/annotation/processing/SupportedSourceVersion.classPKIG@ 4javax/crypto/PKE9@ji5&4javax/crypto/BadPaddingException.classPKE9@(fG4javax/crypto/Cipher.classPKE9@$I4javax/crypto/CipherInputStream.classPKE9@%4javax/crypto/CipherOutputStream.classPKE9@wTp5 4javax/crypto/CipherSpi.classPKE9@Z|*4javax/crypto/EncryptedPrivateKeyInfo.classPKE9@+SF %4javax/crypto/ExemptionMechanism.classPKE9@L.24javax/crypto/ExemptionMechanismException.classPKE9@0S(4javax/crypto/ExemptionMechanismSpi.classPKE9@O,4javax/crypto/IllegalBlockSizeException.classPKE9@alM, "4javax/crypto/KeyAgreement.classPKE9@"4javax/crypto/KeyAgreementSpi.classPKE9@ 4javax/crypto/KeyGenerator.classPKE9@%;[e"4javax/crypto/KeyGeneratorSpi.classPKE9@xo U4javax/crypto/Mac.classPKE9@Ee[n4javax/crypto/MacSpi.classPKE9@܄ )F4javax/crypto/NoSuchPaddingException.classPKE9@ g4javax/crypto/NullCipher.classPKE9@_#Qo4javax/crypto/SealedObject.classPKE9@U:4javax/crypto/SecretKey.classPKE9@h#4javax/crypto/SecretKeyFactory.classPKE9@Gj&4javax/crypto/SecretKeyFactorySpi.classPKE9@'_'C4javax/crypto/ShortBufferException.classPKIG@4javax/crypto/interfaces/PKE9@{Y#4javax/crypto/interfaces/DHKey.classPKE9@D0*4javax/crypto/interfaces/DHPrivateKey.classPKE9@i-)4javax/crypto/interfaces/DHPublicKey.classPKE9@c+$W4javax/crypto/interfaces/PBEKey.classPKIG@4javax/crypto/spec/PKE9@{;`N"4javax/crypto/spec/DESKeySpec.classPKE9@er7%4javax/crypto/spec/DESedeKeySpec.classPKE9@~CI5* 4javax/crypto/spec/DHGenParameterSpec.classPKE9@Qd5M'4javax/crypto/spec/DHParameterSpec.classPKE9@dSX(4javax/crypto/spec/DHPrivateKeySpec.classPKE9@i?X'14javax/crypto/spec/DHPublicKeySpec.classPKE9@ڕRA'4javax/crypto/spec/IvParameterSpec.classPKE9@prr)4javax/crypto/spec/OAEPParameterSpec.classPKE9@ "4javax/crypto/spec/PBEKeySpec.classPKE9@ȗ/S9(4javax/crypto/spec/PBEParameterSpec.classPKE9@g#8:gF*}4javax/crypto/spec/PSource$PSpecified.classPKE9@ q=<4javax/crypto/spec/PSource.classPKE9@x.(4javax/crypto/spec/RC2ParameterSpec.classPKE9@eԽ(4javax/crypto/spec/RC5ParameterSpec.classPKE9@t%4javax/crypto/spec/SecretKeySpec.classPKIG@4javax/imageio/PKE9@ 4javax/imageio/IIOException.classPKE9@S 4javax/imageio/IIOImage.classPKE9@"N 4javax/imageio/IIOParam.classPKE9@e&4javax/imageio/IIOParamController.classPKE9@ݏK0j$4javax/imageio/ImageIO.classPKE9@1 ?He"4javax/imageio/ImageReadParam.classPKE9@h& *4javax/imageio/ImageReader.classPKE9@)ΐ#4javax/imageio/ImageTranscoder.classPKE9@^{} &4javax/imageio/ImageTypeSpecifier.classPKE9@]x\L#v5javax/imageio/ImageWriteParam.classPKE9@F!5javax/imageio/ImageWriter.classPKIG@ 5javax/imageio/event/PKE9@561Q 5javax/imageio/event/IIOReadProgressListener.classPKE9@^ /5javax/imageio/event/IIOReadUpdateListener.classPKE9@#0*5javax/imageio/event/IIOReadWarningListener.classPKE9@pz2=5javax/imageio/event/IIOWriteProgressListener.classPKE9@=)15javax/imageio/event/IIOWriteWarningListener.classPKIG@5javax/imageio/metadata/PKE9@ef445javax/imageio/metadata/IIOInvalidTreeException.classPKE9@%F (5javax/imageio/metadata/IIOMetadata.classPKE9@TWl25javax/imageio/metadata/IIOMetadataController.classPKE9@+{ž5 .5javax/imageio/metadata/IIOMetadataFormat.classPKE9@Y725javax/imageio/metadata/IIOMetadataFormatImpl.classPKE9@,v,%5javax/imageio/metadata/IIOMetadataNode.classPKIG@ ,5javax/imageio/plugins/PKIG@O,5javax/imageio/plugins/bmp/PKE9@`Lz2,5javax/imageio/plugins/bmp/BMPImageWriteParam.classPKIG@E.5javax/imageio/plugins/jpeg/PKE9@\nr1.5javax/imageio/plugins/jpeg/JPEGHuffmanTable.classPKE9@Bա305javax/imageio/plugins/jpeg/JPEGImageReadParam.classPKE9@hO425javax/imageio/plugins/jpeg/JPEGImageWriteParam.classPKE9@ $+45javax/imageio/plugins/jpeg/JPEGQTable.classPKIG@75javax/imageio/spi/PKE9@W]6#^75javax/imageio/spi/IIORegistry.classPKE9@ v *85javax/imageio/spi/IIOServiceProvider.classPKE9@WW07+J;5javax/imageio/spi/ImageInputStreamSpi.classPKE9@ 2?,=5javax/imageio/spi/ImageOutputStreamSpi.classPKE9@$E&_@5javax/imageio/spi/ImageReaderSpi.classPKE9@ R ,C5javax/imageio/spi/ImageReaderWriterSpi.classPKE9@,3DX*G5javax/imageio/spi/ImageTranscoderSpi.classPKE9@ &*&H5javax/imageio/spi/ImageWriterSpi.classPKE9@8dP+-L5javax/imageio/spi/RegisterableService.classPKE9@AVV.IM5javax/imageio/spi/ServiceRegistry$Filter.classPKE9@cU'TN5javax/imageio/spi/ServiceRegistry.classPKIG@R5javax/imageio/stream/PKE9@&r4S5javax/imageio/stream/FileCacheImageInputStream.classPKE9@*5T5javax/imageio/stream/FileCacheImageOutputStream.classPKE9@Lv~/V5javax/imageio/stream/FileImageInputStream.classPKE9@"¾0X5javax/imageio/stream/FileImageOutputStream.classPKE9@XO(Z5javax/imageio/stream/IIOByteBuffer.classPKE9@ +\5javax/imageio/stream/ImageInputStream.classPKE9@0/'_5javax/imageio/stream/ImageInputStreamImpl.classPKE9@<h(8,!d5javax/imageio/stream/ImageOutputStream.classPKE9@Eb 0e5javax/imageio/stream/ImageOutputStreamImpl.classPKE9@eqi6h5javax/imageio/stream/MemoryCacheImageInputStream.classPKE9@4jҽ7j5javax/imageio/stream/MemoryCacheImageOutputStream.classPKIG@ l5javax/jws/PKE9@!H)l5javax/jws/HandlerChain.classPKE9@ wn5javax/jws/Oneway.classPKE9@^< o5javax/jws/WebMethod.classPKE9@ {LC1q5javax/jws/WebParam$Mode.classPKE9@Bs5javax/jws/WebParam.classPKE9@BE'u5javax/jws/WebResult.classPKE9@_Qf$w5javax/jws/WebService.classPKIG@x5javax/jws/soap/PKE9@T#x5javax/jws/soap/InitParam.classPKE9@rL/z5javax/jws/soap/SOAPBinding$ParameterStyle.classPKE9@HB>CW&|5javax/jws/soap/SOAPBinding$Style.classPKE9@Z^BL$X5javax/jws/soap/SOAPBinding$Use.classPKE9@0h޸ 5javax/jws/soap/SOAPBinding.classPKE9@'g%'5javax/jws/soap/SOAPMessageHandler.classPKE9@f(l5javax/jws/soap/SOAPMessageHandlers.classPKIG@ ߆5javax/lang/PKIG@5javax/lang/model/PKE9@1}.$[5javax/lang/model/SourceVersion.classPKIG@ۊ5javax/lang/model/element/PKE9@m/$5javax/lang/model/element/AnnotationMirror.classPKE9@ʱJ.g5javax/lang/model/element/AnnotationValue.classPKE9@R55javax/lang/model/element/AnnotationValueVisitor.classPKE9@^s&$5javax/lang/model/element/Element.classPKE9@t6E!:*J5javax/lang/model/element/ElementKind.classPKE9@ALbI-Ö5javax/lang/model/element/ElementVisitor.classPKE9@pB05javax/lang/model/element/ExecutableElement.classPKE9@~H' 5javax/lang/model/element/Modifier.classPKE9@ϲO#5javax/lang/model/element/Name.classPKE9@ʼn*ʞ5javax/lang/model/element/NestingKind.classPKE9@-5javax/lang/model/element/PackageElement.classPKE9@䖊-P*5javax/lang/model/element/TypeElement.classPKE9@2t3:5javax/lang/model/element/TypeParameterElement.classPKE9@BV>}5javax/lang/model/element/UnknownAnnotationValueException.classPKE9@9M6?5javax/lang/model/element/UnknownElementException.classPKE9@u(.5javax/lang/model/element/VariableElement.classPKIG@5javax/lang/model/type/PKE9@\R%(5javax/lang/model/type/ArrayType.classPKE9@c(5javax/lang/model/type/DeclaredType.classPKE9@*x%c5javax/lang/model/type/ErrorType.classPKE9@ *.5javax/lang/model/type/ExecutableType.classPKE9@4($"%15javax/lang/model/type/MirroredTypeException.classPKE9@Ȝ)b2 5javax/lang/model/type/MirroredTypesException.classPKE9@St"˱5javax/lang/model/type/NoType.classPKE9@mx$5javax/lang/model/type/NullType.classPKE9@]7}{)Y5javax/lang/model/type/PrimitiveType.classPKE9@"xN{)+5javax/lang/model/type/ReferenceType.classPKE9@9$5javax/lang/model/type/TypeKind.classPKE9@M &5javax/lang/model/type/TypeMirror.classPKE9@ ߏ<(5javax/lang/model/type/TypeVariable.classPKE9@O'5javax/lang/model/type/TypeVisitor.classPKE9@sAO0)5javax/lang/model/type/UnknownTypeException.classPKE9@(ֿ5javax/lang/model/type/WildcardType.classPKIG@5javax/lang/model/util/PKE9@d8#;5javax/lang/model/util/AbstractAnnotationValueVisitor6.classPKE9@)35javax/lang/model/util/AbstractElementVisitor6.classPKE9@vش0)5javax/lang/model/util/AbstractTypeVisitor6.classPKE9@yTw% )X5javax/lang/model/util/ElementFilter.classPKE9@V /5javax/lang/model/util/ElementKindVisitor6.classPKE9@.eg +F5javax/lang/model/util/ElementScanner6.classPKE9@($5javax/lang/model/util/Elements.classPKE9@k1#95javax/lang/model/util/SimpleAnnotationValueVisitor6.classPKE9@hEl  1 5javax/lang/model/util/SimpleElementVisitor6.classPKE9@.t5javax/lang/model/util/SimpleTypeVisitor6.classPKE9@{ ,o5javax/lang/model/util/TypeKindVisitor6.classPKE9@yҙ!U!5javax/lang/model/util/Types.classPKIG@5javax/management/PKE9@5Fg 55javax/management/Attribute.classPKE9@ⓔk25javax/management/AttributeChangeNotification.classPKE9@ 85javax/management/AttributeChangeNotificationFilter.classPKE9@f$85javax/management/AttributeList.classPKE9@ǽ1A5javax/management/AttributeNotFoundException.classPKE9@$+;(5javax/management/AttributeValueExp.classPKE9@445javax/management/BadAttributeValueExpException.classPKE9@  35javax/management/BadBinaryOpValueExpException.classPKE9@25javax/management/BadStringOperationException.classPKE9@$.o5javax/management/DefaultLoaderRepository.classPKE9@P!f5javax/management/Descriptor.classPKE9@,3'5javax/management/DescriptorAccess.classPKE9@]$5javax/management/DescriptorKey.classPKE9@%R5javax/management/DescriptorRead.classPKE9@~Y$#'5javax/management/DynamicMBean.classPKE9@&_*5javax/management/ImmutableDescriptor.classPKE9@B5&6javax/management/InstanceAlreadyExistsException.classPKE9@6Z06javax/management/InstanceNotFoundException.classPKE9@<\-6javax/management/IntrospectionException.classPKE9@ V2w6javax/management/InvalidApplicationException.classPKE9@456javax/management/InvalidAttributeValueException.classPKE9@`"J 6javax/management/JMException.classPKE9@') 6javax/management/JMRuntimeException.classPKE9@6r! 6javax/management/JMX.classPKE9@qt0R6javax/management/ListenerNotFoundException.classPKE9@1 )6javax/management/MBeanAttributeInfo.classPKE9@F+H6javax/management/MBeanConstructorInfo.classPKE9@ҬC%u6javax/management/MBeanException.classPKE9@\' 6javax/management/MBeanFeatureInfo.classPKE9@P-qC 6javax/management/MBeanInfo.classPKE9@Sn,6javax/management/MBeanNotificationInfo.classPKE9@F6go)6javax/management/MBeanOperationInfo.classPKE9@ )!6javax/management/MBeanParameterInfo.classPKE9@$G&i#6javax/management/MBeanPermission.classPKE9@d(%6javax/management/MBeanRegistration.classPKE9@ޑ#<1&6javax/management/MBeanRegistrationException.classPKE9@OT"H(6javax/management/MBeanServer.classPKE9@mZ ),6javax/management/MBeanServerBuilder.classPKE9@ VXf ,.6javax/management/MBeanServerConnection.classPKE9@֦*O26javax/management/MBeanServerDelegate.classPKE9@?/M56javax/management/MBeanServerDelegateMBean.classPKE9@)66javax/management/MBeanServerFactory.classPKE9@ 386javax/management/MBeanServerInvocationHandler.classPKE9@/u.;6javax/management/MBeanServerNotification.classPKE9@in! ,=6javax/management/MBeanServerPermission.classPKE9@ɣ! +?6javax/management/MBeanTrustPermission.classPKE9@.@6javax/management/MXBean.classPKE9@)63A6javax/management/MalformedObjectNameException.classPKE9@1lC6javax/management/NotCompliantMBeanException.classPKE9@nA?#D6javax/management/Notification.classPKE9@Ms.mG6javax/management/NotificationBroadcaster.classPKE9@QKj5H6javax/management/NotificationBroadcasterSupport.classPKE9@|*K6javax/management/NotificationEmitter.classPKE9@]-K)L6javax/management/NotificationFilter.classPKE9@n*!Ż0M6javax/management/NotificationFilterSupport.classPKE9@7#]+O6javax/management/NotificationListener.classPKE9@)?f%P6javax/management/ObjectInstance.classPKE9@L4tHm!R6javax/management/ObjectName.classPKE9@o*W6javax/management/OperationsException.classPKE9@sGW&hX6javax/management/PersistentMBean.classPKE9@ڮɮhxY6javax/management/Query.classPKE9@%)<> p]6javax/management/QueryEval.classPKE9@wr^6javax/management/QueryExp.classPKE9@$?G*_`6javax/management/ReflectionException.classPKE9@WJI,a6javax/management/RuntimeErrorException.classPKE9@7N,c6javax/management/RuntimeMBeanException.classPKE9@ A*mO1Ie6javax/management/RuntimeOperationsException.classPKE9@/f6javax/management/ServiceNotFoundException.classPKE9@ Y6 +dh6javax/management/StandardEmitterMBean.classPKE9@Sh$k6javax/management/StandardMBean.classPKE9@TO%xq6javax/management/StringValueExp.classPKE9@ @DTs6javax/management/ValueExp.classPKIG@Du6javax/management/loading/PKE9@ZꙢ&4u6javax/management/loading/ClassLoaderRepository.classPKE9@46v6javax/management/loading/DefaultLoaderRepository.classPKE9@E]jR#x6javax/management/loading/MLet.classPKE9@x,S*}6javax/management/loading/MLetContent.classPKE9@}(E6javax/management/loading/MLetMBean.classPKE9@Ejt1;6javax/management/loading/PrivateClassLoader.classPKE9@3}{K*6javax/management/loading/PrivateMLet.classPKIG@6javax/management/modelmbean/PKE9@쾦+3-6javax/management/modelmbean/DescriptorSupport.classPKE9@BB46javax/management/modelmbean/InvalidTargetObjectTypeException.classPKE9@_U>d,6javax/management/modelmbean/ModelMBean.classPKE9@j=9~6javax/management/modelmbean/ModelMBeanAttributeInfo.classPKE9@ZW-;"6javax/management/modelmbean/ModelMBeanConstructorInfo.classPKE9@;0}0\6javax/management/modelmbean/ModelMBeanInfo.classPKE9@3<K7{6javax/management/modelmbean/ModelMBeanInfoSupport.classPKE9@[8>KxC6javax/management/modelmbean/ModelMBeanNotificationBroadcaster.classPKE9@t烕(<6javax/management/modelmbean/ModelMBeanNotificationInfo.classPKE9@,.96javax/management/modelmbean/ModelMBeanOperationInfo.classPKE9@ 4#6javax/management/modelmbean/RequiredModelMBean.classPKE9@.2g36javax/management/modelmbean/XMLParseException.classPKIG@6javax/management/monitor/PKE9@<v-a6javax/management/monitor/CounterMonitor.classPKE9@u`K2U6javax/management/monitor/CounterMonitorMBean.classPKE9@:&N+F6javax/management/monitor/GaugeMonitor.classPKE9@Vsty0!6javax/management/monitor/GaugeMonitorMBean.classPKE9@q; &6javax/management/monitor/Monitor.classPKE9@s~+=6javax/management/monitor/MonitorMBean.classPKE9@Κ)26javax/management/monitor/MonitorNotification.classPKE9@&6#6javax/management/monitor/MonitorSettingException.classPKE9@=CFM,6javax/management/monitor/StringMonitor.classPKE9@ۡZ196javax/management/monitor/StringMonitorMBean.classPKIG@6javax/management/openmbean/PKE9@oJ\ *=6javax/management/openmbean/ArrayType.classPKE9@g?S.6javax/management/openmbean/CompositeData.classPKE9@c?%6javax/management/openmbean/CompositeDataInvocationHandler.classPKE9@I܄5?6javax/management/openmbean/CompositeDataSupport.classPKE9@o;J2&6javax/management/openmbean/CompositeDataView.classPKE9@ɣk.6javax/management/openmbean/CompositeType.classPKE9@X<46javax/management/openmbean/InvalidKeyException.classPKE9@9`6javax/management/openmbean/InvalidOpenTypeException.classPKE9@y:6javax/management/openmbean/KeyAlreadyExistsException.classPKE9@[ 2k6javax/management/openmbean/OpenDataException.classPKE9@wA|76javax/management/openmbean/OpenMBeanAttributeInfo.classPKE9@>.6javax/management/openmbean/OpenMBeanAttributeInfoSupport.classPKE9@u@Yu9N6javax/management/openmbean/OpenMBeanConstructorInfo.classPKE9@w@6javax/management/openmbean/OpenMBeanConstructorInfoSupport.classPKE9@z<28.6javax/management/openmbean/OpenMBeanInfo.classPKE9@zup5"6javax/management/openmbean/OpenMBeanInfoSupport.classPKE9@A7$7H6javax/management/openmbean/OpenMBeanOperationInfo.classPKE9@ `>6javax/management/openmbean/OpenMBeanOperationInfoSupport.classPKE9@f䲃7_6javax/management/openmbean/OpenMBeanParameterInfo.classPKE9@Z>G6javax/management/openmbean/OpenMBeanParameterInfoSupport.classPKE9@ b)<6javax/management/openmbean/OpenType.classPKE9@g=< +F6javax/management/openmbean/SimpleType.classPKE9@",h6javax/management/openmbean/TabularData.classPKE9@a斺 3}6javax/management/openmbean/TabularDataSupport.classPKE9@)q2,6javax/management/openmbean/TabularType.classPKIG@M6javax/management/relation/PKE9@#:6javax/management/relation/InvalidRelationIdException.classPKE9@?6javax/management/relation/InvalidRelationServiceException.classPKE9@'d:<6javax/management/relation/InvalidRelationTypeException.classPKE9@ّ<8 6javax/management/relation/InvalidRoleInfoException.classPKE9@96javax/management/relation/InvalidRoleValueException.classPKE9@,,=6javax/management/relation/MBeanServerNotificationFilter.classPKE9@S /(7javax/management/relation/Relation.classPKE9@17javax/management/relation/RelationException.classPKE9@=$ 97javax/management/relation/RelationNotFoundException.classPKE9@{"B9 4c7javax/management/relation/RelationNotification.classPKE9@y-/ 7javax/management/relation/RelationService.classPKE9@D~__47javax/management/relation/RelationServiceMBean.classPKE9@ ER7javax/management/relation/RelationServiceNotRegisteredException.classPKE9@w| K/7javax/management/relation/RelationSupport.classPKE9@747javax/management/relation/RelationSupportMBean.classPKE9@b,7javax/management/relation/RelationType.classPKE9@UY= 7javax/management/relation/RelationTypeNotFoundException.classPKE9@Yo# Z37javax/management/relation/RelationTypeSupport.classPKE9@U'$!7javax/management/relation/Role.classPKE9@Aiq(j$7javax/management/relation/RoleInfo.classPKE9@mO9'7javax/management/relation/RoleInfoNotFoundException.classPKE9@@z( )7javax/management/relation/RoleList.classPKE9@5 5 ,7javax/management/relation/RoleNotFoundException.classPKE9@Z;*}-7javax/management/relation/RoleResult.classPKE9@iu;E*d/7javax/management/relation/RoleStatus.classPKE9@R;.x17javax/management/relation/RoleUnresolved.classPKE9@@ 247javax/management/relation/RoleUnresolvedList.classPKIG@(77javax/management/remote/PKE9@4NZ,p77javax/management/remote/JMXAddressable.classPKE9@t[.]87javax/management/remote/JMXAuthenticator.classPKE9@撣H7U97javax/management/remote/JMXConnectionNotification.classPKE9@ Z(*;7javax/management/remote/JMXConnector.classPKE9@=IĮJ1=7javax/management/remote/JMXConnectorFactory.classPKE9@ej2i@7javax/management/remote/JMXConnectorProvider.classPKE9@Y 0A7javax/management/remote/JMXConnectorServer.classPKE9@1\d7kE7javax/management/remote/JMXConnectorServerFactory.classPKE9@7 u5,H7javax/management/remote/JMXConnectorServerMBean.classPKE9@t 8J7javax/management/remote/JMXConnectorServerProvider.classPKE9@Qr@ *fK7javax/management/remote/JMXPrincipal.classPKE9@P=h2L7javax/management/remote/JMXProviderException.classPKE9@05N7javax/management/remote/JMXServerErrorException.classPKE9@^k|-V+P7javax/management/remote/JMXServiceURL.classPKE9@@.2JR7javax/management/remote/MBeanServerForwarder.classPKE9@8͑:0VS7javax/management/remote/NotificationResult.classPKE9@0*-96U7javax/management/remote/SubjectDelegationPermission.classPKE9@C@-`2V7javax/management/remote/TargetedNotification.classPKIG@X7javax/management/remote/rmi/PKE9@*R/X7javax/management/remote/rmi/RMIConnection.classPKE9@^03]7javax/management/remote/rmi/RMIConnectionImpl.classPKE9@~dY8d7javax/management/remote/rmi/RMIConnectionImpl_Stub.classPKE9@ӻN/- .bj7javax/management/remote/rmi/RMIConnector.classPKE9@tK B 4m7javax/management/remote/rmi/RMIConnectorServer.classPKE9@Gz<w3Yq7javax/management/remote/rmi/RMIIIOPServerImpl.classPKE9@3s7javax/management/remote/rmi/RMIJRMPServerImpl.classPKE9@Bp+v7javax/management/remote/rmi/RMIServer.classPKE9@u/x7javax/management/remote/rmi/RMIServerImpl.classPKE9@QW34[{7javax/management/remote/rmi/RMIServerImpl_Stub.classPKE9@ϽQ78^}7javax/management/remote/rmi/_RMIConnectionImpl_Tie.classPKE9@\n1Z57javax/management/remote/rmi/_RMIConnection_Stub.classPKE9@ܤ54G7javax/management/remote/rmi/_RMIServerImpl_Tie.classPKE9@n41ވ7javax/management/remote/rmi/_RMIServer_Stub.classPKIG@ي7javax/management/timer/PKE9@RG" 7javax/management/timer/Timer.classPKE9@/:?T'D7javax/management/timer/TimerMBean.classPKE9@wgg.ؒ7javax/management/timer/TimerNotification.classPKIG@ 7javax/naming/PKE9@(c *ؔ7javax/naming/AuthenticationException.classPKE9@16:7javax/naming/AuthenticationNotSupportedException.classPKE9@PW 7javax/naming/BinaryRefAddr.classPKE9@ VW7javax/naming/Binding.classPKE9@A1_@$)B7javax/naming/CannotProceedException.classPKE9@)ٝ7javax/naming/CommunicationException.classPKE9@j  67javax/naming/CompositeName.classPKE9@VN$ 7javax/naming/CompoundName.classPKE9@])>7javax/naming/ConfigurationException.classPKE9@̤\<\ 7javax/naming/Context.classPKE9@! +7javax/naming/ContextNotEmptyException.classPKE9@h!7javax/naming/InitialContext.classPKE9@ 17javax/naming/InsufficientResourcesException.classPKE9@~©- 7javax/naming/InterruptedNamingException.classPKE9@ͬ'j7javax/naming/InvalidNameException.classPKE9@NZ)Ķ7javax/naming/LimitExceededException.classPKE9@)33HX 7javax/naming/LinkException.classPKE9@[$B7javax/naming/LinkLoopException.classPKE9@LPLN7javax/naming/LinkRef.classPKE9@8)(7javax/naming/MalformedLinkException.classPKE9@?vn7javax/naming/Name.classPKE9@VL ,7javax/naming/NameAlreadyBoundException.classPKE9@=, 17javax/naming/NameClassPair.classPKE9@efO7javax/naming/NameImpl.classPKE9@1(7javax/naming/NameNotFoundException.classPKE9@\IݞY7javax/naming/NameParser.classPKE9@hs$B7javax/naming/NamingEnumeration.classPKE9@B@\I"7javax/naming/NamingException.classPKE9@bdL*"7javax/naming/NamingSecurityException.classPKE9@H[,}7javax/naming/NoInitialContextException.classPKE9@W" (7javax/naming/NoPermissionException.classPKE9@j&>7javax/naming/NotContextException.classPKE9@$L 17javax/naming/OperationNotSupportedException.classPKE9@TL,)7javax/naming/PartialResultException.classPKE9@@<^7javax/naming/RefAddr.classPKE9@ @7javax/naming/Reference.classPKE9@w 7javax/naming/Referenceable.classPKE9@M ߉$7javax/naming/ReferralException.classPKE9@@.7javax/naming/ServiceUnavailableException.classPKE9@ -:7javax/naming/SizeLimitExceededException.classPKE9@`5 7javax/naming/StringRefAddr.classPKE9@3C-7javax/naming/TimeLimitExceededException.classPKIG@b7javax/naming/directory/PKE9@.< &7javax/naming/directory/Attribute.classPKE9@f47javax/naming/directory/AttributeInUseException.classPKE9@o%i3;R7javax/naming/directory/AttributeModificationException.classPKE9@H,R'$7javax/naming/directory/Attributes.classPKE9@Tp_ +7javax/naming/directory/BasicAttribute.classPKE9@`Q,7javax/naming/directory/BasicAttributes.classPKE9@!;K'=7javax/naming/directory/DirContext.classPKE9@t*|.[7javax/naming/directory/InitialDirContext.classPKE9@w@37javax/naming/directory/InvalidAttributeIdentifierException.classPKE9@kc;7javax/naming/directory/InvalidAttributeValueException.classPKE9@qw797javax/naming/directory/InvalidAttributesException.classPKE9@* c;7javax/naming/directory/InvalidSearchControlsException.classPKE9@ " 907javax/naming/directory/InvalidSearchFilterException.classPKE9@LglT-7javax/naming/directory/ModificationItem.classPKE9@ y5Y8javax/naming/directory/NoSuchAttributeException.classPKE9@BQ 58javax/naming/directory/SchemaViolationException.classPKE9@S+;8javax/naming/directory/SearchControls.classPKE9@l)@8javax/naming/directory/SearchResult.classPKIG@p 8javax/naming/event/PKE9@QxGBw% 8javax/naming/event/EventContext.classPKE9@ƶ U(H 8javax/naming/event/EventDirContext.classPKE9@r'0 8javax/naming/event/NamespaceChangeListener.classPKE9@wKX$ 8javax/naming/event/NamingEvent.classPKE9@>>-l8javax/naming/event/NamingExceptionEvent.classPKE9@m'H8javax/naming/event/NamingListener.classPKE9@'IC-C8javax/naming/event/ObjectChangeListener.classPKIG@58javax/naming/ldap/PKE9@h;EA$w8javax/naming/ldap/BasicControl.classPKE9@_<Gg8javax/naming/ldap/Control.classPKE9@X &8javax/naming/ldap/ControlFactory.classPKE9@/~'8javax/naming/ldap/ExtendedRequest.classPKE9@'yE(8javax/naming/ldap/ExtendedResponse.classPKE9@7l#8javax/naming/ldap/HasControls.classPKE9@£DN*8javax/naming/ldap/InitialLdapContext.classPKE9@y.r #8javax/naming/ldap/LdapContext.classPKE9@  O!8javax/naming/ldap/LdapName.classPKE9@w%c-}%8javax/naming/ldap/LdapReferralException.classPKE9@r}N$-;'8javax/naming/ldap/ManageReferralControl.classPKE9@Iᲇ+(8javax/naming/ldap/PagedResultsControl.classPKE9@\V3*8javax/naming/ldap/PagedResultsResponseControl.classPKE9@_,8javax/naming/ldap/Rdn.classPKE9@~؂@#x/8javax/naming/ldap/SortControl.classPKE9@oK18javax/naming/ldap/SortKey.classPKE9@s+38javax/naming/ldap/SortResponseControl.classPKE9@հav'458javax/naming/ldap/StartTlsRequest.classPKE9@3](]78javax/naming/ldap/StartTlsResponse.classPKE9@kI/98javax/naming/ldap/UnsolicitedNotification.classPKE9@RlR4:8javax/naming/ldap/UnsolicitedNotificationEvent.classPKE9@t7<8javax/naming/ldap/UnsolicitedNotificationListener.classPKIG@=8javax/naming/spi/PKE9@8javax/naming/spi/DirObjectFactory.classPKE9@A}Ck-]?8javax/naming/spi/DirStateFactory$Result.classPKE9@=(&#A8javax/naming/spi/DirStateFactory.classPKE9@)̌rN'B8javax/naming/spi/DirectoryManager.classPKE9@VY,fE8javax/naming/spi/InitialContextFactory.classPKE9@/U3F8javax/naming/spi/InitialContextFactoryBuilder.classPKE9@9K$G8javax/naming/spi/NamingManager.classPKE9@g]Q$%K8javax/naming/spi/ObjectFactory.classPKE9@ܭ+TL8javax/naming/spi/ObjectFactoryBuilder.classPKE9@{*$M8javax/naming/spi/ResolveResult.classPKE9@b:FO8javax/naming/spi/Resolver.classPKE9@lI8#Q8javax/naming/spi/StateFactory.classPKIG@ 0R8javax/net/PKE9@ʚc#jR8javax/net/ServerSocketFactory.classPKE9@Hpm o(T8javax/net/SocketFactory.classPKIG@U8javax/net/ssl/PKE9@C>jC<c2V8javax/net/ssl/CertPathTrustManagerParameters.classPKE9@ÄV'r+W8javax/net/ssl/HandshakeCompletedEvent.classPKE9@S.(Z8javax/net/ssl/HandshakeCompletedListener.classPKE9@j$'[8javax/net/ssl/HostnameVerifier.classPKE9@[vr& \8javax/net/ssl/HttpsURLConnection.classPKE9@FAcs^8javax/net/ssl/KeyManager.classPKE9@'gz%_8javax/net/ssl/KeyManagerFactory.classPKE9@?Y(b8javax/net/ssl/KeyManagerFactorySpi.classPKE9@ tY-kd8javax/net/ssl/KeyStoreBuilderParameters.classPKE9@WMrr,f8javax/net/ssl/ManagerFactoryParameters.classPKE9@DrSL Qg8javax/net/ssl/SSLContext.classPKE9@~1!j8javax/net/ssl/SSLContextSpi.classPKE9@OT2 'm8javax/net/ssl/SSLEngine.classPKE9@cl3 q8javax/net/ssl/SSLEngineResult$HandshakeStatus.classPKE9@Q*!t8javax/net/ssl/SSLEngineResult$Status.classPKE9@ ½W#w8javax/net/ssl/SSLEngineResult.classPKE9@qC\1a y8javax/net/ssl/SSLException.classPKE9@܎)z8javax/net/ssl/SSLHandshakeException.classPKE9@H#{8javax/net/ssl/SSLKeyException.classPKE9@vV!9}8javax/net/ssl/SSLParameters.classPKE9@t3X.T8javax/net/ssl/SSLPeerUnverifiedException.classPKE9@E2!8javax/net/ssl/SSLPermission.classPKE9@f2(8javax/net/ssl/SSLProtocolException.classPKE9@j#o8javax/net/ssl/SSLServerSocket.classPKE9@s1 *݅8javax/net/ssl/SSLServerSocketFactory.classPKE9@Z+f8javax/net/ssl/SSLSession.classPKE9@rM*lj8javax/net/ssl/SSLSessionBindingEvent.classPKE9@-l8javax/net/ssl/SSLSessionBindingListener.classPKE9@Q %x8javax/net/ssl/SSLSessionContext.classPKE9@Mƍ8javax/net/ssl/SSLSocket.classPKE9@:adm$8javax/net/ssl/SSLSocketFactory.classPKE9@iew 8javax/net/ssl/TrustManager.classPKE9@xXL'N8javax/net/ssl/TrustManagerFactory.classPKE9@1`g*/8javax/net/ssl/TrustManagerFactorySpi.classPKE9@py*8javax/net/ssl/X509ExtendedKeyManager.classPKE9@g,"ř8javax/net/ssl/X509KeyManager.classPKE9@!i$A8javax/net/ssl/X509TrustManager.classPKIG@ 8javax/print/PKE9@ӛ7$М8javax/print/AttributeException.classPKE9@ޣǷ$ѝ8javax/print/CancelablePrintJob.classPKE9@Rɞ8javax/print/Doc.classPKE9@7&8javax/print/DocFlavor$BYTE_ARRAY.classPKE9@& eL&8javax/print/DocFlavor$CHAR_ARRAY.classPKE9@*ݍ(8javax/print/DocFlavor$INPUT_STREAM.classPKE9@`@"8javax/print/DocFlavor$READER.classPKE9@,(-K8javax/print/DocFlavor$SERVICE_FORMATTED.classPKE9@T>_@")8javax/print/DocFlavor$STRING.classPKE9@|v8ج8javax/print/DocFlavor$URL.classPKE9@Wa~~8javax/print/DocFlavor.classPKE9@, T-{8javax/print/DocPrintJob.classPKE9@+XjD!8javax/print/FlavorException.classPKE9@>.Ӵ8javax/print/MultiDoc.classPKE9@x/"Ƶ8javax/print/MultiDocPrintJob.classPKE9@u Ɣ&ٶ8javax/print/MultiDocPrintService.classPKE9@Q|0 8javax/print/PrintException.classPKE9@ |M?8javax/print/PrintService.classPKE9@@yd $ػ8javax/print/PrintServiceLookup.classPKE9@k9‰58javax/print/ServiceUI.classPKE9@c*"8javax/print/ServiceUIFactory.classPKE9@x'V8javax/print/SimpleDoc.classPKE9@&Ao$*8javax/print/StreamPrintService.classPKE9@JY{+8javax/print/StreamPrintServiceFactory.classPKE9@%M8javax/print/URIException.classPKIG@8javax/print/attribute/PKE9@fdG8%C8javax/print/attribute/Attribute.classPKE9@/uY(g8javax/print/attribute/AttributeSet.classPKE9@! 18javax/print/attribute/AttributeSetUtilities.classPKE9@9*8javax/print/attribute/DateTimeSyntax.classPKE9@[.r(8javax/print/attribute/DocAttribute.classPKE9@騧Qu+]8javax/print/attribute/DocAttributeSet.classPKE9@o&+8javax/print/attribute/EnumSyntax.classPKE9@ i ,=8javax/print/attribute/HashAttributeSet.classPKE9@yRJ|/8javax/print/attribute/HashDocAttributeSet.classPKE9@vL418javax/print/attribute/HashPrintJobAttributeSet.classPKE9@sxR88javax/print/attribute/HashPrintRequestAttributeSet.classPKE9@@ P88javax/print/attribute/HashPrintServiceAttributeSet.classPKE9@N^vVD)M8javax/print/attribute/IntegerSyntax.classPKE9@K u-8javax/print/attribute/PrintJobAttribute.classPKE9@ex08javax/print/attribute/PrintJobAttributeSet.classPKE9@Y2y18javax/print/attribute/PrintRequestAttribute.classPKE9@Adbj|4x8javax/print/attribute/PrintRequestAttributeSet.classPKE9@0y1V8javax/print/attribute/PrintServiceAttribute.classPKE9@#A~|4.8javax/print/attribute/PrintServiceAttributeSet.classPKE9@, 8javax/print/attribute/ResolutionSyntax.classPKE9@= N.8javax/print/attribute/SetOfIntegerSyntax.classPKE9@k {(8javax/print/attribute/Size2DSyntax.classPKE9@#O~48javax/print/attribute/SupportedValuesAttribute.classPKE9@G__&8javax/print/attribute/TextSyntax.classPKE9@D3%8javax/print/attribute/URISyntax.classPKE9@XU4/8javax/print/attribute/UnmodifiableSetException.classPKIG@8javax/print/attribute/standard/PKE9@ 18javax/print/attribute/standard/Chromaticity.classPKE9@^O:3/8javax/print/attribute/standard/ColorSupported.classPKE9@}}4c0U8javax/print/attribute/standard/Compression.classPKE9@^w^~+8javax/print/attribute/standard/Copies.classPKE9@06"4l8javax/print/attribute/standard/CopiesSupported.classPKE9@ɡ?u8c8javax/print/attribute/standard/DateTimeAtCompleted.classPKE9@Fes7>8javax/print/attribute/standard/DateTimeAtCreation.classPKE9@1ݥt99javax/print/attribute/standard/DateTimeAtProcessing.classPKE9@<09javax/print/attribute/standard/Destination.classPKE9@~;19javax/print/attribute/standard/DocumentName.classPKE9@\-9javax/print/attribute/standard/Fidelity.classPKE9@*4/9javax/print/attribute/standard/Finishings.classPKE9@,17 9javax/print/attribute/standard/JobHoldUntil.classPKE9@Ɂ3 9javax/print/attribute/standard/JobImpressions.classPKE9@zDZ{<9javax/print/attribute/standard/JobImpressionsCompleted.classPKE9@lpY<9javax/print/attribute/standard/JobImpressionsSupported.classPKE9@yd/9javax/print/attribute/standard/JobKOctets.classPKE9@Wkw89javax/print/attribute/standard/JobKOctetsProcessed.classPKE9@lń89javax/print/attribute/standard/JobKOctetsSupported.classPKE9@s7U3v9javax/print/attribute/standard/JobMediaSheets.classPKE9@Ƒ&{<Y9javax/print/attribute/standard/JobMediaSheetsCompleted.classPKE9@<>9javax/print/attribute/standard/JobMediaSheetsSupported.classPKE9@DlG;79javax/print/attribute/standard/JobMessageFromOperator.classPKE9@P_ǎ,, 9javax/print/attribute/standard/JobName.classPKE9@'\;"9javax/print/attribute/standard/JobOriginatingUserName.classPKE9@$}&0$9javax/print/attribute/standard/JobPriority.classPKE9@>0z9%9javax/print/attribute/standard/JobPrioritySupported.classPKE9@aP.'9javax/print/attribute/standard/JobSheets.classPKE9@z6 -)9javax/print/attribute/standard/JobState.classPKE9@"9F^3,9javax/print/attribute/standard/JobStateReason.classPKE9@KlmU;4+19javax/print/attribute/standard/JobStateReasons.classPKE9@x*39javax/print/attribute/standard/Media.classPKE9@nIJv.59javax/print/attribute/standard/MediaName.classPKE9@ ;C779javax/print/attribute/standard/MediaPrintableArea.classPKE9@/y:u:9javax/print/attribute/standard/MediaSize$Engineering.classPKE9@}oP2V<9javax/print/attribute/standard/MediaSize$ISO.classPKE9@K22v?9javax/print/attribute/standard/MediaSize$JIS.classPKE9@w[1C9javax/print/attribute/standard/MediaSize$NA.classPKE9@H-(4E9javax/print/attribute/standard/MediaSize$Other.classPKE9@Wgߓ.LH9javax/print/attribute/standard/MediaSize.classPKE9@"x 2;K9javax/print/attribute/standard/MediaSizeName.classPKE9@KX;.Q9javax/print/attribute/standard/MediaTray.classPKE9@üC~=S9javax/print/attribute/standard/MultipleDocumentHandling.classPKE9@^ht6&V9javax/print/attribute/standard/NumberOfDocuments.classPKE9@#Ͳu<W9javax/print/attribute/standard/NumberOfInterveningJobs.classPKE9@ *-Y9javax/print/attribute/standard/NumberUp.classPKE9@cG1¬v6[9javax/print/attribute/standard/NumberUpSupported.classPKE9@%o 9]9javax/print/attribute/standard/OrientationRequested.classPKE9@y9B`9javax/print/attribute/standard/OutputDeviceAssigned.classPKE9@OL96b9javax/print/attribute/standard/PDLOverrideSupported.classPKE9@p[G,/kd9javax/print/attribute/standard/PageRanges.classPKE9@:?s3f9javax/print/attribute/standard/PagesPerMinute.classPKE9@u3x8qh9javax/print/attribute/standard/PagesPerMinuteColor.classPKE9@+<q:Oj9javax/print/attribute/standard/PresentationDirection.classPKE9@`a1l9javax/print/attribute/standard/PrintQuality.classPKE9@cr0?o9javax/print/attribute/standard/PrinterInfo.classPKE9@\;"q9javax/print/attribute/standard/PrinterIsAcceptingJobs.classPKE9@j 4\s9javax/print/attribute/standard/PrinterLocation.classPKE9@߀ R8Cu9javax/print/attribute/standard/PrinterMakeAndModel.classPKE9@ )?4w9javax/print/attribute/standard/PrinterMessageFromOperator.classPKE9@7Kv41y9javax/print/attribute/standard/PrinterMoreInfo.classPKE9@@ {9javax/print/attribute/standard/PrinterMoreInfoManufacturer.classPKE9@0E؂0|9javax/print/attribute/standard/PrinterName.classPKE9@SW}86~9javax/print/attribute/standard/PrinterResolution.classPKE9@t1׀9javax/print/attribute/standard/PrinterState.classPKE9@Nw79javax/print/attribute/standard/PrinterStateReason.classPKE9@pީ8ч9javax/print/attribute/standard/PrinterStateReasons.classPKE9@l/9javax/print/attribute/standard/PrinterURI.classPKE9@wu39javax/print/attribute/standard/QueuedJobCount.classPKE9@ƶ+A9javax/print/attribute/standard/ReferenceUriSchemesSupported.classPKE9@^UCg79javax/print/attribute/standard/RequestingUserName.classPKE9@FUn5-9javax/print/attribute/standard/Severity.classPKE9@c[1+9javax/print/attribute/standard/SheetCollate.classPKE9@!b*e9javax/print/attribute/standard/Sides.classPKIG@ؙ9javax/print/event/PKE9@Ra"9javax/print/event/PrintEvent.classPKE9@1!z'W9javax/print/event/PrintJobAdapter.classPKE9@gL.&9javax/print/event/PrintJobAttributeEvent.classPKE9@RWX1Ξ9javax/print/event/PrintJobAttributeListener.classPKE9@#z+_%9javax/print/event/PrintJobEvent.classPKE9@#? b(9javax/print/event/PrintJobListener.classPKE9@gN29javax/print/event/PrintServiceAttributeEvent.classPKE9@ 5ɤ9javax/print/event/PrintServiceAttributeListener.classPKIG@ å9javax/rmi/PKIG@9javax/rmi/CORBA/PKE9@X8=9javax/rmi/CORBA/ClassDesc.classPKE9@V~2q9javax/rmi/CORBA/PortableRemoteObjectDelegate.classPKE9@ٶE9javax/rmi/CORBA/Stub.classPKE9@%}P"o9javax/rmi/CORBA/StubDelegate.classPKE9@k9javax/rmi/CORBA/Tie.classPKE9@g/ l9javax/rmi/CORBA/Util.classPKE9@F='#"9javax/rmi/CORBA/UtilDelegate.classPKE9@0x@Fh"9javax/rmi/CORBA/ValueHandler.classPKE9@8{8-$9javax/rmi/CORBA/ValueHandlerMultiFormat.classPKE9@oe $]9javax/rmi/PortableRemoteObject.classPKIG@w9javax/rmi/ssl/PKE9@ko-9javax/rmi/ssl/SslRMIClientSocketFactory.classPKE9@-{9javax/rmi/ssl/SslRMIServerSocketFactory.classPKIG@ 9javax/script/PKE9@ 9=v'9javax/script/AbstractScriptEngine.classPKE9@=2~9javax/script/Bindings.classPKE9@˺59javax/script/Compilable.classPKE9@]Hg!9javax/script/CompiledScript.classPKE9@$.-9javax/script/Invocable.classPKE9@ay} +9javax/script/ScriptContext.classPKE9@֊A$9javax/script/ScriptEngine.classPKE9@٩b&9javax/script/ScriptEngineFactory.classPKE9@!w_B&C9javax/script/ScriptEngineManager.classPKE9@>"9javax/script/ScriptException.classPKE9@?t"!9javax/script/SimpleBindings.classPKE9@W3&99javax/script/SimpleScriptContext.classPKIG@Z9javax/security/PKIG@9javax/security/auth/PKE9@(9javax/security/auth/AuthPermission.classPKE9@9 0J9javax/security/auth/DestroyFailedException.classPKE9@,q%9javax/security/auth/Destroyable.classPKE9@WX= 9javax/security/auth/Policy.classPKE9@̀^659javax/security/auth/PrivateCredentialPermission.classPKE9@  09javax/security/auth/RefreshFailedException.classPKE9@%9javax/security/auth/Refreshable.classPKE9@YwǏ !9javax/security/auth/Subject.classPKE9@lh/9javax/security/auth/SubjectDomainCombiner.classPKIG@9javax/security/auth/callback/PKE9@%_k~+9javax/security/auth/callback/Callback.classPKE9@<29javax/security/auth/callback/CallbackHandler.classPKE9@ Id19javax/security/auth/callback/ChoiceCallback.classPKE9@hI7U9javax/security/auth/callback/ConfirmationCallback.classPKE9@!aLt39javax/security/auth/callback/LanguageCallback.classPKE9@er/.9javax/security/auth/callback/NameCallback.classPKE9@ Q39javax/security/auth/callback/PasswordCallback.classPKE9@\^ 3429javax/security/auth/callback/TextInputCallback.classPKE9@3I 5*9javax/security/auth/callback/TextOutputCallback.classPKE9@wR?;9javax/security/auth/callback/UnsupportedCallbackException.classPKIG@9javax/security/auth/kerberos/PKE9@14>7G9javax/security/auth/kerberos/DelegationPermission.classPKE9@57v.9javax/security/auth/kerberos/KerberosKey.classPKE9@X49javax/security/auth/kerberos/KerberosPrincipal.classPKE9@k 1:javax/security/auth/kerberos/KerberosTicket.classPKE9@s4:javax/security/auth/kerberos/ServicePermission.classPKIG@:javax/security/auth/login/PKE9@ | 04:javax/security/auth/login/AccountException.classPKE9@7:javax/security/auth/login/AccountExpiredException.classPKE9@4&6 :javax/security/auth/login/AccountLockedException.classPKE9@ڥ68 :javax/security/auth/login/AccountNotFoundException.classPKE9@a3L :javax/security/auth/login/AppConfigurationEntry$LoginModuleControlFlag.classPKE9@ܶ`5:javax/security/auth/login/AppConfigurationEntry.classPKE9@ʚd8Y:javax/security/auth/login/Configuration$Parameters.classPKE9@z-`:javax/security/auth/login/Configuration.classPKE9@=(0C:javax/security/auth/login/ConfigurationSpi.classPKE9@B:Jb 3:javax/security/auth/login/CredentialException.classPKE9@di:6:javax/security/auth/login/CredentialExpiredException.classPKE9@Y;:javax/security/auth/login/CredentialNotFoundException.classPKE9@qv 4+:javax/security/auth/login/FailedLoginException.classPKE9@J`B,:javax/security/auth/login/LoginContext.classPKE9@[U.:javax/security/auth/login/LoginException.classPKIG@a :javax/security/auth/spi/PKE9@ -V[) :javax/security/auth/spi/LoginModule.classPKIG@":javax/security/auth/x500/PKE9@tiS,h":javax/security/auth/x500/X500Principal.classPKE9@)4+%:javax/security/auth/x500/X500PrivateCredential.classPKIG@l':javax/security/cert/PKE9@1Q%':javax/security/cert/Certificate.classPKE9@Ou 6):javax/security/cert/CertificateEncodingException.classPKE9@~.+:javax/security/cert/CertificateException.classPKE9@YB 5,:javax/security/cert/CertificateExpiredException.classPKE9@K9-:javax/security/cert/CertificateNotYetValidException.classPKE9@O 5h/:javax/security/cert/CertificateParsingException.classPKE9@Ċ9)0:javax/security/cert/X509Certificate.classPKIG@e3:javax/security/sasl/PKE9@;C8w13:javax/security/sasl/AuthenticationException.classPKE9@1+@5:javax/security/sasl/AuthorizeCallback.classPKE9@P! 'Y7:javax/security/sasl/RealmCallback.classPKE9@Q,)-8:javax/security/sasl/RealmChoiceCallback.classPKE9@ S::javax/security/sasl/Sasl.classPKE9@,f6$>:javax/security/sasl/SaslClient.classPKE9@Cܽ+@:javax/security/sasl/SaslClientFactory.classPKE9@oN|2K'A:javax/security/sasl/SaslException.classPKE9@6$C:javax/security/sasl/SaslServer.classPKE9@rF +D:javax/security/sasl/SaslServerFactory.classPKIG@ F:javax/sound/PKIG@PF:javax/sound/midi/PKE9@j.F:javax/sound/midi/ControllerEventListener.classPKE9@PI!G:javax/sound/midi/Instrument.classPKE9@]_: /rI:javax/sound/midi/InvalidMidiDataException.classPKE9@M?(J:javax/sound/midi/MetaEventListener.classPKE9@ܹm"K:javax/sound/midi/MetaMessage.classPKE9@*2Zw"M:javax/sound/midi/MidiChannel.classPKE9@b?V&O:javax/sound/midi/MidiDevice$Info.classPKE9@.6!Q:javax/sound/midi/MidiDevice.classPKE9@\ S:javax/sound/midi/MidiEvent.classPKE9@%tR%eU:javax/sound/midi/MidiFileFormat.classPKE9@8"]X:javax/sound/midi/MidiMessage.classPKE9@u,w !hZ:javax/sound/midi/MidiSystem.classPKE9@B/A^:javax/sound/midi/MidiUnavailableException.classPKE9@{T+_:javax/sound/midi/Patch.classPKE9@]ɘa:javax/sound/midi/Receiver.classPKE9@PJa:javax/sound/midi/Sequence.classPKE9@QK#~)d:javax/sound/midi/Sequencer$SyncMode.classPKE9@m . Og:javax/sound/midi/Sequencer.classPKE9@f#j:javax/sound/midi/ShortMessage.classPKE9@  n:javax/sound/midi/Soundbank.classPKE9@[(o:javax/sound/midi/SoundbankResource.classPKE9@"q:javax/sound/midi/Synthesizer.classPKE9@-'2A#s:javax/sound/midi/SysexMessage.classPKE9@cv:javax/sound/midi/Track.classPKE9@(X"w:javax/sound/midi/Transmitter.classPKE9@j"x:javax/sound/midi/VoiceStatus.classPKIG@z:javax/sound/midi/spi/PKE9@,so-Kz:javax/sound/midi/spi/MidiDeviceProvider.classPKE9@ vX)|:javax/sound/midi/spi/MidiFileReader.classPKE9@C<)}:javax/sound/midi/spi/MidiFileWriter.classPKE9@8"Il*:javax/sound/midi/spi/SoundbankReader.classPKIG@:javax/sound/sampled/PKE9@ B6.ǁ:javax/sound/sampled/AudioFileFormat$Type.classPKE9@j)|);:javax/sound/sampled/AudioFileFormat.classPKE9@BF.:javax/sound/sampled/AudioFormat$Encoding.classPKE9@- '!( %]:javax/sound/sampled/AudioFormat.classPKE9@P *ь:javax/sound/sampled/AudioInputStream.classPKE9@):javax/sound/sampled/AudioPermission.classPKE9@`-%x:javax/sound/sampled/AudioSystem.classPKE9@ou-:javax/sound/sampled/BooleanControl$Type.classPKE9@]M(:javax/sound/sampled/BooleanControl.classPKE9@S2.wg:javax/sound/sampled/Clip.classPKE9@A".|:javax/sound/sampled/CompoundControl$Type.classPKE9@3[X):javax/sound/sampled/CompoundControl.classPKE9@zBx&:javax/sound/sampled/Control$Type.classPKE9@Z43!u:javax/sound/sampled/Control.classPKE9@F/I':javax/sound/sampled/DataLine$Info.classPKE9@~x X:":javax/sound/sampled/DataLine.classPKE9@7-lWT*>:javax/sound/sampled/EnumControl$Type.classPKE9@3%:javax/sound/sampled/EnumControl.classPKE9@KH<+ߩ:javax/sound/sampled/FloatControl$Type.classPKE9@?Xr&@:javax/sound/sampled/FloatControl.classPKE9@bh7#&:javax/sound/sampled/Line$Info.classPKE9@ gm:javax/sound/sampled/Line.classPKE9@,_:(:javax/sound/sampled/LineEvent$Type.classPKE9@ICL'm#:javax/sound/sampled/LineEvent.classPKE9@⠀&ɶ:javax/sound/sampled/LineListener.classPKE9@`?b 2:javax/sound/sampled/LineUnavailableException.classPKE9@}K$":javax/sound/sampled/Mixer$Info.classPKE9@ VO:javax/sound/sampled/Mixer.classPKE9@C:#0:javax/sound/sampled/Port$Info.classPKE9@\E!:javax/sound/sampled/Port.classPKE9@%%$:javax/sound/sampled/ReverbType.classPKE9@Dx(R:javax/sound/sampled/SourceDataLine.classPKE9@tw(:javax/sound/sampled/TargetDataLine.classPKE9@nnJ7:javax/sound/sampled/UnsupportedAudioFileException.classPKIG@;:javax/sound/sampled/spi/PKE9@FCIGu-:javax/sound/sampled/spi/AudioFileReader.classPKE9@F,-S:javax/sound/sampled/spi/AudioFileWriter.classPKE9@Gb6:javax/sound/sampled/spi/FormatConversionProvider.classPKE9@m+ :javax/sound/sampled/spi/MixerProvider.classPKIG@ :javax/sql/PKE9@ԯo :javax/sql/CommonDataSource.classPKE9@D(ėP7:javax/sql/ConnectionEvent.classPKE9@_':javax/sql/ConnectionEventListener.classPKE9@5ru(:javax/sql/ConnectionPoolDataSource.classPKE9@9-y]:javax/sql/DataSource.classPKE9@]b3 :javax/sql/PooledConnection.classPKE9@h'c]:javax/sql/RowSet.classPKE9@Wl:javax/sql/RowSetEvent.classPKE9@h $<:javax/sql/RowSetInternal.classPKE9@,,9F:javax/sql/RowSetListener.classPKE9@ǘ|8:javax/sql/RowSetMetaData.classPKE9@H wI:javax/sql/RowSetReader.classPKE9@y 9:javax/sql/RowSetWriter.classPKE9@Ày):javax/sql/StatementEvent.classPKE9@9em&:javax/sql/StatementEventListener.classPKE9@׊#:javax/sql/XAConnection.classPKE9@yeKQ:javax/sql/XADataSource.classPKIG@ :javax/sql/rowset/PKE9@ɯz `;!K:javax/sql/rowset/BaseRowSet.classPKE9@dk#:javax/sql/rowset/CachedRowSet.classPKE9@C;<=%?:javax/sql/rowset/FilteredRowSet.classPKE9@(#!Y:javax/sql/rowset/JdbcRowSet.classPKE9@:'"!:javax/sql/rowset/JoinRowSet.classPKE9@8QA:javax/sql/rowset/Joinable.classPKE9@5Z@. :javax/sql/rowset/Predicate.classPKE9@\A3)):javax/sql/rowset/RowSetMetaDataImpl.classPKE9@2D$ ;javax/sql/rowset/RowSetWarning.classPKE9@R˯ ;javax/sql/rowset/WebRowSet.classPKIG@;javax/sql/rowset/serial/PKE9@'  *?;javax/sql/rowset/serial/SQLInputImpl.classPKE9@:cK/+3 ;javax/sql/rowset/serial/SQLOutputImpl.classPKE9@K );javax/sql/rowset/serial/SerialArray.classPKE9@r( ;javax/sql/rowset/serial/SerialBlob.classPKE9@*%mL(;javax/sql/rowset/serial/SerialClob.classPKE9@3SQQ,Y;javax/sql/rowset/serial/SerialDatalink.classPKE9@E-;javax/sql/rowset/serial/SerialException.classPKE9@ ^;i.g;javax/sql/rowset/serial/SerialJavaObject.classPKE9@෮ ',;javax/sql/rowset/serial/SerialRef.classPKE9@ **!;javax/sql/rowset/serial/SerialStruct.classPKIG@$;javax/sql/rowset/spi/PKE9@$,~t&T$;javax/sql/rowset/spi/SyncFactory.classPKE9@gN7/&';javax/sql/rowset/spi/SyncFactoryException.classPKE9@_v1''(;javax/sql/rowset/spi/SyncProvider.classPKE9@heM_)0+;javax/sql/rowset/spi/SyncProviderException.classPKE9@d&t',;javax/sql/rowset/spi/SyncResolver.classPKE9@ r<..;javax/sql/rowset/spi/TransactionalWriter.classPKE9@-&] $/;javax/sql/rowset/spi/XmlReader.classPKE9@:Mew $0;javax/sql/rowset/spi/XmlWriter.classPKIG@ 1;javax/swing/PKE9@<(2 62;javax/swing/AbstractAction.classPKE9@{H^ 9)5;javax/swing/AbstractButton$AccessibleAbstractButton.classPKE9@p958;javax/swing/AbstractButton$ButtonChangeListener.classPKE9@t ]' :;javax/swing/AbstractButton.classPKE9@M ($D;javax/swing/AbstractCellEditor.classPKE9@Q^Q#DG;javax/swing/AbstractListModel.classPKE9@۰&I;javax/swing/AbstractSpinnerModel.classPKE9@ *T,L;javax/swing/Action.classPKE9@N;javax/swing/ActionMap.classPKE9@?@} P;javax/swing/BorderFactory.classPKE9@Fm(#T;javax/swing/BoundedRangeModel.classPKE9@999#U;javax/swing/Box$AccessibleBox.classPKE9@eUo0W;javax/swing/Box$Filler$AccessibleBoxFiller.classPKE9@ꣵkq5Y;javax/swing/Box$Filler.classPKE9@/jZ;javax/swing/Box.classPKE9@;e"];javax/swing/BoxLayout.classPKE9@n].1;+`;javax/swing/ButtonGroup.classPKE9@N\hb;javax/swing/ButtonModel.classPKE9@vM|d;javax/swing/CellEditor.classPKE9@@,J=e;javax/swing/CellRendererPane$AccessibleCellRendererPane.classPKE9@lo"wg;javax/swing/CellRendererPane.classPKE9@" | i;javax/swing/ComboBoxEditor.classPKE9@>ۚ9 k;javax/swing/ComboBoxModel.classPKE9@Ϻ+#k;javax/swing/ComponentInputMap.classPKE9@ ++E_m;javax/swing/DebugGraphics.classPKE9@1fǙ($ *s;javax/swing/DefaultBoundedRangeModel.classPKE9@b>$Ww;javax/swing/DefaultButtonModel.classPKE9@9]b2B|;javax/swing/DefaultCellEditor$EditorDelegate.classPKE9@кU#.;javax/swing/DefaultCellEditor.classPKE9@<&9;javax/swing/DefaultComboBoxModel.classPKE9@R_ ';javax/swing/DefaultDesktopManager.classPKE9@i%;javax/swing/DefaultFocusManager.classPKE9@Z4W;javax/swing/DefaultListCellRenderer$UIResource.classPKE9@m8);javax/swing/DefaultListCellRenderer.classPKE9@_{l` "ύ;javax/swing/DefaultListModel.classPKE9@(p} +;javax/swing/DefaultListSelectionModel.classPKE9@rA/;javax/swing/DefaultRowSorter$ModelWrapper.classPKE9@P U",;javax/swing/DefaultRowSorter.classPKE9@@jD-;javax/swing/DefaultSingleSelectionModel.classPKE9@]6$8 ͟;javax/swing/DesktopManager.classPKE9@:2S;javax/swing/DropMode.classPKE9@&ug;javax/swing/FocusManager.classPKE9@-h^R;javax/swing/GrayFilter.classPKE9@m5<javax/swing/JFileChooser$AccessibleJFileChooser.classPKE9@G{ ^%%<javax/swing/JFileChooser.classPKE9@~[nU7#<javax/swing/JFormattedTextField$AbstractFormatter.classPKE9@h3>&<javax/swing/JFormattedTextField$AbstractFormatterFactory.classPKE9@w @ %E(<javax/swing/JFormattedTextField.classPKE9@_T6)+<javax/swing/JFrame$AccessibleJFrame.classPKE9@% 6-<javax/swing/JFrame.classPKE9@ޅW91<javax/swing/JInternalFrame$AccessibleJInternalFrame.classPKE9@a½D3<javax/swing/JInternalFrame$JDesktopIcon$AccessibleJDesktopIcon.classPKE9@Xsz-86<javax/swing/JInternalFrame$JDesktopIcon.classPKE9@P[ a8<javax/swing/JInternalFrame.classPKE9@j)@A<javax/swing/JLabel$AccessibleJLabel.classPKE9@۵ 8D<javax/swing/JLabel.classPKE9@A@m5(H<javax/swing/JLayeredPane$AccessibleJLayeredPane.classPKE9@Pc I<javax/swing/JLayeredPane.classPKE9@5B<'N<javax/swing/JList$AccessibleJList$AccessibleJListChild.classPKE9@&'S<javax/swing/JList$AccessibleJList.classPKE9@ KU$JV<javax/swing/JList$DropLocation.classPKE9@恔!W<javax/swing/JList.classPKE9@m#G'M`<javax/swing/JMenu$AccessibleJMenu.classPKE9@liCO#b<javax/swing/JMenu$WinListener.classPKE9@WYujQd<javax/swing/JMenu.classPKE9@ ?-.i<javax/swing/JMenuBar$AccessibleJMenuBar.classPKE9@f k<javax/swing/JMenuBar.classPKE9@a*̍./o<javax/swing/JMenuItem$AccessibleJMenuItem.classPKE9@Feq<javax/swing/JMenuItem.classPKE9@`C>d3)v<javax/swing/JOptionPane$AccessibleJOptionPane.classPKE9@T$w<javax/swing/JOptionPane.classPKE9@?87)π<javax/swing/JPanel$AccessibleJPanel.classPKE9@H^<javax/swing/JPanel.classPKE9@ <;9c<javax/swing/JPasswordField$AccessibleJPasswordField.classPKE9@ <javax/swing/JPasswordField.classPKE9@Ž蝇(1U<javax/swing/JPopupMenu$AccessibleJPopupMenu.classPKE9@Cx&;<javax/swing/JPopupMenu$Separator.classPKE9@n<javax/swing/JPopupMenu.classPKE9@E5Ñ<javax/swing/JProgressBar$AccessibleJProgressBar.classPKE9@|T <javax/swing/JProgressBar.classPKE9@7;|5=<javax/swing/JRadioButton$AccessibleJRadioButton.classPKE9@7cJۙ<javax/swing/JRadioButton.classPKE9@U>E<javax/swing/JRadioButtonMenuItem$AccessibleJRadioButtonMenuItem.classPKE9@X&3&<javax/swing/JRadioButtonMenuItem.classPKE9@;R/П<javax/swing/JRootPane$AccessibleJRootPane.classPKE9@켩Ê)h<javax/swing/JRootPane$DefaultAction.classPKE9@9 x&I<javax/swing/JRootPane$RootLayout.classPKE9@|_@J <javax/swing/JRootPane.classPKE9@h)31<javax/swing/JScrollBar$AccessibleJScrollBar.classPKE9@E Ѭ<javax/swing/JScrollBar.classPKE9@zn3<javax/swing/JScrollPane$AccessibleJScrollPane.classPKE9@j~8'6<javax/swing/JScrollPane$ScrollBar.classPKE9@cB~ô<javax/swing/JScrollPane.classPKE9@9[1<javax/swing/JSeparator$AccessibleJSeparator.classPKE9@ Hƶ$<javax/swing/JSeparator.classPKE9@t +$<javax/swing/JSlider$AccessibleJSlider.classPKE9@#2E<javax/swing/JSlider.classPKE9@۲/`-j<javax/swing/JSpinner$AccessibleJSpinner.classPKE9@sΑC%%<javax/swing/JSpinner$DateEditor.classPKE9@uMD( <javax/swing/JSpinner$DefaultEditor.classPKE9@Ӏ;=@%<<javax/swing/JSpinner$ListEditor.classPKE9@`NH'<javax/swing/JSpinner$NumberEditor.classPKE9@0 <javax/swing/JSpinner.classPKE9@Q-31)<javax/swing/JSplitPane$AccessibleJSplitPane.classPKE9@cPR<javax/swing/JSplitPane.classPKE9@Q^qN3<javax/swing/JTabbedPane$AccessibleJTabbedPane.classPKE9@$+_<javax/swing/JTabbedPane$ModelListener.classPKE9@xAu7<javax/swing/JTabbedPane.classPKE9@yx><javax/swing/JTable$AccessibleJTable$AccessibleJTableCell.classPKE9@6@E <javax/swing/JTable$AccessibleJTable$AccessibleJTableModelChange.classPKE9@ߊ0)<javax/swing/JTable$AccessibleJTable.classPKE9@™h%w<javax/swing/JTable$DropLocation.classPKE9@PB:"2<javax/swing/JTable$PrintMode.classPKE9@ȺmJ<javax/swing/JTable.classPKE9@Yč?u/ =javax/swing/JTextArea$AccessibleJTextArea.classPKE9@~f : =javax/swing/JTextArea.classPKE9@f8C~1=javax/swing/JTextField$AccessibleJTextField.classPKE9@; =javax/swing/JTextField.classPKE9@k =javax/swing/JTextPane.classPKE9@,G7=javax/swing/JToggleButton$AccessibleJToggleButton.classPKE9@1=javax/swing/JToggleButton$ToggleButtonModel.classPKE9@[=javax/swing/JToggleButton.classPKE9@;I-O=javax/swing/JToolBar$AccessibleJToolBar.classPKE9@n\$=javax/swing/JToolBar$Separator.classPKE9@ݼz !=javax/swing/JToolBar.classPKE9@&L<I-U%=javax/swing/JToolTip$AccessibleJToolTip.classPKE9@^&=javax/swing/JToolTip.classPKE9@o;(=javax/swing/JTree$AccessibleJTree$AccessibleJTreeNode.classPKE9@֥  '.=javax/swing/JTree$AccessibleJTree.classPKE9@Fu\s$2=javax/swing/JTree$DropLocation.classPKE9@Lm#E+3=javax/swing/JTree$DynamicUtilTreeNode.classPKE9@OW+5=javax/swing/JTree$EmptySelectionModel.classPKE9@̊1(_7=javax/swing/JTree$TreeModelHandler.classPKE9@v/[9=javax/swing/JTree$TreeSelectionRedirector.classPKE9@h:o@:;=javax/swing/JTree.classPKE9@a*:R/J=javax/swing/JViewport$AccessibleJViewport.classPKE9@m=(PL=javax/swing/JViewport$ViewListener.classPKE9@zr_M=javax/swing/JViewport.classPKE9@΄7)+!S=javax/swing/JWindow$AccessibleJWindow.classPKE9@1] T=javax/swing/JWindow.classPKE9@"CUX=javax/swing/KeyStroke.classPKE9@eAz,Z=javax/swing/LayoutFocusTraversalPolicy.classPKE9@\i0[=javax/swing/LayoutStyle$ComponentPlacement.classPKE9@{2Ȅ%^=javax/swing/LayoutStyle.classPKE9@uL"``=javax/swing/ListCellRenderer.classPKE9@}XIa=javax/swing/ListModel.classPKE9@ՙ)$Tb=javax/swing/ListSelectionModel.classPKE9@9 zd=javax/swing/LookAndFeel.classPKE9@,h=javax/swing/MenuElement.classPKE9@Wڪ&Hj=javax/swing/MenuSelectionManager.classPKE9@>-?&Fm=javax/swing/MutableComboBoxModel.classPKE9@R0Rpan=javax/swing/OverlayLayout.classPKE9@t;Tq=javax/swing/Popup.classPKE9@0HtAtr=javax/swing/PopupFactory.classPKE9@\*i ;@t=javax/swing/ProgressMonitor$AccessibleProgressMonitor.classPKE9@boF!x=javax/swing/ProgressMonitor.classPKE9@UM,z=javax/swing/ProgressMonitorInputStream.classPKE9@TѾ|=javax/swing/Renderer.classPKE9@9 }=javax/swing/RepaintManager.classPKE9@%rJ}#=javax/swing/RootPaneContainer.classPKE9@J+ *L=javax/swing/RowFilter$ComparisonType.classPKE9@6E!*=javax/swing/RowFilter$Entry.classPKE9@ 1=javax/swing/RowFilter.classPKE9@`ahWw#@=javax/swing/RowSorter$SortKey.classPKE9@w*B=javax/swing/RowSorter.classPKE9@XG&7%ӎ=javax/swing/ScrollPaneConstants.classPKE9@m-=javax/swing/ScrollPaneLayout$UIResource.classPKE9@4]] "Y=javax/swing/ScrollPaneLayout.classPKE9@qp{=javax/swing/Scrollable.classPKE9@[we&ԗ=javax/swing/SingleSelectionModel.classPKE9@-H#" =javax/swing/SizeRequirements.classPKE9@W=javax/swing/SizeSequence.classPKE9@8|N7 ؝=javax/swing/SortOrder.classPKE9@z>-X=javax/swing/SortingFocusTraversalPolicy.classPKE9@.I-"8=javax/swing/SpinnerDateModel.classPKE9@"=javax/swing/SpinnerListModel.classPKE9@"h_=javax/swing/SpinnerModel.classPKE9@ƂS&$'=javax/swing/SpinnerNumberModel.classPKE9@= (̫=javax/swing/Spring.classPKE9@2vdM*&=javax/swing/SpringLayout$Constraints.classPKE9@K" ˰=javax/swing/SpringLayout.classPKE9@cu[ =javax/swing/SwingConstants.classPKE9@J Z=javax/swing/SwingUtilities.classPKE9@A;a(=javax/swing/SwingWorker$StateValue.classPKE9@l? @=javax/swing/SwingWorker.classPKE9@N,7 =javax/swing/Timer.classPKE9@Z#x2=javax/swing/ToolTipManager$insideTimerAction.classPKE9@)sy3=javax/swing/ToolTipManager$outsideTimerAction.classPKE9@ʝe}7=javax/swing/ToolTipManager$stillInsideTimerAction.classPKE9@OJ =javax/swing/ToolTipManager.classPKE9@o ?'.=javax/swing/TransferHandler$DropLocation.classPKE9@XG(7=javax/swing/TransferHandler$HasGetTransferHandler.classPKE9@Lg10=javax/swing/TransferHandler$TransferSupport.classPKE9@QA= !=javax/swing/TransferHandler.classPKE9@@S9 (=javax/swing/UIDefaults$ActiveValue.classPKE9@*^)=javax/swing/UIDefaults$LazyInputMap.classPKE9@R&=javax/swing/UIDefaults$LazyValue.classPKE9@J+=javax/swing/UIDefaults$ProxyLazyValue.classPKE9@Y=javax/swing/UIDefaults.classPKE9@قS+=javax/swing/UIManager$LookAndFeelInfo.classPKE9@Ok;=javax/swing/UIManager.classPKE9@fk1=javax/swing/UnsupportedLookAndFeelException.classPKE9@o$ 3=javax/swing/ViewportLayout.classPKE9@?8,!O=javax/swing/WindowConstants.classPKIG@a=javax/swing/border/PKE9@w'=javax/swing/border/AbstractBorder.classPKE9@+$=javax/swing/border/BevelBorder.classPKE9@ZS=javax/swing/border/Border.classPKE9@N'=javax/swing/border/CompoundBorder.classPKE9@]W$e=javax/swing/border/EmptyBorder.classPKE9@iR%6=javax/swing/border/EtchedBorder.classPKE9@ |R#=javax/swing/border/LineBorder.classPKE9@b$>javax/swing/border/MatteBorder.classPKE9@܈JbE(>javax/swing/border/SoftBevelBorder.classPKE9@"9 %>javax/swing/border/TitledBorder.classPKIG@>javax/swing/colorchooser/PKE9@ -8A >javax/swing/colorchooser/AbstractColorChooserPanel.classPKE9@=/8=J; >javax/swing/colorchooser/ColorChooserComponentFactory.classPKE9@0T2C >javax/swing/colorchooser/ColorSelectionModel.classPKE9@9{>javax/swing/colorchooser/DefaultColorSelectionModel.classPKIG@>javax/swing/event/PKE9@e%%>javax/swing/event/AncestorEvent.classPKE9@\(7>javax/swing/event/AncestorListener.classPKE9@, "@>javax/swing/event/CaretEvent.classPKE9@ %%>javax/swing/event/CaretListener.classPKE9@qܴ*>javax/swing/event/CellEditorListener.classPKE9@܀sd#>javax/swing/event/ChangeEvent.classPKE9@i&>javax/swing/event/ChangeListener.classPKE9@3>javax/swing/event/DocumentEvent$ElementChange.classPKE9@8ݱW3/>javax/swing/event/DocumentEvent$EventType.classPKE9@kV*%>javax/swing/event/DocumentEvent.classPKE9@O^(,>javax/swing/event/DocumentListener.classPKE9@U$)8>javax/swing/event/EventListenerList.classPKE9@Q}r Y;0!>javax/swing/event/HyperlinkEvent$EventType.classPKE9@C &j#>javax/swing/event/HyperlinkEvent.classPKE9@PT)%>javax/swing/event/HyperlinkListener.classPKE9@;vL,&>javax/swing/event/InternalFrameAdapter.classPKE9@bN*(>javax/swing/event/InternalFrameEvent.classPKE9@ʊ-*>javax/swing/event/InternalFrameListener.classPKE9@Tj%,>javax/swing/event/ListDataEvent.classPKE9@)5y(->javax/swing/event/ListDataListener.classPKE9@ıIk* />javax/swing/event/ListSelectionEvent.classPKE9@lՊ-0>javax/swing/event/ListSelectionListener.classPKE9@m`*1>javax/swing/event/MenuDragMouseEvent.classPKE9@ET-4>javax/swing/event/MenuDragMouseListener.classPKE9@ӧ ^!75>javax/swing/event/MenuEvent.classPKE9@Afw$t6>javax/swing/event/MenuKeyEvent.classPKE9@h'f8>javax/swing/event/MenuKeyListener.classPKE9@Hľ$t9>javax/swing/event/MenuListener.classPKE9@&Io)|:>javax/swing/event/MouseInputAdapter.classPKE9@xtߔ*;>javax/swing/event/MouseInputListener.classPKE9@~%m&<>javax/swing/event/PopupMenuEvent.classPKE9@Kw4)=>javax/swing/event/PopupMenuListener.classPKE9@hO+ ?>javax/swing/event/RowSorterEvent$Type.classPKE9@uI &A>javax/swing/event/RowSorterEvent.classPKE9@X) D>javax/swing/event/RowSorterListener.classPKE9@^ͺJb2E>javax/swing/event/SwingPropertyChangeSupport.classPKE9@!U\-F>javax/swing/event/TableColumnModelEvent.classPKE9@javax/swing/event/TableColumnModelListener.classPKE9@v7K'I>javax/swing/event/TableModelEvent.classPKE9@ƛ0*SL>javax/swing/event/TableModelListener.classPKE9@z>N*LM>javax/swing/event/TreeExpansionEvent.classPKE9@-N>javax/swing/event/TreeExpansionListener.classPKE9@bAa&O>javax/swing/event/TreeModelEvent.classPKE9@=)%R>javax/swing/event/TreeModelListener.classPKE9@uJ1*HS>javax/swing/event/TreeSelectionEvent.classPKE9@m| -U>javax/swing/event/TreeSelectionListener.classPKE9@pBY.V>javax/swing/event/TreeWillExpandListener.classPKE9@8@0H)X>javax/swing/event/UndoableEditEvent.classPKE9@U,Y>javax/swing/event/UndoableEditListener.classPKIG@Z>javax/swing/filechooser/PKE9@3t (Z>javax/swing/filechooser/FileFilter.classPKE9@$,x54\>javax/swing/filechooser/FileNameExtensionFilter.classPKE9@  ,^>javax/swing/filechooser/FileSystemView.classPKE9@J؃cO&ua>javax/swing/filechooser/FileView.classPKIG@,c>javax/swing/plaf/PKE9@=Zd*mc>javax/swing/plaf/ActionMapUIResource.classPKE9@ӄz=d>javax/swing/plaf/BorderUIResource$BevelBorderUIResource.classPKE9@ U65v@f>javax/swing/plaf/BorderUIResource$CompoundBorderUIResource.classPKE9@ C`=3h>javax/swing/plaf/BorderUIResource$EmptyBorderUIResource.classPKE9@nve>i>javax/swing/plaf/BorderUIResource$EtchedBorderUIResource.classPKE9@|\ aU<k>javax/swing/plaf/BorderUIResource$LineBorderUIResource.classPKE9@5Abp=m>javax/swing/plaf/BorderUIResource$MatteBorderUIResource.classPKE9@א>o>javax/swing/plaf/BorderUIResource$TitledBorderUIResource.classPKE9@]'q>javax/swing/plaf/BorderUIResource.classPKE9@' u>javax/swing/plaf/ButtonUI.classPKE9@F"~9%.v>javax/swing/plaf/ColorChooserUI.classPKE9@yLZ&Yw>javax/swing/plaf/ColorUIResource.classPKE9@O!y>javax/swing/plaf/ComboBoxUI.classPKE9@/bC2iz>javax/swing/plaf/ComponentInputMapUIResource.classPKE9@Hi "{>javax/swing/plaf/ComponentUI.classPKE9@X6$~>javax/swing/plaf/DesktopIconUI.classPKE9@ 6$>javax/swing/plaf/DesktopPaneUI.classPKE9@)F*'>javax/swing/plaf/DimensionUIResource.classPKE9@փ$>javax/swing/plaf/FileChooserUI.classPKE9@Fu%S>javax/swing/plaf/FontUIResource.classPKE9@7f=%>javax/swing/plaf/IconUIResource.classPKE9@HTb3`) >javax/swing/plaf/InputMapUIResource.classPKE9@ۮ 'W>javax/swing/plaf/InsetsUIResource.classPKE9@b<&>javax/swing/plaf/InternalFrameUI.classPKE9@)ٻ$>javax/swing/plaf/LabelUI.classPKE9@3[,>javax/swing/plaf/ListUI.classPKE9@F |* ~>javax/swing/plaf/MenuBarUI.classPKE9@{*!>javax/swing/plaf/MenuItemUI.classPKE9@#Đ>javax/swing/plaf/OptionPaneUI.classPKE9@ $%>javax/swing/plaf/PanelUI.classPKE9@nvb"D>javax/swing/plaf/PopupMenuUI.classPKE9@6j^ 6$>javax/swing/plaf/ProgressBarUI.classPKE9@R-!!>javax/swing/plaf/RootPaneUI.classPKE9@Ԃ0"G>javax/swing/plaf/ScrollBarUI.classPKE9@?3#l>javax/swing/plaf/ScrollPaneUI.classPKE9@E20">javax/swing/plaf/SeparatorUI.classPKE9@*WY'>javax/swing/plaf/SliderUI.classPKE9@!gr* ܛ>javax/swing/plaf/SpinnerUI.classPKE9@]">javax/swing/plaf/SplitPaneUI.classPKE9@)ဏ.#>javax/swing/plaf/TabbedPaneUI.classPKE9@ƴm6$+>javax/swing/plaf/TableHeaderUI.classPKE9@ T$S>javax/swing/plaf/TableUI.classPKE9@KCp>javax/swing/plaf/TextUI.classPKE9@f5* >javax/swing/plaf/ToolBarUI.classPKE9@?* !>javax/swing/plaf/ToolTipUI.classPKE9@,lD>javax/swing/plaf/TreeUI.classPKE9@X)jbv!1>javax/swing/plaf/UIResource.classPKE9@%-!>javax/swing/plaf/ViewportUI.classPKIG@>javax/swing/plaf/basic/PKE9@.F-N>javax/swing/plaf/basic/BasicArrowButton.classPKE9@-u6>javax/swing/plaf/basic/BasicBorders$ButtonBorder.classPKE9@Ds5c>javax/swing/plaf/basic/BasicBorders$FieldBorder.classPKE9@cz169>javax/swing/plaf/basic/BasicBorders$MarginBorder.classPKE9@[@67>javax/swing/plaf/basic/BasicBorders$MenuBarBorder.classPKE9@Q$0B;V>javax/swing/plaf/basic/BasicBorders$RadioButtonBorder.classPKE9@,E>>javax/swing/plaf/basic/BasicBorders$RolloverButtonBorder.classPKE9@C9>javax/swing/plaf/basic/BasicBorders$SplitPaneBorder.classPKE9@ )sC<5>javax/swing/plaf/basic/BasicBorders$ToggleButtonBorder.classPKE9@NyI'x)>javax/swing/plaf/basic/BasicBorders.classPKE9@l20`>javax/swing/plaf/basic/BasicButtonListener.classPKE9@9)5 *C>javax/swing/plaf/basic/BasicButtonUI.classPKE9@:\A4>javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.classPKE9@|lF\,>javax/swing/plaf/basic/BasicCheckBoxUI.classPKE9@@w>javax/swing/plaf/basic/BasicColorChooserUI$PropertyHandler.classPKE9@p-=T0l>javax/swing/plaf/basic/BasicColorChooserUI.classPKE9@G~e;>javax/swing/plaf/basic/BasicComboBoxEditor$UIResource.classPKE9@:d'A0x>javax/swing/plaf/basic/BasicComboBoxEditor.classPKE9@X=>javax/swing/plaf/basic/BasicComboBoxRenderer$UIResource.classPKE9@mQ2>javax/swing/plaf/basic/BasicComboBoxRenderer.classPKE9@mB>javax/swing/plaf/basic/BasicComboBoxUI$ComboBoxLayoutManager.classPKE9@ӷ399>javax/swing/plaf/basic/BasicComboBoxUI$FocusHandler.classPKE9@M!8*>javax/swing/plaf/basic/BasicComboBoxUI$ItemHandler.classPKE9@~43,7>javax/swing/plaf/basic/BasicComboBoxUI$KeyHandler.classPKE9@t<>javax/swing/plaf/basic/BasicComboBoxUI$ListDataHandler.classPKE9@/܁B>javax/swing/plaf/basic/BasicComboBoxUI$PropertyChangeHandler.classPKE9@ͭa,>javax/swing/plaf/basic/BasicComboBoxUI.classPKE9@ fO9JA>javax/swing/plaf/basic/BasicComboPopup$InvocationKeyHandler.classPKE9@j=>RC>javax/swing/plaf/basic/BasicComboPopup$InvocationMouseHandler.classPKE9@BjIV>javax/swing/plaf/basic/BasicComboPopup$InvocationMouseMotionHandler.classPKE9@;8>javax/swing/plaf/basic/BasicComboPopup$ItemHandler.classPKE9@pcSΪ<>javax/swing/plaf/basic/BasicComboPopup$ListDataHandler.classPKE9@vPG9@= >javax/swing/plaf/basic/BasicComboPopup$ListMouseHandler.classPKE9@:G?XC>javax/swing/plaf/basic/BasicComboPopup$ListMouseMotionHandler.classPKE9@ڃA]>javax/swing/plaf/basic/BasicComboPopup$ListSelectionHandler.classPKE9@ojBO>javax/swing/plaf/basic/BasicComboPopup$PropertyChangeHandler.classPKE9@z+3,@>javax/swing/plaf/basic/BasicComboPopup.classPKE9@QX=A>javax/swing/plaf/basic/BasicDesktopIconUI$MouseInputHandler.classPKE9@ړ Lb/>javax/swing/plaf/basic/BasicDesktopIconUI.classPKE9@nt;?javax/swing/plaf/basic/BasicDesktopPaneUI$CloseAction.classPKE9@Ơ^x>]?javax/swing/plaf/basic/BasicDesktopPaneUI$MaximizeAction.classPKE9@s;w>A?javax/swing/plaf/basic/BasicDesktopPaneUI$MinimizeAction.classPKE9@$i(8w>$?javax/swing/plaf/basic/BasicDesktopPaneUI$NavigateAction.classPKE9@Gr: ?javax/swing/plaf/basic/BasicDesktopPaneUI$OpenAction.classPKE9@~/ ?javax/swing/plaf/basic/BasicDesktopPaneUI.classPKE9@01‹ 0?javax/swing/plaf/basic/BasicDirectoryModel.classPKE9@8B[.?javax/swing/plaf/basic/BasicEditorPaneUI.classPKE9@/c-=C?javax/swing/plaf/basic/BasicFileChooserUI$AcceptAllFileFilter.classPKE9@WyF?javax/swing/plaf/basic/BasicFileChooserUI$ApproveSelectionAction.classPKE9@T =?javax/swing/plaf/basic/BasicFileChooserUI$BasicFileView.classPKE9@cVxE?javax/swing/plaf/basic/BasicFileChooserUI$CancelSelectionAction.classPKE9@F$M?javax/swing/plaf/basic/BasicFileChooserUI$ChangeToParentDirectoryAction.classPKE9@TC?javax/swing/plaf/basic/BasicFileChooserUI$DoubleClickListener.classPKE9@4-r< ?javax/swing/plaf/basic/BasicFileChooserUI$GoHomeAction.classPKE9@I?v?"?javax/swing/plaf/basic/BasicFileChooserUI$NewFolderAction.classPKE9@e!'A$?javax/swing/plaf/basic/BasicFileChooserUI$SelectionListener.classPKE9@?ts<n&?javax/swing/plaf/basic/BasicFileChooserUI$UpdateAction.classPKE9@ixx/K(?javax/swing/plaf/basic/BasicFileChooserUI.classPKE9@ae6 /?javax/swing/plaf/basic/BasicFormattedTextFieldUI.classPKE9@'/0?javax/swing/plaf/basic/BasicGraphicsUtils.classPKE9@W3&3?javax/swing/plaf/basic/BasicHTML.classPKE9@ҟ -6?javax/swing/plaf/basic/BasicIconFactory.classPKE9@(xD7?javax/swing/plaf/basic/BasicInternalFrameTitlePane$CloseAction.classPKE9@"WizF9?javax/swing/plaf/basic/BasicInternalFrameTitlePane$IconifyAction.classPKE9@^{G;?javax/swing/plaf/basic/BasicInternalFrameTitlePane$MaximizeAction.classPKE9@&W7wC=?javax/swing/plaf/basic/BasicInternalFrameTitlePane$MoveAction.classPKE9@8E6YN??javax/swing/plaf/basic/BasicInternalFrameTitlePane$PropertyChangeHandler.classPKE9@1iFA?javax/swing/plaf/basic/BasicInternalFrameTitlePane$RestoreAction.classPKE9@OfwCC?javax/swing/plaf/basic/BasicInternalFrameTitlePane$SizeAction.classPKE9@4xFE?javax/swing/plaf/basic/BasicInternalFrameTitlePane$SystemMenuBar.classPKE9@ܕG#:H'G?javax/swing/plaf/basic/BasicInternalFrameTitlePane$TitlePaneLayout.classPKE9@OU8I?javax/swing/plaf/basic/BasicInternalFrameTitlePane.classPKE9@63|L{O?javax/swing/plaf/basic/BasicInternalFrameUI$BasicInternalFrameListener.classPKE9@@Q?javax/swing/plaf/basic/BasicInternalFrameUI$BorderListener.classPKE9@.ퟻBS?javax/swing/plaf/basic/BasicInternalFrameUI$ComponentHandler.classPKE9@# EU?javax/swing/plaf/basic/BasicInternalFrameUI$GlassPaneDispatcher.classPKE9@FpEIX?javax/swing/plaf/basic/BasicInternalFrameUI$InternalFrameLayout.classPKE9@7L^YUZ?javax/swing/plaf/basic/BasicInternalFrameUI$InternalFramePropertyChangeListener.classPKE9@<ؐ!1\?javax/swing/plaf/basic/BasicInternalFrameUI.classPKE9@3)b?javax/swing/plaf/basic/BasicLabelUI.classPKE9@zg5/f?javax/swing/plaf/basic/BasicListUI$FocusHandler.classPKE9@ԡ89h?javax/swing/plaf/basic/BasicListUI$ListDataHandler.classPKE9@i~=@j?javax/swing/plaf/basic/BasicListUI$ListSelectionHandler.classPKE9@tOK:)l?javax/swing/plaf/basic/BasicListUI$MouseInputHandler.classPKE9@j<ș{>gn?javax/swing/plaf/basic/BasicListUI$PropertyChangeHandler.classPKE9@GyR(Np?javax/swing/plaf/basic/BasicListUI.classPKE9@jTk-u?javax/swing/plaf/basic/BasicLookAndFeel.classPKE9@~Z+ax?javax/swing/plaf/basic/BasicMenuBarUI.classPKE9@7q>z?javax/swing/plaf/basic/BasicMenuItemUI$MouseInputHandler.classPKE9@[j>,|?javax/swing/plaf/basic/BasicMenuItemUI.classPKE9@{6?javax/swing/plaf/basic/BasicMenuUI$ChangeHandler.classPKE9@]3:A?javax/swing/plaf/basic/BasicMenuUI$MouseInputHandler.classPKE9@(?javax/swing/plaf/basic/BasicMenuUI.classPKE9@:e J4CΈ?javax/swing/plaf/basic/BasicOptionPaneUI$ButtonActionListener.classPKE9@+?݊?javax/swing/plaf/basic/BasicOptionPaneUI$ButtonAreaLayout.classPKE9@D?javax/swing/plaf/basic/BasicOptionPaneUI$PropertyChangeHandler.classPKE9@ ɲ.?javax/swing/plaf/basic/BasicOptionPaneUI.classPKE9@(Q)Z?javax/swing/plaf/basic/BasicPanelUI.classPKE9@г1?javax/swing/plaf/basic/BasicPasswordFieldUI.classPKE9@^6|?javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.classPKE9@dA-?javax/swing/plaf/basic/BasicPopupMenuUI.classPKE9@Cj=?javax/swing/plaf/basic/BasicProgressBarUI$ChangeHandler.classPKE9@MK /Н?javax/swing/plaf/basic/BasicProgressBarUI.classPKE9@<7x?javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.classPKE9@o~/?javax/swing/plaf/basic/BasicRadioButtonUI.classPKE9@)^@javax/swing/plaf/basic/BasicTreeUI$NodeDimensionsHandler.classPKE9@>`@javax/swing/plaf/basic/BasicTreeUI$PropertyChangeHandler.classPKE9@IӋ;#Lzb@javax/swing/plaf/basic/BasicTreeUI$SelectionModelPropertyChangeHandler.classPKE9@^ @d@javax/swing/plaf/basic/BasicTreeUI$TreeCancelEditingAction.classPKE9@f6;Y=tf@javax/swing/plaf/basic/BasicTreeUI$TreeExpansionHandler.classPKE9@l[77uh@javax/swing/plaf/basic/BasicTreeUI$TreeHomeAction.classPKE9@6b/(<wj@javax/swing/plaf/basic/BasicTreeUI$TreeIncrementAction.classPKE9@29l@javax/swing/plaf/basic/BasicTreeUI$TreeModelHandler.classPKE9@iN7n@javax/swing/plaf/basic/BasicTreeUI$TreePageAction.classPKE9@ic=p@javax/swing/plaf/basic/BasicTreeUI$TreeSelectionHandler.classPKE9@Eݚ9r@javax/swing/plaf/basic/BasicTreeUI$TreeToggleAction.classPKE9@>%;jt@javax/swing/plaf/basic/BasicTreeUI$TreeTraverseAction.classPKE9@C^ ;(sv@javax/swing/plaf/basic/BasicTreeUI.classPKE9@jL,Ƅ@javax/swing/plaf/basic/BasicViewportUI.classPKE9@'l@javax/swing/plaf/basic/ComboPopup.classPKE9@.χ@javax/swing/plaf/basic/DefaultMenuLayout.classPKIG@C@javax/swing/plaf/metal/PKE9@ڕ9'@javax/swing/plaf/metal/BumpBuffer.classPKE9@F@.y@javax/swing/plaf/metal/DefaultMetalTheme.classPKE9@l+6@javax/swing/plaf/metal/MetalBorders$ButtonBorder.classPKE9@g[7 @javax/swing/plaf/metal/MetalBorders$Flush3DBorder.classPKE9@oq=@javax/swing/plaf/metal/MetalBorders$InternalFrameBorder.classPKE9@s/,.7$@javax/swing/plaf/metal/MetalBorders$MenuBarBorder.classPKE9@>*. 8@javax/swing/plaf/metal/MetalBorders$MenuItemBorder.classPKE9@|Ǘ<K@javax/swing/plaf/metal/MetalBorders$OptionDialogBorder.classPKE9@&7і@javax/swing/plaf/metal/MetalBorders$PaletteBorder.classPKE9@/ 9L@javax/swing/plaf/metal/MetalBorders$PopupMenuBorder.classPKE9@w{>@javax/swing/plaf/metal/MetalBorders$RolloverButtonBorder.classPKE9@U^:\@javax/swing/plaf/metal/MetalBorders$ScrollPaneBorder.classPKE9@ vc";ݜ@javax/swing/plaf/metal/MetalBorders$TableHeaderBorder.classPKE9@ B'9h@javax/swing/plaf/metal/MetalBorders$TextFieldBorder.classPKE9@\ <ݟ@javax/swing/plaf/metal/MetalBorders$ToggleButtonBorder.classPKE9@X<37S@javax/swing/plaf/metal/MetalBorders$ToolBarBorder.classPKE9@>mmV)@javax/swing/plaf/metal/MetalBorders.classPKE9@U<'@javax/swing/plaf/metal/MetalBumps.classPKE9@>ap.*@javax/swing/plaf/metal/MetalButtonUI.classPKE9@Rϣ.@javax/swing/plaf/metal/MetalCheckBoxIcon.classPKE9@ xF\,߬@javax/swing/plaf/metal/MetalCheckBoxUI.classPKE9@XW0@javax/swing/plaf/metal/MetalComboBoxButton.classPKE9@nB;5@javax/swing/plaf/metal/MetalComboBoxEditor$UIResource.classPKE9@l#0@javax/swing/plaf/metal/MetalComboBoxEditor.classPKE9@AGi.'@javax/swing/plaf/metal/MetalComboBoxIcon.classPKE9@}G@javax/swing/plaf/metal/MetalComboBoxUI$MetalComboBoxLayoutManager.classPKE9@<@javax/swing/plaf/metal/MetalComboBoxUI$MetalComboPopup.classPKE9@N?ZH4@javax/swing/plaf/metal/MetalComboBoxUI$MetalPropertyChangeListener.classPKE9@ħ,@javax/swing/plaf/metal/MetalComboBoxUI.classPKE9@C/ݾ@javax/swing/plaf/metal/MetalDesktopIconUI.classPKE9@+$PЃGU@javax/swing/plaf/metal/MetalFileChooserUI$DirectoryComboBoxAction.classPKE9@FM@javax/swing/plaf/metal/MetalFileChooserUI$DirectoryComboBoxModel.classPKE9@(T`CuI@javax/swing/plaf/metal/MetalFileChooserUI$DirectoryComboBoxRenderer.classPKE9@)w6N<v@javax/swing/plaf/metal/MetalFileChooserUI$FileRenderer.classPKE9@ =#C@javax/swing/plaf/metal/MetalFileChooserUI$FilterComboBoxModel.classPKE9@DoM<lF@javax/swing/plaf/metal/MetalFileChooserUI$FilterComboBoxRenderer.classPKE9@.''SCt@javax/swing/plaf/metal/MetalFileChooserUI$SingleClickListener.classPKE9@D-{%` /8@javax/swing/plaf/metal/MetalFileChooserUI.classPKE9@~8@javax/swing/plaf/metal/MetalIconFactory$FileIcon16.classPKE9@#V:@javax/swing/plaf/metal/MetalIconFactory$FolderIcon16.classPKE9@h]>B@javax/swing/plaf/metal/MetalIconFactory$PaletteCloseIcon.classPKE9@j=@javax/swing/plaf/metal/MetalIconFactory$TreeControlIcon.classPKE9@wa<@javax/swing/plaf/metal/MetalIconFactory$TreeFolderIcon.classPKE9@D:S@javax/swing/plaf/metal/MetalIconFactory$TreeLeafIcon.classPKE9@6vhw -@javax/swing/plaf/metal/MetalIconFactory.classPKE9@t z8@javax/swing/plaf/metal/MetalInternalFrameTitlePane.classPKE9@m_Au1m@javax/swing/plaf/metal/MetalInternalFrameUI.classPKE9@zo)A@javax/swing/plaf/metal/MetalLabelUI.classPKE9@1R5-@javax/swing/plaf/metal/MetalLookAndFeel.classPKE9@H*+@javax/swing/plaf/metal/MetalMenuBarUI.classPKE9@IM6@javax/swing/plaf/metal/MetalPopupMenuSeparatorUI.classPKE9@s}o/@javax/swing/plaf/metal/MetalProgressBarUI.classPKE9@yb(/@javax/swing/plaf/metal/MetalRadioButtonUI.classPKE9@P9;,@javax/swing/plaf/metal/MetalRootPaneUI.classPKE9@/6}v-W@javax/swing/plaf/metal/MetalScrollBarUI.classPKE9@ 4"k.@javax/swing/plaf/metal/MetalScrollButton.classPKE9@)e.V@javax/swing/plaf/metal/MetalScrollPaneUI.classPKE9@V(->@javax/swing/plaf/metal/MetalSeparatorUI.classPKE9@wU@@javax/swing/plaf/metal/MetalSliderUI$MetalPropertyListener.classPKE9@BM B*s@javax/swing/plaf/metal/MetalSliderUI.classPKE9@1o-W@javax/swing/plaf/metal/MetalSplitPaneUI.classPKE9@CZ>?Ajavax/swing/plaf/metal/MetalTabbedPaneUI$TabbedPaneLayout.classPKE9@E.uAjavax/swing/plaf/metal/MetalTabbedPaneUI.classPKE9@jTY-Ajavax/swing/plaf/metal/MetalTextFieldUI.classPKE9@5='cAjavax/swing/plaf/metal/MetalTheme.classPKE9@r̽0q Ajavax/swing/plaf/metal/MetalToggleButtonUI.classPKE9@#r2PB Ajavax/swing/plaf/metal/MetalToolBarUI$MetalContainerListener.classPKE9@'5b$@LAjavax/swing/plaf/metal/MetalToolBarUI$MetalDockingListener.classPKE9@VAAjavax/swing/plaf/metal/MetalToolBarUI$MetalRolloverListener.classPKE9@"*+Ajavax/swing/plaf/metal/MetalToolBarUI.classPKE9@]+KAjavax/swing/plaf/metal/MetalToolTipUI.classPKE9@Rv(2Ajavax/swing/plaf/metal/MetalTreeUI.classPKE9@N"E'qAjavax/swing/plaf/metal/OceanTheme.classPKIG@Ajavax/swing/plaf/multi/PKE9@d@k*Ajavax/swing/plaf/multi/MultiButtonUI.classPKE9@P.0Ajavax/swing/plaf/multi/MultiOptionPaneUI.classPKE9@Zh?g)2Ajavax/swing/plaf/multi/MultiPanelUI.classPKE9@dOCw-4Ajavax/swing/plaf/multi/MultiPopupMenuUI.classPKE9@`ǦvE/6Ajavax/swing/plaf/multi/MultiProgressBarUI.classPKE9@yW As,7Ajavax/swing/plaf/multi/MultiRootPaneUI.classPKE9@T~Bw-\9Ajavax/swing/plaf/multi/MultiScrollBarUI.classPKE9@ ^C{.:Ajavax/swing/plaf/multi/MultiScrollPaneUI.classPKE9@$Aw-Ajavax/swing/plaf/multi/MultiSliderUI.classPKE9@L LAo+?Ajavax/swing/plaf/multi/MultiSpinnerUI.classPKE9@9)}-fAAjavax/swing/plaf/multi/MultiSplitPaneUI.classPKE9@j9.CAjavax/swing/plaf/multi/MultiTabbedPaneUI.classPKE9@SA/+FAjavax/swing/plaf/multi/MultiTableHeaderUI.classPKE9@zp=g)GAjavax/swing/plaf/multi/MultiTableUI.classPKE9@y#& (]IAjavax/swing/plaf/multi/MultiTextUI.classPKE9@Z #Bo+LAjavax/swing/plaf/multi/MultiToolBarUI.classPKE9@B`Bo+tNAjavax/swing/plaf/multi/MultiToolTipUI.classPKE9@|i(PAjavax/swing/plaf/multi/MultiTreeUI.classPKE9@uAs,SAjavax/swing/plaf/multi/MultiViewportUI.classPKIG@TAjavax/swing/plaf/synth/PKE9@,׬&TAjavax/swing/plaf/synth/ColorType.classPKE9@/ #VAjavax/swing/plaf/synth/Region.classPKE9@tJv+]Ajavax/swing/plaf/synth/SynthConstants.classPKE9@`{)]^Ajavax/swing/plaf/synth/SynthContext.classPKE9@k: /H`Ajavax/swing/plaf/synth/SynthGraphicsUtils.classPKE9@׬-dAjavax/swing/plaf/synth/SynthLookAndFeel.classPKE9@BQjM)gAjavax/swing/plaf/synth/SynthPainter.classPKE9@R:4 'HoAjavax/swing/plaf/synth/SynthStyle.classPKE9@.[rAjavax/swing/plaf/synth/SynthStyleFactory.classPKIG@sAjavax/swing/table/PKE9@,ٜAjavax/swing/table/TableStringConverter.classPKIG@+Ajavax/swing/text/PKE9@ ] 7lAjavax/swing/text/AbstractDocument$AbstractElement.classPKE9@W݀J8Ajavax/swing/text/AbstractDocument$AttributeContext.classPKE9@FMz5Ajavax/swing/text/AbstractDocument$BranchElement.classPKE9@?R|/{Ajavax/swing/text/AbstractDocument$Content.classPKE9@G,<*Ajavax/swing/text/AbstractDocument$DefaultDocumentEvent.classPKE9@m3Ajavax/swing/text/AbstractDocument$ElementEdit.classPKE9@ͅG3Ajavax/swing/text/AbstractDocument$LeafElement.classPKE9@4'Ajavax/swing/text/AbstractDocument.classPKE9@hnS%%,Ajavax/swing/text/AbstractWriter.classPKE9@*m,10Ajavax/swing/text/AsyncBoxView$ChildLocator.classPKE9@84D.Ajavax/swing/text/AsyncBoxView$ChildState.classPKE9@݆hq#$Ajavax/swing/text/AsyncBoxView.classPKE9@N!6Ajavax/swing/text/AttributeSet$CharacterAttribute.classPKE9@\2Ajavax/swing/text/AttributeSet$ColorAttribute.classPKE9@0ԅ 1Ajavax/swing/text/AttributeSet$FontAttribute.classPKE9@.A6ϛ6Ajavax/swing/text/AttributeSet$ParagraphAttribute.classPKE9@9#Ajavax/swing/text/AttributeSet.classPKE9@N[r&+$Ajavax/swing/text/BadLocationException.classPKE9@d# Ajavax/swing/text/BoxView.classPKE9@'qAjavax/swing/text/Caret.classPKE9@*"OIT.;Ajavax/swing/text/ChangedCharSetException.classPKE9@:O"h$Ajavax/swing/text/ComponentView.classPKE9@GA $Ajavax/swing/text/CompositeView.classPKE9@42$Ajavax/swing/text/DateFormatter.classPKE9@:keq#RAjavax/swing/text/DefaultCaret.classPKE9@"[Q]25Ajavax/swing/text/DefaultEditorKit$BeepAction.classPKE9@WP]2Ajavax/swing/text/DefaultEditorKit$CopyAction.classPKE9@ PZ1Ajavax/swing/text/DefaultEditorKit$CutAction.classPKE9@3W~=EAjavax/swing/text/DefaultEditorKit$DefaultKeyTypedAction.classPKE9@KGIVr9Ajavax/swing/text/DefaultEditorKit$InsertBreakAction.classPKE9@HugVx;Ajavax/swing/text/DefaultEditorKit$InsertContentAction.classPKE9@Ql7Ajavax/swing/text/DefaultEditorKit$InsertTabAction.classPKE9@ @Q`39Ajavax/swing/text/DefaultEditorKit$PasteAction.classPKE9@pòM'Ajavax/swing/text/DefaultEditorKit.classPKE9@@M'Ajavax/swing/text/DefaultFormatter.classPKE9@UzQo .Ajavax/swing/text/DefaultFormatterFactory.classPKE9@IAAjavax/swing/text/DefaultHighlighter$DefaultHighlightPainter.classPKE9@LkU )NBjavax/swing/text/DefaultHighlighter.classPKE9@eGBBjavax/swing/text/DefaultStyledDocument$AttributeUndoableEdit.classPKE9@$:Bjavax/swing/text/DefaultStyledDocument$ElementBuffer.classPKE9@p8 Bjavax/swing/text/DefaultStyledDocument$ElementSpec.classPKE9@ K_;Bjavax/swing/text/DefaultStyledDocument$SectionElement.classPKE9@),Bjavax/swing/text/DefaultStyledDocument.classPKE9@v; $Bjavax/swing/text/DefaultTextUI.classPKE9@W})KBjavax/swing/text/Document.classPKE9@M!|2Bjavax/swing/text/DocumentFilter$FilterBypass.classPKE9@%Bjavax/swing/text/DocumentFilter.classPKE9@H Bjavax/swing/text/EditorKit.classPKE9@x' hBjavax/swing/text/Element.classPKE9@݌& Bjavax/swing/text/ElementIterator.classPKE9@@Nf "Bjavax/swing/text/FieldView.classPKE9@:,P>,P$Bjavax/swing/text/FlowView$FlowStrategy.classPKE9@z&Bjavax/swing/text/FlowView.classPKE9@3 !)Bjavax/swing/text/GapContent.classPKE9@-@ U,Bjavax/swing/text/GapVector.classPKE9@R-.Bjavax/swing/text/GlyphView$GlyphPainter.classPKE9@AcKH 1Bjavax/swing/text/GlyphView.classPKE9@/,5Bjavax/swing/text/Highlighter$Highlight.classPKE9@ۆc936Bjavax/swing/text/Highlighter$HighlightPainter.classPKE9@ɒp"#8Bjavax/swing/text/Highlighter.classPKE9@`59Bjavax/swing/text/IconView.classPKE9@"-e>Bjavax/swing/text/JTextComponent$AccessibleJTextComponent.classPKE9@_|2'GBjavax/swing/text/JTextComponent$DropLocation.classPKE9@O"G70IBjavax/swing/text/JTextComponent$KeyBinding.classPKE9@KjK"%JBjavax/swing/text/JTextComponent.classPKE9@'ւu]SBjavax/swing/text/Keymap.classPKE9@ht UBjavax/swing/text/LabelView.classPKE9@\ `6WBjavax/swing/text/LayeredHighlighter$LayerPainter.classPKE9@zrHE)YBjavax/swing/text/LayeredHighlighter.classPKE9@5.k"N[Bjavax/swing/text/LayoutQueue.classPKE9@~e&$ ]Bjavax/swing/text/MaskFormatter.classPKE9@*k_Bjavax/swing/text/MutableAttributeSet.classPKE9@QRn4`Bjavax/swing/text/NavigationFilter$FilterBypass.classPKE9@3'|bBjavax/swing/text/NavigationFilter.classPKE9@;-&dBjavax/swing/text/NumberFormatter.classPKE9@<#f* (/fBjavax/swing/text/ParagraphView$Row.classPKE9@%~!x $gBjavax/swing/text/ParagraphView.classPKE9@J OP?#kBjavax/swing/text/PasswordView.classPKE9@/gK$mBjavax/swing/text/PlainDocument.classPKE9@#i@ oBjavax/swing/text/PlainView.classPKE9@}R;$2tBjavax/swing/text/Position$Bias.classPKE9@s?uBjavax/swing/text/Position.classPKE9@vBjavax/swing/text/Segment.classPKE9@v: )yBjavax/swing/text/SimpleAttributeSet.classPKE9@BE$}Bjavax/swing/text/StringContent.classPKE9@+/ $Bjavax/swing/text/Style.classPKE9@*B82Bjavax/swing/text/StyleConstants$CharacterConstants.classPKE9@^&2O4Bjavax/swing/text/StyleConstants$ColorConstants.classPKE9@2J3FBjavax/swing/text/StyleConstants$FontConstants.classPKE9@0E8مBjavax/swing/text/StyleConstants$ParagraphConstants.classPKE9@:%[Bjavax/swing/text/StyleConstants.classPKE9@,hW.Bjavax/swing/text/StyleContext$NamedStyle.classPKE9@{w5dBjavax/swing/text/StyleContext$SmallAttributeSet.classPKE9@'E#YBjavax/swing/text/StyleContext.classPKE9@$W?pI%=Bjavax/swing/text/StyledDocument.classPKE9@eyu6Bjavax/swing/text/StyledEditorKit$AlignmentAction.classPKE9@Bjavax/swing/text/html/HTMLDocument$HTMLReader$FormAction.classPKE9@8I@Bjavax/swing/text/html/HTMLDocument$HTMLReader$HiddenAction.classPKE9@B{KAiBjavax/swing/text/html/HTMLDocument$HTMLReader$IsindexAction.classPKE9@ZPC#Bjavax/swing/text/html/HTMLDocument$HTMLReader$ParagraphAction.classPKE9@ŪI=Bjavax/swing/text/html/HTMLDocument$HTMLReader$PreAction.classPKE9@KACjavax/swing/text/html/HTMLDocument$HTMLReader$SpecialAction.classPKE9@9=RCjavax/swing/text/html/HTMLDocument$HTMLReader$TagAction.classPKE9@oc7  3Cjavax/swing/text/html/HTMLDocument$HTMLReader.classPKE9@?*~1 Cjavax/swing/text/html/HTMLDocument$Iterator.classPKE9@s3 Cjavax/swing/text/html/HTMLDocument$RunElement.classPKE9@;6( Cjavax/swing/text/html/HTMLDocument.classPKE9@Z]Pm5Cjavax/swing/text/html/HTMLEditorKit$HTMLFactory.classPKE9@5[`g;q8Cjavax/swing/text/html/HTMLEditorKit$HTMLTextAction.classPKE9@f  >FCjavax/swing/text/html/HTMLEditorKit$InsertHTMLTextAction.classPKE9@Nx8Cjavax/swing/text/html/HTMLEditorKit$LinkController.classPKE9@No0sCjavax/swing/text/html/HTMLEditorKit$Parser.classPKE9@08Cjavax/swing/text/html/HTMLEditorKit$ParserCallback.classPKE9@I )"!Cjavax/swing/text/html/HTMLEditorKit.classPKE9@8$3O&Cjavax/swing/text/html/HTMLFrameHyperlinkEvent.classPKE9@Bs  &(Cjavax/swing/text/html/HTMLWriter.classPKE9@cI@70% ,Cjavax/swing/text/html/ImageView.classPKE9@T֠&/Cjavax/swing/text/html/InlineView.classPKE9@$1Cjavax/swing/text/html/ListView.classPKE9@yzC -R2Cjavax/swing/text/html/MinimalHTMLWriter.classPKE9@&5Cjavax/swing/text/html/ObjectView.classPKE9@ ׮"7Cjavax/swing/text/html/Option.classPKE9@`)9Cjavax/swing/text/html/ParagraphView.classPKE9@.91:Cjavax/swing/text/html/StyleSheet$BoxPainter.classPKE9@Aa2Cjavax/swing/text/html/StyleSheet.classPKIG@$CCjavax/swing/text/html/parser/PKE9@U0qCCjavax/swing/text/html/parser/AttributeList.classPKE9@h80/lFCjavax/swing/text/html/parser/ContentModel.classPKE9@ &HCjavax/swing/text/html/parser/DTD.classPKE9@#5q m/VNCjavax/swing/text/html/parser/DTDConstants.classPKE9@=/x1PCjavax/swing/text/html/parser/DocumentParser.classPKE9@uz*RCjavax/swing/text/html/parser/Element.classPKE9@SS)UCjavax/swing/text/html/parser/Entity.classPKE9@>j )WCjavax/swing/text/html/parser/Parser.classPKE9@ K{2[Cjavax/swing/text/html/parser/ParserDelegator.classPKE9@/oM-B^Cjavax/swing/text/html/parser/TagElement.classPKIG@c`Cjavax/swing/text/rtf/PKE9@{?'`Cjavax/swing/text/rtf/RTFEditorKit.classPKIG@aCjavax/swing/tree/PKE9@ ^%/9bCjavax/swing/tree/AbstractLayoutCache$NodeDimensions.classPKE9@Ze *cCjavax/swing/tree/AbstractLayoutCache.classPKE9@E}-khCjavax/swing/tree/DefaultMutableTreeNode.classPKE9@Z N=CnCjavax/swing/tree/DefaultTreeCellEditor$DefaultTextField.classPKE9@X~m:s<oCjavax/swing/tree/DefaultTreeCellEditor$EditorContainer.classPKE9@,qCjavax/swing/tree/DefaultTreeCellEditor.classPKE9@_C .wCjavax/swing/tree/DefaultTreeCellRenderer.classPKE9@=ڪ'nzCjavax/swing/tree/DefaultTreeModel.classPKE9@*0vCjavax/swing/tree/DefaultTreeSelectionModel.classPKE9@PTp4`*Cjavax/swing/tree/ExpandVetoException.classPKE9@pyx -*Cjavax/swing/tree/FixedHeightLayoutCache.classPKE9@s>&mCjavax/swing/tree/MutableTreeNode.classPKE9@}q&Cjavax/swing/tree/PathPlaceHolder.classPKE9@R Cjavax/swing/tree/RowMapper.classPKE9@T%ʍCjavax/swing/tree/TreeCellEditor.classPKE9@t 'ƎCjavax/swing/tree/TreeCellRenderer.classPKE9@Y4 Cjavax/swing/tree/TreeModel.classPKE9@zR="Cjavax/swing/tree/TreeNode.classPKE9@wic bCjavax/swing/tree/TreePath.classPKE9@HHRI)ΔCjavax/swing/tree/TreeSelectionModel.classPKE9@s 0nCjavax/swing/tree/VariableHeightLayoutCache.classPKIG@Cjavax/swing/undo/PKE9@!q+Cjavax/swing/undo/AbstractUndoableEdit.classPKE9@N7^F*`Cjavax/swing/undo/CannotRedoException.classPKE9@F*Cjavax/swing/undo/CannotUndoException.classPKE9@h^#ҟCjavax/swing/undo/CompoundEdit.classPKE9@mI? Cjavax/swing/undo/StateEdit.classPKE9@c䃤$ߣCjavax/swing/undo/StateEditable.classPKE9@cDR"JCjavax/swing/undo/UndoManager.classPKE9@f#ާCjavax/swing/undo/UndoableEdit.classPKE9@Fh*1Cjavax/swing/undo/UndoableEditSupport.classPKIG@ ϫCjavax/tools/PKE9@t! Cjavax/tools/Diagnostic$Kind.classPKE9@<nCjavax/tools/Diagnostic.classPKE9@xU%Cjavax/tools/DiagnosticCollector.classPKE9@_$Cjavax/tools/DiagnosticListener.classPKE9@yEBCjavax/tools/FileObject.classPKE9@G3&8Cjavax/tools/ForwardingFileObject.classPKE9@X(q+"Cjavax/tools/ForwardingJavaFileManager.classPKE9@|T(*Cjavax/tools/ForwardingJavaFileObject.classPKE9@7'.#Cjavax/tools/JavaCompiler$CompilationTask.classPKE9@u=Cjavax/tools/JavaCompiler.classPKE9@/*wCjavax/tools/JavaFileManager$Location.classPKE9@H7>>!Cjavax/tools/JavaFileManager.classPKE9@^K_%Cjavax/tools/JavaFileObject$Kind.classPKE9@K Cjavax/tools/JavaFileObject.classPKE9@kI%rCjavax/tools/OptionChecker.classPKE9@?a"&JCjavax/tools/SimpleJavaFileObject.classPKE9@]:)Cjavax/tools/StandardJavaFileManager.classPKE9@d]T"Cjavax/tools/StandardLocation.classPKE9@ĶG>Cjavax/tools/Tool.classPKE9@`!YCjavax/tools/ToolProvider.classPKIG@Cjavax/transaction/PKE9@# 3Cjavax/transaction/InvalidTransactionException.classPKE9@Ik 4vCjavax/transaction/TransactionRequiredException.classPKE9@6Cjavax/transaction/TransactionRolledbackException.classPKIG@XCjavax/transaction/xa/PKE9@x&Cjavax/transaction/xa/XAException.classPKE9@Z# &%Cjavax/transaction/xa/XAResource.classPKE9@40Bc$Cjavax/transaction/xa/Xid.classPKIG@ Cjavax/xml/PKE9@A[pn;Cjavax/xml/XMLConstants.classPKIG@Cjavax/xml/bind/PKE9@,bkeY4Cjavax/xml/bind/Binder.classPKE9@Ws}*#)Cjavax/xml/bind/DataBindingException.classPKE9@xa&!&cCjavax/xml/bind/DatatypeConverter.classPKE9@Y Cyc/Cjavax/xml/bind/DatatypeConverterInterface.classPKE9@Y anCjavax/xml/bind/Element.classPKE9@~ _Cjavax/xml/bind/JAXB.classPKE9@=>so pCjavax/xml/bind/JAXBContext.classPKE9@3,-Cjavax/xml/bind/JAXBElement$GlobalScope.classPKE9@+ZEZ Cjavax/xml/bind/JAXBElement.classPKE9@6M"Cjavax/xml/bind/JAXBException.classPKE9@{G?0%Cjavax/xml/bind/JAXBIntrospector.classPKE9@a%Djavax/xml/bind/MarshalException.classPKE9@@@;Q([Djavax/xml/bind/Marshaller$Listener.classPKE9@T`a Djavax/xml/bind/Marshaller.classPKE9@_f)Djavax/xml/bind/NotIdentifiableEvent.classPKE9@o)rDjavax/xml/bind/ParseConversionEvent.classPKE9@Djavax/xml/bind/annotation/XmlElements.classPKE9@%0'T@Djavax/xml/bind/annotation/XmlEnum.classPKE9@",ADjavax/xml/bind/annotation/XmlEnumValue.classPKE9@%7CDjavax/xml/bind/annotation/XmlID.classPKE9@ (DDjavax/xml/bind/annotation/XmlIDREF.classPKE9@3f3EDjavax/xml/bind/annotation/XmlInlineBinaryData.classPKE9@_'7GDjavax/xml/bind/annotation/XmlList.classPKE9@{k+HDjavax/xml/bind/annotation/XmlMimeType.classPKE9@@6(IDjavax/xml/bind/annotation/XmlMixed.classPKE9@%MKDjavax/xml/bind/annotation/XmlNs.classPKE9@SPF])LDjavax/xml/bind/annotation/XmlNsForm.classPKE9@ef+>ODjavax/xml/bind/annotation/XmlRegistry.classPKE9@L(.PDjavax/xml/bind/annotation/XmlRootElement.classPKE9@&"4) RDjavax/xml/bind/annotation/XmlSchema.classPKE9@\5 TDjavax/xml/bind/annotation/XmlSchemaType$DEFAULT.classPKE9@ -pUDjavax/xml/bind/annotation/XmlSchemaType.classPKE9@4.jWDjavax/xml/bind/annotation/XmlSchemaTypes.classPKE9@g*XDjavax/xml/bind/annotation/XmlSeeAlso.classPKE9@QC,)ZDjavax/xml/bind/annotation/XmlTransient.classPKE9@BR/[Djavax/xml/bind/annotation/XmlType$DEFAULT.classPKE9@m '\Djavax/xml/bind/annotation/XmlType.classPKE9@FA(^Djavax/xml/bind/annotation/XmlValue.classPKIG@#`Djavax/xml/bind/annotation/adapters/PKE9@$?j`Djavax/xml/bind/annotation/adapters/CollapsedStringAdapter.classPKE9@ie9bDjavax/xml/bind/annotation/adapters/HexBinaryAdapter.classPKE9@+:2@dDjavax/xml/bind/annotation/adapters/NormalizedStringAdapter.classPKE9@]Wn3 gDjavax/xml/bind/annotation/adapters/XmlAdapter.classPKE9@ǸChDjavax/xml/bind/annotation/adapters/XmlJavaTypeAdapter$DEFAULT.classPKE9@ 3JR5;[jDjavax/xml/bind/annotation/adapters/XmlJavaTypeAdapter.classPKE9@ <WlDjavax/xml/bind/annotation/adapters/XmlJavaTypeAdapters.classPKIG@mDjavax/xml/bind/attachment/PKE9@sZ4nDjavax/xml/bind/attachment/AttachmentMarshaller.classPKE9@P6tO<6oDjavax/xml/bind/attachment/AttachmentUnmarshaller.classPKIG@qDjavax/xml/bind/helpers/PKE9@}#!3qDjavax/xml/bind/helpers/AbstractMarshallerImpl.classPKE9@5w.5UwDjavax/xml/bind/helpers/AbstractUnmarshallerImpl.classPKE9@Q/5:/}Djavax/xml/bind/helpers/DefaultValidationEventHandler.classPKE9@ٵ,e-5~Djavax/xml/bind/helpers/NotIdentifiableEventImpl.classPKE9@{?vd-5Djavax/xml/bind/helpers/ParseConversionEventImpl.classPKE9@^>8c-5UDjavax/xml/bind/helpers/PrintConversionEventImpl.classPKE9@)**50Djavax/xml/bind/helpers/ValidationEventImpl.classPKE9@(]7Djavax/xml/bind/helpers/ValidationEventLocatorImpl.classPKIG@eDjavax/xml/bind/util/PKE9@[d$Djavax/xml/bind/util/JAXBResult.classPKE9@މV^M$_Djavax/xml/bind/util/JAXBSource.classPKE9@ 0r2Djavax/xml/bind/util/ValidationEventCollector.classPKIG@ЎDjavax/xml/crypto/PKE9@ ˯&Djavax/xml/crypto/AlgorithmMethod.classPKE9@ս`jDjavax/xml/crypto/Data.classPKE9@`iE*Djavax/xml/crypto/KeySelector$Purpose.classPKE9@ )"~Djavax/xml/crypto/KeySelector.classPKE9@'ŰC+kDjavax/xml/crypto/KeySelectorException.classPKE9@ (Djavax/xml/crypto/KeySelectorResult.classPKE9@I>'Djavax/xml/crypto/MarshalException.classPKE9@lUL/}Djavax/xml/crypto/NoSuchMechanismException.classPKE9@va"&Djavax/xml/crypto/NodeSetData.classPKE9@U& Djavax/xml/crypto/OctetStreamData.classPKE9@kO 7&ޜDjavax/xml/crypto/URIDereferencer.classPKE9@+=#Djavax/xml/crypto/URIReference.classPKE9@lg,͞Djavax/xml/crypto/URIReferenceException.classPKE9@.0k'Djavax/xml/crypto/XMLCryptoContext.classPKE9@%]#nDjavax/xml/crypto/XMLStructure.classPKIG@QDjavax/xml/crypto/dom/PKE9@Rh +Djavax/xml/crypto/dom/DOMCryptoContext.classPKE9@)ds'Djavax/xml/crypto/dom/DOMStructure.classPKE9@Mo*Djavax/xml/crypto/dom/DOMURIReference.classPKIG@Djavax/xml/crypto/dsig/PKE9@qI=YGH2ةDjavax/xml/crypto/dsig/CanonicalizationMethod.classPKE9@(7 (Djavax/xml/crypto/dsig/DigestMethod.classPKE9@ÔR\$ Djavax/xml/crypto/dsig/Manifest.classPKE9@ v%]Djavax/xml/crypto/dsig/Reference.classPKE9@ ^+&Djavax/xml/crypto/dsig/SignatureMethod.classPKE9@ S?}/Djavax/xml/crypto/dsig/SignatureProperties.classPKE9@f8)-Djavax/xml/crypto/dsig/SignatureProperty.classPKE9@/H&#Djavax/xml/crypto/dsig/SignedInfo.classPKE9@1 %Djavax/xml/crypto/dsig/Transform.classPKE9@YB.Djavax/xml/crypto/dsig/TransformException.classPKE9@iu,BDjavax/xml/crypto/dsig/TransformService.classPKE9@2U%Djavax/xml/crypto/dsig/XMLObject.classPKE9@>*lDjavax/xml/crypto/dsig/XMLSignContext.classPKE9@a7CDjavax/xml/crypto/dsig/XMLSignature$SignatureValue.classPKE9@سr(Djavax/xml/crypto/dsig/XMLSignature.classPKE9@{H1Djavax/xml/crypto/dsig/XMLSignatureException.classPKE9@$.7S/Djavax/xml/crypto/dsig/XMLSignatureFactory.classPKE9@4<Ճ. Djavax/xml/crypto/dsig/XMLValidateContext.classPKIG@Djavax/xml/crypto/dsig/dom/PKE9@E.IDjavax/xml/crypto/dsig/dom/DOMSignContext.classPKE9@~Ҥp2Djavax/xml/crypto/dsig/dom/DOMValidateContext.classPKIG@lDjavax/xml/crypto/dsig/keyinfo/PKE9@w+Djavax/xml/crypto/dsig/keyinfo/KeyInfo.classPKE9@e 2Djavax/xml/crypto/dsig/keyinfo/KeyInfoFactory.classPKE9@+Djavax/xml/crypto/dsig/keyinfo/KeyName.classPKE9@W &,,Djavax/xml/crypto/dsig/keyinfo/KeyValue.classPKE9@OHq+ Djavax/xml/crypto/dsig/keyinfo/PGPData.classPKE9@3Djavax/xml/crypto/dsig/keyinfo/RetrievalMethod.classPKE9@0(,Djavax/xml/crypto/dsig/keyinfo/X509Data.classPKE9@%l]4cDjavax/xml/crypto/dsig/keyinfo/X509IssuerSerial.classPKIG@Djavax/xml/crypto/dsig/spec/PKE9@QXϒ8Djavax/xml/crypto/dsig/spec/C14NMethodParameterSpec.classPKE9@uߜ:Djavax/xml/crypto/dsig/spec/DigestMethodParameterSpec.classPKE9@0#Ж|5Djavax/xml/crypto/dsig/spec/ExcC14NParameterSpec.classPKE9@:/32Djavax/xml/crypto/dsig/spec/HMACParameterSpec.classPKE9@t"=RDjavax/xml/crypto/dsig/spec/SignatureMethodParameterSpec.classPKE9@h4HA7[Djavax/xml/crypto/dsig/spec/TransformParameterSpec.classPKE9@~<3:XDjavax/xml/crypto/dsig/spec/XPathFilter2ParameterSpec.classPKE9@E.#9Djavax/xml/crypto/dsig/spec/XPathFilterParameterSpec.classPKE9@l=d91Djavax/xml/crypto/dsig/spec/XPathType$Filter.classPKE9@-8*Djavax/xml/crypto/dsig/spec/XPathType.classPKE9@0M>Cd;Djavax/xml/crypto/dsig/spec/XSLTTransformParameterSpec.classPKIG@gDjavax/xml/datatype/PKE9@qyG7Djavax/xml/datatype/DatatypeConfigurationException.classPKE9@j0VDjavax/xml/datatype/DatatypeConstants$Field.classPKE9@*Djavax/xml/datatype/DatatypeConstants.classPKE9@K(Djavax/xml/datatype/DatatypeFactory.classPKE9@9RG!Djavax/xml/datatype/Duration.classPKE9@ٞ-NDjavax/xml/datatype/XMLGregorianCalendar.classPKIG@Djavax/xml/namespace/PKE9@BB* Djavax/xml/namespace/NamespaceContext.classPKE9@{Djavax/xml/namespace/QName.classPKIG@REjavax/xml/parsers/PKE9@cyh='Ejavax/xml/parsers/DocumentBuilder.classPKE9@X' .xEjavax/xml/parsers/DocumentBuilderFactory.classPKE9@a`,1Ejavax/xml/parsers/FactoryConfigurationError.classPKE9@N 4 Ejavax/xml/parsers/ParserConfigurationException.classPKE9@OV" ! Ejavax/xml/parsers/SAXParser.classPKE9@?^(Ejavax/xml/parsers/SAXParserFactory.classPKIG@fEjavax/xml/soap/PKE9@*(9w#Ejavax/xml/soap/AttachmentPart.classPKE9@S5Ejavax/xml/soap/Detail.classPKE9@iv Ejavax/xml/soap/DetailEntry.classPKE9@vg#Ejavax/xml/soap/MessageFactory.classPKE9@ư+Ejavax/xml/soap/MimeHeader.classPKE9@ Ejavax/xml/soap/MimeHeaders.classPKE9@,7Ejavax/xml/soap/Name.classPKE9@W* &Ejavax/xml/soap/Node.classPKE9@BJ/ $vEjavax/xml/soap/SAAJMetaFactory.classPKE9@wg~\Ejavax/xml/soap/SAAJResult.classPKE9@ m !Ejavax/xml/soap/SOAPBody.classPKE9@w"t$z#Ejavax/xml/soap/SOAPBodyElement.classPKE9@5"dI}#@$Ejavax/xml/soap/SOAPConnection.classPKE9@W>3)*%Ejavax/xml/soap/SOAPConnectionFactory.classPKE9@Hb "e'Ejavax/xml/soap/SOAPConstants.classPKE9@Duj *Ejavax/xml/soap/SOAPElement.classPKE9@GV'-Ejavax/xml/soap/SOAPElementFactory.classPKE9@9(!/Ejavax/xml/soap/SOAPEnvelope.classPKE9@r!<"0Ejavax/xml/soap/SOAPException.classPKE9@ l2Ejavax/xml/soap/SOAPFactory.classPKE9@K`[4Ejavax/xml/soap/SOAPFault.classPKE9@Gu%(7Ejavax/xml/soap/SOAPFaultElement.classPKE9@n`7Ejavax/xml/soap/SOAPHeader.classPKE9@F&9Ejavax/xml/soap/SOAPHeaderElement.classPKE9@gׄ :Ejavax/xml/soap/SOAPMessage.classPKE9@?1KI>Ejavax/xml/soap/SOAPPart.classPKE9@L?gAEjavax/xml/soap/Text.classPKIG@ABEjavax/xml/stream/PKE9@2I"BEjavax/xml/stream/EventFilter.classPKE9@gkq0[CEjavax/xml/stream/FactoryConfigurationError.classPKE9@X *EEjavax/xml/stream/Location.classPKE9@ˎf#BFEjavax/xml/stream/StreamFilter.classPKE9@_3+ &GEjavax/xml/stream/XMLEventFactory.classPKE9@х,%JEjavax/xml/stream/XMLEventReader.classPKE9@$vG% LEjavax/xml/stream/XMLEventWriter.classPKE9@>>N &MEjavax/xml/stream/XMLInputFactory.classPKE9@x)8'6REjavax/xml/stream/XMLOutputFactory.classPKE9@ "UEjavax/xml/stream/XMLReporter.classPKE9@?2/"VEjavax/xml/stream/XMLResolver.classPKE9@xMl)WEjavax/xml/stream/XMLStreamConstants.classPKE9@)XEjavax/xml/stream/XMLStreamException.classPKE9@k[&ZEjavax/xml/stream/XMLStreamReader.classPKE9@_& ^Ejavax/xml/stream/XMLStreamWriter.classPKIG@``Ejavax/xml/stream/events/PKE9@R0'`Ejavax/xml/stream/events/Attribute.classPKE9@$d+(aEjavax/xml/stream/events/Characters.classPKE9@[j= %bEjavax/xml/stream/events/Comment.classPKE9@CrF!cEjavax/xml/stream/events/DTD.classPKE9@Xm{)eEjavax/xml/stream/events/EndDocument.classPKE9@ז$(eEjavax/xml/stream/events/EndElement.classPKE9@[kT/fEjavax/xml/stream/events/EntityDeclaration.classPKE9@Z> !-DhEjavax/xml/stream/events/EntityReference.classPKE9@;'[iEjavax/xml/stream/events/Namespace.classPKE9@" 1{jEjavax/xml/stream/events/NotationDeclaration.classPKE9@f3kEjavax/xml/stream/events/ProcessingInstruction.classPKE9@*+]+lEjavax/xml/stream/events/StartDocument.classPKE9@i@*mEjavax/xml/stream/events/StartElement.classPKE9@dR&goEjavax/xml/stream/events/XMLEvent.classPKIG@iqEjavax/xml/stream/util/PKE9@s:2/qEjavax/xml/stream/util/EventReaderDelegate.classPKE9@0FtEjavax/xml/stream/util/StreamReaderDelegate.classPKE9@Spf-NyEjavax/xml/stream/util/XMLEventAllocator.classPKE9@[]#կ,zEjavax/xml/stream/util/XMLEventConsumer.classPKIG@{Ejavax/xml/transform/PKE9@M0?'{Ejavax/xml/transform/ErrorListener.classPKE9@ U0$|Ejavax/xml/transform/OutputKeys.classPKE9@8  JEjavax/xml/transform/Result.classPKE9@!  Ejavax/xml/transform/Source.classPKE9@׼'Ejavax/xml/transform/SourceLocator.classPKE9@RA#Ejavax/xml/transform/Templates.classPKE9@5 /%Ejavax/xml/transform/Transformer.classPKE9@qh;Ejavax/xml/transform/TransformerConfigurationException.classPKE9@pO.Ejavax/xml/transform/TransformerException.classPKE9@es,?Ejavax/xml/transform/TransformerFactory.classPKE9@J|gfQ> Ejavax/xml/transform/TransformerFactoryConfigurationError.classPKE9@8%ގEjavax/xml/transform/URIResolver.classPKIG@Ejavax/xml/transform/dom/PKE9@?()Ejavax/xml/transform/dom/DOMLocator.classPKE9@v+''Ejavax/xml/transform/dom/DOMResult.classPKE9@,CR0'Ejavax/xml/transform/dom/DOMSource.classPKIG@ڕEjavax/xml/transform/sax/PKE9@'"Ejavax/xml/transform/sax/SAXResult.classPKE9@8*:'sEjavax/xml/transform/sax/SAXSource.classPKE9@3Ejavax/xml/transform/sax/SAXTransformerFactory.classPKE9@A.CEjavax/xml/transform/sax/TemplatesHandler.classPKE9@P0sEjavax/xml/transform/sax/TransformerHandler.classPKIG@՟Ejavax/xml/transform/stax/PKE9@2ul)Ejavax/xml/transform/stax/StAXResult.classPKE9@t -)VEjavax/xml/transform/stax/StAXSource.classPKIG@Ejavax/xml/transform/stream/PKE9@H#&-Ejavax/xml/transform/stream/StreamResult.classPKE9@Gp-uEjavax/xml/transform/stream/StreamSource.classPKIG@@Ejavax/xml/validation/PKE9@~ !Ejavax/xml/validation/Schema.classPKE9@! (֫Ejavax/xml/validation/SchemaFactory.classPKE9@t.9Ejavax/xml/validation/SchemaFactoryLoader.classPKE9@19+Ejavax/xml/validation/TypeInfoProvider.classPKE9@Iz{y$"Ejavax/xml/validation/Validator.classPKE9@`+Ejavax/xml/validation/ValidatorHandler.classPKIG@ Ejavax/xml/ws/PKE9@_bC<Ejavax/xml/ws/Action.classPKE9@GumEjavax/xml/ws/AsyncHandler.classPKE9@'S,hEjavax/xml/ws/Binding.classPKE9@̳*"Ejavax/xml/ws/BindingProvider.classPKE9@% Ejavax/xml/ws/BindingType.classPKE9@lL:OEjavax/xml/ws/Dispatch.classPKE9@'pEjavax/xml/ws/Endpoint.classPKE9@$Ejavax/xml/ws/EndpointReference.classPKE9@-P5AEjavax/xml/ws/FaultAction.classPKE9@<;DZEjavax/xml/ws/Holder.classPKE9@_^!MEjavax/xml/ws/LogicalMessage.classPKE9@łC$hEjavax/xml/ws/ProtocolException.classPKE9@T¡Ejavax/xml/ws/Provider.classPKE9@0uG=!Ejavax/xml/ws/RequestWrapper.classPKE9@E$Be!}Ejavax/xml/ws/RespectBinding.classPKE9@T\(1Ejavax/xml/ws/RespectBindingFeature.classPKE9@tF]Ejavax/xml/ws/Response.classPKE9@I^G?"Ejavax/xml/ws/ResponseWrapper.classPKE9@&Ѝ;%Ejavax/xml/ws/Service$Mode.classPKE9@YEjavax/xml/ws/Service.classPKE9@ ֱ[,Ejavax/xml/ws/ServiceMode.classPKE9@aw(Ejavax/xml/ws/WebEndpoint.classPKE9@HR`<*GEjavax/xml/ws/WebFault.classPKE9@,eE=#Ejavax/xml/ws/WebServiceClient.classPKE9@[m:H$bEjavax/xml/ws/WebServiceContext.classPKE9@${ҿC&Ejavax/xml/ws/WebServiceException.classPKE9@Forg/omg/CORBA/ACTIVITY_REQUIRED.classPKE9@ 2p@Forg/omg/CORBA/ARG_IN.classPKE9@B?AForg/omg/CORBA/ARG_INOUT.classPKE9@aBForg/omg/CORBA/ARG_OUT.classPKE9@#kVForg/omg/CORBA/BAD_QOS.classPKE9@(s XForg/omg/CORBA/BAD_TYPECODE.classPKE9@ZnVP!JZForg/omg/CORBA/BooleanHolder.classPKE9@s$$\Forg/omg/CORBA/BooleanSeqHelper.classPKE9@[$8^Forg/omg/CORBA/BooleanSeqHolder.classPKE9@5Ւ`Forg/omg/CORBA/Bounds.classPKE9@sGhaForg/omg/CORBA/ByteHolder.classPKE9@v(=cForg/omg/CORBA/CODESET_INCOMPATIBLE.classPKE9@ƯMp eForg/omg/CORBA/COMM_FAILURE.classPKE9@hl&fForg/omg/CORBA/CTX_RESTRICT_SCOPE.classPKE9@eF GgForg/omg/CORBA/CharHolder.classPKE9@O`#!iForg/omg/CORBA/CharSeqHelper.classPKE9@;IR!kForg/omg/CORBA/CharSeqHolder.classPKE9@:O$pmForg/omg/CORBA/CompletionStatus.classPKE9@.*oForg/omg/CORBA/CompletionStatusHelper.classPKE9@!bu`qForg/omg/CORBA/Context.classPKE9@)#1dsForg/omg/CORBA/ContextList.classPKE9@ќtForg/omg/CORBA/Current.classPKE9@x!uForg/omg/CORBA/CurrentHelper.classPKE9@Q|!wForg/omg/CORBA/CurrentHolder.classPKE9@ݙ,l%yForg/omg/CORBA/CurrentOperations.classPKE9@ ")!zForg/omg/CORBA/CustomMarshal.classPKE9@2wp#{Forg/omg/CORBA/DATA_CONVERSION.classPKE9@;ufi#D}Forg/omg/CORBA/DataInputStream.classPKE9@a.$Forg/omg/CORBA/DataOutputStream.classPKE9@Bt "{Forg/omg/CORBA/DefinitionKind.classPKE9@&(?Forg/omg/CORBA/DefinitionKindHelper.classPKE9@>5_!\Forg/omg/CORBA/DomainManager.classPKE9@w+NForg/omg/CORBA/DomainManagerOperations.classPKE9@rM ?Forg/omg/CORBA/DoubleHolder.classPKE9@x#Forg/omg/CORBA/DoubleSeqHelper.classPKE9@ԖX#(Forg/omg/CORBA/DoubleSeqHolder.classPKE9@f,h5| Forg/omg/CORBA/DynAny.classPKIG@Forg/omg/CORBA/DynAnyPackage/PKE9@?1)ӔForg/omg/CORBA/DynAnyPackage/Invalid.classPKE9@!,;Forg/omg/CORBA/DynAnyPackage/InvalidSeq.classPKE9@!.Forg/omg/CORBA/DynAnyPackage/InvalidValue.classPKE9@K[.Forg/omg/CORBA/DynAnyPackage/TypeMismatch.classPKE9@Forg/omg/CORBA/DynArray.classPKE9@,txߛForg/omg/CORBA/DynEnum.classPKE9@k:wForg/omg/CORBA/DynFixed.classPKE9@iForg/omg/CORBA/DynSequence.classPKE9@՗=!՟Forg/omg/CORBA/DynStruct.classPKE9@\r2]Forg/omg/CORBA/DynUnion.classPKE9@R=٢Forg/omg/CORBA/DynValue.classPKE9@/Nv)`Forg/omg/CORBA/DynamicImplementation.classPKE9@Km-Forg/omg/CORBA/Environment.classPKE9@ wv0!|Forg/omg/CORBA/ExceptionList.classPKE9@iQ DlForg/omg/CORBA/FREE_MEM.classPKE9@B;#Forg/omg/CORBA/FieldNameHelper.classPKE9@dytìForg/omg/CORBA/FixedHolder.classPKE9@_9JForg/omg/CORBA/FloatHolder.classPKE9@ "Forg/omg/CORBA/FloatSeqHelper.classPKE9@JPU"Forg/omg/CORBA/FloatSeqHolder.classPKE9@P5UyForg/omg/CORBA/IDLType.classPKE9@!^Forg/omg/CORBA/IDLTypeHelper.classPKE9@x%Forg/omg/CORBA/IDLTypeOperations.classPKE9@fnsForg/omg/CORBA/IMP_LIMIT.classPKE9@"7o,Forg/omg/CORBA/INITIALIZE.classPKE9@ kForg/omg/CORBA/INTERNAL.classPKE9@cqoForg/omg/CORBA/INTF_REPOS.classPKE9@ˑs$WForg/omg/CORBA/INVALID_ACTIVITY.classPKE9@;v 'Forg/omg/CORBA/INVALID_TRANSACTION.classPKE9@[XlForg/omg/CORBA/INV_FLAG.classPKE9@mnForg/omg/CORBA/INV_IDENT.classPKE9@yoVForg/omg/CORBA/INV_OBJREF.classPKE9@m*pForg/omg/CORBA/INV_POLICY.classPKE9@Forg/omg/CORBA/IRObject.classPKE9@ǃݢ&Forg/omg/CORBA/IRObjectOperations.classPKE9@C#>$Forg/omg/CORBA/IdentifierHelper.classPKE9@;m݈DForg/omg/CORBA/IntHolder.classPKE9@/20 Forg/omg/CORBA/LocalObject.classPKE9@) ۤGForg/omg/CORBA/LongHolder.classPKE9@l%Forg/omg/CORBA/LongLongSeqHelper.classPKE9@+1^%Forg/omg/CORBA/LongLongSeqHolder.classPKE9@A:x!Forg/omg/CORBA/LongSeqHelper.classPKE9@LJR!Forg/omg/CORBA/LongSeqHolder.classPKE9@jForg/omg/CORBA/MARSHAL.classPKE9@SSq rForg/omg/CORBA/NO_IMPLEMENT.classPKE9@>o1Forg/omg/CORBA/NO_MEMORY.classPKE9@X~o!Forg/omg/CORBA/NO_PERMISSION.classPKE9@q Forg/omg/CORBA/NO_RESOURCES.classPKE9@{]phForg/omg/CORBA/NO_RESPONSE.classPKE9@vjbXS%Forg/omg/CORBA/NVList.classPKE9@o3<!Forg/omg/CORBA/NameValuePair.classPKE9@Gorg/omg/CORBA/ShortHolder.classPKE9@<"5@Gorg/omg/CORBA/ShortSeqHelper.classPKE9@MU"EBGorg/omg/CORBA/ShortSeqHolder.classPKE9@KDΑo %DGorg/omg/CORBA/StringHolder.classPKE9@h+@#FGorg/omg/CORBA/StringSeqHelper.classPKE9@L>z#HGorg/omg/CORBA/StringSeqHolder.classPKE9@Yqx5%IGorg/omg/CORBA/StringValueHelper.classPKE9@ۑ;\{ LGorg/omg/CORBA/StructMember.classPKE9@wp}6v&/NGorg/omg/CORBA/StructMemberHelper.classPKE9@-8y:#HPGorg/omg/CORBA/SystemException.classPKE9@Q)c[ QGorg/omg/CORBA/TCKind.classPKE9@Z `jvWGorg/omg/CORBA/TIMEOUT.classPKE9@Z]Ms$)YGorg/omg/CORBA/TRANSACTION_MODE.classPKE9@(5w(ZGorg/omg/CORBA/TRANSACTION_REQUIRED.classPKE9@Wcy*\Gorg/omg/CORBA/TRANSACTION_ROLLEDBACK.classPKE9@3z+^Gorg/omg/CORBA/TRANSACTION_UNAVAILABLE.classPKE9@8ܝm_`Gorg/omg/CORBA/TRANSIENT.classPKE9@FpiNbGorg/omg/CORBA/TypeCode.classPKE9@%@\n"dGorg/omg/CORBA/TypeCodeHolder.classPKIG@fGorg/omg/CORBA/TypeCodePackage/PKE9@+fGorg/omg/CORBA/TypeCodePackage/BadKind.classPKE9@E6*ChGorg/omg/CORBA/TypeCodePackage/Bounds.classPKE9@&iGorg/omg/CORBA/ULongLongSeqHelper.classPKE9@Hya&kGorg/omg/CORBA/ULongLongSeqHolder.classPKE9@5"mGorg/omg/CORBA/ULongSeqHelper.classPKE9@jQU"oGorg/omg/CORBA/ULongSeqHolder.classPKE9@kqGorg/omg/CORBA/UNKNOWN.classPKE9@N֔&OsGorg/omg/CORBA/UNSUPPORTED_POLICY.classPKE9@gq,7tGorg/omg/CORBA/UNSUPPORTED_POLICY_VALUE.classPKE9@ #+uGorg/omg/CORBA/UShortSeqHelper.classPKE9@DۑX#&Gorg/omg/CORBA/portable/IDLEntity.classPKE9@]}1UGorg/omg/CORBA/portable/IndirectionException.classPKE9@3(ұGorg/omg/CORBA/portable/InputStream.classPKE9@C|jK*[Gorg/omg/CORBA/portable/InvokeHandler.classPKE9@юD['`Gorg/omg/CORBA/portable/ObjectImpl.classPKE9@,)xj)Gorg/omg/CORBA/portable/OutputStream.classPKE9@ ܏H/߾Gorg/omg/CORBA/portable/RemarshalException.classPKE9@k,Gorg/omg/CORBA/portable/ResponseHandler.classPKE9@L*_]*#Gorg/omg/CORBA/portable/ServantObject.classPKE9@ǭ߼'cGorg/omg/CORBA/portable/Streamable.classPKE9@ ,tGorg/omg/CORBA/portable/StreamableValue.classPKE9@9+-ZGorg/omg/CORBA/portable/UnknownException.classPKE9@=&Gorg/omg/CORBA/portable/ValueBase.classPKE9@|e+)Gorg/omg/CORBA/portable/ValueFactory.classPKE9@`-Gorg/omg/CORBA/portable/ValueInputStream.classPKE9@1.Gorg/omg/CORBA/portable/ValueOutputStream.classPKIG@Gorg/omg/CORBA_2_3/PKE9@GY/ Gorg/omg/CORBA_2_3/ORB.classPKIG@ Gorg/omg/CORBA_2_3/portable/PKE9@r )VGorg/omg/CORBA_2_3/portable/Delegate.classPKE9@,Gorg/omg/CORBA_2_3/portable/InputStream.classPKE9@Uv +Gorg/omg/CORBA_2_3/portable/ObjectImpl.classPKE9@IrI->Gorg/omg/CORBA_2_3/portable/OutputStream.classPKIG@KGorg/omg/CosNaming/PKE9@^N]Gorg/omg/CosNaming/Binding.classPKE9@6j%(Gorg/omg/CosNaming/BindingHelper.classPKE9@z%?Gorg/omg/CosNaming/BindingHolder.classPKE9@'0')Gorg/omg/CosNaming/BindingIterator.classPKE9@-%Gorg/omg/CosNaming/BindingIteratorHelper.classPKE9@nɞ-Gorg/omg/CosNaming/BindingIteratorHolder.classPKE9@ ]$1yGorg/omg/CosNaming/BindingIteratorOperations.classPKE9@\*Gorg/omg/CosNaming/BindingIteratorPOA.classPKE9@,h{)Gorg/omg/CosNaming/BindingListHelper.classPKE9@KTzq)Gorg/omg/CosNaming/BindingListHolder.classPKE9@DN#Gorg/omg/CosNaming/BindingType.classPKE9@?)Gorg/omg/CosNaming/BindingTypeHelper.classPKE9@W"ޚ)8Gorg/omg/CosNaming/BindingTypeHolder.classPKE9@^ =%)Gorg/omg/CosNaming/IstringHelper.classPKE9@SFz6%=Gorg/omg/CosNaming/NameComponent.classPKE9@3M+Gorg/omg/CosNaming/NameComponentHelper.classPKE9@Å+Gorg/omg/CosNaming/NameComponentHolder.classPKE9@&""Gorg/omg/CosNaming/NameHelper.classPKE9@r"+"Gorg/omg/CosNaming/NameHolder.classPKE9@J%Gorg/omg/CosNaming/NamingContext.classPKE9@\(Gorg/omg/CosNaming/NamingContextExt.classPKE9@z*4.Gorg/omg/CosNaming/NamingContextExtHelper.classPKE9@Ҝ.KGorg/omg/CosNaming/NamingContextExtHolder.classPKE9@gUQ2CGorg/omg/CosNaming/NamingContextExtOperations.classPKE9@c+Gorg/omg/CosNaming/NamingContextExtPOA.classPKIG@*PHorg/omg/CosNaming/NamingContextExtPackage/PKE9@Ev(]m=Horg/omg/CosNaming/NamingContextExtPackage/AddressHelper.classPKE9@ !>Horg/omg/CosNaming/NamingContextExtPackage/InvalidAddress.classPKE9@bnOYJDxHorg/omg/CosNaming/NamingContextExtPackage/InvalidAddressHelper.classPKE9@TrADHorg/omg/CosNaming/NamingContextExtPackage/InvalidAddressHolder.classPKE9@v@ Horg/omg/CosNaming/NamingContextExtPackage/StringNameHelper.classPKE9@ s?; Horg/omg/CosNaming/NamingContextExtPackage/URLStringHelper.classPKE9@^ +}Horg/omg/CosNaming/NamingContextHelper.classPKE9@ +Horg/omg/CosNaming/NamingContextHolder.classPKE9@تza/Horg/omg/CosNaming/NamingContextOperations.classPKE9@d(Horg/omg/CosNaming/NamingContextPOA.classPKIG@'*Horg/omg/CosNaming/NamingContextPackage/PKE9@ c9Horg/omg/CosNaming/NamingContextPackage/AlreadyBound.classPKE9@ %?Horg/omg/CosNaming/NamingContextPackage/AlreadyBoundHelper.classPKE9@?SHorg/omg/CosNaming/NamingContextPackage/AlreadyBoundHolder.classPKE9@N~I:tHorg/omg/CosNaming/NamingContextPackage/CannotProceed.classPKE9@|5-@Z Horg/omg/CosNaming/NamingContextPackage/CannotProceedHelper.classPKE9@x1h@"Horg/omg/CosNaming/NamingContextPackage/CannotProceedHolder.classPKE9@yvtY8$Horg/omg/CosNaming/NamingContextPackage/InvalidName.classPKE9@ j>M&Horg/omg/CosNaming/NamingContextPackage/InvalidNameHelper.classPKE9@d>(Horg/omg/CosNaming/NamingContextPackage/InvalidNameHolder.classPKE9@_#V5*Horg/omg/CosNaming/NamingContextPackage/NotEmpty.classPKE9@h+ ;1,Horg/omg/CosNaming/NamingContextPackage/NotEmptyHelper.classPKE9@u;u.Horg/omg/CosNaming/NamingContextPackage/NotEmptyHolder.classPKE9@Cڄ|50Horg/omg/CosNaming/NamingContextPackage/NotFound.classPKE9@4r;v2Horg/omg/CosNaming/NamingContextPackage/NotFoundHelper.classPKE9@rA;4Horg/omg/CosNaming/NamingContextPackage/NotFoundHolder.classPKE9@ew;6Horg/omg/CosNaming/NamingContextPackage/NotFoundReason.classPKE9@1+5A9Horg/omg/CosNaming/NamingContextPackage/NotFoundReasonHelper.classPKE9@Horg/omg/CosNaming/_BindingIteratorStub.classPKE9@+=f -@Horg/omg/CosNaming/_NamingContextExtStub.classPKE9@XdK.DHorg/omg/CosNaming/_NamingContextImplBase.classPKE9@ߒS *FHorg/omg/CosNaming/_NamingContextStub.classPKIG@IIHorg/omg/Dynamic/PKE9@{/F1IHorg/omg/Dynamic/Parameter.classPKIG@KHorg/omg/DynamicAny/PKE9@F%_KHorg/omg/DynamicAny/AnySeqHelper.classPKE9@zMHorg/omg/DynamicAny/DynAny.classPKE9@* &gNHorg/omg/DynamicAny/DynAnyFactory.classPKE9@=,bOHorg/omg/DynamicAny/DynAnyFactoryHelper.classPKE9@5#0QHorg/omg/DynamicAny/DynAnyFactoryOperations.classPKIG@(SHorg/omg/DynamicAny/DynAnyFactoryPackage/PKE9@8%BZSHorg/omg/DynamicAny/DynAnyFactoryPackage/InconsistentTypeCode.classPKE9@lHTHorg/omg/DynamicAny/DynAnyFactoryPackage/InconsistentTypeCodeHelper.classPKE9@_OIH%FWHorg/omg/DynamicAny/DynAnyHelper.classPKE9@r;)YHorg/omg/DynamicAny/DynAnyOperations.classPKIG@!$]Horg/omg/DynamicAny/DynAnyPackage/PKE9@3u]Horg/omg/DynamicAny/DynAnyPackage/InvalidValue.classPKE9@:.~z9^Horg/omg/DynamicAny/DynAnyPackage/InvalidValueHelper.classPKE9@34aHorg/omg/DynamicAny/DynAnyPackage/TypeMismatch.classPKE9@Jʹ9bHorg/omg/DynamicAny/DynAnyPackage/TypeMismatchHelper.classPKE9@Tw(dHorg/omg/DynamicAny/DynAnySeqHelper.classPKE9@Z6!gHorg/omg/DynamicAny/DynArray.classPKE9@[Z' hHorg/omg/DynamicAny/DynArrayHelper.classPKE9@{&+YjHorg/omg/DynamicAny/DynArrayOperations.classPKE9@*> kHorg/omg/DynamicAny/DynEnum.classPKE9@xƧQ&lHorg/omg/DynamicAny/DynEnumHelper.classPKE9@$*oHorg/omg/DynamicAny/DynEnumOperations.classPKE9@ܨ!`pHorg/omg/DynamicAny/DynFixed.classPKE9@Z'WqHorg/omg/DynamicAny/DynFixedHelper.classPKE9@N+sHorg/omg/DynamicAny/DynFixedOperations.classPKE9@u $tHorg/omg/DynamicAny/DynSequence.classPKE9@xs{u*uHorg/omg/DynamicAny/DynSequenceHelper.classPKE9@B[=m.BxHorg/omg/DynamicAny/DynSequenceOperations.classPKE9@"yHorg/omg/DynamicAny/DynStruct.classPKE9@%c(zHorg/omg/DynamicAny/DynStructHelper.classPKE9@U,"}Horg/omg/DynamicAny/DynStructOperations.classPKE9@9;!~Horg/omg/DynamicAny/DynUnion.classPKE9@}Z'Horg/omg/DynamicAny/DynUnionHelper.classPKE9@vlol+Horg/omg/DynamicAny/DynUnionOperations.classPKE9@!܃Horg/omg/DynamicAny/DynValue.classPKE9@xG$ӄHorg/omg/DynamicAny/DynValueBox.classPKE9@ˀb L.҅Horg/omg/DynamicAny/DynValueBoxOperations.classPKE9@);'NHorg/omg/DynamicAny/DynValueCommon.classPKE9@ e 1QHorg/omg/DynamicAny/DynValueCommonOperations.classPKE9@T>Z'fHorg/omg/DynamicAny/DynValueHelper.classPKE9@ W*[+Horg/omg/DynamicAny/DynValueOperations.classPKE9@E(kHorg/omg/DynamicAny/FieldNameHelper.classPKE9@IXI;'Horg/omg/DynamicAny/NameDynAnyPair.classPKE9@ -'Horg/omg/DynamicAny/NameDynAnyPairHelper.classPKE9@n+0PHorg/omg/DynamicAny/NameDynAnyPairSeqHelper.classPKE9@j̎A(&Horg/omg/DynamicAny/NameValuePair.classPKE9@X,Horg/omg/DynamicAny/NameValuePairHelper.classPKE9@N/BHorg/omg/DynamicAny/NameValuePairSeqHelper.classPKE9@4U+vHorg/omg/DynamicAny/_DynAnyFactoryStub.classPKE9@b e$ÝHorg/omg/DynamicAny/_DynAnyStub.classPKE9@ˆ<&zHorg/omg/DynamicAny/_DynArrayStub.classPKE9@EG)%Horg/omg/DynamicAny/_DynEnumStub.classPKE9@|&Horg/omg/DynamicAny/_DynFixedStub.classPKE9@J?)oHorg/omg/DynamicAny/_DynSequenceStub.classPKE9@T 'Horg/omg/DynamicAny/_DynStructStub.classPKE9@0]&Horg/omg/DynamicAny/_DynUnionStub.classPKE9@B.$&\Horg/omg/DynamicAny/_DynValueStub.classPKIG@ Horg/omg/IOP/PKE9@ЅaчHorg/omg/IOP/CodeSets.classPKE9@In7zHorg/omg/IOP/Codec.classPKE9@THorg/omg/IOP/CodecFactory.classPKE9@q fF$Horg/omg/IOP/CodecFactoryHelper.classPKE9@si*(Horg/omg/IOP/CodecFactoryOperations.classPKIG@ Horg/omg/IOP/CodecFactoryPackage/PKE9@Y5^Horg/omg/IOP/CodecFactoryPackage/UnknownEncoding.classPKE9@lED ;Horg/omg/IOP/CodecFactoryPackage/UnknownEncodingHelper.classPKE9@v[{!&Horg/omg/IOP/CodecOperations.classPKIG@Horg/omg/IOP/CodecPackage/PKE9@-Horg/omg/IOP/CodecPackage/FormatMismatch.classPKE9@f3GHorg/omg/IOP/CodecPackage/FormatMismatchHelper.classPKE9@M5}Horg/omg/IOP/CodecPackage/InvalidTypeForEncoding.classPKE9@j;Horg/omg/IOP/CodecPackage/InvalidTypeForEncodingHelper.classPKE9@+BHorg/omg/IOP/CodecPackage/TypeMismatch.classPKE9@ 8xZ1Horg/omg/IOP/CodecPackage/TypeMismatchHelper.classPKE9@ #Horg/omg/IOP/ComponentIdHelper.classPKE9@[k]%Horg/omg/IOP/ENCODING_CDR_ENCAPS.classPKE9@WGHorg/omg/IOP/Encoding.classPKE9@^ϗ(sHorg/omg/IOP/ExceptionDetailMessage.classPKE9@1sH`Horg/omg/IOP/IOR.classPKE9@  Horg/omg/IOP/IORHelper.classPKE9@$ˑ`Horg/omg/IOP/IORHolder.classPKE9@0Horg/omg/IOP/MultipleComponentProfileHelper.classPKE9@;0 Horg/omg/IOP/MultipleComponentProfileHolder.classPKE9@S!Horg/omg/IOP/ProfileIdHelper.classPKE9@[*2Horg/omg/IOP/RMICustomMaxStreamFormat.classPKE9@$; #Horg/omg/IOP/ServiceContext.classPKE9@x&Horg/omg/IOP/ServiceContextHelper.classPKE9@]I&Horg/omg/IOP/ServiceContextHolder.classPKE9@1*Horg/omg/IOP/ServiceContextListHelper.classPKE9@ۼ*Horg/omg/IOP/ServiceContextListHolder.classPKE9@vd!Iorg/omg/IOP/ServiceIdHelper.classPKE9@aW,Iorg/omg/IOP/TAG_ALTERNATE_IIOP_ADDRESS.classPKE9@aeIorg/omg/IOP/TAG_CODE_SETS.classPKE9@ WR"Iorg/omg/IOP/TAG_INTERNET_IOP.classPKE9@ǒ#Iorg/omg/IOP/TAG_JAVA_CODEBASE.classPKE9@X)Iorg/omg/IOP/TAG_MULTIPLE_COMPONENTS.classPKE9@'zIorg/omg/IOP/TAG_ORB_TYPE.classPKE9@ ZR Iorg/omg/IOP/TAG_POLICIES.classPKE9@V]Iԡ2) Iorg/omg/IOP/TAG_RMI_CUSTOM_MAX_STREAM_FORMAT.classPKE9@$k;!* Iorg/omg/IOP/TaggedComponent.classPKE9@#_' Iorg/omg/IOP/TaggedComponentHelper.classPKE9@hK'Iorg/omg/IOP/TaggedComponentHolder.classPKE9@S8Iorg/omg/IOP/TaggedProfile.classPKE9@*Dp%LIorg/omg/IOP/TaggedProfileHelper.classPKE9@S|%kIorg/omg/IOP/TaggedProfileHolder.classPKE9@>$ZIorg/omg/IOP/TransactionService.classPKIG@<Iorg/omg/Messaging/PKE9@~N+~Iorg/omg/Messaging/SYNC_WITH_TRANSPORT.classPKE9@5J'oIorg/omg/Messaging/SyncScopeHelper.classPKIG@Iorg/omg/PortableInterceptor/PKE9@慓(Iorg/omg/PortableInterceptor/ACTIVE.classPKE9@x]8Iorg/omg/PortableInterceptor/AdapterManagerIdHelper.classPKE9@ݮb3Iorg/omg/PortableInterceptor/AdapterNameHelper.classPKE9@u# 4, Iorg/omg/PortableInterceptor/AdapterStateHelper.classPKE9@Y%3]"Iorg/omg/PortableInterceptor/ClientRequestInfo.classPKE9@ zu=v#Iorg/omg/PortableInterceptor/ClientRequestInfoOperations.classPKE9@Τ6::V%Iorg/omg/PortableInterceptor/ClientRequestInterceptor.classPKE9@e5Dp&Iorg/omg/PortableInterceptor/ClientRequestInterceptorOperations.classPKE9@P.)'Iorg/omg/PortableInterceptor/Current.classPKE9@|w/(Iorg/omg/PortableInterceptor/CurrentHelper.classPKE9@_]36+Iorg/omg/PortableInterceptor/CurrentOperations.classPKE9@%,r,Iorg/omg/PortableInterceptor/DISCARDING.classPKE9@ KQ~0d-Iorg/omg/PortableInterceptor/ForwardRequest.classPKE9@*/6/Iorg/omg/PortableInterceptor/ForwardRequestHelper.classPKE9@>ٕ)M1Iorg/omg/PortableInterceptor/HOLDING.classPKE9@>*92Iorg/omg/PortableInterceptor/INACTIVE.classPKE9@8Y)'3Iorg/omg/PortableInterceptor/IORInfo.classPKE9@";Lo3'4Iorg/omg/PortableInterceptor/IORInfoOperations.classPKE9@p!05Iorg/omg/PortableInterceptor/IORInterceptor.classPKE9@>jk :6Iorg/omg/PortableInterceptor/IORInterceptorOperations.classPKE9@>&+47Iorg/omg/PortableInterceptor/IORInterceptor_3_0.classPKE9@^l:9Iorg/omg/PortableInterceptor/IORInterceptor_3_0Helper.classPKE9@>:q;Iorg/omg/PortableInterceptor/IORInterceptor_3_0Holder.classPKE9@Ia>|=Iorg/omg/PortableInterceptor/IORInterceptor_3_0Operations.classPKE9@޻->Iorg/omg/PortableInterceptor/Interceptor.classPKE9@O 7?Iorg/omg/PortableInterceptor/InterceptorOperations.classPKE9@_ -@Iorg/omg/PortableInterceptor/InvalidSlot.classPKE9@3UBIorg/omg/PortableInterceptor/InvalidSlotHelper.classPKE9@ ie2DIorg/omg/PortableInterceptor/LOCATION_FORWARD.classPKE9@qD.EIorg/omg/PortableInterceptor/NON_EXISTENT.classPKE9@ѹK-FIorg/omg/PortableInterceptor/ORBIdHelper.classPKE9@] -HIorg/omg/PortableInterceptor/ORBInitInfo.classPKE9@m3 x7IIorg/omg/PortableInterceptor/ORBInitInfoOperations.classPKIG@/KIorg/omg/PortableInterceptor/ORBInitInfoPackage/PKE9@1^.J}B:LIorg/omg/PortableInterceptor/ORBInitInfoPackage/DuplicateName.classPKE9@GpeHMIorg/omg/PortableInterceptor/ORBInitInfoPackage/DuplicateNameHelper.classPKE9@Bb"@OPIorg/omg/PortableInterceptor/ORBInitInfoPackage/InvalidName.classPKE9@[+.UFQIorg/omg/PortableInterceptor/ORBInitInfoPackage/InvalidNameHelper.classPKE9@[2zC6TIorg/omg/PortableInterceptor/ORBInitInfoPackage/ObjectIdHelper.classPKE9@BJ 0VIorg/omg/PortableInterceptor/ORBInitializer.classPKE9@QͲ:WIorg/omg/PortableInterceptor/ORBInitializerOperations.classPKE9@Pe0XIorg/omg/PortableInterceptor/ObjectIdHelper.classPKE9@4<پ8ZIorg/omg/PortableInterceptor/ObjectReferenceFactory.classPKE9@I(>[Iorg/omg/PortableInterceptor/ObjectReferenceFactoryHelper.classPKE9@ б>3^Iorg/omg/PortableInterceptor/ObjectReferenceFactoryHolder.classPKE9@\TSP@9P`Iorg/omg/PortableInterceptor/ObjectReferenceTemplate.classPKE9@LyG0?aIorg/omg/PortableInterceptor/ObjectReferenceTemplateHelper.classPKE9@RI?cIorg/omg/PortableInterceptor/ObjectReferenceTemplateHolder.classPKE9@iF>BeIorg/omg/PortableInterceptor/ObjectReferenceTemplateSeqHelper.classPKE9@URB8hIorg/omg/PortableInterceptor/ObjectReferenceTemplateSeqHolder.classPKE9@x/_jIorg/omg/PortableInterceptor/PolicyFactory.classPKE9@T9ikIorg/omg/PortableInterceptor/PolicyFactoryOperations.classPKE9@MYQ-lIorg/omg/PortableInterceptor/RequestInfo.classPKE9@7mIorg/omg/PortableInterceptor/RequestInfoOperations.classPKE9@H@P,oIorg/omg/PortableInterceptor/SUCCESSFUL.classPKE9@^2pIorg/omg/PortableInterceptor/SYSTEM_EXCEPTION.classPKE9@qT0qIorg/omg/PortableInterceptor/ServerIdHelper.classPKE9@:%3sIorg/omg/PortableInterceptor/ServerRequestInfo.classPKE9@Y=tIorg/omg/PortableInterceptor/ServerRequestInfoOperations.classPKE9@3::vIorg/omg/PortableInterceptor/ServerRequestInterceptor.classPKE9@t| D xIorg/omg/PortableInterceptor/ServerRequestInterceptorOperations.classPKE9@dj1yIorg/omg/PortableInterceptor/TRANSPORT_RETRY.classPKE9@qGR0|zIorg/omg/PortableInterceptor/USER_EXCEPTION.classPKIG@v{Iorg/omg/PortableServer/PKE9@u]Et-{Iorg/omg/PortableServer/AdapterActivator.classPKE9@7|Iorg/omg/PortableServer/AdapterActivatorOperations.classPKE9@:ɥ$}Iorg/omg/PortableServer/Current.classPKE9@֓ $*~Iorg/omg/PortableServer/CurrentHelper.classPKE9@8rBY.Iorg/omg/PortableServer/CurrentOperations.classPKIG@&>Iorg/omg/PortableServer/CurrentPackage/PKE9@r5Iorg/omg/PortableServer/CurrentPackage/NoContext.classPKE9@*;Iorg/omg/PortableServer/CurrentPackage/NoContextHelper.classPKE9@BLj2VIorg/omg/PortableServer/DynamicImplementation.classPKE9@BX~+Iorg/omg/PortableServer/ForwardRequest.classPKE9@O&1gIorg/omg/PortableServer/ForwardRequestHelper.classPKE9@Qrzx4Iorg/omg/PortableServer/ID_ASSIGNMENT_POLICY_ID.classPKE9@&4Iorg/omg/PortableServer/ID_UNIQUENESS_POLICY_ID.classPKE9@Ktf:Iorg/omg/PortableServer/IMPLICIT_ACTIVATION_POLICY_ID.classPKE9@st /Iorg/omg/PortableServer/IdAssignmentPolicy.classPKE9@ԑŭ 9Iorg/omg/PortableServer/IdAssignmentPolicyOperations.classPKE9@H΍514ՐIorg/omg/PortableServer/IdAssignmentPolicyValue.classPKE9@R2 /Iorg/omg/PortableServer/IdUniquenessPolicy.classPKE9@7 9 Iorg/omg/PortableServer/IdUniquenessPolicyOperations.classPKE9@%"94!Iorg/omg/PortableServer/IdUniquenessPolicyValue.classPKE9@آ5PIorg/omg/PortableServer/ImplicitActivationPolicy.classPKE9@Pet?fIorg/omg/PortableServer/ImplicitActivationPolicyOperations.classPKE9@{:Iorg/omg/PortableServer/ImplicitActivationPolicyValue.classPKE9@܋/Iorg/omg/PortableServer/LIFESPAN_POLICY_ID.classPKE9@Mج+Iorg/omg/PortableServer/LifespanPolicy.classPKE9@5Iorg/omg/PortableServer/LifespanPolicyOperations.classPKE9@"Q'0ʞIorg/omg/PortableServer/LifespanPolicyValue.classPKE9@ۙe Iorg/omg/PortableServer/POA.classPKE9@k&ܡIorg/omg/PortableServer/POAHelper.classPKE9@A'Iorg/omg/PortableServer/POAManager.classPKE9@*1Iorg/omg/PortableServer/POAManagerOperations.classPKIG@)sIorg/omg/PortableServer/POAManagerPackage/PKE9@RY">̦Iorg/omg/PortableServer/POAManagerPackage/AdapterInactive.classPKE9@CǀKDZIorg/omg/PortableServer/POAManagerPackage/AdapterInactiveHelper.classPKE9@jti#4Iorg/omg/PortableServer/POAManagerPackage/State.classPKE9@+"E *Iorg/omg/PortableServer/POAOperations.classPKIG@"^Iorg/omg/PortableServer/POAPackage/PKE9@;$<Iorg/omg/PortableServer/POAPackage/AdapterAlreadyExists.classPKE9@9ʘBB>Iorg/omg/PortableServer/POAPackage/AdapterAlreadyExistsHelper.classPKE9@h3":Iorg/omg/PortableServer/POAPackage/AdapterNonExistent.classPKE9@Lu2@Iorg/omg/PortableServer/POAPackage/AdapterNonExistentHelper.classPKE9@e'JF5pIorg/omg/PortableServer/POAPackage/InvalidPolicy.classPKE9@e ;Iorg/omg/PortableServer/POAPackage/InvalidPolicyHelper.classPKE9@r`]z1dIorg/omg/PortableServer/POAPackage/NoServant.classPKE9@L7۾Iorg/omg/PortableServer/POAPackage/NoServantHelper.classPKE9@w#;Iorg/omg/PortableServer/POAPackage/ObjectAlreadyActive.classPKE9@!bj:AIorg/omg/PortableServer/POAPackage/ObjectAlreadyActiveHelper.classPKE9@ _7Iorg/omg/PortableServer/POAPackage/ObjectNotActive.classPKE9@0=tIorg/omg/PortableServer/POAPackage/ObjectNotActiveHelper.classPKE9@,J"<Iorg/omg/PortableServer/POAPackage/ServantAlreadyActive.classPKE9@}UBBIIorg/omg/PortableServer/POAPackage/ServantAlreadyActiveHelper.classPKE9@8Iorg/omg/PortableServer/POAPackage/ServantNotActive.classPKE9@">Iorg/omg/PortableServer/POAPackage/ServantNotActiveHelper.classPKE9@h4mIorg/omg/PortableServer/POAPackage/WrongAdapter.classPKE9@>:Iorg/omg/PortableServer/POAPackage/WrongAdapterHelper.classPKE9@"131Iorg/omg/PortableServer/POAPackage/WrongPolicy.classPKE9@+?9Iorg/omg/PortableServer/POAPackage/WrongPolicyHelper.classPKE9@]u9Iorg/omg/PortableServer/REQUEST_PROCESSING_POLICY_ID.classPKE9@pP84Iorg/omg/PortableServer/RequestProcessingPolicy.classPKE9@ꀲ>Iorg/omg/PortableServer/RequestProcessingPolicyOperations.classPKE9@ ߳ 90Iorg/omg/PortableServer/RequestProcessingPolicyValue.classPKE9@Qa8Iorg/omg/PortableServer/SERVANT_RETENTION_POLICY_ID.classPKE9@x)4$Iorg/omg/PortableServer/Servant.classPKE9@%צ-1Iorg/omg/PortableServer/ServantActivator.classPKE9@3;Iorg/omg/PortableServer/ServantActivatorHelper.classPKE9@eA7Iorg/omg/PortableServer/ServantActivatorOperations.classPKE9@-0Iorg/omg/PortableServer/ServantActivatorPOA.classPKE9@,?+LIorg/omg/PortableServer/ServantLocator.classPKE9@fV1PIorg/omg/PortableServer/ServantLocatorHelper.classPKE9@ O25Iorg/omg/PortableServer/ServantLocatorOperations.classPKE9@.Iorg/omg/PortableServer/ServantLocatorPOA.classPKIG@-iIorg/omg/PortableServer/ServantLocatorPackage/PKE9@IE?Iorg/omg/PortableServer/ServantLocatorPackage/CookieHolder.classPKE9@nt+Iorg/omg/PortableServer/ServantManager.classPKE9@G9w5Iorg/omg/PortableServer/ServantManagerOperations.classPKE9@ 3Iorg/omg/PortableServer/ServantRetentionPolicy.classPKE9@艴=Iorg/omg/PortableServer/ServantRetentionPolicyOperations.classPKE9@nA8Iorg/omg/PortableServer/ServantRetentionPolicyValue.classPKE9@6J-Iorg/omg/PortableServer/THREAD_POLICY_ID.classPKE9@^P)Iorg/omg/PortableServer/ThreadPolicy.classPKE9@ǚ\3 Iorg/omg/PortableServer/ThreadPolicyOperations.classPKE9@K;.Iorg/omg/PortableServer/ThreadPolicyValue.classPKE9@ g2;Iorg/omg/PortableServer/_ServantActivatorStub.classPKE9@ P?E0Iorg/omg/PortableServer/_ServantLocatorStub.classPKIG@ SJorg/omg/PortableServer/portable/PKE9@v!X.Jorg/omg/PortableServer/portable/Delegate.classPKIG@ Jorg/omg/SendingContext/PKE9@$gJorg/omg/SendingContext/RunTime.classPKE9@5}u.aJorg/omg/SendingContext/RunTimeOperations.classPKIG@ 2Jorg/omg/stub/PKIG@oJorg/omg/stub/java/PKIG@Jorg/omg/stub/java/rmi/PKE9@46qU (Jorg/omg/stub/java/rmi/_Remote_Stub.classPKIG@XJorg/omg/stub/javax/PKIG@Jorg/omg/stub/javax/management/PKIG@%Jorg/omg/stub/javax/management/remote/PKIG@)> Jorg/omg/stub/javax/management/remote/rmi/PKE9@w^<>E Jorg/omg/stub/javax/management/remote/rmi/_RMIConnectionImpl_Tie.classPKE9@ vu]tBH Jorg/omg/stub/javax/management/remote/rmi/_RMIConnection_Stub.classPKE9@>AJorg/omg/stub/javax/management/remote/rmi/_RMIServerImpl_Tie.classPKE9@'N>\Jorg/omg/stub/javax/management/remote/rmi/_RMIServer_Stub.classPKIG@sJorg/w3c/PKIG@ Jorg/w3c/dom/PKE9@ id{Jorg/w3c/dom/Attr.classPKE9@'q&Jorg/w3c/dom/CDATASection.classPKE9@[ ByJorg/w3c/dom/CharacterData.classPKE9@яu2Jorg/w3c/dom/Comment.classPKE9@dž~"Jorg/w3c/dom/DOMConfiguration.classPKE9@f=L&rJorg/w3c/dom/html/HTMLFormElement.classPKE9@# |O~'Jorg/w3c/dom/html/HTMLFrameElement.classPKE9@K.A#*Jorg/w3c/dom/html/HTMLFrameSetElement.classPKE9@v$Jorg/w3c/dom/html/HTMLHRElement.classPKE9@Kp&Jorg/w3c/dom/html/HTMLHeadElement.classPKE9@Av)Jorg/w3c/dom/html/HTMLHeadingElement.classPKE9@/&Jorg/w3c/dom/html/HTMLHtmlElement.classPKE9@XV(Jorg/w3c/dom/html/HTMLIFrameElement.classPKE9@65_a'Jorg/w3c/dom/html/HTMLImageElement.classPKE9@ '[Jorg/w3c/dom/html/HTMLInputElement.classPKE9@f:)Jorg/w3c/dom/html/HTMLIsIndexElement.classPKE9@~כ&$Jorg/w3c/dom/html/HTMLLIElement.classPKE9@Hf'֏Jorg/w3c/dom/html/HTMLLabelElement.classPKE9@d~d(Jorg/w3c/dom/html/HTMLLegendElement.classPKE9@r>P1<&;Jorg/w3c/dom/html/HTMLLinkElement.classPKE9@>.%Jorg/w3c/dom/html/HTMLMapElement.classPKE9@×t&۔Jorg/w3c/dom/html/HTMLMenuElement.classPKE9@LͰw&ΕJorg/w3c/dom/html/HTMLMetaElement.classPKE9@ߋn!%Jorg/w3c/dom/html/HTMLModElement.classPKE9@a>fc'Jorg/w3c/dom/html/HTMLOListElement.classPKE9@4(UJorg/w3c/dom/html/HTMLObjectElement.classPKE9@Ε:*Jorg/w3c/dom/html/HTMLOptGroupElement.classPKE9@E.&(Jorg/w3c/dom/html/HTMLOptionElement.classPKE9@irϰ+4Jorg/w3c/dom/html/HTMLParagraphElement.classPKE9@q'=Jorg/w3c/dom/html/HTMLParamElement.classPKE9@%gJorg/w3c/dom/html/HTMLPreElement.classPKE9@) 'YJorg/w3c/dom/html/HTMLQuoteElement.classPKE9@'(WJorg/w3c/dom/html/HTMLScriptElement.classPKE9@qD9(Jorg/w3c/dom/html/HTMLSelectElement.classPKE9@(ȗX'Jorg/w3c/dom/html/HTMLStyleElement.classPKE9@E ` .Jorg/w3c/dom/html/HTMLTableCaptionElement.classPKE9@{Ґ.+Jorg/w3c/dom/html/HTMLTableCellElement.classPKE9@p4*٩Jorg/w3c/dom/html/HTMLTableColElement.classPKE9@O1'9Jorg/w3c/dom/html/HTMLTableElement.classPKE9@t:G`*Jorg/w3c/dom/html/HTMLTableRowElement.classPKE9@.),!.)Jorg/w3c/dom/html/HTMLTableSectionElement.classPKE9@H<*Jorg/w3c/dom/html/HTMLTextAreaElement.classPKE9@44ة'Jorg/w3c/dom/html/HTMLTitleElement.classPKE9@r0'Jorg/w3c/dom/html/HTMLUListElement.classPKIG@Jorg/w3c/dom/ls/PKE9@F(Jorg/w3c/dom/ls/DOMImplementationLS.classPKE9@-E? RJorg/w3c/dom/ls/LSException.classPKE9@|}O߷Jorg/w3c/dom/ls/LSInput.classPKE9@ xJorg/w3c/dom/ls/LSLoadEvent.classPKE9@W)sJorg/w3c/dom/ls/LSOutput.classPKE9@X0-Jorg/w3c/dom/ls/LSParser.classPKE9@t#Jorg/w3c/dom/ls/LSParserFilter.classPKE9@_ $$Jorg/w3c/dom/ls/LSProgressEvent.classPKE9@b)Y'3Jorg/w3c/dom/ls/LSResourceResolver.classPKE9@D'E!Jorg/w3c/dom/ls/LSSerializer.classPKE9@Y'Jorg/w3c/dom/ls/LSSerializerFilter.classPKIG@Jorg/w3c/dom/ranges/PKE9@lAȆ&Jorg/w3c/dom/ranges/DocumentRange.classPKE9@V$Q*Jorg/w3c/dom/ranges/Range.classPKE9@'hY 'Jorg/w3c/dom/ranges/RangeException.classPKIG@Jorg/w3c/dom/stylesheets/PKE9@/a+Jorg/w3c/dom/stylesheets/DocumentStyle.classPKE9@{'Jorg/w3c/dom/stylesheets/LinkStyle.classPKE9@eG'Jorg/w3c/dom/stylesheets/MediaList.classPKE9@P(Jorg/w3c/dom/stylesheets/StyleSheet.classPKE9@5|=,PJorg/w3c/dom/stylesheets/StyleSheetList.classPKIG@FJorg/w3c/dom/traversal/PKE9@YY}-Jorg/w3c/dom/traversal/DocumentTraversal.classPKE9@odK!&Jorg/w3c/dom/traversal/NodeFilter.classPKE9@_]l(Jorg/w3c/dom/traversal/NodeIterator.classPKE9@17 &Jorg/w3c/dom/traversal/TreeWalker.classPKIG@Jorg/w3c/dom/views/PKE9@݉$Jorg/w3c/dom/views/AbstractView.classPKE9@fN$Jorg/w3c/dom/views/DocumentView.classPKIG@Jorg/w3c/dom/xpath/PKE9@5&Jorg/w3c/dom/xpath/XPathEvaluator.classPKE9@BIN&Jorg/w3c/dom/xpath/XPathException.classPKE9@ Γ'Jorg/w3c/dom/xpath/XPathExpression.classPKE9@7'Jorg/w3c/dom/xpath/XPathNSResolver.classPKE9@m &vJorg/w3c/dom/xpath/XPathNamespace.classPKE9@vw-#Jorg/w3c/dom/xpath/XPathResult.classPKIG@Jorg/xml/PKIG@ Jorg/xml/sax/PKE9@ ),BJorg/xml/sax/AttributeList.classPKE9@8sZJorg/xml/sax/Attributes.classPKE9@a/n Jorg/xml/sax/ContentHandler.classPKE9@#nRJorg/xml/sax/DTDHandler.classPKE9@}:WGi!dJorg/xml/sax/DocumentHandler.classPKE9@K# Jorg/xml/sax/EntityResolver.classPKE9@W~ Jorg/xml/sax/ErrorHandler.classPKE9@:$R Jorg/xml/sax/HandlerBase.classPKE9@_iuJorg/xml/sax/InputSource.classPKE9@5IJJorg/xml/sax/Locator.classPKE9@dÙ;KJorg/xml/sax/Parser.classPKE9@uU}M(Jorg/xml/sax/SAXException.classPKE9@Ɉ +Jorg/xml/sax/SAXNotRecognizedException.classPKE9@陆 *'Jorg/xml/sax/SAXNotSupportedException.classPKE9@A A#Jorg/xml/sax/SAXParseException.classPKE9@! #Jorg/xml/sax/XMLFilter.classPKE9@Ia]MJorg/xml/sax/XMLReader.classPKIG@Jorg/xml/sax/ext/PKE9@#-D)!Jorg/xml/sax/ext/Attributes2.classPKE9@GH%Jorg/xml/sax/ext/Attributes2Impl.classPKE9@5X!%Jorg/xml/sax/ext/DeclHandler.classPKE9@%RK%\Jorg/xml/sax/ext/DefaultHandler2.classPKE9@C6%Korg/xml/sax/ext/EntityResolver2.classPKE9@$Korg/xml/sax/ext/LexicalHandler.classPKE9@4?S%Korg/xml/sax/ext/Locator2.classPKE9@@vO"Korg/xml/sax/ext/Locator2Impl.classPKIG@Korg/xml/sax/helpers/PKE9@eeZ!+ Korg/xml/sax/helpers/AttributeListImpl.classPKE9@_ ( Korg/xml/sax/helpers/AttributesImpl.classPKE9@T`W ( Korg/xml/sax/helpers/DefaultHandler.classPKE9@`%Korg/xml/sax/helpers/LocatorImpl.classPKE9@F*Korg/xml/sax/helpers/NamespaceSupport.classPKE9@f 'Korg/xml/sax/helpers/ParserAdapter.classPKE9@}*u'Korg/xml/sax/helpers/ParserFactory.classPKE9@Q"'Korg/xml/sax/helpers/XMLFilterImpl.classPKE9@ol *!!Korg/xml/sax/helpers/XMLReaderAdapter.classPKE9@?eHZ*%Korg/xml/sax/helpers/XMLReaderFactory.classPKIG@&Ksun/PKIG@&Ksun/awt/PKE9@%MA$'Ksun/awt/CausedFocusEvent$Cause.classPKE9@\`iF+Ksun/awt/CausedFocusEvent.classPKIG@ .-Ksun/java2d/PKIG@i-Ksun/java2d/pipe/PKE9@lJ^;-Ksun/java2d/pipe/Region.classPKE9@$wl$Q3Ksun/java2d/pipe/RegionIterator.classPKE9@MaV"5Ksun/java2d/pipe/SpanIterator.classPK 26Kolsrd-0.6.6.2/lib/pud/wireformat-java/src/000077500000000000000000000000001234304727700202425ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/000077500000000000000000000000001234304727700211665ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/c/000077500000000000000000000000001234304727700214105ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/c/org_olsr_plugin_pud_ClusterLeader.c000066400000000000000000000055031234304727700304510ustar00rootroot00000000000000#include "org_olsr_plugin_pud_ClusterLeader.h" #include "util.h" /* * Class: org_olsr_plugin_pud_ClusterLeader * Method: getClusterLeaderVersion * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_ClusterLeader_getClusterLeaderVersion (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); uint8_t version = getClusterLeaderVersion( getClusterLeaderMessage(uplinkMessage)); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (jint) version; } /* * Class: org_olsr_plugin_pud_ClusterLeader * Method: getClusterLeaderValidityTime * Signature: ()J */ JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_ClusterLeader_getClusterLeaderValidityTime (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); unsigned long validityTime = getValidityTime( &getClusterLeaderMessage(uplinkMessage)->validityTime); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (jlong) validityTime; } /* * Class: org_olsr_plugin_pud_ClusterLeader * Method: getClusterLeaderOriginator * Signature: ()Ljava/net/InetAddress; */ JNIEXPORT jobject JNICALL Java_org_olsr_plugin_pud_ClusterLeader_getClusterLeaderOriginator (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); jobject object; bool ipv4 = !getUplinkMessageIPv6(&uplinkMessage->header); union olsr_ip_addr * addr; if (ipv4) { addr = (union olsr_ip_addr *) &uplinkMessage->msg.clusterLeader.leader.v4.originator; } else { addr = (union olsr_ip_addr *) &uplinkMessage->msg.clusterLeader.leader.v6.originator; } constructIPAddress(env, ipv4, addr, &object); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return object; } /* * Class: org_olsr_plugin_pud_ClusterLeader * Method: getClusterLeaderClusterLeader * Signature: ()Ljava/net/InetAddress; */ JNIEXPORT jobject JNICALL Java_org_olsr_plugin_pud_ClusterLeader_getClusterLeaderClusterLeader (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); jobject object; bool ipv4 = !getUplinkMessageIPv6(&uplinkMessage->header); union olsr_ip_addr * addr; if (ipv4) { addr = (union olsr_ip_addr *) &uplinkMessage->msg.clusterLeader.leader.v4.clusterLeader; } else { addr = (union olsr_ip_addr *) &uplinkMessage->msg.clusterLeader.leader.v6.clusterLeader; } constructIPAddress(env, ipv4, addr, &object); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return object; } olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/c/org_olsr_plugin_pud_PositionUpdate.c000066400000000000000000000211661234304727700306650ustar00rootroot00000000000000#include "org_olsr_plugin_pud_PositionUpdate.h" #include "util.h" #include /* * OLSR header */ /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getOlsrMessageOriginator * Signature: ()Ljava/net/InetAddress; */ JNIEXPORT jobject JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getOlsrMessageOriginator (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); jobject object; bool ipv4 = !getUplinkMessageIPv6(&uplinkMessage->header); union olsr_ip_addr * addr; if (ipv4) { addr = (union olsr_ip_addr *) &uplinkMessage->msg.olsrMessage.v4.originator; } else { addr = (union olsr_ip_addr *) &uplinkMessage->msg.olsrMessage.v6.originator; } constructIPAddress(env, ipv4, addr, &object); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return object; } /* * PudOlsrPositionUpdate */ /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getPositionUpdateVersion * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateVersion (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); uint8_t version = getPositionUpdateVersion( getPositionUpdateMessage(uplinkMessage)); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (jint) version; } /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getPositionUpdateValidityTime * Signature: ()J */ JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateValidityTime (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); unsigned long validityTime = getValidityTime( &getPositionUpdateMessage(uplinkMessage)->validityTime); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (jlong) validityTime; } /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getPositionUpdateSMask * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateSMask (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); uint8_t smask = getPositionUpdateSmask( getPositionUpdateMessage(uplinkMessage)); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (jint) smask; } /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getPositionUpdateFlags * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateFlags (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); uint8_t flags = getPositionUpdateFlags( getPositionUpdateMessage(uplinkMessage)); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (jint) flags; } /* * GpsInfo */ /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getPositionUpdateTime * Signature: (JJ)J */ JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateTime (JNIEnv * env, jobject this, jlong baseDate, jlong timezoneOffset) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); jlong baseDateSeconds = baseDate / 1000LL; jlong baseDateMilliSeconds = baseDate % 1000LL; struct tm timeStruct; time_t updateTimeSeconds; getPositionUpdateTime(getPositionUpdateMessage(uplinkMessage), baseDateSeconds, &timeStruct); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); updateTimeSeconds = mktime(&timeStruct); return (updateTimeSeconds * 1000LL) + baseDateMilliSeconds - timezoneOffset; } /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getPositionUpdateLatitude * Signature: ()D */ JNIEXPORT jdouble JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateLatitude (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); double lat = getPositionUpdateLatitude( getPositionUpdateMessage(uplinkMessage)); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (jdouble) lat; } /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getPositionUpdateLongitude * Signature: ()D */ JNIEXPORT jdouble JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateLongitude (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); double lon = getPositionUpdateLongitude( getPositionUpdateMessage(uplinkMessage)); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (jdouble) lon; } /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getPositionUpdateAltitude * Signature: ()J */ JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateAltitude (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); long alt = getPositionUpdateAltitude( getPositionUpdateMessage(uplinkMessage)); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (jlong) alt; } /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getPositionUpdateSpeed * Signature: ()J */ JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateSpeed (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); unsigned long speed = getPositionUpdateSpeed( getPositionUpdateMessage(uplinkMessage)); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (jlong) speed; } /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getPositionUpdateTrack * Signature: ()J */ JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateTrack (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); unsigned long track = getPositionUpdateTrack( getPositionUpdateMessage(uplinkMessage)); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (jlong) track; } /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getPositionUpdateHdop * Signature: ()D */ JNIEXPORT jdouble JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateHdop (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); double hdop = getPositionUpdateHdop(getPositionUpdateMessage(uplinkMessage)); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (jdouble) hdop; } /* * NodeInfo */ /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getPositionUpdateNodeIdType * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateNodeIdType (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); NodeIdType nodeIdType = getPositionUpdateNodeIdType( !getUplinkMessageIPv6(&uplinkMessage->header) ? AF_INET : AF_INET6, getPositionUpdateMessage(uplinkMessage)); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (jint) nodeIdType; } /* * Class: org_olsr_plugin_pud_PositionUpdate * Method: getPositionUpdateNodeId * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateNodeId (JNIEnv * env, jobject this) { jobject dataObject; jboolean isCopy; UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject, &isCopy); const char * nodeIdStr; char nodeIdStrBuffer[PUD_TX_NODEID_BUFFERSIZE]; getNodeIdStringFromOlsr ( !getUplinkMessageIPv6(&uplinkMessage->header) ? AF_INET : AF_INET6, &uplinkMessage->msg.olsrMessage, &nodeIdStr, &nodeIdStrBuffer[0], sizeof(nodeIdStrBuffer)); releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT); return (*env)->NewStringUTF(env, nodeIdStr); } olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/c/org_olsr_plugin_pud_UplinkMessage.c000066400000000000000000000021141234304727700304550ustar00rootroot00000000000000#include "org_olsr_plugin_pud_UplinkMessage.h" #include /* * Uplink Message Types */ /* * Class: org_olsr_plugin_pud_UplinkMessage * Method: getUplinkMessageTypePosition * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_UplinkMessage_getUplinkMessageTypePosition (JNIEnv * env __attribute__ ((unused)), jclass this __attribute__ ((unused))) { return (jint) POSITION; } /* * Class: org_olsr_plugin_pud_UplinkMessage * Method: getUplinkMessageTypeClusterLeader * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_UplinkMessage_getUplinkMessageTypeClusterLeader (JNIEnv * env __attribute__ ((unused)), jclass this __attribute__ ((unused))) { return (jint) CLUSTERLEADER; } /* * Class: org_olsr_plugin_pud_UplinkMessage * Method: getUplinkMessageHeaderLength * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_UplinkMessage_getUplinkMessageHeaderLength (JNIEnv * env __attribute__ ((unused)), jclass this __attribute__ ((unused))) { return (jint)sizeof(UplinkHeader); } olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/c/util.h000066400000000000000000000057441234304727700225500ustar00rootroot00000000000000#ifndef _Included_org_olsr_plugin_pud_UplinkMessage #define _Included_org_olsr_plugin_pud_UplinkMessage #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include #include #include /* * Helpers */ /* get the uplink message (a byte array) from the java object */ static inline UplinkMessage * getUplinkMessage(JNIEnv * env, jobject this, jobject * dataObject, jboolean * isCopy) { UplinkMessage * uplinkMessage; jclass clazz = (*env)->GetObjectClass(env, this); jfieldID fid = (*env)->GetFieldID(env, clazz, "data", "[B"); *dataObject = (*env)->GetObjectField(env, this, fid); uplinkMessage = (UplinkMessage *) ((*env)->GetByteArrayElements(env, *dataObject, isCopy)); return uplinkMessage; } /* release (when it is a copy) the uplink message (a byte array) that was * retrieved from the java object * * mode = 0 (copy back + free) * JNI_COMMIT (copy back + do not free) * JNI_ABORT (do not copy back + free) */ static inline void releaseUplinkMessage(JNIEnv * env, UplinkMessage * uplinkMessage, jobject dataObject, jboolean isCopy, jint mode) { if (isCopy == JNI_TRUE) { (*env)->ReleaseByteArrayElements(env, dataObject, (jbyte *) uplinkMessage, mode); } } static inline PudOlsrPositionUpdate * getPositionUpdateMessage( UplinkMessage * uplinkMessage) { return getOlsrMessagePayload( !getUplinkMessageIPv6(&uplinkMessage->header) ? AF_INET : AF_INET6, &uplinkMessage->msg.olsrMessage); } static inline UplinkClusterLeader * getClusterLeaderMessage( UplinkMessage * uplinkMessage) { return &uplinkMessage->msg.clusterLeader; } static inline void constructIPAddress(JNIEnv * env, bool ipv4, union olsr_ip_addr * addr, jobject * object) { if (ipv4) { /* object = new Inet4Address(NULL, originator); */ jclass clazz = (*env)->FindClass(env, "java/net/Inet4Address"); jmethodID mid = (*env)->GetMethodID(env, clazz, "", "(Ljava/lang/String;I)V"); *object = (*env)->NewObject(env, clazz, mid, NULL, ntohl(addr->v4.s_addr)); } else { jboolean isCopy; jfieldID fid; jobject ipaddressObject; jbyte * ipaddressByteArray; /* object = new Inet6Address(); */ jclass clazz = (*env)->FindClass(env, "java/net/Inet6Address"); jmethodID mid = (*env)->GetMethodID(env, clazz, "", "()V"); *object = (*env)->NewObject(env, clazz, mid); /* ipaddressByteArray = &object->ipaddress[0] (might be a copy) */ fid = (*env)->GetFieldID(env, clazz, "ipaddress", "[B"); ipaddressObject = (*env)->GetObjectField(env, *object, fid); ipaddressByteArray = ((*env)->GetByteArrayElements(env, ipaddressObject, &isCopy)); /* copy the IP address into the byte array */ memcpy(ipaddressByteArray, &addr->v6, sizeof(struct in6_addr)); /* commit when needed */ if (isCopy == JNI_TRUE) { (*env)->ReleaseByteArrayElements(env, ipaddressObject, ipaddressByteArray, 0); } } } #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _Included_org_olsr_plugin_pud_UplinkMessage */ olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/java/000077500000000000000000000000001234304727700221075ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/java/org/000077500000000000000000000000001234304727700226765ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/java/org/olsr/000077500000000000000000000000001234304727700236555ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/java/org/olsr/plugin/000077500000000000000000000000001234304727700251535ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/java/org/olsr/plugin/pud/000077500000000000000000000000001234304727700257435ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/java/org/olsr/plugin/pud/ClusterLeader.java000066400000000000000000000023371234304727700313510ustar00rootroot00000000000000package org.olsr.plugin.pud; import java.net.InetAddress; /** * This class represents an uplink message, type cluster leader. */ public class ClusterLeader extends UplinkMessage { private static final long serialVersionUID = -1425806435563378359L; /** * Default constructor */ public ClusterLeader() { super(); } /** * Constructor * * @param data * the received message * @param dataSize * the number of bytes in the received message */ public ClusterLeader(byte[] data, int dataSize) { super(data, dataSize); } /* * UplinkClusterLeader */ /** * @return the version of the cluster leader message */ public native int getClusterLeaderVersion(); /** * @return the validity time (in seconds) of the cluster leader message */ public native long getClusterLeaderValidityTime(); /** * @return the (OLSR main) IP address of the OLSR node that sent the cluster * leader message */ public native InetAddress getClusterLeaderOriginator(); /** * @return the (OLSR main) IP address of the OLSR node that is the cluster * leader for the OLSR node that sent the cluster leader message */ public native InetAddress getClusterLeaderClusterLeader(); } olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/java/org/olsr/plugin/pud/LibraryLoader.java000066400000000000000000000005431234304727700313430ustar00rootroot00000000000000package org.olsr.plugin.pud; public class LibraryLoader { static private boolean loaded = false; /* Load uplink message handling library */ static void load() { if (!loaded) { try { System.loadLibrary(WireFormatConstants.LibraryName); loaded = true; } catch (Throwable e) { throw new ExceptionInInitializerError(e); } } } } olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/java/org/olsr/plugin/pud/PositionUpdate.java000066400000000000000000000055541234304727700315660ustar00rootroot00000000000000package org.olsr.plugin.pud; import java.net.InetAddress; import java.util.Date; /** * This class represents an uplink message, type position update. */ public class PositionUpdate extends UplinkMessage { private static final long serialVersionUID = -7253852907534653248L; /** * Default constructor */ public PositionUpdate() { super(); } /** * Constructor * * @param data * the received message * @param dataSize * the number of bytes in the received message */ public PositionUpdate(byte[] data, int dataSize) { super(data, dataSize); } /* * OLSR header */ /** * @return the (OLSR main) IP address of the OLSR node that sent the uplink * message */ public native InetAddress getOlsrMessageOriginator(); /* * PudOlsrPositionUpdate */ /** * @return the version of the position update message */ public native int getPositionUpdateVersion(); /** * @return the validity time (in seconds) the position update message */ public native long getPositionUpdateValidityTime(); /** * @return the content mask the position update message */ public native int getPositionUpdateSMask(); /** * @return the content flags the position update message */ public native int getPositionUpdateFlags(); /* * GpsInfo */ /** * @param baseDate * the base date relative to which the time of the position * update message must be determined (milliseconds since Epoch) * @param timezoneOffset * the offset (in milliseconds) of the local timezone to UTC. A * positive value means 'west of UTC', a negative value means * 'east of UTC'. For CET, this value is -3600000. * @return the time of the position update message (milliseconds since * Epoch, UTC) */ public native long getPositionUpdateTime(long baseDate, long timezoneOffset); /** * @return the latitude (in degrees) of the position update message */ public native double getPositionUpdateLatitude(); /** * @return the longitude (in degrees) of the position update message */ public native double getPositionUpdateLongitude(); /** * @return the altitude (in meters) of the position update message */ public native long getPositionUpdateAltitude(); /** * @return the speed (in kph) of the the position update message */ public native long getPositionUpdateSpeed(); /** * @return the track angle (in degrees) of the position update message */ public native long getPositionUpdateTrack(); /** * @return the HDOP of the position update message */ public native double getPositionUpdateHdop(); /* * NodeInfo */ /** * @return the nodeIdType of the position update message */ public native int getPositionUpdateNodeIdType(); /** * @return the nodeId of the position update message */ public native String getPositionUpdateNodeId(); } olsrd-0.6.6.2/lib/pud/wireformat-java/src/main/java/org/olsr/plugin/pud/UplinkMessage.java000066400000000000000000000061111234304727700313540ustar00rootroot00000000000000package org.olsr.plugin.pud; import java.io.Serializable; /** * This class represents an uplink message. * * It stores the received uplink message in a byte array and provides access * methods for all uplink header fields. */ public abstract class UplinkMessage implements Serializable { private static final long serialVersionUID = -1514460974030674657L; static { LibraryLoader.load(); } /* * Uplink Message Store */ /** the uplink message */ protected byte[] data = null; /** the number of bytes in the received message */ protected int dataSize = 0; /** * Default constructor */ public UplinkMessage() { super(); } /** * Constructor * * @param data * the received message * @param dataSize * the number of bytes in the received message */ public UplinkMessage(byte[] data, int dataSize) { super(); this.data = data; this.dataSize = dataSize; } /* * Getters */ /** * @return the received message */ public final byte[] getData() { return data; } /** * @return the number of bytes in the received message */ public final int getDataSize() { return dataSize; } /* * Uplink Message Types */ /** * @return the uplink message type for a position update */ public static native int getUplinkMessageTypePosition(); /** * @return the uplink message type for a cluster leader message */ public static native int getUplinkMessageTypeClusterLeader(); /* * UplinkHeader */ /** * @return the length of the uplink message header */ public static native int getUplinkMessageHeaderLength(); /** * @param data * the uplink message * @param offset * the offset in the data where the uplink message begins * * @return the uplink message type */ public static int getUplinkMessageType(byte[] data, int offset) { return data[offset]; } /** * @param data * the uplink message * @param offset * the offset in the data where the uplink message begins * * @return the number of bytes in the payload of the uplink message */ public static int getUplinkMessageLength(byte[] data, int offset) { return ((data[offset + 1] << 8) | data[offset + 2]); } /** * @param data * the uplink message * @param offset * the offset in the data where the uplink message begins * * @return true when the contained message is an IPv6 message, false * otherwise (IPv4) */ public static boolean isUplinkMessageIPv6(byte[] data, int offset) { return ((data[offset + 3] & 0x01) != 0); } /** * @return the uplink message type */ public int getUplinkMessageType() { return UplinkMessage.getUplinkMessageType(data, 0); } /** * @return the number of bytes in the payload of the uplink message */ public int getUplinkMessageLength() { return UplinkMessage.getUplinkMessageLength(data, 0); } /** * @return true when the contained message is an IPv6 message, false * otherwise (IPv4) */ public boolean isUplinkMessageIPv6() { return UplinkMessage.isUplinkMessageIPv6(data, 0); } } olsrd-0.6.6.2/lib/pud/wireformat/000077500000000000000000000000001234304727700165345ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat/.gitignore000066400000000000000000000000161234304727700205210ustar00rootroot00000000000000/build/ /lib/ olsrd-0.6.6.2/lib/pud/wireformat/Makefile000066400000000000000000000045711234304727700202030ustar00rootroot00000000000000include Makefile.inc include ../Makefile.inc OLSRD_PLUGIN = false TOPDIR = ../../.. include $(TOPDIR)/Makefile.inc LDFLAGS = -shared -Wl,--warn-common -fPIC # 32/64 cross compilation ifdef M32 CFLAGS += -m32 LDFLAGS += -m32 endif ifdef M64 CFLAGS += -m64 LDFLAGS += -m64 endif ###################### # # Settings # ###################### DESTDIR ?= USRDIR ?= $(DESTDIR)/usr INCLUDEDIR ?= $(DESTDIR)/usr/include LIBDIR ?= $(USRDIR)/lib BUILD_DIR = build LIBDIR_BUILD = lib INC_DIR_BASE_C = ./include INC_DIR_C = $(INC_DIR_BASE_C)/$(PROJECT) INC_DIR_OLSRD = ../../../src MODULES = nodeIdConversion wireFormat SRC_DIR_C = src OBJECTS_C = $(MODULES:%=$(BUILD_DIR)/%.o) INCLUDES = -I "$(INC_DIR_BASE_C)" -I "$(INC_DIR_OLSRD)" LIBRARIES = -lm .PHONY: all default_target prepare clean doc doc-clean install install-headers uninstall uninstall-headers # # Targets # all: default_target default_target: prepare $(LIBDIR_BUILD)/$(SONAME) $(LIBDIR_BUILD)/$(SONAME): $(OBJECTS_C) ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -Wl,-soname=$(SONAME) $(LIBRARIES) -o "$@" $(OBJECTS_C) $(BUILD_DIR)/%.o: $(SRC_DIR_C)/%.c $(INC_DIR_C)/compiler.h ifeq ($(VERBOSE),0) @echo "[CC] $<" endif $(MAKECMDPREFIX)$(CC) $(CFLAGS) $(CPPFLAGS) $(INCLUDES) -c -o "$@" "$<" .gitignore: ifeq ($(VERBOSE),0) @echo "[$@]" endif $(MAKECMDPREFIX)echo "/$(BUILD_DIR)/" > $@ $(MAKECMDPREFIX)echo "/$(LIBDIR_BUILD)/" >> $@ $(MAKECMDPREFIX)$(MAKE) -C doc $@ # # Phony Targets # prepare: $(MAKECMDPREFIX)mkdir -p "$(BUILD_DIR)" "$(LIBDIR_BUILD)" clean: doc-clean ifeq ($(VERBOSE),0) @echo "[$@]" endif $(MAKECMDPREFIX)rm -fr "$(BUILD_DIR)" "$(LIBDIR_BUILD)" "$(SRC_DIR_C)/"*.d doc: $(MAKECMDPREFIX)$(MAKE) -C doc all doc-clean: $(MAKECMDPREFIX)$(MAKE) -C doc clean install: all mkdir -v -p "$(LIBDIR)" cp "$(LIBDIR_BUILD)/$(SONAME)" "$(LIBDIR)/$(SONAME).$(PLUGIN_VER)" $(STRIP) "$(LIBDIR)/$(SONAME).$(PLUGIN_VER)" /sbin/ldconfig -n "$(LIBDIR)" install-headers: rm -fr "$(INCLUDEDIR)/$(PROJECT)" mkdir -v -p "$(INCLUDEDIR)/$(PROJECT)" cp -t "$(INCLUDEDIR)/$(PROJECT)" $(INC_DIR_C)/*.h uninstall: rm -f "$(LIBDIR)/$(SONAME)" \ "$(LIBDIR)/$(SONAME).$(PLUGIN_VER)" /sbin/ldconfig -n "$(LIBDIR)" rmdir -v -p --ignore-fail-on-non-empty \ "$(LIBDIR)" uninstall-headers: rm -fr "$(INCLUDEDIR)/$(PROJECT)/"*.h rmdir -v -p --ignore-fail-on-non-empty \ "$(INCLUDEDIR)/$(PROJECT)" olsrd-0.6.6.2/lib/pud/wireformat/Makefile.inc000066400000000000000000000003211234304727700207400ustar00rootroot00000000000000###################### # # Highlevel configuration options for all # # PROJECT = OlsrdPudWireFormat LIBNAME = lib$(PROJECT) SONAME = $(LIBNAME).so # activate debugging with 1 or deactivate with 0 DEBUG ?= 1 olsrd-0.6.6.2/lib/pud/wireformat/doc/000077500000000000000000000000001234304727700173015ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat/doc/.gitignore000066400000000000000000000001031234304727700212630ustar00rootroot00000000000000/html/ /man/ /latex/ /doxygen.conf.temp /libOlsrdPudWireFormat.pdf olsrd-0.6.6.2/lib/pud/wireformat/doc/Makefile000066400000000000000000000020661234304727700207450ustar00rootroot00000000000000include ../Makefile.inc include ../../Makefile.inc HTML_DIR = html MAN_DIR = man LATEX_DIR = latex PDF_NAME = $(LIBNAME).pdf DOX_FILE = doxygen.conf TMP_DOX_FILE = $(DOX_FILE).temp .PHONY: .gitignore all clean .gitignore: ifeq ($(VERBOSE),0) @echo "[$@]" endif $(MAKECMDPREFIX)echo "/$(HTML_DIR)/" > $@ $(MAKECMDPREFIX)echo "/$(MAN_DIR)/" >> $@ $(MAKECMDPREFIX)echo "/$(LATEX_DIR)/" >> $@ $(MAKECMDPREFIX)echo "/$(TMP_DOX_FILE)" >> $@ $(MAKECMDPREFIX)echo "/$(PDF_NAME)" >> $@ all: clean $(DOX_FILE) ifeq ($(VERBOSE),0) @echo "[$@]" endif $(MAKECMDPREFIX)sed \ -e "s/__PLUGIN_VER__/$(PLUGIN_VER)/" \ -e "s/__LIBNAME__/$(LIBNAME)/" \ "$(DOX_FILE)" > "$(TMP_DOX_FILE)" $(MAKECMDPREFIX)doxygen "$(TMP_DOX_FILE)" $(MAKECMDPREFIX)rm "$(TMP_DOX_FILE)" $(MAKECMDPREFIX)$(MAKE) -s -C $(LATEX_DIR) all > /dev/null 2>&1 $(MAKECMDPREFIX)mv "$(LATEX_DIR)/refman.pdf" "$(PDF_NAME)" $(MAKECMDPREFIX)rm -fr "$(LATEX_DIR)" clean: ifeq ($(VERBOSE),0) echo "[$@]" endif $(MAKECMDPREFIX)rm -fr "$(HTML_DIR)" "$(LATEX_DIR)" "$(MAN_DIR)" "$(TMP_DOX_FILE)" "$(PDF_NAME)" olsrd-0.6.6.2/lib/pud/wireformat/doc/doxygen.conf000066400000000000000000002252751234304727700216420ustar00rootroot00000000000000# Doxyfile 1.8.1.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = "__LIBNAME__" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = "__PLUGIN_VER__" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 2 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all # comments according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you # can mix doxygen, HTML, and XML commands with Markdown formatting. # Disable only in case of backward compatibilities issues. MARKDOWN_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields will be shown inline in the documentation # of the scope in which they are defined (i.e. file, namespace, or group # documentation), provided this scope is documented. If set to NO (the default), # structs, classes, and unions are shown on a separate page (for HTML and Man # pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. SYMBOL_CACHE_SIZE = 0 # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # their name and scope. Since this can be an expensive process and often the # same symbol appear multiple times in the code, doxygen keeps a cache of # pre-resolved symbols. If the cache is too small doxygen will become slower. # If the cache is too large, memory is wasted. The cache size is given by this # formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = YES # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. CITE_BIB_FILES = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../src \ ../include # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.c \ *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C, C++ and Fortran comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 2 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # style sheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of # entries shown in the various tree structured indices initially; the user # can expand and collapse entries dynamically later on. Doxygen will expand # the tree to such a level that at most the specified number of entries are # visible (unless a fully collapsed tree already exceeds this amount). # So setting the number of entries 1 will produce a full collapsed tree by # default. 0 is a special value representing an infinite number of entries # and will result in a full expanded tree by default. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = __LIBNAME__.chm # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = YES # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = YES # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you may also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to # the MathJax Content Delivery Network so you can quickly see the result without # installing MathJax. # However, it is strongly recommended to install a local # copy of MathJax from http://www.mathjax.org before deployment. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = YES # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # http://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = YES # Load style sheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = YES # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = YES #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = "__attribute__(x)=" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. For each # tag file the location of the external documentation should be added. The # format of a tag file without this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths # or URLs. Note that each tag file must have a unique name (where the name does # NOT include the path). If a tag file is not located in the directory in which # doxygen is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You need to make sure dot is able to find # the font, which can be done by putting it in a standard location or by setting # the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the # directory containing the font. DOT_FONTNAME = FreeSans.ttf # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If the UML_LOOK tag is enabled, the fields and methods are shown inside # the class node. If there are many fields or methods and many nodes the # graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS # threshold limits the number of items for each type to make the size more # managable. Set this to 0 for no limit. Note that the threshold may be # exceeded by 50% before the limit is enforced. UML_LIMIT_NUM_FIELDS = 10 # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = YES # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = YES # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES olsrd-0.6.6.2/lib/pud/wireformat/include/000077500000000000000000000000001234304727700201575ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat/include/OlsrdPudWireFormat/000077500000000000000000000000001234304727700237135ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat/include/OlsrdPudWireFormat/compiler.h000066400000000000000000000010661234304727700257010ustar00rootroot00000000000000#ifndef _PUD_COMPILER_H_ #define _PUD_COMPILER_H_ /** Compiler hint to expect x */ #ifndef likely # if defined(__GNUC__) # define likely(x) __builtin_expect((x),1) # else /* defined(__GNUC__) */ # define likely(x) (x) # endif /* defined(__GNUC__) */ #endif /* likely */ /** Compiler hint to not expect x */ #ifndef unlikely # if defined(__GNUC__) # define unlikely(x) __builtin_expect((x),0) # else /* defined(__GNUC__) */ # define unlikely(x) (x) # endif /* defined(__GNUC__) */ #endif /* unlikely */ #endif /* _PUD_COMPILER_H_ */ olsrd-0.6.6.2/lib/pud/wireformat/include/OlsrdPudWireFormat/nodeIdConversion.h000066400000000000000000000015121234304727700273330ustar00rootroot00000000000000#ifndef _PUD_NODEIDCONVERSION_H_ #define _PUD_NODEIDCONVERSION_H_ #include void getNodeTypeStringFromOlsr(int ipVersion, PudOlsrPositionUpdate * olsrGpsMessage, char * nodeIdTypeBuffer, int nodeIdTypeBufferSize); void getNodeIdStringFromOlsr(int ipVersion, union olsr_message *olsrMessage, const char **nodeIdStr, char *nodeIdStrBuffer, unsigned int nodeIdStrBufferSize); bool setupNodeIdBinaryMAC(nodeIdBinaryType * nodeIdBinary, unsigned char * mac); bool setupNodeIdBinaryLongLong(nodeIdBinaryType * nodeIdBinary, unsigned long long longValue, size_t bytes); bool setupNodeIdBinaryString(nodeIdBinaryType * nodeIdBinary, char * nodeId, size_t nodeIdLength); bool setupNodeIdBinaryIp(nodeIdBinaryType * nodeIdBinary, void * ip, size_t ipLength); #endif /* _PUD_NODEIDCONVERSION_H_ */ olsrd-0.6.6.2/lib/pud/wireformat/include/OlsrdPudWireFormat/wireFormat.h000066400000000000000000000320751234304727700262120ustar00rootroot00000000000000#ifndef _PUD_WIREFORMAT_H_ #define _PUD_WIREFORMAT_H_ #include "olsr_types.h" #include "olsr_protocol.h" #include #include #include #include #include #include #include #include #include /* * Version */ /** The version of the wire format */ #define PUD_WIRE_FORMAT_VERSION 2 /* * Flags */ /** Flags that the GPS information contains the nodeId */ #define PUD_FLAGS_ID 0x80 /** Flags that the GPS information is originating from a gateway */ #define PUD_FLAGS_GATEWAY 0x40 /* * Time */ /** The number of bits for the time field */ #define PUD_TIME_BITS 17 /* * Latitude */ /** The number of bits for the latitude field */ #define PUD_LATITUDE_BITS 28 /** The maximum size of the string representation of the latitude * sign [0,90] [0,59] dot [0,59] [0,999] (including \0) */ #define PUD_TX_LATITUDE_DIGITS (1 + 2 + 2 + 1 + 2 + 3 + 1) /** The number of decimals of the latitude in the transmit sentence */ #define PUD_TX_LATITUDE_DECIMALS "5" /* * Longitude */ /** The number of bits for the longitude field */ #define PUD_LONGITUDE_BITS 27 /** The maximum size of the string representation of the longitude * sign [0,180] [0,59] dot [0,59] [0,999] (including \0) */ #define PUD_TX_LONGITUDE_DIGITS (1 + 3 + 2 + 1 + 2 + 3 + 1) /** The number of decimals of the longitude in the transmit sentence */ #define PUD_TX_LONGITUDE_DECIMALS "5" /* * Altitude */ /** The number of bits for the altitude field */ #define PUD_ALTITUDE_BITS 16 /** The minimum altitude */ #define PUD_ALTITUDE_MIN (-400) /** The maximum altitude */ #define PUD_ALTITUDE_MAX (((1 << PUD_ALTITUDE_BITS) - 1) + PUD_ALTITUDE_MIN) /** The maximum size of the string representation of the altitude (including \0) */ #define PUD_TX_ALTITUDE_DIGITS (6 + 1) /* * Speed */ /** The number of bits for the speed field */ #define PUD_SPEED_BITS 12 /** The maximum speed value */ #define PUD_SPEED_MAX ((1 << PUD_SPEED_BITS) - 1) /** The maximum size of the string representation of the speed (including \0) */ #define PUD_TX_SPEED_DIGITS (4 + 1) /* * Track */ /** The number of bits for the track angle field */ #define PUD_TRACK_BITS 9 /** The maximum size of the string representation of the track angle (including \0) */ #define PUD_TX_TRACK_DIGITS (3 + 1) /* * HDOP */ /** The number of bits for the HDOP field */ #define PUD_HDOP_BITS 11 /** The HDOP resolution (in m) */ #define PUD_HDOP_RESOLUTION (0.1) /** The maximum HDOP value (in m) */ #define PUD_HDOP_MAX (((1 << PUD_HDOP_BITS) - 1) * PUD_HDOP_RESOLUTION) /** The maximum size of the string representation of the HDOP (including \0) */ #define PUD_TX_HDOP_DIGITS (5 + 1) /** The number of decimals of the HDOP in the transmit sentence */ #define PUD_TX_HDOP_DECIMALS "3" /* * Node ID Type */ /** nodeIdType legal values */ typedef enum _NodeIdType { /** the first id of the globally unique node type IDs */ PUD_NODEIDTYPE_GLOBAL_FIRST = 0, /** MAC address, 48 bits, 6 bytes */ PUD_NODEIDTYPE_MAC = 0, /** MSISDN number, 15 digits, 50 bits, 7 bytes */ PUD_NODEIDTYPE_MSISDN = 1, /** TETRA number, 17 digits, 57 bits, 8 bytes */ PUD_NODEIDTYPE_TETRA = 2, /** DNS name, variable length */ PUD_NODEIDTYPE_DNS = 3, /** IPv4 address, 32 bits, 4 bytes */ PUD_NODEIDTYPE_IPV4 = 4, /** gap 1 */ PUD_NODEIDTYPE_GAP1 = 5, /** IPv6 address, 128 bits, 16 bytes */ PUD_NODEIDTYPE_IPV6 = 6, /** AIS MMSI number, 9 digits, 30 bits, 4 bytes */ PUD_NODEIDTYPE_MMSI = 7, /** URN number, 24 bits, 3 bytes */ PUD_NODEIDTYPE_URN = 8, /** the last id of the globally unique node type IDs */ PUD_NODEIDTYPE_GLOBAL_LAST = PUD_NODEIDTYPE_URN, /** the first id of the locally unique node type IDs */ PUD_NODEIDTYPE_LOCAL_FIRST = 192, /** Brandweer number, 7 digits, 24 bits, 3 bytes */ PUD_NODEIDTYPE_192 = 192, /** Ambulance number, 6 digits, 20 bits, 3 bytes */ PUD_NODEIDTYPE_193 = 193, /** Number in the range [1, 8191], 4 digits, 13 bits, 2 bytes */ PUD_NODEIDTYPE_194 = 194, /** the last id of the locally unique node type IDs */ PUD_NODEIDTYPE_LOCAL_LAST = PUD_NODEIDTYPE_194 } NodeIdType; /** the number of nodeId bytes for PUD_NODEIDTYPE_MAC (IFHWADDRLEN) */ #define PUD_NODEIDTYPE_MAC_BYTES 6 /** the number of nodeId bytes for PUD_NODEIDTYPE_MSISDN */ #define PUD_NODEIDTYPE_MSISDN_BYTES 7 #define PUD_NODEIDTYPE_MSISDN_MIN 0LL #define PUD_NODEIDTYPE_MSISDN_MAX 999999999999999LL /** the number of nodeId bytes for PUD_NODEIDTYPE_TETRA */ #define PUD_NODEIDTYPE_TETRA_BYTES 8 #define PUD_NODEIDTYPE_TETRA_MIN 0LL #define PUD_NODEIDTYPE_TETRA_MAX 99999999999999999LL /** the number of nodeId bytes for PUD_NODEIDTYPE_MMSI */ #define PUD_NODEIDTYPE_MMSI_BYTES 4 #define PUD_NODEIDTYPE_MMSI_MIN 0LL #define PUD_NODEIDTYPE_MMSI_MAX 999999999LL /** the number of nodeId bytes for PUD_NODEIDTYPE_URN */ #define PUD_NODEIDTYPE_URN_BYTES 3 #define PUD_NODEIDTYPE_URN_MIN 0LL #define PUD_NODEIDTYPE_URN_MAX 16777215LL /** the number of nodeId bytes for PUD_NODEIDTYPE_192 */ #define PUD_NODEIDTYPE_192_BYTES 3 #define PUD_NODEIDTYPE_192_MIN 0LL #define PUD_NODEIDTYPE_192_MAX 9999999LL /** the number of nodeId bytes for PUD_NODEIDTYPE_193 */ #define PUD_NODEIDTYPE_193_BYTES 3 #define PUD_NODEIDTYPE_193_MIN 0LL #define PUD_NODEIDTYPE_193_MAX 999999LL /** the number of nodeId bytes for PUD_NODEIDTYPE_194 */ #define PUD_NODEIDTYPE_194_BYTES 2 #define PUD_NODEIDTYPE_194_MIN 1LL #define PUD_NODEIDTYPE_194_MAX 8191LL /** the number of nodeId bytes for PUD_NODEIDTYPE_IPV4 (sizeof(struct in_addr)) */ #define PUD_NODEIDTYPE_IPV4_BYTES 4 /** the number of nodeId bytes for PUD_NODEIDTYPE_IPV6 (sizeof(struct in6_addr)) */ #define PUD_NODEIDTYPE_IPV6_BYTES 16 /** The maximum size of the string representation of the nodeIdType (including \0) */ #define PUD_TX_NODEIDTYPE_DIGITS (3 + 1) /* * Node ID */ /** The maximum size of the string representation of the nodeId (including \0) */ #define PUD_TX_NODEID_BUFFERSIZE 1024 /** The type that is used to store the nodeId as a binary representation along with its length and setup status */ typedef struct _nodeIdBinaryType { bool set; size_t length; union _buffer { unsigned char mac[PUD_NODEIDTYPE_MAC_BYTES]; union olsr_ip_addr ip; unsigned long long longValue; unsigned char stringValue[PUD_TX_NODEID_BUFFERSIZE]; } buffer; } nodeIdBinaryType; /* * Wire Format Structures */ /** Sub-format GPS information, 120 bits = 15 bytes */ typedef struct _GpsInfo { uint32_t time :PUD_TIME_BITS; /**< the number of seconds since midnight, ALWAYS present */ uint32_t lat :PUD_LATITUDE_BITS; /**< latitude */ uint32_t lon :PUD_LONGITUDE_BITS; /**< longitude */ uint32_t alt :PUD_ALTITUDE_BITS; /**< altitude */ uint32_t speed :PUD_SPEED_BITS; /**< speed */ uint32_t track :PUD_TRACK_BITS; /**< track angle */ uint32_t hdop :PUD_HDOP_BITS; /**< HDOP */ }__attribute__((__packed__)) GpsInfo; /** Sub-format Node information, 8 + variable bits = 1 + variable bytes */ typedef struct _NodeInfo { uint8_t nodeIdType; /**< the nodeIdType */ unsigned char nodeId; /**< placeholder for variable length nodeId string */ }__attribute__((__packed__)) NodeInfo; /** Complete format, 8+8+8+120+(8+variable) bits = 18+(1+variable) bytes*/ typedef struct _PudOlsrPositionUpdate { uint8_t version; /**< the version of the sentence */ uint8_t validityTime; /**< the validity time of the sentence */ uint8_t smask; /**< mask signaling the contents of the sentence */ uint8_t flags; /**< mask signaling extra contents of the sentence */ GpsInfo gpsInfo; /**< the GPS information (MANDATORY) */ NodeInfo nodeInfo; /**< placeholder for node information (OPTIONAL) */ }__attribute__((__packed__)) PudOlsrPositionUpdate; /** The size of the wire format, minus the size of the node information */ #define PUD_OLSRWIREFORMATSIZE (sizeof(PudOlsrPositionUpdate) - sizeof(NodeInfo)) /* * Uplink */ /** the types of the uplink messages */ typedef enum _UplinkMessageType { POSITION = 0, CLUSTERLEADER = 1 } UplinkMessageType; /** cluster leader message, 10 bytes (IPv4), 34 bytes (IPv6) */ typedef struct _UplinkClusterLeader { uint8_t version; /**< the version of the message */ uint8_t validityTime; /**< the validity time of the sentence */ union _leader { struct _v4 { struct in_addr originator; struct in_addr clusterLeader; } v4; struct _v6 { struct in6_addr originator; struct in6_addr clusterLeader; } v6; } leader; }__attribute__((__packed__)) UplinkClusterLeader; /** TLV header for uplink messages, 4 bytes */ typedef struct _UplinkHeader { uint8_t type; /**< stores a UplinkMessageType */ uint16_t length; /**< the length of the payload in txBuffer */ uint8_t ipv6 :1; /**< clear when IPv4, set when IPv6 */ uint8_t pad :7; /**< padding to align to 4 bytes */ }__attribute__((__packed__)) UplinkHeader; /** uplink message */ typedef struct _UplinkMessage { UplinkHeader header; /**< the uplink TLV header */ union _msg { /** an olsr message (position update) */ union olsr_message olsrMessage; /** a cluster leader message */ UplinkClusterLeader clusterLeader; } msg; }__attribute__((__packed__)) UplinkMessage; /* ************************************************************************ * FUNCTIONS * ************************************************************************ */ /* * NodeIdType */ bool isValidNodeIdType(unsigned long long nodeIdType); /* * Validity Time */ unsigned long getValidityTime(uint8_t * validityTimeField); void setValidityTime(uint8_t * validityTimeField, unsigned long long validityTime); /* * UplinkHeader */ uint8_t getUplinkMessageType(UplinkHeader * uplinkHeader); void setUplinkMessageType(UplinkHeader * uplinkHeader, uint8_t type); uint16_t getUplinkMessageLength(UplinkHeader * uplinkHeader); void setUplinkMessageLength(UplinkHeader * uplinkHeader, uint16_t length); bool getUplinkMessageIPv6(UplinkHeader * uplinkHeader); void setUplinkMessageIPv6(UplinkHeader * uplinkHeader, bool ipv6); void setUplinkMessagePadding(UplinkHeader * uplinkHeader, uint8_t pad); /* * OLSR header */ unsigned short getOlsrMessageSize(int ipVersion, union olsr_message * olsrMessage); union olsr_ip_addr * getOlsrMessageOriginator(int ipVersion, union olsr_message * olsrMessage); PudOlsrPositionUpdate * getOlsrMessagePayload(int ipVersion, union olsr_message * olsrMessage); /* * PudOlsrPositionUpdate */ uint8_t getPositionUpdateVersion(PudOlsrPositionUpdate * olsrGpsMessage); void setPositionUpdateVersion(PudOlsrPositionUpdate * olsrGpsMessage, uint8_t version); uint8_t getPositionUpdateSmask(PudOlsrPositionUpdate * olsrGpsMessage); void setPositionUpdateSmask(PudOlsrPositionUpdate * olsrGpsMessage, uint8_t smask); uint8_t getPositionUpdateFlags(PudOlsrPositionUpdate * olsrGpsMessage); void setPositionUpdateFlags(PudOlsrPositionUpdate * olsrGpsMessage, uint8_t flags); /* * GpsInfo */ void getPositionUpdateTime(PudOlsrPositionUpdate * olsrGpsMessage, time_t baseDate, struct tm *nowStruct); void setPositionUpdateTime(PudOlsrPositionUpdate * olsrGpsMessage, int hour, int min, int sec); double getPositionUpdateLatitude(PudOlsrPositionUpdate * olsrGpsMessage); void setPositionUpdateLatitude(PudOlsrPositionUpdate * olsrGpsMessage, double latitude); double getPositionUpdateLongitude(PudOlsrPositionUpdate * olsrGpsMessage); void setPositionUpdateLongitude(PudOlsrPositionUpdate * olsrGpsMessage, double longitude); long getPositionUpdateAltitude(PudOlsrPositionUpdate * olsrGpsMessage); void setPositionUpdateAltitude(PudOlsrPositionUpdate * olsrGpsMessage, double altitude); unsigned long getPositionUpdateSpeed(PudOlsrPositionUpdate * olsrGpsMessage); void setPositionUpdateSpeed(PudOlsrPositionUpdate * olsrGpsMessage, double speed); unsigned long getPositionUpdateTrack(PudOlsrPositionUpdate * olsrGpsMessage); void setPositionUpdateTrack(PudOlsrPositionUpdate * olsrGpsMessage, double track); double getPositionUpdateHdop(PudOlsrPositionUpdate * olsrGpsMessage); void setPositionUpdateHdop(PudOlsrPositionUpdate * olsrGpsMessage, double hdop); /* * NodeInfo */ NodeIdType getPositionUpdateNodeIdType(int ipVersion, PudOlsrPositionUpdate * olsrGpsMessage); void setPositionUpdateNodeIdType(PudOlsrPositionUpdate * olsrGpsMessage, NodeIdType nodeIdType); void getPositionUpdateNodeId(int ipVersion, union olsr_message * olsrMessage, unsigned char ** nodeId, unsigned int * nodeIdSize); void setPositionUpdateNodeId(PudOlsrPositionUpdate * olsrGpsMessage, unsigned char * nodeId, unsigned int nodeIdSize, bool padWithNullByte); size_t setPositionUpdateNodeInfo(int ipVersion, PudOlsrPositionUpdate * olsrGpsMessage, unsigned int olsrMessageSize, NodeIdType nodeIdType, unsigned char * nodeId, size_t nodeIdLength); /* * UplinkClusterLeader */ uint8_t getClusterLeaderVersion(UplinkClusterLeader * clusterLeaderMessage); void setClusterLeaderVersion(UplinkClusterLeader * clusterLeaderMessage, uint8_t version); union olsr_ip_addr * getClusterLeaderOriginator(int ipVersion, UplinkClusterLeader * clusterLeaderMessage); union olsr_ip_addr * getClusterLeaderClusterLeader(int ipVersion, UplinkClusterLeader * clusterLeaderMessage); #endif /* _PUD_WIREFORMAT_H_ */ olsrd-0.6.6.2/lib/pud/wireformat/src/000077500000000000000000000000001234304727700173235ustar00rootroot00000000000000olsrd-0.6.6.2/lib/pud/wireformat/src/nodeIdConversion.c000066400000000000000000000161211234304727700227400ustar00rootroot00000000000000#include #include #include #include /* ************************************************************************ * Node Information * ************************************************************************ */ /** Convert the nodeIdType of an OLSR message into a string. @param ipVersion The ip version (AF_INET or AF_INET6) @param olsrGpsMessage A pointer to the position update message. @param nodeIdTypeBuffer A pointer to the buffer in which the nodeIdType string representation is written (the buffer needs to be at least PUD_TX_NODEIDTYPE_DIGITS bytes). When NULL then the nodeIdType string is not written. @param nodeIdTypeBufferSize The size of the nodeIdTypeBuffer. When zero then the nodeIdType string is not written. */ void getNodeTypeStringFromOlsr(int ipVersion, PudOlsrPositionUpdate * olsrGpsMessage, char * nodeIdTypeBuffer, int nodeIdTypeBufferSize) { if (unlikely(!nodeIdTypeBuffer || (nodeIdTypeBufferSize == 0))) { return; } assert(nodeIdTypeBufferSize >= PUD_TX_NODEIDTYPE_DIGITS); /* message has NO nodeId information */ snprintf(&nodeIdTypeBuffer[0], nodeIdTypeBufferSize, "%u", getPositionUpdateNodeIdType(ipVersion, olsrGpsMessage)); return; } /** Get a nodeId number (in string representation), using a certain number of bytes, from the message of an OLSR message. @param buffer A pointer to the buffer that holds the nodeId @param bufferSize The number of bytes used by the number in the buffer @param nodeIdBuffer The buffer in which to place the nodeId number in string representation @param nodeIdBufferSize The size of the nodeIdbuffer @return A pointer to the nodeId string representation (&nodeIdBuffer[0]) */ static char *getNodeIdNumberFromOlsr(unsigned char * buffer, unsigned int bufferSize, char *nodeIdBuffer, socklen_t nodeIdBufferSize) { unsigned long long val = 0; unsigned int i = 0; while (i < bufferSize) { val <<= 8; val += buffer[i]; i++; } snprintf(nodeIdBuffer, nodeIdBufferSize, "%llu", val); return &nodeIdBuffer[0]; } /** Convert the nodeId of an OLSR message into a string. @param ipVersion The ip version (AF_INET or AF_INET6) @param olsrMessage A pointer to the OLSR message. Used to be able to retrieve the IP address of the sender. @param nodeIdStr A pointer to a variable in which to store the pointer to the buffer in which the nodeId string representation is written (the buffer needs to be at least PUD_TX_NODEID_BUFFERSIZE bytes). Not written to when nodeIdStrBuffer or nodeIdStr is NULL or when nodeIdStrBufferSize is zero. Can point to nodeIdStrBuffer or straight into the olsrMessage @param nodeIdStrBuffer A pointer to the buffer in which the nodeId string representation can be written. Not written to when nodeIdStrBuffer or nodeIdStr is NULL or when nodeIdStrBufferSize is zero. @param nodeIdStrBufferSize The size of the nodeIdStrBuffer. When zero then nodeIdStrBuffer and nodeIdStr are not written to. */ void getNodeIdStringFromOlsr(int ipVersion, union olsr_message *olsrMessage, const char **nodeIdStr, char *nodeIdStrBuffer, unsigned int nodeIdStrBufferSize) { PudOlsrPositionUpdate * olsrGpsMessage; unsigned char * nodeId; unsigned int nodeIdSize; if (unlikely(!nodeIdStrBuffer || (nodeIdStrBufferSize == 0) || !nodeIdStr)) { return; } assert(nodeIdStrBufferSize >= PUD_TX_NODEID_BUFFERSIZE); olsrGpsMessage = getOlsrMessagePayload(ipVersion, olsrMessage); getPositionUpdateNodeId(ipVersion, olsrMessage, &nodeId, &nodeIdSize); switch (getPositionUpdateNodeIdType(ipVersion, olsrGpsMessage)) { case PUD_NODEIDTYPE_MAC: /* hardware address */ { assert(nodeIdSize == 6); snprintf(nodeIdStrBuffer, nodeIdStrBufferSize, "%02x:%02x:%02x:%02x:%02x:%02x", nodeId[0], nodeId[1], nodeId[2], nodeId[3], nodeId[4], nodeId[5]); *nodeIdStr = &nodeIdStrBuffer[0]; } break; case PUD_NODEIDTYPE_DNS: /* DNS name */ *nodeIdStr = (char *) nodeId; break; case PUD_NODEIDTYPE_MSISDN: /* an MSISDN number */ case PUD_NODEIDTYPE_TETRA: /* a Tetra number */ case PUD_NODEIDTYPE_MMSI: /* an AIS MMSI number */ case PUD_NODEIDTYPE_URN: /* a URN number */ case PUD_NODEIDTYPE_192: case PUD_NODEIDTYPE_193: case PUD_NODEIDTYPE_194: *nodeIdStr = getNodeIdNumberFromOlsr(nodeId, nodeIdSize, nodeIdStrBuffer, nodeIdStrBufferSize); break; case PUD_NODEIDTYPE_IPV4: /* IPv4 address */ case PUD_NODEIDTYPE_IPV6: /* IPv6 address */ default: /* unsupported */ { void * addr = getOlsrMessageOriginator(ipVersion, olsrMessage); *nodeIdStr = inet_ntop(ipVersion, addr, nodeIdStrBuffer, nodeIdStrBufferSize); } break; } return; } /** Convert a given MAC address to the binary/wireformat representation of it. @param nodeIdBinary a pointer to the buffer in which to store the binary/wireformat representation @param mac a pointer to a buffer in which the MAC address is stored (in network byte-order) @return - true when ok - false on failure */ bool setupNodeIdBinaryMAC(nodeIdBinaryType * nodeIdBinary, unsigned char * mac) { memcpy(&nodeIdBinary->buffer.mac, mac, PUD_NODEIDTYPE_MAC_BYTES); nodeIdBinary->length = PUD_NODEIDTYPE_MAC_BYTES; nodeIdBinary->set = true; return true; } /** Convert a given unsigned long long to the binary/wireformat representation of it. @param nodeIdBinary a pointer to the buffer in which to store the binary/wireformat representation @param value the value to convert (in machine byte-order) @param bytes the number of bytes used by the value @return - true when ok - false on failure */ bool setupNodeIdBinaryLongLong(nodeIdBinaryType * nodeIdBinary, unsigned long long value, size_t bytes) { unsigned long long longValue = value; int i = bytes - 1; while (i >= 0) { ((unsigned char *) &nodeIdBinary->buffer.longValue)[i] = longValue & 0xff; longValue >>= 8; i--; } assert(longValue == 0); nodeIdBinary->length = bytes; nodeIdBinary->set = true; return true; } /** Convert a given string to the binary/wireformat representation of it. @param nodeIdBinary a pointer to the buffer in which to store the binary/wireformat representation @param nodeId a pointer to the nodeId string @param nodeIdLength the length of the nodeId string @return - true when ok - false on failure */ bool setupNodeIdBinaryString(nodeIdBinaryType * nodeIdBinary, char * nodeId, size_t nodeIdLength) { /* including trailing \0 */ memcpy(&nodeIdBinary->buffer.stringValue[0], &nodeId[0], nodeIdLength + 1); nodeIdBinary->length = nodeIdLength + 1; nodeIdBinary->set = true; return true; } /** Convert a given IP address to the binary/wireformat representation of it. @param nodeIdBinary a pointer to the buffer in which to store the binary/wireformat representation @param ip a pointer to a buffer in which the IP address is stored (in network byte-order) @param ipLength the number of bytes used by the IP address @return - true when ok - false on failure */ bool setupNodeIdBinaryIp(nodeIdBinaryType * nodeIdBinary, void * ip, size_t ipLength) { memcpy(&nodeIdBinary->buffer.ip, ip, ipLength); nodeIdBinary->length = ipLength; nodeIdBinary->set = true; return true; } olsrd-0.6.6.2/lib/pud/wireformat/src/wireFormat.c000066400000000000000000000527231234304727700216170ustar00rootroot00000000000000#include #include /* * NodeIdType */ bool isValidNodeIdType(unsigned long long nodeIdType) { return ( ( (/* (nodeIdType >= PUD_NODEIDTYPE_GLOBAL_FIRST) && */ (nodeIdType <= PUD_NODEIDTYPE_GLOBAL_LAST)) || ( (nodeIdType >= PUD_NODEIDTYPE_LOCAL_FIRST ) && (nodeIdType <= PUD_NODEIDTYPE_LOCAL_LAST )) ) && ( (nodeIdType != PUD_NODEIDTYPE_GAP1) ) ); } /* * Validity Time */ /** Determine the validity time in seconds from the OLSR wire format value */ #define PUD_VALIDITY_TIME_FROM_OLSR(msn, lsn) ((((lsn) + 16) * (1 << (msn))) - 16) /** Get the validity time from a message @param validityTimeField A pointer to the validity time field @return The validity time in seconds */ unsigned long getValidityTime(uint8_t * validityTimeField) { return PUD_VALIDITY_TIME_FROM_OLSR(*validityTimeField >> 4, *validityTimeField % 16); } /** Set the validity time of the position update message @param validityTimeField A pointer to the validity time field @param validityTime The validity time in seconds */ void setValidityTime(uint8_t * validityTimeField, unsigned long long validityTime) { unsigned int msn = 1; unsigned long long lsn = 0; unsigned long long upperBound; upperBound = PUD_VALIDITY_TIME_FROM_OLSR(msn, 0); while ((msn < 16) && (validityTime >= upperBound)) { msn++; upperBound = PUD_VALIDITY_TIME_FROM_OLSR(msn, 0); } msn--; if (unlikely(validityTime >= upperBound)) { lsn = 15; } else { unsigned long lowerBound = PUD_VALIDITY_TIME_FROM_OLSR(msn, 0); unsigned long resolution = (1 << msn); lsn = ((validityTime - lowerBound + (resolution >> 1)) / resolution); } assert(msn <= 15); assert(lsn <= 15); *validityTimeField = ((msn << 4) | lsn); } /* * UplinkHeader */ /** Get the type of the uplink message @param uplinkHeader A pointer to the uplink message @return The type of the uplink message */ uint8_t getUplinkMessageType(UplinkHeader * uplinkHeader) { return uplinkHeader->type; } /** Set the type of the uplink message @param uplinkHeader A pointer to the uplink message @param type The type of the uplink message */ void setUplinkMessageType(UplinkHeader * uplinkHeader, uint8_t type) { uplinkHeader->type = type; } /** Get the length of the uplink message @param uplinkHeader A pointer to the uplink message @return The length of the uplink message */ uint16_t getUplinkMessageLength(UplinkHeader * uplinkHeader) { return ntohs(uplinkHeader->length); } /** Set the length of the uplink message @param uplinkHeader A pointer to the uplink message @param length The length of the uplink message */ void setUplinkMessageLength(UplinkHeader * uplinkHeader, uint16_t length) { uplinkHeader->length = ntohs(length); } /** Get the IPv6 status of the uplink message @param uplinkHeader A pointer to the uplink message @return true when the uplink message is sent from an olsrd stack in IPv6 mode, false otherwise */ bool getUplinkMessageIPv6(UplinkHeader * uplinkHeader) { return (uplinkHeader->ipv6 == 1); } /** Set the IPv6 status of the uplink message @param uplinkHeader A pointer to the uplink message @param ipv6 The IPv6 status of the uplink message (true when the uplink message is sent from olsrd stack in IPv6 mode, false otherwise) */ void setUplinkMessageIPv6(UplinkHeader * uplinkHeader, bool ipv6) { uplinkHeader->ipv6 = ipv6 ? 1 : 0; } /** Set the padding of the uplink message header @param uplinkHeader A pointer to the uplink message @param pad The padding of the uplink message header */ void setUplinkMessagePadding(UplinkHeader * uplinkHeader, uint8_t pad) { uplinkHeader->pad = pad; } /* * OLSR header */ /** Determine the size of an OLSR message @param ipVersion The IP version @param olsrMessage A pointer to the OLSR message @return The size of the OLSR message */ unsigned short getOlsrMessageSize(int ipVersion, union olsr_message * olsrMessage) { if (ipVersion == AF_INET) { return ntohs(olsrMessage->v4.olsr_msgsize); } return ntohs(olsrMessage->v6.olsr_msgsize); } /** Get the originator of an OLSR message @param ipVersion The IP version (AF_INET or AF_INET6) @param olsrMessage A pointer to the OLSR message @return A pointer to the originator address */ union olsr_ip_addr * getOlsrMessageOriginator(int ipVersion, union olsr_message * olsrMessage) { if (ipVersion == AF_INET) { return (union olsr_ip_addr *) &olsrMessage->v4.originator; } return (union olsr_ip_addr *) &olsrMessage->v6.originator; } /** Get the position update message in an OLSR message @param ipVersion The IP version (AF_INET or AF_INET6) @param olsrMessage A pointer to the OLSR message @return A pointer to the position update message */ PudOlsrPositionUpdate * getOlsrMessagePayload(int ipVersion, union olsr_message * olsrMessage) { if (ipVersion == AF_INET) { return (PudOlsrPositionUpdate *) &olsrMessage->v4.message; } return (PudOlsrPositionUpdate *) &olsrMessage->v6.message; } /* * PudOlsrPositionUpdate */ /** Get the version of the position update message @param olsrGpsMessage A pointer to the position update message @return The version of the position update message */ uint8_t getPositionUpdateVersion( PudOlsrPositionUpdate * olsrGpsMessage) { return olsrGpsMessage->version; } /** Set the version of the position update message @param olsrGpsMessage A pointer to the position update message @param version The version of the position update message */ void setPositionUpdateVersion( PudOlsrPositionUpdate * olsrGpsMessage, uint8_t version) { olsrGpsMessage->version = version; } /** Get the smask of the position update message @param olsrGpsMessage A pointer to the position update message @return The smask of the position update message */ uint8_t getPositionUpdateSmask( PudOlsrPositionUpdate * olsrGpsMessage) { return olsrGpsMessage->smask; } /** Set the smask of the position update message @param olsrGpsMessage A pointer to the position update message @param smask The smask of the position update message */ void setPositionUpdateSmask( PudOlsrPositionUpdate * olsrGpsMessage, uint8_t smask) { olsrGpsMessage->smask = smask; } /** Get the flags of the position update message @param olsrGpsMessage A pointer to the position update message @return The flags of the position update message */ uint8_t getPositionUpdateFlags( PudOlsrPositionUpdate * olsrGpsMessage) { return olsrGpsMessage->flags; } /** Set the flags of the position update message @param olsrGpsMessage A pointer to the position update message @param flags The flags of the position update message */ void setPositionUpdateFlags( PudOlsrPositionUpdate * olsrGpsMessage, uint8_t flags) { olsrGpsMessage->flags = flags; } /* * GpsInfo */ /** Convert the time of an OLSR message (the number of seconds after midnight) to a time structure, based on midnight of the current day. @param olsrGpsMessage A pointer to the position update message @param baseDate The base date from which to determine the time (number of seconds since Epoch, UTC) @param nowStruct A pointer to the time structure into which to put the converted time */ void getPositionUpdateTime(PudOlsrPositionUpdate * olsrGpsMessage, time_t baseDate, struct tm *nowStruct) { uint32_t olsrTime = olsrGpsMessage->gpsInfo.time; unsigned int secNow; time_t now = baseDate; gmtime_r(&now, nowStruct); secNow = ((nowStruct->tm_hour * 60 * 60) + (nowStruct->tm_min * 60) + nowStruct->tm_sec); if (secNow <= (12 * 60 * 60)) { /* we are now in the first 12h of the day */ if (unlikely(olsrTime > (secNow + (12 * 60 * 60)))) { /* the message was sent more than 12h later in time: the message was sent yesterday: adjust the date by -1 day */ now -= (24 * 60 * 60); gmtime_r(&now, nowStruct); } } else { /* we are now in the last 12h of the day */ if (unlikely(olsrTime < (secNow - (12 * 60 * 60)))) { /* the message was sent more than 12h earlier in time: the message was sent tomorrow: adjust the date by +1 day */ now += (24 * 60 * 60); gmtime_r(&now, nowStruct); } } nowStruct->tm_hour = ((olsrTime % (24 * 60 * 60)) / 3600); nowStruct->tm_min = ((olsrTime % (60 * 60)) / 60); nowStruct->tm_sec = (olsrTime % 60); } /** Set the time of the position update message (the number of seconds after midnight) @param olsrGpsMessage A pointer to the position update message @param hour The hours @param min The minutes @param sec The seconds */ void setPositionUpdateTime(PudOlsrPositionUpdate * olsrGpsMessage, int hour, int min, int sec) { olsrGpsMessage->gpsInfo.time = ((hour * 60 * 60) + (min * 60) + sec); } /** Get the latitude of the position update message @param olsrGpsMessage A pointer to the position update message @return The latitude converted to degrees: [-90, 90> */ double getPositionUpdateLatitude( PudOlsrPositionUpdate * olsrGpsMessage) { uint32_t olsrLat = olsrGpsMessage->gpsInfo.lat; double lat = (double) olsrLat; /* lat is in [0, 2^LATITUDE_BITS> */ /* take half of the rounding error */ lat += 0.5; lat /= (double) (1 << PUD_LATITUDE_BITS); /* lat is now in [0, 1> */ lat -= 0.5; /* lat is now in [-0.5, 0.5> */ lat *= 180.0; /* lat is now in [-90, 90> */ return lat; } /** Set the latitude of the position update message @param olsrGpsMessage A pointer to the position update message @param latitude The latitude in degrees: [-90, 90] */ void setPositionUpdateLatitude( PudOlsrPositionUpdate * olsrGpsMessage, double latitude) { double lat = latitude; /* lat is in [-90, 90] */ assert(lat >= -90.0); assert(lat <= 90.0); lat /= 180.0; /* lat is now in [-0.5, 0.5] */ lat += 0.5; /* lat is now in [0, 1] */ lat *= (double) (1 << PUD_LATITUDE_BITS); /* lat is now in [0, LATITUDE_BITS] */ /* clip max */ if (unlikely(lat > (double)((1 << PUD_LATITUDE_BITS) - 1))) { lat = (double) ((1 << PUD_LATITUDE_BITS) - 1); } /* lat is now in [0, 2^LATITUDE_BITS> */ olsrGpsMessage->gpsInfo.lat = lrint(lat); } /** Get the longitude of the position update message @param olsrGpsMessage A pointer to the position update message @return The longitude converted to degrees: [-180, 180> */ double getPositionUpdateLongitude( PudOlsrPositionUpdate * olsrGpsMessage) { uint32_t olsrLon = olsrGpsMessage->gpsInfo.lon; double lon = (double) olsrLon; /* lon is in [0, 2^LONGITUDE_BITS> */ /* take half of the rounding error */ lon += 0.5; lon /= (1 << PUD_LONGITUDE_BITS); /* lon is now in [0, 1> */ lon -= 0.5; /* lon is now in [-0.5, 0.5> */ lon *= 360.0; /* lon is now in [-180, 180> */ return lon; } /** Set the longitude of the position update message @param olsrGpsMessage A pointer to the position update message @param longitude The longitude in degrees: [-90, 90] */ void setPositionUpdateLongitude( PudOlsrPositionUpdate * olsrGpsMessage, double longitude) { double lon = longitude; /* lon is in [-180, 180] */ assert(lon >= -180.0); assert(lon <= 180.0); lon /= 360.0; /* lon is now in [-0.5, 0.5] */ lon += 0.5; /* lon is now in [0, 1] */ lon *= (double) (1 << PUD_LONGITUDE_BITS); /* lon is now in [0, LONGITUDE_BITS] */ /* clip max */ if (unlikely(lon > (double)((1 << PUD_LATITUDE_BITS) - 1))) { lon = (double) ((1 << PUD_LATITUDE_BITS) - 1); } /* lon is now in [0, 2^LONGITUDE_BITS> */ olsrGpsMessage->gpsInfo.lon = lrint(lon); } /** Get the altitude of the position update message @param olsrGpsMessage A pointer to the position update message @return The altitude in meters */ long getPositionUpdateAltitude( PudOlsrPositionUpdate * olsrGpsMessage) { return ((long) olsrGpsMessage->gpsInfo.alt + PUD_ALTITUDE_MIN); } /** Set the altitude of the position update message @param olsrGpsMessage A pointer to the position update message @param altitude The altitude in meters */ void setPositionUpdateAltitude( PudOlsrPositionUpdate * olsrGpsMessage, double altitude) { double alt = altitude; if (unlikely(alt > PUD_ALTITUDE_MAX)) { alt = PUD_ALTITUDE_MAX; } else if (unlikely(alt < PUD_ALTITUDE_MIN)) { alt = PUD_ALTITUDE_MIN; } alt -= PUD_ALTITUDE_MIN; olsrGpsMessage->gpsInfo.alt = lrint(alt); } /** Get the speed of the position update message @param olsrGpsMessage A pointer to the position update message @return The speed in kph */ unsigned long getPositionUpdateSpeed( PudOlsrPositionUpdate * olsrGpsMessage) { return olsrGpsMessage->gpsInfo.speed; } /** Set the speed of the position update message @param olsrGpsMessage A pointer to the position update message @param speed The speed in kph */ void setPositionUpdateSpeed( PudOlsrPositionUpdate * olsrGpsMessage, double speed) { double spd = speed; if (unlikely(speed < 0)) { spd = 0; } else if (unlikely(speed > PUD_SPEED_MAX)) { spd = PUD_SPEED_MAX; } olsrGpsMessage->gpsInfo.speed = lrint(spd); } /** Get the track angle of the position update message @param olsrGpsMessage A pointer to the position update message @return The track angle in degrees */ unsigned long getPositionUpdateTrack( PudOlsrPositionUpdate * olsrGpsMessage) { return olsrGpsMessage->gpsInfo.track; } /** Set the track angle of the position update message @param olsrGpsMessage A pointer to the position update message @param track The track angle in degrees */ void setPositionUpdateTrack( PudOlsrPositionUpdate * olsrGpsMessage, double track) { olsrGpsMessage->gpsInfo.track = lrint(track); } /** Get the HDOP of the position update message @param olsrGpsMessage A pointer to the position update message @return The HDOP */ double getPositionUpdateHdop( PudOlsrPositionUpdate * olsrGpsMessage) { return (olsrGpsMessage->gpsInfo.hdop * PUD_HDOP_RESOLUTION); } /** Set the HDOP of the position update message @param olsrGpsMessage A pointer to the position update message @param hdop The HDOP */ void setPositionUpdateHdop(PudOlsrPositionUpdate * olsrGpsMessage, double hdop) { double hdopInternal = hdop; if (unlikely(hdopInternal > PUD_HDOP_MAX)) { hdopInternal = PUD_HDOP_MAX; } olsrGpsMessage->gpsInfo.hdop = lrint(hdopInternal / PUD_HDOP_RESOLUTION); } /* * NodeInfo */ /** Get the nodeIdType of the position update message @param ipVersion The IP version (AF_INET or AF_INET6) @param olsrGpsMessage A pointer to the position update message @return The nodeIdType */ NodeIdType getPositionUpdateNodeIdType(int ipVersion, PudOlsrPositionUpdate * olsrGpsMessage) { if (getPositionUpdateFlags(olsrGpsMessage) & PUD_FLAGS_ID) { return olsrGpsMessage->nodeInfo.nodeIdType; } return ((ipVersion == AF_INET) ? PUD_NODEIDTYPE_IPV4 : PUD_NODEIDTYPE_IPV6); } /** Set the nodeIdType of the position update message @param olsrGpsMessage A pointer to the position update message @param nodeIdType The nodeIdType */ void setPositionUpdateNodeIdType( PudOlsrPositionUpdate * olsrGpsMessage, NodeIdType nodeIdType) { olsrGpsMessage->nodeInfo.nodeIdType = nodeIdType; } /** Get the nodeId and its size, accounting for nodeId presence @param ipVersion The IP version (AF_INET or AF_INET6) @param olsrMessage A pointer to the OLSR message @param nodeId A pointer to the location where a pointer to the nodeId (as contained in the olsrMessage) can be stored @param nodeIdSize A pointer to the location where the number of bytes in the nodeId can be stored */ void getPositionUpdateNodeId(int ipVersion, union olsr_message * olsrMessage, unsigned char ** nodeId, unsigned int * nodeIdSize) { PudOlsrPositionUpdate * olsrGpsMessage = getOlsrMessagePayload(ipVersion, olsrMessage); *nodeId = &olsrGpsMessage->nodeInfo.nodeId; switch (getPositionUpdateNodeIdType(ipVersion, olsrGpsMessage)) { case PUD_NODEIDTYPE_MAC: /* hardware address */ *nodeIdSize = PUD_NODEIDTYPE_MAC_BYTES; break; case PUD_NODEIDTYPE_MSISDN: /* an MSISDN number */ *nodeIdSize = PUD_NODEIDTYPE_MSISDN_BYTES; break; case PUD_NODEIDTYPE_TETRA: /* a Tetra number */ *nodeIdSize = PUD_NODEIDTYPE_TETRA_BYTES; break; case PUD_NODEIDTYPE_DNS: /* DNS name */ *nodeIdSize = strlen((char *) *nodeId); /* FIXME for no '\0' at the end, need to scan from the end until * encountering a non-zero byte: end of string address and * subtract the string start address */ break; case PUD_NODEIDTYPE_MMSI: /* an AIS MMSI number */ *nodeIdSize = PUD_NODEIDTYPE_MMSI_BYTES; break; case PUD_NODEIDTYPE_URN: /* a URN number */ *nodeIdSize = PUD_NODEIDTYPE_URN_BYTES; break; case PUD_NODEIDTYPE_192: *nodeIdSize = PUD_NODEIDTYPE_192_BYTES; break; case PUD_NODEIDTYPE_193: *nodeIdSize = PUD_NODEIDTYPE_193_BYTES; break; case PUD_NODEIDTYPE_194: *nodeIdSize = PUD_NODEIDTYPE_194_BYTES; break; case PUD_NODEIDTYPE_IPV4: /* IPv4 address */ case PUD_NODEIDTYPE_IPV6: /* IPv6 address */ default: /* unsupported */ { *nodeId = (unsigned char *) getOlsrMessageOriginator(ipVersion, olsrMessage); *nodeIdSize = (ipVersion == AF_INET) ? PUD_NODEIDTYPE_IPV4_BYTES : PUD_NODEIDTYPE_IPV6_BYTES; } break; } return; } /** Set the nodeId of the position update message @param olsrGpsMessage A pointer to the position update message @param nodeId The nodeId @param nodeIdSize The number of bytes in nodeId @param padWithNullByte When true then an extra '\0' byte will be added at the end */ void setPositionUpdateNodeId( PudOlsrPositionUpdate * olsrGpsMessage, unsigned char * nodeId, unsigned int nodeIdSize, bool padWithNullByte) { memcpy(&olsrGpsMessage->nodeInfo.nodeId, nodeId, nodeIdSize); if (unlikely(padWithNullByte)) { (&olsrGpsMessage->nodeInfo.nodeId)[nodeIdSize] = '\0'; } } /** Convert the node information to the node information for an OLSR message and put it in the PUD message in the OLSR message. Also updates the PUD message smask. @param ipVersion The IP version (AF_INET or AF_INET6) @param olsrGpsMessage A pointer to the PUD message in the OLSR message @param olsrMessageSize The maximum number of bytes available for the olsrMessage @param nodeIdType The nodeIdType @param nodeId The (configured) nodeId in binary/wireformat representation @param nodeIdLength The number of bytes in the nodeId @return The number of bytes written in the PUD message in the OLSR message (for ALL the node information) */ size_t setPositionUpdateNodeInfo(int ipVersion, PudOlsrPositionUpdate * olsrGpsMessage, unsigned int olsrMessageSize, NodeIdType nodeIdType, unsigned char * nodeId, size_t nodeIdLength) { unsigned int length = 0; setPositionUpdateNodeIdType(olsrGpsMessage, nodeIdType); switch (nodeIdType) { case PUD_NODEIDTYPE_MAC: /* hardware address */ case PUD_NODEIDTYPE_MSISDN: /* an MSISDN number */ case PUD_NODEIDTYPE_TETRA: /* a Tetra number */ case PUD_NODEIDTYPE_MMSI: /* an AIS MMSI number */ case PUD_NODEIDTYPE_URN: /* a URN number */ case PUD_NODEIDTYPE_192: case PUD_NODEIDTYPE_193: case PUD_NODEIDTYPE_194: length = nodeIdLength; setPositionUpdateNodeId(olsrGpsMessage, nodeId, nodeIdLength, false); break; case PUD_NODEIDTYPE_DNS: /* DNS name */ { long charsAvailable = olsrMessageSize - (PUD_OLSRWIREFORMATSIZE + sizeof(NodeInfo) - sizeof(olsrGpsMessage->nodeInfo.nodeId)) - 1; length = nodeIdLength + 1; if (unlikely((long) length > charsAvailable)) { length = charsAvailable; } setPositionUpdateNodeId(olsrGpsMessage, nodeId, length, true); } break; case PUD_NODEIDTYPE_IPV4: /* IPv4 address */ case PUD_NODEIDTYPE_IPV6: /* IPv6 address */ /* explicit return: no nodeId information in message */ return 0; default: /* unsupported */ /* fallback to IP address */ setPositionUpdateNodeIdType(olsrGpsMessage, (ipVersion == AF_INET) ? PUD_NODEIDTYPE_IPV4 : PUD_NODEIDTYPE_IPV6); /* explicit return: no nodeId information in message */ return 0; } setPositionUpdateFlags(olsrGpsMessage, getPositionUpdateFlags(olsrGpsMessage) | PUD_FLAGS_ID); return ((sizeof(NodeInfo) - (sizeof(olsrGpsMessage->nodeInfo.nodeId) /* nodeId placeholder */)) + length); } /* * UplinkClusterLeader */ /** Get the version of the cluster leader message @param clusterLeaderMessage A pointer to the cluster leader message @return The version of the cluster leader message */ uint8_t getClusterLeaderVersion( UplinkClusterLeader * clusterLeaderMessage) { return clusterLeaderMessage->version; } /** Set the version of the cluster leader message @param clusterLeaderMessage A pointer to the cluster leader message @param version The version of the cluster leader message */ void setClusterLeaderVersion( UplinkClusterLeader * clusterLeaderMessage, uint8_t version) { clusterLeaderMessage->version = version; } /** Get the originator of a cluster leader message @param ipVersion The IP version (AF_INET or AF_INET6) @param clusterLeaderMessage A pointer to the cluster leader message @return A pointer to the originator address */ union olsr_ip_addr * getClusterLeaderOriginator(int ipVersion, UplinkClusterLeader * clusterLeaderMessage) { if (ipVersion == AF_INET) { return (union olsr_ip_addr *) &clusterLeaderMessage->leader.v4.originator; } return (union olsr_ip_addr *) &clusterLeaderMessage->leader.v6.originator; } /** Get the cluster leader of a cluster leader message @param ipVersion The IP version (AF_INET or AF_INET6) @param clusterLeaderMessage A pointer to the cluster leader message @return A pointer to the clust leader address */ union olsr_ip_addr * getClusterLeaderClusterLeader(int ipVersion, UplinkClusterLeader * clusterLeaderMessage) { if (ipVersion == AF_INET) { return (union olsr_ip_addr *) &clusterLeaderMessage->leader.v4.clusterLeader; } return (union olsr_ip_addr *) &clusterLeaderMessage->leader.v6.clusterLeader; } olsrd-0.6.6.2/lib/quagga/000077500000000000000000000000001234304727700150325ustar00rootroot00000000000000olsrd-0.6.6.2/lib/quagga/ChangeLog000066400000000000000000000022751234304727700166120ustar00rootroot000000000000000.2.2: Immo 'FaUl' Wehrenberg : * make selected flag configurable (do not set it by default) * configurable administrative distance now * make it compile (and work) on *bsd (only tested on freebsd, please drop me a note if you test it on any other platform!) * lot of bugfixes (now support for redistribute with ZEBRA_HEADER_MARKER), etc * lot of code-cleanups improvements (most to the work of Acinonyx) * updated plugin interface to version 5 * updated to new routing core (olsrd-0.5.4) 0.2.1: Immo 'FaUl' Wehrenberg : * now check (most of the) return-values of syscalls, improvement still possible... * added support for new zebra-protocoll-format (with ZEBRA_HEADER_MARKER and ZCLIENT_VERSION) if new quagga-headers are found) * Code Cleanup (removed lot of debug and test-stuff) * fixed return-bug in zebra_send_command * added copyright-stuff * removed memleak in zebra_add/delete_v4_route 0.2.0: Immo 'FaUl' Wehrenberg : * Initial release, too :-) * Added support for route-export to the zebra/quagga 0.1.0: Immo 'FaUl' Wehrenberg : * Initial release olsrd-0.6.6.2/lib/quagga/Contributors000066400000000000000000000006021234304727700174500ustar00rootroot00000000000000This file is to thank people contributing code or do a lot of testing * Vassilis T. for a lot of cleanups and fixes * Johannes Joemann <5@free.de> for a lot of testing * Bernd Petrovitsch for support and new plugin-interface * Hannes Gredler for new routing-core * Sven Ola Tucke for various bugfixes olsrd-0.6.6.2/lib/quagga/Makefile000066400000000000000000000051301234304727700164710ustar00rootroot00000000000000# The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_quagga PLUGIN_VER = 0.2.2 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc CFLAGS += -g #uncomment the following line only if you are sure what you're doing, it will #probably break things! # CPPFLAGS +=-DZEBRA_HEADER_MARKER=255 ifeq ($(OS),win32) default_target install clean: @echo "*** Quagga not supported on Windows (so it would be pointless to build the Quagga plugin)" else default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) endif olsrd-0.6.6.2/lib/quagga/README_QUAGGA000066400000000000000000000047451234304727700167510ustar00rootroot00000000000000--------------------------------------------------------------------- QUAGGA PLUGIN FOR OLSRD by Immo 'FaUl' Wehrenberg addittions by: Sven-Ola Tuecke Vasilis Tsiligiannis --------------------------------------------------------------------- This is the Quagga Plugin for OLSRd. It allows olsrd to redistribute from various quagga-protocols as well as to export olsr-routes to quagga so that they can be redistributed by the quagga-routing-daemons. You also need a source distribution of quagga-0.98.6 or quagga-0.99.21. The quagga source tree needs to be patched with quagga-0.98.6.diff or quagga-0.99.21.diff, respectively, compiled and installed via 'make install'. --------------------------------------------------------------------- PLUGIN PARAMETERS (PlParam) --------------------------------------------------------------------- PlParam "Redistribute" "" where protocol is one of the following: system, kernel, connect, static, rip, ripng, ospf, ospf6, isis, bgp, hsls May be used more then once PlParam "ExportRoutes" "" exports olsr-routes to quagga only, or to quagga and kernel no routes are exported to quagga (normal behaviour) if not set. PlParam "LocalPref" "" sets the Zebra SELECTED-flag on the routes exported to zebra which means these routes are prefered in any case. PlParam "Distance" "0-255" allows to set the administrative distance to routes exported to zebra. PlParam "SockPath" "" sets the path to zebra socket defaults to "/var/run/quagga/zserv.api" if not set. PlParam "Port" "" sets the port on which zebra is listening overrides 'SockPath' parameter if set. PlParam "Version" "" sets the version of packet format to communicate with zebra. use: "0" for Quagga 0.98.x "1" for Quagga 0.99.17 up to 0.99.20.1 "2" for Quagga 0.99.21 and above defaults to "0". --------------------------------------------------------------------- SAMPLE CONFIG --------------------------------------------------------------------- add in /usr/local/etc/olsrd.conf: LoadPlugin "olsrd_quagga.so.0.2.2" { PlParam "Redistribute" "ospf" PlParam "Redistribute" "bgp" PlParam "ExportRoutes" "only" PlParam "Distance" "125" PlParam "LocalPref" "false" PlParam "SockPath" "/var/run/zserv.api" PlParam "Version" "2" } --------------------------------------------------------------------- EOF / 31.05.2012 olsrd-0.6.6.2/lib/quagga/patches/000077500000000000000000000000001234304727700164615ustar00rootroot00000000000000olsrd-0.6.6.2/lib/quagga/patches/.gitignore000066400000000000000000000000101234304727700204400ustar00rootroot00000000000000!/*.diffolsrd-0.6.6.2/lib/quagga/patches/quagga-0.98.6.diff000066400000000000000000001014641234304727700213260ustar00rootroot00000000000000diff -Nur quagga-0.98.6/bgpd/bgp_vty.c quagga-0.98.6.patched/bgpd/bgp_vty.c --- quagga-0.98.6/bgpd/bgp_vty.c 2006-03-30 18:12:25.000000000 +0200 +++ quagga-0.98.6.patched/bgpd/bgp_vty.c 2007-12-30 14:18:22.000000000 +0200 @@ -3,6 +3,9 @@ This file is part of GNU Zebra. +This file was modified from the original on 30/12/2007 +by Vasilis Tsiligiannis + GNU Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any @@ -7793,8 +7796,12 @@ return ZEBRA_ROUTE_STATIC; else if (strncmp (str, "r", 1) == 0) return ZEBRA_ROUTE_RIP; - else if (strncmp (str, "o", 1) == 0) + else if (strncmp (str, "ol", 2) == 0) + return ZEBRA_ROUTE_OLSR; + else if (strncmp (str, "os", 2) == 0) return ZEBRA_ROUTE_OSPF; + else if (strncmp (str, "ba", 2) == 0) + return ZEBRA_ROUTE_BATMAN; } if (afi == AFI_IP6) { @@ -7806,21 +7813,28 @@ return ZEBRA_ROUTE_STATIC; else if (strncmp (str, "r", 1) == 0) return ZEBRA_ROUTE_RIPNG; - else if (strncmp (str, "o", 1) == 0) + else if (strncmp (str, "os", 2) == 0) return ZEBRA_ROUTE_OSPF6; + else if (strncmp (str, "ol", 2) == 0) + return ZEBRA_ROUTE_OLSR; + else if (strncmp (str, "ba", 2) == 0) + return ZEBRA_ROUTE_BATMAN; } return 0; } DEFUN (bgp_redistribute_ipv4, bgp_redistribute_ipv4_cmd, - "redistribute (connected|kernel|ospf|rip|static)", + "redistribute (connected|kernel|ospf|rip|static|olsr|batman)", "Redistribute information from another routing protocol\n" "Connected\n" "Kernel routes\n" "Open Shurtest Path First (OSPF)\n" "Routing Information Protocol (RIP)\n" - "Static routes\n") + "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" + ) { int type; @@ -7835,13 +7849,15 @@ DEFUN (bgp_redistribute_ipv4_rmap, bgp_redistribute_ipv4_rmap_cmd, - "redistribute (connected|kernel|ospf|rip|static) route-map WORD", + "redistribute (connected|kernel|ospf|rip|static|olsr|batman) route-map WORD", "Redistribute information from another routing protocol\n" "Connected\n" "Kernel routes\n" "Open Shurtest Path First (OSPF)\n" "Routing Information Protocol (RIP)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Route map reference\n" "Pointer to route-map entries\n") { @@ -7860,13 +7876,15 @@ DEFUN (bgp_redistribute_ipv4_metric, bgp_redistribute_ipv4_metric_cmd, - "redistribute (connected|kernel|ospf|rip|static) metric <0-4294967295>", + "redistribute (connected|kernel|ospf|rip|static|olsr|batman) metric <0-4294967295>", "Redistribute information from another routing protocol\n" "Connected\n" "Kernel routes\n" "Open Shurtest Path First (OSPF)\n" "Routing Information Protocol (RIP)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Metric for redistributed routes\n" "Default metric\n") { @@ -7887,13 +7905,15 @@ DEFUN (bgp_redistribute_ipv4_rmap_metric, bgp_redistribute_ipv4_rmap_metric_cmd, - "redistribute (connected|kernel|ospf|rip|static) route-map WORD metric <0-4294967295>", + "redistribute (connected|kernel|ospf|rip|static|olsr|batman) route-map WORD metric <0-4294967295>", "Redistribute information from another routing protocol\n" "Connected\n" "Kernel routes\n" "Open Shurtest Path First (OSPF)\n" "Routing Information Protocol (RIP)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Route map reference\n" "Pointer to route-map entries\n" "Metric for redistributed routes\n" @@ -7917,13 +7937,15 @@ DEFUN (bgp_redistribute_ipv4_metric_rmap, bgp_redistribute_ipv4_metric_rmap_cmd, - "redistribute (connected|kernel|ospf|rip|static) metric <0-4294967295> route-map WORD", + "redistribute (connected|kernel|ospf|rip|static|olsr|batman) metric <0-4294967295> route-map WORD", "Redistribute information from another routing protocol\n" "Connected\n" "Kernel routes\n" "Open Shurtest Path First (OSPF)\n" "Routing Information Protocol (RIP)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Metric for redistributed routes\n" "Default metric\n" "Route map reference\n" @@ -7947,14 +7969,17 @@ DEFUN (no_bgp_redistribute_ipv4, no_bgp_redistribute_ipv4_cmd, - "no redistribute (connected|kernel|ospf|rip|static)", + "no redistribute (connected|kernel|ospf|rip|static|olsr|batman)", NO_STR "Redistribute information from another routing protocol\n" "Connected\n" "Kernel routes\n" "Open Shurtest Path First (OSPF)\n" "Routing Information Protocol (RIP)\n" - "Static routes\n") + "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" + ) { int type; @@ -7970,7 +7995,7 @@ DEFUN (no_bgp_redistribute_ipv4_rmap, no_bgp_redistribute_ipv4_rmap_cmd, - "no redistribute (connected|kernel|ospf|rip|static) route-map WORD", + "no redistribute (connected|kernel|ospf|rip|static|olsr|batman) route-map WORD", NO_STR "Redistribute information from another routing protocol\n" "Connected\n" @@ -7978,6 +8003,8 @@ "Open Shurtest Path First (OSPF)\n" "Routing Information Protocol (RIP)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Route map reference\n" "Pointer to route-map entries\n") { @@ -7996,7 +8023,7 @@ DEFUN (no_bgp_redistribute_ipv4_metric, no_bgp_redistribute_ipv4_metric_cmd, - "no redistribute (connected|kernel|ospf|rip|static) metric <0-4294967295>", + "no redistribute (connected|kernel|ospf|rip|static|olsr|batman) metric <0-4294967295>", NO_STR "Redistribute information from another routing protocol\n" "Connected\n" @@ -8004,6 +8031,8 @@ "Open Shurtest Path First (OSPF)\n" "Routing Information Protocol (RIP)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Metric for redistributed routes\n" "Default metric\n") { @@ -8022,7 +8051,7 @@ DEFUN (no_bgp_redistribute_ipv4_rmap_metric, no_bgp_redistribute_ipv4_rmap_metric_cmd, - "no redistribute (connected|kernel|ospf|rip|static) route-map WORD metric <0-4294967295>", + "no redistribute (connected|kernel|ospf|rip|static|olsr|batman) route-map WORD metric <0-4294967295>", NO_STR "Redistribute information from another routing protocol\n" "Connected\n" @@ -8030,6 +8059,8 @@ "Open Shurtest Path First (OSPF)\n" "Routing Information Protocol (RIP)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Route map reference\n" "Pointer to route-map entries\n" "Metric for redistributed routes\n" @@ -8051,7 +8082,7 @@ ALIAS (no_bgp_redistribute_ipv4_rmap_metric, no_bgp_redistribute_ipv4_metric_rmap_cmd, - "no redistribute (connected|kernel|ospf|rip|static) metric <0-4294967295> route-map WORD", + "no redistribute (connected|kernel|ospf|rip|static|olsr|batman) metric <0-4294967295> route-map WORD", NO_STR "Redistribute information from another routing protocol\n" "Connected\n" @@ -8059,6 +8090,8 @@ "Open Shurtest Path First (OSPF)\n" "Routing Information Protocol (RIP)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Metric for redistributed routes\n" "Default metric\n" "Route map reference\n" @@ -8067,13 +8100,16 @@ #ifdef HAVE_IPV6 DEFUN (bgp_redistribute_ipv6, bgp_redistribute_ipv6_cmd, - "redistribute (connected|kernel|ospf6|ripng|static)", + "redistribute (connected|kernel|ospf6|ripng|static|olsr|batman)", "Redistribute information from another routing protocol\n" "Connected\n" "Kernel routes\n" "Open Shurtest Path First (OSPFv3)\n" "Routing Information Protocol (RIPng)\n" - "Static routes\n") + "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" + ) { int type; @@ -8089,13 +8125,15 @@ DEFUN (bgp_redistribute_ipv6_rmap, bgp_redistribute_ipv6_rmap_cmd, - "redistribute (connected|kernel|ospf6|ripng|static) route-map WORD", + "redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) route-map WORD", "Redistribute information from another routing protocol\n" "Connected\n" "Kernel routes\n" "Open Shurtest Path First (OSPFv3)\n" "Routing Information Protocol (RIPng)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Route map reference\n" "Pointer to route-map entries\n") { @@ -8114,13 +8152,15 @@ DEFUN (bgp_redistribute_ipv6_metric, bgp_redistribute_ipv6_metric_cmd, - "redistribute (connected|kernel|ospf6|ripng|static) metric <0-4294967295>", + "redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) metric <0-4294967295>", "Redistribute information from another routing protocol\n" "Connected\n" "Kernel routes\n" "Open Shurtest Path First (OSPFv3)\n" "Routing Information Protocol (RIPng)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Metric for redistributed routes\n" "Default metric\n") { @@ -8141,13 +8181,15 @@ DEFUN (bgp_redistribute_ipv6_rmap_metric, bgp_redistribute_ipv6_rmap_metric_cmd, - "redistribute (connected|kernel|ospf6|ripng|static) route-map WORD metric <0-4294967295>", + "redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) route-map WORD metric <0-4294967295>", "Redistribute information from another routing protocol\n" "Connected\n" "Kernel routes\n" "Open Shurtest Path First (OSPFv3)\n" "Routing Information Protocol (RIPng)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Route map reference\n" "Pointer to route-map entries\n" "Metric for redistributed routes\n" @@ -8171,13 +8213,15 @@ DEFUN (bgp_redistribute_ipv6_metric_rmap, bgp_redistribute_ipv6_metric_rmap_cmd, - "redistribute (connected|kernel|ospf6|ripng|static) metric <0-4294967295> route-map WORD", + "redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) metric <0-4294967295> route-map WORD", "Redistribute information from another routing protocol\n" "Connected\n" "Kernel routes\n" "Open Shurtest Path First (OSPFv3)\n" "Routing Information Protocol (RIPng)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Metric for redistributed routes\n" "Default metric\n" "Route map reference\n" @@ -8201,14 +8245,17 @@ DEFUN (no_bgp_redistribute_ipv6, no_bgp_redistribute_ipv6_cmd, - "no redistribute (connected|kernel|ospf6|ripng|static)", + "no redistribute (connected|kernel|ospf6|ripng|static|olsr|batman)", NO_STR "Redistribute information from another routing protocol\n" "Connected\n" "Kernel routes\n" "Open Shurtest Path First (OSPFv3)\n" "Routing Information Protocol (RIPng)\n" - "Static routes\n") + "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" + ) { int type; @@ -8224,7 +8271,7 @@ DEFUN (no_bgp_redistribute_ipv6_rmap, no_bgp_redistribute_ipv6_rmap_cmd, - "no redistribute (connected|kernel|ospf6|ripng|static) route-map WORD", + "no redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) route-map WORD", NO_STR "Redistribute information from another routing protocol\n" "Connected\n" @@ -8232,6 +8279,8 @@ "Open Shurtest Path First (OSPFv3)\n" "Routing Information Protocol (RIPng)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Route map reference\n" "Pointer to route-map entries\n") { @@ -8250,7 +8299,7 @@ DEFUN (no_bgp_redistribute_ipv6_metric, no_bgp_redistribute_ipv6_metric_cmd, - "no redistribute (connected|kernel|ospf6|ripng|static) metric <0-4294967295>", + "no redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) metric <0-4294967295>", NO_STR "Redistribute information from another routing protocol\n" "Connected\n" @@ -8258,6 +8307,8 @@ "Open Shurtest Path First (OSPFv3)\n" "Routing Information Protocol (RIPng)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Metric for redistributed routes\n" "Default metric\n") { @@ -8276,7 +8327,7 @@ DEFUN (no_bgp_redistribute_ipv6_rmap_metric, no_bgp_redistribute_ipv6_rmap_metric_cmd, - "no redistribute (connected|kernel|ospf6|ripng|static) route-map WORD metric <0-4294967295>", + "no redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) route-map WORD metric <0-4294967295>", NO_STR "Redistribute information from another routing protocol\n" "Connected\n" @@ -8284,6 +8335,8 @@ "Open Shurtest Path First (OSPFv3)\n" "Routing Information Protocol (RIPng)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Route map reference\n" "Pointer to route-map entries\n" "Metric for redistributed routes\n" @@ -8305,7 +8358,7 @@ ALIAS (no_bgp_redistribute_ipv6_rmap_metric, no_bgp_redistribute_ipv6_metric_rmap_cmd, - "no redistribute (connected|kernel|ospf6|ripng|static) metric <0-4294967295> route-map WORD", + "no redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) metric <0-4294967295> route-map WORD", NO_STR "Redistribute information from another routing protocol\n" "Connected\n" @@ -8313,6 +8366,8 @@ "Open Shurtest Path First (OSPFv3)\n" "Routing Information Protocol (RIPng)\n" "Static routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Metric for redistributed routes\n" "Default metric\n" "Route map reference\n" @@ -8325,7 +8380,7 @@ { int i; const char *str[] = { "system", "kernel", "connected", "static", "rip", - "ripng", "ospf", "ospf6", "isis", "bgp"}; + "ripng", "ospf", "ospf6", "isis", "bgp", "hsls", "olsr", "batman"}; /* Unicast redistribution only. */ if (safi != SAFI_UNICAST) diff -Nur quagga-0.98.6/lib/zebra.h quagga-0.98.6.patched/lib/zebra.h --- quagga-0.98.6/lib/zebra.h 2005-06-15 14:54:18.000000000 +0300 +++ quagga-0.98.6.patched/lib/zebra.h 2007-12-30 14:18:22.000000000 +0200 @@ -3,6 +3,9 @@ This file is part of GNU Zebra. +This file was modified from the original on 30/12/2007 +by Vasilis Tsiligiannis + GNU Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any @@ -378,7 +381,9 @@ #define ZEBRA_ROUTE_ISIS 8 #define ZEBRA_ROUTE_BGP 9 #define ZEBRA_ROUTE_HSLS 10 -#define ZEBRA_ROUTE_MAX 11 +#define ZEBRA_ROUTE_OLSR 11 +#define ZEBRA_ROUTE_BATMAN 12 +#define ZEBRA_ROUTE_MAX 13 /* Zebra's family types. */ #define ZEBRA_FAMILY_IPV4 1 diff -Nur quagga-0.98.6/ospfd/ospf_vty.c quagga-0.98.6.patched/ospfd/ospf_vty.c --- quagga-0.98.6/ospfd/ospf_vty.c 2006-03-30 17:41:20.000000000 +0200 +++ quagga-0.98.6.patched/ospfd/ospf_vty.c 2007-12-30 14:18:22.000000000 +0200 @@ -3,6 +3,9 @@ * * This file is part of GNU Zebra. * + * This file was modified from the original on 30/12/2007 + * by Vasilis Tsiligiannis + * * GNU Zebra is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2, or (at your option) any @@ -106,11 +109,15 @@ *source = ZEBRA_ROUTE_STATIC; else if (strncmp (str, "r", 1) == 0) *source = ZEBRA_ROUTE_RIP; - else if (strncmp (str, "b", 1) == 0) + else if (strncmp (str, "bg", 2) == 0) *source = ZEBRA_ROUTE_BGP; + else if (strncmp (str, "ol", 2) == 0) + *source = ZEBRA_ROUTE_OLSR; + else if (strncmp (str, "ba", 2) == 0) + *source = ZEBRA_ROUTE_BATMAN; else return 0; - + return 1; } @@ -5302,13 +5309,15 @@ DEFUN (ospf_redistribute_source_metric_type, ospf_redistribute_source_metric_type_routemap_cmd, - "redistribute (kernel|connected|static|rip|bgp) metric <0-16777214> metric-type (1|2) route-map WORD", + "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric <0-16777214> metric-type (1|2) route-map WORD", "Redistribute information from another routing protocol\n" "Kernel routes\n" "Connected\n" "Static routes\n" "Routing Information Protocol (RIP)\n" "Border Gateway Protocol (BGP)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Metric for redistributed routes\n" "OSPF default metric\n" "OSPF exterior metric type for redistributed routes\n" @@ -5346,13 +5355,15 @@ ALIAS (ospf_redistribute_source_metric_type, ospf_redistribute_source_metric_type_cmd, - "redistribute (kernel|connected|static|rip|bgp) metric <0-16777214> metric-type (1|2)", + "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric <0-16777214> metric-type (1|2)", "Redistribute information from another routing protocol\n" "Kernel routes\n" "Connected\n" "Static routes\n" "Routing Information Protocol (RIP)\n" "Border Gateway Protocol (BGP)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Metric for redistributed routes\n" "OSPF default metric\n" "OSPF exterior metric type for redistributed routes\n" @@ -5361,25 +5372,29 @@ ALIAS (ospf_redistribute_source_metric_type, ospf_redistribute_source_metric_cmd, - "redistribute (kernel|connected|static|rip|bgp) metric <0-16777214>", + "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric <0-16777214>", "Redistribute information from another routing protocol\n" "Kernel routes\n" "Connected\n" "Static routes\n" "Routing Information Protocol (RIP)\n" "Border Gateway Protocol (BGP)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Metric for redistributed routes\n" "OSPF default metric\n") DEFUN (ospf_redistribute_source_type_metric, ospf_redistribute_source_type_metric_routemap_cmd, - "redistribute (kernel|connected|static|rip|bgp) metric-type (1|2) metric <0-16777214> route-map WORD", + "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric-type (1|2) metric <0-16777214> route-map WORD", "Redistribute information from another routing protocol\n" "Kernel routes\n" "Connected\n" "Static routes\n" "Routing Information Protocol (RIP)\n" "Border Gateway Protocol (BGP)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "OSPF exterior metric type for redistributed routes\n" "Set OSPF External Type 1 metrics\n" "Set OSPF External Type 2 metrics\n" @@ -5417,13 +5432,15 @@ ALIAS (ospf_redistribute_source_type_metric, ospf_redistribute_source_type_metric_cmd, - "redistribute (kernel|connected|static|rip|bgp) metric-type (1|2) metric <0-16777214>", + "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric-type (1|2) metric <0-16777214>", "Redistribute information from another routing protocol\n" "Kernel routes\n" "Connected\n" "Static routes\n" "Routing Information Protocol (RIP)\n" "Border Gateway Protocol (BGP)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "OSPF exterior metric type for redistributed routes\n" "Set OSPF External Type 1 metrics\n" "Set OSPF External Type 2 metrics\n" @@ -5432,7 +5449,7 @@ ALIAS (ospf_redistribute_source_type_metric, ospf_redistribute_source_type_cmd, - "redistribute (kernel|connected|static|rip|bgp) metric-type (1|2)", + "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric-type (1|2)", "Redistribute information from another routing protocol\n" "Kernel routes\n" "Connected\n" @@ -5440,28 +5457,35 @@ "Routing Information Protocol (RIP)\n" "Border Gateway Protocol (BGP)\n" "OSPF exterior metric type for redistributed routes\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Set OSPF External Type 1 metrics\n" "Set OSPF External Type 2 metrics\n") ALIAS (ospf_redistribute_source_type_metric, ospf_redistribute_source_cmd, - "redistribute (kernel|connected|static|rip|bgp)", + "redistribute (kernel|connected|static|rip|bgp|olsr|batman)", "Redistribute information from another routing protocol\n" "Kernel routes\n" "Connected\n" "Static routes\n" "Routing Information Protocol (RIP)\n" - "Border Gateway Protocol (BGP)\n") + "Border Gateway Protocol (BGP)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" + ) DEFUN (ospf_redistribute_source_metric_routemap, ospf_redistribute_source_metric_routemap_cmd, - "redistribute (kernel|connected|static|rip|bgp) metric <0-16777214> route-map WORD", + "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric <0-16777214> route-map WORD", "Redistribute information from another routing protocol\n" "Kernel routes\n" "Connected\n" "Static routes\n" "Routing Information Protocol (RIP)\n" "Border Gateway Protocol (BGP)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Metric for redistributed routes\n" "OSPF default metric\n" "Route map reference\n" @@ -5490,13 +5514,15 @@ DEFUN (ospf_redistribute_source_type_routemap, ospf_redistribute_source_type_routemap_cmd, - "redistribute (kernel|connected|static|rip|bgp) metric-type (1|2) route-map WORD", + "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric-type (1|2) route-map WORD", "Redistribute information from another routing protocol\n" "Kernel routes\n" "Connected\n" "Static routes\n" "Routing Information Protocol (RIP)\n" "Border Gateway Protocol (BGP)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "OSPF exterior metric type for redistributed routes\n" "Set OSPF External Type 1 metrics\n" "Set OSPF External Type 2 metrics\n" @@ -5526,13 +5552,15 @@ DEFUN (ospf_redistribute_source_routemap, ospf_redistribute_source_routemap_cmd, - "redistribute (kernel|connected|static|rip|bgp) route-map WORD", + "redistribute (kernel|connected|static|rip|bgp|olsr|batman) route-map WORD", "Redistribute information from another routing protocol\n" "Kernel routes\n" "Connected\n" "Static routes\n" "Routing Information Protocol (RIP)\n" "Border Gateway Protocol (BGP)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Route map reference\n" "Pointer to route-map entries\n") { @@ -5553,14 +5581,17 @@ DEFUN (no_ospf_redistribute_source, no_ospf_redistribute_source_cmd, - "no redistribute (kernel|connected|static|rip|bgp)", + "no redistribute (kernel|connected|static|rip|bgp|olsr|batman)", NO_STR "Redistribute information from another routing protocol\n" "Kernel routes\n" "Connected\n" "Static routes\n" "Routing Information Protocol (RIP)\n" - "Border Gateway Protocol (BGP)\n") + "Border Gateway Protocol (BGP)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" + ) { struct ospf *ospf = vty->index; int source; @@ -5574,7 +5605,7 @@ DEFUN (ospf_distribute_list_out, ospf_distribute_list_out_cmd, - "distribute-list WORD out (kernel|connected|static|rip|bgp)", + "distribute-list WORD out (kernel|connected|static|rip|bgp|olsr|batman)", "Filter networks in routing updates\n" "Access-list name\n" OUT_STR @@ -5582,7 +5613,10 @@ "Connected\n" "Static routes\n" "Routing Information Protocol (RIP)\n" - "Border Gateway Protocol (BGP)\n") + "Border Gateway Protocol (BGP)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" +) { struct ospf *ospf = vty->index; int source; @@ -5596,7 +5630,7 @@ DEFUN (no_ospf_distribute_list_out, no_ospf_distribute_list_out_cmd, - "no distribute-list WORD out (kernel|connected|static|rip|bgp)", + "no distribute-list WORD out (kernel|connected|static|rip|bgp|olsr|batman)", NO_STR "Filter networks in routing updates\n" "Access-list name\n" @@ -5605,7 +5639,10 @@ "Connected\n" "Static routes\n" "Routing Information Protocol (RIP)\n" - "Border Gateway Protocol (BGP)\n") + "Border Gateway Protocol (BGP)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" +) { struct ospf *ospf = vty->index; int source; @@ -7121,7 +7158,8 @@ const char *distribute_str[] = { "system", "kernel", "connected", "static", - "rip", "ripng", "ospf", "ospf6", "isis", "bgp"}; + "rip", "ripng", "ospf", "ospf6", "isis", "bgp", + "hsls","olsr","batman"}; int config_write_ospf_redistribute (struct vty *vty, struct ospf *ospf) { diff -Nur quagga-0.98.6/zebra/redistribute.c quagga-0.98.6.patched/zebra/redistribute.c --- quagga-0.98.6/zebra/redistribute.c 2005-06-15 14:54:51.000000000 +0300 +++ quagga-0.98.6.patched/zebra/redistribute.c 2007-12-30 14:18:22.000000000 +0200 @@ -3,6 +3,9 @@ * * This file is part of GNU Zebra. * + * This file was modified from the original on 30/12/2007 + * by Vasilis Tsiligiannis + * * GNU Zebra is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2, or (at your option) any @@ -253,6 +256,8 @@ case ZEBRA_ROUTE_OSPF: case ZEBRA_ROUTE_OSPF6: case ZEBRA_ROUTE_BGP: + case ZEBRA_ROUTE_OLSR: + case ZEBRA_ROUTE_BATMAN: if (! client->redist[type]) { client->redist[type] = 1; @@ -281,6 +286,8 @@ case ZEBRA_ROUTE_OSPF: case ZEBRA_ROUTE_OSPF6: case ZEBRA_ROUTE_BGP: + case ZEBRA_ROUTE_OLSR: + case ZEBRA_ROUTE_BATMAN: client->redist[type] = 0; break; default: diff -Nur quagga-0.98.6/zebra/zebra_vty.c quagga-0.98.6.patched/zebra/zebra_vty.c --- quagga-0.98.6/zebra/zebra_vty.c 2004-12-18 18:03:29.000000000 +0200 +++ quagga-0.98.6.patched/zebra/zebra_vty.c 2007-12-30 14:25:48.000000000 +0200 @@ -53,6 +53,10 @@ return "isis"; case ZEBRA_ROUTE_BGP: return "bgp"; + case ZEBRA_ROUTE_OLSR: + return "olsr"; + case ZEBRA_ROUTE_BATMAN: + return "batman"; default: return "unknown"; } @@ -84,6 +88,12 @@ return 'I'; case ZEBRA_ROUTE_BGP: return 'B'; + case ZEBRA_ROUTE_HSLS: + return 'H'; + case ZEBRA_ROUTE_OLSR: + return 'L'; + case ZEBRA_ROUTE_BATMAN: + return 'M'; default: return '?'; } @@ -755,8 +765,8 @@ } #define SHOW_ROUTE_V4_HEADER "Codes: K - kernel route, C - connected, " \ - "S - static, R - RIP, O - OSPF,%s I - ISIS, B - BGP, " \ - "> - selected route, * - FIB route%s%s" + "S - static, R - RIP, O - OSPF,%s I - ISIS, B - BGP, H - HSLS, " \ + "L - OLSR, M - BATMAN, > - selected route, * - FIB route%s%s" DEFUN (show_ip_route, show_ip_route_cmd, @@ -874,7 +884,7 @@ DEFUN (show_ip_route_protocol, show_ip_route_protocol_cmd, - "show ip route (bgp|connected|isis|kernel|ospf|rip|static)", + "show ip route (bgp|connected|isis|kernel|ospf|rip|olsr|batman|static)", SHOW_STR IP_STR "IP routing table\n" @@ -884,6 +894,8 @@ "Kernel\n" "Open Shortest Path First (OSPF)\n" "Routing Information Protocol (RIP)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Static routes\n") { int type; @@ -892,13 +904,13 @@ struct rib *rib; int first = 1; - if (strncmp (argv[0], "b", 1) == 0) + if (strncmp (argv[0], "bg", 2) == 0) type = ZEBRA_ROUTE_BGP; else if (strncmp (argv[0], "c", 1) == 0) type = ZEBRA_ROUTE_CONNECT; else if (strncmp (argv[0], "k", 1) ==0) type = ZEBRA_ROUTE_KERNEL; - else if (strncmp (argv[0], "o", 1) == 0) + else if (strncmp (argv[0], "os", 2) == 0) type = ZEBRA_ROUTE_OSPF; else if (strncmp (argv[0], "i", 1) == 0) type = ZEBRA_ROUTE_ISIS; @@ -906,6 +918,10 @@ type = ZEBRA_ROUTE_RIP; else if (strncmp (argv[0], "s", 1) == 0) type = ZEBRA_ROUTE_STATIC; + else if (strncmp (argv[0], "ol", 2) == 0) + type = ZEBRA_ROUTE_OLSR; + else if (strncmp (argv[0], "ba", 2) == 0) + type = ZEBRA_ROUTE_BATMAN; else { vty_out (vty, "Unknown route type%s", VTY_NEWLINE); @@ -1732,7 +1748,7 @@ DEFUN (show_ipv6_route_protocol, show_ipv6_route_protocol_cmd, - "show ipv6 route (bgp|connected|isis|kernel|ospf6|ripng|static)", + "show ipv6 route (bgp|connected|isis|kernel|ospf6|ripng|olsr|batman|static)", SHOW_STR IP_STR "IP routing table\n" @@ -1742,6 +1758,8 @@ "Kernel\n" "Open Shortest Path First (OSPFv3)\n" "Routing Information Protocol (RIPng)\n" + "Optimized Link State Routing (OLSR)\n" + "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n" "Static routes\n") { int type; @@ -1750,13 +1768,13 @@ struct rib *rib; int first = 1; - if (strncmp (argv[0], "b", 1) == 0) + if (strncmp (argv[0], "bg", 2) == 0) type = ZEBRA_ROUTE_BGP; else if (strncmp (argv[0], "c", 1) == 0) type = ZEBRA_ROUTE_CONNECT; else if (strncmp (argv[0], "k", 1) ==0) type = ZEBRA_ROUTE_KERNEL; - else if (strncmp (argv[0], "o", 1) == 0) + else if (strncmp (argv[0], "os", 2) == 0) type = ZEBRA_ROUTE_OSPF6; else if (strncmp (argv[0], "i", 1) == 0) type = ZEBRA_ROUTE_ISIS; @@ -1764,7 +1782,11 @@ type = ZEBRA_ROUTE_RIPNG; else if (strncmp (argv[0], "s", 1) == 0) type = ZEBRA_ROUTE_STATIC; - else + else if (strncmp (argv[0], "ol", 2) == 0) + type = ZEBRA_ROUTE_OLSR; + else if (strncmp (argv[0], "ba", 2) == 0) + type = ZEBRA_ROUTE_BATMAN; + else { vty_out (vty, "Unknown route type%s", VTY_NEWLINE); return CMD_WARNING; olsrd-0.6.6.2/lib/quagga/patches/quagga-0.99.21.diff000066400000000000000000000220721234304727700214010ustar00rootroot00000000000000diff --git a/lib/log.c b/lib/log.c index cbc935b..991b77e 100644 --- a/lib/log.c +++ b/lib/log.c @@ -929,13 +929,19 @@ proto_redistnum(int afi, const char *s) return ZEBRA_ROUTE_STATIC; else if (strncmp (s, "r", 1) == 0) return ZEBRA_ROUTE_RIP; - else if (strncmp (s, "o", 1) == 0) + else if (strncmp (s, "os", 2) == 0) return ZEBRA_ROUTE_OSPF; else if (strncmp (s, "i", 1) == 0) return ZEBRA_ROUTE_ISIS; else if (strncmp (s, "bg", 2) == 0) return ZEBRA_ROUTE_BGP; - else if (strncmp (s, "ba", 2) == 0) + else if (strncmp (s, "h", 1) == 0) + return ZEBRA_ROUTE_HSLS; + else if (strncmp (s, "ol", 2) == 0) + return ZEBRA_ROUTE_OLSR; + else if (strncmp (s, "bat", 3) == 0) + return ZEBRA_ROUTE_BATMAN; + else if (strncmp (s, "bab", 3) == 0) return ZEBRA_ROUTE_BABEL; } if (afi == AFI_IP6) @@ -948,13 +954,19 @@ proto_redistnum(int afi, const char *s) return ZEBRA_ROUTE_STATIC; else if (strncmp (s, "r", 1) == 0) return ZEBRA_ROUTE_RIPNG; - else if (strncmp (s, "o", 1) == 0) + else if (strncmp (s, "os", 2) == 0) return ZEBRA_ROUTE_OSPF6; else if (strncmp (s, "i", 1) == 0) return ZEBRA_ROUTE_ISIS; else if (strncmp (s, "bg", 2) == 0) return ZEBRA_ROUTE_BGP; - else if (strncmp (s, "ba", 2) == 0) + else if (strncmp (s, "h", 1) == 0) + return ZEBRA_ROUTE_HSLS; + else if (strncmp (s, "ol", 2) == 0) + return ZEBRA_ROUTE_OLSR; + else if (strncmp (s, "bat", 3) == 0) + return ZEBRA_ROUTE_BATMAN; + else if (strncmp (s, "bab", 3) == 0) return ZEBRA_ROUTE_BABEL; } return -1; diff --git a/lib/route_types.txt b/lib/route_types.txt index cebf01f..22bda24 100644 --- a/lib/route_types.txt +++ b/lib/route_types.txt @@ -51,13 +51,9 @@ ZEBRA_ROUTE_OSPF, ospf, ospfd, 'O', 1, 0, "OSPF" ZEBRA_ROUTE_OSPF6, ospf6, ospf6d, 'O', 0, 1, "OSPFv6" ZEBRA_ROUTE_ISIS, isis, isisd, 'I', 1, 1, "IS-IS" ZEBRA_ROUTE_BGP, bgp, bgpd, 'B', 1, 1, "BGP" -# HSLS and OLSR both are AFI independent (so: 1, 1), however -# we want to disable for them for general Quagga distribution. -# This at least makes it trivial for users of these protocols -# to 'switch on' redist support (direct numeric entry remaining -# possible). -ZEBRA_ROUTE_HSLS, hsls, hslsd, 'H', 0, 0, "HSLS" -ZEBRA_ROUTE_OLSR, olsr, olsrd, 'o', 0, 0, "OLSR" +ZEBRA_ROUTE_HSLS, hsls, hslsd, 'H', 1, 1, "HSLS" +ZEBRA_ROUTE_OLSR, olsr, olsrd, 'o', 1, 1, "OLSR" +ZEBRA_ROUTE_BATMAN, batman, batmand,'b', 1, 1, "BATMAN" ZEBRA_ROUTE_BABEL, babel, babeld, 'A', 1, 1, "Babel" ## help strings @@ -72,5 +68,6 @@ ZEBRA_ROUTE_OSPF6, "Open Shortest Path First (IPv6) (OSPFv3)" ZEBRA_ROUTE_ISIS, "Intermediate System to Intermediate System (IS-IS)" ZEBRA_ROUTE_BGP, "Border Gateway Protocol (BGP)" ZEBRA_ROUTE_HSLS, "Hazy-Sighted Link State Protocol (HSLS)" -ZEBRA_ROUTE_OLSR, "Optimised Link State Routing (OLSR)" +ZEBRA_ROUTE_OLSR, "Optimized Link State Routing (OLSR)" +ZEBRA_ROUTE_BATMAN, "Better Approach to Mobile Ad-Hoc Networking (BATMAN)" ZEBRA_ROUTE_BABEL, "Babel routing protocol (Babel)" diff --git a/ripd/rip_zebra.c b/ripd/rip_zebra.c index 199e85e..5e344d1 100644 --- a/ripd/rip_zebra.c +++ b/ripd/rip_zebra.c @@ -206,9 +206,12 @@ static struct { {ZEBRA_ROUTE_KERNEL, 1, "kernel"}, {ZEBRA_ROUTE_CONNECT, 1, "connected"}, {ZEBRA_ROUTE_STATIC, 1, "static"}, - {ZEBRA_ROUTE_OSPF, 1, "ospf"}, + {ZEBRA_ROUTE_OSPF, 2, "ospf"}, {ZEBRA_ROUTE_BGP, 2, "bgp"}, - {ZEBRA_ROUTE_BABEL, 2, "babel"}, + {ZEBRA_ROUTE_HSLS, 1, "hsls"}, + {ZEBRA_ROUTE_OLSR, 2, "olsr"}, + {ZEBRA_ROUTE_BATMAN, 3, "batman"}, + {ZEBRA_ROUTE_BABEL, 3, "babel"}, {0, 0, NULL} }; diff --git a/ripngd/ripng_zebra.c b/ripngd/ripng_zebra.c index 8e76606..016c4bb 100644 --- a/ripngd/ripng_zebra.c +++ b/ripngd/ripng_zebra.c @@ -216,9 +216,12 @@ static struct { {ZEBRA_ROUTE_KERNEL, 1, "kernel"}, {ZEBRA_ROUTE_CONNECT, 1, "connected"}, {ZEBRA_ROUTE_STATIC, 1, "static"}, - {ZEBRA_ROUTE_OSPF6, 1, "ospf6"}, + {ZEBRA_ROUTE_OSPF6, 2, "ospf6"}, {ZEBRA_ROUTE_BGP, 2, "bgp"}, - {ZEBRA_ROUTE_BABEL, 2, "babel"}, + {ZEBRA_ROUTE_HSLS, 1, "hsls"}, + {ZEBRA_ROUTE_OLSR, 2, "olsr"}, + {ZEBRA_ROUTE_BATMAN, 3, "batman"}, + {ZEBRA_ROUTE_BABEL, 3, "babel"}, {0, 0, NULL} }; diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index 5909131..92288bd 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -1623,6 +1623,9 @@ netlink_route_multipath (int cmd, struct prefix *p, struct rib *rib, addattr_l (&req.n, sizeof req, RTA_PREFSRC, &nexthop->src.ipv4, bytelen); + if (rib->type == ZEBRA_ROUTE_OLSR) + req.r.rtm_scope = RT_SCOPE_LINK; + if (IS_ZEBRA_DEBUG_KERNEL) zlog_debug("netlink_route_multipath() (single hop): " "nexthop via if %u", nexthop->ifindex); diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index 154e8d5..4d613fd 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -67,6 +67,9 @@ static const struct [ZEBRA_ROUTE_OSPF6] = {ZEBRA_ROUTE_OSPF6, 110}, [ZEBRA_ROUTE_ISIS] = {ZEBRA_ROUTE_ISIS, 115}, [ZEBRA_ROUTE_BGP] = {ZEBRA_ROUTE_BGP, 20 /* IBGP is 200. */}, + [ZEBRA_ROUTE_HSLS] = {ZEBRA_ROUTE_HSLS, 0}, + [ZEBRA_ROUTE_OLSR] = {ZEBRA_ROUTE_OLSR, 0}, + [ZEBRA_ROUTE_BATMAN] = {ZEBRA_ROUTE_BATMAN, 0}, [ZEBRA_ROUTE_BABEL] = {ZEBRA_ROUTE_BABEL, 95}, /* no entry/default: 150 */ }; @@ -403,6 +406,18 @@ nexthop_active_ipv4 (struct rib *rib, struct nexthop *nexthop, int set, } return 0; } + else if (match->type == ZEBRA_ROUTE_OLSR) + { + for (newhop = match->nexthop; newhop; newhop = newhop->next) + if (CHECK_FLAG (newhop->flags, NEXTHOP_FLAG_FIB) + && newhop->type == NEXTHOP_TYPE_IFINDEX) + { + if (nexthop->type == NEXTHOP_TYPE_IPV4) + nexthop->ifindex = newhop->ifindex; + return 1; + } + return 0; + } else { return 0; @@ -507,6 +522,18 @@ nexthop_active_ipv6 (struct rib *rib, struct nexthop *nexthop, int set, } return 0; } + else if (match->type == ZEBRA_ROUTE_OLSR) + { + for (newhop = match->nexthop; newhop; newhop = newhop->next) + if (CHECK_FLAG (newhop->flags, NEXTHOP_FLAG_FIB) + && newhop->type == NEXTHOP_TYPE_IFINDEX) + { + if (nexthop->type == NEXTHOP_TYPE_IPV6) + nexthop->ifindex = newhop->ifindex; + return 1; + } + return 0; + } else { return 0; @@ -1236,6 +1263,8 @@ static const u_char meta_queue_map[ZEBRA_ROUTE_MAX] = { [ZEBRA_ROUTE_ISIS] = 2, [ZEBRA_ROUTE_BGP] = 3, [ZEBRA_ROUTE_HSLS] = 4, + [ZEBRA_ROUTE_OLSR] = 4, + [ZEBRA_ROUTE_BATMAN] = 4, [ZEBRA_ROUTE_BABEL] = 2, }; diff --git a/zebra/zebra_snmp.c b/zebra/zebra_snmp.c index 0fde4bb..23222f4 100644 --- a/zebra/zebra_snmp.c +++ b/zebra/zebra_snmp.c @@ -251,6 +251,12 @@ proto_trans(int type) return 1; /* shouldn't happen */ case ZEBRA_ROUTE_BGP: return 14; /* bgp */ + case ZEBRA_ROUTE_HSLS: + return 1; /* other */ + case ZEBRA_ROUTE_OLSR: + return 1; /* other */ + case ZEBRA_ROUTE_BATMAN: + return 1; /* other */ default: return 1; /* other */ } diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index dafcf75..277cc7a 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -558,7 +558,10 @@ vty_show_ip_route_detail (struct vty *vty, struct route_node *rn) || rib->type == ZEBRA_ROUTE_OSPF || rib->type == ZEBRA_ROUTE_BABEL || rib->type == ZEBRA_ROUTE_ISIS - || rib->type == ZEBRA_ROUTE_BGP) + || rib->type == ZEBRA_ROUTE_BGP + || rib->type == ZEBRA_ROUTE_HSLS + || rib->type == ZEBRA_ROUTE_OLSR + || rib->type == ZEBRA_ROUTE_BATMAN) { time_t uptime; struct tm *tm; @@ -777,7 +780,10 @@ vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib) || rib->type == ZEBRA_ROUTE_OSPF || rib->type == ZEBRA_ROUTE_BABEL || rib->type == ZEBRA_ROUTE_ISIS - || rib->type == ZEBRA_ROUTE_BGP) + || rib->type == ZEBRA_ROUTE_BGP + || rib->type == ZEBRA_ROUTE_HSLS + || rib->type == ZEBRA_ROUTE_OLSR + || rib->type == ZEBRA_ROUTE_BATMAN) { time_t uptime; struct tm *tm; @@ -1536,7 +1542,10 @@ vty_show_ipv6_route_detail (struct vty *vty, struct route_node *rn) || rib->type == ZEBRA_ROUTE_OSPF6 || rib->type == ZEBRA_ROUTE_BABEL || rib->type == ZEBRA_ROUTE_ISIS - || rib->type == ZEBRA_ROUTE_BGP) + || rib->type == ZEBRA_ROUTE_BGP + || rib->type == ZEBRA_ROUTE_HSLS + || rib->type == ZEBRA_ROUTE_OLSR + || rib->type == ZEBRA_ROUTE_BATMAN) { time_t uptime; struct tm *tm; @@ -1716,7 +1725,10 @@ vty_show_ipv6_route (struct vty *vty, struct route_node *rn, || rib->type == ZEBRA_ROUTE_OSPF6 || rib->type == ZEBRA_ROUTE_BABEL || rib->type == ZEBRA_ROUTE_ISIS - || rib->type == ZEBRA_ROUTE_BGP) + || rib->type == ZEBRA_ROUTE_BGP + || rib->type == ZEBRA_ROUTE_HSLS + || rib->type == ZEBRA_ROUTE_OLSR + || rib->type == ZEBRA_ROUTE_BATMAN) { time_t uptime; struct tm *tm; olsrd-0.6.6.2/lib/quagga/src/000077500000000000000000000000001234304727700156215ustar00rootroot00000000000000olsrd-0.6.6.2/lib/quagga/src/client.c000066400000000000000000000121451234304727700172460ustar00rootroot00000000000000/* * OLSRd Quagga plugin * * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg * Copyright (C) 2007-2012 Vasilis Tsiligiannis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation or - at your option - under * the terms of the GNU General Public Licence version 2 but can be * linked to any BSD-Licenced Software with public available sourcecode * */ /* ------------------------------------------------------------------------- * File : client.c * Description : zebra client functions * ------------------------------------------------------------------------- */ #define HAVE_SOCKLEN_T #include #include #include #include "defs.h" #include "olsr.h" #include "log.h" #include "routing_table.h" #include "common.h" #include "quagga.h" #include "packet.h" #include "client.h" static void *my_realloc(void *, size_t, const char *); static void zclient_connect(void); static void * my_realloc(void *buf, size_t s, const char *c) { buf = realloc(buf, s); if (!buf) { OLSR_PRINTF(1, "(QUAGGA) Out of memory: %s!\n", strerror(errno)); olsr_syslog(OLSR_LOG_ERR, "(QUAGGA) Out of memory!\n"); olsr_exit(c, EXIT_FAILURE); } return buf; } static void zclient_connect(void) { int ret; union { struct sockaddr_in sin; struct sockaddr_un sun; } sockaddr; if (close(zebra.sock) < 0) olsr_exit("(QUAGGA) Could not close socket!", EXIT_FAILURE); zebra.sock = socket(zebra.port ? AF_INET : AF_UNIX, SOCK_STREAM, 0); if (zebra.sock < 0) olsr_exit("(QUAGGA) Could not create socket!", EXIT_FAILURE); memset(&sockaddr, 0, sizeof sockaddr); if (zebra.port) { sockaddr.sin.sin_family = AF_INET; sockaddr.sin.sin_port = htons(zebra.port); sockaddr.sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); ret = connect(zebra.sock, (struct sockaddr *)&sockaddr.sin, sizeof sockaddr.sin); } else { sockaddr.sun.sun_family = AF_UNIX; strscpy(sockaddr.sun.sun_path, zebra.sockpath, sizeof(sockaddr.sun.sun_path)); ret = connect(zebra.sock, (struct sockaddr *)&sockaddr.sun, sizeof sockaddr.sun); } if (ret < 0) zebra.status &= ~STATUS_CONNECTED; else zebra.status |= STATUS_CONNECTED; } void zclient_reconnect(void) { struct rt_entry *tmp; zclient_connect(); if (!(zebra.status & STATUS_CONNECTED)) return; // try again next time zebra_hello(ZEBRA_HELLO); if (zebra.options & OPTION_EXPORT) { OLSR_FOR_ALL_RT_ENTRIES(tmp) { zebra_addroute(tmp); } OLSR_FOR_ALL_RT_ENTRIES_END(tmp); } zebra_redistribute(ZEBRA_REDISTRIBUTE_ADD); } int zclient_write(unsigned char *options) { unsigned char *pnt; uint16_t len; int ret; if (!(zebra.status & STATUS_CONNECTED)) return 0; pnt = options; memcpy(&len, pnt, sizeof len); len = ntohs(len); do { ret = write(zebra.sock, pnt, len); if (ret < 0) { if ((errno == EINTR) || (errno == EAGAIN)) { errno = 0; ret = 0; continue; } else { OLSR_PRINTF(1, "(QUAGGA) Disconnected from zebra.\n"); zebra.status &= ~STATUS_CONNECTED; /* TODO: Remove HNAs added from redistribution */ free(options); return -1; } } pnt = pnt + ret; } while ((len -= ret)); free(options); return 0; } unsigned char * zclient_read(ssize_t * size) { unsigned char *buf; ssize_t bytes, bufsize; uint16_t length, offset; int sockstatus; /* initialize variables */ buf = NULL; offset = 0; *size = 0; bufsize = 0; /* save socket status and set non-blocking for read */ sockstatus = fcntl(zebra.sock, F_GETFL); (void)fcntl(zebra.sock, F_SETFL, sockstatus|O_NONBLOCK); /* read whole packages */ do { /* (re)allocate buffer */ if (*size == bufsize) { bufsize += BUFSIZE; buf = my_realloc(buf, bufsize, "QUAGGA: Grow read buffer"); } /* read from socket */ bytes = read(zebra.sock, buf + *size, bufsize - *size); /* handle broken packet */ if (!bytes) { free(buf); return NULL; } /* handle no data available */ if (bytes < 0) { /* handle disconnect */ if (errno != EAGAIN) { // oops - we got disconnected OLSR_PRINTF(1, "(QUAGGA) Disconnected from zebra\n"); zebra.status &= ~STATUS_CONNECTED; /* TODO: Remove HNAs added from redistribution */ } free(buf); return NULL; } *size += bytes; /* detect zebra packet fragmentation */ do { memcpy(&length, buf + offset, sizeof length); length = ntohs(length); offset += length; } while (*size >= (ssize_t) (offset + sizeof length)); /* set blocking socket on fragmented packet */ if (*size != offset) (void)fcntl(zebra.sock, F_SETFL, sockstatus); } while (*size != offset); /* restore socket status */ (void)fcntl(zebra.sock, F_SETFL, sockstatus); return buf; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/quagga/src/client.h000066400000000000000000000020171234304727700172500ustar00rootroot00000000000000/* * OLSRd Quagga plugin * * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg * Copyright (C) 2007-2010 Vasilis Tsiligiannis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation or - at your option - under * the terms of the GNU General Public Licence version 2 but can be * linked to any BSD-Licenced Software with public available sourcecode * */ /* ------------------------------------------------------------------------- * File : client.h * Description : header file for client.c * ------------------------------------------------------------------------- */ #define STATUS_CONNECTED 1 /* Buffer size */ #define BUFSIZE 1024 void zclient_reconnect(void); int zclient_write(unsigned char *); unsigned char *zclient_read(ssize_t *); /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/quagga/src/common.h000066400000000000000000000027231234304727700172660ustar00rootroot00000000000000/* * OLSRd Quagga plugin * * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg * Copyright (C) 2007-2012 Vasilis Tsiligiannis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation or - at your option - under * the terms of the GNU General Public Licence version 2 but can be * linked to any BSD-Licenced Software with public available sourcecode * */ /* ------------------------------------------------------------------------- * File : common.h * Description : common header file * ------------------------------------------------------------------------- */ #define OPTION_EXPORT 1 #define OPTION_ROUTE_ADDITIONAL 2 /* Zebra route types */ #define ZEBRA_ROUTE_OLSR 11 #define ZEBRA_ROUTE_MAX 14 #include "process_routes.h" struct zebra { unsigned char status; unsigned char options; int sock; unsigned char redistribute[ZEBRA_ROUTE_MAX]; unsigned char distance; unsigned char flags; char *sockpath; unsigned int port; unsigned char version; export_route_function orig_addroute_function; export_route_function orig_addroute6_function; export_route_function orig_delroute_function; export_route_function orig_delroute6_function; }; extern struct zebra zebra; /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/quagga/src/olsrd_plugin.c000066400000000000000000000045231234304727700204720ustar00rootroot00000000000000/* * OLSRd Quagga plugin * * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg * Copyright (C) 2007-2010 Vasilis Tsiligiannis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation or - at your option - under * the terms of the GNU General Public Licence version 2 but can be * linked to any BSD-Licenced Software with public available sourcecode * */ /* ------------------------------------------------------------------------- * File : olsrd_plugin.c * Description : functions to setup plugin * ------------------------------------------------------------------------- */ #include "olsrd_plugin.h" #include "scheduler.h" #include "defs.h" #include "quagga.h" #include "plugin.h" #include "parse.h" #define PLUGIN_NAME "OLSRD quagga plugin" #define PLUGIN_VERSION "0.2.2" #define PLUGIN_AUTHOR "Immo 'FaUl' Wehrenberg" #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR #define PLUGIN_INTERFACE_VERSION 5 static void __attribute__ ((constructor)) my_init(void); static void __attribute__ ((destructor)) my_fini(void); int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } static const struct olsrd_plugin_parameters plugin_parameters[] = { {.name = "Redistribute",.set_plugin_parameter = &zplugin_redistribute,}, {.name = "ExportRoutes",.set_plugin_parameter = &zplugin_exportroutes,}, {.name = "Distance",.set_plugin_parameter = &zplugin_distance,}, {.name = "LocalPref",.set_plugin_parameter = &zplugin_localpref,}, {.name = "SockPath",.set_plugin_parameter = &zplugin_sockpath,.addon = {PATH_MAX},}, {.name = "Port",.set_plugin_parameter = &zplugin_port,}, {.name = "Version",.set_plugin_parameter = &zplugin_version,}, }; void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = ARRAYSIZE(plugin_parameters); } int olsrd_plugin_init(void) { olsr_start_timer(1 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, &zparse, NULL, 0); return 0; } static void my_init(void) { zebra_init(); } static void my_fini(void) { zebra_fini(); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/quagga/src/packet.c000066400000000000000000000073531234304727700172440ustar00rootroot00000000000000/* * OLSRd Quagga plugin * * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg * Copyright (C) 2007-2012 Vasilis Tsiligiannis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation or - at your option - under * the terms of the GNU General Public Licence version 2 but can be * linked to any BSD-Licenced Software with public available sourcecode * */ /* ------------------------------------------------------------------------- * File : packet.c * Description : zebra packet creation functions * ------------------------------------------------------------------------- */ #include "defs.h" #include "olsr.h" #include "common.h" #include "packet.h" unsigned char *zpacket_route(uint16_t cmd, struct zroute *r) { int count; uint8_t len; uint16_t size, safi; uint32_t ind, metric; unsigned char *cmdopt, *t; cmdopt = olsr_malloc(ZEBRA_MAX_PACKET_SIZ, "QUAGGA: New route packet"); t = &cmdopt[2]; switch (zebra.version) { case 0: *t++ = (unsigned char) cmd; break; case 1: case 2: *t++ = ZEBRA_HEADER_MARKER; *t++ = zebra.version; cmd = htons(cmd); memcpy(t, &cmd, sizeof cmd); t += sizeof cmd; break; default: olsr_exit("(QUAGGA) Unsupported zebra packet version!\n", EXIT_FAILURE); break; } *t++ = r->type; *t++ = r->flags; *t++ = r->message; switch (zebra.version) { case 0: case 1: break; case 2: safi = htons(r->safi); memcpy(t, &safi, sizeof safi); t += sizeof safi; break; default: olsr_exit("(QUAGGA) Unsupported zebra packet version!\n", EXIT_FAILURE); break; } *t++ = r->prefixlen; len = (r->prefixlen + 7) / 8; if (olsr_cnf->ip_version == AF_INET) memcpy(t, &r->prefix.v4.s_addr, len); else memcpy(t, r->prefix.v6.s6_addr, len); t = t + len; if (r->message & ZAPI_MESSAGE_NEXTHOP) { *t++ = r->nexthop_num + r->ifindex_num; for (count = 0; count < r->nexthop_num; count++) { if (olsr_cnf->ip_version == AF_INET) { *t++ = ZEBRA_NEXTHOP_IPV4; memcpy(t, &r->nexthop[count].v4.s_addr, sizeof r->nexthop[count].v4.s_addr); t += sizeof r->nexthop[count].v4.s_addr; } else { *t++ = ZEBRA_NEXTHOP_IPV6; memcpy(t, r->nexthop[count].v6.s6_addr, sizeof r->nexthop[count].v6.s6_addr); t += sizeof r->nexthop[count].v6.s6_addr; } } for (count = 0; count < r->ifindex_num; count++) { *t++ = ZEBRA_NEXTHOP_IFINDEX; ind = htonl(r->ifindex[count]); memcpy(t, &ind, sizeof ind); t += sizeof ind; } } if ((r->message & ZAPI_MESSAGE_DISTANCE) > 0) *t++ = r->distance; if ((r->message & ZAPI_MESSAGE_METRIC) > 0) { metric = htonl(r->metric); memcpy(t, &metric, sizeof metric); t += sizeof metric; } size = htons(t - cmdopt); memcpy(cmdopt, &size, sizeof size); return cmdopt; } unsigned char *zpacket_redistribute (uint16_t cmd, unsigned char type) { unsigned char *data, *pnt; uint16_t size; data = olsr_malloc(ZEBRA_MAX_PACKET_SIZ , "QUAGGA: New redistribute packet"); pnt = &data[2]; switch (zebra.version) { case 0: *pnt++ = (unsigned char) cmd; break; case 1: case 2: *pnt++ = ZEBRA_HEADER_MARKER; *pnt++ = zebra.version; cmd = htons(cmd); memcpy(pnt, &cmd, sizeof cmd); pnt += sizeof cmd; break; default: olsr_exit("(QUAGGA) Unsupported zebra packet version!\n", EXIT_FAILURE); break; } *pnt++ = type; size = htons(pnt - data); memcpy(data, &size, sizeof size); return data; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/quagga/src/packet.h000066400000000000000000000042531234304727700172450ustar00rootroot00000000000000/* * OLSRd Quagga plugin * * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg * Copyright (C) 2007-2012 Vasilis Tsiligiannis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation or - at your option - under * the terms of the GNU General Public Licence version 2 but can be * linked to any BSD-Licenced Software with public available sourcecode * */ /* ------------------------------------------------------------------------- * File : packet.h * Description : header file for packet.c * ------------------------------------------------------------------------- */ /* Zebra packet size */ #define ZEBRA_MAX_PACKET_SIZ 4096 /* Zebra header marker */ #ifndef ZEBRA_HEADER_MARKER #define ZEBRA_HEADER_MARKER 255 #endif /* ZEBRA_HEADER_MARKER */ /* Zebra message types */ #define ZEBRA_IPV4_ROUTE_ADD 7 #define ZEBRA_IPV4_ROUTE_DELETE 8 #define ZEBRA_IPV6_ROUTE_ADD 9 #define ZEBRA_IPV6_ROUTE_DELETE 10 #define ZEBRA_REDISTRIBUTE_ADD 11 #define ZEBRA_REDISTRIBUTE_DELETE 12 #define ZEBRA_HELLO 23 /* Zebra nexthop flags */ #define ZEBRA_NEXTHOP_IFINDEX 1 #define ZEBRA_NEXTHOP_IPV4 3 #define ZEBRA_NEXTHOP_IPV6 6 /* Zebra message flags */ #define ZAPI_MESSAGE_NEXTHOP 0x01 #define ZAPI_MESSAGE_IFINDEX 0x02 #define ZAPI_MESSAGE_DISTANCE 0x04 #define ZAPI_MESSAGE_METRIC 0x08 /* Subsequent Address Family Identifier */ #define SAFI_UNICAST 1 /* Zebra flags */ #define ZEBRA_FLAG_SELECTED 0x10 struct zroute { unsigned char type; unsigned char flags; unsigned char message; uint16_t safi; unsigned char prefixlen; union olsr_ip_addr prefix; unsigned char nexthop_num; union olsr_ip_addr *nexthop; unsigned char ifindex_num; uint32_t *ifindex; uint32_t metric; uint8_t distance; }; unsigned char *zpacket_route(uint16_t, struct zroute *); unsigned char *zpacket_redistribute(uint16_t, unsigned char); /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/quagga/src/parse.c000066400000000000000000000132161234304727700171020ustar00rootroot00000000000000/* * OLSRd Quagga plugin * * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg * Copyright (C) 2007-2012 Vasilis Tsiligiannis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation or - at your option - under * the terms of the GNU General Public Licence version 2 but can be * linked to any BSD-Licenced Software with public available sourcecode * */ /* ------------------------------------------------------------------------- * File : parse.c * Description : functions to parse received zebra packets * ------------------------------------------------------------------------- */ #include "defs.h" #include "olsr.h" #include "common.h" #include "packet.h" #include "client.h" #include "parse.h" static void free_zroute(struct zroute *); static struct zroute *zparse_route(unsigned char *); static void free_zroute(struct zroute *r) { if(r->ifindex_num) free(r->ifindex); if(r->nexthop_num) free(r->nexthop); } static struct zroute *zparse_route(unsigned char *opt) { struct zroute *r; int c; size_t size; uint16_t length; unsigned char *pnt; memcpy(&length, opt, sizeof length); length = ntohs (length); r = olsr_malloc(sizeof *r, "QUAGGA: New zebra route"); pnt = &opt[3]; switch (zebra.version) { case 0: break; case 1: case 2: pnt = &opt[6]; break; default: olsr_exit("(QUAGGA) Unsupported zebra packet version!\n", EXIT_FAILURE); break; } r->type = *pnt++; r->flags = *pnt++; r->message = *pnt++; r->prefixlen = *pnt++; size = (r->prefixlen + 7) / 8; memset(&r->prefix, 0, sizeof r->prefix); if (olsr_cnf->ip_version == AF_INET) memcpy(&r->prefix.v4.s_addr, pnt, size); else memcpy(r->prefix.v6.s6_addr, pnt, size); pnt += size; if (r->message & ZAPI_MESSAGE_NEXTHOP) { r->nexthop_num = *pnt++; r->nexthop = olsr_malloc((sizeof *r->nexthop) * r->nexthop_num, "QUAGGA: New zebra route nexthop"); for (c = 0; c < r->nexthop_num; c++) { if (olsr_cnf->ip_version == AF_INET) { memcpy(&r->nexthop[c].v4.s_addr, pnt, sizeof r->nexthop[c].v4.s_addr); pnt += sizeof r->nexthop[c].v4.s_addr; } else { memcpy(r->nexthop[c].v6.s6_addr, pnt, sizeof r->nexthop[c].v6.s6_addr); pnt += sizeof r->nexthop[c].v6.s6_addr; } } } if (r->message & ZAPI_MESSAGE_IFINDEX) { r->ifindex_num = *pnt++; r->ifindex = olsr_malloc(sizeof(uint32_t) * r->ifindex_num, "QUAGGA: New zebra route ifindex"); for (c = 0; c < r->ifindex_num; c++) { memcpy(&r->ifindex[c], pnt, sizeof r->ifindex[c]); r->ifindex[c] = ntohl (r->ifindex[c]); pnt += sizeof r->ifindex[c]; } } switch (zebra.version) { case 0: case 1: case 2: break; default: olsr_exit("(QUAGGA) Unsupported zebra packet version!\n", EXIT_FAILURE); break; } if (r->message & ZAPI_MESSAGE_DISTANCE) { r->distance = *pnt++; } // Quagga v0.98.6 BUG workaround: metric is always sent by zebra // even without ZAPI_MESSAGE_METRIC message. if ((r->message & ZAPI_MESSAGE_METRIC) || !zebra.version) { memcpy(&r->metric, pnt, sizeof r->metric); r->metric = ntohl(r->metric); pnt += sizeof r->metric; } if (pnt - opt != length) { olsr_exit("(QUAGGA) Length does not match!", EXIT_FAILURE); } return r; } void zparse(void *foo __attribute__ ((unused))) { unsigned char *data, *f; uint16_t command; uint16_t length; ssize_t len; struct zroute *route; if (!(zebra.status & STATUS_CONNECTED)) { zclient_reconnect(); return; } data = zclient_read(&len); if (data) { f = data; do { memcpy(&length, f, sizeof length); length = ntohs (length); if (!length) // something weired happened olsr_exit("(QUAGGA) Zero message length!", EXIT_FAILURE); command = f[2]; switch (zebra.version) { case 0: break; case 1: case 2: if ((f[2] != ZEBRA_HEADER_MARKER) || (f[3] != zebra.version)) olsr_exit("(QUAGGA) Invalid zebra header received!", EXIT_FAILURE); memcpy(&command, &f[4], sizeof command); command = ntohs (command); break; default: olsr_exit("(QUAGGA) Unsupported zebra packet version!\n", EXIT_FAILURE); break; } if (olsr_cnf->ip_version == AF_INET) { switch (command) { case ZEBRA_IPV4_ROUTE_ADD: route = zparse_route(f); ip_prefix_list_add(&olsr_cnf->hna_entries, &route->prefix, route->prefixlen); free_zroute(route); free(route); break; case ZEBRA_IPV4_ROUTE_DELETE: route = zparse_route(f); ip_prefix_list_remove(&olsr_cnf->hna_entries, &route->prefix, route->prefixlen); free_zroute(route); free(route); break; default: break; } } else { switch (command) { case ZEBRA_IPV6_ROUTE_ADD: route = zparse_route(f); ip_prefix_list_add(&olsr_cnf->hna_entries, &route->prefix, route->prefixlen); free_zroute(route); free(route); break; case ZEBRA_IPV6_ROUTE_DELETE: route = zparse_route(f); ip_prefix_list_remove(&olsr_cnf->hna_entries, &route->prefix, route->prefixlen); free_zroute(route); free(route); break; default: break; } } f += length; } while ((f - data) < len); free(data); } } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/quagga/src/parse.h000066400000000000000000000015631234304727700171110ustar00rootroot00000000000000/* * OLSRd Quagga plugin * * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg * Copyright (C) 2007-2010 Vasilis Tsiligiannis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation or - at your option - under * the terms of the GNU General Public Licence version 2 but can be * linked to any BSD-Licenced Software with public available sourcecode * */ /* ------------------------------------------------------------------------- * File : parse.h * Description : header file for parse.c * ------------------------------------------------------------------------- */ void zparse(void*); /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/quagga/src/plugin.c000066400000000000000000000105441234304727700172670ustar00rootroot00000000000000/* * OLSRd Quagga plugin * * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg * Copyright (C) 2007-2012 Vasilis Tsiligiannis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation or - at your option - under * the terms of the GNU General Public Licence version 2 but can be * linked to any BSD-Licenced Software with public available sourcecode * */ /* ------------------------------------------------------------------------- * File : plugin.c * Description : functions to set zebra plugin parameters * ------------------------------------------------------------------------- */ #include "defs.h" #include "olsr.h" #include "log.h" #include "olsrd_plugin.h" #include "plugin_util.h" #include "net_olsr.h" #include "common.h" #include "quagga.h" #include "packet.h" #include "plugin.h" static void *my_realloc(void *, size_t, const char *); static void *my_realloc(void *buf, size_t s, const char *c) { buf = realloc(buf, s); if (!buf) { OLSR_PRINTF(1, "(QUAGGA) Out of memory: %s!\n", strerror(errno)); olsr_syslog(OLSR_LOG_ERR, "(QUAGGA) Out of memory!\n"); olsr_exit(c, EXIT_FAILURE); } return buf; } int zplugin_redistribute(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { const char *zroute_types[] = { "system", "kernel", "connect", "static", "rip", "ripng", "ospf", "ospf6", "isis", "bgp", "hsls", "olsr", "batman", "babel" }; unsigned int i; for (i = 0; i < ARRAYSIZE(zroute_types) && i < ZEBRA_ROUTE_MAX; i++) { if (!strcmp(value, zroute_types[i])) zebra.redistribute[i] = 1; } return 0; } int zplugin_exportroutes(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { if (!strcmp(value, "only")) { olsr_addroute_function = zebra_addroute; olsr_delroute_function = zebra_delroute; olsr_addroute6_function = zebra_addroute; olsr_delroute6_function = zebra_delroute; zebra.options |= OPTION_EXPORT; } else if (!strcmp(value, "additional")) { zebra.orig_addroute_function = olsr_addroute_function; zebra.orig_delroute_function = olsr_delroute_function; zebra.orig_addroute6_function = olsr_addroute6_function; zebra.orig_delroute6_function = olsr_delroute6_function; olsr_addroute_function = zebra_addroute; olsr_delroute_function = zebra_delroute; olsr_addroute6_function = zebra_addroute; olsr_delroute6_function = zebra_delroute; zebra.options |= OPTION_EXPORT | OPTION_ROUTE_ADDITIONAL; } return 0; } int zplugin_distance(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { int distance; if (set_plugin_int(value, &distance, addon)) return 1; if (distance < 0 || distance > 255) return 1; zebra.distance = distance; return 0; } int zplugin_localpref(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { int b; if (set_plugin_boolean(value, &b, addon)) return 1; if (b) zebra.flags &= ZEBRA_FLAG_SELECTED; return 0; } int zplugin_sockpath(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon) { size_t len; char sockpath[PATH_MAX]; if (set_plugin_string(value, &sockpath, addon)) return 1; len = strlen(sockpath) + 1; zebra.sockpath = my_realloc(zebra.sockpath, len, "QUAGGA: Grow socket path"); memcpy(zebra.sockpath, sockpath, len); return 0; } int zplugin_port(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { unsigned int port; if (set_plugin_port(value, &port, addon)) return 1; zebra.port = port; return 0; } int zplugin_version(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { int version; if (set_plugin_int(value, &version, addon)) return 1; if (version < 0 || version > 2) return 1; zebra.version = version; return 0; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/quagga/src/plugin.h000066400000000000000000000025171234304727700172750ustar00rootroot00000000000000/* * OLSRd Quagga plugin * * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg * Copyright (C) 2007-2010 Vasilis Tsiligiannis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation or - at your option - under * the terms of the GNU General Public Licence version 2 but can be * linked to any BSD-Licenced Software with public available sourcecode * */ /* ------------------------------------------------------------------------- * File : plugin.h * Description : header file for plugin.c * ------------------------------------------------------------------------- */ int zplugin_redistribute(const char*, void*, set_plugin_parameter_addon); int zplugin_exportroutes(const char*, void*, set_plugin_parameter_addon); int zplugin_distance(const char*, void*, set_plugin_parameter_addon); int zplugin_localpref(const char*, void*, set_plugin_parameter_addon); int zplugin_sockpath(const char*, void*, set_plugin_parameter_addon); int zplugin_port(const char*, void*, set_plugin_parameter_addon); int zplugin_version(const char*, void*, set_plugin_parameter_addon); /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/quagga/src/quagga.c000066400000000000000000000135521234304727700172400ustar00rootroot00000000000000/* * OLSRd Quagga plugin * * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg * Copyright (C) 2007-2013 Vasilis Tsiligiannis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation or - at your option - under * the terms of the GNU General Public Licence version 2 but can be * linked to any BSD-Licenced Software with public available sourcecode * */ /* ------------------------------------------------------------------------- * File : quagga.c * Description : functions to interface zebra with olsrd * ------------------------------------------------------------------------- */ #include "defs.h" #include "olsr.h" #include "log.h" #include "common.h" #include "quagga.h" #include "packet.h" #include "client.h" struct zebra zebra; void zebra_init(void) { memset(&zebra, 0, sizeof zebra); zebra.sockpath = olsr_malloc(sizeof ZEBRA_SOCKPATH + 1, "QUAGGA: New socket path"); strscpy(zebra.sockpath, ZEBRA_SOCKPATH, sizeof ZEBRA_SOCKPATH); } void zebra_fini(void) { struct rt_entry *tmp; if (zebra.options & OPTION_EXPORT) { OLSR_FOR_ALL_RT_ENTRIES(tmp) { zebra_delroute(tmp); } OLSR_FOR_ALL_RT_ENTRIES_END(tmp); } zebra_redistribute(ZEBRA_REDISTRIBUTE_DELETE); } int zebra_addroute(const struct rt_entry *r) { struct zroute route; int retval; route.distance = 0; route.type = ZEBRA_ROUTE_OLSR; route.flags = zebra.flags; route.message = ZAPI_MESSAGE_NEXTHOP | ZAPI_MESSAGE_METRIC; route.safi = SAFI_UNICAST; route.prefixlen = r->rt_dst.prefix_len; if (olsr_cnf->ip_version == AF_INET) route.prefix.v4.s_addr = r->rt_dst.prefix.v4.s_addr; else memcpy(route.prefix.v6.s6_addr, r->rt_dst.prefix.v6.s6_addr, sizeof route.prefix.v6.s6_addr); route.ifindex_num = 0; route.ifindex = NULL; route.nexthop_num = 0; route.nexthop = NULL; if ((olsr_cnf->ip_version == AF_INET && r->rt_best->rtp_nexthop.gateway.v4.s_addr == r->rt_dst.prefix.v4.s_addr && route.prefixlen == 32) || (olsr_cnf->ip_version == AF_INET6 && !memcmp(r->rt_best->rtp_nexthop.gateway.v6.s6_addr, r->rt_dst.prefix.v6.s6_addr, sizeof r->rt_best->rtp_nexthop.gateway.v6.s6_addr) && route.prefixlen == 128)) { route.ifindex_num++; route.ifindex = olsr_malloc(sizeof *route.ifindex, "QUAGGA: New zebra route ifindex"); *route.ifindex = r->rt_best->rtp_nexthop.iif_index; } else { route.nexthop_num++; route.nexthop = olsr_malloc(sizeof *route.nexthop, "QUAGGA: New zebra route nexthop"); if (olsr_cnf->ip_version == AF_INET) route.nexthop->v4.s_addr = r->rt_best->rtp_nexthop.gateway.v4.s_addr; else memcpy(route.nexthop->v6.s6_addr, r->rt_best->rtp_nexthop.gateway.v6.s6_addr, sizeof route.nexthop->v6.s6_addr); } route.metric = r->rt_best->rtp_metric.hops; if (zebra.distance) { route.message |= ZAPI_MESSAGE_DISTANCE; route.distance = zebra.distance; } retval = zclient_write(zpacket_route(olsr_cnf->ip_version == AF_INET ? ZEBRA_IPV4_ROUTE_ADD : ZEBRA_IPV6_ROUTE_ADD, &route)); if(!retval && zebra.options & OPTION_ROUTE_ADDITIONAL) retval = olsr_cnf->ip_version == AF_INET ? zebra.orig_addroute_function(r) : zebra.orig_addroute6_function(r); free(route.ifindex); free(route.nexthop); return retval; } int zebra_delroute(const struct rt_entry *r) { struct zroute route; int retval; route.distance = 0; route.type = ZEBRA_ROUTE_OLSR; route.flags = zebra.flags; route.message = ZAPI_MESSAGE_NEXTHOP | ZAPI_MESSAGE_METRIC; route.safi = SAFI_UNICAST; route.prefixlen = r->rt_dst.prefix_len; if (olsr_cnf->ip_version == AF_INET) route.prefix.v4.s_addr = r->rt_dst.prefix.v4.s_addr; else memcpy(route.prefix.v6.s6_addr, r->rt_dst.prefix.v6.s6_addr, sizeof route.prefix.v6.s6_addr); route.ifindex_num = 0; route.ifindex = NULL; route.nexthop_num = 0; route.nexthop = NULL; if ((olsr_cnf->ip_version == AF_INET && r->rt_nexthop.gateway.v4.s_addr == r->rt_dst.prefix.v4.s_addr && route.prefixlen == 32) || (olsr_cnf->ip_version == AF_INET6 && !memcmp(r->rt_nexthop.gateway.v6.s6_addr, r->rt_dst.prefix.v6.s6_addr, sizeof r->rt_nexthop.gateway.v6.s6_addr) && route.prefixlen == 128)) { route.ifindex_num++; route.ifindex = olsr_malloc(sizeof *route.ifindex, "QUAGGA: New zebra route ifindex"); *route.ifindex = r->rt_nexthop.iif_index; } else { route.nexthop_num++; route.nexthop = olsr_malloc(sizeof *route.nexthop, "QUAGGA: New zebra route nexthop"); if (olsr_cnf->ip_version == AF_INET) route.nexthop->v4.s_addr = r->rt_nexthop.gateway.v4.s_addr; else memcpy(route.nexthop->v6.s6_addr, r->rt_nexthop.gateway.v6.s6_addr, sizeof route.nexthop->v6.s6_addr); } route.metric = 0; if (zebra.distance) { route.message |= ZAPI_MESSAGE_DISTANCE; route.distance = zebra.distance; } retval = zclient_write(zpacket_route(olsr_cnf->ip_version == AF_INET ? ZEBRA_IPV4_ROUTE_DELETE : ZEBRA_IPV6_ROUTE_DELETE, &route)); if(!retval && zebra.options & OPTION_ROUTE_ADDITIONAL) retval = olsr_cnf->ip_version == AF_INET ? zebra.orig_delroute_function(r) : zebra.orig_delroute6_function(r); free(route.ifindex); free(route.nexthop); return retval; } void zebra_redistribute(uint16_t cmd) { unsigned char type; for (type = 0; type < ZEBRA_ROUTE_MAX; type++) if (zebra.redistribute[type]) { if (zclient_write(zpacket_redistribute(cmd, type)) < 0) olsr_exit("(QUAGGA) Could not write redistribute packet!", EXIT_FAILURE); } } void zebra_hello(uint16_t cmd) { if (zclient_write(zpacket_redistribute(cmd, ZEBRA_ROUTE_OLSR)) < 0) olsr_exit("(QUAGGA) Could not write hello packet!", EXIT_FAILURE); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/quagga/src/quagga.h000066400000000000000000000023411234304727700172370ustar00rootroot00000000000000/* * OLSRd Quagga plugin * * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg * Copyright (C) 2007-2012 Vasilis Tsiligiannis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation or - at your option - under * the terms of the GNU General Public Licence version 2 but can be * linked to any BSD-Licenced Software with public available sourcecode * */ /* ------------------------------------------------------------------------- * File : quagga.h * Description : header file for quagga.c * ------------------------------------------------------------------------- */ #include "routing_table.h" /* Zebra socket */ #ifndef ZEBRA_SOCKPATH #define ZEBRA_SOCKPATH "/var/run/quagga/zserv.api" #endif /* ZEBRA_SOCKPATH */ /* Quagga plugin flags */ void zebra_init(void); void zebra_fini(void); int zebra_addroute(const struct rt_entry *); int zebra_delroute(const struct rt_entry *); void zebra_redistribute(uint16_t cmd); void zebra_hello(uint16_t cmd); /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/quagga/version-script.txt000066400000000000000000000002051234304727700205570ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/secure/000077500000000000000000000000001234304727700150535ustar00rootroot00000000000000olsrd-0.6.6.2/lib/secure/CHANGELOG000066400000000000000000000015611234304727700162700ustar00rootroot00000000000000This changelog states changes from version 0.2 0.6 - Adjustments made to ensure data going out is converted to network byte ordering. Also, to ensure incoming data is converted before it is used and before checksums are calculated as well. 0.5 - A local MD5 implementation can now be compiled into the plugin so that no external library is needed. Should be great for embedded systems. MD5 might not be super-secure, but hey... it still takes quite some effort to break ;) 0.4 - Plugin now compiles under FreeBSD and win32. To compile under win32(cygwin) you have to make sure the openssl include directory is present under /usr/include/mingw/ The plugin is not tested under win32. 0.3 - Only some minor fixes to make the plugin work with olsrd 0.4.6. Dynamic interface removal/addition supported. olsrd-0.6.6.2/lib/secure/Makefile000066400000000000000000000045431234304727700165210ustar00rootroot00000000000000# The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_secure PLUGIN_VER = 0.6 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc ifdef USE_OPENSSL CPPFLAGS += -DUSE_OPENSSL LIBS += -lssl -lcrypto endif default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) olsrd-0.6.6.2/lib/secure/README_SECURE000066400000000000000000000030431234304727700170010ustar00rootroot00000000000000 Secure OLSR 0.4 implementation notes (c)Andreas Tonnesen 2004 This document contains information on how to use the secure OLSR plugin with the UniK olsr daemon. It does _not_ cover secure OLSR protocol issues. Lines starting with '# ' indicates shell commands. NOTES The plugin interface and olsrd output buffering was heavily rewritten for the 0.4.8 release. The plugin should work with this release - but has not been tested much. COMPILING To compile simply do: # make This compiles the local MD5 function and the plugin has no external dependencies. If you want the plugin to use SHA-1 using the openssl libs do: # make USE_OPENSSL=1 INSTALLING To install: # make install This will run ldconfig to update the dynamic linker. It might take a while. USAGE To make olsrd load the secure OLSR plugin add the following in the olsrd configuration file: LoadPlugin "olsrd_secure.so.0.6" { PlParam "Keyfile" "FILENAME" } replacing FILENAME with the full path of the file containing the shared key. The plugin uses this shared secret key for signature generation and verification. For nodes to participate in the OLSR routing domain they need to use the key used by the other nodes. The key is 128-bits of size and is read from the specified file from the config file or by default from: /etc/olsrd.d/olsrd_secure_key Copy the key to this file an all nodes. The plugin will terminate olsrd if this file cannot be found. Now start olsrd and the let the plugin do its thing :) - Andreas olsrd-0.6.6.2/lib/secure/src/000077500000000000000000000000001234304727700156425ustar00rootroot00000000000000olsrd-0.6.6.2/lib/secure/src/md5.c000066400000000000000000000231701234304727700164760ustar00rootroot00000000000000 /* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm */ /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. License to copy and use this software is granted provided that it is identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing this software or this function. License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing the derived work. RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this documentation and/or software. */ #include "md5.h" #include /* Constants for MD5Transform routine. */ #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 static const unsigned char PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* F, G, H and I are basic MD5 functions. */ #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) /* ROTATE_LEFT rotates x left n bits. */ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. Rotation is separate from addition to prevent recomputation. */ #define FF(a, b, c, d, x, s, ac) { \ (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define GG(a, b, c, d, x, s, ac) { \ (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define HH(a, b, c, d, x, s, ac) { \ (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define II(a, b, c, d, x, s, ac) { \ (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define MD5_memcpy(dst, src, len) memcpy((dst), (src), (len)) #define MD5_memset(dst, val, len) memset((dst), (val), (len)) /* Encodes input (UINT4) into output (unsigned char). Assumes len is a multiple of 4. */ static void Encode(unsigned char *output, UINT4 * input, unsigned int len) { unsigned int i, j; for (i = 0, j = 0; j < len; i++, j += 4) { output[j] = (unsigned char)(input[i] & 0xff); output[j + 1] = (unsigned char)((input[i] >> 8) & 0xff); output[j + 2] = (unsigned char)((input[i] >> 16) & 0xff); output[j + 3] = (unsigned char)((input[i] >> 24) & 0xff); } } /* Decodes input (unsigned char) into output (UINT4). Assumes len is a multiple of 4. */ static void Decode(UINT4 * output, const unsigned char *input, unsigned int len) { unsigned int i, j; for (i = 0, j = 0; j < len; i++, j += 4) output[i] = ((UINT4) input[j]) | (((UINT4) input[j + 1]) << 8) | (((UINT4) input[j + 2]) << 16) | (((UINT4) input[j + 3]) << 24); } /* MD5 basic transformation. Transforms state based on block. */ static void MD5Transform(UINT4 state[4], const unsigned char block[64]) { UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; Decode(x, block, 64); /* Round 1 */ FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */ FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */ FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */ FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */ FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */ FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */ FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */ FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */ FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */ FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */ FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ /* Round 2 */ GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */ GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */ GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */ GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */ GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */ GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */ GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */ GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */ GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */ GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */ GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ /* Round 3 */ HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */ HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */ HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */ HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */ HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */ HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */ HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */ HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */ HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */ HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */ /* Round 4 */ II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */ II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */ II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */ II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */ II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */ II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */ II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */ II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */ II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */ II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; /* Zeroize sensitive information. */ MD5_memset((POINTER) x, 0, sizeof(x)); } /* MD5 initialization. Begins an MD5 operation, writing a new context. */ void MD5Init(MD5_CTX * context) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. */ context->state[0] = 0x67452301; context->state[1] = 0xefcdab89; context->state[2] = 0x98badcfe; context->state[3] = 0x10325476; } /* MD5 block update operation. Continues an MD5 message-digest operation, processing another message block, and updating the context. */ void MD5Update(MD5_CTX * context, const unsigned char *input, const unsigned int inputLen) { unsigned int i, idx, partLen; /* Compute number of bytes mod 64 */ idx = (unsigned int)((context->count[0] >> 3) & 0x3F); /* Update number of bits */ if ((context->count[0] += ((UINT4) inputLen << 3)) < ((UINT4) inputLen << 3)) context->count[1]++; context->count[1] += ((UINT4) inputLen >> 29); partLen = 64 - idx; /* Transform as many times as possible. */ if (inputLen >= partLen) { MD5_memcpy((POINTER) & context->buffer[idx], input, partLen); MD5Transform(context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) MD5Transform(context->state, &input[i]); idx = 0; } else i = 0; /* Buffer remaining input */ MD5_memcpy((POINTER) & context->buffer[idx], &input[i], inputLen - i); } /* MD5 finalization. Ends an MD5 message-digest operation, writing the the message digest and zeroizing the context. */ void MD5Final(unsigned char digest[16], MD5_CTX * context) { unsigned char bits[8]; unsigned int idx, padLen; /* Save number of bits */ Encode(bits, context->count, 8); /* Pad out to 56 mod 64. */ idx = (unsigned int)((context->count[0] >> 3) & 0x3f); padLen = (idx < 56) ? (56 - idx) : (120 - idx); MD5Update(context, PADDING, padLen); /* Append length (before padding) */ MD5Update(context, bits, 8); /* Store state in digest */ Encode(digest, context->state, 16); /* Zeroize sensitive information. */ MD5_memset((POINTER) context, 0, sizeof(*context)); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/secure/src/md5.h000066400000000000000000000032521234304727700165020ustar00rootroot00000000000000 /* MD5.H - header file for MD5C.C */ /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. License to copy and use this software is granted provided that it is identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing this software or this function. License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing the derived work. RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this documentation and/or software. */ #ifndef _MD5_H_ #define _MD5_H_ #include /* POINTER defines a generic pointer type */ typedef uint8_t *POINTER; /* UINT2 defines a two byte word */ typedef uint16_t UINT2; /* UINT4 defines a four byte word */ typedef uint32_t UINT4; /* MD5 context. */ typedef struct { UINT4 state[4]; /* state (ABCD) */ UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ unsigned char buffer[64]; /* input buffer */ } MD5_CTX; void MD5Init(MD5_CTX *); void MD5Update(MD5_CTX *, const unsigned char *, const unsigned int); void MD5Final(unsigned char[16], MD5_CTX *); #endif /* _MD5_H_ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/secure/src/olsrd_plugin.c000066400000000000000000000074621234304727700205200ustar00rootroot00000000000000 /* * Secure OLSR plugin * http://www.olsr.org * * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsrd, olsr.org nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */ #include "olsrd_plugin.h" #include "olsrd_secure.h" #include #include #define PLUGIN_NAME "OLSRD signature plugin" #define PLUGIN_VERSION "0.5" #define PLUGIN_AUTHOR "Andreas Tonnesen" #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR #define PLUGIN_INTERFACE_VERSION 5 static void my_init(void) __attribute__ ((constructor)); static void my_fini(void) __attribute__ ((destructor)); /* * Defines the version of the plugin interface that is used * THIS IS NOT THE VERSION OF YOUR PLUGIN! * Do not alter unless you know what you are doing! */ int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } /** *Constructor */ static void my_init(void) { /* Print plugin info to stdout */ /* We cannot use olsr_printf yet! */ printf("%s\n", MOD_DESC); printf("[ENC]Accepted parameter pairs: (\"Keyfile\" )\n"); } /** *Destructor */ static void my_fini(void) { /* Calls the destruction function * olsr_plugin_exit() * This function should be present in your * sourcefile and all data destruction * should happen there - NOT HERE! */ secure_plugin_exit(); } static int store_string(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused))) { char *str = data; snprintf(str, FILENAME_MAX + 1, "%s", value); return 0; } static const struct olsrd_plugin_parameters plugin_parameters[] = { {.name = "keyfile",.set_plugin_parameter = &store_string,.data = keyfile}, }; void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = sizeof(plugin_parameters) / sizeof(*plugin_parameters); } int olsrd_plugin_init(void) { /* Calls the initialization function * olsr_plugin_init() * This function should be present in your * sourcefile and all data initialization * should happen there - NOT HERE! */ if (!secure_plugin_init()) { fprintf(stderr, "Could not initialize plugin!\n"); return 0; } if (!plugin_ipc_init()) { fprintf(stderr, "Could not initialize plugin IPC!\n"); return 0; } return 1; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/secure/src/olsrd_secure.c000066400000000000000000000766171234304727700205200ustar00rootroot00000000000000 /* * Secure OLSR plugin * http://www.olsr.org * * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsrd, olsr.org nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */ /* Adjustments made to ensure data going out is converted to network * byte ordering. Also, to ensure incoming data is converted before * it is used and before checksums are calculated as well. * Rusty Haddock AE5AE -- for the HSMM-MESH project. */ /* * Dynamic linked library for the olsr.org olsr daemon */ #include "olsrd_secure.h" #include #include #include #include #include #include #include #include "defs.h" #include "ipcalc.h" #include "olsr.h" #include "parser.h" #include "scheduler.h" #include "net_olsr.h" #ifdef USE_OPENSSL /* OpenSSL stuff */ #include #define CHECKSUM SHA1 #define SCHEME SHA1_INCLUDING_KEY #else /* USE_OPENSSL */ /* Homebrewn checksuming */ #include "md5.h" static void MD5_checksum(const uint8_t * data, const uint16_t data_len, uint8_t * hashbuf) { MD5_CTX context; MD5Init(&context); MD5Update(&context, data, data_len); MD5Final(hashbuf, &context); } #define CHECKSUM MD5_checksum #define SCHEME MD5_INCLUDING_KEY #endif /* USE_OPENSSL */ #ifdef OS #undef OS #endif /* OS */ #ifdef _WIN32 #define close(x) closesocket(x) #undef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK #define OS "Windows" #endif /* _WIN32 */ #ifdef __linux__ #define OS "GNU/Linux" #endif /* __linux__ */ #if defined __FreeBSD__ || defined __FreeBSD_kernel__ #define OS "FreeBSD" #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ */ #ifndef OS #define OS "Undefined" #endif /* OS */ static struct timeval now; /* Timestamp node */ struct stamp { union olsr_ip_addr addr; /* Timestamp difference */ int diff; uint32_t challenge; uint8_t validated; uint32_t valtime; /* Validity time */ uint32_t conftime; /* Reconfiguration time */ struct stamp *prev; struct stamp *next; }; /* Seconds to cache a valid timestamp entry */ #define TIMESTAMP_HOLD_TIME 30 /* Seconds to cache a not verified timestamp entry */ #define EXCHANGE_HOLD_TIME 5 static struct stamp timestamps[HASHSIZE]; char keyfile[FILENAME_MAX + 1]; char aes_key[16]; /* Event function to register with the sceduler */ static int send_challenge(struct interface *olsr_if, const union olsr_ip_addr *); static int send_cres(struct interface *olsr_if, union olsr_ip_addr *, union olsr_ip_addr *, uint32_t, struct stamp *); static int send_rres(struct interface *olsr_if, union olsr_ip_addr *, union olsr_ip_addr *, uint32_t); static int parse_challenge(struct interface *olsr_if, char *); static int parse_cres(struct interface *olsr_if, char *); static int parse_rres(char *); static int check_auth(struct interface *olsr_if, char *, int *); static int add_signature(uint8_t *, int *); static int validate_packet(struct interface *olsr_if, const char *, int *); static char *secure_preprocessor(char *packet, struct interface *olsr_if, union olsr_ip_addr *from_addr, int *length); static void timeout_timestamps(void *); static int check_timestamp(struct interface *olsr_if, const union olsr_ip_addr *, time_t); static struct stamp *lookup_timestamp_entry(const union olsr_ip_addr *); static int read_key_from_file(const char *); /** *Do initialization here * *This function is called by the my_init *function in uolsrd_plugin.c */ int secure_plugin_init(void) { int i; /* Initialize the timestamp database */ for (i = 0; i < HASHSIZE; i++) { timestamps[i].next = ×tamps[i]; timestamps[i].prev = ×tamps[i]; } olsr_printf(1, "Timestamp database initialized\n"); if (!strlen(keyfile)) strscpy(keyfile, KEYFILE, sizeof(keyfile)); i = read_key_from_file(keyfile); if (i < 0) { olsr_printf(1, "[ENC]Could not read key from file %s!\nExitting!\n\n", keyfile); exit(1); } if (i == 0) { olsr_printf(1, "[ENC]There was a problem reading key from file %s. Is the key long enough?\nExitting!\n\n", keyfile); exit(1); } /* Register the packet transform function */ add_ptf(&add_signature); olsr_preprocessor_add_function(&secure_preprocessor); /* Register timeout - poll every 2 seconds */ olsr_start_timer(2 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, &timeout_timestamps, NULL, 0); return 1; } int plugin_ipc_init(void) { return 1; } /* * destructor - called at unload */ void secure_plugin_exit(void) { olsr_preprocessor_remove_function(&secure_preprocessor); } static char * secure_preprocessor(char *packet, struct interface *olsr_if, union olsr_ip_addr *from_addr, int *length) { struct olsr *olsr = (struct olsr *)packet; struct ipaddr_str buf; /* * Check for challenge/response messages */ check_auth(olsr_if, packet, length); /* * Check signature */ if (!validate_packet(olsr_if, packet, length)) { olsr_printf(1, "[ENC]Rejecting packet from %s\n", olsr_ip_to_string(&buf, from_addr)); return NULL; } olsr_printf(1, "[ENC]Packet from %s OK size %d\n", olsr_ip_to_string(&buf, from_addr), *length); /* Fix OLSR packet header */ olsr->olsr_packlen = htons(*length); return packet; } /** * Check a incoming OLSR packet for * challenge/responses. * They need not be verified as they * are signed in the message. * */ static int check_auth(struct interface *olsr_if, char *pck, int *size __attribute__ ((unused))) { olsr_printf(3, "[ENC]Checking packet for challenge response message...\n"); switch (pck[4]) { case (TYPE_CHALLENGE): parse_challenge(olsr_if, &pck[4]); break; case (TYPE_CRESPONSE): parse_cres(olsr_if, &pck[4]); break; case (TYPE_RRESPONSE): parse_rres(&pck[4]); break; default: return 0; } return 1; } /** * Packet transform function * Build a SHA-1/MD5 hash of the original message * + the signature message(-digest) + key * * Then add the signature message to the packet and * increase the size */ int add_signature(uint8_t * pck, int *size) { struct s_olsrmsg *msg; #ifdef DEBUG unsigned int i; int j; const uint8_t *sigmsg; #endif /* DEBUG */ olsr_printf(2, "[ENC]Adding signature for packet size %d\n", *size); fflush(stdout); msg = (struct s_olsrmsg *)ARM_NOWARN_ALIGN(&pck[*size]); /* Update size */ ((struct olsr *)pck)->olsr_packlen = htons(*size + sizeof(struct s_olsrmsg)); /* Fill packet header */ msg->olsr_msgtype = MESSAGE_TYPE; msg->olsr_vtime = 0; msg->olsr_msgsize = htons(sizeof(struct s_olsrmsg)); memcpy(&msg->originator, &olsr_cnf->main_addr, olsr_cnf->ipsize); msg->ttl = 1; msg->hopcnt = 0; msg->seqno = htons(get_msg_seqno()); /* Fill subheader */ msg->sig.type = ONE_CHECKSUM; msg->sig.algorithm = SCHEME; memset(&msg->sig.reserved, 0, 2); /* Add timestamp */ msg->sig.timestamp = htonl(now.tv_sec); #ifndef _WIN32 olsr_printf(3, "[ENC]timestamp: %lld\n", (long long)now.tv_sec); #endif /* _WIN32 */ /* Set the new size */ *size += sizeof(struct s_olsrmsg); { uint8_t checksum_cache[1512 + KEYLENGTH]; /* Create packet + key cache */ /* First the OLSR packet + signature message - digest */ memcpy(checksum_cache, pck, *size - SIGNATURE_SIZE); /* Then the key */ memcpy(&checksum_cache[*size - SIGNATURE_SIZE], aes_key, KEYLENGTH); /* Create the hash */ CHECKSUM(checksum_cache, (*size - SIGNATURE_SIZE) + KEYLENGTH, &pck[*size - SIGNATURE_SIZE]); } #ifdef DEBUG olsr_printf(1, "Signature message:\n"); j = 0; sigmsg = (uint8_t *) msg; for (i = 0; i < sizeof(struct s_olsrmsg); i++) { olsr_printf(1, " %3i", sigmsg[i]); j++; if (j == 4) { olsr_printf(1, "\n"); j = 0; } } #endif /* DEBUG */ olsr_printf(3, "[ENC] Message signed\n"); return 1; } static int validate_packet(struct interface *olsr_if, const char *pck, int *size) { int packetsize; uint8_t sha1_hash[SIGNATURE_SIZE]; const struct s_olsrmsg *sig; time_t rec_time; #ifdef DEBUG unsigned int i; int j; const uint8_t *sigmsg; #endif /* DEBUG */ /* Find size - signature message */ packetsize = *size - sizeof(struct s_olsrmsg); if (packetsize < 4) return 0; sig = (const struct s_olsrmsg *)CONST_ARM_NOWARN_ALIGN(&pck[packetsize]); //olsr_printf(1, "Size: %d\n", packetsize); #ifdef DEBUG olsr_printf(1, "Input message:\n"); j = 0; sigmsg = (const uint8_t *)sig; for (i = 0; i < sizeof(struct s_olsrmsg); i++) { olsr_printf(1, " %3i", sigmsg[i]); j++; if (j == 4) { olsr_printf(1, "\n"); j = 0; } } #endif /* DEBUG */ /* Sanity check first */ if ((sig->olsr_msgtype != MESSAGE_TYPE) || (sig->olsr_vtime != 0) || (sig->olsr_msgsize != ntohs(sizeof(struct s_olsrmsg))) || (sig->ttl != 1) || (sig->hopcnt != 0)) { olsr_printf(1, "[ENC]Packet not sane!\n"); return 0; } /* Check scheme and type */ switch (sig->sig.type) { case (ONE_CHECKSUM): switch (sig->sig.algorithm) { case (SCHEME): goto one_checksum_SHA; /* Ahhh... fix this */ break; default: break; } break; default: olsr_printf(1, "[ENC]Unsupported sceme: %d enc: %d!\n", sig->sig.type, sig->sig.algorithm); return 0; } //olsr_printf(1, "Packet sane...\n"); one_checksum_SHA: { uint8_t checksum_cache[1512 + KEYLENGTH]; /* Create packet + key cache */ /* First the OLSR packet + signature message - digest */ memcpy(checksum_cache, pck, *size - SIGNATURE_SIZE); /* Then the key */ memcpy(&checksum_cache[*size - SIGNATURE_SIZE], aes_key, KEYLENGTH); /* generate SHA-1 */ CHECKSUM(checksum_cache, *size - SIGNATURE_SIZE + KEYLENGTH, sha1_hash); } #ifdef DEBUG olsr_printf(1, "Recevied hash:\n"); sigmsg = (const uint8_t *)sig->sig.signature; for (i = 0; i < SIGNATURE_SIZE; i++) { olsr_printf(1, " %3i", sigmsg[i]); } olsr_printf(1, "\n"); olsr_printf(1, "Calculated hash:\n"); sigmsg = sha1_hash; for (i = 0; i < SIGNATURE_SIZE; i++) { olsr_printf(1, " %3i", sigmsg[i]); } olsr_printf(1, "\n"); #endif /* DEBUG */ if (memcmp(sha1_hash, sig->sig.signature, SIGNATURE_SIZE) != 0) { olsr_printf(1, "[ENC]Signature missmatch\n"); return 0; } /* Check timestamp */ rec_time = ntohl(sig->sig.timestamp); if (!check_timestamp(olsr_if, (const union olsr_ip_addr *)&sig->originator, rec_time)) { struct ipaddr_str buf; olsr_printf(1, "[ENC]Timestamp missmatch in packet from %s!\n", olsr_ip_to_string(&buf, (const union olsr_ip_addr *)&sig->originator)); return 0; } #ifndef _WIN32 olsr_printf(1, "[ENC]Received timestamp %lld diff: %lld\n", (long long)rec_time, (long long)now.tv_sec - (long long)rec_time); #endif /* _WIN32 */ /* Remove signature message */ *size = packetsize; return 1; } int check_timestamp(struct interface *olsr_if, const union olsr_ip_addr *originator, time_t tstamp) { struct stamp *entry; int diff; entry = lookup_timestamp_entry(originator); if (!entry) { /* Initiate timestamp negotiation */ send_challenge(olsr_if, originator); return 0; } if (!entry->validated) { olsr_printf(1, "[ENC]Message from non-validated host!\n"); return 0; } diff = entry->diff - (now.tv_sec - tstamp); olsr_printf(3, "[ENC]Timestamp slack: %d\n", diff); if ((diff > UPPER_DIFF) || (diff < LOWER_DIFF)) { olsr_printf(1, "[ENC]Timestamp scew detected!!\n"); return 0; } /* ok - update diff */ entry->diff = ((now.tv_sec - tstamp) + entry->diff) ? ((now.tv_sec - tstamp) + entry->diff) / 2 : 0; olsr_printf(3, "[ENC]Diff set to : %d\n", entry->diff); /* update validtime */ entry->valtime = GET_TIMESTAMP(TIMESTAMP_HOLD_TIME * 1000); return 1; } /** * Create and send a timestamp * challenge message to new_host * * The host is registered in the timestamps * repository with valid=0 */ int send_challenge(struct interface *olsr_if, const union olsr_ip_addr *new_host) { struct challengemsg cmsg; struct stamp *entry; uint32_t challenge, hash; struct ipaddr_str buf; olsr_printf(1, "[ENC]Building CHALLENGE message\n"); /* Set the size including OLSR packet size */ challenge = rand() << 16; challenge |= rand(); /* initialise rrmsg */ memset(&cmsg, 0, sizeof(cmsg)); /* Fill challengemessage */ cmsg.olsr_msgtype = TYPE_CHALLENGE; cmsg.olsr_msgsize = htons(sizeof(struct challengemsg)); memcpy(&cmsg.originator, &olsr_cnf->main_addr, olsr_cnf->ipsize); cmsg.ttl = 1; cmsg.seqno = htons(get_msg_seqno()); /* Fill subheader */ assert(olsr_cnf->ipsize == sizeof(cmsg.destination)); memcpy(&cmsg.destination, new_host, olsr_cnf->ipsize); cmsg.challenge = htonl(challenge); olsr_printf(3, "[ENC]Size: %lu\n", (unsigned long)sizeof(struct challengemsg)); { uint8_t checksum_cache[(sizeof(cmsg) - sizeof(cmsg.signature)) + KEYLENGTH]; /* Create packet + key cache */ /* First the OLSR packet + signature message - digest */ memcpy(checksum_cache, &cmsg, sizeof(cmsg) - sizeof(cmsg.signature)); /* Then the key */ memcpy(&checksum_cache[sizeof(cmsg) - sizeof(cmsg.signature)], aes_key, KEYLENGTH); /* Create the hash */ CHECKSUM(checksum_cache, (sizeof(cmsg) - sizeof(cmsg.signature)) + KEYLENGTH, cmsg.signature); } olsr_printf(3, "[ENC]Sending timestamp request to %s challenge 0x%x\n", olsr_ip_to_string(&buf, new_host), challenge); /* Add to buffer */ net_outbuffer_push(olsr_if, &cmsg, sizeof(struct challengemsg)); /* Send the request */ net_output(olsr_if); /* Create new entry */ entry = malloc(sizeof(struct stamp)); entry->diff = 0; entry->validated = 0; entry->challenge = challenge; memcpy(&entry->addr, new_host, olsr_cnf->ipsize); /* update validtime - not validated */ entry->conftime = GET_TIMESTAMP(EXCHANGE_HOLD_TIME * 1000); hash = olsr_ip_hashing(new_host); /* Queue */ timestamps[hash].next->prev = entry; entry->next = timestamps[hash].next; timestamps[hash].next = entry; entry->prev = ×tamps[hash]; return 1; } int parse_cres(struct interface *olsr_if, char *in_msg) { struct c_respmsg *msg; uint8_t sha1_hash[SIGNATURE_SIZE]; struct stamp *entry; struct ipaddr_str buf; msg = (struct c_respmsg *)ARM_NOWARN_ALIGN(in_msg); olsr_printf(1, "[ENC]Challenge-response message received\n"); olsr_printf(3, "[ENC]To: %s\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&msg->destination)); if (if_ifwithaddr((union olsr_ip_addr *)&msg->destination) == NULL) { olsr_printf(3, "[ENC]Not for us...\n"); return 0; } olsr_printf(3, "[ENC]Challenge: 0x%lx\n", (unsigned long)ntohl(msg->challenge)); /* ntohl() returns a unsignedlong onwin32 */ /* Check signature */ { uint8_t checksum_cache[1512 + KEYLENGTH]; /* Create packet + key cache */ /* First the OLSR packet + signature message - digest */ memcpy(checksum_cache, msg, sizeof(struct c_respmsg) - SIGNATURE_SIZE); /* Then the key */ memcpy(&checksum_cache[sizeof(struct c_respmsg) - SIGNATURE_SIZE], aes_key, KEYLENGTH); /* Create the hash */ CHECKSUM(checksum_cache, (sizeof(struct c_respmsg) - SIGNATURE_SIZE) + KEYLENGTH, sha1_hash); } if (memcmp(sha1_hash, &msg->signature, SIGNATURE_SIZE) != 0) { olsr_printf(1, "[ENC]Signature missmatch in challenge-response!\n"); return 0; } olsr_printf(3, "[ENC]Signature verified\n"); /* Now to check the digest from the emitted challenge */ if ((entry = lookup_timestamp_entry((const union olsr_ip_addr *)&msg->originator)) == NULL) { olsr_printf(1, "[ENC]Received challenge-response from non-registered node %s!\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&msg->originator)); return 0; } /* Generate the digest */ olsr_printf(3, "[ENC]Entry-challenge 0x%x\n", entry->challenge); { uint8_t checksum_cache[1512 + KEYLENGTH]; uint32_t netorder_challenge; /* First the challenge received */ /* But we have to calculate our hash with the challenge in * network order just like the remote host did! 6-Jun-2011 AE5AE */ netorder_challenge = htonl(entry->challenge); memcpy(checksum_cache, &netorder_challenge, sizeof(uint32_t)); /* memcpy(checksum_cache, &entry->challenge, 4); */ /* Then the local IP */ memcpy(&checksum_cache[sizeof(uint32_t)], &msg->originator, olsr_cnf->ipsize); /* Create the hash */ CHECKSUM(checksum_cache, sizeof(uint32_t) + olsr_cnf->ipsize, sha1_hash); } if (memcmp(msg->res_sig, sha1_hash, SIGNATURE_SIZE) != 0) { olsr_printf(1, "[ENC]Error in challenge signature from %s!\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&msg->originator)); return 0; } olsr_printf(3, "[ENC]Challenge-response signature ok\n"); /* Update entry! */ entry->challenge = 0; entry->validated = 1; /* Bring timestamp to host order before arith. 2011/05/31 AE5AE */ entry->diff = now.tv_sec - ntohl(msg->timestamp); /* update validtime - validated entry */ entry->valtime = GET_TIMESTAMP(TIMESTAMP_HOLD_TIME * 1000); olsr_printf(1, "[ENC]%s registered with diff %d!\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&msg->originator), entry->diff); /* Send response-response */ send_rres(olsr_if, (union olsr_ip_addr *)&msg->originator, (union olsr_ip_addr *)&msg->destination, msg->challenge); /* (union olsr_ip_addr *)&msg->destination, ntohl(msg->challenge)); */ /* Don't give send_rres() the challenge in host order, as the checksum needs to * be calculated in network order. 06-Jun-2011 AE5AE */ return 1; } int parse_rres(char *in_msg) { struct r_respmsg *msg; uint8_t sha1_hash[SIGNATURE_SIZE]; struct stamp *entry; struct ipaddr_str buf; msg = (struct r_respmsg *)ARM_NOWARN_ALIGN(in_msg); olsr_printf(1, "[ENC]Response-response message received\n"); olsr_printf(3, "[ENC]To: %s\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&msg->destination)); if (if_ifwithaddr((union olsr_ip_addr *)&msg->destination) == NULL) { olsr_printf(1, "[ENC]Not for us...\n"); return 0; } /* Check signature */ { uint8_t checksum_cache[1512 + KEYLENGTH]; /* Create packet + key cache */ /* First the OLSR packet + signature message - digest */ memcpy(checksum_cache, msg, sizeof(struct r_respmsg) - SIGNATURE_SIZE); /* Then the key */ memcpy(&checksum_cache[sizeof(struct r_respmsg) - SIGNATURE_SIZE], aes_key, KEYLENGTH); /* Create the hash */ CHECKSUM(checksum_cache, (sizeof(struct r_respmsg) - SIGNATURE_SIZE) + KEYLENGTH, sha1_hash); } if (memcmp(sha1_hash, &msg->signature, SIGNATURE_SIZE) != 0) { olsr_printf(1, "[ENC]Signature missmatch in response-response!\n"); return 0; } olsr_printf(3, "[ENC]Signature verified\n"); /* Now to check the digest from the emitted challenge */ if ((entry = lookup_timestamp_entry((const union olsr_ip_addr *)&msg->originator)) == NULL) { olsr_printf(1, "[ENC]Received response-response from non-registered node %s!\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&msg->originator)); return 0; } /* Generate the digest */ olsr_printf(3, "[ENC]Entry-challenge 0x%x\n", entry->challenge); { uint8_t checksum_cache[1512 + KEYLENGTH]; uint32_t netorder_challenge; /* First the challenge received */ /* But we have to calculate our hash with the challenge in network order! 6-Jun-2011 AE5AE */ netorder_challenge = htonl(entry->challenge); memcpy(checksum_cache, &netorder_challenge, sizeof(uint32_t)); /* memcpy(checksum_cache, &entry->challenge, 4); */ /* Then the local IP */ memcpy(&checksum_cache[sizeof(uint32_t)], &msg->originator, olsr_cnf->ipsize); /* Create the hash */ CHECKSUM(checksum_cache, sizeof(uint32_t) + olsr_cnf->ipsize, sha1_hash); } if (memcmp(msg->res_sig, sha1_hash, SIGNATURE_SIZE) != 0) { olsr_printf(1, "[ENC]Error in response signature from %s!\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&msg->originator)); return 0; } olsr_printf(3, "[ENC]Challenge-response signature ok\n"); /* Update entry! */ entry->challenge = 0; entry->validated = 1; /* Bring timestamp to host order before arith. 2011/05/31 AE5AE */ entry->diff = now.tv_sec - ntohl(msg->timestamp); /* update validtime - validated entry */ entry->valtime = GET_TIMESTAMP(TIMESTAMP_HOLD_TIME * 1000); olsr_printf(1, "[ENC]%s registered with diff %d!\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&msg->originator), entry->diff); return 1; } int parse_challenge(struct interface *olsr_if, char *in_msg) { struct challengemsg *msg; uint8_t sha1_hash[SIGNATURE_SIZE]; struct stamp *entry; uint32_t hash; struct ipaddr_str buf; msg = (struct challengemsg *)ARM_NOWARN_ALIGN(in_msg); olsr_printf(1, "[ENC]Challenge message received\n"); olsr_printf(3, "[ENC]To: %s\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&msg->destination)); if (if_ifwithaddr((union olsr_ip_addr *)&msg->destination) == NULL) { olsr_printf(1, "[ENC]Not for us...\n"); return 0; } /* Create entry if not registered */ if ((entry = lookup_timestamp_entry((const union olsr_ip_addr *)&msg->originator)) == NULL) { entry = malloc(sizeof(struct stamp)); memcpy(&entry->addr, &msg->originator, olsr_cnf->ipsize); hash = olsr_ip_hashing((union olsr_ip_addr *)&msg->originator); /* Queue */ timestamps[hash].next->prev = entry; entry->next = timestamps[hash].next; timestamps[hash].next = entry; entry->prev = ×tamps[hash]; } else { /* Check configuration timeout */ if (!TIMED_OUT(entry->conftime)) { /* If registered - do not accept! */ olsr_printf(1, "[ENC]Challenge from registered node...dropping!\n"); return 0; } else { olsr_printf(1, "[ENC]Challenge from registered node...accepted!\n"); } } olsr_printf(3, "[ENC]Challenge: 0x%lx\n", (unsigned long)ntohl(msg->challenge)); /* ntohl() returns a unsignedlong onwin32 */ /* Check signature */ { uint8_t checksum_cache[1512 + KEYLENGTH]; /* Create packet + key cache */ /* First the OLSR packet + signature message - digest */ memcpy(checksum_cache, msg, sizeof(struct challengemsg) - SIGNATURE_SIZE); /* Then the key */ memcpy(&checksum_cache[sizeof(struct challengemsg) - SIGNATURE_SIZE], aes_key, KEYLENGTH); /* Create the hash */ CHECKSUM(checksum_cache, (sizeof(struct challengemsg) - SIGNATURE_SIZE) + KEYLENGTH, sha1_hash); } if (memcmp(sha1_hash, &msg->signature, SIGNATURE_SIZE) != 0) { olsr_printf(1, "[ENC]Signature missmatch in challenge!\n"); return 0; } olsr_printf(3, "[ENC]Signature verified\n"); entry->diff = 0; entry->validated = 0; /* update validtime - not validated */ entry->conftime = GET_TIMESTAMP(EXCHANGE_HOLD_TIME * 1000); /* Build and send response */ send_cres(olsr_if, (union olsr_ip_addr *)&msg->originator, (union olsr_ip_addr *)&msg->destination, msg->challenge, entry); /* (union olsr_ip_addr *)&msg->destination, ntohl(msg->challenge), entry); */ /* Don't give send_cres() the challenge in host order, as the checksum needs to * be calculated with network order. 06-Jun-2011 AE5AE */ return 1; } /** * Build and transmit a challenge response * message. * */ int send_cres(struct interface *olsr_if, union olsr_ip_addr *to, union olsr_ip_addr *from, uint32_t chal_in, struct stamp *entry) { struct c_respmsg crmsg; uint32_t challenge; struct ipaddr_str buf; olsr_printf(1, "[ENC]Building CRESPONSE message\n"); challenge = rand() << 16; challenge |= rand(); entry->challenge = challenge; olsr_printf(3, "[ENC]Challenge-response: 0x%x\n", challenge); /* initialise rrmsg */ memset(&crmsg, 0, sizeof(crmsg)); /* Fill challengemessage */ crmsg.olsr_msgtype = TYPE_CRESPONSE; crmsg.olsr_msgsize = htons(sizeof(struct c_respmsg)); memcpy(&crmsg.originator, &olsr_cnf->main_addr, olsr_cnf->ipsize); crmsg.ttl = 1; crmsg.seqno = htons(get_msg_seqno()); /* set timestamp */ /* but swap the byte order to the network order before sending! 2011/05/28 AE5AE */ crmsg.timestamp = htonl(now.tv_sec); #ifndef _WIN32 /* Don't print htonl()'d time, use now.tv_sec 2011/05/31 AE5AE */ /* olsr_printf(3, "[ENC]Timestamp %lld\n", (long long)crmsg.timestamp); */ olsr_printf(3, "[ENC]Timestamp %lld\n", (long long)now.tv_sec); #endif /* _WIN32 */ /* Fill subheader */ assert(olsr_cnf->ipsize == sizeof(crmsg.destination)); memcpy(&crmsg.destination, to, olsr_cnf->ipsize); crmsg.challenge = htonl(challenge); /* Create digest of received challenge + IP */ { uint8_t checksum_cache[sizeof(chal_in) + olsr_cnf->ipsize]; /* Create packet + key cache */ /* First the challenge received */ memcpy(checksum_cache, &chal_in, sizeof(chal_in)); /* Then the local IP */ memcpy(&checksum_cache[sizeof(chal_in)], from, olsr_cnf->ipsize); /* Create the hash */ CHECKSUM(checksum_cache, sizeof(chal_in) + olsr_cnf->ipsize, crmsg.res_sig); } /* Now create the digest of the message and the key */ { uint8_t checksum_cache[(sizeof(crmsg) - sizeof(crmsg.signature)) + KEYLENGTH]; /* Create packet + key cache */ /* First the OLSR packet + signature message - digest */ memcpy(checksum_cache, &crmsg, sizeof(crmsg) - sizeof(crmsg.signature)); /* Then the key */ memcpy(&checksum_cache[sizeof(crmsg) - sizeof(crmsg.signature)], aes_key, KEYLENGTH); /* Create the hash */ CHECKSUM(checksum_cache, (sizeof(crmsg) - sizeof(crmsg.signature)) + KEYLENGTH, crmsg.signature); } olsr_printf(3, "[ENC]Sending challenge response to %s challenge 0x%x\n", olsr_ip_to_string(&buf, to), challenge); /* Add to buffer */ net_outbuffer_push(olsr_if, &crmsg, sizeof(struct c_respmsg)); /* Send the request */ net_output(olsr_if); return 1; } /** * Build and transmit a response response * message. * */ static int send_rres(struct interface *olsr_if, union olsr_ip_addr *to, union olsr_ip_addr *from, uint32_t chal_in) { struct r_respmsg rrmsg; struct ipaddr_str buf; olsr_printf(1, "[ENC]Building RRESPONSE message\n"); /* initialise rrmsg */ memset(&rrmsg, 0, sizeof(rrmsg)); /* Fill challengemessage */ rrmsg.olsr_msgtype = TYPE_RRESPONSE; rrmsg.olsr_msgsize = htons(sizeof(struct r_respmsg)); memcpy(&rrmsg.originator, &olsr_cnf->main_addr, olsr_cnf->ipsize); rrmsg.ttl = 1; rrmsg.seqno = htons(get_msg_seqno()); /* set timestamp */ /* But swap the byte order to the network order! 2011/05/28 AE5AE */ rrmsg.timestamp = htonl(now.tv_sec); #ifndef _WIN32 /* olsr_printf(3, "[ENC]Timestamp %lld\n", (long long)rrmsg.timestamp); */ /* don't print htonl()'d time, use now. 2011/05/31 AE5AE */ olsr_printf(3, "[ENC]Timestamp %lld\n", (long long)now.tv_sec); #endif /* _WIN32 */ /* Fill subheader */ assert(olsr_cnf->ipsize == sizeof(rrmsg.destination)); memcpy(&rrmsg.destination, to, olsr_cnf->ipsize); /* Create digest of received challenge + IP */ { uint8_t checksum_cache[sizeof(chal_in) + sizeof(union olsr_ip_addr)]; /* Create packet + key cache */ /* First the challenge received */ memcpy(checksum_cache, &chal_in, sizeof(chal_in)); /* Then the local IP */ memcpy(&checksum_cache[sizeof(chal_in)], from, olsr_cnf->ipsize); /* Create the hash */ CHECKSUM(checksum_cache, sizeof(chal_in) + olsr_cnf->ipsize, rrmsg.res_sig); } /* Now create the digest of the message and the key */ { uint8_t checksum_cache[(sizeof(rrmsg) - sizeof(rrmsg.signature)) + KEYLENGTH]; /* Create packet + key cache */ /* First the OLSR packet + signature message - digest */ memcpy(checksum_cache, &rrmsg, sizeof(rrmsg) - sizeof(rrmsg.signature)); /* Then the key */ memcpy(&checksum_cache[sizeof(rrmsg) - sizeof(rrmsg.signature)], aes_key, KEYLENGTH); /* Create the hash */ CHECKSUM(checksum_cache, (sizeof(rrmsg) - sizeof(rrmsg.signature)) + KEYLENGTH, rrmsg.signature); } olsr_printf(3, "[ENC]Sending response response to %s\n", olsr_ip_to_string(&buf, to)); /* add to buffer */ net_outbuffer_push(olsr_if, &rrmsg, sizeof(struct r_respmsg)); /* Send the request */ net_output(olsr_if); return 1; } static struct stamp * lookup_timestamp_entry(const union olsr_ip_addr *adr) { uint32_t hash; struct stamp *entry; struct ipaddr_str buf; hash = olsr_ip_hashing(adr); for (entry = timestamps[hash].next; entry != ×tamps[hash]; entry = entry->next) { if (memcmp(&entry->addr, adr, olsr_cnf->ipsize) == 0) { olsr_printf(3, "[ENC]Match for %s\n", olsr_ip_to_string(&buf, adr)); return entry; } } olsr_printf(1, "[ENC]No match for %s\n", olsr_ip_to_string(&buf, adr)); return NULL; } /** *Find timed out entries and delete them * *@return nada */ void timeout_timestamps(void *foo __attribute__ ((unused))) { struct stamp *tmp_list; struct stamp *entry_to_delete; int idx; /* Update our local timestamp */ gettimeofday(&now, NULL); for (idx = 0; idx < HASHSIZE; idx++) { tmp_list = timestamps[idx].next; /*Traverse MID list */ while (tmp_list != ×tamps[idx]) { /*Check if the entry is timed out */ if ((TIMED_OUT(tmp_list->valtime)) && (TIMED_OUT(tmp_list->conftime))) { struct ipaddr_str buf; entry_to_delete = tmp_list; tmp_list = tmp_list->next; olsr_printf(1, "[ENC]timestamp info for %s timed out.. deleting it\n", olsr_ip_to_string(&buf, &entry_to_delete->addr)); /*Delete it */ entry_to_delete->next->prev = entry_to_delete->prev; entry_to_delete->prev->next = entry_to_delete->next; free(entry_to_delete); } else tmp_list = tmp_list->next; } } return; } static int read_key_from_file(const char *file) { FILE *kf; size_t keylen; keylen = 16; kf = fopen(file, "r"); olsr_printf(1, "[ENC]Reading key from file \"%s\"\n", file); if (kf == NULL) { olsr_printf(1, "[ENC]Could not open keyfile %s!\nError: %s\n", file, strerror(errno)); return -1; } if (fread(aes_key, 1, keylen, kf) != keylen) { olsr_printf(1, "[ENC]Could not read key from keyfile %s!\nError: %s\n", file, strerror(errno)); fclose(kf); return 0; } fclose(kf); return 1; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/secure/src/olsrd_secure.h000066400000000000000000000046351234304727700205140ustar00rootroot00000000000000 /* * Secure OLSR plugin * http://www.olsr.org * * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsrd, olsr.org nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *POSSIBILITY OF SUCH DAMAGE. * */ /* * Dynamic linked library example for UniK OLSRd */ #ifndef _OLSRD_SECURE_H #define _OLSRD_SECURE_H #include "secure_messages.h" #include "hashing.h" #define KEYFILE "/etc/olsrd.d/olsrd_secure_key" /* Schemes */ #define ONE_CHECKSUM 1 /* Algorithm definitions */ #define SHA1_INCLUDING_KEY 1 #define MD5_INCLUDING_KEY 2 #ifdef USE_OPENSSL #define SIGNATURE_SIZE 20 #else /* USE_OPENSSL */ #define SIGNATURE_SIZE 16 #endif /* USE_OPENSSL */ #define KEYLENGTH 16 #define UPPER_DIFF 3 #define LOWER_DIFF -3 extern char aes_key[16]; /* Seconds of slack allowed */ #define SLACK 3 int secure_plugin_init(void); void secure_plugin_exit(void); int plugin_ipc_init(void); #endif /* _OLSRD_SECURE_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/secure/src/secure_messages.h000066400000000000000000000110011234304727700211610ustar00rootroot00000000000000 /* * Secure OLSR plugin * http://www.olsr.org * * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsrd, olsr.org nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */ /* * olsr.org olsr daemon security plugin */ #ifndef _OLSRD_SECURE_MSG #define _OLSRD_SECURE_MSG #include #include #include #include #include #include #include #include #include "olsr_types.h" #include "interfaces.h" /* The type of message you will use */ #define MESSAGE_TYPE 10 /* The type of messages we will receive - can be set to promiscuous */ #define PARSER_TYPE MESSAGE_TYPE #define TYPE_CHALLENGE 11 #define TYPE_CRESPONSE 12 #define TYPE_RRESPONSE 13 extern char keyfile[FILENAME_MAX + 1]; #ifdef USE_OPENSSL #define SIGSIZE 20 #else /* USE_OPENSSL */ #define SIGSIZE 16 #endif /* USE_OPENSSL */ /**************************************************************************** * PACKET SECTION * ****************************************************************************/ struct sig_msg { uint8_t type; uint8_t algorithm; uint16_t reserved; time_t timestamp; uint8_t signature[SIGSIZE]; }; /* * OLSR message (several can exist in one OLSR packet) */ struct s_olsrmsg { uint8_t olsr_msgtype; uint8_t olsr_vtime; uint16_t olsr_msgsize; uint32_t originator; uint8_t ttl; uint8_t hopcnt; uint16_t seqno; /* YOUR PACKET GOES HERE */ struct sig_msg sig; }; /* * Challenge response messages */ struct challengemsg { uint8_t olsr_msgtype; uint8_t olsr_vtime; uint16_t olsr_msgsize; uint32_t originator; uint8_t ttl; uint8_t hopcnt; uint16_t seqno; uint32_t destination; uint32_t challenge; uint8_t signature[SIGSIZE]; }; struct c_respmsg { uint8_t olsr_msgtype; uint8_t olsr_vtime; uint16_t olsr_msgsize; uint32_t originator; uint8_t ttl; uint8_t hopcnt; uint16_t seqno; uint32_t destination; uint32_t challenge; time_t timestamp; uint8_t res_sig[SIGSIZE]; uint8_t signature[SIGSIZE]; }; struct r_respmsg { uint8_t olsr_msgtype; uint8_t olsr_vtime; uint16_t olsr_msgsize; uint32_t originator; uint8_t ttl; uint8_t hopcnt; uint16_t seqno; uint32_t destination; time_t timestamp; uint8_t res_sig[SIGSIZE]; uint8_t signature[SIGSIZE]; }; /* *IPv6 */ struct s_olsrmsg6 { uint8_t olsr_msgtype; uint8_t olsr_vtime; uint16_t olsr_msgsize; struct in6_addr originator; uint8_t ttl; uint8_t hopcnt; uint16_t seqno; /* YOUR PACKET GOES HERE */ struct sig_msg sig; }; /* * Generic OLSR packet - DO NOT ALTER */ struct s_olsr { uint16_t olsr_packlen; /* packet length */ uint16_t olsr_seqno; struct s_olsrmsg olsr_msg[1]; /* variable messages */ }; struct s_olsr6 { uint16_t olsr_packlen; /* packet length */ uint16_t olsr_seqno; struct s_olsrmsg6 olsr_msg[1]; /* variable messages */ }; #endif /* _OLSRD_SECURE_MSG */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/secure/version-script.txt000066400000000000000000000002051234304727700206000ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/sgwdynspeed/000077500000000000000000000000001234304727700161215ustar00rootroot00000000000000olsrd-0.6.6.2/lib/sgwdynspeed/Makefile000066400000000000000000000026511234304727700175650ustar00rootroot00000000000000include Makefile.inc TOPDIR = ../.. include $(TOPDIR)/Makefile.inc RESOURCESDIR = ./resources SUPPORTED = 0 ifeq ($(OS),linux) SUPPORTED = 1 endif ifeq ($(OS),android) SUPPORTED = 1 endif ifeq ($(SUPPORTED),0) .PHONY: all default_target install clean all: default_target default_target install clean: @echo "*** $(PLUGIN_NAME) plugin not supported on $(OS), sorry!" else GIT_SHA = $(shell git describe 2> /dev/null || echo "Unknown") CFLAGS += -DGIT_SHA=\"$(GIT_SHA)\" -DPLUGIN_VER=\"$(PLUGIN_VER)\" .PHONY: all default_target install uninstall clean doc doc-clean java java-instal java-uninstall all: default_target default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: all $(INSTALL_LIB) mkdir -p "$(DOCDIR_OLSRD)" cp "$(RESOURCESDIR)/olsrd.sgw.speed.conf" "$(DOCDIR_OLSRD)" $(STRIP) "$(LIBDIR)/$(PLUGIN_FULLNAME)" uninstall: rm -f "$(LIBDIR)/lib$(PLUGIN_NAME).so" "$(LIBDIR)/$(PLUGIN_NAME)" "$(DOCDIR_OLSRD)/olsrd.sgw.speed.conf" $(UNINSTALL_LIB) rmdir -v -p --ignore-fail-on-non-empty "$(LIBDIR)" "$(DOCDIR_OLSRD)" clean: ifeq ($(VERBOSE),0) @echo "[$@]" endif $(MAKECMDPREFIX)rm -f $(OBJS) $(SRCS:%.c=%.d) "$(PLUGIN_FULLNAME)" $(MAKECMDPREFIX)$(MAKE) -C doc clean doc: $(MAKECMDPREFIX)$(MAKE) -C doc all doc-clean: $(MAKECMDPREFIX)$(MAKE) -C doc clean endif olsrd-0.6.6.2/lib/sgwdynspeed/Makefile.inc000066400000000000000000000002101234304727700203220ustar00rootroot00000000000000# activate debugging with 1 or deactivate with 0 DEBUG ?= 1 OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_sgwdynspeed PLUGIN_VER = 1.0.0 olsrd-0.6.6.2/lib/sgwdynspeed/doc/000077500000000000000000000000001234304727700166665ustar00rootroot00000000000000olsrd-0.6.6.2/lib/sgwdynspeed/doc/.gitignore000066400000000000000000000000771234304727700206620ustar00rootroot00000000000000/html/ /man/ /latex/ /doxygen.conf.temp /olsrd_sgwdynspeed.pdf olsrd-0.6.6.2/lib/sgwdynspeed/doc/Makefile000066400000000000000000000020601234304727700203240ustar00rootroot00000000000000include ../Makefile.inc HTML_DIR = html MAN_DIR = man LATEX_DIR = latex PDF_NAME = $(PLUGIN_NAME).pdf DOX_FILE = doxygen.conf TMP_DOX_FILE = $(DOX_FILE).temp .PHONY: .gitignore all clean .gitignore: ifeq ($(VERBOSE),0) @echo "[$@] doc" endif $(MAKECMDPREFIX)echo "/$(HTML_DIR)/" > $@ $(MAKECMDPREFIX)echo "/$(MAN_DIR)/" >> $@ $(MAKECMDPREFIX)echo "/$(LATEX_DIR)/" >> $@ $(MAKECMDPREFIX)echo "/$(TMP_DOX_FILE)" >> $@ $(MAKECMDPREFIX)echo "/$(PDF_NAME)" >> $@ clean: ifeq ($(VERBOSE),0) @echo "[$@] doc" endif $(MAKECMDPREFIX)rm -fr "$(TMP_DOX_FILE)" "$(HTML_DIR)" "$(LATEX_DIR)" "$(MAN_DIR)" "$(PDF_NAME)" all: clean $(DOX_FILE) ifeq ($(VERBOSE),0) @echo "[$@] doc" endif $(MAKECMDPREFIX)sed \ -e "s/__PLUGIN_VER__/$(PLUGIN_VER)/" \ -e "s/__LIBNAME__/$(PLUGIN_NAME)/" \ "$(DOX_FILE)" > "$(TMP_DOX_FILE)" $(MAKECMDPREFIX)doxygen "$(TMP_DOX_FILE)" $(MAKECMDPREFIX)rm "$(TMP_DOX_FILE)" $(MAKECMDPREFIX)$(MAKE) -s -C $(LATEX_DIR) all > /dev/null 2>&1 $(MAKECMDPREFIX)mv "$(LATEX_DIR)/refman.pdf" "$(PDF_NAME)" $(MAKECMDPREFIX)rm -fr "$(LATEX_DIR)" olsrd-0.6.6.2/lib/sgwdynspeed/doc/doxygen.conf000066400000000000000000002050701234304727700212160ustar00rootroot00000000000000# Doxyfile 1.7.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "__LIBNAME__" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = "__PLUGIN_VER__" # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 2 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = YES # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. The create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.c *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 2 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # If the HTML_TIMESTAMP tag is set to YES then the generated HTML # documentation will contain the timesstamp. HTML_TIMESTAMP = NO # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the stylesheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = __LIBNAME__.chm # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = YES # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvances is that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = YES # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = YES # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = YES # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = YES #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = PREDEFINED += "__attribute__(x)=" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans.ttf # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = YES # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = YES # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES olsrd-0.6.6.2/lib/sgwdynspeed/olsrd.conf.sample000066400000000000000000000011211234304727700213660ustar00rootroot00000000000000LoadPlugin "/olsrd_sgwdynspeed.so.1.0.0" { # Specifies the file to watch for (dynamic) values for SmartGatewaySpeed. # If not specified then no watching is performed. An example file is # available in the doc directory of olsrd. # # Default: none # #PlParam "speedFile" "" # Specifies the period in milliseconds on which to read the speedFile # (if it changed) and activate its new setting for SmartGatewaySpeed. # This setting is only relevant if speedFile has been configured. # # Default: 10000 # #PlParam "speedFilePeriod" "10000" } olsrd-0.6.6.2/lib/sgwdynspeed/resources/000077500000000000000000000000001234304727700201335ustar00rootroot00000000000000olsrd-0.6.6.2/lib/sgwdynspeed/resources/olsrd.sgw.speed.conf000066400000000000000000000002751234304727700240270ustar00rootroot00000000000000# # OLSrd Smart Gateway uplink speed configuration file # # # Upstream speed in kilobit/s # Default: 128 #upstream=128 # # Downstream speed in kilobit/s # Default: 1024 #downstream=1024 olsrd-0.6.6.2/lib/sgwdynspeed/src/000077500000000000000000000000001234304727700167105ustar00rootroot00000000000000olsrd-0.6.6.2/lib/sgwdynspeed/src/configuration.c000066400000000000000000000065531234304727700217340ustar00rootroot00000000000000#include "configuration.h" /* Plugin includes */ #include "sgwDynSpeed.h" /* OLSR includes */ /* System includes */ #include #include #include #include #include #include #include /* * Utility functions */ /** Read an unsigned long long number from a value string @param valueName the name of the value @param value the string to convert to a number @param valueNumber a pointer to the location where to store the number upon successful conversion @return - true on success - false otherwise */ static bool readULL(const char * valueName, const char * value, unsigned long long * valueNumber) { char * endPtr = NULL; unsigned long long valueNew; errno = 0; valueNew = strtoull(value, &endPtr, 10); if (!((endPtr != value) && (*value != '\0') && (*endPtr == '\0'))) { /* invalid conversion */ sgwDynSpeedError(true, "Configured %s (%s) could not be converted to a number", valueName, value); return false; } *valueNumber = valueNew; return true; } /* * speedFile */ /** The speedFile buffer */ static char speedFile[PATH_MAX]; /** True when the speedFile is set */ static bool speedFileSet = false; /** @return The speed file filename. returns NULL if not set */ char * getSpeedFile(void) { if (!speedFileSet) { return NULL; } return &speedFile[0]; } /** Set the speed file filename. @param value The value of the speed file filename to set @param data Unused @param addon Unused @return - true when an error is detected - false otherwise */ int setSpeedFile(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { size_t valueLength; if (!value) { speedFileSet = false; return false; } valueLength = strlen(value); if (!valueLength) { speedFileSet = false; return false; } if (valueLength > (PATH_MAX - 1)) { sgwDynSpeedError(false, "Configured %s is too long, maximum length is" " %u, current length is %lu", SGWDYNSPEED_SPEEDFILE_NAME, PATH_MAX, (unsigned long) valueLength); return true; } strcpy(&speedFile[0], value); speedFileSet = true; return false; } /* * speedFilePeriod */ /** The speedFilePeriod value (milliseconds) */ unsigned long long speedFilePeriod = SGWDYNSPEED_SPEEDFILEPERIOD_DEFAULT; /** @return The speedFilePeriod (in milliseconds) */ unsigned long long getSpeedFilePeriod(void) { return speedFilePeriod; } /** Set the speedFilePeriod @param value The speedFilePeriod (a number in string representation) @param data Unused @param addon Unused @return - true when an error is detected - false otherwise */ int setSpeedFilePeriod(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { static const char * valueName = SGWDYNSPEED_SPEEDFILEPERIOD_NAME; unsigned long long speedFilePeriodNew; assert(value != NULL); if (!readULL(valueName, value, &speedFilePeriodNew)) { return true; } if ((speedFilePeriodNew < SGWDYNSPEED_SPEEDFILEPERIOD_MIN) || (speedFilePeriodNew > SGWDYNSPEED_SPEEDFILEPERIOD_MAX)) { sgwDynSpeedError(false, "Configured %s (%llu) is outside of" " valid range %llu-%llu", valueName, speedFilePeriodNew, SGWDYNSPEED_SPEEDFILEPERIOD_MIN, SGWDYNSPEED_SPEEDFILEPERIOD_MAX); return true; } speedFilePeriod = speedFilePeriodNew; return false; } olsrd-0.6.6.2/lib/sgwdynspeed/src/configuration.h000066400000000000000000000021631234304727700217320ustar00rootroot00000000000000#ifndef _SGWDYNSPEED_CONFIGURATION_H_ #define _SGWDYNSPEED_CONFIGURATION_H_ /* Plugin includes */ /* OLSR includes */ #include "olsrd_plugin.h" /* System includes */ /* * speedFile */ /** The name of the speedFile plugin parameter */ #define SGWDYNSPEED_SPEEDFILE_NAME "speedFile" char * getSpeedFile(void); int setSpeedFile(const char *value, void *data, set_plugin_parameter_addon addon); /* * speedFilePeriod */ /** The name of the speedFilePeriod plugin parameter */ #define SGWDYNSPEED_SPEEDFILEPERIOD_NAME "speedFilePeriod" /** The default value of the speedFilePeriod plugin parameter */ #define SGWDYNSPEED_SPEEDFILEPERIOD_DEFAULT ((unsigned long long)10000) /** The minimal value of the speedFilePeriod plugin parameter */ #define SGWDYNSPEED_SPEEDFILEPERIOD_MIN ((unsigned long long)1000) /** The maximal value of the speedFilePeriod plugin parameter */ #define SGWDYNSPEED_SPEEDFILEPERIOD_MAX ((unsigned long long)320000000) unsigned long long getSpeedFilePeriod(void); int setSpeedFilePeriod(const char *value, void *data, set_plugin_parameter_addon addon); #endif /* _SGWDYNSPEED_CONFIGURATION_H_ */ olsrd-0.6.6.2/lib/sgwdynspeed/src/olsrdPlugin.c000066400000000000000000000032621234304727700213610ustar00rootroot00000000000000#include "olsrdPlugin.h" /* Plugin includes */ #include "sgwDynSpeed.h" /* OLSRD includes */ #include "olsr.h" /* System includes */ #include /* * OLSR Entrypoints */ /** OLSR entrypoint to initialise the plugin. @return - 0 on fail - 1 on success */ int olsrd_plugin_init(void) { bool retval = initSgwDynSpeed(); if (retval) { olsr_printf(0, "%s\n", SGWDYNSPEED_PLUGIN_NAME_LONG #ifdef GIT_SHA " (" GIT_SHA ")" #endif /* GIT_SHA */ ); } return (retval ? 1 : 0); } /** OLSR entrypoint to retrieve the interface version supported by the plugin. @return the supported interface version */ int olsrd_plugin_interface_version(void) { return SGWDYNSPEED_PLUGIN_INTERFACE_VERSION; } /** OLSR entrypoint to retrieve the plugin parameter configuration. @param params a pointer to a variable in which the function stores a pointer to the plugin parameter configuration @param size a pointer to a variable in which the function stores the number of rows of the plugin parameter configuration */ void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = &plugin_parameters[0]; *size = ARRAYSIZE(plugin_parameters); } /* * Shared Library Entrypoints */ /** Shared library entrypoint declaration for initialisation */ static void __attribute__ ((constructor)) sgwDynSpeed_init(void); /** Shared library entrypoint declaration for destruction */ static void __attribute__ ((destructor)) sgwDynSpeed_fini(void); /** Shared library entrypoint for initialisation */ static void sgwDynSpeed_init(void) { } /** Shared library entrypoint for destruction */ static void sgwDynSpeed_fini(void) { stopSgwDynSpeed(); } olsrd-0.6.6.2/lib/sgwdynspeed/src/olsrdPlugin.h000066400000000000000000000014521234304727700213650ustar00rootroot00000000000000#ifndef _SGWDYNSPEED_OLSRD_PLUGIN_H_ #define _SGWDYNSPEED_OLSRD_PLUGIN_H_ /* Plugin includes */ #include "configuration.h" /* OLSRD includes */ #include "olsrd_plugin.h" /* System includes */ #include /** The interface version supported by the plugin */ #define SGWDYNSPEED_PLUGIN_INTERFACE_VERSION 5 /** The plugin parameter configuration, containing the parameter names, pointers to their setters, and an optional data pointer that is given to the setter when it is called. */ static const struct olsrd_plugin_parameters plugin_parameters[] = { { .name = SGWDYNSPEED_SPEEDFILE_NAME, .set_plugin_parameter = &setSpeedFile, .data = NULL}, { .name = SGWDYNSPEED_SPEEDFILEPERIOD_NAME, .set_plugin_parameter = &setSpeedFilePeriod, .data = NULL} }; #endif /* _SGWDYNSPEED_OLSRD_PLUGIN_H_ */ olsrd-0.6.6.2/lib/sgwdynspeed/src/sgwDynSpeed.c000066400000000000000000000060041234304727700213100ustar00rootroot00000000000000#include "sgwDynSpeed.h" /* Plugin includes */ #include "speedFile.h" #include "configuration.h" /* OLSRD includes */ #include "olsr.h" #include "olsr_cookie.h" #include "scheduler.h" /* System includes */ /** Report a plugin error. @param useErrno when true then errno is used in the error message; the error reason is also reported. @param format a pointer to the format string @param ... arguments to the format string */ void sgwDynSpeedError(bool useErrno, const char *format, ...) { char strDesc[256]; char *stringErr = NULL; if (useErrno) { stringErr = strerror(errno); } if ((format == NULL) || (*format == '\0')) { if (useErrno) { olsr_printf(0, "%s: %s\n", SGWDYNSPEED_PLUGIN_ABBR, stringErr); } else { olsr_printf(0, "%s: Unknown error\n", SGWDYNSPEED_PLUGIN_ABBR); } } else { va_list arglist; va_start(arglist, format); vsnprintf(strDesc, sizeof(strDesc), format, arglist); va_end(arglist); strDesc[sizeof(strDesc) - 1] = '\0'; /* Ensures null termination */ if (useErrno) { olsr_printf(0, "%s: %s: %s\n", SGWDYNSPEED_PLUGIN_ABBR, strDesc, stringErr); } else { olsr_printf(0, "%s: %s\n", SGWDYNSPEED_PLUGIN_ABBR, strDesc); } } } /** * Timer callback that reads the smart gateway speed file */ static void smartgw_read_speed_file(void *context __attribute__ ((unused))) { readSpeedFile(getSpeedFile()); return; } /** The timer cookie, used to trace back the originator in debug */ static struct olsr_cookie_info *smartgw_speed_file_timer_cookie = NULL; /** The timer */ static struct timer_entry * smartgw_speed_file_timer = NULL; /** Initialise the plugin: check the configuration, initialise the NMEA parser, create network interface sockets, hookup the plugin to OLSR and setup data that can be setup in advance. @return - false upon failure - true otherwise */bool initSgwDynSpeed(void) { char * speedFile; if (!startSpeedFile()) { return false; } speedFile = getSpeedFile(); if (speedFile) { readSpeedFile(speedFile); if (smartgw_speed_file_timer_cookie == NULL) { smartgw_speed_file_timer_cookie = olsr_alloc_cookie("smartgw speed file", OLSR_COOKIE_TYPE_TIMER); if (smartgw_speed_file_timer_cookie == NULL) { sgwDynSpeedError(false, "Could not allocate smart gateway speed file cookie"); return false; } } if (smartgw_speed_file_timer == NULL) { smartgw_speed_file_timer = olsr_start_timer(getSpeedFilePeriod(), 0, OLSR_TIMER_PERIODIC, &smartgw_read_speed_file, NULL, smartgw_speed_file_timer_cookie); if (smartgw_speed_file_timer == NULL) { sgwDynSpeedError(false, "Could not start smart gateway speed file timer"); return false; } } } return true; } /** * stop the plugin, free resources */ void stopSgwDynSpeed(void) { if (smartgw_speed_file_timer != NULL) { olsr_stop_timer(smartgw_speed_file_timer); smartgw_speed_file_timer = NULL; } if (smartgw_speed_file_timer_cookie != NULL) { olsr_free_cookie(smartgw_speed_file_timer_cookie); smartgw_speed_file_timer_cookie = NULL; } stopSpeedFile(); } olsrd-0.6.6.2/lib/sgwdynspeed/src/sgwDynSpeed.h000066400000000000000000000011351234304727700213150ustar00rootroot00000000000000#ifndef _SGWDYNSPEED_SGWDYNSPEED_H #define _SGWDYNSPEED_SGWDYNSPEED_H /* Plugin includes */ /* OLSR includes */ /* System includes */ #include /* * Global */ /** The long plugin name */ #define SGWDYNSPEED_PLUGIN_NAME_LONG "OLSRD Smart Gateway Dynamic Speed plugin" /** The short plugin name / abbreviation */ #define SGWDYNSPEED_PLUGIN_ABBR "SGWDYNSPEED" /* * Interface */ bool initSgwDynSpeed(void); void stopSgwDynSpeed(void); void sgwDynSpeedError(bool useErrno, const char *format, ...) __attribute__ ((format(printf, 2, 3))); #endif /* _SGWDYNSPEED_SGWDYNSPEED_H */ olsrd-0.6.6.2/lib/sgwdynspeed/src/speedFile.c000066400000000000000000000135451234304727700207640ustar00rootroot00000000000000#include "speedFile.h" /* Plugin includes */ #include "sgwDynSpeed.h" /* OLSRD includes */ #include "olsr_cfg.h" #include "gateway.h" /* System includes */ #include #include #include #include #include #include #include #include #include #define SPEED_UPLINK_NAME "upstream" #define SPEED_DOWNLINK_NAME "downstream" /** the maximal length of a line that is read from the file */ #define LINE_LENGTH 256 /** regular expression describing a comment */ static const char * regexCommentString = "^([[:space:]]*|[[:space:]#]+.*)$"; /** regular expression describing a key/value pair */ static const char * regexNameValueString = "^[[:space:]]*([^[:space:]]+)[[:space:]]*=[[:space:]]*([[:digit:]]+)[[:space:]]*$"; /** the number of matches in regexNameValueString */ static const size_t regexNameValuematchCount = 3; /** the compiled regular expression describing a comment */ static regex_t regexComment; /** the compiled regular expression describing a key/value pair */ static regex_t regexNameValue; /** true when the plugin has been started */ static bool started = false; /** type to hold the cached stat result */ typedef struct _CachedStat { time_t timeStamp; /* Time of last modification (second resolution) */ } CachedStat; /** the cached stat result */ static CachedStat cachedStat; /** Read an unsigned long number from a value string @param valueName the name of the value @param value the string to convert to a number @param valueNumber a pointer to the location where to store the number upon successful conversion @return - true on success - false otherwise */ static bool readUL(const char * valueName, const char * value, unsigned long * valueNumber) { char * endPtr = NULL; unsigned long valueNew; assert(valueName != NULL); assert(value != NULL); assert(valueNumber != NULL); errno = 0; valueNew = strtoul(value, &endPtr, 10); if (!((endPtr != value) && (*value != '\0') && (*endPtr == '\0'))) { /* invalid conversion */ sgwDynSpeedError(false, "Value of parameter %s (%s) could not be converted to a number", valueName, value); return false; } *valueNumber = valueNew; return true; } /** * Initialises the speedFile reader. * @return true upon success, false otherwise */ bool startSpeedFile(void) { if (started) { return true; } if (regcomp(®exComment, regexCommentString, REG_EXTENDED | REG_ICASE)) { sgwDynSpeedError(false, "Could not compile regex \"%s\"", regexCommentString); return false; } if (regcomp(®exNameValue, regexNameValueString, REG_EXTENDED | REG_ICASE)) { sgwDynSpeedError(false, "Could not compile regex \"%s\"", regexNameValueString); regfree(®exComment); return false; } cachedStat.timeStamp = -1; started = true; return true; } /** * Cleans up the speedFile reader. */ void stopSpeedFile(void) { if (started) { regfree(®exNameValue); regfree(®exComment); started = false; } } /** * Performs a regex match * @param regex the compiled regex to match against * @param line the line to match * @param nmatch the number of matches to produce * @param pmatch the array with match information * @return true upon success, false otherwise */ static bool regexMatch(regex_t * regex, char * line, size_t nmatch, regmatch_t pmatch[]) { int result = regexec(regex, line, nmatch, pmatch, 0); if (!result) { return true; } if (result == REG_NOMATCH) { return false; } { char msgbuf[256]; regerror(result, regex, msgbuf, sizeof(msgbuf)); sgwDynSpeedError(false, "Regex match failed: %s", msgbuf); } return false; } /** the buffer in which to store a line read from the file */ static char line[LINE_LENGTH]; /** * Read the speed file * @param fileName the filename */ void readSpeedFile(char * fileName) { int fd; struct stat statBuf; FILE * fp = NULL; unsigned int lineNumber = 0; char * name = NULL; char * value = NULL; unsigned long uplink = DEF_UPLINK_SPEED; unsigned long downlink = DEF_DOWNLINK_SPEED; bool uplinkSet = false; bool downlinkSet = false; fd = open(fileName, O_RDONLY); if (fd < 0) { /* could not access the file */ goto out; } if (fstat(fd, &statBuf)) { /* could not access the file */ goto out; } if (!memcmp(&cachedStat.timeStamp, &statBuf.st_mtime, sizeof(cachedStat.timeStamp))) { /* file did not change since last read */ goto out; } fp = fdopen(fd, "r"); if (!fp) { goto out; } memcpy(&cachedStat.timeStamp, &statBuf.st_mtime, sizeof(cachedStat.timeStamp)); while (fgets(line, LINE_LENGTH, fp)) { regmatch_t pmatch[regexNameValuematchCount]; lineNumber++; if (regexMatch(®exComment, line, 0, NULL)) { continue; } if (!regexMatch(®exNameValue, line, regexNameValuematchCount, pmatch)) { sgwDynSpeedError(false, "Gateway speed file \"%s\", line %d uses invalid syntax: %s", fileName, lineNumber, line); goto out; } /* determine name/value */ name = &line[pmatch[1].rm_so]; line[pmatch[1].rm_eo] = '\0'; value = &line[pmatch[2].rm_so]; line[pmatch[2].rm_eo] = '\0'; if (!strncasecmp(SPEED_UPLINK_NAME, name, sizeof(line))) { if (!readUL(SPEED_UPLINK_NAME, value, &uplink)) { goto out; } uplinkSet = true; } else if (!strncasecmp(SPEED_DOWNLINK_NAME, name, sizeof(line))) { if (!readUL(SPEED_DOWNLINK_NAME, value, &downlink)) { goto out; } downlinkSet = true; } else { sgwDynSpeedError(false, "Gateway speed file \"%s\", line %d uses an invalid option \"%s\"," " valid options are [%s|%s]", fileName, lineNumber, name, SPEED_UPLINK_NAME, SPEED_DOWNLINK_NAME); goto out; } } fclose(fp); fp = NULL; if (uplinkSet) { olsr_cnf->smart_gw_uplink = uplink; } if (downlinkSet) { olsr_cnf->smart_gw_downlink = downlink; } if (uplinkSet || downlinkSet) { refresh_smartgw_netmask(); } out: if (fp) { fclose(fp); } if (fd >= 0) { close(fd); } return; } olsrd-0.6.6.2/lib/sgwdynspeed/src/speedFile.h000066400000000000000000000003661234304727700207660ustar00rootroot00000000000000#ifndef SPEEDFILE_H #define SPEEDFILE_H /* Plugin includes */ /* OLSRD includes */ /* System includes */ #include bool startSpeedFile(void); void stopSpeedFile(void); void readSpeedFile(char * fileName); #endif /* SPEEDFILE_H */ olsrd-0.6.6.2/lib/sgwdynspeed/version-script.txt000066400000000000000000000002051234304727700216460ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/lib/txtinfo/000077500000000000000000000000001234304727700152605ustar00rootroot00000000000000olsrd-0.6.6.2/lib/txtinfo/Makefile000066400000000000000000000044311234304727700167220ustar00rootroot00000000000000# The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # OLSRD_PLUGIN = true PLUGIN_NAME = olsrd_txtinfo PLUGIN_VER = 0.1 TOPDIR = ../.. include $(TOPDIR)/Makefile.inc default_target: $(PLUGIN_FULLNAME) $(PLUGIN_FULLNAME): $(OBJS) version-script.txt ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) install: $(PLUGIN_FULLNAME) $(STRIP) $(PLUGIN_FULLNAME) $(INSTALL_LIB) uninstall: $(UNINSTALL_LIB) clean: rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) olsrd-0.6.6.2/lib/txtinfo/README_TXTINFO000066400000000000000000000042241234304727700173550ustar00rootroot00000000000000 PLUGIN USAGE ================== installation: make make install echo /all | nc 127.0.0.1 2006 or telnet 127.0.0.1 2006 (and type /all then enter) or wget http://localhost:2006/all -qO - or curl http://localhost:2006/all Or in a web browser: http://localhost:2006/all The output shows the links of the node, its neighbors, the topology table, HNA (Host and Network Association) and MID (Multiple Interface Declaration) tables and the actual routing table. So what commands does the txtinfo plugin accept? * Config: "/config" -> send_what=SIW_CONFIG * Gateways: "/gateway" -> send_what=SIW_GATEWAY * HNA: "/hna" -> send_what=SIW_HNA * Interfaces: "/interface" -> send_what=SIW_INTERFACE * Links: "/link" -> send_what=SIW_LINK * MID: "/mid" -> send_what=SIW_MID * Neighbors: "/neigh" -> send_what=SIW_NEIGH * Routes: "/route" -> send_what=SIW_ROUTE * Topology: "/topo" -> send_what=SIW_TOPO * 2-hop neighbors: "/2hop" -> send_what=SIW_2HOP * Version: "/ver" -> send_what=version of olsrd This is the same as the "/neigh" and "/link" commands combined: * "/neighbours" -> send_what = SIW_NEIGHLINK -> neighbours and links Then there is "/all" which returns all of the most commonly used commands above (but not every command above). "/all" is the same as "/links/neigh/topo/hna/mid/routes". http://www.olsr.org/?q=node/26 PLUGIN CONFIGURATION ========================== The plugin accepts two parameters: "port" and "accept". There are no futher parameters. Here's an example configuration for UNIX systems (for Windows, change the plugin to end in .dll): LoadPlugin "olsrd_txtinfo.so.0.1" { # the default port is 2006 but you can change it like this: #PlParam "port" "8080" # You can set a "accept" single address to allow to connect to # txtinfo. If no address is specified, then localhost (127.0.0.1) # is allowed by default. txtinfo will only use the first "accept" # parameter specified and will ignore the rest. # to allow a specific host: #PlParam "accept" "172.29.44.23" # if you set it to 0.0.0.0, it will accept all connections #PlParam "accept" "0.0.0.0" } olsrd-0.6.6.2/lib/txtinfo/src/000077500000000000000000000000001234304727700160475ustar00rootroot00000000000000olsrd-0.6.6.2/lib/txtinfo/src/olsrd_plugin.c000066400000000000000000000077051234304727700207250ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #include #include #include #include #include #include #include "olsrd_plugin.h" #include "olsrd_txtinfo.h" #include "defs.h" #define PLUGIN_NAME "OLSRD txtinfo plugin" #define PLUGIN_VERSION "0.1" #define PLUGIN_AUTHOR "Lorenz Schori" #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR #define PLUGIN_INTERFACE_VERSION 5 union olsr_ip_addr txtinfo_accept_ip; union olsr_ip_addr txtinfo_listen_ip; int ipc_port; int nompr; static void my_init(void) __attribute__ ((constructor)); static void my_fini(void) __attribute__ ((destructor)); /** *Constructor */ static void my_init(void) { /* Print plugin info to stdout */ printf("%s\n", MOD_DESC); /* defaults for parameters */ ipc_port = 2006; if (olsr_cnf->ip_version == AF_INET) { txtinfo_accept_ip.v4.s_addr = htonl(INADDR_LOOPBACK); txtinfo_listen_ip.v4.s_addr = htonl(INADDR_ANY); } else { txtinfo_accept_ip.v6 = in6addr_loopback; txtinfo_listen_ip.v6 = in6addr_any; } /* highlite neighbours by default */ nompr = 0; } /** *Destructor */ static void my_fini(void) { /* Calls the destruction function * olsr_plugin_exit() * This function should be present in your * sourcefile and all data destruction * should happen there - NOT HERE! */ olsr_plugin_exit(); } int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } static const struct olsrd_plugin_parameters plugin_parameters[] = { {.name = "port",.set_plugin_parameter = &set_plugin_port,.data = &ipc_port}, {.name = "accept",.set_plugin_parameter = &set_plugin_ipaddress,.data = &txtinfo_accept_ip}, {.name = "listen",.set_plugin_parameter = &set_plugin_ipaddress,.data = &txtinfo_listen_ip}, }; void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = sizeof(plugin_parameters) / sizeof(*plugin_parameters); } /* * Local Variables: * mode: c * style: linux * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/txtinfo/src/olsrd_txtinfo.c000066400000000000000000000606321234304727700211200ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * includes code by Bruno Randolf * includes code by Andreas Lopatic * includes code by Sven-Ola Tuecke * includes code by Lorenz Schori * includes bugs by Markus Kittenberger * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #include #include #if !defined _WIN32 #include #endif /* !defined _WIN32 */ #include #include #include #include #include #include #include #include #include #include #include #include "ipcalc.h" #include "olsr.h" #include "builddata.h" #include "olsr_types.h" #include "neighbor_table.h" #include "two_hop_neighbor_table.h" #include "mpr_selector_set.h" #include "tc_set.h" #include "hna_set.h" #include "mid_set.h" #include "link_set.h" #include "net_olsr.h" #include "lq_plugin.h" #include "common/autobuf.h" #include "gateway.h" #include "olsrd_txtinfo.h" #include "olsrd_plugin.h" #ifdef _WIN32 #define close(x) closesocket(x) #endif /* _WIN32 */ static int ipc_socket; /* IPC initialization function */ static int plugin_ipc_init(void); static void send_info(unsigned int /*send_what*/, int /*socket*/); static void ipc_action(int, void *, unsigned int); static void ipc_print_neigh(struct autobuf *, bool); static void ipc_print_link(struct autobuf *); static void ipc_print_routes(struct autobuf *); static void ipc_print_topology(struct autobuf *); static void ipc_print_hna(struct autobuf *); static void ipc_print_mid(struct autobuf *); static void ipc_print_gateway(struct autobuf *); static void ipc_print_config(struct autobuf *); static void ipc_print_interface(struct autobuf *); #define TXT_IPC_BUFSIZE 256 #define SIW_NEIGH 0x0001 #define SIW_LINK 0x0002 #define SIW_ROUTE 0x0004 #define SIW_HNA 0x0008 #define SIW_MID 0x0010 #define SIW_TOPO 0x0020 #define SIW_GATEWAY 0x0040 #define SIW_INTERFACE 0x0080 #define SIW_CONFIG 0x0100 #define SIW_2HOP 0x0200 #define SIW_VERSION 0x0400 /* ALL = neigh link route hna mid topo */ #define SIW_ALL 0x003F #define MAX_CLIENTS 3 static char *outbuffer[MAX_CLIENTS]; static size_t outbuffer_size[MAX_CLIENTS]; static size_t outbuffer_written[MAX_CLIENTS]; static int outbuffer_socket[MAX_CLIENTS]; static int outbuffer_count = 0; static struct timer_entry *writetimer_entry; /** *Do initialization here * *This function is called by the my_init *function in uolsrd_plugin.c */ int olsrd_plugin_init(void) { /* Initial IPC value */ ipc_socket = -1; plugin_ipc_init(); return 1; } /** * destructor - called at unload */ void olsr_plugin_exit(void) { if (ipc_socket != -1) close(ipc_socket); } static int plugin_ipc_init(void) { union olsr_sockaddr sst; uint32_t yes = 1; socklen_t addrlen; /* Init ipc socket */ if ((ipc_socket = socket(olsr_cnf->ip_version, SOCK_STREAM, 0)) == -1) { #ifndef NODEBUG olsr_printf(1, "(TXTINFO) socket()=%s\n", strerror(errno)); #endif /* NODEBUG */ return 0; } else { if (setsockopt(ipc_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) { #ifndef NODEBUG olsr_printf(1, "(TXTINFO) setsockopt()=%s\n", strerror(errno)); #endif /* NODEBUG */ return 0; } #if (defined __FreeBSD__ || defined __FreeBSD_kernel__) && defined SO_NOSIGPIPE if (setsockopt(ipc_socket, SOL_SOCKET, SO_NOSIGPIPE, (char *)&yes, sizeof(yes)) < 0) { perror("SO_REUSEADDR failed"); return 0; } #endif /* (defined __FreeBSD__ || defined __FreeBSD_kernel__) && defined SO_NOSIGPIPE */ /* Bind the socket */ /* complete the socket structure */ memset(&sst, 0, sizeof(sst)); if (olsr_cnf->ip_version == AF_INET) { sst.in4.sin_family = AF_INET; addrlen = sizeof(struct sockaddr_in); #ifdef SIN6_LEN sst.in4.sin_len = addrlen; #endif /* SIN6_LEN */ sst.in4.sin_addr.s_addr = txtinfo_listen_ip.v4.s_addr; sst.in4.sin_port = htons(ipc_port); } else { sst.in6.sin6_family = AF_INET6; addrlen = sizeof(struct sockaddr_in6); #ifdef SIN6_LEN sst.in6.sin6_len = addrlen; #endif /* SIN6_LEN */ sst.in6.sin6_addr = txtinfo_listen_ip.v6; sst.in6.sin6_port = htons(ipc_port); } /* bind the socket to the port number */ if (bind(ipc_socket, &sst.in, addrlen) == -1) { #ifndef NODEBUG olsr_printf(1, "(TXTINFO) bind()=%s\n", strerror(errno)); #endif /* NODEBUG */ return 0; } /* show that we are willing to listen */ if (listen(ipc_socket, 1) == -1) { #ifndef NODEBUG olsr_printf(1, "(TXTINFO) listen()=%s\n", strerror(errno)); #endif /* NODEBUG */ return 0; } /* Register with olsrd */ add_olsr_socket(ipc_socket, &ipc_action, NULL, NULL, SP_PR_READ); #ifndef NODEBUG olsr_printf(2, "(TXTINFO) listening on port %d\n", ipc_port); #endif /* NODEBUG */ } return 1; } static void ipc_action(int fd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { union olsr_sockaddr pin; char addr[INET6_ADDRSTRLEN]; fd_set rfds; struct timeval tv; unsigned int send_what = 0; int ipc_connection; socklen_t addrlen = sizeof(pin); if (outbuffer_count >= MAX_CLIENTS) { return; } if ((ipc_connection = accept(fd, &pin.in, &addrlen)) == -1) { #ifndef NODEBUG olsr_printf(1, "(TXTINFO) accept()=%s\n", strerror(errno)); #endif /* NODEBUG */ return; } tv.tv_sec = tv.tv_usec = 0; if (olsr_cnf->ip_version == AF_INET) { if (inet_ntop(olsr_cnf->ip_version, &pin.in4.sin_addr, addr, INET6_ADDRSTRLEN) == NULL) addr[0] = '\0'; if (!ip4equal(&pin.in4.sin_addr, &txtinfo_accept_ip.v4) && txtinfo_accept_ip.v4.s_addr != INADDR_ANY) { #ifdef TXTINFO_ALLOW_LOCALHOST if (pin.in4.sin_addr.s_addr != INADDR_LOOPBACK) { #endif /* TXTINFO_ALLOW_LOCALHOST */ olsr_printf(1, "(TXTINFO) From host(%s) not allowed!\n", addr); close(ipc_connection); return; #ifdef TXTINFO_ALLOW_LOCALHOST } #endif /* TXTINFO_ALLOW_LOCALHOST */ } } else { if (inet_ntop(olsr_cnf->ip_version, &pin.in6.sin6_addr, addr, INET6_ADDRSTRLEN) == NULL) addr[0] = '\0'; /* Use in6addr_any (::) in olsr.conf to allow anybody. */ if (!ip6equal(&in6addr_any, &txtinfo_accept_ip.v6) && !ip6equal(&pin.in6.sin6_addr, &txtinfo_accept_ip.v6)) { olsr_printf(1, "(TXTINFO) From host(%s) not allowed!\n", addr); close(ipc_connection); return; } } #ifndef NODEBUG olsr_printf(2, "(TXTINFO) Connect from %s\n", addr); #endif /* NODEBUG */ /* purge read buffer to prevent blocking on linux */ FD_ZERO(&rfds); FD_SET((unsigned int)ipc_connection, &rfds); /* Win32 needs the cast here */ if (0 <= select(ipc_connection + 1, &rfds, NULL, NULL, &tv)) { char requ[1024]; ssize_t s = recv(ipc_connection, (void *)&requ, sizeof(requ)-1, 0); /* Win32 needs the cast here */ if (s == sizeof(requ)-1) { /* input was much too long, just skip the rest */ char dummy[1024]; while (recv(ipc_connection, (void *)&dummy, sizeof(dummy), 0) == sizeof(dummy)); } if (0 < s) { requ[s] = 0; /* To print out neighbours only on the Freifunk Status * page the normal output is somewhat lengthy. The * header parsing is sufficient for standard wget. */ if (0 != strstr(requ, "/neighbours")) send_what = SIW_NEIGH | SIW_LINK; else { /* print out every combinations of requested tabled * 3++ letter abbreviations are matched */ if (0 != strstr(requ, "/all")) send_what = SIW_ALL; else { /*already included in /all*/ if (0 != strstr(requ, "/nei")) send_what |= SIW_NEIGH; if (0 != strstr(requ, "/lin")) send_what |= SIW_LINK; if (0 != strstr(requ, "/rou")) send_what |= SIW_ROUTE; if (0 != strstr(requ, "/hna")) send_what |= SIW_HNA; if (0 != strstr(requ, "/mid")) send_what |= SIW_MID; if (0 != strstr(requ, "/top")) send_what |= SIW_TOPO; } if (0 != strstr(requ, "/gat")) send_what |= SIW_GATEWAY; if (0 != strstr(requ, "/con")) send_what |= SIW_CONFIG; if (0 != strstr(requ, "/int")) send_what |= SIW_INTERFACE; if (0 != strstr(requ, "/2ho")) send_what |= SIW_2HOP; if (0 != strstr(requ, "/ver")) send_what |= SIW_VERSION; } } if ( send_what == 0 ) send_what = SIW_ALL; } send_info(send_what, ipc_connection); } static void ipc_print_neigh(struct autobuf *abuf, bool list_2hop) { struct ipaddr_str buf1; struct neighbor_entry *neigh; struct neighbor_2_list_entry *list_2; int thop_cnt; abuf_puts(abuf, "Table: Neighbors\nIP address\tSYM\tMPR\tMPRS\tWill."); if (list_2hop) abuf_puts(abuf,"\n\t2hop interface adrress\n"); else abuf_puts(abuf, "\t2 Hop Neighbors\n"); /* Neighbors */ OLSR_FOR_ALL_NBR_ENTRIES(neigh) { abuf_appendf(abuf, "%s\t%s\t%s\t%s\t%d\t", olsr_ip_to_string(&buf1, &neigh->neighbor_main_addr), (neigh->status == SYM) ? "YES" : "NO", neigh->is_mpr ? "YES" : "NO", olsr_lookup_mprs_set(&neigh->neighbor_main_addr) ? "YES" : "NO", neigh->willingness); thop_cnt = 0; for (list_2 = neigh->neighbor_2_list.next; list_2 != &neigh->neighbor_2_list; list_2 = list_2->next) { if (list_2hop) abuf_appendf(abuf, "\t%s\n", olsr_ip_to_string(&buf1, &list_2->neighbor_2->neighbor_2_addr)); else thop_cnt++; } if (!list_2hop) { abuf_appendf(abuf, "%d\n", thop_cnt); } } OLSR_FOR_ALL_NBR_ENTRIES_END(neigh); abuf_puts(abuf, "\n"); } static void ipc_print_link(struct autobuf *abuf) { struct ipaddr_str buf1, buf2; struct lqtextbuffer lqbuffer1, lqbuffer2; struct link_entry *my_link = NULL; #ifdef ACTIVATE_VTIME_TXTINFO abuf_puts(abuf, "Table: Links\nLocal IP\tRemote IP\tVTime\tLQ\tNLQ\tCost\n"); #else /* ACTIVATE_VTIME_TXTINFO */ abuf_puts(abuf, "Table: Links\nLocal IP\tRemote IP\tHyst.\tLQ\tNLQ\tCost\n"); #endif /* ACTIVATE_VTIME_TXTINFO */ /* Link set */ OLSR_FOR_ALL_LINK_ENTRIES(my_link) { #ifdef ACTIVATE_VTIME_TXTINFO int diff = (unsigned int)(my_link->link_timer->timer_clock - now_times); abuf_appendf(abuf, "%s\t%s\t%d.%03d\t%s\t%s\t\n", olsr_ip_to_string(&buf1, &my_link->local_iface_addr), olsr_ip_to_string(&buf2, &my_link->neighbor_iface_addr), diff/1000, abs(diff%1000), get_link_entry_text(my_link, '\t', &lqbuffer1), get_linkcost_text(my_link->linkcost, false, &lqbuffer2)); #else /* ACTIVATE_VTIME_TXTINFO */ abuf_appendf(abuf, "%s\t%s\t0.00\t%s\t%s\t\n", olsr_ip_to_string(&buf1, &my_link->local_iface_addr), olsr_ip_to_string(&buf2, &my_link->neighbor_iface_addr), get_link_entry_text(my_link, '\t', &lqbuffer1), get_linkcost_text(my_link->linkcost, false, &lqbuffer2)); #endif /* ACTIVATE_VTIME_TXTINFO */ } OLSR_FOR_ALL_LINK_ENTRIES_END(my_link); abuf_puts(abuf, "\n"); } static void ipc_print_routes(struct autobuf *abuf) { struct ipaddr_str buf1, buf2; struct rt_entry *rt; struct lqtextbuffer lqbuffer; abuf_puts(abuf, "Table: Routes\nDestination\tGateway IP\tMetric\tETX\tInterface\n"); /* Walk the route table */ OLSR_FOR_ALL_RT_ENTRIES(rt) { abuf_appendf(abuf, "%s/%d\t%s\t%d\t%s\t%s\t\n", olsr_ip_to_string(&buf1, &rt->rt_dst.prefix), rt->rt_dst.prefix_len, olsr_ip_to_string(&buf2, &rt->rt_best->rtp_nexthop.gateway), rt->rt_best->rtp_metric.hops, get_linkcost_text(rt->rt_best->rtp_metric.cost, true, &lqbuffer), if_ifwithindex_name(rt->rt_best->rtp_nexthop.iif_index)); } OLSR_FOR_ALL_RT_ENTRIES_END(rt); abuf_puts(abuf, "\n"); } static void ipc_print_topology(struct autobuf *abuf) { struct tc_entry *tc; #ifdef ACTIVATE_VTIME_TXTINFO abuf_puts(abuf, "Table: Topology\nDest. IP\tLast hop IP\tLQ\tNLQ\tCost\tVTime\n"); #else /* ACTIVATE_VTIME_TXTINFO */ abuf_puts(abuf, "Table: Topology\nDest. IP\tLast hop IP\tLQ\tNLQ\tCost\n"); #endif /* ACTIVATE_VTIME_TXTINFO */ /* Topology */ OLSR_FOR_ALL_TC_ENTRIES(tc) { struct tc_edge_entry *tc_edge; OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) { if (tc_edge->edge_inv) { struct ipaddr_str dstbuf, addrbuf; struct lqtextbuffer lqbuffer1, lqbuffer2; #ifdef ACTIVATE_VTIME_TXTINFO uint32_t vt = tc->validity_timer != NULL ? (tc->validity_timer->timer_clock - now_times) : 0; int diff = (int)(vt); abuf_appendf(abuf, "%s\t%s\t%s\t%s\t%d.%03d\n", olsr_ip_to_string(&dstbuf, &tc_edge->T_dest_addr), olsr_ip_to_string(&addrbuf, &tc->addr), get_tc_edge_entry_text(tc_edge, '\t', &lqbuffer1), get_linkcost_text(tc_edge->cost, false, &lqbuffer2), diff/1000, diff%1000); #else /* ACTIVATE_VTIME_TXTINFO */ abuf_appendf(abuf, "%s\t%s\t%s\t%s\n", olsr_ip_to_string(&dstbuf, &tc_edge->T_dest_addr), olsr_ip_to_string(&addrbuf, &tc->addr), get_tc_edge_entry_text(tc_edge, '\t', &lqbuffer1), get_linkcost_text(tc_edge->cost, false, &lqbuffer2)); #endif /* ACTIVATE_VTIME_TXTINFO */ } } OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge); } OLSR_FOR_ALL_TC_ENTRIES_END(tc); abuf_puts(abuf, "\n"); } static void ipc_print_hna(struct autobuf *abuf) { struct ip_prefix_list *hna; struct hna_entry *tmp_hna; struct hna_net *tmp_net; struct ipaddr_str buf, mainaddrbuf; #ifdef ACTIVATE_VTIME_TXTINFO abuf_puts(abuf, "Table: HNA\nDestination\tGateway\tVTime\n"); #else /* ACTIVATE_VTIME_TXTINFO */ abuf_puts(abuf, "Table: HNA\nDestination\tGateway\n"); #endif /* ACTIVATE_VTIME_TXTINFO */ /* Announced HNA entries */ if (olsr_cnf->ip_version == AF_INET) { for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next) { abuf_appendf(abuf, "%s/%d\t%s\n", olsr_ip_to_string(&buf, &hna->net.prefix), hna->net.prefix_len, olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->main_addr)); } } else { for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next) { abuf_appendf(abuf, "%s/%d\t%s\n", olsr_ip_to_string(&buf, &hna->net.prefix), hna->net.prefix_len, olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->main_addr)); } } /* HNA entries */ OLSR_FOR_ALL_HNA_ENTRIES(tmp_hna) { /* Check all networks */ for (tmp_net = tmp_hna->networks.next; tmp_net != &tmp_hna->networks; tmp_net = tmp_net->next) { #ifdef ACTIVATE_VTIME_TXTINFO uint32_t vt = tmp_net->hna_net_timer != NULL ? (tmp_net->hna_net_timer->timer_clock - now_times) : 0; int diff = (int)(vt); abuf_appendf(abuf, "%s/%d\t%s\t\%d.%03d\n", olsr_ip_to_string(&buf, &tmp_net->hna_prefix.prefix), tmp_net->hna_prefix.prefix_len, olsr_ip_to_string(&mainaddrbuf, &tmp_hna->A_gateway_addr), diff/1000, abs(diff%1000)); #else /* ACTIVATE_VTIME_TXTINFO */ abuf_appendf(abuf, "%s/%d\t%s\n", olsr_ip_to_string(&buf, &tmp_net->hna_prefix.prefix), tmp_net->hna_prefix.prefix_len, olsr_ip_to_string(&mainaddrbuf, &tmp_hna->A_gateway_addr)); #endif /* ACTIVATE_VTIME_TXTINFO */ } } OLSR_FOR_ALL_HNA_ENTRIES_END(tmp_hna); abuf_puts(abuf, "\n"); } static void ipc_print_mid(struct autobuf *abuf) { int idx; unsigned short is_first; struct mid_entry *entry; struct mid_address *alias; #ifdef ACTIVATE_VTIME_TXTINFO abuf_puts(abuf, "Table: MID\nIP address\tAlias\tVTime\n"); #else /* ACTIVATE_VTIME_TXTINFO */ abuf_puts(abuf, "Table: MID\nIP address\tAliases\n"); #endif /* ACTIVATE_VTIME_TXTINFO */ /* MID */ for (idx = 0; idx < HASHSIZE; idx++) { entry = mid_set[idx].next; while (entry != &mid_set[idx]) { #ifdef ACTIVATE_VTIME_TXTINFO struct ipaddr_str buf, buf2; #else /* ACTIVATE_VTIME_TXTINFO */ struct ipaddr_str buf; abuf_puts(abuf, olsr_ip_to_string(&buf, &entry->main_addr)); #endif /* ACTIVATE_VTIME_TXTINFO */ alias = entry->aliases; is_first = 1; while (alias) { #ifdef ACTIVATE_VTIME_TXTINFO uint32_t vt = alias->vtime - now_times; int diff = (int)(vt); abuf_appendf(abuf, "%s\t%s\t%d.%03d\n", olsr_ip_to_string(&buf, &entry->main_addr), olsr_ip_to_string(&buf2, &alias->alias), diff/1000, abs(diff%1000)); #else /* ACTIVATE_VTIME_TXTINFO */ abuf_appendf(abuf, "%s%s", (is_first ? "\t" : ";"), olsr_ip_to_string(&buf, &alias->alias)); #endif /* ACTIVATE_VTIME_TXTINFO */ alias = alias->next_alias; is_first = 0; } entry = entry->next; #ifndef ACTIVATE_VTIME_TXTINFO abuf_puts(abuf,"\n"); #endif /* ACTIVATE_VTIME_TXTINFO */ } } abuf_puts(abuf, "\n"); } static void ipc_print_gateway(struct autobuf *abuf) { #ifndef __linux__ abuf_puts(abuf, "Gateway mode is only supported in linux\n"); #else /* __linux__ */ static const char IPV4[] = "ipv4"; static const char IPV4_NAT[] = "ipv4(n)"; static const char IPV6[] = "ipv6"; static const char NONE[] = "-"; struct ipaddr_str buf; struct gateway_entry *gw; struct lqtextbuffer lqbuf; // Status IP ETX Hopcount Uplink-Speed Downlink-Speed ipv4/ipv4-nat/- ipv6/- ipv6-prefix/- abuf_puts(abuf, "Table: Gateways\nStatus\tGateway IP\tETX\tHopcnt\tUplink\tDownlnk\tIPv4\tIPv6\tPrefix\n"); OLSR_FOR_ALL_GATEWAY_ENTRIES(gw) { char v4 = '-', v6 = '-'; const char *v4type = NONE, *v6type = NONE; struct tc_entry *tc; if ((tc = olsr_lookup_tc_entry(&gw->originator)) == NULL) { continue; } if (gw == olsr_get_inet_gateway(false)) { v4 = 's'; } else if (gw->ipv4 && (olsr_cnf->ip_version == AF_INET || olsr_cnf->use_niit) && (olsr_cnf->smart_gw_allow_nat || !gw->ipv4nat)) { v4 = 'u'; } if (gw == olsr_get_inet_gateway(true)) { v6 = 's'; } else if (gw->ipv6 && olsr_cnf->ip_version == AF_INET6) { v6 = 'u'; } if (gw->ipv4) { v4type = gw->ipv4nat ? IPV4_NAT : IPV4; } if (gw->ipv6) { v6type = IPV6; } abuf_appendf(abuf, "%c%c\t%s\t%s\t%d\t%u\t%u\t%s\t%s\t%s\n", v4, v6, olsr_ip_to_string(&buf, &gw->originator), get_linkcost_text(tc->path_cost, true, &lqbuf), tc->hops, gw->uplink, gw->downlink, v4type, v6type, gw->external_prefix.prefix_len == 0 ? NONE : olsr_ip_prefix_to_string(&gw->external_prefix)); } OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw) #endif /* __linux__ */ } static void ipc_print_config(struct autobuf *abuf) { olsrd_write_cnf_autobuf(abuf, olsr_cnf); } static void ipc_print_version(struct autobuf *abuf) { abuf_appendf(abuf, "Version: %s (built on %s on %s)\n", olsrd_version, build_date, build_host); } static void ipc_print_interface(struct autobuf *abuf) { const struct olsr_if *ifs; abuf_puts(abuf, "Table: Interfaces\nName\tState\tMTU\tWLAN\tSrc-Adress\tMask\tDst-Adress\n"); for (ifs = olsr_cnf->interfaces; ifs != NULL; ifs = ifs->next) { const struct interface *const rifs = ifs->interf; abuf_appendf(abuf, "%s\t", ifs->name); if (!rifs) { abuf_puts(abuf, "DOWN\n"); continue; } abuf_appendf(abuf, "UP\t%d\t%s\t", rifs->int_mtu, rifs->is_wireless ? "Yes" : "No"); if (olsr_cnf->ip_version == AF_INET) { struct ipaddr_str addrbuf, maskbuf, bcastbuf; abuf_appendf(abuf, "%s\t%s\t%s\n", ip4_to_string(&addrbuf, rifs->int_addr.sin_addr), ip4_to_string(&maskbuf, rifs->int_netmask.sin_addr), ip4_to_string(&bcastbuf, rifs->int_broadaddr.sin_addr)); } else { struct ipaddr_str addrbuf, maskbuf; abuf_appendf(abuf, "%s\t\t%s\n", ip6_to_string(&addrbuf, &rifs->int6_addr.sin6_addr), ip6_to_string(&maskbuf, &rifs->int6_multaddr.sin6_addr)); } } abuf_puts(abuf, "\n"); } static void txtinfo_write_data(void *foo __attribute__ ((unused))) { fd_set set; int result, i, j, max; struct timeval tv; FD_ZERO(&set); max = 0; for (i=0; i max) { max = outbuffer_socket[i]; } } tv.tv_sec = 0; tv.tv_usec = 0; result = select(max + 1, NULL, &set, NULL, &tv); if (result <= 0) { return; } for (i=0; i 0) { outbuffer_written[i] += result; } if (result <= 0 || outbuffer_written[i] == outbuffer_size[i]) { /* close this socket and cleanup*/ close(outbuffer_socket[i]); free (outbuffer[i]); for (j=i+1; j --------------------------------------------------------------------- This plugin is used for detecting a total freeze of the olsrd by an external script. Once per timeinterval (configurable) it writes the current time into a file. --------------------------------------------------------------------- PLUGIN PARAMETERS (PlParam) --------------------------------------------------------------------- PlParam "file" "/tmp/olsrd.watchdog" Name of the "still alive" file written by the watchdog PlParam "interval" "5" Overwrite the file every X seconds --------------------------------------------------------------------- SAMPLE CONFIG --------------------------------------------------------------------- add in /etc/olsrd.conf: LoadPlugin "olsrd_watchdog.so.0.1" { PlParam "file" "/tmp/olsrd.watchdog" PlParam "interval" "5" } --------------------------------------------------------------------- EOF / 26.05.2005 olsrd-0.6.6.2/lib/watchdog/src/000077500000000000000000000000001234304727700161545ustar00rootroot00000000000000olsrd-0.6.6.2/lib/watchdog/src/olsrd_plugin.c000066400000000000000000000103041234304727700210170ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Example plugin for olsrd.org OLSR daemon * Only the bare minimum */ #include "olsrd_plugin.h" #include "plugin_util.h" #include "olsr.h" #include "defs.h" #include "scheduler.h" #include "olsr_cookie.h" #include #include #include #include #define PLUGIN_INTERFACE_VERSION 5 static struct olsr_cookie_info *watchdog_timer_cookie; static char watchdog_filename[FILENAME_MAX + 1] = "/tmp/olsr.watchdog"; static int watchdog_interval = 5; /** * Plugin interface version * Used by main olsrd to check plugin interface version */ int olsrd_plugin_interface_version(void) { return PLUGIN_INTERFACE_VERSION; } static int set_watchdog_file(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { strncpy(watchdog_filename, value, FILENAME_MAX); return 0; } static int set_watchdog_interval(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) { watchdog_interval = atoi(value); return 0; } /** * Register parameters from config file * Called for all plugin parameters */ static const struct olsrd_plugin_parameters plugin_parameters[] = { {.name = "file",.set_plugin_parameter = &set_watchdog_file,.data = NULL}, {.name = "interval",.set_plugin_parameter = &set_watchdog_interval,.data = NULL}, }; void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) { *params = plugin_parameters; *size = ARRAYSIZE(plugin_parameters); } static void olsr_watchdog_write_alivefile(void *foo __attribute__ ((unused))) { FILE *file = fopen(watchdog_filename, "w"); if (file == NULL) { OLSR_PRINTF(3, "Error, cannot write watchdog alivefile"); } else { fprintf(file, "%ld\n", (long)time(NULL)); fflush(file); fclose(file); } } /** * Initialize plugin * Called after all parameters are passed */ int olsrd_plugin_init(void) { /* create the cookie */ watchdog_timer_cookie = olsr_alloc_cookie("Watchdog: write alive-file", OLSR_COOKIE_TYPE_TIMER); /* Register the GW check */ olsr_start_timer(watchdog_interval * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, &olsr_watchdog_write_alivefile, NULL, watchdog_timer_cookie); return 1; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/watchdog/src/olsrd_plugin.h000066400000000000000000000046561234304727700210410ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Dynamic linked library for the olsr.org olsr daemon */ #ifndef _OLSRD_PLUGIN_WATCHDOG_H #define _OLSRD_PLUGIN_WATCHDOG_H /**************************************************************************** * Functions that the plugin MUST provide * ****************************************************************************/ /* Initialization function */ int olsrd_plugin_init(void); int olsrd_plugin_interface_version(void); #endif /* _OLSRD_PLUGIN_WATCHDOG_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/lib/watchdog/version-script.txt000066400000000000000000000002051234304727700211120ustar00rootroot00000000000000VERS_1.0 { global: olsrd_plugin_interface_version; olsrd_plugin_init; olsrd_get_plugin_parameters; local: *; }; olsrd-0.6.6.2/license.txt000066400000000000000000000033461234304727700152100ustar00rootroot00000000000000 The olsr.org Optimized Link-State Routing daemon(olsrd) Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) Thomas Lopatic(thomas@lopatic.de) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of olsr.org, olsrd nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Note: the nmealib library that is included in the PUD plugin directory is LGPL licensed (as explained in its LICENSE.TXT) olsrd-0.6.6.2/list-excludes.sh000066400000000000000000000003571234304727700161450ustar00rootroot00000000000000#!/bin/sh # # # LÖist the to be excluded files # find -name ".cvsignore" -print | while read f do d=${f%.cvsignore} d=${d#./} while read l do echo "$d$l" done < $f done echo 'CVS' echo '*~' echo '#*#' echo '.#*' echo '*.o' olsrd-0.6.6.2/make/000077500000000000000000000000001234304727700137345ustar00rootroot00000000000000olsrd-0.6.6.2/make/Makefile.android000066400000000000000000000076121234304727700170210ustar00rootroot00000000000000# # Steps to compile for Android: # # 1) Download and extract the Android NDK from # http://developer.android.com/sdk/ndk/index.html # (e.g. into to /opt, otherwise call 'make NDK_BASE=') # # 2) Compile olsrd with the make command: # make OS=android DEBUG=0 NDK_BASE=/opt/android-ndk-r8 # # 3) Install olsrd on your local PC, e.g. # sudo make OS=android DEBUG=0 install_all # which creates a /data directory on your PC. # # 4) Change /data/local/etc/olsrd.conf. You need # to adapt the 'Interfaces' line, e.g. to use # the eth0 on your android mobile. Also, the # LoadPlugin lines needs adaption, e.g. you # need "/data/local/lib/olsrd_txtinfo.so.0.1" # # 5) Copy all file from /data to your mobile, e.g. # by pushing the files with the 'adb' tool. # # # LINUX SPECIFIC CONFIGURATION # DESTDIR ?= prefix ?= sbindir ?= $(prefix)/bin etcdir ?= $(prefix)/etc libdir ?= $(prefix)/lib datarootdir ?= $(prefix)/usr/share # the rest are defined in Makefile.inc, but we don't need to override defaults SBINDIR = $(DESTDIR)$(sbindir) ETCDIR = $(DESTDIR)$(etcdir) LIBDIR = $(DESTDIR)$(libdir) SHAREDIR = $(DESTDIR)$(datarootdir) # there probably should be an Android log.c and misc.c to support # Logcat, but this works for now SRCS += $(wildcard src/unix/*.c src/linux/*.c) HDRS += $(wildcard src/unix/*.h src/linux/*.h) CPPFLAGS += -DOLSRD_GLOBAL_CONF_FILE=\"$(CFGFILE)\" # bionic libc: missing declarations CPPFLAGS += -DINET_ADDRSTRLEN=16 CPPFLAGS += -D'IPTOS_PREC(tos)=((tos)&0xe0)' CPPFLAGS += -D'IPTOS_TOS(tos)=((tos)&0x1e)' # Android NDK is missing some Linux headers and regex, we have them here: CPPFLAGS += -I$(TOPDIR)/android # Compilation flags from build/toolchains/arm-eabi-4.2.1/setup.mk # * removed -fstrict-aliasing since the code has a lot of type-punning CPPFLAGS += \ -march=armv5te -mtune=xscale \ -msoft-float -fpic \ -mthumb-interwork \ -ffunction-sections \ -funwind-tables \ -fstack-protector \ -fno-short-enums \ -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ \ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ ifeq ($(DEBUG),0) CPPFLAGS += \ -fomit-frame-pointer \ -funswitch-loops \ -finline-limit=300 else CPPFLAGS += \ -fno-omit-frame-pointer endif ifdef OLSRD_PLUGIN GENERATE_PIC = true endif LDFLAGS += -llog ifdef GENERATE_PIC CFLAGS += -fPIC LDFLAGS += -fPIC endif PLUGIN_SONAME ?= $(PLUGIN_NAME) PLUGIN_FULLNAME ?= $(PLUGIN_NAME).so.$(PLUGIN_VER) INSTALL_LIB = install -D -m 755 $(PLUGIN_FULLNAME) $(LIBDIR)/$(PLUGIN_FULLNAME); \ /sbin/ldconfig -n $(LIBDIR) UNINSTALL_LIB = rm -f $(LIBDIR)/$(PLUGIN_FULLNAME); \ /sbin/ldconfig -n $(LIBDIR) # Android NDK setup HOST = arm-linux-androideabi NDK_BASE ?= /opt/android-ndk NDK_PLATFORM_LEVEL ?= 4 NDK_ABI=arm NDK_SYSROOT=$(NDK_BASE)/platforms/android-$(NDK_PLATFORM_LEVEL)/arch-$(NDK_ABI) NDK_UNAME=$(shell uname -s | tr '[A-Z]' '[a-z]') # if you are using NDK older than r8, you must use 4.4.3: #NDK_COMPILER_VERSION=4.4.3 NDK_COMPILER_VERSION=4.6 NDK_TOOLCHAIN=$(NDK_BASE)/toolchains/$(NDK_ABI)-linux-androideabi-$(NDK_COMPILER_VERSION)/prebuilt/$(NDK_UNAME)-x86 CROSS_COMPILE = $(NDK_TOOLCHAIN)/bin/$(HOST)- CC = $(CROSS_COMPILE)gcc --sysroot="$(NDK_SYSROOT)" LD = $(CROSS_COMPILE)ld AR = $(CROSS_COMPILE)ar ifeq ($(DEBUG),0) STRIP = $(CROSS_COMPILE)strip endif # Android didn't add regex until android-8 so include this one REGEX_LIB = $(TOPDIR)/android/regex/libregex.a REGEX_CLEAN = regex_clean $(REGEX_LIB): $(MAKECMDPREFIX)$(MAKE) MAKECMDPREFIX="$(MAKECMDPREFIX)" -C $(TOPDIR)/android/regex/ REGEX_LIB=$(REGEX_LIB) VERBOSE=$(VERBOSE) \ NDK_TOOLCHAIN_BASE="$(NDK_TOOLCHAIN_BASE)" \ NDK_PLATFORM_VERSION="$(NDK_PLATFORM_VERSION)" \ NDK_SYSROOT="$(NDK_SYSROOT)" \ CROSS_COMPILE="$(CROSS_COMPILE)" \ CC="$(CC)" LD="$(LD)" AR="$(AR)" STRIP="$(STRIP)" \ CPPFLAGS="$(CPPFLAGS)" $(REGEX_CLEAN): $(MAKECMDPREFIX)$(MAKE) MAKECMDPREFIX="$(MAKECMDPREFIX)" -C $(TOPDIR)/android/regex/ clean REGEX_LIB=$(REGEX_LIB) # Local Variables: # mode: makefile # End: olsrd-0.6.6.2/make/Makefile.fbsd000066400000000000000000000016441234304727700163160ustar00rootroot00000000000000# # FREEBSD SPECIFIC CONFIGURATION # PREFIX ?= /usr/local SBINDIR = $(PREFIX)/sbin ETCDIR = $(PREFIX)/etc LIBDIR = $(PREFIX)/lib DOCDIR = $(PREFIX)/share/doc MANDIR = $(PREFIX)/man SRCS += $(wildcard src/bsd/*.c) $(wildcard src/unix/*.c) HDRS += $(wildcard src/bsd/*.h) $(wildcard src/unix/*.h) LIBS = CPPFLAGS += -DOLSRD_GLOBAL_CONF_FILE=\"$(CFGFILE)\" ifdef NO_80211 CPPFLAGS += -DFBSD_NO_80211=1 endif ifdef LIBNET CPPFLAGS += -DSPOOF -I$(PREFIX)/include LIBS += -L$(PREFIX)/lib -lnet endif ifdef OLSRD_PLUGIN CFLAGS += -fPIC LDFLAGS += -fPIC endif PLUGIN_SONAME ?= $(PLUGIN_NAME) PLUGIN_FULLNAME ?= $(PLUGIN_NAME).so.$(PLUGIN_VER) INSTALL_LIB = install -m 755 $(PLUGIN_FULLNAME) $(LIBDIR)/$(PLUGIN_FULLNAME); \ /sbin/ldconfig UNINSTALL_LIB = rm -f $(LIBDIR)/$(PLUGIN_FULLNAME); \ /sbin/ldconfig OS_LIB_PTHREAD = -pthread OS_CFLAG_PTHREAD = -pthread OS_LIB_DYNLOAD = # Local Variables: # mode: makefile # End: olsrd-0.6.6.2/make/Makefile.kfbsd000066400000000000000000000016121234304727700164640ustar00rootroot00000000000000# # FREEBSD SPECIFIC CONFIGURATION # PREFIX ?= /usr/local SRCS += $(wildcard src/bsd/*.c) $(wildcard src/unix/*.c) HDRS += $(wildcard src/bsd/*.h) $(wildcard src/unix/*.h) LIBS = CPPFLAGS += -DOLSRD_GLOBAL_CONF_FILE=\"$(CFGFILE)\" ifdef NO_80211 CPPFLAGS += -DFBSD_NO_80211=1 endif ifdef LIBNET CPPFLAGS += -DSPOOF -I$(PREFIX)/include LIBS += -L$(PREFIX)/lib -lnet endif ifdef OLSRD_PLUGIN GENERATE_PIC = true endif ifeq ($(filter-out alpha x86_64 parisc64 ia64, $(ARCH)),) GENERATE_PIC = true endif ifdef GENERATE_PIC CFLAGS += -fPIC LDFLAGS += -fPIC endif PLUGIN_SONAME ?= $(PLUGIN_NAME) PLUGIN_FULLNAME ?= $(PLUGIN_NAME).so.$(PLUGIN_VER) INSTALL_LIB = install -m 755 $(PLUGIN_FULLNAME) $(LIBDIR)/$(PLUGIN_FULLNAME); UNINSTALL_LIB = rm -f $(LIBDIR)/$(PLUGIN_FULLNAME); OS_LIB_PTHREAD = -pthread OS_CFLAG_PTHREAD = -pthread OS_LIB_DYNLOAD = -ldl # Local Variables: # mode: makefile # End: olsrd-0.6.6.2/make/Makefile.linux000066400000000000000000000027041234304727700165350ustar00rootroot00000000000000# # LINUX SPECIFIC CONFIGURATION # ARCH := $(shell uname -m) DESTDIR ?= prefix ?= /usr/local libdir ?= $(prefix)/lib datarootdir ?= $(prefix)/share mandir ?= $(datarootdir)/man sbindir ?= $(prefix)/sbin # the rest are defined in Makefile.inc, but we don't need to override defaults LIBDIR = $(DESTDIR)$(libdir) MANDIR = $(DESTDIR)$(mandir) SBINDIR = $(DESTDIR)$(sbindir) SHAREDIR = $(DESTDIR)$(datarootdir) SRCS += $(wildcard src/linux/*.c src/unix/*.c) HDRS += $(wildcard src/linux/*.h src/unix/*.h) CPPFLAGS += LIBS += # Enable the FLAGS and LIBS below for nl80211-support in the LQ plugin 'lq_plugin_ffeth_nl80211'. # By default this is not enabled and the plugin will not incorporate the nl80211 data. This avoids # breaking builds on Linux systems that do not support it. # CPPFLAGS += -Dlinux -DLINUX_NETLINK_ROUTING -DLINUX_NL80211 # LIBS += -lnl PLUGIN_SONAME ?= lib$(PLUGIN_NAME).so PLUGIN_FULLNAME ?= $(PLUGIN_NAME).so.$(PLUGIN_VER) INSTALL_LIB = install -D -m 755 $(PLUGIN_FULLNAME) $(LIBDIR)/$(PLUGIN_FULLNAME); \ /sbin/ldconfig -n $(LIBDIR) UNINSTALL_LIB = rm -f $(LIBDIR)/$(PLUGIN_FULLNAME); \ /sbin/ldconfig -n $(LIBDIR) ifdef OLSRD_PLUGIN GENERATE_PIC = true endif ifeq ($(filter-out mips mips64 alpha x86_64 parisc64 ia64, $(ARCH)),) GENERATE_PIC = true endif ifdef GENERATE_PIC CFLAGS += -fPIC LDFLAGS += -fPIC endif OS_LIB_PTHREAD = -lpthread OS_CFLAG_PTHREAD = -pthread OS_LIB_DYNLOAD = -ldl # Local Variables: # mode: makefile # End: olsrd-0.6.6.2/make/Makefile.nbsd000066400000000000000000000011471234304727700163240ustar00rootroot00000000000000# # NETBSD SPECIFIC CONFIGURATION # DESTDIR ?= LIBDIR = $(DESTDIR)/usr/lib SRCS += $(wildcard src/bsd/*.c src/unix/*.c) HDRS += $(wildcard src/bsd/*.h src/unix/*.h) CPPFLAGS += -D__NetBSD__ LIBS += PLUGIN_SONAME ?= $(PLUGIN_NAME) PLUGIN_FULLNAME ?= $(PLUGIN_NAME).so.$(PLUGIN_VER) INSTALL_LIB = install -m 755 $(PLUGIN_FULLNAME) $(LIBDIR)/$(PLUGIN_FULLNAME); \ /sbin/ldconfig UNINSTALL_LIB = rm -f $(LIBDIR)/$(PLUGIN_FULLNAME); \ /sbin/ldconfig ifdef OLSRD_PLUGIN CFLAGS += -fPIC LDFLAGS += -fPIC endif OS_LIB_PTHREAD = OS_CFLAG_PTHREAD = OS_LIB_DYNLOAD = # Local Variables: # mode: makefile # End: olsrd-0.6.6.2/make/Makefile.obsd000066400000000000000000000011501234304727700163170ustar00rootroot00000000000000# # OPENBSD SPECIFIC CONFIGURATION # DESTDIR ?= LIBDIR = $(DESTDIR)/usr/lib SRCS += $(wildcard src/bsd/*.c src/unix/*.c) HDRS += $(wildcard src/bsd/*.h src/unix/*.h) CPPFLAGS += -D__OpenBSD__ LIBS += PLUGIN_SONAME ?= $(PLUGIN_NAME) PLUGIN_FULLNAME ?= $(PLUGIN_NAME).so.$(PLUGIN_VER) INSTALL_LIB = install -m 755 $(PLUGIN_FULLNAME) $(LIBDIR)/$(PLUGIN_FULLNAME); \ /sbin/ldconfig UNINSTALL_LIB = rm -f $(LIBDIR)/$(PLUGIN_FULLNAME); \ /sbin/ldconfig ifdef OLSRD_PLUGIN CFLAGS += -fPIC LDFLAGS += -fPIC endif OS_LIB_PTHREAD = OS_CFLAG_PTHREAD = OS_LIB_DYNLOAD = # Local Variables: # mode: makefile # End: olsrd-0.6.6.2/make/Makefile.osx000066400000000000000000000013041234304727700162020ustar00rootroot00000000000000# # MAC OSX SPECIFIC CONFIGURATION # # don't strip executables and bundles for now until we figure out the proper way # to do it (flags). STRIP = \# DESTDIR ?= LIBDIR = $(DESTDIR)/usr/lib SRCS += $(wildcard src/bsd/*.c src/unix/*.c) HDRS += $(wildcard src/bsd/*.h src/unix/*.h) LIBS += PLUGIN_SONAME ?= $(PLUGIN_NAME) PLUGIN_FULLNAME ?= $(PLUGIN_NAME).so.$(PLUGIN_VER) INSTALL_LIB = install -m 755 $(PLUGIN_FULLNAME) $(LIBDIR)/$(PLUGIN_FULLNAME) UNINSTALL_LIB = rm -f $(LIBDIR)/$(PLUGIN_FULLNAME) ifdef OLSRD_PLUGIN LDFLAGS = -bundle -flat_namespace -undefined suppress else LDFLAGS = -dynamic endif OS_LIB_PTHREAD = OS_CFLAG_PTHREAD = OS_LIB_DYNLOAD = # Local Variables: # mode: makefile # End: olsrd-0.6.6.2/make/Makefile.win32000066400000000000000000000142741234304727700163450ustar00rootroot00000000000000# # WINDOWS32 SPECIFIC CONFIGURATION # DESTDIR ?= EXENAME = olsrd.exe SRCS += $(wildcard src/win32/*.c) HDRS += $(wildcard src/win32/*.h) CPPFLAGS += -D_WIN32_WINNT=0x0600 LIBS += -lws2_32 -liphlpapi CPPFLAGS += -I$(TOPDIR)/src/win32 PLUGIN_SONAME ?= $(PLUGIN_NAME) PLUGIN_FULLNAME ?= $(PLUGIN_NAME).dll INSTALL_LIB = mkdir -p $(LIBDIR);cp $(PLUGIN_FULLNAME) $(LIBDIR)/$(PLUGIN_FULLNAME) UNINSTALL_LIB = del /F $(LIBDIR)/$(PLUGIN_FULLNAME) ifdef OLSRD_PLUGIN LDFLAGS += -L$(TOPDIR) #LIBS += $(TOPDIR)/src/win32/compat.o LIBS += -lolsrd endif OS_LIB_PTHREAD = OS_CFLAG_PTHREAD = OS_LIB_DYNLOAD = # Notes for compiling olsrd.exe under Windows using MinGW # ---------------------------------------------------- # You can build olsrd.exe using MinGW on either Windows or GNU/Linux. # For MinGW on Windows, run this in the msys shell: # # cd olsrd # make clean_all # make build_all OS=win32 # # MinGW also runs on GNU/Linux so you can build Windows binaries on # any GNU/Linux machine. It is especially easy on a # Debian/Ubuntu/Mint system: # # sudo apt-get install mingw32 flex bison make # cd olsrd # make clean_all # CC=i586-mingw32msvc-gcc make build_all OS=win32 # Notes for compiling olsrd.exe under Windows using Cygwin # ---------------------------------------------------- # You need at least Cygwin installed. Start the Cygwin setup and select # flex,bison,make,mingw-core. Then run "make all libs" to compile olsrd.exe # and the plugin DLLs. To compile the GUI, you need MSVC6, PlatformSDK and # the NSIS installer. Adapt the path names below and run "make win32setup". # Alternatively, set environment vars e.g. in the Windows registry under # HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment e.g. # # set PATH=C:\PROGRA~1\MICROS~4\VC98\BIN;C:\PROGRA~1\MIFD68~1\BIN;C:\PROGRA~1\NSIS;%PATH% # set LIB=C:\PROGRA~1\MIFD68~1\LIB;C:\PROGRA~1\MICROS~4\VC98\LIB;C:\PROGRA~1\MICROS~4\VC98\MFC\LIB # set INCLUDE=C:\PROGRA~1\MIFD68~1\INCLUDE;C:\PROGRA~1\MICROS~4\VC98\INCLUDE;C:\PROGRA~1\MICROS~4\VC98\MFC\INCLUDE # # You can install Cygwin under Wine. Then "wineconsole make all libs win32lib" # does it's job (slowly), but there may be issues while re-invoking MSVC from # bash.exe during "wineconsole win32setup". Note, that Wine on EXT2/EXT3 prevents # the Cygwin "!" files from working somehow. You may need to install Cygwin # under Windows to get a correct gcc/mingw setup, then copy to your Linux # box, then replace all "!" files by real symlinks, e.g. # # cd ~/.wine/drive_c/Programme/cygwin # for src in $(grep '!' . -rl 2>&-);do # if [ $(stat -c "%s" $src) -lt 100 ];then # dst=$(sed -e's/^\!//' $src) # echo "ln -sf $dst $src" # fi # done # # Required software versions: # MSVC6 GUI (with MFC!) runs under Wine (copy MFC42.DLL & MSVCP60.DLL) # Platform SDK, search for "February 2003 SDK" # Cygwin 1.5.x and Wine-1.1.0 or above PROGDIR = c:/Programme PROGCYG = /cygdrive/c/Programme PSDKDIR = $(PROGDIR)/Microsoft SDK PSDKCYG = $(PROGCYG)/Microsoft\ SDK MSVCDIR = $(PROGDIR)/Microsoft Visual Studio MSVCCYG = $(PROGCYG)/Microsoft\ Visual\ Studio NSISDIR = $(PROGDIR)/NSIS NSISCYG = $(PROGCYG)/NSIS # Necessary for running cygwin under wine. Both the "-C" option and MAKELEVEL>0 will oops... MAKE := sh -c 'cmd=$$0;while [ 0 -lt $$\# ];do case $$1 in -C) cmd="cd $$2 && $$cmd";shift 2;; *) cmd="$$cmd \"$$1\"";shift;;esac;done;sh -c "export MAKELEVEL=0 && $$cmd"' $(MAKE) gui/win32/Shim/Release/shim.obj: gui/win32/Shim/shim.c test -d $(dir $@) || mkdir -p $(dir $@) PATH=$(MSVCCYG)/VC98/Bin:$$PATH && CL.EXE \ /I"$(PSDKDIR)/Include" /I"$(MSVCDIR)/VC98/Include" \ /nologo /ML /W3 /GX /O2 /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" \ /Fp"$(dir $@)/Shim.pch" /YX /Fo"$(dir $@)/" /Fd"$(dir $@)/" /FD /c "$<" gui/win32/Shim/Release/Shim.exe: gui/win32/Shim/Release/shim.obj PATH=$(MSVCCYG)/VC98/Bin:$$PATH && LINK.EXE \ /LIBPATH:"$(PSDKDIR)/Lib" /LIBPATH:"$(MSVCDIR)/VC98/Lib" \ kernel32.lib user32.lib \ /nologo /subsystem:console /incremental:no /machine:I386 /out:"$@" "$^" WIN32FILES+=Frontend WIN32FILES+=FrontendDlg WIN32FILES+=HnaEntry WIN32FILES+=MidEntry WIN32FILES+=MprEntry WIN32FILES+=MyDialog1 WIN32FILES+=MyDialog2 WIN32FILES+=MyDialog3 WIN32FILES+=MyDialog4 WIN32FILES+=MyEdit WIN32FILES+=MyTabCtrl WIN32FILES+=NodeEntry WIN32FILES+=StdAfx WIN32FILES+=TrayIcon WIN32CPPFILES=$(addprefix gui/win32/Main/, $(addsuffix .cpp, $(WIN32FILES))) WIN32OBJFILES=$(addprefix gui/win32/Main/Release/, $(addsuffix .obj, $(WIN32FILES))) gui/win32/Main/Release/Frontend.res: gui/win32/Main/Frontend.rc test -d $(dir $@) || mkdir -p $(dir $@) PATH=$(PSDKCYG)/Bin:$(MSVCCYG)/Common/MSDev98/Bin:$$PATH && RC.EXE \ /l 0x407 /i"$(PSDKDIR)/Include" /i"$(MSVCDIR)/VC98/MFC/Include" /fo"$@" /d NDEBUG "$<" gui/win32/Main/Release/Switch.exe: gui/win32/Main/olsrd_cfgparser.lib gui/win32/Main/Release/Frontend.res $(WIN32CPPFILES) test -d $(dir $@) || mkdir -p $(dir $@) PATH=$(MSVCCYG)/VC98/Bin:$$PATH && CL.EXE \ /I"$(PSDKDIR)/Include" /I"$(MSVCDIR)/VC98/Include" /I"$(MSVCDIR)/VC98/MFC/Include" /I"src" \ /nologo /MT /W4 /GX /O2 /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" \ /Fp"$(dir $@)/Frontend.pch" /YX"stdafx.h" /Fo"$(dir $@)/" /Fd"$(dir $@)/" /FD /c \ $(WIN32CPPFILES) PATH=$(MSVCCYG)/VC98/Bin:$$PATH && LINK.EXE \ /LIBPATH:"$(PSDKDIR)/Lib" /LIBPATH:"$(MSVCDIR)/VC98/Lib" /LIBPATH:"$(MSVCDIR)/VC98/MFC/Lib" \ ws2_32.lib iphlpapi.lib \ gui/win32/Main/olsrd_cfgparser.lib gui/win32/Main/Release/Frontend.res \ /nologo /subsystem:windows /incremental:no /machine:I386 /out:"$@" \ $(WIN32OBJFILES) win32setup: gui/win32/Inst/installer.nsi default_target libs gui/win32/Shim/Release/Shim.exe gui/win32/Main/Release/Switch.exe PATH=$(NSISCYG):$$PATH && makensis.exe $< win32lib: gui/win32/Main/olsrd_cfgparser.lib gui/win32/Main/olsrd_cfgparser.lib: cfgparser @# Using the cygwin dlltool does not work (missing functions hooks) @# dlltool --input-def src/cfgparser/olsrd_cfgparser.def --dllname src/cfgparser/olsrd_cfgparser.dll --output-lib $@ @# Use the Microsoft Lib Tool instead PATH=$(MSVCCYG)/VC98/Bin:$$PATH && LIB.EXE \ /machine:i386 /def:src/cfgparser/olsrd_cfgparser.def /out:gui/win32/Main/olsrd_cfgparser.lib # Local Variables: # mode: makefile # End: olsrd-0.6.6.2/make/Makefile.wince000066400000000000000000000006251234304727700165030ustar00rootroot00000000000000# # WINDOWS CE SPECIFIC CONFIGURATION # DESTDIR ?= LIBDIR = $(DESTDIR)/usr/lib SRCS += $(wildcard src/win32/*.c) HDRS += $(wildcard src/win32/*.h) CPPFLAGS += -DWIN32 -DWINCE LIBS += -lwinsock -liphlpapi CPPFLAGS += -Isrc/win32 -Isrc/win32/ce ifdef OLSRD_PLUGIN CFLAGS += LDFLAGS += -lolsrd endif OS_LIB_PTHREAD = OS_CFLAG_PTHREAD = OS_LIB_DYNLOAD = # Local Variables: # mode: makefile # End: olsrd-0.6.6.2/make/guess_os.sh000077500000000000000000000006761234304727700161330ustar00rootroot00000000000000#!/bin/sh if test -n "$OS"; then echo $OS; exit; else # OS not specified. # get it from uname arch=`uname -s | tr '[A-Z]' '[a-z]'` case "$arch" in linux) arch=linux ;; freebsd*) arch=fbsd ;; gnu/kfreebsd*) arch=kfbsd ;; netbsd*) arch=nbsd ;; openbsd*) arch=obsd ;; darwin*) arch=osx ;; cygwin_*) arch=win32 ;; Windows_*) arch=win32 ;; *) arch="UNKNOWN" ;; esac echo $arch fi olsrd-0.6.6.2/make/hash_source.sh000077500000000000000000000004551234304727700166020ustar00rootroot00000000000000#!/bin/sh sha="`git log -1 --pretty=%h 2> /dev/null`" if [ -z "$sha" ]; then sha="0000000" fi echo -n "-git_$sha" md5cmd=md5sum os=$(uname) if [ "xDarwin" = "x$os" ] ; then md5cmd=md5 fi echo -n "-hash_" cat `find . -name *.[ch] | grep -v -E '[/\\]?builddata.c$'`| $md5cmd | awk '{ print $1; }' olsrd-0.6.6.2/make/makewine.cmd000066400000000000000000000045721234304727700162310ustar00rootroot00000000000000rem @echo off REM "make win32setup" does not work under Wine+Cygwin REM Compile with this: "wine cmd /c make/makewine.cmd" SET PRGS=C:\Programme SET PSDK=%PRGS%\Microsoft SDK SET MSVC=%PRGS%\Microsoft Visual Studio SET PATH=%MSVC%\VC98\BIN;%PSDK%\BIN;%PRGS%\NSIS;%PATH% SET LIB=%PSDK%\LIB;%MSVC%\VC98\LIB;%MSVC%\VC98\MFC\LIB SET INCLUDE=%PSDK%\INCLUDE;%MSVC%\VC98\INCLUDE;%MSVC%\VC98\MFC\INCLUDE IF NOT EXIST gui\win32\Shim\Release\*.* MKDIR gui\win32\Shim\Release CL.EXE /nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"gui\win32\Shim\Release\Shim.pch" /YX /Fo"gui\win32\Shim\Release\\" /Fd"gui\win32\Shim\Release\\" /FD /c "gui\win32\Shim\shim.c" LINK.EXE kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /machine:I386 /out:"gui\win32\Shim\Release\Shim.exe" "gui\win32\Shim\Release\shim.obj" IF NOT EXIST gui\win32\Main\Release\*.* MKDIR gui\win32\Main\Release RC.EXE /l 0x407 /fo"gui\win32\Main\Release\Frontend.res" /d NDEBUG "gui\win32\Main\Frontend.rc" CL.EXE /I"src" /nologo /MT /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"gui\win32\Main\Release\Frontend.pch" /YX"stdafx.h" /Fo"gui\win32\Main\Release\\" /Fd"gui\win32\Main\Release\\" /FD /c "gui\win32\Main\Frontend.cpp" "gui\win32\Main\FrontendDlg.cpp" "gui\win32\Main\HnaEntry.cpp" "gui\win32\Main\MidEntry.cpp" "gui\win32\Main\MprEntry.cpp" "gui\win32\Main\MyDialog1.cpp" "gui\win32\Main\MyDialog2.cpp" "gui\win32\Main\MyDialog3.cpp" "gui\win32\Main\MyDialog4.cpp" "gui\win32\Main\MyEdit.cpp" "gui\win32\Main\MyTabCtrl.cpp" "gui\win32\Main\NodeEntry.cpp" "gui\win32\Main\StdAfx.cpp" "gui\win32\Main\TrayIcon.cpp" LINK.EXE ws2_32.lib iphlpapi.lib gui/win32/Main/olsrd_cfgparser.lib gui/win32/Main/Release/Frontend.res /nologo /subsystem:windows /incremental:no /machine:I386 /out:"gui\win32\Main\Release\Switch.exe" "gui\win32\Main\Release\Frontend.obj" "gui\win32\Main\Release\FrontendDlg.obj" "gui\win32\Main\Release\HnaEntry.obj" "gui\win32\Main\Release\MidEntry.obj" "gui\win32\Main\Release\MprEntry.obj" "gui\win32\Main\Release\MyDialog1.obj" "gui\win32\Main\Release\MyDialog2.obj" "gui\win32\Main\Release\MyDialog3.obj" "gui\win32\Main\Release\MyDialog4.obj" "gui\win32\Main\Release\MyEdit.obj" "gui\win32\Main\Release\MyTabCtrl.obj" "gui\win32\Main\Release\NodeEntry.obj" "gui\win32\Main\Release\StdAfx.obj" "gui\win32\Main\Release\TrayIcon.obj" MAKENSIS.EXE gui\win32\Inst\installer.nsi olsrd-0.6.6.2/openwrt/000077500000000000000000000000001234304727700145155ustar00rootroot00000000000000olsrd-0.6.6.2/openwrt/README000066400000000000000000000006251234304727700154000ustar00rootroot00000000000000This is an OpenWrt package feed containing the olsrd-stable-git package. To use this package, add the following line to the feeds.conf in the OpenWrt buildroot: src-git olsrd http://olsr.org/git/olsrd.git;stable Update the feed: ./scripts/feeds update olsrd Activate the package: ./scripts/feeds install olsrd-stable-git The "olsrd-stable-git" package should now appear in menuconfig. olsrd-0.6.6.2/openwrt/olsrd-stable-git/000077500000000000000000000000001234304727700176715ustar00rootroot00000000000000olsrd-0.6.6.2/openwrt/olsrd-stable-git/Makefile000066400000000000000000000151561234304727700213410ustar00rootroot00000000000000# # Copyright (C) 2009-2010 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # include $(TOPDIR)/rules.mk PKG_NAME:=olsrd-stable-git PKG_VERSION:=$(shell date +%Y%m%d)+$(shell git --git-dir=$(CURDIR)/../../.git log -1 --pretty=%h) PKG_RELEASE:=1 PKG_BUILD_PARALLEL:=1 PKG_INSTALL:=1 include $(INCLUDE_DIR)/package.mk TARGET_CFLAGS += $(FPIC) define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) $(CURDIR)/../../* $(PKG_BUILD_DIR)/ endef define Package/olsrd-stable-git/template SECTION:=net CATEGORY:=Network MAINTAINER:=OLSR Development Team TITLE:=OLSR (Optimized Link State Routing) daemon - Stable Branch URL:=http://www.olsr.org/ endef define Package/olsrd-stable-git $(call Package/olsrd-stable-git/template) MENU:=1 DEPENDS:=+libpthread endef define Package/olsrd-stable-git/conffiles /etc/config/olsrd endef define Package/olsrd-stable-git-mod-arprefresh $(call Package/olsrd-stable-git/template) DEPENDS:=olsrd-stable-git TITLE:=Kernel ARP cache refresh plugin endef define Package/olsrd-stable-git-mod-dot-draw $(call Package/olsrd-stable-git/template) DEPENDS:=olsrd-stable-git TITLE:=Dot topology information plugin endef define Package/olsrd-stable-git-mod-bmf $(call Package/olsrd-stable-git/template) DEPENDS:=olsrd-stable-git +kmod-tun TITLE:=Basic multicast forwarding plugin endef define Package/olsrd-stable-git-mod-dyn-gw $(call Package/olsrd-stable-git/template) DEPENDS:=olsrd-stable-git TITLE:=Dynamic internet gateway plugin endef define Package/olsrd-stable-git-mod-dyn-gw-plain $(call Package/olsrd-stable-git/template) DEPENDS:=olsrd-stable-git TITLE:=Dynamic internet gateway plain plugin endef define Package/olsrd-stable-git-mod-httpinfo $(call Package/olsrd-stable-git/template) DEPENDS:=olsrd-stable-git TITLE:=Small informative web server plugin endef define Package/olsrd-stable-git-mod-mdns $(call Package/olsrd-stable-git/template) DEPENDS:=olsrd-stable-git TITLE:=Multicast DNS plugin endef define Package/olsrd-stable-git-mod-nameservice $(call Package/olsrd-stable-git/template) DEPENDS:=olsrd-stable-git TITLE:=Lightweight hostname resolver plugin endef define Package/olsrd-stable-git-mod-p2pd $(call Package/olsrd-stable-git/template) DEPENDS:=olsrd-stable-git TITLE:=Peer to Peer Discovery plugin endef define Package/olsrd-stable-git-mod-quagga $(call Package/olsrd-stable-git/template) DEPENDS:=olsrd-stable-git TITLE:=Quagga plugin endef define Package/olsrd-stable-git-mod-secure $(call Package/olsrd-stable-git/template) DEPENDS:=olsrd-stable-git TITLE:=Message signing plugin to secure routing domain endef define Package/olsrd-stable-git-mod-txtinfo $(call Package/olsrd-stable-git/template) DEPENDS:=olsrd-stable-git TITLE:=Small informative web server plugin endef define Package/olsrd-stable-git-mod-watchdog $(call Package/olsrd-stable-git/template) DEPENDS:=olsrd-stable-git TITLE:=Watchdog plugin endef define Package/olsrd-stable-git-mod-secure/conffiles /etc/olsrd.d/olsrd_secure_key endef MAKE_FLAGS+= \ NO_DEBUG_MESSAGES=1 \ OS="linux" \ DESTDIR="$(PKG_INSTALL_DIR)" \ STRIP="true" \ INSTALL_LIB="true" \ SUBDIRS="arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo mdns nameservice quagga secure txtinfo watchdog" define Build/Compile $(call Build/Compile/Default,all) $(call Build/Compile/Default,libs) endef define Build/Install $(call Build/Install/Default,install) $(call Build/Install/Default,install_libs) endef define Package/olsrd-stable-git/install $(INSTALL_DIR) $(1)/etc/config $(INSTALL_DATA) ./files/olsrd.config $(1)/etc/config/olsrd $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_BUILD_DIR)/olsrd $(1)/usr/sbin/ $(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_BIN) ./files/olsrd.init $(1)/etc/init.d/olsrd endef define Package/olsrd-stable-git-mod-arprefresh/install $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/arprefresh/olsrd_arprefresh.so.* $(1)/usr/lib/ endef define Package/olsrd-stable-git-mod-dot-draw/install $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/dot_draw/olsrd_dot_draw.so.* $(1)/usr/lib/ endef define Package/olsrd-stable-git-mod-bmf/install $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmf/olsrd_bmf.so.* $(1)/usr/lib/ endef define Package/olsrd-stable-git-mod-dyn-gw/install $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/dyn_gw/olsrd_dyn_gw.so.* $(1)/usr/lib/ endef define Package/olsrd-stable-git-mod-dyn-gw-plain/install $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/dyn_gw_plain/olsrd_dyn_gw_plain.so.* $(1)/usr/lib/ endef define Package/olsrd-stable-git-mod-httpinfo/install $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/httpinfo/olsrd_httpinfo.so.* $(1)/usr/lib/ endef define Package/olsrd-stable-git-mod-mdns/install $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/mdns/olsrd_mdns.so.* $(1)/usr/lib/ endef define Package/olsrd-stable-git-mod-nameservice/install $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/nameservice/olsrd_nameservice.so.* $(1)/usr/lib/ endef define Package/olsrd-stable-git-mod-quagga/install $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/quagga/olsrd_quagga.so.* $(1)/usr/lib/ endef define Package/olsrd-stable-git-mod-secure/install $(INSTALL_DIR) $(1)/etc/olsrd.d $(CP) ./files/olsrd_secure_key $(1)/etc/olsrd.d/ $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/secure/olsrd_secure.so.* $(1)/usr/lib/ endef define Package/olsrd-stable-git-mod-txtinfo/install $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/txtinfo/olsrd_txtinfo.so.* $(1)/usr/lib/ endef define Package/olsrd-stable-git-mod-watchdog/install $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/watchdog/olsrd_watchdog.so.* $(1)/usr/lib/ endef $(eval $(call BuildPackage,olsrd-stable-git)) $(eval $(call BuildPackage,olsrd-stable-git-mod-arprefresh)) $(eval $(call BuildPackage,olsrd-stable-git-mod-dot-draw)) $(eval $(call BuildPackage,olsrd-stable-git-mod-bmf)) $(eval $(call BuildPackage,olsrd-stable-git-mod-dyn-gw)) $(eval $(call BuildPackage,olsrd-stable-git-mod-dyn-gw-plain)) $(eval $(call BuildPackage,olsrd-stable-git-mod-httpinfo)) $(eval $(call BuildPackage,olsrd-stable-git-mod-mdns)) $(eval $(call BuildPackage,olsrd-stable-git-mod-nameservice)) $(eval $(call BuildPackage,olsrd-stable-git-mod-quagga)) $(eval $(call BuildPackage,olsrd-stable-git-mod-secure)) $(eval $(call BuildPackage,olsrd-stable-git-mod-txtinfo)) $(eval $(call BuildPackage,olsrd-stable-git-mod-watchdog)) olsrd-0.6.6.2/openwrt/olsrd-stable-git/files/000077500000000000000000000000001234304727700207735ustar00rootroot00000000000000olsrd-0.6.6.2/openwrt/olsrd-stable-git/files/olsrd.config000066400000000000000000000010531234304727700233040ustar00rootroot00000000000000config olsrd # uncomment the following line to use a custom config file instead: #option config_file '/etc/olsrd.conf' option IpVersion '4' config LoadPlugin option library 'olsrd_arprefresh.so.0.1' config LoadPlugin option library 'olsrd_dyn_gw.so.0.5' config LoadPlugin option library 'olsrd_httpinfo.so.0.1' option port '1978' list Net '0.0.0.0 0.0.0.0' config LoadPlugin option library 'olsrd_nameservice.so.0.3' config LoadPlugin option library 'olsrd_txtinfo.so.0.1' option accept '0.0.0.0' config Interface list interface 'wlan' olsrd-0.6.6.2/openwrt/olsrd-stable-git/files/olsrd.init000066400000000000000000000341711234304727700230110ustar00rootroot00000000000000#!/bin/sh /etc/rc.common # Copyright (C) 2008 Alina Friedrichsen # Special thanks to bittorf wireless )) START=65 OLSRD_OLSRD_SCHEMA='ignore:internal config_file:internal DebugLevel=0 AllowNoInt=yes' OLSRD_IPCCONNECT_SCHEMA='ignore:internal Host:list Net:list2' OLSRD_LOADPLUGIN_SCHEMA='ignore:internal library:internal Host4:list Net4:list2 Host:list Net:list2 Host6:list Net6:list2 Ping:list redistribute:list NonOlsrIf:list name:list lat lon latlon_infile HNA:list2 hosts:list2' OLSRD_INTERFACE_SCHEMA='ignore:internal interface:internal AutoDetectChanges:bool' OLSRD_INTERFACE_DEFAULTS_SCHEMA='AutoDetectChanges:bool' T=' ' N=' ' validate_varname() { local varname="$1" [ -z "$varname" -o "$varname" != "${varname%%[!A-Za-z0-9_]*}" ] && return 1 return 0 } validate_ifname() { local ifname="$1" [ -z "$ifname" -o "$ifname" != "${ifname%%[!A-Za-z0-9.:_-]*}" ] && return 1 return 0 } validate_olsrd_option() { local str="$1" [ -z "$str" -o "$str" != "${str%%[! 0-9A-Za-z./|:_-]*}" ] && return 1 return 0 } get_ifname() { IFNAME= local interface="$1" validate_varname "$interface" || return 1 local ifname config_get ifname "$interface" ifname validate_ifname "$ifname" || return 1 IFNAME="$ifname" return 0 } system_config() { local cfg="$1" local cfgt local hostname local latlon config_get cfgt "$cfg" TYPE if [ "$cfgt" = "system" ]; then config_get hostname "$cfg" hostname hostname="${hostname:-OpenWrt}" SYSTEM_HOSTNAME="$hostname" fi if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then config_get latlon "$cfg" latlon IFS=" ${T}${N}," set -- $latlon unset IFS SYSTEM_LAT="$1" SYSTEM_LON="$2" fi if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then config_get latlon "$cfg" latitude SYSTEM_LAT="$latlon" config_get latlon "$cfg" longitude SYSTEM_LON="$latlon" fi } olsrd_find_config_file() { local cfg="$1" validate_varname "$cfg" || return 0 config_get_bool ignore "$cfg" ignore 0 [ "$ignore" -ne 0 ] && return 0 config_get OLSRD_CONFIG_FILE "$cfg" config_file return 0 } warning_invalid_value() { local package="$1" validate_varname "$package" || package= local config="$2" validate_varname "$config" || config= local option="$3" validate_varname "$option" || option= echo -n "Warning: Invalid value" 1>&2 if [ -n "$package" -a -n "$config" ]; then echo -n " in option '$package.$config${option:+.}$option'" 1>&2 fi echo ", skipped" 1>&2 return 0 } olsrd_write_option() { local param="$1" local cfg="$2" validate_varname "$cfg" || return 1 local option="$3" validate_varname "$option" || return 1 local value="$4" local option_type="$5" if [ "$option_type" = bool ]; then case "$value" in 1|on|true|enabled|yes) value=yes;; 0|off|false|disabled|no) value=no;; *) warning_invalid_value olsrd "$cfg" "$option"; return 1;; esac fi if ! validate_olsrd_option "$value"; then warning_invalid_value olsrd "$cfg" "$option" return 1 fi if [ "$value" != "${value%%[G-Zg-z_-]*}" ]; then if [ "$option" != "Ip6AddrType" -a "$option" != "LinkQualityMult" -a "$value" != "yes" -a "$value" != "no" ]; then value="\"$value\"" fi fi echo -n "${N}$param$option $value" return 0 } olsrd_write_plparam() { local param="$1" local cfg="$2" validate_varname "$cfg" || return 1 local option="$3" validate_varname "$option" || return 1 local value="$4" local option_type="$5" local _option if [ "$option_type" = bool ]; then case "$value" in 1|on|true|enabled|yes) value=yes;; 0|off|false|disabled|no) value=no;; *) warning_invalid_value olsrd "$cfg" "$option"; return 1;; esac fi if ! validate_olsrd_option "$value"; then warning_invalid_value olsrd "$cfg" "$option" return 1 fi IFS='-_' set -- $option option="$*" unset IFS _option="$option" if [ "$option" = 'hosts' ]; then set -- $value option="$1" shift value="$*" fi if [ "$option" = 'NonOlsrIf' ]; then if validate_varname "$value"; then if get_ifname "$value"; then ifname="$IFNAME" echo "Info: mdns Interface '$value' ifname '$ifname' found" 1>&2 else echo "Warning: mdns Interface '$value' not found, skipped" 1>&2 fi else warning_invalid_value olsrd "$cfg" "NonOlsrIf" fi [ -z "$ifname" ] || value=$ifname fi echo -n "${N}${param}PlParam \"$option\" \"$value\"" return 0 } config_update_schema() { unset IFS local schema_varname="$1" validate_varname "$schema_varname" || return 1 local command="$2" validate_varname "$command" || return 1 local option="$3" validate_varname "$option" || return 1 local value="$4" local schema local cur_option case "$varname" in *_LENGTH) return 0;; *_ITEM*) return 0;; esac eval "export -n -- \"schema=\${$schema_varname}\"" for cur_option in $schema; do [ "${cur_option%%[:=]*}" = "$option" ] && return 0 done if [ "$command" = list ]; then set -- $value if [ "$#" -ge "3" ]; then schema_entry="$option:list3" elif [ "$#" -ge "2" ]; then schema_entry="$option:list2" else schema_entry="$option:list" fi else schema_entry="$option" fi append "$schema_varname" "$schema_entry" return 0 } config_write_options() { unset IFS local schema="$1" local cfg="$2" validate_varname "$cfg" || return 1 local write_func="$3" [ -z "$write_func" ] && output_func=echo local write_param="$4" local schema_entry local option local option_length local option_type local default local value local list_size local list_item local list_value local i local position for schema_entry in $schema; do default="${schema_entry#*[=]}" [ "$default" = "$schema_entry" ] && default= option="${schema_entry%%[=]*}" IFS=':' set -- $option unset IFS option="$1" option_type="$2" validate_varname "$option" || continue [ -z "$option_type" ] || validate_varname "$option_type" || continue [ "$option_type" = internal ] && continue config_get value "$cfg" "$option" if [ -z "$value" ]; then IFS='+' set -- $default unset IFS value=$* elif [ "$value" = '-' -a -n "$default" ]; then continue fi [ -z "$value" ] && continue case "$option_type" in list) list_size=1;; list2) list_size=2;; list3) list_size=3;; *) list_size=0;; esac if [ "$list_size" -gt 0 ]; then config_get option_length "$cfg" "${option}_LENGTH" if [ -n "$option_length" ]; then i=1 while [ "$i" -le "$option_length" ]; do config_get list_value "$cfg" "${option}_ITEM$i" "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break i=$((i + 1)) done else list_value= i=0 for list_item in $value; do append "list_value" "$list_item" i=$((i + 1)) position=$((i % list_size)) if [ "$position" -eq 0 ]; then "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break list_value= fi done [ "$position" -ne 0 ] && "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" fi else "$write_func" "$write_param" "$cfg" "$option" "$value" "$option_type" fi done return 0 } olsrd_write_olsrd() { local cfg="$1" validate_varname "$cfg" || return 0 local ignore local ipversion config_get_bool ignore "$cfg" ignore 0 [ "$ignore" -ne 0 ] && return 0 [ "$OLSRD_COUNT" -gt 0 ] && return 0 config_get ipversion "$cfg" IpVersion if [ "$ipversion" = "6and4" ]; then OLSRD_IPVERSION_6AND4=1 config_set "$cfg" IpVersion '6' fi config_write_options "$OLSRD_OLSRD_SCHEMA" "$cfg" olsrd_write_option echo OLSRD_COUNT=$((OLSRD_COUNT + 1)) return 0 } olsrd_write_ipcconnect() { local cfg="$1" validate_varname "$cfg" || return 0 local ignore config_get_bool ignore "$cfg" ignore 0 [ "$ignore" -ne 0 ] && return 0 [ "$IPCCONNECT_COUNT" -gt 0 ] && return 0 echo -n "${N}IpcConnect${N}{" config_write_options "$OLSRD_IPCCONNECT_SCHEMA" "$cfg" olsrd_write_option "${T}" echo "${N}}" IPCCONNECT_COUNT=$((IPCCONNECT_COUNT + 1)) return 0 } olsrd_write_hna4() { local cfg="$1" validate_varname "$cfg" || return 0 local ignore config_get_bool ignore "$cfg" ignore 0 [ "$ignore" -ne 0 ] && return 0 config_get netaddr "$cfg" netaddr if ! validate_olsrd_option "$netaddr"; then warning_invalid_value olsrd "$cfg" "netaddr" return 0 fi config_get netmask "$cfg" netmask if ! validate_olsrd_option "$netmask"; then warning_invalid_value olsrd "$cfg" "netmask" return 0 fi [ "$HNA4_COUNT" -le 0 ] && echo -n "${N}Hna4${N}{" echo -n "${N}${T}${T}$netaddr $netmask" HNA4_COUNT=$((HNA4_COUNT + 1)) return 0 } olsrd_write_hna6() { local cfg="$1" validate_varname "$cfg" || return 0 local ignore config_get_bool ignore "$cfg" ignore 0 [ "$ignore" -ne 0 ] && return 0 config_get netaddr "$cfg" netaddr if ! validate_olsrd_option "$netaddr"; then warning_invalid_value olsrd "$cfg" "netaddr" return 0 fi config_get prefix "$cfg" prefix if ! validate_olsrd_option "$prefix"; then warning_invalid_value olsrd "$cfg" "prefix" return 0 fi [ "$HNA6_COUNT" -le 0 ] && echo -n "${N}Hna6${N}{" echo -n "${N}${T}${T}$netaddr $prefix" HNA6_COUNT=$((HNA6_COUNT + 1)) return 0 } olsrd_write_loadplugin() { local cfg="$1" validate_varname "$cfg" || return 0 local ignore local name local suffix local lat local lon local latlon_infile config_get_bool ignore "$cfg" ignore 0 [ "$ignore" -ne 0 ] && return 0 config_get library "$cfg" library if ! validate_olsrd_option "$library"; then warning_invalid_value olsrd "$cfg" "library" return 0 fi if ! [ -x "/lib/$library" -o -x "/usr/lib/$library" -o -x "/usr/local/lib/$library" ]; then echo "Warning: Plugin library '$library' not found, skipped" 1>&2 return 0 fi case "$library" in olsrd_nameservice.*) config_get name "$cfg" name [ -z "$name" ] && config_set "$cfg" name $SYSTEM_HOSTNAME config_get suffix "$cfg" suffix [ -z "$suffix" ] && config_set "$cfg" suffix '.olsr' config_get lat "$cfg" lat config_get lon "$cfg" lon config_get latlon_infile "$cfg" latlon_infile if [ \( -z "$lat" -o -z "$lat" \) -a -z "$latlon_infile" ]; then if [ -f '/var/run/latlon.txt' ]; then config_set "$cfg" lat '' config_set "$cfg" lon '' config_set "$cfg" latlon_infile '/var/run/latlon.txt' else config_set "$cfg" lat "$SYSTEM_LAT" config_set "$cfg" lon "$SYSTEM_LON" fi fi config_get latlon_file "$cfg" latlon_file [ -z "$latlon_file" ] && config_set "$cfg" latlon_file '/var/run/latlon.js' ;; esac echo -n "${N}LoadPlugin \"$library\"${N}{" config_write_options "$OLSRD_LOADPLUGIN_SCHEMA" "$cfg" olsrd_write_plparam "${T}" echo "${N}}" return 0 } olsrd_write_interface() { local cfg="$1" validate_varname "$cfg" || return 0 local ignore local interfaces local interface local ifnames config_get_bool ignore "$cfg" ignore 0 [ "$ignore" -ne 0 ] && return 0 ifnames= config_get interfaces "$cfg" interface for interface in $interfaces; do if validate_varname "$interface"; then if get_ifname "$interface"; then ifnames="$ifnames \"$IFNAME\"" else echo "Warning: Interface '$interface' not found, skipped" 1>&2 fi else warning_invalid_value olsrd "$cfg" "interface" fi done [ -z "$ifnames" ] && return 0 echo -n "${N}Interface$ifnames${N}{" config_write_options "$OLSRD_INTERFACE_SCHEMA" "$cfg" olsrd_write_option "${T}" echo "${N}}" INTERFACES_COUNT=$((INTERFACES_COUNT + 1)) return 0 } olsrd_write_interface_defaults() { local cfg="$1" validate_varname "$cfg" || return 0 echo -n "${N}InterfaceDefaults$ifnames${N}{" config_write_options "$OLSRD_INTERFACE_DEFAULTS_SCHEMA" "$cfg" olsrd_write_option "${T}" echo "${N}}" return 1 } olsrd_update_schema() { local command="$1" validate_varname "$command" || return 0 local varname="$2" validate_varname "$varname" || return 0 local value="$3" local cfg="$CONFIG_SECTION" local cfgt local cur_varname config_get cfgt "$cfg" TYPE case "$cfgt" in olsrd) config_update_schema OLSRD_OLSRD_SCHEMA "$command" "$varname" "$value";; IpcConnect) config_update_schema OLSRD_IPCCONNECT_SCHEMA "$command" "$varname" "$value";; LoadPlugin) config_update_schema OLSRD_LOADPLUGIN_SCHEMA "$command" "$varname" "$value";; Interface) config_update_schema OLSRD_INTERFACE_SCHEMA "$command" "$varname" "$value";; InterfaceDefaults) config_update_schema OLSRD_INTERFACE_DEFAULTS_SCHEMA "$command" "$varname" "$value";; esac return 0 } olsrd_write_config() { OLSRD_IPVERSION_6AND4=0 OLSRD_COUNT=0 config_foreach olsrd_write_olsrd olsrd IPCCONNECT_COUNT=0 config_foreach olsrd_write_ipcconnect IpcConnect HNA4_COUNT=0 config_foreach olsrd_write_hna4 Hna4 [ "$HNA4_COUNT" -gt 0 ] && echo "${N}}" HNA6_COUNT=0 config_foreach olsrd_write_hna6 Hna6 [ "$HNA6_COUNT" -gt 0 ] && echo "${N}}" config_foreach olsrd_write_loadplugin LoadPlugin INTERFACES_COUNT=0 config_foreach olsrd_write_interface_defaults InterfaceDefaults config_foreach olsrd_write_interface Interface echo return 0 } start() { SYSTEM_HOSTNAME= SYSTEM_LAT= SYSTEM_LON= config_load system config_foreach system_config system option_cb() { olsrd_update_schema "option" "$@" } list_cb() { olsrd_update_schema "list" "$@" } include /lib/network scan_interfaces config_load olsrd reset_cb OLSRD_CONFIG_FILE= config_foreach olsrd_find_config_file olsrd if [ -z "$OLSRD_CONFIG_FILE" ]; then mkdir -p -- /var/etc/ olsrd_write_config > /var/etc/olsrd.conf if [ "$INTERFACES_COUNT" -gt 0 -a "$OLSRD_COUNT" -gt 0 ]; then OLSRD_CONFIG_FILE=/var/etc/olsrd.conf fi fi [ -z "$OLSRD_CONFIG_FILE" ] && return 1 local bindv6only='0' if [ "$OLSRD_IPVERSION_6AND4" -ne 0 ]; then bindv6only="$(sysctl -n net.ipv6.bindv6only)" sysctl -w net.ipv6.bindv6only=1 sed -e 's/^\t\t[0-9.]*[ ][0-9.]*$//' < "$OLSRD_CONFIG_FILE" > /var/etc/olsrd.conf.ipv6 sed -i '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/d' /var/etc/olsrd.conf.ipv6 olsrd -f /var/etc/olsrd.conf.ipv6 -nofork < /dev/null > /dev/null & sed -e 's/^IpVersion[ ][ ]*6$/IpVersion 4/' -e 's/^\t\t[A-Fa-f0-9.:]*[:][A-Fa-f0-9.:]*[ ][0-9]*$//' < "$OLSRD_CONFIG_FILE" > /var/etc/olsrd.conf.ipv4 olsrd -f /var/etc/olsrd.conf.ipv4 -nofork < /dev/null > /dev/null & sleep 3 sysctl -w net.ipv6.bindv6only="$bindv6only" else olsrd -f "$OLSRD_CONFIG_FILE" -nofork < /dev/null > /dev/null & fi } stop() { killall olsrd } olsrd-0.6.6.2/openwrt/olsrd-stable-git/files/olsrd_secure_key000066400000000000000000000000201234304727700242470ustar00rootroot000000000000001234567890123456olsrd-0.6.6.2/redhat/000077500000000000000000000000001234304727700142665ustar00rootroot00000000000000olsrd-0.6.6.2/redhat/olsrd.spec000066400000000000000000000127261234304727700162750ustar00rootroot00000000000000Summary: OLSR Daemon Name: olsrd Version: current Release: 1 License: BSD Packager: roarbr@tihlde.org Group: System Environment/Daemons Source: http://www.olsr.org/releases/0.5/olsrd-%{version}.tar.bz2 URL: http://www.olsr.org/ BuildRoot: %{_tmppath}/%{name}-root Provides: olsrd %description olsrd is an implementation of the Ad Hoc routing protocol OLSR (RFC3626). OLSRD provides (multihop) routing in a dynamic, changing Ad Hoc network, wired or wireless. This version supports both IPv4 and IPv6. See http://www.olsr.org/ for more info. %prep %setup %{__cat} << 'EOF' > %{name}.init #!/bin/bash # # Startup script for the OLSR Daemon # # chkconfig: 235 16 84 # description: This script starts OLSRD (Ad Hoc routing protocol) # # processname: olsrd # config: %{_sysconfdir}/olsrd.conf # pidfile: %{_localstatedir}/run/olsrd.pid source %{_initrddir}/functions source %{_sysconfdir}/sysconfig/network # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 [ -x %{_sbindir}/olsrd ] || exit 1 [ -r %{_sysconfdir}/olsrd.conf ] || exit 1 RETVAL=0 prog="olsrd" desc="Ad Hoc routing protocol" start() { echo -n $"Starting $desc ($prog): " daemon $prog -d 0 RETVAL=$? echo [ $RETVAL -eq 0 ] && touch %{_localstatedir}/lock/subsys/$prog return $RETVAL } stop() { echo -n $"Shutting down $desc ($prog): " killproc $prog RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f %{_localstatedir}/lock/subsys/$prog return $RETVAL } reload() { echo -n $"Reloading $desc ($prog): " killproc $prog -HUP RETVAL=$? echo return $RETVAL } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart) restart ;; reload) reload ;; condrestart) [ -e %{_localstatedir}/lock/subsys/$prog ] && restart RETVAL=$? ;; status) status olsrd ;; *) echo $"Usage $0 {start|stop|restart|reload|condrestart|status}" RETVAL=1 esac exit $RETVAL EOF %build make %{?_smp_mflags} make %{?_smp_mflags} libs %install rm -rf %{buildroot} mkdir -p %{buildroot}/usr/sbin/ mkdir -p %{buildroot}/usr/lib/ mkdir -p %{buildroot}%{_initrddir} mkdir -p %{buildroot}/usr/share/man/man8 make DESTDIR=%{buildroot} install make DESTDIR=%{buildroot} install_libs %{__install} -m0755 olsrd.init %{buildroot}%{_initrddir}/olsrd %clean rm -rf %{buildroot} %preun /etc/init.d/olsrd stop /sbin/chkconfig --del olsrd %post #/sbin/chkconfig --add olsrd # Default to not start olsrd automatic /sbin/chkconfig olsrd off echo "Now please edit /etc/olsrd.conf and run 'service olsrd start' or '/etc/init.d/olsrd start' to start olsrd" echo "Run 'chkconfig olsrd on' to enable automatic starting of olsrd" %files %defattr(-, root, root, 0755) %doc README CHANGELOG %doc lib/*/*README* %config(noreplace) %{_sysconfdir}/olsrd.conf %config %{_initrddir}/olsrd /usr/sbin/olsrd # Wildchar to cover all installed plugins /usr/lib/olsrd_*so* /usr/share/man/man8/olsrd.8.gz /usr/share/man/man5/olsrd.conf.5.gz %changelog * Tue Jul 17 2007 Roar Bjrgum Rotvik - Created spec-file for 0.5.2 * Mon Jul 09 2007 Roar Bjrgum Rotvik - Created spec-file for 0.5.1 * Tue Apr 03 2007 Roar Bjrgum Rotvik - Created spec-file for 0.5.0 - Changed from INSTALL_PREFIX to DESTDIR * Wed Jan 04 2006 Roar Bjrgum Rotvik - Created spec-file for 0.4.10 - Removed OS=linux option to make - Updated plugin file list, added wildchar for plugins * Tue Apr 05 2005 Roar Bjrgum Rotvik - Created spec-file for 0.4.9 * Tue Mar 29 2005 Roar Bjrgum Rotvik - Increased version number for nameservice and secure plugin * Tue Dec 07 2004 Roar Bjrgum Rotvik - Changed spec file for olsrd-0.4.8 - Removed frontend GUI inclusion - Removed references to Unik - Changed licence to BSD * Tue Jun 29 2004 Roar Bjrgum Rotvik - Changed spec file for unik-olsrd-0.4.5 - Remover ROOT-prefix patch as INSTALL_PREFIX is added to Makefile in 0.4.5 - Added INSTALL_PREFIX patch for front-end/Makefile - Included plugins dot_draw and secure - Added documentation for the plugins dyn_gw, powerinfo, dot_draw and secure * Tue May 25 2004 Roar Bjrgum Rotvik - Changed spec file for unik-olsrd-0.4.4 - Added man-page for olsrd - Removed documentation olsrd-plugin-howto.pdf as it is no longer part of source package * Tue Mar 02 2004 Roar Bjrgum Rotvik - Changed spec file for unik-olsrd-0.4.3 - Added OLSRD plugins olsrd_dyn_gw and olsrd_power to package - Added documentation olsrd-plugin-howto.pdf * Tue Mar 02 2004 Roar Bjrgum Rotvik - Renamed package from uolsrd to unik-olsrd to use the same name as the .deb-package - Start olsrd daemon with option "-d 0" to start without debugging and in daemon mode even if debugging is enabled in olsrd.conf. * Mon Mar 01 2004 Roar Bjrgum Rotvik - Included init-script to start uolsrd daemon (installs as %{_initrddir}/uolsrd). * Wed Feb 25 2004 Roar Bjrgum Rotvik - Changed Group from Applications/System to System Environment/Daemons. - Included olsrd-gui (forgotten in first release) - Renamed spec file from unik-olsrd-0.4.0.spec to uolsrd-0.4.0.spec * Wed Feb 25 2004 Roar Bjrgum Rotvik - Created first version of this spec-file olsrd-0.6.6.2/release/000077500000000000000000000000001234304727700144375ustar00rootroot00000000000000olsrd-0.6.6.2/release/.gitignore000066400000000000000000000000701234304727700164240ustar00rootroot00000000000000/olsrd-*.tar.gz /olsrd-*.tar.bz2 /MD5SUM-* /SHA256SUM-* olsrd-0.6.6.2/release/release.bash000077500000000000000000000517601234304727700167320ustar00rootroot00000000000000#!/bin/bash set -e set -u # ############################################################################## # # Settings # ############################################################################## declare MODE_BRANCH="branch" declare MODE_RELEASE="release" declare MODE_BRANCH_TXT="Branch" declare MODE_BRANCH_TXT_LOWER="branch" declare MODE_RELEASE_TXT="Release" declare MODE_RELEASE_TXT_LOWER="release" declare MODE_TXT="" declare MODE_TXT_LOWER="" # The digit representation of a basic version can be in the format 0.6.4 declare versionRegexDigitsBasic="([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)" # The digit representation of a release branch version can be in the format # 0.6.4 or 0.6.4.1 declare versionRegexDigits="${versionRegexDigitsBasic}(\.[[:digit:]]+)?" # The version for source code can be in the format: # - 0.6.4 or 0.6.4.1 or pre-0.6.4 or pre-0.6.4.1 declare versionRegexSources="(|pre-)(${versionRegexDigits})" # The version for a release tag is in the format v0.6.4 or v0.6.4.1 declare versionRegexReleaseTag="v(${versionRegexDigits})" # A release branch is in the format release-0.6.4 or release-0.6.4.1 declare relBranchRegex="release-(${versionRegexDigits})" # ############################################################################## # # Functions # ############################################################################## # # Print script usage # function usage() { echo "" echo " $(basename "${script}") ${MODE_BRANCH} 0.6.4" echo " - create the release branch for version 0.6.4" echo " $(basename "${script}") ${MODE_RELEASE}" echo " - release the (checked-out) release branch" } # # Trim a string: remove spaces from the beginning and end of the string # # 1=string to trim # return=trimmed string function stringTrim() { if [[ -z "${1}" ]]; then return fi # remove leading whitespace characters local var="${1#${1%%[![:space:]]*}}" # remove trailing whitespace characters echo "${var%${var##*[![:space:]]}}" } # # Get the canonical path of a file or directory # This is the physical path without any links # # 1=the file or directory function pathCanonicalPath() { local src="$(stringTrim "${1}")" if [[ -h "${src}" ]] && [[ -d "${src}" ]]; then # src is a link to a directory pushd . &> /dev/null cd -P "${src}" &> /dev/null pwd -P popd &> /dev/null return fi # we're not dealing with a directory here while [[ -h "${src}" ]]; do # keep getting the link target while src is a link src="$(ls -la "${src}" | \ sed -r 's#^.*?[[:space:]]+->[[:space:]]+(.*)$#\1#')" done # src is no longer a link here pushd . &> /dev/null cd -P "$(dirname "${src}")" &> /dev/null echo "$(pwd -P)/$(basename "${src}")" popd &> /dev/null } # # Determine whether a given directory is a git repository directory # # 1=directory # return=0 not a git dir, 1 a git dir function gitIsGitDirectory() { local place="$(stringTrim "${1}")" local -i result=1 if [[ -d "${place}" ]]; then pushd "${place}" &> /dev/null set +e git rev-parse --git-dir &> /dev/null result=${?} set -e popd &> /dev/null fi if [[ ${result} -ne 0 ]]; then echo "0" else echo "1" fi } # # Go into the root of the checkout and check some key files # function checkIsOlsrdGitCheckout() { if [[ "$(gitIsGitDirectory ".")" == "0" ]] || \ [[ ! -r ./Makefile.inc ]] || \ [[ ! -r ./files/olsrd.conf.default.full ]]; then echo "* You do not appear to be running the script from an olsrd git checkout" exit 1 fi } # # Check that a signing key is configured # function checkGitSigningKeyIsConfigured() { local gpgKeyId="$(git config --get user.signingkey)" if [[ -z "${gpgKeyId}" ]]; then cat >&1 << EOF * No signing key is setup for git, please run git config --global user.signingkey You can get keys and IDs by running 'gpg --list-keys' EOF exit 1 fi # # Check that the signing key is present # set +e gpg --list-key "${gpgKeyId}" &> /dev/null local -i gpgKeyIdPresentResult=${?} set -e if [[ ${gpgKeyIdPresentResult} -ne 0 ]]; then cat >&1 << EOF * Your signing key with ID ${gpgKeyId} is not found, please run git config --global user.signingkey to setup a valid key ID. You can get keys and IDs by running 'gpg --list-keys' EOF exit 1 fi } # # Get the version digits from a release tag version # # 1=release tag version # return=version digits function getVersionDigitsFromReleaseTag() { echo "$(stringTrim "${1}")" | sed -r "s/${versionRegexReleaseTag}/\1/" } # # Get the previous release tag and check # declare prevRelTagVersion="" function getPrevRelTag() { set +e prevRelTagVersion="$(git describe --abbrev=0 | \ grep -E "^${versionRegexReleaseTag}$")" set -e if [[ -z "${prevRelTagVersion}" ]]; then echo "* Could not find the previous release tag" exit 1 fi } # # Get the next version digits by incrementing the micro digit # # 1=version in format 0.6.4 or 0.6.4.1 # return=incremented version in format 0.6.5 function getNextVersionDigitsMicro() { local version="$(stringTrim "${1}")" local -a versionDigits=( ${version//\./ } ) local -i versionMicroNext=$(( ${versionDigits[2]} + 1 )) echo "${versionDigits[0]}.${versionDigits[1]}.${versionMicroNext}" } # # Get the next version digits by incrementing the patchlevel digit # # 1=version in format 0.6.4 or 0.6.4.0 # return=incremented version in format 0.6.4.1 function getNextVersionDigitsPatchLevel() { local version="$(stringTrim "${1}")" local -a versionDigits=( ${version//\./ } ) local -i versionPatchLevelNext=1 if [[ ${#versionDigits[*]} -ne 3 ]]; then versionPatchLevelNext=$(( ${versionDigits[3]} + 1 )) fi echo "${versionDigits[0]}.${versionDigits[1]}.${versionDigits[2]}.${versionPatchLevelNext}" } # # Adjust the branch name so that we can release 0.6.4.x from the # release-0.6.4 branch # # prevTagVersionDigits relBranchVersionDigits relBranchVersionDigits (adjusted) # 0.6.4 0.6.4 0.6.4.1 # 0.6.4 0.6.5 - # 0.6.4 0.6.4.5 - # 0.6.4 0.6.5.5 - # 0.6.4.5 0.6.4 0.6.4.6 # 0.6.4.5 0.6.5 - # 0.6.4.5 0.6.4.6 - # 0.6.4.5 0.6.5.6 - function adjustBranchName() { local -a prevTagVersionDigitsArray=( ${prevTagVersionDigits//\./ } ) local -a relBranchVersionDigitsArray=( ${relBranchVersionDigits//\./ } ) local -i prevTagVersionDigitsCount=${#prevTagVersionDigitsArray[*]} local -i relBranchVersionDigitsCount=${#relBranchVersionDigitsArray[*]} local prevTagVersionTrain="$(echo "$(stringTrim "${prevTagVersionDigits}")" | \ sed -r "s/${versionRegexDigits}/\1/")" if [[ "${prevTagVersionDigits}" == "${relBranchVersionDigits}" ]] || \ ([[ "${prevTagVersionTrain}" == "${relBranchVersionDigits}" ]] && \ [[ ${prevTagVersionDigitsCount} -eq 4 ]] && \ [[ ${relBranchVersionDigitsCount} -eq 3 ]]); then relBranchVersionDigits="$(getNextVersionDigitsPatchLevel "${prevTagVersionDigits}")" fi } # # Check that the new version is incrementing # # 1=last version # 2=new version # 3= 0 to disallow equal versions as ok # return (in checkVersionIncrementingResult) = 0 when new version > last version, # 1 otherwise declare -i checkVersionIncrementingResult=0 function checkVersionIncrementing() { checkVersionIncrementingResult=0 local lastVersion="$(stringTrim "${1}")" local newVersion="$(stringTrim "${2}")" local -i allowEqualVersions=${3} local -a lastVersionDigits=( ${lastVersion//\./ } ) local -a newVersionDigits=( ${newVersion//\./ } ) # if the last version is in the format 0.6.4 then assume 0.6.4.0 if [[ ${#lastVersionDigits[*]} -ne 4 ]]; then lastVersionDigits[3]=0 fi # if the new version is in the format 0.6.4 then assume 0.6.4.0 if [[ ${#newVersionDigits[*]} -ne 4 ]]; then newVersionDigits[3]=0 fi # major if [[ ${newVersionDigits[0]} -lt ${lastVersionDigits[0]} ]]; then checkVersionIncrementingResult=1 return fi if [[ ${newVersionDigits[0]} -gt ${lastVersionDigits[0]} ]]; then return fi # minor if [[ ${newVersionDigits[1]} -lt ${lastVersionDigits[1]} ]]; then checkVersionIncrementingResult=1 return fi if [[ ${newVersionDigits[1]} -gt ${lastVersionDigits[1]} ]]; then return fi # micro if [[ ${newVersionDigits[2]} -lt ${lastVersionDigits[2]} ]]; then checkVersionIncrementingResult=1 return fi if [[ ${newVersionDigits[2]} -gt ${lastVersionDigits[2]} ]]; then return fi # patch level if [[ ${newVersionDigits[3]} -lt ${lastVersionDigits[3]} ]]; then checkVersionIncrementingResult=1 return fi if [[ ${newVersionDigits[3]} -gt ${lastVersionDigits[3]} ]]; then return fi # everything is equal if [[ ${allowEqualVersions} -eq 0 ]]; then checkVersionIncrementingResult=1 fi return } # # Commit the current changes, allow an empty commit, or amend (when the commit # message is the same as that of the last commit) # # 1=non-zero to allow an empty commit # 2=commit message function commitChanges() { local -i allowEmpty=${1} local msg="$(stringTrim "${2}")" local lastMsg="$(git log -1 --format="%s")" lastMsg="$(stringTrim "${lastMsg}")" local extra="" if [[ ${allowEmpty} -ne 0 ]]; then extra="${extra} --allow-empty" fi if [[ "${msg}" == "${lastMsg}" ]]; then extra="${extra} --amend" fi set +e git commit -s -q ${extra} -m "${msg}" &> /dev/null set -e } # # Get the version from the Makefile # function getVersionFromMakefile() { local src="Makefile" local regex="([[:space:]]*VERS[[:space:]]*=[[:space:]]*)${versionRegexSources}[[:space:]]*" grep -E "^${regex}\$" "${src}" | sed -r "s/^${regex}\$/\3/" } # # Update the version in all relevant files # # 1=the new version (in the format of versionRegexSources) function updateVersions() { local newVersion="$(stringTrim "${1}")" # # Adjust debug settings in Makefile.inc # local src="Makefile.inc" sed -ri \ -e 's/^[[:space:]]*DEBUG[[:space:]]*?=.*$/DEBUG ?= 1/' \ -e 's/^[[:space:]]*NO_DEBUG_MESSAGES[[:space:]]*?=.*$/NO_DEBUG_MESSAGES ?= 0/' \ "${src}" set +e git add "${src}" set -e # # Adjust version in Makefile # local src="Makefile" sed -ri "s/^([[:space:]]*VERS[[:space:]]*=[[:space:]]*)${versionRegexSources}[[:space:]]*\$/\1${newVersion}/" "${src}" set +e git add "${src}" set -e # # Adjust version in win32 gui installer # local src="gui/win32/Inst/installer.nsi" local grepStr="^([[:space:]]*MessageBox[[:space:]]+MB_YESNO[[:space:]]+\".+?[[:space:]]+olsr\.org[[:space:]]+)${versionRegexSources}([[:space:]]+.+?\"[[:space:]]+IDYES[[:space:]]+NoAbort)[[:space:]]*$" local replStr="\1${newVersion}\6" sed -ri "s/${grepStr}/${replStr}/" "${src}" set +e git add "${src}" set -e # # Adjust version in win32 gui front-end # local src="gui/win32/Main/Frontend.rc" local grepStr="^([[:space:]]*CAPTION[[:space:]]+\"olsr\.org[[:space:]]+Switch[[:space:]]+)${versionRegexSources}([[:space:]]*\")[[:space:]]*\$" local replStr="\1${newVersion}\6" sed -ri "s/${grepStr}/${replStr}/" "${src}" set +e git add "${src}" set -e } # # Sign a text file # # 1=the text file function signTextFile() { local txtFile="$(stringTrim "${1}")" gpg -u "$(git config --get user.name)" --clearsign "${txtFile}" mv "${txtFile}.asc" "${txtFile}" } # ############################################################################## # # Main # ############################################################################## declare script="$(pathCanonicalPath "${0}")" declare scriptDir="$(dirname "${script}")" declare baseDir="$(dirname "${scriptDir}")" cd "${baseDir}" declare -i masterWasUpdated=0 # # Check the number of arguments # if [[ ${#} -lt 1 ]]; then echo "* Need at least 1 argument:" usage exit 1 fi # # Get the mode and check it # declare mode="$(stringTrim "${1}")" shift 1 if [[ ! "${mode}" == "${MODE_BRANCH}" ]] && \ [[ ! "${mode}" == "${MODE_RELEASE}" ]]; then echo "* Wrong mode: ${mode}" usage exit 1 fi # # Further mode/argument parsing # declare branchVersion="" if [[ "${mode}" == "${MODE_BRANCH}" ]]; then MODE_TXT="${MODE_BRANCH_TXT}" MODE_TXT_LOWER="${MODE_BRANCH_TXT_LOWER}" # # Get the branch version to create # if [[ ${#} -ne 1 ]]; then echo "* Need the version to branch:" usage exit 1 fi branchVersion="$(stringTrim "${1}")" shift 1 # # Check branch version # if [[ -z "$(echo "${branchVersion}" | grep -E "^${versionRegexDigitsBasic}\$")" ]]; then echo "* Version to branch ${branchVersion} has invalid format" echo " Expected format is: 0.6.4" exit 1 fi else MODE_TXT="${MODE_RELEASE_TXT}" MODE_TXT_LOWER="${MODE_RELEASE_TXT_LOWER}" if [[ ${#} -ne 0 ]]; then echo "* Need no additional arguments." usage exit 1 fi fi checkIsOlsrdGitCheckout if [[ "${mode}" == "${MODE_RELEASE}" ]]; then checkGitSigningKeyIsConfigured fi getPrevRelTag declare prevTagVersionDigits="$(getVersionDigitsFromReleaseTag "${prevRelTagVersion}")" # # Get the current branch and check that we're on a release branch (for the # release mode) or on the master branch (for the branch mode) # declare relBranch="$(git rev-parse --abbrev-ref HEAD)" declare relBranch="$(stringTrim "${relBranch}")" if [[ "${mode}" == "${MODE_BRANCH}" ]]; then if [[ -z "$(echo "${relBranch}" | grep -E "^master\$")" ]]; then echo "* You are not on the master branch" exit 1 fi relBranch="release-${branchVersion}" # check that the branch does not yet exist declare -i branchTestResult=0 set +e git rev-parse --abbrev-ref "${relBranch}" &> /dev/null branchTestResult=${?} set -e if [[ ${branchTestResult} -eq 0 ]]; then echo "* Branch ${relBranch} already exists" exit 1 fi else if [[ -z "$(echo "${relBranch}" | grep -E "^${relBranchRegex}\$")" ]]; then echo "* You are not on a release branch (format: release-0.6.4 or release-0.6.4.1)" exit 1 fi fi # # Get the version to release from the current branch # declare relBranchVersionDigits="" if [[ "${mode}" == "${MODE_BRANCH}" ]]; then relBranchVersionDigits="${branchVersion}" else relBranchVersionDigits="$(echo "${relBranch}" | \ sed -r "s/${relBranchRegex}/\1/")" adjustBranchName fi declare relTagVersion="v${relBranchVersionDigits}" declare relBranchVersionDigitsNextMicro="$(getNextVersionDigitsMicro "${relBranchVersionDigits}")" declare relBranchVersionDigitsNextPatchLevel="$(getNextVersionDigitsPatchLevel "${relBranchVersionDigits}")" # # Check that the version is incrementing # checkVersionIncrementing "${prevTagVersionDigits}" "${relBranchVersionDigits}" 0 if [[ ${checkVersionIncrementingResult} -ne 0 ]]; then echo "* The new version ${relBranchVersionDigits} is not greater than the previous version ${prevTagVersionDigits}" exit 1 fi # # When branching, check that the version is incrementing (allow equal versions), # w.r.t. the version in the Makefile # if [[ "${mode}" == "${MODE_BRANCH}" ]]; then declare currentMasterVersion="$(getVersionFromMakefile)" checkVersionIncrementing "${currentMasterVersion}" "${relBranchVersionDigits}" 1 if [[ ${checkVersionIncrementingResult} -ne 0 ]]; then echo "* The new version ${relBranchVersionDigits} is not greater than the current version ${currentMasterVersion}" exit 1 fi fi # # Confirm the branch/release # cat >&1 << EOF * All checks pass, ready to ${MODE_TXT_LOWER} ${relBranchVersionDigits}. * The previous version found is: ${prevTagVersionDigits} Note: If this is not the version you were expecting, then maybe that version wasn't merged into this branch. * Continuing will DESTROY any modifications you currently have in your tree! EOF read -p "Press [enter] to continue or CTRL-C to exit..." echo "" echo "" # # Clean up the checkout # echo "Cleaning the git checkout..." git clean -fdq git reset -q --hard if [[ "${mode}" == "${MODE_BRANCH}" ]]; then # # Update the versions for branch # echo "Updating the version to pre-${relBranchVersionDigits}..." updateVersions "pre-${relBranchVersionDigits}" commitChanges 1 "${MODE_TXT} ${relTagVersion}" masterWasUpdated=1 # create release branch echo "Creating the release branch ${relBranch}..." git branch "${relBranch}" # # Update the version to the next release # echo "Updating the version to pre-${relBranchVersionDigitsNextMicro}..." updateVersions "pre-${relBranchVersionDigitsNextMicro}" commitChanges 0 "Update version after ${MODE_TXT_LOWER} of ${relTagVersion}" else # # Update the versions for release # echo "Updating the version to ${relBranchVersionDigits}..." updateVersions "${relBranchVersionDigits}" commitChanges 1 "${MODE_TXT} ${relTagVersion}" # # Generate the changelog # echo "Generating the changelog..." declare src="CHANGELOG" declare dst="mktemp -q -p . -t "${src}.XXXXXXXXXX"" cat > "${dst}" << EOF ${relBranchVersionDigits} ------------------------------------------------------------------- EOF git rev-list --pretty=short "${prevRelTagVersion}..HEAD" | \ git shortlog -w80 -- >> "${dst}" cat "${src}" >> "${dst}" mv "${dst}" "${src}" set +e git add "${src}" set -e commitChanges 1 "${MODE_TXT} ${relTagVersion}" # # Tag the release # echo "Tagging ${relTagVersion}..." set +e git tag -d "${relTagVersion}" &> /dev/null set -e git tag -s -m "OLSRd release ${relBranchVersionDigits}" "${relTagVersion}" # # Update the version to the next release # echo "Updating the version to pre-${relBranchVersionDigitsNextPatchLevel}..." updateVersions "pre-${relBranchVersionDigitsNextPatchLevel}" commitChanges 1 "Update version after ${MODE_TXT_LOWER} of ${relTagVersion}" # # Update the version (on the master branch) to the next release # echo "Updating the version to pre-${relBranchVersionDigitsNextMicro} on the master branch..." git checkout -q master git clean -fdq git reset -q --hard declare oldMasterVersion="$(getVersionFromMakefile)" declare newMasterVersion="${relBranchVersionDigitsNextMicro}" checkVersionIncrementing "${oldMasterVersion}" "${newMasterVersion}" 0 if [[ ${checkVersionIncrementingResult} -ne 0 ]]; then echo "* Skipped updating the version on the master branch:" echo " The new version ${newMasterVersion} is not greater than the previous version ${oldMasterVersion}" else updateVersions "pre-${relBranchVersionDigitsNextMicro}" commitChanges 0 "Update version after ${MODE_TXT_LOWER} of ${relTagVersion}" masterWasUpdated=1 fi git checkout -q "${relBranch}" git clean -fdq git reset -q --hard # # Make the release tarballs # echo "Generating the release tarballs..." declare tarFile="${scriptDir}/olsrd-${relBranchVersionDigits}.tar" declare tarGzFile="${tarFile}.gz" declare tarBz2File="${tarFile}.bz2" git archive --format=tar --prefix="olsrd-${relBranchVersionDigits}/" --output="${tarFile}" "${relTagVersion}" gzip -c "${tarFile}" > "${tarGzFile}" bzip2 -c "${tarFile}" > "${tarBz2File}" rm -f "${tarFile}" echo "Generating the release tarball checksums..." declare md5File="${scriptDir}/MD5SUM-${relBranchVersionDigits}" declare sha256File="${scriptDir}/SHA256SUM-${relBranchVersionDigits}" md5sum "${tarGzFile}" "${tarBz2File}" > "${md5File}" sha256sum "${tarGzFile}" "${tarBz2File}" > "${sha256File}" echo "Signing the release tarball checksums..." signTextFile "${md5File}" signTextFile "${sha256File}" fi echo "Done." echo "" echo "" echo "===================" echo "= Git Updates =" echo "===================" if [[ ${masterWasUpdated} -ne 0 ]]; then echo "Branch : master" fi echo "Branch : ${relBranch}" if [[ "${mode}" == "${MODE_RELEASE}" ]]; then echo "Tag : ${relTagVersion}" echo "" echo "" echo "===================" echo "= Generated Files =" echo "===================" cat >&1 << EOF ${tarGzFile} ${tarBz2File} ${md5File} ${sha256File}" EOF fi echo "" echo "" echo "===================" echo "= Manual Actions =" echo "===================" if [[ "${mode}" == "${MODE_RELEASE}" ]]; then echo "1. Check that everything is in order. For example, run:" if [[ ${masterWasUpdated} -ne 0 ]]; then echo " gitk master ${relBranch} ${relTagVersion}" else echo " gitk ${relBranch} ${relTagVersion}" fi echo "2. Push. For example, run:" if [[ ${masterWasUpdated} -ne 0 ]]; then echo " git push origin master ${relBranch} ${relTagVersion}" else echo " git push origin ${relBranch} ${relTagVersion}" fi echo "3. Upload the generated files to" echo " http://www.olsr.org/releases/${relBranchVersionDigits}" echo "4. Add a release article on olsr.org." echo "" else echo "1. Check that everything is in order. For example, run:" if [[ ${masterWasUpdated} -ne 0 ]]; then echo " gitk master ${relBranch}" else echo " gitk ${relBranch}" fi echo "2. Push. For example, run:" if [[ ${masterWasUpdated} -ne 0 ]]; then echo " git push origin master ${relBranch}" else echo " git push origin ${relBranch}" fi echo "3. Send a 'release branch created' email to olsr-dev@lists.olsr.org." echo "" fi olsrd-0.6.6.2/src/000077500000000000000000000000001234304727700136065ustar00rootroot00000000000000olsrd-0.6.6.2/src/.gitignore000066400000000000000000000000221234304727700155700ustar00rootroot00000000000000/TAGS /builddata.colsrd-0.6.6.2/src/.indent.pro000066400000000000000000000004011234304727700156620ustar00rootroot00000000000000--indent-level2 --no-space-after-function-call-names --braces-on-if-line --braces-on-struct-decl-line --cuddle-else --no-space-after-casts --blank-lines-before-block-comments --declaration-comment-column40 --line-length132 --procnames-start-lines --no-tabs olsrd-0.6.6.2/src/apm.h000066400000000000000000000050221234304727700145330ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_APM #define _OLSR_APM /* * Interface to OS dependent power management information */ #define OLSR_BATTERY_POWERED 0 #define OLSR_AC_POWERED 1 struct olsr_apm_info { int ac_line_status; int battery_percentage; int battery_time_left; /* Time left in minutes */ }; int apm_init(void); void apm_printinfo(struct olsr_apm_info *); /* * This function should return 0 if no powerinfo * is available. If returning 1 the function must * fill the provided olsr_apm_info struct with * the current power status. */ int apm_read(struct olsr_apm_info *); #endif /* _OLSR_APM */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/bsd/000077500000000000000000000000001234304727700143565ustar00rootroot00000000000000olsrd-0.6.6.2/src/bsd/apm.c000066400000000000000000000042741234304727700153060ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "apm.h" #include "defs.h" #include #include int apm_init(void) { return -1; } void apm_printinfo(struct olsr_apm_info *ApmInfo __attribute__ ((unused))) { } int apm_read(struct olsr_apm_info *ApmInfo __attribute__ ((unused))) { return -1; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/bsd/dummy.c000066400000000000000000000041431234304727700156570ustar00rootroot00000000000000/* * dummy.c * * Created on: 12.02.2010 * Author: henning */ #include "../defs.h" #include "../kernel_routes.h" #include "../kernel_tunnel.h" #include "../net_os.h" /* prototypes: have them here or disable the warnings about missing prototypes! */ int olsr_if_setip(const char *dev __attribute__ ((unused)), union olsr_ip_addr *ip __attribute__ ((unused)), int ipversion __attribute__ ((unused))); int olsr_os_init_iptunnel(const char * name __attribute__((unused))) { return -1; } void olsr_os_cleanup_iptunnel(const char * name __attribute__((unused))) { } struct olsr_iptunnel_entry *olsr_os_add_ipip_tunnel(union olsr_ip_addr *target __attribute__ ((unused)), bool transportV4 __attribute__ ((unused)), char *name) { return NULL; } void olsr_os_del_ipip_tunnel(struct olsr_iptunnel_entry *t __attribute__ ((unused))) { return; } bool olsr_if_isup(const char * dev __attribute__ ((unused))) { return false; } int olsr_if_setip(const char *dev __attribute__ ((unused)), union olsr_ip_addr *ip __attribute__ ((unused)), int ipversion __attribute__ ((unused))) { return -1; } void olsr_os_niit_4to6_route(const struct olsr_ip_prefix *dst_v4 __attribute__ ((unused)), bool set __attribute__ ((unused))) { } void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6 __attribute__ ((unused)), bool set __attribute__ ((unused))) { } void olsr_os_inetgw_tunnel_route(uint32_t if_idx __attribute__ ((unused)), bool ipv4 __attribute__ ((unused)), bool set __attribute__ ((unused)), uint8_t table __attribute__ ((unused))) { } int olsr_os_policy_rule(int family __attribute__ ((unused)), int rttable __attribute__ ((unused)), uint32_t priority __attribute__ ((unused)), const char *if_name __attribute__ ((unused)), bool set __attribute__ ((unused))) { return -1; } int olsr_os_localhost_if(union olsr_ip_addr *ip __attribute__ ((unused)), bool create __attribute__ ((unused))) { return -1; } int olsr_os_ifip(int ifindex __attribute__ ((unused)), union olsr_ip_addr *ip __attribute__ ((unused)), bool create __attribute__ ((unused))) { return -1; } olsrd-0.6.6.2/src/bsd/kernel_routes.c000066400000000000000000000316161234304727700174120ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "kernel_routes.h" #include "olsr.h" #include "defs.h" #include "process_routes.h" #include "net_olsr.h" #include "ipcalc.h" #include #include #include #ifdef _WRS_KERNEL #include #include #include #define OLSR_PID taskIdSelf () #else /* _WRS_KERNEL */ #include #define OLSR_PID getpid () #endif /* _WRS_KERNEL */ static unsigned int seq = 0; /* * Sends an add or delete message via the routing socket. * The message consists of: * - a header i.e. struct rt_msghdr * - 0-8 socket address structures */ static int add_del_route(const struct rt_entry *rt, int add) { struct rt_msghdr *rtm; /* message to send to the routing socket */ unsigned char buff[512]; unsigned char *walker; /* points within the buffer */ struct sockaddr_in sin4; /* internet style sockaddr */ struct sockaddr_dl *sdl; /* link level sockaddr */ struct ifaddrs *addrs; struct ifaddrs *awalker; const struct rt_nexthop *nexthop; union olsr_ip_addr mask; /* netmask as ip address */ int sin_size, sdl_size; /* payload of the message */ int len; /* message size written to routing socket */ if (add) { OLSR_PRINTF(2, "KERN: Adding %s\n", olsr_rtp_to_string(rt->rt_best)); } else { OLSR_PRINTF(2, "KERN: Deleting %s\n", olsr_rt_to_string(rt)); } memset(buff, 0, sizeof(buff)); memset(&sin4, 0, sizeof(sin4)); sin4.sin_len = sizeof(sin4); sin4.sin_family = AF_INET; sin_size = 1 + ((sizeof(struct sockaddr_in) - 1) | (sizeof(long) - 1)); sdl_size = 1 + ((sizeof(struct sockaddr_dl) - 1) | (sizeof(long) - 1)); /********************************************************************** * FILL THE ROUTING MESSAGE HEADER **********************************************************************/ /* position header to the beginning of the buffer */ rtm = (struct rt_msghdr *)buff; rtm->rtm_version = RTM_VERSION; rtm->rtm_type = add ? RTM_ADD : RTM_DELETE; rtm->rtm_index = 0; /* is ignored in outgoing messages */ rtm->rtm_flags = olsr_rt_flags(rt, add); rtm->rtm_pid = OLSR_PID; rtm->rtm_seq = ++seq; /* walk to the end of the header */ walker = buff + sizeof(struct rt_msghdr); /********************************************************************** * SET DESTINATION OF THE ROUTE **********************************************************************/ #ifdef _WRS_KERNEL /* * vxWorks: change proto or tos */ OLSR_PRINTF(8, "\t- Setting Protocol: 0\n"); ((struct sockaddr_rt *)(&sin4))->srt_proto = 0; OLSR_PRINTF(8, "\t- Setting TOS: 0\n"); ((struct sockaddr_rt *)(&sin4))->srt_tos = 0; #endif /* _WRS_KERNEL */ sin4.sin_addr = rt->rt_dst.prefix.v4; memcpy(walker, &sin4, sizeof(sin4)); walker += sin_size; rtm->rtm_addrs = RTA_DST; /********************************************************************** * SET GATEWAY OF THE ROUTE **********************************************************************/ #ifdef _WRS_KERNEL /* * vxWorks: Route with no gateway is deleted */ if (add) { #endif /* _WRS_KERNEL */ nexthop = olsr_get_nh(rt); if (0 != (rtm->rtm_flags & RTF_GATEWAY)) { sin4.sin_addr = nexthop->gateway.v4; memcpy(walker, &sin4, sizeof(sin4)); walker += sin_size; rtm->rtm_addrs |= RTA_GATEWAY; } else { /* * Host is directly reachable, so add * the output interface MAC address. */ if (getifaddrs(&addrs)) { fprintf(stderr, "\ngetifaddrs() failed\n"); return -1; } for (awalker = addrs; awalker != NULL; awalker = awalker->ifa_next) if (awalker->ifa_addr->sa_family == AF_LINK && strcmp(awalker->ifa_name, if_ifwithindex_name(nexthop->iif_index)) == 0) break; if (awalker == NULL) { fprintf(stderr, "\nInterface %s not found\n", if_ifwithindex_name(nexthop->iif_index)); freeifaddrs(addrs); return -1; } /* sdl is "struct sockaddr_dl" */ sdl = (struct sockaddr_dl *)awalker->ifa_addr; memcpy(walker, sdl, sdl->sdl_len); walker += sdl_size; rtm->rtm_addrs |= RTA_GATEWAY; #ifdef RTF_CLONING rtm->rtm_flags |= RTF_CLONING; #endif /* RTF_CLONING */ #ifndef _WRS_KERNEL rtm->rtm_flags &= ~RTF_HOST; #endif /* _WRS_KERNEL */ freeifaddrs(addrs); } #ifdef _WRS_KERNEL } #endif /* _WRS_KERNEL */ /********************************************************************** * SET NETMASK **********************************************************************/ if (0 == (rtm->rtm_flags & RTF_HOST)) { olsr_prefix_to_netmask(&mask, rt->rt_dst.prefix_len); sin4.sin_addr = mask.v4; memcpy(walker, &sin4, sizeof(sin4)); walker += sin_size; rtm->rtm_addrs |= RTA_NETMASK; } /********************************************************************** * WRITE CONFIGURATION MESSAGE TO THE ROUTING SOCKET **********************************************************************/ rtm->rtm_msglen = (unsigned short)(walker - buff); len = write(olsr_cnf->rts, buff, rtm->rtm_msglen); if (0 != rtm->rtm_errno || len < rtm->rtm_msglen) { fprintf(stderr, "\nCannot write to routing socket: (rtm_errno= 0x%x) (last error message: %s)\n", rtm->rtm_errno,strerror(errno)); if (add) { fprintf(stderr, " Failed on Adding %s\n", olsr_rtp_to_string(rt->rt_best)); } else { fprintf(stderr, " Failed on Deleting %s\n",olsr_rt_to_string(rt)); } } return 0; } int olsr_ioctl_add_route(const struct rt_entry *rt) { return add_del_route(rt, 1); } int olsr_ioctl_del_route(const struct rt_entry *rt) { return add_del_route(rt, 0); } static int add_del_route6(const struct rt_entry *rt, int add) { struct rt_msghdr *rtm; unsigned char buff[512]; unsigned char *walker; struct sockaddr_in6 sin6; struct sockaddr_dl sdl; const struct rt_nexthop *nexthop; int sin_size, sdl_size; int len; if (add) { OLSR_PRINTF(2, "KERN: Adding %s\n", olsr_rtp_to_string(rt->rt_best)); } else { OLSR_PRINTF(2, "KERN: Deleting %s\n", olsr_rt_to_string(rt)); } memset(buff, 0, sizeof(buff)); memset(&sin6, 0, sizeof(sin6)); memset(&sdl, 0, sizeof(sdl)); sin6.sin6_len = sizeof(sin6); sin6.sin6_family = AF_INET6; sdl.sdl_len = sizeof(sdl); sdl.sdl_family = AF_LINK; sin_size = 1 + ((sizeof(struct sockaddr_in6) - 1) | (sizeof(long) - 1)); sdl_size = 1 + ((sizeof(struct sockaddr_dl) - 1) | (sizeof(long) - 1)); /********************************************************************** * FILL THE ROUTING MESSAGE HEADER **********************************************************************/ /* position header to the beginning of the buffer */ rtm = (struct rt_msghdr *)buff; rtm->rtm_version = RTM_VERSION; rtm->rtm_type = (add != 0) ? RTM_ADD : RTM_DELETE; rtm->rtm_index = 0; rtm->rtm_flags = olsr_rt_flags(rt, add); rtm->rtm_pid = OLSR_PID; rtm->rtm_seq = ++seq; /* walk to the end of the header */ walker = buff + sizeof(struct rt_msghdr); /********************************************************************** * SET DESTINATION OF THE ROUTE **********************************************************************/ memcpy(&sin6.sin6_addr.s6_addr, &rt->rt_dst.prefix.v6, sizeof(struct in6_addr)); memcpy(walker, &sin6, sizeof(sin6)); walker += sin_size; rtm->rtm_addrs = RTA_DST; /********************************************************************** * SET GATEWAY OF THE ROUTE **********************************************************************/ nexthop = olsr_get_nh(rt); if (0 != (rtm->rtm_flags & RTF_GATEWAY)) { memcpy(&sin6.sin6_addr.s6_addr, &nexthop->gateway.v6, sizeof(struct in6_addr)); memset(&sin6.sin6_addr.s6_addr, 0, 8); sin6.sin6_addr.s6_addr[0] = 0xfe; sin6.sin6_addr.s6_addr[1] = 0x80; sin6.sin6_scope_id = nexthop->iif_index; #ifdef __KAME__ *(u_int16_t *) & sin6.sin6_addr.s6_addr[2] = htons(sin6.sin6_scope_id); sin6.sin6_scope_id = 0; #endif /* __KAME__ */ memcpy(walker, &sin6, sizeof(sin6)); walker += sin_size; rtm->rtm_addrs |= RTA_GATEWAY; } else { /* * Host is directly reachable, so add * the output interface MAC address. */ memcpy(&sin6.sin6_addr.s6_addr, &rt->rt_dst.prefix.v6, sizeof(struct in6_addr)); memset(&sin6.sin6_addr.s6_addr, 0, 8); sin6.sin6_addr.s6_addr[0] = 0xfe; sin6.sin6_addr.s6_addr[1] = 0x80; sin6.sin6_scope_id = nexthop->iif_index; #ifdef __KAME__ *(u_int16_t *) & sin6.sin6_addr.s6_addr[2] = htons(sin6.sin6_scope_id); sin6.sin6_scope_id = 0; #endif /* __KAME__ */ memcpy(walker, &sin6, sizeof(sin6)); walker += sin_size; rtm->rtm_addrs |= RTA_GATEWAY; rtm->rtm_flags |= RTF_GATEWAY; } /********************************************************************** * SET NETMASK **********************************************************************/ if (0 == (rtm->rtm_flags & RTF_HOST)) { olsr_prefix_to_netmask((union olsr_ip_addr *)&sin6.sin6_addr, rt->rt_dst.prefix_len); memcpy(walker, &sin6, sizeof(sin6)); walker += sin_size; rtm->rtm_addrs |= RTA_NETMASK; } /********************************************************************** * WRITE CONFIGURATION MESSAGE TO THE ROUTING SOCKET **********************************************************************/ rtm->rtm_msglen = (unsigned short)(walker - buff); len = write(olsr_cnf->rts, buff, rtm->rtm_msglen); if (len < 0 && !(errno == EEXIST || errno == ESRCH)) { fprintf(stderr, "cannot write to routing socket: %s\n", strerror(errno)); } /* * If we get an EEXIST error while adding, delete and retry. */ if (len < 0 && errno == EEXIST && rtm->rtm_type == RTM_ADD) { struct rt_msghdr *drtm; unsigned char dbuff[512]; memset(dbuff, 0, sizeof(dbuff)); drtm = (struct rt_msghdr *)dbuff; drtm->rtm_version = RTM_VERSION; drtm->rtm_type = RTM_DELETE; drtm->rtm_index = 0; drtm->rtm_flags = olsr_rt_flags(rt, add); drtm->rtm_seq = ++seq; walker = dbuff + sizeof(struct rt_msghdr); memcpy(&sin6.sin6_addr.s6_addr, &rt->rt_dst.prefix.v6, sizeof(struct in6_addr)); memcpy(walker, &sin6, sizeof(sin6)); walker += sin_size; drtm->rtm_addrs = RTA_DST; drtm->rtm_msglen = (unsigned short)(walker - dbuff); len = write(olsr_cnf->rts, dbuff, drtm->rtm_msglen); if (len < 0) { fprintf(stderr, "cannot delete route: %s\n", strerror(errno)); } rtm->rtm_seq = ++seq; len = write(olsr_cnf->rts, buff, rtm->rtm_msglen); if (len < 0) { fprintf(stderr, "still cannot add route: %s\n", strerror(errno)); } } return 0; } int olsr_ioctl_add_route6(const struct rt_entry *rt) { return add_del_route6(rt, 1); } int olsr_ioctl_del_route6(const struct rt_entry *rt) { return add_del_route6(rt, 0); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/bsd/net.c000066400000000000000000000555261234304727700153250ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #if defined __FreeBSD_kernel__ #define _GNU_SOURCE 1 #endif /* defined __FreeBSD_kernel__ */ /* comment: we need this otherwise it does not include the proper files to find IPv6_PKTINFO */ #define __APPLE_USE_RFC_2292 #include "../defs.h" #include "../net_os.h" #include "../ipcalc.h" #include "../parser.h" /* dnc: needed for call to packet_parser() */ #include "../olsr_protocol.h" #include "../olsr_cfg.h" #include "../olsr.h" #include #include #include #include #include #include #include #include #include #include #include #ifdef _WRS_KERNEL #include #include "wrn/coreip/netinet6/in6_var.h" #include #include #include "wrn/coreip/net/ifaddrs.h" #include #include #define syslog(a, b) fdprintf(a, b); #else /* _WRS_KERNEL */ #include #endif /* _WRS_KERNEL */ #ifdef __NetBSD__ #include #include /* For struct in6_ifreq */ #include #include #endif /* __NetBSD__ */ #ifdef __OpenBSD__ #include #include #include #include #include #include #include /* For struct in6_ifreq */ #include #include #include #include #endif /* __OpenBSD__ */ #if defined __FreeBSD__ || defined __FreeBSD_kernel__ #include #include #include #include #ifndef FBSD_NO_80211 #include #include #endif /* FBSD_NO_80211 */ #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ */ #ifdef __APPLE__ #include #include #include #include #endif /* __APPLE__ */ #include #ifdef SPOOF #include #endif /* SPOOF */ #include static int ignore_redir; static int send_redir; static int gateway; static int set_sysctl_int(const char *name, int new) { int old; #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__NetBSD__) size_t len = sizeof(old); #else /* defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__NetBSD__) */ unsigned int len = sizeof(old); #endif /* defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__NetBSD__) */ #ifdef __OpenBSD__ int mib[4]; /* Set net.inet.ip.forwarding by default. */ mib[0] = CTL_NET; mib[1] = PF_INET; mib[2] = IPPROTO_IP; mib[3] = IPCTL_FORWARDING; if (!strcmp(name, "net.inet6.ip6.forwarding")) { mib[1] = PF_INET6; mib[2] = IPPROTO_IPV6; } else if (!strcmp(name, "net.inet.icmp.rediraccept")) { mib[2] = IPPROTO_ICMP; mib[3] = ICMPCTL_REDIRACCEPT; } else if (!strcmp(name, "net.inet6.icmp6.rediraccept")) { mib[2] = IPPROTO_ICMPV6; mib[3] = ICMPV6CTL_REDIRACCEPT; } else if (!strcmp(name, "net.inet.ip.redirect")) { mib[3] = IPCTL_SENDREDIRECTS; } else if (!strcmp(name, "net.inet6.ip6.redirect")) { mib[1] = PF_INET6; mib[2] = IPPROTO_IPV6; mib[3] = IPCTL_SENDREDIRECTS; } if (sysctl(mib, 4, &old, &len, &new, sizeof(new)) < 0) return -1; #else /* __OpenBSD__ */ if (sysctlbyname((const char *)name, &old, &len, &new, sizeof(new)) < 0) return -1; #endif /* __OpenBSD__ */ return old; } void net_os_set_global_ifoptions(void) { const char *name = olsr_cnf->ip_version == AF_INET ? "net.inet.ip.forwarding" : "net.inet6.ip6.forwarding"; gateway = set_sysctl_int(name, 1); if (gateway < 0) { fprintf(stderr, "Cannot enable IP forwarding. Please enable IP forwarding manually." " Continuing in 3 seconds...\n"); olsr_startup_sleep(3); } /* do not accept ICMP redirects */ #if defined(__OpenBSD__) || defined(__NetBSD__) if (olsr_cnf->ip_version == AF_INET) name = "net.inet.icmp.rediraccept"; else name = "net.inet6.icmp6.rediraccept"; ignore_redir = set_sysctl_int(name, 0); #elif defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ if (olsr_cnf->ip_version == AF_INET) { name = "net.inet.icmp.drop_redirect"; ignore_redir = set_sysctl_int(name, 1); } else { name = "net.inet6.icmp6.rediraccept"; ignore_redir = set_sysctl_int(name, 0); } #else /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ */ if (olsr_cnf->ip_version == AF_INET) name = "net.inet.icmp.drop_redirect"; else name = "net.inet6.icmp6.drop_redirect"; ignore_redir = set_sysctl_int(name, 1); #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ */ if (ignore_redir < 0) { fprintf(stderr, "Cannot disable incoming ICMP redirect messages. " "Please disable them manually. Continuing in 3 seconds...\n"); olsr_startup_sleep(3); } /* do not send ICMP redirects */ if (olsr_cnf->ip_version == AF_INET) name = "net.inet.ip.redirect"; else name = "net.inet6.ip6.redirect"; send_redir = set_sysctl_int(name, 0); if (send_redir < 0) { fprintf(stderr, "Cannot disable outgoing ICMP redirect messages. " "Please disable them manually. Continuing in 3 seconds...\n"); olsr_startup_sleep(3); } } int net_os_set_ifoptions(const char *if_name __attribute__ ((unused)), struct interface *iface __attribute__ ((unused))) { return -1; } int net_os_restore_ifoptions(void) { /* reset IP forwarding */ const char *name = olsr_cnf->ip_version == AF_INET ? "net.inet.ip.forwarding" : "net.inet6.ip6.forwarding"; set_sysctl_int(name, gateway); /* reset incoming ICMP redirects */ #ifdef __OpenBSD__ name = olsr_cnf->ip_version == AF_INET ? "net.inet.icmp.rediraccept" : "net.inet6.icmp6.rediraccept"; #elif defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ name = olsr_cnf->ip_version == AF_INET ? "net.inet.icmp.drop_redirect" : "net.inet6.icmp6.rediraccept"; #else /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ */ name = olsr_cnf->ip_version == AF_INET ? "net.inet.icmp.drop_redirect" : "net.inet6.icmp6.drop_redirect"; #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ */ set_sysctl_int(name, ignore_redir); /* reset outgoing ICMP redirects */ name = olsr_cnf->ip_version == AF_INET ? "net.inet.ip.redirect" : "net.inet6.ip6.redirect"; set_sysctl_int(name, send_redir); return 1; } /** *Creates a nonblocking broadcast socket. *@param pin sockaddr struct. Used for bind(2). *@return the FD of the socket or -1 on error. */ int gethemusocket(struct sockaddr_in *pin) { int sock, on = 1; OLSR_PRINTF(1, " Connecting to switch daemon port 10150..."); if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("hcsocket"); syslog(LOG_ERR, "hcsocket: %m"); return (-1); } if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) { perror("SO_REUSEADDR failed"); close(sock); return (-1); } /* connect to PORT on HOST */ if (connect(sock, (struct sockaddr *)pin, sizeof(*pin)) < 0) { printf("FAILED\n"); fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno)); printf("connection refused\n"); close(sock); return (-1); } printf("OK\n"); /* Keep TCP socket blocking */ return (sock); } int getsocket(int bufspace, struct interface *ifp __attribute__ ((unused))) { struct sockaddr_in sin; int on; int sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { perror("socket"); syslog(LOG_ERR, "socket: %m"); return -1; } on = 1; if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&on, sizeof(on)) < 0) { perror("setsockopt"); syslog(LOG_ERR, "setsockopt SO_BROADCAST: %m"); close(sock); return -1; } if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) { perror("SO_REUSEADDR failed"); close(sock); return -1; } if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (char *)&on, sizeof(on)) < 0) { perror("SO_REUSEPORT failed"); close(sock); return -1; } if (setsockopt(sock, IPPROTO_IP, IP_RECVIF, (char *)&on, sizeof(on)) < 0) { perror("IP_RECVIF failed"); close(sock); return -1; } if(bufspace > 0) { for (on = bufspace;; on -= 1024) { if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&on, sizeof(on)) == 0) break; if (on <= 8 * 1024) { perror("setsockopt"); syslog(LOG_ERR, "setsockopt SO_RCVBUF: %m"); break; } } } memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(olsr_cnf->olsrport); if(bufspace <= 0) { sin.sin_addr.s_addr = ifp->int_addr.sin_addr.s_addr; } if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) { perror("bind"); syslog(LOG_ERR, "bind: %m"); close(sock); return -1; } on = fcntl(sock, F_GETFL); if (on == -1) { syslog(LOG_ERR, "fcntl (F_GETFL): %m\n"); } else { if (fcntl(sock, F_SETFL, on | O_NONBLOCK) == -1) { syslog(LOG_ERR, "fcntl O_NONBLOCK: %m\n"); } } return (sock); } int getsocket6(int bufspace, struct interface *ifp __attribute__ ((unused))) { struct sockaddr_in6 sin; int on; int sock = socket(AF_INET6, SOCK_DGRAM, 0); if (sock < 0) { perror("socket"); syslog(LOG_ERR, "socket: %m"); return -1; } if(bufspace > 0) { for (on = bufspace;; on -= 1024) { if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&on, sizeof(on)) == 0) break; if (on <= 8 * 1024) { perror("setsockopt"); syslog(LOG_ERR, "setsockopt SO_RCVBUF: %m"); break; } } } if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) { perror("SO_REUSEADDR failed"); close(sock); return -1; } if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (char *)&on, sizeof(on)) < 0) { perror("SO_REUSEPORT failed"); close(sock); return -1; } #ifdef IPV6_RECVPKTINFO if (setsockopt(sock, IPPROTO_IPV6, IPV6_RECVPKTINFO, (char *)&on, sizeof(on)) < 0) { perror("IPV6_RECVPKTINFO failed"); close(sock); return -1; } #elif defined IPV6_PKTINFO if (setsockopt(sock, IPPROTO_IPV6, IPV6_PKTINFO, (char *)&on, sizeof(on)) < 0) { perror("IPV6_PKTINFO failed"); close(sock); return -1; } #endif /* defined IPV6_PKTINFO */ memset(&sin, 0, sizeof(sin)); sin.sin6_family = AF_INET6; sin.sin6_port = htons(olsr_cnf->olsrport); if(bufspace <= 0) { memcpy(&sin.sin6_addr, &ifp->int6_addr.sin6_addr, sizeof(struct in6_addr)); } if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) { perror("bind"); syslog(LOG_ERR, "bind: %m"); close(sock); return -1; } on = fcntl(sock, F_GETFL); if (on == -1) { syslog(LOG_ERR, "fcntl (F_GETFL): %m\n"); } else { if (fcntl(sock, F_SETFL, on | O_NONBLOCK) == -1) { syslog(LOG_ERR, "fcntl O_NONBLOCK: %m\n"); } } return sock; } int join_mcast(struct interface *ifs, int sock) { /* See netinet6/in6.h */ struct ipaddr_str addrstr; struct ipv6_mreq mcastreq; #ifdef IPV6_USE_MIN_MTU int on; #endif /* IPV6_USE_MIN_MTU */ mcastreq.ipv6mr_multiaddr = ifs->int6_multaddr.sin6_addr; mcastreq.ipv6mr_interface = ifs->if_index; if (ifs->olsr_socket == sock) { OLSR_PRINTF(3, "Interface %s joining multicast %s...", ifs->int_name, olsr_ip_to_string(&addrstr, (union olsr_ip_addr *)&ifs->int6_multaddr.sin6_addr)); /* rfc 3493 */ #ifdef IPV6_JOIN_GROUP /* Join receiver group */ if (setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&mcastreq, sizeof(struct ipv6_mreq)) < 0) #else /* IPV6_JOIN_GROUP */ /* rfc 2133, obsoleted */ /* Join receiver group */ if (setsockopt(sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&mcastreq, sizeof(struct ipv6_mreq)) < 0) #endif /* IPV6_JOIN_GROUP */ { perror("Join multicast send"); return -1; } } if (setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *)&mcastreq.ipv6mr_interface, sizeof(mcastreq.ipv6mr_interface)) < 0) { perror("Set multicast if"); return -1; } #ifdef IPV6_USE_MIN_MTU /* * This allow multicast packets to use the full interface MTU and not * be limited to 1280 bytes. */ on = 0; if (setsockopt(sock, IPPROTO_IPV6, IPV6_USE_MIN_MTU, (char *)&on, sizeof(on)) < 0) { perror("IPV6_USE_MIN_MTU failed"); close(sock); return -1; } #endif /* IPV6_USE_MIN_MTU */ OLSR_PRINTF(3, "OK\n"); return 0; } int get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, struct olsr_ip_prefix *prefix) { struct ifaddrs *ifap, *ifa; const struct sockaddr_in6 *sin6 = NULL; const union olsr_ip_addr *tmp_ip; struct in6_ifreq ifr6; int found = 0; int s6; u_int32_t flags6; if (getifaddrs(&ifap) != 0) { OLSR_PRINTF(3, "get_ipv6_address: getifaddrs() failed.\n"); return 0; } for (ifa = ifap; ifa; ifa = ifa->ifa_next) { if ((ifa->ifa_addr->sa_family == AF_INET6) && (strcmp(ifa->ifa_name, ifname) == 0)) { sin6 = (const struct sockaddr_in6 *)(ifa->ifa_addr); if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) continue; strscpy(ifr6.ifr_name, ifname, sizeof(ifr6.ifr_name)); if ((s6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { OLSR_PRINTF(3, "socket(AF_INET6,SOCK_DGRAM)"); break; } ifr6.ifr_addr = *sin6; if (ioctl(s6, SIOCGIFAFLAG_IN6, &ifr6) < 0) { OLSR_PRINTF(3, "ioctl(SIOCGIFAFLAG_IN6)"); close(s6); break; } close(s6); flags6 = ifr6.ifr_ifru.ifru_flags6; if ((flags6 & IN6_IFF_ANYCAST) != 0) continue; tmp_ip = (const union olsr_ip_addr *) &sin6->sin6_addr; if ((prefix == NULL && !IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) || (prefix != NULL && ip_in_net(tmp_ip, prefix))) { memcpy(&saddr6->sin6_addr, &sin6->sin6_addr, sizeof(struct in6_addr)); found = 1; break; } } } freeifaddrs(ifap); if (found) return 1; return 0; } /** * Wrapper for sendto(2) */ #ifdef SPOOF static u_int16_t ip_id = 0; #endif /* SPOOF */ ssize_t olsr_sendto(int s, const void *buf, size_t len, int flags __attribute__ ((unused)), const struct sockaddr *to, socklen_t tolen) { #ifdef SPOOF /* IPv4 for now! */ libnet_t *context; char errbuf[LIBNET_ERRBUF_SIZE]; libnet_ptag_t udp_tag, ip_tag, ether_tag; unsigned char enet_broadcast[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; int status; struct sockaddr_in *to_in = (struct sockaddr_in *)to; u_int32_t destip; struct interface *iface; udp_tag = ip_tag = ether_tag = 0; destip = to_in->sin_addr.s_addr; iface = if_ifwithsock(s); /* initialize libnet */ context = libnet_init(LIBNET_LINK, iface->int_name, errbuf); if (context == NULL) { OLSR_PRINTF(1, "libnet init: %s\n", libnet_geterror(context)); return (0); } /* initialize IP ID field if necessary */ if (ip_id == 0) { ip_id = (u_int16_t) (arc4random() & 0xffff); } udp_tag = libnet_build_udp(olsr_cnf->olsrport, /* src port */ olsr_cnf->olsrport, /* dest port */ LIBNET_UDP_H + len, /* length */ 0, /* checksum */ buf, /* payload */ len, /* payload size */ context, /* context */ udp_tag); /* pblock */ if (udp_tag == -1) { OLSR_PRINTF(1, "libnet UDP header: %s\n", libnet_geterror(context)); return (0); } ip_tag = libnet_build_ipv4(LIBNET_IPV4_H + LIBNET_UDP_H + len, /* len */ 0, /* TOS */ ip_id++, /* IP id */ 0, /* IP frag */ 1, /* IP TTL */ IPPROTO_UDP, /* protocol */ 0, /* checksum */ libnet_get_ipaddr4(context), /* src IP */ destip, /* dest IP */ NULL, /* payload */ 0, /* payload len */ context, /* context */ ip_tag); /* pblock */ if (ip_tag == -1) { OLSR_PRINTF(1, "libnet IP header: %s\n", libnet_geterror(context)); return (0); } ether_tag = libnet_build_ethernet(enet_broadcast, /* ethernet dest */ libnet_get_hwaddr(context), /* ethernet source */ ETHERTYPE_IP, /* protocol type */ NULL, /* payload */ 0, /* payload size */ context, /* libnet handle */ ether_tag); /* pblock tag */ if (ether_tag == -1) { OLSR_PRINTF(1, "libnet ethernet header: %s\n", libnet_geterror(context)); return (0); } status = libnet_write(context); if (status == -1) { OLSR_PRINTF(1, "libnet packet write: %s\n", libnet_geterror(context)); return (0); } libnet_destroy(context); return (len); #else /* SPOOF */ return sendto(s, buf, len, flags, (const struct sockaddr *)to, tolen); #endif /* SPOOF */ } /** * Wrapper for recvfrom(2) */ ssize_t olsr_recvfrom(int s, void *buf, size_t len, int flags __attribute__ ((unused)), struct sockaddr *from, socklen_t * fromlen) { struct msghdr mhdr; struct iovec iov; union { struct cmsghdr cmsg; unsigned char chdr[4096]; } cmu; struct cmsghdr *cm; struct sockaddr_dl *sdl; struct sockaddr_in *sin = (struct sockaddr_in *)from; struct sockaddr_in6 *sin6; struct in6_addr *iaddr6; struct in6_pktinfo *pkti; struct interface *ifc; char addrstr[INET6_ADDRSTRLEN]; char iname[IFNAMSIZ]; int count; memset(&mhdr, 0, sizeof(mhdr)); memset(&iov, 0, sizeof(iov)); mhdr.msg_name = (caddr_t) from; mhdr.msg_namelen = *fromlen; mhdr.msg_iov = &iov; mhdr.msg_iovlen = 1; mhdr.msg_control = (caddr_t) & cmu; mhdr.msg_controllen = sizeof(cmu); iov.iov_len = len; iov.iov_base = buf; count = recvmsg(s, &mhdr, MSG_DONTWAIT); if (count <= 0) { return (count); } /* this needs to get communicated back to caller */ *fromlen = mhdr.msg_namelen; if (olsr_cnf->ip_version == AF_INET6) { for (cm = (struct cmsghdr *)CMSG_FIRSTHDR(&mhdr); cm; cm = (struct cmsghdr *)CMSG_NXTHDR(&mhdr, cm)) { if (cm->cmsg_level == IPPROTO_IPV6 && cm->cmsg_type == IPV6_PKTINFO) { pkti = (struct in6_pktinfo *)CMSG_DATA(cm); iaddr6 = &pkti->ipi6_addr; if_indextoname(pkti->ipi6_ifindex, iname); } } } else { cm = &cmu.cmsg; sdl = (struct sockaddr_dl *)CMSG_DATA(cm); memset(iname, 0, sizeof(iname)); memcpy(iname, sdl->sdl_data, sdl->sdl_nlen); } ifc = if_ifwithsock(s); sin6 = (struct sockaddr_in6 *)from; OLSR_PRINTF(4, "%d bytes from %s, socket associated %s really received on %s\n", count, inet_ntop(olsr_cnf->ip_version, olsr_cnf->ip_version == AF_INET6 ? (char *)&sin6->sin6_addr : (char *)&sin->sin_addr, addrstr, sizeof(addrstr)), ifc->int_name, iname); #ifndef __NetBSD__ if (strcmp(ifc->int_name, iname) != 0) { return (0); } #endif /* __NetBSD__ */ return (count); } /** * Wrapper for select(2) */ int olsr_select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval *timeout) { return select(nfds, readfds, writefds, exceptfds, timeout); } int check_wireless_interface(char *ifname) { #if (defined __FreeBSD__ || defined __FreeBSD_kernel__ ) && !defined FBSD_NO_80211 /* From FreeBSD ifconfig/ifieee80211.c ieee80211_status() */ struct ieee80211req ireq; u_int8_t data[32]; memset(&ireq, 0, sizeof(ireq)); strscpy(ireq.i_name, ifname, sizeof(ireq.i_name)); ireq.i_data = &data; ireq.i_type = IEEE80211_IOC_SSID; ireq.i_val = -1; return (ioctl(olsr_cnf->ioctl_s, SIOCG80211, &ireq) >= 0) ? 1 : 0; #elif defined __OpenBSD__ struct ieee80211_nodereq nr; bzero(&nr, sizeof(nr)); strscpy(nr.nr_ifname, ifname, sizeof(nr.nr_ifname)); return (ioctl(olsr_cnf->ioctl_s, SIOCG80211FLAGS, &nr) >= 0) ? 1 : 0; #elif defined __NetBSD__ struct ifreq ireq; struct ieee80211_nwid data; int ret; memset(&ireq, 0, sizeof(ireq)); strscpy(ireq.ifr_name, ifname, sizeof(ireq.ifr_name)); ireq.ifr_data = &data; ret = ioctl(olsr_cnf->ioctl_s, SIOCG80211NWID, &ireq); if(ret == 0) return 1; return 0; #else /* defined __NetBSD__ */ ifname = NULL; /* squelsh compiler warning */ return 0; #endif /* defined __NetBSD__ */ } #include int calculate_if_metric(char *ifname) { if (check_wireless_interface(ifname)) { /* Wireless */ return 1; } else { /* Ethernet */ return WEIGHT_ETHERNET_DEFAULT; } } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/build_msg.c000066400000000000000000001002551234304727700157220ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "build_msg.h" #include "ipcalc.h" #include "olsr.h" #include "log.h" #include "mantissa.h" #include "net_olsr.h" #include "gateway.h" #define BMSG_DBGLVL 5 #define OLSR_IPV4_HDRSIZE 12 #define OLSR_IPV6_HDRSIZE 24 #define OLSR_HELLO_IPV4_HDRSIZE (OLSR_IPV4_HDRSIZE + 4) #define OLSR_HELLO_IPV6_HDRSIZE (OLSR_IPV6_HDRSIZE + 4) #define OLSR_TC_IPV4_HDRSIZE (OLSR_IPV4_HDRSIZE + 4) #define OLSR_TC_IPV6_HDRSIZE (OLSR_IPV6_HDRSIZE + 4) #define OLSR_MID_IPV4_HDRSIZE OLSR_IPV4_HDRSIZE #define OLSR_MID_IPV6_HDRSIZE OLSR_IPV6_HDRSIZE #define OLSR_HNA_IPV4_HDRSIZE OLSR_IPV4_HDRSIZE #define OLSR_HNA_IPV6_HDRSIZE OLSR_IPV6_HDRSIZE static void check_buffspace(int msgsize, int buffsize, const char *type); /* All these functions share this buffer */ static uint32_t msg_buffer_align[(MAXMESSAGESIZE - OLSR_HEADERSIZE)/sizeof(uint32_t) + 1]; static uint8_t *msg_buffer = (uint8_t *)msg_buffer_align; static uint32_t send_empty_tc; /* TC empty message sending */ /* Prototypes for internal functions */ /* IPv4 */ static bool serialize_hello4(struct hello_message *, struct interface *); static bool serialize_tc4(struct tc_message *, struct interface *); static bool serialize_mid4(struct interface *); static bool serialize_hna4(struct interface *); /* IPv6 */ static bool serialize_hello6(struct hello_message *, struct interface *); static bool serialize_tc6(struct tc_message *, struct interface *); static bool serialize_mid6(struct interface *); static bool serialize_hna6(struct interface *); /** * Set the timer that controls the generation of * empty TC messages */ void set_empty_tc_timer(uint32_t empty_tc_new) { send_empty_tc = empty_tc_new; } /** * Get the timer that controls the generation of * empty TC messages */ uint32_t get_empty_tc_timer(void) { return send_empty_tc; } /** * Generate HELLO packet with the contents of the parameter "message". * If this won't fit in one packet, chop it up into several. * Send the packet if the size of the data contained in the output buffer * reach maxmessagesize. Can generate an empty HELLO packet if the * neighbor table is empty. * * *@param message the hello_message struct containing the info *to build the hello message from. *@param ifp the interface to send the message on * *@return nada */ bool queue_hello(struct hello_message * message, struct interface * ifp) { #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "Building HELLO on %s\n-------------------\n", ifp->int_name); #endif /* DEBUG */ switch (olsr_cnf->ip_version) { case (AF_INET6): return serialize_hello6(message, ifp); case (AF_INET): default: return serialize_hello4(message, ifp); } return false; } /* * Generate TC packet with the contents of the parameter "message". * If this won't fit in one packet, chop it up into several. * Send the packet if the size of the data contained in the output buffer * reach maxmessagesize. * *@param message the tc_message struct containing the info *to send *@param ifp the interface to send the message on * *@return nada */ bool queue_tc(struct tc_message * message, struct interface * ifp) { #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "Building TC on %s\n-------------------\n", ifp->int_name); #endif /* DEBUG */ switch (olsr_cnf->ip_version) { case (AF_INET6): return serialize_tc6(message, ifp); case (AF_INET): default: return serialize_tc4(message, ifp); } return false; } /** *Build a MID message to the outputbuffer * *NO INTERNAL BUFFER *@param ifp a pointer to the interface with the main address *@return 1 on success */ bool queue_mid(struct interface * ifp) { #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "Building MID on %s\n-------------------\n", ifp->int_name); #endif /* DEBUG */ switch (olsr_cnf->ip_version) { case (AF_INET6): return serialize_mid6(ifp); case (AF_INET): default: return serialize_mid4(ifp); } return false; } /** *Builds a HNA message in the outputbuffer *NB! Not internal packetformat! * *@param ifp the interface to send on *@return nada */ bool queue_hna(struct interface * ifp) { #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "Building HNA on %s\n-------------------\n", ifp->int_name); #endif /* DEBUG */ switch (olsr_cnf->ip_version) { case (AF_INET6): return serialize_hna6(ifp); case (AF_INET): default: return serialize_hna4(ifp); } return false; } /* * Protocol specific versions */ static void check_buffspace(int msgsize, int buffsize, const char *type) { if (msgsize > buffsize) { OLSR_PRINTF(1, "%s build, outputbuffer to small(%d/%u)!\n", type, msgsize, buffsize); olsr_syslog(OLSR_LOG_ERR, "%s build, outputbuffer to small(%d/%u)!\n", type, msgsize, buffsize); olsr_exit(__func__, EXIT_FAILURE); } } /** * IP version 4 * *@param message the hello_message struct containing the info *to build the hello message from. *@param ifp the interface to send the message on * *@return nada */ static bool serialize_hello4(struct hello_message *message, struct interface *ifp) { uint16_t remainsize, curr_size; struct hello_neighbor *nb; union olsr_message *m; struct hellomsg *h; struct hellinfo *hinfo; char *haddr; int i, j; bool first_entry; if ((!message) || (!ifp) || (olsr_cnf->ip_version != AF_INET)) return false; remainsize = net_outbuffer_bytes_left(ifp); m = (union olsr_message *)msg_buffer; curr_size = OLSR_HELLO_IPV4_HDRSIZE; /* Send pending packet if not room in buffer */ if (curr_size > remainsize) { net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); } /* Sanity check */ check_buffspace(curr_size, remainsize, "HELLO"); h = &m->v4.message.hello; hinfo = h->hell_info; haddr = (char *)hinfo->neigh_addr; /* Fill message header */ m->v4.ttl = message->ttl; m->v4.hopcnt = 0; m->v4.olsr_msgtype = HELLO_MESSAGE; /* Set source(main) addr */ m->v4.originator = olsr_cnf->main_addr.v4.s_addr; m->v4.olsr_vtime = ifp->valtimes.hello; /* Fill HELLO header */ h->willingness = message->willingness; h->htime = reltime_to_me(ifp->hello_etime); memset(&h->reserved, 0, sizeof(uint16_t)); /* *Loops trough all possible neighbor statuses *The neighbor list is grouped by status * */ /* Neighbor statuses */ for (i = 0; i <= MAX_NEIGH; i++) { /* Link statuses */ for (j = 0; j <= MAX_LINK; j++) { #ifdef DEBUG struct ipaddr_str buf; #endif /* DEBUG */ /* HYSTERESIS - Not adding neighbors with link type HIDE */ if (j == HIDE_LINK) continue; first_entry = true; /* Looping trough neighbors */ for (nb = message->neighbors; nb != NULL; nb = nb->next) { if ((nb->status != i) || (nb->link != j)) continue; #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "\t%s - ", olsr_ip_to_string(&buf, &nb->address)); OLSR_PRINTF(BMSG_DBGLVL, "L:%d N:%d\n", j, i); #endif /* DEBUG */ /* * If there is not enough room left * for the data in the outputbuffer * we must send a partial HELLO and * continue building the rest of the * data in a new HELLO message * * If this is the first neighbor in * a group, we must check for an extra * 4 bytes */ if ((curr_size + olsr_cnf->ipsize + (first_entry ? 4 : 0)) > remainsize) { /* Only send partial HELLO if it contains data */ if (curr_size > OLSR_HELLO_IPV4_HDRSIZE) { #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "Sending partial(size: %d, buff left:%d)\n", curr_size, remainsize); #endif /* DEBUG */ /* Complete the headers */ m->v4.seqno = htons(get_msg_seqno()); m->v4.olsr_msgsize = htons(curr_size); hinfo->size = htons((char *)haddr - (char *)hinfo); /* Send partial packet */ net_outbuffer_push(ifp, msg_buffer, curr_size); curr_size = OLSR_HELLO_IPV4_HDRSIZE; h = &m->v4.message.hello; hinfo = h->hell_info; haddr = (char *)hinfo->neigh_addr; /* Make sure typeheader is added */ first_entry = true; } net_output(ifp); /* Reset size and pointers */ remainsize = net_outbuffer_bytes_left(ifp); /* Sanity check */ check_buffspace(curr_size + olsr_cnf->ipsize + 4, remainsize, "HELLO2"); } if (first_entry) { memset(&hinfo->reserved, 0, sizeof(uint8_t)); /* Set link and status for this group of neighbors (this is the first) */ hinfo->link_code = CREATE_LINK_CODE(i, j); curr_size += 4; /* HELLO type section header */ } memcpy(haddr, &nb->address, sizeof(union olsr_ip_addr)); /* Point to next address */ haddr += olsr_cnf->ipsize; curr_size += olsr_cnf->ipsize; /* IP address added */ first_entry = false; } if (!first_entry) { hinfo->size = htons((char *)haddr - (char *)hinfo); hinfo = (struct hellinfo *)((char *)haddr); haddr = (char *)hinfo->neigh_addr; } } /* for j */ } /* for i */ m->v4.seqno = htons(get_msg_seqno()); m->v4.olsr_msgsize = htons(curr_size); net_outbuffer_push(ifp, msg_buffer, curr_size); /* HELLO will always be generated */ return true; } /** * IP version 6 * *@param message the hello_message struct containing the info *to build the hello message from. *@param ifp the interface to send the message on * *@return nada */ static bool serialize_hello6(struct hello_message *message, struct interface *ifp) { uint16_t remainsize, curr_size; struct hello_neighbor *nb; union olsr_message *m; struct hellomsg6 *h6; struct hellinfo6 *hinfo6; union olsr_ip_addr *haddr; int i, j; bool first_entry; if ((!message) || (!ifp) || (olsr_cnf->ip_version != AF_INET6)) return false; remainsize = net_outbuffer_bytes_left(ifp); m = (union olsr_message *)msg_buffer; curr_size = OLSR_HELLO_IPV6_HDRSIZE; /* OLSR message header */ /* Send pending packet if not room in buffer */ if (curr_size > remainsize) { net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); } check_buffspace(curr_size + olsr_cnf->ipsize + 4, remainsize, "HELLO"); h6 = &m->v6.message.hello; hinfo6 = h6->hell_info; haddr = (union olsr_ip_addr *)hinfo6->neigh_addr; /* Fill message header */ m->v6.ttl = message->ttl; m->v6.hopcnt = 0; /* Set source(main) addr */ m->v6.originator = olsr_cnf->main_addr.v6; m->v6.olsr_msgtype = HELLO_MESSAGE; m->v6.olsr_vtime = ifp->valtimes.hello; /* Fill packet header */ h6->willingness = message->willingness; h6->htime = reltime_to_me(ifp->hello_etime); memset(&h6->reserved, 0, sizeof(uint16_t)); /* *Loops trough all possible neighbor statuses *The negbor list is grouped by status */ for (i = 0; i <= MAX_NEIGH; i++) { for (j = 0; j <= MAX_LINK; j++) { #ifdef DEBUG struct ipaddr_str buf; #endif /* DEBUG */ first_entry = true; /* *Looping trough neighbors */ for (nb = message->neighbors; nb != NULL; nb = nb->next) { if ((nb->status != i) || (nb->link != j)) continue; #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "\t%s - ", olsr_ip_to_string(&buf, &nb->address)); OLSR_PRINTF(BMSG_DBGLVL, "L:%d N:%d\n", j, i); #endif /* DEBUG */ /* * If there is not enough room left * for the data in the outputbuffer * we must send a partial HELLO and * continue building the rest of the * data in a new HELLO message * * If this is the first neighbor in * a group, we must check for an extra * 4 bytes */ if ((curr_size + olsr_cnf->ipsize + (first_entry ? 4 : 0)) > remainsize) { /* Only send partial HELLO if it contains data */ if (curr_size > OLSR_HELLO_IPV6_HDRSIZE) { #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "Sending partial(size: %d, buff left:%d)\n", curr_size, remainsize); #endif /* DEBUG */ /* Complete the headers */ m->v6.seqno = htons(get_msg_seqno()); m->v6.olsr_msgsize = htons(curr_size); hinfo6->size = (char *)haddr - (char *)hinfo6; hinfo6->size = htons(hinfo6->size); /* Send partial packet */ net_outbuffer_push(ifp, msg_buffer, curr_size); curr_size = OLSR_HELLO_IPV6_HDRSIZE; h6 = &m->v6.message.hello; hinfo6 = h6->hell_info; haddr = (union olsr_ip_addr *)hinfo6->neigh_addr; /* Make sure typeheader is added */ first_entry = true; } net_output(ifp); /* Reset size and pointers */ remainsize = net_outbuffer_bytes_left(ifp); check_buffspace(curr_size + olsr_cnf->ipsize + 4, remainsize, "HELLO2"); } if (first_entry) { memset(&hinfo6->reserved, 0, sizeof(uint8_t)); /* Set link and status for this group of neighbors (this is the first) */ hinfo6->link_code = CREATE_LINK_CODE(i, j); curr_size += 4; /* HELLO type section header */ } *haddr = nb->address; /* Point to next address */ haddr++; curr_size += olsr_cnf->ipsize; /* IP address added */ first_entry = false; } /* looping trough neighbors */ if (!first_entry) { hinfo6->size = htons((char *)haddr - (char *)hinfo6); hinfo6 = (struct hellinfo6 *)((char *)haddr); haddr = (union olsr_ip_addr *)&hinfo6->neigh_addr; } } /* for j */ } /* for i */ m->v6.seqno = htons(get_msg_seqno()); m->v6.olsr_msgsize = htons(curr_size); net_outbuffer_push(ifp, msg_buffer, curr_size); /* HELLO is always buildt */ return true; } /** *IP version 4 * *@param message the tc_message struct containing the info *to send *@param ifp the interface to send the message on * *@return nada */ static bool serialize_tc4(struct tc_message *message, struct interface *ifp) { #ifdef DEBUG struct ipaddr_str buf; #endif /* DEBUG */ uint16_t remainsize, curr_size; struct tc_mpr_addr *mprs; union olsr_message *m; struct olsr_tcmsg *tc; struct neigh_info *mprsaddr; bool found = false, partial_sent = false; if ((!message) || (!ifp) || (olsr_cnf->ip_version != AF_INET)) return false; remainsize = net_outbuffer_bytes_left(ifp); m = (union olsr_message *)msg_buffer; tc = &m->v4.message.tc; mprsaddr = tc->neigh; curr_size = OLSR_TC_IPV4_HDRSIZE; /* Send pending packet if not room in buffer */ if (curr_size > remainsize) { net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); } check_buffspace(curr_size, remainsize, "TC"); /* Fill header */ m->v4.olsr_vtime = ifp->valtimes.tc; m->v4.olsr_msgtype = TC_MESSAGE; m->v4.hopcnt = message->hop_count; m->v4.ttl = message->ttl; m->v4.originator = message->originator.v4.s_addr; /* Fill TC header */ tc->ansn = htons(message->ansn); tc->reserved = 0; /*Looping trough MPR selectors */ for (mprs = message->multipoint_relay_selector_address; mprs != NULL; mprs = mprs->next) { /*If packet is to be chomped */ if ((curr_size + olsr_cnf->ipsize) > remainsize) { /* Only add TC message if it contains data */ if (curr_size > OLSR_TC_IPV4_HDRSIZE) { #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "Sending partial(size: %d, buff left:%d)\n", curr_size, remainsize); #endif /* DEBUG */ m->v4.olsr_msgsize = htons(curr_size); m->v4.seqno = htons(get_msg_seqno()); net_outbuffer_push(ifp, msg_buffer, curr_size); /* Reset stuff */ mprsaddr = tc->neigh; curr_size = OLSR_TC_IPV4_HDRSIZE; found = false; partial_sent = true; } net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); check_buffspace(curr_size + olsr_cnf->ipsize, remainsize, "TC2"); } found = true; #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "\t%s\n", olsr_ip_to_string(&buf, &mprs->address)); #endif /* DEBUG */ mprsaddr->addr = mprs->address.v4.s_addr; curr_size += olsr_cnf->ipsize; mprsaddr++; } if (found) { m->v4.olsr_msgsize = htons(curr_size); m->v4.seqno = htons(get_msg_seqno()); net_outbuffer_push(ifp, msg_buffer, curr_size); } else { if ((!partial_sent) && (!TIMED_OUT(send_empty_tc))) { if (!TIMED_OUT(send_empty_tc)) OLSR_PRINTF(1, "TC: Sending empty package - (%d/%d/%d/%d)\n", partial_sent, (int)send_empty_tc, (int)now_times, (int)((send_empty_tc) - now_times)); m->v4.olsr_msgsize = htons(curr_size); m->v4.seqno = htons(get_msg_seqno()); net_outbuffer_push(ifp, msg_buffer, curr_size); found = true; } } return found; } /** *IP version 6 * *@param message the tc_message struct containing the info *to send *@param ifp the interface to send the message on * *@return nada */ static bool serialize_tc6(struct tc_message *message, struct interface *ifp) { #ifdef DEBUG struct ipaddr_str buf; #endif /* DEBUG */ uint16_t remainsize, curr_size; struct tc_mpr_addr *mprs; union olsr_message *m; struct olsr_tcmsg6 *tc6; struct neigh_info6 *mprsaddr6; bool found = false, partial_sent = false; if ((!message) || (!ifp) || (olsr_cnf->ip_version != AF_INET6)) return false; remainsize = net_outbuffer_bytes_left(ifp); m = (union olsr_message *)msg_buffer; tc6 = &m->v6.message.tc; mprsaddr6 = tc6->neigh; curr_size = OLSR_TC_IPV6_HDRSIZE; /* Send pending packet if not room in buffer */ if (curr_size > remainsize) { net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); } check_buffspace(curr_size, remainsize, "TC"); /* Fill header */ m->v6.olsr_vtime = ifp->valtimes.tc; m->v6.olsr_msgtype = TC_MESSAGE; m->v6.hopcnt = message->hop_count; m->v6.ttl = message->ttl; m->v6.originator = message->originator.v6; /* Fill TC header */ tc6->ansn = htons(message->ansn); tc6->reserved = 0; /*Looping trough MPR selectors */ for (mprs = message->multipoint_relay_selector_address; mprs != NULL; mprs = mprs->next) { /*If packet is to be chomped */ if ((curr_size + olsr_cnf->ipsize) > remainsize) { /* Only add TC message if it contains data */ if (curr_size > OLSR_TC_IPV6_HDRSIZE) { #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "Sending partial(size: %d, buff left:%d)\n", curr_size, remainsize); #endif /* DEBUG */ m->v6.olsr_msgsize = htons(curr_size); m->v6.seqno = htons(get_msg_seqno()); net_outbuffer_push(ifp, msg_buffer, curr_size); mprsaddr6 = tc6->neigh; curr_size = OLSR_TC_IPV6_HDRSIZE; found = false; partial_sent = true; } net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); check_buffspace(curr_size + olsr_cnf->ipsize, remainsize, "TC2"); } found = true; #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "\t%s\n", olsr_ip_to_string(&buf, &mprs->address)); #endif /* DEBUG */ mprsaddr6->addr = mprs->address.v6; curr_size += olsr_cnf->ipsize; mprsaddr6++; } if (found) { m->v6.olsr_msgsize = htons(curr_size); m->v6.seqno = htons(get_msg_seqno()); net_outbuffer_push(ifp, msg_buffer, curr_size); } else { if ((!partial_sent) && (!TIMED_OUT(send_empty_tc))) { OLSR_PRINTF(1, "TC: Sending empty package\n"); m->v6.olsr_msgsize = htons(curr_size); m->v6.seqno = htons(get_msg_seqno()); net_outbuffer_push(ifp, msg_buffer, curr_size); found = true; } } return found; } /** *IP version 4 * *NO INTERNAL BUFFER *@param ifp use this interfaces address as main address *@return 1 on success */ static bool serialize_mid4(struct interface *ifp) { uint16_t remainsize, curr_size, needsize; /* preserve existing data in output buffer */ union olsr_message *m; struct midaddr *addrs; struct interface *ifs; if ((olsr_cnf->ip_version != AF_INET) || (!ifp) || (ifnet == NULL) || ((ifnet->int_next == NULL) && (ipequal(&olsr_cnf->main_addr, &ifnet->ip_addr)))) return false; remainsize = net_outbuffer_bytes_left(ifp); m = (union olsr_message *)msg_buffer; curr_size = OLSR_MID_IPV4_HDRSIZE; /* calculate size needed for HNA */ needsize = curr_size; for (ifs = ifnet; ifs != NULL; ifs = ifs->int_next) { needsize += olsr_cnf->ipsize*2; } /* Send pending packet if not room in buffer */ if (needsize > remainsize) { net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); } check_buffspace(curr_size, remainsize, "MID"); /* Fill header */ m->v4.hopcnt = 0; m->v4.ttl = MAX_TTL; /* Set main(first) address */ m->v4.originator = olsr_cnf->main_addr.v4.s_addr; m->v4.olsr_msgtype = MID_MESSAGE; m->v4.olsr_vtime = ifp->valtimes.mid; addrs = m->v4.message.mid.mid_addr; /* Don't add the main address... it's already there */ for (ifs = ifnet; ifs != NULL; ifs = ifs->int_next) { if (!ipequal(&olsr_cnf->main_addr, &ifs->ip_addr)) { #ifdef DEBUG struct ipaddr_str buf; #endif /* DEBUG */ if ((curr_size + olsr_cnf->ipsize) > remainsize) { /* Only add MID message if it contains data */ if (curr_size > OLSR_MID_IPV4_HDRSIZE) { #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "Sending partial(size: %d, buff left:%d)\n", curr_size, remainsize); #endif /* DEBUG */ /* set size */ m->v4.olsr_msgsize = htons(curr_size); m->v4.seqno = htons(get_msg_seqno()); /* seqnumber */ net_outbuffer_push(ifp, msg_buffer, curr_size); curr_size = OLSR_MID_IPV4_HDRSIZE; addrs = m->v4.message.mid.mid_addr; } net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); check_buffspace(curr_size, remainsize, "MID2"); } #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "\t%s(%s)\n", olsr_ip_to_string(&buf, &ifs->ip_addr), ifs->int_name); #endif /* DEBUG */ addrs->addr = ifs->ip_addr.v4.s_addr; addrs++; curr_size += olsr_cnf->ipsize; } } m->v4.seqno = htons(get_msg_seqno()); /* seqnumber */ m->v4.olsr_msgsize = htons(curr_size); //printf("Sending MID (%d bytes)...\n", outputsize); if (curr_size > OLSR_MID_IPV4_HDRSIZE) net_outbuffer_push(ifp, msg_buffer, curr_size); return true; } /** *IP version 6 * *NO INTERNAL BUFFER *@param ifp use this interfaces address as main address *@return 1 on success */ static bool serialize_mid6(struct interface *ifp) { uint16_t remainsize, curr_size, needsize; /* preserve existing data in output buffer */ union olsr_message *m; struct midaddr6 *addrs6; struct interface *ifs; //printf("\t\tGenerating mid on %s\n", ifn->int_name); if ((olsr_cnf->ip_version != AF_INET6) || (!ifp) || (ifnet == NULL) || ((ifnet->int_next == NULL) && (ipequal(&olsr_cnf->main_addr, &ifnet->ip_addr)))) return false; remainsize = net_outbuffer_bytes_left(ifp); curr_size = OLSR_MID_IPV6_HDRSIZE; /* calculate size needed for HNA */ needsize = curr_size; for (ifs = ifnet; ifs != NULL; ifs = ifs->int_next) { needsize += olsr_cnf->ipsize*2; } /* Send pending packet if not room in buffer */ if (needsize > remainsize) { net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); } check_buffspace(curr_size, remainsize, "MID"); m = (union olsr_message *)msg_buffer; /* Build header */ m->v6.hopcnt = 0; m->v6.ttl = MAX_TTL; m->v6.olsr_msgtype = MID_MESSAGE; m->v6.olsr_vtime = ifp->valtimes.mid; /* Set main(first) address */ m->v6.originator = olsr_cnf->main_addr.v6; addrs6 = m->v6.message.mid.mid_addr; /* Don't add the main address... it's already there */ for (ifs = ifnet; ifs != NULL; ifs = ifs->int_next) { if (!ipequal(&olsr_cnf->main_addr, &ifs->ip_addr)) { #ifdef DEBUG struct ipaddr_str buf; #endif /* DEBUG */ if ((curr_size + olsr_cnf->ipsize) > remainsize) { /* Only add MID message if it contains data */ if (curr_size > OLSR_MID_IPV6_HDRSIZE) { #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "Sending partial(size: %d, buff left:%d)\n", curr_size, remainsize); #endif /* DEBUG */ /* set size */ m->v6.olsr_msgsize = htons(curr_size); m->v6.seqno = htons(get_msg_seqno()); /* seqnumber */ net_outbuffer_push(ifp, msg_buffer, curr_size); curr_size = OLSR_MID_IPV6_HDRSIZE; addrs6 = m->v6.message.mid.mid_addr; } net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); check_buffspace(curr_size + olsr_cnf->ipsize, remainsize, "MID2"); } #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "\t%s(%s)\n", olsr_ip_to_string(&buf, &ifs->ip_addr), ifs->int_name); #endif /* DEBUG */ addrs6->addr = ifs->ip_addr.v6; addrs6++; curr_size += olsr_cnf->ipsize; } } m->v6.olsr_msgsize = htons(curr_size); m->v6.seqno = htons(get_msg_seqno()); /* seqnumber */ //printf("Sending MID (%d bytes)...\n", outputsize); if (curr_size > OLSR_MID_IPV6_HDRSIZE) net_outbuffer_push(ifp, msg_buffer, curr_size); return true; } /** *IP version 4 * *@param ifp the interface to send on *@return nada */ static bool serialize_hna4(struct interface *ifp) { uint16_t remainsize, curr_size, needsize; /* preserve existing data in output buffer */ union olsr_message *m; struct hnapair *pair; struct ip_prefix_list *h; /* No hna nets */ if (ifp == NULL) { return false; } if (olsr_cnf->ip_version != AF_INET) { return false; } h = olsr_cnf->hna_entries; if (h == NULL) { return false; } remainsize = net_outbuffer_bytes_left(ifp); curr_size = OLSR_HNA_IPV4_HDRSIZE; /* calculate size needed for HNA */ needsize = curr_size; while (h) { needsize += olsr_cnf->ipsize*2; h = h->next; } h = olsr_cnf->hna_entries; /* Send pending packet if not room in buffer */ if (needsize > remainsize) { net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); } check_buffspace(curr_size, remainsize, "HNA"); m = (union olsr_message *)msg_buffer; /* Fill header */ m->v4.originator = olsr_cnf->main_addr.v4.s_addr; m->v4.hopcnt = 0; m->v4.ttl = MAX_TTL; m->v4.olsr_msgtype = HNA_MESSAGE; m->v4.olsr_vtime = ifp->valtimes.hna; pair = m->v4.message.hna.hna_net; for (; h != NULL; h = h->next) { union olsr_ip_addr ip_addr; if ((curr_size + (2 * olsr_cnf->ipsize)) > remainsize) { /* Only add HNA message if it contains data */ if (curr_size > OLSR_HNA_IPV4_HDRSIZE) { #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "Sending partial(size: %d, buff left:%d)\n", curr_size, remainsize); #endif /* DEBUG */ m->v4.seqno = htons(get_msg_seqno()); m->v4.olsr_msgsize = htons(curr_size); net_outbuffer_push(ifp, msg_buffer, curr_size); curr_size = OLSR_HNA_IPV4_HDRSIZE; pair = m->v4.message.hna.hna_net; } net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); check_buffspace(curr_size + (2 * olsr_cnf->ipsize), remainsize, "HNA2"); } #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "\tNet: %s\n", olsr_ip_prefix_to_string(&h->net)); #endif /* DEBUG */ olsr_prefix_to_netmask(&ip_addr, h->net.prefix_len); #ifdef __linux__ if (olsr_cnf->smart_gw_active && is_prefix_inetgw(&h->net)) { /* this is the default route, overwrite it with the smart gateway */ olsr_modifiy_inetgw_netmask(&ip_addr, h->net.prefix_len); } #endif /* __linux__ */ pair->addr = h->net.prefix.v4.s_addr; pair->netmask = ip_addr.v4.s_addr; pair++; curr_size += (2 * olsr_cnf->ipsize); } m->v4.seqno = htons(get_msg_seqno()); m->v4.olsr_msgsize = htons(curr_size); net_outbuffer_push(ifp, msg_buffer, curr_size); //printf("Sending HNA (%d bytes)...\n", outputsize); return false; } /** *IP version 6 * *@param ifp the interface to send on *@return nada */ static bool serialize_hna6(struct interface *ifp) { uint16_t remainsize, curr_size, needsize; /* preserve existing data in output buffer */ union olsr_message *m; struct hnapair6 *pair6; union olsr_ip_addr tmp_netmask; struct ip_prefix_list *h = olsr_cnf->hna_entries; /* No hna nets */ if ((olsr_cnf->ip_version != AF_INET6) || (!ifp) || h == NULL) return false; remainsize = net_outbuffer_bytes_left(ifp); curr_size = OLSR_HNA_IPV6_HDRSIZE; /* calculate size needed for HNA */ needsize = curr_size; while (h) { needsize += olsr_cnf->ipsize*2; h = h->next; } h = olsr_cnf->hna_entries; /* Send pending packet if not room in buffer */ if (needsize > remainsize) { net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); } check_buffspace(curr_size, remainsize, "HNA"); m = (union olsr_message *)msg_buffer; /* Fill header */ m->v6.originator = olsr_cnf->main_addr.v6; m->v6.hopcnt = 0; m->v6.ttl = MAX_TTL; m->v6.olsr_msgtype = HNA_MESSAGE; m->v6.olsr_vtime = ifp->valtimes.hna; pair6 = m->v6.message.hna.hna_net; while (h) { if ((curr_size + (2 * olsr_cnf->ipsize)) > remainsize) { /* Only add HNA message if it contains data */ if (curr_size > OLSR_HNA_IPV6_HDRSIZE) { #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "Sending partial(size: %d, buff left:%d)\n", curr_size, remainsize); #endif /* DEBUG */ m->v6.seqno = htons(get_msg_seqno()); m->v6.olsr_msgsize = htons(curr_size); net_outbuffer_push(ifp, msg_buffer, curr_size); curr_size = OLSR_HNA_IPV6_HDRSIZE; pair6 = m->v6.message.hna.hna_net; } net_output(ifp); remainsize = net_outbuffer_bytes_left(ifp); check_buffspace(curr_size + (2 * olsr_cnf->ipsize), remainsize, "HNA2"); } #ifdef DEBUG OLSR_PRINTF(BMSG_DBGLVL, "\tNet: %s\n", olsr_ip_prefix_to_string(&h->net)); #endif /* DEBUG */ olsr_prefix_to_netmask(&tmp_netmask, h->net.prefix_len); #ifdef __linux__ if (olsr_cnf->smart_gw_active && is_prefix_inetgw(&h->net)) { /* this is the default gateway, so overwrite it with the smart one */ olsr_modifiy_inetgw_netmask(&tmp_netmask, h->net.prefix_len); } #endif /* __linux__ */ pair6->addr = h->net.prefix.v6; pair6->netmask = tmp_netmask.v6; pair6++; curr_size += (2 * olsr_cnf->ipsize); h = h->next; } m->v6.olsr_msgsize = htons(curr_size); m->v6.seqno = htons(get_msg_seqno()); net_outbuffer_push(ifp, msg_buffer, curr_size); return false; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/build_msg.h000066400000000000000000000045271234304727700157340ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _BUILD_MSG_H #define _BUILD_MSG_H #include "packet.h" #include "olsr_protocol.h" #include /* For clock_t */ void set_empty_tc_timer(uint32_t); uint32_t get_empty_tc_timer(void); bool queue_hello(struct hello_message *, struct interface *); bool queue_tc(struct tc_message *, struct interface *); bool queue_mid(struct interface *); bool queue_hna(struct interface *); #endif /* _BUILD_MSG_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/builddata.h000066400000000000000000000040131234304727700157060ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_BUILDDATA_H #define _OLSR_BUILDDATA_H extern const char olsrd_version[]; extern const char build_date[]; extern const char build_host[]; #endif /* _OLSR_BUILDDATA_H */ olsrd-0.6.6.2/src/cfgparser/000077500000000000000000000000001234304727700155625ustar00rootroot00000000000000olsrd-0.6.6.2/src/cfgparser/.gitignore000066400000000000000000000000341234304727700175470ustar00rootroot00000000000000/oparse.c /oparse.h /oscan.colsrd-0.6.6.2/src/cfgparser/Makefile000066400000000000000000000054671234304727700172360ustar00rootroot00000000000000 # The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # TOPDIR=../.. include $(TOPDIR)/Makefile.inc # delete the variables from above SRCS = HDRS = include local.mk ifeq ($(OS), win32) LIBNAME ?= olsrd_cfgparser.dll BINNAME ?= olsrd_cfgparser.exe OBJS += ../win32/compat.o ../ipcalc.o ../builddata.o else LIBNAME ?= olsrd_cfgparser.so.0.1 BINNAME ?= olsrd_cfgparser endif ifdef MAKEBIN CPPFLAGS += -DMAKEBIN NAME = $(BINNAME) else # build lib per default ifeq (${OS}, osx) LDFLAGS += -dynamiclib -single_module else LDFLAGS += -shared -Wl,-soname,$(LIBNAME) endif ifeq (${OS}, win32) LDFLAGS += -Wl,--out-implib=libolsrd_cfgparser.a -Wl,--export-all-symbols endif CPPFLAGS += -DMAKELIB NAME = $(LIBNAME) endif .PHONY: install clean uberclean # Targets default_target: $(NAME) $(NAME): $(OBJS) ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o "$@" $^ $(LIBS) install: install -D -m 755 $(NAME) $(LIBDIR)/$(NAME) /sbin/ldconfig -n $(LIBDIR) clean: rm -f *.[od~] $(LIBNAME) $(BINNAME) $(TMPFILES) uberclean: clean olsrd-0.6.6.2/src/cfgparser/README000066400000000000000000000006731234304727700164500ustar00rootroot00000000000000 TODO.. The configparser can be built in three ways. 1. As part of olsrd. This is done when building olsrd. 2. As a binary executable. Just do 'make' in the current directory(src/cfgparser). The binary will be called olsrd_cfgparser 3. As a shared library. Do 'make MAKELIB=1' in the current directory(src/cfgparser). the parser can both parse configfiles and write such files based on provided data. More to come. - Andreas olsrd-0.6.6.2/src/cfgparser/cfgfile_gen.c000066400000000000000000001055531234304727700201670ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2005, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "olsrd_conf.h" #include "builddata.h" #include "../ipcalc.h" #include "../net_olsr.h" #include "../common/autobuf.h" #include #include #include #include #include #include #include int olsrd_write_cnf(struct olsrd_config *cnf, const char *fname) { FILE *fd; struct autobuf abuf; fd = fopen(fname, "w"); if (fd == NULL) { fprintf(stderr, "Could not open file %s for writing\n%s\n", fname, strerror(errno)); return -1; } printf("Writing config to file \"%s\".... ", fname); abuf_init(&abuf, 1024); olsrd_write_cnf_autobuf(&abuf, cnf); if (fwrite(abuf.buf, abuf.len, 1, fd) < (size_t)abuf.len) { fprintf(stderr, "Error, could not write the complete config file.\n"); } abuf_free(&abuf); fclose(fd); printf("DONE\n"); return 1; } static int if_appendf(struct autobuf *autobuf, bool comments, const char *fmt, ...) __attribute__ ((format(printf, 3, 4))); static int if_appendf(struct autobuf *autobuf, bool comments, const char *fmt, ...) { int rv; va_list ap; char *first; if (!comments) { va_start(ap, fmt); first = va_arg(ap, char*); va_end(ap); if (*first) { return 0; } } va_start(ap, fmt); rv = abuf_vappendf(autobuf, fmt, ap); va_end(ap); return rv; } static void olsrd_write_if_autobuf(struct autobuf *out, struct if_config_options *cnfi, bool comments) { struct ipaddr_str ipbuf; struct olsr_lq_mult *mult; abuf_puts(out, "{\n"); if (comments) abuf_puts(out, " # Interface Mode is used to prevent unnecessary\n" " # packet forwarding on switched ethernet interfaces\n" " # valid Modes are \"mesh\" and \"ether\"\n" " # (default is \"mesh\")\n" " \n"); if_appendf(out, comments, " %sMode \"%s\"\n", cnfi->mode == DEF_IF_MODE ? "# " : "", OLSR_IF_MODE[cnfi->mode]); if (comments) abuf_puts(out, " \n" " # IPv4 broadcast address for outgoing OLSR packets.\n" " # One useful example would be 255.255.255.255\n" " # The second useful value would be to\n" " # specify the peer address of an ptp-tunnel.\n" " # another name of this parameter is \"IPv4Multicast\"\n" " # (default is 0.0.0.0, which triggers the usage of the\n" " # interface broadcast IP)\n" " \n"); if_appendf(out, comments, " %sIp4Broadcast %s\n", cnfi->ipv4_multicast.v4.s_addr == 0 ? "# " : "", inet_ntop(AF_INET, &cnfi->ipv4_multicast, ipbuf.buf, sizeof(ipbuf))); if (comments) abuf_puts(out, " \n" " # IPv6 multicast address\n" " # (default is FF02::6D, the manet-router linklocal multicast)\n" " \n"); if_appendf(out, comments, " %sIPv6Multicast %s\n", memcmp(&cnfi->ipv6_multicast, &ipv6_def_multicast, sizeof(ipv6_def_multicast)) == 0 ? "# " : "", inet_ntop(AF_INET6, &cnfi->ipv6_multicast, ipbuf.buf, sizeof(ipbuf))); if (comments) abuf_puts(out, " \n" " # IPv4 src address for outgoing OLSR packages\n" " # (default is 0.0.0.0, which triggers usage of the interface IP)\n" " \n"); if_appendf(out, comments, " %sIPv4Src %s\n", cnfi->ipv4_src.v4.s_addr == 0 ? "# " : "", inet_ntop(AF_INET, &cnfi->ipv4_src, ipbuf.buf, sizeof(ipbuf))); if (comments) abuf_puts(out, " \n" " # IPv6 src prefix. OLSRd will choose one of the interface IPs\n" " # which matches the prefix of this parameter.\n" " # (default is 0::/0, which triggers the usage\n" " # of a not-linklocal interface IP)\n" " \n"); if_appendf(out, comments, " %sIPv6Src %s\n", cnfi->ipv6_src.prefix_len == 0 ? "# " : "", inet_ntop(AF_INET6, &cnfi->ipv6_src, ipbuf.buf, sizeof(ipbuf))); if (comments) abuf_puts(out, " \n" " # Emission intervals in seconds.\n" " # If not defined, Freifunk network defaults are used\n" " # (default is 2.0/20.0 for Hello and 5.0/300.0 for Tc/Mid/Hna)\n" " \n"); if_appendf(out, comments, " %sHelloInterval %3.1f\n", cnfi->hello_params.emission_interval == HELLO_INTERVAL ? "# " : "", (double)cnfi->hello_params.emission_interval); if_appendf(out, comments, " %sHelloValidityTime %3.1f\n", cnfi->hello_params.validity_time == NEIGHB_HOLD_TIME ? "# " : "", (double)cnfi->hello_params.validity_time); if_appendf(out, comments, " %sTcInterval %3.1f\n", cnfi->tc_params.emission_interval == TC_INTERVAL ? "# " : "", (double)cnfi->tc_params.emission_interval); if_appendf(out, comments, " %sTcValidityTime %3.1f\n", cnfi->tc_params.validity_time == TOP_HOLD_TIME ? "# " : "", (double)cnfi->tc_params.validity_time); if_appendf(out, comments, " %sMidInterval %3.1f\n", cnfi->mid_params.emission_interval == MID_INTERVAL ? "# " : "", (double)cnfi->mid_params.emission_interval); if_appendf(out, comments, " %sMidValidityTime %3.1f\n", cnfi->mid_params.validity_time == MID_HOLD_TIME ? "# " : "", (double)cnfi->mid_params.validity_time); if_appendf(out, comments, " %sHnaInterval %3.1f\n", cnfi->hna_params.emission_interval == HNA_INTERVAL ? "# " : "", (double)cnfi->hna_params.emission_interval); if_appendf(out, comments, " %sHnaValidityTime %3.1f\n", cnfi->hna_params.validity_time == HNA_HOLD_TIME ? "# " : "", (double)cnfi->hna_params.validity_time); if (comments) abuf_puts(out, " \n" " # When multiple links exist between hosts\n" " # the weight of interface is used to determine\n" " # the link to use. Normally the weight is\n" " # automatically calculated by olsrd based\n" " # on the characteristics of the interface,\n" " # but here you can specify a fixed value.\n" " # Olsrd will choose links with the lowest value.\n" " # Note:\n" " # Interface weight is used only when LinkQualityLevel is set to 0.\n" " # For any other value of LinkQualityLevel, the interface ETX\n" " # value is used instead.\n"); if_appendf(out, comments, " %sWeight %d\n", !cnfi->weight.fixed ? "# " : "", cnfi->weight.value); if (comments) abuf_puts(out, " \n" " # If a certain route should be preferred\n" " # or ignored by the mesh, the Link Quality\n" " # value of a node can be multiplied with a factor\n" " # entered here. In the example the route\n" " # using 192.168.0.1 would rather be ignored.\n" " # A multiplier of 0.5 will result in a small\n" " # (bad) LinkQuality value and a high (bad)\n" " # ETX value.\n" " # Note:\n" " # Link quality multiplier is used only when\n" " # LinkQualityLevel is > 0.\n" " \n"); mult = cnfi->lq_mult; if (mult == NULL) { if (comments) abuf_puts(out, " # LinkQualityMult 192.168.0.1 0.5\n"); } else { while (mult != NULL) { if_appendf(out, comments, " LinkQualityMult %s %0.2f\n", olsr_ip_to_string(&ipbuf, &mult->addr), (double)((float)(mult->value) / 65536.0f)); mult = mult->next; } } abuf_puts(out, "}\n"); } void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) { struct ip_prefix_list *hna = cnf->hna_entries; struct olsr_if *interf = cnf->interfaces; struct plugin_entry *plugins = cnf->plugins; struct plugin_param *pl_param; struct ip_prefix_list *ipc_nets = cnf->ipc_nets; struct ipaddr_str ipbuf; bool first; abuf_appendf(out, "#\n" "# Configuration file for %s\n" "# automatically generated by olsrd-cnf parser v. %s\n" "#\n" "\n", olsrd_version, PARSER_VERSION); abuf_puts(out, "# OLSR.org routing daemon config file\n" "# This file contains ALL available options and explanations about them\n" "#\n" "# Lines starting with a # are discarded\n" "#\n" "\n" "#### ATTENTION for IPv6 users ####\n" "# Because of limitations in the parser IPv6 addresses must NOT\n" "# begin with a \":\", so please add a \"0\" as a prefix.\n" "\n" "###########################\n" "### Basic configuration ###\n" "###########################\n" "# keep this settings at the beginning of your first configuration file\n" "\n" "# Debug level (0-9)\n" "# If set to 0 the daemon runs in the background, unless \"NoFork\" is set to true\n" "# (Default is 1)\n" "\n"); abuf_appendf(out, "%sDebugLevel %d\n", cnf->debug_level == DEF_DEBUGLVL ? "# " : "", cnf->debug_level); abuf_puts(out, "\n" "# IP version to use (4 or 6)\n" "# (Default is 4)\n" "\n"); abuf_appendf(out, "%sIpVersion %d\n", cnf->ip_version == DEF_IP_VERSION ? "# " : "", cnf->ip_version == AF_INET ? 4 : 6); abuf_puts(out, "\n" "#################################\n" "### OLSRd agent configuration ###\n" "#################################\n" "# this parameters control the settings of the routing agent which are not\n" "# related to the OLSR protocol and it's extensions\n" "\n" "# Clear the screen each time the internal state changes\n" "# (Default is yes)\n" "\n"); abuf_appendf(out, "%sClearScreen %s\n", cnf->clear_screen == DEF_CLEAR_SCREEN ? "# " : "", cnf->clear_screen ? "yes" : "no"); abuf_puts(out, "\n" "# Should olsrd keep on running even if there are\n" "# no interfaces available? This is a good idea\n" "# for a PCMCIA/USB hotswap environment.\n" "# (Default is yes)\n" "\n"); abuf_appendf(out, "%sAllowNoInt %s\n", cnf->allow_no_interfaces == DEF_ALLOW_NO_INTS ? "# " : "", cnf->allow_no_interfaces ? "yes" : "no"); abuf_puts(out, "\n" "# LockFile\n" "# The lockfile is used to prevent multiple OLSR instances running at the same\n" "# time.\n" "# (Linux/BSD default is \"/var/run/olsrd-ipv(4/6).lock\")\n" "# (Win32 default is \"-ipv(4/6).lock\")\n" "\n"); abuf_appendf(out, "%sLockFile \"%s\"\n", cnf->lock_file == NULL ? "# " : "", cnf->lock_file ? cnf->lock_file : "lockfile"); abuf_puts(out, "\n" "# Polling rate for OLSR sockets in seconds (float). \n" "# (Default is 0.05)\n" "\n"); abuf_appendf(out, "%sPollrate %.2f\n", cnf->pollrate == (float)DEF_POLLRATE ? "# " : "", (double)cnf->pollrate); abuf_puts(out, "\n" "# Interval to poll network interfaces for configuration changes (in seconds).\n" "# Linux systems can detect interface statechange via netlink sockets.\n" "# (Defaults is 2.5)\n" "\n"); abuf_appendf(out, "%sNicChgsPollInt %.1f\n", cnf->nic_chgs_pollrate == (float)DEF_NICCHGPOLLRT ? "# " : "", (double)cnf->nic_chgs_pollrate); abuf_puts(out, "\n" "# TOS(type of service) value for the IP header of control traffic.\n" "# (Default is 16)\n" "\n"); abuf_appendf(out, "%sTosValue %u\n", cnf->tos == DEF_TOS ? "# " : "", cnf->tos); abuf_puts(out, "\n" "# FIBMetric controls the metric value of the host-routes OLSRd sets.\n" "# - \"flat\" means that the metric value is always 2. This is the preferred value\n" "# because it helps the linux kernel routing to clean up older routes\n" "# - \"correct\" use the hopcount as the metric value.\n" "# - \"approx\" use the hopcount as the metric value too, but does only update the\n" "# hopcount if the nexthop changes too\n" "# (Default is \"flat\")\n" "\n"); abuf_appendf(out, "%sFIBMetric \"%s\"\n", cnf->fib_metric == DEF_FIB_METRIC ? "# " : "", FIB_METRIC_TXT[cnf->fib_metric]); abuf_puts(out, "\n" "#######################################\n" "### Linux specific OLSRd extensions ###\n" "#######################################\n" "# these parameters are only working on linux at the moment, but might become\n" "# useful on BSD in the future\n" "\n" "# SrcIpRoutes tells OLSRd to set the Src flag of host routes to the originator-ip\n" "# of the node. In addition to this an additional localhost device is created\n" "# to make sure the returning traffic can be received.\n" "# (Default is \"no\")\n" "\n"); abuf_appendf(out, "%sSrcIpRoutes %s\n", cnf->use_src_ip_routes == DEF_USE_SRCIP_ROUTES ? "# " : "", cnf->use_src_ip_routes ? "yes" : "no"); abuf_puts(out, "\n" "# Specify the proto tag to be used for routes olsr inserts into kernel\n" "# currently only implemented for linux\n" "# valid values under linux are 1 .. 254\n" "# 1 gets remapped by olsrd to 0 UNSPECIFIED (1 is reserved for ICMP redirects)\n" "# 2 KERNEL routes (not very wise to use)\n" "# 3 BOOT (should in fact not be used by routing daemons)\n" "# 4 STATIC \n" "# 8 .. 15 various routing daemons (gated, zebra, bird, & co)\n" "# (defaults to 0 which gets replaced by an OS-specific default value\n" "# under linux 3 (BOOT) (for backward compatibility)\n" "\n"); abuf_appendf(out, "%sRtProto %u\n", cnf->rt_proto == DEF_RTPROTO ? "# " : "", cnf->rt_proto); abuf_puts(out, "\n" "# Specifies the routing Table olsr uses\n" "# RtTable is for host routes, RtTableDefault for the route to the default\n" "# internet gateway (2 in case of IPv6+NIIT) and RtTableTunnel is for\n" "# routes to the ipip tunnels, valid values are 1 to 254\n" "# There is a special parameter \"auto\" (choose default below)\n" "# (with smartgw: default is 254/223/224)\n" "# (without smartgw: default is 254/254/254, linux main table)\n" "\n"); abuf_appendf(out, "RtTable %u\n", cnf->rt_table); abuf_appendf(out, "RtTableDefault %u\n", cnf->rt_table_default); abuf_appendf(out, "RtTableTunnel %u\n", cnf->rt_table_tunnel); abuf_puts(out, "\n" "# Specifies the policy rule priorities for the three routing tables and\n" "# a special rule for smartgateway routing (see README-Olsr-Extensions)\n" "# Priorities can only be set if three different routing tables are set.\n" "# if set the values must obey to condition\n" "# RtTablePriority < RtTableDefaultOlsrPriority\n" "# < RtTableTunnelPriority < RtTableDefaultPriority\n" "# There are two special parameters, \"auto\" (choose fitting to SmartGW\n" "# mode) and \"none\" (do not set policy rule)\n" "# (with smartgw: default is none/32776/32786/32796)\n" "# (without smartgw: default is none/none/none/none)\n" "\n"); abuf_appendf(out, "RtTablePriority %u\n", cnf->rt_table_pri); abuf_appendf(out, "RtTableDefaultOlsrPriority %u\n", cnf->rt_table_default_pri); abuf_appendf(out, "RtTableTunnelPriority %u\n", cnf->rt_table_tunnel_pri); abuf_appendf(out, "RtTableDefaultPriority %u\n", cnf->rt_table_defaultolsr_pri); abuf_puts(out, "\n" "# Activates (in IPv6 mode) the automatic use of NIIT\n" "# (see README-Olsr-Extensions)\n" "# (default is \"yes\")\n" "\n"); abuf_appendf(out, "%sUseNiit %s\n", cnf->use_niit == DEF_USE_NIIT ? "# " : "", cnf->use_niit ? "yes" : "no"); abuf_puts(out, "\n" "# Activates the smartgateway ipip tunnel feature.\n" "# See README-Olsr-Extensions for a description of smartgateways.\n" "# (default is \"yes\")\n" "\n"); abuf_appendf(out, "%sSmartGateway %s\n", cnf->smart_gw_active == DEF_SMART_GW ? "# " : "", cnf->smart_gw_active ? "yes" : "no"); abuf_puts(out, "\n" "# Signals that the server tunnel must always be removed on shutdown,\n" "# irrespective of the interface up/down state during startup.\n" "# (default is \"no\")\n" "\n"); abuf_appendf(out, "%sSmartGatewayAlwaysRemoveServerTunnel %s\n", cnf->smart_gw_always_remove_server_tunnel == DEF_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL ? "# " : "", cnf->smart_gw_always_remove_server_tunnel ? "yes" : "no"); abuf_puts(out, "\n" "# Determines the maximum number of gateways that can be in use at any given\n" "# time. This setting is used to mitigate the effects of breaking connections\n" "# (due to the selection of a new gateway) on a dynamic network.\n" "# (default is 1)\n" "\n"); abuf_appendf(out, "%sSmartGatewayUseCount %d\n", cnf->smart_gw_use_count == DEF_GW_USE_COUNT ? "# " : "", cnf->smart_gw_use_count); abuf_puts(out, "\n" "# Determines the take-down percentage for a non-current smart gateway tunnel.\n" "# If the cost of the current smart gateway tunnel is less than this percentage\n" "# of the cost of the non-current smart gateway tunnel, then the non-current smart\n" "# gateway tunnel is taken down because it is then presumed to be 'too expensive'.\n" "# This setting is only relevant when SmartGatewayUseCount is larger than 1;\n" "# a value of 0 will result in the tunnels not being taken down proactively.\n" "# (default is 0)\n" "\n"); abuf_appendf(out, "%sSmartGatewayTakeDownPercentage %d\n", cnf->smart_gw_takedown_percentage == DEF_GW_TAKEDOWN_PERCENTAGE ? "# " : "", cnf->smart_gw_takedown_percentage); abuf_puts(out, "\n" "# Determines the policy routing script that is executed during startup and\n" "# shutdown of olsrd. The script is only executed when SmartGatewayUseCount\n" "# is set to a value larger than 1. The script must setup policy routing\n" "# rules such that multi-gateway mode works. A sample script is included.\n" "# (default is not set)\n" "\n"); abuf_appendf(out, "%sSmartGatewayPolicyRoutingScript %s\n", !cnf->smart_gw_policyrouting_script ? "# " : "", !cnf->smart_gw_policyrouting_script ? "" : cnf->smart_gw_policyrouting_script); abuf_puts(out, "\n" "# Determines the egress interfaces that are part of the multi-gateway setup and\n" "# therefore only relevant when SmartGatewayUseCount is larger than 1 (in which\n" "# case it must be explicitly set).\n" "# (default is not set)\n" "\n"); abuf_appendf(out, "%sSmartGatewayEgressInterfaces", !cnf->smart_gw_egress_interfaces ? "# " : ""); { struct sgw_egress_if * sgwegressif = olsr_cnf->smart_gw_egress_interfaces; while (sgwegressif) { abuf_appendf(out, " \"%s\"", sgwegressif->name); sgwegressif = sgwegressif->next; } abuf_puts(out, "\n"); } abuf_puts(out, "\n" "# Determines the offset of the smart gateway egress interfaces mark that are\n" "# used in the policy routing rules in a multi-gateway setup. Only relevant\n" "# when a multi-gateway setup is used.\n" "# (default is 91)\n" "\n"); abuf_appendf(out, "%sSmartGatewayMarkOffsetEgress %u\n", cnf->smart_gw_mark_offset_egress == DEF_GW_MARK_OFFSET_EGRESS ? "# " : "", cnf->smart_gw_mark_offset_egress); abuf_puts(out, "\n" "# Determines the offset of the smart gateway tunnel interfaces mark that are\n" "# used in the policy routing rules in a multi-gateway setup. Only relevant\n" "# when a multi-gateway setup is used.\n" "# The ranges [egress offset, egress offset + egress count] and\n" "# [tunnel offset, tunnel offset + use count] are not allowed to overlap.\n" "# (default is 101)\n" "\n"); abuf_appendf(out, "%sSmartGatewayMarkOffsetTunnels %u\n", cnf->smart_gw_mark_offset_tunnels == DEF_GW_MARK_OFFSET_TUNNELS ? "# " : "", cnf->smart_gw_mark_offset_tunnels); abuf_puts(out, "\n" "# Allows the selection of a smartgateway with NAT (only for IPv4)\n" "# (default is \"yes\")\n" "\n"); abuf_appendf(out, "%sSmartGatewayAllowNAT %s\n", cnf->smart_gw_allow_nat == DEF_GW_ALLOW_NAT ? "# " : "", cnf->smart_gw_allow_nat ? "yes" : "no"); abuf_puts(out, "\n" "# Determines the period (in milliseconds) on which a new smart gateway\n" "# selection is performed.\n" "# (default is 10000 milliseconds)\n" "\n"); abuf_appendf(out, "%sSmartGatewayPeriod %d\n", cnf->smart_gw_period == DEF_GW_PERIOD ? "# " : "", cnf->smart_gw_period); abuf_puts(out, "\n" "# Determines the number of times the link state database must be stable\n" "# before a new smart gateway is selected.\n" "# (default is 6)\n" "\n"); abuf_appendf(out, "%sSmartGatewayStableCount %d\n", cnf->smart_gw_stablecount == DEF_GW_STABLE_COUNT ? "# " : "", cnf->smart_gw_stablecount); abuf_puts(out, "\n" "# When another gateway than the current one has a cost of less than the cost\n" "# of the current gateway multiplied by SmartGatewayThreshold then the smart\n" "# gateway is switched to the other gateway. The unit is percentage.\n" "# (defaults to 0)\n" "\n"); abuf_appendf(out, "%sSmartGatewayThreshold %d\n", cnf->smart_gw_thresh == DEF_GW_THRESH ? "# " : "", cnf->smart_gw_thresh); abuf_puts(out, "\n" "# The weighing factor for the gateway uplink bandwidth (exit link, uplink).\n" "# See README-Olsr-Extensions for a description of smart gateways.\n" "# (default is 1)\n" "\n"); abuf_appendf(out, "%sSmartGatewayWeightExitLinkUp %d\n", cnf->smart_gw_weight_exitlink_up == DEF_GW_WEIGHT_EXITLINK_UP ? "# " : "", cnf->smart_gw_weight_exitlink_up); abuf_puts(out, "\n" "# The weighing factor for the gateway downlink bandwidth (exit link, downlink).\n" "# See README-Olsr-Extensions for a description of smart gateways.\n" "# (default is 1)\n" "\n"); abuf_appendf(out, "%sSmartGatewayWeightExitLinkDown %d\n", cnf->smart_gw_weight_exitlink_down == DEF_GW_WEIGHT_EXITLINK_DOWN ? "# " : "", cnf->smart_gw_weight_exitlink_down); abuf_puts(out, "\n" "# The weighing factor for the ETX costs.\n" "# See README-Olsr-Extensions for a description of smart gateways.\n" "# (default is 1)\n" "\n"); abuf_appendf(out, "%sSmartGatewayWeightEtx %d\n", cnf->smart_gw_weight_etx == DEF_GW_WEIGHT_ETX ? "# " : "", cnf->smart_gw_weight_etx); abuf_puts(out, "\n" "# The divider for the ETX costs.\n" "# See README-Olsr-Extensions for a description of smart gateways.\n" "# (default is 0)\n" "\n"); abuf_appendf(out, "%sSmartGatewayDividerEtx %d\n", cnf->smart_gw_divider_etx == DEF_GW_DIVIDER_ETX ? "# " : "", cnf->smart_gw_divider_etx); abuf_puts(out, "\n" "# Defines what kind of Uplink this node will publish as a\n" "# smartgateway. The existence of the uplink is detected by\n" "# a route to 0.0.0.0/0, ::ffff:0:0/96 and/or 2000::/3.\n" "# possible values are \"none\", \"ipv4\", \"ipv6\", \"both\"\n" "# (default is \"both\")\n" "\n"); abuf_appendf(out, "%sSmartGatewayUplink \"%s\"\n", cnf->smart_gw_type == DEF_GW_TYPE ? "# " : "", GW_UPLINK_TXT[cnf->smart_gw_type]); abuf_puts(out, "\n" "# Specifies if the local ipv4 uplink use NAT\n" "# (default is \"yes\")\n" "\n"); abuf_appendf(out, "%sSmartGatewayUplinkNAT %s\n", cnf->smart_gw_uplink_nat == DEF_GW_UPLINK_NAT ? "# " : "", cnf->smart_gw_uplink_nat ? "yes" : "no"); abuf_puts(out, "\n" "# Specifies the speed of the uplink in kilobit/s.\n" "# First parameter is upstream, second parameter is downstream\n" "# (default is 128/1024)\n" "\n"); abuf_appendf(out, "%sSmartGatewaySpeed %d %d\n", cnf->smart_gw_uplink == DEF_UPLINK_SPEED && cnf->smart_gw_downlink == DEF_DOWNLINK_SPEED ? "# " : "", cnf->smart_gw_uplink, cnf->smart_gw_downlink); abuf_puts(out, "\n" "# Specifies the EXTERNAL ipv6 prefix of the uplink. A prefix\n" "# length of more than 64 is not allowed.\n" "# (default is 0::/0\n" "\n"); abuf_appendf(out, "%sSmartGatewayPrefix %s\n", cnf->smart_gw_prefix.prefix_len == 0 ? "# " : "", olsr_ip_prefix_to_string(&cnf->smart_gw_prefix)); abuf_puts(out, "\n" "##############################\n" "### OLSR protocol settings ###\n" "##############################\n" "\n" "# For testing purposes it may be nice to use another port for olsrd\n" "# for using another port than the IANA assigned one \n" "# for a production network, there should be a good reason!!\n" "# valid values are integers >1, please be careful with using reserved\n" "# port numbers\n" "# (default is 698, the IANA assigned olsr-port)\n" "\n"); abuf_appendf(out, "%sOlsrPort %u\n", cnf->olsrport == DEF_OLSRPORT ? "# " : "", cnf->olsrport); abuf_puts(out, "\n" "# Sets the main IP (originator ip) of the router. This IP will NEVER\n" "# change during the uptime of olsrd.\n" "# (default is 0.0.0.0, which triggers usage of the IP of the first interface)\n" "\n"); abuf_appendf(out, "MainIp %s\n", olsr_ip_to_string(&ipbuf, &cnf->main_addr)); abuf_puts(out, "\n" "# The fixed willingness to use (0-7)\n" "# If not set willingness will be calculated\n" "# dynamically based on battery/power status\n" "# (default is 3)\n" "\n"); abuf_appendf(out, "%sWillingness %u\n", cnf->willingness == DEF_WILLINGNESS ? "# " : "", cnf->willingness); abuf_puts(out, "\n" "# HNA (Host network association) allows the OLSR to announce\n" "# additional IPs or IP subnets to the net that are reachable\n" "# through this node.\n" "# Syntax for HNA4 is \"network-address network-mask\"\n" "# Syntax for HNA6 is \"network-address prefix-length\"\n" "# (default is no HNA)\n"); abuf_appendf(out, "Hna%u\n" "{\n", cnf->ip_version == AF_INET ? 4 : 6); while (hna) { struct ipaddr_str strbuf; abuf_appendf(out, " %s\n", olsr_ip_prefix_to_string(&hna->net)); hna = hna->next; } abuf_puts(out, "}\n" "\n" "# Hysteresis for link sensing (only for hopcount metric)\n" "# Hysteresis adds more robustness to the link sensing\n" "# but delays neighbor registration.\n" "# (defaults to yes)\n" "\n"); abuf_appendf(out, "%sUseHysteresis %s\n", cnf->use_hysteresis == DEF_USE_HYST ? "# " : "", cnf->use_hysteresis ? "yes" : "no"); abuf_puts(out, "\n" "# Hysteresis parameters (only for hopcount metric)\n" "# Do not alter these unless you know what you are doing!\n" "# Set to auto by default. Allowed values are floating point\n" "# values in the interval 0,1\n" "# THR_LOW must always be lower than THR_HIGH!!\n" "# (default is 0.5/0.8/0.3)\n" "\n"); abuf_appendf(out, "%sHystScaling %.2f\n", cnf->hysteresis_param.scaling == (float)HYST_SCALING ? "# " : "", (double)cnf->hysteresis_param.scaling); abuf_appendf(out, "%sHystThrHigh %.2f\n", cnf->hysteresis_param.thr_high == (float)HYST_THRESHOLD_HIGH ? "# " : "", (double)cnf->hysteresis_param.thr_high); abuf_appendf(out, "%sHystThrLow %.2f\n", cnf->hysteresis_param.thr_low == (float)HYST_THRESHOLD_LOW ? "# " : "", (double)cnf->hysteresis_param.thr_low); abuf_puts(out, "\n" "# TC redundancy\n" "# Specifies how much neighbor info should be sent in\n" "# TC messages. Because of a design problem in the 0.5.x\n" "# dijkstra implementation this value must be set to 2.\n" "# 2 - send all neighbors\n" "# (default is 2)\n" "\n"); abuf_appendf(out, "%sTcRedundancy %d\n", cnf->tc_redundancy == TC_REDUNDANCY ? "# " : "", cnf->tc_redundancy); abuf_puts(out, "\n" "# MPR coverage specifies how many MPRs a node should\n" "# try select to reach every 2 hop neighbor. Because of\n" "# a design problem in the 0.5.x dijkstra algorithm this\n" "# value should be set to 7.\n" "# (default is 7)\n" "\n"); abuf_appendf(out, "%sMprCoverage %d\n", cnf->mpr_coverage == MPR_COVERAGE ? "# " : "", cnf->mpr_coverage); abuf_puts(out, "\n" "################################\n" "### OLSR protocol extensions ###\n" "################################\n" "\n" "# Link quality level switch between hopcount and \n" "# cost-based (mostly ETX) routing. Because of\n" "# a design problem in the 0.5.x dijkstra algorithm this\n" "# value should not be set to 1.\n" "# 0 = do not use link quality\n" "# 2 = use link quality for MPR selection and routing\n" "# (default is 2)\n" "\n"); abuf_appendf(out, "%sLinkQualityLevel %d\n", cnf->lq_level == DEF_LQ_LEVEL ? "# " : "", cnf->lq_level); abuf_puts(out, "\n" "# Link quality algorithm (only for lq level 2)\n" "# (see README-Olsr-Extensions)\n" "# - \"etx_float\", a floating point ETX with exponential aging\n" "# - \"etx_fpm\", same as ext_float, but with integer arithmetic\n" "# - \"etx_ff\" (ETX freifunk), an etx variant which use all OLSR\n" "# traffic (instead of only hellos) for ETX calculation\n" "# - \"etx_ffeth\", an incompatible variant of etx_ff that allows\n" "# ethernet links with ETX 0.1.\n" "# (defaults to \"etx_ff\")\n" "\n"); abuf_appendf(out, "%sLinkQualityAlgorithm \"%s\"\n", cnf->lq_algorithm == NULL ? "# " : "", cnf->lq_algorithm == NULL ? DEF_LQ_ALGORITHM : cnf->lq_algorithm); abuf_puts(out, "\n" "# Link quality aging factor (only for lq level 2)\n" "# Tuning parameter for etx_float and etx_fpm, smaller values\n" "# mean slower changes of ETX value. (allowed values are\n" "# between 0.01 and 1.0)\n" "# (default is 0.05)\n" "\n"); abuf_appendf(out, "%sLinkQualityAging %.2f\n", cnf->lq_aging == (float)DEF_LQ_AGING ? "# " : "", (double)cnf->lq_aging); abuf_puts(out, "\n" "# Fisheye mechanism for TCs (0 meansoff, 1 means on)\n" "# (default is 1)\n" "\n"); abuf_appendf(out, "%sLinkQualityFishEye %d\n", cnf->lq_fish == DEF_LQ_FISH ? "# " : "", cnf->lq_fish); abuf_puts(out, "\n" "#\n" "# NatThreshold \n" "#\n" "# (currently this is only in the freifunk firmware)\n" "# If the NAT-Endpoint (the preferred 0/0 HNA emitting node)\n" "# is to be changed, the ETX value of the current 0/0 is \n" "# multiplied with the NatThreshold value before being\n" "# compared to the new one.\n" "# The parameter can be a value between 0.1 and 1.0, but\n" "# should be close to 1.0 if changed.\n" "# WARNING: This parameter should not be used together with\n" "# the etx_ffeth metric !!\n" "# (defaults to 1.0)\n" "\n"); abuf_appendf(out, "%sNatThreshold %.1f\n", cnf->lq_nat_thresh == (float)DEF_LQ_NAT_THRESH ? "# " : "", (double)cnf->lq_nat_thresh); abuf_puts(out, "\n" "#############################################################\n" "### Configuration of the IPC to the windows GUI interface ###\n" "#############################################################\n" "\n" "IpcConnect\n" "{\n" " # Determines how many simultaneously\n" " # IPC connections that will be allowed\n" " # Setting this to 0 disables IPC\n" "\n"); abuf_appendf(out, " %sMaxConnections %d\n", cnf->ipc_connections == DEF_IPC_CONNECTIONS ? "# " : "", cnf->ipc_connections); abuf_puts(out, "\n" " # By default only 127.0.0.1 is allowed\n" " # to connect. Here allowed hosts and networks can\n" " # be added\n" "\n"); while (ipc_nets) { if (ipc_nets->net.prefix_len == olsr_cnf->maxplen) { abuf_appendf(out, " Host %s\n", olsr_ip_to_string(&ipbuf, &ipc_nets->net.prefix)); } else { abuf_appendf(out, " Net %s\n", olsr_ip_prefix_to_string(&ipc_nets->net)); } ipc_nets = ipc_nets->next; } abuf_puts(out, "}\n" "\n" "#####################################\n" "### Example plugin configurations ###\n" "#####################################\n" "# Olsrd plugins to load\n" "# This must be the absolute path to the file\n" "# or the loader will use the following scheme:\n" "# - Try the paths in the LD_LIBRARY_PATH \n" "# environment variable.\n" "# - The list of libraries cached in /etc/ld.so.cache\n" "# - /lib, followed by /usr/lib\n" "\n"); while (plugins) { abuf_appendf(out, "LoadPlugin \"%s\" {\n", plugins->name); pl_param = plugins->params; while (pl_param) { abuf_appendf(out, " PlParam \"%s\"\t\"%s\"\n", pl_param->key, pl_param->value); pl_param = pl_param->next; } abuf_puts(out, "}\n" "\n"); plugins = plugins->next; } abuf_puts(out, "#############################################\n" "### OLSRD default interface configuration ###\n" "#############################################\n" "# the default interface section can have the same values as the following\n" "# interface configuration. It will allow you so set common options for all\n" "# interfaces.\n" "\n" "InterfaceDefaults\n"); olsrd_write_if_autobuf(out, cnf->interface_defaults, false); abuf_puts(out, "\n" "######################################\n" "### OLSRd Interfaces configuration ###\n" "######################################\n" "# multiple interfaces can be specified for a single configuration block\n" "# multiple configuration blocks can be specified\n" "\n"); first = true; while (interf) { abuf_appendf(out, "Interface \"%s\"\n", interf->name); olsrd_write_if_autobuf(out, interf->cnf, first); first = false; interf = interf->next; } abuf_puts(out, "\n" "# END AUTOGENERATED CONFIG\n"); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/cfgparser/local.mk000066400000000000000000000071531234304727700172130ustar00rootroot00000000000000 # The olsr.org Optimized Link-State Routing daemon(olsrd) # Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of olsr.org, olsrd nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Visit http://www.olsr.org for more information. # # If you find this software useful feel free to make a donation # to the project. For more information see the website or contact # the copyright holders. # # avoid the $(if) everywhere C=$(if $(CFGDIR),$(CFGDIR)/) # add the variables as we may have others already there SRCS += $(foreach file,olsrd_conf oparse oscan cfgfile_gen,$(C)$(file).c) OBJS += $(foreach file,olsrd_conf oparse oscan cfgfile_gen,$(C)$(file).o) HDRS += $(foreach file,olsrd_conf oparse,$(C)$(file).h) $(C)oscan.c: $(C)oscan.lex $(C)Makefile ifeq ($(VERBOSE),0) @echo "[FLEX] $@" endif $(MAKECMDPREFIX)$(FLEX) -Cem -o"$@-tmp" "$<" $(MAKECMDPREFIX)sed -e '/^static/s/yy_get_next_buffer[\(][\)]/yy_get_next_buffer(void)/' \ -e '/^static/s/yy_get_previous_state[\(][\)]/yy_get_previous_state(void)/' \ -e '/^static/s/yygrowstack[\(][\)]/yygrowstack(void)/' \ -e '/^static/s/input[\(][\)]/input(void)/' \ -e '/^static *void *yy_fatal_error/s/^\(.*)\);$$/\1 __attribute__((noreturn));/' \ -e 's/register //' \ -e '/^#line/s/$(call quote,$@-tmp)/$(call quote,$@)/' \ < "$@-tmp" >"$@" $(MAKECMDPREFIX)$(RM) "$@-tmp" # we need a dependency to generate oparse before we compile oscan.c $(C)oscan.o: $(C)oparse.c $(C)oscan.o: CFLAGS := $(filter-out -Wunreachable-code -Wsign-compare,$(CFLAGS)) -Wno-sign-compare -Wno-switch-default # we need potentially another -I directory $(C)oscan.o: CPPFLAGS += $(if $(CFGDIR),-I$(CFGDIR)) -DYY_NO_INPUT $(C)oparse.c: $(C)oparse.y $(C)olsrd_conf.h $(C)Makefile ifeq ($(VERBOSE),0) @echo "[BISON] $@" endif $(MAKECMDPREFIX)$(BISON) -d -o "$@-tmp" "$<" $(MAKECMDPREFIX)sed -e 's/register //' \ -e '/^#line/s/$(call quote,$@-tmp)/$(call quote,$@)/' \ < "$@-tmp" >"$@" $(MAKECMDPREFIX)mv "$(subst .c,.h,$@-tmp)" "$(subst .c,.h,$@)" $(MAKECMDPREFIX)$(RM) "$@-tmp" "$(subst .c,.h,$@-tmp)" $(C)oparse.o: CFLAGS := $(filter-out -Wunreachable-code,$(CFLAGS)) # and a few files to be cleaned TMPFILES += $(foreach pat,oscan.c oparse.c oparse.h,$(C)$(pat) $(C)$(pat)-tmp) olsrd-0.6.6.2/src/cfgparser/olsrd_cfgparser.def000066400000000000000000000003361234304727700214230ustar00rootroot00000000000000EXPORTS olsrd_parse_cnf olsrd_sanity_check_cnf olsrd_free_cnf olsrd_print_cnf olsrd_write_cnf olsrd_write_cnf_buf get_default_if_config olsrd_get_default_cnf win32_stdio_hack win32_olsrd_malloc win32_olsrd_free olsrd-0.6.6.2/src/cfgparser/olsrd_conf.c000066400000000000000000001151751234304727700200700ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "olsrd_conf.h" #include "ipcalc.h" #include "olsr_cfg.h" #include "defs.h" #include "net_olsr.h" #include "olsr.h" #include #include #include #include #include #include #include #include #include #ifdef __linux__ #include #include #include #include #endif /* __linux__ */ extern FILE *yyin; extern int yyparse(void); static char interface_defaults_name[] = "[InterfaceDefaults]"; const char *FIB_METRIC_TXT[] = { "flat", "correct", "approx", }; const char *GW_UPLINK_TXT[] = { "none", "ipv4", "ipv6", "both" }; const char *OLSR_IF_MODE[] = { "mesh", "ether" }; static char copyright_string[] __attribute__ ((unused)) = "The olsr.org Optimized Link-State Routing daemon(olsrd) Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) All rights reserved."; int current_line; /* Global stuff externed in defs.h */ FILE *debug_handle; /* Where to send debug(defaults to stdout) */ struct olsrd_config *olsr_cnf; /* The global configuration */ #ifdef MAKEBIN /* Build as standalone binary */ int main(int argc, char *argv[]) { struct olsrd_config *cnf; if (argc == 1) { fprintf(stderr, "Usage: olsrd_cfgparser [filename] -print\n\n"); exit(EXIT_FAILURE); } if ((cnf = olsrd_parse_cnf(argv[1])) == 0) { if ((argc > 2) && (!strcmp(argv[2], "-print"))) { olsrd_print_cnf(cnf); olsrd_write_cnf(cnf, "./out.conf"); } else printf("Use -print to view parsed values\n"); printf("Configfile parsed OK\n"); } else { printf("Failed parsing \"%s\"\n", argv[1]); } return 0; } #else /* MAKEBIN */ /* Build as part of olsrd */ #endif /* MAKEBIN */ int olsrd_parse_cnf(const char *filename) { struct olsr_if *in, *new_ifqueue; int rc; fprintf(stderr, "Parsing file: \"%s\"\n", filename); yyin = fopen(filename, "r"); if (yyin == NULL) { fprintf(stderr, "Cannot open configuration file '%s': %s.\n", filename, strerror(errno)); return -1; } current_line = 1; rc = yyparse(); fclose(yyin); if (rc != 0) { return -1; } /* Reverse the queue (added by user request) */ in = olsr_cnf->interfaces; new_ifqueue = NULL; while (in) { struct olsr_if *in_tmp = in; in = in->next; in_tmp->next = new_ifqueue; new_ifqueue = in_tmp; } olsr_cnf->interfaces = new_ifqueue; for (in = olsr_cnf->interfaces; in != NULL; in = in->next) { /* set various stuff */ in->configured = false; in->interf = NULL; in->host_emul = false; } return 0; } /* prints an interface (and checks it againt the default config) and the inverted config */ static void olsrd_print_interface_cnf(struct if_config_options *cnf, struct if_config_options *cnfi, bool defcnf) { struct olsr_lq_mult *mult; int lq_mult_cnt = 0; char ipv6_buf[INET6_ADDRSTRLEN]; /* buffer for IPv6 inet_htop */ if (cnf->ipv4_multicast.v4.s_addr) { printf("\tIPv4 broadcast/multicast : %s%s\n", inet_ntoa(cnf->ipv4_multicast.v4),DEFAULT_STR(ipv4_multicast.v4.s_addr)); } else { printf("\tIPv4 broadcast/multicast : AUTO%s\n",DEFAULT_STR(ipv4_multicast.v4.s_addr)); } if (cnf->mode==IF_MODE_ETHER){ printf("\tMode : ether%s\n",DEFAULT_STR(mode)); } else { printf("\tMode : mesh%s\n",DEFAULT_STR(mode)); } printf("\tIPv6 multicast : %s%s\n", inet_ntop(AF_INET6, &cnf->ipv6_multicast.v6, ipv6_buf, sizeof(ipv6_buf)),DEFAULT_STR(ipv6_multicast.v6)); printf("\tHELLO emission/validity : %0.2f%s/%0.2f%s\n", (double)cnf->hello_params.emission_interval, DEFAULT_STR(hello_params.emission_interval), (double)cnf->hello_params.validity_time,DEFAULT_STR(hello_params.validity_time)); printf("\tTC emission/validity : %0.2f%s/%0.2f%s\n", (double)cnf->tc_params.emission_interval, DEFAULT_STR(tc_params.emission_interval), (double)cnf->tc_params.validity_time,DEFAULT_STR(tc_params.validity_time)); printf("\tMID emission/validity : %0.2f%s/%0.2f%s\n", (double)cnf->mid_params.emission_interval, DEFAULT_STR(mid_params.emission_interval), (double)cnf->mid_params.validity_time,DEFAULT_STR(mid_params.validity_time)); printf("\tHNA emission/validity : %0.2f%s/%0.2f%s\n", (double)cnf->hna_params.emission_interval, DEFAULT_STR(hna_params.emission_interval), (double)cnf->hna_params.validity_time,DEFAULT_STR(hna_params.validity_time)); for (mult = cnf->lq_mult; mult != NULL; mult = mult->next) { lq_mult_cnt++; printf("\tLinkQualityMult : %s %0.2f %s\n", inet_ntop(olsr_cnf->ip_version, &mult->addr, ipv6_buf, sizeof(ipv6_buf)), (double)(mult->value) / (double)65536.0, ((lq_mult_cnt > cnf->orig_lq_mult_cnt)?" (d)":"")); } printf("\tAutodetect changes : %s%s\n", cnf->autodetect_chg ? "yes" : "no",DEFAULT_STR(autodetect_chg)); } #ifdef __linux__ static int olsrd_sanity_check_rtpolicy(struct olsrd_config *cnf) { int prio; /* calculate rt_policy defaults if necessary */ if (!cnf->smart_gw_active) { /* default is "no policy rules" and "everything into the main table" */ if (cnf->rt_table == DEF_RT_AUTO) { cnf->rt_table = 254; } if (cnf->rt_table_default == DEF_RT_AUTO) { cnf->rt_table_default = cnf->rt_table; } if (cnf->rt_table_tunnel != DEF_RT_AUTO) { fprintf(stderr, "Warning, setting a table for tunnels without SmartGW does not make sense.\n"); } cnf->rt_table_tunnel = cnf->rt_table_default; /* priority rules default is "none" */ if (cnf->rt_table_pri == DEF_RT_AUTO) { cnf->rt_table_pri = DEF_RT_NONE; } if (cnf->rt_table_defaultolsr_pri == DEF_RT_AUTO) { cnf->rt_table_defaultolsr_pri = DEF_RT_NONE; } if (cnf->rt_table_tunnel_pri == DEF_RT_AUTO) { cnf->rt_table_tunnel_pri = DEF_RT_NONE; } if (cnf->rt_table_default_pri == DEF_RT_AUTO) { cnf->rt_table_default_pri = DEF_RT_NONE; } } else { /* default is "policy rules" and "everything into separate tables (254, 223, 224)" */ if (cnf->rt_table == DEF_RT_AUTO) { cnf->rt_table = 254; } if (cnf->rt_table_default == DEF_RT_AUTO) { cnf->rt_table_default = 223; } if (cnf->rt_table_tunnel == DEF_RT_AUTO) { cnf->rt_table_tunnel = 224; } /* default for "rt_table_pri" is none (main table already has a policy rule */ prio = 32766; if (cnf->rt_table_pri > 0) { prio = cnf->rt_table_pri; } else if (cnf->rt_table_pri == DEF_RT_AUTO) { /* choose default */ olsr_cnf->rt_table_pri = DEF_RT_NONE; fprintf(stderr, "No policy rule for rt_table_pri\n"); } /* default for "rt_table_defaultolsr_pri" is +10 */ prio += 10; if (cnf->rt_table_defaultolsr_pri > 0) { prio = cnf->rt_table_defaultolsr_pri; } else if (cnf->rt_table_defaultolsr_pri == DEF_RT_AUTO) { olsr_cnf->rt_table_defaultolsr_pri = prio; fprintf(stderr, "Choose priority %u for rt_table_defaultolsr_pri\n", prio); } prio += 10; if (cnf->rt_table_tunnel_pri > 0) { prio = cnf->rt_table_tunnel_pri; } else if (cnf->rt_table_tunnel_pri == DEF_RT_AUTO) { olsr_cnf->rt_table_tunnel_pri = prio; fprintf(stderr, "Choose priority %u for rt_table_tunnel_pri\n", prio); } prio += 10; if (cnf->rt_table_default_pri == DEF_RT_AUTO) { olsr_cnf->rt_table_default_pri = prio; fprintf(stderr, "Choose priority %u for rt_table_default_pri\n", prio); } } /* check rule priorities */ if (cnf->rt_table_pri > 0) { if (cnf->rt_table >= 253) { fprintf(stderr, "rttable %d does not need policy rules from OLSRd\n", cnf->rt_table); return -1; } } prio = cnf->rt_table_pri; if (cnf->rt_table_defaultolsr_pri > 0) { if (prio >= cnf->rt_table_defaultolsr_pri) { fprintf(stderr, "rttable_defaultolsr priority must be greater than %d\n", prio); return -1; } if (cnf->rt_table_default >= 253) { fprintf(stderr, "rttable %d does not need policy rules from OLSRd\n", cnf->rt_table_default); return -1; } prio = olsr_cnf->rt_table_defaultolsr_pri; } if (cnf->rt_table_tunnel_pri > 0 ) { if (prio >= cnf->rt_table_tunnel_pri) { fprintf(stderr, "rttable_tunnel priority must be greater than %d\n", prio); return -1; } if (cnf->rt_table_tunnel >= 253) { fprintf(stderr, "rttable %d does not need policy rules from OLSRd\n", cnf->rt_table_tunnel); return -1; } prio = cnf->rt_table_tunnel_pri; } if (cnf->rt_table_default_pri > 0) { if (prio >= cnf->rt_table_default_pri) { fprintf(stderr, "rttable_default priority must be greater than %d\n", prio); return -1; } if (cnf->rt_table_default >= 253) { fprintf(stderr, "rttable %d does not need policy rules from OLSRd\n", cnf->rt_table_default); return -1; } } /* filter rt_proto entry */ if (cnf->rt_proto == 1) { /* protocol 1 is reserved, so better use 0 */ cnf->rt_proto = 0; } else if (cnf->rt_proto == 0) { cnf->rt_proto = RTPROT_BOOT; } return 0; } #endif /* __linux__ */ static int olsrd_sanity_check_interface_cnf(struct if_config_options * io, struct olsrd_config * cnf, char* name) { struct olsr_lq_mult *mult; /* HELLO interval */ if (io->hello_params.validity_time < 0.0f) { if (cnf->lq_level == 0) io->hello_params.validity_time = NEIGHB_HOLD_TIME; else io->hello_params.validity_time = (int)(REFRESH_INTERVAL / cnf->lq_aging); } if (io->hello_params.emission_interval < cnf->pollrate || io->hello_params.emission_interval > io->hello_params.validity_time) { fprintf(stderr, "Bad HELLO parameters! (em: %0.2f, vt: %0.2f) for dev %s\n", (double)io->hello_params.emission_interval, (double)io->hello_params.validity_time, name); return -1; } /* TC interval */ if (io->tc_params.emission_interval < cnf->pollrate || io->tc_params.emission_interval > io->tc_params.validity_time) { fprintf(stderr, "Bad TC parameters! (em: %0.2f, vt: %0.2f) for dev %s\n", (double)io->tc_params.emission_interval, (double)io->tc_params.validity_time, name); return -1; } if (cnf->min_tc_vtime > 0.0f && (io->tc_params.validity_time / io->tc_params.emission_interval) < 128.0f) { fprintf(stderr, "Please use a tc vtime at least 128 times the emission interval while using the min_tc_vtime hack.\n"); return -1; } /* MID interval */ if (io->mid_params.emission_interval < cnf->pollrate || io->mid_params.emission_interval > io->mid_params.validity_time) { fprintf(stderr, "Bad MID parameters! (em: %0.2f, vt: %0.2f) for dev %s\n", (double)io->mid_params.emission_interval, (double)io->mid_params.validity_time, name); return -1; } /* HNA interval */ if (io->hna_params.emission_interval < cnf->pollrate || io->hna_params.emission_interval > io->hna_params.validity_time) { fprintf(stderr, "Bad HNA parameters! (em: %0.2f, vt: %0.2f) for dev %s\n", (double)io->hna_params.emission_interval, (double)io->hna_params.validity_time, name); return -1; } for (mult = io->lq_mult; mult; mult=mult->next) { if (mult->value > LINK_LOSS_MULTIPLIER) { struct ipaddr_str buf; fprintf(stderr, "Bad Linkquality multiplier ('%s' on IP %s: %0.2f)\n", name, olsr_ip_to_string(&buf, &mult->addr), (double)mult->value / (double)LINK_LOSS_MULTIPLIER); return -1; } } return 0; } int olsrd_sanity_check_cnf(struct olsrd_config *cnf) { struct olsr_if *in = cnf->interfaces; struct if_config_options *io; /* Debug level */ if (cnf->debug_level < MIN_DEBUGLVL || cnf->debug_level > MAX_DEBUGLVL) { fprintf(stderr, "Debuglevel %d is not allowed\n", cnf->debug_level); return -1; } /* IP version */ if (cnf->ip_version != AF_INET && cnf->ip_version != AF_INET6) { fprintf(stderr, "Ipversion %d not allowed!\n", cnf->ip_version); return -1; } /* TOS range */ if (cnf->tos > MAX_TOS) { fprintf(stderr, "TOS %d is not allowed\n", cnf->tos); return -1; } /* TOS ECN */ if (cnf->tos & 0x03) { fprintf(stderr, "TOS %d has set ECN bits, not allowed\n", cnf->tos); return -1; } if (cnf->willingness_auto == false && (cnf->willingness > MAX_WILLINGNESS)) { fprintf(stderr, "Willingness %d is not allowed\n", cnf->willingness); return -1; } /* Hysteresis */ if (cnf->use_hysteresis == true) { if (cnf->hysteresis_param.scaling < (float)MIN_HYST_PARAM || cnf->hysteresis_param.scaling > (float)MAX_HYST_PARAM) { fprintf(stderr, "Hyst scaling %0.2f is not allowed\n", (double)cnf->hysteresis_param.scaling); return -1; } if (cnf->hysteresis_param.thr_high <= cnf->hysteresis_param.thr_low) { fprintf(stderr, "Hyst upper(%0.2f) thr must be bigger than lower(%0.2f) threshold!\n", (double)cnf->hysteresis_param.thr_high, (double)cnf->hysteresis_param.thr_low); return -1; } if (cnf->hysteresis_param.thr_high < (float)MIN_HYST_PARAM || cnf->hysteresis_param.thr_high > (float)MAX_HYST_PARAM) { fprintf(stderr, "Hyst upper thr %0.2f is not allowed\n", (double)cnf->hysteresis_param.thr_high); return -1; } if (cnf->hysteresis_param.thr_low < (float)MIN_HYST_PARAM || cnf->hysteresis_param.thr_low > (float)MAX_HYST_PARAM) { fprintf(stderr, "Hyst lower thr %0.2f is not allowed\n", (double)cnf->hysteresis_param.thr_low); return -1; } } /* Pollrate */ if (cnf->pollrate < (float)MIN_POLLRATE || cnf->pollrate > (float)MAX_POLLRATE) { fprintf(stderr, "Pollrate %0.2f is not allowed\n", (double)cnf->pollrate); return -1; } /* NIC Changes Pollrate */ if (cnf->nic_chgs_pollrate < (float)MIN_NICCHGPOLLRT || cnf->nic_chgs_pollrate > (float)MAX_NICCHGPOLLRT) { fprintf(stderr, "NIC Changes Pollrate %0.2f is not allowed\n", (double)cnf->nic_chgs_pollrate); return -1; } /* TC redundancy */ if (cnf->tc_redundancy != 2) { fprintf(stderr, "Sorry, tc-redundancy 0/1 are not working on 0.5.6. " "It was discovered late in the stable tree development and cannot " "be solved without a difficult change in the dijkstra code. " "Feel free to contact the olsr-user mailinglist " "(http://www.olsr.org/?q=mailing-lists) to learn more " "about the problem. The next version of OLSR will have working " "tc-redundancy again.\n"); return -1; } /* MPR coverage */ if (cnf->mpr_coverage < MIN_MPR_COVERAGE || cnf->mpr_coverage > MAX_MPR_COVERAGE) { fprintf(stderr, "MPR coverage %d is not allowed\n", cnf->mpr_coverage); return -1; } /* Link Q and hysteresis cannot be activated at the same time */ if (cnf->use_hysteresis == true && cnf->lq_level) { fprintf(stderr, "Hysteresis and LinkQuality cannot both be active! Deactivate one of them.\n"); return -1; } /* Link quality level */ if (cnf->lq_level != 0 && cnf->lq_level != 2) { fprintf(stderr, "LQ level %d is not allowed\n", cnf->lq_level); return -1; } /* Link quality window size */ if (cnf->lq_level && (cnf->lq_aging < (float)MIN_LQ_AGING || cnf->lq_aging > (float)MAX_LQ_AGING)) { fprintf(stderr, "LQ aging factor %f is not allowed\n", (double)cnf->lq_aging); return -1; } /* NAT threshold value */ if (cnf->lq_level && (cnf->lq_nat_thresh < 0.1f || cnf->lq_nat_thresh > 1.0f)) { fprintf(stderr, "NAT threshold %f is not allowed\n", (double)cnf->lq_nat_thresh); return -1; } #ifdef __linux__ #if !defined LINUX_VERSION_CODE || !defined KERNEL_VERSION #error "Both LINUX_VERSION_CODE and KERNEL_VERSION need to be defined" #else /* !defined LINUX_VERSION_CODE || !defined KERNEL_VERSION */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) if (cnf->ip_version == AF_INET6 && cnf->smart_gw_active) { fprintf(stderr, "Smart gateways are not supported for linux kernel < 2.6.24 and ipv6\n"); return -1; } #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) */ #endif /* !defined LINUX_VERSION_CODE || !defined KERNEL_VERSION */ /* this rtpolicy settings are also currently only used in Linux */ if (olsrd_sanity_check_rtpolicy(cnf)) { return -1; } #endif /* __linux__ */ if (in == NULL) { fprintf(stderr, "No interfaces configured!\n"); return -1; } if (cnf->min_tc_vtime < 0.0f) { fprintf(stderr, "Error, negative minimal tc time not allowed.\n"); return -1; } if (cnf->min_tc_vtime > 0.0f) { fprintf(stderr, "Warning, you are using the min_tc_vtime hack. We hope you know what you are doing... contact olsr.org otherwise.\n"); } #ifdef __linux__ if ((cnf->smart_gw_use_count < MIN_SMARTGW_USE_COUNT_MIN) || (cnf->smart_gw_use_count > MAX_SMARTGW_USE_COUNT_MAX)) { fprintf(stderr, "Error, bad gateway use count %d, outside of range [%d, %d]\n", cnf->smart_gw_use_count, MIN_SMARTGW_USE_COUNT_MIN, MAX_SMARTGW_USE_COUNT_MAX); return -1; } if (cnf->smart_gw_use_count > 1) { struct sgw_egress_if * sgwegressif = cnf->smart_gw_egress_interfaces; /* check that the sgw takedown percentage is in the range [0, 100] */ if (/*(cnf->smart_gw_takedown_percentage < 0) ||*/ (cnf->smart_gw_takedown_percentage > 100)) { fprintf(stderr, "Error, smart gateway takedown percentage (%u) is not in the range [0, 100]\n", cnf->smart_gw_takedown_percentage); return -1; } if (!cnf->smart_gw_policyrouting_script) { fprintf(stderr, "Error, no policy routing script configured in multi-gateway mode\n"); return -1; } { struct stat statbuf; int r = stat(cnf->smart_gw_policyrouting_script, &statbuf); if (r) { fprintf(stderr, "Error, policy routing script not found: %s\n", strerror(errno)); return -1; } if (!S_ISREG(statbuf.st_mode)) { fprintf(stderr, "Error, policy routing script not a regular file\n"); return -1; } if (statbuf.st_uid) { fprintf(stderr, "Error, policy routing script must be owned by root\n"); return -1; } if (!(statbuf.st_mode & (S_IRUSR | S_IXUSR))) { fprintf(stderr, "Error, policy routing script is not executable\n"); return -1; } } /* egress interface(s) must be set */ if (!sgwegressif) { fprintf(stderr, "Error, no egress interfaces configured in multi-gateway mode\n"); return -1; } /* an egress interface must not be an OLSR interface */ while (sgwegressif) { struct olsr_if * olsrif = cnf->interfaces; while (olsrif) { if (!strcmp(olsrif->name, sgwegressif->name)) { fprintf(stderr, "Error, egress interface %s already is an OLSR interface\n", sgwegressif->name); return -1; } olsrif = olsrif->next; } cnf->smart_gw_egress_interfaces_count++; sgwegressif = sgwegressif->next; } if (cnf->smart_gw_egress_interfaces_count > MAX_SMARTGW_EGRESS_INTERFACE_COUNT_MAX) { fprintf(stderr, "Error, egress interface count %u not in range [1, %u]\n", cnf->smart_gw_egress_interfaces_count, MAX_SMARTGW_EGRESS_INTERFACE_COUNT_MAX); return -1; } { uint8_t egressLow = cnf->smart_gw_mark_offset_egress; uint8_t egressHigh = egressLow + cnf->smart_gw_egress_interfaces_count - 1; uint8_t tunnelsLow = cnf->smart_gw_mark_offset_tunnels; uint8_t tunnelsHigh = tunnelsLow + cnf->smart_gw_use_count - 1; bool overlap = false; /* check that the egress interface marks range does not overflow */ if (egressLow > (UINT8_MAX - cnf->smart_gw_egress_interfaces_count)) { fprintf(stderr, "Error, egress interface mark offset %u together with egress interface count %u overflows range [0, %u]\n", egressLow, cnf->smart_gw_egress_interfaces_count, UINT8_MAX); return -1; } /* check that the tunnel interface marks range does not overflow */ if (tunnelsLow > (UINT8_MAX - cnf->smart_gw_use_count)) { fprintf(stderr, "Error, tunnel interface mark offset %u together with use count %u overflows range [0, %u]\n", tunnelsLow, cnf->smart_gw_use_count, UINT8_MAX); return -1; } /* check that the egress and tunnel marks ranges do not overlap */ overlap = ((tunnelsLow <= egressLow) && (egressLow <= tunnelsHigh)); overlap = overlap || ((tunnelsLow <= egressHigh) && (egressHigh <= tunnelsHigh)); overlap = overlap || ((egressLow <= tunnelsLow) && (tunnelsLow <= egressHigh)); overlap = overlap || ((egressLow <= tunnelsHigh) && (tunnelsHigh <= egressHigh)); if (overlap) { fprintf(stderr, "Error, egress interface mark range [%u, %u] overlaps with tunnel interface mark range [%u, %u]\n", egressLow, egressHigh, tunnelsLow, tunnelsHigh); return -1; } } } if (cnf->smart_gw_period < MIN_SMARTGW_PERIOD || cnf->smart_gw_period > MAX_SMARTGW_PERIOD) { fprintf(stderr, "Error, bad gateway period: %d msec (should be %d-%d)\n", cnf->smart_gw_period, MIN_SMARTGW_PERIOD, MAX_SMARTGW_PERIOD); return -1; } if (cnf->smart_gw_stablecount < MIN_SMARTGW_STABLE || cnf->smart_gw_stablecount > MAX_SMARTGW_STABLE) { fprintf(stderr, "Error, bad gateway stable count: %d (should be %d-%d)\n", cnf->smart_gw_stablecount, MIN_SMARTGW_STABLE, MAX_SMARTGW_STABLE); return -1; } if (((cnf->smart_gw_thresh < MIN_SMARTGW_THRES) || (cnf->smart_gw_thresh > MAX_SMARTGW_THRES)) && (cnf->smart_gw_thresh != 0)) { fprintf(stderr, "Smart gateway threshold %d is not allowed (should be %d-%d)\n", cnf->smart_gw_thresh, MIN_SMARTGW_THRES, MAX_SMARTGW_THRES); return -1; } /* no checks are needed on: * - cnf->smart_gw_weight_exitlink_up * - cnf->smart_gw_weight_exitlink_down * - cnf->smart_gw_weight_etx * - cnf->smart_gw_divider_etx */ if (cnf->smart_gw_type >= GW_UPLINK_CNT) { fprintf(stderr, "Error, illegal gateway uplink type: %d\n", cnf->smart_gw_type); return -1; } if (cnf->smart_gw_downlink < MIN_SMARTGW_SPEED || cnf->smart_gw_downlink > MAX_SMARTGW_SPEED) { fprintf(stderr, "Error, bad gateway downlink speed: %d kbit/s (should be %d-%d)\n", cnf->smart_gw_downlink, MIN_SMARTGW_SPEED, MAX_SMARTGW_SPEED); return -1; } if (cnf->smart_gw_uplink < MIN_SMARTGW_SPEED || cnf->smart_gw_uplink > MAX_SMARTGW_SPEED) { fprintf(stderr, "Error, bad gateway uplink speed: %d kbit/s (should be %d-%d)\n", cnf->smart_gw_uplink, MIN_SMARTGW_SPEED, MAX_SMARTGW_SPEED); return -1; } #endif /* __linux__ */ if (cnf->interface_defaults == NULL) { /* get a default configuration if the user did not specify one */ cnf->interface_defaults = get_default_if_config(); } else { olsrd_print_interface_cnf(cnf->interface_defaults, cnf->interface_defaults, false); olsrd_sanity_check_interface_cnf(cnf->interface_defaults, cnf, interface_defaults_name); } /* Interfaces */ while (in) { struct olsr_lq_mult *mult, *mult_orig; assert(in->cnf); assert(in->cnfi); io = in->cnf; olsrd_print_interface_cnf(in->cnf, in->cnfi, false); /*apply defaults*/ { size_t pos; struct olsr_lq_mult *mult_temp, *mult_orig_walk; uint8_t *cnfptr = (uint8_t*)in->cnf; uint8_t *cnfiptr = (uint8_t*)in->cnfi; uint8_t *defptr = (uint8_t*)cnf->interface_defaults; /*save interface specific lqmults, as they are merged togehter later*/ mult_orig = io->lq_mult; for (pos = 0; pos < sizeof(*in->cnf); pos++) { if (cnfptr[pos] != cnfiptr[pos]) { cnfptr[pos] = defptr[pos]; cnfiptr[pos]=0x00; } else cnfiptr[pos]=0xFF; } io->lq_mult=NULL; /*copy default lqmults into this interface*/ for (mult = cnf->interface_defaults->lq_mult; mult; mult=mult->next) { /*search same lqmult in orig_list*/ for (mult_orig_walk = mult_orig; mult_orig_walk; mult_orig_walk=mult_orig_walk->next) { if (ipequal(&mult_orig_walk->addr,&mult->addr)) { break; } } if (mult_orig_walk == NULL) { mult_temp=malloc(sizeof(struct olsr_lq_mult)); memcpy(mult_temp,mult,sizeof(struct olsr_lq_mult)); mult_temp->next=io->lq_mult; io->lq_mult=mult_temp; } } } if (in->name == NULL || !strlen(in->name)) { fprintf(stderr, "Interface has no name!\n"); return -1; } if (io == NULL) { fprintf(stderr, "Interface %s has no configuration!\n", in->name); return -1; } /*merge lqmults*/ if (mult_orig!=NULL) { io->orig_lq_mult_cnt=1; /*search last of interface specific lqmults*/ mult = mult_orig; while (mult->next!=NULL) { mult=mult->next; } /*append default lqmults ath the end of the interface specific (to ensure they can overwrite them)*/ mult->next=io->lq_mult; io->lq_mult=mult_orig; } if (olsrd_sanity_check_interface_cnf(io, cnf, in->name)) return -1; in = in->next; } return 0; } void olsrd_free_cnf(struct olsrd_config *cnf) { struct ip_prefix_list *hd, *h = cnf->hna_entries; struct olsr_if *ind, *in = cnf->interfaces; struct plugin_entry *ped, *pe = cnf->plugins; struct olsr_lq_mult *mult, *next_mult; while (h) { hd = h; h = h->next; free(hd); } while (in) { for (mult = in->cnf->lq_mult; mult != NULL; mult = next_mult) { next_mult = mult->next; free(mult); } free(in->cnf); free(in->cnfi); ind = in; in = in->next; free(ind); } while (pe) { ped = pe; pe = pe->next; free(ped->name); free(ped); } return; } struct olsrd_config * olsrd_get_default_cnf(void) { struct olsrd_config *c = malloc(sizeof(struct olsrd_config)); if (c == NULL) { fprintf(stderr, "Out of memory %s\n", __func__); return NULL; } set_default_cnf(c); return c; } void set_default_cnf(struct olsrd_config *cnf) { memset(cnf, 0, sizeof(*cnf)); cnf->debug_level = DEF_DEBUGLVL; cnf->no_fork = false; cnf->pidfile = NULL; cnf->host_emul = false; cnf->ip_version = AF_INET; cnf->ipsize = sizeof(struct in_addr); cnf->maxplen = 32; cnf->allow_no_interfaces = DEF_ALLOW_NO_INTS; cnf->tos = DEF_TOS; cnf->olsrport = DEF_OLSRPORT; cnf->rt_proto = DEF_RTPROTO; cnf->rt_table = DEF_RT_AUTO; cnf->rt_table_default = DEF_RT_AUTO; cnf->rt_table_tunnel = DEF_RT_AUTO; cnf->rt_table_pri = DEF_RT_AUTO; cnf->rt_table_default_pri = DEF_RT_AUTO; cnf->rt_table_defaultolsr_pri = DEF_RT_AUTO; cnf->rt_table_tunnel_pri = DEF_RT_AUTO; cnf->willingness_auto = DEF_WILL_AUTO; cnf->willingness = DEF_WILLINGNESS; cnf->ipc_connections = DEF_IPC_CONNECTIONS; cnf->fib_metric = DEF_FIB_METRIC; cnf->use_hysteresis = DEF_USE_HYST; cnf->hysteresis_param.scaling = HYST_SCALING; cnf->hysteresis_param.thr_high = HYST_THRESHOLD_HIGH; cnf->hysteresis_param.thr_low = HYST_THRESHOLD_LOW; cnf->pollrate = DEF_POLLRATE; cnf->nic_chgs_pollrate = DEF_NICCHGPOLLRT; cnf->tc_redundancy = TC_REDUNDANCY; cnf->mpr_coverage = MPR_COVERAGE; cnf->lq_level = DEF_LQ_LEVEL; cnf->lq_fish = DEF_LQ_FISH; cnf->lq_aging = DEF_LQ_AGING; cnf->lq_algorithm = NULL; cnf->lq_nat_thresh = DEF_LQ_NAT_THRESH; cnf->clear_screen = DEF_CLEAR_SCREEN; cnf->del_gws = false; cnf->will_int = 10 * HELLO_INTERVAL; cnf->max_jitter = 0.0; cnf->exit_value = EXIT_SUCCESS; cnf->max_tc_vtime = 0.0; cnf->ioctl_s = 0; cnf->use_niit = DEF_USE_NIIT; cnf->niit4to6_if_index = 0; cnf->niit6to4_if_index = 0; cnf->smart_gw_active = DEF_SMART_GW; cnf->smart_gw_always_remove_server_tunnel = DEF_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL; cnf->smart_gw_use_count = DEF_GW_USE_COUNT; cnf->smart_gw_takedown_percentage = DEF_GW_TAKEDOWN_PERCENTAGE; cnf->smart_gw_policyrouting_script = NULL; cnf->smart_gw_egress_interfaces = NULL; cnf->smart_gw_egress_interfaces_count = 0; cnf->smart_gw_mark_offset_egress = DEF_GW_MARK_OFFSET_EGRESS; cnf->smart_gw_mark_offset_tunnels = DEF_GW_MARK_OFFSET_TUNNELS; cnf->smart_gw_allow_nat = DEF_GW_ALLOW_NAT; cnf->smart_gw_period = DEF_GW_PERIOD; cnf->smart_gw_stablecount = DEF_GW_STABLE_COUNT; cnf->smart_gw_thresh = DEF_GW_THRESH; cnf->smart_gw_weight_exitlink_up = DEF_GW_WEIGHT_EXITLINK_UP; cnf->smart_gw_weight_exitlink_down = DEF_GW_WEIGHT_EXITLINK_DOWN; cnf->smart_gw_weight_etx = DEF_GW_WEIGHT_ETX; cnf->smart_gw_divider_etx = DEF_GW_DIVIDER_ETX; cnf->smart_gw_type = DEF_GW_TYPE; cnf->smart_gw_uplink = DEF_UPLINK_SPEED; cnf->smart_gw_uplink_nat = DEF_GW_UPLINK_NAT; cnf->smart_gw_downlink = DEF_DOWNLINK_SPEED; cnf->use_src_ip_routes = DEF_USE_SRCIP_ROUTES; cnf->set_ip_forward = true; #ifdef __linux__ cnf->rtnl_s = 0; #endif /* __linux__ */ #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ cnf->rts = 0; #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ */ #ifdef HTTPINFO_PUD cnf->pud_position = NULL; #endif /* HTTPINFO_PUD */ } struct if_config_options * get_default_if_config(void) { struct if_config_options *io = malloc(sizeof(*io)); if (io == NULL) { fprintf(stderr, "Out of memory %s\n", __func__); return NULL; } memset(io, 0, sizeof(*io)); io->mode = DEF_IF_MODE; io->ipv6_multicast = ipv6_def_multicast; io->lq_mult = NULL; io->weight.fixed = false; io->weight.value = 0; io->hello_params.emission_interval = HELLO_INTERVAL; io->hello_params.validity_time = NEIGHB_HOLD_TIME; io->tc_params.emission_interval = TC_INTERVAL; io->tc_params.validity_time = TOP_HOLD_TIME; io->mid_params.emission_interval = MID_INTERVAL; io->mid_params.validity_time = MID_HOLD_TIME; io->hna_params.emission_interval = HNA_INTERVAL; io->hna_params.validity_time = HNA_HOLD_TIME; io->autodetect_chg = true; return io; } void olsrd_print_cnf(struct olsrd_config *cnf) { struct ip_prefix_list *h = cnf->hna_entries; struct olsr_if *in = cnf->interfaces; struct plugin_entry *pe = cnf->plugins; struct ip_prefix_list *ie = cnf->ipc_nets; printf(" *** olsrd configuration ***\n"); printf("Debug Level : %d\n", cnf->debug_level); if (cnf->ip_version == AF_INET6) printf("IpVersion : 6\n"); else printf("IpVersion : 4\n"); if (cnf->allow_no_interfaces) printf("No interfaces : ALLOWED\n"); else printf("No interfaces : NOT ALLOWED\n"); printf("TOS : 0x%02x\n", cnf->tos); printf("OlsrPort : %d\n", cnf->olsrport); printf("RtTable : %u\n", cnf->rt_table); printf("RtTableDefault : %u\n", cnf->rt_table_default); printf("RtTableTunnel : %u\n", cnf->rt_table_tunnel); if (cnf->willingness_auto) printf("Willingness : AUTO\n"); else printf("Willingness : %d\n", cnf->willingness); printf("IPC connections : %d\n", cnf->ipc_connections); while (ie) { struct ipaddr_str strbuf; if (ie->net.prefix_len == olsr_cnf->maxplen) { printf("\tHost %s\n", olsr_ip_to_string(&strbuf, &ie->net.prefix)); } else { printf("\tNet %s/%d\n", olsr_ip_to_string(&strbuf, &ie->net.prefix), ie->net.prefix_len); } ie = ie->next; } printf("Pollrate : %0.2f\n", (double)cnf->pollrate); printf("NIC ChangPollrate: %0.2f\n", (double)cnf->nic_chgs_pollrate); printf("TC redundancy : %d\n", cnf->tc_redundancy); printf("MPR coverage : %d\n", cnf->mpr_coverage); printf("LQ level : %d\n", cnf->lq_level); printf("LQ fish eye : %d\n", cnf->lq_fish); printf("LQ aging factor : %f\n", (double)cnf->lq_aging); printf("LQ algorithm name: %s\n", cnf->lq_algorithm ? cnf->lq_algorithm : "default"); printf("NAT threshold : %f\n", (double)cnf->lq_nat_thresh); printf("Clear screen : %s\n", cnf->clear_screen ? "yes" : "no"); printf("Use niit : %s\n", cnf->use_niit ? "yes" : "no"); printf("Smart Gateway : %s\n", cnf->smart_gw_active ? "yes" : "no"); printf("SmGw. Del Srv Tun: %s\n", cnf->smart_gw_always_remove_server_tunnel ? "yes" : "no"); printf("SmGw. Use Count : %u\n", cnf->smart_gw_use_count); printf("SmGw. Takedown%% : %u\n", cnf->smart_gw_takedown_percentage); printf("SmGw. Pol. Script: %s\n", cnf->smart_gw_policyrouting_script); printf("SmGw. Egress I/Fs:"); { struct sgw_egress_if * sgwegressif = cnf->smart_gw_egress_interfaces; while (sgwegressif) { printf(" %s", sgwegressif->name); sgwegressif = sgwegressif->next; } } printf("\n"); printf("SmGw. Mark Egress: %u\n", cnf->smart_gw_mark_offset_egress); printf("SmGw. Mark Tunnel: %u\n", cnf->smart_gw_mark_offset_tunnels); printf("SmGw. Allow NAT : %s\n", cnf->smart_gw_allow_nat ? "yes" : "no"); printf("SmGw. period : %d\n", cnf->smart_gw_period); printf("SmGw. stablecount: %d\n", cnf->smart_gw_stablecount); printf("SmGw. threshold : %d%%\n", cnf->smart_gw_thresh); printf("Smart Gw. Uplink : %s\n", GW_UPLINK_TXT[cnf->smart_gw_type]); printf("SmGw. Uplink NAT : %s\n", cnf->smart_gw_uplink_nat ? "yes" : "no"); printf("Smart Gw. speed : %d kbit/s up, %d kbit/s down\n", cnf->smart_gw_uplink, cnf->smart_gw_downlink); if (olsr_cnf->smart_gw_prefix.prefix_len == 0) { printf("# Smart Gw. prefix : ::/0\n"); } else { printf("Smart Gw. prefix : %s\n", olsr_ip_prefix_to_string(&cnf->smart_gw_prefix)); } /* Interfaces */ if (in) { /*print interface default config*/ printf(" InterfaceDefaults: \n"); olsrd_print_interface_cnf(cnf->interface_defaults, cnf->interface_defaults, true); while (in) { if (cnf->interface_defaults!=in->cnf) { printf(" dev: \"%s\"\n", in->name); olsrd_print_interface_cnf(in->cnf, in->cnfi, false); } in = in->next; } } /* Plugins */ if (pe) { printf("Plugins:\n"); while (pe) { printf("\tName: \"%s\"\n", pe->name); pe = pe->next; } } /* Hysteresis */ if (cnf->use_hysteresis) { printf("Using hysteresis:\n"); printf("\tScaling : %0.2f\n", (double)cnf->hysteresis_param.scaling); printf("\tThr high/low : %0.2f/%0.2f\n", (double)cnf->hysteresis_param.thr_high, (double)cnf->hysteresis_param.thr_low); } else { printf("Not using hysteresis\n"); } /* HNA IPv4 and IPv6 */ if (h) { printf("HNA%d entries:\n", cnf->ip_version == AF_INET ? 4 : 6); while (h) { struct ipaddr_str buf; printf("\t%s/", olsr_ip_to_string(&buf, &h->net.prefix)); if (cnf->ip_version == AF_INET) { union olsr_ip_addr ip; olsr_prefix_to_netmask(&ip, h->net.prefix_len); printf("%s\n", olsr_ip_to_string(&buf, &ip)); } else { printf("%d\n", h->net.prefix_len); } h = h->next; } } } #if defined _WIN32 struct ioinfo { unsigned int handle; unsigned char attr; char buff; int flag; CRITICAL_SECTION lock; }; void win32_stdio_hack(unsigned int handle) { HMODULE lib; struct ioinfo **info; lib = LoadLibrary("msvcrt.dll"); info = (struct ioinfo **)GetProcAddress(lib, "__pioinfo"); // (*info)[1].handle = handle; // (*info)[1].attr = 0x89; // FOPEN | FTEXT | FPIPE; (*info)[2].handle = handle; (*info)[2].attr = 0x89; // stdout->_file = 1; stderr->_file = 2; // setbuf(stdout, NULL); setbuf(stderr, NULL); } void * win32_olsrd_malloc(size_t size) { return malloc(size); } void win32_olsrd_free(void *ptr) { free(ptr); } #endif /* defined _WIN32 */ static void update_has_gateway_fields(void) { struct ip_prefix_list *h; olsr_cnf->has_ipv4_gateway = false; olsr_cnf->has_ipv6_gateway = false; for (h = olsr_cnf->hna_entries; h != NULL; h = h->next) { olsr_cnf->has_ipv4_gateway |= ip_prefix_is_v4_inetgw(&h->net) || ip_prefix_is_mappedv4_inetgw(&h->net); olsr_cnf->has_ipv6_gateway |= ip_prefix_is_v6_inetgw(&h->net); } } void ip_prefix_list_add(struct ip_prefix_list **list, const union olsr_ip_addr *net, uint8_t prefix_len) { struct ip_prefix_list *new_entry = malloc(sizeof(*new_entry)); new_entry->net.prefix = *net; new_entry->net.prefix_len = prefix_len; /* Queue */ new_entry->next = *list; *list = new_entry; /* update gateway flags */ update_has_gateway_fields(); } int ip_prefix_list_remove(struct ip_prefix_list **list, const union olsr_ip_addr *net, uint8_t prefix_len) { struct ip_prefix_list *h = *list, *prev = NULL; while (h != NULL) { if (ipequal(net, &h->net.prefix) && h->net.prefix_len == prefix_len) { /* Dequeue */ if (prev == NULL) { *list = h->next; } else { prev->next = h->next; } free(h); /* update gateway flags */ update_has_gateway_fields(); return 1; } prev = h; h = h->next; } return 0; } struct ip_prefix_list * ip_prefix_list_find(struct ip_prefix_list *list, const union olsr_ip_addr *net, uint8_t prefix_len) { struct ip_prefix_list *h; for (h = list; h != NULL; h = h->next) { if (prefix_len == h->net.prefix_len && ipequal(net, &h->net.prefix)) { return h; } } return NULL; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/cfgparser/olsrd_conf.h000066400000000000000000000044771234304727700200770ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSRD_CONF_H #define _OLSRD_CONF_H #include "olsr_protocol.h" #include "olsr_cfg.h" #define PARSER_VERSION "0.1.2" extern int current_line; struct conf_token { uint32_t integer; float floating; bool boolean; char *string; }; #define DEFAULT_STR(val) \ (((!defcnf) && ((*((uint8_t *)(&cnfi->val)))==0))?" (d)":"") void set_default_cnf(struct olsrd_config *); #endif /* _OLSRD_CONF_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/cfgparser/oparse.y000066400000000000000000001156321234304727700172550ustar00rootroot00000000000000%{ /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "olsrd_conf.h" #include "../defs.h" #include "../ipcalc.h" #include "../net_olsr.h" #include "../link_set.h" #include "../olsr.h" #include #include #include #include #include #include #include #include #include #define PARSER_DEBUG 1 #if defined PARSER_DEBUG && PARSER_DEBUG #define PARSER_DEBUG_PRINTF(x, args...) printf(x, ##args) #else #define PARSER_DEBUG_PRINTF(x, args...) do { } while (0) #endif #define SET_IFS_CONF(ifs, ifcnt, field, value) do { \ for (; ifcnt>0; ifs=ifs->next, ifcnt--) { \ ifs->cnfi->field = (value); \ ifs->cnf->field = (value); \ } \ } while (0) #define YYSTYPE struct conf_token * void yyerror(const char *); int yylex(void); static int ifs_in_curr_cfg = 0; static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg); static int lq_mult_helper(YYSTYPE ip_addr_arg, YYSTYPE mult_arg) { union olsr_ip_addr addr; int i; struct olsr_if *walker; #if defined PARSER_DEBUG && PARSER_DEBUG > 0 printf("\tLinkQualityMult %s %0.2f\n", (ip_addr_arg != NULL) ? ip_addr_arg->string : "any", (double)mult_arg->floating); #endif memset(&addr, 0, sizeof(addr)); if (ip_addr_arg != NULL && inet_pton(olsr_cnf->ip_version, ip_addr_arg->string, &addr) <= 0) { fprintf(stderr, "Cannot parse IP address %s.\n", ip_addr_arg->string); return -1; } walker = olsr_cnf->interfaces; for (i = 0; i < ifs_in_curr_cfg; i++) { struct olsr_lq_mult *mult = malloc(sizeof(*mult)); if (mult == NULL) { fprintf(stderr, "Out of memory (LQ multiplier).\n"); return -1; } mult->addr = addr; mult->value = (uint32_t)(mult_arg->floating * LINK_LOSS_MULTIPLIER); mult->next = walker->cnf->lq_mult; walker->cnfi->lq_mult = walker->cnf->lq_mult = mult; walker->cnf->orig_lq_mult_cnt++; walker->cnfi->orig_lq_mult_cnt=walker->cnf->orig_lq_mult_cnt; walker = walker->next; } if (ip_addr_arg != NULL) { free(ip_addr_arg->string); free(ip_addr_arg); } free(mult_arg); return 0; } static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg) { union olsr_ip_addr ipaddr; PARSER_DEBUG_PRINTF("HNA IPv6 entry: %s/%d\n", ipaddr_arg->string, prefixlen_arg->integer); if (olsr_cnf->ip_version != AF_INET6) { fprintf(stderr, "IPv6 addresses can only be used if \"IpVersion\" == 6, skipping HNA6.\n"); olsr_startup_sleep(3); } else { if(inet_pton(AF_INET6, ipaddr_arg->string, &ipaddr) <= 0) { fprintf(stderr, "ihna6entry: Failed converting IP address %s\n", ipaddr_arg->string); return 1; } if (prefixlen_arg->integer > 128) { fprintf(stderr, "ihna6entry: Illegal IPv6 prefix length %d\n", prefixlen_arg->integer); return 1; } /* Queue */ ip_prefix_list_add(&olsr_cnf->hna_entries, &ipaddr, prefixlen_arg->integer); } free(ipaddr_arg->string); free(ipaddr_arg); free(prefixlen_arg); return 0; } %} %token TOK_SLASH %token TOK_OPEN %token TOK_CLOSE %token TOK_STRING %token TOK_INTEGER %token TOK_FLOAT %token TOK_BOOLEAN %token TOK_IPV6TYPE %token TOK_DEBUGLEVEL %token TOK_IPVERSION %token TOK_HNA4 %token TOK_HNA6 %token TOK_PLUGIN %token TOK_INTERFACE_DEFAULTS %token TOK_INTERFACE %token TOK_NOINT %token TOK_TOS %token TOK_OLSRPORT %token TOK_RTPROTO %token TOK_RTTABLE %token TOK_RTTABLE_DEFAULT %token TOK_RTTABLE_TUNNEL %token TOK_RTTABLE_PRIORITY %token TOK_RTTABLE_DEFAULTOLSR_PRIORITY %token TOK_RTTABLE_TUNNEL_PRIORITY %token TOK_RTTABLE_DEFAULT_PRIORITY %token TOK_WILLINGNESS %token TOK_IPCCON %token TOK_FIBMETRIC %token TOK_USEHYST %token TOK_HYSTSCALE %token TOK_HYSTUPPER %token TOK_HYSTLOWER %token TOK_POLLRATE %token TOK_NICCHGSPOLLRT %token TOK_TCREDUNDANCY %token TOK_MPRCOVERAGE %token TOK_LQ_LEVEL %token TOK_LQ_FISH %token TOK_LQ_AGING %token TOK_LQ_PLUGIN %token TOK_LQ_NAT_THRESH %token TOK_LQ_MULT %token TOK_CLEAR_SCREEN %token TOK_PLPARAM %token TOK_MIN_TC_VTIME %token TOK_LOCK_FILE %token TOK_USE_NIIT %token TOK_SMART_GW %token TOK_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL %token TOK_SMART_GW_USE_COUNT %token TOK_SMART_GW_TAKEDOWN_PERCENTAGE %token TOK_SMART_GW_POLICYROUTING_SCRIPT %token TOK_SMART_GW_EGRESS_IFS %token TOK_SMART_GW_MARK_OFFSET_EGRESS %token TOK_SMART_GW_MARK_OFFSET_TUNNELS %token TOK_SMART_GW_ALLOW_NAT %token TOK_SMART_GW_PERIOD %token TOK_SMART_GW_STABLECOUNT %token TOK_SMART_GW_THRESH %token TOK_SMART_GW_WEIGHT_EXITLINK_UP %token TOK_SMART_GW_WEIGHT_EXITLINK_DOWN %token TOK_SMART_GW_WEIGHT_ETX %token TOK_SMART_GW_DIVIDER_ETX %token TOK_SMART_GW_UPLINK %token TOK_SMART_GW_UPLINK_NAT %token TOK_SMART_GW_SPEED %token TOK_SMART_GW_PREFIX %token TOK_SRC_IP_ROUTES %token TOK_MAIN_IP %token TOK_SET_IPFORWARD %token TOK_HOSTLABEL %token TOK_NETLABEL %token TOK_MAXIPC %token TOK_IFMODE %token TOK_IPV4MULTICAST %token TOK_IP4BROADCAST %token TOK_IPV4BROADCAST %token TOK_IPV6MULTICAST %token TOK_IPV4SRC %token TOK_IPV6SRC %token TOK_IFWEIGHT %token TOK_HELLOINT %token TOK_HELLOVAL %token TOK_TCINT %token TOK_TCVAL %token TOK_MIDINT %token TOK_MIDVAL %token TOK_HNAINT %token TOK_HNAVAL %token TOK_AUTODETCHG %token TOK_IPV4_ADDR %token TOK_IPV6_ADDR %token TOK_DEFAULT %token TOK_AUTO %token TOK_NONE %token TOK_COMMENT %% conf: | conf block | conf stmt ; stmt: idebug | iipversion | fibmetric | bnoint | atos | aolsrport | irtproto | irttable | irttable_default | irttable_tunnel | irttable_priority | irttable_defaultolsr_priority | irttable_tunnel_priority | irttable_default_priority | awillingness | busehyst | fhystscale | fhystupper | fhystlower | fpollrate | fnicchgspollrt | atcredundancy | amprcoverage | alq_level | alq_plugin | alq_fish | anat_thresh | alq_aging | bclear_screen | vcomment | amin_tc_vtime | alock_file | suse_niit | bsmart_gw | bsmart_gw_always_remove_server_tunnel | ismart_gw_use_count | ismart_gw_takedown_percentage | ssmart_gw_policyrouting_script | ismart_gw_mark_offset_egress | ismart_gw_mark_offset_tunnels | bsmart_gw_allow_nat | ismart_gw_period | asmart_gw_stablecount | asmart_gw_thresh | asmart_gw_weight_exitlink_up | asmart_gw_weight_exitlink_down | asmart_gw_weight_etx | asmart_gw_divider_etx | ssmart_gw_uplink | bsmart_gw_uplink_nat | ismart_gw_speed | ismart_gw_prefix | bsrc_ip_routes | amain_ip | bset_ipforward | ssgw_egress_ifs ; block: TOK_HNA4 hna4body | TOK_HNA6 hna6body | TOK_IPCCON ipcbody | ifdblock ifdbody | ifblock ifbody | plblock plbody ; hna4body: TOK_OPEN hna4stmts TOK_CLOSE ; hna4stmts: | hna4stmts hna4stmt ; hna4stmt: vcomment | ihna4entry ; hna6body: TOK_OPEN hna6stmts TOK_CLOSE ; hna6stmts: | hna6stmts hna6stmt ; hna6stmt: vcomment | ihna6entry ; ipcbody: TOK_OPEN ipcstmts TOK_CLOSE ; ipcstmts: | ipcstmts ipcstmt ; ipcstmt: vcomment | imaxipc | ipchost | ipcnet ; ifblock: ifstart ifnicks ; ifnicks: | ifnicks ifnick ; ifbody: TOK_OPEN ifstmts TOK_CLOSE ; ifdbody: TOK_OPEN ifstmts TOK_CLOSE { struct olsr_if *in = olsr_cnf->interfaces; printf("\nInterface Defaults"); /*remove Interface Defaults from Interface list as they are no interface!*/ olsr_cnf->interfaces = in->next; ifs_in_curr_cfg=0; /*free interface but keep its config intact?*/ free(in->cnfi); free(in); } ; ifstmts: | ifstmts ifstmt ; ifstmt: vcomment | iifweight | isetifmode | TOK_IP4BROADCAST isetipv4mc | TOK_IPV4BROADCAST isetipv4mc | TOK_IPV4MULTICAST isetipv4mc | isetipv6mc | isetipv4src | isetipv6src | isethelloint | isethelloval | isettcint | isettcval | isetmidint | isetmidval | isethnaint | isethnaval | isetautodetchg | isetlqmult ; plbody: TOK_OPEN plstmts TOK_CLOSE ; plstmts: | plstmts plstmt ; plstmt: plparam | vcomment ; ifdblock: TOK_INTERFACE_DEFAULTS { struct olsr_if *in = malloc(sizeof(*in)); if (in == NULL) { fprintf(stderr, "Out of memory(ADD IF)\n"); YYABORT; } in->cnf = get_default_if_config(); in->cnfi = get_default_if_config(); if (in->cnf == NULL || in->cnfi == NULL) { fprintf(stderr, "Out of memory(ADD DEFIFRULE)\n"); if (in->cnf) { free(in->cnf); } if (in->cnfi) { free(in->cnfi); } free(in); YYABORT; } //should not need a name any more, as we free it on "}" again //in->name = strdup(interface_defaults_name); olsr_cnf->interface_defaults = in->cnf; /* Queue */ in->next = olsr_cnf->interfaces; olsr_cnf->interfaces = in; ifs_in_curr_cfg=1; fflush(stdout); } ; imaxipc: TOK_MAXIPC TOK_INTEGER { olsr_cnf->ipc_connections = $2->integer; free($2); } ; ipchost: TOK_HOSTLABEL TOK_IPV4_ADDR { union olsr_ip_addr ipaddr; PARSER_DEBUG_PRINTF("\tIPC host: %s\n", $2->string); if (inet_aton($2->string, &ipaddr.v4) == 0) { fprintf(stderr, "Failed converting IP address IPC %s\n", $2->string); YYABORT; } ip_prefix_list_add(&olsr_cnf->ipc_nets, &ipaddr, olsr_cnf->maxplen); free($2->string); free($2); } ; ipcnet: TOK_NETLABEL TOK_IPV4_ADDR TOK_IPV4_ADDR { union olsr_ip_addr ipaddr, netmask; PARSER_DEBUG_PRINTF("\tIPC net: %s/%s\n", $2->string, $3->string); if (inet_pton(AF_INET, $2->string, &ipaddr.v4) == 0) { fprintf(stderr, "Failed converting IP net IPC %s\n", $2->string); YYABORT; } if (inet_pton(AF_INET, $3->string, &netmask.v4) == 0) { fprintf(stderr, "Failed converting IP mask IPC %s\n", $3->string); YYABORT; } ip_prefix_list_add(&olsr_cnf->ipc_nets, &ipaddr, olsr_netmask_to_prefix(&netmask)); free($2->string); free($2); free($3->string); free($3); } | TOK_NETLABEL TOK_IPV4_ADDR TOK_SLASH TOK_INTEGER { union olsr_ip_addr ipaddr; PARSER_DEBUG_PRINTF("\tIPC net: %s/%s\n", $2->string, $3->string); if (inet_pton(AF_INET, $2->string, &ipaddr.v4) == 0) { fprintf(stderr, "Failed converting IP net IPC %s\n", $2->string); YYABORT; } if ($4->integer > olsr_cnf->maxplen) { fprintf(stderr, "ipcnet: Prefix len %u > %d is not allowed!\n", $4->integer, olsr_cnf->maxplen); YYABORT; } ip_prefix_list_add(&olsr_cnf->ipc_nets, &ipaddr, $4->integer); free($2->string); free($2); free($4); } ; iifweight: TOK_IFWEIGHT TOK_INTEGER { int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("Fixed willingness: %d\n", $2->integer); while (ifcnt) { ifs->cnf->weight.value = $2->integer; ifs->cnf->weight.fixed = true; ifs->cnfi->weight.value = $2->integer; ifs->cnfi->weight.fixed = true; ifs = ifs->next; ifcnt--; } free($2); } ; isetifmode: TOK_IFMODE TOK_STRING { int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; int mode = (strcmp($2->string, "ether") == 0)?IF_MODE_ETHER:IF_MODE_MESH; PARSER_DEBUG_PRINTF("\tMode: %s\n", $2->string); SET_IFS_CONF(ifs, ifcnt, mode, mode); free($2->string); free($2); } ; /* called if prepended with TOK_IPV4MULTICAST TOK_IP4BROADCAST TOK_IPV4BROADCAST */ isetipv4mc: TOK_IPV4_ADDR { struct in_addr in; int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tIPv4 broadcast: %s\n", $1->string); if (inet_aton($1->string, &in) == 0) { fprintf(stderr, "isetipv4br: Failed converting IP address %s\n", $1->string); YYABORT; } SET_IFS_CONF(ifs, ifcnt, ipv4_multicast.v4, in); free($1->string); free($1); } ; isetipv6mc: TOK_IPV6MULTICAST TOK_IPV6_ADDR { struct in6_addr in6; int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tIPv6 multicast: %s\n", $2->string); if (inet_pton(AF_INET6, $2->string, &in6) <= 0) { fprintf(stderr, "isetipv6mc: Failed converting IP address %s\n", $2->string); YYABORT; } SET_IFS_CONF(ifs, ifcnt, ipv6_multicast.v6, in6); free($2->string); free($2); } ; isetipv4src: TOK_IPV4SRC TOK_IPV4_ADDR { struct in_addr in; int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tIPv4 src: %s\n", $2->string); if (inet_aton($2->string, &in) == 0) { fprintf(stderr, "isetipv4src: Failed converting IP address %s\n", $2->string); YYABORT; } SET_IFS_CONF(ifs, ifcnt, ipv4_src.v4, in); free($2->string); free($2); } ; isetipv6src: TOK_IPV6SRC TOK_IPV6_ADDR TOK_SLASH TOK_INTEGER { struct olsr_ip_prefix pr6; int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tIPv6 src prefix: %s/%d\n", $2->string, $4->integer); if (inet_pton(AF_INET6, $2->string, &pr6.prefix.v6) <= 0) { fprintf(stderr, "isetipv6src: Failed converting IP address %s\n", $2->string); YYABORT; } if ($4->integer > 128) { fprintf(stderr, "isetipv6src: Illegal Prefixlength %d\n", $4->integer); YYABORT; } pr6.prefix_len = $4->integer; SET_IFS_CONF(ifs, ifcnt, ipv6_src, pr6); free($2->string); free($2); } | TOK_IPV6SRC TOK_IPV6_ADDR { struct olsr_ip_prefix pr6; int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tIPv6 src prefix: %s/%d\n", $2->string, 128); if (inet_pton(AF_INET6, $2->string, &pr6.prefix.v6) <= 0) { fprintf(stderr, "isetipv6src: Failed converting IP address %s\n", $2->string); YYABORT; } pr6.prefix_len = 128; SET_IFS_CONF(ifs, ifcnt, ipv6_src, pr6); free($2->string); free($2); } ; isethelloint: TOK_HELLOINT TOK_FLOAT { int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tHELLO interval: %0.2f\n", (double)$2->floating); SET_IFS_CONF(ifs, ifcnt, hello_params.emission_interval, $2->floating); free($2); } ; isethelloval: TOK_HELLOVAL TOK_FLOAT { int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tHELLO validity: %0.2f\n", (double)$2->floating); SET_IFS_CONF(ifs, ifcnt, hello_params.validity_time, $2->floating); free($2); } ; isettcint: TOK_TCINT TOK_FLOAT { int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tTC interval: %0.2f\n", (double)$2->floating); SET_IFS_CONF(ifs, ifcnt, tc_params.emission_interval, $2->floating); free($2); } ; isettcval: TOK_TCVAL TOK_FLOAT { int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tTC validity: %0.2f\n", (double)$2->floating); SET_IFS_CONF(ifs, ifcnt, tc_params.validity_time, $2->floating); free($2); } ; isetmidint: TOK_MIDINT TOK_FLOAT { int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tMID interval: %0.2f\n", (double)$2->floating); SET_IFS_CONF(ifs, ifcnt, mid_params.emission_interval, $2->floating); free($2); } ; isetmidval: TOK_MIDVAL TOK_FLOAT { int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tMID validity: %0.2f\n", (double)$2->floating); SET_IFS_CONF(ifs, ifcnt, mid_params.validity_time, $2->floating); free($2); } ; isethnaint: TOK_HNAINT TOK_FLOAT { int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tHNA interval: %0.2f\n", (double)$2->floating); SET_IFS_CONF(ifs, ifcnt, hna_params.emission_interval, $2->floating); free($2); } ; isethnaval: TOK_HNAVAL TOK_FLOAT { int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tHNA validity: %0.2f\n", (double)$2->floating); SET_IFS_CONF(ifs, ifcnt, hna_params.validity_time, $2->floating); free($2); } ; isetautodetchg: TOK_AUTODETCHG TOK_BOOLEAN { int ifcnt = ifs_in_curr_cfg; struct olsr_if *ifs = olsr_cnf->interfaces; PARSER_DEBUG_PRINTF("\tAutodetect changes: %s\n", $2->boolean ? "YES" : "NO"); SET_IFS_CONF(ifs, ifcnt, autodetect_chg, $2->boolean); free($2); } ; isetlqmult: TOK_LQ_MULT TOK_DEFAULT TOK_FLOAT { if (lq_mult_helper($2, $3) < 0) { YYABORT; } } | TOK_LQ_MULT TOK_IPV4_ADDR TOK_FLOAT { if (lq_mult_helper($2, $3) < 0) { YYABORT; } } | TOK_LQ_MULT TOK_IPV6_ADDR TOK_FLOAT { if (lq_mult_helper($2, $3) < 0) { YYABORT; } } ; idebug: TOK_DEBUGLEVEL TOK_INTEGER { olsr_cnf->debug_level = $2->integer; PARSER_DEBUG_PRINTF("Debug level: %d\n", olsr_cnf->debug_level); free($2); } ; iipversion: TOK_IPVERSION TOK_INTEGER { if ($2->integer == 4) { olsr_cnf->ip_version = AF_INET; olsr_cnf->ipsize = sizeof(struct in_addr); olsr_cnf->maxplen = 32; } else if ($2->integer == 6) { olsr_cnf->ip_version = AF_INET6; olsr_cnf->ipsize = sizeof(struct in6_addr); olsr_cnf->maxplen = 128; } else { fprintf(stderr, "IPversion must be 4 or 6!\n"); YYABORT; } PARSER_DEBUG_PRINTF("IpVersion: %d\n", $2->integer); free($2); } ; fibmetric: TOK_FIBMETRIC TOK_STRING { int i; PARSER_DEBUG_PRINTF("FIBMetric: %s\n", $2->string); for (i=0; istring, FIB_METRIC_TXT[i]) == 0) { olsr_cnf->fib_metric = i; break; } } if (i == FIBM_CNT) { fprintf(stderr, "Bad FIBMetric value: %s\n", $2->string); YYABORT; } free($1); free($2->string); free($2); } ; ihna4entry: TOK_IPV4_ADDR TOK_IPV4_ADDR { union olsr_ip_addr ipaddr, netmask; if (olsr_cnf->ip_version == AF_INET6) { fprintf(stderr, "IPv4 addresses can only be used if \"IpVersion\" == 4, skipping HNA.\n"); olsr_startup_sleep(3); } else { PARSER_DEBUG_PRINTF("HNA IPv4 entry: %s/%s\n", $1->string, $2->string); if (inet_pton(AF_INET, $1->string, &ipaddr.v4) <= 0) { fprintf(stderr, "ihna4entry: Failed converting IP address %s\n", $1->string); YYABORT; } if (inet_pton(AF_INET, $2->string, &netmask.v4) <= 0) { fprintf(stderr, "ihna4entry: Failed converting IP address %s\n", $1->string); YYABORT; } /* check that the given IP address is actually a network address */ if ((ipaddr.v4.s_addr & ~netmask.v4.s_addr) != 0) { fprintf(stderr, "ihna4entry: The ipaddress \"%s\" is not a network address!\n", $1->string); YYABORT; } /* Queue */ ip_prefix_list_add(&olsr_cnf->hna_entries, &ipaddr, olsr_netmask_to_prefix(&netmask)); } free($1->string); free($1); free($2->string); free($2); } | TOK_IPV4_ADDR TOK_SLASH TOK_INTEGER { union olsr_ip_addr ipaddr, netmask; if (olsr_cnf->ip_version == AF_INET6) { fprintf(stderr, "IPv4 addresses can only be used if \"IpVersion\" == 4, skipping HNA.\n"); olsr_startup_sleep(3); } else { PARSER_DEBUG_PRINTF("HNA IPv4 entry: %s/%d\n", $1->string, $3->integer); if (inet_pton(AF_INET, $1->string, &ipaddr.v4) <= 0) { fprintf(stderr, "ihna4entry: Failed converting IP address %s\n", $1->string); YYABORT; } if ($3->integer > olsr_cnf->maxplen) { fprintf(stderr, "ihna4entry: Prefix len %u > %d is not allowed!\n", $3->integer, olsr_cnf->maxplen); YYABORT; } /* check that the given IP address is actually a network address */ olsr_prefix_to_netmask(&netmask, $3->integer); if ((ipaddr.v4.s_addr & ~netmask.v4.s_addr) != 0) { fprintf(stderr, "ihna4entry: The ipaddress \"%s\" is not a network address!\n", $1->string); YYABORT; } /* Queue */ ip_prefix_list_add(&olsr_cnf->hna_entries, &ipaddr, $3->integer); } free($1->string); free($1); free($3); } ; ihna6entry: TOK_IPV6_ADDR TOK_INTEGER { if (add_ipv6_addr($1, $2)) { YYABORT; } } | TOK_IPV6_ADDR TOK_SLASH TOK_INTEGER { if (add_ipv6_addr($1, $3)) { YYABORT; } } ; ifstart: TOK_INTERFACE { PARSER_DEBUG_PRINTF("setting ifs_in_curr_cfg = 0\n"); ifs_in_curr_cfg = 0; } ; ifnick: TOK_STRING { struct olsr_if *in, *last; in = olsr_cnf->interfaces; last = NULL; while (in != NULL) { if (strcmp(in->name, $1->string) == 0) { free ($1->string); break; } last = in; in = in->next; } if (in != NULL) { /* remove old interface from list to add it later at the beginning */ if (last) { last->next = in->next; } else { olsr_cnf->interfaces = in->next; } } else { in = malloc(sizeof(*in)); if (in == NULL) { fprintf(stderr, "Out of memory(ADD IF)\n"); YYABORT; } memset(in, 0, sizeof(*in)); in->cnf = malloc(sizeof(*in->cnf)); if (in->cnf == NULL) { fprintf(stderr, "Out of memory(ADD IFRULE)\n"); free(in); YYABORT; } memset(in->cnf, 0x00, sizeof(*in->cnf)); in->cnfi = malloc(sizeof(*in->cnfi)); if (in->cnfi == NULL) { fprintf(stderr, "Out of memory(ADD IFRULE)\n"); free (in->cnf); free(in); YYABORT; } memset(in->cnfi, 0xFF, sizeof(*in->cnfi)); in->cnfi->orig_lq_mult_cnt=0; in->name = $1->string; } /* Queue */ in->next = olsr_cnf->interfaces; olsr_cnf->interfaces = in; ifs_in_curr_cfg++; free($1); } ; bnoint: TOK_NOINT TOK_BOOLEAN { PARSER_DEBUG_PRINTF("Noint set to %d\n", $2->boolean); olsr_cnf->allow_no_interfaces = $2->boolean; free($2); } ; atos: TOK_TOS TOK_INTEGER { PARSER_DEBUG_PRINTF("TOS: %d\n", $2->integer); olsr_cnf->tos = $2->integer; free($2); } ; aolsrport: TOK_OLSRPORT TOK_INTEGER { PARSER_DEBUG_PRINTF("OlsrPort: %d\n", $2->integer); olsr_cnf->olsrport = $2->integer; free($2); } ; irtproto: TOK_RTPROTO TOK_INTEGER { PARSER_DEBUG_PRINTF("RtProto: %d\n", $2->integer); olsr_cnf->rt_proto = $2->integer; free($2); } ; irttable: TOK_RTTABLE TOK_INTEGER { PARSER_DEBUG_PRINTF("RtTable: %d\n", $2->integer); olsr_cnf->rt_table = $2->integer; free($2); } | TOK_RTTABLE TOK_AUTO { PARSER_DEBUG_PRINTF("RtTable: auto\n"); olsr_cnf->rt_table = DEF_RT_AUTO; free($2); } ; irttable_default: TOK_RTTABLE_DEFAULT TOK_INTEGER { PARSER_DEBUG_PRINTF("RtTableDefault: %d\n", $2->integer); olsr_cnf->rt_table_default = $2->integer; free($2); } | TOK_RTTABLE_DEFAULT TOK_AUTO { PARSER_DEBUG_PRINTF("RtTableDefault: auto\n"); olsr_cnf->rt_table_default = DEF_RT_AUTO; free($2); } ; irttable_tunnel: TOK_RTTABLE_TUNNEL TOK_INTEGER { PARSER_DEBUG_PRINTF("RtTableTunnel: %d\n", $2->integer); olsr_cnf->rt_table_tunnel = $2->integer; free($2); } | TOK_RTTABLE_TUNNEL TOK_AUTO { PARSER_DEBUG_PRINTF("RtTableTunnel: auto\n"); olsr_cnf->rt_table_tunnel = DEF_RT_AUTO; free($2); } ; irttable_priority: TOK_RTTABLE_PRIORITY TOK_INTEGER { PARSER_DEBUG_PRINTF("RtTablePriority: %d\n", $2->integer); olsr_cnf->rt_table_pri = $2->integer; free($2); } | TOK_RTTABLE_PRIORITY TOK_AUTO { PARSER_DEBUG_PRINTF("RtTablePriority: auto\n"); olsr_cnf->rt_table_pri = DEF_RT_AUTO; free($2); } | TOK_RTTABLE_PRIORITY TOK_NONE { PARSER_DEBUG_PRINTF("RtTablePriority: none\n"); olsr_cnf->rt_table_pri = DEF_RT_NONE; free($2); } ; irttable_default_priority: TOK_RTTABLE_DEFAULT_PRIORITY TOK_INTEGER { PARSER_DEBUG_PRINTF("RtTableDefaultPriority: %d\n", $2->integer); olsr_cnf->rt_table_default_pri = $2->integer; free($2); } | TOK_RTTABLE_DEFAULT_PRIORITY TOK_AUTO { PARSER_DEBUG_PRINTF("RtTableDefaultPriority: auto\n"); olsr_cnf->rt_table_default_pri = DEF_RT_AUTO; free($2); } | TOK_RTTABLE_DEFAULT_PRIORITY TOK_NONE { PARSER_DEBUG_PRINTF("RtTableDefaultPriority: none\n"); olsr_cnf->rt_table_default_pri = DEF_RT_NONE; free($2); } ; irttable_tunnel_priority: TOK_RTTABLE_TUNNEL_PRIORITY TOK_INTEGER { PARSER_DEBUG_PRINTF("RtTableTunnelPriority: %d\n", $2->integer); olsr_cnf->rt_table_tunnel_pri = $2->integer; free($2); } | TOK_RTTABLE_TUNNEL_PRIORITY TOK_AUTO { PARSER_DEBUG_PRINTF("RtTableTunnelPriority: auto\n"); olsr_cnf->rt_table_tunnel_pri = DEF_RT_AUTO; free($2); } | TOK_RTTABLE_TUNNEL_PRIORITY TOK_NONE { PARSER_DEBUG_PRINTF("RtTableTunnelPriority: none\n"); olsr_cnf->rt_table_tunnel_pri = DEF_RT_NONE; free($2); } ; irttable_defaultolsr_priority: TOK_RTTABLE_DEFAULTOLSR_PRIORITY TOK_INTEGER { PARSER_DEBUG_PRINTF("RtTableDefaultOlsrPriority: %d\n", $2->integer); olsr_cnf->rt_table_defaultolsr_pri = $2->integer; free($2); } | TOK_RTTABLE_DEFAULTOLSR_PRIORITY TOK_AUTO { PARSER_DEBUG_PRINTF("RtTableDefaultOlsrPriority: auto\n"); olsr_cnf->rt_table_defaultolsr_pri = DEF_RT_AUTO; free($2); } | TOK_RTTABLE_DEFAULTOLSR_PRIORITY TOK_NONE { PARSER_DEBUG_PRINTF("RtTableDefaultOlsrPriority: none\n"); olsr_cnf->rt_table_defaultolsr_pri = DEF_RT_NONE; free($2); } ; awillingness: TOK_WILLINGNESS TOK_INTEGER { PARSER_DEBUG_PRINTF("Willingness: %d\n", $2->integer); olsr_cnf->willingness_auto = false; olsr_cnf->willingness = $2->integer; free($2); } ; busehyst: TOK_USEHYST TOK_BOOLEAN { olsr_cnf->use_hysteresis = $2->boolean; PARSER_DEBUG_PRINTF("Hysteresis %s\n", olsr_cnf->use_hysteresis ? "enabled" : "disabled"); free($2); } ; fhystscale: TOK_HYSTSCALE TOK_FLOAT { olsr_cnf->hysteresis_param.scaling = $2->floating; PARSER_DEBUG_PRINTF("Hysteresis Scaling: %0.2f\n", (double)$2->floating); free($2); } ; fhystupper: TOK_HYSTUPPER TOK_FLOAT { olsr_cnf->hysteresis_param.thr_high = $2->floating; PARSER_DEBUG_PRINTF("Hysteresis UpperThr: %0.2f\n", (double)$2->floating); free($2); } ; fhystlower: TOK_HYSTLOWER TOK_FLOAT { olsr_cnf->hysteresis_param.thr_low = $2->floating; PARSER_DEBUG_PRINTF("Hysteresis LowerThr: %0.2f\n", (double)$2->floating); free($2); } ; fpollrate: TOK_POLLRATE TOK_FLOAT { PARSER_DEBUG_PRINTF("Pollrate %0.2f\n", (double)$2->floating); olsr_cnf->pollrate = $2->floating; free($2); } ; fnicchgspollrt: TOK_NICCHGSPOLLRT TOK_FLOAT { PARSER_DEBUG_PRINTF("NIC Changes Pollrate %0.2f\n", (double)$2->floating); olsr_cnf->nic_chgs_pollrate = $2->floating; free($2); } ; atcredundancy: TOK_TCREDUNDANCY TOK_INTEGER { PARSER_DEBUG_PRINTF("TC redundancy %d\n", $2->integer); olsr_cnf->tc_redundancy = $2->integer; free($2); } ; amprcoverage: TOK_MPRCOVERAGE TOK_INTEGER { PARSER_DEBUG_PRINTF("MPR coverage %d\n", $2->integer); olsr_cnf->mpr_coverage = $2->integer; free($2); } ; alq_level: TOK_LQ_LEVEL TOK_INTEGER { PARSER_DEBUG_PRINTF("Link quality level %d\n", $2->integer); olsr_cnf->lq_level = $2->integer; free($2); } ; alq_fish: TOK_LQ_FISH TOK_INTEGER { PARSER_DEBUG_PRINTF("Link quality fish eye %d\n", $2->integer); olsr_cnf->lq_fish = $2->integer; free($2); } ; alq_aging: TOK_LQ_AGING TOK_FLOAT { PARSER_DEBUG_PRINTF("Link quality aging factor %f\n", (double)$2->floating); olsr_cnf->lq_aging = $2->floating; free($2); } ; amin_tc_vtime: TOK_MIN_TC_VTIME TOK_FLOAT { PARSER_DEBUG_PRINTF("Minimum TC validity time %f\n", (double)$2->floating); olsr_cnf->min_tc_vtime = $2->floating; free($2); } ; alock_file: TOK_LOCK_FILE TOK_STRING { PARSER_DEBUG_PRINTF("Lock file %s\n", $2->string); olsr_cnf->lock_file = $2->string; free($2); } ; alq_plugin: TOK_LQ_PLUGIN TOK_STRING { olsr_cnf->lq_algorithm = $2->string; PARSER_DEBUG_PRINTF("LQ Algorithm: %s\n", $2->string); free($2); } ; anat_thresh: TOK_LQ_NAT_THRESH TOK_FLOAT { PARSER_DEBUG_PRINTF("NAT threshold %0.2f\n", (double)$2->floating); olsr_cnf->lq_nat_thresh = $2->floating; free($2); } ; bclear_screen: TOK_CLEAR_SCREEN TOK_BOOLEAN { PARSER_DEBUG_PRINTF("Clear screen %s\n", $2->boolean ? "enabled" : "disabled"); olsr_cnf->clear_screen = $2->boolean; free($2); } ; suse_niit: TOK_USE_NIIT TOK_BOOLEAN { PARSER_DEBUG_PRINTF("Use NIIT ip translation: %s\n", $2->boolean ? "enabled" : "disabled"); olsr_cnf->use_niit = $2->boolean; free($2); } ; bsmart_gw: TOK_SMART_GW TOK_BOOLEAN { PARSER_DEBUG_PRINTF("Smart gateway system: %s\n", $2->boolean ? "enabled" : "disabled"); olsr_cnf->smart_gw_active = $2->boolean; free($2); } ; bsmart_gw_always_remove_server_tunnel: TOK_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL TOK_BOOLEAN { PARSER_DEBUG_PRINTF("Smart gateway always remove server tunnel: %s\n", $2->boolean ? "enabled" : "disabled"); olsr_cnf->smart_gw_always_remove_server_tunnel = $2->boolean; free($2); } ; ismart_gw_use_count: TOK_SMART_GW_USE_COUNT TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway use count: %d\n", $2->integer); olsr_cnf->smart_gw_use_count = $2->integer; free($2); } ; ismart_gw_takedown_percentage: TOK_SMART_GW_TAKEDOWN_PERCENTAGE TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway takedown percentage: %d\n", $2->integer); olsr_cnf->smart_gw_takedown_percentage = $2->integer; free($2); } ; ssmart_gw_policyrouting_script: TOK_SMART_GW_POLICYROUTING_SCRIPT TOK_STRING { PARSER_DEBUG_PRINTF("Smart gateway policy routing script: %s\n", $2->string); olsr_cnf->smart_gw_policyrouting_script = $2->string; free($2); } ; ssgw_egress_ifs: TOK_SMART_GW_EGRESS_IFS sgw_egress_ifs ; sgw_egress_ifs: | sgw_egress_ifs sgw_egress_if ; sgw_egress_if: TOK_STRING { struct sgw_egress_if *in, *last; char * str = $1->string; char *end; /* Trim leading space */ while(isspace(*str)) { str++; } /* Trim trailing space */ end = str + strlen(str) - 1; while((end > str) && isspace(*end)) { end--; } /* Write new null terminator */ *(end + 1) = '\0'; if(*str == 0) { PARSER_DEBUG_PRINTF("Smart gateway egress interface: (skipped)\n"); } else { PARSER_DEBUG_PRINTF("Smart gateway egress interface: %s\n", str); in = olsr_cnf->smart_gw_egress_interfaces; last = NULL; while (in != NULL) { if (strcmp(in->name, str) == 0) { free ($1->string); break; } last = in; in = in->next; } if (in != NULL) { /* remove old interface from list to add it later at the beginning */ if (last) { last->next = in->next; } else { olsr_cnf->smart_gw_egress_interfaces = in->next; } } else { in = malloc(sizeof(*in)); if (in == NULL) { fprintf(stderr, "Out of memory(ADD IF)\n"); YYABORT; } memset(in, 0, sizeof(*in)); in->name = str; } /* Queue */ in->next = olsr_cnf->smart_gw_egress_interfaces; olsr_cnf->smart_gw_egress_interfaces = in; free($1); } } ; ismart_gw_mark_offset_egress: TOK_SMART_GW_MARK_OFFSET_EGRESS TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway mark offset egress interfaces: %d\n", $2->integer); olsr_cnf->smart_gw_mark_offset_egress = $2->integer; free($2); } ; ismart_gw_mark_offset_tunnels: TOK_SMART_GW_MARK_OFFSET_TUNNELS TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway mark offset tunnel interfaces: %d\n", $2->integer); olsr_cnf->smart_gw_mark_offset_tunnels = $2->integer; free($2); } ; bsmart_gw_allow_nat: TOK_SMART_GW_ALLOW_NAT TOK_BOOLEAN { PARSER_DEBUG_PRINTF("Smart gateway allow client nat: %s\n", $2->boolean ? "yes" : "no"); olsr_cnf->smart_gw_allow_nat = $2->boolean; free($2); } ; ismart_gw_period: TOK_SMART_GW_PERIOD TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway period: %d\n", $2->integer); olsr_cnf->smart_gw_period = $2->integer; free($2); } ; asmart_gw_stablecount: TOK_SMART_GW_STABLECOUNT TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway stablecount: %d\n", $2->integer); olsr_cnf->smart_gw_stablecount = $2->integer; free($2); } ; asmart_gw_thresh: TOK_SMART_GW_THRESH TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway threshold: %d\n", $2->integer); olsr_cnf->smart_gw_thresh = $2->integer; free($2); } ; asmart_gw_weight_exitlink_up: TOK_SMART_GW_WEIGHT_EXITLINK_UP TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway exitlink uplink weight: %d\n", $2->integer); olsr_cnf->smart_gw_weight_exitlink_up = $2->integer; free($2); } ; asmart_gw_weight_exitlink_down: TOK_SMART_GW_WEIGHT_EXITLINK_DOWN TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway exitlink downlink weight: %d\n", $2->integer); olsr_cnf->smart_gw_weight_exitlink_down = $2->integer; free($2); } ; asmart_gw_weight_etx: TOK_SMART_GW_WEIGHT_ETX TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway ETX weight: %d\n", $2->integer); olsr_cnf->smart_gw_weight_etx = $2->integer; free($2); } ; asmart_gw_divider_etx: TOK_SMART_GW_DIVIDER_ETX TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway ETX divider: %d\n", $2->integer); olsr_cnf->smart_gw_divider_etx = $2->integer; free($2); } ; ssmart_gw_uplink: TOK_SMART_GW_UPLINK TOK_STRING { PARSER_DEBUG_PRINTF("Smart gateway uplink: %s\n", $2->string); if (strcasecmp($2->string, GW_UPLINK_TXT[GW_UPLINK_NONE]) == 0) { olsr_cnf->smart_gw_type = GW_UPLINK_NONE; } else if (strcasecmp($2->string, GW_UPLINK_TXT[GW_UPLINK_IPV4]) == 0) { olsr_cnf->smart_gw_type = GW_UPLINK_IPV4; } else if (strcasecmp($2->string, GW_UPLINK_TXT[GW_UPLINK_IPV6]) == 0) { olsr_cnf->smart_gw_type = GW_UPLINK_IPV6; } else if (strcasecmp($2->string, GW_UPLINK_TXT[GW_UPLINK_IPV46]) == 0) { olsr_cnf->smart_gw_type = GW_UPLINK_IPV46; } else { fprintf(stderr, "Bad gateway uplink type: %s\n", $2->string); YYABORT; } free($2); } ; ismart_gw_speed: TOK_SMART_GW_SPEED TOK_INTEGER TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway speed: %u uplink/%u downlink kbit/s\n", $2->integer, $3->integer); olsr_cnf->smart_gw_uplink = $2->integer; olsr_cnf->smart_gw_downlink = $3->integer; free($2); free($3); } ; bsmart_gw_uplink_nat: TOK_SMART_GW_UPLINK_NAT TOK_BOOLEAN { PARSER_DEBUG_PRINTF("Smart gateway uplink nat: %s\n", $2->boolean ? "yes" : "no"); olsr_cnf->smart_gw_uplink_nat = $2->boolean; free($2); } ; ismart_gw_prefix: TOK_SMART_GW_PREFIX TOK_IPV6_ADDR TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway prefix: %s %u\n", $2->string, $3->integer); if (inet_pton(olsr_cnf->ip_version, $2->string, &olsr_cnf->smart_gw_prefix.prefix) == 0) { fprintf(stderr, "Bad IP part of gateway prefix: %s\n", $2->string); YYABORT; } olsr_cnf->smart_gw_prefix.prefix_len = (uint8_t)$3->integer; free($2); free($3); } | TOK_SMART_GW_PREFIX TOK_IPV6_ADDR TOK_SLASH TOK_INTEGER { PARSER_DEBUG_PRINTF("Smart gateway prefix: %s %u\n", $2->string, $4->integer); if (inet_pton(olsr_cnf->ip_version, $2->string, &olsr_cnf->smart_gw_prefix.prefix) == 0) { fprintf(stderr, "Bad IP part of gateway prefix: %s\n", $2->string); YYABORT; } olsr_cnf->smart_gw_prefix.prefix_len = (uint8_t)$4->integer; free($2); free($4); } ; bsrc_ip_routes: TOK_SRC_IP_ROUTES TOK_BOOLEAN { PARSER_DEBUG_PRINTF("Use originator for routes src-ip: %s\n", $2->boolean ? "yes" : "no"); if (olsr_cnf->ip_version != AF_INET) { fprintf(stderr, "Source ip routes not possible with IPV6\n"); YYABORT; } else olsr_cnf->use_src_ip_routes = $2->boolean; free($2); } ; amain_ip: TOK_MAIN_IP TOK_IPV4_ADDR { PARSER_DEBUG_PRINTF("Fixed Main IP: %s\n", $2->string); if (olsr_cnf->ip_version != AF_INET || inet_pton(olsr_cnf->ip_version, $2->string, &olsr_cnf->main_addr) != 1) { fprintf(stderr, "Bad main IP: %s\n", $2->string); YYABORT; } else olsr_cnf->unicast_src_ip = olsr_cnf->main_addr; free($2); } | TOK_MAIN_IP TOK_IPV6_ADDR { PARSER_DEBUG_PRINTF("Fixed Main IP: %s\n", $2->string); if (olsr_cnf->ip_version != AF_INET6 || inet_pton(olsr_cnf->ip_version, $2->string, &olsr_cnf->main_addr) != 1) { fprintf(stderr, "Bad main IP: %s\n", $2->string); YYABORT; } free($2); } ; bset_ipforward: TOK_SET_IPFORWARD TOK_BOOLEAN { PARSER_DEBUG_PRINTF("Set IP-Forward procfile variable: %s\n", $2->boolean ? "yes" : "no"); olsr_cnf->set_ip_forward = $2->boolean; free($2); } ; plblock: TOK_PLUGIN TOK_STRING { struct plugin_entry *pe, *last; pe = olsr_cnf->plugins; last = NULL; while (pe != NULL) { if (strcmp(pe->name, $2->string) == 0) { free ($2->string); break; } last = pe; pe = pe->next; } if (pe != NULL) { /* remove old plugin from list to add it later at the beginning */ if (last) { last->next = pe->next; } else { olsr_cnf->plugins = pe->next; } } else { pe = malloc(sizeof(*pe)); if (pe == NULL) { fprintf(stderr, "Out of memory(ADD PL)\n"); YYABORT; } pe->name = $2->string; pe->params = NULL; PARSER_DEBUG_PRINTF("Plugin: %s\n", $2->string); } /* Queue */ pe->next = olsr_cnf->plugins; olsr_cnf->plugins = pe; free($2); } ; plparam: TOK_PLPARAM TOK_STRING TOK_STRING { struct plugin_param *pp = malloc(sizeof(*pp)); if (pp == NULL) { fprintf(stderr, "Out of memory(ADD PP)\n"); YYABORT; } PARSER_DEBUG_PRINTF("Plugin param key:\"%s\" val: \"%s\"\n", $2->string, $3->string); pp->key = $2->string; pp->value = $3->string; /* Queue */ pp->next = olsr_cnf->plugins->params; olsr_cnf->plugins->params = pp; free($2); free($3); } ; vcomment: TOK_COMMENT { //PARSER_DEBUG_PRINTF("Comment\n"); } ; %% void yyerror (const char *string) { fprintf(stderr, "Config line %d: %s\n", current_line, string); } olsrd-0.6.6.2/src/cfgparser/oscan.lex000066400000000000000000000276441234304727700174140ustar00rootroot00000000000000%{ /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #define YYSTYPE struct conf_token * #include #include #include #include #include #include #include #include "olsrd_conf.h" #include "oparse.h" #define ECHO if(fwrite( yytext, yyleng, 1, yyout )) {} /* Prototypes */ int yyget_lineno(void); FILE * yyget_in(void); FILE* yyget_out(void); char *yyget_text(void); void yyset_lineno(int); void yyset_in(FILE *); void yyset_out(FILE *); int yyget_debug(void); void yyset_debug(int); int yylex_destroy(void); int yylex(void); static struct conf_token *get_conf_token(void); static struct conf_token *get_string_token(const char * const s, const size_t n); static struct conf_token *get_integer_token(const char * const s); static struct conf_token *get_floating_token(const char * const s); static struct conf_token *get_boolean_token(const bool b); static struct conf_token *get_conf_token(void) { struct conf_token *t = calloc(1, sizeof(struct conf_token)); if (t == NULL) { fprintf(stderr, "Cannot allocate %d bytes for an configuration token.\n", (int)sizeof(struct conf_token)); } return t; } static struct conf_token *get_string_token(const char * const s, const size_t n) { struct conf_token *rv = get_conf_token(); if (rv != NULL) { rv->string = malloc(n + 1); if (rv->string == NULL) { fprintf(stderr, "Cannot allocate %lu bytes for string token data.\n", (unsigned long)(n+1)); /* size_t on 64bit */ free(rv); return NULL; } memcpy(rv->string, s, n); rv->string[n] = '\0'; } return rv; } static struct conf_token *get_integer_token(const char * const s) { struct conf_token *rv = get_conf_token(); if (rv != NULL) { rv->integer = strtol(s, NULL, 0); } return rv; } static struct conf_token *get_floating_token(const char * const s) { struct conf_token *rv = get_conf_token(); if (rv != NULL) { rv->floating = 0.0; sscanf(s, "%f", &rv->floating); } return rv; } static struct conf_token *get_boolean_token(const bool b) { struct conf_token *rv = get_conf_token(); if (rv != NULL) { rv->boolean = b; } return rv; } %} %option never-interactive %option noalways-interactive %option nomain %option nostack %option noyywrap DECDIGIT [0-9] FLOAT {DECDIGIT}+\.{DECDIGIT}+ HEX8 [a-fA-F0-9] QUAD {DECDIGIT}{1,3} IPV4ADDR {QUAD}\.{QUAD}\.{QUAD}\.{QUAD} HEX16 {HEX8}{1,4} IPV6PAT2 ({HEX16}:){1}:({HEX16}:){0,5}{HEX16} IPV6PAT3 ({HEX16}:){2}:({HEX16}:){0,4}{HEX16} IPV6PAT4 ({HEX16}:){3}:({HEX16}:){0,3}{HEX16} IPV6PAT5 ({HEX16}:){4}:({HEX16}:){0,2}{HEX16} IPV6PAT6 ({HEX16}:){5}:({HEX16}:){0,1}{HEX16} IPV6PAT7 ({HEX16}:){6}:({HEX16}) IPV6PAT1 ({HEX16}:){7}{HEX16} IPV6PAT8 ({HEX16}:){1,7}: IPV6PAT9 :: IPV6PAT10 :(:{HEX16}){1,7} IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6PAT7}|{IPV6PAT8}|{IPV6PAT9}|{IPV6PAT10} %% \s*"#".*\n { current_line++; return TOK_COMMENT; } \/ { yylval = NULL; return TOK_SLASH; } \{ { yylval = NULL; return TOK_OPEN; } \} { yylval = NULL; return TOK_CLOSE; } \"[^\"]*\" { yylval = get_string_token(yytext + 1, yyleng - 2); if (yylval == NULL) { yyterminate(); } return TOK_STRING; } 0x{HEX8}+ { yylval = get_integer_token(yytext); return TOK_INTEGER; } {FLOAT} { yylval = get_floating_token(yytext); return TOK_FLOAT; } {IPV4ADDR} { yylval = get_string_token(yytext, yyleng + 1); if (yylval == NULL) { yyterminate(); } return TOK_IPV4_ADDR; } {IPV6ADDR} { yylval = get_string_token(yytext, yyleng + 1); if (yylval == NULL) { yyterminate(); } return TOK_IPV6_ADDR; } "default" { yylval = NULL; return TOK_DEFAULT; } "auto" { yylval = NULL; return TOK_AUTO; } "none" { yylval = NULL; return TOK_NONE; } {DECDIGIT}+ { yylval = get_integer_token(yytext); return TOK_INTEGER; } "yes" { yylval = get_boolean_token(true); return TOK_BOOLEAN; } "no" { yylval = get_boolean_token(false); return TOK_BOOLEAN; } "Host" { yylval = NULL; return TOK_HOSTLABEL; } "Net" { yylval = NULL; return TOK_NETLABEL; } "MaxConnections" { yylval = NULL; return TOK_MAXIPC; } "DebugLevel" { yylval = NULL; return TOK_DEBUGLEVEL; } "IpVersion" { yylval = NULL; return TOK_IPVERSION; } "NicChgsPollInt" { yylval = NULL; return TOK_NICCHGSPOLLRT; } "Hna4" { yylval = NULL; return TOK_HNA4; } "Hna6" { yylval = NULL; return TOK_HNA6; } "LoadPlugin" { yylval = NULL; return TOK_PLUGIN; } "PlParam" { yylval = NULL; return TOK_PLPARAM; } "Interface" { yylval = NULL; return TOK_INTERFACE; } "InterfaceDefaults" { yylval = NULL; return TOK_INTERFACE_DEFAULTS; } "AllowNoInt" { yylval = NULL; return TOK_NOINT; } "TosValue" { yylval = NULL; return TOK_TOS; } "OlsrPort" { yylval = NULL; return TOK_OLSRPORT; } "RtProto" { yylval = NULL; return TOK_RTPROTO; } "RtTable" { yylval = NULL; return TOK_RTTABLE; } "RtTableDefault" { yylval = NULL; return TOK_RTTABLE_DEFAULT; } "RtTableTunnel" { yylval = NULL; return TOK_RTTABLE_TUNNEL; } "RtTablePriority" { yylval = NULL; return TOK_RTTABLE_PRIORITY; } "RtTableDefaultOlsrPriority" { yylval = NULL; return TOK_RTTABLE_DEFAULTOLSR_PRIORITY; } "RtTableTunnelPriority" { yylval = NULL; return TOK_RTTABLE_TUNNEL_PRIORITY; } "RtTableDefaultPriority" { yylval = NULL; return TOK_RTTABLE_DEFAULT_PRIORITY; } "Willingness" { yylval = NULL; return TOK_WILLINGNESS; } "IpcConnect" { yylval = NULL; return TOK_IPCCON; } "FIBMetric" { yylval = NULL; return TOK_FIBMETRIC; } "UseHysteresis" { yylval = NULL; return TOK_USEHYST; } "HystScaling" { yylval = NULL; return TOK_HYSTSCALE; } "HystThrHigh" { yylval = NULL; return TOK_HYSTUPPER; } "HystThrLow" { yylval = NULL; return TOK_HYSTLOWER; } "Pollrate" { yylval = NULL; return TOK_POLLRATE; } "TcRedundancy" { yylval = NULL; return TOK_TCREDUNDANCY; } "MprCoverage" { yylval = NULL; return TOK_MPRCOVERAGE; } "LinkQualityLevel" { yylval = NULL; return TOK_LQ_LEVEL; } "LinkQualityFishEye" { yylval = NULL; return TOK_LQ_FISH; } "LinkQualityAging" { yylval = NULL; return TOK_LQ_AGING; } "LinkQualityAlgorithm" { yylval = NULL; return TOK_LQ_PLUGIN; } "NatThreshold" { yylval = NULL; return TOK_LQ_NAT_THRESH; } "LinkQualityMult" { yylval = NULL; return TOK_LQ_MULT; } "MinTCVTime" { yylval = NULL; return TOK_MIN_TC_VTIME; } "LockFile" { yylval = NULL; return TOK_LOCK_FILE; } "ClearScreen" { yylval = NULL; return TOK_CLEAR_SCREEN; } "UseNiit" { yylval = NULL; return TOK_USE_NIIT; } "SmartGateway" { yylval = NULL; return TOK_SMART_GW; } "SmartGatewayAlwaysRemoveServerTunnel" { yylval = NULL; return TOK_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL; } "SmartGatewayUseCount" { yylval = NULL; return TOK_SMART_GW_USE_COUNT; } "SmartGatewayTakeDownPercentage" { yylval = NULL; return TOK_SMART_GW_TAKEDOWN_PERCENTAGE; } "SmartGatewayPolicyRoutingScript" { yylval = NULL; return TOK_SMART_GW_POLICYROUTING_SCRIPT; } "SmartGatewayEgressInterfaces" { yylval = NULL; return TOK_SMART_GW_EGRESS_IFS; } "SmartGatewayMarkOffsetEgress" { yylval = NULL; return TOK_SMART_GW_MARK_OFFSET_EGRESS; } "SmartGatewayMarkOffsetTunnels" { yylval = NULL; return TOK_SMART_GW_MARK_OFFSET_TUNNELS; } "SmartGatewayAllowNAT" { yylval = NULL; return TOK_SMART_GW_ALLOW_NAT; } "SmartGatewayPeriod" { yylval = NULL; return TOK_SMART_GW_PERIOD; } "SmartGatewayStableCount" { yylval = NULL; return TOK_SMART_GW_STABLECOUNT; } "SmartGatewayThreshold" { yylval = NULL; return TOK_SMART_GW_THRESH; } "SmartGatewayWeightExitLinkUp" { yylval = NULL; return TOK_SMART_GW_WEIGHT_EXITLINK_UP; } "SmartGatewayWeightExitLinkDown" { yylval = NULL; return TOK_SMART_GW_WEIGHT_EXITLINK_DOWN; } "SmartGatewayWeightEtx" { yylval = NULL; return TOK_SMART_GW_WEIGHT_ETX; } "SmartGatewayDividerEtx" { yylval = NULL; return TOK_SMART_GW_DIVIDER_ETX; } "SmartGatewayUplink" { yylval = NULL; return TOK_SMART_GW_UPLINK; } "SmartGatewayUplinkNAT" { yylval = NULL; return TOK_SMART_GW_UPLINK_NAT; } "SmartGatewaySpeed" { yylval = NULL; return TOK_SMART_GW_SPEED; } "SmartGatewayPrefix" { yylval = NULL; return TOK_SMART_GW_PREFIX; } "SrcIpRoutes" { yylval = NULL; return TOK_SRC_IP_ROUTES; } "Weight" { yylval = NULL; return TOK_IFWEIGHT; } "MainIp" { yylval = NULL; return TOK_MAIN_IP; } "SetIpForward" { yylval = NULL; return TOK_SET_IPFORWARD; } "Ip4Broadcast" { yylval = NULL; return TOK_IP4BROADCAST; } "IPv4Broadcast" { yylval = NULL; return TOK_IPV4BROADCAST; } "IPv4Multicast" { yylval = NULL; return TOK_IPV4MULTICAST; } "Mode" { yylval = NULL; return TOK_IFMODE; } "IPv6Multicast" { yylval = NULL; return TOK_IPV6MULTICAST; } "IPv4Src" { yylval = NULL; return TOK_IPV4SRC; } "IPv6Src" { yylval = NULL; return TOK_IPV6SRC; } "HelloInterval" { yylval = NULL; return TOK_HELLOINT; } "HelloValidityTime" { yylval = NULL; return TOK_HELLOVAL; } "TcInterval" { yylval = NULL; return TOK_TCINT; } "TcValidityTime" { yylval = NULL; return TOK_TCVAL; } "MidInterval" { yylval = NULL; return TOK_MIDINT; } "MidValidityTime" { yylval = NULL; return TOK_MIDVAL; } "HnaInterval" { yylval = NULL; return TOK_HNAINT; } "HnaValidityTime" { yylval = NULL; return TOK_HNAVAL; } "AutoDetectChanges" { yylval = NULL; return TOK_AUTODETCHG; } \n|\r\n { current_line++; } \ |\t . { /* Do nothing */ //fprintf(stderr, "Failed to parse line %d of configuration file.\n", // current_line); //yyterminate(); //yy_fatal_error("Parsing failed.\n"); /* To avoid compiler warning (stupid...) */ if(0) yyunput(0, NULL); } %% olsrd-0.6.6.2/src/cfgparser/version-script.txt000066400000000000000000000004521234304727700213130ustar00rootroot00000000000000VERS_1.0 { global: olsrd_parse_cnf; olsrd_sanity_check_cnf; olsrd_free_cnf; olsrd_print_cnf; olsrd_write_cnf; olsrd_write_cnf_buf; get_default_if_config; olsrd_get_default_cnf; win32_stdio_hack; win32_olsrd_malloc; win32_olsrd_free; local: *; }; olsrd-0.6.6.2/src/common/000077500000000000000000000000001234304727700150765ustar00rootroot00000000000000olsrd-0.6.6.2/src/common/autobuf.c000066400000000000000000000134141234304727700167120ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "common/autobuf.h" #include "defs.h" #include #include #include #include static int autobuf_enlarge(struct autobuf *autobuf, int new_size); int abuf_init(struct autobuf *autobuf, int initial_size) { autobuf->len = 0; if (initial_size <= 0) { autobuf->size = 0; autobuf->buf = NULL; return 0; } autobuf->size = ROUND_UP_TO_POWER_OF_2(initial_size, AUTOBUFCHUNK); autobuf->buf = calloc(autobuf->size, 1); if (autobuf->buf == NULL) { autobuf->size = 0; return -1; } *autobuf->buf = '\0'; return 0; } void abuf_free(struct autobuf *autobuf) { free(autobuf->buf); autobuf->buf = NULL; autobuf->len = 0; autobuf->size = 0; } static int autobuf_enlarge(struct autobuf *autobuf, int new_size) { new_size++; if (new_size > autobuf->size) { char *p; int roundUpSize = ROUND_UP_TO_POWER_OF_2(new_size, AUTOBUFCHUNK); p = realloc(autobuf->buf, roundUpSize); if (p == NULL) { #ifdef _WIN32 WSASetLastError(ENOMEM); #else /* _WIN32 */ errno = ENOMEM; #endif /* _WIN32 */ return -1; } autobuf->buf = p; memset(&autobuf->buf[autobuf->size], 0, roundUpSize - autobuf->size); autobuf->size = roundUpSize; } return 0; } int abuf_vappendf(struct autobuf *autobuf, const char *format, va_list ap) { int rc; int min_size; va_list ap2; va_copy(ap2, ap); rc = vsnprintf(autobuf->buf + autobuf->len, autobuf->size - autobuf->len, format, ap); va_end(ap); min_size = autobuf->len + rc; if (min_size >= autobuf->size) { if (autobuf_enlarge(autobuf, min_size) < 0) { autobuf->buf[autobuf->len] = '\0'; va_end(ap2); return -1; } vsnprintf(autobuf->buf + autobuf->len, autobuf->size - autobuf->len, format, ap2); } va_end(ap2); autobuf->len = min_size; return 0; } int abuf_appendf(struct autobuf *autobuf, const char *fmt, ...) { int rv; va_list ap; va_start(ap, fmt); rv = abuf_vappendf(autobuf, fmt, ap); va_end(ap); return rv; } int abuf_puts(struct autobuf *autobuf, const char *s) { int len; if (NULL == s) return 0; len = strlen(s); if (autobuf_enlarge(autobuf, autobuf->len + len + 1) < 0) { return -1; } strcpy(autobuf->buf + autobuf->len, s); autobuf->len += len; return len; } int abuf_strftime(struct autobuf *autobuf, const char *format, const struct tm *tm) { int rc = strftime(autobuf->buf + autobuf->len, autobuf->size - autobuf->len, format, tm); if (rc == 0) { /* we had an error! Probably the buffer too small. So we add some bytes. */ if (autobuf_enlarge(autobuf, autobuf->size + AUTOBUFCHUNK) < 0) { autobuf->buf[autobuf->len] = '\0'; return -1; } rc = strftime(autobuf->buf + autobuf->len, autobuf->size - autobuf->len, format, tm); } autobuf->len += rc; return rc; } int abuf_memcpy(struct autobuf *autobuf, const void *p, const unsigned int len) { if (autobuf_enlarge(autobuf, autobuf->len + len) < 0) { return -1; } memcpy(autobuf->buf + autobuf->len, p, len); autobuf->len += len; return len; } int abuf_memcpy_prefix(struct autobuf *autobuf, const void *p, const unsigned int len) { if (autobuf_enlarge(autobuf, autobuf->len + len) < 0) { return -1; } memmove(&autobuf->buf[len], autobuf->buf, autobuf->len); memcpy(autobuf->buf, p, len); autobuf->len += len; return len; } int abuf_pull(struct autobuf * autobuf, int len) { char *p; size_t newsize; if (len != autobuf->len) { memmove(autobuf->buf, &autobuf->buf[len], autobuf->len - len); } autobuf->len -= len; newsize = ROUND_UP_TO_POWER_OF_2(autobuf->len + 1, AUTOBUFCHUNK); p = realloc(autobuf->buf, newsize); if (p == NULL) { #ifdef _WIN32 WSASetLastError(ENOMEM); #else /* _WIN32 */ errno = ENOMEM; #endif /* _WIN32 */ return -1; } autobuf->buf = p; autobuf->size = newsize; return 0; } /* * Local Variables: * mode: c * style: linux * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/common/autobuf.h000066400000000000000000000056751234304727700167310ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _COMMON_AUTOBUF_H #define _COMMON_AUTOBUF_H struct autobuf; #include "defs.h" #include #include #define ROUND_UP_TO_POWER_OF_2(val, pow2) (((val) + (pow2) - 1) & ~((pow2) - 1)) #define AUTOBUFCHUNK 4096 struct autobuf { int size; int len; char *buf; }; int abuf_init (struct autobuf * autobuf, int initial_size); void abuf_free (struct autobuf * autobuf); int abuf_vappendf (struct autobuf *autobuf, const char *fmt, va_list ap) __attribute__ ((format(printf, 2, 0))); int abuf_appendf (struct autobuf * autobuf, const char *fmt, ...) __attribute__ ((format(printf, 2, 3))); int abuf_puts (struct autobuf * autobuf, const char *s); int abuf_strftime (struct autobuf * autobuf, const char *format, const struct tm * tm); int abuf_memcpy (struct autobuf * autobuf, const void *p, const unsigned int len); int abuf_memcpy_prefix (struct autobuf *autobuf, const void *p, const unsigned int len); int abuf_pull (struct autobuf * autobuf, int len); #endif /* _COMMON_AUTOBUF_H */ /* * Local Variables: * mode: c * style: linux * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/common/avl.c000066400000000000000000000320441234304727700160270ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * IPv4 performance optimization (c) 2006, sven-ola(gmx.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include #include #include #include "ipcalc.h" #include "common/avl.h" #include "net_olsr.h" /* * default comparison pointers * set to the respective compare function. * if avl_comp_default is set to zero, a fast * inline ipv4 comparison will be executed. */ avl_tree_comp avl_comp_default = NULL; avl_tree_comp avl_comp_prefix_default; int avl_comp_ipv4(const void *ip1, const void *ip2) { return ip4cmp(ip1, ip2); } int avl_comp_ipv6(const void *ip1, const void *ip2) { return ip6cmp(ip1, ip2); } int avl_comp_mac(const void *ip1, const void *ip2) { return memcmp(ip1, ip2, 6); } void avl_init(struct avl_tree *tree, avl_tree_comp comp) { tree->root = NULL; tree->first = NULL; tree->last = NULL; tree->count = 0; tree->comp = comp == avl_comp_ipv4 ? NULL : comp; } static struct avl_node * avl_find_rec_ipv4(struct avl_node *node, const void *key) { if (*(const unsigned int *)key < *(const unsigned int *)node->key) { if (node->left != NULL) return avl_find_rec_ipv4(node->left, key); } else if (*(const unsigned int *)key > *(const unsigned int *)node->key) { if (node->right != NULL) return avl_find_rec_ipv4(node->right, key); } return node; } static struct avl_node * avl_find_rec(struct avl_node *node, const void *key, avl_tree_comp comp) { int diff; if (NULL == comp) return avl_find_rec_ipv4(node, key); diff = (*comp) (key, node->key); if (diff < 0) { if (node->left != NULL) return avl_find_rec(node->left, key, comp); return node; } if (diff > 0) { if (node->right != NULL) return avl_find_rec(node->right, key, comp); return node; } return node; } struct avl_node * avl_find(struct avl_tree *tree, const void *key) { struct avl_node *node; if (tree->root == NULL) return NULL; node = avl_find_rec(tree->root, key, tree->comp); if (NULL == tree->comp) { if (0 != ip4cmp(node->key, key)) return NULL; } else { if ((*tree->comp) (node->key, key) != 0) return NULL; } return node; } static void avl_rotate_right(struct avl_tree *tree, struct avl_node *node) { struct avl_node *left, *parent; left = node->left; parent = node->parent; left->parent = parent; node->parent = left; if (parent == NULL) tree->root = left; else { if (parent->left == node) parent->left = left; else parent->right = left; } node->left = left->right; left->right = node; if (node->left != NULL) node->left->parent = node; node->balance += 1 - MIN(left->balance, 0); left->balance += 1 + MAX(node->balance, 0); } static void avl_rotate_left(struct avl_tree *tree, struct avl_node *node) { struct avl_node *right, *parent; right = node->right; parent = node->parent; right->parent = parent; node->parent = right; if (parent == NULL) tree->root = right; else { if (parent->left == node) parent->left = right; else parent->right = right; } node->right = right->left; right->left = node; if (node->right != NULL) node->right->parent = node; node->balance -= 1 + MAX(right->balance, 0); right->balance -= 1 - MIN(node->balance, 0); } static void post_insert(struct avl_tree *tree, struct avl_node *node) { struct avl_node *parent = node->parent; if (parent == NULL) return; if (node == parent->left) { parent->balance--; if (parent->balance == 0) return; if (parent->balance == -1) { post_insert(tree, parent); return; } if (node->balance == -1) { avl_rotate_right(tree, parent); return; } avl_rotate_left(tree, node); avl_rotate_right(tree, node->parent->parent); return; } parent->balance++; if (parent->balance == 0) return; if (parent->balance == 1) { post_insert(tree, parent); return; } if (node->balance == 1) { avl_rotate_left(tree, parent); return; } avl_rotate_right(tree, node); avl_rotate_left(tree, node->parent->parent); } static void avl_insert_before(struct avl_tree *tree, struct avl_node *pos_node, struct avl_node *node) { if (pos_node->prev != NULL) pos_node->prev->next = node; else tree->first = node; node->prev = pos_node->prev; node->next = pos_node; pos_node->prev = node; tree->count++; } static void avl_insert_after(struct avl_tree *tree, struct avl_node *pos_node, struct avl_node *node) { if (pos_node->next != NULL) pos_node->next->prev = node; else tree->last = node; node->prev = pos_node; node->next = pos_node->next; pos_node->next = node; tree->count++; } static void avl_remove(struct avl_tree *tree, struct avl_node *node) { if (node->prev != NULL) node->prev->next = node->next; else tree->first = node->next; if (node->next != NULL) node->next->prev = node->prev; else tree->last = node->prev; tree->count--; } int avl_insert(struct avl_tree *tree, struct avl_node *new, int allow_duplicates) { struct avl_node *node; struct avl_node *last; int diff; new->parent = NULL; new->left = NULL; new->right = NULL; new->next = NULL; new->prev = NULL; new->balance = 0; new->leader = 1; if (tree->root == NULL) { tree->root = new; tree->first = new; tree->last = new; tree->count = 1; return 0; } node = avl_find_rec(tree->root, new->key, tree->comp); last = node; while (last->next != NULL && last->next->leader == 0) last = last->next; if (NULL == tree->comp) diff = ip4cmp(new->key, node->key); else diff = (*tree->comp) (new->key, node->key); if (diff == 0) { if (allow_duplicates == AVL_DUP_NO) return -1; new->leader = 0; avl_insert_after(tree, last, new); return 0; } if (node->balance == 1) { avl_insert_before(tree, node, new); node->balance = 0; new->parent = node; node->left = new; return 0; } if (node->balance == -1) { avl_insert_after(tree, last, new); node->balance = 0; new->parent = node; node->right = new; return 0; } if (diff < 0) { avl_insert_before(tree, node, new); node->balance = -1; new->parent = node; node->left = new; post_insert(tree, node); return 0; } avl_insert_after(tree, last, new); node->balance = 1; new->parent = node; node->right = new; post_insert(tree, node); return 0; } static void avl_post_delete(struct avl_tree *tree, struct avl_node *node) { struct avl_node *parent; if ((parent = node->parent) == NULL) return; if (node == parent->left) { parent->balance++; if (parent->balance == 0) { avl_post_delete(tree, parent); return; } if (parent->balance == 1) return; if (parent->right->balance == 0) { avl_rotate_left(tree, parent); return; } if (parent->right->balance == 1) { avl_rotate_left(tree, parent); avl_post_delete(tree, parent->parent); return; } avl_rotate_right(tree, parent->right); avl_rotate_left(tree, parent); avl_post_delete(tree, parent->parent); return; } parent->balance--; if (parent->balance == 0) { avl_post_delete(tree, parent); return; } if (parent->balance == -1) return; if (parent->left->balance == 0) { avl_rotate_right(tree, parent); return; } if (parent->left->balance == -1) { avl_rotate_right(tree, parent); avl_post_delete(tree, parent->parent); return; } avl_rotate_left(tree, parent->left); avl_rotate_right(tree, parent); avl_post_delete(tree, parent->parent); } static struct avl_node * avl_local_min(struct avl_node *node) { while (node->left != NULL) node = node->left; return node; } static void avl_delete_worker(struct avl_tree *tree, struct avl_node *node) { struct avl_node *parent, *min; parent = node->parent; if (node->left == NULL && node->right == NULL) { if (parent == NULL) { tree->root = NULL; return; } if (parent->left == node) { parent->left = NULL; parent->balance++; if (parent->balance == 1) return; if (parent->balance == 0) { avl_post_delete(tree, parent); return; } if (parent->right->balance == 0) { avl_rotate_left(tree, parent); return; } if (parent->right->balance == 1) { avl_rotate_left(tree, parent); avl_post_delete(tree, parent->parent); return; } avl_rotate_right(tree, parent->right); avl_rotate_left(tree, parent); avl_post_delete(tree, parent->parent); } else { parent->right = NULL; parent->balance--; if (parent->balance == -1) return; if (parent->balance == 0) { avl_post_delete(tree, parent); return; } if (parent->left->balance == 0) { avl_rotate_right(tree, parent); return; } if (parent->left->balance == -1) { avl_rotate_right(tree, parent); avl_post_delete(tree, parent->parent); return; } avl_rotate_left(tree, parent->left); avl_rotate_right(tree, parent); avl_post_delete(tree, parent->parent); } return; } if (node->left == NULL) { if (parent == NULL) { tree->root = node->right; node->right->parent = NULL; return; } node->right->parent = parent; if (parent->left == node) parent->left = node->right; else parent->right = node->right; avl_post_delete(tree, node->right); return; } if (node->right == NULL) { if (parent == NULL) { tree->root = node->left; node->left->parent = NULL; return; } node->left->parent = parent; if (parent->left == node) parent->left = node->left; else parent->right = node->left; avl_post_delete(tree, node->left); return; } min = avl_local_min(node->right); avl_delete_worker(tree, min); parent = node->parent; min->balance = node->balance; min->parent = parent; min->left = node->left; min->right = node->right; if (min->left != NULL) min->left->parent = min; if (min->right != NULL) min->right->parent = min; if (parent == NULL) { tree->root = min; return; } if (parent->left == node) { parent->left = min; return; } parent->right = min; } void avl_delete(struct avl_tree *tree, struct avl_node *node) { struct avl_node *next; struct avl_node *parent; struct avl_node *left; struct avl_node *right; if (node->leader != 0) { next = node->next; if (next != NULL && next->leader == 0) { next->leader = 1; next->balance = node->balance; parent = node->parent; left = node->left; right = node->right; next->parent = parent; next->left = left; next->right = right; if (parent == NULL) tree->root = next; else { if (node == parent->left) parent->left = next; else parent->right = next; } if (left != NULL) left->parent = next; if (right != NULL) right->parent = next; } else avl_delete_worker(tree, node); } avl_remove(tree, node); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/common/avl.h000066400000000000000000000104431234304727700160330ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * IPv4 performance optimization (c) 2006, sven-ola(gmx.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _AVL_H #define _AVL_H #include /* must be declared here because of circular dependency through "defs.h" */ #define INLINE inline __attribute__((always_inline)) struct avl_node { struct avl_node *parent; struct avl_node *left; struct avl_node *right; struct avl_node *next; struct avl_node *prev; void *key; signed char balance; unsigned char leader; }; typedef int (*avl_tree_comp) (const void *, const void *); struct avl_tree { struct avl_node *root; struct avl_node *first; struct avl_node *last; unsigned int count; avl_tree_comp comp; }; #define AVL_DUP 1 #define AVL_DUP_NO 0 void avl_init(struct avl_tree *, avl_tree_comp); struct avl_node *avl_find(struct avl_tree *, const void *); int avl_insert(struct avl_tree *, struct avl_node *, int); void avl_delete(struct avl_tree *, struct avl_node *); static INLINE struct avl_node * avl_walk_first(struct avl_tree *tree) { return tree->first; } static INLINE struct avl_node * avl_walk_last(struct avl_tree *tree) { return tree->last; } static INLINE struct avl_node * avl_walk_next(struct avl_node *node) { return node->next; } static INLINE struct avl_node * avl_walk_prev(struct avl_node *node) { return node->prev; } /* and const versions*/ static INLINE const struct avl_node * avl_walk_first_c(const struct avl_tree *tree) { return tree->first; } static INLINE const struct avl_node * avl_walk_last_c(const struct avl_tree *tree) { return tree->last; } static INLINE const struct avl_node * avl_walk_next_c(const struct avl_node *node) { return node->next; } static INLINE const struct avl_node * avl_walk_prev_c(const struct avl_node *node) { return node->prev; } extern avl_tree_comp avl_comp_default; extern avl_tree_comp avl_comp_prefix_default; extern int avl_comp_ipv4(const void *, const void *); extern int avl_comp_ipv6(const void *, const void *); extern int avl_comp_mac(const void *, const void *); /* * Macro to define an inline function to map from a list_node offset back to the * base of the datastructure. That way you save an extra data pointer. */ #define AVLNODE2STRUCT(funcname, structname, avlnodename) \ static inline structname * funcname (struct avl_node *ptr)\ {\ return( \ ptr ? \ (structname *) (((size_t) ptr) - offsetof(structname, avlnodename)) : \ NULL); \ } #endif /* _AVL_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/common/list.c000066400000000000000000000060331234304727700162170ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * IPv4 performance optimization (c) 2006, sven-ola(gmx.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include #include "common/list.h" /* init a circular list */ void list_head_init(struct list_node *node) { node->prev = node; node->next = node; } void list_node_init(struct list_node *node) { node->prev = NULL; node->next = NULL; } int list_node_on_list(struct list_node *node) { if (node->prev || node->next) { return 1; } return 0; } int list_is_empty(struct list_node *node) { if (node->prev == node && node->next == node) { return 1; } return 0; } void list_add_after(struct list_node *pos_node, struct list_node *new_node) { new_node->next = pos_node->next; new_node->prev = pos_node; pos_node->next->prev = new_node; pos_node->next = new_node; } void list_add_before(struct list_node *pos_node, struct list_node *new_node) { new_node->prev = pos_node->prev; new_node->next = pos_node; pos_node->prev->next = new_node; pos_node->prev = new_node; } void list_remove(struct list_node *del_node) { del_node->next->prev = del_node->prev; del_node->prev->next = del_node->next; list_node_init(del_node); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/common/list.h000066400000000000000000000064461234304727700162340ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * IPv4 performance optimization (c) 2006, sven-ola(gmx.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _LIST_H #define _LIST_H #include "stddef.h" struct list_node { struct list_node *next; struct list_node *prev; }; void list_head_init(struct list_node *); void list_node_init(struct list_node *); int list_node_on_list(struct list_node *); int list_is_empty(struct list_node *); void list_add_before(struct list_node *, struct list_node *); void list_add_after(struct list_node *, struct list_node *); void list_remove(struct list_node *); /* * Merge elements of list_head2 at the end of list_head1. * list_head2 will be left empty. */ static inline void list_merge(struct list_node *list_head1, struct list_node *list_head2) { if (!list_is_empty(list_head2)) { list_head1->next->prev = list_head2->prev; list_head2->prev->next = list_head1->next; list_head1->next = list_head2->next; list_head2->next->prev = list_head1; list_head2->next = list_head2->prev = list_head2; } } /* * Macro to define an inline function to map from a list_node offset back to the * base of the datastructure. That way you save an extra data pointer. */ #define LISTNODE2STRUCT(funcname, structname, listnodename) \ static inline structname * funcname (struct list_node *ptr)\ {\ return( \ ptr ? \ (structname *) (((size_t) ptr) - offsetof(structname, listnodename)) : \ NULL); \ } #endif /* _LIST_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/defs.h000066400000000000000000000141011234304727700146750ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_DEFS #define _OLSR_DEFS /* Common includes */ #include #include #include #include #include #include #include #include #include #include "olsr_protocol.h" #include "olsr_cfg.h" #ifndef OLSRD_GLOBAL_CONF_FILE #define OLSRD_CONF_FILE_NAME "olsrd.conf" #define OLSRD_GLOBAL_CONF_FILE "/etc/" OLSRD_CONF_FILE_NAME #endif /* OLSRD_GLOBAL_CONF_FILE */ #define MAXMESSAGESIZE 1500 /* max broadcast size */ #define UDP_IPV4_HDRSIZE 28 #define UDP_IPV6_HDRSIZE 62 /* Debug helper macro */ #ifdef DEBUG #define olsr_debug(lvl, format, args...) do { \ OLSR_PRINTF(lvl, "%s (%s:%d): ", __func__, __FILE__, __LINE__); \ OLSR_PRINTF(lvl, (format), ##args); \ } while (0) #endif /* DEBUG */ extern FILE *debug_handle; #ifdef NODEBUG #define OLSR_PRINTF(lvl, format, args...) do { } while(0) #else /* NODEBUG */ #define OLSR_PRINTF(lvl, format, args...) do { \ if((olsr_cnf->debug_level >= (lvl)) && debug_handle) \ fprintf(debug_handle, (format), ##args); \ } while (0) #endif /* NODEBUG */ /* * Provides a timestamp s1 milliseconds in the future according * to system ticks returned by times(2) */ #define GET_TIMESTAMP(s1) olsr_getTimestamp(s1) /* Compute the time in milliseconds when a timestamp will expire. */ #define TIME_DUE(s1) olsr_getTimeDue(s1) /* Returns TRUE if a timestamp is expired */ #define TIMED_OUT(s1) olsr_isTimedOut(s1) #ifndef ARRAYSIZE #define ARRAYSIZE(x) (sizeof(x)/sizeof(*(x))) #endif /* ARRAYSIZE */ #ifndef MAX #define MAX(x,y) ((x) > (y) ? (x) : (y)) #endif /* MAX */ #ifndef MIN #define MIN(x,y) ((x) < (y) ? (x) : (y)) #endif /* MIN */ #define INLINE inline __attribute__((always_inline)) /* * On ARM, the compiler spits out additional warnings if called * with -Wcast-align if you cast e.g. char* -> int*. While this * is fine, most of that warnings are un-critical. Also the ARM * CPU will throw BUS_ERROR if alignment does not fit. For this, * we add an additional cast to (void *) to prevent the warning. */ #define ARM_NOWARN_ALIGN(x) ((void *)(x)) #define CONST_ARM_NOWARN_ALIGN(x) ((const void *)(x)) /* * A somewhat safe version of strncpy and strncat. Note, that * BSD/Solaris strlcpy()/strlcat() differ in implementation, while * the BSD compiler prints out a warning if you use plain strcpy(). */ static INLINE char * strscpy(char *dest, const char *src, size_t size) { register size_t l = 0; #if !defined(NODEBUG) && defined(DEBUG) if (NULL == dest) fprintf(stderr, "Warning: dest is NULL in strscpy!\n"); if (NULL == src) fprintf(stderr, "Warning: src is NULL in strscpy!\n"); #endif /* !defined(NODEBUG) && defined(DEBUG) */ if (!dest || !src) { return NULL; } /* src does not need to be null terminated */ if (0 < size--) while (l < size && 0 != src[l]) l++; dest[l] = 0; return strncpy(dest, src, l); } static INLINE char * strscat(char *dest, const char *src, size_t size) { register size_t l = strlen(dest); return strscpy(dest + l, src, size > l ? size - l : 0); } /* * Queueing macros */ /* First "argument" is NOT a pointer! */ #define QUEUE_ELEM(pre, new) do { \ (pre).next->prev = (new); \ (new)->next = (pre).next; \ (new)->prev = &(pre); \ (pre).next = (new); \ } while (0) #define DEQUEUE_ELEM(elem) do { \ (elem)->prev->next = (elem)->next; \ (elem)->next->prev = (elem)->prev; \ } while (0) #define CLOSE(fd) do { close(fd); (fd) = -1; } while (0) /* * Global olsrd configuragtion */ extern struct olsrd_config *olsr_cnf; /* Timer data */ extern uint32_t now_times; /* current idea of times(2) reported uptime */ extern struct olsr_cookie_info *def_timer_ci; #if defined _WIN32 extern bool olsr_win32_end_request; extern bool olsr_win32_end_flag; #endif /* defined _WIN32 */ /* *IPC functions *These are moved to a plugin soon * soon... duh! */ int ipc_init(void); int shutdown_ipc(void); int ipc_output(struct olsr *); #endif /* _OLSR_DEFS */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/duplicate_handler.c000066400000000000000000000063601234304727700174260ustar00rootroot00000000000000/* * duplicate_handler.c * * Created on: 11.01.2010 * Author: henning */ #include "common/list.h" #include "defs.h" #include "ipcalc.h" #include "log.h" #include "olsr.h" #include "scheduler.h" #include "duplicate_handler.h" #ifndef NO_DUPLICATE_DETECTION_HANDLER static struct list_node duplicate_handler_head; static uint32_t spam_orig_counter, spam_hna_counter, spam_mid_counter; static struct timer_entry *duplicate_spam_timer; static void handle_duplicate_spam_timer(void __attribute__ ((unused)) *no) { if (spam_orig_counter > MAX_SYSLOG_EACH_HOUR) { olsr_syslog(OLSR_LOG_INFO, "Skipped %u originator duplicate warnings.", spam_orig_counter - MAX_SYSLOG_EACH_HOUR); } if (spam_hna_counter > MAX_SYSLOG_EACH_HOUR) { olsr_syslog(OLSR_LOG_INFO, "Skipped %u hna duplicate warnings.", spam_hna_counter - MAX_SYSLOG_EACH_HOUR); } if (spam_mid_counter > MAX_SYSLOG_EACH_HOUR) { olsr_syslog(OLSR_LOG_INFO, "Skipped %u mid duplicate warnings.", spam_mid_counter - MAX_SYSLOG_EACH_HOUR); } spam_orig_counter = 0; spam_hna_counter = 0; spam_mid_counter = 0; } void olsr_duplicate_handler_init(void) { list_head_init(&duplicate_handler_head); spam_orig_counter = 0; spam_hna_counter = 0; spam_mid_counter = 0; olsr_set_timer(&duplicate_spam_timer, 3600*1000, 0, OLSR_TIMER_PERIODIC, &handle_duplicate_spam_timer, NULL, 0); } void olsr_add_duplicate_handler(struct duplicate_handler *h) { list_add_before(&duplicate_handler_head, &h->node); } void olsr_remove_duplicate_handler(struct duplicate_handler *h) { list_remove(&h->node); } void olsr_test_originator_collision(uint8_t msgType, uint16_t seqno) { struct list_node *n; if (!olsr_is_bad_duplicate_msg_seqno(seqno)) { return; } if (++spam_orig_counter < MAX_SYSLOG_EACH_HOUR) { struct ipaddr_str buf; olsr_syslog(OLSR_LOG_INFO, "You might have another node with main ip %s in the mesh!", olsr_ip_to_string(&buf, &olsr_cnf->main_addr)); } for (n=duplicate_handler_head.next; n != &duplicate_handler_head; n = n->next) { struct duplicate_handler *h = (struct duplicate_handler *)n; h->originator_collision(msgType); } } void olsr_handle_hna_collision(union olsr_ip_addr *hna, union olsr_ip_addr *orig) { struct list_node *n; if (++spam_hna_counter < MAX_SYSLOG_EACH_HOUR) { struct ipaddr_str buf1, buf2; olsr_syslog(OLSR_LOG_INFO, "Node %s is publishing your ip %s as HNA!", olsr_ip_to_string(&buf1, orig), olsr_ip_to_string(&buf2, hna)); } for (n=duplicate_handler_head.next; n != &duplicate_handler_head; n = n->next) { struct duplicate_handler *h = (struct duplicate_handler *)n; h->hna_collision(hna, orig); } } void olsr_handle_mid_collision(union olsr_ip_addr *mid, union olsr_ip_addr *orig) { struct list_node *n; if (++spam_mid_counter < MAX_SYSLOG_EACH_HOUR) { struct ipaddr_str buf1, buf2; olsr_syslog(OLSR_LOG_INFO, "Node %s is publishing your ip %s as MID!", olsr_ip_to_string(&buf1, orig), olsr_ip_to_string(&buf2, mid)); } for (n=duplicate_handler_head.next; n != &duplicate_handler_head; n = n->next) { struct duplicate_handler *h = (struct duplicate_handler *)n; h->mid_collision(mid, orig); } } #endif /* NO_DUPLICATE_DETECTION_HANDLER */ olsrd-0.6.6.2/src/duplicate_handler.h000066400000000000000000000017711234304727700174340ustar00rootroot00000000000000/* * duplicate_handler.h * * Created on: 11.01.2010 * Author: henning */ #ifndef DUPLICATE_HANDLER_H_ #define DUPLICATE_HANDLER_H_ #include "defs.h" #include "olsr.h" #include "common/list.h" #ifndef NO_DUPLICATE_DETECTION_HANDLER #define MAX_SYSLOG_EACH_HOUR 10 struct duplicate_handler { struct list_node node; void (*originator_collision)(uint8_t msgType); void (*hna_collision)(union olsr_ip_addr *hna, union olsr_ip_addr *orig); void (*mid_collision)(union olsr_ip_addr *mid, union olsr_ip_addr *orig); }; void olsr_duplicate_handler_init(void); void olsr_add_duplicate_handler(struct duplicate_handler *); void olsr_remove_duplicate_handler(struct duplicate_handler *); void olsr_test_originator_collision(uint8_t msgType, uint16_t seqno); void olsr_handle_hna_collision(union olsr_ip_addr *hna, union olsr_ip_addr *orig); void olsr_handle_mid_collision(union olsr_ip_addr *mid, union olsr_ip_addr *orig); #endif /* NO_DUPLICATE_DETECTION_HANDLER */ #endif /* DUPLICATE_HANDLER_H_ */ olsrd-0.6.6.2/src/duplicate_set.c000066400000000000000000000151721234304727700166050ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "duplicate_set.h" #include "ipcalc.h" #include "common/avl.h" #include "olsr.h" #include "mid_set.h" #include "scheduler.h" #include "mantissa.h" static void olsr_cleanup_duplicate_entry(void *unused); struct avl_tree duplicate_set; struct timer_entry *duplicate_cleanup_timer; void olsr_init_duplicate_set(void) { avl_init(&duplicate_set, olsr_cnf->ip_version == AF_INET ? &avl_comp_ipv4 : &avl_comp_ipv6); olsr_set_timer(&duplicate_cleanup_timer, DUPLICATE_CLEANUP_INTERVAL, DUPLICATE_CLEANUP_JITTER, OLSR_TIMER_PERIODIC, &olsr_cleanup_duplicate_entry, NULL, 0); } void olsr_cleanup_duplicates(union olsr_ip_addr *orig) { struct dup_entry *entry; entry = (struct dup_entry *)avl_find(&duplicate_set, orig); if (entry != NULL) { entry->too_low_counter = DUP_MAX_TOO_LOW - 2; } } struct dup_entry * olsr_create_duplicate_entry(void *ip, uint16_t seqnr) { struct dup_entry *entry; entry = olsr_malloc(sizeof(struct dup_entry), "New duplicate entry"); if (entry != NULL) { memcpy(&entry->ip, ip, olsr_cnf->ip_version == AF_INET ? sizeof(entry->ip.v4) : sizeof(entry->ip.v6)); entry->seqnr = seqnr; entry->too_low_counter = 0; entry->avl.key = &entry->ip; entry->array = 0; } return entry; } static void olsr_cleanup_duplicate_entry(void __attribute__ ((unused)) * unused) { struct dup_entry *entry; OLSR_FOR_ALL_DUP_ENTRIES(entry) { if (TIMED_OUT(entry->valid_until)) { avl_delete(&duplicate_set, &entry->avl); free(entry); } } OLSR_FOR_ALL_DUP_ENTRIES_END(entry); } int olsr_seqno_diff(uint16_t seqno1, uint16_t seqno2) { int diff = (int)seqno1 - (int)(seqno2); // overflow ? if (diff > (1 << 15)) { diff -= (1 << 16); } else if (diff < -(1 << 15)) { diff += (1 << 16); } return diff; } int olsr_message_is_duplicate(union olsr_message *m) { struct dup_entry *entry; int diff; void *mainIp; uint32_t valid_until; struct ipaddr_str buf; uint16_t seqnr; void *ip; if (olsr_cnf->ip_version == AF_INET) { seqnr = ntohs(m->v4.seqno); ip = &m->v4.originator; } else { seqnr = ntohs(m->v6.seqno); ip = &m->v6.originator; } // get main address mainIp = mid_lookup_main_addr(ip); if (mainIp == NULL) { mainIp = ip; } valid_until = GET_TIMESTAMP(DUPLICATE_VTIME); entry = (struct dup_entry *)avl_find(&duplicate_set, ip); if (entry == NULL) { entry = olsr_create_duplicate_entry(ip, seqnr); if (entry != NULL) { avl_insert(&duplicate_set, &entry->avl, 0); entry->valid_until = valid_until; } return false; // okay, we process this package } // update timestamp if (valid_until > entry->valid_until) { entry->valid_until = valid_until; } diff = olsr_seqno_diff(seqnr, entry->seqnr); if (diff < -31) { entry->too_low_counter++; // client did restart with a lower number ? if (entry->too_low_counter > DUP_MAX_TOO_LOW) { entry->too_low_counter = 0; entry->seqnr = seqnr; entry->array = 1; return false; /* start with a new sequence number, so NO duplicate */ } OLSR_PRINTF(9, "blocked 0x%x from %s\n", seqnr, olsr_ip_to_string(&buf, mainIp)); return true; /* duplicate ! */ } entry->too_low_counter = 0; if (diff <= 0) { uint32_t bitmask = 1 << ((uint32_t) (-diff)); if ((entry->array & bitmask) != 0) { OLSR_PRINTF(9, "blocked 0x%x (diff=%d,mask=%08x) from %s\n", seqnr, diff, entry->array, olsr_ip_to_string(&buf, mainIp)); return true; /* duplicate ! */ } entry->array |= bitmask; OLSR_PRINTF(9, "processed 0x%x from %s\n", seqnr, olsr_ip_to_string(&buf, mainIp)); return false; /* no duplicate */ } else if (diff < 32) { entry->array <<= (uint32_t) diff; } else { entry->array = 0; } entry->array |= 1; entry->seqnr = seqnr; OLSR_PRINTF(9, "processed 0x%x from %s\n", seqnr, olsr_ip_to_string(&buf, mainIp)); return false; /* no duplicate */ } #ifndef NODEBUG void olsr_print_duplicate_table(void) { /* The whole function makes no sense without it. */ struct dup_entry *entry; const int ipwidth = olsr_cnf->ip_version == AF_INET ? (INET_ADDRSTRLEN - 1) : (INET6_ADDRSTRLEN - 1); struct ipaddr_str addrbuf; OLSR_PRINTF(1, "\n--- %s ------------------------------------------------- DUPLICATE SET\n\n" "%-*s %8s %s\n", olsr_wallclock_string(), ipwidth, "Node IP", "DupArray", "VTime"); OLSR_FOR_ALL_DUP_ENTRIES(entry) { OLSR_PRINTF(1, "%-*s %08x %s\n", ipwidth, olsr_ip_to_string(&addrbuf, (union olsr_ip_addr *)(entry->avl.key)), entry->array, olsr_clock_string(entry->valid_until)); } OLSR_FOR_ALL_DUP_ENTRIES_END(entry); } #endif /* NODEBUG */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/duplicate_set.h000066400000000000000000000062421234304727700166100ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef DUPLICATE_SET_2_H_ #define DUPLICATE_SET_2_H_ #include "defs.h" #include "olsr.h" #include "mantissa.h" #include "common/avl.h" #define DUPLICATE_CLEANUP_INTERVAL 15000 #define DUPLICATE_CLEANUP_JITTER 25 #define DUPLICATE_VTIME 120000 #define DUP_MAX_TOO_LOW 16 struct dup_entry { struct avl_node avl; union olsr_ip_addr ip; uint16_t seqnr; uint16_t too_low_counter; uint32_t array; uint32_t valid_until; }; AVLNODE2STRUCT(duptree2dupentry, struct dup_entry, avl); void olsr_init_duplicate_set(void); void olsr_cleanup_duplicates(union olsr_ip_addr *orig); struct dup_entry *olsr_create_duplicate_entry(void *ip, uint16_t seqnr); int olsr_seqno_diff(uint16_t seqno1, uint16_t seqno2); int olsr_message_is_duplicate(union olsr_message *m); #ifndef NODEBUG void olsr_print_duplicate_table(void); #else #define olsr_print_duplicate_table() do { } while(0) #endif #define OLSR_FOR_ALL_DUP_ENTRIES(dup) \ { \ struct avl_node *dup_tree_node, *next_dup_tree_node; \ for (dup_tree_node = avl_walk_first(&duplicate_set); \ dup_tree_node; dup_tree_node = next_dup_tree_node) { \ next_dup_tree_node = avl_walk_next(dup_tree_node); \ dup = duptree2dupentry(dup_tree_node); #define OLSR_FOR_ALL_DUP_ENTRIES_END(dup) }} #endif /* DUPLICATE_SET_2_H_ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/fpm.c000066400000000000000000000114241234304727700145360ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008, Sven-Ola Tuecke (sven-ola@gmx.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include #include #include "fpm.h" #if 1 // def USE_FPM #ifndef NDEBUG fpm itofpm(sfpm i) { assert(FPM_MIN <= i && i <= FPM_MAX); return itofpm_def(i); } fpm ftofpm(float f) { fpm r; assert(FPM_MIN <= (sfpm) f && (sfpm) f <= FPM_MAX); r = (fpm) (sfpm) ftofpm_def(f); return r; } int fpmtoi(fpm a) { int r = fpmtoi_def((sfpm) a); return r; } float fpmtof(fpm a) { float r = fpmtof_def((sfpm) a); return r; } fpm fpmadd(fpm a, fpm b) { fpm r; assert(0 > (sfpm) a || 0 > (sfpm) b || FPM_INT_MAX - (sfpm) a >= (sfpm) b); assert(0 <= (sfpm) a || 0 <= (sfpm) b || (sfpm) a >= FPM_INT_MIN - (sfpm) b); r = (fpm) fpmadd_def((sfpm) a, (sfpm) b); return r; } fpm fpmsub(fpm a, fpm b) { fpm r; assert(0 > (sfpm) a || 0 <= (sfpm) b || (sfpm) a < FPM_INT_MAX + (sfpm) b); assert(0 <= (sfpm) a || 0 > (sfpm) b || (sfpm) a >= FPM_INT_MIN + (sfpm) b); r = (fpm) fpmsub_def((sfpm) a, (sfpm) b); return r; } fpm fpmmul(fpm a, fpm b) { fpm r; assert((0 < (sfpm) a) != (0 < (sfpm) b) || ((double)(sfpm) a) * ((double)(sfpm) b) <= (double)FPM_INT_MAX); assert((0 < (sfpm) a) == (0 < (sfpm) b) || ((double)(sfpm) a) * ((double)(sfpm) b) >= (double)FPM_INT_MIN); r = (fpm) fpmmul_def((sfpm) a, (sfpm) b); return r; } fpm fpmdiv(fpm a, fpm b) { fpm r; /* * The following two asserts are always true * * long long tmp = ((long long)(sfpm) a << FPM_BIT); * assert(FPM_INT_MIN <= tmp); * assert(tmp <= FPM_INT_MAX); */ r = (fpm) fpmdiv_def((sfpm) a, (sfpm) b); return r; } fpm fpmimul(int a, fpm b) { fpm r; assert((0 < a) != (0 < (sfpm) b) || ((double)a * (double)(sfpm) b) <= (double)FPM_INT_MAX); assert((0 < a) == (0 < (sfpm) b) || ((double)a * (double)(sfpm) b) >= (double)FPM_INT_MIN); r = (fpm) fpmimul_def(a, (sfpm) b); return r; } fpm fpmmuli(fpm a, int b) { fpm r; assert((0 < (sfpm) a) != (0 < b) || ((double)(sfpm) a * (double)b) <= (double)FPM_INT_MAX); assert((0 < (sfpm) a) == (0 < b) || ((double)(sfpm) a * (double)b) >= (double)FPM_INT_MIN); r = (fpm) fpmmuli_def((sfpm) a, b); return r; } fpm fpmidiv(fpm a, int b) { fpm r; r = (fpm) fpmidiv_def((sfpm) a, b); return r; } #endif /* NDEBUG */ fpm atofpm(const char *s) { float r = 0.0; sscanf(s, "%f", &r); return ftofpm(r); } const char * fpmtoa(fpm a) { static int idx = 0; static char ret[4][20]; idx = (idx + 1) % (sizeof(ret) / sizeof(ret[0])); snprintf(ret[idx], sizeof(ret[0]), "%ld.%03ld", (sfpm) a >> FPM_BIT, (1000 * ((sfpm) (a) & FPM_MSK) + (FPM_NUM / 2)) >> FPM_BIT); return ret[idx]; } #else /* USE_FPM */ float atofpm(const char *s) { float r = 0.0; sscanf(s, "%f", &r); return r; } const char * fpmtoa(float a) { static int idx = 0; static char ret[4][20]; idx = (idx + 1) % (sizeof(ret) / sizeof(ret[0])); snprintf(ret[idx], sizeof(ret[0]), "%.3f", a); return ret[idx]; } #endif /* USE_FPM */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/fpm.h000066400000000000000000000101621234304727700145410ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008, Sven-Ola Tuecke (sven-ola@gmx.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _FPM_H #define _FPM_H #if 1 // def USE_FPM /* * The standard math should function with only 32 bits */ typedef long fpm; typedef signed long sfpm; typedef unsigned long ufpm; #define FPM_BIT 10 #define FPM_NUM (1 << FPM_BIT) #define FPM_MSK (FPM_NUM - 1) #define FPM_MAX ((sfpm)(~(ufpm)0 >> 1) >> FPM_BIT) #define FPM_MIN ((sfpm)-1 - FPM_MAX) #define FPM_INT_MAX ((sfpm)(~(ufpm)0 >> 1)) #define FPM_INT_MIN ((sfpm)-1 - FPM_INT_MAX) #define itofpm_def(a) (fpm)((sfpm)((a) << FPM_BIT)) #define ftofpm_def(a) (fpm)((sfpm)((a) * FPM_NUM)) #define fpmtoi_def(a) (int)((sfpm)(a) >> FPM_BIT) #define fpmtof_def(a) ((float)(sfpm)(a) / FPM_NUM) #define fpmadd_def(a, b) (fpm)((sfpm)(a) + (sfpm)(b)) #define fpmsub_def(a, b) (fpm)((sfpm)(a) - (sfpm)(b)) #define fpmmul_def(a, b) (fpm)(((sfpm)(a) * (sfpm)(b)) >> FPM_BIT) #define fpmdiv_def(a, b) (fpm)(((sfpm)(a) << FPM_BIT) / (sfpm)(b)) /* * Special: first or second factor is an integer */ #define fpmimul_def(a, b) (fpm)((int)(a) * (sfpm)(b)) #define fpmmuli_def(a, b) (fpm)((sfpm)(a) * (int)(b)) /* * Special: divisor is an integer */ #define fpmidiv_def(a, b) (fpm)((sfpm)(a) / (int)(b)) #ifdef NDEBUG #define itofpm itofpm_def #define ftofpm ftofpm_def #define fpmtoi fpmtoi_def #define fpmtof fpmtof_def #define fpmadd fpmadd_def #define fpmsub fpmsub_def #define fpmmul fpmmul_def #define fpmdiv fpmdiv_def #define fpmimul fpmimul_def #define fpmmuli fpmmuli_def #define fpmidiv fpmidiv_def #else /* NDEBUG */ fpm itofpm(sfpm i); fpm ftofpm(float f); int fpmtoi(fpm a); float fpmtof(fpm a); fpm fpmadd(fpm a, fpm b); fpm fpmsub(fpm a, fpm b); fpm fpmmul(fpm a, fpm b); fpm fpmdiv(fpm a, fpm b); fpm fpmimul(int a, fpm b); fpm fpmmuli(fpm a, int b); fpm fpmidiv(fpm a, int b); #endif /* NDEBUG */ #define INFINITE_ETX itofpm(FPM_MAX) #define MIN_LINK_QUALITY ftofpm(0.01) #define ZERO_ETX itofpm(0) #define CEIL_LQDIFF ftofpm(1.1) #define FLOOR_LQDIFF ftofpm(0.9) fpm atofpm(const char *); const char *fpmtoa(fpm); #else /* USE_FPM */ #define INFINITE_ETX ((float)(1 << 30)) #define ZERO_ETX 0.0 #define MIN_LINK_QUALITY 0.01 #define CEIL_LQDIFF 1.1 #define FLOOR_LQDIFF 0.9 float atofpm(const char *); const char *fpmtoa(float); #endif /* USE_FPM */ #endif /* _FPM_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/gateway.c000066400000000000000000001114631234304727700154210ustar00rootroot00000000000000/* * gateway.c * * Created on: 05.01.2010 * Author: henning */ #ifdef __linux__ #include "common/avl.h" #include "defs.h" #include "ipcalc.h" #include "olsr.h" #include "olsr_cfg.h" #include "olsr_cookie.h" #include "scheduler.h" #include "kernel_routes.h" #include "kernel_tunnel.h" #include "net_os.h" #include "duplicate_set.h" #include "log.h" #include "gateway_default_handler.h" #include "gateway_list.h" #include "gateway.h" #include #include /* * Defines for the multi-gateway script */ #define SCRIPT_MODE_GENERIC "generic" #define SCRIPT_MODE_OLSRIF "olsrif" #define SCRIPT_MODE_SGWSRVTUN "sgwsrvtun" #define SCRIPT_MODE_EGRESSIF "egressif" #define SCRIPT_MODE_SGWTUN "sgwtun" /** structure that holds an interface name, mark and a pointer to the gateway that uses it */ struct interfaceName { char name[IFNAMSIZ]; /**< interface name */ uint8_t mark; /**< marking */ struct gateway_entry *gw; /**< gateway that uses this interface name */ }; /** the gateway tree */ struct avl_tree gateway_tree; /** gateway cookie */ static struct olsr_cookie_info *gateway_entry_mem_cookie = NULL; /** gateway container cookie */ static struct olsr_cookie_info *gw_container_entry_mem_cookie = NULL; /** the gateway netmask for the HNA */ static uint8_t smart_gateway_netmask[sizeof(union olsr_ip_addr)]; /** the gateway handler/plugin */ static struct olsr_gw_handler *gw_handler; /** the IPv4 gateway list */ static struct gw_list gw_list_ipv4; /** the IPv6 gateway list */ static struct gw_list gw_list_ipv6; /** the current IPv4 gateway */ static struct gw_container_entry *current_ipv4_gw; /** the current IPv6 gateway */ static struct gw_container_entry *current_ipv6_gw; /** interface names for smart gateway egress interfaces */ struct interfaceName * sgwEgressInterfaceNames; /** interface names for smart gateway tunnel interfaces, IPv4 */ struct interfaceName * sgwTunnel4InterfaceNames; /** interface names for smart gateway tunnel interfaces, IPv6 */ struct interfaceName * sgwTunnel6InterfaceNames; /** the timer for proactive takedown */ static struct timer_entry *gw_takedown_timer; /* * Forward Declarations */ static void olsr_delete_gateway_tree_entry(struct gateway_entry * gw, uint8_t prefixlen, bool immediate); /* * Helper Functions */ /** * @return the gateway 'server' tunnel name to use */ static inline const char * server_tunnel_name(void) { return (olsr_cnf->ip_version == AF_INET ? TUNNEL_ENDPOINT_IF : TUNNEL_ENDPOINT_IF6); } /** * Convert the netmask of the HNA (in the form of an IP address) to a HNA * pointer. * * @param mask the netmask of the HNA (in the form of an IP address) * @param prefixlen the prefix length * @return a pointer to the HNA */ static inline uint8_t * hna_mask_to_hna_pointer(union olsr_ip_addr *mask, int prefixlen) { return (((uint8_t *)mask) + ((prefixlen+7)/8)); } /** * @return true if multi-gateway mode is enabled */ static inline bool multi_gateway_mode(void) { return (olsr_cnf->smart_gw_use_count > 1); } /** * Convert an encoded 1 byte transport value (5 bits mantissa, 3 bits exponent) * to an uplink/downlink speed value * * @param value the encoded 1 byte transport value * @return the uplink/downlink speed value (in kbit/s) */ static uint32_t deserialize_gw_speed(uint8_t value) { uint32_t speed; uint32_t exp; if (!value) { /* 0 and 1 alias onto 0 during serialisation. We take 0 here to mean 0 and * not 1 (since a bandwidth of 1 is no bandwidth at all really) */ return 0; } speed = (value >> 3) + 1; exp = value & 7; while (exp-- > 0) { speed *= 10; } return speed; } /** * Convert an uplink/downlink speed value into an encoded 1 byte transport * value (5 bits mantissa, 3 bits exponent) * * @param speed the uplink/downlink speed value (in kbit/s) * @return value the encoded 1 byte transport value */ static uint8_t serialize_gw_speed(uint32_t speed) { uint8_t exp = 0; if (speed == 0) { return 0; } if (speed > 320000000) { return 0xff; } while ((speed > 32 || (speed % 10) == 0) && exp < 7) { speed /= 10; exp++; } return ((speed - 1) << 3) | exp; } /** * Find an interfaceName struct corresponding to a certain gateway * (when gw != NULL) or to an empty interfaceName struct (when gw == NULL). * * @param gw the gateway to find (when not NULL), or the empty struct to find (when NULL) * @return a pointer to the struct, or NULL when not found */ static struct interfaceName * find_interfaceName(struct gateway_entry *gw) { struct interfaceName * sgwTunnelInterfaceNames; uint8_t i = 0; if (!multi_gateway_mode()) { return NULL; } assert(sgwTunnel4InterfaceNames); assert(sgwTunnel6InterfaceNames); sgwTunnelInterfaceNames = (olsr_cnf->ip_version == AF_INET) ? sgwTunnel4InterfaceNames : sgwTunnel6InterfaceNames; while (i < olsr_cnf->smart_gw_use_count) { struct interfaceName * ifn = &sgwTunnelInterfaceNames[i]; if (ifn->gw == gw) { return ifn; } i++; } return NULL; } /** * Get an unused olsr ipip tunnel name for a certain gateway and store it in name. * * @param gw pointer to the gateway * @param name pointer to output buffer (length IFNAMSIZ) * @param interfaceName a pointer to the location where to store a pointer to the interfaceName struct */ static void get_unused_iptunnel_name(struct gateway_entry *gw, char * name, struct interfaceName ** interfaceName) { static uint32_t counter = 0; assert(gw); assert(name); assert(interfaceName); memset(name, 0, IFNAMSIZ); if (multi_gateway_mode()) { struct interfaceName * ifn = find_interfaceName(NULL); if (ifn) { strncpy(&name[0], &ifn->name[0], sizeof(ifn->name)); *interfaceName = ifn; ifn->gw = gw; return; } /* do not return, fall-through to classic naming as fallback */ } snprintf(name, IFNAMSIZ, "tnl_%08x", (olsr_cnf->ip_version == AF_INET) ? gw->originator.v4.s_addr : ++counter); *interfaceName = NULL; } /** * Set an olsr ipip tunnel name that is used by a certain gateway as unused * * @param gw pointer to the gateway */ static void set_unused_iptunnel_name(struct gateway_entry *gw) { struct interfaceName * ifn; if (!multi_gateway_mode()) { return; } assert(gw); ifn = find_interfaceName(gw); if (ifn) { ifn->gw = NULL; return; } } /** * Run the multi-gateway script/ * * @param mode the mode (see SCRIPT_MODE_* defines) * @param add true to add policy routing, false to remove it * @param ifname the interface name (optional) * @param ifmark the interface mark (optional * @return true when successful */ static bool multiGwRunScript(const char * mode, bool add, const char * ifname, uint8_t * ifmark) { struct autobuf buf; int r; abuf_init(&buf, 1024); abuf_appendf(&buf, "\"%s\"", olsr_cnf->smart_gw_policyrouting_script); abuf_appendf(&buf, " \"%s\"", (olsr_cnf->ip_version == AF_INET) ? "ipv4" : "ipv6"); assert(!strcmp(mode, SCRIPT_MODE_GENERIC) || !strcmp(mode, SCRIPT_MODE_OLSRIF) || !strcmp(mode, SCRIPT_MODE_SGWSRVTUN) || !strcmp(mode, SCRIPT_MODE_EGRESSIF) || !strcmp(mode, SCRIPT_MODE_SGWTUN)); abuf_appendf(&buf, " \"%s\"", mode); abuf_appendf(&buf, " \"%s\"", add ? "add" : "del"); if (ifname) { assert(!strcmp(mode, SCRIPT_MODE_OLSRIF) || !strcmp(mode, SCRIPT_MODE_SGWSRVTUN) || !strcmp(mode, SCRIPT_MODE_EGRESSIF) || !strcmp(mode, SCRIPT_MODE_SGWTUN)); abuf_appendf(&buf, " \"%s\"", ifname); } else { assert(!strcmp(mode, SCRIPT_MODE_GENERIC)); } if (ifmark) { assert(!strcmp(mode, SCRIPT_MODE_EGRESSIF) || !strcmp(mode, SCRIPT_MODE_SGWTUN)); assert(ifname); abuf_appendf(&buf, " \"%u\"", *ifmark); } else { assert(!strcmp(mode, SCRIPT_MODE_GENERIC) || !strcmp(mode, SCRIPT_MODE_OLSRIF) || !strcmp(mode, SCRIPT_MODE_SGWSRVTUN)); } r = system(buf.buf); abuf_free(&buf); return (r == 0); } /** * Setup generic multi-gateway iptables and ip rules * * - generic (on olsrd start/stop) * iptablesExecutable -t mangle -A OUTPUT -j CONNMARK --restore-mark * * @param add true to add policy routing, false to remove it * @return true when successful */ static bool multiGwRulesGeneric(bool add) { return multiGwRunScript(SCRIPT_MODE_GENERIC, add, NULL, NULL); } /** * Setup multi-gateway iptables and ip rules for all OLSR interfaces. * * - olsr interfaces (on olsrd start/stop) * iptablesExecutable -t mangle -A PREROUTING -i ${olsrInterface} -j CONNMARK --restore-mark * * @param add true to add policy routing, false to remove it * @return true when successful */ static bool multiGwRulesOlsrInterfaces(bool add) { bool ok = true; struct interface * ifn; for (ifn = ifnet; ifn; ifn = ifn->int_next) { if (!multiGwRunScript(SCRIPT_MODE_OLSRIF, add, ifn->int_name, NULL)) { ok = false; if (add) { return ok; } } } return ok; } /** * Setup multi-gateway iptables and ip rules for the smart gateway server tunnel. * * - sgw server tunnel interface (on olsrd start/stop) * iptablesExecutable -t mangle -A PREROUTING -i tunl0 -j CONNMARK --restore-mark * * @param add true to add policy routing, false to remove it * @return true when successful */ static bool multiGwRulesSgwServerTunnel(bool add) { return multiGwRunScript(SCRIPT_MODE_SGWSRVTUN, add, server_tunnel_name(), NULL); } /** * Setup multi-gateway iptables and ip rules for all egress interfaces. * * - egress interfaces (on interface start/stop) * iptablesExecutable -t mangle -A POSTROUTING -m conntrack --ctstate NEW -o ${egressInterface} -j CONNMARK --set-mark ${egressInterfaceMark} * iptablesExecutable -t mangle -A INPUT -m conntrack --ctstate NEW -i ${egressInterface} -j CONNMARK --set-mark ${egressInterfaceMark} * ip rule add fwmark ${egressInterfaceMark} table ${egressInterfaceMark} pref ${egressInterfaceMark} * * like table: * ppp0 91 * eth0 92 * * @param add true to add policy routing, false to remove it * @return true when successful */ static bool multiGwRulesEgressInterfaces(bool add) { bool ok = true; unsigned int i = 0; for (i = 0; i < olsr_cnf->smart_gw_egress_interfaces_count; i++) { struct interfaceName * ifn = &sgwEgressInterfaceNames[i]; if (!multiGwRunScript(SCRIPT_MODE_EGRESSIF, add, ifn->name, &ifn->mark)) { ok = false; if (add) { return ok; } } } return ok; } /** * Setup multi-gateway iptables and ip rules for the smart gateway client tunnels. * * - sgw tunnels (on sgw tunnel start/stop) * iptablesExecutable -t mangle -A POSTROUTING -m conntrack --ctstate NEW -o ${sgwTunnelInterface} -j CONNMARK --set-mark ${sgwTunnelInterfaceMark} * ip rule add fwmark ${sgwTunnelInterfaceMark} table ${sgwTunnelInterfaceMark} pref ${sgwTunnelInterfaceMark} * * like table: * tnl_101 101 * tnl_102 102 * tnl_103 103 * tnl_104 104 * tnl_105 105 * tnl_106 106 * tnl_107 107 * tnl_108 108 */ static bool multiGwRulesSgwTunnels(bool add) { bool ok = true; unsigned int i = 0; while (i < olsr_cnf->smart_gw_use_count) { struct interfaceName * ifn = (olsr_cnf->ip_version == AF_INET) ? &sgwTunnel4InterfaceNames[i] : &sgwTunnel6InterfaceNames[i]; if (!multiGwRunScript(SCRIPT_MODE_SGWTUN, add, ifn->name, &ifn->mark)) { ok = false; if (add) { return ok; } } i++; } return ok; } /* * Callback Functions */ /** * Callback for tunnel interface monitoring which will set the route into the tunnel * when the interface comes up again. * * @param if_index the interface index * @param ifh the interface * @param flag interface change flags */ static void smartgw_tunnel_monitor(int if_index __attribute__ ((unused)), struct interface *ifh __attribute__ ((unused)), enum olsr_ifchg_flag flag __attribute__ ((unused))) { return; } /** * Timer callback to remove and cleanup a gateway entry * * @param ptr */ static void cleanup_gateway_handler(void *ptr) { struct gateway_entry *gw = ptr; if (gw->ipv4 || gw->ipv6) { /* do not clean it up when it is in use */ return; } /* remove gateway entry */ avl_delete(&gateway_tree, &gw->node); olsr_cookie_free(gateway_entry_mem_cookie, gw); } /** * Remove a gateway from a gateway list. * * @param gw_list a pointer to the gateway list * @param ipv4 true when dealing with an IPv4 gateway / gateway list * @param gw a pointer to the gateway to remove from the list */ static void removeGatewayFromList(struct gw_list * gw_list, bool ipv4, struct gw_container_entry * gw) { if (gw->tunnel) { struct interfaceName * ifn = find_interfaceName(gw->gw); if (ifn) { olsr_os_inetgw_tunnel_route(gw->tunnel->if_index, ipv4, false, ifn->mark); } olsr_os_del_ipip_tunnel(gw->tunnel); set_unused_iptunnel_name(gw->gw); gw->tunnel = NULL; } gw->gw = NULL; olsr_cookie_free(gw_container_entry_mem_cookie, olsr_gw_list_remove(gw_list, gw)); } /** * Remove expensive gateways from the gateway list. * It uses the smart_gw_takedown_percentage configuration parameter * * @param gw_list a pointer to the gateway list * @param ipv4 true when dealing with an IPv4 gateway / gateway list * @param current_gw the current gateway */ static void takeDownExpensiveGateways(struct gw_list * gw_list, bool ipv4, struct gw_container_entry * current_gw) { uint64_t current_gw_cost_boundary; /* * exit immediately when takedown is disabled, there is no current gateway, or * when there is only a single gateway */ if ((olsr_cnf->smart_gw_takedown_percentage == 0) || (current_gw == NULL ) || (gw_list->count <= 1)) { return; } /* get the cost boundary */ /* scale down because otherwise the percentage calculation can overflow */ current_gw_cost_boundary = (current_gw->path_cost >> 2); if (olsr_cnf->smart_gw_takedown_percentage < 100) { current_gw_cost_boundary = (current_gw_cost_boundary * 100) / olsr_cnf->smart_gw_takedown_percentage; } /* loop while we still have gateways */ while (gw_list->count > 1) { /* get the worst gateway */ struct gw_container_entry * worst_gw = olsr_gw_list_get_worst_entry(gw_list); /* exit when it's the current gateway */ if (worst_gw == current_gw) { return; } /* * exit when it (and further ones; the list is sorted on costs) has lower * costs than the boundary costs */ if ((worst_gw->path_cost >> 2) < current_gw_cost_boundary) { return; } /* it's is too expensive: take it down */ removeGatewayFromList(gw_list, ipv4, worst_gw); } } /** * Timer callback for proactive gateway takedown * * @param unused unused */ static void gw_takedown_timer_callback(void *unused __attribute__ ((unused))) { takeDownExpensiveGateways(&gw_list_ipv4, true, current_ipv4_gw); takeDownExpensiveGateways(&gw_list_ipv6, false, current_ipv6_gw); } /* * Main Interface */ /** * Initialize gateway system */ int olsr_init_gateways(void) { int retries = 5; gateway_entry_mem_cookie = olsr_alloc_cookie("gateway_entry_mem_cookie", OLSR_COOKIE_TYPE_MEMORY); olsr_cookie_set_memory_size(gateway_entry_mem_cookie, sizeof(struct gateway_entry)); gw_container_entry_mem_cookie = olsr_alloc_cookie("gw_container_entry_mem_cookie", OLSR_COOKIE_TYPE_MEMORY); olsr_cookie_set_memory_size(gw_container_entry_mem_cookie, sizeof(struct gw_container_entry)); avl_init(&gateway_tree, avl_comp_default); olsr_gw_list_init(&gw_list_ipv4, olsr_cnf->smart_gw_use_count); olsr_gw_list_init(&gw_list_ipv6, olsr_cnf->smart_gw_use_count); if (!multi_gateway_mode()) { sgwEgressInterfaceNames = NULL; sgwTunnel4InterfaceNames = NULL; sgwTunnel6InterfaceNames = NULL; } else { uint8_t i; struct sgw_egress_if * egressif; /* setup the egress interface name/mark pairs */ sgwEgressInterfaceNames = olsr_malloc(sizeof(struct interfaceName) * olsr_cnf->smart_gw_egress_interfaces_count, "sgwEgressInterfaceNames"); i = 0; egressif = olsr_cnf->smart_gw_egress_interfaces; while (egressif) { struct interfaceName * ifn = &sgwEgressInterfaceNames[i]; ifn->gw = NULL; ifn->mark = i + olsr_cnf->smart_gw_mark_offset_egress; egressif->mark = ifn->mark; snprintf(&ifn->name[0], sizeof(ifn->name), egressif->name, egressif->mark); egressif = egressif->next; i++; } assert(i == olsr_cnf->smart_gw_egress_interfaces_count); /* setup the SGW tunnel name/mark pairs */ sgwTunnel4InterfaceNames = olsr_malloc(sizeof(struct interfaceName) * olsr_cnf->smart_gw_use_count, "sgwTunnel4InterfaceNames"); sgwTunnel6InterfaceNames = olsr_malloc(sizeof(struct interfaceName) * olsr_cnf->smart_gw_use_count, "sgwTunnel6InterfaceNames"); for (i = 0; i < olsr_cnf->smart_gw_use_count; i++) { struct interfaceName * ifn = &sgwTunnel4InterfaceNames[i]; ifn->gw = NULL; ifn->mark = i + olsr_cnf->smart_gw_mark_offset_tunnels; snprintf(&ifn->name[0], sizeof(ifn->name), "tnl_4%03u", ifn->mark); ifn = &sgwTunnel6InterfaceNames[i]; ifn->gw = NULL; ifn->mark = i + olsr_cnf->smart_gw_mark_offset_tunnels; snprintf(&ifn->name[0], sizeof(ifn->name), "tnl_6%03u", ifn->mark); } } current_ipv4_gw = NULL; current_ipv6_gw = NULL; gw_handler = NULL; refresh_smartgw_netmask(); /* initialize default gateway handler */ gw_handler = &gw_def_handler; gw_handler->init(); /* * There appears to be a kernel bug in some kernels (at least in the 3.0 * Debian Squeeze kernel, but not in the Fedora 17 kernels) around * initialising the IPIP server tunnel (loading the IPIP module), so we retry * a few times before giving up */ while (retries-- > 0) { if (!olsr_os_init_iptunnel(server_tunnel_name())) { retries = 5; break; } olsr_printf(0, "Could not initialise the IPIP server tunnel, retrying %d more times\n", retries); } if (retries <= 0) { return 1; } olsr_add_ifchange_handler(smartgw_tunnel_monitor); return 0; } /** * Startup gateway system */ int olsr_startup_gateways(void) { bool ok = true; if (!multi_gateway_mode()) { return 0; } ok = ok && multiGwRulesGeneric(true); ok = ok && multiGwRulesSgwServerTunnel(true); ok = ok && multiGwRulesOlsrInterfaces(true); ok = ok && multiGwRulesEgressInterfaces(true); ok = ok && multiGwRulesSgwTunnels(true); if (!ok) { olsr_printf(0, "Could not setup multi-gateway iptables and ip rules\n"); olsr_shutdown_gateways(); return 1; } if (olsr_cnf->smart_gw_takedown_percentage > 0) { /* start gateway takedown timer */ olsr_set_timer(&gw_takedown_timer, olsr_cnf->smart_gw_period, 0, true, &gw_takedown_timer_callback, NULL, 0); } return 0; } /** * Shutdown gateway tunnel system */ void olsr_shutdown_gateways(void) { if (!multi_gateway_mode()) { return; } if (olsr_cnf->smart_gw_takedown_percentage > 0) { /* stop gateway takedown timer */ olsr_stop_timer(gw_takedown_timer); gw_takedown_timer = NULL; } (void)multiGwRulesSgwTunnels(false); (void)multiGwRulesEgressInterfaces(false); (void)multiGwRulesOlsrInterfaces(false); (void)multiGwRulesSgwServerTunnel(false); (void)multiGwRulesGeneric(false); } /** * Cleanup gateway tunnel system */ void olsr_cleanup_gateways(void) { struct gateway_entry * tree_gw; struct gw_container_entry * gw; olsr_remove_ifchange_handler(smartgw_tunnel_monitor); /* remove all gateways in the gateway tree that are not the active gateway */ OLSR_FOR_ALL_GATEWAY_ENTRIES(tree_gw) { if ((tree_gw != olsr_get_inet_gateway(false)) && (tree_gw != olsr_get_inet_gateway(true))) { olsr_delete_gateway_tree_entry(tree_gw, FORCE_DELETE_GW_ENTRY, true); } } OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw) /* remove all active IPv4 gateways (should be at most 1 now) */ OLSR_FOR_ALL_GWS(&gw_list_ipv4.head, gw) { if (gw && gw->gw) { olsr_delete_gateway_entry(&gw->gw->originator, FORCE_DELETE_GW_ENTRY, true); } } OLSR_FOR_ALL_GWS_END(gw); /* remove all active IPv6 gateways (should be at most 1 now) */ OLSR_FOR_ALL_GWS(&gw_list_ipv6.head, gw) { if (gw && gw->gw) { olsr_delete_gateway_entry(&gw->gw->originator, FORCE_DELETE_GW_ENTRY, true); } } OLSR_FOR_ALL_GWS_END(gw); /* there should be no more gateways */ assert(!avl_walk_first(&gateway_tree)); assert(!current_ipv4_gw); assert(!current_ipv6_gw); olsr_os_cleanup_iptunnel(server_tunnel_name()); assert(gw_handler); gw_handler->cleanup(); gw_handler = NULL; if (sgwEgressInterfaceNames) { free(sgwEgressInterfaceNames); sgwEgressInterfaceNames = NULL; } if (sgwTunnel4InterfaceNames) { free(sgwTunnel4InterfaceNames); sgwTunnel4InterfaceNames = NULL; } if (sgwTunnel6InterfaceNames) { free(sgwTunnel6InterfaceNames); sgwTunnel6InterfaceNames = NULL; } olsr_gw_list_cleanup(&gw_list_ipv6); olsr_gw_list_cleanup(&gw_list_ipv4); olsr_free_cookie(gw_container_entry_mem_cookie); olsr_free_cookie(gateway_entry_mem_cookie); } /** * Triggers the first lookup of a gateway. */ void olsr_trigger_inetgw_startup(void) { assert(gw_handler); gw_handler->startup(); } /** * Print debug information about gateway entries */ #ifndef NODEBUG void olsr_print_gateway_entries(void) { struct ipaddr_str buf; struct gateway_entry *gw; const int addrsize = olsr_cnf->ip_version == AF_INET ? (INET_ADDRSTRLEN - 1) : (INET6_ADDRSTRLEN - 1); OLSR_PRINTF(0, "\n--- %s ---------------------------------------------------- GATEWAYS\n\n", olsr_wallclock_string()); OLSR_PRINTF(0, "%-*s %-6s %-9s %-9s %s\n", addrsize, "IP address", "Type", "Uplink", "Downlink", olsr_cnf->ip_version == AF_INET ? "" : "External Prefix"); OLSR_FOR_ALL_GATEWAY_ENTRIES(gw) { OLSR_PRINTF(0, "%-*s %s%c%s%c%c %-9u %-9u %s\n", addrsize, olsr_ip_to_string(&buf, &gw->originator), gw->ipv4nat ? "" : " ", gw->ipv4 ? '4' : ' ', gw->ipv4nat ? "(N)" : "", (gw->ipv4 && gw->ipv6) ? ',' : ' ', gw->ipv6 ? '6' : ' ', gw->uplink, gw->downlink, gw->external_prefix.prefix_len == 0 ? "" : olsr_ip_prefix_to_string(&gw->external_prefix)); } OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw) } #endif /* NODEBUG */ /* * Tx Path Interface */ /** * Apply the smart gateway modifications to an outgoing HNA * * @param mask pointer to netmask of the HNA * @param prefixlen of the HNA */ void olsr_modifiy_inetgw_netmask(union olsr_ip_addr *mask, int prefixlen) { uint8_t *ptr = hna_mask_to_hna_pointer(mask, prefixlen); /* copy the current settings for uplink/downlink into the mask */ memcpy(ptr, &smart_gateway_netmask, sizeof(smart_gateway_netmask) - prefixlen / 8); if (olsr_cnf->has_ipv4_gateway) { ptr[GW_HNA_FLAGS] |= GW_HNA_FLAG_IPV4; if (olsr_cnf->smart_gw_uplink_nat) { ptr[GW_HNA_FLAGS] |= GW_HNA_FLAG_IPV4_NAT; } } if (olsr_cnf->has_ipv6_gateway) { ptr[GW_HNA_FLAGS] |= GW_HNA_FLAG_IPV6; } if (!olsr_cnf->has_ipv6_gateway || prefixlen != ipv6_internet_route.prefix_len) { ptr[GW_HNA_FLAGS] &= ~GW_HNA_FLAG_IPV6PREFIX; } } /* * SgwDynSpeed Plugin Interface */ /** * Setup the gateway netmask */ void refresh_smartgw_netmask(void) { uint8_t *ip; /* clear the mask */ memset(&smart_gateway_netmask, 0, sizeof(smart_gateway_netmask)); if (olsr_cnf->smart_gw_active) { ip = (uint8_t *) &smart_gateway_netmask; ip[GW_HNA_FLAGS] |= GW_HNA_FLAG_LINKSPEED; ip[GW_HNA_DOWNLINK] = serialize_gw_speed(olsr_cnf->smart_gw_downlink); ip[GW_HNA_UPLINK] = serialize_gw_speed(olsr_cnf->smart_gw_uplink); if (olsr_cnf->ip_version == AF_INET6 && olsr_cnf->smart_gw_prefix.prefix_len > 0) { ip[GW_HNA_FLAGS] |= GW_HNA_FLAG_IPV6PREFIX; ip[GW_HNA_V6PREFIXLEN] = olsr_cnf->smart_gw_prefix.prefix_len; memcpy(&ip[GW_HNA_V6PREFIX], &olsr_cnf->smart_gw_prefix.prefix, 8); } } } /* * TC/SPF/HNA Interface */ /** * Checks if a HNA prefix/netmask combination is a smart gateway * * @param prefix * @param mask * @return true if is a valid smart gateway HNA, false otherwise */ bool olsr_is_smart_gateway(struct olsr_ip_prefix *prefix, union olsr_ip_addr *mask) { uint8_t *ptr; if (!is_prefix_inetgw(prefix)) { return false; } ptr = hna_mask_to_hna_pointer(mask, prefix->prefix_len); return ptr[GW_HNA_PAD] == 0 && ptr[GW_HNA_FLAGS] != 0; } /** * Update a gateway_entry based on a HNA * * @param originator ip of the source of the HNA * @param mask netmask of the HNA * @param prefixlen of the HNA * @param seqno the sequence number of the HNA */ void olsr_update_gateway_entry(union olsr_ip_addr *originator, union olsr_ip_addr *mask, int prefixlen, uint16_t seqno) { struct gw_container_entry * new_gw_in_list; uint8_t *ptr; struct gateway_entry *gw = node2gateway(avl_find(&gateway_tree, originator)); if (!gw) { gw = olsr_cookie_malloc(gateway_entry_mem_cookie); gw->originator = *originator; gw->node.key = &gw->originator; avl_insert(&gateway_tree, &gw->node, AVL_DUP_NO); } else if (olsr_seqno_diff(seqno, gw->seqno) <= 0) { /* ignore older HNAs */ return; } /* keep new HNA seqno */ gw->seqno = seqno; ptr = hna_mask_to_hna_pointer(mask, prefixlen); if ((ptr[GW_HNA_FLAGS] & GW_HNA_FLAG_LINKSPEED) != 0) { gw->uplink = deserialize_gw_speed(ptr[GW_HNA_UPLINK]); gw->downlink = deserialize_gw_speed(ptr[GW_HNA_DOWNLINK]); } else { gw->uplink = 0; gw->downlink = 0; } gw->ipv4 = (ptr[GW_HNA_FLAGS] & GW_HNA_FLAG_IPV4) != 0; gw->ipv4nat = (ptr[GW_HNA_FLAGS] & GW_HNA_FLAG_IPV4_NAT) != 0; if (olsr_cnf->ip_version == AF_INET6) { gw->ipv6 = (ptr[GW_HNA_FLAGS] & GW_HNA_FLAG_IPV6) != 0; /* do not reset prefixlength for ::ffff:0:0 HNAs */ if (prefixlen == ipv6_internet_route.prefix_len) { memset(&gw->external_prefix, 0, sizeof(gw->external_prefix)); if ((ptr[GW_HNA_FLAGS] & GW_HNA_FLAG_IPV6PREFIX) != 0 && memcmp(mask->v6.s6_addr, &ipv6_internet_route.prefix, olsr_cnf->ipsize) == 0) { /* this is the right prefix (2000::/3), so we can copy the prefix */ gw->external_prefix.prefix_len = ptr[GW_HNA_V6PREFIXLEN]; memcpy(&gw->external_prefix.prefix, &ptr[GW_HNA_V6PREFIX], 8); } } } /* stop cleanup timer if necessary */ if (gw->cleanup_timer) { olsr_stop_timer(gw->cleanup_timer); gw->cleanup_timer = NULL; } /* update the costs of the gateway when it is an active gateway */ new_gw_in_list = olsr_gw_list_find(&gw_list_ipv4, gw); if (new_gw_in_list) { assert(gw_handler); new_gw_in_list = olsr_gw_list_update(&gw_list_ipv4, new_gw_in_list, gw_handler->getcosts(new_gw_in_list->gw)); assert(new_gw_in_list); } new_gw_in_list = olsr_gw_list_find(&gw_list_ipv6, gw); if (new_gw_in_list) { assert(gw_handler); new_gw_in_list = olsr_gw_list_update(&gw_list_ipv6, new_gw_in_list, gw_handler->getcosts(new_gw_in_list->gw)); assert(new_gw_in_list); } /* call update handler */ assert(gw_handler); gw_handler->update(gw); } /** * Delete a gateway based on the originator IP and the prefixlength of a HNA. * Should only be called if prefix is a smart_gw prefix or if node is removed * from TC set. * * @param originator * @param prefixlen * @param immediate when set to true then the gateway is removed from the * gateway tree immediately, else it is removed on a delayed schedule. */ void olsr_delete_gateway_entry(union olsr_ip_addr *originator, uint8_t prefixlen, bool immediate) { olsr_delete_gateway_tree_entry(node2gateway(avl_find(&gateway_tree, originator)), prefixlen, immediate); } /** * Delete a gateway entry . * * @param gw a gateway entry from the gateway tree * @param prefixlen * @param immediate when set to true then the gateway is removed from the * gateway tree immediately, else it is removed on a delayed schedule. */ static void olsr_delete_gateway_tree_entry(struct gateway_entry * gw, uint8_t prefixlen, bool immediate) { bool change = false; if (!gw) { return; } if (immediate && gw->cleanup_timer) { /* stop timer if we have to remove immediately */ olsr_stop_timer(gw->cleanup_timer); gw->cleanup_timer = NULL; } if (gw->cleanup_timer == NULL || gw->ipv4 || gw->ipv6) { /* the gw is not scheduled for deletion */ if (olsr_cnf->ip_version == AF_INET && prefixlen == 0) { change = gw->ipv4; gw->ipv4 = false; gw->ipv4nat = false; } else if (olsr_cnf->ip_version == AF_INET6 && prefixlen == ipv6_internet_route.prefix_len) { change = gw->ipv6; gw->ipv6 = false; } else if (olsr_cnf->ip_version == AF_INET6 && prefixlen == ipv6_mappedv4_route.prefix_len) { change = gw->ipv4; gw->ipv4 = false; gw->ipv4nat = false; } if (prefixlen == FORCE_DELETE_GW_ENTRY || !(gw->ipv4 || gw->ipv6)) { struct gw_container_entry * gw_in_list; /* prevent this gateway from being chosen as the new gateway */ gw->ipv4 = false; gw->ipv4nat = false; gw->ipv6 = false; /* handle gateway loss */ assert(gw_handler); gw_handler->delete(gw); /* cleanup gateway if necessary */ gw_in_list = olsr_gw_list_find(&gw_list_ipv4, gw); if (gw_in_list) { if (current_ipv4_gw && current_ipv4_gw->gw == gw) { olsr_os_inetgw_tunnel_route(current_ipv4_gw->tunnel->if_index, true, false, olsr_cnf->rt_table_tunnel); current_ipv4_gw = NULL; } if (gw_in_list->tunnel) { struct interfaceName * ifn = find_interfaceName(gw_in_list->gw); if (ifn) { olsr_os_inetgw_tunnel_route(gw_in_list->tunnel->if_index, true, false, ifn->mark); } olsr_os_del_ipip_tunnel(gw_in_list->tunnel); set_unused_iptunnel_name(gw_in_list->gw); gw_in_list->tunnel = NULL; } gw_in_list->gw = NULL; gw_in_list = olsr_gw_list_remove(&gw_list_ipv4, gw_in_list); olsr_cookie_free(gw_container_entry_mem_cookie, gw_in_list); } gw_in_list = olsr_gw_list_find(&gw_list_ipv6, gw); if (gw_in_list) { if (current_ipv6_gw && current_ipv6_gw->gw == gw) { olsr_os_inetgw_tunnel_route(current_ipv6_gw->tunnel->if_index, false, false, olsr_cnf->rt_table_tunnel); current_ipv6_gw = NULL; } if (gw_in_list->tunnel) { struct interfaceName * ifn = find_interfaceName(gw_in_list->gw); if (ifn) { olsr_os_inetgw_tunnel_route(gw_in_list->tunnel->if_index, false, false, ifn->mark); } olsr_os_del_ipip_tunnel(gw_in_list->tunnel); set_unused_iptunnel_name(gw_in_list->gw); gw_in_list->tunnel = NULL; } gw_in_list->gw = NULL; gw_in_list = olsr_gw_list_remove(&gw_list_ipv6, gw_in_list); olsr_cookie_free(gw_container_entry_mem_cookie, gw_in_list); } if (!immediate) { /* remove gateway entry on a delayed schedule */ olsr_set_timer(&gw->cleanup_timer, GW_CLEANUP_INTERVAL, 0, false, cleanup_gateway_handler, gw, NULL); } else { cleanup_gateway_handler(gw); } /* when the current gateway was deleted, then immediately choose a new gateway */ if (!current_ipv4_gw || !current_ipv6_gw) { assert(gw_handler); gw_handler->choose(!current_ipv4_gw, !current_ipv6_gw); } } else if (change) { assert(gw_handler); gw_handler->update(gw); } } } /** * Triggers a check if the one of the gateways have been lost or has an * ETX = infinity */ void olsr_trigger_gatewayloss_check(void) { bool ipv4 = false; bool ipv6 = false; if (current_ipv4_gw && current_ipv4_gw->gw) { struct tc_entry *tc = olsr_lookup_tc_entry(¤t_ipv4_gw->gw->originator); ipv4 = (tc == NULL || tc->path_cost == ROUTE_COST_BROKEN); } if (current_ipv6_gw && current_ipv6_gw->gw) { struct tc_entry *tc = olsr_lookup_tc_entry(¤t_ipv6_gw->gw->originator); ipv6 = (tc == NULL || tc->path_cost == ROUTE_COST_BROKEN); } if (ipv4 || ipv6) { assert(gw_handler); gw_handler->choose(ipv4, ipv6); } } /* * Gateway Plugin Functions */ /** * Sets a new internet gateway. * * @param originator ip address of the node with the new gateway * @param path_cost the path cost * @param ipv4 set ipv4 gateway * @param ipv6 set ipv6 gateway * @return true if an error happened, false otherwise */ bool olsr_set_inet_gateway(union olsr_ip_addr *originator, uint64_t path_cost, bool ipv4, bool ipv6) { struct gateway_entry *new_gw; ipv4 = ipv4 && (olsr_cnf->ip_version == AF_INET || olsr_cnf->use_niit); ipv6 = ipv6 && (olsr_cnf->ip_version == AF_INET6); if (!ipv4 && !ipv6) { return true; } new_gw = node2gateway(avl_find(&gateway_tree, originator)); if (!new_gw) { /* the originator is not in the gateway tree, we can't set it as gateway */ return true; } /* handle IPv4 */ if (ipv4 && new_gw->ipv4 && (!new_gw->ipv4nat || olsr_cnf->smart_gw_allow_nat) && (!current_ipv4_gw || current_ipv4_gw->gw != new_gw || current_ipv4_gw->path_cost != path_cost)) { /* new gw is different than the current gw, or costs have changed */ struct gw_container_entry * new_gw_in_list = olsr_gw_list_find(&gw_list_ipv4, new_gw); if (new_gw_in_list) { /* new gw is already in the gw list */ assert(new_gw_in_list->tunnel); olsr_os_inetgw_tunnel_route(new_gw_in_list->tunnel->if_index, true, true, olsr_cnf->rt_table_tunnel); current_ipv4_gw = olsr_gw_list_update(&gw_list_ipv4, new_gw_in_list, path_cost); } else { /* new gw is not yet in the gw list */ char name[IFNAMSIZ]; struct olsr_iptunnel_entry *new_v4gw_tunnel; struct interfaceName * interfaceName; if (olsr_gw_list_full(&gw_list_ipv4)) { /* the list is full: remove the worst active gateway */ struct gw_container_entry* worst = olsr_gw_list_get_worst_entry(&gw_list_ipv4); assert(worst); removeGatewayFromList(&gw_list_ipv4, true, worst); } get_unused_iptunnel_name(new_gw, name, &interfaceName); new_v4gw_tunnel = olsr_os_add_ipip_tunnel(&new_gw->originator, true, name); if (new_v4gw_tunnel) { if (interfaceName) { olsr_os_inetgw_tunnel_route(new_v4gw_tunnel->if_index, true, true, interfaceName->mark); } olsr_os_inetgw_tunnel_route(new_v4gw_tunnel->if_index, true, true, olsr_cnf->rt_table_tunnel); new_gw_in_list = olsr_cookie_malloc(gw_container_entry_mem_cookie); new_gw_in_list->gw = new_gw; new_gw_in_list->tunnel = new_v4gw_tunnel; new_gw_in_list->path_cost = path_cost; current_ipv4_gw = olsr_gw_list_add(&gw_list_ipv4, new_gw_in_list); } else { /* adding the tunnel failed, we try again in the next cycle */ set_unused_iptunnel_name(new_gw); ipv4 = false; } } } /* handle IPv6 */ if (ipv6 && new_gw->ipv6 && (!current_ipv6_gw || current_ipv6_gw->gw != new_gw || current_ipv6_gw->path_cost != path_cost)) { /* new gw is different than the current gw, or costs have changed */ struct gw_container_entry * new_gw_in_list = olsr_gw_list_find(&gw_list_ipv6, new_gw); if (new_gw_in_list) { /* new gw is already in the gw list */ assert(new_gw_in_list->tunnel); olsr_os_inetgw_tunnel_route(new_gw_in_list->tunnel->if_index, true, true, olsr_cnf->rt_table_tunnel); current_ipv6_gw = olsr_gw_list_update(&gw_list_ipv6, new_gw_in_list, path_cost); } else { /* new gw is not yet in the gw list */ char name[IFNAMSIZ]; struct olsr_iptunnel_entry *new_v6gw_tunnel; struct interfaceName * interfaceName; if (olsr_gw_list_full(&gw_list_ipv6)) { /* the list is full: remove the worst active gateway */ struct gw_container_entry* worst = olsr_gw_list_get_worst_entry(&gw_list_ipv6); assert(worst); removeGatewayFromList(&gw_list_ipv6, false, worst); } get_unused_iptunnel_name(new_gw, name, &interfaceName); new_v6gw_tunnel = olsr_os_add_ipip_tunnel(&new_gw->originator, false, name); if (new_v6gw_tunnel) { if (interfaceName) { olsr_os_inetgw_tunnel_route(new_v6gw_tunnel->if_index, false, true, interfaceName->mark); } olsr_os_inetgw_tunnel_route(new_v6gw_tunnel->if_index, false, true, olsr_cnf->rt_table_tunnel); new_gw_in_list = olsr_cookie_malloc(gw_container_entry_mem_cookie); new_gw_in_list->gw = new_gw; new_gw_in_list->tunnel = new_v6gw_tunnel; new_gw_in_list->path_cost = path_cost; current_ipv6_gw = olsr_gw_list_add(&gw_list_ipv6, new_gw_in_list); } else { /* adding the tunnel failed, we try again in the next cycle */ set_unused_iptunnel_name(new_gw); ipv6 = false; } } } return !ipv4 && !ipv6; } /** * @param ipv6 if set to true then the IPv6 gateway is returned, otherwise the IPv4 * gateway is returned * @return a pointer to the gateway_entry of the current ipv4 internet gw or * NULL if not set. */ struct gateway_entry *olsr_get_inet_gateway(bool ipv6) { if (ipv6) { return current_ipv6_gw ? current_ipv6_gw->gw : NULL; } return current_ipv4_gw ? current_ipv4_gw->gw : NULL; } #endif /* __linux__ */ olsrd-0.6.6.2/src/gateway.h000066400000000000000000000103451234304727700154230ustar00rootroot00000000000000/* * gateway.h * * Created on: 05.01.2010 * Author: henning */ #ifndef GATEWAY_H_ #define GATEWAY_H_ #include "common/avl.h" #include "common/list.h" #include "defs.h" #include "olsr.h" #include "scheduler.h" /** used to signal to olsr_delete_gateway_entry to force deletion */ #define FORCE_DELETE_GW_ENTRY 255 /** the interval (in milliseconds) on which to run gateway cleanup */ #define GW_CLEANUP_INTERVAL 30000 /* * hack for Vienna network: * set MAXIMUM_GATEWAY_PREFIX_LENGTH to 1 to remove 0.0.0.0/128.0.0.0 and * 128.0.0.0/128.0.0.0 routes */ // #define MAXIMUM_GATEWAY_PREFIX_LENGTH 1 /** gateway HNA flags */ enum gateway_hna_flags { GW_HNA_FLAG_LINKSPEED = 1 << 0, GW_HNA_FLAG_IPV4 = 1 << 1, GW_HNA_FLAG_IPV4_NAT = 1 << 2, GW_HNA_FLAG_IPV6 = 1 << 3, GW_HNA_FLAG_IPV6PREFIX = 1 << 4 }; /** gateway HNA field byte offsets in the netmask field of the HNA */ enum gateway_hna_fields { GW_HNA_PAD = 0, GW_HNA_FLAGS = 1, GW_HNA_UPLINK = 2, GW_HNA_DOWNLINK = 3, GW_HNA_V6PREFIXLEN = 4, GW_HNA_V6PREFIX = 5 }; /** a gateway entry */ struct gateway_entry { struct avl_node node; union olsr_ip_addr originator; struct olsr_ip_prefix external_prefix; uint32_t uplink; uint32_t downlink; bool ipv4; bool ipv4nat; bool ipv6; struct timer_entry *cleanup_timer; uint16_t seqno; }; /** * static inline struct gateway_entry * node2gateway (struct avl_node *ptr) * * Converts a node into a gateway entry */ AVLNODE2STRUCT(node2gateway, struct gateway_entry, node); /** * Loop over all gateway entries and put the iterated gateway entry in gw */ #define OLSR_FOR_ALL_GATEWAY_ENTRIES(gw) \ { \ struct avl_node *gw_node, *next_gw_node; \ for (gw_node = avl_walk_first(&gateway_tree); \ gw_node; gw_node = next_gw_node) { \ next_gw_node = avl_walk_next(gw_node); \ gw = node2gateway(gw_node); #define OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw) }} /** the gateway tree */ extern struct avl_tree gateway_tree; /** * Function pointer table for gateway plugin hooks. */ struct olsr_gw_handler { /** * Called on olsrd startup to initialise the plugin. */ void (*init)(void); /** * Called on olsrd shutdown to cleanup the plugin. */ void (*cleanup)(void); /** * Called on olsrd startup to perform the initial gateway selection. */ void (*startup)(void); /** * Called when the costs of a gateway must be determined. * * @param gw the gateway * @return the costs */ uint64_t (*getcosts)(struct gateway_entry *gw); /** * Called when a new gateway must be chosen. * * @param ipv4 true when an IPv4 gateway must be chosen * @param ipv6 true when an IPv6 gateway must be chosen */ void (*choose)(bool ipv4, bool ipv6); /** * Called when a gateway HNA is received. * * @param gw the gateway entry */ void (*update)(struct gateway_entry * gw); /** * Called when a TC or a HNA is removed. * * @param gw the gateway entry */ void (* delete)(struct gateway_entry * gw); }; /* * Main Interface */ int olsr_init_gateways(void); int olsr_startup_gateways(void); void olsr_shutdown_gateways(void); void olsr_cleanup_gateways(void); void olsr_trigger_inetgw_startup(void); #ifndef NODEBUG void olsr_print_gateway_entries(void); #else #define olsr_print_gateway_entries() do { } while(0) #endif /* * Tx Path Interface */ void olsr_modifiy_inetgw_netmask(union olsr_ip_addr *mask, int prefixlen); /* * Interface to adjust uplink/downlink speed */ void refresh_smartgw_netmask(void); /* * TC/SPF/HNA Interface */ bool olsr_is_smart_gateway(struct olsr_ip_prefix *prefix, union olsr_ip_addr *net); void olsr_update_gateway_entry(union olsr_ip_addr *originator, union olsr_ip_addr *mask, int prefixlen, uint16_t seqno); void olsr_delete_gateway_entry(union olsr_ip_addr *originator, uint8_t prefixlen, bool immediate); void olsr_trigger_gatewayloss_check(void); /* * Gateway Plugin Functions */ bool olsr_set_inet_gateway(union olsr_ip_addr *originator, uint64_t path_cost, bool ipv4, bool ipv6); struct gateway_entry *olsr_get_inet_gateway(bool ipv6); #endif /* GATEWAY_H_ */ olsrd-0.6.6.2/src/gateway_default_handler.c000066400000000000000000000311231234304727700206140ustar00rootroot00000000000000/* * gateway_default_handler.c * * Created on: Jan 29, 2010 * Author: rogge */ #ifdef __linux__ #include "gateway_default_handler.h" #include "defs.h" #include "gateway.h" #include "lq_plugin.h" static uint32_t gw_def_nodecount; static uint32_t gw_def_stablecount; static bool gw_def_choose_new_ipv4_gw; static bool gw_def_choose_new_ipv6_gw; static struct timer_entry *gw_def_timer; /* forward declarations */ static void gw_default_init(void); static void gw_default_cleanup(void); static void gw_default_startup_handler(void); static uint64_t gw_default_getcosts(struct gateway_entry *gw); static void gw_default_choosegw_handler(bool ipv4, bool ipv6); static void gw_default_update_handler(struct gateway_entry *); static void gw_default_delete_handler(struct gateway_entry *); /** * Callback list for the gateway (default) handler */ struct olsr_gw_handler gw_def_handler = { &gw_default_init, &gw_default_cleanup, &gw_default_startup_handler, &gw_default_getcosts, &gw_default_choosegw_handler, &gw_default_update_handler, &gw_default_delete_handler }; /* * Helper functions */ /** * Calculate the threshold path cost. * * @param path_cost the path cost * @return the threshold path cost */ static inline uint64_t gw_default_calc_threshold(uint64_t path_cost) { if (olsr_cnf->smart_gw_thresh == 0) { return path_cost; } return ((path_cost * (uint64_t) olsr_cnf->smart_gw_thresh) + (uint64_t) 50) / (uint64_t) 100; } /** * Weigh the path costs and the gateway bandwidth. * * If the ETX divider is zero, then no weighing is performed and only the path * costs are considered (classic behaviour). * * If either of the uplink or downlink bandwidths is zero, then UINT64_MAX is * returned. * * @param path_cost the (ETX) path cost to the gateway * @param exitUk the gateway exit link uplink bandwidth (in kbps) * @param exitDk the gateway exit link downlink bandwidth (in kbps) * @return the weighed path cost */ static inline uint64_t gw_default_weigh_costs(uint32_t path_cost, uint32_t exitUk, uint32_t exitDk) { uint8_t WexitU = olsr_cnf->smart_gw_weight_exitlink_up; uint8_t WexitD = olsr_cnf->smart_gw_weight_exitlink_down; uint8_t Wetx = olsr_cnf->smart_gw_weight_etx; uint8_t Detx = olsr_cnf->smart_gw_divider_etx; uint64_t costU; uint64_t costD; uint64_t costE; if (!Detx) { /* only consider path costs (classic behaviour) (but scale to 64 bit) */ return (uint64_t)path_cost << 32; } if (!exitUk || !exitDk) { /* zero bandwidth */ return UINT64_MAX; } /* * Weighing of the path costs: * * exitUm = the gateway exit link uplink bandwidth, in Mbps * exitDm = the gateway exit link downlink bandwidth, in Mbps * WexitU = the gateway exit link uplink bandwidth weight (configured) * WexitD = the gateway exit link downlink bandwidth weight (configured) * Wetx = the ETX path cost weight (configured) * Detx = the ETX path cost divider (configured) * * WexitU WexitD Wetx * path_cost_weight = ------ + ------ + ---- * path_cost * exitUm exitDm Detx * * Since the gateway exit link bandwidths are in Kbps, the following formula * is used to convert them to the desired Mbps: * * bwK * bwM = ---- bwK = bandwidth in Kbps * 1000 bwM = bandwidth in Mbps * * exitUk = the gateway exit link uplink bandwidth, in Kbps * exitDk = the gateway exit link downlink bandwidth, in Kbps * * 1000 * WexitU 1000 * WexitD Wetx * path_cost_weight = ------------- + ------------- + ---- * path_cost * exitUk exitDk Detx * * * Analysis of the required bit width of the result: * * exitUk = [1, 320,000,000] = 29 bits * exitDk = [1, 320,000,000] = 29 bits * WexitU = [1, 255] = 8 bits * WexitD = [1, 255] = 8 bits * Wetx = [1, 255] = 8 bits * Detx = [1, 255] = 8 bits * path_cost = [1, 4,294,967,295] = 32 bits * * 1000 * 255 1000 * 255 255 * path_cost_weight(max) = ---------- + ---------- + --- * 4,294,967,295 * 1 1 1 * * path_cost_weight(max) = 0x3E418 + 0x3E418 + 0xFEFFFFFF01 * path_cost_weight(max) = 0xFF0007C731 * * Because we can multiply 0xFF0007C731 by 2^24 without overflowing a * 64 bits number, we do this to increase accuracy. */ costU = (((uint64_t) (1000 * WexitU)) << 24) / exitUk; costD = (((uint64_t) (1000 * WexitD)) << 24) / exitDk; costE = (((uint64_t) (Wetx * path_cost)) << 24) / Detx; return (costU + costD + costE); } /** * Look through the gateway list and select the best gateway * depending on the distance to this router */ static void gw_default_choose_gateway(void) { uint64_t cost_ipv4_threshold = UINT64_MAX; uint64_t cost_ipv6_threshold = UINT64_MAX; bool cost_ipv4_threshold_valid = false; bool cost_ipv6_threshold_valid = false; struct gateway_entry *chosen_gw_ipv4 = NULL; struct gateway_entry *chosen_gw_ipv6 = NULL; uint64_t chosen_gw_ipv4_costs = UINT64_MAX; uint64_t chosen_gw_ipv6_costs = UINT64_MAX; struct gateway_entry *gw; bool dual = false; if (olsr_cnf->smart_gw_thresh) { /* determine the path cost thresholds */ uint64_t cost = gw_default_getcosts(olsr_get_inet_gateway(false)); if (cost != UINT64_MAX) { cost_ipv4_threshold = gw_default_calc_threshold(cost); cost_ipv4_threshold_valid = true; } cost = gw_default_getcosts(olsr_get_inet_gateway(true)); if (cost != UINT64_MAX) { cost_ipv6_threshold = gw_default_calc_threshold(cost); cost_ipv6_threshold_valid = true; } } OLSR_FOR_ALL_GATEWAY_ENTRIES(gw) { uint64_t gw_cost = gw_default_getcosts(gw); if (gw_cost == UINT64_MAX) { /* never select a node with infinite costs */ continue; } if (gw_def_choose_new_ipv4_gw) { bool gw_eligible_v4 = gw->ipv4 /* && (olsr_cnf->ip_version == AF_INET || olsr_cnf->use_niit) *//* contained in gw_def_choose_new_ipv4_gw */ && (olsr_cnf->smart_gw_allow_nat || !gw->ipv4nat); if (gw_eligible_v4 && gw_cost < chosen_gw_ipv4_costs && (!cost_ipv4_threshold_valid || (gw_cost < cost_ipv4_threshold))) { chosen_gw_ipv4 = gw; chosen_gw_ipv4_costs = gw_cost; } } if (gw_def_choose_new_ipv6_gw) { bool gw_eligible_v6 = gw->ipv6 /* && olsr_cnf->ip_version == AF_INET6 *//* contained in gw_def_choose_new_ipv6_gw */; if (gw_eligible_v6 && gw_cost < chosen_gw_ipv6_costs && (!cost_ipv6_threshold_valid || (gw_cost < cost_ipv6_threshold))) { chosen_gw_ipv6 = gw; chosen_gw_ipv6_costs = gw_cost; } } } OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw) /* determine if we should keep looking for IPv4 and/or IPv6 gateways */ gw_def_choose_new_ipv4_gw = gw_def_choose_new_ipv4_gw && (chosen_gw_ipv4 == NULL); gw_def_choose_new_ipv6_gw = gw_def_choose_new_ipv6_gw && (chosen_gw_ipv6 == NULL); /* determine if we are dealing with a dual stack gateway */ dual = chosen_gw_ipv4 && (chosen_gw_ipv4 == chosen_gw_ipv6); if (chosen_gw_ipv4) { /* we are dealing with an IPv4 or dual stack gateway */ olsr_set_inet_gateway(&chosen_gw_ipv4->originator, chosen_gw_ipv4_costs, true, dual); } if (chosen_gw_ipv6 && !dual) { /* we are dealing with an IPv6-only gateway */ olsr_set_inet_gateway(&chosen_gw_ipv6->originator, chosen_gw_ipv6_costs, false, true); } if ((olsr_cnf->smart_gw_thresh == 0) && !gw_def_choose_new_ipv4_gw && !gw_def_choose_new_ipv6_gw) { /* stop looking for a better gateway */ olsr_stop_timer(gw_def_timer); gw_def_timer = NULL; } } /** * Timer callback for lazy gateway selection * * @param unused unused */ static void gw_default_timer(void *unused __attribute__ ((unused))) { /* accept a 10% increase/decrease in the number of gateway nodes without triggering a stablecount reset */ unsigned int tree100percent = tc_tree.count * 10; uint32_t nodecount090percent = gw_def_nodecount * 9; uint32_t nodecount110percent = gw_def_nodecount * 11; if ((tree100percent >= nodecount090percent) && (tree100percent <= nodecount110percent)) { gw_def_nodecount = tc_tree.count; } if (tc_tree.count == gw_def_nodecount) { /* the number of gateway nodes is 'stable' */ gw_def_stablecount++; } else { /* there was a significant change in the number of gateway nodes */ gw_def_nodecount = tc_tree.count; gw_def_stablecount = 0; } if (gw_def_stablecount >= olsr_cnf->smart_gw_stablecount) { /* the number of gateway nodes is stable enough, so we should select a new gateway now */ gw_default_choose_gateway(); } } /** * Lookup a new gateway * * @param ipv4 lookup new v4 gateway * @param ipv6 lookup new v6 gateway */ static void gw_default_lookup_gateway(bool ipv4, bool ipv6) { if (ipv4) { /* get a new IPv4 gateway if we use OLSRv4 or NIIT */ gw_def_choose_new_ipv4_gw = (olsr_cnf->ip_version == AF_INET) || olsr_cnf->use_niit; } if (ipv6) { /* get a new IPv6 gateway if we use OLSRv6 */ gw_def_choose_new_ipv6_gw = olsr_cnf->ip_version == AF_INET6; } if (gw_def_choose_new_ipv4_gw || gw_def_choose_new_ipv6_gw) { gw_default_choose_gateway(); } } /* * Exported functions */ /* * Handler functions */ /** * initialization of default gateway handler */ static void gw_default_init(void) { /* initialize values */ gw_def_nodecount = 0; gw_def_stablecount = 0; gw_def_choose_new_ipv4_gw = true; gw_def_choose_new_ipv6_gw = true; gw_def_timer = NULL; } /** * Cleanup default gateway handler */ static void gw_default_cleanup(void) { } /** * Handle gateway startup */ static void gw_default_startup_handler(void) { /* reset node count */ gw_def_nodecount = tc_tree.count; gw_def_stablecount = 0; /* get a new IPv4 gateway if we use OLSRv4 or NIIT */ gw_def_choose_new_ipv4_gw = (olsr_cnf->ip_version == AF_INET) || olsr_cnf->use_niit; /* get a new IPv6 gateway if we use OLSRv6 */ gw_def_choose_new_ipv6_gw = olsr_cnf->ip_version == AF_INET6; /* keep in mind we might be a gateway ourself */ gw_def_choose_new_ipv4_gw = gw_def_choose_new_ipv4_gw && !olsr_cnf->has_ipv4_gateway; gw_def_choose_new_ipv6_gw = gw_def_choose_new_ipv6_gw && !olsr_cnf->has_ipv6_gateway; /* (re)start gateway lazy selection timer */ olsr_set_timer(&gw_def_timer, olsr_cnf->smart_gw_period, 0, true, &gw_default_timer, NULL, 0); } /** * Called when the costs of a gateway must be determined. * * @param gw the gateway * @return the costs, or UINT64_MAX in case the gateway is null or has inifinite costs */ static uint64_t gw_default_getcosts(struct gateway_entry *gw) { struct tc_entry* tc; if (!gw) { return UINT64_MAX; } tc = olsr_lookup_tc_entry(&gw->originator); if (!tc || (tc->path_cost == ROUTE_COST_BROKEN) || (!gw->uplink || !gw->downlink)) { /* gateways should not exist without tc entry */ /* do not consider nodes with an infinite ETX */ /* do not consider nodes without bandwidth or with a uni-directional link */ return UINT64_MAX; } /* determine the path cost */ return gw_default_weigh_costs(tc->path_cost, gw->uplink, gw->downlink); } /** * Choose a new gateway * * @param ipv4 lookup new v4 gateway * @param ipv6 lookup new v6 gateway */ static void gw_default_choosegw_handler(bool ipv4, bool ipv6) { gw_default_lookup_gateway(ipv4, ipv6); if (gw_def_choose_new_ipv4_gw || gw_def_choose_new_ipv6_gw) { gw_default_startup_handler(); } } /** * Update a gateway entry * * @param gw the gateway entry */ static void gw_default_update_handler(struct gateway_entry *gw) { if (olsr_cnf->smart_gw_thresh == 0) { /* classical behaviour: stick with the chosen gateway unless it changes */ bool v4changed = gw && (gw == olsr_get_inet_gateway(false)) && (!gw->ipv4 || (gw->ipv4nat && !olsr_cnf->smart_gw_allow_nat)); bool v6changed = gw && (gw == olsr_get_inet_gateway(true)) && !gw->ipv6; if (v4changed || v6changed) { gw_default_lookup_gateway(v4changed, v6changed); } } else { /* new behaviour: always pick a new gateway */ gw_default_lookup_gateway(true, true); } } /** * Remove a gateway entry * * @param gw the gateway entry */ static void gw_default_delete_handler(struct gateway_entry *gw) { bool isv4 = gw && (gw == olsr_get_inet_gateway(false)); bool isv6 = gw && (gw == olsr_get_inet_gateway(true)); if (isv4 || isv6) { gw_default_lookup_gateway(isv4, isv6); } } #endif /* __linux__ */ olsrd-0.6.6.2/src/gateway_default_handler.h000066400000000000000000000004421234304727700206210ustar00rootroot00000000000000/* * gateway_default_handler.h * * Created on: Jan 29, 2010 * Author: rogge */ #ifndef GATEWAY_DEFAULT_HANDLER_H_ #define GATEWAY_DEFAULT_HANDLER_H_ #ifdef __linux__ extern struct olsr_gw_handler gw_def_handler; #endif /* __linux__ */ #endif /* GATEWAY_DEFAULT_HANDLER_H_ */ olsrd-0.6.6.2/src/gateway_list.c000066400000000000000000000122711234304727700164510ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * IPv4 performance optimization (c) 2006, sven-ola(gmx.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef __linux__ #include "gateway_list.h" #include "gateway.h" #include "common/list.h" #include #include #include /* * Exported functions */ /** * Initialization * * @param list a pointer to the list * @param count the maximum number of entries to be kept in the list. Must be * larger than zero */ void olsr_gw_list_init(struct gw_list * list, uint8_t count) { assert(list); assert(count > 0); list_head_init(&list->head); list->count_max = count; list->count = 0; } /** * Cleanup * * @param list a pointer to the list */ void olsr_gw_list_cleanup(struct gw_list * list __attribute__((unused))) { /* nothing to do */ } /** * Find an entry on the list * * @param list a pointer to the list * @param entry a pointer to the entry to find * @return a pointer to the entry, or NULL when not found */ struct gw_container_entry * olsr_gw_list_find(struct gw_list * list, struct gateway_entry * entry) { struct gw_container_entry * gw; assert(list); assert(entry); OLSR_FOR_ALL_GWS(&list->head, gw) { if (gw && gw->gw && (gw->gw == entry)) { return gw; } } OLSR_FOR_ALL_GWS_END(gw); return NULL; } /** * Add an entry to the list. * * The list is ordered on costs with the lowest costs (best) first and the * highest costs (worst) last. In case of equal costs, the entry is added * _before_ the one(s) that is(are) already in the list. * * @param list a pointer to the list * @param entry a pointer to the entry * @return a pointer to the added entry */ struct gw_container_entry * olsr_gw_list_add(struct gw_list * list, struct gw_container_entry * entry) { struct gw_container_entry * gw; assert(list); assert(entry); assert(!olsr_gw_list_full(list)); list_node_init(&entry->list_node); OLSR_FOR_ALL_GWS(&list->head, gw) { if (gw && (entry->path_cost <= gw->path_cost)) { /* add before the iterated list entry: the gateway to insert has lower * costs or has equal costs but is newer (since we insert it) */ list_add_before(&gw->list_node, &entry->list_node); list->count++; return entry; } } OLSR_FOR_ALL_GWS_END(gw); /* add at the end */ list_add_after(list->head.prev, &entry->list_node); list->count++; return entry; } /** * Update an entry on the list. * * @param list a pointer to the list * @param entry a pointer to the entry * @param path_cost the costs of the entry * @return a pointer to the updated entry */ struct gw_container_entry * olsr_gw_list_update(struct gw_list * list, struct gw_container_entry * entry, uint64_t path_cost) { assert(list); assert(entry); assert(!olsr_gw_list_empty(list)); if (entry->path_cost == path_cost) { return entry; } /* don't touch gw */ /* don't touch tunnel */ entry->path_cost = path_cost; /* don't touch list_node */ list_remove(&entry->list_node); list->count--; return olsr_gw_list_add(list, entry); } /** * Remove a gateway from the list (but do not free it's memory) * * @param list a pointer to the list * @param entry a pointer to the gateway * @return a pointer to the removed entry */ struct gw_container_entry * olsr_gw_list_remove(struct gw_list * list, struct gw_container_entry * entry) { assert(list); assert(entry); assert(!olsr_gw_list_empty(list)); list_remove(&entry->list_node); list->count--; return entry; } #endif /* __linux__ */ olsrd-0.6.6.2/src/gateway_list.h000066400000000000000000000122711234304727700164560ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * IPv4 performance optimization (c) 2006, sven-ola(gmx.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _GW_LIST_H #define _GW_LIST_H #ifdef __linux__ #include "gateway.h" #include "common/list.h" #include "kernel_tunnel.h" #include #include #include /** Holds the list head and list administration */ struct gw_list { struct list_node head; /**< The (ordered) list of entries */ uint8_t count_max; /**< The maximum number of entries in the list */ uint8_t count; /**< The number of entries in the list */ }; /** A container for a gateway and its tunnel */ struct gw_container_entry { struct gateway_entry * gw; /**< the gateway entry */ struct olsr_iptunnel_entry * tunnel; /**< the gateway tunnel */ uint64_t path_cost; /**< the gateway path costs */ struct list_node list_node; /**< the list node */ }; /** Cast from list_node to gw_container_entry */ LISTNODE2STRUCT(olsr_gw_list_node2entry, struct gw_container_entry, list_node); /** Deletion safe macro for gateway list traversal (do not delete the previous or next node, current node is ok) */ #define OLSR_FOR_ALL_GWS(head, gw) {\ struct list_node * _list_node; \ struct list_node * _next_list_node; \ for (_list_node = (head)->next; _list_node != (head); _list_node = _next_list_node) { \ _next_list_node = _list_node->next; \ gw = olsr_gw_list_node2entry(_list_node); #define OLSR_FOR_ALL_GWS_END(gw) }} /** * @param list a pointer to the list * @return true when multiple gateways mode is enabled */ static inline bool olsr_gw_list_isModeMulti(struct gw_list * list) { assert(list); return (list->count_max > 1); } void olsr_gw_list_init(struct gw_list * list, uint8_t count); void olsr_gw_list_cleanup(struct gw_list * list); /** * @param list a pointer to the list * @return true if the list is empty */ static inline bool olsr_gw_list_empty(struct gw_list * list) { assert(list); return (list->count == 0); } /** * @param list a pointer to the list * @return true if the list is full */ static inline bool olsr_gw_list_full(struct gw_list * list) { assert(list); return (list->count >= list->count_max); } /** * Get the best entry that is on the list * * @param list a pointer to the list * @return a pointer to the best entry, or NULL when the list is empty */ static inline struct gw_container_entry * olsr_gw_list_get_best_entry(struct gw_list * list) { assert(list); if (olsr_gw_list_empty(list)) { return NULL; } /* get the best (first) entry of the list */ return olsr_gw_list_node2entry(list->head.next); } /** * Get the worst entry that is on the list * * @param list a pointer to the list * @return a pointer to the worst entry */ static inline struct gw_container_entry * olsr_gw_list_get_worst_entry(struct gw_list * list) { assert(list); if (olsr_gw_list_empty(list)) { return NULL; } /* get the worst (last) entry of the list */ return olsr_gw_list_node2entry(list->head.prev); } struct gw_container_entry * olsr_gw_list_find(struct gw_list * list, struct gateway_entry * entry); struct gw_container_entry * olsr_gw_list_add(struct gw_list * list, struct gw_container_entry * entry); struct gw_container_entry * olsr_gw_list_update(struct gw_list * list, struct gw_container_entry * entry, uint64_t gw_path_cost); struct gw_container_entry * olsr_gw_list_remove(struct gw_list * list, struct gw_container_entry * entry); #endif /* __linux__ */ #endif /* _GW_LIST_H */ olsrd-0.6.6.2/src/generate_msg.c000066400000000000000000000066771234304727700164320ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "generate_msg.h" #include "defs.h" #include "olsr.h" #include "build_msg.h" #include "packet.h" /* * Infomation repositiries */ #include "hna_set.h" #include "mid_set.h" #include "tc_set.h" #include "mpr_selector_set.h" #include "duplicate_set.h" #include "neighbor_table.h" #include "link_set.h" #include "two_hop_neighbor_table.h" #include "net_olsr.h" static char pulsedata[] = { '\\', '|', '/', '-' }; #define PULSE_MAX 4 static uint8_t pulse_state = 0; void generate_hello(void *p) { struct hello_message hellopacket; struct interface *ifn = (struct interface *)p; olsr_build_hello_packet(&hellopacket, ifn); if (queue_hello(&hellopacket, ifn)) net_output(ifn); olsr_free_hello_packet(&hellopacket); } void generate_tc(void *p) { struct tc_message tcpacket; struct interface *ifn = (struct interface *)p; olsr_build_tc_packet(&tcpacket); if (queue_tc(&tcpacket, ifn) && TIMED_OUT(ifn->fwdtimer)) { set_buffer_timer(ifn); } olsr_free_tc_packet(&tcpacket); } void generate_mid(void *p) { struct interface *ifn = (struct interface *)p; if (queue_mid(ifn) && TIMED_OUT(ifn->fwdtimer)) { set_buffer_timer(ifn); } } void generate_hna(void *p) { struct interface *ifn = (struct interface *)p; if (queue_hna(ifn) && TIMED_OUT(ifn->fwdtimer)) { set_buffer_timer(ifn); } } void generate_stdout_pulse(void *foo __attribute__ ((unused))) { if (olsr_cnf->debug_level == 0) return; pulse_state = pulse_state == 3 ? 0 : pulse_state + 1; printf("%c\r", pulsedata[pulse_state]); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/generate_msg.h000066400000000000000000000043321234304727700164210ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_GEN_MSG #define _OLSR_GEN_MSG #include "interfaces.h" #define STDOUT_PULSE_INT 600 /* msec */ /* Functions */ void generate_hello(void *); void generate_mid(void *); void generate_hna(void *); void generate_tc(void *); void generate_stdout_pulse(void *); #endif /* _OLSR_GEN_MSG */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/hashing.c000066400000000000000000000114131234304727700153730ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "olsr_protocol.h" #include "hashing.h" #include "defs.h" /* * Taken from lookup2.c by Bob Jenkins. (http://burtleburtle.net/bob/c/lookup2.c). * -------------------------------------------------------------------- * lookup2.c, by Bob Jenkins, December 1996, Public Domain. * You can use this free for any purpose. It has no warranty. * -------------------------------------------------------------------- */ #define __jhash_mix(a, b, c) \ { \ a -= b; a -= c; a ^= (c>>13); \ b -= c; b -= a; b ^= (a<<8); \ c -= a; c -= b; c ^= (b>>13); \ a -= b; a -= c; a ^= (c>>12); \ b -= c; b -= a; b ^= (a<<16); \ c -= a; c -= b; c ^= (b>>5); \ a -= b; a -= c; a ^= (c>>3); \ b -= c; b -= a; b ^= (a<<10); \ c -= a; c -= b; c ^= (b>>15); \ } static uint32_t jenkins_hash(const uint8_t * k, uint32_t length) { /* k: the key * length: length of the key * initval: the previous hash, or an arbitrary value */ uint32_t a, b, c, len; /* Set up the internal state */ len = length; a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */ c = 0; /* the previous hash value */ /* handle most of the key */ while (len >= 12) { a += (k[0] + ((uint32_t) k[1] << 8) + ((uint32_t) k[2] << 16) + ((uint32_t) k[3] << 24)); b += (k[4] + ((uint32_t) k[5] << 8) + ((uint32_t) k[6] << 16) + ((uint32_t) k[7] << 24)); c += (k[8] + ((uint32_t) k[9] << 8) + ((uint32_t) k[10] << 16) + ((uint32_t) k[11] << 24)); __jhash_mix(a, b, c); k += 12; len -= 12; } c += length; switch (len) { case 11: c += ((uint32_t) k[10] << 24); /* no break */ case 10: c += ((uint32_t) k[9] << 16); /* no break */ case 9: c += ((uint32_t) k[8] << 8); /* the first byte of c is reserved for the length */ /* no break */ case 8: b += ((uint32_t) k[7] << 24); /* no break */ case 7: b += ((uint32_t) k[6] << 16); /* no break */ case 6: b += ((uint32_t) k[5] << 8); /* no break */ case 5: b += k[4]; /* no break */ case 4: a += ((uint32_t) k[3] << 24); /* no break */ case 3: a += ((uint32_t) k[2] << 16); /* no break */ case 2: a += ((uint32_t) k[1] << 8); /* no break */ case 1: a += k[0]; break; default: break; } __jhash_mix(a, b, c); return c; } /** * Hashing function. Creates a key based on an IP address. * @param address the address to hash * @return the hash(a value in the (0 to HASHMASK-1) range) */ uint32_t olsr_ip_hashing(const union olsr_ip_addr * address) { uint32_t hash; switch (olsr_cnf->ip_version) { case AF_INET: hash = jenkins_hash((const uint8_t *)&address->v4, sizeof(uint32_t)); break; case AF_INET6: hash = jenkins_hash((const uint8_t *)&address->v6, sizeof(struct in6_addr)); break; default: hash = 0; break; } return hash & HASHMASK; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/hashing.h000066400000000000000000000041641234304727700154050ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_HASHING #define _OLSR_HASHING #define HASHSIZE 128 #define HASHMASK (HASHSIZE - 1) #include "olsr_types.h" uint32_t olsr_ip_hashing(const union olsr_ip_addr *); #endif /* _OLSR_HASHING */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/hna_set.c000066400000000000000000000325701234304727700154020ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "ipcalc.h" #include "defs.h" #include "olsr.h" #include "scheduler.h" #include "net_olsr.h" #include "tc_set.h" #include "parser.h" #include "gateway.h" #include "duplicate_handler.h" struct hna_entry hna_set[HASHSIZE]; struct olsr_cookie_info *hna_net_timer_cookie = NULL; struct olsr_cookie_info *hna_entry_mem_cookie = NULL; struct olsr_cookie_info *hna_net_mem_cookie = NULL; static bool olsr_delete_hna_net_entry(struct hna_net *net_to_delete); /** * Initialize the HNA set */ int olsr_init_hna_set(void) { int idx; for (idx = 0; idx < HASHSIZE; idx++) { hna_set[idx].next = &hna_set[idx]; hna_set[idx].prev = &hna_set[idx]; } hna_net_timer_cookie = olsr_alloc_cookie("HNA Network", OLSR_COOKIE_TYPE_TIMER); hna_net_mem_cookie = olsr_alloc_cookie("hna_net", OLSR_COOKIE_TYPE_MEMORY); olsr_cookie_set_memory_size(hna_net_mem_cookie, sizeof(struct hna_net)); hna_entry_mem_cookie = olsr_alloc_cookie("hna_entry", OLSR_COOKIE_TYPE_MEMORY); olsr_cookie_set_memory_size(hna_entry_mem_cookie, sizeof(struct hna_entry)); return 1; } void olsr_cleanup_hna(union olsr_ip_addr *orig) { struct hna_entry *hna; OLSR_FOR_ALL_HNA_ENTRIES(hna) { if (hna->networks.next != &hna->networks && ipequal(&hna->A_gateway_addr, orig)) { while (!olsr_delete_hna_net_entry(hna->networks.next)); } } OLSR_FOR_ALL_HNA_ENTRIES_END(hna) } /** * Lookup a network entry in a networkentry list. * * @param nets the network list to look in * @param net the network to look for * @param prefixlen the prefix length * * @return the localized entry or NULL of not found */ struct hna_net * olsr_lookup_hna_net(const struct hna_net *nets, const union olsr_ip_addr *net, uint8_t prefixlen) { struct hna_net *tmp; /* Loop trough entrys */ for (tmp = nets->next; tmp != nets; tmp = tmp->next) { if (tmp->hna_prefix.prefix_len == prefixlen && ipequal(&tmp->hna_prefix.prefix, net)) { return tmp; } } /* Not found */ return NULL; } /** * Lookup a gateway entry * * @param gw the address of the gateway * @return the located entry or NULL if not found */ struct hna_entry * olsr_lookup_hna_gw(const union olsr_ip_addr *gw) { struct hna_entry *tmp_hna; uint32_t hash = olsr_ip_hashing(gw); /* Check for registered entry */ for (tmp_hna = hna_set[hash].next; tmp_hna != &hna_set[hash]; tmp_hna = tmp_hna->next) { if (ipequal(&tmp_hna->A_gateway_addr, gw)) { return tmp_hna; } } /* Not found */ return NULL; } /** *Add a gatewayentry to the HNA set * *@param addr the address of the gateway * *@return the created entry */ struct hna_entry * olsr_add_hna_entry(const union olsr_ip_addr *addr) { struct hna_entry *new_entry; uint32_t hash; new_entry = olsr_cookie_malloc(hna_entry_mem_cookie); /* Fill struct */ new_entry->A_gateway_addr = *addr; /* Link nets */ new_entry->networks.next = &new_entry->networks; new_entry->networks.prev = &new_entry->networks; /* queue */ hash = olsr_ip_hashing(addr); hna_set[hash].next->prev = new_entry; new_entry->next = hna_set[hash].next; hna_set[hash].next = new_entry; new_entry->prev = &hna_set[hash]; return new_entry; } /** * Adds a network entry to a HNA gateway. * * @param hna_gw the gateway entry to add the network to * @param net the network address to add * @param prefixlen the prefix length * * @return the newly created entry */ struct hna_net * olsr_add_hna_net(struct hna_entry *hna_gw, const union olsr_ip_addr *net, uint8_t prefixlen) { /* Add the net */ struct hna_net *new_net = olsr_cookie_malloc(hna_net_mem_cookie); /* Fill struct */ memset(new_net, 0, sizeof(struct hna_net)); new_net->hna_prefix.prefix = *net; new_net->hna_prefix.prefix_len= prefixlen; /* Set backpointer */ new_net->hna_gw = hna_gw; /* Queue */ hna_gw->networks.next->prev = new_net; new_net->next = hna_gw->networks.next; hna_gw->networks.next = new_net; new_net->prev = &hna_gw->networks; return new_net; } static bool olsr_delete_hna_net_entry(struct hna_net *net_to_delete) { #ifdef DEBUG struct ipaddr_str buf1, buf2; #endif /* DEBUG */ struct hna_entry *hna_gw; bool removed_entry = false; #ifdef __linux__ if (is_prefix_inetgw(&net_to_delete->hna_prefix)) { /* modify smart gateway entry if necessary */ olsr_delete_gateway_entry(&net_to_delete->hna_gw->A_gateway_addr, net_to_delete->hna_prefix.prefix_len, false); } #endif /* __linux__ */ olsr_stop_timer(net_to_delete->hna_net_timer); net_to_delete->hna_net_timer = NULL; /* be pedandic */ hna_gw = net_to_delete->hna_gw; #ifdef DEBUG OLSR_PRINTF(5, "HNA: timeout %s via hna-gw %s\n", olsr_ip_prefix_to_string(&net_to_delete->hna_prefix), olsr_ip_to_string(&buf2, &hna_gw->A_gateway_addr)); #endif /* DEBUG */ /* * Delete the rt_path for the entry. */ olsr_delete_routing_table(&net_to_delete->hna_prefix.prefix, net_to_delete->hna_prefix.prefix_len, &hna_gw->A_gateway_addr); DEQUEUE_ELEM(net_to_delete); /* Delete hna_gw if empty */ if (hna_gw->networks.next == &hna_gw->networks) { DEQUEUE_ELEM(hna_gw); olsr_cookie_free(hna_entry_mem_cookie, hna_gw); removed_entry = true; } olsr_cookie_free(hna_net_mem_cookie, net_to_delete); return removed_entry; } /** * Callback for the hna_net timer. */ static void olsr_expire_hna_net_entry(void *context) { olsr_delete_hna_net_entry(context); } /** * Update a HNA entry. If it does not exist it * is created. * This is the only function that should be called * from outside concerning creation of HNA entries. * *@param gw address of the gateway *@param net address of the network *@param prefixlen the prefix length *@param vtime the validitytime of the entry */ void olsr_update_hna_entry(const union olsr_ip_addr *gw, const union olsr_ip_addr *net, uint8_t prefixlen, olsr_reltime vtime) { struct hna_entry *gw_entry; struct hna_net *net_entry; gw_entry = olsr_lookup_hna_gw(gw); if (!gw_entry) { /* Need to add the entry */ gw_entry = olsr_add_hna_entry(gw); } net_entry = olsr_lookup_hna_net(&gw_entry->networks, net, prefixlen); if (net_entry == NULL) { /* Need to add the net */ net_entry = olsr_add_hna_net(gw_entry, net, prefixlen); changes_hna = true; } /* * Add the rt_path for the entry. */ olsr_insert_routing_table(&net_entry->hna_prefix.prefix, net_entry->hna_prefix.prefix_len, &gw_entry->A_gateway_addr, OLSR_RT_ORIGIN_HNA); /* * Start, or refresh the timer, whatever is appropriate. */ olsr_set_timer(&net_entry->hna_net_timer, vtime, OLSR_HNA_NET_JITTER, OLSR_TIMER_ONESHOT, &olsr_expire_hna_net_entry, net_entry, hna_net_timer_cookie); } /** * Print all HNA entries. * *@return nada */ #ifndef NODEBUG void olsr_print_hna_set(void) { /* The whole function doesn't do anything else. */ int idx; struct tm * nowtm; struct timeval now; const int ipwidth = olsr_cnf->ip_version == AF_INET ? (INET_ADDRSTRLEN - 1) : (INET6_ADDRSTRLEN - 1); const int ipwidthprefix = olsr_cnf->ip_version == AF_INET ? (INET_ADDRSTRLEN + 1 + INET_ADDRSTRLEN - 1) : (INET6_ADDRSTRLEN + 1 + 3 - 1); (void)gettimeofday(&now, NULL); nowtm = localtime((time_t *)&now.tv_sec); OLSR_PRINTF(1, "\n--- %02d:%02d:%02d.%02d ------------------------------------------------- HNA SET\n\n", nowtm->tm_hour, nowtm->tm_min, nowtm->tm_sec, (int)now.tv_usec / 10000); if (olsr_cnf->ip_version == AF_INET) OLSR_PRINTF(1, "IP net netmask GW IP\n"); else OLSR_PRINTF(1, "IP net/prefixlen GW IP\n"); for (idx = 0; idx < HASHSIZE; idx++) { struct hna_entry *tmp_hna = hna_set[idx].next; /* Check all entrys */ while (tmp_hna != &hna_set[idx]) { /* Check all networks */ struct hna_net *tmp_net = tmp_hna->networks.next; while (tmp_net != &tmp_hna->networks) { struct ipaddr_str buf; OLSR_PRINTF(1, "%-*s ", ipwidthprefix, olsr_ip_prefix_to_string(&tmp_net->hna_prefix)); OLSR_PRINTF(1, "%-*s\n", ipwidth, olsr_ip_to_string(&buf, &tmp_hna->A_gateway_addr)); tmp_net = tmp_net->next; } tmp_hna = tmp_hna->next; } } } #endif /* NODEBUG */ /** *Process incoming HNA message. *Forwards the message if that is to be done. * *@param m the incoming OLSR message *@param in_if the incoming interface *@param from_addr the originator address *the OLSR message. *@return 1 on success */ bool olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((unused)), union olsr_ip_addr *from_addr) { uint8_t olsr_msgtype; olsr_reltime vtime; uint16_t olsr_msgsize; union olsr_ip_addr originator; uint8_t hop_count; uint16_t msg_seq_number; int hnasize; const uint8_t *curr, *curr_end; struct ipaddr_str buf; #ifdef DEBUG OLSR_PRINTF(5, "Processing HNA\n"); #endif /* DEBUG */ /* Check if everyting is ok */ if (!m) { return false; } curr = (const uint8_t *)m; /* olsr_msgtype */ pkt_get_u8(&curr, &olsr_msgtype); if (olsr_msgtype != HNA_MESSAGE) { OLSR_PRINTF(1, "not a HNA message!\n"); return false; } /* Get vtime */ pkt_get_reltime(&curr, &vtime); /* olsr_msgsize */ pkt_get_u16(&curr, &olsr_msgsize); hnasize = olsr_msgsize - 8 - olsr_cnf->ipsize; curr_end = (const uint8_t *)m + olsr_msgsize; /* validate originator */ pkt_get_ipaddress(&curr, &originator); /*printf("HNA from %s\n\n", olsr_ip_to_string(&buf, &originator)); */ /* ttl */ pkt_ignore_u8(&curr); /* hopcnt */ pkt_get_u8(&curr, &hop_count); /* seqno */ pkt_get_u16(&curr, &msg_seq_number); if ((hnasize % (2 * olsr_cnf->ipsize)) != 0) { OLSR_PRINTF(1, "Illegal HNA message from %s with size %d!\n", olsr_ip_to_string(&buf, &originator), olsr_msgsize); return false; } /* * If the sender interface (NB: not originator) of this message * is not in the symmetric 1-hop neighborhood of this node, the * message MUST be discarded. */ if (check_neighbor_link(from_addr) != SYM_LINK) { OLSR_PRINTF(2, "Received HNA from NON SYM neighbor %s\n", olsr_ip_to_string(&buf, from_addr)); return false; } while (curr < curr_end) { struct olsr_ip_prefix prefix; union olsr_ip_addr mask; struct ip_prefix_list *entry; struct interface *ifs; bool stop = false; pkt_get_ipaddress(&curr, &prefix.prefix); pkt_get_ipaddress(&curr, &mask); prefix.prefix_len = olsr_netmask_to_prefix(&mask); #ifdef __linux__ if (olsr_cnf->smart_gw_active && olsr_is_smart_gateway(&prefix, &mask)) { olsr_update_gateway_entry(&originator, &mask, prefix.prefix_len, msg_seq_number); } #endif /* __linux__ */ #ifdef MAXIMUM_GATEWAY_PREFIX_LENGTH if (olsr_cnf->smart_gw_active && prefix.prefix_len > 0 && prefix.prefix_len <= MAXIMUM_GATEWAY_PREFIX_LENGTH) { continue; } #endif /* MAXIMUM_GATEWAY_PREFIX_LENGTH */ #ifndef NO_DUPLICATE_DETECTION_HANDLER for (ifs = ifnet; ifs != NULL; ifs = ifs->int_next) { if (ipequal(&ifs->ip_addr, &prefix.prefix)) { /* ignore your own main IP as an incoming MID */ olsr_handle_hna_collision(&prefix.prefix, &originator); stop = true; break; } } if (stop) { continue; } #endif /* NO_DUPLICATE_DETECTION_HANDLER */ entry = ip_prefix_list_find(olsr_cnf->hna_entries, &prefix.prefix, prefix.prefix_len); if (entry == NULL) { /* only update if it's not from us */ olsr_update_hna_entry(&originator, &prefix.prefix, prefix.prefix_len, vtime); } } /* Forward the message */ return true; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/hna_set.h000066400000000000000000000070561234304727700154100ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_HNA #define _OLSR_HNA #include "hashing.h" #include "olsr_types.h" #include "olsr_protocol.h" #include "mantissa.h" #include /* hna_netmask declared in packet.h */ struct hna_net { struct olsr_ip_prefix hna_prefix; struct timer_entry *hna_net_timer; struct hna_entry *hna_gw; /* backpointer to the owning HNA entry */ struct hna_net *next; struct hna_net *prev; }; #define OLSR_HNA_NET_JITTER 5 /* percent */ struct hna_entry { union olsr_ip_addr A_gateway_addr; struct hna_net networks; struct hna_entry *next; struct hna_entry *prev; }; #define OLSR_FOR_ALL_HNA_ENTRIES(hna) \ { \ int _idx; \ for (_idx = 0; _idx < HASHSIZE; _idx++) { \ struct hna_entry *_next; \ for(hna = hna_set[_idx].next; \ hna != &hna_set[_idx]; \ hna = _next) { \ _next = hna->next; #define OLSR_FOR_ALL_HNA_ENTRIES_END(hna) }}} extern struct hna_entry hna_set[HASHSIZE]; int olsr_init_hna_set(void); void olsr_cleanup_hna(union olsr_ip_addr *orig); struct hna_net *olsr_lookup_hna_net(const struct hna_net *, const union olsr_ip_addr *, uint8_t); struct hna_entry *olsr_lookup_hna_gw(const union olsr_ip_addr *); struct hna_entry *olsr_add_hna_entry(const union olsr_ip_addr *); struct hna_net *olsr_add_hna_net(struct hna_entry *, const union olsr_ip_addr *, uint8_t); void olsr_update_hna_entry(const union olsr_ip_addr *, const union olsr_ip_addr *, uint8_t, olsr_reltime); #ifndef NODEBUG void olsr_print_hna_set(void); #else #define olsr_print_hna_set() do { } while(0) #endif bool olsr_input_hna(union olsr_message *, struct interface *, union olsr_ip_addr *); #endif /* _OLSR_HNA */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/hysteresis.c000066400000000000000000000135611234304727700161620ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include #include #include "olsr_protocol.h" #include "hysteresis.h" #include "defs.h" #include "olsr.h" #include "net_olsr.h" #include "ipcalc.h" #include "scheduler.h" #define hscaling olsr_cnf->hysteresis_param.scaling #define hhigh olsr_cnf->hysteresis_param.thr_high #define hlow olsr_cnf->hysteresis_param.thr_low float olsr_hyst_calc_stability(float old_quality) { return (((1 - hscaling) * old_quality) + hscaling); } float olsr_hyst_calc_instability(float old_quality) { return ((1 - hscaling) * old_quality); } int olsr_process_hysteresis(struct link_entry *entry) { //printf("PROCESSING QUALITY: %f\n", entry->L_link_quality); if (entry->L_link_quality > hhigh) { if (entry->L_link_pending == 1) { struct ipaddr_str buf; OLSR_PRINTF(1, "HYST[%s] link set to NOT pending!\n", olsr_ip_to_string(&buf, &entry->neighbor_iface_addr)); changes_neighborhood = true; } /* Pending = false */ entry->L_link_pending = 0; if (!TIMED_OUT(entry->L_LOST_LINK_time)) changes_neighborhood = true; /* time = now -1 */ entry->L_LOST_LINK_time = now_times - 1; return 1; } if (entry->L_link_quality < hlow) { if (entry->L_link_pending == 0) { struct ipaddr_str buf; OLSR_PRINTF(1, "HYST[%s] link set to pending!\n", olsr_ip_to_string(&buf, &entry->neighbor_iface_addr)); changes_neighborhood = true; } /* Pending = true */ entry->L_link_pending = 1; if (TIMED_OUT(entry->L_LOST_LINK_time)) changes_neighborhood = true; /* Timer = min (L_time, current time + NEIGHB_HOLD_TIME) */ entry->L_LOST_LINK_time = MIN(GET_TIMESTAMP(NEIGHB_HOLD_TIME * MSEC_PER_SEC), entry->link_timer->timer_clock); /* (the link is then considered as lost according to section 8.5 and this may produce a neighbor loss). WTF? */ return -1; } /* *If we get here then: *(HYST_THRESHOLD_LOW <= entry->L_link_quality <= HYST_THRESHOLD_HIGH) */ /* L_link_pending and L_LOST_LINK_time remain unchanged. */ return 0; } /** *Update the hello timeout of a hysteresis link *entry * *@param entry the link entry to update *@param htime the hello interval to use * *@return nada */ void olsr_update_hysteresis_hello(struct link_entry *entry, olsr_reltime htime) { struct ipaddr_str buf; OLSR_PRINTF(3, "HYST[%s]: HELLO update vtime %u ms\n", olsr_ip_to_string(&buf, &entry->neighbor_iface_addr), htime + htime / 2); olsr_set_timer(&entry->link_hello_timer, htime + htime / 2, OLSR_LINK_HELLO_JITTER, OLSR_TIMER_PERIODIC, &olsr_expire_link_hello_timer, entry, 0); return; } void update_hysteresis_incoming(union olsr_ip_addr *remote, struct interface *local, uint16_t seqno) { struct link_entry *lnk = lookup_link_entry(remote, NULL, local); /* Calculate new quality */ if (lnk != NULL) { #ifdef DEBUG struct ipaddr_str buf; #endif /* DEBUG */ lnk->L_link_quality = olsr_hyst_calc_stability(lnk->L_link_quality); #ifdef DEBUG OLSR_PRINTF(3, "HYST[%s]: %f\n", olsr_ip_to_string(&buf, remote), (double)lnk->L_link_quality); #endif /* DEBUG */ /* * see how many packets we have missed and update the link quality * for each missed packet; HELLOs have already been accounted for by * the timeout function and the number of missed HELLOs has already * been added to olsr_seqno there */ if (lnk->olsr_seqno_valid && (unsigned short)(seqno - lnk->olsr_seqno) < 100) while (lnk->olsr_seqno != seqno) { lnk->L_link_quality = olsr_hyst_calc_instability(lnk->L_link_quality); #ifdef DEBUG OLSR_PRINTF(5, "HYST[%s] PACKET LOSS! %f\n", olsr_ip_to_string(&buf, remote), (double)lnk->L_link_quality); #endif /* DEBUG */ if (lnk->L_link_quality < olsr_cnf->hysteresis_param.thr_low) break; lnk->olsr_seqno++; } lnk->olsr_seqno = seqno + 1; lnk->olsr_seqno_valid = true; //printf("Updating seqno to: %d\n", lnk->olsr_seqno); } return; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/hysteresis.h000066400000000000000000000045051234304727700161650ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_HYSTERESIS #define _OLSR_HYSTERESIS #include "link_set.h" #include "mantissa.h" float olsr_hyst_calc_stability(float); int olsr_process_hysteresis(struct link_entry *); float olsr_hyst_calc_instability(float); void olsr_update_hysteresis_hello(struct link_entry *, olsr_reltime); void update_hysteresis_incoming(union olsr_ip_addr *, struct interface *, uint16_t); #endif /* _OLSR_HYSTERESIS */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/ifnet.h000066400000000000000000000046321234304727700150710ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* Network interface configuration interface. * Platform independent - the implementations * reside in OS/ifnet.c(e.g. linux/ifnet.c) */ #ifndef _OLSR_IFNET #define _OLSR_IFNET /* To get ifreq */ #include #include #include #include "olsr_cfg.h" int set_flag(char *, short); void check_interface_updates(void *); int chk_if_changed(struct olsr_if *); int chk_if_up(struct olsr_if *, int); int add_hemu_if(struct olsr_if *); #endif /* _OLSR_IFNET */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/interfaces.c000066400000000000000000000265771234304727700161160ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include #include #include "defs.h" #include "interfaces.h" #include "ifnet.h" #include "scheduler.h" #include "olsr.h" #include "net_olsr.h" #include "ipcalc.h" #include "log.h" #include "parser.h" #ifdef _WIN32 #include #define close(x) closesocket(x) #endif /* _WIN32 */ /* The interface linked-list */ struct interface *ifnet; /* Ifchange functions */ struct ifchgf { void (*function) (int if_index, struct interface *, enum olsr_ifchg_flag); struct ifchgf *next; }; static struct ifchgf *ifchgf_list; /* Some cookies for stats keeping */ struct olsr_cookie_info *interface_poll_timer_cookie = NULL; struct olsr_cookie_info *hello_gen_timer_cookie = NULL; struct olsr_cookie_info *tc_gen_timer_cookie = NULL; struct olsr_cookie_info *mid_gen_timer_cookie = NULL; struct olsr_cookie_info *hna_gen_timer_cookie = NULL; /** *Do initialization of various data needed for *network interface management. *This function also tries to set up the given interfaces. * *@return the number of interfaces configured */ int olsr_init_interfacedb(void) { struct olsr_if *tmp_if; /* Initial values */ ifnet = NULL; /* * Get some cookies for getting stats to ease troubleshooting. */ interface_poll_timer_cookie = olsr_alloc_cookie("Interface Polling", OLSR_COOKIE_TYPE_TIMER); hello_gen_timer_cookie = olsr_alloc_cookie("Hello Generation", OLSR_COOKIE_TYPE_TIMER); tc_gen_timer_cookie = olsr_alloc_cookie("TC Generation", OLSR_COOKIE_TYPE_TIMER); mid_gen_timer_cookie = olsr_alloc_cookie("MID Generation", OLSR_COOKIE_TYPE_TIMER); hna_gen_timer_cookie = olsr_alloc_cookie("HNA Generation", OLSR_COOKIE_TYPE_TIMER); OLSR_PRINTF(1, "\n ---- Interface configuration ---- \n\n"); /* Run trough all interfaces immedeatly */ for (tmp_if = olsr_cnf->interfaces; tmp_if != NULL; tmp_if = tmp_if->next) { if (!tmp_if->host_emul) { if (!olsr_cnf->host_emul) /* XXX: TEMPORARY! */ chk_if_up(tmp_if, 1); } else { add_hemu_if(tmp_if); } } /* Kick a periodic timer for the network interface update function */ olsr_start_timer((unsigned int)olsr_cnf->nic_chgs_pollrate * MSEC_PER_SEC, 5, OLSR_TIMER_PERIODIC, &check_interface_updates, NULL, interface_poll_timer_cookie); return (ifnet == NULL) ? 0 : 1; } void olsr_trigger_ifchange(int if_index, struct interface *ifp, enum olsr_ifchg_flag flag) { struct ifchgf *tmp_ifchgf_list = ifchgf_list; while (tmp_ifchgf_list != NULL) { tmp_ifchgf_list->function(if_index, ifp, flag); tmp_ifchgf_list = tmp_ifchgf_list->next; } } /** *Find the local interface with a given address. * *@param addr the address to check. * *@return the interface struct representing the interface *that matched the address. */ struct interface * if_ifwithaddr(const union olsr_ip_addr *addr) { struct interface *ifp; if (!addr) return NULL; for (ifp = ifnet; ifp; ifp = ifp->int_next) { if (olsr_cnf->ip_version == AF_INET) { /* IPv4 */ //printf("Checking: %s == ", inet_ntoa(((struct sockaddr_in *)&ifp->int_addr)->sin_addr)); //printf("%s\n", olsr_ip_to_string(addr)); if (((struct sockaddr_in *)&ifp->int_addr)->sin_addr.s_addr == addr->v4.s_addr) return ifp; } else { /* IPv6 */ //printf("Checking %s ", olsr_ip_to_string((union olsr_ip_addr *)&ifp->int6_addr.sin6_addr)); //printf("== %s\n", olsr_ip_to_string((union olsr_ip_addr *)&((struct sockaddr_in6 *)addr)->sin6_addr)); if (ip6equal(&ifp->int6_addr.sin6_addr, &addr->v6)) return ifp; } } return NULL; } /** *Find the interface with a given file descriptor/socket. * *@param fd file descriptor/socket of the interface to find. * *@return return the interface struct representing the interface *that matched the number. */ struct interface * if_ifwithsock(int fd) { struct interface *ifp; ifp = ifnet; while (ifp) { if (ifp->olsr_socket == fd || ifp->send_socket == fd) return ifp; ifp = ifp->int_next; } return NULL; } /** *Find the interface with a given label. * *@param if_name the label of the interface to find. * *@return return the interface struct representing the interface *that matched the label. */ struct interface * if_ifwithname(const char *if_name) { struct interface *ifp = ifnet; while (ifp) { /* good ol' strcmp should be sufficcient here */ if (strcmp(ifp->int_name, if_name) == 0) { return ifp; } ifp = ifp->int_next; } return NULL; } /** *Find the olsr_if with a given label. * *@param if_name the label of the interface to find. * *@return return the interface struct representing the interface *that matched the label. */ struct olsr_if * olsrif_ifwithname(const char *if_name) { struct olsr_if *oifp = olsr_cnf->interfaces; while (oifp) { /* good ol' strcmp should be sufficcient here */ if (strcmp(oifp->name, if_name) == 0) { return oifp; } oifp = oifp->next; } return NULL; } /** *Find the interface with a given interface index. * *@param if_index index of the interface to find. * *@return return the interface struct representing the interface *that matched the iif_index. */ struct interface * if_ifwithindex(const int if_index) { struct interface *ifp = ifnet; while (ifp != NULL) { if (ifp->if_index == if_index) { return ifp; } ifp = ifp->int_next; } return NULL; } /** *Get an interface name for a given interface index * *@param if_index index of the interface to find. * *@return "" or interface name. */ const char * if_ifwithindex_name(const int if_index) { const struct interface *const ifp = if_ifwithindex(if_index); return ifp == NULL ? "void" : ifp->int_name; } /** *Create a new interf_name struct using a given *name and insert it into the interface list. * *@param name the name of the interface. *@param hemu non-zero to indicate host emulation mode * *@return the new interf_name struct */ struct olsr_if * olsr_create_olsrif(const char *name, int hemu) { struct olsr_if *interf_n = olsr_cnf->interfaces; size_t name_size; //printf("Adding interface %s\n", name); /* check if the inerfaces already exists */ while (interf_n != NULL) { if (strcmp(interf_n->name, name) == 0) { fprintf(stderr, "Duplicate interfaces defined... not adding %s\n", name); return NULL; } interf_n = interf_n->next; } interf_n = olsr_malloc(sizeof(struct olsr_if), "queue interface"); name_size = strlen(name) + 1; interf_n->name = olsr_malloc(name_size, "queue interface name"); strscpy(interf_n->name, name, name_size); interf_n->cnf = olsr_malloc(sizeof(*interf_n->cnf), "queue cnf"); interf_n->cnfi = olsr_malloc(sizeof(*interf_n->cnfi), "queue cnfi"); memset(interf_n->cnfi, 0xFF, sizeof(*interf_n->cnfi)); interf_n->cnfi->orig_lq_mult_cnt=0; interf_n->host_emul = hemu ? true : false; interf_n->next = olsr_cnf->interfaces; olsr_cnf->interfaces = interf_n; return interf_n; } /** *Add an ifchange function. These functions are called on all (non-initial) *changes in the interface set. * *@param f a callback function * *@return always 1 */ int olsr_add_ifchange_handler(void (*f) (int if_index, struct interface *, enum olsr_ifchg_flag)) { struct ifchgf *new_ifchgf; new_ifchgf = olsr_malloc(sizeof(struct ifchgf), "Add ifchgfunction"); new_ifchgf->next = ifchgf_list; new_ifchgf->function = f; ifchgf_list = new_ifchgf; return 1; } /* * Remove an ifchange function */ int olsr_remove_ifchange_handler(void (*f) (int if_index, struct interface *, enum olsr_ifchg_flag)) { struct ifchgf *tmp_ifchgf, *prev; tmp_ifchgf = ifchgf_list; prev = NULL; while (tmp_ifchgf) { if (tmp_ifchgf->function == f) { /* Remove entry */ if (prev == NULL) { ifchgf_list = tmp_ifchgf->next; free(tmp_ifchgf); } else { prev->next = tmp_ifchgf->next; free(tmp_ifchgf); } return 1; } prev = tmp_ifchgf; tmp_ifchgf = tmp_ifchgf->next; } return 0; } void olsr_remove_interface(struct olsr_if * iface) { struct interface *ifp, *tmp_ifp; ifp = iface->interf; OLSR_PRINTF(1, "Removing interface %s (%d)\n", iface->name, ifp->if_index); olsr_syslog(OLSR_LOG_INFO, "Removing interface %s\n", iface->name); olsr_delete_link_entry_by_ip(&ifp->ip_addr); /* *Call possible ifchange functions registered by plugins */ olsr_trigger_ifchange(ifp->if_index, ifp, IFCHG_IF_REMOVE); /* cleanup routes over this interface */ olsr_delete_interface_routes(ifp->if_index); /* Dequeue */ if (ifp == ifnet) { ifnet = ifp->int_next; } else { tmp_ifp = ifnet; while (tmp_ifp->int_next != ifp) { tmp_ifp = tmp_ifp->int_next; } tmp_ifp->int_next = ifp->int_next; } /* Remove output buffer */ net_remove_buffer(ifp); /* * Deregister functions for periodic message generation */ olsr_stop_timer(ifp->hello_gen_timer); olsr_stop_timer(ifp->tc_gen_timer); olsr_stop_timer(ifp->mid_gen_timer); olsr_stop_timer(ifp->hna_gen_timer); iface->configured = 0; iface->interf = NULL; /* Close olsr socket */ remove_olsr_socket(ifp->olsr_socket, &olsr_input, NULL); close(ifp->olsr_socket); remove_olsr_socket(ifp->send_socket, &olsr_input, NULL); close(ifp->send_socket); /* Free memory */ free(ifp->int_name); free(ifp); if ((ifnet == NULL) && (!olsr_cnf->allow_no_interfaces)) { olsr_syslog(OLSR_LOG_INFO, "No more active interfaces - exiting.\n"); olsr_exit("No more active interfaces - exiting.\n", EXIT_FAILURE); } } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/interfaces.h000066400000000000000000000174711234304727700161140ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_INTERFACE #define _OLSR_INTERFACE #include #ifdef _MSC_VER #include #undef interface #else /* _MSC_VER */ #include #endif /* _MSC_VER */ #include #include "olsr_types.h" #include "mantissa.h" #define IPV6_ADDR_ANY 0x0000U #define IPV6_ADDR_UNICAST 0x0001U #define IPV6_ADDR_MULTICAST 0x0002U #define IPV6_ADDR_ANYCAST 0x0004U #define IPV6_ADDR_LOOPBACK 0x0010U #define IPV6_ADDR_LINKLOCAL 0x0020U #define IPV6_ADDR_SITELOCAL 0x0040U #define IPV6_ADDR_COMPATv4 0x0080U #define IPV6_ADDR_SCOPE_MASK 0x00f0U #define IPV6_ADDR_MAPPED 0x1000U #define IPV6_ADDR_RESERVED 0x2000U #define MAX_IF_METRIC 100 #define WEIGHT_LOWEST 0 /* No weight */ #define WEIGHT_LOW 1 /* Low */ #define WEIGHT_ETHERNET_1GBP 2 /* Ethernet 1Gb+ */ #define WEIGHT_ETHERNET_1GB 4 /* Ethernet 1Gb */ #define WEIGHT_ETHERNET_100MB 8 /* Ethernet 100Mb */ #define WEIGHT_ETHERNET_10MB 16 /* Ethernet 10Mb */ #define WEIGHT_ETHERNET_DEFAULT 32 /* Ethernet unknown rate */ #define WEIGHT_WLAN_HIGH 64 /* >54Mb WLAN */ #define WEIGHT_WLAN_54MB 128 /* 54Mb 802.11g */ #define WEIGHT_WLAN_11MB 256 /* 11Mb 802.11b */ #define WEIGHT_WLAN_LOW 512 /* <11Mb WLAN */ #define WEIGHT_WLAN_DEFAULT 1024 /* WLAN unknown rate */ #define WEIGHT_SERIAL 2048 /* Serial device */ #define WEIGHT_HIGH 4096 /* High */ #define WEIGHT_HIGHEST 8192 /* Really high */ struct if_gen_property { uint32_t owner_id; void *data; struct if_gen_property *next; }; struct vtimes { uint8_t hello; uint8_t tc; uint8_t mid; uint8_t hna; }; /* Output buffer structure. This should actually be in net_olsr.h but we have circular references then. */ struct olsr_netbuf { uint8_t *buff; /* Pointer to the allocated buffer */ int bufsize; /* Size of the buffer */ int maxsize; /* Max bytes of payload that can be added to the buffer */ int pending; /* How much data is currently pending in the buffer */ int reserved; /* Plugins can reserve space in buffers */ }; /** *A struct containing all necessary information about each *interface participating in the OLSRD routing */ struct interface { /* IP version 4 */ struct sockaddr_in int_addr; /* address */ struct sockaddr_in int_netmask; /* netmask */ struct sockaddr_in int_broadaddr; /* broadcast address */ int mode; /* interface mode */ /* IP version 6 */ struct sockaddr_in6 int6_addr; /* Address */ struct sockaddr_in6 int6_multaddr; /* Multicast */ /* IP independent */ union olsr_ip_addr ip_addr; int is_hcif; /* Is this a emulated host-client if? */ int olsr_socket; /* The broadcast socket for this interface */ int send_socket; /* The send socket for this interface */ int int_metric; /* metric of interface */ int int_mtu; /* MTU of interface */ int int_flags; /* see below */ int if_index; /* Kernels index of this interface */ int is_wireless; /* wireless interface or not */ char *int_name; /* from kernel if structure */ uint16_t olsr_seqnum; /* Olsr message seqno */ /* Periodic message generation timers */ struct timer_entry *hello_gen_timer; struct timer_entry *hna_gen_timer; struct timer_entry *mid_gen_timer; struct timer_entry *tc_gen_timer; #ifdef __linux__ /* Struct used to store original redirect/ingress setting */ struct nic_state { /* The original state of icmp redirect */ char redirect; /* The original state of the IP spoof filter */ char spoof; } nic_state; #endif /* __linux__ */ olsr_reltime hello_etime; struct vtimes valtimes; /* Timeout for OLSR forwarding on this if */ uint32_t fwdtimer; /* the buffer to construct the packet data */ struct olsr_netbuf netbuf; /* Generic interface properties */ struct if_gen_property *gen_properties; /* index in TTL array for fish-eye */ int ttl_index; /* Hello's are sent immediately normally, this flag prefers to send TC's */ bool immediate_send_tc; /* backpointer to olsr_if configuration */ struct olsr_if *olsr_if; struct interface *int_next; }; #define OLSR_DEFAULT_MTU 1500 /* Ifchange actions */ enum olsr_ifchg_flag { IFCHG_IF_ADD = 1, IFCHG_IF_REMOVE = 2, IFCHG_IF_UPDATE = 3 }; /* The interface linked-list */ extern struct interface *ifnet; int olsr_init_interfacedb(void); void olsr_delete_interfaces(void); void olsr_trigger_ifchange(int if_index, struct interface *, enum olsr_ifchg_flag); struct interface *if_ifwithsock(int); struct interface *if_ifwithaddr(const union olsr_ip_addr *); struct interface *if_ifwithname(const char *); struct olsr_if *olsrif_ifwithname(const char *if_name); const char *if_ifwithindex_name(const int if_index); struct interface *if_ifwithindex(const int if_index); struct olsr_if *olsr_create_olsrif(const char *name, int hemu); int olsr_add_ifchange_handler(void (*f) (int if_index, struct interface *, enum olsr_ifchg_flag)); int olsr_remove_ifchange_handler(void (*f) (int if_index, struct interface *, enum olsr_ifchg_flag)); void olsr_remove_interface(struct olsr_if *); extern struct olsr_cookie_info *interface_poll_timer_cookie; extern struct olsr_cookie_info *hello_gen_timer_cookie; extern struct olsr_cookie_info *tc_gen_timer_cookie; extern struct olsr_cookie_info *mid_gen_timer_cookie; extern struct olsr_cookie_info *hna_gen_timer_cookie; #endif /* _OLSR_INTERFACE */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/ipc_frontend.c000066400000000000000000000236141234304727700164320ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * *IPC - interprocess communication *for the OLSRD - GUI front-end * */ #include "ipc_frontend.h" #include "link_set.h" #include "olsr.h" #include "log.h" #include "parser.h" #include "scheduler.h" #include "net_olsr.h" #include "ipcalc.h" #ifdef _WIN32 #define close(x) closesocket(x) #define perror(x) WinSockPError(x) void WinSockPError(const char *); #endif /* _WIN32 */ #ifndef MSG_NOSIGNAL #define MSG_NOSIGNAL 0 #endif /* MSG_NOSIGNAL */ static int ipc_sock = -1; static int ipc_conn = -1; static int ipc_active = false; static int ipc_send_all_routes(int fd); static int ipc_send_net_info(int fd); /** *Create the socket to use for IPC to the *GUI front-end * *@return -1 if an error happened, 0 otherwise */ int ipc_init(void) { //int flags; struct sockaddr_in sin; int yes = 1; /* Add parser function */ olsr_parser_add_function(&frontend_msgparser, PROMISCUOUS); /* get an internet domain socket */ if ((ipc_sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("IPC socket"); return -1; } if (setsockopt(ipc_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) { perror("SO_REUSEADDR failed"); close(ipc_sock); return -1; } /* complete the socket structure */ memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(IPC_PORT); /* bind the socket to the port number */ if (bind(ipc_sock, (struct sockaddr *)&sin, sizeof(sin)) == -1) { perror("IPC bind"); OLSR_PRINTF(1, "Will retry in 10 seconds...\n"); sleep(10); if (bind(ipc_sock, (struct sockaddr *)&sin, sizeof(sin)) == -1) { perror("IPC bind"); close(ipc_sock); return -1; } OLSR_PRINTF(1, "OK\n"); } /* show that we are willing to listen */ if (listen(ipc_sock, olsr_cnf->ipc_connections) == -1) { perror("IPC listen"); close(ipc_sock); return -1; } /* Register the socket with the socket parser */ add_olsr_socket(ipc_sock, &ipc_accept, NULL, NULL, SP_PR_READ); return 0; } void ipc_accept(int fd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { socklen_t addrlen; struct sockaddr_in pin; char *addr; addrlen = sizeof(struct sockaddr_in); if ((ipc_conn = accept(fd, (struct sockaddr *)&pin, &addrlen)) == -1) { perror("IPC accept"); olsr_exit("IPC accept", EXIT_FAILURE); } else { OLSR_PRINTF(1, "Front end connected\n"); addr = inet_ntoa(pin.sin_addr); if (ipc_check_allowed_ip((union olsr_ip_addr *)&pin.sin_addr.s_addr)) { ipc_active = true; ipc_send_net_info(ipc_conn); ipc_send_all_routes(ipc_conn); OLSR_PRINTF(1, "Connection from %s\n", addr); } else { OLSR_PRINTF(1, "Front end-connection from foregin host(%s) not allowed!\n", addr); olsr_syslog(OLSR_LOG_ERR, "OLSR: Front end-connection from foregin host(%s) not allowed!\n", addr); CLOSE(ipc_conn); } } } bool ipc_check_allowed_ip(const union olsr_ip_addr *addr) { struct ip_prefix_list *ipcn; if (addr->v4.s_addr == ntohl(INADDR_LOOPBACK)) { return true; } /* check nets */ for (ipcn = olsr_cnf->ipc_nets; ipcn != NULL; ipcn = ipcn->next) { if (ip_in_net(addr, &ipcn->net)) { return true; } } return false; } /** *Sends a olsr packet on the IPC socket. * *@param msg the olsr struct representing the packet *@param in_if the incoming interface *@param from_addr the sender address * *@return true for not preventing forwarding */ bool frontend_msgparser(union olsr_message * msg, struct interface * in_if __attribute__ ((unused)), union olsr_ip_addr * from_addr __attribute__ ((unused))) { int size; if (!ipc_active) return true; if (olsr_cnf->ip_version == AF_INET) size = ntohs(msg->v4.olsr_msgsize); else size = ntohs(msg->v6.olsr_msgsize); if (send(ipc_conn, (void *)msg, size, MSG_NOSIGNAL) < 0) { OLSR_PRINTF(1, "(OUTPUT)IPC connection lost!\n"); CLOSE(ipc_conn); ipc_active = false; } return true; } /** *Send a route table update to the front-end. * *@param dst the destination of the route *@param gw the gateway for the route *@param met the metric for the route *@param add 1 if the route is to be added 0 if it is to be deleted *@param int_name the name of the interface the route is set to go by * *@return negative on error */ int ipc_route_send_rtentry(const union olsr_ip_addr *dst, const union olsr_ip_addr *gw, int met, int add, const char *int_name) { struct ipcmsg packet; char *tmp; if (olsr_cnf->ipc_connections <= 0) { return -1; } if (!ipc_active) { return 0; } memset(&packet, 0, sizeof(struct ipcmsg)); packet.size = htons(IPC_PACK_SIZE); packet.msgtype = ROUTE_IPC; packet.target_addr = *dst; packet.add = add; if (add && gw) { packet.metric = met; packet.gateway_addr = *gw; } if (int_name != NULL) memcpy(&packet.device[0], int_name, 4); else memset(&packet.device[0], 0, 4); tmp = (char *)&packet; /* x = 0; for(i = 0; i < IPC_PACK_SIZE;i++) { if(x == 4) { x = 0; printf("\n\t"); } x++; printf(" %03i", (u_char) tmp[i]); } printf("\n"); */ if (send(ipc_conn, tmp, IPC_PACK_SIZE, MSG_NOSIGNAL) < 0) // MSG_NOSIGNAL to avoid sigpipe { OLSR_PRINTF(1, "(RT_ENTRY)IPC connection lost!\n"); CLOSE(ipc_conn); ipc_active = false; return -1; } return 1; } static int ipc_send_all_routes(int fd) { struct rt_entry *rt; struct ipcmsg packet; char *tmp; if (!ipc_active) return 0; OLSR_FOR_ALL_RT_ENTRIES(rt) { memset(&packet, 0, sizeof(struct ipcmsg)); packet.size = htons(IPC_PACK_SIZE); packet.msgtype = ROUTE_IPC; packet.target_addr = rt->rt_dst.prefix; packet.add = 1; packet.metric = (uint8_t) (rt->rt_best->rtp_metric.hops); packet.gateway_addr = rt->rt_nexthop.gateway; memcpy(&packet.device[0], if_ifwithindex_name(rt->rt_nexthop.iif_index), 4); tmp = (char *)&packet; /* MSG_NOSIGNAL to avoid sigpipe */ if (send(fd, tmp, IPC_PACK_SIZE, MSG_NOSIGNAL) < 0) { OLSR_PRINTF(1, "(RT_ENTRY)IPC connection lost!\n"); CLOSE(ipc_conn); ipc_active = false; return -1; } } OLSR_FOR_ALL_RT_ENTRIES_END(rt); return 1; } /** *Sends OLSR info to the front-end. This info consists of *the different time intervals and holding times, number *of interfaces, HNA routes and main address. * *@return negative on error */ static int ipc_send_net_info(int fd) { struct ipc_net_msg net_msg; memset(&net_msg, 0, sizeof(net_msg)); OLSR_PRINTF(1, "Sending net-info to front end...\n"); /* Message size */ net_msg.size = htons(sizeof(struct ipc_net_msg)); /* Message type */ net_msg.msgtype = NET_IPC; /* MIDs */ /* XXX fix IPC MIDcnt */ net_msg.mids = (ifnet != NULL && ifnet->int_next != NULL) ? 1 : 0; /* HNAs */ net_msg.hnas = olsr_cnf->hna_entries == NULL ? 0 : 1; /* Different values */ /* Temporary fixes */ /* XXX fix IPC intervals */ net_msg.hello_int = 0; //htons((uint16_t)hello_int); net_msg.hello_lan_int = 0; //htons((uint16_t)hello_int_nw); net_msg.tc_int = 0; //htons((uint16_t)tc_int); net_msg.neigh_hold = 0; //htons((uint16_t)neighbor_hold_time); net_msg.topology_hold = 0; //htons((uint16_t)topology_hold_time); net_msg.ipv6 = olsr_cnf->ip_version == AF_INET ? 0 : 1; /* Main addr */ net_msg.main_addr = olsr_cnf->main_addr; /* { unsigned int x, i; printf("\t"); for(i = 0; i < sizeof(struct ipc_net_msg);i++) { if(x == 4) { x = 0; printf("\n\t"); } x++; printf(" %03i", ((u_char *)net_msg)[i]); } printf("\n"); } */ if (send(fd, (char *)&net_msg, sizeof(struct ipc_net_msg), MSG_NOSIGNAL) < 0) { OLSR_PRINTF(1, "(NETINFO)IPC connection lost!\n"); CLOSE(ipc_conn); return -1; } return 0; } int shutdown_ipc(void) { OLSR_PRINTF(1, "Shutting down IPC...\n"); CLOSE(ipc_sock); CLOSE(ipc_conn); return 1; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/ipc_frontend.h000066400000000000000000000065421234304727700164400ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * *IPC - interprocess communication *for the OLSRD - GUI front-end * */ #ifndef _OLSR_IPC #define _OLSR_IPC #include #include #include #include #include #include #include "defs.h" #define IPC_PORT 1212 #define IPC_PACK_SIZE 44 /* Size of the IPC_ROUTE packet */ #define ROUTE_IPC 11 /* IPC to front-end telling of route changes */ #define NET_IPC 12 /* IPC to front end net-info */ /* *IPC message sent to the front-end *at every route update. Both delete *and add */ struct ipcmsg { uint8_t msgtype; uint16_t size; uint8_t metric; uint8_t add; union olsr_ip_addr target_addr; union olsr_ip_addr gateway_addr; char device[4]; }; struct ipc_net_msg { uint8_t msgtype; uint16_t size; uint8_t mids; /* No. of extra interfaces */ uint8_t hnas; /* No. of HNA nets */ uint8_t unused1; uint16_t hello_int; uint16_t hello_lan_int; uint16_t tc_int; uint16_t neigh_hold; uint16_t topology_hold; uint8_t ipv6; union olsr_ip_addr main_addr; }; bool ipc_check_allowed_ip(const union olsr_ip_addr *); void ipc_accept(int fd, void *, unsigned int); bool frontend_msgparser(union olsr_message *, struct interface *, union olsr_ip_addr *); int ipc_route_send_rtentry(const union olsr_ip_addr *, const union olsr_ip_addr *, int, int, const char *); #endif /* _OLSR_IPC */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/ipcalc.c000066400000000000000000000172411234304727700152120ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2007, Bernd Petrovitsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "defs.h" #include "ipcalc.h" /* ipv4 prefix 0.0.0.0/0 */ const struct olsr_ip_prefix ipv4_internet_route = { .prefix.v4.s_addr = 0, .prefix_len = 0 }; /* ipv6 prefix ::ffff:0:0/96 */ const struct olsr_ip_prefix ipv6_mappedv4_route = { .prefix.v6.s6_addr = { 0,0,0,0,0,0,0,0,0,0,0xff,0xff,0,0,0,0 }, .prefix_len = 96 }; /* ipv6 prefix 2000::/3 */ const struct olsr_ip_prefix ipv6_internet_route = { .prefix.v6.s6_addr = { 0x20, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, .prefix_len = 3 }; /* ip address zero */ const union olsr_ip_addr olsr_ip_zero = { .v6.s6_addr = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } }; /* Default IPv6 multicast addresses FF02::6D(linklocal manet routers, see RFC 5498) */ const union olsr_ip_addr ipv6_def_multicast = { .v6.s6_addr = { 0xFF, 0x02, 0,0,0,0,0,0,0,0,0,0,0,0,0, 0x6D } }; /* Host-byte-order! */ int prefix_to_netmask(uint8_t * a, int len, uint8_t prefixlen) { #if !defined(NODEBUG) && defined(DEBUG) struct ipaddr_str buf; const uint8_t *a_start = a; #endif /* !defined(NODEBUG) && defined(DEBUG) */ int p; const uint8_t *a_end; a_end = a + len; for (p = prefixlen; a < a_end && p > 8; p -= 8) { *a++ = 0xff; } if (a >= a_end) { return 0; } *a++ = 0xff << (8 - p); while (a < a_end) { *a++ = 0; } #ifdef DEBUG OLSR_PRINTF(3, "Prefix %d = Netmask: %s\n", prefixlen, inet_ntop(olsr_cnf->ip_version, a_start, buf.buf, sizeof(buf.buf))); #endif /* DEBUG */ return 1; } uint8_t netmask_to_prefix(const uint8_t * adr, int len) { struct ipaddr_str buf; const uint8_t *const a_end = adr + len; uint16_t prefix = 0; const uint8_t *a; for (a = adr; a < a_end && *a == 0xff; a++) { prefix += 8; } if (a < a_end) { /* handle the last byte */ switch (*a) { case 0: prefix += 0; break; case 128: prefix += 1; break; case 192: prefix += 2; break; case 224: prefix += 3; break; case 240: prefix += 4; break; case 248: prefix += 5; break; case 252: prefix += 6; break; case 254: prefix += 7; break; case 255: prefix += 8; break; /* Shouldn't happen */ default: OLSR_PRINTF(0, "%s: Got bogus netmask %s\n", __func__, olsr_ip_to_string(&buf, (const union olsr_ip_addr *)(const void *)adr)); prefix = UCHAR_MAX; break; } } #ifdef DEBUG OLSR_PRINTF(3, "Netmask: %s = Prefix %d\n", olsr_ip_to_string(&buf, (const union olsr_ip_addr *)(const void *)adr), prefix); #endif /* DEBUG */ return prefix; } const char * olsr_ip_prefix_to_string(const struct olsr_ip_prefix *prefix) { /* We need for IPv6 an IP address + '/' + prefix and for IPv4 an IP address + '/' + a netmask */ static char buf[MAX(INET6_ADDRSTRLEN + 1 + 3, INET_ADDRSTRLEN + 1 + INET_ADDRSTRLEN)]; const char *rv; if (olsr_cnf->ip_version == AF_INET) { /* IPv4 */ int len; union olsr_ip_addr netmask; rv = inet_ntop(AF_INET, &prefix->prefix.v4, buf, sizeof(buf)); len = strlen(buf); buf[len++] = '/'; olsr_prefix_to_netmask(&netmask, prefix->prefix_len); inet_ntop(AF_INET, &netmask.v4, buf + len, sizeof(buf) - len); } else { /* IPv6 */ int len; rv = inet_ntop(AF_INET6, &prefix->prefix.v6, buf, sizeof(buf)); len = strlen(buf); buf[len++] = '/'; snprintf(buf + len, sizeof(buf) - len, "/%d", prefix->prefix_len); } return rv; } int olsr_string_to_prefix(int ipversion, struct olsr_ip_prefix *dst, const char *string) { static char buf[MAX(INET6_ADDRSTRLEN + 1 + 3, INET_ADDRSTRLEN + 1 + INET_ADDRSTRLEN)]; char *ptr; strscpy(buf, string, sizeof(buf)); dst->prefix_len = ipversion == AF_INET ? 32 : 128; ptr = strchr(buf, '/'); if (!ptr) { ptr = strchr(buf, ' '); } if (ptr) { *ptr++ = 0; if (olsr_cnf->ip_version == AF_INET && strchr(ptr, '.')) { uint8_t subnetbuf[4]; if (inet_pton(AF_INET, ptr, subnetbuf) != 1) { return -1; } dst->prefix_len = netmask_to_prefix(subnetbuf, sizeof(subnetbuf)); } else { dst->prefix_len = atoi(ptr); } } return inet_pton(ipversion, buf, &dst->prefix) == 1 ? 0 : -1; } /* we need to handle one value specifically since shifting * 32 bits of a 32 bit integer is the same as shifting 0 bits. * The result is in host-byte-order. */ static INLINE uint32_t prefix_to_netmask4(uint8_t prefixlen) { return prefixlen == 0 ? 0 : (~0U << (32 - prefixlen)); } /* see if the ipaddr is in the net. That is equivalent to the fact that the net part * of both are equal. So we must compare the first bits. Network-byte-order! */ int ip_in_net(const union olsr_ip_addr *ipaddr, const struct olsr_ip_prefix *net) { int rv; if (olsr_cnf->ip_version == AF_INET) { uint32_t netmask = htonl(prefix_to_netmask4(net->prefix_len)); rv = (ipaddr->v4.s_addr & netmask) == (net->prefix.v4.s_addr & netmask); } else { /* IPv6 */ uint32_t netmask; const uint32_t *i = (const uint32_t *)&ipaddr->v6; const uint32_t *n = (const uint32_t *)&net->prefix.v6; unsigned int prefix_len; /* First we compare whole unsigned int's */ for (prefix_len = net->prefix_len; prefix_len > 32; prefix_len -= 32) { if (*i != *n) { return false; } i++; n++; } /* And the remaining is the same as in the IPv4 case */ netmask = htonl(prefix_to_netmask4(prefix_len)); rv = (*i & netmask) == (*n & netmask); } return rv; } bool is_prefix_inetgw(const struct olsr_ip_prefix *prefix) { if (olsr_cnf->ip_version == AF_INET && ip_prefix_is_v4_inetgw(prefix)) { return true; } if (olsr_cnf->ip_version == AF_INET6) { if (ip_prefix_is_v6_inetgw(prefix) || ip_prefix_is_mappedv4_inetgw(prefix)) { return true; } } return false; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/ipcalc.h000066400000000000000000000157751234304727700152310ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2007, Bernd Petrovitsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _IPCALC #define _IPCALC #include "olsr_types.h" #include "defs.h" #include #include #include extern const struct olsr_ip_prefix ipv4_internet_route; extern const struct olsr_ip_prefix ipv6_mappedv4_route; extern const struct olsr_ip_prefix ipv6_internet_route; extern const union olsr_ip_addr olsr_ip_zero; extern const union olsr_ip_addr ipv6_def_multicast; struct ipaddr_str { char buf[MAX(INET6_ADDRSTRLEN, INET_ADDRSTRLEN)]; } __attribute__ ((unused)); /* * Macros for comparing and copying IP addresses */ static INLINE int ip4cmp(const struct in_addr *a, const struct in_addr *b) { return a->s_addr > b->s_addr ? +1 : a->s_addr < b->s_addr ? -1 : 0; } static INLINE int ip4equal(const struct in_addr *a, const struct in_addr *b) { return a->s_addr == b->s_addr; } static INLINE int ip6cmp(const struct in6_addr *a, const struct in6_addr *b) { return memcmp(a, b, sizeof(*a)); } static INLINE int ip6equal(const struct in6_addr *a, const struct in6_addr *b) { return ip6cmp(a, b) == 0; } static INLINE int ipequal(const union olsr_ip_addr *a, const union olsr_ip_addr *b) { return olsr_cnf->ip_version == AF_INET ? ip4equal(&a->v4, &b->v4) : ip6equal(&a->v6, &b->v6); } /* Do not use this - this is as evil as the COPY_IP() macro was and only used in * source which also needs cleanups. */ static INLINE void genipcopy(void *dst, const void *src) { memcpy(dst, src, olsr_cnf->ipsize); } int ip_in_net(const union olsr_ip_addr *ipaddr, const struct olsr_ip_prefix *net); int prefix_to_netmask(uint8_t *, int, uint8_t); static INLINE int olsr_prefix_to_netmask(union olsr_ip_addr *adr, uint8_t prefixlen) { return prefix_to_netmask(adr->v6.s6_addr, olsr_cnf->ipsize, prefixlen); } uint8_t netmask_to_prefix(const uint8_t *, int); static INLINE uint8_t olsr_netmask_to_prefix(const union olsr_ip_addr *adr) { return netmask_to_prefix(adr->v6.s6_addr, olsr_cnf->ipsize); } static INLINE uint8_t olsr_netmask4_to_prefix(const uint32_t * a) { return netmask_to_prefix((const uint8_t *)a, sizeof(*a)); } static INLINE uint8_t olsr_netmask6_to_prefix(const struct in6_addr *a) { return netmask_to_prefix((const uint8_t *)a, sizeof(*a)); } static INLINE const char * ip4_to_string(struct ipaddr_str *const buf, const struct in_addr addr4) { return inet_ntop(AF_INET, &addr4, buf->buf, sizeof(buf->buf)); } static INLINE const char * ip6_to_string(struct ipaddr_str *const buf, const struct in6_addr *const addr6) { return inet_ntop(AF_INET6, addr6, buf->buf, sizeof(buf->buf)); } static INLINE const char * olsr_ip_to_string(struct ipaddr_str *const buf, const union olsr_ip_addr *addr) { return inet_ntop(olsr_cnf->ip_version, addr, buf->buf, sizeof(buf->buf)); } const char * olsr_ip_prefix_to_string(const struct olsr_ip_prefix *prefix); int olsr_string_to_prefix(int ipversion, struct olsr_ip_prefix *dst, const char *buf); static INLINE const char * sockaddr4_to_string(struct ipaddr_str *const buf, const struct sockaddr *const addr) { const struct sockaddr_in *addr4 = (const struct sockaddr_in *)CONST_ARM_NOWARN_ALIGN(addr); return ip4_to_string(buf, addr4->sin_addr); } static INLINE bool is_prefix_niit_ipv6(const struct olsr_ip_prefix *p) { #ifdef __ANDROID__ #define IN6_IS_ADDR_V4MAPPED_ANDROID_WORKAROUND(a) \ ((((__const uint32_t *) (a))[0] == 0) \ && (((__const uint32_t *) (a))[1] == 0) \ && (((__const uint32_t *) (a))[2] == htonl (0xffff))) bool v4mapped = IN6_IS_ADDR_V4MAPPED_ANDROID_WORKAROUND(&p->prefix.v6); #else bool v4mapped = IN6_IS_ADDR_V4MAPPED(&p->prefix.v6); #endif return olsr_cnf->ip_version == AF_INET6 && v4mapped && p->prefix_len >= ipv6_mappedv4_route.prefix_len; } static INLINE struct olsr_ip_prefix * prefix_mappedv4_to_v4(struct olsr_ip_prefix *v4, const struct olsr_ip_prefix *v6) { memcpy(&v4->prefix.v4, &v6->prefix.v6.s6_addr[12], sizeof(struct in_addr)); v4->prefix_len = v6->prefix_len - 96; return v4; } static INLINE bool ip_is_linklocal(const union olsr_ip_addr *ip) { return olsr_cnf->ip_version == AF_INET6 && ip->v6.s6_addr[0] == 0xfe && (ip->v6.s6_addr[1] & 0xc0) == 0x80; } static INLINE bool ip_prefix_is_mappedv4(const struct olsr_ip_prefix *prefix) { return prefix->prefix_len >= ipv6_mappedv4_route.prefix_len && memcmp(prefix, &ipv6_mappedv4_route, ipv6_mappedv4_route.prefix_len / 8) == 0; } static INLINE bool ip_prefix_is_mappedv4_inetgw(const struct olsr_ip_prefix *prefix) { return prefix->prefix_len == ipv6_mappedv4_route.prefix_len && memcmp(prefix, &ipv6_mappedv4_route, ipv6_mappedv4_route.prefix_len / 8) == 0; } static INLINE bool ip_prefix_is_v4_inetgw(const struct olsr_ip_prefix *prefix) { return prefix->prefix_len == ipv4_internet_route.prefix_len && prefix->prefix.v4.s_addr == ipv4_internet_route.prefix.v4.s_addr; } static INLINE bool ip_prefix_is_v6_inetgw(const struct olsr_ip_prefix *prefix) { return prefix->prefix_len == ipv6_internet_route.prefix_len && memcmp(prefix, &ipv6_internet_route, ipv6_internet_route.prefix_len/8) == 0; } extern bool is_prefix_inetgw(const struct olsr_ip_prefix *prefix); #endif /* _IPCALC */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/kernel_routes.h000066400000000000000000000054431234304727700166460ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_KERNEL_RT #define _OLSR_KERNEL_RT #include "defs.h" #include "routing_table.h" int olsr_ioctl_add_route(const struct rt_entry *rt); int olsr_ioctl_add_route6(const struct rt_entry *rt); int olsr_ioctl_del_route(const struct rt_entry *rt); int olsr_ioctl_del_route6(const struct rt_entry *rt); #ifdef __linux__ int rtnetlink_register_socket(int); #endif /* __linux__ */ void olsr_os_niit_4to6_route(const struct olsr_ip_prefix *dst_v4, bool set); void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6, bool set); void olsr_os_inetgw_tunnel_route(uint32_t if_idx, bool ipv4, bool set, uint8_t table); int olsr_os_policy_rule(int family, int rttable, uint32_t priority, const char *if_name, bool set); int olsr_os_localhost_if(union olsr_ip_addr *ip, bool create); int olsr_os_ifip(int ifindex, union olsr_ip_addr *ip, bool create); #endif /* _OLSR_KERNEL_RT */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/kernel_tunnel.h000066400000000000000000000017121234304727700166250ustar00rootroot00000000000000/* * kernel_tunnel.h * * Created on: 08.02.2010 * Author: henning */ #ifndef KERNEL_TUNNEL_H_ #define KERNEL_TUNNEL_H_ #include #ifdef _WIN32 /* compat for win32 */ #include #define IF_NAMESIZE MAX_INTERFACE_NAME_LEN #endif /* _WIN32 */ #include "defs.h" #include "olsr_types.h" #include "common/avl.h" #define TUNNEL_ENDPOINT_IF "tunl0" #define TUNNEL_ENDPOINT_IF6 "ip6tnl0" #ifdef __ANDROID__ #define OS_TUNNEL_PATH "/dev/tun" #else #define OS_TUNNEL_PATH "/dev/net/tun" #endif struct olsr_iptunnel_entry { struct avl_node node; union olsr_ip_addr target; char if_name[IF_NAMESIZE]; int if_index; int usage; }; int olsr_os_init_iptunnel(const char * name); void olsr_os_cleanup_iptunnel(const char * name); struct olsr_iptunnel_entry *olsr_os_add_ipip_tunnel(union olsr_ip_addr *target, bool transportV4, char *name); void olsr_os_del_ipip_tunnel(struct olsr_iptunnel_entry *); #endif /* KERNEL_TUNNEL_H_ */ olsrd-0.6.6.2/src/link_set.c000066400000000000000000000561551234304727700155760ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Link sensing database for the OLSR routing daemon */ #include #include "defs.h" #include "link_set.h" #include "hysteresis.h" #include "mid_set.h" #include "mpr.h" #include "neighbor_table.h" #include "olsr.h" #include "log.h" #include "scheduler.h" #include "olsr_spf.h" #include "net_olsr.h" #include "ipcalc.h" #include "lq_plugin.h" /* head node for all link sets */ struct list_node link_entry_head; bool link_changes; /* is set if changes occur in MPRS set */ void signal_link_changes(bool val) { /* XXX ugly */ link_changes = val; } /* Prototypes. */ static int check_link_status(const struct hello_message *message, const struct interface *in_if); static struct link_entry *add_link_entry(const union olsr_ip_addr *, const union olsr_ip_addr *, const union olsr_ip_addr *, olsr_reltime, olsr_reltime, const struct interface *); static int get_neighbor_status(const union olsr_ip_addr *); static void olsr_expire_link_sym_timer(void *context); void olsr_init_link_set(void) { /* Init list head */ list_head_init(&link_entry_head); } /** * This function resets all links to lost, so that * a final "lost all links" hello can be generated to * tell your neighbors that you are gone now. */ void olsr_reset_all_links(void) { struct link_entry *link; OLSR_FOR_ALL_LINK_ENTRIES(link) { link->ASYM_time = now_times-1; olsr_stop_timer(link->link_sym_timer); link->link_sym_timer = NULL; link->neighbor->is_mpr = false; link->neighbor->status = NOT_SYM; } OLSR_FOR_ALL_LINK_ENTRIES_END(link) OLSR_FOR_ALL_LINK_ENTRIES(link) { olsr_expire_link_sym_timer(link); olsr_clear_hello_lq(link); } OLSR_FOR_ALL_LINK_ENTRIES_END(link) } /** * Get the status of a link. The status is based upon different * timeouts in the link entry. * * @param entry link entry * @return the link status of the link */ int lookup_link_status(const struct link_entry *entry) { if (entry == NULL || list_is_empty(&link_entry_head)) { return UNSPEC_LINK; } /* * Hysteresis */ if (olsr_cnf->use_hysteresis) { /* * if L_LOST_LINK_time is not expired, the link is advertised * with a link type of LOST_LINK. */ if (!TIMED_OUT(entry->L_LOST_LINK_time)) { return LOST_LINK; } /* * otherwise, if L_LOST_LINK_time is expired and L_link_pending * is set to "true", the link SHOULD NOT be advertised at all; */ if (entry->L_link_pending == 1) { #ifndef NODEBUG struct ipaddr_str buf; OLSR_PRINTF(3, "HYST[%s]: Setting to HIDE\n", olsr_ip_to_string(&buf, &entry->neighbor_iface_addr)); #endif /* NODEBUG */ return HIDE_LINK; } /* * otherwise, if L_LOST_LINK_time is expired and L_link_pending * is set to "false", the link is advertised as described * previously in section 6. */ } if (entry->link_sym_timer) { return SYM_LINK; } if (!TIMED_OUT(entry->ASYM_time)) { return ASYM_LINK; } return LOST_LINK; } /** * Find the "best" link status to a neighbor * * @param address the address to check for * @return SYM_LINK if a symmetric link exists 0 if not */ static int get_neighbor_status(const union olsr_ip_addr *address) { const union olsr_ip_addr *main_addr; struct interface *ifs; /* Find main address */ if (!(main_addr = mid_lookup_main_addr(address))) main_addr = address; /* Loop trough local interfaces to check all possebilities */ for (ifs = ifnet; ifs != NULL; ifs = ifs->int_next) { struct mid_address *aliases; struct link_entry *lnk = lookup_link_entry(main_addr, NULL, ifs); if (lnk != NULL) { if (lookup_link_status(lnk) == SYM_LINK) return SYM_LINK; } /* Get aliases */ for (aliases = mid_lookup_aliases(main_addr); aliases != NULL; aliases = aliases->next_alias) { lnk = lookup_link_entry(&aliases->alias, NULL, ifs); if (lnk && (lookup_link_status(lnk) == SYM_LINK)) { return SYM_LINK; } } } return 0; } /** * Find best link to a neighbor */ struct link_entry * get_best_link_to_neighbor(const union olsr_ip_addr *remote) { const union olsr_ip_addr *main_addr; struct link_entry *walker, *good_link, *backup_link; struct interface *tmp_if; int curr_metric = MAX_IF_METRIC; olsr_linkcost curr_lcost = LINK_COST_BROKEN; olsr_linkcost tmp_lc; /* main address lookup */ main_addr = mid_lookup_main_addr(remote); /* "remote" *already is* the main address */ if (!main_addr) { main_addr = remote; } /* we haven't selected any links, yet */ good_link = NULL; backup_link = NULL; /* loop through all links that we have */ OLSR_FOR_ALL_LINK_ENTRIES(walker) { /* if this is not a link to the neighour in question, skip */ if (!ipequal(&walker->neighbor->neighbor_main_addr, main_addr)) continue; if (olsr_cnf->lq_level == 0) { /* * handle the non-LQ, RFC-compliant case */ /* * find the interface for the link. * we select the link with the best local interface metric. */ tmp_if = walker->if_name ? if_ifwithname(walker->if_name) : if_ifwithaddr(&walker->local_iface_addr); if (!tmp_if) { continue; } /* * is this interface better than anything we had before ? * use the requested remote interface address as a tie-breaker */ if ((tmp_if->int_metric < curr_metric) || ((tmp_if->int_metric == curr_metric) && ipequal(&walker->local_iface_addr, remote))) { /* memorize the interface's metric */ curr_metric = tmp_if->int_metric; /* prefer symmetric links over asymmetric links */ if (lookup_link_status(walker) == SYM_LINK) { good_link = walker; } else { backup_link = walker; } } } else { /* * handle the LQ, non-RFC compliant case. */ /* get the link cost */ tmp_lc = walker->linkcost; /* * is this link better than anything we had before ? * use the requested remote interface address as a tie-breaker. */ if ((tmp_lc < curr_lcost) || ((tmp_lc == curr_lcost) && ipequal(&walker->local_iface_addr, remote))) { /* memorize the link quality */ curr_lcost = tmp_lc; /* prefer symmetric links over asymmetric links */ if (lookup_link_status(walker) == SYM_LINK) { good_link = walker; } else { backup_link = walker; } } } } OLSR_FOR_ALL_LINK_ENTRIES_END(walker); /* * if we haven't found any symmetric links, try to return an asymmetric link. */ return good_link ? good_link : backup_link; } static void set_loss_link_multiplier(struct link_entry *entry) { struct interface *inter; struct olsr_if *cfg_inter; struct olsr_lq_mult *mult; uint32_t val = 0; union olsr_ip_addr null_addr; struct ipaddr_str buf; /* find the interface for the link */ assert(entry->if_name); inter = if_ifwithname(entry->if_name); /* find the interface configuration for the interface */ for (cfg_inter = olsr_cnf->interfaces; cfg_inter; cfg_inter = cfg_inter->next) { if (cfg_inter->interf == inter) { break; } } assert(cfg_inter); /* create a null address for comparison */ memset(&null_addr, 0, sizeof(union olsr_ip_addr)); /* loop through the multiplier entries */ for (mult = cfg_inter->cnf->lq_mult; mult != NULL; mult = mult->next) { /* * use the default multiplier only if there isn't any entry that * has a matching IP address. */ if ((ipequal(&mult->addr, &null_addr) && val == 0) || ipequal(&mult->addr, &entry->neighbor_iface_addr)) { val = mult->value; } } /* if we have not found an entry, then use the default multiplier */ if (val == 0) { val = LINK_LOSS_MULTIPLIER; } /* store the multiplier */ entry->loss_link_multiplier = val; OLSR_PRINTF(1, "Set linkloss multiplier for %s on %s to %d\n", olsr_ip_to_string(&buf, &entry->neighbor_iface_addr), cfg_inter->name, val); } /* * Delete, unlink and free a link entry. */ static void olsr_delete_link_entry(struct link_entry *link) { struct tc_edge_entry *tc_edge; /* delete tc edges we made for SPF */ tc_edge = olsr_lookup_tc_edge(tc_myself, &link->neighbor_iface_addr); if (tc_edge != NULL) { olsr_delete_tc_edge_entry(tc_edge); } /* Delete neighbor entry */ if (link->neighbor->linkcount == 1) { olsr_delete_neighbor_table(&link->neighbor->neighbor_main_addr); } else { link->neighbor->linkcount--; } /* Kill running timers */ olsr_stop_timer(link->link_timer); link->link_timer = NULL; olsr_stop_timer(link->link_sym_timer); link->link_sym_timer = NULL; olsr_stop_timer(link->link_hello_timer); link->link_hello_timer = NULL; olsr_stop_timer(link->link_loss_timer); link->link_loss_timer = NULL; list_remove(&link->link_list); free(link->if_name); free(link); changes_neighborhood = true; } /** * Delete all link entries matching a given interface address. */ void olsr_delete_link_entry_by_ip(const union olsr_ip_addr *int_addr) { struct link_entry *link; if (list_is_empty(&link_entry_head)) { return; } OLSR_FOR_ALL_LINK_ENTRIES(link) { if (ipequal(int_addr, &link->local_iface_addr)) { olsr_delete_link_entry(link); } } OLSR_FOR_ALL_LINK_ENTRIES_END(link); } /** * Callback for the link loss timer. */ static void olsr_expire_link_loss_timer(void *context) { struct link_entry *link; link = (struct link_entry *)context; /* count the lost packet */ olsr_update_packet_loss_worker(link, true); /* next timeout in 1.0 x htime */ olsr_change_timer(link->link_loss_timer, link->loss_helloint, OLSR_LINK_LOSS_JITTER, OLSR_TIMER_PERIODIC); } /** * Callback for the link SYM timer. */ static void olsr_expire_link_sym_timer(void *context) { struct link_entry *link; link = (struct link_entry *)context; link->link_sym_timer = NULL; /* be pedandic */ if (link->prev_status != SYM_LINK) { return; } link->prev_status = lookup_link_status(link); update_neighbor_status(link->neighbor, get_neighbor_status(&link->neighbor_iface_addr)); changes_neighborhood = true; } /** * Callback for the link_hello timer. */ void olsr_expire_link_hello_timer(void *context) { struct ipaddr_str buf; struct link_entry *link; link = (struct link_entry *)context; link->L_link_quality = olsr_hyst_calc_instability(link->L_link_quality); OLSR_PRINTF(1, "HYST[%s] HELLO timeout %f\n", olsr_ip_to_string(&buf, &link->neighbor_iface_addr), (double)link->L_link_quality); /* Update hello_timeout - NO SLACK THIS TIME */ olsr_change_timer(link->link_hello_timer, link->last_htime, OLSR_LINK_JITTER, OLSR_TIMER_PERIODIC); /* Update hysteresis values */ olsr_process_hysteresis(link); /* update neighbor status */ update_neighbor_status(link->neighbor, get_neighbor_status(&link->neighbor_iface_addr)); /* Update seqno - not mentioned in the RFC... kind of a hack.. */ link->olsr_seqno++; } /** * Callback for the link timer. */ static void olsr_expire_link_entry(void *context) { struct link_entry *link; link = (struct link_entry *)context; link->link_timer = NULL; /* be pedandic */ olsr_delete_link_entry(link); } /** * Set the link expiration timer. */ void olsr_set_link_timer(struct link_entry *link, unsigned int rel_timer) { struct ipaddr_str buf; OLSR_PRINTF(3, "reset link timer: %s = %u\n", olsr_ip_to_string(&buf, &link->neighbor_iface_addr), (unsigned int)(now_times + rel_timer/1000)); olsr_set_timer(&link->link_timer, rel_timer, OLSR_LINK_JITTER, OLSR_TIMER_ONESHOT, &olsr_expire_link_entry, link, 0); } /** * Nothing mysterious here. * Adding a new link entry to the link set. * * @param local the local IP address * @param remote the remote IP address * @param remote_main the remote nodes main address * @param vtime the validity time of the entry * @param htime the HELLO interval of the remote node * @param local_if the local interface * @return the new link_entry */ static struct link_entry * add_link_entry(const union olsr_ip_addr *local, const union olsr_ip_addr *remote, const union olsr_ip_addr *remote_main, olsr_reltime vtime, olsr_reltime htime, const struct interface *local_if) { struct link_entry *new_link; struct neighbor_entry *neighbor; struct link_entry *tmp_link_set; tmp_link_set = lookup_link_entry(remote, remote_main, local_if); if (tmp_link_set) { return tmp_link_set; } /* * if there exists no link tuple with * L_neighbor_iface_addr == Source Address */ #ifdef DEBUG { struct ipaddr_str localbuf, rembuf; OLSR_PRINTF(1, "Adding %s=>%s to link set\n", olsr_ip_to_string(&localbuf, local), olsr_ip_to_string(&rembuf, remote)); } #endif /* DEBUG */ /* a new tuple is created with... */ new_link = olsr_malloc_link_entry("new link entry"); /* copy if_name, if it is defined */ if (local_if->int_name) { size_t name_size = strlen(local_if->int_name) + 1; new_link->if_name = olsr_malloc(name_size, "target of if_name in new link entry"); strscpy(new_link->if_name, local_if->int_name, name_size); } else new_link->if_name = NULL; /* shortcut to interface. XXX refcount */ new_link->inter = local_if; /* * L_local_iface_addr = Address of the interface * which received the HELLO message */ new_link->local_iface_addr = *local; /* L_neighbor_iface_addr = Source Address */ new_link->neighbor_iface_addr = *remote; /* L_time = current time + validity time */ olsr_set_link_timer(new_link, vtime); new_link->prev_status = ASYM_LINK; /* HYSTERESIS */ if (olsr_cnf->use_hysteresis) { new_link->L_link_pending = 1; new_link->L_LOST_LINK_time = GET_TIMESTAMP(vtime); olsr_update_hysteresis_hello(new_link, htime); new_link->last_htime = htime; new_link->olsr_seqno = 0; new_link->olsr_seqno_valid = false; } new_link->L_link_quality = 0.0; if (olsr_cnf->lq_level > 0) { new_link->loss_helloint = htime; olsr_set_timer(&new_link->link_loss_timer, htime + htime / 2, OLSR_LINK_LOSS_JITTER, OLSR_TIMER_PERIODIC, &olsr_expire_link_loss_timer, new_link, 0); set_loss_link_multiplier(new_link); } new_link->linkcost = LINK_COST_BROKEN; /* Add to queue */ list_add_before(&link_entry_head, &new_link->link_list); /* * Create the neighbor entry */ /* Neighbor MUST exist! */ neighbor = olsr_lookup_neighbor_table(remote_main); if (!neighbor) { #ifdef DEBUG struct ipaddr_str buf; OLSR_PRINTF(3, "ADDING NEW NEIGHBOR ENTRY %s FROM LINK SET\n", olsr_ip_to_string(&buf, remote_main)); #endif /* DEBUG */ neighbor = olsr_insert_neighbor_table(remote_main); } neighbor->linkcount++; new_link->neighbor = neighbor; return new_link; } /** * Lookup the status of a link. * * @param int_addr address of the remote interface * @return 1 of the link is symmertic 0 if not */ int check_neighbor_link(const union olsr_ip_addr *int_addr) { struct link_entry *link; OLSR_FOR_ALL_LINK_ENTRIES(link) { if (ipequal(int_addr, &link->neighbor_iface_addr)) { return lookup_link_status(link); } } OLSR_FOR_ALL_LINK_ENTRIES_END(link); return UNSPEC_LINK; } /** * Lookup a link entry * * @param remote the remote interface address * @param remote_main the remote nodes main address * @param local the local interface address * @return the link entry if found, NULL if not */ struct link_entry * lookup_link_entry(const union olsr_ip_addr *remote, const union olsr_ip_addr *remote_main, const struct interface *local) { struct link_entry *link; OLSR_FOR_ALL_LINK_ENTRIES(link) { if (ipequal(remote, &link->neighbor_iface_addr) && (link->if_name ? !strcmp(link->if_name, local->int_name) : ipequal(&local->ip_addr, &link->local_iface_addr))) { /* check the remote-main address only if there is one given */ if (NULL != remote_main && !ipequal(remote_main, &link->neighbor->neighbor_main_addr)) { /* Neighbor has changed it's main_addr, update */ struct ipaddr_str oldbuf, newbuf; OLSR_PRINTF(1, "Neighbor changed main_ip, updating %s -> %s\n", olsr_ip_to_string(&oldbuf, &link->neighbor->neighbor_main_addr), olsr_ip_to_string(&newbuf, remote_main)); olsr_update_neighbor_main_addr(link->neighbor, remote_main); } return link; } } OLSR_FOR_ALL_LINK_ENTRIES_END(link); return NULL; } /** * Update a link entry. This is the "main entrypoint" in * the link-sensing. This function is called from the HELLO * parser function. It makes sure a entry is updated or created. * * @param local the local IP address * @param remote the remote IP address * @param message the HELLO message * @param in_if the interface on which this HELLO was received * @return the link_entry struct describing this link entry */ struct link_entry * update_link_entry(const union olsr_ip_addr *local, const union olsr_ip_addr *remote, const struct hello_message *message, const struct interface *in_if) { struct link_entry *entry; /* Add if not registered */ entry = add_link_entry(local, remote, &message->source_addr, message->vtime, message->htime, in_if); /* Update ASYM_time */ entry->vtime = message->vtime; entry->ASYM_time = GET_TIMESTAMP(message->vtime); entry->prev_status = check_link_status(message, in_if); switch (entry->prev_status) { case (LOST_LINK): olsr_stop_timer(entry->link_sym_timer); entry->link_sym_timer = NULL; break; case (SYM_LINK): case (ASYM_LINK): /* L_SYM_time = current time + validity time */ olsr_set_timer(&entry->link_sym_timer, message->vtime, OLSR_LINK_SYM_JITTER, OLSR_TIMER_ONESHOT, &olsr_expire_link_sym_timer, entry, 0); /* L_time = L_SYM_time + NEIGHB_HOLD_TIME */ olsr_set_link_timer(entry, message->vtime + NEIGHB_HOLD_TIME * MSEC_PER_SEC); break; default: break; } /* L_time = max(L_time, L_ASYM_time) */ if (entry->link_timer == NULL || (entry->link_timer->timer_clock < entry->ASYM_time)) { olsr_set_link_timer(entry, TIME_DUE(entry->ASYM_time)); } /* Update hysteresis values */ if (olsr_cnf->use_hysteresis) olsr_process_hysteresis(entry); /* Update neighbor */ update_neighbor_status(entry->neighbor, get_neighbor_status(remote)); return entry; } /** * Function that updates all registered pointers to * one neighbor entry with another pointer * Used by MID updates. * * @param old the pointer to replace * @param new the pointer to use instead of "old" * @return the number of entries updated */ int replace_neighbor_link_set(const struct neighbor_entry *old, struct neighbor_entry *new) { struct link_entry *link; int retval = 0; if (list_is_empty(&link_entry_head)) { return retval; } OLSR_FOR_ALL_LINK_ENTRIES(link) { if (link->neighbor == old) { link->neighbor = new; retval++; } } OLSR_FOR_ALL_LINK_ENTRIES_END(link); return retval; } /** *Checks the link status to a neighbor by *looking in a received HELLO message. * *@param message the HELLO message to check *@param in_if the incoming interface * *@return the link status */ static int check_link_status(const struct hello_message *message, const struct interface *in_if) { int ret = UNSPEC_LINK; struct hello_neighbor *neighbors; neighbors = message->neighbors; while (neighbors) { /* * Note: If a neigh has 2 cards we can reach, the neigh * will send a Hello with the same IP mentined twice */ if (ipequal(&neighbors->address, &in_if->ip_addr) && neighbors->link != UNSPEC_LINK) { ret = neighbors->link; if (SYM_LINK == ret) { break; } } neighbors = neighbors->next; } return ret; } #ifndef NODEBUG void olsr_print_link_set(void) { /* The whole function makes no sense without it. */ struct link_entry *walker; const int addrsize = olsr_cnf->ip_version == AF_INET ? (INET_ADDRSTRLEN - 1) : (INET6_ADDRSTRLEN - 1); OLSR_PRINTF(0, "\n--- %s ---------------------------------------------------- LINKS\n\n", olsr_wallclock_string()); OLSR_PRINTF(1, "%-*s %-6s %-14s %s\n", addrsize, "IP address", "hyst", " LQ ", "ETX"); OLSR_FOR_ALL_LINK_ENTRIES(walker) { struct ipaddr_str buf; struct lqtextbuffer lqbuffer1, lqbuffer2; OLSR_PRINTF(1, "%-*s %5.3f %-14s %s\n", addrsize, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr), (double)walker->L_link_quality, get_link_entry_text(walker, '/', &lqbuffer1), get_linkcost_text(walker->linkcost, false, &lqbuffer2)); } OLSR_FOR_ALL_LINK_ENTRIES_END(walker); } #endif /* NODEBUG */ /* * called for every LQ HELLO message. * update the timeout with the htime value from the message */ void olsr_update_packet_loss_hello_int(struct link_entry *entry, olsr_reltime loss_hello_int) { entry->loss_helloint = loss_hello_int; } void olsr_received_hello_handler(struct link_entry *entry) { olsr_update_packet_loss_worker(entry, false); /* timeout for the first lost packet is 1.5 x htime */ olsr_set_timer(&entry->link_loss_timer, entry->loss_helloint + entry->loss_helloint / 2, OLSR_LINK_LOSS_JITTER, OLSR_TIMER_PERIODIC, &olsr_expire_link_loss_timer, entry, 0); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/link_set.h000066400000000000000000000121431234304727700155700ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Link sensing database for the OLSR routing daemon */ #ifndef _LINK_SET_H #define _LINK_SET_H #include "lq_plugin.h" #include "packet.h" #include "common/list.h" #include "mantissa.h" #define MID_ALIAS_HACK_VTIME 10.0 #define LINK_LOSS_MULTIPLIER (1<<16) struct link_entry { union olsr_ip_addr local_iface_addr; union olsr_ip_addr neighbor_iface_addr; const struct interface *inter; char *if_name; struct timer_entry *link_timer; struct timer_entry *link_sym_timer; uint32_t ASYM_time; olsr_reltime vtime; struct neighbor_entry *neighbor; uint8_t prev_status; /* * Hysteresis */ float L_link_quality; int L_link_pending; uint32_t L_LOST_LINK_time; struct timer_entry *link_hello_timer; /* When we should receive a new HELLO */ olsr_reltime last_htime; bool olsr_seqno_valid; uint16_t olsr_seqno; /* * packet loss */ olsr_reltime loss_helloint; struct timer_entry *link_loss_timer; /* user defined multiplies for link quality, multiplied with 65536 */ uint32_t loss_link_multiplier; /* cost of this link */ olsr_linkcost linkcost; struct list_node link_list; /* double linked list of all link entries */ uint32_t linkquality[0]; }; /* inline to recast from link_list back to link_entry */ LISTNODE2STRUCT(list2link, struct link_entry, link_list); #define OLSR_LINK_JITTER 5 /* percent */ #define OLSR_LINK_HELLO_JITTER 0 /* percent jitter */ #define OLSR_LINK_SYM_JITTER 0 /* percent jitter */ #define OLSR_LINK_LOSS_JITTER 0 /* percent jitter */ /* deletion safe macro for link entry traversal */ #define OLSR_FOR_ALL_LINK_ENTRIES(link) \ { \ struct list_node *link_head_node, *link_node, *next_link_node; \ link_head_node = &link_entry_head; \ for (link_node = link_head_node->next; \ link_node != link_head_node; link_node = next_link_node) { \ next_link_node = link_node->next; \ link = list2link(link_node); #define OLSR_FOR_ALL_LINK_ENTRIES_END(link) }} /* Externals */ extern struct list_node link_entry_head; extern bool link_changes; /* Function prototypes */ void olsr_set_link_timer(struct link_entry *, unsigned int); void olsr_init_link_set(void); void olsr_reset_all_links(void); void olsr_delete_link_entry_by_ip(const union olsr_ip_addr *); void olsr_expire_link_hello_timer(void *); void signal_link_changes(bool); /* XXX ugly */ struct link_entry *get_best_link_to_neighbor(const union olsr_ip_addr *); struct link_entry *lookup_link_entry(const union olsr_ip_addr *, const union olsr_ip_addr *remote_main, const struct interface *); struct link_entry *update_link_entry(const union olsr_ip_addr *, const union olsr_ip_addr *, const struct hello_message *, const struct interface *); int check_neighbor_link(const union olsr_ip_addr *); int replace_neighbor_link_set(const struct neighbor_entry *, struct neighbor_entry *); int lookup_link_status(const struct link_entry *); void olsr_update_packet_loss_hello_int(struct link_entry *, olsr_reltime); void olsr_received_hello_handler(struct link_entry *entry); #ifndef NODEBUG void olsr_print_link_set(void); #else #define olsr_print_link_set() do { } while(0) #endif #endif /* _LINK_SET_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/linux/000077500000000000000000000000001234304727700147455ustar00rootroot00000000000000olsrd-0.6.6.2/src/linux/apm.c000066400000000000000000000212111234304727700156630ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Much of the ACPI code is taken from Florian Schaefers * Acpi-Power Enlightenment epplet */ #ifdef __linux__ #include "apm.h" #include "defs.h" #include #include #include /* APM related stuff */ #define APM_PROC "/proc/apm" struct linux_apm_info { char driver_version[10]; int apm_version_major; int apm_version_minor; int apm_flags; int ac_line_status; int battery_status; int battery_flags; int battery_percentage; int battery_time; int using_minutes; }; /* ACPI related stuff */ static const char *const acpi_info[] = { "/proc/acpi/battery/0/info", "/proc/acpi/battery/1/info", "/proc/acpi/battery/BATA/info", "/proc/acpi/battery/BAT0/info", "/proc/acpi/battery/BAT1/info" }; static const char *const acpi_state[] = { "/proc/acpi/battery/0/status", "/proc/acpi/battery/1/status", "/proc/acpi/battery/BATA/state", "/proc/acpi/battery/BAT0/state", "/proc/acpi/battery/BAT1/state" }; #define ACPI_BT_CNT ARRAYSIZE(acpi_state) static const char *const acpi_ac[] = { "/proc/acpi/ac_adapter/0/status", "/proc/acpi/ac_adapter/AC/state", "/proc/acpi/ac_adapter/ACAD/state" }; #define ACPI_AC_CNT ARRAYSIZE(acpi_ac) #define USE_APM 1 #define USE_ACPI 2 static int method; static int fd_index; static int ac_power_on; /* Prototypes */ static int apm_read_apm(struct olsr_apm_info *); static int apm_read_acpi(struct olsr_apm_info *); static int acpi_probe(void); int apm_init(void) { struct olsr_apm_info ainfo; method = -1; OLSR_PRINTF(3, "Initializing APM\n"); if ((((fd_index = acpi_probe()) >= 0) || ac_power_on) && apm_read_acpi(&ainfo)) method = USE_ACPI; else if (apm_read_apm(&ainfo)) method = USE_APM; if (method != -1) apm_printinfo(&ainfo); return method; } void apm_printinfo(struct olsr_apm_info *ainfo) { OLSR_PRINTF(5, "APM info:\n\tAC status %d\n\tBattery percentage %d%%\n\tBattery time left %d mins\n\n", ainfo->ac_line_status, ainfo->battery_percentage, ainfo->battery_time_left); ainfo = NULL; /* squelch compiler warnings */ } int apm_read(struct olsr_apm_info *ainfo) { switch (method) { case USE_APM: return apm_read_apm(ainfo); case USE_ACPI: return apm_read_acpi(ainfo); default: break; } return 0; } static int apm_read_apm(struct olsr_apm_info *ainfo) { char buffer[100]; char units[10]; FILE *apm_procfile; struct linux_apm_info lainfo; /* Open procfile */ if ((apm_procfile = fopen(APM_PROC, "r")) == NULL) return 0; if (fgets(buffer, sizeof(buffer), apm_procfile) == NULL) { fclose(apm_procfile); /* Try re-opening the file */ if ((apm_procfile = fopen(APM_PROC, "r")) == NULL) return 0; if (fgets(buffer, sizeof(buffer), apm_procfile) == NULL) { /* Giving up */ fprintf(stderr, "OLSRD: Could not read APM info - setting willingness to default"); fclose(apm_procfile); return 0; } } fclose(apm_procfile); //printf("READ: %s\n", buffer); /* Get the info */ sscanf(buffer, "%10s %d.%d %x %x %x %x %d%% %d %10s\n", lainfo.driver_version, &lainfo.apm_version_major, &lainfo.apm_version_minor, &lainfo.apm_flags, &lainfo.ac_line_status, &lainfo.battery_status, &lainfo.battery_flags, &lainfo.battery_percentage, &lainfo.battery_time, units); lainfo.using_minutes = strncmp(units, "min", 3) ? 0 : 1; /* * Should take care of old APM type info here */ /* * Fix possible percentage error */ if (lainfo.battery_percentage > 100) lainfo.battery_percentage = -1; /* Fill the provided struct */ if (lainfo.ac_line_status) ainfo->ac_line_status = OLSR_AC_POWERED; else ainfo->ac_line_status = OLSR_BATTERY_POWERED; ainfo->battery_percentage = lainfo.battery_percentage; ainfo->battery_time_left = lainfo.battery_time; return 1; } static int apm_read_acpi(struct olsr_apm_info *ainfo) { FILE *fd; int bat_max = 5000; /* Find some sane value */ int bat_val = 0; /* reporbe in case ac status changed */ fd_index = acpi_probe(); /* No battery was found */ if (fd_index < 0) { /* but we have ac */ if (ac_power_on) { ainfo->ac_line_status = OLSR_AC_POWERED; ainfo->battery_percentage = -1; return 1; } /* not enough info */ return 0; } /* Get maxvalue */ if ((fd = fopen(acpi_info[fd_index], "r")) == NULL) return 0; for (;;) { char s1[32], s2[32], s3[32], s4[32], inbuff[127]; if (fgets(inbuff, sizeof(inbuff), fd) == NULL) break; sscanf(inbuff, "%32s %32s %32s %32s", s1, s2, s3, s4); if (!strcasecmp(s2, "full")) bat_max = atoi(s4); } fclose(fd); if ((fd = fopen(acpi_state[fd_index], "r")) == NULL) return 0; /* Extract battery status */ for (;;) { char s1[32], s2[32], s3[32], s4[32], inbuff[127]; if (fgets(inbuff, sizeof(inbuff), fd) == NULL) break; sscanf(inbuff, "%32s %32s %32s %32s", s1, s2, s3, s4); /* find remaining juice */ if (!strcasecmp(s1, "Remaining")) bat_val = atoi(s3); } fclose(fd); ainfo->ac_line_status = ac_power_on ? OLSR_AC_POWERED : OLSR_BATTERY_POWERED; /* sanitise ACPI battery data */ bat_max = abs(bat_max); bat_val = abs(bat_val); if (bat_val > bat_max) { bat_val = bat_max; } if (bat_max == 0) { /* protection against stupid acpi data */ ainfo->battery_percentage = 0; } else { ainfo->battery_percentage = (bat_val >= bat_max) ? 100 : (bat_val * 100 / bat_max); } return 1; } static int acpi_probe(void) { unsigned int i; /* First check for AC power */ ac_power_on = 0; for (i = 0; i < ACPI_AC_CNT; i++) { char s1[32], s2[32]; int rc; FILE *fd = fopen(acpi_ac[i], "r"); /* Try opening the info file */ if (fd == NULL) continue; /* Extract info */ rc = fscanf(fd, "%32s %32s", s1, s2); /* Close info entry */ fclose(fd); if (rc < 2) continue; /* Running on AC power */ if (!strcasecmp(s2, "on-line")) { /* ac power enabled */ ac_power_on = 1; break; } } /* Only checking the first found battery entry... */ for (i = 0; i < ACPI_BT_CNT; i++) { char s1[32], s2[32]; int rc; FILE *fd = fopen(acpi_info[i], "r"); /* Try opening the info file */ if (fd == NULL) continue; /* Extract info */ rc = fscanf(fd, "%32s %32s", s1, s2); /* Close info entry */ fclose(fd); if (rc < 2) continue; /* Check if battery is present */ if ((!strcasecmp(s1, "present:")) && (!strcasecmp(s2, "no"))) continue; /* Open the corresponding state file */ if ((fd = fopen(acpi_state[i], "r")) == NULL) continue; fclose(fd); return i; } /* No battery found */ return -1; } #endif /* __linux__ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/linux/kernel_routes_nl.c000066400000000000000000000504271234304727700204730ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * Copyright (c) 2007, Sven-Ola for the policy routing stuff * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef __linux__ #include "kernel_routes.h" #include "ipc_frontend.h" #include "log.h" #include "net_os.h" #include "ifnet.h" #include #include #include //ipip includes #include #include #include #include #include //ifup includes #include #include #include #include /* * The ARM compile complains about alignment. Copied * from /usr/include/linux/netlink.h and adapted for ARM */ #define MY_NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \ (struct nlmsghdr*)ARM_NOWARN_ALIGN((((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len))) static void rtnetlink_read(int sock, void *, unsigned int); struct olsr_rtreq { struct nlmsghdr n; struct rtmsg r; char buf[512]; }; struct olsr_ipadd_req { struct nlmsghdr n; struct ifaddrmsg ifa; char buf[256]; }; int rtnetlink_register_socket(int rtnl_mgrp) { int sock = socket(AF_NETLINK,SOCK_RAW,NETLINK_ROUTE); struct sockaddr_nl addr; if (sock<0) { OLSR_PRINTF(1,"could not create rtnetlink socket! %s (%d)", strerror(errno), errno); return -1; } memset(&addr, 0, sizeof(addr)); addr.nl_family = AF_NETLINK; addr.nl_pid = 0; //kernel will assign appropiate number instead of pid (which is already used by primaray rtnetlink socket to add/delete routes) addr.nl_groups = rtnl_mgrp; if (bind(sock,(struct sockaddr *)&addr,sizeof(addr))<0) { OLSR_PRINTF(1,"could not bind rtnetlink socket! %s (%d)",strerror(errno), errno); close (sock); return -1; } add_olsr_socket(sock, NULL, &rtnetlink_read, NULL, SP_IMM_READ); return sock; } static void netlink_process_link(struct nlmsghdr *h) { struct ifinfomsg *ifi = (struct ifinfomsg *) NLMSG_DATA(h); struct interface *iface; struct olsr_if *oif; char namebuffer[IF_NAMESIZE]; iface = if_ifwithindex(ifi->ifi_index); oif = NULL; if (iface == NULL && (ifi->ifi_flags & (IFF_UP|IFF_RUNNING)) == (IFF_UP|IFF_RUNNING)) { if (if_indextoname(ifi->ifi_index, namebuffer)) { if ((oif = olsrif_ifwithname(namebuffer)) != NULL) { /* try to take interface up, will trigger ifchange */ chk_if_up(oif, 3); } } } else if (iface != NULL && (ifi->ifi_flags & IFF_UP) == 0) { /* try to take interface down, will trigger ifchange */ olsr_remove_interface(iface->olsr_if); } if (iface == NULL && oif == NULL) { /* this is not an OLSR interface */ if ((ifi->ifi_flags & IFF_UP) != 0 && (ifi->ifi_flags & IFF_RUNNING) != 0) { olsr_trigger_ifchange(ifi->ifi_index, NULL, IFCHG_IF_ADD); } else if ((ifi->ifi_flags & IFF_UP) == 0 && (ifi->ifi_flags & IFF_RUNNING) == 0){ olsr_trigger_ifchange(ifi->ifi_index, NULL, IFCHG_IF_REMOVE); } } } static void rtnetlink_read(int sock, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { int len, plen; struct iovec iov; struct sockaddr_nl nladdr; struct msghdr msg = { &nladdr, sizeof(nladdr), &iov, 1, NULL, 0, 0 }; char buffer[4096]; struct nlmsghdr *nlh = (struct nlmsghdr *)ARM_NOWARN_ALIGN(buffer); int ret; iov.iov_base = (void *) buffer; iov.iov_len = sizeof(buffer); while ((ret = recvmsg(sock, &msg, MSG_DONTWAIT)) >= 0) { /*check message*/ len = nlh->nlmsg_len; plen = len - sizeof(nlh); if (len > ret || plen < 0) { OLSR_PRINTF(1,"Malformed netlink message: " "len=%d left=%d plen=%d\n", len, ret, plen); return; } OLSR_PRINTF(3, "Netlink message received: type 0x%x\n", nlh->nlmsg_type); if ((nlh->nlmsg_type == RTM_NEWLINK) || ( nlh->nlmsg_type == RTM_DELLINK)) { /* handle ifup/ifdown */ netlink_process_link(nlh); } } if (errno != EAGAIN) { OLSR_PRINTF(1,"netlink listen error %u - %s\n",errno,strerror(errno)); } } static void olsr_netlink_addreq(struct nlmsghdr *n, size_t reqSize __attribute__ ((unused)), int type, const void *data, int len) { struct rtattr *rta = (struct rtattr *)ARM_NOWARN_ALIGN(((char *)n) + NLMSG_ALIGN(n->nlmsg_len)); n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + RTA_LENGTH(len); //produces strange compile error //assert(n->nlmsg_len < reqSize); rta->rta_type = type; rta->rta_len = RTA_LENGTH(len); memcpy(RTA_DATA(rta), data, len); } /*rt_entry and nexthop and family and table must only be specified with an flag != RT_NONE && != RT_LO_IP*/ static int olsr_netlink_send(struct nlmsghdr *nl_hdr) { char rcvbuf[1024]; struct iovec iov; struct sockaddr_nl nladdr; struct msghdr msg; struct nlmsghdr *h; struct nlmsgerr *l_err; int ret; memset(&nladdr, 0, sizeof(nladdr)); memset(&msg, 0, sizeof(msg)); nladdr.nl_family = AF_NETLINK; msg.msg_name = &nladdr; msg.msg_namelen = sizeof(nladdr); msg.msg_iov = &iov; msg.msg_iovlen = 1; iov.iov_base = nl_hdr; iov.iov_len = nl_hdr->nlmsg_len; ret = sendmsg(olsr_cnf->rtnl_s, &msg, 0); if (ret <= 0) { olsr_syslog(OLSR_LOG_ERR, "Cannot send data to netlink socket (%d: %s)", errno, strerror(errno)); return -1; } iov.iov_base = rcvbuf; iov.iov_len = sizeof(rcvbuf); ret = recvmsg(olsr_cnf->rtnl_s, &msg, 0); if (ret <= 0) { olsr_syslog(OLSR_LOG_ERR, "Error while reading answer to netlink message (%d: %s)", errno, strerror(errno)); return -1; } h = (struct nlmsghdr *)ARM_NOWARN_ALIGN(rcvbuf); if (!NLMSG_OK(h, (unsigned int)ret)) { olsr_syslog(OLSR_LOG_ERR, "Received netlink message was malformed (ret=%d, %u)", ret, h->nlmsg_len); return -1; } if (h->nlmsg_type != NLMSG_ERROR) { olsr_syslog(OLSR_LOG_INFO, "Received unknown netlink response: %u bytes, type %u (not %u) with seqnr %u and flags %u from %u", h->nlmsg_len, h->nlmsg_type, NLMSG_ERROR, h->nlmsg_seq, h->nlmsg_flags, h->nlmsg_pid); return -1; } if (NLMSG_LENGTH(sizeof(struct nlmsgerr)) > h->nlmsg_len) { olsr_syslog(OLSR_LOG_INFO,"Received invalid netlink message size %lu != %u", (unsigned long int)sizeof(struct nlmsgerr), h->nlmsg_len); return -1; } l_err = (struct nlmsgerr *)NLMSG_DATA(h); if (l_err->error) { olsr_syslog(OLSR_LOG_INFO,"Received netlink error code %s (%d)", strerror(-l_err->error), l_err->error); } return -l_err->error; } int olsr_os_policy_rule(int family, int rttable, uint32_t priority, const char *if_name, bool set) { struct olsr_rtreq req; int err; memset(&req, 0, sizeof(req)); req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK; req.n.nlmsg_type = set ? RTM_NEWRULE : RTM_DELRULE; req.r.rtm_family = family; req.r.rtm_table = rttable; /* probably unneeded */ req.r.rtm_type = RTN_UNICAST; olsr_netlink_addreq(&req.n, sizeof(req), RTA_PRIORITY, &priority, sizeof(priority)); if (if_name != NULL) { /*add interface name to rule*/ olsr_netlink_addreq(&req.n, sizeof(req), RTA_IIF, if_name, strlen(if_name)+1); } err = olsr_netlink_send(&req.n); if (err) { olsr_syslog(OLSR_LOG_ERR,"Error on %s policy rule aimed to activate RtTable %u!", set ? "inserting" : "deleting", rttable); } return err; } static int olsr_add_ip(int ifindex, union olsr_ip_addr *ip, const char *l, bool create) { struct olsr_ipadd_req req; memset(&req, 0, sizeof(req)); req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)); if (create) { req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_REPLACE | NLM_F_ACK; req.n.nlmsg_type = RTM_NEWADDR; } else { req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; req.n.nlmsg_type = RTM_DELADDR; } req.ifa.ifa_family = olsr_cnf->ip_version; olsr_netlink_addreq(&req.n, sizeof(req), IFA_LOCAL, ip, olsr_cnf->ipsize); if (l) { olsr_netlink_addreq(&req.n, sizeof(req), IFA_LABEL, l, strlen(l) + 1); } req.ifa.ifa_prefixlen = olsr_cnf->ipsize * 8; req.ifa.ifa_index = ifindex; return olsr_netlink_send(&req.n); } int olsr_os_localhost_if(union olsr_ip_addr *ip, bool create) { static char l[] = "lo:olsr"; return olsr_add_ip(if_nametoindex("lo"), ip, l, create); } int olsr_os_ifip(int ifindex, union olsr_ip_addr *ip, bool create) { return olsr_add_ip(ifindex, ip, NULL, create); } static int olsr_new_netlink_route(int family, int rttable, int if_index, int metric, int protocol, const union olsr_ip_addr *src, const union olsr_ip_addr *gw, const struct olsr_ip_prefix *dst, bool set, bool del_similar) { struct olsr_rtreq req; int family_size; int err; if (0) { struct ipaddr_str buf1, buf2; olsr_syslog(OLSR_LOG_INFO, "new_netlink_route: family=%d,rttable=%d,if_index=%d,metric=%d,protocol=%d,src=%s,gw=%s,dst=%s,set=%s,del_similar=%s", family, rttable, if_index, metric, protocol, src == NULL ? "" : olsr_ip_to_string(&buf1, src), gw == NULL ? "" : olsr_ip_to_string(&buf2, gw), olsr_ip_prefix_to_string(dst), set ? "true" : "false", del_similar ? "true" : "false"); } family_size = family == AF_INET ? sizeof(struct in_addr) : sizeof(struct in6_addr); memset(&req, 0, sizeof(req)); req.r.rtm_flags = RTNH_F_ONLINK; req.r.rtm_family = family; req.r.rtm_table = rttable; req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; if (set) { req.n.nlmsg_flags |= NLM_F_CREATE | NLM_F_REPLACE; req.n.nlmsg_type = RTM_NEWROUTE; } else { req.n.nlmsg_type = RTM_DELROUTE; } /* RTN_UNSPEC would be the wildcard, but blackhole broadcast or nat roules should usually not conflict */ /* -> olsr only adds deletes unicast routes */ req.r.rtm_type = RTN_UNICAST; req.r.rtm_dst_len = dst->prefix_len; if (set) { /* add protocol for setting a route */ req.r.rtm_protocol = protocol; } /* calculate scope of operation */ if (!set && del_similar) { /* as wildcard for fuzzy deletion */ req.r.rtm_scope = RT_SCOPE_NOWHERE; } else { /* for all our routes */ req.r.rtm_scope = RT_SCOPE_UNIVERSE; } if (set || !del_similar) { /* add interface*/ olsr_netlink_addreq(&req.n, sizeof(req), RTA_OIF, &if_index, sizeof(if_index)); } if (set && src != NULL) { /* add src-ip */ olsr_netlink_addreq(&req.n, sizeof(req), RTA_PREFSRC, src, family_size); } if (metric != -1) { /* add metric */ olsr_netlink_addreq(&req.n, sizeof(req), RTA_PRIORITY, &metric, sizeof(metric)); } if (gw) { /* add gateway */ olsr_netlink_addreq(&req.n, sizeof(req), RTA_GATEWAY, gw, family_size); } else { if ( dst->prefix_len == 32 ) { /* use destination as gateway, to 'force' linux kernel to do proper source address selection */ olsr_netlink_addreq(&req.n, sizeof(req), RTA_GATEWAY, &dst->prefix, family_size); } else { /*do not use onlink on such routes(no gateway, but no hostroute aswell) - e.g. smartgateway default route over an ptp tunnel interface*/ req.r.rtm_flags &= (~RTNH_F_ONLINK); } } /* add destination */ olsr_netlink_addreq(&req.n, sizeof(req), RTA_DST, &dst->prefix, family_size); err = olsr_netlink_send(&req.n); if (err) { struct ipaddr_str buf; if (gw) { olsr_syslog(OLSR_LOG_ERR, ". error: %s route to %s via %s dev %s onlink (%s %d)", set ? "add" : "del", olsr_ip_prefix_to_string(dst), olsr_ip_to_string(&buf, gw), if_ifwithindex_name(if_index), strerror(errno), errno); } else { olsr_syslog(OLSR_LOG_ERR, ". error: %s route to %s via %s dev %s onlink (%s %d)", set ? "add" : "del", olsr_ip_prefix_to_string(dst), olsr_ip_to_string(&buf, &dst->prefix), if_ifwithindex_name(if_index), strerror(errno), errno); } } return err; } void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6, bool set) { if (olsr_new_netlink_route(AF_INET6, ip_prefix_is_mappedv4_inetgw(dst_v6) ? olsr_cnf->rt_table_default : olsr_cnf->rt_table, olsr_cnf->niit6to4_if_index, RT_METRIC_DEFAULT, olsr_cnf->rt_proto, NULL, NULL, dst_v6, set, false)) { olsr_syslog(OLSR_LOG_ERR, ". error while %s static niit route to %s", set ? "setting" : "removing", olsr_ip_prefix_to_string(dst_v6)); } } void olsr_os_niit_4to6_route(const struct olsr_ip_prefix *dst_v4, bool set) { if (olsr_new_netlink_route(AF_INET, ip_prefix_is_v4_inetgw(dst_v4) ? olsr_cnf->rt_table_default : olsr_cnf->rt_table, olsr_cnf->niit4to6_if_index, RT_METRIC_DEFAULT, olsr_cnf->rt_proto, NULL, NULL, dst_v4, set, false)) { olsr_syslog(OLSR_LOG_ERR, ". error while %s niit route to %s", set ? "setting" : "removing", olsr_ip_prefix_to_string(dst_v4)); } } void olsr_os_inetgw_tunnel_route(uint32_t if_idx, bool ipv4, bool set, uint8_t table) { const struct olsr_ip_prefix *dst; assert(olsr_cnf->ip_version == AF_INET6 || ipv4); dst = ipv4 ? &ipv4_internet_route : &ipv6_internet_route; if (olsr_new_netlink_route(ipv4 ? AF_INET : AF_INET6, table, if_idx, RT_METRIC_DEFAULT, olsr_cnf->rt_proto, NULL, NULL, dst, set, false)) { olsr_syslog(OLSR_LOG_ERR, ". error while %s inetgw tunnel route to %s for if %d", set ? "setting" : "removing", olsr_ip_prefix_to_string(dst), if_idx); } } static int olsr_os_process_rt_entry(int af_family, const struct rt_entry *rt, bool set) { int metric, table; const struct rt_nexthop *nexthop; union olsr_ip_addr *src; bool hostRoute; int err; /* calculate metric */ if (FIBM_FLAT == olsr_cnf->fib_metric) { metric = RT_METRIC_DEFAULT; } else { metric = set ? rt->rt_best->rtp_metric.hops : rt->rt_metric.hops; } if (olsr_cnf->smart_gw_active && is_prefix_inetgw(&rt->rt_dst)) { /* make space for the tunnel gateway route */ metric += 2; } /* get table */ table = is_prefix_inetgw(&rt->rt_dst) ? olsr_cnf->rt_table_default : olsr_cnf->rt_table; /* get next hop */ if (rt->rt_best && set) { nexthop = &rt->rt_best->rtp_nexthop; } else { nexthop = &rt->rt_nexthop; } /* detect 1-hop hostroute */ hostRoute = rt->rt_dst.prefix_len == olsr_cnf->ipsize * 8 && ipequal(&nexthop->gateway, &rt->rt_dst.prefix); /* get src ip */ if (olsr_cnf->use_src_ip_routes) { src = &olsr_cnf->unicast_src_ip; } else { src = NULL; } /* create route */ err = olsr_new_netlink_route(af_family, table, nexthop->iif_index, metric, olsr_cnf->rt_proto, src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false); /* resolve "File exist" (17) propblems (on orig and autogen routes)*/ if (set && err == 17) { /* a similar route going over another gateway may be present, which has to be deleted! */ olsr_syslog(OLSR_LOG_ERR, ". auto-deleting similar routes to resolve 'File exists' (17) while adding route!"); /* erase similar rule */ err = olsr_new_netlink_route(af_family, table, 0, 0, -1, NULL, NULL, &rt->rt_dst, false, true); if (!err) { /* create this rule a second time if delete worked*/ err = olsr_new_netlink_route(af_family, table, nexthop->iif_index, metric, olsr_cnf->rt_proto, src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false); } olsr_syslog(OLSR_LOG_ERR, ". %s (%d)", err == 0 ? "successful" : "failed", err); } /* report success on "No such process" (3) */ else if (!set && err == 3) { /* another similar (but slightly different) route may be present at this point, * if so this will get solved when adding new route to this destination */ olsr_syslog(OLSR_LOG_ERR, ". ignoring 'No such process' (3) while deleting route!"); err = 0; } /* insert route to gateway on the fly if "Network unreachable" (128) on 2.4 kernels * or on 2.6 kernel No such process (3) or Network unreachable (101) is reported in rtnetlink response * do this only with flat metric, as using metric values inherited from * a target behind the gateway is really strange, and could lead to multiple routes! * anyways if invalid gateway ips may happen we are f*cked up!! * but if not, these on the fly generated routes are no problem, and will only get used when needed */ else if (!hostRoute && olsr_cnf->fib_metric == FIBM_FLAT && (err == 128 || err == 101 || err == 3)) { struct olsr_ip_prefix hostPrefix; if (err == 128) { olsr_syslog(OLSR_LOG_ERR, ". autogenerating route to handle 'Network unreachable' (128) while adding route!"); } else if (err == 101) { olsr_syslog(OLSR_LOG_ERR, ". autogenerating route to handle 'Network unreachable' (101) while adding route!"); } else { olsr_syslog(OLSR_LOG_ERR, ". autogenerating route to handle 'No such process' (3) while adding route!"); } /* create hostroute */ hostPrefix.prefix = nexthop->gateway; hostPrefix.prefix_len = olsr_cnf->ipsize * 8; err = olsr_new_netlink_route(af_family, olsr_cnf->rt_table, nexthop->iif_index, metric, olsr_cnf->rt_proto, src, NULL, &hostPrefix, true, false); if (err == 0) { /* create this rule a second time if hostrule generation was successful */ err = olsr_new_netlink_route(af_family, table, nexthop->iif_index, metric, olsr_cnf->rt_proto, src, &nexthop->gateway, &rt->rt_dst, set, false); } olsr_syslog(OLSR_LOG_ERR, ". %s (%d)", err == 0 ? "successful" : "failed", err); } return err; } /** * Insert a route in the kernel routing table * * @param rt the route to add * * @return negative on error */ int olsr_ioctl_add_route(const struct rt_entry *rt) { OLSR_PRINTF(2, "KERN: Adding %s\n", olsr_rtp_to_string(rt->rt_best)); return olsr_os_process_rt_entry(AF_INET, rt, true); } /** *Insert a route in the kernel routing table * *@param rt the route to add * *@return negative on error */ int olsr_ioctl_add_route6(const struct rt_entry *rt) { OLSR_PRINTF(2, "KERN: Adding %s\n", olsr_rtp_to_string(rt->rt_best)); return olsr_os_process_rt_entry(AF_INET6, rt, true); } /** *Remove a route from the kernel * *@param rt the route to remove * *@return negative on error */ int olsr_ioctl_del_route(const struct rt_entry *rt) { OLSR_PRINTF(2, "KERN: Deleting %s\n", olsr_rt_to_string(rt)); return olsr_os_process_rt_entry(AF_INET, rt, false); } /** *Remove a route from the kernel * *@param rt the route to remove * *@return negative on error */ int olsr_ioctl_del_route6(const struct rt_entry *rt) { OLSR_PRINTF(2, "KERN: Deleting %s\n", olsr_rt_to_string(rt)); return olsr_os_process_rt_entry(AF_INET6, rt, false); } #endif /* __linux__ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/linux/kernel_tunnel.c000066400000000000000000000175351234304727700177710ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * Copyright (c) 2007, Sven-Ola for the policy routing stuff * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef __linux__ #include "kernel_tunnel.h" #include "kernel_routes.h" #include "log.h" #include "olsr_types.h" #include "net_os.h" #include "olsr_cookie.h" #include "ipcalc.h" #include //ipip includes #include #include #include #include #include #include #include #if !defined LINUX_VERSION_CODE || !defined KERNEL_VERSION #error "Both LINUX_VERSION_CODE and KERNEL_VERSION need to be defined" #endif /* !defined LINUX_VERSION_CODE || !defined KERNEL_VERSION */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) #define LINUX_IPV6_TUNNEL #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) */ #ifdef LINUX_IPV6_TUNNEL #include #endif /* LINUX_IPV6_TUNNEL */ //ifup includes #include #include #include #include static bool store_iptunnel_state; static struct olsr_cookie_info *tunnel_cookie; static struct avl_tree tunnel_tree; int olsr_os_init_iptunnel(const char * dev) { tunnel_cookie = olsr_alloc_cookie("iptunnel", OLSR_COOKIE_TYPE_MEMORY); olsr_cookie_set_memory_size(tunnel_cookie, sizeof(struct olsr_iptunnel_entry)); avl_init(&tunnel_tree, avl_comp_default); store_iptunnel_state = olsr_if_isup(dev); if (store_iptunnel_state) { return 0; } if (olsr_if_set_state(dev, true)) { return -1; } return olsr_os_ifip(if_nametoindex(dev), &olsr_cnf->main_addr, true); } void olsr_os_cleanup_iptunnel(const char * dev) { while (tunnel_tree.count > 0) { struct olsr_iptunnel_entry *t; /* kill tunnel */ t = (struct olsr_iptunnel_entry *)avl_walk_first(&tunnel_tree); t->usage = 1; olsr_os_del_ipip_tunnel(t); } if (olsr_cnf->smart_gw_always_remove_server_tunnel || !store_iptunnel_state) { olsr_if_set_state(dev, false); } olsr_free_cookie(tunnel_cookie); } /** * creates an ipip tunnel (for ipv4 or ipv6) * * @param name interface name * @param target pointer to tunnel target IP, NULL if tunnel should be removed. * Must be of type 'in_addr_t *' for ipv4 and of type 'struct in6_addr *' for * ipv6 * @return 0 if an error happened, * if_index for successful created tunnel, 1 for successful deleted tunnel */ static int os_ip_tunnel(const char *name, void *target) { struct ifreq ifr; int err; void * p; char buffer[INET6_ADDRSTRLEN]; const char * tunName; struct ip_tunnel_parm p4; #ifdef LINUX_IPV6_TUNNEL struct ip6_tnl_parm p6; #endif /* LINUX_IPV6_TUNNEL */ assert (name != NULL); memset(&ifr, 0, sizeof(ifr)); if (olsr_cnf->ip_version == AF_INET) { p = &p4; tunName = TUNNEL_ENDPOINT_IF; memset(&p4, 0, sizeof(p4)); p4.iph.version = 4; p4.iph.ihl = 5; p4.iph.ttl = 64; p4.iph.protocol = IPPROTO_IPIP; if (target) { p4.iph.daddr = *((in_addr_t *) target); } strscpy(p4.name, name, IFNAMSIZ); } else { #ifdef LINUX_IPV6_TUNNEL p = (void *) &p6; tunName = TUNNEL_ENDPOINT_IF6; memset(&p6, 0, sizeof(p6)); p6.proto = 0; /* any protocol */ if (target) { p6.raddr = *((struct in6_addr *) target); } strscpy(p6.name, name, IFNAMSIZ); #else /* LINUX_IPV6_TUNNEL */ return 0; #endif /* LINUX_IPV6_TUNNEL */ } strscpy(ifr.ifr_name, target != NULL ? tunName : name, IFNAMSIZ); ifr.ifr_ifru.ifru_data = p; if ((err = ioctl(olsr_cnf->ioctl_s, target != NULL ? SIOCADDTUNNEL : SIOCDELTUNNEL, &ifr))) { olsr_syslog(OLSR_LOG_ERR, "Cannot %s tunnel %s to %s: %s (%d)\n", target != NULL ? "add" : "remove", name, target != NULL ? inet_ntop(olsr_cnf->ip_version, target, buffer, sizeof(buffer)) : "-", strerror(errno), errno); return 0; } olsr_syslog(OLSR_LOG_INFO, "Tunnel %s %s, to %s", name, target != NULL ? "added" : "removed", target != NULL ? inet_ntop(olsr_cnf->ip_version, target, buffer, sizeof(buffer)) : "-"); return target != NULL ? if_nametoindex(name) : 1; } /** * demands an ipip tunnel to a certain target. If no tunnel exists it will be created * @param target ip address of the target * @param transportV4 true if IPv4 traffic is used, false for IPv6 traffic * @param name pointer to name string buffer (length IFNAMSIZ) * @return NULL if an error happened, pointer to olsr_iptunnel_entry otherwise */ struct olsr_iptunnel_entry *olsr_os_add_ipip_tunnel(union olsr_ip_addr *target, bool transportV4 __attribute__ ((unused)), char *name) { struct olsr_iptunnel_entry *t; assert(olsr_cnf->ip_version == AF_INET6 || transportV4); t = (struct olsr_iptunnel_entry *)avl_find(&tunnel_tree, target); if (t == NULL) { int if_idx; struct ipaddr_str buf; if_idx = os_ip_tunnel(name, (olsr_cnf->ip_version == AF_INET) ? (void *) &target->v4.s_addr : (void *) &target->v6); if (if_idx == 0) { // cannot create tunnel olsr_syslog(OLSR_LOG_ERR, "Cannot create tunnel %s\n", name); return NULL; } if (olsr_if_set_state(name, true)) { os_ip_tunnel(name, NULL); return NULL; } /* set originator IP for tunnel */ olsr_os_ifip(if_idx, &olsr_cnf->main_addr, true); t = olsr_cookie_malloc(tunnel_cookie); memcpy(&t->target, target, sizeof(*target)); t->node.key = &t->target; strscpy(t->if_name, name, IFNAMSIZ); t->if_index = if_idx; avl_insert(&tunnel_tree, &t->node, AVL_DUP_NO); } t->usage++; return t; } /** * Release an olsr ipip tunnel. Tunnel will be deleted * if this was the last user * @param t pointer to olsr_iptunnel_entry * @param cleanup true to free t's memory */ static void internal_olsr_os_del_ipip_tunnel(struct olsr_iptunnel_entry *t, bool cleanup) { if (!cleanup) { if (t->usage == 0) { return; } t->usage--; if (t->usage > 0) { return; } } olsr_if_set_state(t->if_name, false); os_ip_tunnel(t->if_name, NULL); avl_delete(&tunnel_tree, &t->node); if (!cleanup) { olsr_cookie_free(tunnel_cookie, t); } } void olsr_os_del_ipip_tunnel(struct olsr_iptunnel_entry *t) { internal_olsr_os_del_ipip_tunnel(t, false); } #endif /* __linux__ */ olsrd-0.6.6.2/src/linux/lq_plugin_ffeth_nl80211.c000066400000000000000000000343261234304727700213540ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * Copyright (c) 2012 Fox-IT B.V. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef __linux__ #ifdef LINUX_NL80211 /* Optional - not supported on all platforms */ #include "lq_plugin_ffeth_nl80211.h" #include "tc_set.h" #include "link_set.h" #include "lq_plugin.h" #include "olsr_spf.h" #include "lq_packet.h" #include "packet.h" #include "olsr.h" #include "parser.h" #include "fpm.h" #include "mid_set.h" #include "scheduler.h" #include "log.h" #ifdef LINUX_NL80211 #include "nl80211_link_info.h" #define WEIGHT_ETX 50 #define WEIGHT_BANDWIDTH 50 #endif #define LQ_PLUGIN_LC_MULTIPLIER 1024 #define LQ_PLUGIN_RELEVANT_COSTCHANGE_FF 16 static void lq_initialize_ffeth_nl80211(void); static olsr_linkcost lq_calc_cost_ffeth_nl80211(const void *lq); static void lq_packet_loss_worker_ffeth_nl80211(struct link_entry *link, void *lq, bool lost); static void lq_memorize_foreign_hello_ffeth_nl80211(void *local, void *foreign); static int lq_serialize_hello_lq_pair_ffeth_nl80211(unsigned char *buff, void *lq); static void lq_deserialize_hello_lq_pair_ffeth_nl80211(const uint8_t ** curr, void *lq); static int lq_serialize_tc_lq_pair_ffeth_nl80211(unsigned char *buff, void *lq); static void lq_deserialize_tc_lq_pair_ffeth_nl80211(const uint8_t ** curr, void *lq); static void lq_copy_link2neigh_ffeth_nl80211(void *t, void *s); static void lq_copy_link2tc_ffeth_nl80211(void *target, void *source); static void lq_clear_ffeth_nl80211(void *target); static void lq_clear_ffeth_nl80211_hello(void *target); static const char *lq_print_ffeth_nl80211(void *ptr, char separator, struct lqtextbuffer *buffer); static const char *lq_print_cost_ffeth_nl80211(olsr_linkcost cost, struct lqtextbuffer *buffer); /* etx lq plugin (freifunk fpm version) settings */ struct lq_handler lq_etx_ffeth_nl80211_handler = { &lq_initialize_ffeth_nl80211, &lq_calc_cost_ffeth_nl80211, &lq_calc_cost_ffeth_nl80211, &lq_packet_loss_worker_ffeth_nl80211, &lq_memorize_foreign_hello_ffeth_nl80211, &lq_copy_link2neigh_ffeth_nl80211, &lq_copy_link2tc_ffeth_nl80211, &lq_clear_ffeth_nl80211_hello, &lq_clear_ffeth_nl80211, &lq_serialize_hello_lq_pair_ffeth_nl80211, &lq_serialize_tc_lq_pair_ffeth_nl80211, &lq_deserialize_hello_lq_pair_ffeth_nl80211, &lq_deserialize_tc_lq_pair_ffeth_nl80211, &lq_print_ffeth_nl80211, &lq_print_ffeth_nl80211, &lq_print_cost_ffeth_nl80211, sizeof(struct lq_ffeth_hello), sizeof(struct lq_ffeth), 4, 4 }; static void lq_ffeth_nl80211_handle_lqchange(void) { struct lq_ffeth_hello *lq; struct ipaddr_str buf; struct link_entry *link; bool triggered = false; OLSR_FOR_ALL_LINK_ENTRIES(link) { bool relevant = false; lq = (struct lq_ffeth_hello *)link->linkquality; #if 0 fprintf(stderr, "%s: old = %u/%u new = %u/%u\n", olsr_ip_to_string(&buf, &link->neighbor_iface_addr), lq->smoothed_lq.valueLq, lq->smoothed_lq.valueNlq, lq->lq.valueLq, lq->lq.valueNlq); #endif if (lq->smoothed_lq.valueLq < lq->lq.valueLq) { if (lq->lq.valueLq >= 254 || lq->lq.valueLq - lq->smoothed_lq.valueLq > lq->smoothed_lq.valueLq/10) { relevant = true; } } else if (lq->smoothed_lq.valueLq > lq->lq.valueLq) { if (lq->smoothed_lq.valueLq - lq->lq.valueLq > lq->smoothed_lq.valueLq/10) { relevant = true; } } if (lq->smoothed_lq.valueNlq < lq->lq.valueNlq) { if (lq->lq.valueNlq >= 254 || lq->lq.valueNlq - lq->smoothed_lq.valueNlq > lq->smoothed_lq.valueNlq/10) { relevant = true; } } else if (lq->smoothed_lq.valueNlq > lq->lq.valueNlq) { if (lq->smoothed_lq.valueNlq - lq->lq.valueNlq > lq->smoothed_lq.valueNlq/10) { relevant = true; } } if (relevant) { memcpy(&lq->smoothed_lq, &lq->lq, sizeof(struct lq_ffeth)); link->linkcost = lq_calc_cost_ffeth_nl80211(&lq->smoothed_lq); triggered = true; } } OLSR_FOR_ALL_LINK_ENTRIES_END(link) if (!triggered) { return; } OLSR_FOR_ALL_LINK_ENTRIES(link) { lq = (struct lq_ffeth_hello *)link->linkquality; if (lq->smoothed_lq.valueLq >= 254 && lq->smoothed_lq.valueNlq >= 254) { continue; } if (lq->smoothed_lq.valueLq == lq->lq.valueLq && lq->smoothed_lq.valueNlq == lq->lq.valueNlq) { continue; } memcpy(&lq->smoothed_lq, &lq->lq, sizeof(struct lq_ffeth)); link->linkcost = lq_calc_cost_ffeth_nl80211(&lq->smoothed_lq); } OLSR_FOR_ALL_LINK_ENTRIES_END(link) olsr_relevant_linkcost_change(); } static void lq_parser_ffeth_nl80211(struct olsr *olsr, struct interface *in_if, union olsr_ip_addr *from_addr) { const union olsr_ip_addr *main_addr; struct link_entry *lnk; struct lq_ffeth_hello *lq; uint32_t seq_diff; /* Find main address */ main_addr = mid_lookup_main_addr(from_addr); /* Loopup link entry */ lnk = lookup_link_entry(from_addr, main_addr, in_if); if (lnk == NULL) { return; } lq = (struct lq_ffeth_hello *)lnk->linkquality; /* ignore double package */ if (lq->last_seq_nr == olsr->olsr_seqno) { struct ipaddr_str buf; olsr_syslog(OLSR_LOG_INFO, "detected duplicate packet with seqnr %d from %s on %s (%d Bytes)", olsr->olsr_seqno,olsr_ip_to_string(&buf, from_addr),in_if->int_name,ntohs(olsr->olsr_packlen)); return; } if (lq->last_seq_nr > olsr->olsr_seqno) { seq_diff = (uint32_t) olsr->olsr_seqno + 65536 - lq->last_seq_nr; } else { seq_diff = olsr->olsr_seqno - lq->last_seq_nr; } /* Jump in sequence numbers ? */ if (seq_diff > 256) { seq_diff = 1; } lq->received[lq->activePtr]++; lq->total[lq->activePtr] += seq_diff; lq->last_seq_nr = olsr->olsr_seqno; lq->missed_hellos = 0; } static void lq_ffeth_nl80211_timer(void __attribute__ ((unused)) * context) { struct link_entry *link; #ifdef LINUX_NL80211 nl80211_link_info_get(); #endif OLSR_FOR_ALL_LINK_ENTRIES(link) { struct lq_ffeth_hello *tlq = (struct lq_ffeth_hello *)link->linkquality; fpm ratio; int i, received, total; received = 0; total = 0; /* enlarge window if still in quickstart phase */ if (tlq->windowSize < LQ_FFETH_WINDOW) { tlq->windowSize++; } for (i = 0; i < tlq->windowSize; i++) { received += tlq->received[i]; total += tlq->total[i]; } /* calculate link quality */ if (total == 0) { tlq->lq.valueLq = 0; } else { // start with link-loss-factor ratio = fpmidiv(itofpm(link->loss_link_multiplier), LINK_LOSS_MULTIPLIER); /* keep missed hello periods in mind (round up hello interval to seconds) */ if (tlq->missed_hellos > 1) { received = received - received * tlq->missed_hellos * link->inter->hello_etime/1000 / LQ_FFETH_WINDOW; } // calculate received/total factor ratio = fpmmuli(ratio, received); ratio = fpmidiv(ratio, total); ratio = fpmmuli(ratio, 255); tlq->lq.valueLq = (uint8_t) (fpmtoi(ratio)); } /* ethernet booster */ if (link->inter->mode == IF_MODE_ETHER) { if (tlq->lq.valueLq > (uint8_t)(0.95 * 255)) { tlq->perfect_eth = true; } else if (tlq->lq.valueLq > (uint8_t)(0.90 * 255)) { tlq->perfect_eth = false; } if (tlq->perfect_eth) { tlq->lq.valueLq = 255; } } else if (link->inter->mode != IF_MODE_ETHER && tlq->lq.valueLq > 0) { tlq->lq.valueLq--; } // shift buffer tlq->activePtr = (tlq->activePtr + 1) % LQ_FFETH_WINDOW; tlq->total[tlq->activePtr] = 0; tlq->received[tlq->activePtr] = 0; } OLSR_FOR_ALL_LINK_ENTRIES_END(link); lq_ffeth_nl80211_handle_lqchange(); } static void lq_initialize_ffeth_nl80211(void) { if (olsr_cnf->lq_nat_thresh < 1.0f) { fprintf(stderr, "Warning, nat_treshold < 1.0 is more likely to produce loops with etx_ffeth\n"); } olsr_packetparser_add_function(&lq_parser_ffeth_nl80211); olsr_start_timer(1000, 0, OLSR_TIMER_PERIODIC, &lq_ffeth_nl80211_timer, NULL, 0); #ifdef LINUX_NL80211 nl80211_link_info_init(); #endif } static olsr_linkcost lq_calc_cost_ffeth_nl80211(const void *ptr) { const struct lq_ffeth *lq = ptr; olsr_linkcost cost; bool ether; int lq_int, nlq_int; #ifdef LINUX_NL80211 fpm nl80211 = itofpm((int) lq->valueBandwidth + lq->valueRSSI); #endif // MINIMAL_USEFUL_LQ is a float, multiplying by 255 converts it to uint8_t if (lq->valueLq < (unsigned int)(255 * MINIMAL_USEFUL_LQ) || lq->valueNlq < (unsigned int)(255 * MINIMAL_USEFUL_LQ)) { return LINK_COST_BROKEN; } ether = lq->valueLq == 255 && lq->valueNlq == 255; lq_int = (int)lq->valueLq; if (lq_int > 0 && lq_int < 255) { lq_int++; } nlq_int = (int)lq->valueNlq; if (nlq_int > 0 && nlq_int < 255) { nlq_int++; } #ifdef LINUX_NL80211 nl80211 = fpmidiv(nl80211, 255); cost = fpmidiv(itofpm(255 * 255), lq_int * nlq_int); // 1 / (LQ * NLQ) cost = fpmadd(cost, nl80211); #else cost = fpmidiv(itofpm(255 * 255), lq_int * nlq_int); // 1 / (LQ * NLQ) #endif if (ether) { /* ethernet boost */ cost /= 10; } if (cost > LINK_COST_BROKEN) return LINK_COST_BROKEN; if (cost == 0) return 1; return cost; } static int lq_serialize_hello_lq_pair_ffeth_nl80211(unsigned char *buff, void *ptr) { struct lq_ffeth *lq = ptr; #ifdef LINUX_NL80211 buff[0] = lq->valueBandwidth; buff[1] = lq->valueRSSI; #else buff[0] = (unsigned char)(0); buff[1] = (unsigned char)(0); #endif buff[2] = (unsigned char)lq->valueLq; buff[3] = (unsigned char)lq->valueNlq; return 4; } static void lq_deserialize_hello_lq_pair_ffeth_nl80211(const uint8_t ** curr, void *ptr) { struct lq_ffeth *lq = ptr; #ifdef LINUX_NL80211 pkt_get_u8(curr, &lq->valueBandwidth); pkt_get_u8(curr, &lq->valueRSSI); #else pkt_ignore_u16(curr); #endif pkt_get_u8(curr, &lq->valueLq); pkt_get_u8(curr, &lq->valueNlq); } static int lq_serialize_tc_lq_pair_ffeth_nl80211(unsigned char *buff, void *ptr) { struct lq_ffeth *lq = ptr; #ifdef LINUX_NL80211 buff[0] = lq->valueBandwidth; buff[1] = lq->valueRSSI; #else buff[0] = (unsigned char)(0); buff[1] = (unsigned char)(0); #endif buff[2] = (unsigned char)lq->valueLq; buff[3] = (unsigned char)lq->valueNlq; return 4; } static void lq_deserialize_tc_lq_pair_ffeth_nl80211(const uint8_t ** curr, void *ptr) { struct lq_ffeth *lq = ptr; #ifdef LINUX_NL80211 pkt_get_u8(curr, &lq->valueBandwidth); pkt_get_u8(curr, &lq->valueRSSI); #else pkt_ignore_u16(curr); #endif pkt_get_u8(curr, &lq->valueLq); pkt_get_u8(curr, &lq->valueNlq); } static void lq_packet_loss_worker_ffeth_nl80211(struct link_entry *link, void __attribute__ ((unused)) *ptr, bool lost) { struct lq_ffeth_hello *tlq = (struct lq_ffeth_hello *)link->linkquality; if (lost) { tlq->missed_hellos++; } return; } static void lq_memorize_foreign_hello_ffeth_nl80211(void *ptrLocal, void *ptrForeign) { struct lq_ffeth_hello *local = ptrLocal; struct lq_ffeth *foreign = ptrForeign; if (foreign) { local->lq.valueNlq = foreign->valueLq; } else { local->lq.valueNlq = 0; } } static void lq_copy_link2neigh_ffeth_nl80211(void *t, void *s) { struct lq_ffeth *target = t; struct lq_ffeth_hello *source = s; *target = source->smoothed_lq; } static void lq_copy_link2tc_ffeth_nl80211(void *t, void *s) { struct lq_ffeth *target = t; struct lq_ffeth_hello *source = s; *target = source->smoothed_lq; } static void lq_clear_ffeth_nl80211(void *target) { memset(target, 0, sizeof(struct lq_ffeth)); } static void lq_clear_ffeth_nl80211_hello(void *target) { struct lq_ffeth_hello *local = target; int i; lq_clear_ffeth_nl80211(&local->lq); lq_clear_ffeth_nl80211(&local->smoothed_lq); local->windowSize = LQ_FFETH_QUICKSTART_INIT; for (i = 0; i < LQ_FFETH_WINDOW; i++) { local->total[i] = 3; } } static const char * lq_print_ffeth_nl80211(void *ptr, char separator, struct lqtextbuffer *buffer) { struct lq_ffeth *lq = ptr; int lq_int, nlq_int; lq_int = (int)lq->valueLq; if (lq_int > 0 && lq_int < 255) { lq_int++; } nlq_int = (int)lq->valueNlq; if (nlq_int > 0 && nlq_int < 255) { nlq_int++; } snprintf(buffer->buf, sizeof(buffer->buf), "%s%c%s", fpmtoa(fpmidiv(itofpm(lq_int), 255)), separator, fpmtoa(fpmidiv(itofpm(nlq_int), 255))); return buffer->buf; } static const char * lq_print_cost_ffeth_nl80211(olsr_linkcost cost, struct lqtextbuffer *buffer) { snprintf(buffer->buf, sizeof(buffer->buf), "%s", fpmtoa(cost)); return buffer->buf; } #endif /* LINUX_NL80211 */ #endif /* __linux__ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/linux/lq_plugin_ffeth_nl80211.h000066400000000000000000000056001234304727700213520ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * Copyright (c) 2012 Fox-IT B.V. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef __linux__ #ifdef LINUX_NL80211 /* Optional - not supported on all platforms */ #ifndef LQ_ETX_FFETH_NL80211_ #define LQ_ETX_FFETH_NL80211_ #include "olsr_types.h" #include "lq_plugin.h" #ifdef LINUX_NL80211 #include #include "nl80211_link_info.h" #endif #define LQ_ALGORITHM_ETX_FFETH_NL80211_NAME "etx_ffeth_nl80211" #define LQ_FFETH_WINDOW 32 #define LQ_FFETH_QUICKSTART_INIT 4 struct lq_ffeth { uint8_t valueLq; uint8_t valueNlq; #ifdef LINUX_NL80211 uint8_t valueBandwidth; uint8_t valueRSSI; #endif }; struct lq_ffeth_hello { struct lq_ffeth smoothed_lq; struct lq_ffeth lq; uint8_t windowSize, activePtr; uint16_t last_seq_nr; uint16_t missed_hellos; bool perfect_eth; uint16_t received[LQ_FFETH_WINDOW], total[LQ_FFETH_WINDOW]; }; extern struct lq_handler lq_etx_ffeth_nl80211_handler; #endif /* LQ_ETX_FFETH_NL80211_ */ #endif /* LINUX_NL80211 */ #endif /* __linux__ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/linux/net.c000066400000000000000000000521421234304727700157030ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Linux specific code */ #ifdef __linux__ #define __BSD_SOURCE 1 #include "../net_os.h" #include "../ipcalc.h" #include "../olsr.h" #include "../log.h" #include "kernel_tunnel.h" #include #include #include #include #include #include #include #include /** * Fix bug in GLIBC, see https://bugzilla.redhat.com/show_bug.cgi?id=635260 */ #ifdef IPTOS_CLASS #undef IPTOS_CLASS #endif /* IPTOS_CLASS */ #define IPTOS_CLASS(class) ((class) & IPTOS_CLASS_MASK) #define IPV6_ADDR_LOOPBACK 0x0010U #define IPV6_ADDR_LINKLOCAL 0x0020U #define IPV6_ADDR_SITELOCAL 0x0040U /* ip forwarding */ #define PROC_IPFORWARD_V4 "/proc/sys/net/ipv4/ip_forward" #define PROC_IPFORWARD_V6 "/proc/sys/net/ipv6/conf/all/forwarding" /* Redirect proc entry */ #define PROC_IF_REDIRECT "/proc/sys/net/ipv4/conf/%s/send_redirects" #define PROC_ALL_REDIRECT "/proc/sys/net/ipv4/conf/all/send_redirects" /* IP spoof proc entry */ #define PROC_IF_SPOOF "/proc/sys/net/ipv4/conf/%s/rp_filter" #define PROC_ALL_SPOOF "/proc/sys/net/ipv4/conf/all/rp_filter" /* list of IPv6 interfaces */ #define PATH_PROCNET_IFINET6 "/proc/net/if_inet6" /* values olsrd wants in procfs */ #define OLSRD_FORWARD_VALUE '1' #define OLSRD_REDIRECT_VALUE '0' #define OLSRD_SPOOF_VALUE '0' /* *Wireless definitions for ioctl calls *(from linux/wireless.h) */ #define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */ #define SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */ /* The original state of the IP forwarding proc entry */ static char orig_fwd_state; static char orig_global_redirect_state; static char orig_global_rp_filter; static char orig_tunnel_rp_filter; /** *Bind a socket to a device * *@param sock the socket to bind *@param dev_name name of the device * *@return negative if error */ int bind_socket_to_device(int sock, char *dev_name) { /* *Bind to device using the SO_BINDTODEVICE flag */ OLSR_PRINTF(3, "Binding socket %d to device %s\n", sock, dev_name); return setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, dev_name, strlen(dev_name) + 1); } static int writeToProc(const char *file, char *old, char value) { int fd; char rv; if ((fd = open(file, O_RDWR)) < 0) { OLSR_PRINTF(0, "Error, cannot open proc entry %s: %s (%d)\n", file, strerror(errno), errno); return -1; } if (read(fd, &rv, 1) != 1) { OLSR_PRINTF(0, "Error, cannot read proc entry %s: %s (%d)\n", file, strerror(errno), errno); goto writeToProcError; } if (rv != value && value != 0) { if (lseek(fd, SEEK_SET, 0) == -1) { OLSR_PRINTF(0, "Error, cannot rewind proc entry %s: %s (%d)\n", file, strerror(errno), errno); goto writeToProcError; } if (write(fd, &value, 1) != 1) { OLSR_PRINTF(0, "Error, cannot write proc entry %s: %s (%d)\n", file, strerror(errno), errno); goto writeToProcError; } } close(fd); if (old) { *old = rv; } if (value) { olsr_syslog(OLSR_LOG_INFO, "Writing '%c' (was %c) to %s", value, rv, file); } return 0; writeToProcError: close (fd); return -1; } /* write new value to proc file if current value is different*/ static int restoreProc(const char *file, char original, char value) { if ( original == value ) return 0; else return writeToProc(file, NULL, original); } static bool is_at_least_linuxkernel_2_6_31(void) { struct utsname uts; char *next; int first = 0, second = 0, third = 0; memset(&uts, 0, sizeof(uts)); if (uname(&uts)) { OLSR_PRINTF(1, "Error, could not read kernel version: %s (%d)\n", strerror(errno), errno); return false; } first = strtol(uts.release, &next, 10); /* check for linux 3.x */ if (first >= 3) { return true; } if (*next != '.') { goto kernel_parse_error; } second = strtol(next+1, &next, 10); if (*next != '.') { goto kernel_parse_error; } third = strtol(next+1, NULL, 10); /* better or equal than linux 2.6.31 ? */ return first == 2 && second == 6 && third >= 31; kernel_parse_error: OLSR_PRINTF(1, "Error, cannot parse kernel version: %s\n", uts.release); return false; } /** * Setup global interface options (icmp redirect, ip forwarding, rp_filter) * @return 1 on success 0 on failure */ void net_os_set_global_ifoptions(void) { if (writeToProc(olsr_cnf->ip_version == AF_INET ? PROC_IPFORWARD_V4 : PROC_IPFORWARD_V6, &orig_fwd_state, olsr_cnf->set_ip_forward ? OLSRD_FORWARD_VALUE : 0 )) { OLSR_PRINTF(1, "Warning, could not enable IP forwarding!\n" "you should manually ensure that IP forwarding is enabled!\n\n"); olsr_startup_sleep(3); } else if ((!olsr_cnf->set_ip_forward) && (orig_fwd_state != OLSRD_FORWARD_VALUE)) { olsr_exit("IP forwarding not activated, shutting down.\n", 1); } if (olsr_cnf->smart_gw_active) { char procfile[FILENAME_MAX]; /* Generate the procfile name */ if (olsr_cnf->ip_version == AF_INET || olsr_cnf->use_niit) { snprintf(procfile, sizeof(procfile), PROC_IF_SPOOF, TUNNEL_ENDPOINT_IF); if (writeToProc(procfile, &orig_tunnel_rp_filter, OLSRD_SPOOF_VALUE)) { OLSR_PRINTF(0, "WARNING! Could not disable the IP spoof filter for tunnel!\n" "you should manually ensure that IP spoof filtering is disabled!\n\n"); olsr_startup_sleep(3); } } } if (olsr_cnf->ip_version == AF_INET) { if (writeToProc(PROC_ALL_REDIRECT, &orig_global_redirect_state, OLSRD_REDIRECT_VALUE)) { OLSR_PRINTF(1, "WARNING! Could not disable ICMP redirects!\n" "you should manually ensure that ICMP redirects are disabled!\n\n"); olsr_startup_sleep(3); } /* check kernel version and disable global rp_filter */ if (is_at_least_linuxkernel_2_6_31()) { if (writeToProc(PROC_ALL_SPOOF, &orig_global_rp_filter, OLSRD_SPOOF_VALUE)) { OLSR_PRINTF(1, "WARNING! Could not disable global rp_filter (necessary for kernel 2.6.31 and higher!\n" "you should manually ensure that rp_filter is disabled!\n\n"); olsr_startup_sleep(3); } } } return; } /** * *@return 1 on sucess 0 on failiure */ int net_os_set_ifoptions(const char *if_name, struct interface *iface) { char procfile[FILENAME_MAX]; if (olsr_cnf->ip_version == AF_INET6) return -1; /* Generate the procfile name */ snprintf(procfile, sizeof(procfile), PROC_IF_REDIRECT, if_name); if (writeToProc(procfile, &iface->nic_state.redirect, OLSRD_REDIRECT_VALUE)) { OLSR_PRINTF(0, "WARNING! Could not disable ICMP redirects!\n" "you should manually ensure that ICMP redirects are disabled!\n\n"); olsr_startup_sleep(3); return 0; } /* Generate the procfile name */ snprintf(procfile, sizeof(procfile), PROC_IF_SPOOF, if_name); if (writeToProc(procfile, &iface->nic_state.spoof, OLSRD_SPOOF_VALUE)) { OLSR_PRINTF(0, "WARNING! Could not disable the IP spoof filter!\n" "you should manually ensure that IP spoof filtering is disabled!\n\n"); olsr_startup_sleep(3); return 0; } return 1; } /** *Resets the spoof filter and ICMP redirect settings */ int net_os_restore_ifoptions(void) { struct interface *ifs; char procfile[FILENAME_MAX]; OLSR_PRINTF(1, "Restoring network state\n"); /* Restore IP forwarding to original value */ if (olsr_cnf->set_ip_forward) { if (restoreProc(olsr_cnf->ip_version == AF_INET ? PROC_IPFORWARD_V4 : PROC_IPFORWARD_V6, orig_fwd_state, OLSRD_FORWARD_VALUE)) { OLSR_PRINTF(1, "Error, could not restore ip_forward settings\n"); } } if (olsr_cnf->smart_gw_active && (olsr_cnf->ip_version == AF_INET || olsr_cnf->use_niit)) { /* Generate the procfile name */ snprintf(procfile, sizeof(procfile), PROC_IF_SPOOF, TUNNEL_ENDPOINT_IF); if (restoreProc(procfile, orig_tunnel_rp_filter, OLSRD_SPOOF_VALUE)) { OLSR_PRINTF(0, "WARNING! Could not restore the IP spoof filter for tunnel!\n"); } } if (olsr_cnf->ip_version == AF_INET) { /* Restore global ICMP redirect setting */ if (restoreProc(PROC_ALL_REDIRECT, orig_global_redirect_state, OLSRD_REDIRECT_VALUE)) { OLSR_PRINTF(1, "Error, could not restore global icmp_redirect setting\n"); } /* Restore global rp_filter setting for linux 2.6.31+ */ if (is_at_least_linuxkernel_2_6_31()) { if (restoreProc(PROC_ALL_SPOOF, orig_global_rp_filter, OLSRD_SPOOF_VALUE)) { OLSR_PRINTF(1, "Error, could not restore global rp_filter setting\n"); } } for (ifs = ifnet; ifs != NULL; ifs = ifs->int_next) { /* Discard host-emulation interfaces */ if (ifs->is_hcif) continue; /* ICMP redirects */ snprintf(procfile, sizeof(procfile), PROC_IF_REDIRECT, ifs->int_name); if (restoreProc(procfile, ifs->nic_state.redirect, OLSRD_REDIRECT_VALUE)) { OLSR_PRINTF(1, "Error, could not restore icmp_redirect for interface %s\n", ifs->int_name); } /* Spoof filter */ sprintf(procfile, PROC_IF_SPOOF, ifs->int_name); if (restoreProc(procfile, ifs->nic_state.spoof, OLSRD_SPOOF_VALUE)) { OLSR_PRINTF(1, "Error, could not restore rp_filter for interface %s\n", ifs->int_name); } } } return 1; } /** *Creates a blocking tcp socket for communication with switch daemon. *@param pin sockaddr struct. Used for bind(2). *@return the FD of the socket or -1 on error. */ int gethemusocket(struct sockaddr_in *pin) { int sock, on = 1; OLSR_PRINTF(1, " Connecting to switch daemon port 10150..."); if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("hcsocket"); syslog(LOG_ERR, "hcsocket: %m"); return -1; } if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) { perror("SO_REUSEADDR failed"); close(sock); return -1; } /* connect to PORT on HOST */ if (connect(sock, (struct sockaddr *)pin, sizeof(*pin)) < 0) { printf("FAILED\n"); fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno)); printf("connection refused\n"); close(sock); return -1; } printf("OK\n"); /* Keep TCP socket blocking */ return sock; } /** *Creates a nonblocking broadcast socket. *@param bufspace the number of bytes in the buffer *@param ifp interface struct. Used for bind(2). *@return the FD of the socket or -1 on error. */ int getsocket(int bufspace, struct interface *ifp) { struct sockaddr_in sin; int on; int sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { perror("socket"); syslog(LOG_ERR, "socket: %m"); return -1; } on = 1; #ifdef SO_BROADCAST if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) < 0) { perror("setsockopt"); syslog(LOG_ERR, "setsockopt SO_BROADCAST: %m"); close(sock); return -1; } #endif /* SO_BROADCAST */ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) { perror("SO_REUSEADDR failed"); close(sock); return -1; } #ifdef SO_RCVBUF if(bufspace > 0) { for (on = bufspace;; on -= 1024) { if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &on, sizeof(on)) == 0) break; if (on <= 8 * 1024) { perror("setsockopt"); syslog(LOG_ERR, "setsockopt SO_RCVBUF: %m"); break; } } } #endif /* SO_RCVBUF */ /* * WHEN USING KERNEL 2.6 THIS MUST HAPPEN PRIOR TO THE PORT BINDING!!!! */ /* Bind to device */ if (bind_socket_to_device(sock, ifp->int_name) < 0) { fprintf(stderr, "Could not bind socket to device... exiting!\n\n"); syslog(LOG_ERR, "Could not bind socket to device... exiting!\n\n"); close(sock); return -1; } memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(olsr_cnf->olsrport); if(bufspace <= 0) { sin.sin_addr.s_addr = ifp->int_addr.sin_addr.s_addr; } if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) { perror("bind"); syslog(LOG_ERR, "bind: %m"); close(sock); return -1; } on = fcntl(sock, F_GETFL); if (on == -1) { syslog(LOG_ERR, "fcntl (F_GETFL): %m\n"); } else { if (fcntl(sock, F_SETFL, on | O_NONBLOCK) == -1) { syslog(LOG_ERR, "fcntl O_NONBLOCK: %m\n"); } } return sock; } /** *Creates a nonblocking IPv6 socket *@param bufspace the number of bytes in the buffer *@param ifp interface struct. Used for bind(2). *@return the FD of the socket or -1 on error. */ int getsocket6(int bufspace, struct interface *ifp) { struct sockaddr_in6 sin; int on; int sock = socket(AF_INET6, SOCK_DGRAM, 0); if (sock < 0) { perror("socket"); syslog(LOG_ERR, "socket: %m"); return (-1); } #ifdef IPV6_V6ONLY on = 1; if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)) < 0) { perror("setsockopt(IPV6_V6ONLY)"); syslog(LOG_ERR, "setsockopt(IPV6_V6ONLY): %m"); } #endif /* IPV6_V6ONLY */ //#ifdef SO_BROADCAST /* if (setsockopt(sock, SOL_SOCKET, SO_MULTICAST, &on, sizeof (on)) < 0) { perror("setsockopt"); syslog(LOG_ERR, "setsockopt SO_BROADCAST: %m"); close(sock); return (-1); } */ //#endif /* SO_BROADCAST */ #ifdef SO_RCVBUF if(bufspace > 0) { for (on = bufspace;; on -= 1024) { if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &on, sizeof(on)) == 0) break; if (on <= 8 * 1024) { perror("setsockopt"); syslog(LOG_ERR, "setsockopt SO_RCVBUF: %m"); break; } } } #endif /* SO_RCVBUF */ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) { perror("SO_REUSEADDR failed"); close(sock); return (-1); } /* * WHEN USING KERNEL 2.6 THIS MUST HAPPEN PRIOR TO THE PORT BINDING!!!! */ /* Bind to device */ if (bind_socket_to_device(sock, ifp->int_name) < 0) { fprintf(stderr, "Could not bind socket to device... exiting!\n\n"); syslog(LOG_ERR, "Could not bind socket to device... exiting!\n\n"); close(sock); return -1; } memset(&sin, 0, sizeof(sin)); sin.sin6_family = AF_INET6; sin.sin6_port = htons(olsr_cnf->olsrport); sin.sin6_scope_id = ifp->if_index; if(bufspace <= 0) { memcpy(&sin.sin6_addr, &ifp->int6_addr.sin6_addr, sizeof(struct in6_addr)); } if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) { struct ipaddr_str buf; OLSR_PRINTF(1, "Error, cannot bind address %s to %s-socket: %s (%d)\n", inet_ntop(sin.sin6_family, &sin.sin6_addr, buf.buf, sizeof(buf)), bufspace <= 0 ? "transmit" : "receive", strerror(errno), errno); syslog(LOG_ERR, "bind: %m"); close(sock); return (-1); } on = fcntl(sock, F_GETFL); if (on == -1) { syslog(LOG_ERR, "fcntl (F_GETFL): %m\n"); } else { if (fcntl(sock, F_SETFL, on | O_NONBLOCK) == -1) { syslog(LOG_ERR, "fcntl O_NONBLOCK: %m\n"); } } return sock; } int join_mcast(struct interface *ifs, int sock) { /* See linux/in6.h */ struct ipaddr_str buf; struct ipv6_mreq mcastreq; mcastreq.ipv6mr_multiaddr = ifs->int6_multaddr.sin6_addr; mcastreq.ipv6mr_interface = ifs->if_index; OLSR_PRINTF(3, "Interface %s joining multicast %s...", ifs->int_name, ip6_to_string(&buf, &ifs->int6_multaddr.sin6_addr)); /* Old libc fix */ #ifdef IPV6_JOIN_GROUP /* Join receiver group */ if (setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&mcastreq, sizeof(struct ipv6_mreq)) < 0) #else /* IPV6_JOIN_GROUP */ /* Join receiver group */ if (setsockopt(sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&mcastreq, sizeof(struct ipv6_mreq)) < 0) #endif /* IPV6_JOIN_GROUP */ { perror("Join multicast group for receiving socket"); return -1; } if (setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *)&mcastreq.ipv6mr_interface, sizeof(mcastreq.ipv6mr_interface)) < 0) { perror("Set multicast if"); return -1; } OLSR_PRINTF(3, "OK\n"); return 0; } /* *From net-tools lib/interface.c * */ int get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, struct olsr_ip_prefix *prefix) { char addr6[40], devname[IFNAMSIZ]; char addr6p[8][5]; int plen, scope, dad_status, if_idx; FILE *f; union olsr_ip_addr tmp_ip; if ((f = fopen(PATH_PROCNET_IFINET6, "r")) != NULL) { while (fscanf (f, "%4s%4s%4s%4s%4s%4s%4s%4s %x %02x %02x %02x %16s\n", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7], &if_idx, &plen, &scope, &dad_status, devname) != EOF) { if (!strcmp(devname, ifname)) { bool isNetWide = false; sprintf(addr6, "%s:%s:%s:%s:%s:%s:%s:%s", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7]); OLSR_PRINTF(5, "\tinet6 addr: %s\n", addr6); OLSR_PRINTF(5, "\tScope: %d\n", scope); if (inet_pton(AF_INET6, addr6, &tmp_ip.v6) != 1) { continue; } isNetWide = (scope != IPV6_ADDR_LOOPBACK) && (scope != IPV6_ADDR_LINKLOCAL) && (scope != IPV6_ADDR_SITELOCAL); if ((prefix == NULL && isNetWide) || (prefix != NULL && ip_in_net(&tmp_ip, prefix))) { OLSR_PRINTF(4, "Found addr: %s:%s:%s:%s:%s:%s:%s:%s\n", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7]); memcpy(&saddr6->sin6_addr, &tmp_ip.v6, sizeof(struct in6_addr)); fclose(f); return 1; } } } fclose(f); } return 0; } /** * Wrapper for sendto(2) */ ssize_t olsr_sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr * to, socklen_t tolen) { return sendto(s, buf, len, flags, to, tolen); } /** * Wrapper for recvfrom(2) */ ssize_t olsr_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr * from, socklen_t * fromlen) { return recvfrom(s, buf, len, flags, from, fromlen); } /** * Wrapper for select(2) */ int olsr_select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval *timeout) { return select(nfds, readfds, writefds, exceptfds, timeout); } int check_wireless_interface(char *ifname) { struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); return (ioctl(olsr_cnf->ioctl_s, SIOCGIWNAME, &ifr) >= 0) ? 1 : 0; } int calculate_if_metric(char *ifname) { return check_wireless_interface(ifname); } bool olsr_if_isup(const char * dev) { struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); strscpy(ifr.ifr_name, dev, IFNAMSIZ); if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) { OLSR_PRINTF(1, "ioctl SIOCGIFFLAGS (get flags) error on device %s: %s (%d)\n", dev, strerror(errno), errno); return 1; } return (ifr.ifr_flags & IFF_UP) != 0; } int olsr_if_set_state(const char *dev, bool up) { int oldflags; struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); strscpy(ifr.ifr_name, dev, IFNAMSIZ); if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) { OLSR_PRINTF(1, "ioctl SIOCGIFFLAGS (get flags) error on device %s: %s (%d)\n", dev, strerror(errno), errno); return 1; } oldflags = ifr.ifr_flags; if (up) { ifr.ifr_flags |= IFF_UP; } else { ifr.ifr_flags &= ~IFF_UP; } if (oldflags == ifr.ifr_flags) { /* interface is already up/down */ return 0; } if (ioctl(olsr_cnf->ioctl_s, SIOCSIFFLAGS, &ifr) < 0) { OLSR_PRINTF(1, "ioctl SIOCSIFFLAGS (set flags %s) error on device %s: %s (%d)\n", up ? "up" : "down", dev, strerror(errno), errno); return 1; } return 0; } #endif /* __linux__ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/linux/nl80211_link_info.c000066400000000000000000000361511234304727700201540ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2012 Fox-IT B.V. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef __linux__ #ifdef LINUX_NL80211 /* Optional - not supported on all platforms */ #include #include #include #include #include #include #include #include #include #include #include #include #include "nl80211_link_info.h" #include "lq_plugin_ffeth_nl80211.h" #include "interfaces.h" #include "olsr.h" #include "log.h" #include "fpm.h" // Static values for testing #define REFERENCE_BANDWIDTH_MBIT_SEC 54 #if !defined(CONFIG_LIBNL20) && !defined(CONFIG_LIBNL30) #define nl_sock nl_handle static inline struct nl_handle *nl_socket_alloc(void) { return nl_handle_alloc(); } static inline void nl_socket_free(struct nl_sock *sock) { nl_handle_destroy(sock); } #endif #define ASSERT_NOT_NULL(PARAM) do { \ if ((PARAM) == NULL) { \ olsr_exit("Pointer value for '" #PARAM "' cannot be NULL", EXIT_FAILURE); \ } \ } while (0) struct nl80211_link_info_context { int *finish; struct lq_nl80211_data **nl80211; }; static int netlink_id = 0; static struct nl_sock *gen_netlink_socket = NULL; // Socket for NL80211 static struct nl_sock *rt_netlink_socket = NULL; // Socket for ARP cache /** * Opens two netlink connections to the Linux kernel. One connection to retreive * wireless 802.11 information and one for querying the ARP cache. */ static void connect_netlink(void) { if ((gen_netlink_socket = nl_socket_alloc()) == NULL) { olsr_exit("Failed allocating memory for netlink socket", EXIT_FAILURE); } if (genl_connect(gen_netlink_socket) != 0) { olsr_exit("Failed to connect with generic netlink", EXIT_FAILURE); } if ((netlink_id = genl_ctrl_resolve(gen_netlink_socket, "nl80211")) < 0) { olsr_exit("Failed to resolve netlink nl80211 module", EXIT_FAILURE); } if ((rt_netlink_socket = nl_socket_alloc()) == NULL) { olsr_exit("Failed allocating memory for netlink socket", EXIT_FAILURE); } if ((nl_connect(rt_netlink_socket, NETLINK_ROUTE)) != 0) { olsr_exit("Failed to connect with NETLINK_ROUTE", EXIT_FAILURE); } } static int parse_nl80211_message(struct nl_msg *msg, void *arg) { struct nl80211_link_info_context *context = (struct nl80211_link_info_context *) arg; struct genlmsghdr *header = nlmsg_data(nlmsg_hdr(msg)); struct nlattr *attributes[NL80211_ATTR_MAX + 1]; struct nlattr *station_info[NL80211_STA_INFO_MAX + 1]; struct nlattr *rate_info[NL80211_RATE_INFO_MAX + 1]; struct lq_nl80211_data *lq_data = NULL; uint8_t signal; uint16_t bandwidth; static struct nla_policy station_attr_policy[NL80211_STA_INFO_MAX + 1] = { [NL80211_STA_INFO_INACTIVE_TIME] = { .type = NLA_U32 }, // Last activity from remote station (msec) [NL80211_STA_INFO_SIGNAL] = { .type = NLA_U8 }, // Signal strength of last received PPDU (dBm) [NL80211_STA_INFO_TX_BITRATE] = { .type = NLA_NESTED }, // Transmit bitrate to this station }; static struct nla_policy station_rate_policy[NL80211_RATE_INFO_MAX + 1] = { [NL80211_RATE_INFO_BITRATE] = { .type = NLA_U16 }, // Bitrate (100kbit/s) }; ASSERT_NOT_NULL(msg); ASSERT_NOT_NULL(context); if (nla_parse(attributes, NL80211_ATTR_MAX, genlmsg_attrdata(header, 0), genlmsg_attrlen(header, 0), NULL) != 0) { *(context->finish) = 1; return NL_STOP; } if (!attributes[NL80211_ATTR_STA_INFO]) { olsr_syslog(OLSR_LOG_INFO, "Did not receive station info in netlink reply"); return NL_SKIP; } if (nla_parse_nested(station_info, NL80211_STA_INFO_MAX, attributes[NL80211_ATTR_STA_INFO], station_attr_policy) < 0) { *(context->finish) = 1; return NL_STOP; } if (nla_parse_nested(rate_info, NL80211_RATE_INFO_MAX, station_info[NL80211_STA_INFO_TX_BITRATE], station_rate_policy) < 0) { *(context->finish) = 1; return NL_STOP; } if (nla_len(attributes[NL80211_ATTR_MAC]) != ETHER_ADDR_LEN) { olsr_syslog(OLSR_LOG_ERR, "Attribute NL80211_ATTR_MAC length is not equal to ETHER_ADDR_LEN"); *(context->finish) = 1; return NL_STOP; } if (station_info[NL80211_STA_INFO_SIGNAL]) { signal = nla_get_u8(station_info[NL80211_STA_INFO_SIGNAL]); } if (rate_info[NL80211_RATE_INFO_BITRATE]) { bandwidth = nla_get_u16(rate_info[NL80211_RATE_INFO_BITRATE]); } if (bandwidth != 0 || signal != 0) { lq_data = olsr_malloc(sizeof(struct lq_nl80211_data), "new lq_nl80211_data struct"); memcpy(lq_data->mac, nla_data(attributes[NL80211_ATTR_MAC]), ETHER_ADDR_LEN); lq_data->signal = signal; lq_data->bandwidth = bandwidth; lq_data->next = NULL; if (context->nl80211 == NULL) { // Linked list does not exist yet *(context->nl80211) = lq_data; } else { // Append to head of linked list lq_data->next = *(context->nl80211); *(context->nl80211) = lq_data; } } return NL_SKIP; } static int error_handler(struct sockaddr_nl __attribute__ ((unused)) *nla, struct nlmsgerr __attribute__ ((unused)) *err, void *arg) { int *finish = arg; ASSERT_NOT_NULL(arg); *finish = 1; return NL_STOP; } static int finish_handler(struct nl_msg __attribute__ ((unused)) *msg, void *arg) { int *finish = arg; ASSERT_NOT_NULL(arg); *finish = 1; return NL_SKIP; } static int ack_handler(struct nl_msg __attribute__ ((unused)) *nla, void *arg) { int *finish = arg; ASSERT_NOT_NULL(arg); *finish = 1; return NL_STOP; } /** * Requests the NL80211 data for a specific interface. * * @param iface Interface to get all the NL80211 station information for. * @param nl80211 Pointer to linked list with station information. If set to NULL * the pointer will point to a new linked list, if there was any * information retreived. */ static void nl80211_link_info_for_interface(struct interface *iface, struct lq_nl80211_data **nl80211) { int finish = 0; struct nl_msg *request_message = NULL; struct nl_cb *request_cb = NULL; struct nl80211_link_info_context link_context = { &finish, nl80211 }; ASSERT_NOT_NULL(iface); if (! iface->is_wireless) { // Remove in production code olsr_syslog(OLSR_LOG_INFO, "Link entry %s is not a wireless link", iface->int_name); return; } if ((request_message = nlmsg_alloc()) == NULL) { olsr_exit("Failed to allocate nl_msg struct", EXIT_FAILURE); } genlmsg_put(request_message, NL_AUTO_PID, NL_AUTO_SEQ, netlink_id, 0, NLM_F_DUMP, NL80211_CMD_GET_STATION, 0); if (nla_put_u32(request_message, NL80211_ATTR_IFINDEX, iface->if_index) == -1) { olsr_syslog(OLSR_LOG_ERR, "Failed to add interface index to netlink message"); exit(1); } #ifdef NL_DEBUG if ((request_cb = nl_cb_alloc(NL_CB_DEBUG)) == NULL) { #else if ((request_cb = nl_cb_alloc(NL_CB_DEFAULT)) == NULL) { #endif olsr_exit("Failed to alloc nl_cb struct", EXIT_FAILURE); } if (nl_cb_set(request_cb, NL_CB_VALID, NL_CB_CUSTOM, parse_nl80211_message, &link_context) != 0) { olsr_syslog(OLSR_LOG_ERR, "Failed to set netlink message callback"); exit(1); } nl_cb_err(request_cb, NL_CB_CUSTOM, error_handler, &finish); nl_cb_set(request_cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &finish); nl_cb_set(request_cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, &finish); if (nl_send_auto_complete(gen_netlink_socket, request_message) < 0) { olsr_syslog(OLSR_LOG_ERR, "Failed sending the request message with netlink"); exit(1); } while (! finish) { nl_recvmsgs(gen_netlink_socket, request_cb); } nlmsg_free(request_message); } /** * Uses the linux ARP cache to find a MAC address for a neighbor. Does not do * actual ARP if it's not found in the cache. * * @param link Neighbor to find MAC address of. * @param mac Pointer to buffer of size ETHER_ADDR_LEN that will be * used to write MAC address in (if found). * @returns True if MAC address is found. */ static bool mac_of_neighbor(struct link_entry *link, unsigned char *mac) { bool success = false; struct nl_cache *cache = NULL; struct rtnl_neigh *neighbor = NULL; struct nl_addr *neighbor_addr_filter = NULL; struct nl_addr *neighbor_mac_addr = NULL; void *addr = NULL; size_t addr_size = 0; if (olsr_cnf->ip_version == AF_INET6) { addr = &(link->neighbor_iface_addr.v6); addr_size = sizeof(struct in6_addr); } else { addr = &(link->neighbor_iface_addr.v4); addr_size = sizeof(struct in_addr); } if ((neighbor_addr_filter = nl_addr_build(olsr_cnf->ip_version, addr, addr_size)) == NULL) { olsr_syslog(OLSR_LOG_ERR, "Failed to build nl_addr struct from link ip address"); goto cleanup; } #if !defined(CONFIG_LIBNL20) && !defined(CONFIG_LIBNL30) if ((cache = rtnl_neigh_alloc_cache(rt_netlink_socket)) == NULL) { #else if (rtnl_neigh_alloc_cache(rt_netlink_socket, &cache) != 0) { #endif olsr_syslog(OLSR_LOG_ERR, "Failed to allocate netlink neighbor cache"); goto cleanup; } if ((neighbor = rtnl_neigh_get(cache, link->inter->if_index, neighbor_addr_filter)) == NULL) { olsr_syslog(OLSR_LOG_INFO, "Neighbor MAC address not found in ARP cache"); goto cleanup; } if ((neighbor_mac_addr = rtnl_neigh_get_lladdr(neighbor)) != NULL) { if (nl_addr_get_len(neighbor_mac_addr) != ETHER_ADDR_LEN) { olsr_syslog(OLSR_LOG_ERR, "Found a netlink nieghbor but address is not ETHER_ADDR_LEN long"); goto cleanup; } memcpy(mac, nl_addr_get_binary_addr(neighbor_mac_addr), ETHER_ADDR_LEN); success = true; } cleanup: if (cache) nl_cache_free(cache); if (neighbor) rtnl_neigh_put(neighbor); if (neighbor_addr_filter) nl_addr_put(neighbor_addr_filter); // neighbor_mac_filter does not need cleanup return success; } void nl80211_link_info_init(void) { connect_netlink(); } void nl80211_link_info_cleanup(void) { nl_socket_free(gen_netlink_socket); nl_socket_free(rt_netlink_socket); } static void free_lq_nl80211_data(struct lq_nl80211_data *nl80211) { struct lq_nl80211_data *next = nl80211; while (nl80211) { next = nl80211->next; free(nl80211); nl80211 = next; } } /** * Find a object in the linked list that matches the MAC address. * * @param nl80211_list Pointer to the linked list to find the object in. * @param mac MAC address to look for, MUST be ETHER_ADDR_LEN long. * * @returns Pointer to object or NULL on failure. */ static struct lq_nl80211_data *find_lq_nl80211_data_by_mac(struct lq_nl80211_data *nl80211_list, unsigned char *mac) { ASSERT_NOT_NULL(nl80211_list); ASSERT_NOT_NULL(mac); while (nl80211_list) { if (memcmp(mac, nl80211_list->mac, ETHER_ADDR_LEN) == 0) { return nl80211_list; } nl80211_list = nl80211_list->next; } return NULL; } static uint8_t bandwidth_to_quality(uint16_t bandwidth) { fpm ratio; fpm fp_bandwidth; fpm penalty; if (bandwidth == 0) { return 0; } // BandwidthPenalty = 1 - (Bandwidth / ReferenceBandwidth) fp_bandwidth = itofpm(bandwidth); fp_bandwidth = fpmidiv(fp_bandwidth, 10); // 100Kbit/sec to Mbit/sec ratio = fpmidiv(fp_bandwidth, REFERENCE_BANDWIDTH_MBIT_SEC); penalty = fpmsub(itofpm(1), ratio); // Convert to 255 based number penalty = fpmimul(penalty, 255); return fpmtoi(penalty); } static uint8_t signal_to_quality(int8_t signal) { // Map dBm levels to quality penalties struct signal_penalty { int8_t signal; uint8_t penalty; // 255=1.0 }; // Must be ordered static struct signal_penalty signal_quality_table[] = { { -75, 30 }, { -80, 60}, { -85, 120 }, { -90, 160 }, { -95, 200 }, { -100, 255 } }; static size_t TABLE_SIZE = sizeof(signal_quality_table) / sizeof(struct signal_penalty); unsigned int i = 0; uint8_t penalty = 0; for (i = 0; i < TABLE_SIZE; i++) { if (signal <= signal_quality_table[i].signal) { penalty = signal_quality_table[i].penalty; } else { break; } } return penalty; } void nl80211_link_info_get(void) { struct interface *next_interface = NULL; struct lq_nl80211_data *nl80211_list = NULL; struct link_entry *link = NULL; struct lq_nl80211_data *lq_data = NULL; struct lq_ffeth_hello *lq_ffeth = NULL; unsigned char mac_address[ETHER_ADDR_LEN]; uint8_t penalty_bandwidth; uint8_t penalty_signal; // Get latest 802.11 status information for all interfaces // This list will contain OLSR and non-OLSR nodes for (next_interface = ifnet; next_interface; next_interface = next_interface->int_next) { nl80211_link_info_for_interface(next_interface, &nl80211_list); } if (nl80211_list == NULL) { olsr_syslog(OLSR_LOG_INFO, "Failed to retreive any NL80211 data"); return; } OLSR_FOR_ALL_LINK_ENTRIES(link) { lq_ffeth = (struct lq_ffeth_hello *) link->linkquality; lq_ffeth->lq.valueBandwidth = 0; lq_ffeth->lq.valueRSSI = 0; lq_ffeth->smoothed_lq.valueBandwidth = 0; lq_ffeth->smoothed_lq.valueRSSI = 0; if (mac_of_neighbor(link, mac_address)) { if ((lq_data = find_lq_nl80211_data_by_mac(nl80211_list, mac_address)) != NULL) { penalty_bandwidth = bandwidth_to_quality(lq_data->bandwidth); penalty_signal = signal_to_quality(lq_data->signal); lq_ffeth->lq.valueBandwidth = penalty_bandwidth; lq_ffeth->lq.valueRSSI = penalty_signal; lq_ffeth->smoothed_lq.valueBandwidth = penalty_bandwidth; lq_ffeth->smoothed_lq.valueRSSI = penalty_signal; olsr_syslog(OLSR_LOG_INFO, "Apply 802.11: iface(%s) neighbor(%s) bandwidth(%dMb = %d) rssi(%ddBm = %d)", link->if_name, ether_ntoa((struct ether_addr *)mac_address), lq_data->bandwidth / 10, penalty_bandwidth, lq_data->signal, penalty_signal); } else olsr_syslog(OLSR_LOG_INFO, "NO match ;-(!"); } } OLSR_FOR_ALL_LINK_ENTRIES_END(link) free_lq_nl80211_data(nl80211_list); } #endif /* LINUX_NL80211 */ #endif /* __linux__ */ olsrd-0.6.6.2/src/linux/nl80211_link_info.h000066400000000000000000000050061234304727700201540ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2012 Fox-IT B.V. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef __linux__ #ifdef LINUX_NL80211 /* Optional - not supported on all platforms */ #ifndef OLSR_LINUX_NL80211_LINK_INFO_H_INCLUDED #define OLSR_LINUX_NL80211_LINK_INFO_H_INCLUDED #include #include "link_set.h" struct lq_nl80211_data { unsigned char mac[ETHER_ADDR_LEN]; // MAC address of station int8_t signal; // Signal level in dBm uint16_t bandwidth; // Active bandwidth setting in 100kbit/sec struct lq_nl80211_data *next; // Linked list pointer }; void nl80211_link_info_init(void); void nl80211_link_info_cleanup(void); void nl80211_link_info_get(void); #endif // OLSR_LINUX_NL80211_LINK_INFO_H_INCLUDED #endif /* LINUX_NL80211 */ #endif /* __linux__ */ olsrd-0.6.6.2/src/log.h000066400000000000000000000053421234304727700145440ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * System logging interface * Platform independent - the implementations * reside in /log.c(e.g. linux/log.c) */ #ifndef _OLSR_SYSLOG_H #define _OLSR_SYSLOG_H #define OLSR_LOG_INFO 1 #define OLSR_LOG_ERR 2 void olsr_openlog(const char *ident); #if defined SYSLOG_NUMBERING && SYSLOG_NUMBERING void olsr_syslog_real(int level, const char *format, ...) __attribute__ ((format(printf, 2, 3))); extern unsigned int olsr_syslog_ctr; #define olsr_syslog(level, format, ...) olsr_syslog_real (level, "%02x: " format, olsr_syslog_ctr++ & 0xFF, ## __VA_ARGS__ ) #else /* defined SYSLOG_NUMBERING && SYSLOG_NUMBERING */ void olsr_syslog(int level, const char *format, ...) __attribute__ ((format(printf, 2, 3))); #endif /* defined SYSLOG_NUMBERING && SYSLOG_NUMBERING */ #endif /* _OLSR_SYSLOG_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_mpr.c000066400000000000000000000130621234304727700152460ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "defs.h" #include "neighbor_table.h" #include "two_hop_neighbor_table.h" #include "link_set.h" #include "lq_mpr.h" #include "scheduler.h" #include "lq_plugin.h" void olsr_calculate_lq_mpr(void) { struct neighbor_2_entry *neigh2; struct neighbor_list_entry *walker; int i, k; struct neighbor_entry *neigh; olsr_linkcost best, best_1hop; bool mpr_changes = false; OLSR_FOR_ALL_NBR_ENTRIES(neigh) { /* Memorize previous MPR status. */ neigh->was_mpr = neigh->is_mpr; /* Clear current MPR status. */ neigh->is_mpr = false; /* In this pass we are only interested in WILL_ALWAYS neighbours */ if (neigh->status == NOT_SYM || neigh->willingness != WILL_ALWAYS) { continue; } neigh->is_mpr = true; if (neigh->is_mpr != neigh->was_mpr) { mpr_changes = true; } } OLSR_FOR_ALL_NBR_ENTRIES_END(neigh); for (i = 0; i < HASHSIZE; i++) { /* loop through all 2-hop neighbours */ for (neigh2 = two_hop_neighbortable[i].next; neigh2 != &two_hop_neighbortable[i]; neigh2 = neigh2->next) { best_1hop = LINK_COST_BROKEN; /* check whether this 2-hop neighbour is also a neighbour */ neigh = olsr_lookup_neighbor_table(&neigh2->neighbor_2_addr); /* if it's a neighbour and also symmetric, then examine the link quality */ if (neigh != NULL && neigh->status == SYM) { /* if the direct link is better than the best route via * an MPR, then prefer the direct link and do not select * an MPR for this 2-hop neighbour */ /* determine the link quality of the direct link */ struct link_entry *lnk = get_best_link_to_neighbor(&neigh->neighbor_main_addr); if (!lnk) continue; best_1hop = lnk->linkcost; /* see wether we find a better route via an MPR */ for (walker = neigh2->neighbor_2_nblist.next; walker != &neigh2->neighbor_2_nblist; walker = walker->next) if (walker->path_linkcost < best_1hop) break; /* we've reached the end of the list, so we haven't found * a better route via an MPR - so, skip MPR selection for * this 1-hop neighbor */ if (walker == &neigh2->neighbor_2_nblist) continue; } /* find the connecting 1-hop neighbours with the * best total link qualities */ /* mark all 1-hop neighbours as not selected */ for (walker = neigh2->neighbor_2_nblist.next; walker != &neigh2->neighbor_2_nblist; walker = walker->next) walker->neighbor->skip = false; for (k = 0; k < olsr_cnf->mpr_coverage; k++) { /* look for the best 1-hop neighbour that we haven't * yet selected */ neigh = NULL; best = LINK_COST_BROKEN; for (walker = neigh2->neighbor_2_nblist.next; walker != &neigh2->neighbor_2_nblist; walker = walker->next) if (walker->neighbor->status == SYM && !walker->neighbor->skip && walker->path_linkcost < best) { neigh = walker->neighbor; best = walker->path_linkcost; } /* Found a 1-hop neighbor that we haven't previously selected. * Use it as MPR only when the 2-hop path through it is better than * any existing 1-hop path. */ if ((neigh != NULL) && (best < best_1hop)) { neigh->is_mpr = true; neigh->skip = true; if (neigh->is_mpr != neigh->was_mpr) mpr_changes = true; } /* no neighbour found => the requested MPR coverage cannot * be satisfied => stop */ else break; } } } if (mpr_changes && olsr_cnf->tc_redundancy > 0) signal_link_changes(true); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_mpr.h000066400000000000000000000040161234304727700152520ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_LQ_MPR #define _OLSR_LQ_MPR void olsr_calculate_lq_mpr(void); #endif /* _OLSR_LQ_MPR */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_packet.c000066400000000000000000000450521234304727700157230ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2003, Andreas Tonnesen (andreto@olsr.org) * 2004, Thomas Lopatic (thomas@lopatic.de) * 2006, for some fixups, sven-ola(gmx.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include #include "ipcalc.h" #include "olsr_protocol.h" #include "defs.h" #include "lq_packet.h" #include "interfaces.h" #include "link_set.h" #include "neighbor_table.h" #include "mpr_selector_set.h" #include "mid_set.h" #include "mantissa.h" #include "process_package.h" // XXX - remove #include "two_hop_neighbor_table.h" #include "hysteresis.h" #include "olsr.h" #include "build_msg.h" #include "net_olsr.h" #include "lq_plugin.h" bool lq_tc_pending = false; static uint32_t msg_buffer_aligned[(MAXMESSAGESIZE - OLSR_HEADERSIZE) / sizeof(uint32_t) + 1]; static unsigned char *const msg_buffer = (unsigned char *)msg_buffer_aligned; static void create_lq_hello(struct lq_hello_message *lq_hello, struct interface *outif) { struct link_entry *walker; // initialize the static fields lq_hello->comm.type = LQ_HELLO_MESSAGE; lq_hello->comm.vtime = me_to_reltime(outif->valtimes.hello); lq_hello->comm.size = 0; lq_hello->comm.orig = olsr_cnf->main_addr; lq_hello->comm.ttl = 1; lq_hello->comm.hops = 0; lq_hello->htime = outif->hello_etime; lq_hello->will = olsr_cnf->willingness; lq_hello->neigh = NULL; // loop through the link set OLSR_FOR_ALL_LINK_ENTRIES(walker) { // allocate a neighbour entry struct lq_hello_neighbor *neigh = olsr_malloc_lq_hello_neighbor("Build LQ_HELLO"); // a) this neighbor interface IS NOT visible via the output interface if (!ipequal(&walker->local_iface_addr, &outif->ip_addr)) neigh->link_type = UNSPEC_LINK; // b) this neighbor interface IS visible via the output interface else neigh->link_type = lookup_link_status(walker); // set the entry's link quality olsr_copy_hello_lq(neigh, walker); // set the entry's neighbour type if (walker->neighbor->is_mpr) neigh->neigh_type = MPR_NEIGH; else if (walker->neighbor->status == SYM) neigh->neigh_type = SYM_NEIGH; else if (walker->neighbor->status == NOT_SYM) neigh->neigh_type = NOT_NEIGH; else { OLSR_PRINTF(0, "Error: neigh_type undefined"); neigh->neigh_type = NOT_NEIGH; } // set the entry's neighbour interface address neigh->addr = walker->neighbor_iface_addr; // queue the neighbour entry neigh->next = lq_hello->neigh; lq_hello->neigh = neigh; } OLSR_FOR_ALL_LINK_ENTRIES_END(walker); } static void destroy_lq_hello(struct lq_hello_message *lq_hello) { struct lq_hello_neighbor *walker, *aux; // loop through the queued neighbour entries and free them for (walker = lq_hello->neigh; walker != NULL; walker = aux) { aux = walker->next; free(walker); } lq_hello->neigh = NULL; } static void create_lq_tc(struct lq_tc_message *lq_tc, struct interface *outif) { struct link_entry *lnk; struct neighbor_entry *walker; struct tc_mpr_addr *neigh; static int ttl_list[] = { 2, 8, 2, 16, 2, 8, 2, MAX_TTL }; // remember that we have generated an LQ TC message; this is // checked in net_output() lq_tc_pending = true; // initialize the static fields lq_tc->comm.type = LQ_TC_MESSAGE; lq_tc->comm.vtime = me_to_reltime(outif->valtimes.tc); lq_tc->comm.size = 0; lq_tc->comm.orig = olsr_cnf->main_addr; if (olsr_cnf->lq_fish > 0) { if (outif->ttl_index >= (int)(sizeof(ttl_list) / sizeof(ttl_list[0]))) outif->ttl_index = 0; lq_tc->comm.ttl = (0 <= outif->ttl_index ? ttl_list[outif->ttl_index] : MAX_TTL); outif->ttl_index++; OLSR_PRINTF(3, "Creating LQ TC with TTL %d.\n", lq_tc->comm.ttl); } else lq_tc->comm.ttl = MAX_TTL; lq_tc->comm.hops = 0; lq_tc->from = olsr_cnf->main_addr; lq_tc->ansn = get_local_ansn(); lq_tc->neigh = NULL; OLSR_FOR_ALL_NBR_ENTRIES(walker) { /* * TC redundancy 2 * * Only consider symmetric neighbours. */ if (walker->status != SYM) { continue; } /* * TC redundancy 1 * * Only consider MPRs and MPR selectors */ if (olsr_cnf->tc_redundancy == 1 && !walker->is_mpr && !olsr_lookup_mprs_set(&walker->neighbor_main_addr)) { continue; } /* * TC redundancy 0 * * Only consider MPR selectors */ if (olsr_cnf->tc_redundancy == 0 && !olsr_lookup_mprs_set(&walker->neighbor_main_addr)) { continue; } /* Set the entry's link quality */ lnk = get_best_link_to_neighbor(&walker->neighbor_main_addr); if (!lnk) { continue; // no link ? } if (lnk->linkcost >= LINK_COST_BROKEN) { continue; // don't advertise links with very low LQ } /* Allocate a neighbour entry. */ neigh = olsr_malloc_tc_mpr_addr("Build LQ_TC"); /* Set the entry's main address. */ neigh->address = walker->neighbor_main_addr; if (lnk) { olsr_copylq_link_entry_2_tc_mpr_addr(neigh, lnk); } /* Queue the neighbour entry. */ // TODO: ugly hack until neighbor table is ported to avl tree if (lq_tc->neigh == NULL || avl_comp_default(&lq_tc->neigh->address, &neigh->address) > 0) { neigh->next = lq_tc->neigh; lq_tc->neigh = neigh; } else { struct tc_mpr_addr *last = lq_tc->neigh, *n = last->next; while (n) { if (avl_comp_default(&n->address, &neigh->address) > 0) { break; } last = n; n = n->next; } neigh->next = n; last->next = neigh; } // neigh->next = lq_tc->neigh; // lq_tc->neigh = neigh; } OLSR_FOR_ALL_NBR_ENTRIES_END(walker); } static void destroy_lq_tc(struct lq_tc_message *lq_tc) { struct tc_mpr_addr *walker, *aux; // loop through the queued neighbour entries and free them for (walker = lq_tc->neigh; walker != NULL; walker = aux) { aux = walker->next; free(walker); } } static int common_size(void) { // return the size of the header shared by all OLSR messages return (olsr_cnf->ip_version == AF_INET) ? sizeof(struct olsr_header_v4) : sizeof(struct olsr_header_v6); } static void serialize_common(struct olsr_common *comm) { if (olsr_cnf->ip_version == AF_INET) { // serialize an IPv4 OLSR message header struct olsr_header_v4 *olsr_head_v4 = (struct olsr_header_v4 *)ARM_NOWARN_ALIGN(msg_buffer); olsr_head_v4->type = comm->type; olsr_head_v4->vtime = reltime_to_me(comm->vtime); olsr_head_v4->size = htons(comm->size); olsr_head_v4->orig = comm->orig.v4.s_addr; olsr_head_v4->ttl = comm->ttl; olsr_head_v4->hops = comm->hops; olsr_head_v4->seqno = htons(get_msg_seqno()); } else { // serialize an IPv6 OLSR message header struct olsr_header_v6 *olsr_head_v6 = (struct olsr_header_v6 *)ARM_NOWARN_ALIGN(msg_buffer); olsr_head_v6->type = comm->type; olsr_head_v6->vtime = reltime_to_me(comm->vtime); olsr_head_v6->size = htons(comm->size); memcpy(&olsr_head_v6->orig, &comm->orig.v6.s6_addr, sizeof(olsr_head_v6->orig)); olsr_head_v6->ttl = comm->ttl; olsr_head_v6->hops = comm->hops; olsr_head_v6->seqno = htons(get_msg_seqno()); } } static void serialize_lq_hello(struct lq_hello_message *lq_hello, struct interface *outif) { static const int LINK_ORDER[] = { SYM_LINK, UNSPEC_LINK, ASYM_LINK, LOST_LINK }; int rem, size, req, expected_size = 0; struct lq_hello_info_header *info_head; struct lq_hello_neighbor *neigh; unsigned char *buff; bool is_first; int i; // leave space for the OLSR header int off = common_size(); // initialize the LQ_HELLO header struct lq_hello_header *head = (struct lq_hello_header *)ARM_NOWARN_ALIGN(msg_buffer + off); head->reserved = 0; head->htime = reltime_to_me(lq_hello->htime); head->will = lq_hello->will; // 'off' is the offset of the byte following the LQ_HELLO header off += sizeof(struct lq_hello_header); // our work buffer starts at 'off'... buff = msg_buffer + off; // ... that's why we start with a 'size' of 0 and subtract 'off' from // the remaining bytes in the output buffer size = 0; rem = net_outbuffer_bytes_left(outif) - off; /* * Initially, we want to put the complete lq_hello into the message. * For this flush the output buffer (if there are some bytes in). * This is a hack/fix, which prevents message fragmentation resulting * in unstable links. The ugly lq/genmsg code should be reworked anyhow. */ if (0 < net_output_pending(outif)) { for (i = 0; i <= MAX_NEIGH; i++) { unsigned int j; for (j = 0; j < sizeof(LINK_ORDER) / sizeof(LINK_ORDER[0]); j++) { is_first = true; for (neigh = lq_hello->neigh; neigh != NULL; neigh = neigh->next) { if (0 == i && 0 == j) expected_size += olsr_cnf->ipsize + olsr_sizeof_hello_lqdata(); if (neigh->neigh_type == i && neigh->link_type == LINK_ORDER[j]) { if (is_first) { expected_size += sizeof(struct lq_hello_info_header); is_first = false; } } } } } } if (rem < expected_size) { net_output(outif); rem = net_outbuffer_bytes_left(outif) - off; } info_head = NULL; // iterate through all neighbor types ('i') and all link types ('j') for (i = 0; i <= MAX_NEIGH; i++) { unsigned int j; for (j = 0; j < sizeof(LINK_ORDER) / sizeof(LINK_ORDER[0]); j++) { is_first = true; // loop through neighbors for (neigh = lq_hello->neigh; neigh != NULL; neigh = neigh->next) { if (neigh->neigh_type != i || neigh->link_type != LINK_ORDER[j]) continue; // we need space for an IP address plus link quality // information req = olsr_cnf->ipsize + olsr_sizeof_hello_lqdata(); // no, we also need space for an info header, as this is the // first neighbor with the current neighbor type and link type if (is_first) req += sizeof(struct lq_hello_info_header); // we do not have enough space left // force signed comparison if ((int)(size + req) > rem) { // finalize the OLSR header lq_hello->comm.size = size + off; serialize_common(&lq_hello->comm); // finalize the info header assert(info_head); info_head->size = ntohs(buff + size - (unsigned char *)info_head); // output packet net_outbuffer_push(outif, msg_buffer, size + off); net_output(outif); // move to the beginning of the buffer size = 0; rem = net_outbuffer_bytes_left(outif) - off; // we need a new info header is_first = true; } // create a new info header if (is_first) { info_head = (struct lq_hello_info_header *)ARM_NOWARN_ALIGN(buff + size); size += sizeof(struct lq_hello_info_header); info_head->reserved = 0; info_head->link_code = CREATE_LINK_CODE(i, LINK_ORDER[j]); } // add the current neighbor's IP address genipcopy(buff + size, &neigh->addr); size += olsr_cnf->ipsize; // add the corresponding link quality size += olsr_serialize_hello_lq_pair(&buff[size], neigh); is_first = false; } // finalize the info header, if there are any neighbors with the // current neighbor type and link type if (!is_first) info_head->size = ntohs(buff + size - (unsigned char *)info_head); } } // finalize the OLSR header lq_hello->comm.size = size + off; serialize_common((struct olsr_common *)lq_hello); // move the message to the output buffer net_outbuffer_push(outif, msg_buffer, size + off); } static uint8_t calculate_border_flag(void *lower_border, void *higher_border) { uint8_t *lower = lower_border; uint8_t *higher = higher_border; uint8_t bitmask; uint8_t part, bitpos; for (part = 0; part < olsr_cnf->ipsize; part++) { if (lower[part] != higher[part]) { break; } } if (part == olsr_cnf->ipsize) { // same IPs ? return 0; } // look for first bit of difference bitmask = 0xfe; for (bitpos = 0; bitpos < 8; bitpos++, bitmask <<= 1) { if ((lower[part] & bitmask) == (higher[part] & bitmask)) { break; } } bitpos += 8 * (olsr_cnf->ipsize - part - 1); return bitpos + 1; } static void serialize_lq_tc(struct lq_tc_message *lq_tc, struct interface *outif) { int off, rem, size, expected_size = 0; struct lq_tc_header *head; struct tc_mpr_addr *neigh; unsigned char *buff; union olsr_ip_addr *last_ip = NULL; uint8_t left_border_flag = 0xff; // leave space for the OLSR header off = common_size(); // initialize the LQ_TC header head = (struct lq_tc_header *)ARM_NOWARN_ALIGN(msg_buffer + off); head->ansn = htons(lq_tc->ansn); head->lower_border = 0; head->upper_border = 0; // 'off' is the offset of the byte following the LQ_TC header off += sizeof(struct lq_tc_header); // our work buffer starts at 'off'... buff = msg_buffer + off; // ... that's why we start with a 'size' of 0 and subtract 'off' from // the remaining bytes in the output buffer size = 0; rem = net_outbuffer_bytes_left(outif) - off; /* * Initially, we want to put the complete lq_tc into the message. * For this flush the output buffer (if there are some bytes in). * This is a hack/fix, which prevents message fragmentation resulting * in unstable links. The ugly lq/genmsg code should be reworked anyhow. */ if (0 < net_output_pending(outif)) { for (neigh = lq_tc->neigh; neigh != NULL; neigh = neigh->next) { expected_size += olsr_cnf->ipsize + olsr_sizeof_tc_lqdata(); } } if (rem < expected_size) { net_output(outif); rem = net_outbuffer_bytes_left(outif) - off; } // loop through neighbors for (neigh = lq_tc->neigh; neigh != NULL; neigh = neigh->next) { // we need space for an IP address plus link quality // information // force signed comparison if ((int)(size + olsr_cnf->ipsize + olsr_sizeof_tc_lqdata()) > rem) { head->lower_border = left_border_flag; assert(last_ip); head->upper_border = calculate_border_flag(last_ip, &neigh->address); left_border_flag = head->upper_border; // finalize the OLSR header lq_tc->comm.size = size + off; serialize_common((struct olsr_common *)lq_tc); // output packet net_outbuffer_push(outif, msg_buffer, size + off); net_output(outif); // move to the beginning of the buffer size = 0; rem = net_outbuffer_bytes_left(outif) - off; } // add the current neighbor's IP address genipcopy(buff + size, &neigh->address); // remember last ip last_ip = (union olsr_ip_addr *)ARM_NOWARN_ALIGN(buff + size); size += olsr_cnf->ipsize; // add the corresponding link quality size += olsr_serialize_tc_lq_pair(&buff[size], neigh); } // finalize the OLSR header head->lower_border = left_border_flag; head->upper_border = 0xff; lq_tc->comm.size = size + off; serialize_common((struct olsr_common *)lq_tc); net_outbuffer_push(outif, msg_buffer, size + off); } void olsr_output_lq_hello(void *para) { struct lq_hello_message lq_hello; struct interface *outif = para; if (outif == NULL) { return; } // create LQ_HELLO in internal format create_lq_hello(&lq_hello, outif); // convert internal format into transmission format, send it serialize_lq_hello(&lq_hello, outif); // destroy internal format destroy_lq_hello(&lq_hello); if (net_output_pending(outif)) { if (outif->immediate_send_tc) { if (TIMED_OUT(outif->fwdtimer)) set_buffer_timer(outif); } else { net_output(outif); } } } void olsr_output_lq_tc(void *para) { static int prev_empty = 1; struct lq_tc_message lq_tc; struct interface *outif = para; if (outif == NULL) { return; } // create LQ_TC in internal format create_lq_tc(&lq_tc, outif); // a) the message is not empty if (lq_tc.neigh != NULL) { prev_empty = 0; // convert internal format into transmission format, send it serialize_lq_tc(&lq_tc, outif); // b) this is the first empty message } else if (prev_empty == 0) { // initialize timer set_empty_tc_timer(GET_TIMESTAMP(olsr_cnf->max_tc_vtime * 3 * MSEC_PER_SEC)); prev_empty = 1; // convert internal format into transmission format, send it serialize_lq_tc(&lq_tc, outif); // c) this is not the first empty message, send if timer hasn't fired } else if (!TIMED_OUT(get_empty_tc_timer())) { serialize_lq_tc(&lq_tc, outif); } // destroy internal format destroy_lq_tc(&lq_tc); if (net_output_pending(outif)) { if (!outif->immediate_send_tc) { if (TIMED_OUT(outif->fwdtimer)) set_buffer_timer(outif); } else { net_output(outif); } } } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_packet.h000066400000000000000000000147721234304727700157350ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_LQ_PACKET_H #define _OLSR_LQ_PACKET_H #include "olsr_types.h" #include "packet.h" #include "mantissa.h" #include "ipcalc.h" #define LQ_HELLO_MESSAGE 201 #define LQ_TC_MESSAGE 202 /* deserialized OLSR header */ struct olsr_common { uint8_t type; olsr_reltime vtime; uint16_t size; union olsr_ip_addr orig; uint8_t ttl; uint8_t hops; uint16_t seqno; }; /* serialized IPv4 OLSR header */ struct olsr_header_v4 { uint8_t type; uint8_t vtime; uint16_t size; uint32_t orig; uint8_t ttl; uint8_t hops; uint16_t seqno; }; /* serialized IPv6 OLSR header */ struct olsr_header_v6 { uint8_t type; uint8_t vtime; uint16_t size; unsigned char orig[16]; uint8_t ttl; uint8_t hops; uint16_t seqno; }; /* deserialized LQ_HELLO */ struct lq_hello_neighbor { uint8_t link_type; uint8_t neigh_type; union olsr_ip_addr addr; struct lq_hello_neighbor *next; uint32_t linkquality[0]; }; struct lq_hello_message { struct olsr_common comm; olsr_reltime htime; uint8_t will; struct lq_hello_neighbor *neigh; }; /* serialized LQ_HELLO */ struct lq_hello_info_header { uint8_t link_code; uint8_t reserved; uint16_t size; }; struct lq_hello_header { uint16_t reserved; uint8_t htime; uint8_t will; }; /* deserialized LQ_TC */ struct lq_tc_message { struct olsr_common comm; union olsr_ip_addr from; uint16_t ansn; struct tc_mpr_addr *neigh; }; /* serialized LQ_TC */ struct lq_tc_header { uint16_t ansn; uint8_t lower_border; uint8_t upper_border; }; static INLINE void pkt_get_u8(const uint8_t ** p, uint8_t * var) { *var = *(const uint8_t *)(*p); *p += sizeof(uint8_t); } static INLINE void pkt_get_u16(const uint8_t ** p, uint16_t * var) { *var = ntohs(**((const uint16_t **)p)); *p += sizeof(uint16_t); } static INLINE void pkt_get_u32(const uint8_t ** p, uint32_t * var) { *var = ntohl(**((const uint32_t **)p)); *p += sizeof(uint32_t); } static INLINE void pkt_get_s8(const uint8_t ** p, int8_t * var) { *var = *(const int8_t *)(*p); *p += sizeof(int8_t); } static INLINE void pkt_get_s16(const uint8_t ** p, int16_t * var) { *var = ntohs(**((const int16_t **)p)); *p += sizeof(int16_t); } static INLINE void pkt_get_s32(const uint8_t ** p, int32_t * var) { *var = ntohl(**((const int32_t **)p)); *p += sizeof(int32_t); } static INLINE void pkt_get_reltime(const uint8_t ** p, olsr_reltime * var) { *var = me_to_reltime(**p); *p += sizeof(uint8_t); } static INLINE void pkt_get_ipaddress(const uint8_t ** p, union olsr_ip_addr *var) { memcpy(var, *p, olsr_cnf->ipsize); *p += olsr_cnf->ipsize; } static INLINE void pkt_get_prefixlen(const uint8_t ** p, uint8_t * var) { *var = netmask_to_prefix(*p, olsr_cnf->ipsize); *p += olsr_cnf->ipsize; } static INLINE void pkt_ignore_u8(const uint8_t ** p) { *p += sizeof(uint8_t); } static INLINE void pkt_ignore_u16(const uint8_t ** p) { *p += sizeof(uint16_t); } static INLINE void pkt_ignore_u32(const uint8_t ** p) { *p += sizeof(uint32_t); } static INLINE void pkt_ignore_s8(const uint8_t ** p) { *p += sizeof(int8_t); } static INLINE void pkt_ignore_s16(const uint8_t ** p) { *p += sizeof(int16_t); } static INLINE void pkt_ignore_s32(const uint8_t ** p) { *p += sizeof(int32_t); } static INLINE void pkt_ignore_ipaddress(const uint8_t ** p) { *p += olsr_cnf->ipsize; } static INLINE void pkt_ignore_prefixlen(const uint8_t ** p) { *p += olsr_cnf->ipsize; } static INLINE void pkt_put_u8(uint8_t ** p, uint8_t var) { **((uint8_t **)p) = var; *p += sizeof(uint8_t); } static INLINE void pkt_put_u16(uint8_t ** p, uint16_t var) { **((uint16_t **)p) = htons(var); *p += sizeof(uint16_t); } static INLINE void pkt_put_u32(uint8_t ** p, uint32_t var) { **((uint32_t **)p) = htonl(var); *p += sizeof(uint32_t); } static INLINE void pkt_put_s8(uint8_t ** p, int8_t var) { **((int8_t **)p) = var; *p += sizeof(int8_t); } static INLINE void pkt_put_s16(uint8_t ** p, int16_t var) { **((int16_t **)p) = htons(var); *p += sizeof(int16_t); } static INLINE void pkt_put_s32(uint8_t ** p, int32_t var) { **((int32_t **)p) = htonl(var); *p += sizeof(int32_t); } static INLINE void pkt_put_reltime(uint8_t ** p, olsr_reltime var) { **p = reltime_to_me(var); *p += sizeof(uint8_t); } static INLINE void pkt_put_ipaddress(uint8_t ** p, const union olsr_ip_addr *var) { memcpy(*p, var, olsr_cnf->ipsize); *p += olsr_cnf->ipsize; } void olsr_output_lq_hello(void *para); void olsr_output_lq_tc(void *para); void olsr_input_lq_hello(union olsr_message *ser, struct interface *inif, union olsr_ip_addr *from); extern bool lq_tc_pending; #endif /* _OLSR_LQ_PACKET_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_plugin.c000066400000000000000000000360231234304727700157500ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "tc_set.h" #include "link_set.h" #include "olsr_spf.h" #include "lq_packet.h" #include "packet.h" #include "olsr.h" #include "two_hop_neighbor_table.h" #include "common/avl.h" #include "lq_plugin_default_float.h" #include "lq_plugin_default_fpm.h" #include "lq_plugin_default_ff.h" #include "lq_plugin_default_ffeth.h" #ifdef LINUX_NL80211 #include "linux/lq_plugin_ffeth_nl80211.h" #endif #include struct avl_tree lq_handler_tree; struct lq_handler *active_lq_handler = NULL; /** * case-insensitive string comparator for avl-trees * @param str1 * @param str2 * @return */ int avl_strcasecmp(const void *str1, const void *str2) { return strcasecmp(str1, str2); } /** * Activate a LQ handler * @param name */ static void activate_lq_handler(const char *name) { struct lq_handler_node *node; node = (struct lq_handler_node *)avl_find(&lq_handler_tree, name); if (node == NULL) { OLSR_PRINTF(1, "Error, unknown lq_handler '%s'\n", name); olsr_exit("", 1); } OLSR_PRINTF(1, "Using '%s' algorithm for lq calculation.\n", name); active_lq_handler = node->handler; active_lq_handler->initialize(); } /** * Initialize LQ handler */ void init_lq_handler_tree(void) { avl_init(&lq_handler_tree, &avl_strcasecmp); register_lq_handler(&lq_etx_float_handler, LQ_ALGORITHM_ETX_FLOAT_NAME); register_lq_handler(&lq_etx_fpm_handler, LQ_ALGORITHM_ETX_FPM_NAME); register_lq_handler(&lq_etx_ff_handler, LQ_ALGORITHM_ETX_FF_NAME); register_lq_handler(&lq_etx_ffeth_handler, LQ_ALGORITHM_ETX_FFETH_NAME); #ifdef LINUX_NL80211 register_lq_handler(&lq_etx_ffeth_nl80211_handler, LQ_ALGORITHM_ETX_FFETH_NL80211_NAME); #endif if (olsr_cnf->lq_algorithm == NULL) { activate_lq_handler(DEF_LQ_ALGORITHM); } else { activate_lq_handler(olsr_cnf->lq_algorithm); } } /** * set_lq_handler * * this function is used by routing metric plugins to activate their link * quality handler * * The name parameter is marked as "unused" to squelch a compiler warning if debug * output is not active * * @param handler pointer to lq_handler structure * @param name name of the link quality handler for debug output */ void register_lq_handler(struct lq_handler *handler, const char *name) { struct lq_handler_node *node; size_t name_size = sizeof(*node) + strlen(name) + 1; node = olsr_malloc(name_size, "olsr lq handler"); strscpy(node->name, name, name_size); node->node.key = node->name; node->handler = handler; avl_insert(&lq_handler_tree, &node->node, false); } /** * olsr_calc_tc_cost * * this function calculates the linkcost of a tc_edge_entry * * @param tc_edge pointer to the tc_edge_entry * @return linkcost */ olsr_linkcost olsr_calc_tc_cost(const struct tc_edge_entry * tc_edge) { assert((const char *)tc_edge + sizeof(*tc_edge) >= (const char *)tc_edge->linkquality); return active_lq_handler->calc_tc_cost(tc_edge->linkquality); } /** * olsr_serialize_hello_lq_pair * * this function converts the lq information of a lq_hello_neighbor into binary package * format * * @param buff pointer to binary buffer to write into * @param neigh pointer to lq_hello_neighbor * @return number of bytes that have been written */ int olsr_serialize_hello_lq_pair(unsigned char *buff, struct lq_hello_neighbor *neigh) { assert((const char *)neigh + sizeof(*neigh) >= (const char *)neigh->linkquality); return active_lq_handler->serialize_hello_lq(buff, neigh->linkquality); } /** * olsr_deserialize_hello_lq_pair * * this function reads the lq information of a binary package into a hello_neighbor * It also initialize the cost variable of the hello_neighbor * * @param curr pointer to the current buffer pointer * @param neigh pointer to hello_neighbor */ void olsr_deserialize_hello_lq_pair(const uint8_t ** curr, struct hello_neighbor *neigh) { assert((const char *)neigh + sizeof(*neigh) >= (const char *)neigh->linkquality); active_lq_handler->deserialize_hello_lq(curr, neigh->linkquality); neigh->cost = active_lq_handler->calc_hello_cost(neigh->linkquality); } /** * olsr_serialize_tc_lq_pair * * this function converts the lq information of a olsr_serialize_tc_lq_pair * into binary package format * * @param buff pointer to binary buffer to write into * @param neigh pointer to olsr_serialize_tc_lq_pair * @return number of bytes that have been written */ int olsr_serialize_tc_lq_pair(unsigned char *buff, struct tc_mpr_addr *neigh) { assert((const char *)neigh + sizeof(*neigh) >= (const char *)neigh->linkquality); return active_lq_handler->serialize_tc_lq(buff, neigh->linkquality); } /** * olsr_deserialize_tc_lq_pair * * this function reads the lq information of a binary package into a tc_edge_entry * * @param curr pointer to the current buffer pointer * @param edge pointer to tc_edge_entry */ void olsr_deserialize_tc_lq_pair(const uint8_t ** curr, struct tc_edge_entry *edge) { assert((const char *)edge + sizeof(*edge) >= (const char *)edge->linkquality); active_lq_handler->deserialize_tc_lq(curr, edge->linkquality); } /** * olsr_update_packet_loss_worker * * this function is called every times a hello package for a certain link_entry * is lost (timeout) or received. This way the lq-plugin can update the links link * quality value. * * @param entry pointer to link_entry * @param lost true if hello package was lost */ void olsr_update_packet_loss_worker(struct link_entry *entry, bool lost) { assert((const char *)entry + sizeof(*entry) >= (const char *)entry->linkquality); active_lq_handler->packet_loss_handler(entry, entry->linkquality, lost); } /** * olsr_memorize_foreign_hello_lq * * this function is called to copy the link quality information from a received * hello package into a link_entry. * * @param local pointer to link_entry * @param foreign pointer to hello_neighbor, if NULL the neighbor link quality information * of the link entry has to be reset to "zero" */ void olsr_memorize_foreign_hello_lq(struct link_entry *local, struct hello_neighbor *foreign) { assert((const char *)local + sizeof(*local) >= (const char *)local->linkquality); if (foreign) { assert((const char *)foreign + sizeof(*foreign) >= (const char *)foreign->linkquality); active_lq_handler->memorize_foreign_hello(local->linkquality, foreign->linkquality); } else { active_lq_handler->memorize_foreign_hello(local->linkquality, NULL); } } /** * get_link_entry_text * * this function returns the text representation of a link_entry cost value. * It's not thread save and should not be called twice with the same println * value in the same context (a single printf command for example). * * @param entry to link_entry * @param separator separator between LQ and NLQ * @param buffer for output * @return pointer to a buffer with the text representation */ const char * get_link_entry_text(struct link_entry *entry, char separator, struct lqtextbuffer *buffer) { assert((const char *)entry + sizeof(*entry) >= (const char *)entry->linkquality); return active_lq_handler->print_hello_lq(entry->linkquality, separator, buffer); } /** * get_tc_edge_entry_text * * this function returns the text representation of a tc_edge_entry cost value. * It's not thread save and should not be called twice with the same println * value in the same context (a single printf command for example). * * @param entry pointer to tc_edge_entry * @param separator separator between LQ and NLQ * @param buffer pointer to buffer * @return pointer to the buffer with the text representation */ const char * get_tc_edge_entry_text(struct tc_edge_entry *entry, char separator, struct lqtextbuffer *buffer) { assert((const char *)entry + sizeof(*entry) >= (const char *)entry->linkquality); return active_lq_handler->print_tc_lq(entry->linkquality, separator, buffer); } /** * get_linkcost_text * * This function transforms an olsr_linkcost value into it's text representation and copies * the result into a buffer. * * @param cost link cost value * @param route true to transform the cost of a route, false for a link * @param buffer pointer to buffer * @return pointer to buffer filled with text */ const char * get_linkcost_text(olsr_linkcost cost, bool route, struct lqtextbuffer *buffer) { static const char *infinite = "INFINITE"; if (route) { if (cost == ROUTE_COST_BROKEN) { return infinite; } } else { if (cost >= LINK_COST_BROKEN) { return infinite; } } return active_lq_handler->print_cost(cost, buffer); } /** * olsr_copy_hello_lq * * this function copies the link quality information from a link_entry to a * lq_hello_neighbor. * * @param target pointer to target lq_hello_neighbor * @param source pointer to source link_entry */ void olsr_copy_hello_lq(struct lq_hello_neighbor *target, struct link_entry *source) { assert((const char *)target + sizeof(*target) >= (const char *)target->linkquality); assert((const char *)source + sizeof(*source) >= (const char *)source->linkquality); active_lq_handler->copy_link_lq_into_neigh(target->linkquality, source->linkquality); } /** * olsr_copylq_link_entry_2_tc_mpr_addr * * this function copies the link quality information from a link_entry to a * tc_mpr_addr. * * @param target pointer to tc_mpr_addr * @param source pointer to link_entry */ void olsr_copylq_link_entry_2_tc_mpr_addr(struct tc_mpr_addr *target, struct link_entry *source) { assert((const char *)target + sizeof(*target) >= (const char *)target->linkquality); assert((const char *)source + sizeof(*source) >= (const char *)source->linkquality); active_lq_handler->copy_link_lq_into_tc(target->linkquality, source->linkquality); } /** * olsr_copylq_link_entry_2_tc_edge_entry * * this function copies the link quality information from a link_entry to a * tc_edge_entry. * * @param target pointer to tc_edge_entry * @param source pointer to link_entry */ void olsr_copylq_link_entry_2_tc_edge_entry(struct tc_edge_entry *target, struct link_entry *source) { assert((const char *)target + sizeof(*target) >= (const char *)target->linkquality); assert((const char *)source + sizeof(*source) >= (const char *)source->linkquality); active_lq_handler->copy_link_lq_into_tc(target->linkquality, source->linkquality); } /* clear the lq of a link set entry */ void olsr_clear_hello_lq(struct link_entry *link) { active_lq_handler->clear_hello(link->linkquality); } /** * olsr_clear_tc_lq * * this function resets the linkquality value of a tc_mpr_addr * * @param target pointer to tc_mpr_addr */ void olsr_clear_tc_lq(struct tc_mpr_addr *target) { assert((const char *)target + sizeof(*target) >= (const char *)target->linkquality); active_lq_handler->clear_tc(target->linkquality); } /** * olsr_malloc_hello_neighbor * * this function allocates memory for an hello_neighbor inclusive * linkquality data. * * @param id string for memory debugging * * @return pointer to hello_neighbor */ struct hello_neighbor * olsr_malloc_hello_neighbor(const char *id) { struct hello_neighbor *h; h = olsr_malloc(sizeof(struct hello_neighbor) + active_lq_handler->hello_lq_size, id); assert((const char *)h + sizeof(*h) >= (const char *)h->linkquality); active_lq_handler->clear_hello(h->linkquality); return h; } /** * olsr_malloc_tc_mpr_addr * * this function allocates memory for an tc_mpr_addr inclusive * linkquality data. * * @param id string for memory debugging * * @return pointer to tc_mpr_addr */ struct tc_mpr_addr * olsr_malloc_tc_mpr_addr(const char *id) { struct tc_mpr_addr *t; t = olsr_malloc(sizeof(struct tc_mpr_addr) + active_lq_handler->tc_lq_size, id); assert((const char *)t + sizeof(*t) >= (const char *)t->linkquality); active_lq_handler->clear_tc(t->linkquality); return t; } /** * olsr_malloc_lq_hello_neighbor * * this function allocates memory for an lq_hello_neighbor inclusive * linkquality data. * * @param id string for memory debugging * * @return pointer to lq_hello_neighbor */ struct lq_hello_neighbor * olsr_malloc_lq_hello_neighbor(const char *id) { struct lq_hello_neighbor *h; h = olsr_malloc(sizeof(struct lq_hello_neighbor) + active_lq_handler->hello_lq_size, id); assert((const char *)h + sizeof(*h) >= (const char *)h->linkquality); active_lq_handler->clear_hello(h->linkquality); return h; } /** * olsr_malloc_link_entry * * this function allocates memory for an link_entry inclusive * linkquality data. * * @param id string for memory debugging * * @return pointer to link_entry */ struct link_entry * olsr_malloc_link_entry(const char *id) { struct link_entry *h; h = olsr_malloc(sizeof(struct link_entry) + active_lq_handler->hello_lq_size, id); assert((const char *)h + sizeof(*h) >= (const char *)h->linkquality); active_lq_handler->clear_hello(h->linkquality); return h; } size_t olsr_sizeof_hello_lqdata(void) { return active_lq_handler->hello_lqdata_size; } size_t olsr_sizeof_tc_lqdata(void) { return active_lq_handler->tc_lqdata_size; } /** * This function should be called whenever the current linkcost * value changed in a relevant way. */ void olsr_relevant_linkcost_change(void) { changes_neighborhood = true; changes_topology = true; /* XXX - we should check whether we actually announce this neighbour */ signal_link_changes(true); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_plugin.h000066400000000000000000000135161234304727700157570ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef LQPLUGIN_H_ #define LQPLUGIN_H_ #include "tc_set.h" #include "link_set.h" #include "olsr_spf.h" #include "lq_packet.h" #include "packet.h" #include "common/avl.h" #define LINK_COST_BROKEN (1<<22) #define ROUTE_COST_BROKEN (0xffffffff) #define ZERO_ROUTE_COST 0 #define MINIMAL_USEFUL_LQ 0.1 #define LQ_PLUGIN_RELEVANT_COSTCHANGE 16 #define LQ_QUICKSTART_STEPS 12 #define LQ_QUICKSTART_AGING 0.25 struct lqtextbuffer { char buf[16]; }; struct lq_handler { void (*initialize) (void); olsr_linkcost (*calc_hello_cost) (const void *lq); olsr_linkcost (*calc_tc_cost) (const void *lq); void (*packet_loss_handler) (struct link_entry * entry, void *lq, bool lost); void (*memorize_foreign_hello) (void *local, void *foreign); void (*copy_link_lq_into_neigh) (void *target, void *source); void (*copy_link_lq_into_tc) (void *target, void *source); void (*clear_hello) (void *target); void (*clear_tc) (void *target); int (*serialize_hello_lq) (unsigned char *buff, void *lq); int (*serialize_tc_lq) (unsigned char *buff, void *lq); void (*deserialize_hello_lq) (const uint8_t ** curr, void *lq); void (*deserialize_tc_lq) (const uint8_t ** curr, void *lq); const char *(*print_hello_lq) (void *ptr, char separator, struct lqtextbuffer * buffer); const char *(*print_tc_lq) (void *ptr, char separator, struct lqtextbuffer * buffer); const char *(*print_cost) (olsr_linkcost cost, struct lqtextbuffer * buffer); size_t hello_lq_size; size_t tc_lq_size; size_t hello_lqdata_size; size_t tc_lqdata_size; }; struct lq_handler_node { struct avl_node node; struct lq_handler *handler; char name[0]; }; AVLNODE2STRUCT(lq_handler_tree2lq_handler_node, struct lq_handler_node, node); #define OLSR_FOR_ALL_LQ_HANDLERS(lq) \ { \ struct avl_node *lq_tree_node, *next_lq_tree_node; \ for (lq_tree_node = avl_walk_first(&lq_handler_tree); \ lq_tree_node; lq_tree_node = next_lq_tree_node) { \ next_lq_tree_node = avl_walk_next(lq_tree_node); \ lq = lq_handler_tree2lq_handler_node(lq_tree_node); #define OLSR_FOR_ALL_LQ_HANDLERS_END(tc) }} int avl_strcasecmp(const void *str1, const void *str2); void init_lq_handler_tree(void); void register_lq_handler(struct lq_handler *handler, const char *name); olsr_linkcost olsr_calc_tc_cost(const struct tc_edge_entry *); int olsr_serialize_hello_lq_pair(unsigned char *buff, struct lq_hello_neighbor *neigh); void olsr_deserialize_hello_lq_pair(const uint8_t ** curr, struct hello_neighbor *neigh); int olsr_serialize_tc_lq_pair(unsigned char *buff, struct tc_mpr_addr *neigh); void olsr_deserialize_tc_lq_pair(const uint8_t ** curr, struct tc_edge_entry *edge); void olsr_update_packet_loss_worker(struct link_entry *entry, bool lost); void olsr_memorize_foreign_hello_lq(struct link_entry *local, struct hello_neighbor *foreign); const char *get_link_entry_text(struct link_entry *entry, char separator, struct lqtextbuffer *buffer); const char *get_tc_edge_entry_text(struct tc_edge_entry *entry, char separator, struct lqtextbuffer *buffer); const char *get_linkcost_text(olsr_linkcost cost, bool route, struct lqtextbuffer *buffer); void olsr_clear_hello_lq(struct link_entry */*link*/); void olsr_copy_hello_lq(struct lq_hello_neighbor *target, struct link_entry *source); void olsr_copylq_link_entry_2_tc_mpr_addr(struct tc_mpr_addr *target, struct link_entry *source); void olsr_copylq_link_entry_2_tc_edge_entry(struct tc_edge_entry *target, struct link_entry *source); void olsr_clear_tc_lq(struct tc_mpr_addr *target); struct hello_neighbor *olsr_malloc_hello_neighbor(const char *id); struct tc_mpr_addr *olsr_malloc_tc_mpr_addr(const char *id); struct lq_hello_neighbor *olsr_malloc_lq_hello_neighbor(const char *id); struct link_entry *olsr_malloc_link_entry(const char *id); size_t olsr_sizeof_hello_lqdata(void); size_t olsr_sizeof_tc_lqdata(void); void olsr_relevant_linkcost_change(void); /* Externals. */ extern struct lq_handler *active_lq_handler; #endif /* LQPLUGIN_H_ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_plugin_default_ff.c000066400000000000000000000272551234304727700201360ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "tc_set.h" #include "link_set.h" #include "lq_plugin.h" #include "olsr_spf.h" #include "lq_packet.h" #include "packet.h" #include "olsr.h" #include "lq_plugin_default_ff.h" #include "parser.h" #include "fpm.h" #include "mid_set.h" #include "scheduler.h" #include "log.h" #include static void default_lq_initialize_ff(void); static olsr_linkcost default_lq_calc_cost_ff(const void *lq); static void default_lq_packet_loss_worker_ff(struct link_entry *link, void *lq, bool lost); static void default_lq_memorize_foreign_hello_ff(void *local, void *foreign); static int default_lq_serialize_hello_lq_pair_ff(unsigned char *buff, void *lq); static void default_lq_deserialize_hello_lq_pair_ff(const uint8_t ** curr, void *lq); static int default_lq_serialize_tc_lq_pair_ff(unsigned char *buff, void *lq); static void default_lq_deserialize_tc_lq_pair_ff(const uint8_t ** curr, void *lq); static void default_lq_copy_link2neigh_ff(void *t, void *s); static void default_lq_copy_link2tc_ff(void *target, void *source); static void default_lq_clear_ff(void *target); static void default_lq_clear_ff_hello(void *target); static const char *default_lq_print_ff(void *ptr, char separator, struct lqtextbuffer *buffer); static const char *default_lq_print_cost_ff(olsr_linkcost cost, struct lqtextbuffer *buffer); /* etx lq plugin (freifunk fpm version) settings */ struct lq_handler lq_etx_ff_handler = { &default_lq_initialize_ff, &default_lq_calc_cost_ff, &default_lq_calc_cost_ff, &default_lq_packet_loss_worker_ff, &default_lq_memorize_foreign_hello_ff, &default_lq_copy_link2neigh_ff, &default_lq_copy_link2tc_ff, &default_lq_clear_ff_hello, &default_lq_clear_ff, &default_lq_serialize_hello_lq_pair_ff, &default_lq_serialize_tc_lq_pair_ff, &default_lq_deserialize_hello_lq_pair_ff, &default_lq_deserialize_tc_lq_pair_ff, &default_lq_print_ff, &default_lq_print_ff, &default_lq_print_cost_ff, sizeof(struct default_lq_ff_hello), sizeof(struct default_lq_ff), 4, 4 }; static void default_lq_ff_handle_lqchange(void) { struct default_lq_ff_hello *lq; struct ipaddr_str buf; struct link_entry *link; bool triggered = false; OLSR_FOR_ALL_LINK_ENTRIES(link) { bool relevant = false; lq = (struct default_lq_ff_hello *)link->linkquality; if (lq->smoothed_lq.valueLq < lq->lq.valueLq) { if (lq->lq.valueLq == 255 || lq->lq.valueLq - lq->smoothed_lq.valueLq > lq->smoothed_lq.valueLq/10) { relevant = true; } } else if (lq->smoothed_lq.valueLq > lq->lq.valueLq) { if (lq->smoothed_lq.valueLq - lq->lq.valueLq > lq->smoothed_lq.valueLq/10) { relevant = true; } } if (lq->smoothed_lq.valueNlq < lq->lq.valueNlq) { if (lq->lq.valueNlq == 255 || lq->lq.valueNlq - lq->smoothed_lq.valueNlq > lq->smoothed_lq.valueNlq/10) { relevant = true; } } else if (lq->smoothed_lq.valueNlq > lq->lq.valueNlq) { if (lq->smoothed_lq.valueNlq - lq->lq.valueNlq > lq->smoothed_lq.valueNlq/10) { relevant = true; } } if (relevant) { memcpy(&lq->smoothed_lq, &lq->lq, sizeof(struct default_lq_ff)); link->linkcost = default_lq_calc_cost_ff(&lq->smoothed_lq); triggered = true; } } OLSR_FOR_ALL_LINK_ENTRIES_END(link) if (!triggered) { return; } OLSR_FOR_ALL_LINK_ENTRIES(link) { lq = (struct default_lq_ff_hello *)link->linkquality; if (lq->smoothed_lq.valueLq == 255 && lq->smoothed_lq.valueNlq == 255) { continue; } if (lq->smoothed_lq.valueLq == lq->lq.valueLq && lq->smoothed_lq.valueNlq == lq->lq.valueNlq) { continue; } memcpy(&lq->smoothed_lq, &lq->lq, sizeof(struct default_lq_ff)); link->linkcost = default_lq_calc_cost_ff(&lq->smoothed_lq); } OLSR_FOR_ALL_LINK_ENTRIES_END(link) olsr_relevant_linkcost_change(); } static void default_lq_parser_ff(struct olsr *olsr, struct interface *in_if, union olsr_ip_addr *from_addr) { const union olsr_ip_addr *main_addr; struct link_entry *lnk; struct default_lq_ff_hello *lq; uint32_t seq_diff; /* Find main address */ main_addr = mid_lookup_main_addr(from_addr); /* Loopup link entry */ lnk = lookup_link_entry(from_addr, main_addr, in_if); if (lnk == NULL) { return; } lq = (struct default_lq_ff_hello *)lnk->linkquality; /* ignore double package */ if (lq->last_seq_nr == olsr->olsr_seqno) { struct ipaddr_str buf; olsr_syslog(OLSR_LOG_INFO, "detected duplicate packet with seqnr 0x%x from %s on %s (%d Bytes)", olsr->olsr_seqno,olsr_ip_to_string(&buf, from_addr),in_if->int_name,ntohs(olsr->olsr_packlen)); return; } if (lq->last_seq_nr > olsr->olsr_seqno) { seq_diff = (uint32_t) olsr->olsr_seqno + 65536 - lq->last_seq_nr; } else { seq_diff = olsr->olsr_seqno - lq->last_seq_nr; } /* Jump in sequence numbers ? */ if (seq_diff > 256) { seq_diff = 1; } lq->received[lq->activePtr]++; lq->total[lq->activePtr] += seq_diff; lq->last_seq_nr = olsr->olsr_seqno; lq->missed_hellos = 0; } static void default_lq_ff_timer(void __attribute__ ((unused)) * context) { struct link_entry *link; OLSR_FOR_ALL_LINK_ENTRIES(link) { struct default_lq_ff_hello *tlq = (struct default_lq_ff_hello *)link->linkquality; fpm ratio; int i, received, total; received = 0; total = 0; /* enlarge window if still in quickstart phase */ if (tlq->windowSize < LQ_FF_WINDOW) { tlq->windowSize++; } for (i = 0; i < tlq->windowSize; i++) { received += tlq->received[i]; total += tlq->total[i]; } /* calculate link quality */ if (total == 0) { tlq->lq.valueLq = 0; } else { // start with link-loss-factor ratio = fpmidiv(itofpm(link->loss_link_multiplier), LINK_LOSS_MULTIPLIER); /* keep missed hello periods in mind (round up hello interval to seconds) */ if (tlq->missed_hellos > 1) { received = received - received * tlq->missed_hellos * link->inter->hello_etime/1000 / LQ_FF_WINDOW; } // calculate received/total factor ratio = fpmmuli(ratio, received); ratio = fpmidiv(ratio, total); ratio = fpmmuli(ratio, 255); tlq->lq.valueLq = (uint8_t) (fpmtoi(ratio)); } // shift buffer tlq->activePtr = (tlq->activePtr + 1) % LQ_FF_WINDOW; tlq->total[tlq->activePtr] = 0; tlq->received[tlq->activePtr] = 0; } OLSR_FOR_ALL_LINK_ENTRIES_END(link); default_lq_ff_handle_lqchange(); } static void default_lq_initialize_ff(void) { olsr_packetparser_add_function(&default_lq_parser_ff); olsr_start_timer(1000, 0, OLSR_TIMER_PERIODIC, &default_lq_ff_timer, NULL, 0); } static olsr_linkcost default_lq_calc_cost_ff(const void *ptr) { const struct default_lq_ff *lq = ptr; olsr_linkcost cost; if (lq->valueLq < (unsigned int)(255 * MINIMAL_USEFUL_LQ) || lq->valueNlq < (unsigned int)(255 * MINIMAL_USEFUL_LQ)) { return LINK_COST_BROKEN; } cost = fpmidiv(itofpm(255 * 255), (int)lq->valueLq * (int)lq->valueNlq); if (cost > LINK_COST_BROKEN) return LINK_COST_BROKEN; if (cost == 0) return 1; return cost; } static int default_lq_serialize_hello_lq_pair_ff(unsigned char *buff, void *ptr) { struct default_lq_ff *lq = ptr; buff[0] = (unsigned char)lq->valueLq; buff[1] = (unsigned char)lq->valueNlq; buff[2] = (unsigned char)(0); buff[3] = (unsigned char)(0); return 4; } static void default_lq_deserialize_hello_lq_pair_ff(const uint8_t ** curr, void *ptr) { struct default_lq_ff *lq = ptr; pkt_get_u8(curr, &lq->valueLq); pkt_get_u8(curr, &lq->valueNlq); pkt_ignore_u16(curr); } static int default_lq_serialize_tc_lq_pair_ff(unsigned char *buff, void *ptr) { struct default_lq_ff *lq = ptr; buff[0] = (unsigned char)lq->valueLq; buff[1] = (unsigned char)lq->valueNlq; buff[2] = (unsigned char)(0); buff[3] = (unsigned char)(0); return 4; } static void default_lq_deserialize_tc_lq_pair_ff(const uint8_t ** curr, void *ptr) { struct default_lq_ff *lq = ptr; pkt_get_u8(curr, &lq->valueLq); pkt_get_u8(curr, &lq->valueNlq); pkt_ignore_u16(curr); } static void default_lq_packet_loss_worker_ff(struct link_entry *link, void __attribute__ ((unused)) *ptr, bool lost) { struct default_lq_ff_hello *tlq = (struct default_lq_ff_hello *)link->linkquality; if (lost) { tlq->missed_hellos++; } return; } static void default_lq_memorize_foreign_hello_ff(void *ptrLocal, void *ptrForeign) { struct default_lq_ff_hello *local = ptrLocal; struct default_lq_ff *foreign = ptrForeign; if (foreign) { local->lq.valueNlq = foreign->valueLq; } else { local->lq.valueNlq = 0; } } static void default_lq_copy_link2neigh_ff(void *t, void *s) { struct default_lq_ff *target = t; struct default_lq_ff_hello *source = s; *target = source->smoothed_lq; } static void default_lq_copy_link2tc_ff(void *t, void *s) { struct default_lq_ff *target = t; struct default_lq_ff_hello *source = s; *target = source->smoothed_lq; } static void default_lq_clear_ff(void *target) { memset(target, 0, sizeof(struct default_lq_ff)); } static void default_lq_clear_ff_hello(void *target) { struct default_lq_ff_hello *local = target; int i; default_lq_clear_ff(&local->lq); default_lq_clear_ff(&local->smoothed_lq); local->windowSize = LQ_FF_QUICKSTART_INIT; for (i = 0; i < LQ_FF_WINDOW; i++) { local->total[i] = 3; } } static const char * default_lq_print_ff(void *ptr, char separator, struct lqtextbuffer *buffer) { struct default_lq_ff *lq = ptr; snprintf(buffer->buf, sizeof(buffer->buf), "%s%c%s", fpmtoa(fpmidiv(itofpm((int)lq->valueLq), 255)), separator, fpmtoa(fpmidiv(itofpm((int)lq->valueNlq), 255))); return buffer->buf; } static const char * default_lq_print_cost_ff(olsr_linkcost cost, struct lqtextbuffer *buffer) { snprintf(buffer->buf, sizeof(buffer->buf), "%s", fpmtoa(cost)); return buffer->buf; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_plugin_default_ff.h000066400000000000000000000050371234304727700201350ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef LQ_ETX_FF_ #define LQ_ETX_FF_ #include "olsr_types.h" #include "lq_plugin.h" #define LQ_PLUGIN_LC_MULTIPLIER 1024 #define LQ_PLUGIN_RELEVANT_COSTCHANGE_FF 16 #define LQ_ALGORITHM_ETX_FF_NAME "etx_ff" #define LQ_FF_WINDOW 32 #define LQ_FF_QUICKSTART_INIT 4 struct default_lq_ff { uint8_t valueLq; uint8_t valueNlq; }; struct default_lq_ff_hello { struct default_lq_ff smoothed_lq; struct default_lq_ff lq; uint8_t windowSize, activePtr; uint16_t last_seq_nr; uint16_t missed_hellos; uint16_t received[LQ_FF_WINDOW], total[LQ_FF_WINDOW]; }; extern struct lq_handler lq_etx_ff_handler; #endif /* LQ_ETX_FF_ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_plugin_default_ffeth.c000066400000000000000000000320441234304727700206270ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "tc_set.h" #include "link_set.h" #include "lq_plugin.h" #include "olsr_spf.h" #include "lq_packet.h" #include "packet.h" #include "olsr.h" #include "lq_plugin_default_ffeth.h" #include "parser.h" #include "fpm.h" #include "mid_set.h" #include "scheduler.h" #include "log.h" #define LQ_PLUGIN_LC_MULTIPLIER 1024 #define LQ_PLUGIN_RELEVANT_COSTCHANGE_FF 16 static void default_lq_initialize_ffeth(void); static olsr_linkcost default_lq_calc_cost_ffeth(const void *lq); static void default_lq_packet_loss_worker_ffeth(struct link_entry *link, void *lq, bool lost); static void default_lq_memorize_foreign_hello_ffeth(void *local, void *foreign); static int default_lq_serialize_hello_lq_pair_ffeth(unsigned char *buff, void *lq); static void default_lq_deserialize_hello_lq_pair_ffeth(const uint8_t ** curr, void *lq); static int default_lq_serialize_tc_lq_pair_ffeth(unsigned char *buff, void *lq); static void default_lq_deserialize_tc_lq_pair_ffeth(const uint8_t ** curr, void *lq); static void default_lq_copy_link2neigh_ffeth(void *t, void *s); static void default_lq_copy_link2tc_ffeth(void *target, void *source); static void default_lq_clear_ffeth(void *target); static void default_lq_clear_ffeth_hello(void *target); static const char *default_lq_print_ffeth(void *ptr, char separator, struct lqtextbuffer *buffer); static const char *default_lq_print_cost_ffeth(olsr_linkcost cost, struct lqtextbuffer *buffer); /* etx lq plugin (freifunk fpm version) settings */ struct lq_handler lq_etx_ffeth_handler = { &default_lq_initialize_ffeth, &default_lq_calc_cost_ffeth, &default_lq_calc_cost_ffeth, &default_lq_packet_loss_worker_ffeth, &default_lq_memorize_foreign_hello_ffeth, &default_lq_copy_link2neigh_ffeth, &default_lq_copy_link2tc_ffeth, &default_lq_clear_ffeth_hello, &default_lq_clear_ffeth, &default_lq_serialize_hello_lq_pair_ffeth, &default_lq_serialize_tc_lq_pair_ffeth, &default_lq_deserialize_hello_lq_pair_ffeth, &default_lq_deserialize_tc_lq_pair_ffeth, &default_lq_print_ffeth, &default_lq_print_ffeth, &default_lq_print_cost_ffeth, sizeof(struct default_lq_ffeth_hello), sizeof(struct default_lq_ffeth), 4, 4 }; static void default_lq_ffeth_handle_lqchange(void) { struct default_lq_ffeth_hello *lq; struct ipaddr_str buf; struct link_entry *link; bool triggered = false; OLSR_FOR_ALL_LINK_ENTRIES(link) { bool relevant = false; lq = (struct default_lq_ffeth_hello *)link->linkquality; if (lq->smoothed_lq.valueLq < lq->lq.valueLq) { if (lq->lq.valueLq >= 254 || lq->lq.valueLq - lq->smoothed_lq.valueLq > lq->smoothed_lq.valueLq/10) { relevant = true; } } else if (lq->smoothed_lq.valueLq > lq->lq.valueLq) { if (lq->smoothed_lq.valueLq - lq->lq.valueLq > lq->smoothed_lq.valueLq/10) { relevant = true; } } if (lq->smoothed_lq.valueNlq < lq->lq.valueNlq) { if (lq->lq.valueNlq >= 254 || lq->lq.valueNlq - lq->smoothed_lq.valueNlq > lq->smoothed_lq.valueNlq/10) { relevant = true; } } else if (lq->smoothed_lq.valueNlq > lq->lq.valueNlq) { if (lq->smoothed_lq.valueNlq - lq->lq.valueNlq > lq->smoothed_lq.valueNlq/10) { relevant = true; } } if (relevant) { memcpy(&lq->smoothed_lq, &lq->lq, sizeof(struct default_lq_ffeth)); link->linkcost = default_lq_calc_cost_ffeth(&lq->smoothed_lq); triggered = true; } } OLSR_FOR_ALL_LINK_ENTRIES_END(link) if (!triggered) { return; } OLSR_FOR_ALL_LINK_ENTRIES(link) { lq = (struct default_lq_ffeth_hello *)link->linkquality; if (lq->smoothed_lq.valueLq >= 254 && lq->smoothed_lq.valueNlq >= 254) { continue; } if (lq->smoothed_lq.valueLq == lq->lq.valueLq && lq->smoothed_lq.valueNlq == lq->lq.valueNlq) { continue; } memcpy(&lq->smoothed_lq, &lq->lq, sizeof(struct default_lq_ffeth)); link->linkcost = default_lq_calc_cost_ffeth(&lq->smoothed_lq); } OLSR_FOR_ALL_LINK_ENTRIES_END(link) olsr_relevant_linkcost_change(); } static void default_lq_parser_ffeth(struct olsr *olsr, struct interface *in_if, union olsr_ip_addr *from_addr) { const union olsr_ip_addr *main_addr; struct link_entry *lnk; struct default_lq_ffeth_hello *lq; uint32_t seq_diff; /* Find main address */ main_addr = mid_lookup_main_addr(from_addr); /* Loopup link entry */ lnk = lookup_link_entry(from_addr, main_addr, in_if); if (lnk == NULL) { return; } lq = (struct default_lq_ffeth_hello *)lnk->linkquality; /* ignore double package */ if (lq->last_seq_nr == olsr->olsr_seqno) { struct ipaddr_str buf; olsr_syslog(OLSR_LOG_INFO, "detected duplicate packet with seqnr %d from %s on %s (%d Bytes)", olsr->olsr_seqno,olsr_ip_to_string(&buf, from_addr),in_if->int_name,ntohs(olsr->olsr_packlen)); return; } if (lq->last_seq_nr > olsr->olsr_seqno) { seq_diff = (uint32_t) olsr->olsr_seqno + 65536 - lq->last_seq_nr; } else { seq_diff = olsr->olsr_seqno - lq->last_seq_nr; } /* Jump in sequence numbers ? */ if (seq_diff > 256) { seq_diff = 1; } lq->received[lq->activePtr]++; lq->total[lq->activePtr] += seq_diff; lq->last_seq_nr = olsr->olsr_seqno; lq->missed_hellos = 0; } static void default_lq_ffeth_timer(void __attribute__ ((unused)) * context) { struct link_entry *link; OLSR_FOR_ALL_LINK_ENTRIES(link) { struct default_lq_ffeth_hello *tlq = (struct default_lq_ffeth_hello *)link->linkquality; fpm ratio; int i, received, total; received = 0; total = 0; /* enlarge window if still in quickstart phase */ if (tlq->windowSize < LQ_FFETH_WINDOW) { tlq->windowSize++; } for (i = 0; i < tlq->windowSize; i++) { received += tlq->received[i]; total += tlq->total[i]; } /* calculate link quality */ if (total == 0) { tlq->lq.valueLq = 0; } else { // start with link-loss-factor ratio = fpmidiv(itofpm(link->loss_link_multiplier), LINK_LOSS_MULTIPLIER); /* keep missed hello periods in mind (round up hello interval to seconds) */ if (tlq->missed_hellos > 1) { received = received - received * tlq->missed_hellos * link->inter->hello_etime/1000 / LQ_FFETH_WINDOW; } // calculate received/total factor ratio = fpmmuli(ratio, received); ratio = fpmidiv(ratio, total); ratio = fpmmuli(ratio, 255); tlq->lq.valueLq = (uint8_t) (fpmtoi(ratio)); } /* ethernet booster */ if (link->inter->mode == IF_MODE_ETHER) { if (tlq->lq.valueLq > (uint8_t)(0.95 * 255)) { tlq->perfect_eth = true; } else if (tlq->lq.valueLq > (uint8_t)(0.90 * 255)) { tlq->perfect_eth = false; } if (tlq->perfect_eth) { tlq->lq.valueLq = 255; } } else if (link->inter->mode != IF_MODE_ETHER && tlq->lq.valueLq > 0) { tlq->lq.valueLq--; } // shift buffer tlq->activePtr = (tlq->activePtr + 1) % LQ_FFETH_WINDOW; tlq->total[tlq->activePtr] = 0; tlq->received[tlq->activePtr] = 0; } OLSR_FOR_ALL_LINK_ENTRIES_END(link); default_lq_ffeth_handle_lqchange(); } static void default_lq_initialize_ffeth(void) { if (olsr_cnf->lq_nat_thresh < 1.0f) { fprintf(stderr, "Warning, nat_treshold < 1.0 is more likely to produce loops with etx_ffeth\n"); } olsr_packetparser_add_function(&default_lq_parser_ffeth); olsr_start_timer(1000, 0, OLSR_TIMER_PERIODIC, &default_lq_ffeth_timer, NULL, 0); } static olsr_linkcost default_lq_calc_cost_ffeth(const void *ptr) { const struct default_lq_ffeth *lq = ptr; olsr_linkcost cost; bool ether; int lq_int, nlq_int; if (lq->valueLq < (unsigned int)(255 * MINIMAL_USEFUL_LQ) || lq->valueNlq < (unsigned int)(255 * MINIMAL_USEFUL_LQ)) { return LINK_COST_BROKEN; } ether = lq->valueLq == 255 && lq->valueNlq == 255; lq_int = (int)lq->valueLq; if (lq_int > 0 && lq_int < 255) { lq_int++; } nlq_int = (int)lq->valueNlq; if (nlq_int > 0 && nlq_int < 255) { nlq_int++; } cost = fpmidiv(itofpm(255 * 255), lq_int * nlq_int); if (ether) { /* ethernet boost */ cost /= 10; } if (cost > LINK_COST_BROKEN) return LINK_COST_BROKEN; if (cost == 0) return 1; return cost; } static int default_lq_serialize_hello_lq_pair_ffeth(unsigned char *buff, void *ptr) { struct default_lq_ffeth *lq = ptr; buff[0] = (unsigned char)(0); buff[1] = (unsigned char)(0); buff[2] = (unsigned char)lq->valueLq; buff[3] = (unsigned char)lq->valueNlq; return 4; } static void default_lq_deserialize_hello_lq_pair_ffeth(const uint8_t ** curr, void *ptr) { struct default_lq_ffeth *lq = ptr; pkt_ignore_u16(curr); pkt_get_u8(curr, &lq->valueLq); pkt_get_u8(curr, &lq->valueNlq); } static int default_lq_serialize_tc_lq_pair_ffeth(unsigned char *buff, void *ptr) { struct default_lq_ffeth *lq = ptr; buff[0] = (unsigned char)(0); buff[1] = (unsigned char)(0); buff[2] = (unsigned char)lq->valueLq; buff[3] = (unsigned char)lq->valueNlq; return 4; } static void default_lq_deserialize_tc_lq_pair_ffeth(const uint8_t ** curr, void *ptr) { struct default_lq_ffeth *lq = ptr; pkt_ignore_u16(curr); pkt_get_u8(curr, &lq->valueLq); pkt_get_u8(curr, &lq->valueNlq); } static void default_lq_packet_loss_worker_ffeth(struct link_entry *link, void __attribute__ ((unused)) *ptr, bool lost) { struct default_lq_ffeth_hello *tlq = (struct default_lq_ffeth_hello *)link->linkquality; if (lost) { tlq->missed_hellos++; } return; } static void default_lq_memorize_foreign_hello_ffeth(void *ptrLocal, void *ptrForeign) { struct default_lq_ffeth_hello *local = ptrLocal; struct default_lq_ffeth *foreign = ptrForeign; if (foreign) { local->lq.valueNlq = foreign->valueLq; } else { local->lq.valueNlq = 0; } } static void default_lq_copy_link2neigh_ffeth(void *t, void *s) { struct default_lq_ffeth *target = t; struct default_lq_ffeth_hello *source = s; *target = source->smoothed_lq; } static void default_lq_copy_link2tc_ffeth(void *t, void *s) { struct default_lq_ffeth *target = t; struct default_lq_ffeth_hello *source = s; *target = source->smoothed_lq; } static void default_lq_clear_ffeth(void *target) { memset(target, 0, sizeof(struct default_lq_ffeth)); } static void default_lq_clear_ffeth_hello(void *target) { struct default_lq_ffeth_hello *local = target; int i; default_lq_clear_ffeth(&local->lq); default_lq_clear_ffeth(&local->smoothed_lq); local->windowSize = LQ_FFETH_QUICKSTART_INIT; for (i = 0; i < LQ_FFETH_WINDOW; i++) { local->total[i] = 3; } } static const char * default_lq_print_ffeth(void *ptr, char separator, struct lqtextbuffer *buffer) { struct default_lq_ffeth *lq = ptr; int lq_int, nlq_int; lq_int = (int)lq->valueLq; if (lq_int > 0 && lq_int < 255) { lq_int++; } nlq_int = (int)lq->valueNlq; if (nlq_int > 0 && nlq_int < 255) { nlq_int++; } snprintf(buffer->buf, sizeof(buffer->buf), "%s%c%s", fpmtoa(fpmidiv(itofpm(lq_int), 255)), separator, fpmtoa(fpmidiv(itofpm(nlq_int), 255))); return buffer->buf; } static const char * default_lq_print_cost_ffeth(olsr_linkcost cost, struct lqtextbuffer *buffer) { snprintf(buffer->buf, sizeof(buffer->buf), "%s", fpmtoa(cost)); return buffer->buf; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_plugin_default_ffeth.h000066400000000000000000000050131234304727700206300ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef LQ_ETX_FFETH_ #define LQ_ETX_FFETH_ #include "olsr_types.h" #include "lq_plugin.h" #define LQ_ALGORITHM_ETX_FFETH_NAME "etx_ffeth" #define LQ_FFETH_WINDOW 32 #define LQ_FFETH_QUICKSTART_INIT 4 struct default_lq_ffeth { uint8_t valueLq; uint8_t valueNlq; }; struct default_lq_ffeth_hello { struct default_lq_ffeth smoothed_lq; struct default_lq_ffeth lq; uint8_t windowSize, activePtr; uint16_t last_seq_nr; uint16_t missed_hellos; bool perfect_eth; uint16_t received[LQ_FFETH_WINDOW], total[LQ_FFETH_WINDOW]; }; extern struct lq_handler lq_etx_ffeth_handler; #endif /* LQ_ETX_FFETH_ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_plugin_default_float.c000066400000000000000000000156471234304727700206520ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "tc_set.h" #include "link_set.h" #include "olsr_spf.h" #include "lq_packet.h" #include "packet.h" #include "olsr.h" #include "lq_plugin_default_float.h" static void default_lq_initialize_float(void); static olsr_linkcost default_lq_calc_cost_float(const void *lq); static void default_lq_packet_loss_worker_float(struct link_entry *link, void *lq, bool lost); static void default_lq_memorize_foreign_hello_float(void *local, void *foreign); static int default_lq_serialize_hello_lq_pair_float(unsigned char *buff, void *lq); static void default_lq_deserialize_hello_lq_pair_float(const uint8_t ** curr, void *lq); static int default_lq_serialize_tc_lq_pair_float(unsigned char *buff, void *lq); static void default_lq_deserialize_tc_lq_pair_float(const uint8_t ** curr, void *lq); static void default_lq_copy_link2tc_float(void *target, void *source); static void default_lq_clear_float(void *target); static const char *default_lq_print_float(void *ptr, char separator, struct lqtextbuffer *buffer); static const char *default_lq_print_cost_float(olsr_linkcost cost, struct lqtextbuffer *buffer); /* Default lq plugin settings */ struct lq_handler lq_etx_float_handler = { &default_lq_initialize_float, &default_lq_calc_cost_float, &default_lq_calc_cost_float, &default_lq_packet_loss_worker_float, &default_lq_memorize_foreign_hello_float, &default_lq_copy_link2tc_float, &default_lq_copy_link2tc_float, &default_lq_clear_float, &default_lq_clear_float, &default_lq_serialize_hello_lq_pair_float, &default_lq_serialize_tc_lq_pair_float, &default_lq_deserialize_hello_lq_pair_float, &default_lq_deserialize_tc_lq_pair_float, &default_lq_print_float, &default_lq_print_float, &default_lq_print_cost_float, sizeof(struct default_lq_float), sizeof(struct default_lq_float), 4, 4 }; static void default_lq_initialize_float(void) { return; } static olsr_linkcost default_lq_calc_cost_float(const void *ptr) { const struct default_lq_float *lq = ptr; olsr_linkcost cost; if (lq->lq < (float)MINIMAL_USEFUL_LQ || lq->nlq < (float)MINIMAL_USEFUL_LQ) { return LINK_COST_BROKEN; } cost = (olsr_linkcost) (1.0f / (lq->lq * lq->nlq) * (float)LQ_PLUGIN_LC_MULTIPLIER); if (cost > LINK_COST_BROKEN) return LINK_COST_BROKEN; if (cost == 0) { return 1; } return cost; } static int default_lq_serialize_hello_lq_pair_float(unsigned char *buff, void *ptr) { struct default_lq_float *lq = ptr; buff[0] = (unsigned char)(lq->lq * 255); buff[1] = (unsigned char)(lq->nlq * 255); buff[2] = 0; buff[3] = 0; return 4; } static void default_lq_deserialize_hello_lq_pair_float(const uint8_t ** curr, void *ptr) { struct default_lq_float *lq = ptr; uint8_t lq_value, nlq_value; pkt_get_u8(curr, &lq_value); pkt_get_u8(curr, &nlq_value); pkt_ignore_u16(curr); lq->lq = (float)lq_value / 255.0f; lq->nlq = (float)nlq_value / 255.0f; } static int default_lq_serialize_tc_lq_pair_float(unsigned char *buff, void *ptr) { struct default_lq_float *lq = ptr; buff[0] = (unsigned char)(lq->lq * 255); buff[1] = (unsigned char)(lq->nlq * 255); buff[2] = 0; buff[3] = 0; return 4; } static void default_lq_deserialize_tc_lq_pair_float(const uint8_t ** curr, void *ptr) { struct default_lq_float *lq = ptr; uint8_t lq_value, nlq_value; pkt_get_u8(curr, &lq_value); pkt_get_u8(curr, &nlq_value); pkt_ignore_u16(curr); lq->lq = (float)lq_value / 255.0f; lq->nlq = (float)nlq_value / 255.0f; } static void default_lq_packet_loss_worker_float(struct link_entry *link, void *ptr, bool lost) { struct default_lq_float *tlq = ptr; float alpha = olsr_cnf->lq_aging; if (tlq->quickstart < LQ_QUICKSTART_STEPS) { alpha = LQ_QUICKSTART_AGING; /* fast enough to get the LQ value within 6 Hellos up to 0.9 */ tlq->quickstart++; } // exponential moving average tlq->lq *= (1 - alpha); if (lost == 0) { tlq->lq += (alpha * link->loss_link_multiplier / 65536); } link->linkcost = default_lq_calc_cost_float(ptr); olsr_relevant_linkcost_change(); } static void default_lq_memorize_foreign_hello_float(void *ptrLocal, void *ptrForeign) { struct default_lq_float *local = ptrLocal; struct default_lq_float *foreign = ptrForeign; if (foreign) { local->nlq = foreign->lq; } else { local->nlq = 0; } } static void default_lq_copy_link2tc_float(void *target, void *source) { memcpy(target, source, sizeof(struct default_lq_float)); } static void default_lq_clear_float(void *target) { memset(target, 0, sizeof(struct default_lq_float)); } static const char * default_lq_print_float(void *ptr, char separator, struct lqtextbuffer *buffer) { struct default_lq_float *lq = ptr; snprintf(buffer->buf, sizeof(struct lqtextbuffer), "%2.3f%c%2.3f", (double)lq->lq, separator, (double)lq->nlq); return buffer->buf; } static const char * default_lq_print_cost_float(olsr_linkcost cost, struct lqtextbuffer *buffer) { snprintf(buffer->buf, sizeof(struct lqtextbuffer), "%2.3f", (double)(((float)cost) / (float)LQ_PLUGIN_LC_MULTIPLIER)); return buffer->buf; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_plugin_default_float.h000066400000000000000000000043721234304727700206500ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef LQ_PLUGIN_DEFAULT_H_ #define LQ_PLUGIN_DEFAULT_H_ #include "olsr_types.h" #include "lq_plugin.h" #define LQ_ALGORITHM_ETX_FLOAT_NAME "etx_float" #define LQ_PLUGIN_LC_MULTIPLIER 1024 struct default_lq_float { float lq, nlq; uint16_t quickstart; }; extern struct lq_handler lq_etx_float_handler; #endif /* LQ_PLUGIN_DEFAULT_H_ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_plugin_default_fpm.c000066400000000000000000000170401234304727700203140ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "tc_set.h" #include "link_set.h" #include "lq_plugin.h" #include "olsr_spf.h" #include "lq_packet.h" #include "packet.h" #include "olsr.h" #include "lq_plugin_default_fpm.h" static void default_lq_initialize_fpm(void); static olsr_linkcost default_lq_calc_cost_fpm(const void *lq); static void default_lq_packet_loss_worker_fpm(struct link_entry *link, void *lq, bool lost); static void default_lq_memorize_foreign_hello_fpm(void *local, void *foreign); static int default_lq_serialize_hello_lq_pair_fpm(unsigned char *buff, void *lq); static void default_lq_deserialize_hello_lq_pair_fpm(const uint8_t ** curr, void *lq); static int default_lq_serialize_tc_lq_pair_fpm(unsigned char *buff, void *lq); static void default_lq_deserialize_tc_lq_pair_fpm(const uint8_t ** curr, void *lq); static void default_lq_copy_link2tc_fpm(void *target, void *source); static void default_lq_clear_fpm(void *target); static const char *default_lq_print_fpm(void *ptr, char separator, struct lqtextbuffer *buffer); static const char *default_lq_print_cost_fpm(olsr_linkcost cost, struct lqtextbuffer *buffer); /* etx lq plugin (fpm version) settings */ struct lq_handler lq_etx_fpm_handler = { &default_lq_initialize_fpm, &default_lq_calc_cost_fpm, &default_lq_calc_cost_fpm, &default_lq_packet_loss_worker_fpm, &default_lq_memorize_foreign_hello_fpm, &default_lq_copy_link2tc_fpm, &default_lq_copy_link2tc_fpm, &default_lq_clear_fpm, &default_lq_clear_fpm, &default_lq_serialize_hello_lq_pair_fpm, &default_lq_serialize_tc_lq_pair_fpm, &default_lq_deserialize_hello_lq_pair_fpm, &default_lq_deserialize_tc_lq_pair_fpm, &default_lq_print_fpm, &default_lq_print_fpm, &default_lq_print_cost_fpm, sizeof(struct default_lq_fpm), sizeof(struct default_lq_fpm), 4, 4 }; uint32_t aging_factor_new, aging_factor_old; uint32_t aging_quickstart_new, aging_quickstart_old; static void default_lq_initialize_fpm(void) { aging_factor_new = (uint32_t) (olsr_cnf->lq_aging * LQ_FPM_INTERNAL_MULTIPLIER); aging_factor_old = LQ_FPM_INTERNAL_MULTIPLIER - aging_factor_new; aging_quickstart_new = (uint32_t) (LQ_QUICKSTART_AGING * LQ_FPM_INTERNAL_MULTIPLIER); aging_quickstart_old = LQ_FPM_INTERNAL_MULTIPLIER - aging_quickstart_new; } static olsr_linkcost default_lq_calc_cost_fpm(const void *ptr) { const struct default_lq_fpm *lq = ptr; olsr_linkcost cost; if (lq->valueLq < (unsigned int)(255 * MINIMAL_USEFUL_LQ) || lq->valueNlq < (unsigned int)(255 * MINIMAL_USEFUL_LQ)) { return LINK_COST_BROKEN; } cost = LQ_FPM_LINKCOST_MULTIPLIER * 255 / (int)lq->valueLq * 255 / (int)lq->valueNlq; if (cost > LINK_COST_BROKEN) return LINK_COST_BROKEN; if (cost == 0) return 1; return cost; } static int default_lq_serialize_hello_lq_pair_fpm(unsigned char *buff, void *ptr) { struct default_lq_fpm *lq = ptr; buff[0] = (unsigned char)lq->valueLq; buff[1] = (unsigned char)lq->valueNlq; buff[2] = (unsigned char)(0); buff[3] = (unsigned char)(0); return 4; } static void default_lq_deserialize_hello_lq_pair_fpm(const uint8_t ** curr, void *ptr) { struct default_lq_fpm *lq = ptr; pkt_get_u8(curr, &lq->valueLq); pkt_get_u8(curr, &lq->valueNlq); pkt_ignore_u16(curr); } static int default_lq_serialize_tc_lq_pair_fpm(unsigned char *buff, void *ptr) { struct default_lq_fpm *lq = ptr; buff[0] = (unsigned char)lq->valueLq; buff[1] = (unsigned char)lq->valueNlq; buff[2] = (unsigned char)(0); buff[3] = (unsigned char)(0); return 4; } static void default_lq_deserialize_tc_lq_pair_fpm(const uint8_t ** curr, void *ptr) { struct default_lq_fpm *lq = ptr; pkt_get_u8(curr, &lq->valueLq); pkt_get_u8(curr, &lq->valueNlq); pkt_ignore_u16(curr); } static void default_lq_packet_loss_worker_fpm(struct link_entry *link __attribute__ ((unused)), void *ptr, bool lost) { struct default_lq_fpm *tlq = ptr; uint32_t alpha_old = aging_factor_old; uint32_t alpha_new = aging_factor_new; uint32_t value; if (tlq->quickstart < LQ_QUICKSTART_STEPS) { alpha_new = aging_quickstart_new; alpha_old = aging_quickstart_old; tlq->quickstart++; } // exponential moving average value = (uint32_t) (tlq->valueLq) * LQ_FPM_INTERNAL_MULTIPLIER / 255; value = (value * alpha_old + LQ_FPM_INTERNAL_MULTIPLIER - 1) / LQ_FPM_INTERNAL_MULTIPLIER; if (!lost) { uint32_t ratio; ratio = (alpha_new * link->loss_link_multiplier + LINK_LOSS_MULTIPLIER - 1) / LINK_LOSS_MULTIPLIER; value += ratio; } tlq->valueLq = (value * 255 + LQ_FPM_INTERNAL_MULTIPLIER - 1) / LQ_FPM_INTERNAL_MULTIPLIER; link->linkcost = default_lq_calc_cost_fpm(ptr); olsr_relevant_linkcost_change(); } static void default_lq_memorize_foreign_hello_fpm(void *ptrLocal, void *ptrForeign) { struct default_lq_fpm *local = ptrLocal; struct default_lq_fpm *foreign = ptrForeign; if (foreign) { local->valueNlq = foreign->valueLq; } else { local->valueNlq = 0; } } static void default_lq_copy_link2tc_fpm(void *target, void *source) { memcpy(target, source, sizeof(struct default_lq_fpm)); } static void default_lq_clear_fpm(void *target) { memset(target, 0, sizeof(struct default_lq_fpm)); } static const char * default_lq_print_fpm(void *ptr, char separator, struct lqtextbuffer *buffer) { struct default_lq_fpm *lq = ptr; snprintf(buffer->buf, sizeof(buffer->buf), "%0.3f%c%0.3f", (double)(lq->valueLq) / (double)255.0, separator, (double)(lq->valueNlq) / (double)255.0); return buffer->buf; } static const char * default_lq_print_cost_fpm(olsr_linkcost cost, struct lqtextbuffer *buffer) { snprintf(buffer->buf, sizeof(buffer->buf), "%.3f", (double)(cost) / (double)LQ_FPM_LINKCOST_MULTIPLIER); return buffer->buf; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/lq_plugin_default_fpm.h000066400000000000000000000045721234304727700203270ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008 Henning Rogge * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef LQ_ETX_FPM_ #define LQ_ETX_FPM_ #include "olsr_types.h" #include "lq_plugin.h" /* use only 1<<16 - 1 to allow the multiplication of two * upscaled numbers between 0 and 1 */ #define LQ_FPM_INTERNAL_MULTIPLIER 65535 #define LQ_FPM_LINKCOST_MULTIPLIER 65535 #define LQ_ALGORITHM_ETX_FPM_NAME "etx_fpm" struct default_lq_fpm { uint8_t valueLq; uint8_t valueNlq; uint16_t quickstart; }; extern struct lq_handler lq_etx_fpm_handler; #endif /* LQ_ETX_FPM_ */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/main.c000066400000000000000000001002721234304727700147000ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include #include #include #include #include #include "ipcalc.h" #include "defs.h" #include "builddata.h" #include "olsr.h" #include "log.h" #include "scheduler.h" #include "parser.h" #include "generate_msg.h" #include "plugin_loader.h" #include "apm.h" #include "net_os.h" #include "build_msg.h" #include "net_olsr.h" #include "mid_set.h" #include "mpr_selector_set.h" #include "gateway.h" #include "olsr_niit.h" #ifdef __linux__ #include #include #include "kernel_routes.h" #endif /* __linux__ */ #ifdef _WIN32 #include #include #define olsr_shutdown(x) SignalHandler(x) #define close(x) closesocket(x) int __stdcall SignalHandler(unsigned long signo) __attribute__ ((noreturn)); void ListInterfaces(void); void DisableIcmpRedirects(void); bool olsr_win32_end_request = false; bool olsr_win32_end_flag = false; #else /* _WIN32 */ static void olsr_shutdown(int) __attribute__ ((noreturn)); #endif /* _WIN32 */ #if defined __ANDROID__ #define DEFAULT_LOCKFILE_PREFIX "/data/local/olsrd" #elif defined linux || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ #define DEFAULT_LOCKFILE_PREFIX "/var/run/olsrd" #elif defined _WIN32 #define DEFAULT_LOCKFILE_PREFIX "C:\\olsrd" #else /* defined _WIN32 */ #define DEFAULT_LOCKFILE_PREFIX "olsrd" #endif /* defined _WIN32 */ /* * Local function prototypes */ void olsr_reconfigure(int signo) __attribute__ ((noreturn)); static void print_usage(bool error); static int set_default_ifcnfs(struct olsr_if *, struct if_config_options *); static int olsr_process_arguments(int, char *[], struct olsrd_config *, struct if_config_options *); #ifndef _WIN32 static char **olsr_argv; #endif /* _WIN32 */ static char copyright_string[] __attribute__ ((unused)) = "The olsr.org Optimized Link-State Routing daemon(olsrd) Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) All rights reserved."; /* Data for OLSR locking */ #ifndef _WIN32 static int lock_fd = 0; #endif /* _WIN32 */ static char lock_file_name[FILENAME_MAX]; struct olsr_cookie_info *def_timer_ci = NULL; /* * Creates a zero-length locking file and use fcntl to * place an exclusive lock over it. The lock will be * automatically erased when the olsrd process ends, * so it will even work well with a SIGKILL. * * Additionally the lock can be killed by removing the * locking file. */ static int olsr_create_lock_file(bool noExitOnFail) { #ifdef _WIN32 bool success; HANDLE lck; lck = CreateFile(lock_file_name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL); CreateEvent(NULL, TRUE, FALSE, lock_file_name); if (INVALID_HANDLE_VALUE == lck || ERROR_ALREADY_EXISTS == GetLastError()) { if (noExitOnFail) { return -1; } if (NULL == lck) { fprintf(stderr, "Error, cannot create OLSR lock '%s'.\n", lock_file_name); } else { CloseHandle(lck); fprintf(stderr, "Error, cannot aquire OLSR lock '%s'.\n" "Another OLSR instance might be running.\n", lock_file_name); } olsr_exit("", EXIT_FAILURE); } success = LockFile( lck, 0, 0, 0, 0); if (!success) { CloseHandle(lck); if (noExitOnFail) { return -1; } fprintf(stderr, "Error, cannot aquire OLSR lock '%s'.\n" "Another OLSR instance might be running.\n", lock_file_name); olsr_exit("", EXIT_FAILURE); } #else /* _WIN32 */ struct flock lck; /* create file for lock */ lock_fd = open(lock_file_name, O_WRONLY | O_CREAT, S_IRWXU); if (lock_fd < 0) { if (noExitOnFail) { return -1; } fprintf(stderr, "Error, cannot create OLSR lock '%s'.\n", lock_file_name); olsr_exit("", EXIT_FAILURE); } /* create exclusive lock for the whole file */ lck.l_type = F_WRLCK; lck.l_whence = SEEK_SET; lck.l_start = 0; lck.l_len = 0; lck.l_pid = 0; if (fcntl(lock_fd, F_SETLK, &lck) == -1) { close(lock_fd); if (noExitOnFail) { return -1; } fprintf(stderr, "Error, cannot aquire OLSR lock '%s'.\n" "Another OLSR instance might be running.\n", lock_file_name); olsr_exit("", EXIT_FAILURE); } #endif /* _WIN32 */ return 0; } /** * Write the current PID to the configured PID file (if one is configured) */ static void writePidFile(void) { if (olsr_cnf->pidfile) { char buf[PATH_MAX + 256]; /* create / open the PID file */ #ifdef __WIN32 mode_t mode = S_IRUSR | S_IWUSR; #else mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; #endif int fd = open(olsr_cnf->pidfile, O_CREAT | O_WRONLY, mode); if (fd < 0) { snprintf(buf, sizeof(buf), "Could not open PID file %s", olsr_cnf->pidfile); perror(buf); olsr_shutdown(0); } /* write the PID */ { pid_t pid = getpid(); int chars = snprintf(buf, sizeof(buf), "%d", (int)pid); ssize_t chars_written = write(fd, buf, chars); if (chars_written != chars) { close(fd); snprintf(buf, sizeof(buf), "Could not write the PID %d to the PID file %s", (int)pid, olsr_cnf->pidfile); perror(buf); if (remove(olsr_cnf->pidfile) < 0) { snprintf(buf, sizeof(buf), "Could not remove the PID file %s", olsr_cnf->pidfile); perror(buf); } olsr_shutdown(0); } } if (close(fd) < 0) { snprintf(buf, sizeof(buf), "Could not close PID file %s", olsr_cnf->pidfile); perror(buf); if (remove(olsr_cnf->pidfile) < 0) { snprintf(buf, sizeof(buf), "Could not remove the PID file %s", olsr_cnf->pidfile); perror(buf); } olsr_shutdown(0); } } } /** * loads a config file * @return <0 if load failed, 0 otherwise */ static int olsrmain_load_config(char *file) { struct stat statbuf; if (stat(file, &statbuf) < 0) { fprintf(stderr, "Could not find specified config file %s!\n%s\n\n", file, strerror(errno)); return -1; } if (olsrd_parse_cnf(file) < 0) { fprintf(stderr, "Error while reading config file %s!\n", file); return -1; } return 0; } static void initRandom(void) { unsigned int seed = (unsigned int)time(NULL); #ifndef _WIN32 int randomFile; randomFile = open("/dev/urandom", O_RDONLY); if (randomFile == -1) { randomFile = open("/dev/random", O_RDONLY); } if (randomFile != -1) { if (read(randomFile, &seed, sizeof(seed)) != sizeof(seed)) { ; /* to fix an 'unused result' compiler warning */ } close(randomFile); } #endif /* _WIN32 */ srandom(seed); } /** * Main entrypoint */ int main(int argc, char *argv[]) { struct if_config_options *default_ifcnf; char conf_file_name[FILENAME_MAX]; struct ipaddr_str buf; bool loadedConfig = false; int i; #ifdef __linux__ struct interface *ifn; #endif /* __linux__ */ #ifdef _WIN32 WSADATA WsaData; size_t len; #endif /* __linux__ */ /* paranoia checks */ assert(sizeof(uint8_t) == 1); assert(sizeof(uint16_t) == 2); assert(sizeof(uint32_t) == 4); assert(sizeof(int8_t) == 1); assert(sizeof(int16_t) == 2); assert(sizeof(int32_t) == 4); printf("\n *** %s ***\n Build date: %s on %s\n http://www.olsr.org\n\n", olsrd_version, build_date, build_host); if (argc == 2) { if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "/?") == 0) { print_usage(false); exit(0); } if (strcmp(argv[1], "-v") == 0) { exit(0); } } debug_handle = stdout; #ifndef _WIN32 olsr_argv = argv; #endif /* _WIN32 */ setbuf(stdout, NULL); setbuf(stderr, NULL); #ifndef _WIN32 /* Check if user is root */ if (geteuid()) { fprintf(stderr, "You must be root(uid = 0) to run olsrd!\nExiting\n\n"); exit(EXIT_FAILURE); } #else /* _WIN32 */ DisableIcmpRedirects(); if (WSAStartup(0x0202, &WsaData)) { fprintf(stderr, "Could not initialize WinSock.\n"); olsr_exit(__func__, EXIT_FAILURE); } #endif /* _WIN32 */ /* Open syslog */ olsr_openlog("olsrd"); /* setup random seed */ initRandom(); /* Init widely used statics */ memset(&all_zero, 0, sizeof(union olsr_ip_addr)); /* * Set configfile name and * check if a configfile name was given as parameter */ #ifdef _WIN32 #ifndef WINCE GetWindowsDirectory(conf_file_name, FILENAME_MAX - 11); #else /* WINCE */ conf_file_name[0] = 0; #endif /* WINCE */ len = strlen(conf_file_name); if (len == 0 || conf_file_name[len - 1] != '\\') conf_file_name[len++] = '\\'; strscpy(conf_file_name + len, "olsrd.conf", sizeof(conf_file_name) - len); #else /* _WIN32 */ strscpy(conf_file_name, OLSRD_GLOBAL_CONF_FILE, sizeof(conf_file_name)); #endif /* _WIN32 */ olsr_cnf = olsrd_get_default_cnf(); for (i=1; i < argc-1;) { if (strcmp(argv[i], "-f") == 0) { loadedConfig = true; if (olsrmain_load_config(argv[i+1]) < 0) { exit(EXIT_FAILURE); } if (i+2 < argc) { memmove(&argv[i], &argv[i+2], sizeof(*argv) * (argc-i-1)); } argc -= 2; } else { i++; } } /* * set up configuration prior to processing commandline options */ if (!loadedConfig && olsrmain_load_config(conf_file_name) == 0) { loadedConfig = true; } if (!loadedConfig) { olsrd_free_cnf(olsr_cnf); olsr_cnf = olsrd_get_default_cnf(); } default_ifcnf = get_default_if_config(); if (default_ifcnf == NULL) { fprintf(stderr, "No default ifconfig found!\n"); exit(EXIT_FAILURE); } /* Initialize timers */ olsr_init_timers(); /* * Process olsrd options. */ if (olsr_process_arguments(argc, argv, olsr_cnf, default_ifcnf) < 0) { print_usage(true); olsr_exit(__func__, EXIT_FAILURE); } /* * Set configuration for command-line specified interfaces */ set_default_ifcnfs(olsr_cnf->interfaces, default_ifcnf); /* free the default ifcnf */ free(default_ifcnf); /* Sanity check configuration */ if (olsrd_sanity_check_cnf(olsr_cnf) < 0) { fprintf(stderr, "Bad configuration!\n"); olsr_exit(__func__, EXIT_FAILURE); } /* * Establish file lock to prevent multiple instances */ if (olsr_cnf->lock_file) { strscpy(lock_file_name, olsr_cnf->lock_file, sizeof(lock_file_name)); } else { size_t l; #ifdef DEFAULT_LOCKFILE_PREFIX strscpy(lock_file_name, DEFAULT_LOCKFILE_PREFIX, sizeof(lock_file_name)); #else /* DEFAULT_LOCKFILE_PREFIX */ strscpy(lock_file_name, conf_file_name, sizeof(lock_file_name)); #endif /* DEFAULT_LOCKFILE_PREFIX */ l = strlen(lock_file_name); snprintf(&lock_file_name[l], sizeof(lock_file_name) - l, "-ipv%d.lock", olsr_cnf->ip_version == AF_INET ? 4 : 6); } /* * Print configuration */ if (olsr_cnf->debug_level > 1) { olsrd_print_cnf(olsr_cnf); } def_timer_ci = olsr_alloc_cookie("Default Timer Cookie", OLSR_COOKIE_TYPE_TIMER); /* * socket for ioctl calls */ olsr_cnf->ioctl_s = socket(olsr_cnf->ip_version, SOCK_DGRAM, 0); if (olsr_cnf->ioctl_s < 0) { #ifndef _WIN32 olsr_syslog(OLSR_LOG_ERR, "ioctl socket: %m"); #endif /* _WIN32 */ olsr_exit(__func__, 0); } #ifdef __linux__ olsr_cnf->rtnl_s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE); if (olsr_cnf->rtnl_s < 0) { olsr_syslog(OLSR_LOG_ERR, "rtnetlink socket: %m"); olsr_exit(__func__, 0); } if (fcntl(olsr_cnf->rtnl_s, F_SETFL, O_NONBLOCK)) { olsr_syslog(OLSR_LOG_INFO, "rtnetlink could not be set to nonblocking"); } if ((olsr_cnf->rt_monitor_socket = rtnetlink_register_socket(RTMGRP_LINK)) < 0) { olsr_syslog(OLSR_LOG_ERR, "rtmonitor socket: %m"); olsr_exit(__func__, 0); } #endif /* __linux__ */ /* * create routing socket */ #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ olsr_cnf->rts = socket(PF_ROUTE, SOCK_RAW, 0); if (olsr_cnf->rts < 0) { olsr_syslog(OLSR_LOG_ERR, "routing socket: %m"); olsr_exit(__func__, 0); } #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ */ #ifdef __linux__ /* initialize gateway system */ if (olsr_cnf->smart_gw_active) { if (olsr_init_gateways()) { olsr_exit("Cannot initialize gateway tunnels", 1); } } /* initialize niit if index */ if (olsr_cnf->use_niit) { olsr_init_niit(); } #endif /* __linux__ */ /* Init empty TC timer */ set_empty_tc_timer(GET_TIMESTAMP(0)); /* enable ip forwarding on host */ /* Disable redirects globally (not for WIN32) */ net_os_set_global_ifoptions(); /* Initialize parser */ olsr_init_parser(); /* Initialize route-exporter */ olsr_init_export_route(); /* Initialize message sequencnumber */ init_msg_seqno(); /* Initialize dynamic willingness calculation */ olsr_init_willingness(); /* *Set up willingness/APM */ if (olsr_cnf->willingness_auto) { if (apm_init() < 0) { OLSR_PRINTF(1, "Could not read APM info - setting default willingness(%d)\n", WILL_DEFAULT); olsr_syslog(OLSR_LOG_ERR, "Could not read APM info - setting default willingness(%d)\n", WILL_DEFAULT); olsr_cnf->willingness_auto = 0; olsr_cnf->willingness = WILL_DEFAULT; } else { olsr_cnf->willingness = olsr_calculate_willingness(); OLSR_PRINTF(1, "Willingness set to %d - next update in %.1f secs\n", olsr_cnf->willingness, (double)olsr_cnf->will_int); } } /* Initialize net */ init_net(); /* Initializing networkinterfaces */ if (!olsr_init_interfacedb()) { if (olsr_cnf->allow_no_interfaces) { fprintf( stderr, "No interfaces detected! This might be intentional, but it also might mean that your configuration is fubar.\nI will continue after 5 seconds...\n"); olsr_startup_sleep(5); } else { fprintf(stderr, "No interfaces detected!\nBailing out!\n"); olsr_exit(__func__, EXIT_FAILURE); } } #ifdef __linux__ /* startup gateway system */ if (olsr_cnf->smart_gw_active) { if (olsr_startup_gateways()) { olsr_exit("Cannot startup gateway tunnels", 1); } } #endif /* __linux__ */ olsr_do_startup_sleep(); /* Print heartbeat to stdout */ #if !defined WINCE if (olsr_cnf->debug_level > 0 && isatty(STDOUT_FILENO)) { olsr_start_timer(STDOUT_PULSE_INT, 0, OLSR_TIMER_PERIODIC, &generate_stdout_pulse, NULL, 0); } #endif /* !defined WINCE */ /* Initialize the IPC socket */ if (olsr_cnf->ipc_connections > 0) { if (ipc_init()) { olsr_exit("ipc_init failure", 1); } } /* Initialisation of different tables to be used. */ olsr_init_tables(); /* daemon mode */ #ifndef _WIN32 if (olsr_cnf->debug_level == 0 && !olsr_cnf->no_fork) { printf("%s detaching from the current process...\n", olsrd_version); if (daemon(0, 0) < 0) { printf("daemon(3) failed: %s\n", strerror(errno)); exit(EXIT_FAILURE); } } #endif /* _WIN32 */ writePidFile(); /* * Create locking file for olsrd, will be cleared after olsrd exits */ for (i=5; i>=0; i--) { OLSR_PRINTF(3, "Trying to get olsrd lock...\n"); if (!olsr_cnf->host_emul && olsr_create_lock_file(i > 0) == 0) { /* lock sucessfully created */ break; } sleep (1); } /* Load plugins */ olsr_load_plugins(); OLSR_PRINTF(1, "Main address: %s\n\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr)); #ifdef __linux__ /* create policy routing rules with priorities if necessary */ if (DEF_RT_NONE != olsr_cnf->rt_table_pri) { olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table, olsr_cnf->rt_table_pri, NULL, true); } if (DEF_RT_NONE != olsr_cnf->rt_table_tunnel_pri) { olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_tunnel, olsr_cnf->rt_table_tunnel_pri, NULL, true); } if (DEF_RT_NONE != olsr_cnf->rt_table_default_pri) { olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default, olsr_cnf->rt_table_default_pri, NULL, true); } /* rule to default table on all olsrd interfaces */ if (DEF_RT_NONE != olsr_cnf->rt_table_defaultolsr_pri) { for (ifn = ifnet; ifn; ifn = ifn->int_next) { olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default, olsr_cnf->rt_table_defaultolsr_pri, ifn->int_name, true); } } /* trigger gateway selection */ if (olsr_cnf->smart_gw_active) { olsr_trigger_inetgw_startup(); } /* trigger niit static route setup */ if (olsr_cnf->use_niit) { olsr_setup_niit_routes(); } /* create lo:olsr interface */ if (olsr_cnf->use_src_ip_routes) { olsr_os_localhost_if(&olsr_cnf->main_addr, true); } #endif /* __linux__ */ /* Start syslog entry */ olsr_syslog(OLSR_LOG_INFO, "%s successfully started", olsrd_version); /* *signal-handlers */ /* ctrl-C and friends */ #ifdef _WIN32 #ifndef WINCE SetConsoleCtrlHandler(SignalHandler, true); #endif /* WINCE */ #else /* _WIN32 */ signal(SIGHUP, olsr_reconfigure); signal(SIGINT, olsr_shutdown); signal(SIGQUIT, olsr_shutdown); signal(SIGILL, olsr_shutdown); signal(SIGABRT, olsr_shutdown); // signal(SIGSEGV, olsr_shutdown); signal(SIGTERM, olsr_shutdown); signal(SIGPIPE, SIG_IGN); // Ignoring SIGUSR1 and SIGUSR1 by default to be able to use them in plugins signal(SIGUSR1, SIG_IGN); signal(SIGUSR2, SIG_IGN); #endif /* _WIN32 */ link_changes = false; /* Starting scheduler */ olsr_scheduler(); /* Like we're ever going to reach this ;-) */ return 1; } /* main */ #ifndef _WIN32 /** * Reconfigure olsrd. Currently kind of a hack... * *@param signo the signal that triggered this callback */ void olsr_reconfigure(int signo __attribute__ ((unused))) { #ifndef _WIN32 int errNr = errno; #endif /* if we are started with -nofork, we do not want to go into the * background here. So we can simply stop on -HUP */ olsr_syslog(OLSR_LOG_INFO, "sot: olsr_reconfigure()\n"); if (!olsr_cnf->no_fork) { if (!fork()) { int i; sigset_t sigs; /* New process */ sleep(3); sigemptyset(&sigs); sigaddset(&sigs, SIGHUP); sigprocmask(SIG_UNBLOCK, &sigs, NULL); for (i = sysconf(_SC_OPEN_MAX); --i > STDERR_FILENO;) { close(i); } printf("Restarting %s\n", olsr_argv[0]); olsr_syslog(OLSR_LOG_INFO, "Restarting %s\n", olsr_argv[0]); execv(olsr_argv[0], olsr_argv); olsr_syslog(OLSR_LOG_ERR, "execv(%s) fails: %s!\n", olsr_argv[0], strerror(errno)); } else { olsr_syslog(OLSR_LOG_INFO, "RECONFIGURING!\n"); } } #ifndef _WIN32 errno = errNr; #endif olsr_shutdown(0); } #endif /* _WIN32 */ static void olsr_shutdown_messages(void) { struct interface *ifn; /* send TC reset */ for (ifn = ifnet; ifn; ifn = ifn->int_next) { /* clean output buffer */ net_output(ifn); /* send 'I'm gone' messages */ if (olsr_cnf->lq_level > 0) { olsr_output_lq_tc(ifn); olsr_output_lq_hello(ifn); } else { generate_tc(ifn); generate_hello(ifn); } net_output(ifn); } } /** *Function called at shutdown. Signal handler * * @param signo the signal that triggered this call */ #ifdef _WIN32 int __stdcall SignalHandler(unsigned long signo) #else /* _WIN32 */ static void olsr_shutdown(int signo __attribute__ ((unused))) #endif /* _WIN32 */ { #ifndef _WIN32 int errNr = errno; #endif struct interface *ifn; int exit_value; OLSR_PRINTF(1, "Received signal %d - shutting down\n", (int)signo); #ifdef _WIN32 OLSR_PRINTF(1, "Waiting for the scheduler to stop.\n"); olsr_win32_end_request = TRUE; while (!olsr_win32_end_flag) sleep(1); OLSR_PRINTF(1, "Scheduler stopped.\n"); #endif /* _WIN32 */ /* clear all links and send empty hellos/tcs */ olsr_reset_all_links(); /* deactivate fisheye and immediate TCs */ olsr_cnf->lq_fish = 0; for (ifn = ifnet; ifn; ifn = ifn->int_next) { ifn->immediate_send_tc = false; } increase_local_ansn(); /* send first shutdown message burst */ olsr_shutdown_messages(); /* delete all routes */ olsr_delete_all_kernel_routes(); /* send second shutdown message burst */ olsr_shutdown_messages(); /* now try to cleanup the rest of the mess */ olsr_delete_all_tc_entries(); olsr_delete_all_mid_entries(); #ifdef __linux__ /* trigger gateway selection */ if (olsr_cnf->smart_gw_active) { olsr_shutdown_gateways(); olsr_cleanup_gateways(); } /* trigger niit static route cleanup */ if (olsr_cnf->use_niit) { olsr_cleanup_niit_routes(); } /* cleanup lo:olsr interface */ if (olsr_cnf->use_src_ip_routes) { olsr_os_localhost_if(&olsr_cnf->main_addr, false); } #endif /* __linux__ */ olsr_destroy_parser(); OLSR_PRINTF(1, "Closing sockets...\n"); /* front-end IPC socket */ if (olsr_cnf->ipc_connections > 0) { shutdown_ipc(); } /* OLSR sockets */ for (ifn = ifnet; ifn; ifn = ifn->int_next) { close(ifn->olsr_socket); close(ifn->send_socket); #ifdef __linux__ if (DEF_RT_NONE != olsr_cnf->rt_table_defaultolsr_pri) { olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default, olsr_cnf->rt_table_defaultolsr_pri, ifn->int_name, false); } #endif /* __linux__ */ } /* Closing plug-ins */ olsr_close_plugins(); /* Reset network settings */ net_os_restore_ifoptions(); /* ioctl socket */ close(olsr_cnf->ioctl_s); #ifdef __linux__ if (DEF_RT_NONE != olsr_cnf->rt_table_pri) { olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table, olsr_cnf->rt_table_pri, NULL, false); } if (DEF_RT_NONE != olsr_cnf->rt_table_tunnel_pri) { olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_tunnel, olsr_cnf->rt_table_tunnel_pri, NULL, false); } if (DEF_RT_NONE != olsr_cnf->rt_table_default_pri) { olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default, olsr_cnf->rt_table_default_pri, NULL, false); } close(olsr_cnf->rtnl_s); close (olsr_cnf->rt_monitor_socket); #endif /* __linux__ */ #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ /* routing socket */ close(olsr_cnf->rts); #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ */ /* Free cookies and memory pools attached. */ OLSR_PRINTF(0, "Free all memory...\n"); olsr_delete_all_cookies(); olsr_syslog(OLSR_LOG_INFO, "%s stopped", olsrd_version); OLSR_PRINTF(1, "\n <<<< %s - terminating >>>>\n http://www.olsr.org\n", olsrd_version); exit_value = olsr_cnf->exit_value; olsrd_free_cnf(olsr_cnf); #ifndef _WIN32 errno = errNr; #endif exit(exit_value); } /** * Print the command line usage */ static void print_usage(bool error) { fprintf( stderr, "%s" "usage: olsrd [-f ] [ -i interface1 interface2 ... ]\n" " [-d ] [-ipv6] [-multi ]\n" " [-lql ] [-lqw ] [-lqnt ]\n" " [-bcast ] [-ipc] [-delgw]\n" " [-hint ] [-tcint ]\n" " [-midint ] [-hnaint ]\n" " [-T ] [-nofork] [-hemu ]\n" " [-lql ] [-lqa ]\n" " [-pidfile ]\n", error ? "Error in command line parameters!\n" : ""); } /** * Sets the provided configuration on all unconfigured * interfaces * * @param ifs a linked list of interfaces to check and possible update * @param cnf the default configuration to set on unconfigured interfaces */ int set_default_ifcnfs(struct olsr_if *ifs, struct if_config_options *cnf) { int changes = 0; while (ifs) { if (ifs->cnf == NULL) { ifs->cnf = olsr_malloc(sizeof(struct if_config_options), "Set default config"); *ifs->cnf = *cnf; changes++; } ifs = ifs->next; } return changes; } #define NEXT_ARG do { argv++;argc--; } while (0) #define CHECK_ARGC do { if(!argc) { \ argv--; \ fprintf(stderr, "You must provide a parameter when using the %s switch!\n", *argv); \ olsr_exit(__func__, EXIT_FAILURE); \ } } while (0) /** * Process command line arguments passed to olsrd * */ static int olsr_process_arguments(int argc, char *argv[], struct olsrd_config *cnf, struct if_config_options *ifcnf) { while (argc > 1) { NEXT_ARG; #ifdef _WIN32 /* *Interface list */ if (strcmp(*argv, "-int") == 0) { ListInterfaces(); exit(0); } #endif /* _WIN32 */ /* *Configfilename */ if (strcmp(*argv, "-f") == 0) { fprintf(stderr, "Configfilename must ALWAYS be first argument!\n\n"); olsr_exit(__func__, EXIT_FAILURE); } /* *Use IP version 6 */ if (strcmp(*argv, "-ipv6") == 0) { cnf->ip_version = AF_INET6; continue; } /* *Broadcast address */ if (strcmp(*argv, "-bcast") == 0) { struct in_addr in; NEXT_ARG; CHECK_ARGC; if (inet_aton(*argv, &in) == 0) { printf("Invalid broadcast address! %s\nSkipping it!\n", *argv); continue; } memcpy(&ifcnf->ipv4_multicast.v4, &in.s_addr, sizeof(ifcnf->ipv4_multicast.v4)); continue; } /* * Set LQ level */ if (strcmp(*argv, "-lql") == 0) { int tmp_lq_level; NEXT_ARG; CHECK_ARGC; /* Sanity checking is done later */ sscanf(*argv, "%d", &tmp_lq_level); olsr_cnf->lq_level = tmp_lq_level; continue; } /* * Set LQ winsize */ if (strcmp(*argv, "-lqa") == 0) { float tmp_lq_aging; NEXT_ARG; CHECK_ARGC; sscanf(*argv, "%f", &tmp_lq_aging); if (tmp_lq_aging < (float)MIN_LQ_AGING || tmp_lq_aging > (float)MAX_LQ_AGING) { printf("LQ aging factor %f not allowed. Range [%f-%f]\n", (double)tmp_lq_aging, (double)MIN_LQ_AGING, (double)MAX_LQ_AGING); olsr_exit(__func__, EXIT_FAILURE); } olsr_cnf->lq_aging = tmp_lq_aging; continue; } /* * Set NAT threshold */ if (strcmp(*argv, "-lqnt") == 0) { float tmp_lq_nat_thresh; NEXT_ARG; CHECK_ARGC; sscanf(*argv, "%f", &tmp_lq_nat_thresh); if (tmp_lq_nat_thresh < 0.1f || tmp_lq_nat_thresh > 1.0f) { printf("NAT threshold %f not allowed. Range [%f-%f]\n", (double)tmp_lq_nat_thresh, (double)0.1, (double)1.0); olsr_exit(__func__, EXIT_FAILURE); } olsr_cnf->lq_nat_thresh = tmp_lq_nat_thresh; continue; } /* * Enable additional debugging information to be logged. */ if (strcmp(*argv, "-d") == 0) { NEXT_ARG; CHECK_ARGC; sscanf(*argv, "%d", &cnf->debug_level); continue; } /* * Interfaces to be used by olsrd. */ if (strcmp(*argv, "-i") == 0) { NEXT_ARG; CHECK_ARGC; if (*argv[0] == '-') { fprintf(stderr, "You must provide an interface label!\n"); olsr_exit(__func__, EXIT_FAILURE); } printf("Queuing if %s\n", *argv); olsr_create_olsrif(*argv, false); while ((argc - 1) && (argv[1][0] != '-')) { NEXT_ARG; printf("Queuing if %s\n", *argv); olsr_create_olsrif(*argv, false); } continue; } /* * Set the hello interval to be used by olsrd. * */ if (strcmp(*argv, "-hint") == 0) { NEXT_ARG; CHECK_ARGC; sscanf(*argv, "%f", &ifcnf->hello_params.emission_interval); ifcnf->hello_params.validity_time = ifcnf->hello_params.emission_interval * 3; continue; } /* * Set the HNA interval to be used by olsrd. * */ if (strcmp(*argv, "-hnaint") == 0) { NEXT_ARG; CHECK_ARGC; sscanf(*argv, "%f", &ifcnf->hna_params.emission_interval); ifcnf->hna_params.validity_time = ifcnf->hna_params.emission_interval * 3; continue; } /* * Set the MID interval to be used by olsrd. * */ if (strcmp(*argv, "-midint") == 0) { NEXT_ARG; CHECK_ARGC; sscanf(*argv, "%f", &ifcnf->mid_params.emission_interval); ifcnf->mid_params.validity_time = ifcnf->mid_params.emission_interval * 3; continue; } /* * Set the tc interval to be used by olsrd. * */ if (strcmp(*argv, "-tcint") == 0) { NEXT_ARG; CHECK_ARGC; sscanf(*argv, "%f", &ifcnf->tc_params.emission_interval); ifcnf->tc_params.validity_time = ifcnf->tc_params.emission_interval * 3; continue; } /* * Set the polling interval to be used by olsrd. */ if (strcmp(*argv, "-T") == 0) { NEXT_ARG; CHECK_ARGC; sscanf(*argv, "%f", &cnf->pollrate); continue; } /* * Should we set up and send on a IPC socket for the front-end? */ if (strcmp(*argv, "-ipc") == 0) { cnf->ipc_connections = 1; continue; } /* * IPv6 multicast addr */ if (strcmp(*argv, "-multi") == 0) { struct in6_addr in6; NEXT_ARG; CHECK_ARGC; if (inet_pton(AF_INET6, *argv, &in6) <= 0) { fprintf(stderr, "Failed converting IP address %s\n", *argv); exit(EXIT_FAILURE); } memcpy(&ifcnf->ipv6_multicast, &in6, sizeof(struct in6_addr)); continue; } /* * Host emulation */ if (strcmp(*argv, "-hemu") == 0) { struct in_addr in; struct olsr_if *ifa; NEXT_ARG; CHECK_ARGC; if (inet_pton(AF_INET, *argv, &in) <= 0) { fprintf(stderr, "Failed converting IP address %s\n", *argv); exit(EXIT_FAILURE); } /* Add hemu interface */ ifa = olsr_create_olsrif("hcif01", true); if (!ifa) continue; ifa->cnf = get_default_if_config(); ifa->host_emul = true; memset(&ifa->hemu_ip, 0, sizeof(ifa->hemu_ip)); memcpy(&ifa->hemu_ip, &in, sizeof(in)); cnf->host_emul = true; continue; } /* * Delete possible default GWs */ if (strcmp(*argv, "-delgw") == 0) { olsr_cnf->del_gws = true; continue; } if (strcmp(*argv, "-nofork") == 0) { cnf->no_fork = true; continue; } if (strcmp(*argv, "-pidfile") == 0) { NEXT_ARG; CHECK_ARGC; cnf->pidfile = *argv; continue; } return -1; } return 0; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/mantissa.c000066400000000000000000000137621234304727700156020ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "mantissa.h" /** *Function that converts a double to a mantissa/exponent *product as described in RFC3626: * * value = C*(1+a/16)*2^b [in seconds] * * where a is the integer represented by the four highest bits of the * field and b the integer represented by the four lowest bits of the * field. * *@param interval the time interval to process * *@return a 8-bit mantissa/exponent product */ uint8_t reltime_to_me(const olsr_reltime interval) { uint8_t a, b; /* It is sufficent to compare the integer part since we test on >=. * So we have now only a floating point division and the rest of the loop * are only integer operations. * * const unsigned int unscaled_interval = interval / VTIME_SCALE_FACTOR; * * VTIME_SCALE_FACTOR = 1/16 * * => unscaled_interval = interval(ms) / 1000 * 16 * = interval(ms) / 125 * 2 */ const unsigned int unscaled_interval = interval / 125 * 2; b = 0; while (unscaled_interval >= (1U << b)) { b++; } if (b == 0) { a = 1; b = 0; } else { b--; if (b > 15) { a = 15; b = 15; } else { /* And again some maths simplification from the former version: * a = 16 * ((double)interval / (VTIME_SCALE_FACTOR * (double)(1 << b)) - 1) * Since interval is already double: * a = 16 * (interval / (VTIME_SCALE_FACTOR * (double)(1 << b)) - 1) * first, we can get rid of parentheses and change the * to a / * a = 16 * (interval / VTIME_SCALE_FACTOR / (double)(1 << b) - 1) * then we make an integer addition from the floating point addition * a = (int)(16.0 * interval / VTIME_SCALE_FACTOR / (double)(1 << b)) - 16 * and we loose an unnecessary cast * a = (int)(16.0 * interval / VTIME_SCALE_FACTOR / (1 << b)) - 16 * * VTIME_SCALE_FACTOR = 1/16 * * => a = (16 * interval(ms) / 1000 * 16 / (1 << b)) - 16 * = (interval(ms) * 256 / 1000 / (1 << b)) - 16 * = (interval(ms) * 32 / 125 / (1<= 5 * = (interval(ms) - (125 << (b-1))) / 125 / (1 << (b-5)) * = (interval(ms) - (125 << (b-1))) / (125 << (b-5)) * * 2. case: b <= 5 * = (interval(ms) - (125 << (b-1))) / 125 * (1 << (5-b)) * = (interval(ms) - (125 << (b-1))) * (1 << (5-b)) / 125 */ if (b >= 5) { a = (interval - (125 << (b - 1))) / (125 << (b - 5)); } else { a = (interval - (125 << (b - 1))) * (1 << (5 - b)) / 125; } b += a >> 4; a &= 0x0f; } } return (a << 4) | (b & 0x0F); } /** * Function for converting a mantissa/exponent 8bit value back * to double as described in RFC3626: * * value = C*(1+a/16)*2^b [in seconds] * * where a is the integer represented by the four highest bits of the * field and b the integer represented by the four lowest bits of the * field. * * me is the 8 bit mantissa/exponent value * * To avoid expensive floating maths, we transform the equation: * value = C * (1 + a / 16) * 2^b * first, we make an int addition from the floating point addition: * value = C * ((16 + a) / 16) * 2^b * then we get rid of a pair of parentheses * value = C * (16 + a) / 16 * 2^b * and now we make an int multiplication from the floating point one * value = C * (16 + a) * 2^b / 16 * so that we can make a shift from the multiplication * value = C * ((16 + a) << b) / 16 * and sionce C and 16 are constants * value = ((16 + a) << b) * C / 16 * * VTIME_SCALE_FACTOR = 1/16 * * => value(ms) = ((16 + a) << b) / 256 * 1000 * * 1. case: b >= 8 * = ((16 + a) << (b-8)) * 1000 * * 2. case: b <= 8 * = ((16 + a) * 1000) >> (8-b) */ olsr_reltime me_to_reltime(const uint8_t me) { const uint8_t a = me >> 4; const uint8_t b = me & 0x0F; if (b >= 8) { return ((16 + a) << (b - 8)) * 1000; } return ((16 + a) * 1000) >> (8 - b); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/mantissa.h000066400000000000000000000051061234304727700156000ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_MANTISSA #define _OLSR_MANTISSA #include "olsr_types.h" /* olsr_reltime is a relative timestamp measured in microseconds */ typedef uint32_t olsr_reltime; /** * Macro for converting a mantissa/exponent 8bit value back * to an integer (measured in microseconds) as described in RFC3626: * * value = C*(1+a/16)*2^b [in seconds] * * where a is the integer represented by the four highest bits of the * field and b the integer represented by the four lowest bits of the * field. * * me is the 8 bit mantissa/exponent value * */ olsr_reltime me_to_reltime(const uint8_t); uint8_t reltime_to_me(const olsr_reltime); #endif /* _OLSR_MANTISSA */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/mid_set.c000066400000000000000000000437121234304727700154050ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include #include "ipcalc.h" #include "defs.h" #include "two_hop_neighbor_table.h" #include "mid_set.h" #include "olsr.h" #include "rebuild_packet.h" #include "scheduler.h" #include "neighbor_table.h" #include "link_set.h" #include "tc_set.h" #include "packet.h" /* struct mid_alias */ #include "net_olsr.h" #include "duplicate_handler.h" struct mid_entry mid_set[HASHSIZE]; struct mid_address reverse_mid_set[HASHSIZE]; struct mid_entry *mid_lookup_entry_bymain(const union olsr_ip_addr *adr); /** * Initialize the MID set * */ int olsr_init_mid_set(void) { int idx; OLSR_PRINTF(5, "MID: init\n"); for (idx = 0; idx < HASHSIZE; idx++) { mid_set[idx].next = &mid_set[idx]; mid_set[idx].prev = &mid_set[idx]; reverse_mid_set[idx].next = &reverse_mid_set[idx]; reverse_mid_set[idx].prev = &reverse_mid_set[idx]; } return 1; } void olsr_delete_all_mid_entries(void) { int hash; for (hash = 0; hash < HASHSIZE; hash++) { while (mid_set[hash].next != &mid_set[hash]) { olsr_delete_mid_entry(mid_set[hash].next); } } } void olsr_cleanup_mid(union olsr_ip_addr *orig) { struct mid_entry *mid; mid = mid_lookup_entry_bymain(orig); if (mid) { olsr_delete_mid_entry(mid); } } /** * Wrapper for the timer callback. */ static void olsr_expire_mid_entry(void *context) { #ifdef DEBUG struct ipaddr_str buf; #endif /* DEBUG */ struct mid_entry *mid; mid = (struct mid_entry *)context; mid->mid_timer = NULL; #ifdef DEBUG OLSR_PRINTF(1, "MID info for %s timed out.. deleting it\n", olsr_ip_to_string(&buf, &mid->main_addr)); #endif /* DEBUG */ olsr_delete_mid_entry(mid); } /** * Set the mid set expiration timer. * * all timer setting shall be done using this function. * The timer param is a relative timer expressed in milliseconds. */ static void olsr_set_mid_timer(struct mid_entry *mid, olsr_reltime rel_timer) { int32_t willFireIn = -1; if (mid->mid_timer != NULL) willFireIn = olsr_getTimeDue(mid->mid_timer->timer_clock); if (willFireIn < 0 || (olsr_reltime)willFireIn < rel_timer) { olsr_set_timer(&mid->mid_timer, rel_timer, 0, OLSR_TIMER_ONESHOT, &olsr_expire_mid_entry, mid, 0); } } /** * Insert a new interface alias to the interface association set. * If the main interface of the association is not yet registered * in the set a new entry is created. * * @param m_addr the main address of the node * @param alias the alias address to insert * @param vtime the expiration time * @return false if mid_address is unnecessary, true otherwise */ static bool insert_mid_tuple(union olsr_ip_addr *m_addr, struct mid_address *alias, olsr_reltime vtime) { struct mid_entry *tmp; struct mid_address *tmp_adr; uint32_t hash, alias_hash; union olsr_ip_addr *registered_m_addr; hash = olsr_ip_hashing(m_addr); alias_hash = olsr_ip_hashing(&alias->alias); /* Check for registered entry */ for (tmp = mid_set[hash].next; tmp != &mid_set[hash]; tmp = tmp->next) { if (ipequal(&tmp->main_addr, m_addr)) break; } /* Check if alias is already registered with m_addr */ registered_m_addr = mid_lookup_main_addr(&alias->alias); if (registered_m_addr != NULL && ipequal(registered_m_addr, m_addr)) { /* Alias is already registered with main address. Nothing to do here. */ return false; } /* * Add a rt_path for the alias. */ olsr_insert_routing_table(&alias->alias, olsr_cnf->maxplen, m_addr, OLSR_RT_ORIGIN_MID); /*If the address was registered */ if (tmp != &mid_set[hash]) { tmp_adr = tmp->aliases; tmp->aliases = alias; alias->main_entry = tmp; QUEUE_ELEM(reverse_mid_set[alias_hash], alias); alias->next_alias = tmp_adr; olsr_set_mid_timer(tmp, vtime); } else { /*Create new node */ tmp = olsr_malloc(sizeof(struct mid_entry), "MID new alias"); tmp->aliases = alias; alias->main_entry = tmp; QUEUE_ELEM(reverse_mid_set[alias_hash], alias); tmp->main_addr = *m_addr; olsr_set_mid_timer(tmp, vtime); /* Queue */ QUEUE_ELEM(mid_set[hash], tmp); } /* * Delete possible duplicate entries in 2 hop set * and delete duplicate neighbor entries. Redirect * link entries to the correct neighbor entry. * *THIS OPTIMIZATION IS NOT SPECIFIED IN RFC3626 */ tmp_adr = alias; while (tmp_adr) { struct neighbor_2_entry *tmp_2_neighbor; struct neighbor_entry *tmp_neigh, *real_neigh; /* Delete possible 2 hop neighbor */ if ((tmp_2_neighbor = olsr_lookup_two_hop_neighbor_table_mid(&tmp_adr->alias)) != NULL) { struct ipaddr_str buf; OLSR_PRINTF(1, "Deleting 2 hop node from MID: %s to ", olsr_ip_to_string(&buf, &tmp_adr->alias)); OLSR_PRINTF(1, "%s\n", olsr_ip_to_string(&buf, m_addr)); olsr_delete_two_hop_neighbor_table(tmp_2_neighbor); changes_neighborhood = true; } /* Delete a possible neighbor entry */ if (((tmp_neigh = olsr_lookup_neighbor_table_alias(&tmp_adr->alias)) != NULL) && ((real_neigh = olsr_lookup_neighbor_table_alias(m_addr)) != NULL)) { struct ipaddr_str buf; OLSR_PRINTF(1, "[MID]Deleting bogus neighbor entry %s real ", olsr_ip_to_string(&buf, &tmp_adr->alias)); OLSR_PRINTF(1, "%s\n", olsr_ip_to_string(&buf, m_addr)); replace_neighbor_link_set(tmp_neigh, real_neigh); /* Dequeue */ DEQUEUE_ELEM(tmp_neigh); /* Delete */ free(tmp_neigh); changes_neighborhood = true; } tmp_adr = tmp_adr->next_alias; } return true; } /** * Insert an alias address for a node. * If the main address is not registered * then a new entry is created. * * @param main_add the main address of the node * @param alias the alias address to insert * @param vtime the expiration time */ void insert_mid_alias(union olsr_ip_addr *main_add, const union olsr_ip_addr *alias, olsr_reltime vtime) { struct neighbor_entry *ne_old, *ne_new; struct mid_entry *me_old; int ne_ref_rp_count; struct ipaddr_str buf1, buf2; struct mid_address *adr; if (!olsr_validate_address(alias)) return; OLSR_PRINTF(1, "Inserting alias %s for ", olsr_ip_to_string(&buf1, alias)); OLSR_PRINTF(1, "%s\n", olsr_ip_to_string(&buf1, main_add)); adr = olsr_malloc(sizeof(struct mid_address), "Insert MID alias"); adr->alias = *alias; adr->next_alias = NULL; /* * If we have an entry for this alias in neighbortable, we better adjust it's * main address, because otherwise a fatal inconsistency between * neighbortable and link_set will be created by way of this mid entry. */ ne_old = olsr_lookup_neighbor_table_alias(alias); if (ne_old != NULL) { OLSR_PRINTF(2, "Remote main address change detected. Mangling neighbortable to replace %s with %s.\n", olsr_ip_to_string(&buf1, alias), olsr_ip_to_string(&buf2, main_add)); olsr_delete_neighbor_table(alias); ne_new = olsr_insert_neighbor_table(main_add); /* adjust pointers to neighbortable-entry in link_set */ ne_ref_rp_count = replace_neighbor_link_set(ne_old, ne_new); if (ne_ref_rp_count > 0) OLSR_PRINTF(2, "Performed %d neighbortable-pointer replacements (%p -> %p) in link_set.\n", ne_ref_rp_count, ne_old, ne_new); me_old = mid_lookup_entry_bymain(alias); if (me_old) { /* * we knew aliases to the previous main address; * better forget about them now. */ OLSR_PRINTF(2, "I already have an mid entry mapping addresses to this " "alias address. Removing existing mid entry to preserve consistency of mid_set.\n"); olsr_delete_mid_entry(me_old); } } if (!insert_mid_tuple(main_add, adr, vtime)) { free(adr); } /* *Recalculate topology */ changes_neighborhood = true; changes_topology = true; } /** * Lookup the main address for a alias address * * @param adr the alias address to check * @return the main address registered on the alias * or NULL if not found */ union olsr_ip_addr * mid_lookup_main_addr(const union olsr_ip_addr *adr) { uint32_t hash; struct mid_address *tmp_list; hash = olsr_ip_hashing(adr); /*Traverse MID list */ for (tmp_list = reverse_mid_set[hash].next; tmp_list != &reverse_mid_set[hash]; tmp_list = tmp_list->next) { if (ipequal(&tmp_list->alias, adr)) return &tmp_list->main_entry->main_addr; } return NULL; } /* * Find mid entry to an address. * * @param adr the main address to search for * @return a linked list of address structs */ struct mid_entry * mid_lookup_entry_bymain(const union olsr_ip_addr *adr) { struct mid_entry *tmp_list; uint32_t hash; hash = olsr_ip_hashing(adr); /* Check all registered nodes... */ for (tmp_list = mid_set[hash].next; tmp_list != &mid_set[hash]; tmp_list = tmp_list->next) { if (ipequal(&tmp_list->main_addr, adr)) return tmp_list; } return NULL; } /* * Find all aliases for an address. * * @param adr the main address to search for * @return a linked list of addresses structs */ struct mid_address * mid_lookup_aliases(const union olsr_ip_addr *adr) { struct mid_entry *tmp = mid_lookup_entry_bymain(adr); return tmp ? tmp->aliases : NULL; } /** * Update the timer for an MID entry * * @param adr the main address of the entry * @param vtime the expiration time * @return 1 if the node was updated, 0 if not */ int olsr_update_mid_table(const union olsr_ip_addr *adr, olsr_reltime vtime) { uint32_t hash; struct ipaddr_str buf; struct mid_entry *tmp_list = mid_set; OLSR_PRINTF(3, "MID: update %s\n", olsr_ip_to_string(&buf, adr)); hash = olsr_ip_hashing(adr); /* Check all registered nodes... */ for (tmp_list = mid_set[hash].next; tmp_list != &mid_set[hash]; tmp_list = tmp_list->next) { /*find match */ if (ipequal(&tmp_list->main_addr, adr)) { olsr_set_mid_timer(tmp_list, vtime); return 1; } } return 0; } /** * Remove aliases from 'entry' which are not listed in 'declared_aliases'. * * @param message the MID message */ static void olsr_prune_aliases(struct mid_message *message) { const union olsr_ip_addr *m_addr = &message->mid_origaddr; struct mid_alias * declared_aliases = message->mid_addr; struct mid_entry *entry; uint32_t hash; struct mid_address *registered_aliases; struct mid_address *previous_alias; struct mid_alias *save_declared_aliases = declared_aliases; hash = olsr_ip_hashing(m_addr); /* Check for registered entry */ for (entry = mid_set[hash].next; entry != &mid_set[hash]; entry = entry->next) { if (ipequal(&entry->main_addr, m_addr)) break; } if (entry == &mid_set[hash]) { /* MID entry not found, nothing to prune here */ return; } registered_aliases = entry->aliases; previous_alias = NULL; while (registered_aliases != NULL) { struct mid_address *current_alias = registered_aliases; registered_aliases = registered_aliases->next_alias; declared_aliases = save_declared_aliases; /* Go through the list of declared aliases to find the matching current alias */ while (declared_aliases != 0 && !ipequal(¤t_alias->alias, &declared_aliases->alias_addr)) { declared_aliases = declared_aliases->next; } if (declared_aliases == NULL) { /*do not remove alias if vtime still valid (so we assigned something != NULL to declared_aliases)*/ if (!olsr_isTimedOut(current_alias->vtime)) declared_aliases = save_declared_aliases; } else current_alias->vtime=olsr_getTimestamp(message->vtime); if (declared_aliases == NULL) { struct ipaddr_str buf; /* Current alias not found in list of declared aliases: free current alias */ OLSR_PRINTF(1, "MID remove: (%s, ", olsr_ip_to_string(&buf, &entry->main_addr)); OLSR_PRINTF(1, "%s)\n", olsr_ip_to_string(&buf, ¤t_alias->alias)); /* Update linked list as seen by 'entry' */ if (previous_alias != NULL) { previous_alias->next_alias = current_alias->next_alias; } else { entry->aliases = current_alias->next_alias; } /* Remove from hash table */ DEQUEUE_ELEM(current_alias); /* * Delete the rt_path for the alias. */ olsr_delete_routing_table(¤t_alias->alias, olsr_cnf->maxplen, &entry->main_addr); free(current_alias); /* *Recalculate topology */ changes_neighborhood = true; changes_topology = true; } else { previous_alias = current_alias; } } } /** * Delete a MID entry * * @param mid the entry to delete */ void olsr_delete_mid_entry(struct mid_entry *mid) { struct mid_address *aliases; /* Free aliases */ aliases = mid->aliases; while (aliases) { struct mid_address *tmp_aliases = aliases; aliases = aliases->next_alias; DEQUEUE_ELEM(tmp_aliases); /* * Delete the rt_path for the alias. */ olsr_delete_routing_table(&tmp_aliases->alias, olsr_cnf->maxplen, &mid->main_addr); free(tmp_aliases); } /* * Kill any pending timers. */ if (mid->mid_timer) { olsr_stop_timer(mid->mid_timer); mid->mid_timer = NULL; } /* Dequeue */ DEQUEUE_ELEM(mid); free(mid); } /** * Print all MID entries * For debuging purposes */ void olsr_print_mid_set(void) { int idx; OLSR_PRINTF(1, "\n--- %s ------------------------------------------------- MID\n\n", olsr_wallclock_string()); for (idx = 0; idx < HASHSIZE; idx++) { struct mid_entry *tmp_list = mid_set[idx].next; /*Traverse MID list */ for (tmp_list = mid_set[idx].next; tmp_list != &mid_set[idx]; tmp_list = tmp_list->next) { struct mid_address *tmp_addr; struct ipaddr_str buf; OLSR_PRINTF(1, "%s: ", olsr_ip_to_string(&buf, &tmp_list->main_addr)); for (tmp_addr = tmp_list->aliases; tmp_addr; tmp_addr = tmp_addr->next_alias) { OLSR_PRINTF(1, " %s ", olsr_ip_to_string(&buf, &tmp_addr->alias)); } OLSR_PRINTF(1, "\n"); } } } /** *Process a received(and parsed) MID message *For every address check if there is a topology node *registered with it and update its addresses. * *@param m the OLSR message received. *@param in_if the incoming interface *@param from_addr the sender address *@return 1 on success */ bool olsr_input_mid(union olsr_message *m, struct interface *in_if __attribute__ ((unused)), union olsr_ip_addr *from_addr) { struct ipaddr_str buf; struct mid_alias *tmp_adr; struct mid_message message; mid_chgestruct(&message, m); if (!olsr_validate_address(&message.mid_origaddr)) { olsr_free_mid_packet(&message); return false; } #ifdef DEBUG OLSR_PRINTF(5, "Processing MID from %s...\n", olsr_ip_to_string(&buf, &message.mid_origaddr)); #endif /* DEBUG */ tmp_adr = message.mid_addr; /* * If the sender interface (NB: not originator) of this message * is not in the symmetric 1-hop neighborhood of this node, the * message MUST be discarded. */ if (check_neighbor_link(from_addr) != SYM_LINK) { OLSR_PRINTF(2, "Received MID from NON SYM neighbor %s\n", olsr_ip_to_string(&buf, from_addr)); olsr_free_mid_packet(&message); return false; } /* Update the timeout of the MID */ olsr_update_mid_table(&message.mid_origaddr, message.vtime); for (;tmp_adr; tmp_adr = tmp_adr->next) { #ifndef NO_DUPLICATE_DETECTION_HANDLER struct interface *ifs; bool stop = false; for (ifs = ifnet; ifs != NULL; ifs = ifs->int_next) { if (ipequal(&ifs->ip_addr, &tmp_adr->alias_addr)) { /* ignore your own main IP as an incoming MID */ olsr_handle_mid_collision(&tmp_adr->alias_addr, &message.mid_origaddr); stop = true; break; } } if (stop) { continue; } #endif /* NO_DUPLICATE_DETECTION_HANDLER */ if (!mid_lookup_main_addr(&tmp_adr->alias_addr)) { OLSR_PRINTF(1, "MID new: (%s, ", olsr_ip_to_string(&buf, &message.mid_origaddr)); OLSR_PRINTF(1, "%s)\n", olsr_ip_to_string(&buf, &tmp_adr->alias_addr)); insert_mid_alias(&message.mid_origaddr, &tmp_adr->alias_addr, message.vtime); } else { olsr_insert_routing_table(&tmp_adr->alias_addr, olsr_cnf->maxplen, &message.mid_origaddr, OLSR_RT_ORIGIN_MID); } } olsr_prune_aliases(&message); olsr_free_mid_packet(&message); /* Forward the message */ return true; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/mid_set.h000066400000000000000000000064431234304727700154120ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_MID #define _OLSR_MID #include "olsr_types.h" #include "hashing.h" #include "mantissa.h" #include "packet.h" struct mid_address { union olsr_ip_addr alias; struct mid_entry *main_entry; struct mid_address *next_alias; uint32_t vtime; /* These are for the reverse list */ struct mid_address *prev; struct mid_address *next; }; /* * Contains the main addr of a node and a list of aliases */ struct mid_entry { union olsr_ip_addr main_addr; struct mid_address *aliases; struct mid_entry *prev; struct mid_entry *next; struct timer_entry *mid_timer; }; #define OLSR_MID_JITTER 5 /* percent */ extern struct mid_entry mid_set[HASHSIZE]; extern struct mid_address reverse_mid_set[HASHSIZE]; int olsr_init_mid_set(void); void olsr_delete_all_mid_entries(void); void olsr_cleanup_mid(union olsr_ip_addr *); void insert_mid_alias(union olsr_ip_addr *, const union olsr_ip_addr *, olsr_reltime); union olsr_ip_addr *mid_lookup_main_addr(const union olsr_ip_addr *); struct mid_address *mid_lookup_aliases(const union olsr_ip_addr *); struct mid_entry *mid_lookup_entry_bymain(const union olsr_ip_addr *); void olsr_print_mid_set(void); int olsr_update_mid_table(const union olsr_ip_addr *, olsr_reltime); void olsr_delete_mid_entry(struct mid_entry *); bool olsr_input_mid(union olsr_message *, struct interface *, union olsr_ip_addr *); #endif /* _OLSR_MID */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/misc.h000066400000000000000000000040061234304727700147120ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_MISC_H #define _OLSR_MISC_H void clear_console(void); #endif /* _OLSR_MISC_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/mpr.c000066400000000000000000000354041234304727700145560ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "ipcalc.h" #include "defs.h" #include "mpr.h" #include "two_hop_neighbor_table.h" #include "olsr.h" #include "neighbor_table.h" #include "scheduler.h" #include "net_olsr.h" /* Begin: * Prototypes for internal functions */ static uint16_t add_will_always_nodes(void); static void olsr_optimize_mpr_set(void); static void olsr_clear_mprs(void); static void olsr_clear_two_hop_processed(void); static struct neighbor_entry *olsr_find_maximum_covered(int); static uint16_t olsr_calculate_two_hop_neighbors(void); static int olsr_check_mpr_changes(void); static int olsr_chosen_mpr(struct neighbor_entry *, uint16_t *); static struct neighbor_2_list_entry *olsr_find_2_hop_neighbors_with_1_link(int); /* End: * Prototypes for internal functions */ /** *Find all 2 hop neighbors with 1 link *connecting them to us trough neighbors *with a given willingness. * *@param willingness the willigness of the neighbors * *@return a linked list of allocated neighbor_2_list_entry structures */ static struct neighbor_2_list_entry * olsr_find_2_hop_neighbors_with_1_link(int willingness) { uint8_t idx; struct neighbor_2_list_entry *two_hop_list_tmp = NULL; struct neighbor_2_list_entry *two_hop_list = NULL; struct neighbor_entry *dup_neighbor; struct neighbor_2_entry *two_hop_neighbor = NULL; for (idx = 0; idx < HASHSIZE; idx++) { for (two_hop_neighbor = two_hop_neighbortable[idx].next; two_hop_neighbor != &two_hop_neighbortable[idx]; two_hop_neighbor = two_hop_neighbor->next) { //two_hop_neighbor->neighbor_2_state=0; //two_hop_neighbor->mpr_covered_count = 0; dup_neighbor = olsr_lookup_neighbor_table(&two_hop_neighbor->neighbor_2_addr); if ((dup_neighbor != NULL) && (dup_neighbor->status != NOT_SYM)) { //OLSR_PRINTF(1, "(1)Skipping 2h neighbor %s - already 1hop\n", olsr_ip_to_string(&buf, &two_hop_neighbor->neighbor_2_addr)); continue; } if (two_hop_neighbor->neighbor_2_pointer == 1) { if ((two_hop_neighbor->neighbor_2_nblist.next->neighbor->willingness == willingness) && (two_hop_neighbor->neighbor_2_nblist.next->neighbor->status == SYM)) { two_hop_list_tmp = olsr_malloc(sizeof(struct neighbor_2_list_entry), "MPR two hop list"); //OLSR_PRINTF(1, "ONE LINK ADDING %s\n", olsr_ip_to_string(&buf, &two_hop_neighbor->neighbor_2_addr)); /* Only queue one way here */ two_hop_list_tmp->neighbor_2 = two_hop_neighbor; two_hop_list_tmp->next = two_hop_list; two_hop_list = two_hop_list_tmp; } } } } return (two_hop_list_tmp); } /** *This function processes the chosen MPRs and updates the counters *used in calculations */ static int olsr_chosen_mpr(struct neighbor_entry *one_hop_neighbor, uint16_t * two_hop_covered_count) { struct neighbor_list_entry *the_one_hop_list; struct neighbor_2_list_entry *second_hop_entries; struct neighbor_entry *dup_neighbor; uint16_t count; struct ipaddr_str buf; count = *two_hop_covered_count; OLSR_PRINTF(1, "Setting %s as MPR\n", olsr_ip_to_string(&buf, &one_hop_neighbor->neighbor_main_addr)); //printf("PRE COUNT: %d\n\n", count); one_hop_neighbor->is_mpr = true; //NBS_MPR; for (second_hop_entries = one_hop_neighbor->neighbor_2_list.next; second_hop_entries != &one_hop_neighbor->neighbor_2_list; second_hop_entries = second_hop_entries->next) { dup_neighbor = olsr_lookup_neighbor_table(&second_hop_entries->neighbor_2->neighbor_2_addr); if ((dup_neighbor != NULL) && (dup_neighbor->status == SYM)) { //OLSR_PRINTF(7, "(2)Skipping 2h neighbor %s - already 1hop\n", olsr_ip_to_string(&buf, &second_hop_entries->neighbor_2->neighbor_2_addr)); continue; } // if(!second_hop_entries->neighbor_2->neighbor_2_state) //if(second_hop_entries->neighbor_2->mpr_covered_count < olsr_cnf->mpr_coverage) //{ /* Now the neighbor is covered by this mpr */ second_hop_entries->neighbor_2->mpr_covered_count++; the_one_hop_list = second_hop_entries->neighbor_2->neighbor_2_nblist.next; //OLSR_PRINTF(1, "[%s](%x) has coverage %d\n", olsr_ip_to_string(&buf, &second_hop_entries->neighbor_2->neighbor_2_addr), second_hop_entries->neighbor_2, second_hop_entries->neighbor_2->mpr_covered_count); if (second_hop_entries->neighbor_2->mpr_covered_count >= olsr_cnf->mpr_coverage) count++; while (the_one_hop_list != &second_hop_entries->neighbor_2->neighbor_2_nblist) { if ((the_one_hop_list->neighbor->status == SYM)) { if (second_hop_entries->neighbor_2->mpr_covered_count >= olsr_cnf->mpr_coverage) { the_one_hop_list->neighbor->neighbor_2_nocov--; } } the_one_hop_list = the_one_hop_list->next; } //} } //printf("POST COUNT %d\n\n", count); *two_hop_covered_count = count; return count; } /** *Find the neighbor that covers the most 2 hop neighbors *with a given willingness * *@param willingness the willingness of the neighbor * *@return a pointer to the neighbor_entry struct */ static struct neighbor_entry * olsr_find_maximum_covered(int willingness) { uint16_t maximum; struct neighbor_entry *a_neighbor; struct neighbor_entry *mpr_candidate = NULL; maximum = 0; OLSR_FOR_ALL_NBR_ENTRIES(a_neighbor) { #if 0 printf("[%s] nocov: %d mpr: %d will: %d max: %d\n\n", olsr_ip_to_string(&buf, &a_neighbor->neighbor_main_addr), a_neighbor->neighbor_2_nocov, a_neighbor->is_mpr, a_neighbor->willingness, maximum); #endif /* 0 */ if ((!a_neighbor->is_mpr) && (a_neighbor->willingness == willingness) && (maximum < a_neighbor->neighbor_2_nocov)) { maximum = a_neighbor->neighbor_2_nocov; mpr_candidate = a_neighbor; } } OLSR_FOR_ALL_NBR_ENTRIES_END(a_neighbor); return mpr_candidate; } /** *Remove all MPR registrations */ static void olsr_clear_mprs(void) { struct neighbor_entry *a_neighbor; struct neighbor_2_list_entry *two_hop_list; OLSR_FOR_ALL_NBR_ENTRIES(a_neighbor) { /* Clear MPR selection. */ if (a_neighbor->is_mpr) { a_neighbor->was_mpr = true; a_neighbor->is_mpr = false; } /* Clear two hop neighbors coverage count/ */ for (two_hop_list = a_neighbor->neighbor_2_list.next; two_hop_list != &a_neighbor->neighbor_2_list; two_hop_list = two_hop_list->next) { two_hop_list->neighbor_2->mpr_covered_count = 0; } } OLSR_FOR_ALL_NBR_ENTRIES_END(a_neighbor); } /** *Check for changes in the MPR set * *@return 1 if changes occured 0 if not */ static int olsr_check_mpr_changes(void) { struct neighbor_entry *a_neighbor; int retval; retval = 0; OLSR_FOR_ALL_NBR_ENTRIES(a_neighbor) { if (a_neighbor->was_mpr) { a_neighbor->was_mpr = false; if (!a_neighbor->is_mpr) { retval = 1; } } } OLSR_FOR_ALL_NBR_ENTRIES_END(a_neighbor); return retval; } /** *Clears out proccess registration *on two hop neighbors */ static void olsr_clear_two_hop_processed(void) { int idx; for (idx = 0; idx < HASHSIZE; idx++) { struct neighbor_2_entry *neighbor_2; for (neighbor_2 = two_hop_neighbortable[idx].next; neighbor_2 != &two_hop_neighbortable[idx]; neighbor_2 = neighbor_2->next) { /* Clear */ neighbor_2->processed = 0; } } } /** *This function calculates the number of two hop neighbors */ static uint16_t olsr_calculate_two_hop_neighbors(void) { struct neighbor_entry *a_neighbor, *dup_neighbor; struct neighbor_2_list_entry *twohop_neighbors; uint16_t count = 0; uint16_t n_count = 0; uint16_t sum = 0; /* Clear 2 hop neighs */ olsr_clear_two_hop_processed(); OLSR_FOR_ALL_NBR_ENTRIES(a_neighbor) { if (a_neighbor->status == NOT_SYM) { a_neighbor->neighbor_2_nocov = count; continue; } for (twohop_neighbors = a_neighbor->neighbor_2_list.next; twohop_neighbors != &a_neighbor->neighbor_2_list; twohop_neighbors = twohop_neighbors->next) { dup_neighbor = olsr_lookup_neighbor_table(&twohop_neighbors->neighbor_2->neighbor_2_addr); if ((dup_neighbor == NULL) || (dup_neighbor->status != SYM)) { n_count++; if (!twohop_neighbors->neighbor_2->processed) { count++; twohop_neighbors->neighbor_2->processed = 1; } } } a_neighbor->neighbor_2_nocov = n_count; /* Add the two hop count */ sum += count; } OLSR_FOR_ALL_NBR_ENTRIES_END(a_neighbor); OLSR_PRINTF(3, "Two hop neighbors: %d\n", sum); return sum; } /** * Adds all nodes with willingness set to WILL_ALWAYS */ static uint16_t add_will_always_nodes(void) { struct neighbor_entry *a_neighbor; uint16_t count = 0; #if 0 printf("\nAdding WILL ALWAYS nodes....\n"); #endif /* 0 */ OLSR_FOR_ALL_NBR_ENTRIES(a_neighbor) { struct ipaddr_str buf; if ((a_neighbor->status == NOT_SYM) || (a_neighbor->willingness != WILL_ALWAYS)) { continue; } olsr_chosen_mpr(a_neighbor, &count); OLSR_PRINTF(3, "Adding WILL_ALWAYS: %s\n", olsr_ip_to_string(&buf, &a_neighbor->neighbor_main_addr)); } OLSR_FOR_ALL_NBR_ENTRIES_END(a_neighbor); #if 0 OLSR_PRINTF(1, "Count: %d\n", count); #endif /* 0 */ return count; } /** *This function calculates the mpr neighbors *@return nada */ void olsr_calculate_mpr(void) { uint16_t two_hop_covered_count; uint16_t two_hop_count; int i; OLSR_PRINTF(3, "\n**RECALCULATING MPR**\n\n"); olsr_clear_mprs(); two_hop_count = olsr_calculate_two_hop_neighbors(); two_hop_covered_count = add_will_always_nodes(); /* *Calculate MPRs based on WILLINGNESS */ for (i = WILL_ALWAYS - 1; i > WILL_NEVER; i--) { struct neighbor_entry *mprs; struct neighbor_2_list_entry *two_hop_list = olsr_find_2_hop_neighbors_with_1_link(i); while (two_hop_list != NULL) { struct neighbor_2_list_entry *tmp; //printf("CHOSEN FROM 1 LINK\n"); if (!two_hop_list->neighbor_2->neighbor_2_nblist.next->neighbor->is_mpr) olsr_chosen_mpr(two_hop_list->neighbor_2->neighbor_2_nblist.next->neighbor, &two_hop_covered_count); tmp = two_hop_list; two_hop_list = two_hop_list->next;; free(tmp); } if (two_hop_covered_count >= two_hop_count) { i = WILL_NEVER; break; } //printf("two hop covered count: %d\n", two_hop_covered_count); while ((mprs = olsr_find_maximum_covered(i)) != NULL) { //printf("CHOSEN FROM MAXCOV\n"); olsr_chosen_mpr(mprs, &two_hop_covered_count); if (two_hop_covered_count >= two_hop_count) { i = WILL_NEVER; break; } } } /* increment the mpr sequence number */ //neighbortable.neighbor_mpr_seq++; /* Optimize selection */ olsr_optimize_mpr_set(); if (olsr_check_mpr_changes()) { OLSR_PRINTF(3, "CHANGES IN MPR SET\n"); if (olsr_cnf->tc_redundancy > 0) signal_link_changes(true); } } /** *Optimize MPR set by removing all entries *where all 2 hop neighbors actually is *covered by enough MPRs already *Described in RFC3626 section 8.3.1 *point 5 * *@return nada */ static void olsr_optimize_mpr_set(void) { struct neighbor_entry *a_neighbor, *dup_neighbor; struct neighbor_2_list_entry *two_hop_list; int i, removeit; #if 0 printf("\n**MPR OPTIMIZING**\n\n"); #endif /* 0 */ for (i = WILL_NEVER + 1; i < WILL_ALWAYS; i++) { OLSR_FOR_ALL_NBR_ENTRIES(a_neighbor) { if (a_neighbor->willingness != i) { continue; } if (a_neighbor->is_mpr) { removeit = 1; for (two_hop_list = a_neighbor->neighbor_2_list.next; two_hop_list != &a_neighbor->neighbor_2_list; two_hop_list = two_hop_list->next) { dup_neighbor = olsr_lookup_neighbor_table(&two_hop_list->neighbor_2->neighbor_2_addr); if ((dup_neighbor != NULL) && (dup_neighbor->status != NOT_SYM)) { continue; } //printf("\t[%s] coverage %d\n", olsr_ip_to_string(&buf, &two_hop_list->neighbor_2->neighbor_2_addr), two_hop_list->neighbor_2->mpr_covered_count); /* Do not remove if we find a entry which need this MPR */ if (two_hop_list->neighbor_2->mpr_covered_count <= olsr_cnf->mpr_coverage) { removeit = 0; } } if (removeit) { struct ipaddr_str buf; OLSR_PRINTF(3, "MPR OPTIMIZE: removiong mpr %s\n\n", olsr_ip_to_string(&buf, &a_neighbor->neighbor_main_addr)); a_neighbor->is_mpr = false; } } } OLSR_FOR_ALL_NBR_ENTRIES_END(a_neighbor); } } #ifndef NODEBUG void olsr_print_mpr_set(void) { /* The whole function makes no sense without it. */ struct neighbor_entry *a_neighbor; OLSR_PRINTF(1, "MPR SET: "); OLSR_FOR_ALL_NBR_ENTRIES(a_neighbor) { /* * Remove MPR settings */ if (a_neighbor->is_mpr) { struct ipaddr_str buf; OLSR_PRINTF(1, "[%s] ", olsr_ip_to_string(&buf, &a_neighbor->neighbor_main_addr)); } } OLSR_FOR_ALL_NBR_ENTRIES_END(a_neighbor); OLSR_PRINTF(1, "\n"); } #endif /* NODEBUG */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/mpr.h000066400000000000000000000041541234304727700145610ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_MPR #define _OLSR_MPR void olsr_calculate_mpr(void); #ifndef NODEBUG void olsr_print_mpr_set(void); #else #define olsr_print_mpr_set() do { } while(0) #endif #endif /* _OLSR_MPR */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/mpr_selector_set.c000066400000000000000000000135311234304727700173260ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "ipcalc.h" #include "defs.h" #include "mpr_selector_set.h" #include "olsr.h" #include "scheduler.h" #include "net_olsr.h" static uint16_t ansn; /* MPR selector list */ static struct mpr_selector mprs_list; /** *Initialize MPR selector set */ void olsr_init_mprs_set(void) { OLSR_PRINTF(5, "MPRS: Init\n"); /* Initial values */ ansn = 0; mprs_list.next = &mprs_list; mprs_list.prev = &mprs_list; } uint16_t get_local_ansn(void) { return ansn; } void increase_local_ansn(void) { ansn++; } #if 0 /** * Check if we(this node) is selected as a MPR by any * neighbors. If the list is empty we are not MPR. */ bool olsr_is_mpr(void) { return ((mprs_list.next == &mprs_list) ? false : true); } #endif /* 0 */ /** * Wrapper for the timer callback. */ static void olsr_expire_mpr_sel_entry(void *context) { #ifdef DEBUG struct ipaddr_str buf; #endif /* DEBUG */ struct mpr_selector *mpr_sel; mpr_sel = (struct mpr_selector *)context; mpr_sel->MS_timer = NULL; #ifdef DEBUG OLSR_PRINTF(1, "MPRS: Timing out %st\n", olsr_ip_to_string(&buf, &mpr_sel->MS_main_addr)); #endif /* DEBUG */ DEQUEUE_ELEM(mpr_sel); /* Delete entry */ free(mpr_sel); signal_link_changes(true); } /** * Set the mpr selector expiration timer. * * all timer setting shall be done using this function. * The timer param is a relative timer expressed in milliseconds. */ static void olsr_set_mpr_sel_timer(struct mpr_selector *mpr_sel, olsr_reltime rel_timer) { olsr_set_timer(&mpr_sel->MS_timer, rel_timer, OLSR_MPR_SEL_JITTER, OLSR_TIMER_ONESHOT, &olsr_expire_mpr_sel_entry, mpr_sel, 0); } /** *Add a MPR selector to the MPR selector set * *@param addr address of the MPR selector *@param vtime validity time for the new entry * *@return a pointer to the new entry */ struct mpr_selector * olsr_add_mpr_selector(const union olsr_ip_addr *addr, olsr_reltime vtime) { struct ipaddr_str buf; struct mpr_selector *new_entry; OLSR_PRINTF(1, "MPRS: adding %s\n", olsr_ip_to_string(&buf, addr)); new_entry = olsr_malloc(sizeof(struct mpr_selector), "Add MPR selector"); /* Fill struct */ new_entry->MS_main_addr = *addr; olsr_set_mpr_sel_timer(new_entry, vtime); /* Queue */ QUEUE_ELEM(mprs_list, new_entry); /* new_entry->prev = &mprs_list; new_entry->next = mprs_list.next; mprs_list.next->prev = new_entry; mprs_list.next = new_entry; */ return new_entry; } /** *Lookup an entry in the MPR selector table *based on address * *@param addr the addres to check for * *@return a pointer to the entry or NULL */ struct mpr_selector * olsr_lookup_mprs_set(const union olsr_ip_addr *addr) { struct mpr_selector *mprs; if (addr == NULL) return NULL; //OLSR_PRINTF(1, "MPRS: Lookup...."); for (mprs = mprs_list.next; mprs != &mprs_list; mprs = mprs->next) { if (ipequal(&mprs->MS_main_addr, addr)) { //OLSR_PRINTF(1, "MATCH\n"); return mprs; } } //OLSR_PRINTF(1, "NO MACH\n"); return NULL; } /** *Update a MPR selector entry or create an new *one if it does not exist * *@param addr the address of the MPR selector *@param vtime tha validity time of the entry * *@return 1 if a new entry was added 0 if not */ int olsr_update_mprs_set(const union olsr_ip_addr *addr, olsr_reltime vtime) { struct ipaddr_str buf; struct mpr_selector *mprs = olsr_lookup_mprs_set(addr); OLSR_PRINTF(5, "MPRS: Update %s\n", olsr_ip_to_string(&buf, addr)); if (mprs == NULL) { olsr_add_mpr_selector(addr, vtime); signal_link_changes(true); return 1; } olsr_set_mpr_sel_timer(mprs, vtime); return 0; } #if 0 /** *Print the current MPR selector set to STDOUT */ void olsr_print_mprs_set(void) { struct mpr_selector *mprs; OLSR_PRINTF(1, "MPR SELECTORS: "); for (mprs = mprs_list.next; mprs != &mprs_list; mprs = mprs->next) { struct ipaddr_str buf; OLSR_PRINTF(1, "%s ", olsr_ip_to_string(&buf, &mprs->MS_main_addr)); } OLSR_PRINTF(1, "\n"); } #endif /* 0 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/mpr_selector_set.h000066400000000000000000000052331234304727700173330ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_MPRS_SET #define _OLSR_MPRS_SET #include "mantissa.h" struct mpr_selector { union olsr_ip_addr MS_main_addr; struct timer_entry *MS_timer; struct mpr_selector *next; struct mpr_selector *prev; }; #define OLSR_MPR_SEL_JITTER 5 /* percent */ #if 0 bool olsr_is_mpr(void); #endif /* 0 */ uint16_t get_local_ansn(void); void increase_local_ansn(void); void olsr_init_mprs_set(void); struct mpr_selector *olsr_add_mpr_selector(const union olsr_ip_addr *, olsr_reltime); struct mpr_selector *olsr_lookup_mprs_set(const union olsr_ip_addr *); int olsr_update_mprs_set(const union olsr_ip_addr *, olsr_reltime); void olsr_time_out_mprs_set(void); #if 0 void olsr_print_mprs_set(void); #endif /* 0 */ #endif /* _OLSR_MPRS_SET */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/neighbor_table.c000066400000000000000000000256301234304727700167240ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "ipcalc.h" #include "defs.h" #include "two_hop_neighbor_table.h" #include "mid_set.h" #include "mpr.h" #include "neighbor_table.h" #include "olsr.h" #include "scheduler.h" #include "link_set.h" #include "mpr_selector_set.h" #include "net_olsr.h" struct neighbor_entry neighbortable[HASHSIZE]; void olsr_init_neighbor_table(void) { int i; for (i = 0; i < HASHSIZE; i++) { neighbortable[i].next = &neighbortable[i]; neighbortable[i].prev = &neighbortable[i]; } } /** * Unlink, delete and free a nbr2_list entry. */ static void olsr_del_nbr2_list(struct neighbor_2_list_entry *nbr2_list) { struct neighbor_2_entry *nbr2; nbr2 = nbr2_list->neighbor_2; if (nbr2->neighbor_2_pointer < 1) { DEQUEUE_ELEM(nbr2); free(nbr2); } /* * Kill running timers. */ olsr_stop_timer(nbr2_list->nbr2_list_timer); nbr2_list->nbr2_list_timer = NULL; /* Dequeue */ DEQUEUE_ELEM(nbr2_list); free(nbr2_list); /* Set flags to recalculate the MPR set and the routing table */ changes_neighborhood = true; changes_topology = true; } /** * Delete a two hop neighbor from a neighbors two hop neighbor list. * * @param neighbor the neighbor to delete the two hop neighbor from. * @param neigh2 the IP address of the two hop neighbor to delete. * * @return positive if entry deleted */ int olsr_delete_neighbor_2_pointer(struct neighbor_entry *neighbor, struct neighbor_2_entry *neigh2) { struct neighbor_2_list_entry *nbr2_list; nbr2_list = neighbor->neighbor_2_list.next; while (nbr2_list != &neighbor->neighbor_2_list) { if (nbr2_list->neighbor_2 == neigh2) { olsr_del_nbr2_list(nbr2_list); return 1; } nbr2_list = nbr2_list->next; } return 0; } /** *Check if a two hop neighbor is reachable via a given *neighbor. * *@param neighbor neighbor-entry to check via *@param neighbor_main_address the addres of the two hop neighbor *to find. * *@return a pointer to the neighbor_2_list_entry struct *representing the two hop neighbor if found. NULL if not found. */ struct neighbor_2_list_entry * olsr_lookup_my_neighbors(const struct neighbor_entry *neighbor, const union olsr_ip_addr *neighbor_main_address) { struct neighbor_2_list_entry *entry; for (entry = neighbor->neighbor_2_list.next; entry != &neighbor->neighbor_2_list; entry = entry->next) { if (ipequal(&entry->neighbor_2->neighbor_2_addr, neighbor_main_address)) return entry; } return NULL; } /** * Update a neighbours main_addr inlcuding hash */ void olsr_update_neighbor_main_addr(struct neighbor_entry *entry, const union olsr_ip_addr *new_main_addr) { /*remove from old pos*/ DEQUEUE_ELEM(entry); /*update main addr*/ entry->neighbor_main_addr = *new_main_addr; /*insert it again*/ QUEUE_ELEM(neighbortable[olsr_ip_hashing(new_main_addr)], entry); } /** *Delete a neighbr table entry. * *Remember: Deleting a neighbor entry results *the deletion of its 2 hop neighbors list!!! *@param neighbor_addr the neighbor entry to delete * *@return always 1 */ int olsr_delete_neighbor_table(const union olsr_ip_addr *neighbor_addr) { struct neighbor_2_list_entry *two_hop_list, *two_hop_to_delete; uint32_t hash; struct neighbor_entry *entry; //printf("inserting neighbor\n"); hash = olsr_ip_hashing(neighbor_addr); entry = neighbortable[hash].next; /* * Find neighbor entry */ while (entry != &neighbortable[hash]) { if (ipequal(&entry->neighbor_main_addr, neighbor_addr)) break; entry = entry->next; } if (entry == &neighbortable[hash]) return 0; two_hop_list = entry->neighbor_2_list.next; while (two_hop_list != &entry->neighbor_2_list) { two_hop_to_delete = two_hop_list; two_hop_list = two_hop_list->next; two_hop_to_delete->neighbor_2->neighbor_2_pointer--; olsr_delete_neighbor_pointer(two_hop_to_delete->neighbor_2, entry); olsr_del_nbr2_list(two_hop_to_delete); } /* Dequeue */ DEQUEUE_ELEM(entry); free(entry); changes_neighborhood = true; return 1; } /** *Insert a neighbor entry in the neighbor table * *@param main_addr the main address of the new node * *@return 0 if neighbor already exists 1 if inserted */ struct neighbor_entry * olsr_insert_neighbor_table(const union olsr_ip_addr *main_addr) { uint32_t hash; struct neighbor_entry *new_neigh; hash = olsr_ip_hashing(main_addr); /* Check if entry exists */ for (new_neigh = neighbortable[hash].next; new_neigh != &neighbortable[hash]; new_neigh = new_neigh->next) { if (ipequal(&new_neigh->neighbor_main_addr, main_addr)) return new_neigh; } //printf("inserting neighbor\n"); new_neigh = olsr_malloc(sizeof(struct neighbor_entry), "New neighbor entry"); /* Set address, willingness and status */ new_neigh->neighbor_main_addr = *main_addr; new_neigh->willingness = WILL_NEVER; new_neigh->status = NOT_SYM; new_neigh->neighbor_2_list.next = &new_neigh->neighbor_2_list; new_neigh->neighbor_2_list.prev = &new_neigh->neighbor_2_list; new_neigh->linkcount = 0; new_neigh->is_mpr = false; new_neigh->was_mpr = false; /* Queue */ QUEUE_ELEM(neighbortable[hash], new_neigh); return new_neigh; } /** *Lookup a neighbor entry in the neighbortable based on an address. * *@param dst the IP address of the neighbor to look up * *@return a pointer to the neighbor struct registered on the given *address. NULL if not found. */ struct neighbor_entry * olsr_lookup_neighbor_table(const union olsr_ip_addr *dst) { /* *Find main address of node */ union olsr_ip_addr *tmp_ip = mid_lookup_main_addr(dst); if (tmp_ip != NULL) dst = tmp_ip; return olsr_lookup_neighbor_table_alias(dst); } /** *Lookup a neighbor entry in the neighbortable based on an address. * *@param dst the IP address of the neighbor to look up * *@return a pointer to the neighbor struct registered on the given *address. NULL if not found. */ struct neighbor_entry * olsr_lookup_neighbor_table_alias(const union olsr_ip_addr *dst) { struct neighbor_entry *entry; uint32_t hash = olsr_ip_hashing(dst); //printf("\nLookup %s\n", olsr_ip_to_string(&buf, dst)); for (entry = neighbortable[hash].next; entry != &neighbortable[hash]; entry = entry->next) { //printf("Checking %s\n", olsr_ip_to_string(&buf, &entry->neighbor_main_addr)); if (ipequal(&entry->neighbor_main_addr, dst)) return entry; } //printf("NOPE\n\n"); return NULL; } int update_neighbor_status(struct neighbor_entry *entry, int lnk) { /* * Update neighbor entry */ if (lnk == SYM_LINK) { /* N_status is set to SYM */ if (entry->status == NOT_SYM) { struct neighbor_2_entry *two_hop_neighbor; /* Delete posible 2 hop entry on this neighbor */ if ((two_hop_neighbor = olsr_lookup_two_hop_neighbor_table(&entry->neighbor_main_addr)) != NULL) { olsr_delete_two_hop_neighbor_table(two_hop_neighbor); } changes_neighborhood = true; changes_topology = true; if (olsr_cnf->tc_redundancy > 1) signal_link_changes(true); } entry->status = SYM; } else { if (entry->status == SYM) { changes_neighborhood = true; changes_topology = true; if (olsr_cnf->tc_redundancy > 1) signal_link_changes(true); } /* else N_status is set to NOT_SYM */ entry->status = NOT_SYM; /* remove neighbor from routing list */ } return entry->status; } /** * Callback for the nbr2_list timer. */ void olsr_expire_nbr2_list(void *context) { struct neighbor_2_list_entry *nbr2_list; struct neighbor_entry *nbr; struct neighbor_2_entry *nbr2; nbr2_list = (struct neighbor_2_list_entry *)context; nbr2_list->nbr2_list_timer = NULL; nbr = nbr2_list->nbr2_nbr; nbr2 = nbr2_list->neighbor_2; nbr2->neighbor_2_pointer--; olsr_delete_neighbor_pointer(nbr2, nbr); olsr_del_nbr2_list(nbr2_list); } /** *Prints the registered neighbors and two hop neighbors *to STDOUT. * *@return nada */ #ifndef NODEBUG void olsr_print_neighbor_table(void) { /* The whole function doesn't do anything else. */ const int iplen = olsr_cnf->ip_version == AF_INET ? (INET_ADDRSTRLEN - 1) : (INET6_ADDRSTRLEN - 1); int idx; OLSR_PRINTF(1, "\n--- %s ------------------------------------------------ NEIGHBORS\n\n" "%*s LQ NLQ SYM MPR MPRS will\n", olsr_wallclock_string(), iplen, "IP address"); for (idx = 0; idx < HASHSIZE; idx++) { struct neighbor_entry *neigh; for (neigh = neighbortable[idx].next; neigh != &neighbortable[idx]; neigh = neigh->next) { struct link_entry *lnk = get_best_link_to_neighbor(&neigh->neighbor_main_addr); if (lnk) { struct ipaddr_str buf; OLSR_PRINTF(1, "%-*s %5.3f %s %s %s %d\n", iplen, olsr_ip_to_string(&buf, &neigh->neighbor_main_addr), (double)lnk->L_link_quality, neigh->status == SYM ? "YES " : "NO ", neigh->is_mpr ? "YES " : "NO ", olsr_lookup_mprs_set(&neigh->neighbor_main_addr) == NULL ? "NO " : "YES ", neigh->willingness); } } } } #endif /* NODEBUG */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/neighbor_table.h000066400000000000000000000077421234304727700167350ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_NEIGH_TBL #define _OLSR_NEIGH_TBL #include "olsr_types.h" #include "hashing.h" struct neighbor_2_list_entry { struct neighbor_entry *nbr2_nbr; /* backpointer to owning nbr entry */ struct neighbor_2_entry *neighbor_2; struct timer_entry *nbr2_list_timer; struct neighbor_2_list_entry *next; struct neighbor_2_list_entry *prev; }; #define OLSR_NBR2_LIST_JITTER 5 /* percent */ struct neighbor_entry { union olsr_ip_addr neighbor_main_addr; uint8_t status; uint8_t willingness; bool is_mpr; bool was_mpr; /* Used to detect changes in MPR */ bool skip; int neighbor_2_nocov; int linkcount; struct neighbor_2_list_entry neighbor_2_list; struct neighbor_entry *next; struct neighbor_entry *prev; }; #define OLSR_FOR_ALL_NBR_ENTRIES(nbr) \ { \ int _idx; \ for (_idx = 0; _idx < HASHSIZE; _idx++) { \ for(nbr = neighbortable[_idx].next; \ nbr != &neighbortable[_idx]; \ nbr = nbr->next) #define OLSR_FOR_ALL_NBR_ENTRIES_END(nbr) }} /* * The neighbor table */ extern struct neighbor_entry neighbortable[HASHSIZE]; void olsr_init_neighbor_table(void); int olsr_delete_neighbor_2_pointer(struct neighbor_entry *, struct neighbor_2_entry *); struct neighbor_2_list_entry *olsr_lookup_my_neighbors(const struct neighbor_entry *, const union olsr_ip_addr *); int olsr_delete_neighbor_table(const union olsr_ip_addr *); struct neighbor_entry *olsr_insert_neighbor_table(const union olsr_ip_addr *); struct neighbor_entry *olsr_lookup_neighbor_table(const union olsr_ip_addr *); struct neighbor_entry *olsr_lookup_neighbor_table_alias(const union olsr_ip_addr *); void olsr_time_out_two_hop_neighbors(struct neighbor_entry *); void olsr_time_out_neighborhood_tables(void); void olsr_expire_nbr2_list(void *); #ifndef NODEBUG void olsr_print_neighbor_table(void); #else #define olsr_print_neighbor_table() do { } while(0) #endif void olsr_update_neighbor_main_addr(struct neighbor_entry *, const union olsr_ip_addr *); int update_neighbor_status(struct neighbor_entry *, int); #endif /* _OLSR_NEIGH_TBL */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/net_olsr.c000066400000000000000000000265031234304727700156050ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "net_olsr.h" #include "ipcalc.h" #include "log.h" #include "olsr.h" #include "net_os.h" #include "link_set.h" #include "lq_packet.h" #include #include #include #ifdef _WIN32 #define perror(x) WinSockPError(x) void WinSockPError(const char *); #endif /* _WIN32 */ struct deny_address_entry { union olsr_ip_addr addr; struct deny_address_entry *next; }; /* Packet transform functions */ struct ptf { packet_transform_function function; struct ptf *next; }; static struct ptf *ptf_list; static struct deny_address_entry *deny_entries; static const char *const deny_ipv4_defaults[] = { "0.0.0.0", "127.0.0.1", NULL }; static const char *const deny_ipv6_defaults[] = { "0::0", "0::1", NULL }; /* * Converts each invalid IP-address from string to network byte order * and adds it to the invalid list. * * TODO: rename function */ void init_net(void) { const char *const *defaults = (olsr_cnf->ip_version == AF_INET) ? deny_ipv4_defaults : deny_ipv6_defaults; for (; *defaults != NULL; defaults++) { union olsr_ip_addr addr; if (inet_pton(olsr_cnf->ip_version, *defaults, &addr) <= 0) { fprintf(stderr, "Error converting fixed IP %s for deny rule!!\n", *defaults); continue; } olsr_add_invalid_address(&addr); } } /** * Create an outputbuffer for the given interface. This * function will allocate the needed storage according * to the MTU of the interface. * * @param ifp the interface to create a buffer for * * @return 0 on success, negative if a buffer already existed * for the given interface */ int net_add_buffer(struct interface *ifp) { /* Can the interfaces MTU actually change? If not, we can elimiate * the "bufsize" field in "struct olsr_netbuf". */ if (ifp->netbuf.bufsize != ifp->int_mtu && ifp->netbuf.buff != NULL) { free(ifp->netbuf.buff); ifp->netbuf.buff = NULL; } if (ifp->netbuf.buff == NULL) { ifp->netbuf.buff = olsr_malloc(ifp->int_mtu, "add_netbuff"); } /* Fill struct */ ifp->netbuf.bufsize = ifp->int_mtu; ifp->netbuf.maxsize = ifp->int_mtu - OLSR_HEADERSIZE; ifp->netbuf.pending = 0; ifp->netbuf.reserved = 0; return 0; } /** * Remove a outputbuffer. Frees the allocated memory. * * @param ifp the interface corresponding to the buffer * to remove * * @return 0 on success, negative if no buffer is found */ int net_remove_buffer(struct interface *ifp) { /* Flush pending data */ if (ifp->netbuf.pending) net_output(ifp); free(ifp->netbuf.buff); ifp->netbuf.buff = NULL; return 0; } /** * Reserve space in a outputbuffer. This should only be needed * in very special cases. This will decrease the reported size * of the buffer so that there is always size bytes * of data available in the buffer. To add data in the reserved * area one must use the net_outbuffer_push_reserved function. * * @param ifp the interface corresponding to the buffer * to reserve space on * @param size the number of bytes to reserve * * @return 0 on success, negative if there was not enough * bytes to reserve */ int net_reserve_bufspace(struct interface *ifp, int size) { if (size > ifp->netbuf.maxsize) return -1; ifp->netbuf.reserved = size; ifp->netbuf.maxsize -= size; return 0; } /** * Returns the number of bytes pending in the buffer. That * is the number of bytes added but not sent. * * @param ifp the interface corresponding to the buffer * * @return the number of bytes currently pending */ uint16_t net_output_pending(const struct interface * ifp) { return ifp->netbuf.pending; } /** * Add data to a buffer. * * @param ifp the interface corresponding to the buffer * @param data a pointer to the data to add * @param size the number of byte to copy from data * * @return -1 if no buffer was found, 0 if there was not * enough room in buffer or the number of bytes added on * success */ int net_outbuffer_push(struct interface *ifp, const void *data, const uint16_t size) { if ((ifp->netbuf.pending + size) > ifp->netbuf.maxsize) return 0; memcpy(&ifp->netbuf.buff[ifp->netbuf.pending + OLSR_HEADERSIZE], data, size); ifp->netbuf.pending += size; return size; } /** * Add data to the reserved part of a buffer * * @param ifp the interface corresponding to the buffer * @param data a pointer to the data to add * @param size the number of byte to copy from data * * @return -1 if no buffer was found, 0 if there was not * enough room in buffer or the number of bytes added on * success */ int net_outbuffer_push_reserved(struct interface *ifp, const void *data, const uint16_t size) { if ((ifp->netbuf.pending + size) > (ifp->netbuf.maxsize + ifp->netbuf.reserved)) return 0; memcpy(&ifp->netbuf.buff[ifp->netbuf.pending + OLSR_HEADERSIZE], data, size); ifp->netbuf.pending += size; return size; } /** * Report the number of bytes currently available in the buffer * (not including possible reserved bytes) * * @param ifp the interface corresponding to the buffer * * @return the number of bytes available in the buffer or */ int net_outbuffer_bytes_left(const struct interface *ifp) { return ifp->netbuf.maxsize - ifp->netbuf.pending; } /** * Add a packet transform function. Theese are functions * called just prior to sending data in a buffer. * * @param f the function pointer * * @returns 1 */ int add_ptf(packet_transform_function f) { struct ptf *new_ptf; new_ptf = olsr_malloc(sizeof(struct ptf), "Add PTF"); new_ptf->next = ptf_list; new_ptf->function = f; ptf_list = new_ptf; return 1; } /** * Remove a packet transform function * * @param f the function pointer * * @returns 1 if a functionpointer was removed * 0 if not */ int del_ptf(packet_transform_function f) { struct ptf *prev = NULL; struct ptf *tmp_ptf = ptf_list; while (tmp_ptf) { if (tmp_ptf->function == f) { /* Remove entry */ if (prev == NULL) ptf_list = tmp_ptf->next; else prev->next = tmp_ptf->next; free(tmp_ptf); return 1; } prev = tmp_ptf; tmp_ptf = tmp_ptf->next; } return 0; } /** *Sends a packet on a given interface. * *@param ifp the interface to send on. * *@return negative on error */ int net_output(struct interface *ifp) { struct sockaddr_in *sin = NULL; struct sockaddr_in6 *sin6 = NULL; struct sockaddr_in dst; struct sockaddr_in6 dst6; struct ptf *tmp_ptf_list; union olsr_packet *outmsg; int retval; if (!ifp->netbuf.pending) return 0; ifp->netbuf.pending += OLSR_HEADERSIZE; retval = ifp->netbuf.pending; outmsg = (union olsr_packet *)ifp->netbuf.buff; /* Add the Packet seqno */ outmsg->v4.olsr_seqno = htons(ifp->olsr_seqnum++); /* Set the packetlength */ outmsg->v4.olsr_packlen = htons(ifp->netbuf.pending); if (olsr_cnf->ip_version == AF_INET) { /* IP version 4 */ sin = (struct sockaddr_in *)&ifp->int_broadaddr; /* Copy sin */ dst = *sin; sin = &dst; if (sin->sin_port == 0) sin->sin_port = htons(olsr_cnf->olsrport); } else { /* IP version 6 */ sin6 = (struct sockaddr_in6 *)&ifp->int6_multaddr; /* Copy sin */ dst6 = *sin6; sin6 = &dst6; } /* *Call possible packet transform functions registered by plugins */ for (tmp_ptf_list = ptf_list; tmp_ptf_list != NULL; tmp_ptf_list = tmp_ptf_list->next) { tmp_ptf_list->function(ifp->netbuf.buff, &ifp->netbuf.pending); } if (olsr_cnf->ip_version == AF_INET) { /* IP version 4 */ if (olsr_sendto(ifp->send_socket, ifp->netbuf.buff, ifp->netbuf.pending, MSG_DONTROUTE, (struct sockaddr *)sin, sizeof(*sin)) < 0) { perror("sendto(v4)"); #ifndef _WIN32 olsr_syslog(OLSR_LOG_ERR, "OLSR: sendto IPv4 %m"); #endif /* _WIN32 */ retval = -1; } } else { /* IP version 6 */ if (olsr_sendto(ifp->send_socket, ifp->netbuf.buff, ifp->netbuf.pending, MSG_DONTROUTE, (struct sockaddr *)sin6, sizeof(*sin6)) < 0) { struct ipaddr_str buf; perror("sendto(v6)"); #ifndef _WIN32 olsr_syslog(OLSR_LOG_ERR, "OLSR: sendto IPv6 %m"); #endif /* _WIN32 */ fprintf(stderr, "Socket: %d interface: %d\n", ifp->olsr_socket, ifp->if_index); fprintf(stderr, "To: %s (size: %u)\n", ip6_to_string(&buf, &sin6->sin6_addr), (unsigned int)sizeof(*sin6)); fprintf(stderr, "Outputsize: %d\n", ifp->netbuf.pending); retval = -1; } } ifp->netbuf.pending = 0; /* * if we've just transmitted a TC message, let Dijkstra use the current * link qualities for the links to our neighbours */ lq_tc_pending = false; return retval; } /* * Adds the given IP-address to the invalid list. */ void olsr_add_invalid_address(const union olsr_ip_addr *adr) { struct ipaddr_str buf; struct deny_address_entry *new_entry = olsr_malloc(sizeof(struct deny_address_entry), "Add deny address"); new_entry->addr = *adr; new_entry->next = deny_entries; deny_entries = new_entry; OLSR_PRINTF(1, "Added %s to IP deny set\n", olsr_ip_to_string(&buf, &new_entry->addr)); } bool olsr_validate_address(const union olsr_ip_addr *adr) { const struct deny_address_entry *deny_entry; for (deny_entry = deny_entries; deny_entry != NULL; deny_entry = deny_entry->next) { if (ipequal(adr, &deny_entry->addr)) { struct ipaddr_str buf; OLSR_PRINTF(1, "Validation of address %s failed!\n", olsr_ip_to_string(&buf, adr)); return false; } if (deny_entry == (struct deny_address_entry *)&olsr_cnf->main_addr) break; } return true; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/net_olsr.h000066400000000000000000000055561234304727700156170ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _NET_OLSR #define _NET_OLSR #include "olsr_types.h" #include "interfaces.h" #include "process_routes.h" #include #include typedef int (*packet_transform_function) (uint8_t *, int *); void init_net(void); int net_add_buffer(struct interface *); int net_remove_buffer(struct interface *); int net_outbuffer_bytes_left(const struct interface *); uint16_t net_output_pending(const struct interface *); int net_reserve_bufspace(struct interface *, int); int net_outbuffer_push(struct interface *, const void *, const uint16_t); int net_outbuffer_push_reserved(struct interface *, const void *, const uint16_t); int net_output(struct interface *); int net_sendroute(struct rt_entry *, struct sockaddr *); int add_ptf(packet_transform_function); int del_ptf(packet_transform_function); bool olsr_validate_address(const union olsr_ip_addr *); void olsr_add_invalid_address(const union olsr_ip_addr *); #endif /* _NET_OLSR */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/net_os.h000066400000000000000000000062661234304727700152600ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * This file defines the OS dependent network related functions * that MUST be available to olsrd. * The implementations of the functions should be found in * /net.c (e.g. linux/net.c) */ #ifndef _OLSR_NET_OS_H #define _OLSR_NET_OS_H #include "olsr_types.h" #include "interfaces.h" /* OS dependent functions */ ssize_t olsr_sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_t); ssize_t olsr_recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *); int olsr_select(int, fd_set *, fd_set *, fd_set *, struct timeval *); int bind_socket_to_device(int, char *); int convert_ip_to_mac(union olsr_ip_addr *, struct sockaddr *, char *); void net_os_set_global_ifoptions(void); int net_os_set_ifoptions(const char *if_name, struct interface *iface); int net_os_restore_ifoptions(void); int gethemusocket(struct sockaddr_in *pin); int getsocket(int, struct interface *); int getsocket6(int, struct interface *); int get_ipv6_address(char *, struct sockaddr_in6 *, struct olsr_ip_prefix *); int calculate_if_metric(char *); int check_wireless_interface(char *); bool is_if_link_up(char *); int join_mcast(struct interface *, int); bool olsr_if_isup(const char * dev); int olsr_if_set_state(const char *dev, bool up); #endif /* _OLSR_NET_OS_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr.c000066400000000000000000000353351234304727700147420ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /** * All these functions are global */ #include "defs.h" #include "builddata.h" #include "olsr.h" #include "link_set.h" #include "two_hop_neighbor_table.h" #include "tc_set.h" #include "duplicate_set.h" #include "mpr_selector_set.h" #include "mid_set.h" #include "mpr.h" #include "lq_mpr.h" #include "olsr_spf.h" #include "scheduler.h" #include "apm.h" #include "misc.h" #include "neighbor_table.h" #include "log.h" #include "lq_packet.h" #include "common/avl.h" #include "net_olsr.h" #include "lq_plugin.h" #include "gateway.h" #include "duplicate_handler.h" #include #include #include bool changes_topology; bool changes_neighborhood; bool changes_hna; bool changes_force; /*COLLECT startup sleeps caused by warnings*/ #ifdef OLSR_COLLECT_STARTUP_SLEEP static int max_startup_sleep = 0; #endif /* OLSR_COLLECT_STARTUP_SLEEP */ static int sum_startup_sleep = 0; void olsr_startup_sleep(int s) { sum_startup_sleep += s; #ifdef OLSR_COLLECT_STARTUP_SLEEP if (s > max_startup_sleep) max_startup_sleep=s; #else /* OLSR_COLLECT_STARTUP_SLEEP */ sleep(s); #endif /* OLSR_COLLECT_STARTUP_SLEEP */ } void olsr_do_startup_sleep(void) { #ifdef OLSR_COLLECT_STARTUP_SLEEP if (sum_startup_sleep > max_startup_sleep) printf("OLSR encountered multiple problems on startup, which should delay startup by %i seconds.\nAs this is quite much time, OLSR will sleep only %i seconds.\nBUT YOU SHOULD FIX ABOVE PROBLEMS!\n", sum_startup_sleep,max_startup_sleep); sleep(max_startup_sleep); #else /* OLSR_COLLECT_STARTUP_SLEEP */ if (sum_startup_sleep > 0) printf("olsrd startup was delayed %i seconds due to various nasty error messages.\nYOU SHOULD REALLY FIX ABOVE PROBLEMS!\n", sum_startup_sleep); #endif /* OLSR_COLLECT_STARTUP_SLEEP */ } /** * Process changes functions */ struct pcf { int (*function) (int, int, int); struct pcf *next; }; static struct pcf *pcf_list; static uint16_t message_seqno; union olsr_ip_addr all_zero; /** *Initialize the message sequence number as a random value */ void init_msg_seqno(void) { message_seqno = random() & 0xFFFF; } /** * Get and increment the message sequence number * *@return the seqno */ uint16_t get_msg_seqno(void) { return message_seqno++; } bool olsr_is_bad_duplicate_msg_seqno(uint16_t seqno) { int32_t diff = (int32_t) seqno - (int32_t) message_seqno; if (diff < -32768) { diff += 65536; } else if (diff > 32767) { diff -= 65536; } return diff > 0; } void register_pcf(int (*f) (int, int, int)) { struct pcf *new_pcf; OLSR_PRINTF(1, "Registering pcf function\n"); new_pcf = olsr_malloc(sizeof(struct pcf), "New PCF"); new_pcf->function = f; new_pcf->next = pcf_list; pcf_list = new_pcf; } /** *Process changes in neighborhood or/and topology. *Re-calculates the neighborhood/topology if there *are any updates - then calls the right functions to *update the routing table. *@return 0 */ void olsr_process_changes(void) { struct pcf *tmp_pc_list; #ifdef DEBUG if (changes_neighborhood) OLSR_PRINTF(3, "CHANGES IN NEIGHBORHOOD\n"); if (changes_topology) OLSR_PRINTF(3, "CHANGES IN TOPOLOGY\n"); if (changes_hna) OLSR_PRINTF(3, "CHANGES IN HNA\n"); #endif /* DEBUG */ if (!changes_neighborhood && !changes_topology && !changes_hna) return; if (olsr_cnf->debug_level > 0 && olsr_cnf->clear_screen && isatty(1)) { clear_console(); printf(" *** %s (%s on %s) ***\n", olsrd_version, build_date, build_host); } if (changes_neighborhood) { if (olsr_cnf->lq_level < 1) { olsr_calculate_mpr(); } else { olsr_calculate_lq_mpr(); } } /* calculate the routing table */ if (changes_neighborhood || changes_topology || changes_hna) { olsr_calculate_routing_table(false); } if (olsr_cnf->debug_level > 0) { if (olsr_cnf->debug_level > 2) { olsr_print_mid_set(); #ifdef __linux__ olsr_print_gateway_entries(); #endif /* __linux__ */ if (olsr_cnf->debug_level > 3) { if (olsr_cnf->debug_level > 8) { olsr_print_duplicate_table(); } olsr_print_hna_set(); } } olsr_print_link_set(); olsr_print_neighbor_table(); olsr_print_two_hop_neighbor_table(); if (olsr_cnf->debug_level > 3) { olsr_print_tc_table(); } } for (tmp_pc_list = pcf_list; tmp_pc_list != NULL; tmp_pc_list = tmp_pc_list->next) { tmp_pc_list->function(changes_neighborhood, changes_topology, changes_hna); } changes_neighborhood = false; changes_topology = false; changes_hna = false; changes_force = false; } /** *Initialize all the tables used(neighbor, *topology, MID, HNA, MPR, dup). *Also initalizes other variables */ void olsr_init_tables(void) { changes_topology = false; changes_neighborhood = false; changes_hna = false; /* Set avl tree comparator */ if (olsr_cnf->ipsize == 4) { avl_comp_default = avl_comp_ipv4; avl_comp_prefix_default = avl_comp_ipv4_prefix; } else { avl_comp_default = avl_comp_ipv6; avl_comp_prefix_default = avl_comp_ipv6_prefix; } /* Initialize lq plugin set */ init_lq_handler_tree(); /* Initialize link set */ olsr_init_link_set(); /* Initialize duplicate table */ olsr_init_duplicate_set(); /* Initialize neighbor table */ olsr_init_neighbor_table(); /* Initialize routing table */ olsr_init_routing_table(); /* Initialize two hop table */ olsr_init_two_hop_table(); /* Initialize topology */ olsr_init_tc(); /* Initialize mpr selector table */ olsr_init_mprs_set(); /* Initialize MID set */ olsr_init_mid_set(); /* Initialize HNA set */ olsr_init_hna_set(); /* Initialize duplicate handler */ #ifndef NO_DUPLICATE_DETECTION_HANDLER olsr_duplicate_handler_init(); #endif /* NO_DUPLICATE_DETECTION_HANDLER */ } /** *Check if a message is to be forwarded and forward *it if necessary. * *@param m the OLSR message to be forwarded *@param in_if the incoming interface *@param from_addr neighbour we received message from * *@returns positive if forwarded */ int olsr_forward_message(union olsr_message *m, struct interface *in_if, union olsr_ip_addr *from_addr) { union olsr_ip_addr *src; struct neighbor_entry *neighbor; int msgsize; struct interface *ifn; bool is_ttl_1 = false; /* * Sven-Ola: We should not flood the mesh with overdue messages. Because * of a bug in parser.c:parse_packet, we have a lot of messages because * all older olsrd's have lq_fish enabled. */ if (AF_INET == olsr_cnf->ip_version) { if (m->v4.ttl < 2 || 255 < (int)m->v4.hopcnt + (int)m->v4.ttl) is_ttl_1 = true; } else { if (m->v6.ttl < 2 || 255 < (int)m->v6.hopcnt + (int)m->v6.ttl) is_ttl_1 = true; } /* Lookup sender address */ src = mid_lookup_main_addr(from_addr); if (!src) src = from_addr; neighbor = olsr_lookup_neighbor_table(src); if (!neighbor) return 0; if (neighbor->status != SYM) return 0; /* Check MPR */ if (olsr_lookup_mprs_set(src) == NULL) { #ifdef DEBUG struct ipaddr_str buf; OLSR_PRINTF(5, "Forward - sender %s not MPR selector\n", olsr_ip_to_string(&buf, src)); #endif /* DEBUG */ return 0; } if (olsr_message_is_duplicate(m)) { return 0; } /* Treat TTL hopcnt except for ethernet link */ if (!is_ttl_1) { if (olsr_cnf->ip_version == AF_INET) { /* IPv4 */ m->v4.hopcnt++; m->v4.ttl--; } else { /* IPv6 */ m->v6.hopcnt++; m->v6.ttl--; } } /* Update packet data */ msgsize = ntohs(m->v4.olsr_msgsize); /* looping trough interfaces */ for (ifn = ifnet; ifn; ifn = ifn->int_next) { /* do not retransmit out through the same interface if it has mode == ether */ if (ifn == in_if && ifn->mode == IF_MODE_ETHER) continue; /* do not forward TTL 1 messages to non-ether interfaces */ if (is_ttl_1 && ifn->mode != IF_MODE_ETHER) continue; if (net_output_pending(ifn)) { /* * Check if message is to big to be piggybacked */ if (net_outbuffer_push(ifn, m, msgsize) != msgsize) { /* Send */ net_output(ifn); /* Buffer message */ set_buffer_timer(ifn); if (net_outbuffer_push(ifn, m, msgsize) != msgsize) { OLSR_PRINTF(1, "Received message to big to be forwarded in %s(%d bytes)!", ifn->int_name, msgsize); olsr_syslog(OLSR_LOG_ERR, "Received message to big to be forwarded on %s(%d bytes)!", ifn->int_name, msgsize); } } } else { /* No forwarding pending */ set_buffer_timer(ifn); if (net_outbuffer_push(ifn, m, msgsize) != msgsize) { OLSR_PRINTF(1, "Received message to big to be forwarded in %s(%d bytes)!", ifn->int_name, msgsize); olsr_syslog(OLSR_LOG_ERR, "Received message to big to be forwarded on %s(%d bytes)!", ifn->int_name, msgsize); } } } return 1; } void set_buffer_timer(struct interface *ifn) { /* Set timer */ ifn->fwdtimer = GET_TIMESTAMP(random() * olsr_cnf->max_jitter * MSEC_PER_SEC / RAND_MAX); } void olsr_init_willingness(void) { if (olsr_cnf->willingness_auto) { /* Run it first and then periodic. */ olsr_update_willingness(NULL); olsr_start_timer((unsigned int)olsr_cnf->will_int * MSEC_PER_SEC, 5, OLSR_TIMER_PERIODIC, &olsr_update_willingness, NULL, 0); } } void olsr_update_willingness(void *foo __attribute__ ((unused))) { int tmp_will = olsr_cnf->willingness; /* Re-calculate willingness */ olsr_cnf->willingness = olsr_calculate_willingness(); if (tmp_will != olsr_cnf->willingness) { OLSR_PRINTF(1, "Local willingness updated: old %d new %d\n", tmp_will, olsr_cnf->willingness); } } /** *Calculate this nodes willingness to act as a MPR *based on either a fixed value or the power status *of the node using APM * *@return a 8bit value from 0-7 representing the willingness */ uint8_t olsr_calculate_willingness(void) { struct olsr_apm_info ainfo; /* If fixed willingness */ if (!olsr_cnf->willingness_auto) return olsr_cnf->willingness; if (apm_read(&ainfo) < 1) return WILL_DEFAULT; apm_printinfo(&ainfo); /* If AC powered */ if (ainfo.ac_line_status == OLSR_AC_POWERED) return 6; /* If battery powered * * juice > 78% will: 3 * 78% > juice > 26% will: 2 * 26% > juice will: 1 */ return (ainfo.battery_percentage / 26); } const char * olsr_msgtype_to_string(uint8_t msgtype) { static char type[20]; switch (msgtype) { case (HELLO_MESSAGE): return "HELLO"; case (TC_MESSAGE): return "TC"; case (MID_MESSAGE): return "MID"; case (HNA_MESSAGE): return "HNA"; case (LQ_HELLO_MESSAGE): return ("LQ-HELLO"); case (LQ_TC_MESSAGE): return ("LQ-TC"); default: break; } snprintf(type, sizeof(type), "UNKNOWN(%d)", msgtype); return type; } const char * olsr_link_to_string(uint8_t linktype) { static char type[20]; switch (linktype) { case (UNSPEC_LINK): return "UNSPEC"; case (ASYM_LINK): return "ASYM"; case (SYM_LINK): return "SYM"; case (LOST_LINK): return "LOST"; case (HIDE_LINK): return "HIDE"; default: break; } snprintf(type, sizeof(type), "UNKNOWN(%d)", linktype); return type; } const char * olsr_status_to_string(uint8_t status) { static char type[20]; switch (status) { case (NOT_NEIGH): return "NOT NEIGH"; case (SYM_NEIGH): return "NEIGHBOR"; case (MPR_NEIGH): return "MPR"; default: break; } snprintf(type, sizeof(type), "UNKNOWN(%d)", status); return type; } /** *Termination function to be called whenever a error occures *that requires the daemon to terminate * *@param msg the message to write to the syslog and possibly stdout *@param val the exit code */ void olsr_exit(const char *msg, int val) { OLSR_PRINTF(1, "OLSR EXIT: %s\n", msg); olsr_syslog(OLSR_LOG_ERR, "olsrd exit: %s\n", msg); fflush(stdout); olsr_cnf->exit_value = val; raise(SIGTERM); /* just to be sure */ exit(val); } /** * Wrapper for malloc(3) that does error-checking * * @param size the number of bytes to allocalte * @param id a string identifying the caller for * use in error messaging * * @return a void pointer to the memory allocated */ void * olsr_malloc(size_t size, const char *id) { void *ptr; /* * Not all the callers do a proper cleaning of memory. * Clean it on behalf of those. */ ptr = calloc(1, size); if (!ptr) { const char *const err_msg = strerror(errno); OLSR_PRINTF(1, "OUT OF MEMORY: %s\n", err_msg); olsr_syslog(OLSR_LOG_ERR, "olsrd: out of memory!: %s\n", err_msg); olsr_exit(id, EXIT_FAILURE); } return ptr; } /** *Wrapper for printf that prints to a specific *debuglevel upper limit * */ int olsr_printf(int loglevel, const char *format, ...) { if ((loglevel <= olsr_cnf->debug_level) && debug_handle) { va_list arglist; va_start(arglist, format); vfprintf(debug_handle, format, arglist); va_end(arglist); } return 0; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr.h000066400000000000000000000061061234304727700147410ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_FUNCTIONS #define _OLSR_FUNCTIONS #include "olsr_protocol.h" #include "interfaces.h" extern bool changes_topology; extern bool changes_neighborhood; extern bool changes_hna; extern bool changes_force; extern union olsr_ip_addr all_zero; void olsr_startup_sleep(int); void olsr_do_startup_sleep(void); void register_pcf(int (*)(int, int, int)); void olsr_process_changes(void); void init_msg_seqno(void); uint16_t get_msg_seqno(void); bool olsr_is_bad_duplicate_msg_seqno(uint16_t seqno); int olsr_forward_message(union olsr_message *, struct interface *, union olsr_ip_addr *); void set_buffer_timer(struct interface *); void olsr_init_tables(void); void olsr_init_willingness(void); void olsr_update_willingness(void *); uint8_t olsr_calculate_willingness(void); const char *olsr_msgtype_to_string(uint8_t); const char *olsr_link_to_string(uint8_t); const char *olsr_status_to_string(uint8_t); void olsr_exit(const char *, int) __attribute__((noreturn)); void *olsr_malloc(size_t, const char *); int olsr_printf(int, const char *, ...) __attribute__ ((format(printf, 2, 3))); void olsr_trigger_forced_update(void *); #endif /* _OLSR_FUNCTIONS */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_cfg.h000066400000000000000000000255601234304727700155650ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSRD_CFGPARSER_H #define _OLSRD_CFGPARSER_H #include "olsr_types.h" #include "common/autobuf.h" #ifdef HTTPINFO_PUD #include "pud/src/receiver.h" #endif /* HTTPINFO_PUD */ /* set to 1 to collect all startup sleep into one sleep * (just as long as the longest sleep) * useful if many errors on many interfaces */ #define OLSR_COLLECT_STARTUP_SLEEP 1 #define TESTLIB_PATH 0 #define SYSLOG_NUMBERING 0 /* Default values not declared in olsr_protocol.h */ #define DEF_IP_VERSION AF_INET #define DEF_POLLRATE 0.05 #define DEF_NICCHGPOLLRT 2.5 #define DEF_WILL_AUTO false #define DEF_WILLINGNESS 3 #define DEF_ALLOW_NO_INTS true #define DEF_TOS 192 #define DEF_DEBUGLVL 1 #define DEF_IPC_CONNECTIONS 0 #define DEF_USE_HYST false #define DEF_FIB_METRIC FIBM_FLAT #define DEF_LQ_LEVEL 2 #define DEF_LQ_ALGORITHM "etx_ff" #define DEF_LQ_FISH 1 #define DEF_LQ_NAT_THRESH 1.0 #define DEF_LQ_AGING 0.05 #define DEF_CLEAR_SCREEN true #define DEF_OLSRPORT 698 #define DEF_RTPROTO 0 /* 0 means OS-specific default */ #define DEF_RT_NONE -1 #define DEF_RT_AUTO 0 #define DEF_MIN_TC_VTIME 0.0 #define DEF_USE_NIIT true #define DEF_SMART_GW false #define DEF_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL false #define DEF_GW_USE_COUNT 1 #define DEF_GW_TAKEDOWN_PERCENTAGE 25 #define DEF_GW_MARK_OFFSET_EGRESS 91 #define DEF_GW_MARK_OFFSET_TUNNELS 101 #define DEF_GW_PERIOD 10*1000 #define DEF_GW_STABLE_COUNT 6 #define DEF_GW_ALLOW_NAT true #define DEF_GW_THRESH 0 #define DEF_GW_WEIGHT_EXITLINK_UP 1 #define DEF_GW_WEIGHT_EXITLINK_DOWN 1 #define DEF_GW_WEIGHT_ETX 1 #define DEF_GW_DIVIDER_ETX 0 #define DEF_GW_TYPE GW_UPLINK_IPV46 #define DEF_GW_UPLINK_NAT true #define DEF_UPLINK_SPEED 128 #define DEF_DOWNLINK_SPEED 1024 #define DEF_USE_SRCIP_ROUTES false #define DEF_IF_MODE IF_MODE_MESH /* Bounds */ #define MIN_INTERVAL 0.01 #define MAX_POLLRATE 1.0 #define MIN_POLLRATE 0.01 #define MAX_NICCHGPOLLRT 100.0 #define MIN_NICCHGPOLLRT 1.0 #define MAX_DEBUGLVL 9 #define MIN_DEBUGLVL 0 #define MAX_TOS 252 #define MIN_TOS 0 #define MAX_WILLINGNESS 7 #define MIN_WILLINGNESS 0 #define MAX_MPR_COVERAGE 20 #define MIN_MPR_COVERAGE 1 #define MAX_TC_REDUNDANCY 2 #define MIN_TC_REDUNDANCY 0 #define MAX_HYST_PARAM 1.0 #define MIN_HYST_PARAM 0.0 #define MAX_LQ_LEVEL 2 #define MIN_LQ_LEVEL 0 #define MAX_LQ_AGING 1.0 #define MIN_LQ_AGING 0.01 #define MIN_SMARTGW_USE_COUNT_MIN 1 #define MAX_SMARTGW_USE_COUNT_MAX 64 #define MAX_SMARTGW_EGRESS_INTERFACE_COUNT_MAX 32 #define MIN_SMARTGW_PERIOD 1*1000 #define MAX_SMARTGW_PERIOD 320000*1000 #define MIN_SMARTGW_STABLE 1 #define MAX_SMARTGW_STABLE 254 #define MIN_SMARTGW_THRES 10 #define MAX_SMARTGW_THRES 100 #define MIN_SMARTGW_SPEED 1 #define MAX_SMARTGW_SPEED 320000000 #ifndef IPV6_ADDR_SITELOCAL #define IPV6_ADDR_SITELOCAL 0x0040U #endif /* IPV6_ADDR_SITELOCAL */ #include "interfaces.h" enum smart_gw_uplinktype { GW_UPLINK_NONE, GW_UPLINK_IPV4, GW_UPLINK_IPV6, GW_UPLINK_IPV46, GW_UPLINK_CNT, }; typedef enum { FIBM_FLAT, FIBM_CORRECT, FIBM_APPROX, FIBM_CNT } olsr_fib_metric_options; enum olsr_if_mode { IF_MODE_MESH, IF_MODE_ETHER, IF_MODE_CNT }; struct olsr_msg_params { float emission_interval; float validity_time; }; struct olsr_lq_mult { union olsr_ip_addr addr; uint32_t value; struct olsr_lq_mult *next; }; struct olsr_if_weight { int value; bool fixed; }; struct if_config_options { union olsr_ip_addr ipv4_multicast; union olsr_ip_addr ipv6_multicast; union olsr_ip_addr ipv4_src; struct olsr_ip_prefix ipv6_src; int mode; struct olsr_if_weight weight; struct olsr_msg_params hello_params; struct olsr_msg_params tc_params; struct olsr_msg_params mid_params; struct olsr_msg_params hna_params; struct olsr_lq_mult *lq_mult; int orig_lq_mult_cnt; bool autodetect_chg; }; struct olsr_if { char *name; bool configured; bool host_emul; union olsr_ip_addr hemu_ip; struct interface *interf; struct if_config_options *cnf, *cnfi; struct olsr_if *next; }; struct ip_prefix_list { struct olsr_ip_prefix net; struct ip_prefix_list *next; }; struct hyst_param { float scaling; float thr_high; float thr_low; }; struct plugin_param { char *key; char *value; struct plugin_param *next; }; struct plugin_entry { char *name; struct plugin_param *params; struct plugin_entry *next; }; struct sgw_egress_if { char *name; uint8_t mark; struct sgw_egress_if *next; }; /* * The config struct */ struct olsrd_config { uint16_t olsrport; int debug_level; bool no_fork; char * pidfile; bool host_emul; int ip_version; bool allow_no_interfaces; uint8_t tos; uint8_t rt_proto; uint8_t rt_table, rt_table_default, rt_table_tunnel; int32_t rt_table_pri, rt_table_tunnel_pri; int32_t rt_table_defaultolsr_pri, rt_table_default_pri; uint8_t willingness; bool willingness_auto; int ipc_connections; bool use_hysteresis; olsr_fib_metric_options fib_metric; struct hyst_param hysteresis_param; struct plugin_entry *plugins; struct ip_prefix_list *hna_entries; struct ip_prefix_list *ipc_nets; struct if_config_options *interface_defaults; struct olsr_if *interfaces; float pollrate; float nic_chgs_pollrate; bool clear_screen; uint8_t tc_redundancy; uint8_t mpr_coverage; uint8_t lq_level; uint8_t lq_fish; float lq_aging; char *lq_algorithm; float min_tc_vtime; bool set_ip_forward; char *lock_file; bool use_niit; bool smart_gw_active, smart_gw_always_remove_server_tunnel, smart_gw_allow_nat, smart_gw_uplink_nat; uint8_t smart_gw_use_count; uint8_t smart_gw_takedown_percentage; char *smart_gw_policyrouting_script; struct sgw_egress_if * smart_gw_egress_interfaces; uint8_t smart_gw_egress_interfaces_count; uint8_t smart_gw_mark_offset_egress; uint8_t smart_gw_mark_offset_tunnels; uint32_t smart_gw_period; uint8_t smart_gw_stablecount; uint8_t smart_gw_thresh; uint8_t smart_gw_weight_exitlink_up; uint8_t smart_gw_weight_exitlink_down; uint8_t smart_gw_weight_etx; uint8_t smart_gw_divider_etx; enum smart_gw_uplinktype smart_gw_type; uint32_t smart_gw_uplink, smart_gw_downlink; struct olsr_ip_prefix smart_gw_prefix; /* Main address of this node */ union olsr_ip_addr main_addr, unicast_src_ip; bool use_src_ip_routes; /* Stuff set by olsrd */ uint8_t maxplen; /* maximum prefix len */ size_t ipsize; /* Size of address */ bool del_gws; /* Delete InternetGWs at startup */ float will_int; float max_jitter; int exit_value; /* Global return value for process termination */ float max_tc_vtime; int niit4to6_if_index, niit6to4_if_index; /*many potential parameters or helper variables for smartgateway*/ bool has_ipv4_gateway, has_ipv6_gateway; int ioctl_s; /* Socket used for ioctl calls */ #ifdef __linux__ int rtnl_s; /* Socket used for rtnetlink messages */ int rt_monitor_socket; #endif /* __linux__ */ #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ int rts; /* Socket used for route changes on BSDs */ #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ */ float lq_nat_thresh; #ifdef HTTPINFO_PUD TransmitGpsInformation * pud_position; #endif /* HTTPINFO_PUD */ }; #if defined __cplusplus extern "C" { #endif /* defined __cplusplus */ extern const char *GW_UPLINK_TXT[]; extern const char *FIB_METRIC_TXT[]; extern const char *OLSR_IF_MODE[]; /* * List functions */ void ip_prefix_list_add(struct ip_prefix_list **, const union olsr_ip_addr *, uint8_t); int ip_prefix_list_remove(struct ip_prefix_list **, const union olsr_ip_addr *, uint8_t); struct ip_prefix_list *ip_prefix_list_find(struct ip_prefix_list *, const union olsr_ip_addr *net, uint8_t prefix_len); /* * Interface to parser */ int olsrd_parse_cnf(const char *); int olsrd_sanity_check_cnf(struct olsrd_config *); void olsrd_free_cnf(struct olsrd_config *); void olsrd_print_cnf(struct olsrd_config *); void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf); int olsrd_write_cnf(struct olsrd_config *, const char *); struct if_config_options *get_default_if_config(void); struct olsrd_config *olsrd_get_default_cnf(void); #if defined _WIN32 void win32_stdio_hack(unsigned int); void *win32_olsrd_malloc(size_t size); void win32_olsrd_free(void *ptr); #endif /* defined _WIN32 */ #if defined __cplusplus } #endif /* defined __cplusplus */ #endif /* _OLSRD_CFGPARSER_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_cookie.c000066400000000000000000000204741234304727700162710ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008, Hannes Gredler (hannes@gredler.at) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. */ #include "olsr.h" #include "defs.h" #include "olsr_cookie.h" #include "log.h" #include /* Root directory of the cookies we have in the system */ static struct olsr_cookie_info *cookies[COOKIE_ID_MAX] = { 0 }; /* * Allocate a cookie for the next available cookie id. */ struct olsr_cookie_info * olsr_alloc_cookie(const char *cookie_name, olsr_cookie_type cookie_type) { struct olsr_cookie_info *ci; int ci_index; /* * Look for an unused index. * For ease of troubleshooting (non-zero patterns) we start at index 1. */ for (ci_index = 1; ci_index < COOKIE_ID_MAX; ci_index++) { if (!cookies[ci_index]) { break; } } assert(ci_index < COOKIE_ID_MAX); /* increase COOKIE_ID_MAX */ ci = calloc(1, sizeof(struct olsr_cookie_info)); cookies[ci_index] = ci; /* Now populate the cookie info */ ci->ci_id = ci_index; ci->ci_type = cookie_type; if (cookie_name) { ci->ci_name = strdup(cookie_name); } /* Init the free list */ if (cookie_type == OLSR_COOKIE_TYPE_MEMORY) { list_head_init(&ci->ci_free_list); } return ci; } /* * Free a cookie that is no longer being used. */ void olsr_free_cookie(struct olsr_cookie_info *ci) { struct list_node *memory_list; /* Mark the cookie as unused */ cookies[ci->ci_id] = NULL; /* Free name if set */ if (ci->ci_name) { free(ci->ci_name); } /* Flush all the memory on the free list */ if (ci->ci_type == OLSR_COOKIE_TYPE_MEMORY) { while (!list_is_empty(&ci->ci_free_list)) { memory_list = ci->ci_free_list.next; list_remove(memory_list); free(memory_list); } } free(ci); } /* * Flush all cookies. This is really only called upon shutdown. */ void olsr_delete_all_cookies(void) { int ci_index; /* * Walk the full index range and kill 'em all. */ for (ci_index = 1; ci_index < COOKIE_ID_MAX; ci_index++) { if (!cookies[ci_index]) { continue; } olsr_free_cookie(cookies[ci_index]); } } /* * Set the size for fixed block allocations. * This is only allowed for memory cookies. */ void olsr_cookie_set_memory_size(struct olsr_cookie_info *ci, size_t size) { if (!ci) { return; } assert(ci->ci_type == OLSR_COOKIE_TYPE_MEMORY); ci->ci_size = size; } /* * Basic sanity checking for a passed-in cookie-id. */ static bool olsr_cookie_valid(olsr_cookie_t cookie_id) { if ((cookie_id < COOKIE_ID_MAX) && cookies[cookie_id]) { return true; } return false; } /* * Increment usage state for a given cookie. */ void olsr_cookie_usage_incr(olsr_cookie_t cookie_id) { if (olsr_cookie_valid(cookie_id)) { cookies[cookie_id]->ci_usage++; cookies[cookie_id]->ci_changes++; } } /* * Decrement usage state for a given cookie. */ void olsr_cookie_usage_decr(olsr_cookie_t cookie_id) { if (olsr_cookie_valid(cookie_id)) { cookies[cookie_id]->ci_usage--; cookies[cookie_id]->ci_changes++; } } /* * Return a cookie name. * Mostly used for logging purposes. */ char * olsr_cookie_name(olsr_cookie_t cookie_id) { static char unknown[] = "unknown"; if (olsr_cookie_valid(cookie_id)) { return (cookies[cookie_id])->ci_name; } return unknown; } /* * Allocate a fixed amount of memory based on a passed in cookie type. */ void * olsr_cookie_malloc(struct olsr_cookie_info *ci) { void *ptr; struct olsr_cookie_mem_brand *branding; struct list_node *free_list_node; #ifdef OLSR_COOKIE_DEBUG bool reuse = false; #endif /* OLSR_COOKIE_DEBUG */ /* * Check first if we have reusable memory. */ if (!ci->ci_free_list_usage) { /* * No reusable memory block on the free_list. */ ptr = calloc(1, ci->ci_size + sizeof(struct olsr_cookie_mem_brand)); if (!ptr) { const char *const err_msg = strerror(errno); OLSR_PRINTF(1, "OUT OF MEMORY: %s\n", err_msg); olsr_syslog(OLSR_LOG_ERR, "olsrd: out of memory!: %s\n", err_msg); olsr_exit(ci->ci_name, EXIT_FAILURE); } assert(ptr); } else { /* * There is a memory block on the free list. * Carve it out of the list, and clean. */ free_list_node = ci->ci_free_list.next; list_remove(free_list_node); ptr = (void *)free_list_node; memset(ptr, 0, ci->ci_size); ci->ci_free_list_usage--; #ifdef OLSR_COOKIE_DEBUG reuse = true; #endif /* OLSR_COOKIE_DEBUG */ } /* * Now brand mark the end of the memory block with a short signature * indicating presence of a cookie. This will be checked against * When the block is freed to detect corruption. */ branding = (struct olsr_cookie_mem_brand *)ARM_NOWARN_ALIGN(((unsigned char *)ptr + ci->ci_size)); memcpy(&branding->cmb_sig[0], "cookie", 6); branding->cmb_id = ci->ci_id; /* Stats keeping */ olsr_cookie_usage_incr(ci->ci_id); #ifdef OLSR_COOKIE_DEBUG OLSR_PRINTF(1, "MEMORY: alloc %s, %p, %u bytes%s\n", ci->ci_name, ptr, ci->ci_size, reuse ? ", reuse" : ""); #endif /* OLSR_COOKIE_DEBUG */ return ptr; } /* * Free a memory block owned by a given cookie. * Run some corruption checks. */ void olsr_cookie_free(struct olsr_cookie_info *ci, void *ptr) { struct olsr_cookie_mem_brand *branding; struct list_node *free_list_node; #ifdef OLSR_COOKIE_DEBUG bool reuse = false; #endif /* OLSR_COOKIE_DEBUG */ branding = (struct olsr_cookie_mem_brand *)ARM_NOWARN_ALIGN(((unsigned char *)ptr + ci->ci_size)); /* * Verify if there has been a memory overrun, or * the wrong owner is trying to free this. */ assert(!memcmp(&branding->cmb_sig, "cookie", 6) && branding->cmb_id == ci->ci_id); /* Kill the brand */ memset(branding, 0, sizeof(*branding)); /* * Rather than freeing the memory right away, try to reuse at a later * point. Keep at least ten percent of the active used blocks or at least * ten blocks on the free list. */ if ((ci->ci_free_list_usage < COOKIE_FREE_LIST_THRESHOLD) || (ci->ci_free_list_usage < ci->ci_usage / COOKIE_FREE_LIST_THRESHOLD)) { free_list_node = (struct list_node *)ptr; list_node_init(free_list_node); list_add_before(&ci->ci_free_list, free_list_node); ci->ci_free_list_usage++; #ifdef OLSR_COOKIE_DEBUG reuse = true; #endif /* OLSR_COOKIE_DEBUG */ } else { /* * No interest in reusing memory. */ free(ptr); } /* Stats keeping */ olsr_cookie_usage_decr(ci->ci_id); #ifdef OLSR_COOKIE_DEBUG OLSR_PRINTF(1, "MEMORY: free %s, %p, %u bytes%s\n", ci->ci_name, ptr, ci->ci_size, reuse ? ", reuse" : ""); #endif /* OLSR_COOKIE_DEBUG */ } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_cookie.h000066400000000000000000000074371234304727700163020ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2008, Hannes Gredler (hannes@gredler.at) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. */ #include "olsr_types.h" #include "common/list.h" #ifndef _OLSR_COOKIE_H #define _OLSR_COOKIE_H #define COOKIE_ID_MAX 50 /* maximum number of cookies in the system */ typedef enum olsr_cookie_type_ { OLSR_COOKIE_TYPE_MIN, OLSR_COOKIE_TYPE_MEMORY, OLSR_COOKIE_TYPE_TIMER, OLSR_COOKIE_TYPE_MAX } olsr_cookie_type; /* * This is a cookie. A cookie is a tool aimed for olsrd developers. * It is used for tracking resource usage in the system and also * for locating memory corruption. */ struct olsr_cookie_info { olsr_cookie_t ci_id; /* ID */ char *ci_name; /* Name */ olsr_cookie_type ci_type; /* Type of cookie */ size_t ci_size; /* Fixed size for block allocations */ unsigned int ci_usage; /* Stats, resource usage */ unsigned int ci_changes; /* Stats, resource churn */ struct list_node ci_free_list; /* List head for recyclable blocks */ unsigned int ci_free_list_usage; /* Length of free list */ }; #define COOKIE_FREE_LIST_THRESHOLD 10 /* Blocks / Percent */ /* * Small brand which gets appended on the end of every block allocation. * Helps to detect memory corruption, like overruns, double frees. */ struct olsr_cookie_mem_brand { char cmb_sig[6]; olsr_cookie_t cmb_id; }; /* Externals. */ extern struct olsr_cookie_info *olsr_alloc_cookie(const char *, olsr_cookie_type); extern void olsr_free_cookie(struct olsr_cookie_info *); extern void olsr_delete_all_cookies(void); extern char *olsr_cookie_name(olsr_cookie_t); extern void olsr_cookie_set_memory_size(struct olsr_cookie_info *, size_t); extern void olsr_cookie_usage_incr(olsr_cookie_t); extern void olsr_cookie_usage_decr(olsr_cookie_t); extern void *olsr_cookie_malloc(struct olsr_cookie_info *); extern void olsr_cookie_free(struct olsr_cookie_info *, void *); #endif /* _OLSR_COOKIE_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_niit.c000066400000000000000000000064011234304727700157550ustar00rootroot00000000000000/* * olsr_niit.c * * Created on: 02.02.2010 * Author: henning */ #include "defs.h" #include "kernel_routes.h" #include "net_os.h" #include "olsr_niit.h" #include #ifdef __linux__ static void handle_niit_ifchange (int if_index, struct interface *iface, enum olsr_ifchg_flag); static bool niit4to6_active, niit6to4_active; void olsr_init_niit(void) { if (olsr_cnf->ip_version == AF_INET) { olsr_cnf->use_niit = false; return; } olsr_cnf->niit4to6_if_index = if_nametoindex(DEF_NIIT4TO6_IFNAME); if (olsr_cnf->niit4to6_if_index <= 0) { OLSR_PRINTF(1, "Warning, %s device is not available, deactivating NIIT\n", DEF_NIIT4TO6_IFNAME); olsr_cnf->use_niit = false; return; } olsr_cnf->niit6to4_if_index = if_nametoindex(DEF_NIIT6TO4_IFNAME); if (olsr_cnf->niit6to4_if_index <= 0) { OLSR_PRINTF(1, "Warning, %s device is not available, deactivating NIIT\n", DEF_NIIT6TO4_IFNAME); olsr_cnf->use_niit = false; return; } niit4to6_active = olsr_if_isup(DEF_NIIT4TO6_IFNAME); niit6to4_active = olsr_if_isup(DEF_NIIT6TO4_IFNAME); olsr_add_ifchange_handler(&handle_niit_ifchange); olsr_add_ifchange_handler(&handle_niit_ifchange); return; } void olsr_setup_niit_routes(void) { struct ip_prefix_list *h; if (!niit4to6_active || !niit6to4_active) { return; } for (h = olsr_cnf->hna_entries; h != NULL; h = h->next) { if (ip_prefix_is_mappedv4(&h->net)) { olsr_os_niit_6to4_route(&h->net, true); } } } void olsr_cleanup_niit_routes(void) { struct ip_prefix_list *h; if (!niit6to4_active) { return; } for (h = olsr_cnf->hna_entries; h != NULL; h = h->next) { if (ip_prefix_is_mappedv4(&h->net)) { olsr_os_niit_6to4_route(&h->net, false); } } } void olsr_niit_handle_route(const struct rt_entry *rt, bool set) { if (olsr_cnf->ip_version == AF_INET6 && olsr_cnf->use_niit && niit4to6_active && niit6to4_active && is_prefix_niit_ipv6(&rt->rt_dst)) { struct olsr_ip_prefix dst_v4; prefix_mappedv4_to_v4(&dst_v4, &rt->rt_dst); olsr_os_niit_4to6_route(&dst_v4, set); } } static void refresh_niit4to6_routes(bool set) { struct rt_entry *rt; if (set && (!niit4to6_active || !niit6to4_active)) { return; } if (!set && !niit4to6_active) { return; } OLSR_FOR_ALL_RT_ENTRIES(rt) { if (is_prefix_niit_ipv6(&rt->rt_dst)) { struct olsr_ip_prefix dst_v4; prefix_mappedv4_to_v4(&dst_v4, &rt->rt_dst); olsr_os_niit_4to6_route(&dst_v4, set); } } OLSR_FOR_ALL_RT_ENTRIES_END(rt) } static void handle_niit_ifchange (int if_index, struct interface *iface __attribute__ ((unused)), enum olsr_ifchg_flag flag) { bool active; active = niit4to6_active && niit6to4_active; if (if_index == olsr_cnf->niit4to6_if_index) { niit4to6_active = flag != IFCHG_IF_REMOVE; } if (if_index == olsr_cnf->niit6to4_if_index) { niit6to4_active = flag != IFCHG_IF_REMOVE; } if (active != (niit4to6_active && niit6to4_active)) { /* niit status change */ if (!active) { /* from inactive to active */ olsr_setup_niit_routes(); refresh_niit4to6_routes(true); } else { /* the other way around */ olsr_cleanup_niit_routes(); refresh_niit4to6_routes(false); } } } #endif /* __linux__ */ olsrd-0.6.6.2/src/olsr_niit.h000066400000000000000000000007561234304727700157710ustar00rootroot00000000000000/* * olsr_niit.h * * Created on: 02.02.2010 * Author: henning */ #ifndef OLSR_NIIT_H_ #define OLSR_NIIT_H_ #include "defs.h" #include "routing_table.h" #define DEF_NIIT4TO6_IFNAME "niit4to6" #define DEF_NIIT6TO4_IFNAME "niit6to4" #ifdef __linux__ void olsr_init_niit(void); void olsr_setup_niit_routes(void); void olsr_cleanup_niit_routes(void); void olsr_niit_handle_route(const struct rt_entry *rt, bool set); #endif /* __linux__ */ #endif /* OLSR_NIIT_H_ */ olsrd-0.6.6.2/src/olsr_protocol.h000066400000000000000000000202371234304727700166630ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* *Values and packet formats as proposed in RFC3626 and misc. values and *data structures used by the olsr.org OLSR daemon. */ #ifndef _PROTOCOLS_OLSR_H #define _PROTOCOLS_OLSR_H struct olsr; #include "olsr_types.h" #include "olsr_cfg.h" #include #define OLSR_HEADERSIZE (sizeof(uint16_t) + sizeof(uint16_t)) #define OLSR_MSGHDRSZ_IPV4 12 #define OLSR_MSGHDRSZ_IPV6 24 /* *Emission Intervals */ #define HELLO_INTERVAL 2 #define REFRESH_INTERVAL 2 #define TC_INTERVAL 5 #define MID_INTERVAL TC_INTERVAL #define HNA_INTERVAL TC_INTERVAL /* Emission Jitter */ #define HELLO_JITTER 25 /* percent */ #define HNA_JITTER 25 /* percent */ #define MID_JITTER 25 /* percent */ #define TC_JITTER 25 /* percent */ /* * Default Holding Time (for large scale community networks) */ #define NEIGHB_HOLD_TIME 10 * REFRESH_INTERVAL #define TOP_HOLD_TIME 60 * TC_INTERVAL #define DUP_HOLD_TIME 30 #define MID_HOLD_TIME 60 * MID_INTERVAL #define HNA_HOLD_TIME 60 * HNA_INTERVAL /* *Message Types */ #define HELLO_MESSAGE 1 #define TC_MESSAGE 2 #define MID_MESSAGE 3 #define HNA_MESSAGE 4 #define MAX_MESSAGE 4 /* *Link Types */ #define UNSPEC_LINK 0 #define ASYM_LINK 1 #define SYM_LINK 2 #define LOST_LINK 3 #define HIDE_LINK 4 #define MAX_LINK 4 /* *Neighbor Types */ #define NOT_NEIGH 0 #define SYM_NEIGH 1 #define MPR_NEIGH 2 #define MAX_NEIGH 2 /* *Neighbor status */ #define NOT_SYM 0 #define SYM 1 /* *Link Hysteresis */ #define HYST_THRESHOLD_HIGH 0.8 #define HYST_THRESHOLD_LOW 0.3 #define HYST_SCALING 0.5 /* *Willingness */ #define WILL_NEVER 0 #define WILL_LOW 1 #define WILL_DEFAULT 3 #define WILL_HIGH 6 #define WILL_ALWAYS 7 /* *Redundancy defaults */ #define TC_REDUNDANCY 2 #define MPR_COVERAGE 7 /* *Misc. Constants */ #define MAXJITTER HELLO_INTERVAL / 4 #define MAX_TTL 0xff /* *Sequence numbering */ /* Seqnos are 16 bit values */ #define MAXVALUE 0xFFFF /* Macro for checking seqnos "wraparound" */ #define SEQNO_GREATER_THAN(s1, s2) \ (((s1 > s2) && (s1 - s2 <= (MAXVALUE/2))) \ || ((s2 > s1) && (s2 - s1 > (MAXVALUE/2)))) /* * Macros for creating and extracting the neighbor * and link type information from 8bit link_code * data as passed in HELLO messages */ #define CREATE_LINK_CODE(status, link) (link | (status<<2)) #define EXTRACT_STATUS(link_code) ((link_code & 0xC)>>2) #define EXTRACT_LINK(link_code) (link_code & 0x3) /*********************************************** * OLSR packet definitions * ***********************************************/ /* *The HELLO message */ /* *Hello info */ struct hellinfo { uint8_t link_code; uint8_t reserved; uint16_t size; uint32_t neigh_addr[1]; /* neighbor IP address(es) */ } __attribute__ ((packed)); struct hellomsg { uint16_t reserved; uint8_t htime; uint8_t willingness; struct hellinfo hell_info[1]; } __attribute__ ((packed)); /* *IPv6 */ struct hellinfo6 { uint8_t link_code; uint8_t reserved; uint16_t size; struct in6_addr neigh_addr[1]; /* neighbor IP address(es) */ } __attribute__ ((packed)); struct hellomsg6 { uint16_t reserved; uint8_t htime; uint8_t willingness; struct hellinfo6 hell_info[1]; } __attribute__ ((packed)); /* * Topology Control packet */ struct neigh_info { uint32_t addr; } __attribute__ ((packed)); struct olsr_tcmsg { uint16_t ansn; uint16_t reserved; struct neigh_info neigh[1]; } __attribute__ ((packed)); /* *IPv6 */ struct neigh_info6 { struct in6_addr addr; } __attribute__ ((packed)); struct olsr_tcmsg6 { uint16_t ansn; uint16_t reserved; struct neigh_info6 neigh[1]; } __attribute__ ((packed)); /* *Multiple Interface Declaration message */ /* * Defined as s struct for further expansion * For example: do we want to tell what type of interface * is associated whit each address? */ struct midaddr { uint32_t addr; } __attribute__ ((packed)); struct midmsg { struct midaddr mid_addr[1]; } __attribute__ ((packed)); /* *IPv6 */ struct midaddr6 { struct in6_addr addr; } __attribute__ ((packed)); struct midmsg6 { struct midaddr6 mid_addr[1]; } __attribute__ ((packed)); /* * Host and Network Association message */ struct hnapair { uint32_t addr; uint32_t netmask; } __attribute__ ((packed)); struct hnamsg { struct hnapair hna_net[1]; } __attribute__ ((packed)); /* *IPv6 */ struct hnapair6 { struct in6_addr addr; struct in6_addr netmask; } __attribute__ ((packed)); struct hnamsg6 { struct hnapair6 hna_net[1]; } __attribute__ ((packed)); /* * OLSR message (several can exist in one OLSR packet) */ struct olsrmsg { uint8_t olsr_msgtype; uint8_t olsr_vtime; uint16_t olsr_msgsize; uint32_t originator; uint8_t ttl; uint8_t hopcnt; uint16_t seqno; union { struct hellomsg hello; struct olsr_tcmsg tc; struct hnamsg hna; struct midmsg mid; } message; } __attribute__ ((packed)); /* *IPv6 */ struct olsrmsg6 { uint8_t olsr_msgtype; uint8_t olsr_vtime; uint16_t olsr_msgsize; struct in6_addr originator; uint8_t ttl; uint8_t hopcnt; uint16_t seqno; union { struct hellomsg6 hello; struct olsr_tcmsg6 tc; struct hnamsg6 hna; struct midmsg6 mid; } message; } __attribute__ ((packed)); /* * Generic OLSR packet */ struct olsr { uint16_t olsr_packlen; /* packet length */ uint16_t olsr_seqno; struct olsrmsg olsr_msg[1]; /* variable messages */ } __attribute__ ((packed)); struct olsr6 { uint16_t olsr_packlen; /* packet length */ uint16_t olsr_seqno; struct olsrmsg6 olsr_msg[1]; /* variable messages */ } __attribute__ ((packed)); /* IPv4 <-> IPv6 compability */ union olsr_message { struct olsrmsg v4; struct olsrmsg6 v6; } __attribute__ ((packed)); union olsr_packet { struct olsr v4; struct olsr6 v6; } __attribute__ ((packed)); #endif /* _PROTOCOLS_OLSR_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_spf.c000066400000000000000000000361021234304727700156030ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * IPv4 performance optimization (c) 2006, sven-ola(gmx.de) * SPF implementation (c) 2007, Hannes Gredler (hannes@gredler.at) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * * Implementation of Dijkstras algorithm. Initially all nodes * are initialized to infinite cost. First we put ourselves * on the heap of reachable nodes. Our heap implementation * is based on an AVL tree which gives interesting performance * characteristics for the frequent operations of minimum key * extraction and re-keying. Next all neighbors of a node are * explored and put on the heap if the cost of reaching them is * better than reaching the current candidate node. * The SPF calculation is terminated if there are no more nodes * on the heap. */ #include "ipcalc.h" #include "defs.h" #include "olsr.h" #include "tc_set.h" #include "neighbor_table.h" #include "two_hop_neighbor_table.h" #include "link_set.h" #include "routing_table.h" #include "mid_set.h" #include "hna_set.h" #include "common/list.h" #include "common/avl.h" #include "olsr_spf.h" #include "net_olsr.h" #include "lq_plugin.h" #include "gateway.h" struct timer_entry *spf_backoff_timer = NULL; /* * avl_comp_etx * * compare two etx metrics. * return 0 if there is an exact match and * -1 / +1 depending on being smaller or bigger. * note that this results in the most optimal code * after compiler optimization. */ static int avl_comp_etx(const void *etx1, const void *etx2) { if (*(const olsr_linkcost *)etx1 < *(const olsr_linkcost *)etx2) { return -1; } if (*(const olsr_linkcost *)etx1 > *(const olsr_linkcost *)etx2) { return +1; } return 0; } /* * olsr_spf_add_cand_tree * * Key an existing vertex to a candidate tree. */ static void olsr_spf_add_cand_tree(struct avl_tree *tree, struct tc_entry *tc) { #if !defined(NODEBUG) && defined(DEBUG) struct ipaddr_str buf; struct lqtextbuffer lqbuffer; #endif /* !defined(NODEBUG) && defined(DEBUG) */ tc->cand_tree_node.key = &tc->path_cost; #ifdef DEBUG OLSR_PRINTF(2, "SPF: insert candidate %s, cost %s\n", olsr_ip_to_string(&buf, &tc->addr), get_linkcost_text(tc->path_cost, false, &lqbuffer)); #endif /* DEBUG */ avl_insert(tree, &tc->cand_tree_node, AVL_DUP); } /* * olsr_spf_del_cand_tree * * Unkey an existing vertex from a candidate tree. */ static void olsr_spf_del_cand_tree(struct avl_tree *tree, struct tc_entry *tc) { #ifdef DEBUG #ifndef NODEBUG struct ipaddr_str buf; struct lqtextbuffer lqbuffer; #endif /* NODEBUG */ OLSR_PRINTF(2, "SPF: delete candidate %s, cost %s\n", olsr_ip_to_string(&buf, &tc->addr), get_linkcost_text(tc->path_cost, false, &lqbuffer)); #endif /* DEBUG */ avl_delete(tree, &tc->cand_tree_node); } /* * olsr_spf_add_path_list * * Insert an SPF result at the end of the path list. */ static void olsr_spf_add_path_list(struct list_node *head, int *path_count, struct tc_entry *tc) { #if !defined(NODEBUG) && defined(DEBUG) struct ipaddr_str pathbuf, nbuf; struct lqtextbuffer lqbuffer; #endif /* !defined(NODEBUG) && defined(DEBUG) */ #ifdef DEBUG OLSR_PRINTF(2, "SPF: append path %s, cost %s, via %s\n", olsr_ip_to_string(&pathbuf, &tc->addr), get_linkcost_text(tc->path_cost, false, &lqbuffer), tc->next_hop ? olsr_ip_to_string(&nbuf, &tc->next_hop-> neighbor_iface_addr) : "-"); #endif /* DEBUG */ list_add_before(head, &tc->path_list_node); *path_count = *path_count + 1; } /* * olsr_spf_extract_best * * return the node with the minimum pathcost. */ static struct tc_entry * olsr_spf_extract_best(struct avl_tree *tree) { struct avl_node *node = avl_walk_first(tree); return (node ? cand_tree2tc(node) : NULL); } /* * olsr_spf_relax * * Explore all edges of a node and add the node * to the candidate tree if the if the aggregate * path cost is better. */ static void olsr_spf_relax(struct avl_tree *cand_tree, struct tc_entry *tc) { struct avl_node *edge_node; olsr_linkcost new_cost; #ifdef DEBUG #ifndef NODEBUG struct ipaddr_str buf, nbuf; struct lqtextbuffer lqbuffer; #endif /* NODEBUG */ OLSR_PRINTF(2, "SPF: exploring node %s, cost %s\n", olsr_ip_to_string(&buf, &tc->addr), get_linkcost_text(tc->path_cost, false, &lqbuffer)); #endif /* DEBUG */ /* * loop through all edges of this vertex. */ for (edge_node = avl_walk_first(&tc->edge_tree); edge_node; edge_node = avl_walk_next(edge_node)) { struct tc_entry *new_tc; struct tc_edge_entry *tc_edge = edge_tree2tc_edge(edge_node); /* * We are not interested in dead-end edges. */ if (!tc_edge->edge_inv) { #ifdef DEBUG OLSR_PRINTF(2, "SPF: ignoring edge %s\n", olsr_ip_to_string(&buf, &tc_edge->T_dest_addr)); if (!tc_edge->edge_inv) { OLSR_PRINTF(2, "SPF: no inverse edge\n"); } #endif /* DEBUG */ continue; } if (tc_edge->cost == LINK_COST_BROKEN) { #ifdef DEBUG OLSR_PRINTF(2, "SPF: ignore edge %s (broken)\n", olsr_ip_to_string(&buf, &tc_edge->T_dest_addr)); #endif /* DEBUG */ continue; } /* * total quality of the path through this vertex * to the destination of this edge */ new_cost = tc->path_cost + tc_edge->cost; #ifdef DEBUG OLSR_PRINTF(2, "SPF: exploring edge %s, cost %s\n", olsr_ip_to_string(&buf, &tc_edge->T_dest_addr), get_linkcost_text(new_cost, true, &lqbuffer)); #endif /* DEBUG */ /* * if it's better than the current path quality of this edge's * destination node, then we've found a better path to this node. */ new_tc = tc_edge->edge_inv->tc; if (new_cost < new_tc->path_cost) { /* if this node has been on the candidate tree delete it */ if (new_tc->path_cost < ROUTE_COST_BROKEN) { olsr_spf_del_cand_tree(cand_tree, new_tc); } /* re-insert on candidate tree with the better metric */ new_tc->path_cost = new_cost; olsr_spf_add_cand_tree(cand_tree, new_tc); /* pull-up the next-hop and bump the hop count */ if (tc->next_hop) { new_tc->next_hop = tc->next_hop; } new_tc->hops = tc->hops + 1; #ifdef DEBUG OLSR_PRINTF(2, "SPF: better path to %s, cost %s, via %s, hops %u\n", olsr_ip_to_string(&buf, &new_tc->addr), get_linkcost_text(new_cost, true, &lqbuffer), tc->next_hop ? olsr_ip_to_string(&nbuf, &tc->next_hop->neighbor_iface_addr) : "", new_tc->hops); #endif /* DEBUG */ } } } /* * olsr_spf_run_full * * Run the Dijkstra algorithm. * * A node gets added to the candidate tree when one of its edges has * an overall better root path cost than the node itself. * The node with the shortest metric gets moved from the candidate to * the path list every pass. * The SPF computation is completed when there are no more nodes * on the candidate tree. */ static void olsr_spf_run_full(struct avl_tree *cand_tree, struct list_node *path_list, int *path_count) { struct tc_entry *tc; *path_count = 0; while ((tc = olsr_spf_extract_best(cand_tree))) { olsr_spf_relax(cand_tree, tc); /* * move the best path from the candidate tree * to the path list. */ olsr_spf_del_cand_tree(cand_tree, tc); olsr_spf_add_path_list(path_list, path_count, tc); } } /** * Callback for the SPF backoff timer. */ static void olsr_expire_spf_backoff(void *context __attribute__ ((unused))) { spf_backoff_timer = NULL; } void olsr_calculate_routing_table(bool force) { #ifdef SPF_PROFILING struct timeval t1, t2, t3, t4, t5, spf_init, spf_run, route, kernel, total; #endif /* SPF_PROFILING */ struct avl_tree cand_tree; struct avl_node *rtp_tree_node; struct list_node path_list; /* head of the path_list */ struct tc_entry *tc; struct rt_path *rtp; struct tc_edge_entry *tc_edge; struct neighbor_entry *neigh; struct link_entry *link; int path_count = 0; /* We are done if our backoff timer is running */ if (!force) { if (spf_backoff_timer) { return; } /* start new backoff timer */ spf_backoff_timer = olsr_start_timer(1000, 5, OLSR_TIMER_ONESHOT, &olsr_expire_spf_backoff, NULL, 0); } #ifdef SPF_PROFILING gettimeofday(&t1, NULL); #endif /* SPF_PROFILING */ /* * Prepare the candidate tree and result list. */ avl_init(&cand_tree, avl_comp_etx); list_head_init(&path_list); olsr_bump_routingtree_version(); /* * Initialize vertices in the lsdb. */ OLSR_FOR_ALL_TC_ENTRIES(tc) { tc->next_hop = NULL; tc->path_cost = ROUTE_COST_BROKEN; tc->hops = 0; } OLSR_FOR_ALL_TC_ENTRIES_END(tc); /* * Check if there was a change in the main IP address. * Bail if there is no main IP address. */ olsr_change_myself_tc(); if (!tc_myself) { /* * All gone now. Flush all routes. */ olsr_update_rib_routes(); olsr_update_kernel_routes(); return; } /* * zero ourselves and add us to the candidate tree. */ tc_myself->path_cost = ZERO_ROUTE_COST; olsr_spf_add_cand_tree(&cand_tree, tc_myself); /* * add edges to and from our neighbours. */ OLSR_FOR_ALL_NBR_ENTRIES(neigh) { if (neigh->status != SYM) { tc_edge = olsr_lookup_tc_edge(tc_myself, &neigh->neighbor_main_addr); if (tc_edge) { olsr_delete_tc_edge_entry(tc_edge); } } else { tc_edge = olsr_lookup_tc_edge(tc_myself, &neigh->neighbor_main_addr); link = get_best_link_to_neighbor(&neigh->neighbor_main_addr); if (!link || lookup_link_status(link) == LOST_LINK) { /* * If there is no best link to this neighbor * and we had an edge before then flush the edge. */ if (tc_edge) { olsr_delete_tc_edge_entry(tc_edge); } continue; } /* find the interface for the link */ if (link->if_name) { link->inter = if_ifwithname(link->if_name); } else { link->inter = if_ifwithaddr(&link->local_iface_addr); } /* * Set the next-hops of our neighbors. */ if (!tc_edge) { tc_edge = olsr_add_tc_edge_entry(tc_myself, &neigh->neighbor_main_addr, 0); } else { /* * Update LQ and timers, such that the edge does not get deleted. */ olsr_copylq_link_entry_2_tc_edge_entry(tc_edge, link); olsr_calc_tc_edge_entry_etx(tc_edge); } if (tc_edge->edge_inv) { tc_edge->edge_inv->tc->next_hop = link; } } } OLSR_FOR_ALL_NBR_ENTRIES_END(neigh); #ifdef SPF_PROFILING gettimeofday(&t2, NULL); #endif /* SPF_PROFILING */ /* * Run the SPF calculation. */ olsr_spf_run_full(&cand_tree, &path_list, &path_count); OLSR_PRINTF(2, "\n--- %s ------------------------------------------------- DIJKSTRA\n\n", olsr_wallclock_string()); #ifdef SPF_PROFILING gettimeofday(&t3, NULL); #endif /* SPF_PROFILING */ /* * In the path list we have all the reachable nodes in our topology. */ for (; !list_is_empty(&path_list); list_remove(path_list.next)) { tc = pathlist2tc(path_list.next); link = tc->next_hop; if (!link) { #ifdef DEBUG /* * Supress the error msg when our own tc_entry * does not contain a next-hop. */ if (tc != tc_myself) { struct ipaddr_str buf; OLSR_PRINTF(2, "SPF: %s no next-hop\n", olsr_ip_to_string(&buf, &tc->addr)); } #endif /* DEBUG */ continue; } /* * Now walk all prefixes advertised by that node. * Since the node is reachable, insert the prefix into the global RIB. * If the prefix is already in the RIB, refresh the entry such * that olsr_delete_outdated_routes() does not purge it off. */ for (rtp_tree_node = avl_walk_first(&tc->prefix_tree); rtp_tree_node; rtp_tree_node = avl_walk_next(rtp_tree_node)) { rtp = rtp_prefix_tree2rtp(rtp_tree_node); if (rtp->rtp_rt) { /* * If there is a route entry, the prefix is already in the global RIB. */ olsr_update_rt_path(rtp, tc, link); } else { /* * The prefix is reachable and not yet in the global RIB. * Build a rt_entry for it. */ olsr_insert_rt_path(rtp, tc, link); } } } #ifdef __linux__ /* check gateway tunnels */ olsr_trigger_gatewayloss_check(); #endif /* __linux__ */ /* Update the RIB based on the new SPF results */ olsr_update_rib_routes(); #ifdef SPF_PROFILING gettimeofday(&t4, NULL); #endif /* SPF_PROFILING */ /* move the route changes into the kernel */ olsr_update_kernel_routes(); #ifdef SPF_PROFILING gettimeofday(&t5, NULL); #endif /* SPF_PROFILING */ #ifdef SPF_PROFILING timersub(&t2, &t1, &spf_init); timersub(&t3, &t2, &spf_run); timersub(&t4, &t3, &route); timersub(&t5, &t4, &kernel); timersub(&t5, &t1, &total); OLSR_PRINTF(1, "\n--- SPF-stats for %d nodes, %d routes (total/init/run/route/kern): " "%d, %d, %d, %d, %d\n", path_count, routingtree.count, (int)total.tv_usec, (int)spf_init.tv_usec, (int)spf_run.tv_usec, (int)route.tv_usec, (int)kernel.tv_usec); #endif /* SPF_PROFILING */ } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_spf.h000066400000000000000000000040301234304727700156030ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_SPF_H #define _OLSR_SPF_H void olsr_calculate_routing_table(bool force); #endif /* _OLSR_SPF_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_switch/000077500000000000000000000000001234304727700161465ustar00rootroot00000000000000olsrd-0.6.6.2/src/olsr_switch/Makefile000066400000000000000000000006551234304727700176140ustar00rootroot00000000000000TOPDIR=../.. include $(TOPDIR)/Makefile.inc ifeq ($(OS), win32) BINNAME = olsr_switch.exe OBJS += ../win32/compat.o else BINNAME = olsr_switch endif default_target: $(TOPDIR)/$(BINNAME) $(TOPDIR)/$(BINNAME): $(OBJS) ifeq ($(VERBOSE),0) @echo "[LD] $@" endif $(MAKECMDPREFIX)$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) ohs_cmd.o: CFLAGS += -Wno-cast-qual -DNO_OLDNAMES clean: rm -f *.[od] rm -f *~ rm -f $(TOPDIR)/$(BINNAME) olsrd-0.6.6.2/src/olsr_switch/commands.h000066400000000000000000000107471234304727700201310ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2005, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _COMMAND #define _COMMAND #include "ohs_cmd.h" static const struct ohs_command ohs_commands[] = { {"help", "help", "Help on shell commands", "Help on shell commands", ohs_cmd_help}, {"exit", "exit", "Exits olsr host switch", "Exits olsr host switch", ohs_cmd_exit}, {"log", "log ", "Displays or sets log bits", "This command sets or clears various logbits. Available logbits are:\n FORWARD - display info about all traffic forwarding\n CONNECT - display info about all connections happening\n LINK - display all link lookup information\n", ohs_cmd_log}, {"list", "list ", "List all connected clients or links", "This command will list all the clients or all the links registered by olsr_switch. By default clients are listed.", ohs_cmd_list}, {"link", "link [srcIP|*] [dstIP|*] [0-100]", "Manipulate links", "This command is used for manipulating olsr links. The link quality is a number between 0-100 representing the chance in percentage for a packet to be forwarded on the link.\nTo make the link between 10.0.0.1 and 10.0.0.2 have 50% packet loss do:\nlink 10.0.0.1 10.0.0.2 50\nNote that this will only effect the unidirectional link 10.0.0.1 -> 10.0.0.2.\nTo make the changes affect traffic in both directions do:\nlink bi 10.0.0.1 10.0.0.2 50\nTo completely block a link do:\nlink 10.0.0.1 10.0.0.2 0\nTo make all traffic pass(delete the entry) do:\nlink 10.0.0.1 10.0.0.2 100\nNote that \"bi\" can be used in all these examples.\nWildcard source and/or destinations are also supported.\nTo block all traffic from a node do:\nlink 10.0.0.1 * 0\nTo set 50% packet loss on all links to 10.0.0.2 do:\nlink * 10.0.0.2 50\nTo delete all links do:\nlink * * 100\nWildcards can also be used in combination with 'bi'.\nTo list all manipulated links use 'list links'.\n", ohs_cmd_link}, {"olsrd", "olsrd [start|stop|show|setb|seta] [IP|path|args]", "Start or stop local olsrd processes. Also used to set the olsrd binary path and arguments", "This command is used for managing local olsrd instances from within olsr_switch.\nThe command can be configured in runtime using the setb and seta sub-commands.\nTo show the current olsrd command-configuration do:\nolsrd show\nTo set the olsrd binary path do:\nolsrd setb /full/path/to/olsrd\nTo start a olsrd instance with a IP address of 10.0.0.1, do:\nolsrd start 10.0.0.1\nTo stop that same instance do:\nolsrd stop 10.0.0.1\nseta would set arguments but is currently not implemented\n", ohs_cmd_olsrd}, {NULL, NULL, NULL, NULL, NULL} }; #endif /* _COMMAND */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_switch/link_rules.c000066400000000000000000000104351234304727700204640ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2005, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "link_rules.h" #include "olsr_host_switch.h" #include "ipcalc.h" #include #include #include int ohs_check_link(struct ohs_connection *oc, union olsr_ip_addr *dst) { struct ohs_ip_link *links; for (links = oc->links; links != NULL; links = links->next) { int r; if (!ipequal(&links->dst, dst)) { continue; } if (links->quality == 0) { if (logbits & LOG_LINK) { struct ipaddr_str addrstr, dststr; printf("%s -> %s Q: %d\n", olsr_ip_to_string(&addrstr, &oc->ip_addr), olsr_ip_to_string(&dststr, dst), links->quality); } return 0; } r = 1 + (int)(100.0 / (RAND_MAX + 1.0) * rand()); if (logbits & LOG_LINK) { struct ipaddr_str addrstr, dststr; printf("%s -> %s Q: %d R: %d\n", olsr_ip_to_string(&addrstr, &oc->ip_addr), olsr_ip_to_string(&dststr, dst), links->quality, r); } /* Random - based on quality */ return links->quality > r ? 0 : 1; } return 1; } int ohs_delete_all_related_links(struct ohs_connection *oc) { struct ohs_ip_link *links = oc->links; int cnt = 0; /* Delete links from this node */ while (links) { struct ohs_ip_link *tmp_link = links; links = links->next; free(tmp_link); cnt++; } /* Delete links to this node */ // XXX - ToDo return cnt; } struct ohs_ip_link * add_link(struct ohs_connection *src, struct ohs_connection *dst) { struct ohs_ip_link *link; /* Create new link */ link = malloc(sizeof(struct ohs_ip_link)); if (!link) OHS_OUT_OF_MEMORY("New link"); /* Queue */ link->next = src->links; src->links = link; link->dst = dst->ip_addr; src->linkcnt++; return link; } int remove_link(struct ohs_connection *oc, struct ohs_ip_link *lnk) { struct ohs_ip_link *links = oc->links; struct ohs_ip_link *prev_link = NULL; while (links) { if (links == lnk) { /* Remove */ if (prev_link) prev_link->next = links->next; else oc->links = links->next; free(lnk); oc->linkcnt--; return 1; } prev_link = links; links = links->next; } return 0; } struct ohs_ip_link * get_link(struct ohs_connection *oc, union olsr_ip_addr *dst) { struct ohs_ip_link *links; for (links = oc->links; links != NULL; links = links->next) { if (ipequal(&links->dst, dst)) { return links; } } return NULL; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_switch/link_rules.h000066400000000000000000000046421234304727700204740ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2005, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_SWITCH_LINK_RULES #define _OLSR_SWITCH_LINK_RULES #include "olsr_types.h" #include "olsr_host_switch.h" int ohs_check_link(struct ohs_connection *, union olsr_ip_addr *); struct ohs_ip_link *get_link(struct ohs_connection *, union olsr_ip_addr *); struct ohs_ip_link *add_link(struct ohs_connection *, struct ohs_connection *); int remove_link(struct ohs_connection *, struct ohs_ip_link *); int ohs_delete_all_related_links(struct ohs_connection *); #endif /* _OLSR_SWITCH_LINK_RULES */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_switch/main.c000066400000000000000000000311631234304727700172420ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2005, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* olsrd host-switch daemon */ #include "olsr_host_switch.h" #include "link_rules.h" #include "ohs_cmd.h" #include "ipcalc.h" #include #include #include #include #include #include #include #include #include #include #include #ifdef _WIN32 #undef errno #define errno WSAGetLastError() #undef strerror #define strerror(x) StrError(x) #define close(x) closesocket(x) #else /* _WIN32 */ #include #endif /* _WIN32 */ static int srv_socket; #define OHS_BUFSIZE 1500 static uint8_t data_buffer[OHS_BUFSIZE]; struct ohs_connection *ohs_conns; //static int ip_version; //int ipsize; static struct olsrd_config olsr_cnf_data; struct olsrd_config *olsr_cnf = &olsr_cnf_data; uint32_t logbits; /* local functions */ static int ohs_init_new_connection(int); static int ohs_route_data(struct ohs_connection *); static int ohs_init_connect_sockets(void); static int ohs_configure(void); #if !defined _WIN32 static void ohs_listen_loop(void) __attribute__ ((noreturn)); #else /* !defined _WIN32 */ static void ohs_listen_loop(void); #endif /* !defined _WIN32 */ #ifdef _WIN32 int __stdcall ohs_close(unsigned long signo __attribute__ ((unused))) #else /* _WIN32 */ void ohs_close(int signo __attribute__ ((unused))) #endif /* _WIN32 */ { #ifndef _WIN32 int errNr = errno; #endif printf("OHS: exit\n"); close(srv_socket); #ifndef _WIN32 errno = errNr; #endif exit(0); } struct ohs_connection * get_client_by_addr(const union olsr_ip_addr *adr) { struct ohs_connection *oc; for (oc = ohs_conns; oc != NULL; oc = oc->next) { if (ipequal(adr, &oc->ip_addr)) { return oc; } } return NULL; } static int ohs_init_new_connection(int s) { struct ohs_connection *oc; int i; uint32_t addr[4]; if (logbits & LOG_CONNECT) { printf("ohs_init_new_connection\n"); } /* Create new client node */ oc = calloc(1, sizeof(struct ohs_connection)); if (!oc) { OHS_OUT_OF_MEMORY("New connection"); } oc->socket = s; oc->links = NULL; oc->rx = 0; oc->tx = 0; oc->linkcnt = 0; // hack alert: WSAEventSelect makes sockets non-blocking, so the // recv() may return without having read anything on Windows; hence // re-try for 2 seconds on Windows; shouldn't harm Linux et al. /* Get "fake IP" */ for (i = 0; i < 20; i++) { /* Win32 needs that cast. */ if (recv(oc->socket, (void *)addr, olsr_cnf->ipsize, 0) == (int)olsr_cnf->ipsize) { break; } #if defined _WIN32 Sleep(100); #endif /* defined _WIN32 */ } if (i == 20) { printf("Failed to fetch IP address! (%s)\n", strerror(errno)); free(oc); return -1; } addr[0] = ntohl(addr[0]); addr[1] = ntohl(addr[1]); addr[2] = ntohl(addr[2]); addr[3] = ntohl(addr[3]); memcpy(oc->ip_addr.v6.s6_addr, addr, olsr_cnf->ipsize); if (logbits & LOG_CONNECT) { struct ipaddr_str addrstr; printf("IP: %s\n", olsr_ip_to_string(&addrstr, &oc->ip_addr)); } if (get_client_by_addr(&oc->ip_addr)) { if (logbits & LOG_CONNECT) { struct ipaddr_str addrstr; printf("IP: %s DUPLICATE! Disconecting client!\n", olsr_ip_to_string(&addrstr, &oc->ip_addr)); } close(s); free(oc); return -1; } /* Queue */ oc->next = ohs_conns; ohs_conns = oc; return 1; } int ohs_delete_connection(struct ohs_connection *oc) { if (!oc) { return -1; } /* Close the socket */ close(oc->socket); if (logbits & LOG_CONNECT) { struct ipaddr_str addrstr; printf("Removing entry %s\n", olsr_ip_to_string(&addrstr, &oc->ip_addr)); } /* De-queue */ if (oc == ohs_conns) { ohs_conns = ohs_conns->next; } else { struct ohs_connection *curr_entry = ohs_conns->next; struct ohs_connection *prev_entry = ohs_conns; while (curr_entry != NULL) { if (curr_entry == oc) { prev_entry->next = curr_entry->next; break; } prev_entry = curr_entry; curr_entry = curr_entry->next; } } ohs_delete_all_related_links(oc); free(oc); return 0; } static int ohs_route_data(struct ohs_connection *oc) { struct ohs_connection *ohs_cs; ssize_t len; int cnt = 0; oc->tx++; /* Read data */ if ((len = recv(oc->socket, (void *)data_buffer, OHS_BUFSIZE, 0)) <= 0) return -1; if (logbits & LOG_FORWARD) { struct ipaddr_str addrstr; printf("Received %ld bytes from %s\n", (long)len, olsr_ip_to_string(&addrstr, &oc->ip_addr)); } /* Loop trough clients */ for (ohs_cs = ohs_conns; ohs_cs; ohs_cs = ohs_cs->next) { /* Check that the link is active open */ if (ohs_check_link(oc, &ohs_cs->ip_addr) && oc->socket != ohs_cs->socket) { ssize_t sent; /* Send link addr */ if (send(ohs_cs->socket, (const void *)&oc->ip_addr, olsr_cnf->ipsize, 0) != (int)olsr_cnf->ipsize) { printf("Error sending link address!\n"); } /* Send data */ if (logbits & LOG_FORWARD) { struct ipaddr_str addrstr, addrstr2; printf("Sending %d bytes %s=>%s\n", (int)len, olsr_ip_to_string(&addrstr, &oc->ip_addr), olsr_ip_to_string(&addrstr2, &ohs_cs->ip_addr)); } sent = send(ohs_cs->socket, (void*)data_buffer, len, 0); if (sent != len) { printf("Error sending(buf %d != sent %d)\n", (int)len, (int)sent); } ohs_cs->rx++; cnt++; } } return cnt; } static int ohs_init_connect_sockets(void) { uint32_t yes = 1; struct sockaddr_in sin; printf("Initiating socket TCP port %d\n", OHS_TCP_PORT); if ((srv_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("Could not initialize socket(%d): %s\n", srv_socket, strerror(errno)); exit(0); } if (setsockopt(srv_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) { printf("SO_REUSEADDR failed for socket: %s\n", strerror(errno)); close(srv_socket); exit(0); } /* complete the socket structure */ memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(OHS_TCP_PORT); /* bind the socket to the port number */ if (bind(srv_socket, (struct sockaddr *)&sin, sizeof(sin)) == -1) { printf("bind failed for socket: %s\n", strerror(errno)); close(srv_socket); exit(0); } /* show that we are willing to listen */ if (listen(srv_socket, 5) == -1) { printf("listen failed for socket: %s\n", strerror(errno)); close(srv_socket); exit(0); } return 1; } static int ohs_configure(void) { return 1; } static void accept_handler(void) { struct sockaddr_in pin; socklen_t addrlen = sizeof(pin); int s; memset(&pin, 0, sizeof(pin)); if ((s = accept(srv_socket, (struct sockaddr *)&pin, &addrlen)) < 0) { printf("accept failed socket: %s\n", strerror(errno)); } else { /* Create new node */ ohs_init_new_connection(s); } } static void stdin_handler(void) { ohs_parse_command(); } static void read_handler(struct ohs_connection *con) { if (ohs_route_data(con) < 0) ohs_delete_connection(con); } static void ohs_listen_loop(void) { #if !defined _WIN32 int n; fd_set ibits; int fn_stdin = fileno(stdin); while (1) { int high; struct ohs_connection *ohs_cs; high = 0; FD_ZERO(&ibits); /* Add server socket */ high = srv_socket; FD_SET(srv_socket, &ibits); if (fn_stdin > high) high = fn_stdin; FD_SET(fn_stdin, &ibits); /* Add clients */ for (ohs_cs = ohs_conns; ohs_cs; ohs_cs = ohs_cs->next) { if (ohs_cs->socket > high) high = ohs_cs->socket; FD_SET(ohs_cs->socket, &ibits); } /* block */ n = select(high + 1, &ibits, 0, 0, NULL); if (n == 0) continue; /* Did somethig go wrong? */ if (n < 0) { if (errno == EINTR) continue; printf("Error select: %s", strerror(errno)); continue; } /* Check server socket */ if (FD_ISSET(srv_socket, &ibits)) accept_handler(); /* Loop trough clients */ ohs_cs = ohs_conns; while (ohs_cs) { struct ohs_connection *ohs_tmp = ohs_cs; ohs_cs = ohs_cs->next; if (FD_ISSET(ohs_tmp->socket, &ibits)) read_handler(ohs_tmp); } if (FD_ISSET(fn_stdin, &ibits)) stdin_handler(); } #else /* !defined _WIN32 */ HANDLE Objects[2]; WSANETWORKEVENTS NetEvents; struct ohs_connection *Walker, *TmpWalker; unsigned int Res; Objects[0] = GetStdHandle(STD_INPUT_HANDLE); Objects[1] = WSACreateEvent(); if (WSAEventSelect(srv_socket, Objects[1], FD_ACCEPT) == SOCKET_ERROR) { fprintf(stderr, "WSAEventSelect failed (1): %s\n", strerror(errno)); return; } while (1) { for (Walker = ohs_conns; Walker != NULL; Walker = Walker->next) { if (WSAEventSelect(Walker->socket, Objects[1], FD_READ | FD_CLOSE) == SOCKET_ERROR) { fprintf(stderr, "WSAEventSelect failed (2): %s\n", strerror(errno)); Sleep(1000); continue; } } Res = WaitForMultipleObjects(2, Objects, FALSE, INFINITE); if (Res == WAIT_FAILED) { fprintf(stderr, "WaitForMultipleObjects failed: %s\n", strerror(GetLastError())); Sleep(1000); continue; } if (Res == WAIT_OBJECT_0) stdin_handler(); else if (Res == WAIT_OBJECT_0 + 1) { if (WSAEnumNetworkEvents(srv_socket, Objects[1], &NetEvents) == SOCKET_ERROR) fprintf(stderr, "WSAEnumNetworkEvents failed (1): %s\n", strerror(errno)); else { if ((NetEvents.lNetworkEvents & FD_ACCEPT) != 0) accept_handler(); } for (Walker = ohs_conns; Walker != NULL; Walker = TmpWalker) { TmpWalker = Walker->next; if (WSAEnumNetworkEvents(Walker->socket, Objects[1], &NetEvents) == SOCKET_ERROR) fprintf(stderr, "WSAEnumNetworkEvents failed (2): %s\n", strerror(errno)); else { if ((NetEvents.lNetworkEvents & (FD_READ | FD_CLOSE)) != 0) read_handler(Walker); } } } } #endif /* !defined _WIN32 */ } int main(void) { #ifdef _WIN32 WSADATA WsaData; if (WSAStartup(0x0202, &WsaData)) { fprintf(stderr, "Could not initialize WinSock.\n"); exit(EXIT_FAILURE); } SetConsoleCtrlHandler(ohs_close, true); #else /* _WIN32 */ signal(SIGINT, ohs_close); signal(SIGTERM, ohs_close); /* Avoid zombie children */ signal(SIGCHLD, SIG_IGN); #endif /* _WIN32 */ printf("olsrd host-switch daemon version %s starting\n", OHS_VERSION); logbits = LOG_DEFAULT; olsr_cnf->ip_version = AF_INET; olsr_cnf->ipsize = sizeof(struct in_addr); srand((unsigned int)time(NULL)); ohs_set_olsrd_path(OHS_DEFAULT_OLSRD_PATH); ohs_init_connect_sockets(); ohs_configure(); printf("OHS command interpreter reading from STDIN\n"); printf("\n> "); fflush(stdout); ohs_listen_loop(); ohs_close(0); return 1; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_switch/ohs_cmd.c000066400000000000000000000327741234304727700177430ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2005, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "olsr_host_switch.h" #include "olsr_types.h" #include "commands.h" #include "link_rules.h" #include "ipcalc.h" #include #include #include #include #include #include #include #include #include #define TOK_BUF_SIZE 500 static char tok_buf[TOK_BUF_SIZE]; #define MAX_OLSRD_ARGS 10 static char olsrd_path[FILENAME_MAX]; static int get_next_token(const char *src, char *dst, size_t buflen) { int i = 0, j = 0; dst[0] = 0; /* Skip leading spaces */ while (src[j] == ' ' && src[j] != 0) { j++; } src += j; i = 0; while ((src[i] != ' ') && (src[i] != 0) && (i < ((int)buflen - 1))) { dst[i] = src[i]; i++; } dst[i] = 0; //if(strlen(dst)) //printf("Extracted token: %s\n", dst); return i + j; } int ohs_set_olsrd_path(const char *path) { strscpy(olsrd_path, path, sizeof(olsrd_path)); return 0; } #ifdef _WIN32 int ohs_cmd_olsrd(const char *args __attribute__ ((unused))) { printf("olsrd command not available in windows version\nStart instances manually\n"); return 0; } #else /* _WIN32 */ int ohs_cmd_olsrd(const char *args) { const char *olsrd_args[MAX_OLSRD_ARGS]; struct in_addr iaddr; args += get_next_token(args, tok_buf, TOK_BUF_SIZE); if (!strlen(tok_buf)) goto print_usage; /* Start olsrd instance */ if (!strncmp(tok_buf, "start", strlen("start"))) { int argc = 0, i = 0; args += get_next_token(args, tok_buf, TOK_BUF_SIZE); if (!strlen(tok_buf)) goto print_usage; if (!inet_aton(tok_buf, &iaddr)) { printf("Invalid IP %s\n", tok_buf); goto print_usage; } olsrd_args[argc++] = olsrd_path; if (1) { /* config file is set */ olsrd_args[argc++] = "-f"; olsrd_args[argc++] = "./olsrd.emu.conf"; } olsrd_args[argc++] = "-hemu"; olsrd_args[argc++] = tok_buf; olsrd_args[argc++] = "-d"; olsrd_args[argc++] = "0"; olsrd_args[argc++] = "-nofork"; olsrd_args[argc] = NULL; printf("Executing: %s", olsrd_path); for (i = 0; i < argc; i++) printf(" %s", olsrd_args[i]); printf("\n"); if (fork()) return 1; if (execve(olsrd_path, (char *const *)olsrd_args, NULL) < 0) { printf("Error executing olsrd: %s\n", strerror(errno)); exit(1); } } /* Stop olsrd instance */ else if (!strncmp(tok_buf, "stop", strlen("stop"))) { struct ohs_connection *oc; args += get_next_token(args, tok_buf, TOK_BUF_SIZE); if (!strlen(tok_buf)) goto print_usage; if (!inet_aton(tok_buf, &iaddr)) { printf("Invalid IP %s\n", tok_buf); goto print_usage; } oc = get_client_by_addr((union olsr_ip_addr *)&iaddr.s_addr); if (!oc) { printf("No such client: %s\n", tok_buf); return -1; } ohs_delete_connection(oc); return 1; } /* Set olsrd binary path */ else if (!strncmp(tok_buf, "setb", strlen("setb"))) { struct stat sbuf; args += get_next_token(args, tok_buf, TOK_BUF_SIZE); if (!strlen(tok_buf)) goto print_usage; if (stat(tok_buf, &sbuf) < 0) { printf("Error setting binary \"%s\": %s\n", tok_buf, strerror(errno)); return -1; } if ((sbuf.st_mode & S_IFDIR) || !(sbuf.st_mode & S_IXUSR)) { printf("Error setting binary \"%s\": Not a regular execuatble file!\n", tok_buf); return -1; } printf("New olsrd binary path:\"%s\"\n", tok_buf); ohs_set_olsrd_path(tok_buf); return 1; } /* Set arguments */ else if (!strncmp(tok_buf, "seta", strlen("seta"))) { printf("Error - NOT IMPLEMENTED YET\n"); return 1; } /* Show settings */ else if (!strncmp(tok_buf, "show", strlen("show"))) { printf("olsrd command settings:\n\tBinary path: %s\n\tArguments : \n", olsrd_path); return 1; } print_usage: printf("Usage: olsrd [start|stop|show|setb|seta] [IP|path|args]\n"); return 0; } #endif /* _WIN32 */ int ohs_cmd_link(const char *args) { uint8_t bi = 0, wildc_src = 0, wildc_dst = 0; struct ohs_connection *src, *dst; struct in_addr iaddr; int qual; struct ohs_ip_link *my_link, *inv_link; args += get_next_token(args, tok_buf, TOK_BUF_SIZE); if (!strlen(tok_buf)) { goto print_usage; } if (!strncmp(tok_buf, "bi", strlen("bi"))) { bi = 1; args += get_next_token(args, tok_buf, TOK_BUF_SIZE); if (!strlen(tok_buf)) { goto print_usage; } } if (tok_buf[0] == '*') { wildc_src = 1; src = ohs_conns; } else { if (!inet_aton(tok_buf, &iaddr)) { printf("Invalid src IP %s\n", tok_buf); return -1; } src = get_client_by_addr((union olsr_ip_addr *)&iaddr.s_addr); if (!src) { printf("No such client: %s!\n", tok_buf); return -1; } } args += get_next_token(args, tok_buf, TOK_BUF_SIZE); if (!strlen(tok_buf)) { goto print_usage; } if (tok_buf[0] == '*') { wildc_dst = 1; dst = ohs_conns; } else { if (!inet_aton(tok_buf, &iaddr)) { printf("Invalid src IP %s\n", tok_buf); return -1; } dst = get_client_by_addr((union olsr_ip_addr *)&iaddr.s_addr); if (!dst) { printf("No such client: %s!\n", tok_buf); return -1; } } args += get_next_token(args, tok_buf, TOK_BUF_SIZE); if (!strlen(tok_buf)) { goto print_usage; } /* No use for bi if both src and dst are widcards */ if (wildc_src && wildc_dst) { bi = 0; } qual = atoi(tok_buf); if (qual < 0 || qual > 100) { printf("Link quality out of range(0-100)\n"); return -1; } while (src) { while (dst) { struct ipaddr_str srcaddrstr, dstaddrstr; if (src != dst) { my_link = get_link(src, &dst->ip_addr); inv_link = bi ? get_link(dst, &src->ip_addr) : NULL; if (qual == 100) { /* Remove link entry */ if (my_link) { remove_link(src, my_link); } if (inv_link) { remove_link(dst, inv_link); } } else { if (!my_link) { /* Create new link */ my_link = add_link(src, dst); } my_link->quality = qual; if (bi) { if (!inv_link) { /* Create new link */ inv_link = add_link(dst, src); } inv_link->quality = qual; } } printf("%s %sdirectional link(s) %s %c=> %s quality %d\n", (qual == 100) ? "Removing" : "Setting", bi ? "bi" : "uni", olsr_ip_to_string(&srcaddrstr, &src->ip_addr), bi ? '<' : '=', olsr_ip_to_string(&dstaddrstr, &dst->ip_addr), qual); } if (wildc_dst) { dst = dst->next; } else { break; } } dst = wildc_dst ? ohs_conns : dst; src = wildc_src ? src->next : NULL; } return 1; print_usage: printf("link srcIP dstIP [0-100]"); return -1; } int ohs_cmd_list(const char *args) { struct ohs_connection *oc = ohs_conns; args += get_next_token(args, tok_buf, TOK_BUF_SIZE); if (!strlen(tok_buf) || !strncmp(tok_buf, "clients", strlen("clients"))) { printf("All connected clients:\n"); while (oc) { struct ipaddr_str addrstr; printf("\t%s - Rx: %d Tx: %d LinkCnt: %d\n", olsr_ip_to_string(&addrstr, &oc->ip_addr), oc->rx, oc->tx, oc->linkcnt); oc = oc->next; } } else if (!strncmp(tok_buf, "links", strlen("links"))) { printf("All configured links:\n"); while (oc) { struct ohs_ip_link *links = oc->links; while (links) { struct ipaddr_str addrstr, dststr; printf("\t%s => %s Quality: %d\n", olsr_ip_to_string(&addrstr, &oc->ip_addr), olsr_ip_to_string(&dststr, &links->dst), links->quality); links = links->next; } oc = oc->next; } } else { printf("list [clients|links]"); return -1; } return 1; } int ohs_cmd_help(const char *args) { int i; args += get_next_token(args, tok_buf, TOK_BUF_SIZE); if (!strlen(tok_buf)) { printf("Olsrd host switch version %s\n", OHS_VERSION); printf("Available commands:\n"); for (i = 0; ohs_commands[i].cmd; i++) { if (ohs_commands[i].helptext_brief) printf("\t%s - %s\n", ohs_commands[i].cmd, ohs_commands[i].helptext_brief); } printf("\nType 'help cmd' for help on a specific command\n"); } else { for (i = 0; ohs_commands[i].cmd; i++) { if (!strncmp(tok_buf, ohs_commands[i].cmd, strlen(ohs_commands[i].cmd))) { printf("Usage: %s\nDescription:\n%s\n", ohs_commands[i].syntax, ohs_commands[i].helptext_long); return 1; } } printf("Usage: help \n"); } return i; } int ohs_cmd_log(const char *args) { uint8_t set = 0; args += get_next_token(args, tok_buf, TOK_BUF_SIZE); if (strlen(tok_buf) && ((set = !strncmp(tok_buf, "set", strlen("set"))) || !strncmp(tok_buf, "unset", strlen("unset")))) { uint32_t new_bit = 0; args += get_next_token(args, tok_buf, TOK_BUF_SIZE); if (!strlen(tok_buf)) goto print_usage; if (!strncmp(tok_buf, "CON", strlen("CON"))) new_bit = LOG_CONNECT; else if (!strncmp(tok_buf, "FOR", strlen("FOR"))) new_bit = LOG_FORWARD; else if (!strncmp(tok_buf, "LIN", strlen("LIN"))) new_bit = LOG_LINK; if (!new_bit) goto print_usage; if (set) logbits |= new_bit; else logbits &= ~new_bit; printf("%s log bit: 0x%08x, new log: 0x%08x\n", set ? "Setting" : "Removing", new_bit, logbits); } else { if (strlen(tok_buf)) goto print_usage; printf("Log: (0x%08x) ", logbits); if (logbits & LOG_CONNECT) printf("CONNECT "); if (logbits & LOG_FORWARD) printf("FORWARD "); if (logbits & LOG_LINK) printf("LINK "); printf("\n"); } return 1; print_usage: printf("Usage: log <[set|unset] [CONNECT|FORWARD|LINK]>\n"); return 0; } int ohs_cmd_exit(const char *args __attribute__ ((unused))) { printf("Exitting... bye-bye!\n"); ohs_close(0); } void ohs_parse_command(void) { static char cmd_line[500]; static int cmd_len = 0; char *args; char cmd_token[20]; int i; #if defined _WIN32 char c; unsigned long Read; INPUT_RECORD InRec; KEY_EVENT_RECORD *KeyEventRec; #endif /* defined _WIN32 */ #if defined _WIN32 if (!ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &InRec, sizeof(InRec), &Read)) { fprintf(stderr, "ReadConsoleInput failed: %s\n", strerror(GetLastError())); return; } if (InRec.EventType != KEY_EVENT) return; KeyEventRec = &InRec.Event.KeyEvent; if (!KeyEventRec->bKeyDown) return; c = KeyEventRec->uChar.AsciiChar; if (c == 8) { if (cmd_len == 0) return; cmd_len--; fputc(8, stdout); fputc(32, stdout); fputc(8, stdout); fflush(stdout); return; } fputc(c, stdout); fflush(stdout); if (c != '\n' && c != '\r' && cmd_len < (int)sizeof(cmd_line) - 1) cmd_line[cmd_len++] = (char)c; else #else /* defined _WIN32 */ if (fgets(cmd_line, sizeof(cmd_line), stdin) == NULL) { ohs_cmd_exit(NULL); } for (cmd_len = 0; cmd_line[cmd_len] != 0 && cmd_line[cmd_len] != '\n'; cmd_len++); #endif /* defined _WIN32 */ { cmd_line[cmd_len] = 0; cmd_len = 0; args = cmd_line + get_next_token(cmd_line, cmd_token, sizeof(cmd_token)); for (i = 0; ohs_commands[i].cmd != NULL; i++) { if (strcmp(cmd_token, ohs_commands[i].cmd) == 0) { if (ohs_commands[i].cmd_cb != NULL) ohs_commands[i].cmd_cb(args); else printf("No action registered on cmd %s!\n", cmd_token); break; } } if (ohs_commands[i].cmd == NULL) printf("%s: no such cmd!\n", cmd_token); printf("\n> "); fflush(stdout); } } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_switch/ohs_cmd.h000066400000000000000000000046671234304727700177500ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2005, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OHS_CMD #define _OHS_CMD #include struct ohs_command { const char *cmd; const char *syntax; const char *helptext_brief; const char *helptext_long; int (*cmd_cb) (const char *); }; int ohs_set_olsrd_path(const char *); void ohs_parse_command(void); int ohs_cmd_olsrd(const char *); int ohs_cmd_list(const char *); int ohs_cmd_help(const char *); int ohs_cmd_exit(const char *) __attribute__ ((noreturn)); int ohs_cmd_log(const char *); int ohs_cmd_link(const char *); #endif /* _OHS_CMD */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_switch/olsr_host_switch.h000066400000000000000000000062001234304727700217120ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2005, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_HOST_SWITCH #define _OLSR_HOST_SWITCH #include "olsr_types.h" #define OHS_TCP_PORT 10150 #define OHS_VERSION "0.1" #define OHS_DEFAULT_OLSRD_PATH "./olsrd" #define OHS_OUT_OF_MEMORY(s) do { printf("ohsd: out of memory \"%s\"!\n", s); ohs_close(0); } while (0) #ifdef _WIN32 #define close(x) closesocket(x) int __stdcall ohs_close(unsigned long signal) __attribute__ ((noreturn)); #else /* _WIN32 */ void ohs_close(int) __attribute__ ((noreturn)); #endif /* _WIN32 */ struct ohs_ip_link { union olsr_ip_addr dst; uint8_t quality; /* 0 - 100 */ struct ohs_ip_link *next; }; struct ohs_connection { union olsr_ip_addr ip_addr; int socket; uint32_t rx; uint32_t tx; uint32_t linkcnt; struct ohs_ip_link *links; struct ohs_connection *next; }; extern uint32_t logbits; extern struct ohs_connection *ohs_conns; #define LOG_DEFAULT 0x0 #define LOG_FORWARD 0x1 #define LOG_CONNECT 0x2 #define LOG_LINK 0x4 #ifdef _WIN32 int __stdcall SignalHandler(unsigned long); #else /* _WIN32 */ void ohs_close(int); #endif /* _WIN32 */ struct ohs_connection *get_client_by_addr(const union olsr_ip_addr *); int ohs_delete_connection(struct ohs_connection *); #endif /* _OLSR_HOST_SWITCH */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsr_types.h000066400000000000000000000101401234304727700161560ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* *Values and packet formats as proposed in RFC3626 and misc. values and *data structures used by the olsr.org OLSR daemon. */ #ifndef _OLSR_TYPES_H #define _OLSR_TYPES_H #if !defined __linux__ && !defined __APPLE__ && !defined _WIN32 && !defined __FreeBSD__ && !defined __FreeBSD_kernel__ && !defined __NetBSD__ && !defined __OpenBSD__ # error "Unsupported system" #endif /* !defined __linux__ && !defined __APPLE__ && !defined _WIN32 && !defined __FreeBSD__ && !defined __FreeBSD_kernel__ && !defined __NetBSD__ && !defined __OpenBSD__ */ /* types */ #ifdef _MSC_VER typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; #else /* _MSC_VER */ #include #endif /* _MSC_VER */ #if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L /* we have a C99 environment */ #include #elif defined __GNUC__ /* we simulate a C99 environment */ #define bool _Bool #define true 1 #define false 0 #define __bool_true_false_are_defined 1 #endif /* defined __GNUC__ */ /* add some safe-gaurds */ #ifndef _MSC_VER #if !defined bool || !defined true || !defined false || !defined __bool_true_false_are_defined #error You have no C99-like boolean types. Please extend src/olsr_type.h! #endif /* !defined bool || !defined true || !defined false || !defined __bool_true_false_are_defined */ #endif /* _MSC_VER */ /* user defined cookies */ typedef uint16_t olsr_cookie_t; #ifdef _WIN32 #include #else /* _WIN32 */ /* manpage says: fd_set is in sys/select.h with posix (at least with the Android-NDK) */ #include #endif /* _WIN32 */ /* OpenBSD wants this here */ #include #include /* IPv6 address format in6_addr */ #ifndef _MSC_VER #include #endif /* _MSC_VER */ union olsr_sockaddr { struct sockaddr_storage storage; struct sockaddr in; struct sockaddr_in in4; struct sockaddr_in6 in6; }; union olsr_ip_addr { struct in_addr v4; struct in6_addr v6; }; struct olsr_ip_prefix { union olsr_ip_addr prefix; uint8_t prefix_len; }; typedef uint32_t olsr_linkcost; #endif /* _OLSR_TYPES_H */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/olsrd_plugin.h000066400000000000000000000062531234304727700164660ustar00rootroot00000000000000 /* * Copyright (c) 2005, Bruno Randolf * Copyright (c) 2004, Andreas Tonnesen(andreto-at-olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the UniK olsr daemon nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * Example plugin for olsrd.org OLSR daemon * Only the bare minimum */ #ifndef _OLSRD_PLUGIN #define _OLSRD_PLUGIN /* Define the most recent version */ #define MOST_RECENT_PLUGIN_INTERFACE_VERSION 5 #define LAST_SUPPORTED_PLUGIN_INTERFACE_VERSION 4 /**************************************************************************** * Functions that the plugin MUST provide * ****************************************************************************/ /** * Plugin interface version * Used by main olsrd to check plugin interface version */ int olsrd_plugin_interface_version(void); /** * Initialize plugin * Called after all parameters are passed */ int olsrd_plugin_init(void); /* Interface version 4 */ /** * Register parameters from config file * Called for all plugin parameters */ int olsrd_plugin_register_param(char *key, char *value); /* Interface version 5 */ typedef union { unsigned int ui; char *pc; } set_plugin_parameter_addon; typedef int set_plugin_parameter(const char *value, void *data, set_plugin_parameter_addon addon); struct olsrd_plugin_parameters { const char *name; set_plugin_parameter *set_plugin_parameter; void *data; set_plugin_parameter_addon addon; }; /** * Delivers the (address of the) table and the size of the parameter description */ void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size); #endif /* _OLSRD_PLUGIN */ /* * Local Variables: * mode: c * style: linux * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/packet.c000066400000000000000000000265741234304727700152370ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "ipcalc.h" #include "defs.h" #include "link_set.h" #include "mpr_selector_set.h" #include "mpr.h" #include "olsr.h" #include "neighbor_table.h" #include "build_msg.h" #include "net_olsr.h" #include "lq_plugin.h" static bool sending_tc = false; /** *Free the memory allocated for a HELLO packet. * *@param message the pointer to the packet to erase * *@return nada */ void olsr_free_hello_packet(struct hello_message *message) { struct hello_neighbor *nb; if (!message) return; nb = message->neighbors; while (nb) { struct hello_neighbor *prev_nb = nb; nb = nb->next; free(prev_nb); } } /** *Build an internal HELLO package for this *node. This MUST be done for each interface. * *@param message the hello_message struct to fill with info *@param outif the interface to send the message on - messages *are created individually for each interface! *@return 0 */ int olsr_build_hello_packet(struct hello_message *message, struct interface *outif) { struct hello_neighbor *message_neighbor, *tmp_neigh; struct link_entry *links; struct neighbor_entry *neighbor; #ifdef DEBUG OLSR_PRINTF(3, "\tBuilding HELLO on interface \"%s\"\n", outif->int_name ? outif->int_name : ""); #endif /* DEBUG */ message->neighbors = NULL; message->packet_seq_number = 0; //message->mpr_seq_number=neighbortable.neighbor_mpr_seq; /* Set willingness */ message->willingness = olsr_cnf->willingness; #ifdef DEBUG OLSR_PRINTF(3, "Willingness: %d\n", olsr_cnf->willingness); #endif /* DEBUG */ /* Set TTL */ message->ttl = 1; message->source_addr = olsr_cnf->main_addr; #ifdef DEBUG OLSR_PRINTF(5, "On link:\n"); #endif /* DEBUG */ /* Walk all links of this interface */ OLSR_FOR_ALL_LINK_ENTRIES(links) { #ifdef DEBUG struct ipaddr_str buf; #endif /* DEBUG */ int lnk = lookup_link_status(links); /* Update the status */ /* Check if this link tuple is registered on the outgoing interface */ if (!ipequal(&links->local_iface_addr, &outif->ip_addr)) { continue; } message_neighbor = olsr_malloc_hello_neighbor("Build HELLO"); /* Find the link status */ message_neighbor->link = lnk; /* * Calculate neighbor status */ /* * 2.1 If the main address, corresponding to * L_neighbor_iface_addr, is included in the MPR set: * * Neighbor Type = MPR_NEIGH */ if (links->neighbor->is_mpr) { message_neighbor->status = MPR_NEIGH; } /* * 2.2 Otherwise, if the main address, corresponding to * L_neighbor_iface_addr, is included in the neighbor set: */ /* NOTE: * It is garanteed to be included when come this far * due to the extentions made in the link sensing * regarding main addresses. */ else { /* * 2.2.1 * if N_status == SYM * * Neighbor Type = SYM_NEIGH */ if (links->neighbor->status == SYM) { message_neighbor->status = SYM_NEIGH; } /* * 2.2.2 * Otherwise, if N_status == NOT_SYM * Neighbor Type = NOT_NEIGH */ else if (links->neighbor->status == NOT_SYM) { message_neighbor->status = NOT_NEIGH; } } /* Set the remote interface address */ message_neighbor->address = links->neighbor_iface_addr; /* Set the main address */ message_neighbor->main_address = links->neighbor->neighbor_main_addr; #ifdef DEBUG OLSR_PRINTF(5, "Added: %s - status %d\n", olsr_ip_to_string(&buf, &message_neighbor->address), message_neighbor->status); #endif /* DEBUG */ message_neighbor->next = message->neighbors; message->neighbors = message_neighbor; } OLSR_FOR_ALL_LINK_ENTRIES_END(links); /* Add the links */ #ifdef DEBUG OLSR_PRINTF(5, "Not on link:\n"); #endif /* DEBUG */ /* Add the rest of the neighbors if running on multiple interfaces */ if (ifnet != NULL && ifnet->int_next != NULL) OLSR_FOR_ALL_NBR_ENTRIES(neighbor) { #ifdef DEBUG struct ipaddr_str buf; #endif /* DEBUG */ /* Check that the neighbor is not added yet */ tmp_neigh = message->neighbors; //printf("Checking that the neighbor is not yet added\n"); while (tmp_neigh) { if (ipequal(&tmp_neigh->main_address, &neighbor->neighbor_main_addr)) { //printf("Not adding duplicate neighbor %s\n", olsr_ip_to_string(&neighbor->neighbor_main_addr)); break; } tmp_neigh = tmp_neigh->next; } if (tmp_neigh) { continue; } message_neighbor = olsr_malloc_hello_neighbor("Build HELLO 2"); message_neighbor->link = UNSPEC_LINK; /* * Calculate neighbor status */ /* * 2.1 If the main address, corresponding to * L_neighbor_iface_addr, is included in the MPR set: * * Neighbor Type = MPR_NEIGH */ if (neighbor->is_mpr) { message_neighbor->status = MPR_NEIGH; } /* * 2.2 Otherwise, if the main address, corresponding to * L_neighbor_iface_addr, is included in the neighbor set: */ /* NOTE: * It is garanteed to be included when come this far * due to the extentions made in the link sensing * regarding main addresses. */ else { /* * 2.2.1 * if N_status == SYM * * Neighbor Type = SYM_NEIGH */ if (neighbor->status == SYM) { message_neighbor->status = SYM_NEIGH; } /* * 2.2.2 * Otherwise, if N_status == NOT_SYM * Neighbor Type = NOT_NEIGH */ else if (neighbor->status == NOT_SYM) { message_neighbor->status = NOT_NEIGH; } } message_neighbor->address = neighbor->neighbor_main_addr; message_neighbor->main_address = neighbor->neighbor_main_addr; #ifdef DEBUG OLSR_PRINTF(5, "Added: %s - status %d\n", olsr_ip_to_string(&buf, &message_neighbor->address), message_neighbor->status); #endif /* DEBUG */ message_neighbor->next = message->neighbors; message->neighbors = message_neighbor; } OLSR_FOR_ALL_NBR_ENTRIES_END(neighbor); return 0; } /** *Free the memory allocated for a TC packet. * *@param message the pointer to the packet to erase * *@return nada */ void olsr_free_tc_packet(struct tc_message *message) { struct tc_mpr_addr *mprs; if (!message) return; mprs = message->multipoint_relay_selector_address; while (mprs != NULL) { struct tc_mpr_addr *prev_mprs = mprs; mprs = mprs->next; free(prev_mprs); } } /** *Build an internal TC package for this *node. * *@param message the tc_message struct to fill with info *@return 0 */ int olsr_build_tc_packet(struct tc_message *message) { struct tc_mpr_addr *message_mpr; struct neighbor_entry *entry; bool entry_added = false; message->multipoint_relay_selector_address = NULL; message->packet_seq_number = 0; message->hop_count = 0; message->ttl = MAX_TTL; message->ansn = get_local_ansn(); message->originator = olsr_cnf->main_addr; message->source_addr = olsr_cnf->main_addr; /* Loop trough all neighbors */ OLSR_FOR_ALL_NBR_ENTRIES(entry) { if (entry->status != SYM) { continue; } switch (olsr_cnf->tc_redundancy) { case (2): { /* 2 = Add all neighbors */ //printf("\t%s\n", olsr_ip_to_string(&mprs->mpr_selector_addr)); message_mpr = olsr_malloc_tc_mpr_addr("Build TC"); message_mpr->address = entry->neighbor_main_addr; message_mpr->next = message->multipoint_relay_selector_address; message->multipoint_relay_selector_address = message_mpr; entry_added = true; break; } case (1): { /* 1 = Add all MPR selectors and selected MPRs */ if ((entry->is_mpr) || (olsr_lookup_mprs_set(&entry->neighbor_main_addr) != NULL)) { //printf("\t%s\n", olsr_ip_to_string(&mprs->mpr_selector_addr)); message_mpr = olsr_malloc_tc_mpr_addr("Build TC 2"); message_mpr->address = entry->neighbor_main_addr; message_mpr->next = message->multipoint_relay_selector_address; message->multipoint_relay_selector_address = message_mpr; entry_added = true; } break; } default: { /* 0 = Add only MPR selectors(default) */ if (olsr_lookup_mprs_set(&entry->neighbor_main_addr) != NULL) { //printf("\t%s\n", olsr_ip_to_string(&mprs->mpr_selector_addr)); message_mpr = olsr_malloc_tc_mpr_addr("Build TC 3"); message_mpr->address = entry->neighbor_main_addr; message_mpr->next = message->multipoint_relay_selector_address; message->multipoint_relay_selector_address = message_mpr; entry_added = true; } break; } } /* Switch */ } OLSR_FOR_ALL_NBR_ENTRIES_END(entry); if (entry_added) { sending_tc = true; } else { if (sending_tc) { /* Send empty TC */ OLSR_PRINTF(3, "No more MPR selectors - will send empty TCs\n"); set_empty_tc_timer(GET_TIMESTAMP((olsr_cnf->max_tc_vtime * 3) * MSEC_PER_SEC)); sending_tc = false; } } return 0; } /** *Free the memory allocated for a MID packet. * *@param message the pointer to the packet to erase * *@return nada */ void olsr_free_mid_packet(struct mid_message *message) { struct mid_alias *tmp_adr, *tmp_adr2; tmp_adr = message->mid_addr; while (tmp_adr) { tmp_adr2 = tmp_adr; tmp_adr = tmp_adr->next; free(tmp_adr2); } } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/packet.h000066400000000000000000000073741234304727700152410ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_PACKET #define _OLSR_PACKET #include "olsr_protocol.h" #include "interfaces.h" #include "mantissa.h" struct hello_neighbor { uint8_t status; uint8_t link; union olsr_ip_addr main_address; union olsr_ip_addr address; struct hello_neighbor *next; olsr_linkcost cost; uint32_t linkquality[0]; }; struct hello_message { olsr_reltime vtime; olsr_reltime htime; union olsr_ip_addr source_addr; uint16_t packet_seq_number; uint8_t hop_count; uint8_t ttl; uint8_t willingness; struct hello_neighbor *neighbors; }; struct tc_mpr_addr { union olsr_ip_addr address; struct tc_mpr_addr *next; uint32_t linkquality[0]; }; struct tc_message { olsr_reltime vtime; union olsr_ip_addr source_addr; union olsr_ip_addr originator; uint16_t packet_seq_number; uint8_t hop_count; uint8_t ttl; uint16_t ansn; struct tc_mpr_addr *multipoint_relay_selector_address; }; /* *MID messages - format: * *ADDR *ADDR *ADDR *..... */ struct mid_alias { union olsr_ip_addr alias_addr; struct mid_alias *next; }; struct mid_message { olsr_reltime vtime; union olsr_ip_addr mid_origaddr; /* originator's address */ uint8_t mid_hopcnt; /* number of hops to destination */ uint8_t mid_ttl; /* ttl */ uint16_t mid_seqno; /* sequence number */ union olsr_ip_addr addr; /* main address */ struct mid_alias *mid_addr; /* variable length */ }; struct unknown_message { uint16_t seqno; union olsr_ip_addr originator; uint8_t type; }; void olsr_free_hello_packet(struct hello_message *); int olsr_build_hello_packet(struct hello_message *, struct interface *); void olsr_free_tc_packet(struct tc_message *); int olsr_build_tc_packet(struct tc_message *); void olsr_free_mid_packet(struct mid_message *); #endif /* _OLSR_PACKET */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/parser.c000066400000000000000000000424331234304727700152540ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "parser.h" #include "ipcalc.h" #include "defs.h" #include "process_package.h" #include "mantissa.h" #include "hysteresis.h" #include "duplicate_set.h" #include "mid_set.h" #include "olsr.h" #include "rebuild_packet.h" #include "net_os.h" #include "log.h" #include "net_olsr.h" #include "duplicate_handler.h" #ifdef _WIN32 #undef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK #undef errno #define errno WSAGetLastError() char *StrError(unsigned int ErrNo); #undef strerror #define strerror(x) StrError(x) #endif /* _WIN32 */ /* Sven-Ola: On very slow devices used in huge networks * the amount of lq_tc messages is so high, that the * recv() loop never ends. This is a small hack to end * the loop in this cases */ unsigned int cpu_overload_exit = 0; struct parse_function_entry *parse_functions; struct preprocessor_function_entry *preprocessor_functions; struct packetparser_function_entry *packetparser_functions; static uint32_t inbuf_aligned[MAXMESSAGESIZE/sizeof(uint32_t) + 1]; static char *inbuf = (char *)inbuf_aligned; /** *Initialize the parser. * *@return nada */ void olsr_init_parser(void) { OLSR_PRINTF(3, "Initializing parser...\n"); /* Initialize the packet functions */ olsr_init_package_process(); } void olsr_destroy_parser(void) { struct parse_function_entry *pe, *pe_next; struct preprocessor_function_entry *ppe, *ppe_next; struct packetparser_function_entry *pae, *pae_next; for (pe = parse_functions; pe; pe = pe_next) { pe_next = pe->next; free (pe); } for (ppe = preprocessor_functions; ppe; ppe = ppe_next) { ppe_next = ppe->next; free (ppe); } for (pae = packetparser_functions; pae; pae = pae_next) { pae_next = pae->next; free(pae); } } void olsr_parser_add_function(parse_function * function, uint32_t type) { struct parse_function_entry *new_entry; OLSR_PRINTF(3, "Parser: registering event for type %d\n", type); new_entry = olsr_malloc(sizeof(struct parse_function_entry), "Register parse function"); new_entry->function = function; new_entry->type = type; /* Queue */ new_entry->next = parse_functions; parse_functions = new_entry; OLSR_PRINTF(3, "Register parse function: Added function for type %d\n", type); } int olsr_parser_remove_function(parse_function * function, uint32_t type) { struct parse_function_entry *entry, *prev; entry = parse_functions; prev = NULL; while (entry) { if ((entry->function == function) && (entry->type == type)) { if (entry == parse_functions) { parse_functions = entry->next; } else { prev->next = entry->next; } free(entry); return 1; } prev = entry; entry = entry->next; } return 0; } void olsr_preprocessor_add_function(preprocessor_function * function) { struct preprocessor_function_entry *new_entry; OLSR_PRINTF(3, "Parser: registering preprocessor\n"); new_entry = olsr_malloc(sizeof(struct preprocessor_function_entry), "Register preprocessor function"); new_entry->function = function; /* Queue */ new_entry->next = preprocessor_functions; preprocessor_functions = new_entry; OLSR_PRINTF(3, "Registered preprocessor function\n"); } int olsr_preprocessor_remove_function(preprocessor_function * function) { struct preprocessor_function_entry *entry, *prev; entry = preprocessor_functions; prev = NULL; while (entry) { if (entry->function == function) { if (entry == preprocessor_functions) { preprocessor_functions = entry->next; } else { prev->next = entry->next; } free(entry); return 1; } prev = entry; entry = entry->next; } return 0; } void olsr_packetparser_add_function(packetparser_function * function) { struct packetparser_function_entry *new_entry; OLSR_PRINTF(3, "Parser: registering packetparser\n"); new_entry = olsr_malloc(sizeof(struct packetparser_function_entry), "Register packetparser function"); new_entry->function = function; /* Queue */ new_entry->next = packetparser_functions; packetparser_functions = new_entry; OLSR_PRINTF(3, "Registered packetparser function\n"); } int olsr_packetparser_remove_function(packetparser_function * function) { struct packetparser_function_entry *entry, *prev; entry = packetparser_functions; prev = NULL; while (entry) { if (entry->function == function) { if (entry == packetparser_functions) { packetparser_functions = entry->next; } else { prev->next = entry->next; } free(entry); return 1; } prev = entry; entry = entry->next; } return 0; } /** *Process a newly received OLSR packet. Checks the type *and to the neccessary convertions and call the *corresponding functions to handle the information. *@param olsr the olsr struct containing the message *@param size the size of the message *@param in_if the incoming interface *@param from_addr the sockaddr struct describing the sender */ void parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip_addr *from_addr) { union olsr_message *m = (union olsr_message *)olsr->olsr_msg; uint32_t count; uint32_t msgsize; uint16_t seqno; struct parse_function_entry *entry; struct packetparser_function_entry *packetparser; count = size - ((char *)m - (char *)olsr); /* minimum packet size is 4 */ if (count < 4) return; if (ntohs(olsr->olsr_packlen) !=(uint16_t) size) { struct ipaddr_str buf; OLSR_PRINTF(1, "Size error detected in received packet.\nReceived %d, in packet %d\n", size, ntohs(olsr->olsr_packlen)); olsr_syslog(OLSR_LOG_ERR, " packet length error in packet received from %s!", olsr_ip_to_string(&buf, from_addr)); return; } // translate sequence number to host order olsr->olsr_seqno = ntohs(olsr->olsr_seqno); // call packetparser packetparser = packetparser_functions; while (packetparser) { packetparser->function(olsr, in_if, from_addr); packetparser = packetparser->next; } //printf("Message from %s\n\n", olsr_ip_to_string(&buf, from_addr)); /* * Hysteresis update - for every OLSR package */ if (olsr_cnf->use_hysteresis) { if (olsr_cnf->ip_version == AF_INET) { /* IPv4 */ update_hysteresis_incoming(from_addr, in_if, olsr->olsr_seqno); } else { /* IPv6 */ update_hysteresis_incoming(from_addr, in_if, olsr->olsr_seqno); } } for (; count > 0; m = (union olsr_message *)((char *)m + (msgsize))) { bool forward = true; bool validated; /* minimum message size is 8 + ipsize */ if (count < 8 + olsr_cnf->ipsize) break; if (olsr_cnf->ip_version == AF_INET) { msgsize = ntohs(m->v4.olsr_msgsize); seqno = ntohs(m->v4.seqno); } else { msgsize = ntohs(m->v6.olsr_msgsize); seqno = ntohs(m->v6.seqno); } /* sanity check for msgsize */ if (msgsize < 8 + olsr_cnf->ipsize) { struct ipaddr_str buf; union olsr_ip_addr *msgorig = (union olsr_ip_addr *) &m->v4.originator; OLSR_PRINTF(1, "Error, OLSR message from %s (type %d) is to small (%d bytes)" ", ignoring all further content of the packet\n", olsr_ip_to_string(&buf, msgorig), m->v4.olsr_msgtype, msgsize); olsr_syslog(OLSR_LOG_ERR, "Error, OLSR message from %s (type %d) is too small (%d bytes)" ", ignoring all further content of the packet\n", olsr_ip_to_string(&buf, msgorig), m->v4.olsr_msgtype, msgsize); break; } if ((msgsize % 4) != 0) { struct ipaddr_str buf; union olsr_ip_addr *msgorig = (union olsr_ip_addr *) &m->v4.originator; OLSR_PRINTF(1, "Error, OLSR message from %s (type %d) must be" " longword aligned, but has a length of %d bytes\n", olsr_ip_to_string(&buf, msgorig), m->v4.olsr_msgtype, msgsize); olsr_syslog(OLSR_LOG_ERR, "Error, OLSR message from %s (type %d) must be" " longword aligned, but has a length of %d bytes", olsr_ip_to_string(&buf, msgorig), m->v4.olsr_msgtype, msgsize); break; } if (msgsize > count) { struct ipaddr_str buf; union olsr_ip_addr *msgorig = (union olsr_ip_addr *) &m->v4.originator; OLSR_PRINTF(1, "Error, OLSR message from %s (type %d) says" " length=%d, but only %d bytes left\n", olsr_ip_to_string(&buf, msgorig), m->v4.olsr_msgtype, msgsize, count); olsr_syslog(OLSR_LOG_ERR, "Error, OLSR message from %s (type %d) says" " length=%d, but only %d bytes left", olsr_ip_to_string(&buf, msgorig), m->v4.olsr_msgtype, msgsize, count); break; } count -= msgsize; /*RFC 3626 section 3.4: * 2 If the time to live of the message is less than or equal to * '0' (zero), or if the message was sent by the receiving node * (i.e., the Originator Address of the message is the main * address of the receiving node): the message MUST silently be * dropped. */ /* Should be the same for IPv4 and IPv6 */ validated = olsr_validate_address((union olsr_ip_addr *)&m->v4.originator); if (ipequal((union olsr_ip_addr *)&m->v4.originator, &olsr_cnf->main_addr) || !validated) { #ifdef DEBUG struct ipaddr_str buf; OLSR_PRINTF(3, "Not processing message originating from %s!\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&m->v4.originator)); #endif /* DEBUG */ #ifndef NO_DUPLICATE_DETECTION_HANDLER if (validated) { olsr_test_originator_collision(m->v4.olsr_msgtype, seqno); } #endif /* NO_DUPLICATE_DETECTION_HANDLER */ continue; } entry = parse_functions; while (entry) { /* Should be the same for IPv4 and IPv6 */ /* Promiscuous or exact match */ if ((entry->type == PROMISCUOUS) || (entry->type == m->v4.olsr_msgtype)) { if (!entry->function(m, in_if, from_addr)) forward = false; } entry = entry->next; } if (forward) { olsr_forward_message(m, in_if, from_addr); } } /* for olsr_msg */ } /** *Processing OLSR data from socket. Reading data, setting *wich interface received the message, Sends IPC(if used) *and passes the packet on to parse_packet(). * *@param fd the filedescriptor that data should be read from. *@param data unused *@param flags unused */ void olsr_input(int fd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { struct interface *olsr_in_if; union olsr_ip_addr from_addr; struct preprocessor_function_entry *entry; char *packet; cpu_overload_exit = 0; for (;;) { struct ipaddr_str buf; /* sockaddr_in6 is bigger than sockaddr !!!! */ struct sockaddr_storage from; socklen_t fromlen; int cc; if (32 < ++cpu_overload_exit) { OLSR_PRINTF(1, "CPU overload detected, ending olsr_input() loop\n"); break; } fromlen = sizeof(struct sockaddr_storage); cc = olsr_recvfrom(fd, inbuf, sizeof(inbuf_aligned), 0, (struct sockaddr *)&from, &fromlen); if (cc <= 0) { if (cc < 0 && errno != EWOULDBLOCK) { OLSR_PRINTF(1, "error recvfrom: %s", strerror(errno)); #ifndef _WIN32 olsr_syslog(OLSR_LOG_ERR, "error recvfrom: %m"); #endif /* _WIN32 */ } break; } if (olsr_cnf->ip_version == AF_INET) { /* IPv4 sender address */ void * src = &((struct sockaddr_in *)&from)->sin_addr; memcpy(&from_addr.v4, src, sizeof(from_addr.v4)); } else { /* IPv6 sender address */ void * src = &((struct sockaddr_in6 *)&from)->sin6_addr; memcpy(&from_addr.v6, src, sizeof(from_addr.v6)); } #ifdef DEBUG OLSR_PRINTF(5, "Received a packet from %s\n", olsr_ip_to_string(&buf, &from_addr)); #endif /* DEBUG */ if ((olsr_cnf->ip_version == AF_INET) && (fromlen != sizeof(struct sockaddr_in))) break; else if ((olsr_cnf->ip_version == AF_INET6) && (fromlen != sizeof(struct sockaddr_in6))) break; /* are we talking to ourselves? */ if (if_ifwithaddr(&from_addr) != NULL) return; if ((olsr_in_if = if_ifwithsock(fd)) == NULL) { OLSR_PRINTF(1, "Could not find input interface for message from %s size %d\n", olsr_ip_to_string(&buf, &from_addr), cc); olsr_syslog(OLSR_LOG_ERR, "Could not find input interface for message from %s size %d\n", olsr_ip_to_string(&buf, &from_addr), cc); return; } // call preprocessors entry = preprocessor_functions; packet = &inbuf[0]; while (entry) { packet = entry->function(packet, olsr_in_if, &from_addr, &cc); // discard package ? if (packet == NULL) { return; } entry = entry->next; } /* * &from - sender * &inbuf.olsr * cc - bytes read */ parse_packet((struct olsr *)packet, cc, olsr_in_if, &from_addr); } } /** *Processing OLSR data from socket. Reading data, setting *wich interface received the message, Sends IPC(if used) *and passes the packet on to parse_packet(). * *@param fd the filedescriptor that data should be read from. *@param data unused *@param flags unused */ void olsr_input_hostemu(int fd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) { /* sockaddr_in6 is bigger than sockaddr !!!! */ struct sockaddr_storage from; socklen_t fromlen; struct interface *olsr_in_if; union olsr_ip_addr from_addr; uint16_t pcklen; struct preprocessor_function_entry *entry; char *packet; /* Host emulator receives IP address first to emulate direct link */ int cc = recv(fd, (void*)from_addr.v6.s6_addr, olsr_cnf->ipsize, 0); if (cc != (int)olsr_cnf->ipsize) { fprintf(stderr, "Error receiving host-client IP hook(%d) %s!\n", cc, strerror(errno)); memcpy(&from_addr, &((struct olsr *)inbuf)->olsr_msg->originator, olsr_cnf->ipsize); } /* are we talking to ourselves? */ if (if_ifwithaddr(&from_addr) != NULL) return; /* Extract size */ if ((cc = recv(fd, (void *)&pcklen, 2, MSG_PEEK)) != 2) { /* Win needs a cast */ if (cc <= 0) { fprintf(stderr, "Lost olsr_switch connection - exit!\n"); olsr_exit(__func__, EXIT_FAILURE); } fprintf(stderr, "[hust-emu] error extracting size(%d) %s!\n", cc, strerror(errno)); return; } else { pcklen = ntohs(pcklen); } fromlen = sizeof(struct sockaddr_storage); cc = olsr_recvfrom(fd, inbuf, pcklen, 0, (struct sockaddr *)&from, &fromlen); if (cc <= 0) { if (cc < 0 && errno != EWOULDBLOCK) { const char *const err_msg = strerror(errno); OLSR_PRINTF(1, "error recvfrom: %s", err_msg); olsr_syslog(OLSR_LOG_ERR, "error recvfrom: %s", err_msg); } return; } if (cc != pcklen) { printf("Could not read whole packet(size %d, read %d)\n", pcklen, cc); return; } if ((olsr_in_if = if_ifwithsock(fd)) == NULL) { struct ipaddr_str buf; OLSR_PRINTF(1, "Could not find input interface for message from %s size %d\n", olsr_ip_to_string(&buf, &from_addr), cc); olsr_syslog(OLSR_LOG_ERR, "Could not find input interface for message from %s size %d\n", olsr_ip_to_string(&buf, &from_addr), cc); return; } // call preprocessors entry = preprocessor_functions; packet = &inbuf[0]; while (entry) { packet = entry->function(packet, olsr_in_if, &from_addr, &cc); // discard package ? if (packet == NULL) { return; } entry = entry->next; } /* * &from - sender * &inbuf.olsr * cc - bytes read */ parse_packet((struct olsr *)inbuf, cc, olsr_in_if, &from_addr); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/parser.h000066400000000000000000000066431234304727700152640ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_MSG_PARSER #define _OLSR_MSG_PARSER #include "olsr_protocol.h" #include "packet.h" #define PROMISCUOUS 0xffffffff /* Function returns false if the message should not be forwarded */ typedef bool parse_function(union olsr_message *, struct interface *, union olsr_ip_addr *); struct parse_function_entry { uint32_t type; /* If set to PROMISCUOUS all messages will be received */ parse_function *function; struct parse_function_entry *next; }; typedef char *preprocessor_function(char *packet, struct interface *, union olsr_ip_addr *, int *length); struct preprocessor_function_entry { preprocessor_function *function; struct preprocessor_function_entry *next; }; typedef void packetparser_function(struct olsr *olsr, struct interface *in_if, union olsr_ip_addr *from_addr); struct packetparser_function_entry { packetparser_function *function; struct packetparser_function_entry *next; }; void olsr_init_parser(void); void olsr_destroy_parser(void); void olsr_input(int fd, void *, unsigned int); void olsr_input_hostemu(int fd, void *, unsigned int); void olsr_parser_add_function(parse_function, uint32_t); int olsr_parser_remove_function(parse_function, uint32_t); void olsr_preprocessor_add_function(preprocessor_function); int olsr_preprocessor_remove_function(preprocessor_function); void olsr_packetparser_add_function(packetparser_function * function); int olsr_packetparser_remove_function(packetparser_function * function); void parse_packet(struct olsr *, int, struct interface *, union olsr_ip_addr *); #endif /* _OLSR_MSG_PARSER */ olsrd-0.6.6.2/src/plugin_loader.c000066400000000000000000000260461234304727700166060ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "plugin_loader.h" #include "olsrd_plugin.h" #include "plugin_util.h" #include "defs.h" #include "olsr.h" #include /* Local functions */ static int init_olsr_plugin(struct olsr_plugin *); static int olsr_load_dl(char *, struct plugin_param *); static int olsr_add_dl(struct olsr_plugin *); static struct olsr_plugin *olsr_plugins = NULL; /** *Function that loads all registered plugins * *@return the number of plugins loaded */ void olsr_load_plugins(void) { struct plugin_entry *entry = olsr_cnf->plugins; int rv = 0; for (entry = olsr_cnf->plugins; entry != NULL; entry = entry->next) { if (olsr_load_dl(entry->name, entry->params) < 0) { rv = 1; } } if (rv != 0) { OLSR_PRINTF(0, "-- PLUGIN LOADING FAILED! --\n"); exit(1); } OLSR_PRINTF(0, "-- ALL PLUGINS LOADED! --\n\n"); } /** *Try to load a shared library and extract *the required information * *@param libname the name of the library(file) *@param params plugin parameters * *@return negative on error */ static int olsr_load_dl(char *libname, struct plugin_param *params) { #if defined TESTLIB_PATH && TESTLIB_PATH char path[256] = "/usr/testlib/"; #endif /* defined TESTLIB_PATH && TESTLIB_PATH */ struct olsr_plugin *plugin = olsr_malloc(sizeof(struct olsr_plugin), "Plugin entry"); int rv; OLSR_PRINTF(0, "---------- LOADING LIBRARY %s ----------\n", libname); #if defined TESTLIB_PATH && TESTLIB_PATH strcat(path, libname); plugin->dlhandle = dlopen(path, RTLD_NOW); #else /* defined TESTLIB_PATH && TESTLIB_PATH */ plugin->dlhandle = dlopen(libname, RTLD_NOW); #endif /* defined TESTLIB_PATH && TESTLIB_PATH */ if (plugin->dlhandle == NULL) { const int save_errno = errno; OLSR_PRINTF(0, "DL loading failed: \"%s\"!\n", dlerror()); free(plugin); errno = save_errno; return -1; } rv = olsr_add_dl(plugin); if (rv == -1) { const int save_errno = errno; dlclose(plugin->dlhandle); free(plugin); errno = save_errno; } else { plugin->params = params; /* Initialize the plugin */ if (init_olsr_plugin(plugin) != 0) { rv = -1; } /* queue */ plugin->next = olsr_plugins; olsr_plugins = plugin; } OLSR_PRINTF(0, "---------- LIBRARY %s %s ----------\n\n", libname, rv == 0 ? "LOADED" : "FAILED"); return rv; } #if defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS static int try_old_versions(const struct olsr_plugin *plugin) { get_interface_version_func get_interface_version; int *interface_version; OLSR_PRINTF(1, "trying v2 detection... "); get_interface_version = dlsym(plugin->dlhandle, "get_plugin_interface_version"); if (get_interface_version != NULL) { return get_interface_version(); } OLSR_PRINTF(1, "trying v1 detection... "); interface_version = dlsym(plugin->dlhandle, "plugin_interface_version"); if (interface_version != NULL) { return *interface_version; } OLSR_PRINTF(0, "FAILED: \"%s\"\n", dlerror()); return -1; } #else /* defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS */ #define try_old_versions(plugin) -1 #endif /* defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS */ static int olsr_add_dl(struct olsr_plugin *plugin) { get_interface_version_func get_interface_version; get_plugin_parameters_func get_plugin_parameters; int plugin_interface_version; /* Fetch the interface version function, 3 different ways */ OLSR_PRINTF(0, "Checking plugin interface version: "); get_interface_version = dlsym(plugin->dlhandle, "olsrd_plugin_interface_version"); if (get_interface_version == NULL) { plugin_interface_version = try_old_versions(plugin); } else { plugin_interface_version = get_interface_version(); } if (plugin_interface_version == -1) { OLSR_PRINTF(0, "FAILED: \"%s\"\n", dlerror()); return -1; } OLSR_PRINTF(0, " %d - OK\n", plugin_interface_version); if (plugin_interface_version < 5) { /* old plugin interface */ OLSR_PRINTF(0, "\nWARNING: YOU ARE USING AN OLD DEPRECATED PLUGIN INTERFACE!\n" "DETECTED VERSION %d AND THE CURRENT VERSION IS %d\n" "PLEASE UPGRADE YOUR PLUGIN!\n", plugin_interface_version, MOST_RECENT_PLUGIN_INTERFACE_VERSION); #if defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS OLSR_PRINTF(0, "WILL CONTINUE IN 5 SECONDS...\n\n"); sleep(5); #else /* defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS */ return -1; #endif /* defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS */ } #if defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS /* new plugin interface */ if (plugin_interface_version < LAST_SUPPORTED_PLUGIN_INTERFACE_VERSION) { OLSR_PRINTF(0, "\n\nWARNING: VERSION MISMATCH!\n" "DETECTED %d AND LAST SUPPORTED VERSION IS %d\n" "THIS CAN CAUSE UNEXPECTED BEHAVIOUR AND CRASHES!\n" "WILL CONTINUE IN 5 SECONDS...\n\n", get_interface_version(), LAST_SUPPORTED_PLUGIN_INTERFACE_VERSION); sleep(5); } #endif /* defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS */ /* Fetch the init function */ OLSR_PRINTF(1, "Trying to fetch plugin init function: "); plugin->plugin_init = dlsym(plugin->dlhandle, "olsrd_plugin_init"); if (plugin->plugin_init == NULL) { OLSR_PRINTF(0, "FAILED: \"%s\"\n", dlerror()); return -1; } OLSR_PRINTF(1, "OK\n"); OLSR_PRINTF(1, "Trying to fetch parameter table and it's size... \n"); get_plugin_parameters = dlsym(plugin->dlhandle, "olsrd_get_plugin_parameters"); if (get_plugin_parameters != NULL) { (*get_plugin_parameters) (&plugin->plugin_parameters, &plugin->plugin_parameters_size); } else { #if defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS /* Fetch the parameter function */ OLSR_PRINTF(1, "Trying to fetch param function: "); plugin->register_param = dlsym(plugin->dlhandle, "olsrd_plugin_register_param"); if (plugin->register_param == NULL) { OLSR_PRINTF(0, "FAILED: \"%s\"\n", dlerror()); return -1; } else { OLSR_PRINTF(1, "OK\n"); } plugin->plugin_parameters = NULL; plugin->plugin_parameters_size = 0; #else /* defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS */ OLSR_PRINTF(0, "Old plugin interfaces are not supported\n"); return -1; #endif /* defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS */ } return 0; } /** *Initialize a loaded plugin *This includes sending information *from olsrd to the plugin and *register the functions from the plugin with olsrd * *@param entry the plugin to initialize * *@return -1 if there was an error */ static int init_olsr_plugin(struct olsr_plugin *entry) { int rv = 0; struct plugin_param *params; OLSR_PRINTF(1, "Sending parameters...\n"); for (params = entry->params; params != NULL; params = params->next) { OLSR_PRINTF(1, "\"%s\"/\"%s\"... ", params->key, params->value); if (entry->plugin_parameters_size != 0) { unsigned int i; int rc = 0; for (i = 0; i < entry->plugin_parameters_size; i++) { if (0 == entry->plugin_parameters[i].name[0] || 0 == strcasecmp(entry->plugin_parameters[i].name, params->key)) { /* we have found it! */ rc = entry->plugin_parameters[i].set_plugin_parameter(params->value, entry->plugin_parameters[i].data, 0 == entry->plugin_parameters[i].name[0] ? (set_plugin_parameter_addon) params->key : entry->plugin_parameters[i].addon); if (rc != 0) { fprintf(stderr, "\nFatal error in plugin parameter \"%s\"/\"%s\"\n", params->key, params->value); rv = -1; } break; } } if (i >= entry->plugin_parameters_size) { OLSR_PRINTF(0, "Ignored parameter \"%s\"\n", params->key); } else { OLSR_PRINTF(1, "%s: %s\n", params->key, rc == 0 ? "OK" : "FAILED"); if (rc != 0) { rv = -1; } } #if defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS } else if (entry->register_param != NULL) { int rc; OLSR_PRINTF(0, "Registering parameter \"%s\": ", params->key); rc = entry->register_param(params->key, params->value); if (rc < 0) { fprintf(stderr, "\nFatal error in plugin parameter \"%s\"/\"%s\"\n", params->key, params->value); exit(EXIT_FAILURE); } OLSR_PRINTF(0, "%s\n", rc == 0 ? "FAILED" : "OK"); #endif /* defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS */ } else { OLSR_PRINTF(0, "I don't know what to do with \"%s\"!\n", params->key); rv = -1; } } OLSR_PRINTF(1, "Running plugin_init function...\n"); entry->plugin_init(); return rv; } /** *Close all loaded plugins */ void olsr_close_plugins(void) { struct olsr_plugin *entry; OLSR_PRINTF(0, "Closing plugins...\n"); for (entry = olsr_plugins; entry != NULL; entry = entry->next) { dlclose(entry->dlhandle); entry->dlhandle = NULL; } } /* * Local Variables: * mode: c * style: linux * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/plugin_loader.h000066400000000000000000000063001234304727700166020ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_PLUGIN_LOADER #define _OLSR_PLUGIN_LOADER #include "olsrd_plugin.h" #include "olsr_types.h" #include "olsr_cfg.h" #ifndef OLSR_PLUGIN /* all */ typedef int (*plugin_init_func) (void); typedef int (*get_interface_version_func) (void); #if defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS /* version 4 */ typedef int (*register_param_func) (char *, char *); #endif /* defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS */ /* version 5 */ typedef void (*get_plugin_parameters_func) (const struct olsrd_plugin_parameters ** params, unsigned int *size); struct olsr_plugin { /* The handle */ void *dlhandle; struct plugin_param *params; int plugin_interface_version; #if defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS /* version 4 */ register_param_func register_param; #endif /* defined SUPPORT_OLD_PLUGIN_VERSIONS && SUPPORT_OLD_PLUGIN_VERSIONS */ plugin_init_func plugin_init; /* version 5 */ const struct olsrd_plugin_parameters *plugin_parameters; unsigned int plugin_parameters_size; struct olsr_plugin *next; }; void olsr_load_plugins(void); void olsr_close_plugins(void); int olsr_plugin_io(int, void *, size_t); #endif /* OLSR_PLUGIN */ #endif /* _OLSR_PLUGIN_LOADER */ /* * Local Variables: * mode: c * style: linux * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/plugin_util.c000066400000000000000000000107351234304727700163130ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2007, Bernd Petrovitsch * Copyright (c) 2007, Sven-Ola * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "plugin_util.h" #include "olsr.h" #include "defs.h" #include int set_plugin_port(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused))) { char *endptr; const unsigned int port = strtoul(value, &endptr, 0); if (*endptr != '\0' || endptr == value) { OLSR_PRINTF(0, "Illegal port number \"%s\"", value); return 1; } if (port > 65535) { OLSR_PRINTF(0, "Port number %u out of range", port); return 1; } if (data != NULL) { int *v = data; *v = port; OLSR_PRINTF(1, "%s port number %u\n", "Got", port); } else { OLSR_PRINTF(0, "%s port number %u\n", "Ignored", port); } return 0; } int set_plugin_ipaddress(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused))) { char buf[INET6_ADDRSTRLEN]; union olsr_ip_addr ip_addr; if (inet_pton(olsr_cnf->ip_version, value, &ip_addr) <= 0) { OLSR_PRINTF(0, "Illegal IP address \"%s\"", value); return 1; } inet_ntop(olsr_cnf->ip_version, &ip_addr, buf, sizeof(buf)); if (data != NULL) { union olsr_ip_addr *v = data; *v = ip_addr; OLSR_PRINTF(1, "%s IP address %s\n", "Got", buf); } else { OLSR_PRINTF(0, "%s IP address %s\n", "Ignored", buf); } return 0; } int set_plugin_boolean(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused))) { int *v = data; if (strcasecmp(value, "yes") == 0 || strcasecmp(value, "true") == 0) { *v = 1; } else if (strcasecmp(value, "no") == 0 || strcasecmp(value, "false") == 0) { *v = 0; } else { return 1; } return 0; } int set_plugin_int(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused))) { char *endptr; const int theint = strtol(value, &endptr, 0); if (*endptr != '\0' || endptr == value) { OLSR_PRINTF(0, "Illegal int \"%s\"", value); return 1; } if (data != NULL) { int *v = data; *v = theint; OLSR_PRINTF(1, "%s int %d\n", "Got", theint); } else { OLSR_PRINTF(0, "%s int %d\n", "Ignored", theint); } return 0; } int set_plugin_string(const char *value, void *data, set_plugin_parameter_addon addon) { if (data != NULL) { char *v = data; if ((unsigned)strlen(value) >= addon.ui) { OLSR_PRINTF(0, "String too long \"%s\"", value); return 1; } strscpy(v, value, addon.ui); OLSR_PRINTF(1, "%s string %s\n", "Got", value); } else { OLSR_PRINTF(0, "%s string %s\n", "Ignored", value); } return 0; } /* * Local Variables: * mode: c * style: linux * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/plugin_util.h000066400000000000000000000041771234304727700163230ustar00rootroot00000000000000 /* * Copyright (c) 2007, Bernd Petrovitsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the UniK olsr daemon nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * Example plugin for olsrd.org OLSR daemon * Only the bare minimum */ #ifndef _OLSRD_PLUGIN_UTIL #define _OLSRD_PLUGIN_UTIL #include "olsrd_plugin.h" /* Common/utility functions for plugins */ extern set_plugin_parameter set_plugin_port; extern set_plugin_parameter set_plugin_ipaddress; extern set_plugin_parameter set_plugin_boolean; extern set_plugin_parameter set_plugin_int; extern set_plugin_parameter set_plugin_string; #endif /* _OLSRD_PLUGIN_UTIL */ /* * Local Variables: * mode: c * style: linux * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/process_package.c000066400000000000000000000412351234304727700171100ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "process_package.h" #include "ipcalc.h" #include "defs.h" #include "lq_packet.h" #include "hysteresis.h" #include "two_hop_neighbor_table.h" #include "tc_set.h" #include "mpr_selector_set.h" #include "mid_set.h" #include "olsr.h" #include "parser.h" #include "duplicate_set.h" #include "scheduler.h" #include "net_olsr.h" #include "lq_plugin.h" #include "log.h" #include static void process_message_neighbors(struct neighbor_entry *, const struct hello_message *); static void linking_this_2_entries(struct neighbor_entry *, struct neighbor_2_entry *, olsr_reltime); static bool lookup_mpr_status(const struct hello_message *, const struct interface *); /** *Processes an list of neighbors from an incoming HELLO message. *@param neighbor the neighbor who sent the message. *@param message the HELLO message *@return nada */ static void process_message_neighbors(struct neighbor_entry *neighbor, const struct hello_message *message) { struct hello_neighbor *message_neighbors; for (message_neighbors = message->neighbors; message_neighbors != NULL; message_neighbors = message_neighbors->next) { union olsr_ip_addr *neigh_addr; struct neighbor_2_entry *two_hop_neighbor; /* *check all interfaces *so that we don't add ourselves to the *2 hop list *IMPORTANT! */ if (if_ifwithaddr(&message_neighbors->address) != NULL) continue; /* Get the main address */ neigh_addr = mid_lookup_main_addr(&message_neighbors->address); if (neigh_addr != NULL) { message_neighbors->address = *neigh_addr; } if (((message_neighbors->status == SYM_NEIGH) || (message_neighbors->status == MPR_NEIGH))) { struct neighbor_2_list_entry *two_hop_neighbor_yet = olsr_lookup_my_neighbors(neighbor, &message_neighbors->address); if (two_hop_neighbor_yet != NULL) { /* Updating the holding time for this neighbor */ olsr_set_timer(&two_hop_neighbor_yet->nbr2_list_timer, message->vtime, OLSR_NBR2_LIST_JITTER, OLSR_TIMER_ONESHOT, &olsr_expire_nbr2_list, two_hop_neighbor_yet, 0); two_hop_neighbor = two_hop_neighbor_yet->neighbor_2; /* * For link quality OLSR, reset the path link quality here. * The path link quality will be calculated in the second pass, below. * Keep the saved_path_link_quality for reference. */ if (olsr_cnf->lq_level > 0) { /* * loop through the one-hop neighbors that see this * 'two_hop_neighbor' */ struct neighbor_list_entry *walker; for (walker = two_hop_neighbor->neighbor_2_nblist.next; walker != &two_hop_neighbor->neighbor_2_nblist; walker = walker->next) { /* * have we found the one-hop neighbor that sent the * HELLO message that we're current processing? */ if (walker->neighbor == neighbor) { walker->path_linkcost = LINK_COST_BROKEN; } } } } else { two_hop_neighbor = olsr_lookup_two_hop_neighbor_table(&message_neighbors->address); if (two_hop_neighbor == NULL) { changes_neighborhood = true; changes_topology = true; two_hop_neighbor = olsr_malloc(sizeof(struct neighbor_2_entry), "Process HELLO"); two_hop_neighbor->neighbor_2_nblist.next = &two_hop_neighbor->neighbor_2_nblist; two_hop_neighbor->neighbor_2_nblist.prev = &two_hop_neighbor->neighbor_2_nblist; two_hop_neighbor->neighbor_2_pointer = 0; two_hop_neighbor->neighbor_2_addr = message_neighbors->address; olsr_insert_two_hop_neighbor_table(two_hop_neighbor); linking_this_2_entries(neighbor, two_hop_neighbor, message->vtime); } else { /* linking to this two_hop_neighbor entry */ changes_neighborhood = true; changes_topology = true; linking_this_2_entries(neighbor, two_hop_neighbor, message->vtime); } } } } /* Separate, second pass for link quality OLSR */ /* Separate, second and third pass for link quality OLSR */ if (olsr_cnf->lq_level > 0) { olsr_linkcost first_hop_pathcost; struct link_entry *lnk = get_best_link_to_neighbor(&neighbor->neighbor_main_addr); if (!lnk) return; /* calculate first hop path quality */ first_hop_pathcost = lnk->linkcost; /* * Second pass for link quality OLSR: calculate the best 2-hop * path costs to all the 2-hop neighbors indicated in the * HELLO message. Since the same 2-hop neighbor may be listed * more than once in the same HELLO message (each at a possibly * different quality) we want to select only the best one, not just * the last one listed in the HELLO message. */ for (message_neighbors = message->neighbors; message_neighbors != NULL; message_neighbors = message_neighbors->next) { if (if_ifwithaddr(&message_neighbors->address) != NULL) continue; if (((message_neighbors->status == SYM_NEIGH) || (message_neighbors->status == MPR_NEIGH))) { struct neighbor_list_entry *walker; struct neighbor_2_entry *two_hop_neighbor; struct neighbor_2_list_entry *two_hop_neighbor_yet = olsr_lookup_my_neighbors(neighbor, &message_neighbors->address); if (!two_hop_neighbor_yet) continue; two_hop_neighbor = two_hop_neighbor_yet->neighbor_2; /* * loop through the one-hop neighbors that see this * 'two_hop_neighbor' */ for (walker = two_hop_neighbor->neighbor_2_nblist.next; walker != &two_hop_neighbor->neighbor_2_nblist; walker = walker->next) { /* * have we found the one-hop neighbor that sent the * HELLO message that we're current processing? */ if (walker->neighbor == neighbor) { olsr_linkcost new_second_hop_linkcost, new_path_linkcost; // the link cost between the 1-hop neighbour and the // 2-hop neighbour new_second_hop_linkcost = message_neighbors->cost; // the total cost for the route // "us --- 1-hop --- 2-hop" new_path_linkcost = first_hop_pathcost + new_second_hop_linkcost; // Only copy the link quality if it is better than what we have // for this 2-hop neighbor if (new_path_linkcost < walker->path_linkcost) { walker->second_hop_linkcost = new_second_hop_linkcost; walker->path_linkcost = new_path_linkcost; walker->saved_path_linkcost = new_path_linkcost; changes_neighborhood = true; changes_topology = true; } } } } } } } /** *Links a one-hop neighbor with a 2-hop neighbor. * *@param neighbor the 1-hop neighbor *@param two_hop_neighbor the 2-hop neighbor *@param vtime the validity time */ static void linking_this_2_entries(struct neighbor_entry *neighbor, struct neighbor_2_entry *two_hop_neighbor, olsr_reltime vtime) { struct neighbor_list_entry *list_of_1_neighbors = olsr_malloc(sizeof(struct neighbor_list_entry), "Link entries 1"); struct neighbor_2_list_entry *list_of_2_neighbors = olsr_malloc(sizeof(struct neighbor_2_list_entry), "Link entries 2"); list_of_1_neighbors->neighbor = neighbor; list_of_1_neighbors->path_linkcost = LINK_COST_BROKEN; list_of_1_neighbors->saved_path_linkcost = LINK_COST_BROKEN; list_of_1_neighbors->second_hop_linkcost = LINK_COST_BROKEN; /* Queue */ two_hop_neighbor->neighbor_2_nblist.next->prev = list_of_1_neighbors; list_of_1_neighbors->next = two_hop_neighbor->neighbor_2_nblist.next; two_hop_neighbor->neighbor_2_nblist.next = list_of_1_neighbors; list_of_1_neighbors->prev = &two_hop_neighbor->neighbor_2_nblist; list_of_2_neighbors->neighbor_2 = two_hop_neighbor; list_of_2_neighbors->nbr2_nbr = neighbor; /* XXX refcount */ olsr_change_timer(list_of_2_neighbors->nbr2_list_timer, vtime, OLSR_NBR2_LIST_JITTER, OLSR_TIMER_ONESHOT); /* Queue */ neighbor->neighbor_2_list.next->prev = list_of_2_neighbors; list_of_2_neighbors->next = neighbor->neighbor_2_list.next; neighbor->neighbor_2_list.next = list_of_2_neighbors; list_of_2_neighbors->prev = &neighbor->neighbor_2_list; /*increment the pointer counter */ two_hop_neighbor->neighbor_2_pointer++; } /** * Check if a hello message states this node as a MPR. * * @param message the message to check * @param in_if the incoming interface * *@return 1 if we are selected as MPR 0 if not */ static bool lookup_mpr_status(const struct hello_message *message, const struct interface *in_if) { struct hello_neighbor *neighbors; for (neighbors = message->neighbors; neighbors; neighbors = neighbors->next) { if ( neighbors->link != UNSPEC_LINK && (olsr_cnf->ip_version == AF_INET ? ip4equal(&neighbors->address.v4, &in_if->ip_addr.v4) : ip6equal(&neighbors->address.v6, &in_if->int6_addr.sin6_addr))) { if (neighbors->link == SYM_LINK && neighbors->status == MPR_NEIGH) { return true; } break; } } /* Not found */ return false; } static int deserialize_hello(struct hello_message *hello, const void *ser) { const unsigned char *curr, *limit; uint8_t type; uint16_t size; struct ipaddr_str buf; memset (hello, 0, sizeof(*hello)); curr = ser; pkt_get_u8(&curr, &type); if (type != HELLO_MESSAGE && type != LQ_HELLO_MESSAGE) { /* No need to do anything more */ return 1; } pkt_get_reltime(&curr, &hello->vtime); pkt_get_u16(&curr, &size); pkt_get_ipaddress(&curr, &hello->source_addr); pkt_get_u8(&curr, &hello->ttl); pkt_get_u8(&curr, &hello->hop_count); pkt_get_u16(&curr, &hello->packet_seq_number); pkt_ignore_u16(&curr); pkt_get_reltime(&curr, &hello->htime); pkt_get_u8(&curr, &hello->willingness); hello->neighbors = NULL; limit = ((const unsigned char *)ser) + size; while (curr < limit) { const unsigned char *limit2 = curr; uint8_t link_code; uint16_t size2; pkt_get_u8(&curr, &link_code); pkt_ignore_u8(&curr); pkt_get_u16(&curr, &size2); limit2 += size2; while (curr < limit2) { struct hello_neighbor *neigh = olsr_malloc_hello_neighbor("HELLO deserialization"); pkt_get_ipaddress(&curr, &neigh->address); if (type == LQ_HELLO_MESSAGE) { olsr_deserialize_hello_lq_pair(&curr, neigh); } neigh->link = EXTRACT_LINK(link_code); neigh->status = EXTRACT_STATUS(link_code); neigh->next = hello->neighbors; hello->neighbors = neigh; } } return 0; } bool olsr_input_hello(union olsr_message * ser, struct interface * inif, union olsr_ip_addr * from) { struct hello_message hello; if (ser == NULL) { return false; } if (deserialize_hello(&hello, ser) != 0) { return false; } olsr_hello_tap(&hello, inif, from); /* Do not forward hello messages */ return false; } /** *Initializing the parser functions we are using */ void olsr_init_package_process(void) { if (olsr_cnf->lq_level == 0) { olsr_parser_add_function(&olsr_input_hello, HELLO_MESSAGE); olsr_parser_add_function(&olsr_input_tc, TC_MESSAGE); } else { olsr_parser_add_function(&olsr_input_hello, LQ_HELLO_MESSAGE); olsr_parser_add_function(&olsr_input_tc, LQ_TC_MESSAGE); } olsr_parser_add_function(&olsr_input_mid, MID_MESSAGE); olsr_parser_add_function(&olsr_input_hna, HNA_MESSAGE); } void olsr_hello_tap(struct hello_message *message, struct interface *in_if, const union olsr_ip_addr *from_addr) { struct neighbor_entry *neighbor; /* * Update link status */ struct link_entry *lnk = update_link_entry(&in_if->ip_addr, from_addr, message, in_if); /*check alias message->source_addr*/ if (!ipequal(&message->source_addr,from_addr)){ /*new alias of new neighbour are thrown in the mid table to speed up routing*/ if (olsr_validate_address(from_addr)) { union olsr_ip_addr * main_addr = mid_lookup_main_addr(from_addr); if ((main_addr==NULL)||(ipequal(&message->source_addr, main_addr))){ /*struct ipaddr_str srcbuf, origbuf; olsr_syslog(OLSR_LOG_INFO, "got hello from unknown alias ip of direct neighbour: ip: %s main-ip: %s", olsr_ip_to_string(&origbuf,&message->source_addr), olsr_ip_to_string(&srcbuf,from_addr));*/ insert_mid_alias(&message->source_addr, from_addr, message->vtime); } else { struct ipaddr_str srcbuf, origbuf; olsr_syslog(OLSR_LOG_INFO, "got hello with invalid from and originator address pair (%s, %s) Duplicate Ips?\n", olsr_ip_to_string(&origbuf,&message->source_addr), olsr_ip_to_string(&srcbuf,from_addr)); } } } if (olsr_cnf->lq_level > 0) { struct hello_neighbor *walker; /* just in case our neighbor has changed its HELLO interval */ olsr_update_packet_loss_hello_int(lnk, message->htime); /* find the input interface in the list of neighbor interfaces */ for (walker = message->neighbors; walker != NULL; walker = walker->next) { if (ipequal(&walker->address, &in_if->ip_addr)) { /* * memorize our neighbour's idea of the link quality, so that we * know the link quality in both directions */ olsr_memorize_foreign_hello_lq(lnk, walker->link != UNSPEC_LINK ? walker : NULL); break; } } /* update packet loss for link quality calculation */ olsr_received_hello_handler(lnk); } neighbor = lnk->neighbor; /* * Hysteresis */ if (olsr_cnf->use_hysteresis) { /* Update HELLO timeout */ /* printf("MESSAGE HTIME: %f\n", message->htime); */ olsr_update_hysteresis_hello(lnk, message->htime); } /* Check if we are chosen as MPR */ if (lookup_mpr_status(message, in_if)) /* source_addr is always the main addr of a node! */ olsr_update_mprs_set(&message->source_addr, message->vtime); /* Check willingness */ if (neighbor->willingness != message->willingness) { struct ipaddr_str buf; OLSR_PRINTF(1, "Willingness for %s changed from %d to %d - UPDATING\n", olsr_ip_to_string(&buf, &neighbor->neighbor_main_addr), neighbor->willingness, message->willingness); /* *If willingness changed - recalculate */ neighbor->willingness = message->willingness; changes_neighborhood = true; changes_topology = true; } /* Don't register neighbors of neighbors that announces WILL_NEVER */ if (neighbor->willingness != WILL_NEVER) process_message_neighbors(neighbor, message); /* Process changes immediately in case of MPR updates */ olsr_process_changes(); olsr_free_hello_packet(message); return; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/process_package.h000066400000000000000000000044571234304727700171220ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_PROCESS_PACKAGE #define _OLSR_PROCESS_PACKAGE #include "olsr_protocol.h" #include "packet.h" #include "neighbor_table.h" bool olsr_input_hello(union olsr_message *, struct interface *, union olsr_ip_addr *); void olsr_init_package_process(void); void olsr_hello_tap(struct hello_message *, struct interface *, const union olsr_ip_addr *); #endif /* _OLSR_PROCESS_PACKAGE */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/process_routes.c000066400000000000000000000310131234304727700170270ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * RIB implementation (c) 2007, Hannes Gredler (hannes@gredler.at) * All rights reserved. * * export_route_entry interface added by Immo 'FaUl Wehrenberg * and reworked by sven-ola 2007 * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "ipcalc.h" #include "defs.h" #include "olsr.h" #include "log.h" #include "kernel_routes.h" #include "common/avl.h" #include "net_olsr.h" #include "tc_set.h" #include "olsr_cookie.h" #include "olsr_niit.h" #ifdef _WIN32 char *StrError(unsigned int ErrNo); #undef strerror #define strerror(x) StrError(x) #endif /* _WIN32 */ static struct list_node chg_kernel_list; /** * * Calculate the kernel route flags. * Called before enqueuing a change/delete operation * */ uint8_t olsr_rt_flags(const struct rt_entry *rt, int add) { const struct rt_nexthop *nh; uint8_t flags = RTF_UP; /* destination is host */ if (rt->rt_dst.prefix_len == olsr_cnf->maxplen) { flags |= RTF_HOST; } if (add) nh = olsr_get_nh(rt); else nh = &rt->rt_nexthop; if (!ipequal(&rt->rt_dst.prefix, &nh->gateway)) { flags |= RTF_GATEWAY; } return flags; } export_route_function olsr_addroute_function; export_route_function olsr_addroute6_function; export_route_function olsr_delroute_function; export_route_function olsr_delroute6_function; void olsr_init_export_route(void) { /* the add/chg/del kernel queues */ //list_head_init(&add_kernel_list); list_head_init(&chg_kernel_list); olsr_addroute_function = olsr_ioctl_add_route; olsr_addroute6_function = olsr_ioctl_add_route6; olsr_delroute_function = olsr_ioctl_del_route; olsr_delroute6_function = olsr_ioctl_del_route6; } /** * Delete all OLSR routes. * * This is extremely simple - Just increment the version of the * tree and then olsr_update_rib_routes() will see all routes in the tree * as outdated and olsr_update_kernel_routes() will finally flush it. * */ void olsr_delete_all_kernel_routes(void) { OLSR_PRINTF(1, "Deleting all routes...\n"); olsr_bump_routingtree_version(); olsr_update_rib_routes(); olsr_update_kernel_routes(); } /** * Enqueue a route on a kernel add/chg/del queue. */ static void olsr_enqueue_rt(struct list_node *head_node, struct rt_entry *rt) { const struct rt_nexthop *nh; /* if this node is already on some changelist we are done */ if (list_node_on_list(&rt->rt_change_node)) { return; } /* * For easier route dependency tracking we enqueue nexthop routes * at the head of the queue and non-nexthop routes at the tail of the queue. */ nh = olsr_get_nh(rt); if (ipequal(&rt->rt_dst.prefix, &nh->gateway)) { list_add_after(head_node, &rt->rt_change_node); } else { list_add_before(head_node, &rt->rt_change_node); } } /** * Process a route from the kernel deletion list. * *@return -1 on error, else 0 */ static int olsr_delete_kernel_route(struct rt_entry *rt) { if (rt->rt_metric.hops > 1) { /* multihop route */ if (ip_is_linklocal(&rt->rt_dst.prefix)) { /* do not delete a route with a LL IP as a destination */ return 0; } } if (!olsr_cnf->host_emul) { int16_t error = olsr_cnf->ip_version == AF_INET ? olsr_delroute_function(rt) : olsr_delroute6_function(rt); if (error != 0) { const char *const err_msg = strerror(errno); const char *const routestr = olsr_rt_to_string(rt); OLSR_PRINTF(1, "KERN: ERROR deleting %s: %s\n", routestr, err_msg); olsr_syslog(OLSR_LOG_ERR, "Delete route %s: %s", routestr, err_msg); return -1; } #ifdef __linux__ /* call NIIT handler (always)*/ if (olsr_cnf->use_niit) { olsr_niit_handle_route(rt, false); } #endif /* __linux__ */ } return 0; } /** * Process a route from the kernel addition list. * *@return nada */ static void olsr_add_kernel_route(struct rt_entry *rt) { if (rt->rt_best->rtp_metric.hops > 1) { /* multihop route */ if (ip_is_linklocal(&rt->rt_best->rtp_dst.prefix)) { /* do not create a route with a LL IP as a destination */ return; } } if (!olsr_cnf->host_emul) { int16_t error = (olsr_cnf->ip_version == AF_INET) ? olsr_addroute_function(rt) : olsr_addroute6_function(rt); if (error != 0) { const char *const err_msg = strerror(errno); const char *const routestr = olsr_rtp_to_string(rt->rt_best); OLSR_PRINTF(1, "KERN: ERROR adding %s: %s\n", routestr, err_msg); olsr_syslog(OLSR_LOG_ERR, "Add route %s: %s", routestr, err_msg); } else { /* route addition has suceeded */ /* save the nexthop and metric in the route entry */ rt->rt_nexthop = rt->rt_best->rtp_nexthop; rt->rt_metric = rt->rt_best->rtp_metric; #ifdef __linux__ /* call NIIT handler */ if (olsr_cnf->use_niit) { olsr_niit_handle_route(rt, true); } #endif /* __linux__ */ } } } /** * process the kernel change list. * the routes are already ordered such that nexthop routes * are on the head of the queue. * non-nexthop routes need to be changed first and therefore * the queue needs to be traversed from tail to head. */ static void olsr_chg_kernel_routes(struct list_node *head_node) { struct rt_entry *rt; if (list_is_empty(head_node)) { return; } /* * Traverse from the beginning to the end of the list, * such that nexthop routes are added first. */ while (!list_is_empty(head_node)) { rt = changelist2rt(head_node->next); #ifdef __linux__ /* * actively deleting routes is not necessary as we use (NLM_F_CREATE | NLM_F_REPLACE) with linux * (i.e. new routes simply overwrite the old ones in kernel) * BUT: We still have to actively delete routes if fib_metric != FLAT or we run on ipv6. * As NLM_F_REPLACE is not supported with IPv6, or simply of no use with varying route metrics. * We also actively delete routes if custom route functions are in place. (e.g. quagga plugin) */ if (((olsr_cnf->ip_version != AF_INET ) || (olsr_cnf->fib_metric != FIBM_FLAT) || (olsr_addroute_function != olsr_ioctl_add_route) || (olsr_addroute6_function != olsr_ioctl_add_route6) || (olsr_delroute_function != olsr_ioctl_del_route) || (olsr_delroute6_function != olsr_ioctl_del_route6)) && (rt->rt_nexthop.iif_index > -1)) { olsr_delete_kernel_route(rt); } #else /* __linux__ */ /*no rtnetlink we have to delete routes*/ if (rt->rt_nexthop.iif_index > -1) olsr_delete_kernel_route(rt); #endif /* __linux__ */ olsr_add_kernel_route(rt); list_remove(&rt->rt_change_node); } } /** * Check the version number of all route paths hanging off a route entry. * If a route does not match the current routing tree number, remove it * from the global originator tree for that rt_entry. * Reset the best route pointer. */ static void olsr_delete_outdated_routes(struct rt_entry *rt) { struct rt_path *rtp; struct avl_node *rtp_tree_node, *next_rtp_tree_node; for (rtp_tree_node = avl_walk_first(&rt->rt_path_tree); rtp_tree_node != NULL; rtp_tree_node = next_rtp_tree_node) { /* * pre-fetch the next node before loosing context. */ next_rtp_tree_node = avl_walk_next(rtp_tree_node); rtp = rtp_tree2rtp(rtp_tree_node); /* * check the version number which gets incremented on every SPF run. * comparing for unequalness avoids handling version number wraps. */ if (routingtree_version != rtp->rtp_version) { /* remove from the originator tree */ avl_delete(&rt->rt_path_tree, rtp_tree_node); rtp->rtp_rt = NULL; if (rt->rt_best == rtp) { rt->rt_best = NULL; } } } } /** * Walk all the routes, remove outdated routes and run * best path selection on the remaining set. * Finally compare the nexthop of the route head and the best * path and enqueue an add/chg operation. */ void olsr_update_rib_routes(void) { struct rt_entry *rt; OLSR_PRINTF(3, "Updating kernel routes...\n"); /* walk all routes in the RIB. */ OLSR_FOR_ALL_RT_ENTRIES(rt) { /* eliminate first unused routes */ olsr_delete_outdated_routes(rt); if (!rt->rt_path_tree.count) { /* oops, all routes are gone - flush the route head */ if (olsr_delete_kernel_route(rt) == 0) { /*only remove if deletion was successful*/ avl_delete(&routingtree, &rt->rt_tree_node); olsr_cookie_free(rt_mem_cookie, rt); } continue; } /* run best route election */ olsr_rt_best(rt); /* nexthop or hopcount change ? */ if (olsr_nh_change(&rt->rt_best->rtp_nexthop, &rt->rt_nexthop) || (FIBM_CORRECT == olsr_cnf->fib_metric && olsr_hopcount_change(&rt->rt_best->rtp_metric, &rt->rt_metric))) { /* this is a route add or change. */ olsr_enqueue_rt(&chg_kernel_list, rt); } } OLSR_FOR_ALL_RT_ENTRIES_END(rt); } void olsr_delete_interface_routes(int if_index) { struct rt_entry *rt; bool triggerUpdate = false; OLSR_FOR_ALL_RT_ENTRIES(rt) { bool mightTrigger = false; struct rt_path *rtp; struct avl_node *rtp_tree_node, *next_rtp_tree_node; /* run through all routing paths of route */ for (rtp_tree_node = avl_walk_first(&rt->rt_path_tree); rtp_tree_node != NULL; rtp_tree_node = next_rtp_tree_node) { /* * pre-fetch the next node before loosing context. */ next_rtp_tree_node = avl_walk_next(rtp_tree_node); rtp = rtp_tree2rtp(rtp_tree_node); /* nexthop use lost interface ? */ if (rtp->rtp_nexthop.iif_index == if_index) { /* remove from the originator tree */ avl_delete(&rt->rt_path_tree, rtp_tree_node); rtp->rtp_rt = NULL; if (rt->rt_best == rtp) { rt->rt_best = NULL; mightTrigger = true; } } } if (mightTrigger) { if (!rt->rt_path_tree.count) { /* oops, all routes are gone - flush the route head */ avl_delete(&routingtree, rt_tree_node); /* do not dequeue route because they are already gone */ } triggerUpdate = true; } } OLSR_FOR_ALL_RT_ENTRIES_END(rt) /* trigger route update if necessary */ if (triggerUpdate) { olsr_update_rib_routes(); olsr_update_kernel_routes(); } } /** * Propagate the accumulated changes from the last rib update to the kernel. */ void olsr_update_kernel_routes(void) { /* route changes */ olsr_chg_kernel_routes(&chg_kernel_list); #if defined DEBUG && DEBUG olsr_print_routing_table(&routingtree); #endif /* defined DEBUG && DEBUG */ } void olsr_force_kernelroutes_refresh(void) { struct rt_entry *rt; /* enqueue all existing routes for a rewrite */ OLSR_FOR_ALL_RT_ENTRIES(rt) { olsr_enqueue_rt(&chg_kernel_list, rt); } OLSR_FOR_ALL_RT_ENTRIES_END(rt) /* trigger kernel route refresh */ olsr_chg_kernel_routes(&chg_kernel_list); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/process_routes.h000066400000000000000000000051571234304727700170460ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_PROCESS_RT #define _OLSR_PROCESS_RT #include "routing_table.h" #include typedef int (*export_route_function) (const struct rt_entry *); extern export_route_function olsr_addroute_function; extern export_route_function olsr_addroute6_function; extern export_route_function olsr_delroute_function; extern export_route_function olsr_delroute6_function; void olsr_init_export_route(void); void olsr_update_rib_routes(void); void olsr_update_kernel_routes(void); void olsr_delete_all_kernel_routes(void); uint8_t olsr_rt_flags(const struct rt_entry *, int add); void olsr_delete_interface_routes(int if_index); void olsr_force_kernelroutes_refresh(void); #endif /* _OLSR_PROCESS_RT */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/rebuild_packet.c000066400000000000000000000126471234304727700167410ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "rebuild_packet.h" #include "ipcalc.h" #include "defs.h" #include "olsr.h" #include "mid_set.h" #include "mantissa.h" #include "net_olsr.h" /** *Process/rebuild MID message. Converts the OLSR *packet to the internal mid_message format. *@param mmsg the mid_message struct in wich infomation *is to be put. *@param m the entire OLSR message revieved. *@return negative on error */ void mid_chgestruct(struct mid_message *mmsg, const union olsr_message *m) { int i; struct mid_alias *alias, *alias_tmp; int no_aliases; /* Checking if everything is ok */ if ((!m) || (m->v4.olsr_msgtype != MID_MESSAGE)) return; alias = NULL; if (olsr_cnf->ip_version == AF_INET) { /* IPv4 */ const struct midaddr *maddr = m->v4.message.mid.mid_addr; /* * How many aliases? * nextmsg contains size of * the addresses + 12 bytes(nextmessage, from address and the header) */ no_aliases = ((ntohs(m->v4.olsr_msgsize) - 12) / 4); /*printf("Aliases: %d\n", no_aliases); */ mmsg->mid_origaddr.v4.s_addr = m->v4.originator; mmsg->addr.v4.s_addr = m->v4.originator; /*seq number */ mmsg->mid_seqno = ntohs(m->v4.seqno); mmsg->mid_addr = NULL; /* Get vtime */ mmsg->vtime = me_to_reltime(m->v4.olsr_vtime); /*printf("Sequencenuber of MID from %s is %d\n", ip_to_string(&mmsg->addr), mmsg->mid_seqno); */ for (i = 0; i < no_aliases; i++) { alias = olsr_malloc(sizeof(struct mid_alias), "MID chgestruct"); alias->alias_addr.v4.s_addr = maddr->addr; alias->next = mmsg->mid_addr; mmsg->mid_addr = alias; maddr++; } if (olsr_cnf->debug_level > 1) { struct ipaddr_str buf; OLSR_PRINTF(3, "Alias list for %s: ", olsr_ip_to_string(&buf, &mmsg->mid_origaddr)); OLSR_PRINTF(3, "%s", olsr_ip_to_string(&buf, &mmsg->addr)); alias_tmp = mmsg->mid_addr; while (alias_tmp) { OLSR_PRINTF(3, " - %s", olsr_ip_to_string(&buf, &alias_tmp->alias_addr)); alias_tmp = alias_tmp->next; } OLSR_PRINTF(3, "\n"); } } else { /* IPv6 */ const struct midaddr6 *maddr6 = m->v6.message.mid.mid_addr; /* * How many aliases? * nextmsg contains size of * the addresses + 12 bytes(nextmessage, from address and the header) */ no_aliases = ((ntohs(m->v6.olsr_msgsize) - 12) / 16); /* NB 16 */ /*printf("Aliases: %d\n", no_aliases); */ mmsg->mid_origaddr.v6 = m->v6.originator; mmsg->addr.v6 = m->v6.originator; /*seq number */ mmsg->mid_seqno = ntohs(m->v6.seqno); mmsg->mid_addr = NULL; /* Get vtime */ mmsg->vtime = me_to_reltime(m->v6.olsr_vtime); /*printf("Sequencenuber of MID from %s is %d\n", ip_to_string(&mmsg->addr), mmsg->mid_seqno); */ for (i = 0; i < no_aliases; i++) { alias = olsr_malloc(sizeof(struct mid_alias), "MID chgestruct 2"); /*printf("Adding alias: %s\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&maddr6->addr)); */ alias->alias_addr.v6 = maddr6->addr; alias->next = mmsg->mid_addr; mmsg->mid_addr = alias; maddr6++; } if (olsr_cnf->debug_level > 1) { struct ipaddr_str buf; OLSR_PRINTF(3, "Alias list for %s", ip6_to_string(&buf, &mmsg->mid_origaddr.v6)); OLSR_PRINTF(3, "%s", ip6_to_string(&buf, &mmsg->addr.v6)); alias_tmp = mmsg->mid_addr; while (alias_tmp) { OLSR_PRINTF(3, " - %s", ip6_to_string(&buf, &alias_tmp->alias_addr.v6)); alias_tmp = alias_tmp->next; } OLSR_PRINTF(3, "\n"); } } } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/rebuild_packet.h000066400000000000000000000042621234304727700167400ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_REBUILD #define _OLSR_REBUILD #include "olsr_protocol.h" #include "packet.h" void mid_chgestruct(struct mid_message *, const union olsr_message *); void hello_chgestruct(struct hello_message *, const union olsr_message *); #endif /* _OLSR_REBUILD */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/routing_table.c000066400000000000000000000440701234304727700166150ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * RIB implementation (c) 2007, Hannes Gredler (hannes@gredler.at) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "routing_table.h" #include "ipcalc.h" #include "defs.h" #include "two_hop_neighbor_table.h" #include "tc_set.h" #include "mid_set.h" #include "neighbor_table.h" #include "olsr.h" #include "link_set.h" #include "common/avl.h" #include "olsr_spf.h" #include "net_olsr.h" #include /* Cookies */ struct olsr_cookie_info *rt_mem_cookie = NULL; struct olsr_cookie_info *rtp_mem_cookie = NULL; /* * Sven-Ola: if the current internet gateway is switched, the * NAT connection info is lost for any active TCP/UDP session. * For this reason, we do not want to switch if the advantage * is only minimal (cost of loosing all NATs is too high). * The following rt_path keeps track of the current inet gw. */ static struct rt_path *current_inetgw = NULL; /* Root of our RIB */ struct avl_tree routingtree; /* * Keep a version number for detecting outdated elements * in the per rt_entry rt_path subtree. */ unsigned int routingtree_version; /** * Bump the version number of the routing tree. * * After route-insertion compare the version number of the routes * against the version number of the table. * This is a lightweight detection if a node or prefix went away, * rather than brute force old vs. new rt_entry comparision. */ unsigned int olsr_bump_routingtree_version(void) { return routingtree_version++; } /** * avl_comp_ipv4_prefix * * compare two ipv4 prefixes. * first compare the prefixes, then * then compare the prefix lengths. * * return 0 if there is an exact match and * -1 / +1 depending on being smaller or bigger. */ int avl_comp_ipv4_prefix(const void *prefix1, const void *prefix2) { const struct olsr_ip_prefix *pfx1 = prefix1; const struct olsr_ip_prefix *pfx2 = prefix2; const uint32_t addr1 = ntohl(pfx1->prefix.v4.s_addr); const uint32_t addr2 = ntohl(pfx2->prefix.v4.s_addr); /* prefix */ if (addr1 < addr2) { return -1; } if (addr1 > addr2) { return +1; } /* prefix length */ if (pfx1->prefix_len < pfx2->prefix_len) { return -1; } if (pfx1->prefix_len > pfx2->prefix_len) { return +1; } return 0; } /** * avl_comp_ipv6_prefix * * compare two ipv6 prefixes. * first compare the prefixes, then * then compare the prefix lengths. * * return 0 if there is an exact match and * -1 / +1 depending on being smaller or bigger. */ int avl_comp_ipv6_prefix(const void *prefix1, const void *prefix2) { int res; const struct olsr_ip_prefix *pfx1 = prefix1; const struct olsr_ip_prefix *pfx2 = prefix2; /* prefix */ res = memcmp(&pfx1->prefix.v6, &pfx2->prefix.v6, 16); if (res != 0) { return res; } /* prefix length */ if (pfx1->prefix_len < pfx2->prefix_len) { return -1; } if (pfx1->prefix_len > pfx2->prefix_len) { return +1; } return 0; } /** * Initialize the routingtree and kernel change queues. */ void olsr_init_routing_table(void) { OLSR_PRINTF(5, "RIB: init routing tree\n"); /* the routing tree */ avl_init(&routingtree, avl_comp_prefix_default); routingtree_version = 0; /* * Get some cookies for memory stats and memory recycling. */ rt_mem_cookie = olsr_alloc_cookie("rt_entry", OLSR_COOKIE_TYPE_MEMORY); olsr_cookie_set_memory_size(rt_mem_cookie, sizeof(struct rt_entry)); rtp_mem_cookie = olsr_alloc_cookie("rt_path", OLSR_COOKIE_TYPE_MEMORY); olsr_cookie_set_memory_size(rtp_mem_cookie, sizeof(struct rt_path)); } /** * Look up a maxplen entry (= /32 or /128) in the routing table. * * @param dst the address of the entry * * @return a pointer to a rt_entry struct * representing the route entry. */ struct rt_entry * olsr_lookup_routing_table(const union olsr_ip_addr *dst) { struct avl_node *rt_tree_node; struct olsr_ip_prefix prefix; prefix.prefix = *dst; prefix.prefix_len = olsr_cnf->maxplen; rt_tree_node = avl_find(&routingtree, &prefix); return rt_tree_node ? rt_tree2rt(rt_tree_node) : NULL; } /** * Update gateway/interface/etx/hopcount and the version for a route path. */ void olsr_update_rt_path(struct rt_path *rtp, struct tc_entry *tc, struct link_entry *link) { rtp->rtp_version = routingtree_version; /* gateway */ rtp->rtp_nexthop.gateway = link->neighbor_iface_addr; /* interface */ rtp->rtp_nexthop.iif_index = link->inter->if_index; /* metric/etx */ rtp->rtp_metric.hops = tc->hops; rtp->rtp_metric.cost = tc->path_cost; } /** * Alloc and key a new rt_entry. */ static struct rt_entry * olsr_alloc_rt_entry(struct olsr_ip_prefix *prefix) { struct rt_entry *rt = olsr_cookie_malloc(rt_mem_cookie); if (!rt) { return NULL; } memset(rt, 0, sizeof(*rt)); /* Mark this entry as fresh (see process_routes.c:512) */ rt->rt_nexthop.iif_index = -1; /* set key and backpointer prior to tree insertion */ rt->rt_dst = *prefix; rt->rt_tree_node.key = &rt->rt_dst; avl_insert(&routingtree, &rt->rt_tree_node, AVL_DUP_NO); /* init the originator subtree */ avl_init(&rt->rt_path_tree, avl_comp_default); return rt; } /** * Alloc and key a new rt_path. */ static struct rt_path * olsr_alloc_rt_path(struct tc_entry *tc, struct olsr_ip_prefix *prefix, uint8_t origin) { struct rt_path *rtp = olsr_cookie_malloc(rtp_mem_cookie); if (!rtp) { return NULL; } memset(rtp, 0, sizeof(*rtp)); rtp->rtp_dst = *prefix; /* set key and backpointer prior to tree insertion */ rtp->rtp_prefix_tree_node.key = &rtp->rtp_dst; /* insert to the tc prefix tree */ avl_insert(&tc->prefix_tree, &rtp->rtp_prefix_tree_node, AVL_DUP_NO); olsr_lock_tc_entry(tc); /* backlink to the owning tc entry */ rtp->rtp_tc = tc; /* store the origin of the route */ rtp->rtp_origin = origin; return rtp; } /** * Create a route entry for a given rt_path and * insert it into the global RIB tree. */ void olsr_insert_rt_path(struct rt_path *rtp, struct tc_entry *tc, struct link_entry *link) { struct rt_entry *rt; struct avl_node *node; /* * no unreachable routes please. */ if (tc->path_cost == ROUTE_COST_BROKEN) { return; } /* * No bogus prefix lengths. */ if (rtp->rtp_dst.prefix_len > olsr_cnf->maxplen) { return; } /* * first check if there is a route_entry for the prefix. */ node = avl_find(&routingtree, &rtp->rtp_dst); if (!node) { /* no route entry yet */ rt = olsr_alloc_rt_entry(&rtp->rtp_dst); if (!rt) { return; } } else { rt = rt_tree2rt(node); } /* Now insert the rt_path to the owning rt_entry tree */ rtp->rtp_originator = tc->addr; /* set key and backpointer prior to tree insertion */ rtp->rtp_tree_node.key = &rtp->rtp_originator; /* insert to the route entry originator tree */ avl_insert(&rt->rt_path_tree, &rtp->rtp_tree_node, AVL_DUP_NO); /* backlink to the owning route entry */ rtp->rtp_rt = rt; /* update the version field and relevant parameters */ olsr_update_rt_path(rtp, tc, link); } /** * Unlink and free a rt_path. */ void olsr_delete_rt_path(struct rt_path *rtp) { /* remove from the originator tree */ if (rtp->rtp_rt) { avl_delete(&rtp->rtp_rt->rt_path_tree, &rtp->rtp_tree_node); rtp->rtp_rt = NULL; } /* remove from the tc prefix tree */ if (rtp->rtp_tc) { avl_delete(&rtp->rtp_tc->prefix_tree, &rtp->rtp_prefix_tree_node); olsr_unlock_tc_entry(rtp->rtp_tc); rtp->rtp_tc = NULL; } /* no current inet gw if the rt_path is removed */ if (current_inetgw == rtp) { current_inetgw = NULL; } olsr_cookie_free(rtp_mem_cookie, rtp); } /** * Check if there is an interface or gateway change. */ bool olsr_nh_change(const struct rt_nexthop *nh1, const struct rt_nexthop *nh2) { if (!ipequal(&nh1->gateway, &nh2->gateway) || (nh1->iif_index != nh2->iif_index)) { return true; } return false; } /** * Check if there is a hopcount change. */ bool olsr_hopcount_change(const struct rt_metric * met1, const struct rt_metric * met2) { return (met1->hops != met2->hops); } /** * Depending if flat_metric is configured and the kernel fib operation * return the hopcount metric of a route. * For adds this is the metric of best rour after olsr_rt_best() election, * for deletes this is the metric of the route that got stored in the rt_entry, * during route installation. */ uint8_t olsr_fib_metric(const struct rt_metric * met) { if (FIBM_CORRECT == olsr_cnf->fib_metric) { return met->hops; } return RT_METRIC_DEFAULT; } /** * depending on the operation (add/chg/del) the nexthop * field from the route entry or best route path shall be used. */ const struct rt_nexthop * olsr_get_nh(const struct rt_entry *rt) { if (rt->rt_best) { /* this is a route add/chg - grab nexthop from the best route. */ return &rt->rt_best->rtp_nexthop; } /* this is a route deletion - all routes are gone. */ return &rt->rt_nexthop; } /** * compare two route paths. * * returns TRUE if the first path is better * than the second one, FALSE otherwise. */ static bool olsr_cmp_rtp(const struct rt_path *rtp1, const struct rt_path *rtp2, const struct rt_path *inetgw) { olsr_linkcost etx1 = rtp1->rtp_metric.cost; olsr_linkcost etx2 = rtp2->rtp_metric.cost; if (inetgw == rtp1) etx1 *= olsr_cnf->lq_nat_thresh; if (inetgw == rtp2) etx2 *= olsr_cnf->lq_nat_thresh; /* etx comes first */ if (etx1 < etx2) { return true; } if (etx1 > etx2) { return false; } /* hopcount is next tie breaker */ if (rtp1->rtp_metric.hops < rtp2->rtp_metric.hops) { return true; } if (rtp1->rtp_metric.hops > rtp2->rtp_metric.hops) { return false; } /* originator (which is guaranteed to be unique) is final tie breaker */ if (memcmp(&rtp1->rtp_originator, &rtp2->rtp_originator, olsr_cnf->ipsize) < 0) { return true; } return false; } /** * compare the best path of two route entries. * * returns TRUE if the first entry is better * than the second one, FALSE otherwise. */ bool olsr_cmp_rt(const struct rt_entry * rt1, const struct rt_entry * rt2) { return olsr_cmp_rtp(rt1->rt_best, rt2->rt_best, NULL); } /** * run best route selection among a * set of identical prefixes. */ void olsr_rt_best(struct rt_entry *rt) { /* grab the first entry */ struct avl_node *node = avl_walk_first(&rt->rt_path_tree); assert(node != 0); /* should not happen */ rt->rt_best = rtp_tree2rtp(node); /* walk all remaining originator entries */ while ((node = avl_walk_next(node))) { struct rt_path *rtp = rtp_tree2rtp(node); if (olsr_cmp_rtp(rtp, rt->rt_best, current_inetgw)) { rt->rt_best = rtp; } } if (0 == rt->rt_dst.prefix_len) { current_inetgw = rt->rt_best; } } /** * Insert a prefix into the prefix tree hanging off a lsdb (tc) entry. * * Check if the candidate route (we call this a rt_path) is known, * if not create it. * Upon post-SPF processing (if the node is reachable) the prefix * will be finally inserted into the global RIB. * *@param dst the destination *@param plen the prefix length *@param originator the originating router *@param origin the origin of the route * *@return the new rt_path struct */ struct rt_path * olsr_insert_routing_table(union olsr_ip_addr *dst, int plen, union olsr_ip_addr *originator, int origin) { #ifdef DEBUG struct ipaddr_str dstbuf, origbuf; #endif /* DEBUG */ struct tc_entry *tc; struct rt_path *rtp; struct avl_node *node; struct olsr_ip_prefix prefix; /* * No bogus prefix lengths. */ if (plen > olsr_cnf->maxplen) { return NULL; } /* * For all routes we use the tc_entry as an hookup point. * If the tc_entry is disconnected, i.e. has no edges it will not * be explored during SPF run. */ tc = olsr_locate_tc_entry(originator); /* * first check if there is a rt_path for the prefix. */ prefix.prefix = *dst; prefix.prefix_len = plen; node = avl_find(&tc->prefix_tree, &prefix); if (!node) { /* no rt_path for this prefix yet */ rtp = olsr_alloc_rt_path(tc, &prefix, origin); if (!rtp) { return NULL; } #ifdef DEBUG OLSR_PRINTF(1, "RIB: add prefix %s/%u from %s\n", olsr_ip_to_string(&dstbuf, dst), plen, olsr_ip_to_string(&origbuf, originator)); #endif /* DEBUG */ /* overload the hna change bit for flagging a prefix change */ changes_hna = true; } else { rtp = rtp_prefix_tree2rtp(node); } return rtp; } /** * Delete a prefix from the prefix tree hanging off a lsdb (tc) entry. */ void olsr_delete_routing_table(union olsr_ip_addr *dst, int plen, union olsr_ip_addr *originator) { #ifdef DEBUG struct ipaddr_str dstbuf, origbuf; #endif /* DEBUG */ struct tc_entry *tc; struct rt_path *rtp; struct avl_node *node; struct olsr_ip_prefix prefix; /* * No bogus prefix lengths. */ if (plen > olsr_cnf->maxplen) { return; } tc = olsr_lookup_tc_entry(originator); if (!tc) { return; } /* * Grab the rt_path for the prefix. */ prefix.prefix = *dst; prefix.prefix_len = plen; node = avl_find(&tc->prefix_tree, &prefix); if (node) { rtp = rtp_prefix_tree2rtp(node); olsr_delete_rt_path(rtp); #ifdef DEBUG OLSR_PRINTF(1, "RIB: del prefix %s/%u from %s\n", olsr_ip_to_string(&dstbuf, dst), plen, olsr_ip_to_string(&origbuf, originator)); #endif /* DEBUG */ /* overload the hna change bit for flagging a prefix change */ changes_hna = true; } } /** * format a route entry into a buffer */ char * olsr_rt_to_string(const struct rt_entry *rt) { static char buff[128]; struct ipaddr_str prefixstr, gwstr; snprintf(buff, sizeof(buff), "%s/%u via %s", olsr_ip_to_string(&prefixstr, &rt->rt_dst.prefix), rt->rt_dst.prefix_len, olsr_ip_to_string(&gwstr, &rt->rt_nexthop.gateway)); return buff; } /** * format a route path into a buffer */ char * olsr_rtp_to_string(const struct rt_path *rtp) { static char buff[128]; struct ipaddr_str prefixstr, origstr, gwstr; struct rt_entry *rt = rtp->rtp_rt; struct lqtextbuffer lqbuffer; snprintf(buff, sizeof(buff), "%s/%u from %s via %s, " "cost %s, metric %u, v %u", olsr_ip_to_string(&prefixstr, &rt->rt_dst.prefix), rt->rt_dst.prefix_len, olsr_ip_to_string(&origstr, &rtp->rtp_originator), olsr_ip_to_string(&gwstr, &rtp->rtp_nexthop.gateway), get_linkcost_text(rtp->rtp_metric.cost, true, &lqbuffer), rtp->rtp_metric.hops, rtp->rtp_version); return buff; } /** * Print the routingtree to STDOUT * */ #ifndef NODEBUG void olsr_print_routing_table(struct avl_tree *tree) { /* The whole function makes no sense without it. */ struct avl_node *rt_tree_node; struct lqtextbuffer lqbuffer; OLSR_PRINTF(6, "ROUTING TABLE\n"); for (rt_tree_node = avl_walk_first(tree); rt_tree_node != NULL; rt_tree_node = avl_walk_next(rt_tree_node)) { struct avl_node *rtp_tree_node; struct ipaddr_str prefixstr, origstr, gwstr; struct rt_entry *rt = rt_tree2rt(rt_tree_node); /* first the route entry */ OLSR_PRINTF(6, "%s/%u, via %s, best-originator %s\n", olsr_ip_to_string(&prefixstr, &rt->rt_dst.prefix), rt->rt_dst.prefix_len, olsr_ip_to_string(&origstr, &rt->rt_nexthop.gateway), olsr_ip_to_string(&gwstr, &rt->rt_best->rtp_originator)); /* walk the per-originator path tree of routes */ for (rtp_tree_node = avl_walk_first(&rt->rt_path_tree); rtp_tree_node != NULL; rtp_tree_node = avl_walk_next(rtp_tree_node)) { struct rt_path *rtp = rtp_tree2rtp(rtp_tree_node); OLSR_PRINTF(6, "\tfrom %s, cost %s, metric %u, via %s, %s, v %u\n", olsr_ip_to_string(&origstr, &rtp->rtp_originator), get_linkcost_text(rtp->rtp_metric.cost, true, &lqbuffer), rtp->rtp_metric.hops, olsr_ip_to_string(&gwstr, &rtp-> rtp_nexthop. gateway), if_ifwithindex_name(rt->rt_nexthop.iif_index), rtp->rtp_version); } } tree = NULL; /* squelch compiler warnings */ } #endif /* NODEBUG */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/routing_table.h000066400000000000000000000206411234304727700166200ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * RIB implementation (c) 2007, Hannes Gredler (hannes@gredler.at) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_ROUTING_TABLE #define _OLSR_ROUTING_TABLE #include #include #include #include #include #include "hna_set.h" #include "link_set.h" #include "olsr_cookie.h" #include "common/avl.h" #include "common/list.h" #define NETMASK_HOST 0xffffffff #define NETMASK_DEFAULT 0x0 /* * the kernel FIB does not need to know the metric of a route. * this saves us from enqueuing/dequeueing hopcount only changes. */ #define RT_METRIC_DEFAULT 2 /* a composite metric is used for path selection */ struct rt_metric { olsr_linkcost cost; uint32_t hops; }; /* a nexthop is a pointer to a gateway router plus an interface */ struct rt_nexthop { union olsr_ip_addr gateway; /* gateway router */ int iif_index; /* outgoing interface index */ }; /* * Every prefix in our RIB needs a route entry that contains * the nexthop of the best path as installed in the kernel FIB. * The route entry is the root of a rt_path tree of equal prefixes * originated by different routers. It also contains a shortcut * for accessing the best route among all contributing routes. */ struct rt_entry { struct olsr_ip_prefix rt_dst; struct avl_node rt_tree_node; struct rt_path *rt_best; /* shortcut to the best path */ struct rt_nexthop rt_nexthop; /* nexthop of FIB route */ struct rt_metric rt_metric; /* metric of FIB route */ struct avl_tree rt_path_tree; struct list_node rt_change_node; /* queue for kernel FIB add/chg/del */ }; AVLNODE2STRUCT(rt_tree2rt, struct rt_entry, rt_tree_node); LISTNODE2STRUCT(changelist2rt, struct rt_entry, rt_change_node); /* * For every received route a rt_path is added to the RIB. * Depending on the results of the SPF calculation we perform a * best_path calculation and pick the one with the lowest etx/metric. * The rt_path gets first inserted into the per tc_entry prefix tree. * If during the SPF calculation the tc_entry becomes reachable via * a local nexthop it is inserted into the global RIB tree. */ struct rt_path { struct rt_entry *rtp_rt; /* backpointer to owning route head */ struct tc_entry *rtp_tc; /* backpointer to owning tc entry */ struct rt_nexthop rtp_nexthop; struct rt_metric rtp_metric; struct avl_node rtp_tree_node; /* global rtp node */ union olsr_ip_addr rtp_originator; /* originator of the route */ struct avl_node rtp_prefix_tree_node; /* tc entry rtp node */ struct olsr_ip_prefix rtp_dst; /* the prefix */ uint32_t rtp_version; /* for detection of outdated rt_paths */ uint8_t rtp_origin; /* internal, MID or HNA */ }; AVLNODE2STRUCT(rtp_tree2rtp, struct rt_path, rtp_tree_node); AVLNODE2STRUCT(rtp_prefix_tree2rtp, struct rt_path, rtp_prefix_tree_node); /* * In olsrd we have three different route types. * Internal routes are generated by simple reachability * of a node (by means of a tc message reception). * MID routes result from MID messages and HNA routes * from a gw routers HNA anncouncements. */ enum olsr_rt_origin { OLSR_RT_ORIGIN_MIN, OLSR_RT_ORIGIN_INT, OLSR_RT_ORIGIN_MID, OLSR_RT_ORIGIN_HNA, OLSR_RT_ORIGIN_MAX }; /* * OLSR_FOR_ALL_RT_ENTRIES * * macro for traversing the entire routing table. * it is recommended to use this because it hides all the internal * datastructure from the callers. * * the loop prefetches the next node in order to not loose context if * for example the caller wants to delete the current rt_entry. */ #define OLSR_FOR_ALL_RT_ENTRIES(rt) \ { \ struct avl_node *rt_tree_node, *next_rt_tree_node; \ for (rt_tree_node = avl_walk_first(&routingtree); \ rt_tree_node; rt_tree_node = next_rt_tree_node) { \ next_rt_tree_node = avl_walk_next(rt_tree_node); \ rt = rt_tree2rt(rt_tree_node); #define OLSR_FOR_ALL_RT_ENTRIES_END(rt) }} /* * OLSR_FOR_ALL_HNA_RT_ENTRIES * * macro for traversing the entire routing table and pick only * HNA routes. This is not optimal - however, If the RIBs become * too big one day then we keep an additional per origin tree * in order to speed up traversal. * In the meantime it is recommended to use this macro because * it hides all the internal datastructure from the callers * and the core maintainers do not have to update all the plugins * once we decide to change the datastructures. */ #define OLSR_FOR_ALL_HNA_RT_ENTRIES(rt) \ { \ struct avl_node *rt_tree_node, *next_rt_tree_node; \ for (rt_tree_node = avl_walk_first(&routingtree); \ rt_tree_node; rt_tree_node = next_rt_tree_node) { \ next_rt_tree_node = avl_walk_next(rt_tree_node); \ rt = rt_tree2rt(rt_tree_node); \ if (rt->rt_best->rtp_origin != OLSR_RT_ORIGIN_HNA) \ continue; #define OLSR_FOR_ALL_HNA_RT_ENTRIES_END(rt) }} /** * IPv4 <-> IPv6 wrapper */ union olsr_kernel_route { struct { struct sockaddr rt_dst; struct sockaddr rt_gateway; uint32_t metric; } v4; struct { struct in6_addr rtmsg_dst; struct in6_addr rtmsg_gateway; uint32_t rtmsg_metric; } v6; }; extern struct avl_tree routingtree; extern unsigned int routingtree_version; extern struct olsr_cookie_info *rt_mem_cookie; void olsr_init_routing_table(void); unsigned int olsr_bump_routingtree_version(void); int avl_comp_ipv4_prefix(const void *, const void *); int avl_comp_ipv6_prefix(const void *, const void *); void olsr_rt_best(struct rt_entry *); bool olsr_nh_change(const struct rt_nexthop *, const struct rt_nexthop *); bool olsr_hopcount_change(const struct rt_metric *, const struct rt_metric *); bool olsr_cmp_rt(const struct rt_entry *, const struct rt_entry *); uint8_t olsr_fib_metric(const struct rt_metric *); char *olsr_rt_to_string(const struct rt_entry *); char *olsr_rtp_to_string(const struct rt_path *); #ifndef NODEBUG void olsr_print_routing_table(struct avl_tree *); #else #define olsr_print_routing_table(x) do { } while(0) #endif const struct rt_nexthop *olsr_get_nh(const struct rt_entry *); /* rt_path manipulation */ struct rt_path *olsr_insert_routing_table(union olsr_ip_addr *, int, union olsr_ip_addr *, int); void olsr_delete_routing_table(union olsr_ip_addr *, int, union olsr_ip_addr *); void olsr_insert_rt_path(struct rt_path *, struct tc_entry *, struct link_entry *); void olsr_update_rt_path(struct rt_path *, struct tc_entry *, struct link_entry *); void olsr_delete_rt_path(struct rt_path *); struct rt_entry *olsr_lookup_routing_table(const union olsr_ip_addr *); #endif /* _OLSR_ROUTING_TABLE */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/scheduler.c000066400000000000000000000635771234304727700157520ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "scheduler.h" #include "log.h" #include "link_set.h" #include "olsr.h" #include "olsr_cookie.h" #include "net_os.h" #include "mpr_selector_set.h" #include #include #include #ifdef _WIN32 #define close(x) closesocket(x) #endif /* _WIN32 */ /* Timer data, global. Externed in scheduler.h */ uint32_t now_times; /* relative time compared to startup (in milliseconds */ struct timeval first_tv; /* timevalue during startup */ struct timeval last_tv; /* timevalue used for last olsr_times() calculation */ /* Hashed root of all timers */ static struct list_node timer_wheel[TIMER_WHEEL_SLOTS]; static uint32_t timer_last_run; /* remember the last timeslot walk */ /* Memory cookie for the block based memory manager */ static struct olsr_cookie_info *timer_mem_cookie = NULL; /* Head of all OLSR used sockets */ static struct list_node socket_head = { &socket_head, &socket_head }; /* Prototypes */ static void walk_timers(uint32_t *); static void poll_sockets(void); static uint32_t calc_jitter(unsigned int rel_time, uint8_t jitter_pct, unsigned int random_val); /* * A wrapper around times(2). Note, that this function has some * portability problems, so do not rely on absolute values returned. * Under Linux, uclibc and libc directly call the sys_times() located * in kernel/sys.c and will only return an error if the tms_buf is * not writeable. */ static uint32_t olsr_times(void) { struct timeval tv; uint32_t t; if (gettimeofday(&tv, NULL) != 0) { olsr_exit("OS clock is not working, have to shut down OLSR", 1); } /* test if time jumped backward or more than 60 seconds forward */ if (tv.tv_sec < last_tv.tv_sec || (tv.tv_sec == last_tv.tv_sec && tv.tv_usec < last_tv.tv_usec) || tv.tv_sec - last_tv.tv_sec > 60) { OLSR_PRINTF(1, "Time jump (%d.%06d to %d.%06d)\n", (int32_t) (last_tv.tv_sec), (int32_t) (last_tv.tv_usec), (int32_t) (tv.tv_sec), (int32_t) (tv.tv_usec)); t = (last_tv.tv_sec - first_tv.tv_sec) * 1000 + (last_tv.tv_usec - first_tv.tv_usec) / 1000; t++; /* advance time by one millisecond */ first_tv = tv; first_tv.tv_sec -= (t / 1000); first_tv.tv_usec -= ((t % 1000) * 1000); if (first_tv.tv_usec < 0) { first_tv.tv_sec--; first_tv.tv_usec += 1000000; } last_tv = tv; return t; } last_tv = tv; return (tv.tv_sec - first_tv.tv_sec) * 1000 + (tv.tv_usec - first_tv.tv_usec) / 1000; } /** * Returns a timestamp s seconds in the future */ uint32_t olsr_getTimestamp(uint32_t s) { return now_times + s; } /** * Returns the number of milliseconds until the timestamp will happen */ int32_t olsr_getTimeDue(uint32_t s) { uint32_t diff; if (s > now_times) { diff = s - now_times; /* overflow ? */ if (diff > (1u << 31)) { return -(int32_t) (0xffffffff - diff); } return (int32_t) (diff); } diff = now_times - s; /* overflow ? */ if (diff > (1u << 31)) { return (int32_t) (0xffffffff - diff); } return -(int32_t) (diff); } bool olsr_isTimedOut(uint32_t s) { if (s > now_times) { return s - now_times > (1u << 31); } return now_times - s <= (1u << 31); } /** * Add a socket and handler to the socketset * beeing used in the main select(2) loop * in listen_loop * *@param fd the socket *@param pf_pr the processing function *@param pf_imm the (immediate) processing function *@param data the data pointer for the processing function *@param flags the flags for the processing function */ void add_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, void *data, unsigned int flags) { struct olsr_socket_entry *new_entry; if (fd < 0 || (pf_pr == NULL && pf_imm == NULL)) { OLSR_PRINTF(1, "Bogus socket entry - not registering..."); return; } OLSR_PRINTF(3, "Adding OLSR socket entry %d\n", fd); new_entry = olsr_malloc(sizeof(*new_entry), "Socket entry"); new_entry->fd = fd; new_entry->process_immediate = pf_imm; new_entry->process_pollrate = pf_pr; new_entry->data = data; new_entry->flags = flags; /* Queue */ list_node_init(&new_entry->socket_node); list_add_before(&socket_head, &new_entry->socket_node); } /** * Remove a socket and handler to the socketset * beeing used in the main select(2) loop * in listen_loop * *@param fd the socket *@param pf_pr the processing function *@param pf_imm the (immediate) processing function */ int remove_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func pf_imm) { struct olsr_socket_entry *entry; if (fd < 0 || (pf_pr == NULL && pf_imm == NULL)) { OLSR_PRINTF(1, "Bogus socket entry - not processing..."); return 0; } OLSR_PRINTF(3, "Removing OLSR socket entry %d\n", fd); OLSR_FOR_ALL_SOCKETS(entry) { if (entry->fd == fd && entry->process_immediate == pf_imm && entry->process_pollrate == pf_pr) { /* just mark this node as "deleted", it will be cleared later at the end of handle_fds() */ entry->process_immediate = NULL; entry->process_pollrate = NULL; entry->flags = 0; return 1; } } OLSR_FOR_ALL_SOCKETS_END(entry); return 0; } void enable_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, unsigned int flags) { struct olsr_socket_entry *entry; OLSR_FOR_ALL_SOCKETS(entry) { if (entry->fd == fd && entry->process_immediate == pf_imm && entry->process_pollrate == pf_pr) { entry->flags |= flags; } } OLSR_FOR_ALL_SOCKETS_END(entry); } void disable_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, unsigned int flags) { struct olsr_socket_entry *entry; OLSR_FOR_ALL_SOCKETS(entry) { if (entry->fd == fd && entry->process_immediate == pf_imm && entry->process_pollrate == pf_pr) { entry->flags &= ~flags; } } OLSR_FOR_ALL_SOCKETS_END(entry); } /** * Close and free all sockets. */ void olsr_flush_sockets(void) { struct olsr_socket_entry *entry; OLSR_FOR_ALL_SOCKETS(entry) { close(entry->fd); list_remove(&entry->socket_node); free(entry); } OLSR_FOR_ALL_SOCKETS_END(entry); } static void poll_sockets(void) { int n; struct olsr_socket_entry *entry; fd_set ibits, obits; struct timeval tvp = { 0, 0 }; int hfd = 0, fdsets = 0; /* If there are no registered sockets we * do not call select(2) */ if (list_is_empty(&socket_head)) { return; } FD_ZERO(&ibits); FD_ZERO(&obits); /* Adding file-descriptors to FD set */ OLSR_FOR_ALL_SOCKETS(entry) { if (entry->process_pollrate == NULL) { continue; } if ((entry->flags & SP_PR_READ) != 0) { fdsets |= SP_PR_READ; FD_SET((unsigned int)entry->fd, &ibits); /* And we cast here since we get a warning on Win32 */ } if ((entry->flags & SP_PR_WRITE) != 0) { fdsets |= SP_PR_WRITE; FD_SET((unsigned int)entry->fd, &obits); /* And we cast here since we get a warning on Win32 */ } if ((entry->flags & (SP_PR_READ | SP_PR_WRITE)) != 0 && entry->fd >= hfd) { hfd = entry->fd + 1; } } OLSR_FOR_ALL_SOCKETS_END(entry); /* Running select on the FD set */ do { n = olsr_select(hfd, fdsets & SP_PR_READ ? &ibits : NULL, fdsets & SP_PR_WRITE ? &obits : NULL, NULL, &tvp); } while (n == -1 && errno == EINTR); if (n == 0) { return; } if (n == -1) { /* Did something go wrong? */ OLSR_PRINTF(1, "select error: %s", strerror(errno)); return; } /* Update time since this is much used by the parsing functions */ now_times = olsr_times(); OLSR_FOR_ALL_SOCKETS(entry) { int flags; if (entry->process_pollrate == NULL) { continue; } flags = 0; if (FD_ISSET(entry->fd, &ibits)) { flags |= SP_PR_READ; } if (FD_ISSET(entry->fd, &obits)) { flags |= SP_PR_WRITE; } if (flags != 0) { entry->process_pollrate(entry->fd, entry->data, flags); } } OLSR_FOR_ALL_SOCKETS_END(entry); } static void handle_fds(uint32_t next_interval) { struct olsr_socket_entry *entry; struct timeval tvp; int32_t remaining; /* calculate the first timeout */ now_times = olsr_times(); remaining = TIME_DUE(next_interval); if (remaining <= 0) { /* we are already over the interval */ if (list_is_empty(&socket_head)) { /* If there are no registered sockets we do not call select(2) */ return; } tvp.tv_sec = 0; tvp.tv_usec = 0; } else { /* we need an absolute time - milliseconds */ tvp.tv_sec = remaining / MSEC_PER_SEC; tvp.tv_usec = (remaining % MSEC_PER_SEC) * USEC_PER_MSEC; } /* do at least one select */ for (;;) { fd_set ibits, obits; int n, hfd = 0, fdsets = 0; FD_ZERO(&ibits); FD_ZERO(&obits); /* Adding file-descriptors to FD set */ OLSR_FOR_ALL_SOCKETS(entry) { if (entry->process_immediate == NULL) { continue; } if ((entry->flags & SP_IMM_READ) != 0) { fdsets |= SP_IMM_READ; FD_SET((unsigned int)entry->fd, &ibits); /* And we cast here since we get a warning on Win32 */ } if ((entry->flags & SP_IMM_WRITE) != 0) { fdsets |= SP_IMM_WRITE; FD_SET((unsigned int)entry->fd, &obits); /* And we cast here since we get a warning on Win32 */ } if ((entry->flags & (SP_IMM_READ | SP_IMM_WRITE)) != 0 && entry->fd >= hfd) { hfd = entry->fd + 1; } } OLSR_FOR_ALL_SOCKETS_END(entry); if (hfd == 0 && (long)remaining <= 0) { /* we are over the interval and we have no fd's. Skip the select() etc. */ break; } do { n = olsr_select(hfd, fdsets & SP_IMM_READ ? &ibits : NULL, fdsets & SP_IMM_WRITE ? &obits : NULL, NULL, &tvp); } while (n == -1 && errno == EINTR); if (n == 0) { /* timeout! */ break; } if (n == -1) { /* Did something go wrong? */ OLSR_PRINTF(1, "select error: %s", strerror(errno)); break; } /* Update time since this is much used by the parsing functions */ now_times = olsr_times(); OLSR_FOR_ALL_SOCKETS(entry) { int flags; if (entry->process_immediate == NULL) { continue; } flags = 0; if (FD_ISSET(entry->fd, &ibits)) { flags |= SP_IMM_READ; } if (FD_ISSET(entry->fd, &obits)) { flags |= SP_IMM_WRITE; } if (flags != 0) { entry->process_immediate(entry->fd, entry->data, flags); } } OLSR_FOR_ALL_SOCKETS_END(entry); /* calculate the next timeout */ remaining = TIME_DUE(next_interval); if (remaining <= 0) { /* we are already over the interval */ break; } /* we need an absolute time - milliseconds */ tvp.tv_sec = remaining / MSEC_PER_SEC; tvp.tv_usec = (remaining % MSEC_PER_SEC) * USEC_PER_MSEC; } OLSR_FOR_ALL_SOCKETS(entry) { if (entry->process_immediate == NULL && entry->process_pollrate == NULL) { /* clean up socket handler */ list_remove(&entry->socket_node); free(entry); } } OLSR_FOR_ALL_SOCKETS_END(entry); } /** * Main scheduler event loop. Polls at every * sched_poll_interval and calls all functions * that are timed out or that are triggered. * Also calls the olsr_process_changes() * function at every poll. * * @return nada */ void __attribute__ ((noreturn)) olsr_scheduler(void) { OLSR_PRINTF(1, "Scheduler started - polling every %d ms\n", (int)(olsr_cnf->pollrate*1000)); /* Main scheduler loop */ while (true) { uint32_t next_interval; /* * Update the global timestamp. We are using a non-wallclock timer here * to avoid any undesired side effects if the system clock changes. */ now_times = olsr_times(); next_interval = GET_TIMESTAMP(olsr_cnf->pollrate * 1000); /* Read incoming data */ poll_sockets(); /* Process timers */ walk_timers(&timer_last_run); /* Update */ olsr_process_changes(); /* Check for changes in topology */ if (link_changes) { increase_local_ansn(); OLSR_PRINTF(3, "ANSN UPDATED %d\n\n", get_local_ansn()); link_changes = false; } /* Read incoming data and handle it immediiately */ handle_fds(next_interval); #ifdef _WIN32 if (olsr_win32_end_request) { olsr_win32_end_flag = true; } #endif /* _WIN32 */ } } /** * Decrement a relative timer by a random number range. * * @param rel_time the relative timer expressed in units of milliseconds. * @param jitter_pct the jitter in percent * @param random_val cached result of random() at system init. * @return the absolute timer in system clock tick units */ static uint32_t calc_jitter(unsigned int rel_time, uint8_t jitter_pct, unsigned int random_val) { unsigned int jitter_time; /* * No jitter or, jitter larger than 99% does not make sense. * Also protect against overflows resulting from > 25 bit timers. */ if (jitter_pct == 0 || jitter_pct > 99 || rel_time > (1 << 24)) { return GET_TIMESTAMP(rel_time); } /* * Play some tricks to avoid overflows with integer arithmetic. */ jitter_time = (jitter_pct * rel_time) / 100; jitter_time = random_val / (1 + RAND_MAX / (jitter_time + 1)); OLSR_PRINTF(3, "TIMER: jitter %u%% rel_time %ums to %ums\n", jitter_pct, rel_time, rel_time - jitter_time); return GET_TIMESTAMP(rel_time - jitter_time); } /** * Init datastructures for maintaining timers. */ void olsr_init_timers(void) { int idx; OLSR_PRINTF(3, "Initializing scheduler.\n"); /* Grab initial timestamp */ if (gettimeofday(&first_tv, NULL)) { olsr_exit("OS clock is not working, have to shut down OLSR", 1); } last_tv = first_tv; now_times = olsr_times(); for (idx = 0; idx < TIMER_WHEEL_SLOTS; idx++) { list_head_init(&timer_wheel[idx]); } /* * Reset the last timer run. */ timer_last_run = now_times; /* Allocate a cookie for the block based memeory manager. */ timer_mem_cookie = olsr_alloc_cookie("timer_entry", OLSR_COOKIE_TYPE_MEMORY); olsr_cookie_set_memory_size(timer_mem_cookie, sizeof(struct timer_entry)); } /** * Walk through the timer list and check if any timer is ready to fire. * Callback the provided function with the context pointer. */ static void walk_timers(uint32_t * last_run) { unsigned int total_timers_walked = 0, total_timers_fired = 0; unsigned int wheel_slot_walks = 0; /* * Check the required wheel slots since the last time a timer walk was invoked, * or check *all* the wheel slots, whatever is less work. * The latter is meant as a safety belt if the scheduler falls behind. */ while ((*last_run <= now_times) && (wheel_slot_walks < TIMER_WHEEL_SLOTS)) { struct list_node tmp_head_node; /* keep some statistics */ unsigned int timers_walked = 0, timers_fired = 0; /* Get the hash slot for this clocktick */ struct list_node *const timer_head_node = &timer_wheel[*last_run & TIMER_WHEEL_MASK]; /* Walk all entries hanging off this hash bucket. We treat this basically as a stack * so that we always know if and where the next element is. */ list_head_init(&tmp_head_node); while (!list_is_empty(timer_head_node)) { /* the top element */ struct list_node *const timer_node = timer_head_node->next; struct timer_entry *const timer = list2timer(timer_node); /* * Dequeue and insert to a temporary list. * We do this to avoid loosing our walking context when * multiple timers fire. */ list_remove(timer_node); list_add_after(&tmp_head_node, timer_node); timers_walked++; /* Ready to fire ? */ if (TIMED_OUT(timer->timer_clock)) { OLSR_PRINTF(7, "TIMER: fire %s timer %p, ctx %p, " "at clocktick %u (%s)\n", timer->timer_cookie->ci_name, timer, timer->timer_cb_context, (unsigned int)*last_run, olsr_wallclock_string()); /* This timer is expired, call into the provided callback function */ timer->timer_cb(timer->timer_cb_context); /* Only act on actually running timers */ if (timer->timer_flags & OLSR_TIMER_RUNNING) { /* * Don't restart the periodic timer if the callback function has * stopped the timer. */ if (timer->timer_period) { /* For periodical timers, rehash the random number and restart */ timer->timer_random = random(); olsr_change_timer(timer, timer->timer_period, timer->timer_jitter_pct, OLSR_TIMER_PERIODIC); } else { /* Singleshot timers are stopped */ olsr_stop_timer(timer); } } timers_fired++; } } /* * Now merge the temporary list back to the old bucket. */ list_merge(timer_head_node, &tmp_head_node); /* keep some statistics */ total_timers_walked += timers_walked; total_timers_fired += timers_fired; /* Increment the time slot and wheel slot walk iteration */ (*last_run)++; wheel_slot_walks++; } OLSR_PRINTF(7, "TIMER: processed %4u/%d clockwheel slots, " "timers walked %4u/%u, timers fired %u\n", wheel_slot_walks, TIMER_WHEEL_SLOTS, total_timers_walked, timer_mem_cookie->ci_usage, total_timers_fired); /* * If the scheduler has slipped and we have walked all wheel slots, * reset the last timer run. */ *last_run = now_times; } /** * Stop and delete all timers. */ void olsr_flush_timers(void) { struct list_node *timer_head_node; unsigned int wheel_slot = 0; for (wheel_slot = 0; wheel_slot < TIMER_WHEEL_SLOTS; wheel_slot++) { timer_head_node = &timer_wheel[wheel_slot & TIMER_WHEEL_MASK]; /* Kill all entries hanging off this hash bucket. */ while (!list_is_empty(timer_head_node)) { olsr_stop_timer(list2timer(timer_head_node->next)); } } } /** * Returns the difference between gmt and local time in seconds. * Use gmtime() and localtime() to keep things simple. * * taken and slightly modified from www.tcpdump.org. */ static int olsr_get_timezone(void) { #define OLSR_TIMEZONE_UNINITIALIZED -1 static int time_diff = OLSR_TIMEZONE_UNINITIALIZED; if (time_diff == OLSR_TIMEZONE_UNINITIALIZED) { int dir; const time_t t = time(NULL); const struct tm gmt = *gmtime(&t); const struct tm *loc = localtime(&t); time_diff = (loc->tm_hour - gmt.tm_hour) * 60 * 60 + (loc->tm_min - gmt.tm_min) * 60; /* * If the year or julian day is different, we span 00:00 GMT * and must add or subtract a day. Check the year first to * avoid problems when the julian day wraps. */ dir = loc->tm_year - gmt.tm_year; if (!dir) { dir = loc->tm_yday - gmt.tm_yday; } time_diff += dir * 24 * 60 * 60; } return time_diff; } /** * Format an absolute wallclock system time string. * May be called upto 4 times in a single printf() statement. * Displays microsecond resolution. * * @return buffer to a formatted system time string. */ const char * olsr_wallclock_string(void) { static char buf[sizeof("00:00:00.000000")]; struct timeval now; int sec, usec; gettimeofday(&now, NULL); sec = (int)now.tv_sec + olsr_get_timezone(); usec = (int)now.tv_usec; snprintf(buf, sizeof(buf), "%02d:%02d:%02d.%06d", (sec % 86400) / 3600, (sec % 3600) / 60, sec % 60, usec); return buf; } /** * Format an relative non-wallclock system time string. * May be called upto 4 times in a single printf() statement. * Displays millisecond resolution. * * @param clk absolute time expressed in clockticks * @return buffer to a formatted system time string. */ const char * olsr_clock_string(uint32_t clk) { static char buf[sizeof("00:00:00.000")]; /* On most systems a clocktick is a 10ms quantity. */ unsigned int msec = clk % 1000; unsigned int sec = clk / 1000; snprintf(buf, sizeof(buf), "%02u:%02u:%02u.%03u", sec / 3600, (sec % 3600) / 60, (sec % 60), (msec % MSEC_PER_SEC)); return buf; } /** * Start a new timer. * * @param rel_time relative time expressed in milliseconds * @param jitter_pct jitter expressed in percent * @param periodical true for a repeating timer, false for a one-shot timer * @param cb_func timer callback function * @param context context for the callback function * @param ci timer cookie * @return a pointer to the created entry */ struct timer_entry * olsr_start_timer(unsigned int rel_time, uint8_t jitter_pct, bool periodical, timer_cb_func cb_func, void *context, struct olsr_cookie_info *ci) { struct timer_entry *timer; if (ci == NULL) { ci = def_timer_ci; } assert(cb_func); timer = olsr_cookie_malloc(timer_mem_cookie); /* * Compute random numbers only once. */ if (!timer->timer_random) { timer->timer_random = random(); } /* Fill entry */ timer->timer_clock = calc_jitter(rel_time, jitter_pct, timer->timer_random); timer->timer_cb = cb_func; timer->timer_cb_context = context; timer->timer_jitter_pct = jitter_pct; timer->timer_flags = OLSR_TIMER_RUNNING; /* The cookie is used for debugging to traceback the originator */ timer->timer_cookie = ci; olsr_cookie_usage_incr(ci->ci_id); /* Singleshot or periodical timer ? */ timer->timer_period = periodical ? rel_time : 0; /* * Now insert in the respective timer_wheel slot. */ list_add_before(&timer_wheel[timer->timer_clock & TIMER_WHEEL_MASK], &timer->timer_list); OLSR_PRINTF(7, "TIMER: start %s timer %p firing in %s, ctx %p\n", ci->ci_name, timer, olsr_clock_string(timer->timer_clock), context); return timer; } /** * Delete a timer. * * @param timer the timer_entry that shall be removed */ void olsr_stop_timer(struct timer_entry *timer) { /* It's okay to get a NULL here */ if (!timer) { return; } assert(timer->timer_cookie); /* we want timer cookies everywhere */ OLSR_PRINTF(7, "TIMER: stop %s timer %p, ctx %p\n", timer->timer_cookie->ci_name, timer, timer->timer_cb_context); /* * Carve out of the existing wheel_slot and free. */ list_remove(&timer->timer_list); timer->timer_flags &= ~OLSR_TIMER_RUNNING; olsr_cookie_usage_decr(timer->timer_cookie->ci_id); olsr_cookie_free(timer_mem_cookie, timer); } /** * Change a timer_entry. * * @param timer timer_entry to be changed. * @param rel_time new relative time expressed in units of milliseconds. * @param jitter_pct new jitter expressed in percent. * @param periodical true for a repeating timer, false for a one-shot timer */ void olsr_change_timer(struct timer_entry *timer, unsigned int rel_time, uint8_t jitter_pct, bool periodical) { /* Sanity check. */ if (!timer) { return; } assert(timer->timer_cookie); /* we want timer cookies everywhere */ /* Singleshot or periodical timer ? */ timer->timer_period = periodical ? rel_time : 0; timer->timer_clock = calc_jitter(rel_time, jitter_pct, timer->timer_random); timer->timer_jitter_pct = jitter_pct; /* * Changes are easy: Remove timer from the exisiting timer_wheel slot * and reinsert into the new slot. */ list_remove(&timer->timer_list); list_add_before(&timer_wheel[timer->timer_clock & TIMER_WHEEL_MASK], &timer->timer_list); OLSR_PRINTF(7, "TIMER: change %s timer %p, firing to %s, ctx %p\n", timer->timer_cookie->ci_name, timer, olsr_clock_string(timer->timer_clock), timer->timer_cb_context); } /* * This is the one stop shop for all sort of timer manipulation. * Depending on the paseed in parameters a new timer is started, * or an existing timer is started or an existing timer is * terminated. */ void olsr_set_timer(struct timer_entry **timer_ptr, unsigned int rel_time, uint8_t jitter_pct, bool periodical, timer_cb_func cb_func, void *context, struct olsr_cookie_info *cookie) { if (cookie) { cookie = def_timer_ci; } if (rel_time == 0) { /* No good future time provided, kill it. */ olsr_stop_timer(*timer_ptr); *timer_ptr = NULL; } else if ((*timer_ptr) == NULL) { /* No timer running, kick it. */ *timer_ptr = olsr_start_timer(rel_time, jitter_pct, periodical, cb_func, context, cookie); } else { olsr_change_timer(*timer_ptr, rel_time, jitter_pct, periodical); } } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/scheduler.h000066400000000000000000000150721234304727700157420ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_SCHEDULER #define _OLSR_SCHEDULER #include "common/list.h" #include "olsr_types.h" #include /* Some defs for juggling with timers */ #define MSEC_PER_SEC 1000 #define USEC_PER_SEC 1000000 #define NSEC_PER_USEC 1000 #define USEC_PER_MSEC 1000 #define TIMER_WHEEL_SLOTS 1024 #define TIMER_WHEEL_MASK (TIMER_WHEEL_SLOTS - 1) typedef void (*timer_cb_func) (void *); /* callback function */ /* * Our timer implementation is a based on individual timers arranged in * a double linked list hanging of hash containers called a timer wheel slot. * For every timer a timer_entry is created and attached to the timer wheel slot. * When the timer fires, the timer_cb function is called with the * context pointer. * The implementation supports periodic and oneshot timers. * For a periodic timer the timer_period field is set to non zero, * which causes the timer to run forever until manually stopped. */ struct timer_entry { struct list_node timer_list; /* Wheel membership */ uint32_t timer_clock; /* when timer shall fire (absolute time) */ unsigned int timer_period; /* set for periodical timers (relative time) */ struct olsr_cookie_info *timer_cookie; /* used for diag stuff */ uint8_t timer_jitter_pct; /* the jitter expressed in percent */ uint8_t timer_flags; /* misc flags */ unsigned int timer_random; /* cache random() result for performance reasons */ timer_cb_func timer_cb; /* callback function */ void *timer_cb_context; /* context pointer */ }; /* inline to recast from timer_list back to timer_entry */ LISTNODE2STRUCT(list2timer, struct timer_entry, timer_list); #define OLSR_TIMER_ONESHOT 0 /* One shot timer */ #define OLSR_TIMER_PERIODIC 1 /* Periodic timer */ /* Timer flags */ #define OLSR_TIMER_RUNNING ( 1 << 0) /* this timer is running */ /* Timers */ void olsr_init_timers(void); void olsr_flush_timers(void); void olsr_set_timer (struct timer_entry **, unsigned int, uint8_t, bool, timer_cb_func, void *, struct olsr_cookie_info *); struct timer_entry *olsr_start_timer (unsigned int, uint8_t, bool, timer_cb_func, void *, struct olsr_cookie_info *); void olsr_change_timer(struct timer_entry *, unsigned int, uint8_t, bool); void olsr_stop_timer (struct timer_entry *); /* Printing timestamps */ const char *olsr_clock_string(uint32_t); const char *olsr_wallclock_string(void); /* Main scheduler loop */ void olsr_scheduler(void); /* * Provides a timestamp s1 milliseconds in the future */ #define GET_TIMESTAMP(s1) olsr_getTimestamp(s1) /* Compute the time in milliseconds when a timestamp will expire. */ #define TIME_DUE(s1) olsr_getTimeDue(s1) /* Returns TRUE if a timestamp is expired */ #define TIMED_OUT(s1) olsr_isTimedOut(s1) /* Timer data */ extern uint32_t now_times; /* current idea of times(2) reported uptime */ #define SP_PR_READ 0x01 #define SP_PR_WRITE 0x02 #define SP_IMM_READ 0x04 #define SP_IMM_WRITE 0x08 typedef void (*socket_handler_func) (int fd, void *data, unsigned int flags); struct olsr_socket_entry { int fd; socket_handler_func process_immediate; socket_handler_func process_pollrate; void *data; unsigned int flags; struct list_node socket_node; }; LISTNODE2STRUCT(list2socket, struct olsr_socket_entry, socket_node); /* deletion safe macro for socket list traversal */ #define OLSR_FOR_ALL_SOCKETS(socket) \ { \ struct list_node *_socket_node, *_next_socket_node; \ for (_socket_node = socket_head.next; \ _socket_node != &socket_head; \ _socket_node = _next_socket_node) { \ _next_socket_node = _socket_node->next; \ socket = list2socket(_socket_node); #define OLSR_FOR_ALL_SOCKETS_END(socket) }} uint32_t olsr_getTimestamp (uint32_t s); int32_t olsr_getTimeDue (uint32_t s); bool olsr_isTimedOut (uint32_t s); void add_olsr_socket (int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, void *data, unsigned int flags); int remove_olsr_socket (int fd, socket_handler_func pf_pr, socket_handler_func pf_imm); void olsr_flush_sockets(void); void enable_olsr_socket (int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, unsigned int flags); void disable_olsr_socket (int fd, socket_handler_func pf_pr, socket_handler_func pf_imm, unsigned int flags); /* * a wrapper around times(2). times(2) has the problem, that it may return -1 * in case of an err (e.g. EFAULT on the parameter) or immediately before an * overrun (though it is not en error) just because the jiffies (or whatever * the underlying kernel calls the smallest accountable time unit) are * inherently "unsigned" (and always incremented). */ #endif /* _OLSR_SCHEDULER */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/tc_set.c000066400000000000000000000607411234304727700152430ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * LSDB rewrite (c) 2007, Hannes Gredler (hannes@gredler.at) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "tc_set.h" #include "ipcalc.h" #include "mid_set.h" #include "link_set.h" #include "olsr.h" #include "scheduler.h" #include "olsr_spf.h" #include "common/avl.h" #include "lq_packet.h" #include "net_olsr.h" #include "lq_plugin.h" #include "olsr_cookie.h" #include "duplicate_set.h" #include "gateway.h" #include /* Root of the link state database */ struct avl_tree tc_tree; struct tc_entry *tc_myself; /* Shortcut to ourselves */ /* Some cookies for stats keeping */ struct olsr_cookie_info *tc_edge_gc_timer_cookie = NULL; struct olsr_cookie_info *tc_validity_timer_cookie = NULL; struct olsr_cookie_info *tc_edge_mem_cookie = NULL; struct olsr_cookie_info *tc_mem_cookie = NULL; /* * Sven-Ola 2007-Dec: These four constants include an assumption * on how long a typical olsrd mesh memorizes (TC) messages in the * RAM of all nodes and how many neighbour changes between TC msgs. * In Berlin, we encounter hop values up to 70 which means that * messages may live up to ~15 minutes cycling between nodes and * obviously breaking out of the timeout_dup() jail. It may be more * correct to dynamically adapt those constants, e.g. by using the * max hop number (denotes size-of-mesh) in some form or maybe * a factor indicating how many (old) versions of olsrd are on. */ /* Value window for ansn, identifies old messages to be ignored */ #define TC_ANSN_WINDOW 256 /* Value window for seqno, identifies old messages to be ignored */ #define TC_SEQNO_WINDOW 1024 /* Enlarges the value window for upcoming ansn/seqno to be accepted */ #define TC_ANSN_WINDOW_MULT 4 /* Enlarges the value window for upcoming ansn/seqno to be accepted */ #define TC_SEQNO_WINDOW_MULT 8 static bool olsr_seq_inrange_low(int beg, int end, uint16_t seq) { if (beg < 0) { if (seq >= (uint16_t) beg || seq < end) { return true; } } else if (end >= 0x10000) { if (seq >= beg || seq < (uint16_t) end) { return true; } } else if (seq >= beg && seq < end) { return true; } return false; } static bool olsr_seq_inrange_high(int beg, int end, uint16_t seq) { if (beg < 0) { if (seq > (uint16_t) beg || seq <= end) { return true; } } else if (end >= 0x10000) { if (seq > beg || seq <= (uint16_t) end) { return true; } } else if (seq > beg && seq <= end) { return true; } return false; } /** * Add a new tc_entry to the tc tree * * @param adr (last)adr address of the entry * @return a pointer to the created entry */ static struct tc_entry * olsr_add_tc_entry(union olsr_ip_addr *adr) { #ifdef DEBUG struct ipaddr_str buf; #endif /* DEBUG */ struct tc_entry *tc; /* * Safety net against loss of the last main IP address. */ if (ipequal(&olsr_cnf->main_addr, &all_zero)) { return NULL; } #ifdef DEBUG OLSR_PRINTF(1, "TC: add entry %s\n", olsr_ip_to_string(&buf, adr)); #endif /* DEBUG */ tc = olsr_cookie_malloc(tc_mem_cookie); if (!tc) { return NULL; } /* Fill entry */ tc->addr = *adr; tc->vertex_node.key = &tc->addr; /* * Insert into the global tc tree. */ avl_insert(&tc_tree, &tc->vertex_node, AVL_DUP_NO); olsr_lock_tc_entry(tc); /* * Initialize subtrees for edges and prefixes. */ avl_init(&tc->edge_tree, avl_comp_default); avl_init(&tc->prefix_tree, avl_comp_prefix_default); /* * Add a rt_path for ourselves. */ olsr_insert_routing_table(adr, olsr_cnf->maxplen, adr, OLSR_RT_ORIGIN_INT); return tc; } /** * Initialize the topology set * */ void olsr_init_tc(void) { OLSR_PRINTF(5, "TC: init topo\n"); avl_init(&tc_tree, avl_comp_default); /* * Get some cookies for getting stats to ease troubleshooting. */ tc_edge_gc_timer_cookie = olsr_alloc_cookie("TC edge GC", OLSR_COOKIE_TYPE_TIMER); tc_validity_timer_cookie = olsr_alloc_cookie("TC validity", OLSR_COOKIE_TYPE_TIMER); tc_edge_mem_cookie = olsr_alloc_cookie("tc_edge_entry", OLSR_COOKIE_TYPE_MEMORY); olsr_cookie_set_memory_size(tc_edge_mem_cookie, sizeof(struct tc_edge_entry) + active_lq_handler->tc_lq_size); tc_mem_cookie = olsr_alloc_cookie("tc_entry", OLSR_COOKIE_TYPE_MEMORY); olsr_cookie_set_memory_size(tc_mem_cookie, sizeof(struct tc_entry)); /* * Add a TC entry for ourselves. */ tc_myself = olsr_add_tc_entry(&olsr_cnf->main_addr); } void olsr_delete_all_tc_entries(void) { struct tc_entry *tc; OLSR_FOR_ALL_TC_ENTRIES(tc) { olsr_delete_tc_entry(tc); } OLSR_FOR_ALL_TC_ENTRIES_END(tc) } /** * The main ip address has changed. * Do the needful. */ void olsr_change_myself_tc(void) { if (tc_myself) { /* * Check if there was a change. */ if (ipequal(&tc_myself->addr, &olsr_cnf->main_addr)) { return; } /* * Flush our own tc_entry. */ olsr_delete_tc_entry(tc_myself); } /* * The old entry for ourselves is gone, generate a new one and trigger SPF. */ tc_myself = olsr_add_tc_entry(&olsr_cnf->main_addr); changes_topology = true; } /* * Increment the reference counter. */ void olsr_lock_tc_entry(struct tc_entry *tc) { tc->refcount++; } /* * Unlock and free a tc_entry once all references are gone. */ void olsr_unlock_tc_entry(struct tc_entry *tc) { if (--tc->refcount) { return; } /* * All references are gone. */ olsr_cookie_free(tc_mem_cookie, tc); } /** * Delete a TC entry. * * @param tc the TC entry to delete */ void olsr_delete_tc_entry(struct tc_entry *tc) { struct tc_edge_entry *tc_edge; struct rt_path *rtp; /* delete gateway if available */ #ifdef __linux__ olsr_delete_gateway_entry(&tc->addr, FORCE_DELETE_GW_ENTRY, false); #endif /* __linux__ */ /* * Delete the rt_path for ourselves. */ olsr_delete_routing_table(&tc->addr, olsr_cnf->maxplen, &tc->addr); /* The edgetree and prefix tree must be empty before */ OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) { olsr_delete_tc_edge_entry(tc_edge); } OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge); OLSR_FOR_ALL_PREFIX_ENTRIES(tc, rtp) { olsr_delete_rt_path(rtp); } OLSR_FOR_ALL_PREFIX_ENTRIES_END(tc, rtp); /* Stop running timers */ olsr_stop_timer(tc->edge_gc_timer); tc->edge_gc_timer = NULL; olsr_stop_timer(tc->validity_timer); tc->validity_timer = NULL; avl_delete(&tc_tree, &tc->vertex_node); olsr_unlock_tc_entry(tc); } /** * Look up a entry from the TC tree based on address * * @param adr the address to look for * @return the entry found or NULL */ struct tc_entry * olsr_lookup_tc_entry(union olsr_ip_addr *adr) { struct avl_node *node; node = avl_find(&tc_tree, adr); return (node ? vertex_tree2tc(node) : NULL); } /* * Lookup a tc entry. Creates one if it does not exist yet. */ struct tc_entry * olsr_locate_tc_entry(union olsr_ip_addr *adr) { struct tc_entry *tc; if (!(tc = olsr_lookup_tc_entry(adr))) { return olsr_add_tc_entry(adr); } return tc; } /** * Format tc_edge contents into a buffer. */ char * olsr_tc_edge_to_string(struct tc_edge_entry *tc_edge) { static char buf[128]; struct ipaddr_str addrbuf, dstbuf; struct tc_entry *tc = tc_edge->tc; struct lqtextbuffer lqbuffer1, lqbuffer2; snprintf(buf, sizeof(buf), "%s > %s, cost (%6s) %s", olsr_ip_to_string(&addrbuf, &tc->addr), olsr_ip_to_string(&dstbuf, &tc_edge->T_dest_addr), get_tc_edge_entry_text(tc_edge, '/', &lqbuffer1), get_linkcost_text(tc_edge->cost, false, &lqbuffer2)); return buf; } /** * Wrapper for the timer callback. * A TC entry has not been refreshed in time. * Remove it from the link-state database. */ static void olsr_expire_tc_entry(void *context) { struct tc_entry *tc; struct ipaddr_str buf; tc = (struct tc_entry *)context; OLSR_PRINTF(3, "TC: expire node entry %s\n", olsr_ip_to_string(&buf, &tc->addr)); tc->validity_timer = NULL; olsr_delete_tc_entry(tc); changes_topology = true; } /** * Wrapper for the timer callback. * Does the garbage collection of older ansn entries after no edge addition to * the TC entry has happened for OLSR_TC_EDGE_GC_TIME. */ static void olsr_expire_tc_edge_gc(void *context) { struct tc_entry *tc; struct ipaddr_str buf; tc = (struct tc_entry *)context; OLSR_PRINTF(3, "TC: expire edge entry %s\n", olsr_ip_to_string(&buf, &tc->addr)); tc->edge_gc_timer = NULL; if (olsr_delete_outdated_tc_edges(tc)) { changes_topology = true; } } /* * If the edge does not have a minimum acceptable link quality * set the etx cost to infinity such that it gets ignored during * SPF calculation. * * @return 1 if the change of the etx value was relevant */ bool olsr_calc_tc_edge_entry_etx(struct tc_edge_entry *tc_edge) { /* * Some sanity check before recalculating the etx. */ if (olsr_cnf->lq_level < 1) { return false; } tc_edge->cost = olsr_calc_tc_cost(tc_edge); return true; } /** * Add a new tc_edge_entry to the tc_edge_tree * * @param tc the tc entry * @param addr (last)adr address of the entry * @param ansn ansn of this edge * @return a pointer to the created entry */ struct tc_edge_entry * olsr_add_tc_edge_entry(struct tc_entry *tc, union olsr_ip_addr *addr, uint16_t ansn) { #ifdef DEBUG struct ipaddr_str buf; #endif /* DEBUG */ struct tc_entry *tc_neighbor; struct tc_edge_entry *tc_edge, *tc_edge_inv; tc_edge = olsr_cookie_malloc(tc_edge_mem_cookie); if (!tc_edge) { return NULL; } /* Fill entry */ tc_edge->T_dest_addr = *addr; tc_edge->ansn = ansn; tc_edge->edge_node.key = &tc_edge->T_dest_addr; /* * Insert into the edge tree. */ avl_insert(&tc->edge_tree, &tc_edge->edge_node, AVL_DUP_NO); olsr_lock_tc_entry(tc); /* * Connect backpointer. */ tc_edge->tc = tc; /* * Check if the neighboring router and the inverse edge is in the lsdb. * Create short cuts to the inverse edge for faster SPF execution. */ tc_neighbor = olsr_lookup_tc_entry(&tc_edge->T_dest_addr); if (tc_neighbor) { #ifdef DEBUG OLSR_PRINTF(1, "TC: found neighbor tc_entry %s\n", olsr_ip_to_string(&buf, &tc_neighbor->addr)); #endif /* DEBUG */ tc_edge_inv = olsr_lookup_tc_edge(tc_neighbor, &tc->addr); if (tc_edge_inv) { #ifdef DEBUG OLSR_PRINTF(1, "TC: found inverse edge for %s\n", olsr_ip_to_string(&buf, &tc_edge_inv->T_dest_addr)); #endif /* DEBUG */ /* * Connect the edges mutually. */ tc_edge_inv->edge_inv = tc_edge; tc_edge->edge_inv = tc_edge_inv; } } /* * Update the etx. */ olsr_calc_tc_edge_entry_etx(tc_edge); #ifdef DEBUG OLSR_PRINTF(1, "TC: add edge entry %s\n", olsr_tc_edge_to_string(tc_edge)); #endif /* DEBUG */ return tc_edge; } /** * Delete a TC edge entry. * * @param tc_edge the TC edge entry */ void olsr_delete_tc_edge_entry(struct tc_edge_entry *tc_edge) { struct tc_entry *tc; struct tc_edge_entry *tc_edge_inv; #ifdef DEBUG OLSR_PRINTF(1, "TC: del edge entry %s\n", olsr_tc_edge_to_string(tc_edge)); #endif /* DEBUG */ tc = tc_edge->tc; avl_delete(&tc->edge_tree, &tc_edge->edge_node); olsr_unlock_tc_entry(tc); /* * Clear the backpointer of our inverse edge. */ tc_edge_inv = tc_edge->edge_inv; if (tc_edge_inv) { tc_edge_inv->edge_inv = NULL; } olsr_cookie_free(tc_edge_mem_cookie, tc_edge); } /** * Delete all destinations that have a lower ANSN. * * @param tc the entry to delete edges from * @return TRUE if any destinations were deleted, FALSE if not */ bool olsr_delete_outdated_tc_edges(struct tc_entry *tc) { struct tc_edge_entry *tc_edge; bool retval = false; OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) { if (SEQNO_GREATER_THAN(tc->ansn, tc_edge->ansn)) { olsr_delete_tc_edge_entry(tc_edge); retval = true; } } OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge); return retval; } /** * Delete all destinations that are inside the borders but * not updated in the last tc. * * @param tc the entry to delete edges from * @param ansn the advertised neighbor set sequence number * @param lower_border the lower border * @param upper_border the upper border * @return 1 if any destinations were deleted 0 if not */ static int olsr_delete_revoked_tc_edges(struct tc_entry *tc, uint16_t ansn, union olsr_ip_addr *lower_border, union olsr_ip_addr *upper_border) { struct tc_edge_entry *tc_edge; int retval = 0; bool passedLowerBorder = false; OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) { if (!passedLowerBorder) { if (avl_comp_default(lower_border, &tc_edge->T_dest_addr) <= 0) { passedLowerBorder = true; } else { continue; } } if (passedLowerBorder) { if (avl_comp_default(upper_border, &tc_edge->T_dest_addr) <= 0) { break; } } if (SEQNO_GREATER_THAN(ansn, tc_edge->ansn)) { olsr_delete_tc_edge_entry(tc_edge); retval = 1; } } OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge); if (retval) changes_topology = true; return retval; } /** * Update an edge registered on an entry. * Creates new edge-entries if not registered. * Bases update on a received TC message * * @param tc the TC entry to check * @param ansn the ansn of the edge * @param curr pointer to the packet * @param neighbor the neighbor of the edge * @return 1 if entries are added 0 if not */ static int olsr_tc_update_edge(struct tc_entry *tc, uint16_t ansn, const unsigned char **curr, union olsr_ip_addr *neighbor) { struct tc_edge_entry *tc_edge; int edge_change; edge_change = 0; /* * Fetch the per-edge data */ pkt_get_ipaddress(curr, neighbor); /* First check if we know this edge */ tc_edge = olsr_lookup_tc_edge(tc, neighbor); if (!tc_edge) { /* * Yet unknown - create it. * Check if the address is allowed. */ if (!olsr_validate_address(neighbor)) { return 0; } tc_edge = olsr_add_tc_edge_entry(tc, neighbor, ansn); olsr_deserialize_tc_lq_pair(curr, tc_edge); edge_change = 1; } else { /* * We know this edge - Update entry. */ tc_edge->ansn = ansn; /* * Update link quality if configured. */ if (olsr_cnf->lq_level > 0) { olsr_deserialize_tc_lq_pair(curr, tc_edge); } /* * Update the etx. */ if (olsr_calc_tc_edge_entry_etx(tc_edge)) { edge_change = 1; } #if defined DEBUG && DEBUG if (edge_change) { OLSR_PRINTF(1, "TC: chg edge entry %s\n", olsr_tc_edge_to_string(tc_edge)); } #endif /* defined DEBUG && DEBUG */ } return edge_change; } /** * Lookup an edge hanging off a TC entry. * * @param tc the entry to check * @param edge_addr the destination address to check for * @return a pointer to the tc_edge found - or NULL */ struct tc_edge_entry * olsr_lookup_tc_edge(struct tc_entry *tc, union olsr_ip_addr *edge_addr) { struct avl_node *edge_node; edge_node = avl_find(&tc->edge_tree, edge_addr); return (edge_node ? edge_tree2tc_edge(edge_node) : NULL); } /** * Print the topology table to stdout */ #ifndef NODEBUG void olsr_print_tc_table(void) { /* The whole function makes no sense without it. */ struct tc_entry *tc; const int ipwidth = olsr_cnf->ip_version == AF_INET ? (INET_ADDRSTRLEN - 1) : (INET6_ADDRSTRLEN - 1); OLSR_PRINTF(1, "\n--- %s ------------------------------------------------- TOPOLOGY\n\n" "%-*s %-*s %-14s %s\n", olsr_wallclock_string(), ipwidth, "Source IP addr", ipwidth, "Dest IP addr", " LQ ", "ETX"); OLSR_FOR_ALL_TC_ENTRIES(tc) { struct tc_edge_entry *tc_edge; OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) { struct ipaddr_str addrbuf, dstaddrbuf; struct lqtextbuffer lqbuffer1, lqbuffer2; OLSR_PRINTF(1, "%-*s %-*s %-14s %s\n", ipwidth, olsr_ip_to_string(&addrbuf, &tc->addr), ipwidth, olsr_ip_to_string(&dstaddrbuf, &tc_edge->T_dest_addr), get_tc_edge_entry_text(tc_edge, '/', &lqbuffer1), get_linkcost_text(tc_edge->cost, false, &lqbuffer2)); } OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge); } OLSR_FOR_ALL_TC_ENTRIES_END(tc); } #endif /* NODEBUG */ /* * calculate the border IPs of a tc edge set according to the border flags * * @param lower border flag * @param pointer to lower border ip * @param upper border flag * @param pointer to upper border ip * @result 1 if lower/upper border ip have been set */ static int olsr_calculate_tc_border(uint8_t lower_border, union olsr_ip_addr *lower_border_ip, uint8_t upper_border, union olsr_ip_addr *upper_border_ip) { if (lower_border == 0 && upper_border == 0) { return 0; } if (lower_border == 0xff) { memset(lower_border_ip, 0, sizeof(*lower_border_ip)); } else { int i; lower_border--; for (i = 0; i < lower_border / 8; i++) { lower_border_ip->v6.s6_addr[olsr_cnf->ipsize - i - 1] = 0; } lower_border_ip->v6.s6_addr[olsr_cnf->ipsize - lower_border / 8 - 1] &= (0xff << (lower_border & 7)); lower_border_ip->v6.s6_addr[olsr_cnf->ipsize - lower_border / 8 - 1] |= (1 << (lower_border & 7)); } if (upper_border == 0xff) { memset(upper_border_ip, 0xff, sizeof(*upper_border_ip)); } else { int i; upper_border--; for (i = 0; i < upper_border / 8; i++) { upper_border_ip->v6.s6_addr[olsr_cnf->ipsize - i - 1] = 0; } upper_border_ip->v6.s6_addr[olsr_cnf->ipsize - upper_border / 8 - 1] &= (0xff << (upper_border & 7)); upper_border_ip->v6.s6_addr[olsr_cnf->ipsize - upper_border / 8 - 1] |= (1 << (upper_border & 7)); } return 1; } /* * Process an incoming TC or TC_LQ message. * * If the message is interesting enough, update our edges for it, * trigger SPF and finally flood it to all our 2way neighbors. * * The order for extracting data off the message does matter, * as every call to pkt_get increases the packet offset and * hence the spot we are looking at. */ bool olsr_input_tc(union olsr_message * msg, struct interface * input_if __attribute__ ((unused)), union olsr_ip_addr * from_addr) { struct ipaddr_str buf; uint16_t size, msg_seq, ansn; uint8_t type, ttl, msg_hops, lower_border, upper_border; olsr_reltime vtime; union olsr_ip_addr originator; const unsigned char *limit, *curr; struct tc_entry *tc; bool emptyTC; union olsr_ip_addr lower_border_ip, upper_border_ip; int borderSet = 0; curr = (void *)msg; if (!msg) { return false; } /* We are only interested in TC message types. */ pkt_get_u8(&curr, &type); if ((type != LQ_TC_MESSAGE) && (type != TC_MESSAGE)) { return false; } /* * If the sender interface (NB: not originator) of this message * is not in the symmetric 1-hop neighborhood of this node, the * message MUST be discarded. */ if (check_neighbor_link(from_addr) != SYM_LINK) { OLSR_PRINTF(2, "Received TC from NON SYM neighbor %s\n", olsr_ip_to_string(&buf, from_addr)); return false; } pkt_get_reltime(&curr, &vtime); pkt_get_u16(&curr, &size); pkt_get_ipaddress(&curr, &originator); /* Copy header values */ pkt_get_u8(&curr, &ttl); pkt_get_u8(&curr, &msg_hops); pkt_get_u16(&curr, &msg_seq); pkt_get_u16(&curr, &ansn); /* Get borders */ pkt_get_u8(&curr, &lower_border); pkt_get_u8(&curr, &upper_border); tc = olsr_lookup_tc_entry(&originator); if (vtime < (olsr_reltime)(olsr_cnf->min_tc_vtime*1000)) { vtime = (olsr_reltime)(olsr_cnf->min_tc_vtime*1000); } if (tc && 0 != tc->edge_tree.count) { if (olsr_seq_inrange_high((int)tc->msg_seq - TC_SEQNO_WINDOW, tc->msg_seq, msg_seq) && olsr_seq_inrange_high((int)tc->ansn - TC_ANSN_WINDOW, tc->ansn, ansn)) { /* * Ignore already seen seq/ansn values (small window for mesh memory) */ if ((tc->msg_seq == msg_seq) || (tc->ignored++ < 32)) { return false; } OLSR_PRINTF(1, "Ignored to much LQTC's for %s, restarting\n", olsr_ip_to_string(&buf, &originator)); } else if (!olsr_seq_inrange_high(tc->msg_seq, (int)tc->msg_seq + TC_SEQNO_WINDOW * TC_SEQNO_WINDOW_MULT, msg_seq) || !olsr_seq_inrange_low(tc->ansn, (int)tc->ansn + TC_ANSN_WINDOW * TC_ANSN_WINDOW_MULT, ansn)) { /* * Only accept future seq/ansn values (large window for node reconnects). * Restart in all other cases. Ignore a single stray message. */ if (!tc->err_seq_valid) { tc->err_seq = msg_seq; tc->err_seq_valid = true; } if (tc->err_seq == msg_seq) { return false; } OLSR_PRINTF(2, "Detected node restart for %s\n", olsr_ip_to_string(&buf, &originator)); } } /* * Generate a new tc_entry in the lsdb and store the sequence number. */ if (!tc) { tc = olsr_add_tc_entry(&originator); } /* * Update the tc entry. */ tc->msg_hops = msg_hops; tc->msg_seq = msg_seq; tc->ansn = ansn; tc->ignored = 0; tc->err_seq_valid = false; OLSR_PRINTF(1, "Processing TC from %s, seq 0x%04x\n", olsr_ip_to_string(&buf, &originator), tc->msg_seq); /* * Now walk the edge advertisements contained in the packet. */ limit = (unsigned char *)msg + size; borderSet = 0; emptyTC = curr >= limit; while (curr < limit) { if (olsr_tc_update_edge(tc, ansn, &curr, &upper_border_ip)) { changes_topology = true; } if (!borderSet) { borderSet = 1; memcpy(&lower_border_ip, &upper_border_ip, sizeof(lower_border_ip)); } } /* * Calculate real border IPs. */ if (borderSet) { borderSet = olsr_calculate_tc_border(lower_border, &lower_border_ip, upper_border, &upper_border_ip); } /* * Set or change the expiration timer accordingly. */ olsr_set_timer(&tc->validity_timer, vtime, OLSR_TC_VTIME_JITTER, OLSR_TIMER_ONESHOT, &olsr_expire_tc_entry, tc, tc_validity_timer_cookie); if (emptyTC && lower_border == 0xff && upper_border == 0xff) { /* handle empty TC with border flags 0xff */ memset(&lower_border_ip, 0x00, sizeof(lower_border_ip)); memset(&upper_border_ip, 0xff, sizeof(upper_border_ip)); borderSet = 1; } if (borderSet) { /* * Delete all old tc edges within borders. */ olsr_delete_revoked_tc_edges(tc, ansn, &lower_border_ip, &upper_border_ip); } else { /* * Kick the the edge garbage collection timer. In the meantime hopefully * all edges belonging to a multipart neighbor set will arrive. */ olsr_set_timer(&tc->edge_gc_timer, OLSR_TC_EDGE_GC_TIME, OLSR_TC_EDGE_GC_JITTER, OLSR_TIMER_ONESHOT, &olsr_expire_tc_edge_gc, tc, tc_edge_gc_timer_cookie); } if (emptyTC && borderSet) { /* cleanup MIDs and HNAs if all edges have been erased by * an empty TC, then alert the duplicate set and kill the * tc entry */ olsr_cleanup_mid(&originator); olsr_cleanup_hna(&originator); olsr_cleanup_duplicates(&originator); olsr_delete_tc_entry(tc); } /* Forward the message */ return true; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/tc_set.h000066400000000000000000000166031234304727700152460ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * LSDB rewrite (c) 2007, Hannes Gredler (hannes@gredler.at) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_TOP_SET #define _OLSR_TOP_SET #include "defs.h" #include "packet.h" #include "common/avl.h" #include "common/list.h" #include "scheduler.h" /* * This file holds the definitions for the link state database. * The lsdb consists of nodes and edges. * During input parsing all nodes and edges are extracted and synthesized. * The SPF calculation operates on these datasets. */ struct tc_edge_entry { struct avl_node edge_node; /* edge_tree node in tc_entry */ union olsr_ip_addr T_dest_addr; /* edge_node key */ struct tc_edge_entry *edge_inv; /* shortcut, used during SPF calculation */ struct tc_entry *tc; /* backpointer to owning tc entry */ olsr_linkcost cost; /* metric used for SPF calculation */ uint16_t ansn; /* ansn of this edge, used for multipart msgs */ uint32_t linkquality[0]; }; AVLNODE2STRUCT(edge_tree2tc_edge, struct tc_edge_entry, edge_node); struct tc_entry { struct avl_node vertex_node; /* node keyed by ip address */ union olsr_ip_addr addr; /* vertex_node key */ struct avl_node cand_tree_node; /* SPF candidate heap, node keyed by path_etx */ olsr_linkcost path_cost; /* SPF calculated distance, cand_tree_node key */ struct list_node path_list_node; /* SPF result list */ struct avl_tree edge_tree; /* subtree for edges */ struct avl_tree prefix_tree; /* subtree for prefixes */ struct link_entry *next_hop; /* SPF calculated link to the 1st hop neighbor */ struct timer_entry *edge_gc_timer; /* used for edge garbage collection */ struct timer_entry *validity_timer; /* tc validity time */ uint32_t refcount; /* reference counter */ uint16_t msg_seq; /* sequence number of the tc message */ uint8_t msg_hops; /* hopcount as per the tc message */ uint8_t hops; /* SPF calculated hopcount */ uint16_t ansn; /* ANSN number of the tc message */ uint16_t ignored; /* how many TC messages ignored in a sequence (kindof emergency brake) */ uint16_t err_seq; /* sequence number of an unplausible TC */ bool err_seq_valid; /* do we have an error (unplauible seq/ansn) */ }; /* * Garbage collection time for edges. * This is used for multipart messages. */ #define OLSR_TC_EDGE_GC_TIME (2*1000) /* milliseconds */ #define OLSR_TC_EDGE_GC_JITTER 5 /* percent */ #define OLSR_TC_VTIME_JITTER 5 /* percent */ AVLNODE2STRUCT(vertex_tree2tc, struct tc_entry, vertex_node); AVLNODE2STRUCT(cand_tree2tc, struct tc_entry, cand_tree_node); LISTNODE2STRUCT(pathlist2tc, struct tc_entry, path_list_node); /* * macros for traversing vertices, edges and prefixes in the link state database. * it is recommended to use this because it hides all the internal * datastructure from the callers. * * the loop prefetches the next node in order to not loose context if * for example the caller wants to delete the current entry. */ #define OLSR_FOR_ALL_TC_ENTRIES(tc) \ { \ struct avl_node *tc_tree_node, *next_tc_tree_node; \ for (tc_tree_node = avl_walk_first(&tc_tree); \ tc_tree_node; tc_tree_node = next_tc_tree_node) { \ next_tc_tree_node = avl_walk_next(tc_tree_node); \ tc = vertex_tree2tc(tc_tree_node); #define OLSR_FOR_ALL_TC_ENTRIES_END(tc) }} #define OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) \ { \ struct avl_node *tc_edge_node, *next_tc_edge_node; \ for (tc_edge_node = avl_walk_first(&tc->edge_tree); \ tc_edge_node; tc_edge_node = next_tc_edge_node) { \ next_tc_edge_node = avl_walk_next(tc_edge_node); \ tc_edge = edge_tree2tc_edge(tc_edge_node); #define OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge) }} #define OLSR_FOR_ALL_PREFIX_ENTRIES(tc, rtp) \ { \ struct avl_node *rtp_node, *next_rtp_node; \ for (rtp_node = avl_walk_first(&tc->prefix_tree); \ rtp_node; rtp_node = next_rtp_node) { \ next_rtp_node = avl_walk_next(rtp_node); \ rtp = rtp_prefix_tree2rtp(rtp_node); #define OLSR_FOR_ALL_PREFIX_ENTRIES_END(tc, rtp) }} extern struct avl_tree tc_tree; extern struct tc_entry *tc_myself; void olsr_init_tc(void); void olsr_delete_all_tc_entries(void); void olsr_change_myself_tc(void); #ifndef NODEBUG void olsr_print_tc_table(void); #else #define olsr_print_tc_table() do { } while(0) #endif void olsr_time_out_tc_set(void); /* tc msg input parser */ bool olsr_input_tc(union olsr_message *, struct interface *, union olsr_ip_addr *from); /* tc_entry manipulation */ struct tc_entry *olsr_lookup_tc_entry(union olsr_ip_addr *); struct tc_entry *olsr_locate_tc_entry(union olsr_ip_addr *); void olsr_lock_tc_entry(struct tc_entry *); void olsr_unlock_tc_entry(struct tc_entry *); /* tc_edge_entry manipulation */ bool olsr_delete_outdated_tc_edges(struct tc_entry *); char *olsr_tc_edge_to_string(struct tc_edge_entry *); struct tc_edge_entry *olsr_lookup_tc_edge(struct tc_entry *, union olsr_ip_addr *); struct tc_edge_entry *olsr_add_tc_edge_entry(struct tc_entry *, union olsr_ip_addr *, uint16_t); void olsr_delete_tc_entry(struct tc_entry *); void olsr_delete_tc_edge_entry(struct tc_edge_entry *); bool olsr_calc_tc_edge_entry_etx(struct tc_edge_entry *); void olsr_set_tc_edge_timer(struct tc_edge_entry *, unsigned int); // static bool olsr_etx_significant_change(float, float); #endif /* _OLSR_TOP_SET */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/two_hop_neighbor_table.c000066400000000000000000000163421234304727700204630ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include "two_hop_neighbor_table.h" #include "ipcalc.h" #include "defs.h" #include "mid_set.h" #include "neighbor_table.h" #include "net_olsr.h" #include "scheduler.h" struct neighbor_2_entry two_hop_neighbortable[HASHSIZE]; /** *Initialize 2 hop neighbor table */ void olsr_init_two_hop_table(void) { int idx; for (idx = 0; idx < HASHSIZE; idx++) { two_hop_neighbortable[idx].next = &two_hop_neighbortable[idx]; two_hop_neighbortable[idx].prev = &two_hop_neighbortable[idx]; } } /** *Remove a one hop neighbor from a two hop neighbors *one hop list. * *@param two_hop_entry the two hop neighbor to remove the *one hop neighbor from *@param neigh address the address of the one hop neighbor to remove * *@return nada */ void olsr_delete_neighbor_pointer(struct neighbor_2_entry *two_hop_entry, struct neighbor_entry *neigh) { struct neighbor_list_entry *entry = two_hop_entry->neighbor_2_nblist.next; while (entry != &two_hop_entry->neighbor_2_nblist) { if (entry->neighbor == neigh) { struct neighbor_list_entry *entry_to_delete = entry; entry = entry->next; /* dequeue */ DEQUEUE_ELEM(entry_to_delete); free(entry_to_delete); } else { entry = entry->next; } } } /** *Delete an entry from the two hop neighbor table. * *@param two_hop_neighbor the two hop neighbor to delete. * *@return nada */ void olsr_delete_two_hop_neighbor_table(struct neighbor_2_entry *two_hop_neighbor) { struct neighbor_list_entry *one_hop_list; one_hop_list = two_hop_neighbor->neighbor_2_nblist.next; /* Delete one hop links */ while (one_hop_list != &two_hop_neighbor->neighbor_2_nblist) { struct neighbor_entry *one_hop_entry = one_hop_list->neighbor; struct neighbor_list_entry *entry_to_delete = one_hop_list; olsr_delete_neighbor_2_pointer(one_hop_entry, two_hop_neighbor); one_hop_list = one_hop_list->next; /* no need to dequeue */ free(entry_to_delete); } /* dequeue */ DEQUEUE_ELEM(two_hop_neighbor); free(two_hop_neighbor); } /** *Insert a new entry to the two hop neighbor table. * *@param two_hop_neighbor the entry to insert * *@return nada */ void olsr_insert_two_hop_neighbor_table(struct neighbor_2_entry *two_hop_neighbor) { uint32_t hash = olsr_ip_hashing(&two_hop_neighbor->neighbor_2_addr); /* Queue */ QUEUE_ELEM(two_hop_neighbortable[hash], two_hop_neighbor); } /** *Look up an entry in the two hop neighbor table. * *@param dest the IP address of the entry to find * *@return a pointer to a neighbor_2_entry struct *representing the two hop neighbor */ struct neighbor_2_entry * olsr_lookup_two_hop_neighbor_table(const union olsr_ip_addr *dest) { struct neighbor_2_entry *neighbor_2; uint32_t hash = olsr_ip_hashing(dest); /* printf("LOOKING FOR %s\n", olsr_ip_to_string(&buf, dest)); */ for (neighbor_2 = two_hop_neighbortable[hash].next; neighbor_2 != &two_hop_neighbortable[hash]; neighbor_2 = neighbor_2->next) { struct mid_address *adr; /* printf("Checking %s\n", olsr_ip_to_string(&buf, dest)); */ if (ipequal(&neighbor_2->neighbor_2_addr, dest)) return neighbor_2; adr = mid_lookup_aliases(&neighbor_2->neighbor_2_addr); while (adr) { if (ipequal(&adr->alias, dest)) return neighbor_2; adr = adr->next_alias; } } return NULL; } /** *Look up an entry in the two hop neighbor table. *NO CHECK FOR MAIN ADDRESS OR ALIASES! * *@param dest the IP address of the entry to find * *@return a pointer to a neighbor_2_entry struct *representing the two hop neighbor */ struct neighbor_2_entry * olsr_lookup_two_hop_neighbor_table_mid(const union olsr_ip_addr *dest) { struct neighbor_2_entry *neighbor_2; uint32_t hash; /* printf("LOOKING FOR %s\n", olsr_ip_to_string(&buf, dest)); */ hash = olsr_ip_hashing(dest); for (neighbor_2 = two_hop_neighbortable[hash].next; neighbor_2 != &two_hop_neighbortable[hash]; neighbor_2 = neighbor_2->next) { if (ipequal(&neighbor_2->neighbor_2_addr, dest)) return neighbor_2; } return NULL; } /** *Print the two hop neighbor table to STDOUT. * *@return nada */ #ifndef NODEBUG void olsr_print_two_hop_neighbor_table(void) { /* The whole function makes no sense without it. */ int i; const int ipwidth = olsr_cnf->ip_version == AF_INET ? (INET_ADDRSTRLEN - 1) : (INET6_ADDRSTRLEN - 1); OLSR_PRINTF(1, "\n--- %s ----------------------- TWO-HOP NEIGHBORS\n\n" "IP addr (2-hop) IP addr (1-hop) Total cost\n", olsr_wallclock_string()); for (i = 0; i < HASHSIZE; i++) { struct neighbor_2_entry *neigh2; for (neigh2 = two_hop_neighbortable[i].next; neigh2 != &two_hop_neighbortable[i]; neigh2 = neigh2->next) { struct neighbor_list_entry *entry; bool first = true; for (entry = neigh2->neighbor_2_nblist.next; entry != &neigh2->neighbor_2_nblist; entry = entry->next) { struct ipaddr_str buf; struct lqtextbuffer lqbuffer; if (first) { OLSR_PRINTF(1, "%-*s ", ipwidth, olsr_ip_to_string(&buf, &neigh2->neighbor_2_addr)); first = false; } else { OLSR_PRINTF(1, " "); } OLSR_PRINTF(1, "%-*s %s\n", ipwidth, olsr_ip_to_string(&buf, &entry->neighbor->neighbor_main_addr), get_linkcost_text(entry->path_linkcost, false, &lqbuffer)); } } } } #endif /* NODEBUG */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/two_hop_neighbor_table.h000066400000000000000000000065721234304727700204740ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifndef _OLSR_TWO_HOP_TABLE #define _OLSR_TWO_HOP_TABLE #include "defs.h" #include "hashing.h" #include "lq_plugin.h" #define NB2S_COVERED 0x1 /* node has been covered by a MPR */ struct neighbor_list_entry { struct neighbor_entry *neighbor; olsr_linkcost second_hop_linkcost; olsr_linkcost path_linkcost; olsr_linkcost saved_path_linkcost; struct neighbor_list_entry *next; struct neighbor_list_entry *prev; }; struct neighbor_2_entry { union olsr_ip_addr neighbor_2_addr; uint8_t mpr_covered_count; /*used in mpr calculation */ uint8_t processed; /*used in mpr calculation */ int16_t neighbor_2_pointer; /* Neighbor count */ struct neighbor_list_entry neighbor_2_nblist; struct neighbor_2_entry *prev; struct neighbor_2_entry *next; }; extern struct neighbor_2_entry two_hop_neighbortable[HASHSIZE]; void olsr_init_two_hop_table(void); void olsr_delete_neighbor_pointer(struct neighbor_2_entry *, struct neighbor_entry *); void olsr_delete_two_hop_neighbor_table(struct neighbor_2_entry *); void olsr_insert_two_hop_neighbor_table(struct neighbor_2_entry *); struct neighbor_2_entry *olsr_lookup_two_hop_neighbor_table(const union olsr_ip_addr *); struct neighbor_2_entry *olsr_lookup_two_hop_neighbor_table_mid(const union olsr_ip_addr *); #ifndef NODEBUG void olsr_print_two_hop_neighbor_table(void); #else #define olsr_print_two_hop_neighbor_table() do { } while(0) #endif #endif /* _OLSR_TWO_HOP_TABLE */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/unix/000077500000000000000000000000001234304727700145715ustar00rootroot00000000000000olsrd-0.6.6.2/src/unix/ifnet.c000066400000000000000000000702351234304727700160510ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ #define ifr_netmask ifr_addr #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ */ #include "ifnet.h" #include "ipcalc.h" #include "interfaces.h" #include "defs.h" #include "olsr.h" #include "net_os.h" #include "net_olsr.h" #include "parser.h" #include "scheduler.h" #include "generate_msg.h" #include "mantissa.h" #include "lq_packet.h" #include "log.h" #include "link_set.h" #include #include #include #include #include #include #include #include #include #include /** * Fix bug in GLIBC, see https://bugzilla.redhat.com/show_bug.cgi?id=635260 */ #ifdef IPTOS_CLASS #undef IPTOS_CLASS #endif /* IPTOS_CLASS */ #define IPTOS_CLASS(class) ((class) & IPTOS_CLASS_MASK) #define BUFSPACE (127*1024) /* max. input buffer size to request */ int set_flag(char *ifname, short flag __attribute__ ((unused))) { struct ifreq ifr; strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); /* Get flags */ if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) { fprintf(stderr, "ioctl (get interface flags)"); return -1; } strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); //printf("Setting flags for if \"%s\"\n", ifr.ifr_name); if (!(ifr.ifr_flags & (IFF_UP | IFF_RUNNING))) { /* Add UP */ ifr.ifr_flags |= (IFF_UP | IFF_RUNNING); /* Set flags + UP */ if (ioctl(olsr_cnf->ioctl_s, SIOCSIFFLAGS, &ifr) < 0) { fprintf(stderr, "ERROR(%s): %s\n", ifr.ifr_name, strerror(errno)); return -1; } } return 1; } void check_interface_updates(void *foo __attribute__ ((unused))) { struct olsr_if *tmp_if; #ifdef DEBUG OLSR_PRINTF(3, "Checking for updates in the interface set\n"); #endif /* DEBUG */ for (tmp_if = olsr_cnf->interfaces; tmp_if != NULL; tmp_if = tmp_if->next) { if (tmp_if->host_emul) continue; if (olsr_cnf->host_emul) /* XXX: TEMPORARY! */ continue; if (!tmp_if->cnf->autodetect_chg) { #ifdef DEBUG /* Don't check this interface */ OLSR_PRINTF(3, "Not checking interface %s\n", tmp_if->name); #endif /* DEBUG */ continue; } if (tmp_if->configured) { chk_if_changed(tmp_if); } else { chk_if_up(tmp_if, 3); } } return; } /** * Checks if an initialized interface is changed * that is if it has been set down or the address * has been changed. * *@param iface the olsr_if struct describing the interface *@return 1 when the interface changed, 0 if it did not change */ int chk_if_changed(struct olsr_if *iface) { struct interface *ifp; struct ifreq ifr; struct sockaddr_in6 tmp_saddr6; int if_changes; if_changes = 0; #ifdef DEBUG OLSR_PRINTF(3, "Checking if %s is set down or changed\n", iface->name); #endif /* DEBUG */ if (iface->host_emul) return -1; ifp = iface->interf; if (ifp == NULL) { /* Should not happen */ iface->configured = 0; return 0; } memset(&ifr, 0, sizeof(struct ifreq)); strscpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name)); /* Get flags (and check if interface exists) */ if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) { OLSR_PRINTF(3, "No such interface: %s\n", iface->name); goto remove_interface; } ifp->int_flags = ifr.ifr_flags; /* * First check if the interface is set DOWN */ if ((ifp->int_flags & IFF_UP) == 0 || (ifp->int_flags & IFF_RUNNING) == 0) { OLSR_PRINTF(1, "\tInterface %s not up and running - removing it...\n", iface->name); goto remove_interface; } /* * We do all the interface type checks over. * This is because the interface might be a PCMCIA card. Therefore * It might not be the same physical interface as we configured earlier. */ /* Check broadcast */ if ((olsr_cnf->ip_version == AF_INET) && !iface->cnf->ipv4_multicast.v4.s_addr && /* Skip if fixed bcast */ (!(ifp->int_flags & IFF_BROADCAST))) { OLSR_PRINTF(3, "\tNo broadcast - removing\n"); goto remove_interface; } if (ifp->int_flags & IFF_LOOPBACK) { OLSR_PRINTF(3, "\tThis is a loopback interface - removing it...\n"); goto remove_interface; } ifp->is_hcif = false; /* trying to detect if interface is wireless. */ ifp->is_wireless = check_wireless_interface(ifr.ifr_name); /* Set interface metric */ if (iface->cnf->weight.fixed) ifp->int_metric = iface->cnf->weight.value; else ifp->int_metric = calculate_if_metric(ifr.ifr_name); /* Get MTU */ if (ioctl(olsr_cnf->ioctl_s, SIOCGIFMTU, &ifr) < 0) ifp->int_mtu = 0; else { ifr.ifr_mtu -= (olsr_cnf->ip_version == AF_INET6) ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE; if (ifp->int_mtu != ifr.ifr_mtu) { ifp->int_mtu = ifr.ifr_mtu; /* Create new outputbuffer */ net_remove_buffer(ifp); /* Remove old */ net_add_buffer(ifp); } } /* Get interface index */ ifp->if_index = if_nametoindex(ifr.ifr_name); /* * Now check if the IP has changed */ /* IP version 6 */ if (olsr_cnf->ip_version == AF_INET6) { struct ipaddr_str buf; /* Get dst interface address */ if (0 == get_ipv6_address(iface->name, &tmp_saddr6, (iface->cnf->ipv6_src.prefix_len == 0) ? NULL : (&iface->cnf->ipv6_src))) { OLSR_PRINTF(3, "\tCould not find ip address for %s with prefix %s.\n", ifr.ifr_name, olsr_ip_prefix_to_string(&iface->cnf->ipv6_src)); goto remove_interface; } #ifdef DEBUG OLSR_PRINTF(3, "\tAddress: %s\n", ip6_to_string(&buf, &iface->cnf->ipv6_multicast.v6)); #endif /* DEBUG */ if (memcmp(&tmp_saddr6.sin6_addr, &ifp->int6_addr.sin6_addr, olsr_cnf->ipsize) != 0) { OLSR_PRINTF(1, "New IP address for %s:\n", ifr.ifr_name); OLSR_PRINTF(1, "\tOld: %s\n", ip6_to_string(&buf, &ifp->int6_addr.sin6_addr)); OLSR_PRINTF(1, "\tNew: %s\n", ip6_to_string(&buf, &tmp_saddr6.sin6_addr)); /* Update address */ memcpy(&ifp->int6_addr.sin6_addr, &tmp_saddr6.sin6_addr, olsr_cnf->ipsize); memcpy(&ifp->ip_addr, &tmp_saddr6.sin6_addr, olsr_cnf->ipsize); olsr_trigger_ifchange(ifp->if_index, ifp, IFCHG_IF_UPDATE); /* we have to make sure that olsrd uses the new source address of this interface */ olsr_remove_interface(iface); /* so we remove the interface completely */ chk_if_up(iface,3); /* and create it again to get new sockets,..*/ } return 0; } else /* IP version 4 */ { struct ipaddr_str buf; /* Check interface address (IPv4) */ if (ioctl(olsr_cnf->ioctl_s, SIOCGIFADDR, &ifr) < 0) { OLSR_PRINTF(1, "\tCould not get address of interface - removing it\n"); goto remove_interface; } #ifdef DEBUG OLSR_PRINTF(3, "\tAddress:%s\n", sockaddr4_to_string(&buf, &ifr.ifr_addr)); #endif /* DEBUG */ if (memcmp (&((struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifp->int_addr))->sin_addr.s_addr, &((struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifr.ifr_addr))->sin_addr.s_addr, olsr_cnf->ipsize) != 0) { /* New address */ OLSR_PRINTF(1, "IPv4 address changed for %s\n", ifr.ifr_name); OLSR_PRINTF(1, "\tOld:%s\n", ip4_to_string(&buf, ifp->int_addr.sin_addr)); OLSR_PRINTF(1, "\tNew:%s\n", sockaddr4_to_string(&buf, &ifr.ifr_addr)); ifp->int_addr = *(struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifr.ifr_addr); memcpy(&ifp->ip_addr, &((struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifr.ifr_addr))->sin_addr.s_addr, olsr_cnf->ipsize); /* we have to make sure that olsrd uses the new source address of this interface */ olsr_remove_interface(iface); /* so we remove the interface completely */ chk_if_up(iface,3); /* and create it again to get new sockets,..*/ return 0; } /* Check netmask */ if (ioctl(olsr_cnf->ioctl_s, SIOCGIFNETMASK, &ifr) < 0) { olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name); goto remove_interface; } #ifdef DEBUG OLSR_PRINTF(3, "\tNetmask:%s\n", sockaddr4_to_string(&buf, &ifr.ifr_netmask)); #endif /* DEBUG */ if (memcmp (&((struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifp->int_netmask))->sin_addr.s_addr, &((struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifr.ifr_netmask))->sin_addr.s_addr, olsr_cnf->ipsize) != 0) { /* New address */ OLSR_PRINTF(1, "IPv4 netmask changed for %s\n", ifr.ifr_name); OLSR_PRINTF(1, "\tOld:%s\n", ip4_to_string(&buf, ifp->int_netmask.sin_addr)); OLSR_PRINTF(1, "\tNew:%s\n", sockaddr4_to_string(&buf, &ifr.ifr_netmask)); ifp->int_netmask = *(struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifr.ifr_netmask); if_changes = 1; } if (!iface->cnf->ipv4_multicast.v4.s_addr) { /* Check broadcast address */ if (ioctl(olsr_cnf->ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) { olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name); goto remove_interface; } #ifdef DEBUG OLSR_PRINTF(3, "\tBroadcast address:%s\n", sockaddr4_to_string(&buf, &ifr.ifr_broadaddr)); #endif /* DEBUG */ if (ifp->int_broadaddr.sin_addr.s_addr != ((struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr))->sin_addr.s_addr) { /* New address */ OLSR_PRINTF(1, "IPv4 broadcast changed for %s\n", ifr.ifr_name); OLSR_PRINTF(1, "\tOld:%s\n", ip4_to_string(&buf, ifp->int_broadaddr.sin_addr)); OLSR_PRINTF(1, "\tNew:%s\n", sockaddr4_to_string(&buf, &ifr.ifr_broadaddr)); ifp->int_broadaddr = *(struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr); if_changes = 1; } } } if (if_changes) olsr_trigger_ifchange(ifp->if_index, ifp, IFCHG_IF_UPDATE); return if_changes; remove_interface: olsr_remove_interface(iface); return 0; } /** * Initializes the special interface used in * host-client emulation */ int add_hemu_if(struct olsr_if *iface) { struct interface *ifp; union olsr_ip_addr null_addr; uint32_t addr[4]; struct ipaddr_str buf; size_t name_size; if (!iface->host_emul) return -1; ifp = olsr_malloc(sizeof(struct interface), "Interface update 2"); memset(ifp, 0, sizeof(struct interface)); /* initialize backpointer */ ifp->olsr_if = iface; iface->configured = true; iface->interf = ifp; name_size = strlen("hcif01") + 1; ifp->is_hcif = true; ifp->int_name = olsr_malloc(name_size, "Interface update 3"); ifp->int_metric = 0; strscpy(ifp->int_name, "hcif01", name_size); OLSR_PRINTF(1, "Adding %s(host emulation):\n", ifp->int_name); OLSR_PRINTF(1, " Address:%s\n", olsr_ip_to_string(&buf, &iface->hemu_ip)); OLSR_PRINTF(1, " NB! This is a emulated interface\n that does not exist in the kernel!\n"); ifp->int_next = ifnet; ifnet = ifp; memset(&null_addr, 0, olsr_cnf->ipsize); if (ipequal(&null_addr, &olsr_cnf->main_addr)) { olsr_cnf->main_addr = iface->hemu_ip; olsr_cnf->unicast_src_ip = iface->hemu_ip; OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr)); olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr)); } ifp->int_mtu = OLSR_DEFAULT_MTU; ifp->int_mtu -= (olsr_cnf->ip_version == AF_INET6) ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE; /* Set up buffer */ net_add_buffer(ifp); if (olsr_cnf->ip_version == AF_INET) { struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); sin.sin_port = htons(10150); /* IP version 4 */ ifp->ip_addr.v4 = iface->hemu_ip.v4; memcpy(&((struct sockaddr_in *)&ifp->int_addr)->sin_addr, &iface->hemu_ip, olsr_cnf->ipsize); /* *We create one socket for each interface and bind *the socket to it. This to ensure that we can control *on what interface the message is transmitted */ ifp->olsr_socket = gethemusocket(&sin); if (ifp->olsr_socket < 0) { fprintf(stderr, "Could not initialize socket... exiting!\n\n"); olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n"); olsr_cnf->exit_value = EXIT_FAILURE; kill(getpid(), SIGINT); /* the kill command should not come back, just to be sure */ exit(1); } } else { /* IP version 6 */ memcpy(&ifp->ip_addr, &iface->hemu_ip, olsr_cnf->ipsize); } /* Send IP as first 4/16 bytes on socket */ memcpy(addr, iface->hemu_ip.v6.s6_addr, olsr_cnf->ipsize); addr[0] = htonl(addr[0]); addr[1] = htonl(addr[1]); addr[2] = htonl(addr[2]); addr[3] = htonl(addr[3]); if (send(ifp->olsr_socket, addr, olsr_cnf->ipsize, 0) != (int)olsr_cnf->ipsize) { fprintf(stderr, "Error sending IP!"); } /* Register socket */ add_olsr_socket(ifp->olsr_socket, &olsr_input_hostemu, NULL, NULL, SP_PR_READ); /* * Register functions for periodic message generation */ ifp->hello_gen_timer = olsr_start_timer(iface->cnf->hello_params.emission_interval * MSEC_PER_SEC, HELLO_JITTER, OLSR_TIMER_PERIODIC, olsr_cnf->lq_level == 0 ? &generate_hello : &olsr_output_lq_hello, ifp, hello_gen_timer_cookie); ifp->tc_gen_timer = olsr_start_timer(iface->cnf->tc_params.emission_interval * MSEC_PER_SEC, TC_JITTER, OLSR_TIMER_PERIODIC, olsr_cnf->lq_level == 0 ? &generate_tc : &olsr_output_lq_tc, ifp, tc_gen_timer_cookie); ifp->mid_gen_timer = olsr_start_timer(iface->cnf->mid_params.emission_interval * MSEC_PER_SEC, MID_JITTER, OLSR_TIMER_PERIODIC, &generate_mid, ifp, mid_gen_timer_cookie); ifp->hna_gen_timer = olsr_start_timer(iface->cnf->hna_params.emission_interval * MSEC_PER_SEC, HNA_JITTER, OLSR_TIMER_PERIODIC, &generate_hna, ifp, hna_gen_timer_cookie); /* Recalculate max topology hold time */ if (olsr_cnf->max_tc_vtime < iface->cnf->tc_params.emission_interval) olsr_cnf->max_tc_vtime = iface->cnf->tc_params.emission_interval; ifp->hello_etime = (olsr_reltime) (iface->cnf->hello_params.emission_interval * MSEC_PER_SEC); ifp->valtimes.hello = reltime_to_me(iface->cnf->hello_params.validity_time * MSEC_PER_SEC); ifp->valtimes.tc = reltime_to_me(iface->cnf->tc_params.validity_time * MSEC_PER_SEC); ifp->valtimes.mid = reltime_to_me(iface->cnf->mid_params.validity_time * MSEC_PER_SEC); ifp->valtimes.hna = reltime_to_me(iface->cnf->hna_params.validity_time * MSEC_PER_SEC); ifp->mode = iface->cnf->mode; return 1; } static char basenamestr[32]; static const char *if_basename(const char *name); static const char * if_basename(const char *name) { char *p = strchr(name, ':'); if (NULL == p || p - name >= (int)(sizeof(basenamestr) / sizeof(basenamestr[0]) - 1)) { return name; } memcpy(basenamestr, name, p - name); basenamestr[p - name] = 0; return basenamestr; } /** * Initializes a interface described by iface, * if it is set up and is of the correct type. * *@param iface the olsr_if struct describing the interface *@param debuglvl the debug level *@return -1 when emulated (iface->host_emul), 0 on error, 1 on succes */ int chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused))) { struct interface ifs, *ifp; struct ifreq ifr; union olsr_ip_addr null_addr; size_t name_size; #ifdef __linux__ int precedence = IPTOS_PREC(olsr_cnf->tos); int tos_bits = olsr_cnf->tos; #endif /* __linux__ */ if (iface->host_emul) return -1; memset(&ifr, 0, sizeof(struct ifreq)); memset(&ifs, 0, sizeof(struct interface)); strscpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name)); OLSR_PRINTF(debuglvl, "Checking %s:\n", ifr.ifr_name); /* Get flags (and check if interface exists) */ if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) { OLSR_PRINTF(debuglvl, "\tNo such interface!\n"); return 0; } ifs.int_flags = ifr.ifr_flags; if ( ( (ifs.int_flags & IFF_UP) == 0) || ( (ifs.int_flags & IFF_RUNNING) == 0) ) { OLSR_PRINTF(debuglvl, "\tInterface not up & running - skipping it...\n"); return 0; } /* Check broadcast */ if ((olsr_cnf->ip_version == AF_INET) && !iface->cnf->ipv4_multicast.v4.s_addr && /* Skip if fixed bcast */ (!(ifs.int_flags & IFF_BROADCAST))) { OLSR_PRINTF(debuglvl, "\tNo broadcast - skipping\n"); return 0; } if (ifs.int_flags & IFF_LOOPBACK) { OLSR_PRINTF(debuglvl, "\tThis is a loopback interface - skipping it...\n"); return 0; } ifs.is_hcif = false; /* trying to detect if interface is wireless. */ ifs.is_wireless = check_wireless_interface(ifr.ifr_name); if (ifs.is_wireless) OLSR_PRINTF(debuglvl, "\tWireless interface detected\n"); else OLSR_PRINTF(debuglvl, "\tNot a wireless interface\n"); /* IP version 6 */ if (olsr_cnf->ip_version == AF_INET6) { /* Get interface address */ struct ipaddr_str buf; if (0 == get_ipv6_address(iface->name, &ifs.int6_addr, (iface->cnf->ipv6_src.prefix_len == 0) ? NULL : (&iface->cnf->ipv6_src))) { OLSR_PRINTF(3, "\tCould not find ip address for %s with prefix %s.\n", ifr.ifr_name, olsr_ip_prefix_to_string(&iface->cnf->ipv6_src)); return 0; } OLSR_PRINTF(debuglvl, "\tAddress: %s\n", ip6_to_string(&buf, &iface->cnf->ipv6_multicast.v6)); /* Multicast */ memset(&ifs.int6_multaddr, 0, sizeof(ifs.int6_multaddr)); ifs.int6_multaddr.sin6_family = AF_INET6; ifs.int6_multaddr.sin6_flowinfo = htonl(0); ifs.int6_multaddr.sin6_scope_id = if_nametoindex(ifr.ifr_name); ifs.int6_multaddr.sin6_port = htons(olsr_cnf->olsrport); ifs.int6_multaddr.sin6_addr = iface->cnf->ipv6_multicast.v6; #ifdef __APPLE__ ifs.int6_multaddr.sin6_scope_id = 0; #endif /* __APPLE__ */ OLSR_PRINTF(debuglvl, "\tMulticast: %s\n", ip6_to_string(&buf, &ifs.int6_multaddr.sin6_addr)); } /* IP version 4 */ else { /* Get interface address (IPv4) */ if (iface->cnf->ipv4_src.v4.s_addr) { ifs.int_addr.sin_addr = iface->cnf->ipv4_src.v4; } else { if (ioctl(olsr_cnf->ioctl_s, SIOCGIFADDR, &ifr) < 0) { OLSR_PRINTF(debuglvl, "\tCould not get address of interface - skipping it\n"); return 0; } ifs.int_addr = *(struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifr.ifr_addr); } /* Find netmask */ if (ioctl(olsr_cnf->ioctl_s, SIOCGIFNETMASK, &ifr) < 0) { olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get netmask)", ifr.ifr_name); return 0; } ifs.int_netmask = *(struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifr.ifr_netmask); /* Find broadcast address */ if (iface->cnf->ipv4_multicast.v4.s_addr) { /* Specified broadcast */ memcpy(&((struct sockaddr_in *)&ifs.int_broadaddr)->sin_addr.s_addr, &iface->cnf->ipv4_multicast.v4, sizeof(uint32_t)); } else { /* Autodetect */ if (ioctl(olsr_cnf->ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) { olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name); return 0; } ifs.int_broadaddr = *(struct sockaddr_in *)ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr); } /* Deactivate IP spoof filter */ /* Disable ICMP redirects */ net_os_set_ifoptions(if_basename(ifr.ifr_name), &ifs); } /* Get interface index */ ifs.if_index = if_nametoindex(ifr.ifr_name); /* Set interface metric */ if (iface->cnf->weight.fixed) ifs.int_metric = iface->cnf->weight.value; else ifs.int_metric = calculate_if_metric(ifr.ifr_name); OLSR_PRINTF(1, "\tMetric: %d\n", ifs.int_metric); /* Get MTU */ if (ioctl(olsr_cnf->ioctl_s, SIOCGIFMTU, &ifr) < 0) ifs.int_mtu = OLSR_DEFAULT_MTU; else ifs.int_mtu = ifr.ifr_mtu; ifs.int_mtu -= (olsr_cnf->ip_version == AF_INET6) ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE; ifs.ttl_index = -32; /* For the first 32 TC's, fish-eye is disabled */ /* Set up buffer */ net_add_buffer(&ifs); OLSR_PRINTF(1, "\tMTU - IPhdr: %d\n", ifs.int_mtu); olsr_syslog(OLSR_LOG_INFO, "Adding interface %s\n", iface->name); OLSR_PRINTF(1, "\tIndex %d\n", ifs.if_index); if (olsr_cnf->ip_version == AF_INET) { struct ipaddr_str buf; OLSR_PRINTF(1, "\tAddress:%s\n", ip4_to_string(&buf, ifs.int_addr.sin_addr)); OLSR_PRINTF(1, "\tNetmask:%s\n", ip4_to_string(&buf, ifs.int_netmask.sin_addr)); OLSR_PRINTF(1, "\tBroadcast address:%s\n", ip4_to_string(&buf, ifs.int_broadaddr.sin_addr)); } else { struct ipaddr_str buf; OLSR_PRINTF(1, "\tAddress: %s\n", ip6_to_string(&buf, &ifs.int6_addr.sin6_addr)); OLSR_PRINTF(1, "\tMulticast: %s\n", ip6_to_string(&buf, &ifs.int6_multaddr.sin6_addr)); } name_size = strlen(if_basename(ifr.ifr_name)) + 1; ifs.int_name = olsr_malloc(name_size, "Interface update 3"); strscpy(ifs.int_name, if_basename(ifr.ifr_name), name_size); if (olsr_cnf->ip_version == AF_INET) { /* IP version 4 */ ifs.ip_addr.v4 = ifs.int_addr.sin_addr; /* *We create one socket for each interface and bind *the socket to it. This to ensure that we can control *on what interface the message is transmitted */ ifs.olsr_socket = getsocket(BUFSPACE, &ifs); ifs.send_socket = getsocket(0, &ifs); if (ifs.olsr_socket < 0) { fprintf(stderr, "Could not initialize socket... exiting!\n\n"); olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n"); olsr_cnf->exit_value = EXIT_FAILURE; free(ifs.int_name); kill(getpid(), SIGINT); return 0; } if (ifs.send_socket < 0) { OLSR_PRINTF(1, "Warning, transmission socket could not be initialized. Abort if-up.\n"); close (ifs.olsr_socket); free(ifs.int_name); return 0; } } else { /* IP version 6 */ ifs.ip_addr.v6 = ifs.int6_addr.sin6_addr; /* *We create one socket for each interface and bind *the socket to it. This to ensure that we can control *on what interface the message is transmitted */ ifs.olsr_socket = getsocket6(BUFSPACE, &ifs); ifs.send_socket = getsocket6(0, &ifs); if (ifs.olsr_socket < 0) { fprintf(stderr, "Could not initialize socket... exiting!\n\n"); olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n"); olsr_cnf->exit_value = EXIT_FAILURE; free(ifs.int_name); kill(getpid(), SIGINT); return 0; } if (ifs.send_socket < 0) { OLSR_PRINTF(1, "Warning, transmission socket could not be initialized. Abort if-up.\n"); close (ifs.olsr_socket); free(ifs.int_name); return 0; } join_mcast(&ifs, ifs.olsr_socket); join_mcast(&ifs, ifs.send_socket); } ifp = olsr_malloc(sizeof(struct interface), "Interface update 2"); iface->configured = 1; iface->interf = ifp; /* XXX bad code */ memcpy(ifp, &ifs, sizeof(struct interface)); /* initialize backpointer */ ifp->olsr_if = iface; ifp->immediate_send_tc = (iface->cnf->tc_params.emission_interval < iface->cnf->hello_params.emission_interval); if (olsr_cnf->max_jitter == 0) { /* max_jitter determines the max time to store to-be-send-messages, correlated with random() */ olsr_cnf->max_jitter = ifp->immediate_send_tc ? iface->cnf->tc_params.emission_interval : iface->cnf->hello_params.emission_interval; } ifp->gen_properties = NULL; ifp->int_next = ifnet; ifnet = ifp; set_buffer_timer(ifp); /* Register socket */ add_olsr_socket(ifp->olsr_socket, &olsr_input, NULL, NULL, SP_PR_READ); add_olsr_socket(ifp->send_socket, &olsr_input, NULL, NULL, SP_PR_READ); #ifdef __linux__ /* Set TOS */ if (setsockopt(ifp->send_socket, SOL_SOCKET, SO_PRIORITY, (char *)&precedence, sizeof(precedence)) < 0) { perror("setsockopt(SO_PRIORITY)"); olsr_syslog(OLSR_LOG_ERR, "OLSRD: setsockopt(SO_PRIORITY) error %m"); } if (olsr_cnf->ip_version == AF_INET) { if (setsockopt(ifp->send_socket, IPPROTO_IP, IP_TOS, (char *)&tos_bits, sizeof(tos_bits)) < 0) { perror("setsockopt(IP_TOS)"); olsr_syslog(OLSR_LOG_ERR, "setsockopt(IP_TOS) error %m"); } } else { /* IP version 6 */ if (setsockopt(ifp->send_socket, IPPROTO_IPV6, IPV6_TCLASS, (char *)&tos_bits, sizeof(tos_bits)) < 0) { perror("setsockopt(IPV6_TCLASS)"); olsr_syslog(OLSR_LOG_ERR, "setsockopt(IPV6_TCLASS) error %m"); } } #endif /* __linux__ */ /* *Initialize sequencenumber as a random 16bit value */ ifp->olsr_seqnum = random() & 0xFFFF; /* * Set main address if this is the only interface */ memset(&null_addr, 0, olsr_cnf->ipsize); if (ipequal(&null_addr, &olsr_cnf->main_addr)) { struct ipaddr_str buf; olsr_cnf->main_addr = ifp->ip_addr; olsr_cnf->unicast_src_ip = ifp->ip_addr; OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr)); olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr)); } /* * Register functions for periodic message generation */ ifp->hello_gen_timer = olsr_start_timer(iface->cnf->hello_params.emission_interval * MSEC_PER_SEC, HELLO_JITTER, OLSR_TIMER_PERIODIC, olsr_cnf->lq_level == 0 ? &generate_hello : &olsr_output_lq_hello, ifp, hello_gen_timer_cookie); ifp->tc_gen_timer = olsr_start_timer(iface->cnf->tc_params.emission_interval * MSEC_PER_SEC, TC_JITTER, OLSR_TIMER_PERIODIC, olsr_cnf->lq_level == 0 ? &generate_tc : &olsr_output_lq_tc, ifp, tc_gen_timer_cookie); ifp->mid_gen_timer = olsr_start_timer(iface->cnf->mid_params.emission_interval * MSEC_PER_SEC, MID_JITTER, OLSR_TIMER_PERIODIC, &generate_mid, ifp, mid_gen_timer_cookie); ifp->hna_gen_timer = olsr_start_timer(iface->cnf->hna_params.emission_interval * MSEC_PER_SEC, HNA_JITTER, OLSR_TIMER_PERIODIC, &generate_hna, ifp, hna_gen_timer_cookie); /* Recalculate max topology hold time */ if (olsr_cnf->max_tc_vtime < iface->cnf->tc_params.emission_interval) { olsr_cnf->max_tc_vtime = iface->cnf->tc_params.emission_interval; } ifp->hello_etime = (olsr_reltime) (iface->cnf->hello_params.emission_interval * MSEC_PER_SEC); ifp->valtimes.hello = reltime_to_me(iface->cnf->hello_params.validity_time * MSEC_PER_SEC); ifp->valtimes.tc = reltime_to_me(iface->cnf->tc_params.validity_time * MSEC_PER_SEC); ifp->valtimes.mid = reltime_to_me(iface->cnf->mid_params.validity_time * MSEC_PER_SEC); ifp->valtimes.hna = reltime_to_me(iface->cnf->hna_params.validity_time * MSEC_PER_SEC); ifp->mode = iface->cnf->mode; /* *Call possible ifchange functions registered by plugins */ olsr_trigger_ifchange(ifp->if_index, ifp, IFCHG_IF_ADD); return 1; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/unix/log.c000066400000000000000000000064311234304727700155220ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * System logging interface for GNU/Linux systems */ #include "../olsr_cfg.h" #include "../log.h" #include #include #ifdef __ANDROID__ #include #endif /* __ANDROID__ */ void olsr_openlog(const char *ident __attribute__((unused))) { #ifndef __ANDROID__ openlog(ident, LOG_PID | LOG_ODELAY, LOG_DAEMON); setlogmask(LOG_UPTO(LOG_INFO)); #endif /* __ANDROID__ */ return; } #if defined SYSLOG_NUMBERING && SYSLOG_NUMBERING unsigned int olsr_syslog_ctr = 0; void olsr_syslog_real(int level, const char *format, ...) { #else /* defined SYSLOG_NUMBERING && SYSLOG_NUMBERING */ void olsr_syslog(int level, const char *format, ...) { #endif /* defined SYSLOG_NUMBERING && SYSLOG_NUMBERING */ int linux_level; va_list arglist; switch (level) { case (OLSR_LOG_INFO): #ifdef __ANDROID__ linux_level = ANDROID_LOG_INFO; #else /* __ANDROID__ */ linux_level = LOG_INFO; #endif /* __ANDROID__ */ break; case (OLSR_LOG_ERR): #ifdef __ANDROID__ linux_level = ANDROID_LOG_ERROR; #else /* __ANDROID__ */ linux_level = LOG_ERR; #endif /* __ANDROID__ */ break; default: return; } va_start(arglist, format); #ifdef __ANDROID__ __android_log_vprint(linux_level, "olsrd", format, arglist); #else /* __ANDROID__ */ vsyslog(linux_level, format, arglist); #endif /* __ANDROID__ */ va_end(arglist); return; } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/unix/misc.c000066400000000000000000000046141234304727700156750ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #include #include #include "misc.h" #include "olsr_types.h" void clear_console(void) { static int len = -1; static char clear_buff[100]; int i; if (len < 0) { FILE *pip = popen("clear", "r"); for (len = 0; len < (int)sizeof(clear_buff); len++) { int c = fgetc(pip); if (c == EOF) break; clear_buff[len] = c; } pclose(pip); } for (i = 0; i < len; i++) fputc(clear_buff[i], stdout); fflush(stdout); } /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/000077500000000000000000000000001234304727700145505ustar00rootroot00000000000000olsrd-0.6.6.2/src/win32/apm.c000066400000000000000000000056751234304727700155060ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "apm.h" #include "defs.h" #include #include #define WIN32_LEAN_AND_MEAN #include #undef interface int apm_init(void) { struct olsr_apm_info ApmInfo; OLSR_PRINTF(3, "Initializing APM\n"); if (apm_read(&ApmInfo) < 0) return -1; apm_printinfo(&ApmInfo); return 0; } void apm_printinfo(struct olsr_apm_info *ApmInfo) { OLSR_PRINTF(5, "APM info:\n\tAC status %d\n\tBattery percentage %d%%\n\n", ApmInfo->ac_line_status, ApmInfo->battery_percentage); } int apm_read(struct olsr_apm_info *ApmInfo) { #if !defined WINCE SYSTEM_POWER_STATUS PowerStat; memset(ApmInfo, 0, sizeof(struct olsr_apm_info)); if (!GetSystemPowerStatus(&PowerStat)) return 0; ApmInfo->ac_line_status = (PowerStat.ACLineStatus == 1) ? OLSR_AC_POWERED : OLSR_BATTERY_POWERED; ApmInfo->battery_percentage = (PowerStat.BatteryLifePercent <= 100) ? PowerStat.BatteryLifePercent : 0; return 1; #else /* !defined WINCE */ return 0; #endif /* !defined WINCE */ } #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/arpa/000077500000000000000000000000001234304727700154735ustar00rootroot00000000000000olsrd-0.6.6.2/src/win32/arpa/inet.h000066400000000000000000000045331234304727700166100ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined TL_ARPA_INET_H_INCLUDED #define TL_ARPA_INET_H_INCLUDED #define WIN32_LEAN_AND_MEAN #include #include #undef interface #ifndef InetNtopA int inet_aton(const char *cp, struct in_addr *addr); int inet_pton(int af, const char *src, void *dst); char *inet_ntop(int af, const void *src, char *dst, int size); #endif #endif /* !defined TL_ARPA_INET_H_INCLUDED */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/ce/000077500000000000000000000000001234304727700151375ustar00rootroot00000000000000olsrd-0.6.6.2/src/win32/ce/ws2tcpip.h000066400000000000000000000013231234304727700170620ustar00rootroot00000000000000#ifdef _WIN32 #if !defined TL_WS2TCPIP_INCLUDED #define TL_WS2TCPIP_INCLUDED #define AF_INET6 23 struct in6_addr { unsigned char s6_addr[16]; }; struct sockaddr_in6 { short sin6_family; unsigned short sin6_port; unsigned long sin6_flowinfo; struct in6_addr sin6_addr; unsigned long sin6_scope_id; }; typedef int socklen_t; struct sockaddr_storage { unsigned char dummy[128]; }; #define IPPROTO_IPV6 41 #define IPV6_MULTICAST_IF 9 #define IPV6_ADD_MEMBERSHIP 12 struct ipv6_mreq { struct in6_addr ipv6mr_multiaddr; unsigned int ipv6mr_interface; }; #endif /* !defined TL_WS2TCPIP_INCLUDED */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/compat.c000066400000000000000000000265441234304727700162120ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ /* * Copyright (c) 1996,1999 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #ifdef _WIN32 #include #include #include #include #include #include #include #include "defs.h" void PError(char *Str); void WinSockPError(char *Str); void sleep(unsigned int Sec) { Sleep(Sec * 1000); } static unsigned int RandState; void srandom(unsigned int Seed) { RandState = Seed; } unsigned int random(void) { RandState = RandState * 1103515245 + 12345; return (RandState ^ (RandState >> 16)) & RAND_MAX; } int nanosleep(struct timespec *Req, struct timespec *Rem) { Sleep(Req->tv_sec * 1000 + Req->tv_nsec / 1000000); Rem->tv_sec = 0; Rem->tv_nsec = 0; return 0; } int gettimeofday(struct timeval *TVal, void *TZone __attribute__ ((unused))) { SYSTEMTIME SysTime; FILETIME FileTime; unsigned __int64 Ticks; GetSystemTime(&SysTime); SystemTimeToFileTime(&SysTime, &FileTime); Ticks = ((__int64) FileTime.dwHighDateTime << 32) | (__int64) FileTime.dwLowDateTime; Ticks -= 116444736000000000LL; TVal->tv_sec = (unsigned int)(Ticks / 10000000); TVal->tv_usec = (unsigned int)(Ticks % 10000000) / 10; return 0; } long times(struct tms *Dummy __attribute__ ((unused))) { return (long)GetTickCount(); } int inet_aton(const char *AddrStr, struct in_addr *Addr) { Addr->s_addr = inet_addr(AddrStr); return 1; } char * StrError(unsigned int ErrNo) { static char Msg[1000]; #if !defined WINCE FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrNo, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), Msg, sizeof(Msg), NULL); #else /* !defined WINCE */ short WideMsg[1000]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrNo, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), WideMsg, sizeof(WideMsg) / 2, NULL); if (WideCharToMultiByte(CP_ACP, 0, WideMsg, -1, Msg, sizeof(Msg), NULL, NULL) == 0) strscpy(Msg, "[cannot convert string]", sizeof(Msg)); #endif /* !defined WINCE */ return Msg; } void PError(char *Str) { fprintf(stderr, "ERROR - %s: %s", Str, StrError(GetLastError())); } void WinSockPError(char *Str) { fprintf(stderr, "ERROR - %s: %s", Str, StrError(WSAGetLastError())); } // XXX - not thread-safe, which is okay for our purposes void * dlopen(char *Name, int Flags __attribute__ ((unused))) { #if !defined WINCE return (void *)LoadLibrary(Name); #else /* !defined WINCE */ short WideName[1000]; MultiByteToWideChar(CP_ACP, 0, Name, -1, WideName, sizeof(WideName)); return (void *)LoadLibrary(WideName); #endif /* !defined WINCE */ } int dlclose(void *Handle) { FreeLibrary((HMODULE) Handle); return 0; } void * dlsym(void *Handle, const char *Name) { #if !defined WINCE return GetProcAddress((HMODULE) Handle, Name); #else /* !defined WINCE */ short WideName[1000]; MultiByteToWideChar(CP_ACP, 0, Name, -1, WideName, sizeof(WideName)); return GetProcAddress((HMODULE) Handle, WideName); #endif /* !defined WINCE */ } char * dlerror(void) { return StrError(GetLastError()); } #define NS_INADDRSZ 4 #define NS_IN6ADDRSZ 16 #define NS_INT16SZ 2 #ifndef InetNtopA static int inet_pton4(const char *src, unsigned char *dst) { int saw_digit, octets, ch; u_char tmp[NS_INADDRSZ], *tp; saw_digit = 0; octets = 0; *(tp = tmp) = 0; while ((ch = *src++) != '\0') { if (ch >= '0' && ch <= '9') { unsigned int new = *tp * 10 + (ch - '0'); if (new > 255) return (0); *tp = new; if (!saw_digit) { if (++octets > 4) return (0); saw_digit = 1; } } else if (ch == '.' && saw_digit) { if (octets == 4) return (0); *++tp = 0; saw_digit = 0; } else return (0); } if (octets < 4) return (0); memcpy(dst, tmp, NS_INADDRSZ); return (1); } static int inet_pton6(const char *src, unsigned char *dst) { static const char xdigits[] = "0123456789abcdef"; u_char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; const char *curtok; int ch, saw_xdigit; u_int val; tp = memset(tmp, '\0', NS_IN6ADDRSZ); endp = tp + NS_IN6ADDRSZ; colonp = NULL; if (*src == ':') if (*++src != ':') return (0); curtok = src; saw_xdigit = 0; val = 0; while ((ch = tolower(*src++)) != '\0') { const char *pch; pch = strchr(xdigits, ch); if (pch != NULL) { val <<= 4; val |= (pch - xdigits); if (val > 0xffff) return (0); saw_xdigit = 1; continue; } if (ch == ':') { curtok = src; if (!saw_xdigit) { if (colonp) return (0); colonp = tp; continue; } else if (*src == '\0') { return (0); } if (tp + NS_INT16SZ > endp) return (0); *tp++ = (u_char) (val >> 8) & 0xff; *tp++ = (u_char) val & 0xff; saw_xdigit = 0; val = 0; continue; } if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && inet_pton4(curtok, tp) > 0) { tp += NS_INADDRSZ; saw_xdigit = 0; break; } return (0); } if (saw_xdigit) { if (tp + NS_INT16SZ > endp) return (0); *tp++ = (u_char) (val >> 8) & 0xff; *tp++ = (u_char) val & 0xff; } if (colonp != NULL) { const int n = tp - colonp; int i; if (tp == endp) return (0); for (i = 1; i <= n; i++) { endp[-i] = colonp[n - i]; colonp[n - i] = 0; } tp = endp; } if (tp != endp) return (0); memcpy(dst, tmp, NS_IN6ADDRSZ); return (1); } int inet_pton(int af, const char *src, void *dst) { switch (af) { case AF_INET: return (inet_pton4(src, dst)); case AF_INET6: return (inet_pton6(src, dst)); default: return -1; } } static char * inet_ntop4(const unsigned char *src, char *dst, int size) { static const char fmt[] = "%u.%u.%u.%u"; char tmp[sizeof "255.255.255.255"]; if (sprintf(tmp, fmt, src[0], src[1], src[2], src[3]) > size) return (NULL); return strscpy(dst, tmp, size); } static char * inet_ntop6(const unsigned char *src, char *dst, int size) { char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; struct { int base, len; } best, cur; u_int words[NS_IN6ADDRSZ / NS_INT16SZ]; int i; memset(words, '\0', sizeof words); for (i = 0; i < NS_IN6ADDRSZ; i += 2) words[i / 2] = (src[i] << 8) | src[i + 1]; best.base = -1; best.len = 0; cur.base = -1; cur.len = 0; for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { if (words[i] == 0) { if (cur.base == -1) cur.base = i, cur.len = 1; else cur.len++; } else { if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; cur.base = -1; } } } if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; } if (best.base != -1 && best.len < 2) best.base = -1; tp = tmp; for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { if (best.base != -1 && i >= best.base && i < (best.base + best.len)) { if (i == best.base) *tp++ = ':'; continue; } if (i != 0) *tp++ = ':'; if (i == 6 && best.base == 0 && (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { if (!inet_ntop4(src + 12, tp, sizeof tmp - (tp - tmp))) return (NULL); tp += strlen(tp); break; } tp += sprintf(tp, "%x", words[i]); } if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) *tp++ = ':'; *tp++ = '\0'; if ((tp - tmp) > size) return (NULL); return strscpy(dst, tmp, size); } char * inet_ntop(int af, const void *src, char *dst, int size) { switch (af) { case AF_INET: return (inet_ntop4(src, dst, size)); case AF_INET6: return (inet_ntop6(src, dst, size)); default: return (NULL); } } #endif int isatty(int fd) { #if !defined WINCE HANDLE Hand; CONSOLE_SCREEN_BUFFER_INFO Info; unsigned long Events; if (fd == 0) { Hand = GetStdHandle(STD_INPUT_HANDLE); return GetNumberOfConsoleInputEvents(Hand, &Events); } else if (fd == 1) { Hand = GetStdHandle(STD_OUTPUT_HANDLE); return GetConsoleScreenBufferInfo(Hand, &Info); } else if (fd == 2) { Hand = GetStdHandle(STD_ERROR_HANDLE); return GetConsoleScreenBufferInfo(Hand, &Info); } return -1; #else /* !defined WINCE */ return 0; #endif /* !defined WINCE */ } #define CHUNK_SIZE 512 /* and we emulate a real write(2) syscall using send() */ int write(int fd, const void *buf, unsigned int count) { size_t written = 0; while (written < count) { ssize_t rc = send(fd, (const char *)buf + written, min(count - written, CHUNK_SIZE), 0); if (rc <= 0) { break; } written += rc; } return written; } #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/dlfcn.h000066400000000000000000000043131234304727700160100ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined TL_DLFCN_H_INCLUDED #define TL_DLFCN_H_INCLUDED #define RTLD_NOW 0 void *dlopen(char *Name, int Flags); int dlclose(void *Handle); void *dlsym(void *Handle, const char *Name); char *dlerror(void); #endif /* !defined TL_DLFCN_H_INCLUDED */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/dummy.c000066400000000000000000000035741234304727700160600ustar00rootroot00000000000000/* * dummy.c * * Created on: 12.02.2010 * Author: henning */ #ifdef _WIN32 #include "../defs.h" #include "../kernel_routes.h" #include "../kernel_tunnel.h" #include "../net_os.h" int olsr_os_init_iptunnel(const char * name __attribute__((unused))) { return -1; } void olsr_os_cleanup_iptunnel(const char * name __attribute__((unused))) { } struct olsr_iptunnel_entry *olsr_os_add_ipip_tunnel(union olsr_ip_addr *target __attribute__ ((unused)), bool transportV4 __attribute__ ((unused)), char *name __attribute__ ((unused))) { return NULL; } void olsr_os_del_ipip_tunnel(struct olsr_iptunnel_entry *t __attribute__ ((unused))) { return; } bool olsr_if_isup(const char * dev __attribute__ ((unused))) { return false; } int olsr_if_set_state(const char *dev __attribute__ ((unused)), bool up __attribute__ ((unused))) { return -1; } void olsr_os_niit_4to6_route(const struct olsr_ip_prefix *dst_v4 __attribute__ ((unused)), bool set __attribute__ ((unused))) { } void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6 __attribute__ ((unused)), bool set __attribute__ ((unused))) { } void olsr_os_inetgw_tunnel_route(uint32_t if_idx __attribute__ ((unused)), bool ipv4 __attribute__ ((unused)), bool set __attribute__ ((unused)), uint8_t table __attribute__ ((unused))) { } int olsr_os_policy_rule(int family __attribute__ ((unused)), int rttable __attribute__ ((unused)), uint32_t priority __attribute__ ((unused)), const char *if_name __attribute__ ((unused)), bool set __attribute__ ((unused))) { return -1; } int olsr_os_localhost_if(union olsr_ip_addr *ip __attribute__ ((unused)), bool create __attribute__ ((unused))) { return -1; } int olsr_os_ifip(int ifindex __attribute__ ((unused)), union olsr_ip_addr *ip __attribute__ ((unused)), bool create __attribute__ ((unused))) { return -1; } #endif /* _WIN32 */ olsrd-0.6.6.2/src/win32/ifnet.c000066400000000000000000000623661234304727700160360ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include #define random() rand() #define srandom(x) srand(x) #include #include "interfaces.h" #include "olsr.h" #include "parser.h" #include "defs.h" #include "net_os.h" #include "ifnet.h" #include "generate_msg.h" #include "scheduler.h" #include "mantissa.h" #include "lq_packet.h" #include "net_olsr.h" #include #include #include #define BUFSPACE (127*1024) /* max. input buffer size to request */ struct MibIpInterfaceRow { USHORT Family; ULONG64 InterfaceLuid; ULONG InterfaceIndex; ULONG MaxReassemblySize; ULONG64 InterfaceIdentifier; ULONG MinRouterAdvertisementInterval; ULONG MaxRouterAdvertisementInterval; BOOLEAN AdvertisingEnabled; BOOLEAN ForwardingEnabled; BOOLEAN WeakHostSend; BOOLEAN WeakHostReceive; BOOLEAN UseAutomaticMetric; BOOLEAN UseNeighborUnreachabilityDetection; BOOLEAN ManagedAddressConfigurationSupported; BOOLEAN OtherStatefulConfigurationSupported; BOOLEAN AdvertiseDefaultRoute; INT RouterDiscoveryBehavior; ULONG DadTransmits; ULONG BaseReachableTime; ULONG RetransmitTime; ULONG PathMtuDiscoveryTimeout; INT LinkLocalAddressBehavior; ULONG LinkLocalAddressTimeout; ULONG ZoneIndices[16]; ULONG SitePrefixLength; ULONG Metric; ULONG NlMtu; BOOLEAN Connected; BOOLEAN SupportsWakeUpPatterns; BOOLEAN SupportsNeighborDiscovery; BOOLEAN SupportsRouterDiscovery; ULONG ReachableTime; BYTE TransmitOffload; BYTE ReceiveOffload; BOOLEAN DisableDefaultRoutes; }; typedef DWORD(__stdcall * GETIPINTERFACEENTRY) (struct MibIpInterfaceRow * Row); typedef DWORD(__stdcall * GETADAPTERSADDRESSES) (ULONG Family, DWORD Flags, PVOID Reserved, PIP_ADAPTER_ADDRESSES pAdapterAddresses, PULONG pOutBufLen); struct InterfaceInfo { unsigned int Index; int Mtu; int Metric; unsigned int Addr; unsigned int Mask; unsigned int Broad; char Guid[39]; }; void WinSockPError(char *); char *StrError(unsigned int ErrNo); void ListInterfaces(void); int GetIntInfo(struct InterfaceInfo *Info, char *Name); #define MAX_INTERFACES 100 static void MiniIndexToIntName(char *String, int MiniIndex) { const char *HexDigits = "0123456789abcdef"; String[0] = 'i'; String[1] = 'f'; String[2] = HexDigits[(MiniIndex >> 4) & 15]; String[3] = HexDigits[MiniIndex & 15]; String[4] = 0; } static int IntNameToMiniIndex(int *MiniIndex, char *String) { const char *HexDigits = "0123456789abcdef"; int i, k; char ch; if ((String[0] != 'i' && String[0] != 'I') || (String[1] != 'f' && String[1] != 'F')) return -1; *MiniIndex = 0; for (i = 2; i < 4; i++) { ch = String[i]; if (ch >= 'A' && ch <= 'F') ch += 32; for (k = 0; k < 16 && ch != HexDigits[k]; k++); if (k == 16) return -1; *MiniIndex = (*MiniIndex << 4) | k; } return 0; } static int FriendlyNameToMiniIndex(int *MiniIndex, char *String) { unsigned long BuffLen; unsigned long Res; IP_ADAPTER_ADDRESSES AdAddr[MAX_INTERFACES], *WalkerAddr; char FriendlyName[MAX_INTERFACE_NAME_LEN]; HMODULE h; GETADAPTERSADDRESSES pfGetAdaptersAddresses; h = LoadLibrary("iphlpapi.dll"); if (h == NULL) { fprintf(stderr, "LoadLibrary() = %08lx", GetLastError()); return -1; } pfGetAdaptersAddresses = (GETADAPTERSADDRESSES) GetProcAddress(h, "GetAdaptersAddresses"); if (pfGetAdaptersAddresses == NULL) { fprintf(stderr, "Unable to use adapter friendly name (GetProcAddress() = %08lx)\n", GetLastError()); return -1; } BuffLen = sizeof(AdAddr); Res = pfGetAdaptersAddresses(AF_INET, 0, NULL, AdAddr, &BuffLen); if (Res != NO_ERROR) { fprintf(stderr, "GetAdaptersAddresses() = %08lx", GetLastError()); return -1; } for (WalkerAddr = AdAddr; WalkerAddr != NULL; WalkerAddr = WalkerAddr->Next) { OLSR_PRINTF(5, "Index = %08x - ", (int)WalkerAddr->IfIndex); wcstombs(FriendlyName, WalkerAddr->FriendlyName, MAX_INTERFACE_NAME_LEN); OLSR_PRINTF(5, "Friendly name = %s\n", FriendlyName); if (strncmp(FriendlyName, String, MAX_INTERFACE_NAME_LEN) == 0) break; } if (WalkerAddr == NULL) { fprintf(stderr, "No such interface: %s!\n", String); return -1; } *MiniIndex = WalkerAddr->IfIndex & 255; return 0; } int GetIntInfo(struct InterfaceInfo *Info, char *Name) { int MiniIndex; unsigned char Buff[MAX_INTERFACES * sizeof(MIB_IFROW) + 4]; MIB_IFTABLE *IfTable; unsigned long BuffLen; unsigned long Res; int TabIdx; IP_ADAPTER_INFO AdInfo[MAX_INTERFACES], *Walker; HMODULE Lib; struct MibIpInterfaceRow Row; GETIPINTERFACEENTRY InterfaceEntry; if (olsr_cnf->ip_version == AF_INET6) { fprintf(stderr, "IPv6 not supported by GetIntInfo()!\n"); return -1; } if ((Name[0] != 'i' && Name[0] != 'I') || (Name[1] != 'f' && Name[1] != 'F')) { if (FriendlyNameToMiniIndex(&MiniIndex, Name) < 0) { fprintf(stderr, "No such interface: %s!\n", Name); return -1; } } else { if (IntNameToMiniIndex(&MiniIndex, Name) < 0) { fprintf(stderr, "No such interface: %s!\n", Name); return -1; } } IfTable = (MIB_IFTABLE *) Buff; BuffLen = sizeof(Buff); Res = GetIfTable(IfTable, &BuffLen, FALSE); if (Res != NO_ERROR) { fprintf(stderr, "GetIfTable() = %08lx, %s", Res, StrError(Res)); return -1; } for (TabIdx = 0; TabIdx < (int)IfTable->dwNumEntries; TabIdx++) { OLSR_PRINTF(5, "Index = %08x\n", (int)IfTable->table[TabIdx].dwIndex); if ((int)(IfTable->table[TabIdx].dwIndex & 255) == MiniIndex) break; } if (TabIdx == (int)IfTable->dwNumEntries) { fprintf(stderr, "No such interface: %s!\n", Name); return -1; } Info->Index = IfTable->table[TabIdx].dwIndex; Info->Mtu = (int)IfTable->table[TabIdx].dwMtu; Info->Mtu -= (olsr_cnf->ip_version == AF_INET6) ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE; Lib = LoadLibrary("iphlpapi.dll"); if (Lib == NULL) { fprintf(stderr, "Cannot load iphlpapi.dll: %08lx\n", GetLastError()); return -1; } InterfaceEntry = (GETIPINTERFACEENTRY) GetProcAddress(Lib, "GetIpInterfaceEntry"); if (InterfaceEntry == NULL) { OLSR_PRINTF(5, "Not running on Vista - setting interface metric to 0.\n"); Info->Metric = 0; } else { memset(&Row, 0, sizeof(struct MibIpInterfaceRow)); Row.Family = AF_INET; Row.InterfaceIndex = Info->Index; Res = InterfaceEntry(&Row); if (Res != NO_ERROR) { fprintf(stderr, "GetIpInterfaceEntry() = %08lx", Res); FreeLibrary(Lib); return -1; } Info->Metric = Row.Metric; OLSR_PRINTF(5, "Running on Vista - interface metric is %d.\n", Info->Metric); } FreeLibrary(Lib); BuffLen = sizeof(AdInfo); Res = GetAdaptersInfo(AdInfo, &BuffLen); if (Res != NO_ERROR) { fprintf(stderr, "GetAdaptersInfo() = %08lx, %s", GetLastError(), StrError(Res)); return -1; } for (Walker = AdInfo; Walker != NULL; Walker = Walker->Next) { OLSR_PRINTF(5, "Index = %08x\n", (int)Walker->Index); if ((int)(Walker->Index & 255) == MiniIndex) break; } if (Walker == NULL) { fprintf(stderr, "No such interface: %s!\n", Name); return -1; } inet_pton(AF_INET, Walker->IpAddressList.IpAddress.String, &Info->Addr); inet_pton(AF_INET, Walker->IpAddressList.IpMask.String, &Info->Mask); Info->Broad = Info->Addr | ~Info->Mask; strscpy(Info->Guid, Walker->AdapterName, sizeof(Info->Guid)); if ((IfTable->table[TabIdx].dwOperStatus != MIB_IF_OPER_STATUS_CONNECTED && IfTable->table[TabIdx].dwOperStatus != MIB_IF_OPER_STATUS_OPERATIONAL) || Info->Addr == 0) { OLSR_PRINTF(3, "Interface %s not up!\n", Name); return -1; } return 0; } #if !defined OID_802_11_CONFIGURATION #define OID_802_11_CONFIGURATION 0x0d010211 #endif /* !defined OID_802_11_CONFIGURATION */ #if !defined IOCTL_NDIS_QUERY_GLOBAL_STATS #define IOCTL_NDIS_QUERY_GLOBAL_STATS 0x00170002 #endif /* !defined IOCTL_NDIS_QUERY_GLOBAL_STATS */ static int IsWireless(char *IntName) { #if !defined WINCE struct InterfaceInfo Info; char DevName[43]; HANDLE DevHand; unsigned int ErrNo; unsigned int Oid; unsigned char OutBuff[100]; unsigned long OutBytes; if (GetIntInfo(&Info, IntName) < 0) return -1; DevName[0] = '\\'; DevName[1] = '\\'; DevName[2] = '.'; DevName[3] = '\\'; strscpy(DevName + 4, Info.Guid, sizeof(DevName) - 4); OLSR_PRINTF(5, "Checking whether interface %s is wireless.\n", DevName); DevHand = CreateFile(DevName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (DevHand == INVALID_HANDLE_VALUE) { ErrNo = GetLastError(); OLSR_PRINTF(5, "CreateFile() = %08x, %s\n", ErrNo, StrError(ErrNo)); return -1; } Oid = OID_802_11_CONFIGURATION; if (!DeviceIoControl(DevHand, IOCTL_NDIS_QUERY_GLOBAL_STATS, &Oid, sizeof(Oid), OutBuff, sizeof(OutBuff), &OutBytes, NULL)) { ErrNo = GetLastError(); CloseHandle(DevHand); if (ErrNo == ERROR_GEN_FAILURE || ErrNo == ERROR_INVALID_PARAMETER) { OLSR_PRINTF(5, "OID not supported. Device probably not wireless.\n"); return 0; } OLSR_PRINTF(5, "DeviceIoControl() = %08x, %s\n", ErrNo, StrError(ErrNo)); return -1; } CloseHandle(DevHand); #endif /* !defined WINCE */ return 1; } void ListInterfaces(void) { IP_ADAPTER_INFO AdInfo[MAX_INTERFACES], *Walker; unsigned long AdInfoLen; char IntName[5]; IP_ADDR_STRING *Walker2; unsigned long Res; int IsWlan; if (olsr_cnf->ip_version == AF_INET6) { fprintf(stderr, "IPv6 not supported by ListInterfaces()!\n"); return; } AdInfoLen = sizeof(AdInfo); Res = GetAdaptersInfo(AdInfo, &AdInfoLen); if (Res == ERROR_NO_DATA) { printf("No interfaces detected.\n"); return; } if (Res != NO_ERROR) { fprintf(stderr, "GetAdaptersInfo() = %08lx, %s", Res, StrError(Res)); return; } for (Walker = AdInfo; Walker != NULL; Walker = Walker->Next) { OLSR_PRINTF(5, "Index = %08x\n", (int)Walker->Index); MiniIndexToIntName(IntName, Walker->Index); printf("%s: ", IntName); IsWlan = IsWireless(IntName); if (IsWlan < 0) printf("?"); else if (IsWlan == 0) printf("-"); else printf("+"); for (Walker2 = &Walker->IpAddressList; Walker2 != NULL; Walker2 = Walker2->Next) printf(" %s", Walker2->IpAddress.String); printf("\n"); } } int add_hemu_if(struct olsr_if *iface) { struct interface *ifp; union olsr_ip_addr null_addr; uint32_t addr[4]; struct ipaddr_str buf; size_t name_size; if (!iface->host_emul) return -1; ifp = olsr_malloc(sizeof(struct interface), "Interface update 2"); memset(ifp, 0, sizeof(struct interface)); /* initialize backpointer */ ifp->olsr_if = iface; iface->configured = true; iface->interf = ifp; name_size = strlen("hcif01") + 1; ifp->is_hcif = true; ifp->int_name = olsr_malloc(name_size, "Interface update 3"); ifp->int_metric = 0; strscpy(ifp->int_name, "hcif01", name_size); OLSR_PRINTF(1, "Adding %s(host emulation):\n", ifp->int_name); OLSR_PRINTF(1, " Address:%s\n", olsr_ip_to_string(&buf, &iface->hemu_ip)); OLSR_PRINTF(1, " NB! This is a emulated interface\n that does not exist in the kernel!\n"); ifp->int_next = ifnet; ifnet = ifp; memset(&null_addr, 0, olsr_cnf->ipsize); if (ipequal(&null_addr, &olsr_cnf->main_addr)) { olsr_cnf->main_addr = iface->hemu_ip; olsr_cnf->unicast_src_ip = iface->hemu_ip; OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr)); } ifp->int_mtu = OLSR_DEFAULT_MTU; ifp->int_mtu -= (olsr_cnf->ip_version == AF_INET6) ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE; /* Set up buffer */ net_add_buffer(ifp); if (olsr_cnf->ip_version == AF_INET) { struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); sin.sin_port = htons(10150); /* IP version 4 */ ifp->ip_addr.v4 = iface->hemu_ip.v4; memcpy(&((struct sockaddr_in *)&ifp->int_addr)->sin_addr, &iface->hemu_ip, olsr_cnf->ipsize); /* *We create one socket for each interface and bind *the socket to it. This to ensure that we can control *on what interface the message is transmitted */ ifp->olsr_socket = gethemusocket(&sin); if (ifp->olsr_socket < 0) { fprintf(stderr, "Could not initialize socket... exiting!\n\n"); exit(1); } } else { /* IP version 6 */ memcpy(&ifp->ip_addr, &iface->hemu_ip, olsr_cnf->ipsize); } /* Send IP as first 4/16 bytes on socket */ memcpy(addr, iface->hemu_ip.v6.s6_addr, olsr_cnf->ipsize); addr[0] = htonl(addr[0]); addr[1] = htonl(addr[1]); addr[2] = htonl(addr[2]); addr[3] = htonl(addr[3]); if (send(ifp->olsr_socket, (char *)addr, olsr_cnf->ipsize, 0) != (int)olsr_cnf->ipsize) { fprintf(stderr, "Error sending IP!"); } /* Register socket */ add_olsr_socket(ifp->olsr_socket, &olsr_input_hostemu, NULL, NULL, SP_PR_READ); /* * Register functions for periodic message generation */ ifp->hello_gen_timer = olsr_start_timer(iface->cnf->hello_params.emission_interval * MSEC_PER_SEC, HELLO_JITTER, OLSR_TIMER_PERIODIC, olsr_cnf->lq_level == 0 ? &generate_hello : &olsr_output_lq_hello, ifp, hello_gen_timer_cookie); ifp->tc_gen_timer = olsr_start_timer(iface->cnf->tc_params.emission_interval * MSEC_PER_SEC, TC_JITTER, OLSR_TIMER_PERIODIC, olsr_cnf->lq_level == 0 ? &generate_tc : &olsr_output_lq_tc, ifp, tc_gen_timer_cookie); ifp->mid_gen_timer = olsr_start_timer(iface->cnf->mid_params.emission_interval * MSEC_PER_SEC, MID_JITTER, OLSR_TIMER_PERIODIC, &generate_mid, ifp, mid_gen_timer_cookie); ifp->hna_gen_timer = olsr_start_timer(iface->cnf->hna_params.emission_interval * MSEC_PER_SEC, HNA_JITTER, OLSR_TIMER_PERIODIC, &generate_hna, ifp, hna_gen_timer_cookie); /* Recalculate max topology hold time */ if (olsr_cnf->max_tc_vtime < iface->cnf->tc_params.emission_interval) olsr_cnf->max_tc_vtime = iface->cnf->tc_params.emission_interval; ifp->hello_etime = (olsr_reltime) (iface->cnf->hello_params.emission_interval * MSEC_PER_SEC); ifp->valtimes.hello = reltime_to_me(iface->cnf->hello_params.validity_time * MSEC_PER_SEC); ifp->valtimes.tc = reltime_to_me(iface->cnf->tc_params.validity_time * MSEC_PER_SEC); ifp->valtimes.mid = reltime_to_me(iface->cnf->mid_params.validity_time * MSEC_PER_SEC); ifp->valtimes.hna = reltime_to_me(iface->cnf->hna_params.validity_time * MSEC_PER_SEC); ifp->mode = iface->cnf->mode; return 1; } int chk_if_changed(struct olsr_if *iface) { struct ipaddr_str buf; struct interface *Int; struct InterfaceInfo Info; int Res; int IsWlan; union olsr_ip_addr OldVal, NewVal; struct sockaddr_in *AddrIn; if (olsr_cnf->ip_version == AF_INET6) { fprintf(stderr, "IPv6 not supported by chk_if_changed()!\n"); return 0; } #ifdef DEBUG OLSR_PRINTF(3, "Checking if %s is set down or changed\n", iface->name); #endif /* DEBUG */ Int = iface->interf; if (GetIntInfo(&Info, iface->name) < 0) { olsr_remove_interface(iface); return 1; } Res = 0; IsWlan = IsWireless(iface->name); if (IsWlan < 0) IsWlan = 1; if (Int->is_wireless != IsWlan) { OLSR_PRINTF(1, "\tLAN/WLAN change: %d -> %d.\n", Int->is_wireless, IsWlan); Int->is_wireless = IsWlan; if (iface->cnf->weight.fixed) Int->int_metric = iface->cnf->weight.value; else Int->int_metric = Info.Metric; Res = 1; } if (Int->int_mtu != Info.Mtu) { OLSR_PRINTF(1, "\tMTU change: %d -> %d.\n", (int)Int->int_mtu, Info.Mtu); Int->int_mtu = Info.Mtu; net_remove_buffer(Int); net_add_buffer(Int); Res = 1; } OldVal.v4 = ((struct sockaddr_in *)&Int->int_addr)->sin_addr; NewVal.v4.s_addr = Info.Addr; #ifdef DEBUG OLSR_PRINTF(3, "\tAddress: %s\n", olsr_ip_to_string(&buf, &NewVal)); #endif /* DEBUG */ if (NewVal.v4.s_addr != OldVal.v4.s_addr) { OLSR_PRINTF(1, "\tAddress change.\n"); OLSR_PRINTF(1, "\tOld: %s\n", olsr_ip_to_string(&buf, &OldVal)); OLSR_PRINTF(1, "\tNew: %s\n", olsr_ip_to_string(&buf, &NewVal)); Int->ip_addr.v4 = NewVal.v4; AddrIn = (struct sockaddr_in *)&Int->int_addr; AddrIn->sin_family = AF_INET; AddrIn->sin_port = 0; AddrIn->sin_addr = NewVal.v4; if (olsr_cnf->main_addr.v4.s_addr == OldVal.v4.s_addr) { OLSR_PRINTF(1, "\tMain address change.\n"); olsr_cnf->main_addr.v4 = NewVal.v4; } Res = 1; } else OLSR_PRINTF(3, "\tNo address change.\n"); OldVal.v4 = ((struct sockaddr_in *)&Int->int_netmask)->sin_addr; NewVal.v4.s_addr = Info.Mask; #ifdef DEBUG OLSR_PRINTF(3, "\tNetmask: %s\n", olsr_ip_to_string(&buf, &NewVal)); #endif /* DEBUG */ if (NewVal.v4.s_addr != OldVal.v4.s_addr) { OLSR_PRINTF(1, "\tNetmask change.\n"); OLSR_PRINTF(1, "\tOld: %s\n", olsr_ip_to_string(&buf, &OldVal)); OLSR_PRINTF(1, "\tNew: %s\n", olsr_ip_to_string(&buf, &NewVal)); AddrIn = (struct sockaddr_in *)&Int->int_netmask; AddrIn->sin_family = AF_INET; AddrIn->sin_port = 0; AddrIn->sin_addr = NewVal.v4; Res = 1; } else OLSR_PRINTF(3, "\tNo netmask change.\n"); OldVal.v4 = ((struct sockaddr_in *)&Int->int_broadaddr)->sin_addr; NewVal.v4.s_addr = Info.Broad; #ifdef DEBUG OLSR_PRINTF(3, "\tBroadcast address: %s\n", olsr_ip_to_string(&buf, &NewVal)); #endif /* DEBUG */ if (NewVal.v4.s_addr != OldVal.v4.s_addr) { OLSR_PRINTF(1, "\tBroadcast address change.\n"); OLSR_PRINTF(1, "\tOld: %s\n", olsr_ip_to_string(&buf, &OldVal)); OLSR_PRINTF(1, "\tNew: %s\n", olsr_ip_to_string(&buf, &NewVal)); AddrIn = (struct sockaddr_in *)&Int->int_broadaddr; AddrIn->sin_family = AF_INET; AddrIn->sin_port = 0; AddrIn->sin_addr = NewVal.v4; Res = 1; } else OLSR_PRINTF(3, "\tNo broadcast address change.\n"); if (Res != 0) olsr_trigger_ifchange(Int->if_index, Int, IFCHG_IF_UPDATE); return Res; } int chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused))) { struct ipaddr_str buf; struct InterfaceInfo Info; struct interface *New; union olsr_ip_addr NullAddr; int IsWlan; struct sockaddr_in *AddrIn; size_t name_size; if (olsr_cnf->ip_version == AF_INET6) { fprintf(stderr, "IPv6 not supported by chk_if_up()!\n"); return 0; } if (GetIntInfo(&Info, iface->name) < 0) return 0; New = olsr_malloc(sizeof(struct interface), "Interface 1"); /* initialize backpointer */ New->olsr_if = iface; New->immediate_send_tc = (iface->cnf->tc_params.emission_interval < iface->cnf->hello_params.emission_interval); if (olsr_cnf->max_jitter == 0) { /* max_jitter determines the max time to store to-be-send-messages, correlated with random() */ olsr_cnf->max_jitter = New->immediate_send_tc ? iface->cnf->tc_params.emission_interval : iface->cnf->hello_params.emission_interval; } New->gen_properties = NULL; AddrIn = (struct sockaddr_in *)&New->int_addr; AddrIn->sin_family = AF_INET; AddrIn->sin_port = 0; AddrIn->sin_addr.s_addr = Info.Addr; AddrIn = (struct sockaddr_in *)&New->int_netmask; AddrIn->sin_family = AF_INET; AddrIn->sin_port = 0; AddrIn->sin_addr.s_addr = Info.Mask; AddrIn = (struct sockaddr_in *)&New->int_broadaddr; AddrIn->sin_family = AF_INET; AddrIn->sin_port = 0; AddrIn->sin_addr.s_addr = Info.Broad; if (iface->cnf->ipv4_multicast.v4.s_addr != 0) AddrIn->sin_addr = iface->cnf->ipv4_multicast.v4; New->int_flags = 0; New->is_hcif = false; New->int_mtu = Info.Mtu; name_size = strlen(iface->name) + 1; New->int_name = olsr_malloc(name_size, "Interface 2"); strscpy(New->int_name, iface->name, name_size); IsWlan = IsWireless(iface->name); if (IsWlan < 0) IsWlan = 1; New->is_wireless = IsWlan; if (iface->cnf->weight.fixed) New->int_metric = iface->cnf->weight.value; else New->int_metric = Info.Metric; New->olsr_seqnum = random() & 0xffff; New->ttl_index = -32; /* For the first 32 TC's, fish-eye is disabled */ OLSR_PRINTF(1, "\tInterface %s set up for use with index %d\n\n", iface->name, New->if_index); OLSR_PRINTF(1, "\tMTU: %d\n", New->int_mtu); OLSR_PRINTF(1, "\tAddress: %s\n", sockaddr4_to_string(&buf, (const struct sockaddr *)&New->int_addr)); OLSR_PRINTF(1, "\tNetmask: %s\n", sockaddr4_to_string(&buf, (const struct sockaddr *)&New->int_netmask)); OLSR_PRINTF(1, "\tBroadcast address: %s\n", sockaddr4_to_string(&buf, (const struct sockaddr *)&New->int_broadaddr)); New->ip_addr.v4 = New->int_addr.sin_addr; New->if_index = Info.Index; OLSR_PRINTF(3, "\tKernel index: %08x\n", New->if_index); New->olsr_socket = getsocket(BUFSPACE, New); New->send_socket = getsocket(0, New); if (New->olsr_socket < 0) { fprintf(stderr, "Could not initialize socket... exiting!\n\n"); exit(1); } add_olsr_socket(New->olsr_socket, &olsr_input, NULL, NULL, SP_PR_READ); New->int_next = ifnet; ifnet = New; iface->interf = New; iface->configured = 1; memset(&NullAddr, 0, olsr_cnf->ipsize); if (ipequal(&NullAddr, &olsr_cnf->main_addr)) { olsr_cnf->main_addr = New->ip_addr; olsr_cnf->unicast_src_ip = New->ip_addr; OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr)); } net_add_buffer(New); /* * Register functions for periodic message generation */ New->hello_gen_timer = olsr_start_timer(iface->cnf->hello_params.emission_interval * MSEC_PER_SEC, HELLO_JITTER, OLSR_TIMER_PERIODIC, olsr_cnf->lq_level == 0 ? &generate_hello : &olsr_output_lq_hello, New, hello_gen_timer_cookie); New->tc_gen_timer = olsr_start_timer(iface->cnf->tc_params.emission_interval * MSEC_PER_SEC, TC_JITTER, OLSR_TIMER_PERIODIC, olsr_cnf->lq_level == 0 ? &generate_tc : &olsr_output_lq_tc, New, tc_gen_timer_cookie); New->mid_gen_timer = olsr_start_timer(iface->cnf->mid_params.emission_interval * MSEC_PER_SEC, MID_JITTER, OLSR_TIMER_PERIODIC, &generate_mid, New, mid_gen_timer_cookie); New->hna_gen_timer = olsr_start_timer(iface->cnf->hna_params.emission_interval * MSEC_PER_SEC, HNA_JITTER, OLSR_TIMER_PERIODIC, &generate_hna, New, hna_gen_timer_cookie); if (olsr_cnf->max_tc_vtime < iface->cnf->tc_params.emission_interval) olsr_cnf->max_tc_vtime = iface->cnf->tc_params.emission_interval; New->hello_etime = (olsr_reltime) (iface->cnf->hello_params.emission_interval * MSEC_PER_SEC); New->valtimes.hello = reltime_to_me(iface->cnf->hello_params.validity_time * MSEC_PER_SEC); New->valtimes.tc = reltime_to_me(iface->cnf->tc_params.validity_time * MSEC_PER_SEC); New->valtimes.mid = reltime_to_me(iface->cnf->mid_params.validity_time * MSEC_PER_SEC); New->valtimes.hna = reltime_to_me(iface->cnf->hna_params.validity_time * MSEC_PER_SEC); New->mode = iface->cnf->mode; olsr_trigger_ifchange(New->if_index, New, IFCHG_IF_ADD); return 1; } void check_interface_updates(void *dummy __attribute__ ((unused))) { struct olsr_if *IntConf; #ifdef DEBUG OLSR_PRINTF(3, "Checking for updates in the interface set\n"); #endif /* DEBUG */ for (IntConf = olsr_cnf->interfaces; IntConf != NULL; IntConf = IntConf->next) { if (IntConf->host_emul) continue; if (olsr_cnf->host_emul) /* XXX: TEMPORARY! */ continue; if (IntConf->configured) chk_if_changed(IntConf); else chk_if_up(IntConf, 3); } } #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/kernel_routes.c000066400000000000000000000136511234304727700176030ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include #include "net/route.h" #include "kernel_routes.h" #include "net_olsr.h" #include "ipcalc.h" #include "ipc_frontend.h" #define WIN32_LEAN_AND_MEAN #include #include char *StrError(unsigned int ErrNo); /** *Insert a route in the kernel routing table * *@param rt the route to add * *@return negative on error */ int olsr_ioctl_add_route(const struct rt_entry *rt) { MIB_IPFORWARDROW Row; union olsr_ip_addr mask; unsigned long Res; struct interface *iface = if_ifwithindex(rt->rt_best->rtp_nexthop.iif_index); OLSR_PRINTF(2, "KERN: Adding %s\n", olsr_rt_to_string(rt)); memset(&Row, 0, sizeof(MIB_IPFORWARDROW)); Row.dwForwardDest = rt->rt_dst.prefix.v4.s_addr; if (!olsr_prefix_to_netmask(&mask, rt->rt_dst.prefix_len)) { return -1; } else { Row.dwForwardMask = mask.v4.s_addr; } Row.dwForwardPolicy = 0; Row.dwForwardNextHop = rt->rt_best->rtp_nexthop.gateway.v4.s_addr; Row.dwForwardIfIndex = rt->rt_best->rtp_nexthop.iif_index; // MIB_IPROUTE_TYPE_DIRECT and MIB_IPROUTE_TYPE_INDIRECT Row.dwForwardType = (rt->rt_dst.prefix.v4.s_addr == rt->rt_best->rtp_nexthop.gateway.v4.s_addr) ? 3 : 4; Row.dwForwardProto = 3; // MIB_IPPROTO_NETMGMT Row.dwForwardAge = INFINITE; Row.dwForwardNextHopAS = 0; Row.dwForwardMetric1 = iface ? iface->int_metric : 0 + olsr_fib_metric(&rt->rt_best->rtp_metric); Row.dwForwardMetric2 = -1; Row.dwForwardMetric3 = -1; Row.dwForwardMetric4 = -1; Row.dwForwardMetric5 = -1; Res = SetIpForwardEntry(&Row); if (Res != NO_ERROR) { if (Res != ERROR_NOT_FOUND) fprintf(stderr, "SetIpForwardEntry() = %08lx, %s", Res, StrError(Res)); Res = CreateIpForwardEntry(&Row); } if (Res != NO_ERROR) { fprintf(stderr, "CreateIpForwardEntry() = %08lx, %s", Res, StrError(Res)); // XXX - report error in a different way errno = Res; return -1; } /* * Send IPC route update message */ if (olsr_cnf->ipc_connections > 0) { ipc_route_send_rtentry(&rt->rt_dst.prefix, &rt->rt_best->rtp_nexthop.gateway, rt->rt_best->rtp_metric.hops, 1, if_ifwithindex_name(rt->rt_best->rtp_nexthop.iif_index)); } return 0; } // XXX - to be implemented int olsr_ioctl_add_route6(const struct rt_entry *rt __attribute__ ((unused))) { return 0; } /** *Remove a route from the kernel * *@param rt the route to remove * *@return negative on error */ int olsr_ioctl_del_route(const struct rt_entry *rt) { MIB_IPFORWARDROW Row; union olsr_ip_addr mask; unsigned long Res; struct interface *iface = if_ifwithindex(rt->rt_nexthop.iif_index); OLSR_PRINTF(2, "KERN: Deleting %s\n", olsr_rt_to_string(rt)); memset(&Row, 0, sizeof(Row)); Row.dwForwardDest = rt->rt_dst.prefix.v4.s_addr; if (!olsr_prefix_to_netmask(&mask, rt->rt_dst.prefix_len)) { return -1; } Row.dwForwardMask = mask.v4.s_addr; Row.dwForwardPolicy = 0; Row.dwForwardNextHop = rt->rt_nexthop.gateway.v4.s_addr; Row.dwForwardIfIndex = rt->rt_nexthop.iif_index; // MIB_IPROUTE_TYPE_DIRECT and MIB_IPROUTE_TYPE_INDIRECT Row.dwForwardType = (rt->rt_dst.prefix.v4.s_addr == rt->rt_nexthop.gateway.v4.s_addr) ? 3 : 4; Row.dwForwardProto = 3; // MIB_IPPROTO_NETMGMT Row.dwForwardAge = INFINITE; Row.dwForwardNextHopAS = 0; Row.dwForwardMetric1 = iface ? iface->int_metric : 0 + olsr_fib_metric(&rt->rt_metric); Row.dwForwardMetric2 = -1; Row.dwForwardMetric3 = -1; Row.dwForwardMetric4 = -1; Row.dwForwardMetric5 = -1; Res = DeleteIpForwardEntry(&Row); if (Res != NO_ERROR) { fprintf(stderr, "DeleteIpForwardEntry() = %08lx, %s", Res, StrError(Res)); // XXX - report error in a different way errno = Res; return -1; } /* * Send IPC route update message */ if (olsr_cnf->ipc_connections > 0) { ipc_route_send_rtentry(&rt->rt_dst.prefix, NULL, 0, 0, NULL); } return 0; } // XXX - to be implemented int olsr_ioctl_del_route6(const struct rt_entry *rt __attribute__ ((unused))) { return 0; } #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/log.c000066400000000000000000000042121234304727700154740ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #include "../log.h" void olsr_openlog(const char *Id __attribute__ ((unused))) { } void olsr_syslog(int Level __attribute__ ((unused)), const char *Format __attribute__ ((unused)),...) { } #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/misc.c000066400000000000000000000051731234304727700156550ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include #undef interface #include void clear_console(void) { #if !defined WINCE HANDLE Hand; CONSOLE_SCREEN_BUFFER_INFO Info; unsigned long Written; static COORD Home = { 0, 0 }; Hand = GetStdHandle(STD_OUTPUT_HANDLE); if (Hand == INVALID_HANDLE_VALUE) return; if (!GetConsoleScreenBufferInfo(Hand, &Info)) return; if (!FillConsoleOutputCharacter(Hand, ' ', Info.dwSize.X * Info.dwSize.Y, Home, &Written)) return; if (!FillConsoleOutputAttribute(Hand, Info.wAttributes, Info.dwSize.X * Info.dwSize.Y, Home, &Written)) return; SetConsoleCursorPosition(Hand, Home); #endif /* !defined WINCE */ } #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/net.c000066400000000000000000000244411234304727700155070ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if defined WINCE #include // for time_t #endif /* defined WINCE */ #define WIN32_LEAN_AND_MEAN #include #include #include #include #undef interface #include #include #include "defs.h" #include "net_os.h" #include "net_olsr.h" #include "ipcalc.h" #if defined WINCE #define WIDE_STRING(s) L##s #else /* defined WINCE */ #define WIDE_STRING(s) TEXT(s) #endif /* defined WINCE */ void WinSockPError(const char *Str); void PError(const char *); void DisableIcmpRedirects(void); int gethemusocket(struct sockaddr_in *pin) { int sock; OLSR_PRINTF(1, " Connecting to switch daemon port 10150..."); if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("hcsocket"); return (-1); } /* connect to PORT on HOST */ if (connect(sock, (struct sockaddr *)pin, sizeof(*pin)) < 0) { printf("FAILED\n"); fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno)); printf("connection refused\n"); closesocket(sock); return (-1); } printf("OK\n"); /* Keep TCP socket blocking */ return (sock); } int getsocket(int bufspace, struct interface *ifp __attribute__ ((unused))) { struct sockaddr_in Addr; int On = 1; unsigned long Len; int Sock = socket(AF_INET, SOCK_DGRAM, 0); if (Sock < 0) { WinSockPError("getsocket/socket()"); return -1; } if (setsockopt(Sock, SOL_SOCKET, SO_BROADCAST, (char *)&On, sizeof(On)) < 0) { WinSockPError("getsocket/setsockopt(SO_BROADCAST)"); closesocket(Sock); return -1; } if (setsockopt(Sock, SOL_SOCKET, SO_REUSEADDR, (char *)&On, sizeof(On)) < 0) { WinSockPError("getsocket/setsockopt(SO_REUSEADDR)"); closesocket(Sock); return -1; } while (bufspace > 8192) { if (setsockopt(Sock, SOL_SOCKET, SO_RCVBUF, (char *)&bufspace, sizeof(bufspace)) == 0) break; bufspace -= 1024; } if (bufspace <= 8192) { OLSR_PRINTF(1, "Cannot set IPv4 socket receive buffer.\n"); } memset(&Addr, 0, sizeof(Addr)); Addr.sin_family = AF_INET; Addr.sin_port = htons(olsr_cnf->olsrport); if(bufspace <= 0) { Addr.sin_addr.s_addr = ifp->int_addr.sin_addr.s_addr; } if (bind(Sock, (struct sockaddr *)&Addr, sizeof(Addr)) < 0) { WinSockPError("getsocket/bind()"); closesocket(Sock); return -1; } if (WSAIoctl(Sock, FIONBIO, &On, sizeof(On), NULL, 0, &Len, NULL, NULL) < 0) { WinSockPError("WSAIoctl"); closesocket(Sock); return -1; } return Sock; } int getsocket6(int bufspace, struct interface *ifp __attribute__ ((unused))) { struct sockaddr_in6 Addr6; int On = 1; int Sock = socket(AF_INET6, SOCK_DGRAM, 0); if (Sock < 0) { WinSockPError("getsocket6/socket()"); return -1; } if (setsockopt(Sock, SOL_SOCKET, SO_BROADCAST, (char *)&On, sizeof(On)) < 0) { WinSockPError("getsocket6/setsockopt(SO_BROADCAST)"); closesocket(Sock); return -1; } if (setsockopt(Sock, SOL_SOCKET, SO_REUSEADDR, (char *)&On, sizeof(On)) < 0) { WinSockPError("getsocket6/setsockopt(SO_REUSEADDR)"); closesocket(Sock); return -1; } while (bufspace > 8192) { if (setsockopt(Sock, SOL_SOCKET, SO_RCVBUF, (char *)&bufspace, sizeof(bufspace)) == 0) break; bufspace -= 1024; } if (bufspace <= 8192) fprintf(stderr, "Cannot set IPv6 socket receive buffer.\n"); memset(&Addr6, 0, sizeof(Addr6)); Addr6.sin6_family = AF_INET6; Addr6.sin6_port = htons(olsr_cnf->olsrport); if(bufspace <= 0) { memcpy(&Addr6.sin6_addr, &ifp->int6_addr.sin6_addr, sizeof(struct in6_addr)); } if (bind(Sock, (struct sockaddr *)&Addr6, sizeof(Addr6)) < 0) { WinSockPError("getsocket6/bind()"); closesocket(Sock); return -1; } return Sock; } static OVERLAPPED RouterOver; void net_os_set_global_ifoptions(void) { HMODULE Lib; unsigned int __stdcall(*enable_router)(HANDLE *, OVERLAPPED *); HANDLE Hand; Lib = LoadLibrary(WIDE_STRING("iphlpapi.dll")); if (Lib == NULL) return; enable_router = (unsigned int __stdcall(*)(HANDLE *, OVERLAPPED *))GetProcAddress(Lib, WIDE_STRING("EnableRouter")); if (enable_router == NULL) return; memset(&RouterOver, 0, sizeof(OVERLAPPED)); RouterOver.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (RouterOver.hEvent == NULL) { PError("CreateEvent()"); return; } if (enable_router(&Hand, &RouterOver) != ERROR_IO_PENDING) { PError("EnableRouter()"); return; } OLSR_PRINTF(3, "Routing enabled.\n"); return; } static int disable_ip_forwarding(int Ver) { HMODULE Lib; unsigned int __stdcall(*unenable_router)(OVERLAPPED *, unsigned int *); unsigned int Count; Ver = Ver; Lib = LoadLibrary(WIDE_STRING("iphlpapi.dll")); if (Lib == NULL) return 0; unenable_router = (unsigned int __stdcall(*)(OVERLAPPED *, unsigned int *))GetProcAddress(Lib, WIDE_STRING("UnenableRouter")); if (unenable_router == NULL) return 0; if (unenable_router(&RouterOver, &Count) != NO_ERROR) { PError("UnenableRouter()"); return -1; } OLSR_PRINTF(3, "Routing disabled, count = %u.\n", Count); return 0; } int net_os_restore_ifoptions(void) { disable_ip_forwarding(olsr_cnf->ip_version); return 0; } static int SetEnableRedirKey(unsigned long New) { #if !defined WINCE HKEY Key; unsigned long Type; unsigned long Len; unsigned long Old; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ | KEY_WRITE, &Key) != ERROR_SUCCESS) return -1; Len = sizeof(Old); if (RegQueryValueEx(Key, "EnableICMPRedirect", NULL, &Type, (unsigned char *)&Old, &Len) != ERROR_SUCCESS || Type != REG_DWORD) Old = 1; if (RegSetValueEx(Key, "EnableICMPRedirect", 0, REG_DWORD, (unsigned char *)&New, sizeof(New))) { RegCloseKey(Key); return -1; } RegCloseKey(Key); return Old; #else /* !defined WINCE */ return 0; #endif /* !defined WINCE */ } void DisableIcmpRedirects(void) { int Res; Res = SetEnableRedirKey(0); if (Res != 1) return; fprintf(stderr, "\n*** IMPORTANT *** IMPORTANT *** IMPORTANT *** IMPORTANT *** IMPORTANT ***\n\n"); fprintf(stderr, "I have disabled ICMP redirect processing in the registry for you.\n"); fprintf(stderr, "REBOOT NOW, so that these changes take effect. Exiting...\n\n"); exit(0); } int join_mcast(struct interface *Nic, int Sock) { /* See linux/in6.h */ struct ipaddr_str buf; struct ipv6_mreq McastReq; McastReq.ipv6mr_multiaddr = Nic->int6_multaddr.sin6_addr; McastReq.ipv6mr_interface = Nic->if_index; OLSR_PRINTF(3, "Interface %s joining multicast %s...", Nic->int_name, olsr_ip_to_string(&buf, (union olsr_ip_addr *)&Nic->int6_multaddr.sin6_addr)); /* Send multicast */ if (setsockopt(Sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&McastReq, sizeof(struct ipv6_mreq)) < 0) { perror("Join multicast"); return -1; } /* Old libc fix */ #ifdef IPV6_JOIN_GROUP /* Join receiver group */ if (setsockopt(Sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&McastReq, sizeof(struct ipv6_mreq)) < 0) #else /* IPV6_JOIN_GROUP */ /* Join receiver group */ if (setsockopt(Sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&McastReq, sizeof(struct ipv6_mreq)) < 0) #endif /* IPV6_JOIN_GROUP */ { perror("Join multicast send"); return -1; } if (setsockopt(Sock, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *)&McastReq.ipv6mr_interface, sizeof(McastReq.ipv6mr_interface)) < 0) { perror("Set multicast if"); return -1; } OLSR_PRINTF(3, "OK\n"); return 0; } /** * Wrapper for sendto(2) */ ssize_t olsr_sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr * to, socklen_t tolen) { return sendto(s, buf, len, flags, to, tolen); } /** * Wrapper for recvfrom(2) */ ssize_t olsr_recvfrom(int s, void *buf, size_t len, int flags __attribute__ ((unused)), struct sockaddr * from, socklen_t * fromlen) { return recvfrom(s, buf, len, 0, from, fromlen); } /** * Wrapper for select(2) */ int olsr_select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval *timeout) { #ifdef _WIN32 if (nfds == 0) { if (timeout) { Sleep(timeout->tv_sec * 1000 + timeout->tv_usec / 1000); } return 0; } else { return select(nfds, readfds, writefds, exceptfds, timeout); } #else /* _WIN32 */ return select(nfds, readfds, writefds, exceptfds, timeout); #endif /* _WIN32 */ } #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/net/000077500000000000000000000000001234304727700153365ustar00rootroot00000000000000olsrd-0.6.6.2/src/win32/net/if.h000066400000000000000000000037111234304727700161070ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/net/route.h000066400000000000000000000041721234304727700166510ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined TL_NET_ROUTE_H_INCLUDED #define TL_NET_ROUTE_H_INCLUDED #define RTF_UP 1 #define RTF_HOST 2 #define RTF_GATEWAY 4 #endif /* !defined TL_NET_ROUTE_H_INCLUDED */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/netinet/000077500000000000000000000000001234304727700162165ustar00rootroot00000000000000olsrd-0.6.6.2/src/win32/netinet/in.h000066400000000000000000000042341234304727700170000ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined TL_NETINET_IN_H_INCLUDED #define TL_NETINET_IN_H_INCLUDED #define WIN32_LEAN_AND_MEAN #include #include #undef interface #endif /* !defined TL_NETINET_IN_H_INCLUDED */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/sys/000077500000000000000000000000001234304727700153665ustar00rootroot00000000000000olsrd-0.6.6.2/src/win32/sys/ioctl.h000066400000000000000000000037111234304727700166530ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/sys/socket.h000066400000000000000000000041321234304727700170270ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined TL_SYS_SOCKET_H_INCLUDED #define TL_SYS_SOCKET_H_INCLUDED #define MSG_NOSIGNAL 0 #endif /* !defined TL_SYS_SOCKET_H_INCLUDED */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/sys/time.h000066400000000000000000000074531234304727700165060ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined TL_SYS_TIME_H_INCLUDED #define TL_SYS_TIME_H_INCLUDED #define WIN32_LEAN_AND_MEAN #include #include #undef interface #define timeradd(x, y, z) \ do \ { \ (z)->tv_sec = (x)->tv_sec + (y)->tv_sec; \ \ (z)->tv_usec = (x)->tv_usec + (y)->tv_usec; \ \ if ((z)->tv_usec >= 1000000) \ { \ (z)->tv_sec++; \ (z)->tv_usec -= 1000000; \ } \ } \ while (0) #define timersub(x, y, z) \ do \ { \ (z)->tv_sec = (x)->tv_sec - (y)->tv_sec; \ \ (z)->tv_usec = (x)->tv_usec - (y)->tv_usec; \ \ if ((z)->tv_usec < 0) \ { \ (z)->tv_sec--; \ (z)->tv_usec += 1000000; \ } \ } \ while (0) #if !defined WINCE #ifndef _TIMESPEC_DEFINED #define _TIMESPEC_DEFINED struct timespec { unsigned int tv_sec; unsigned int tv_nsec; }; #endif /* _TIMESPEC_DEFINED */ #else /* !defined WINCE */ #include #endif /* !defined WINCE */ int nanosleep(struct timespec *Req, struct timespec *Rem); int gettimeofday(struct timeval *TVal, void *TZone); #endif /* !defined TL_SYS_TIME_H_INCLUDED */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/sys/times.h000066400000000000000000000041701234304727700166620ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined TL_SYS_TIMES_H_INCLUDED #define TL_SYS_TIMES_H_INCLUDED struct tms { int dummy; }; long times(struct tms *); #endif /* !defined TL_SYS_TIMES_H_INCLUDED */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/sys/utsname.h000066400000000000000000000037111234304727700172150ustar00rootroot00000000000000/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/src/win32/unistd.h000066400000000000000000000044501234304727700162320ustar00rootroot00000000000000 /* * The olsr.org Optimized Link-State Routing daemon (olsrd) * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of olsr.org, olsrd nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * */ #ifdef _WIN32 #if !defined TL_UNISTD_H_INCLUDED #include #define TL_UNISTD_H_INCLUDED void sleep(unsigned int Sec); void srandom(unsigned int Seed); unsigned int random(void); char *StrError(unsigned int ErrNo); #define IPTOS_TOS(x) ((x) & 0x1e) #define IPTOS_PREC(x) ((x) & 0xe0) int isatty(int fd); #endif /* !defined TL_UNISTD_H_INCLUDED */ #endif /* _WIN32 */ /* * Local Variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ olsrd-0.6.6.2/unmaintained/000077500000000000000000000000001234304727700154735ustar00rootroot00000000000000olsrd-0.6.6.2/unmaintained/README000066400000000000000000000417411234304727700163620ustar00rootroot00000000000000 +====================================================================+ | README - olsr.org OLSR daemon 0.5.4, 21.10.2007 | +====================================================================+ Authors: Andreas Tonnesen(andreto@olsr.org) Thomas Lopatic (thomas@lopatic.de) Aaron Kaplan (aaron@lo-res.org) http://www.olsr.org CONTENTS: I. - GENERAL INFORMATION * ABOUT * GETTING HOLD OF OLSRD * RELEASE NOTES * RFC COMPLIANCE * PLUGINS * LINK QUALITY ROUTING * KNOWN PROBLEMS * FUTURE WORK II. - BUILDING AND RUNNING OLSRD * GENERAL INFORMATION * PLUGINS * GUI FRONTENDS * LINUX * WINDOWS * FREEBSD * OSX ---------------------------------------------------------------------- I. - GENERAL INFORMATION ---------------------------------------------------------------------- ========= * ABOUT ========= The olsr.org OLSR daemon is an implementation of the Optimized Link State routing protocol. The protocol is documented in RFC3626. The website of olsrd is http://www.olsr.org Olsrd is designed to be a modular an extensible implementation. It features a plugin interface, allowing for developers to extend OLSR operation without interfering with the core code. It also features a experimental link quality routing scheme. To ask questions or make comments, join up with the mailing lists: olsr-dev@olsr.org - development discussion olsr-users@olsr.org - usage discussion A bug tracker is also available at the sourceforge project site http://sourceforge.net/projects/olsrd/ Olsrd source or binaries can be downloaded from olsr.org. CVS is available for the cutting edge features ;-) The current Olsrd work is done via http://olsr.funkfeuer.at/ in the OLSR-NG project. ================= * RELEASE NOTES ================= ================== * RFC COMPLIANCE ================== If olsrd is ran without using link-quality routing/MPR selection it is RFC3626 compliant in that it will inter-operate with other RFC3626 implementations. Internally there are a few things that are solved differently that proposed in the RFC. Check out the "Conclusions" section of the "Implementing And Extending The Optimized Link State routing Protocol" thesis available at olsr.org. =========== * PLUGINS =========== Olsrd supports dynamic loading of plugins (dynamically loaded libraries) for functions like generation and processing of private package types, setting olsrd configurations in run-time and much more. This design is chosen for amongst others, the following reasons: * No need to change any code in the olsr daemon to add custom packages or functionality. * Users are free to implement olsrd plugins and license them under whatever terms they like. * The plugins can be written in any language that can be compiled as a dynamic library. Linux even allows scripts! * No need for people with extended OLSR versions to rely on heavy patching to maintain functionality when new olsrd versions are released. OLSR provides a default forwarding algorithm that allows for forwarding of OLSR messages of unknown types. This is really neat - because it means that even if only a subset of the nodes in the network actually known how to interpret a certain message type - all nodes will forward them according to the MPR pragma. A user may want to use the optimized flooding technique in OLSR to broadcast certain information, routing related or not, to all nodes that knows how to handle this message. Services that needs to broadcast/multicast data can encapsulate data in a private OLSR message type using a olsrd plugin. The design of the various entities of OLSR allows one to easily add special functionality into most aspects of OLSR. One can both register functions and unregister them with the socket parser, packet parser, scheduler and HNA set etc. This opens up for possibilities like intercepting current operation and replacing it with custom actions. Plugins that are part of this release(can be found in the lib/ directory): - HttpInfo. This plugin implements a simple HTTP server that serves dynamic pages with lots of information about the running olsrd process. - TxtInfo. This delivers output similar to the above. However, it is intended for external tools to use the output. - Mini. - Nameservice. - Dynamic Internet gateway. A plugin that dynamically adds and removes Internet HNA transmissions based on if there exists a default gateway to Internet with hop count = 0(non OLSR gateway). It has been extended to be able to ping Internet nodes to check for connectivity as well. - Dot draw. A plugin that produces output in the dot format representing the network topology. - Secure OLSR plugin. This plugin adds a signature to all messages to ensure data integrity. This way only nodes with access to the shared key can participate in the routing. You need to have the OpenSSL libs installed to use this plugin. ======================== * LINK QUALITY ROUTING ======================== Release 0.4.8 is the first version of olsrd that implements the ETX link quality metric. This enables olsrd to prefer routes that have a superior overall quality to routes that are worse but consist of less hops. Have a look at the README-Link-Quality.html file for details. ================== * KNOWN PROBLEMS ================== There is no synchronization concept (and thus - and for Gods sake - no code). Some plugins use threads for concurrency so this should be solved. ATM the bmf plugin is the only one using threads. =============== * FUTURE WORK =============== Future work concentrates on reduction of ressource (ab)use and to make it more scalable. Of course additional useful plugins are always appreciated. The current track of development is documented in the OLSR-NG project: http://olsr.funkfeuer.at ---------------------------------------------------------------------- II. - BUILDING AND RUNNING OLSRD ---------------------------------------------------------------------- ======================= * GENERAL INFORMATION ======================= Olsrd is implemented in pure C with very few dependencies. Olsrd is known to run on various hardware like: * x86 - your regular PC * PPC - Macintosh hardware * MIPSEL - Embedded systems like the LinkSys WRT54g * ARM - Embedded systems like Compaq/HP iPaq A binary tarball featuring x86, MIPSEL and ARM binaries is available for download at olsr.org Ports exist for all major operating systems: - Linux - Mac OS X - NetBSD/OpenBSD/FreeBSD: ATM the main development occurs on Linux with GNU tools so occasionally it needs some minor tweaks to compile it on *BSD. Please send patches if you fix problems there. - Win32: You need (the relevant parts of) cygwin to compile the daemon as such. The installer and GUI needs VisualC++ though. Win32 is the least supported port. Feel free to send patches! Packages for the operating systems and various distributions are available at olsr.org. Feel free to package it and announce it on the mailing lists. =========== * PLUGINS =========== All the available plugins are also implemented in C and requires gcc/libc to build. the dot_draw plugin compiles for Windows and GNU/Linux. the rest of the plugins will only compile for GNU/Linux. Building the plugins are just a matter of executing: make while installing requires(as root): make install in the plugins top directory (i.e. "lib/$plugin/"). To use the plugins add them to the olsrd configuration file. ===================== * OS SUPPORT STATUS ===================== COMPONENT/OS Linux Win32 FreeBSD NetBSD OpenBSD OSX ------------------------------------------------------------ olsrd +/+ +/+ +/+ +/+ +/+ ? olsr_switch +/+ +/+ +/+ +/+ +/+ ? ------------------------------------------------------------ PLUGINS bmf +/+ +/? +/+ +/+ +/+ - dot_draw +/+ +/? +/+ +/+ +/+ +/+ dyn_gw +/+ +/? +/- +/- +/- +/+ dyn_gw_plain +/+ +/? +/- +/- +/- +/+ httpinfo +/+ +/+ +/+ +/+ +/+ +/+ mini +/+ +/? +/+ +/+ +/+ +/+ nameservice +/+ +/? +/+ +/+ +/+ +/+ pgraph +/+ +/+ +/+ +/+ +/+ +/+ quagga +/+ -/- +/+ +/+ +/+ ? secure +/+ +/+ +/+ +/+ +/+ +/+ txtinfo +/+ +/+ +/+ +/+ +/+ +/+ ------------------------------------------------------------ LEGEND: +/+ = compiles/runs +/- = compiles/does not work - = does not compile ? = unknown ================= * GUI FRONTENDS ================= A GUI front end for GNU/Linux using GTK is available in the gui/ directory. This implementation is no longer supported, and might not work any more. It will be completly removed in a future release. There currently is, however, a native MFC-based Windows GUI. Unlike olsrd the GUI has to be compiled with Visual C++ 6. It can be found in the gui/win32/ directory. Simply open the "Frontend.dsw" workspace in the Visual C++ 6 IDE. Then compile "Frontend" and "Shim", which creates "Switch.exe" and "Shim.exe". To run the Windows GUI simply make sure that "Switch.exe", "Shim.exe", "olsrd.exe", "olsrd_cfgparser.dll", and "Default.olsr" are located in the same directory and run "Switch.exe". "Shim.exe" is just an auxiliary console application that is required by "Switch.exe". The GUI is pretty self-explanatory. The three buttons on the lower right of the GUI window start the OLSR server, stop the OLSR server, and exit the GUI. Use the "Settings" tab to specify the options that the GUI uses to run the OLSR server "olsrd.exe". When you click "Start" the GUI generates a temporary configuration file from the information given by the "Settings" tab. This temporary configuration file is passed to the OLSR server via its "-f" option. "Offer Internet connection" is only available if you have an Internet connection, i.e. if you have a default route configured. If you tick this option an HNA entry for the default route is added to the temporary configuration file, allowing other nodes in the OLSR network to use your Internet connection. IP version 6 cannot currently be selected, as support for IPv6 is not yet complete in the Windows version. "Enable ETX link quality" tells the OLSR server to detect the quality of its links to its neighbors using a variant of the ETX metric. "Window size" specifies the number of most recent packets to be used when calculating the packet loss. If, for example, this parameter is set to 10, then the OLSR server will calculate the packet loss among the most recent 10 OLSR packets received from each neighbor. If "For MPR selection only" is active, the link quality information is only used to select MPRs that offer the best paths to your two-hop neighbors. If "For MPR selection and routing" is active, the link quality is additionally used to create the routing table. WARNING - Enabling ETX breaks compliance with the OLSR standard. ETX-enabled nodes do not inter-operate with nodes that have ETX switched off. DO NOT USE NODES WITH DIFFERENT ETX SETTINGS IN A SINGLE NETWORK! The three buttons on the lower right of the "Settings" tab open previously saved settings, save the current settings to a configuration file, and reset the current settings to default values. If you start the GUI with the path to a configuration file as the only command line argument, the GUI opens the given configuration file and runs the OLSR server with this configuration. So, saving a configuration file with a ".olsr" extension, for example, and making "Switch.exe" the handler for ".olsr" files enables you to run the OLSR server with a simple double click on the configuration file. The "Output" tab shows the output of the currently running OLSR server. The output is limited to 1000 lines. The 1001st line will make the first line disappear and so on. When you click "Start" The GUI simply invokes the OLSR server "olsrd.exe" and intercepts its console output. Use the four buttons on the upper right of the tab to freeze the output, resume frozen output, save the output to a file, or clear the output. The "Nodes" tab contains information about the nodes that the OLSR server currently knows about. If you click on the address of a node in the "Node list" list box, the GUI populates the three "Node information" list boxes on the right with the multi-point relays of the selected node (MPR), the interfaces of the selected node (MID), and the non-OLSR networks accessible via the selected node (HNA). The "Routes" tab shows the routes that the currently running OLSR server has added. The default settings for the "Settings" tab are taken from the "Default.olsr" file. The configuration of the last interface in this file is used to populate the per-interface settings (HELLO interval, etc.) in the "Settings" tab. If you do not want to specify any interface in "Default.olsr", the problem arises that you do not have such a last interface. In this case simply create an interface with the special name of "GUI". This tells the GUI to use the configuration of the interface for the per-interface settings and to forget about this interface afterward. See the comments in the "Default.olsr" file for details. ========= * LINUX ========= To build olsrd you need to have all the regular development tools installed. This includes gcc, make, glibc, makedep etc. To install to a directory different from /(/etc, /usr/bin) use DESTDIR=targetdir. To use other compilers set CC=yourcompiler. To build: make To install(as root): make install To delete object files run: make clean Optionally, to clean all generated files: make uberclean Before running olsrd you must edit the default configuration file /etc/olsrd.conf adding at least what interfaces olsrd is to run on. Options in the config file can also be overridden by command line options. See the manual pages olsrd(8) and olsrd.conf(5) for details. The binary is named 'olsrd' and is installed in (PREFIX)/usr/sbin. You must have root privileges to run olsrd! To run olsrd just type: olsrd If debug level is set to 0 olsrd will detach and run in the background, if not it will keep running in your shell. =========== * WINDOWS =========== *** COMPILING To compile the Windows version of the OLSR server or the dot_draw plugin you need a Cygwin installation with a current version of GCC and Mingw32. Simply use make to build the olsrd executable. Building the dot_draw plugin works slightly different, we do not yet have a unified makefile for all architectures here. Switch to the dot_draw directory lib/dot_draw/ and generate the Windows makefile by saying ./mkmf.sh This will generate "Makefile.win32" by adding dependencies to "Makefile.win32.in". Then just say make -f Makefile.win32 to build the dot_draw plugin. However, make sure that you have build olsrd before that, as the dot_draw plugin requires some object files that are only generated when olsrd is built. *** INTERFACE NAMING On Linux network interfaces have nice names like "eth0". In contrast, Windows internally identifies network interfaces by pretty awkward names, for example: "{EECD2AB6-C2FC-4826-B92E-CAA53B29D67C}" Hence, the Windows version implements its own naming scheme that maps each internal name to a made-up name like "if03", which is easier to memorize. Simply invoke the OLSR server as follows to obtain its view of your interfaces: olsrd.exe -int This lists the made-up interface names along with their current IP addresses to enable you to find out which made-up interface name corresponds to which of your physical interfaces. "+" in front of the IP addresses means that the OLSR server has identified the interface as a WLAN interface. "-" indicates that the OLSR server considers this interface to be a wired interface. "?" means "no idea". Detection currently only works on NT, 2000, and XP. Windows 9x and ME will always display "?". For techies: The made-up names consist of the string "if" followed by a two-digit hex representation of the least significant byte of the Windows-internal interface index, which should be different for each interface and thus make each made-up name unique. Again, this is undocumented and this assumption may be wrong in certain cases. So, if the "-int" option reports two interfaces that have the same name, please do let me know. *** CONFIGURATION FILE If you do not specify a configuration file, the OLSR server ("olsrd.exe") by default attempts to use "olsrd.conf" in your Windows directory, e.g. "C:\WINDOWS\olsrd.conf". ========================= * FREEBSD/NETBSD/OPENBSD ========================= The FreeBSD port should be relativley stable at this point. The OpenBSD and NetBSD versions are pretty much untested. They have not been extensively tested beyond "doesn't core dump and it looks like it adds routes". In order to build it, you need GNU make. Then use: gmake to build the olsrd executable. Then do: gmake install to install the executable, the default configuration file, and the manual pages. So, basically it's the same as on Linux. Have a look at the Linux section for details. ======= * OSX ======= The OS X port is a direct descendant of the FreeBSD port. So, the same limitations with respect to testing and maturity apply. Building and installing works in the same was as on FreeBSD. olsrd-0.6.6.2/unmaintained/README-FreeBSD-libnet000066400000000000000000000017721234304727700210450ustar00rootroot00000000000000Instructions for FreeBSD libnet build spoggle@gmail.com libnet URL: http://www.packetfactory.net/libnet/ FreeBSD Ports: /usr/ports/net/libnet-devel/ The BSD networking is missing features that prevent the use of multiple interfaces with olsrd. By using libnet we can get around the problem and support this feature. 1) From the FreeBSD ports collection install libnet-devel, plain libnet is NOT sufficient! % cd /usr/ports/net/libnet-devel % make install Additionally, you must have gmake installed (/usr/ports/devel/gmake) 2) If you're reading this, you have the proper olsrd distribution. So I won't bore you with getting that. 3) Change into the main directory of the olsrd source and build the daemon: % cd % gmake OS=fbsd-ll 4) If that succeeds, then just follow all the other documentation on the use of olsrd. The code is pretty ugly right now and I know there are some efficiency things I can do to make it better. Bug reports, better ways to do this are welcomed. olsrd-0.6.6.2/unmaintained/README-Link-Quality-Fish-Eye.txt000066400000000000000000000156761234304727700231400ustar00rootroot00000000000000+=====================================================================+ | Link Quality Fish Eye Mechanism December 3th 2005 | | | | olsrd-0.4.10 | +=====================================================================+ Corinna 'Elektra' Aichele (onelektra at gmx.net) --------------- I. Introduction --------------- Link Quality Fish Eye is a new (experimental) algorithm introduced in olsrd 0.4.10. To increase stability in a mesh, TC messages should be sent quite frequently. However, the network would then suffer from the resulting overhead. The idea is to frequently send TC messages to adjacent nodes, i.e. nodes that are likely to be involved in routing loops, without flooding the whole mesh with each sent TC message. OLSR packets carry a Time To Live (TTL) that specifies the maximal number of hops that the packets is allowed to travel in the mesh. The Link Quality Fish Eye mechanism generates TC messages not only with the default TTL of 255, but with different TTLs, namely 1, 2, 3, and 255, restricting the distribution of TC messages to nodes 1, 2, 3, and 255 hops away. A TC message with a TTL of 1 will just travel to all one-hop neighbours, a message with a TTL of 2 will in addition reach all two-hop neighbours, etc. TC messages with small TTLs are sent more frequently than TC messages with higher TTLs, such that immediate neighbours are more up to date with respect to our links than the rest of the mesh. We hope that this reduces the likelihood of routing loops. -------------- II. How to use -------------- The Fish Eye algorithm can be enabled in the configuration file /etc/olsrd.conf with the following lines: # Fish Eye mechanism for TC messages 0 = off, 1 = on LinkQualityFishEye 1 Fish Eye should be used together with a small TcInterval setting as follows: # TC interval in seconds (float) TcInterval 0.5 If olsrd is started with debug-level 3 it will print out a message every time a TC message is issued or dropped. The following sequence of TTL values is used by olsrd. 255 3 2 1 2 1 1 3 2 1 2 1 1 Hence, a TC interval of 0.5 seconds leads to the following TC broadcast scheme. * Out of 13 TC messages, all 13 are seen by one-hop neighbours (TTL 1, 2, 3, or 255), i.e. a one-hop neighbour sees a TC message every 0.5 seconds. * Two-hop neighbours (TTL 2, 3, or 255) see 7 out of 13 TC messages, i.e. about one message per 0.9 seconds. * Three-hop neighbours (TTL 3 or 255) see 3 out of 13 TC messages, i.e. about one message per 2.2 seconds. * All other nodes in the mesh (TTL 255) see 1 out of 13 TC messages, i.e. one message per 6.5 seconds. The sequence of TTL values is hardcoded in lq_packet.c and can be altered easily for further experiments. The Link Quality Fish Eye algorithm is compatible with earlier versions of olsrd or nodes that do not have the Fish Eye feature enabled. A default configuration file with the Link Quality Fish Eye mechanism and ETX enabled is located in ./files/olsrd.conf.default.lq-fisheye --------------- III. Background --------------- A major problem of a proactive routing algorithm is keeping topology control information in sync. If topology information is not in sync routing loops may occur. Usually routing loops happen in a local area in the mesh - within a few hops. It may happen that node A assumes that the best way to send packets to node C is by forwarding them to node B, while node B thinks that the best route to C is via node A. So A sends the packet to node B, and B returns it to A - we have a loop. This can of course also happen with more than two nodes involved in the loop, but it is unlikely that a routing loop involves more than a few nodes. Routing information like all data traffic gets lost on radio links with weak signal-to-noise ratio (SNR) or if collisions occur. Setting fragmentation and RTS (request-to-send) to conservative values on wireless interfaces is a must in a mesh to deal with hidden nodes, interference and collisions. A mesh that utilizes only one channel has to deal with many collisions between packets and a lot of self-generated interference. While a radio interface may have a range of only 300 meters its signals can disturb receivers that are more than 1000 meters away. The data traffic of a node in the distance is not readable, but it's signals add to the noise floor in receivers, reducing signal-to-noise ratio of local links. When a route is saturated with traffic the transmitters involved introduce permanent interference into the mesh, causing packet loss on other links in the neighbourhood. OLSR messages get lost, causing confusion. While the timeout values of MID messages or HNA messages can be increased to increase stability without a big tradeoff, TC messages that are up to date and arrive in time are critical. It is also critical to have MPR information in sync if the MPR algorithm is used, but in the author's opinion this optimization doesn't do any good anyway. The MPR algorithm introduces a new source of failure and reduces TC message redundancy, so it should be switched off in the configuration file /etc/olsrd.conf with these lines: TcRedundancy 2 MprCoverage 7 olsrd with LQ Extension attempts to know the best routes all over the whole mesh cloud, but it is likely that it never will be able to achieve this in a mesh that has more than a handful of nodes. TC information is likely to be lost on its way through the whole mesh. And this likelyhood increases with the number of hops. But this fact doesn't necessarily harm the routing of traffic on a long multihop path. A node at one end of a mesh cloud may have the illusion to know the exact and best path along which its packets travel when communicating with a node that is several hops away. But this information may be pretty outdated and incomplete. In fact all that the algorithm has to achieve is a reasonable choice for the next two or three hops. If the routing path is 8 hops, for example, nodes that are 5 hops away from the node initiating traffic and closer to the destination have better and more accurate information about the best path. They don't know what a node that initiates traffic thinks about the path that its packets should take, they have more accurate routing information and will look into their routing table and make a choice based on their knowledge. Someone that sends a snail mail parcel from Europe to India doesn't have to write the name of the Indian postman on the paket that is supposed to hand it over to the recipient or the brand of bicycle he is supposed to ride when transporting the parcel. He doesn't have to decide the path that the postman has to take in the recipient's village. The postman knows better than the sender. It should be sufficient if nodes have a vague idea about the topology of the mesh in the distance and who is out there. If only a few TC messages out of many TC packets that are broadcast make it over the whole mesh this should be sufficient. Have fun! Elektra olsrd-0.6.6.2/unmaintained/README-Link-Quality.html000066400000000000000000000704671234304727700216550ustar00rootroot00000000000000 olsrd Link Quality Extensions

    olsrd Link Quality Extensions

    Credits

    The way in which the ETX metric is applied to OLSR owes its existence to ideas conceived by the wonderful folks at c-base and freifunk.net. Any implementation bugs are solely Thomas's fault, though.

    Guys, also thanks a lot for your hospitality, for your valuable input, for being brave enough to test early releases of olsrd, for supplying a great testbed in Berlin, and for being you!

    Changes

    • 0.4.9 - Documented the LinkQualityMult configuration directive.

    Theory

    Release 0.4.8 of olsrd offers an experimental implementation of an ETX-like metric. When calculating a routing table for us, pure RFC-compliant OLSR simply minimizes the number of hops between ourselves and the other nodes in the MANET, even if this means that a route via a single very bad link will be preferred to a route via two excellent links, although the latter would probably have been the better choice.

    To solve this problem, we have to teach olsrd how to tell good links from bad links. We have done so by measuring the packet loss for OLSR packets that we receive from our neighbors. As we periodically receive HELLO messages from our neighbors (by default every 2 seconds), we have enough packets to determine the packet loss for packets that each of our neighbors sends to us.

    If, for example, 3 out of 10 packets are lost on their way from our neighbor to ourselves, we have a packet loss of 3/10 = 0.3 = 30%. At the same time 7 of the 10 packets that the neighbor sent went through. Hence, the probability for a successful packet transmission from this neighbor to ourselves is 7/10 = 0.7 = 70%. This probability is what we call the Link Quality. So the Link Quality says how good a given link between a neighbor and ourselves is in the direction from the neighbor to ourselves. It does so by saying how likely it is that a packet that we send is successfully received by our neighbor.

    However, it is also important to know the quality of the link in the opposite direction, i.e. how many of the packets that we send out are received by each of our neighbors. So, we are not only interested in the Link Quality of a given link, but also in the corresponding neighbor's idea of the Link Quality. That's what we call the Neighbor Link Quality. The Neighbor Link Quality says how good a given link between a neighbor and ourselves is in the direction from ourselves to the neighbor.

    The Link Quality and the Neighbor Link Quality are values between 0 and 1 or, which is equivalent, between 0 and 100%. They represent the probability that a packet that our neighbor sends actually makes it to us (Link Quality) and that a packet that we send actually makes it to our neighbor (Neighbor Link Quality).

    Let's now look at the probability for a successful packet round trip, i.e. the probability that we successfully send a packet to our neighbor and, on receiving it, our neighbor successfully replies with a response packet. For a successful round trip both packets must get through, the packet that we've sent and the response packet that our neighbor has sent. So, the success probability is NLQ x LQ, where NLQ is the Neighbor Link Quality of the link and LQ is its link quality. For example, if we have a NLQ of 60% and a LQ of 70%, the probability of a successful round trip is 60% x 70% = 0.6 x 0.7 = 0.42 = 42%.

    In wireless networks each recipient of a packet acknowledges packet reception by sending back an acknowledgment packet to the sender. So, when does a retransmission of a packet happen? It happens, if the sender does not receive an acknowledgment. And in which cases does the sender not receive an acknowledgment? If either the packet that it sent is lost or if the corresponding acknowledgment packet is lost. So, what is the probability for a retransmission to not take place? Well, as the sender's packet has to get through in one direction and the recipient's acknowledgment has to get through in the opposite direction, too, this is exactly the probability for a successful packet round trip, i.e. NLQ x LQ.

    We can now answer the question of how many transmission attempts it will typically take to get a packet from us to a neighbor or from the neighbor to us. It is 1 / (NLQ x LQ). So, in the above case of NLQ x LQ = 42%, we expect on average 1 / 0.42 = 2.38 transmission attempts for a packet until it gets through.

    Note that this number is valid for both directions of the link, as in both cases we have to look at the probability for a successful packet round trip. For packets that we send to our neighbor, the packet goes from us to the neighbor and the acknowledgment travels the other way around. For packets that our neighbor sends to us, the packet goes from the neighbor to us and the acknowledgment travels from us to the neighbor. In both cases a packet is sent in each direction and retransmission occurs if either packet is lost.

    The value 1 / (NLQ x LQ) is called the Expected Transmission Count or ETX. For those interested in a more in-depth discussion, there's a scientific paper by the people who invented all this, and for those who would like to know still more, there's Doug's PhD thesis.

    Let's assume that we have a route from ourselves via two nodes A and B to a node C. What is the ETX for the total route, i.e. how often is our packet retransmitted on its way from us to C? Well, we know how many attempts we need on average to successfully transmit a packet from us to A. Let's call this value ETX1. So, we already have ETX1 attempts just to reach A. The packet would then take an additional number of attempts to hop from A to B. Let's call this second value ETX2. Finally, a further number of attempts is required to hop from B to C. Let's call this third value ETX3. Let's now have a look at the total number of transmissions that have happened to get our packet from us to C. This number is simply ETX1 + ETX2 + ETX3.

    Protocol

    In order to calculate the ETX for a link to a neighbor, we need to know the neighbor's idea of the link quality, i.e. the NLQ, as we can only determine the LQ ourselves, but we want to know ETX = 1 / (NLQ * LQ). So the link quality extensions to olsrd introduce a new kind of HELLO messages, which we call LQ HELLO messages. For each link listed in such a message, the originator of the messages also tells us the link quality. So, each neighbor puts the LQ values that it has determined in the message, which from our perspective are NLQ values. So, owing to the LQ HELLOs we now have all the information to calculate the ETX for each link between ourselves and one of our neighbors.

    Let's again have a look at the total number of transmissions required for a route that consists of more than one hop, i.e. that is not a route to one of our neighbors. If we stick with the above example, we know ETX1 from the LQ HELLOs. But how do we learn ETX2 and ETX3? For this the link quality extensions to olsrd introduce a new kind of TC messages. TC messages are used in OLSR to tell the world, i.e. all other nodes in the MANET, which neighbors we have. We have extended TC messages to additionally carry information on how good the links to our neighbors are. We call this extended variant of TCs, analogously to LQ HELLOS, LQ TC messages.

    So, with LQ HELLO messages we find out which neighbors we have and how good our links to them are and with LQ TC messages, we share this knowledge with all other nodes and all other nodes share their knowledge with us.

    In this way each node in the network ends up knowing which links each other node in the MANET has and how good they are. Well, actually, it's a bit more complex than that, because of an optimization called multi-point relaying. But this is beyond the scope of this introductory text.

    Warning

    LQ HELLO messages and LQ TC messages are not compatible with RFC-compliant HELLO and TC messages. So make sure that you either switch all nodes of your network to link quality or none of your nodes. A mixed configuration will probably result in an unpredictable mess.

    Practice

    New Configuration Parameters

    LinkQualityLevel

    Let's now have a look at how we would use the link quality extensions. The configuration parameter that controls link quality is LinkQualityLevel, as it sets the level to which link quality is used, i.e. for which purposes olsrd looks at the link quality information.

    • Setting this parameter to 0 disables the link quality extensions. olsrd then works in exactly the same way as before, i.e. it is RFC-compliant, uses HELLO and TC messages, and calculates routes by minimizing the hop count.

    • Setting this parameter to 1 enable the link quality extensions and tells olsrd to select MPRs based on the link quality information. A neighbor is selected as an MPR, if it has the best route to any 2-hop neighbor. Suppose that ETX1 is the expected number of transmissions between us and a neighbor N and that ETX2 is the expected number of transmissions between N and a two-hop neighbor N2. For each of our two-hop neighbors we then select the neighbor N as an MPR that results in the lowest possible total ETX of ETX1 + ETX2.

    • Setting this parameter to 2 not only selects MPRs based on the link quality but also considers link quality information when calculating the routing table. For a given destination node D we select the route that has the minimal total ETX of ETX1 + ETX2 + ... + ETXn, where ETX1 is the expected number of transmissions from us to our neighbor, ETX2 is the expected number of transmissions from our neighbor to the next node, and ETXn is the expected number of transmissions from our destination's neighbor to the destination. This is the recommended setting.

    IMPORTANT: Remember to set all nodes of your MANET to the same link quality level. Even if levels 2 and 3 use the same kind of messages, i.e. LQ HELLOs and LQ TCs, they use a different algorithm for calculating the routing table. This can also mess up your routing!

    LinkQualityWinSize

    The second configuration parameter related to link quality is LinkQualityWinSize. When determining the packet loss of the packets received from a neighbor, olsrd only looks at the n most recent packets. By default n is set to 10, so olsrd looks at the ten most recent packets received (or not received) from a neighbor and then determines the packet loss. Let's assume that of the 10 packets we have received 7, then we have missed 3, which corresponds to a packet loss of 3/10 = 0.3 = 30%. The corresponding Link Quality is 7/10 = 0.7 = 70%.

    Let's have a look at what the default value means. Let's for the moment only think of LQ HELLO messages and neglect other message types. By default LQ HELLOs are sent every 2 seconds. So, we calculate the packet loss over the past 20 seconds. So, changes in the link quality are accounted for relatively fast. For longer intervals just increase this value.

    LinkQualityMult

    Version 0.4.9 supports a third configuration parameter, LinkQualityMult. This is a per-interface parameter, so it may only appear in an interface configuration block. This parameter can be used to alter the LQ values that we announce, which will then result in an altered ETX for links between us and our neighbors - remember that ETX = 1 / (NLQ x LQ).

    The idea is to enable us to make certain links that we have artificially appear better or worse than they actually are. In this way we can manually affect the routing decisions made by the OLSR network.

    The LinkQualityMult parameter is followed by an IP address and a number, the multiplier. The IP address specifies the IP address of the neighbor interface address of the link that we want to manipulate. The LQ values that we determine for this link are then multiplied by the given multiplier.

    If the word default is specified in lieu of an IP address, then this multiplier applies to all links via the interface that we're configuring. Note, however, that a multiplier linked to a real IP address has priority over the default multiplier. So, we're looking for the most specific match.

    Old Configuration Parameters

    The link quality extensions do not work very well with hysteresis. Hysteresis basically acts as a sort of barrier that only links that are "good enough" can cross. If a link is too flaky, hysteresis will make olsrd consider the link as non-existent. So, this is a binary thing. Either a link is able to cross the barrier, or it is not. There's nothing in between. However, we want olsrd to consider every link there is, without any barrier, because then we can leave it to the link quality extensions to judge how good the link actually is and how much we trust the link.

    If a link with an ETX value of 50 is the only way of reaching a node, then we want to use this link, as there is no better way.

    In addition, in contrast to only saying "good enough" or "not good enough" like hysteresis, the link quality extensions offer a much more detailed view of the world by saying something like "75% good enough, 25% not good enough".

    The second mechanism that could interfere with the link quality extensions is the link detection scheme. By default, if olsrd misses three (LQ) HELLO messages in a row from a neighbor, the link is considered broken. However, we'd prefer the link to just expose a lower quality. So, setting the HELLO validity time to the HELLO interval multiplied by the link quality window size is probably a good rule of thumb. In this way the link will be removed not before the link quality extensions have had enough time to gradually reduce the link quality to zero.

    Sample Configuration

    A minimal configuration that leaves everything at the default and just makes the changes required for the link quality extension to work properly could look as follows. Note the ClearScreen directive that causes the screen to be cleared before updated debug information is printed. This makes the debug output more readable in many cases.

    DebugLevel              2
    ClearScreen             yes
    LinkQualityLevel        2
    LinkQualityWinSize      12
    UseHysteresis           no
    
    Interface "if03"
    {
      HelloInterval         2.0
      HelloValidityTime     20.0
    }
        

    Let's assume that we would like to use the LinkQualityMult directive to multiply the LQ value that we report for the link between our local interface if03 and an interface of one of our neighbors that has an IP address of 192.168.0.1. Say, we'd like to multiply the LQ value by 0.5. We would then simply add the following line to the Interface section of the above configuration file.

      LinkQualityMult 192.168.0.1 0.5
        

    Suppose that we would further like to multiply the LQ values that we report for all other links between our local interface if03 and a neighbor interface by 0.8. We would then add a second, default LinkQualityMult statement and we would end up with the following two lines.

      LinkQualityMult 192.168.0.1 0.5
      LinkQualityMult default 0.8
        

    For the link to 192.168.0.1 the first line would have precedence over the second (default) line and 0.5 would be used as the multiplier. For all other links the default multiplier of 0.8 would be used, as there isn't any better match.

    Debug Output

    0.4.8 also introduces significant changes in the debug output. Let's have a look at what happens at debug level 2, which is the recommended default for the link quality extensions.

    --- 14:28:56.80 ---------------------------------------------------- LINKS
    
    IP address       hyst   LQ     lost   total  NLQ    ETX
    192.168.0.1      0.000  1.000  0      10     1.000  1.00
        

    This table contains the links to our neighbors. It contains the following columns.

    • IP address - the IP address of the interface via which we have contact to the neighbor.

    • hyst - the current hysteresis value for this link.

    • LQ - the quality of the link determined at our end. This is what we have previously called the Link Quality.

    • lost - the number of lost packets among the n packets most recently sent by our neighbor via this link. n is the link quality window size.

    • total - the total number of packets received up to now. This value starts at 0 immediately after a link has come to life and then counts each packet. It is capped at the link quality window size.

    • NLQ - this is our neighbor's view of the link quality. Previously we have called this the Neighbor Link Quality. This value is extracted from LQ HELLO messages received from our neighbors. NB: If a neighbor stops sending packets completely, we do not have any means of updating this value. However, in this case the LQ value will decrease and the link thus be detected as becoming worse.

    • ETX - this is the ETX for this link, i.e. 1 / (NLQ x LQ).

    --- 14:28:56.80 ------------------------------------------------ NEIGHBORS
    
    IP address       LQ     NLQ    SYM   MPR   MPRS  will
    10.0.0.6         1.000  1.000  YES   YES   NO    6
        

    This table contains a list of all our neighbors. It is closely related to the link table in that we are connected to a neighbor via one or more links. The table has the following columns.

    • IP address - the main IP address of the neighbor.

    • LQ and NLQ - the LQ and NLQ values of the best link that we have with this neighbor. (In multi-interface configurations we can have more than one link with a neighbor.)

    • SYM - this states whether the link to this neighbor is considered symmetric by olsrd's link detection mechanism.

    • MPR (multi-point relay) - this indicates whether we have selected this neighbor to act as an MPR for us.

    • MPRS (multi-point relay selector) - this indicates whether the neighbor node has selected us to act as an MPR for it.

    • will - the neighbor's willingness.

    --- 14:28:56.80 ------------------------------------------------- TOPOLOGY
    
    Source IP addr   Dest IP addr     LQ     ILQ    ETX
    10.0.0.6         192.168.0.2      1.000  1.000  1.00
    10.0.0.6         10.0.0.5         1.000  1.000  1.00
        

    This table displays the topology information that olsrd has gathered from LQ TC messages. It states which nodes in the network report links to which other nodes and which quality these links have. So, it's olsrd's view of the world beyond its immediate neighbor nodes, i.e. its view of the nodes that it cannot reach directly. This table has the following columns.

    • Source IP addr - the node that reports a link.

    • Dest IP addr - the node to which the source node reports the link.

    • LQ (link quality) - the quality of the link as determined by the source node. For the source node this is the Link Quality. For the destination node this is the Neighbor Link Quality.

    • ILQ (inverse link quality) - the quality of the link as determined by the destination node. For the source node this is the Neighbor Link Quality. For the destination node this is the Link Quality. We just did not want to name it "NLQ", as we use NLQ only for the link quality reported by our neighbors. But functionally this is equivalent to the NLQ we know from the link and neighbor tables.

    • ETX - the ETX value for this link, calculated by ETX = 1 / (ILQ x LQ).

    --- 14:28:56.80 ------------------------------------------------- DIJKSTRA
    
    10.0.0.6:1.00 (one-hop)
    10.0.0.5:2.00 <- 10.0.0.6:1.00 (one-hop)
        

    This table displays the best routes that olsrd could find for each destination that it knows about. The leftmost IP address given on each line is the destination of a route. The remaining IP addresses in a line specify the nodes on the route between ourselves and the destination address. Moving from the destination address to the right, address by address, moves us closer from the destination to ourselves, hop by hop.

    In the above case we see routes to two nodes, 10.0.0.6 and 10.0.0.5. In the first line, there aren't any intermediate nodes between us and the destination, the destination address is the only IP address in this line. In the second line we have one intermediate node, 10.0.0.6. So, the second line describes a route to 10.0.0.5 via 10.0.0.6.

    The number after the colon following an IP address in the table is the total ETX of the route up to this IP address, i.e. the sum of the ETX values of all hops between ourselves and this IP address.

    In the above example the first line represents a path with an ETX value of 1.00 to 10.0.0.6. As we've seen in the neighbor table above 10.0.0.6 is our neighbor, so the route to it consists only of a single hop, which has an ETX of 1.00, hence the 1.00 in this line.

    In the second line, 10.0.0.5 is not a neighbor of ours. However, 10.0.0.6 is and from the topology table above we can tell that 10.0.0.6 reports a link to 10.0.0.5. So, we can reach 10.0.0.5 via 10.0.0.6. This is what this line says. Remember that each line represents a route by first giving the IP address of the destination (10.0.0.5) and that moving to the right means moving towards ourselves until one of our (one-hop) neighbor is reached. If we move from 10.0.0.5 to the right, we find 10.0.0.6, which is our (one-hop) neighbor. So we have a route.

    If we would like to know which path a packet takes that we send to 10.0.0.5, we have to read the line backwards. We then see that the packet first travels to our (one-hop) neighbor 10.0.0.6 via a link that has an ETX of 1.00 (which we can confirm by looking at the neighbor table above). From there it is forwarded to 10.0.0.5 via another link that also has an ETX of 1.00 (which we can confirm by means of the topology table above), resulting in a total ETX of 1.00 + 1.00 = 2.00, which is the number that follows 10.0.0.5. Remember that the ETX value given for an IP address is the cumulative ETX for the complete route up to this IP address.

    If olsrd is able to find a route between us and the destination, the last IP address in the line is one of our neighbors. In this case, "(one-hop)" is appended to the line to illustrate that the last IP address is one of our (one-hop) neighbors. However, let's assume that we've just switched on olsrd. In this case, it does not know about all links in the network, yet, as it hasn't received LQ TC messages from all nodes. So, it may know that a node exists (as it has already received LQ TC messages from it) but it does not necessarily know how to reach it (as it may not have received LQ TC messages from nodes between it and ourselves, yet). In this case the last IP address is the last node that is reachable from the destination and the line ends with the word "FAILED".

    The same is true for neighbors to which we do not have a symmetric link. We know that they're there, but we do not have a link to them, hence olsrd cannot find a route, which results in "FAILED".

    Remarks

    If you have any questions on using olsrd or if you would like to know more about the link quality extension, it's probably best to subscribe to the mailing lists and ask your question there. Information on the mailing lists is available at http://www.olsr.org.

    olsrd-0.6.6.2/unmaintained/README-Olsr-Switch.html000066400000000000000000000467761234304727700215160ustar00rootroot00000000000000 Olsr Switch

    Olsr_Switch network simulation

    Summary

    This document gives a brief introduction to the olsr.org OLSR daemon network simulation extentions and tools. The network simulation tool olsr_switch provides olsrd processes running in a special host-emultion mode with access to a virtual network. Multiple such processes can run on a host. This network can be freely manipulated by the user allowing for simulation of dynamic large-scale networks.

    Only IPv4 is supported for now.

    Background

    olsr_switch was inspired by the uml_switch used to communicate between UML instances, which I have used for olsrd testing. Also I remember seeing that the guys at LRI working on the qolsr project has done something similar.

    The target users for this kind of things are probably mainly developers and researchers. But it might come in handy for others as well.

    Description

    olsr.org

    The olsr.org OLSR daemon is an implementation of the Optimized Link State Routing protocol a IP routing protocol for mobile ad-hoc networks. Multiple interesting extensions are available for the implementation. Read more at olsr.org.

    olsr_switch

    The application, called olsr_switch, is really a traffic router that will allow multiple olsrd instances to connect and communicate over TCP via the loopback interface. Connecting to olsr_switch on remote hosts will be possible, but it is not implemented at the current time.

    Basically olsr_switch works on two datasets - clients and links. A client is a connected olsrd process and there are two uni-directional link between all nodes(A->B and B->A) that can be manipulated independently. When receiving traffic from a olsrd client the switch will forward this traffic to all other clients to which it has a valid link. Links can be set to three different "modes" based on the quality set on the link:

    • Open(quality 100) - all traffic will be forwarded over this link.

    • Closed(quality 0) - no traffic will be forwarded over this link.

    • Lossy(quality 1-99) - in this mode the quality constraint is used as the chance in percentage, for traffic to be forwarded over the link. So if quality is set to 25 there will in average be 75% packet loss.

    The application provides the user with a prompt/shell where various commands for topology manipulation or data retrieval are available. A help command is provided for the users convenience. This help command will also provide the user with specific help on all available commands. More on this later.

    olsrd host-emulation clients

    The communication interface against olsr_switch can naturally not be 100% transparent for the olsrd process which normally runs on UDP/698 on "real" network interfaces. Olsrd itself had to be modified to set up a virtual interface connecting to olsr_switch. This virtual interface is transparent to all overlying functionality. This means that that olsrd host-emulation can run in both RFC and LQ mode, and that plugins can be loaded normally etc. But no routes are added by the olsrd process. Later on route information might be signaled from the olsrd instance to olsr_switch so that a centralized route database is available to the user. As of now, you can watch the olsrd debug output or easier yet, run one node with the httpinfo plugin to get the route/topology/link information.

    Currently olsrd cannot run on both real and host-emulation interfaces, but this might change in the future if I get convinced that it is useful. No routes can be added by the host-emulating olsrd instances, so

    Building and running

    As of yet, olsr_switch builds and runs on GNU/Linux and FreeBSD systems.

    Building

    The olsr.org olsrd source code and pre-compiled packages can be downloaded from the olsr.org download section. But as of now you need the CVS version if you want the olsr_switch code. To check out the current snapshot do:

    cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/olsrd login
    
    cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/olsrd co olsrd-current

    Now enter the olsrd source directory and do:

    olsrd-current# make

    to build olsrd itself, and:

    olsrd-current# make switch

    to build olsr_switch. If no error messages occurred, you should now have the two executables olsrd and olsr_switch available in the current directory.

    Running

    Before starting any olsrd host-emu clients the switch must be started. This is done using the command olsr_switch and the application will initiate the communication socket and provide the user with a prompt for input:

    olsrd-current# ./olsr_switch
    olsrd host-switch daemon version 0.1 starting
    Initiating socket TCP port 10150
    OHS command interpreter reading from STDIN
    >



    olsrd_switch has a buildt-in command for starting and stopping local olsrd instances and we will learn more about this later. But olsrd can also be ran in host-emulation mode from the command line. To start olsrd in host-emulation mode do:

    ./olsrd -hemu IP-ADDRESS

    Here IP-ADDRESS will be the IP address that the process will set as its main address in the emulation mode. This address has no connection to the real IP-stack and can be chosen freely. Of cause, no two instances can run using the same IP.
    It might be wise to have a separate olsrd configuration file for host-emulation. In that case issue:

    ./olsrd -f FILENAME -hemu IP-ADDRESS

    As of now there is no emulated destination address used. All traffic will be passed on regardless of the network address used. Olsrd communicates using broadcast/multicast so that multiple "overlapping" networks might exist.

    Command-line interface

    Blah blah blah

    help

    Type 'help cmd' for help on a specific command

    > help
    Olsrd host switch version 0.1
    Available commands:
            help - Help on shell commands
            exit - Exits olsr host switch
            log - Displays or sets log bits
            list - List all connected clients or links
            link - Manipulate links

    list

    The list command is used for client and link listing. The help page states:

    > help list
    Usage: list <clients|links>
    Description:
    This command will list all the clients or all the links registered 
    by olsr_switch. By default clients are listed.

    link

    The link command is used for manipulating links. Here is the help page for this command:

    > help link
    Usage: link <bi> [srcIP|*] [dstIP|*] [0-100]
    Description:
    This command is used for manipulating olsr links. The link quality 
    is a number between 0-100 representing the chance in percentage 
    for a packet to be forwarded
    on the link.
    To make the link between 10.0.0.1 and 10.0.0.2 have 50% packetloss do:
     link 10.0.0.1 10.0.0.2 50
    Note that this will only effect the unidirectional link 
    10.0.0.1 -> 10.0.0.2. To make the changes affect traffic 
    in both directions do:
     link bi 10.0.0.1 10.0.0.2 50
    To completely block a link do:
     link 10.0.0.1 10.0.0.2 0
    To make all traffic pass(delete the entry) do:
     link 10.0.0.1 10.0.0.2 100
    Note that "bi" can be used in all these examples.
    Wildcard source and/or destinations are also supported.
    To block all traffic from a node do:
    link 10.0.0.1 * 0
    To set 50% packetloss on all links to 10.0.0.2 do:
     link * 10.0.0.2 50
    To delete all links do:
     link * * 100
    Wildcards can also be used in combination with 'bi'.
    To list all manipulated links use 'list links'.

    olsrd

    The olsrd command is used for manipulating links. Here is the help page for this command:

    > help olsrd
    Usage: olsrd [start|stop|show|setb|seta] [IP|path|args]
    Description:
    This command is used for managing local olsrd instances from within olsr_switch.
    The command can be configured in runtime using the setb and seta sub-commands.
    To show the current olsrd command-configuration do:
     olsrd show
    To set the olsrd binary path do:
     olsrd setb /full/path/to/olsrd
    To start a olsrd instance with a IP address of 10.0.0.1, do:
     olsrd start 10.0.0.1
    To stop that same instance do:
     olsrd stop 10.0.0.1
    

    others

    Two other commands are available:

    • exit - terminates olsr_switch.

    • log - sets the log level.

    Read the help pages for details.

    Running olsrd in host-emulation mode

    Now for a real world example of connecting olsrd instances. Let's assume we have a modified configuration file, ./olsrd.emu.conf that we use for host-emu instances. We'll choose the 10.0.0.0/24 IP address space for our clients.
    First start the olsr_switch in one terminal:

    ./olsr_switch

    Now start the olsrd instances in other terminal(s). If you want to follow olsrd operation you should use a debug value > 0. To easen CPU usage and terminal count you can start multiple instances that will run in the background using the -d 0 option. In this example we'll run our olsrd instances in the foreground using debug level 1. Start them off(in separate terminals) using:

    ./olsrd -f /etc/olsrd.emu.conf -hemu 10.0.0.x -d 1

    where x is 1-8(we'll run 8 instances). The screen terminal multiplexer application is highly recomended for making your life easier if working on multiple terminals.

    Here is the output form the 10.0.0.1 instance of olsrd after some time:

           *** olsr.org - 0.4.10-pre (May 30 2005) ***
    
    --- 20:53:26.58 ---------------------------------------------------- LINKS
    
    IP address       hyst   LQ     lost   total  NLQ    ETX
    10.0.0.8         0.000  1.000  0      10     1.000  1.00
    10.0.0.7         0.000  1.000  0      10     1.000  1.00
    10.0.0.6         0.000  1.000  0      10     1.000  1.00
    10.0.0.5         0.000  1.000  0      10     1.000  1.00
    10.0.0.4         0.000  1.000  0      10     1.000  1.00
    10.0.0.3         0.000  1.000  0      10     1.000  1.00
    10.0.0.2         0.000  1.000  0      10     1.000  1.00
    
    --- 20:53:26.58 ------------------------------------------------ NEIGHBORS
    
    IP address       LQ     NLQ    SYM   MPR   MPRS  will
    10.0.0.2         1.000  1.000  YES   NO    NO    3
    10.0.0.3         1.000  1.000  YES   NO    NO    3
    10.0.0.4         1.000  1.000  YES   NO    NO    3
    10.0.0.5         1.000  1.000  YES   NO    NO    3
    10.0.0.6         1.000  1.000  YES   NO    NO    3
    10.0.0.7         1.000  1.000  YES   NO    NO    3
    10.0.0.8         1.000  1.000  YES   NO    NO    3
    
    --- 20:53:26.58 ------------------------------------------------- TOPOLOGY
    
    Source IP addr   Dest IP addr     LQ     ILQ    ETX
    

    We now have our own virtual network! Notice that you can start olsrd instances from olsr_switch using the olsrd command. The equvivalent of the above command line statement would be:

    olsrd start 10.0.0.x
    

    Given that the olsrd command is configured properly (see olsrd show, setb and seta).

    At our switch prompt the command list yields the following output:

    All connected clients:
            10.0.0.8 - Rx: 647 Tx: 89 LinkCnt: 0
            10.0.0.7 - Rx: 752 Tx: 105 LinkCnt: 0
            10.0.0.6 - Rx: 790 Tx: 120 LinkCnt: 0
            10.0.0.5 - Rx: 809 Tx: 112 LinkCnt: 0
            10.0.0.4 - Rx: 811 Tx: 125 LinkCnt: 0
            10.0.0.3 - Rx: 804 Tx: 138 LinkCnt: 0
            10.0.0.2 - Rx: 805 Tx: 140 LinkCnt: 0
            10.0.0.1 - Rx: 829 Tx: 119 LinkCnt: 0

    Hey - everything is running a-ok!

    Manipulating links

    So lets create some link trouble. This introduction has become too long already, so we'll introduce two simple example conditions:

    • We want 10.0.0.1 only to have a link to 10.0.0.2 and no one else.

    • We want 10.0.0.8 only to have 25% chance of getting direct traffic trough to 10.0.0.2,3,4

    Here's what we need to do:

    > link bi 10.0.0.1 * 0
    Setting bidirectional link(s) 10.0.0.1 <=> 10.0.0.8 quality 0
    Setting bidirectional link(s) 10.0.0.1 <=> 10.0.0.7 quality 0
    Setting bidirectional link(s) 10.0.0.1 <=> 10.0.0.6 quality 0
    Setting bidirectional link(s) 10.0.0.1 <=> 10.0.0.5 quality 0
    Setting bidirectional link(s) 10.0.0.1 <=> 10.0.0.4 quality 0
    Setting bidirectional link(s) 10.0.0.1 <=> 10.0.0.3 quality 0
    Setting bidirectional link(s) 10.0.0.1 <=> 10.0.0.2 quality 0
    
    
    > link bi 10.0.0.1 10.0.0.2 100
    Removing bidirectional link(s) 10.0.0.1 <=> 10.0.0.2 quality 100
    
    > list links
    All configured links:
            10.0.0.8 => 10.0.0.1 Quality: 0
            10.0.0.7 => 10.0.0.1 Quality: 0
            10.0.0.6 => 10.0.0.1 Quality: 0
            10.0.0.5 => 10.0.0.1 Quality: 0
            10.0.0.4 => 10.0.0.1 Quality: 0
            10.0.0.3 => 10.0.0.1 Quality: 0
            10.0.0.1 => 10.0.0.3 Quality: 0
            10.0.0.1 => 10.0.0.4 Quality: 0
            10.0.0.1 => 10.0.0.5 Quality: 0
            10.0.0.1 => 10.0.0.6 Quality: 0
            10.0.0.1 => 10.0.0.7 Quality: 0
            10.0.0.1 => 10.0.0.8 Quality: 0
    

    Now our first condition is met. First all bidirectional links from 10.0.0.1 was blocked and then the bidirectional link to 10.0.0.2 was opened. Now 10.0.0.1 can only see 10.0.0.2 as a neighbor. Note that only manipulated links are listed when issuing 'list links'. olsrd at 10.0.0.1 now shows:

           *** olsr.org - 0.4.10-pre (May 30 2005) ***
    
    --- 21:17:46.06 ---------------------------------------------------- LINKS
    
    IP address       hyst   LQ     lost   total  NLQ    ETX
    10.0.0.2         0.000  1.000  0      10     1.000  1.00
    
    --- 21:17:46.06 ------------------------------------------------ NEIGHBORS
    
    IP address       LQ     NLQ    SYM   MPR   MPRS  will
    10.0.0.2         1.000  1.000  YES   YES   NO    3
    
    --- 21:17:46.06 ------------------------------------------------- TOPOLOGY
    
    Source IP addr   Dest IP addr     LQ     ILQ    ETX
    10.0.0.2         10.0.0.1         1.000  1.000  1.00
    10.0.0.2         10.0.0.3         1.000  1.000  1.00
    10.0.0.2         10.0.0.4         1.000  1.000  1.00
    10.0.0.2         10.0.0.5         1.000  1.000  1.00
    10.0.0.2         10.0.0.6         1.000  1.000  1.00
    10.0.0.2         10.0.0.7         1.000  1.000  1.00
    10.0.0.2         10.0.0.8         1.000  1.000  1.00

    works like a charm. Now let's make sure we can meet condition two:

    > link bi 10.0.0.8 10.0.0.2 25
    Setting bidirectional link(s) 10.0.0.8 <=> 10.0.0.2 quality 25
    
    > link bi 10.0.0.8 10.0.0.3 25
    Setting bidirectional link(s) 10.0.0.8 <=> 10.0.0.3 quality 25
    
    > link bi 10.0.0.8 10.0.0.4 25
    Setting bidirectional link(s) 10.0.0.8 <=> 10.0.0.4 quality 25
    
    > list links
    All configured links:
            10.0.0.8 => 10.0.0.4 Quality: 25
            10.0.0.8 => 10.0.0.3 Quality: 25
            10.0.0.8 => 10.0.0.2 Quality: 25
            10.0.0.8 => 10.0.0.1 Quality: 0
            10.0.0.7 => 10.0.0.1 Quality: 0
            10.0.0.6 => 10.0.0.1 Quality: 0
            10.0.0.5 => 10.0.0.1 Quality: 0
            10.0.0.4 => 10.0.0.8 Quality: 25
            10.0.0.4 => 10.0.0.1 Quality: 0
            10.0.0.3 => 10.0.0.8 Quality: 25
            10.0.0.3 => 10.0.0.1 Quality: 0
            10.0.0.2 => 10.0.0.8 Quality: 25
            10.0.0.1 => 10.0.0.3 Quality: 0
            10.0.0.1 => 10.0.0.4 Quality: 0
            10.0.0.1 => 10.0.0.5 Quality: 0
            10.0.0.1 => 10.0.0.6 Quality: 0
            10.0.0.1 => 10.0.0.7 Quality: 0
            10.0.0.1 => 10.0.0.8 Quality: 0
    

    Now for a look at olsrd 10.0.0.8s output:

           *** olsr.org - 0.4.10-pre (May 30 2005) ***
    
    --- 21:23:00.35 ---------------------------------------------------- LINKS
    
    IP address       hyst   LQ     lost   total  NLQ    ETX
    10.0.0.7         0.000  1.000  0      10     1.000  1.00
    10.0.0.5         0.000  1.000  0      10     1.000  1.00
    10.0.0.6         0.000  1.000  0      10     1.000  1.00
    10.0.0.2         0.000  0.800  2      10     0.498  2.51
    10.0.0.3         0.000  0.600  4      10     0.498  3.35
    10.0.0.4         0.000  0.900  1      10     0.800  1.39
    
    --- 21:23:00.35 ------------------------------------------------ NEIGHBORS
    
    IP address       LQ     NLQ    SYM   MPR   MPRS  will
    10.0.0.2         0.800  0.498  YES   YES   NO    3
    10.0.0.3         0.600  0.498  NO    NO    NO    3
    10.0.0.4         0.900  0.800  YES   NO    NO    3
    10.0.0.5         1.000  1.000  YES   NO    NO    3
    10.0.0.6         1.000  1.000  YES   YES   NO    3
    10.0.0.7         1.000  1.000  YES   YES   NO    3
    
    --- 21:23:00.35 ------------------------------------------------- TOPOLOGY
    
    Source IP addr   Dest IP addr     LQ     ILQ    ETX
    10.0.0.2         10.0.0.1         1.000  1.000  1.00
    10.0.0.2         10.0.0.3         1.000  1.000  1.00
    10.0.0.2         10.0.0.4         1.000  1.000  1.00
    10.0.0.2         10.0.0.5         1.000  1.000  1.00
    10.0.0.2         10.0.0.6         1.000  1.000  1.00
    10.0.0.2         10.0.0.7         1.000  1.000  1.00
    10.0.0.2         10.0.0.8         0.898  0.498  2.24
    10.0.0.5         10.0.0.4         1.000  1.000  1.00
    10.0.0.6         10.0.0.8         1.000  1.000  1.00
    10.0.0.7         10.0.0.2         1.000  1.000  1.00
    10.0.0.7         10.0.0.3         1.000  1.000  1.00
    10.0.0.7         10.0.0.8         1.000  1.000  1.00
    

    Yes, there most certainly are some very weak links here.

    Well, lets leave it at that :-) The command line interface is meant to be used by applications as well as humans, so if somebody wants to create a GUI front-end that should not be to much work.

    Performance

    Regarding CPU load I have not done any real testing, but I did try seeing how far I could get on my 1.3Ghz/512MB-RAM desktop system running LQ olsrd instances in the background initiated from olsrd_switch. When reaching a certain amount (15+) the cPU load is very high for neighbor detection, but as soon as links stabelize the CPU is almost idle again. I have ran with 30+ nodes with no problem. But do not start to many instances at the same time.

    Note that, this was only using a idle network(no topology changes except new nodes joining). But as soon as olsrd instances can connect from other hosts one can distribute the load. Also the application will be subject to various future optimizations.

    Network load measurement tools will also be on the to-do list.


    by Andreas Tønnesen

    olsrd-0.6.6.2/unmaintained/features.txt000066400000000000000000000020451234304727700200530ustar00rootroot00000000000000Features supported by the different versions of olsrd. X supported ! support planned - support not planned ? unsure Linux Windows FreeBSD OSX IPv6 X ! ! ! automatically enable IP X X X X forwarding automatically disable ICMP X ! X X redirect messages automatically disable X ? ? ? anti-spoofing use 255.255.255.255 as broadcast X ? X ! address on a single interface use 255.255.255.255 as broadcast X ? X ! address on multiple interfaces use the same subnet broadcast X - X - address on multiple interfaces initially delete default routes X ! ! ! recognize WLAN interfaces X X X ! willingness based on X X ? ? battery power TOS X - - - olsrd-0.6.6.2/valgrind-howto.txt000066400000000000000000000021271234304727700165260ustar00rootroot00000000000000Valgrind is a powerful tool for performance and correctness analysis of code. This mini-howto discusses how to set your development environment up, such that you can profile a running olsr daemon and later analyze its recordings using a graphical frontend called Kcachegrind. First patch your makefile such that the debug symbols are not removed after compilation diff -r 26494c58ff86 Makefile.inc --- a/Makefile.inc Wed Jan 09 22:01:18 2008 +0100 +++ b/Makefile.inc Thu Jan 10 14:46:27 2008 +0100 @@ -5,10 +5,10 @@ # # activate debugging with 1 or deactivate with 0 -DEBUG ?= 0 +DEBUG ?= 1 # compile OLSR_PRINTF out -NO_DEBUG_MESSAGES ?= 0 +NO_DEBUG_MESSAGES ?= 1 Next run valgrind with the following command line options. valgrind --tool=callgrind -v --dump-instr=yes --trace-jump=yes ./olsrd -d 0 -nofork Finally load kcachgrind to display the profiling data. (watch out the callgrind data are written with a umask of 600 as user root - so you may want to chown or chmod the file, otherwise kcachegrind cannot open your data and will display an empty screen)